OmniAICreator/Qiita-1.07M huggingface dataset:
E2Eテストがたまに落ちるときのよくあるパターン 

[Capybara](https://github.com/teamcapybara/capybara) を使って PhantomJS や Selenium などブラウザを介した E2E テストをするときに遭遇する、たまに落ちるテストのパターンをまとめていく。

---

## ケース1: 押し損ね

---

### 落ちたときの状況

ボタンやリンクのクリックに失敗してそうに見える。

---

### 原因

`click_on` などはクリックするときに対象の要素を見つけ、 x 座標と y 座標を取得した上でその座標をクリックする。
対象の要素を見つけたときとクリックする瞬間の座標が異なるため、クリックはしているが目標の要素をクリックはできていない。

ずれる理由の多くは画像などの読み込みに伴う座標のずれ。
アニメーションもずれ得るが自分で把握して適宜待つようにしているパターンが多いのでだいたいの場合問題にはなっていない。

---

### 対策

読み込みタイミングによらず座標が固定されるような CSS を書くのが理想的。
回線によってはユーザもボタンを押そうと思ったときに座標がずれているということを意味しているからだ。

一方、全部見直すのは大変なので画像の読み込みタイミングによるずれが怪しければ適時こんな感じのヘルパを使うとよい。

```ruby
def wait_for_image_loading
  Timeout.timeout(Capybara.default_wait_time) do
    sleep 0.5 until evaluate_script(<<~JS)
      Array.prototype.every.call(document.querySelectorAll("img"), function (e) { return e.complete; })
    JS
  end
end
```

---

## ケース2: なぜかサーバ側でエラー

---

### 落ちたときの状況

200 を返すはずがなぜかサーバ側でエラーになる。
テスト中で用意したデータが消えているとエラーになりそう。

---

### 原因

ajax などでブラウザがリクエストを投げている最中にも関わらずテストは完了してしまい、サーバがリクエストを処理する前に teardown/after に入って DB のクリーンアップなどを行ってしまっている。

---

### 対策

teardown/after の早い段階で ajax やサーバの処理完了を待つ。
HTTP リクエストを投げるフレームワークやライブラリに合わせた `evaluate_script` をすればよい。

このあたりは [The One True Guide to database transactions with Capybara](http://technotes.iangreenleaf.com/posts/the-one-true-guide-to-database-transactions-with-capybara.html) が詳しい。
待ち方は [transactional_capybara](https://github.com/iangreenleaf/transactional_capybara/blob/23fc1520973897ab9ba5a6cb8c15bc52a09b0fa0/lib/transactional_capybara/ajax_helpers.rb#L67-L86) が参考になる。

----

~~一方、テスト用に rack middleware を挟み込んで mutex を使ってちゃんと待つ方法があるのではと思って現在研究中。~~

よく考えると、ブラウザが終了するまでクリーンアップをしなければいいのだ。

https://github.com/rails/rails/pull/28223

---

## ケース3: ログインされっぱなし

---

### 落ちたときの状況

なぜか次のテストに行ってもログインされっぱなし

---

### 原因

`Capybara.reset_sessions!` は

1. cookie を消す
2. about:blank を表示する

という流れで処理をするが、 1 と 2 の間でリクエストを処理してしまって cookie を覚えていることがある。

---

### 対策

teardown で `page.driver.quit` して丸ごと初期化する。
about:blank にいるときに cookie を全消しできればいいのだが、
Selenium は現在開いているドメインの cookie しか消せない。
Visual Studio CodeでPHPの環境構築

今までEclipseを使っていましたが、Visual Studio Codeが良さそうなので使ってみたいと思います:blush:

#Visual Studio Codeインストール
1.
[Download Visual Studio Code](https://code.visualstudio.com/download)
からプラットフォームに合ったファイルをダウンロードしてください。

#PHP用にカスタマイズ
1.
[Visual Studio 2015 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=48145)
をインストールしてください。
他のツールで必要な場合もありますので、すでにインストール済みの人もいると思います。

2.
[php公式](http://windows.php.net/download#php-7.0)
からThread Safeをダウンロードしてください。
後述するPHP IntelliSenseに必要です。

apacheはThread Safe
nginxはNon Thread Safe
のようです。

3.
ダウンロードしたPHPを解凍し、Cドライブ直下に配置してください。
例：C:\php-7.0.16

4.
環境変数の設定をしてください。
Windows10であれば
コントロール パネル\すべてのコントロール パネル項目\システム\システムの詳細設定
環境変数
システム環境変数→新規
で、C:\php-7.0.16を追加してください。

5.
Visual Studio Code
拡張機能で、
PHP IntelliSense
を検索しインストールしてください。

定義へ移動
すべての参照の検索
までできるので超オススメです。

あとは、PHP Code FormatやPHP Debugなど入れても良いかもしれません。
Unity でShaderの勉強 その10 ShaderとScriptの連携

良い記事を見つけたので試して見る
http://www.jonki.net/entry/20140215

##コード

```lang:Shader
Shader "Custom/TestShader" {
	Properties {
		_HolePos("HolePos",vector) = (1,1,1,1)
		_HoleSize("HoleSize",Range(0,10)) = 1
		_BlurThick("BlurThick",Range(0,10)) = 1
		_MainColor("MainColor",Color) = (1,1,1,1)
	}

	SubShader {
		Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
		ZWrite On
		ZTest LEqual
		Blend SrcAlpha OneMinusSrcAlpha

		Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			uniform float _HoleSize;
			uniform float4 _HolePos;
			uniform float _BlurThick;
			uniform float4 _MainColor;



			struct v2f {
				float4 wPos : SV_POSITION;
				float2 uv : TEXCOORD0;
			};

			v2f vert(float4 pos : POSITION ,float2 uv : TEXCOORD0) {
				v2f output;
				output.wPos = mul(UNITY_MATRIX_MVP,pos);
				output.uv = uv;
				return output;
			}

			float4 frag(v2f input) : SV_TARGET {
				half4 col = _MainColor;
				float2 pos = input.uv;

				float dist = distance(pos, float2(_HolePos.x, _HolePos.y));
				if(dist < _HoleSize) {
					clip(-1.0);
				} else if(dist < _HoleSize + _BlurThick){
					col.a = (dist - _HoleSize) * 10.0;
					col.a = pow(col.a, 2.0);
				}
				
				return col;
			}

			ENDCG
		}
	}
}
```

```lang:Script
using UnityEngine;
using System.Collections;

public class ShaderScript : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
	
    }
	
    // Update is called once per frame
    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo))
        {
            Renderer renderer = hitInfo.transform.GetComponent<Renderer>();
            if (renderer)
            {
                renderer.material.SetVector("_HolePos", hitInfo.textureCoord);    
            }

        }
    }
}
```

結果:
<img width="319" alt="スクリーンショット 2017-02-23 20.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/75e7bff9-196f-6d54-7fa6-ec290b28a034.png">

変えたところ
Rayを投げて当たったところのTEXCOORDをHolePosに入れた。画面サイズに依存せず、見た目通りの位置に穴が開くようになった。
Swift 3 Playgroundで曲線波形を描画する

![Screen Shot 2017-02-23 at 20.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/8920/976e347a-c5e9-ec7c-e6de-2f0fbe7e454a.png)

Xcode 8.2を使用

```swift
import UIKit
import PlaygroundSupport

// ベースとなるUIViewを作成
var dim: CGFloat = 500
let container = UIView(frame: CGRect(x: 0, y: 0, width: dim, height: dim))
PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = container

// 曲線を描画するためのUIViewサブクラス
class MyView: UIView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
 
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: 200))
        
        let span: CGFloat = 20
        var pos1 = path.currentPoint
        
        for idx in 1...25 {
            let plotX: CGFloat = span * CGFloat(idx)
            let plotY: CGFloat = (idx % 2 == 0) ? 200 : 300
            let pos = CGPoint(x: plotX, y: plotY)
            // 曲線の追加と調整
            var pos2 = pos
            pos1.x += span * 0.5
            pos2.x -= span * 0.5
            path.addCurve(to: pos, controlPoint1: pos1, controlPoint2: pos2)
            pos1 = pos
        }
        
        path.lineWidth = 4.0
        UIColor.white.setStroke()
        path.stroke()
    }
}

let view = MyView(frame: container.bounds)
view.backgroundColor = UIColor.red
container.addSubview(view)
```
URLパラメータ文字列から値を取得する正規表現

&で分割して=で分割するような PHPだと、parse_str() を使うような場面で、
JavaScriptや Nginxのconfファイル内でマッチさせるときなど、正規表現が良かったりします。

# 正規表現でパラメータの値を取得する
```
/name=(.*?)(&|$)/
```

## ポイント
- 最小マッチとするため ```(.*?)``` はてなをつけるところ
- 値の次に続くのは ```(&|$)```。パラメータの区切り文字である「&」または終端を表す「$」 のいずれか。

詳しくは
http://did2memo.net/2015/12/28/javascript-url-parameter/
WP REST API でタイトルで検索する。

WordPress で WP REST API を使って検索するときに、
http://example.org/wp-json/wp/v2/posts/?search=タイトル
ですると、本文内に含まれているものまで検索されてがっかりするあなたにこんな事してみてはいかがでしょうか。

```php:functions.php
add_filter( 'rest_post_query', 'my_rest_post_query', 10, 2 ); // rest_{post_type}_query 今回は post なので rest_post_query
function my_rest_post_query( $args, $request ) {
	if ( isset( $request['title'] ) ) {
		$args['title'] = esc_attr( $request['title'] );
	}
	return $args;
}
```
http://example.org/wp-json/wp/v2/posts/?title=タイトル
とかやってすればタイトルを検索してくれます。

他に追加出来ると思うので、自分で探求してみてください。

https://capitalp.jp/2017/01/26/theme-security/
また、上記でエスケープ処理等を参考にリクエストするものを適切にエスケープ処理してください。
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part2

「Data Scientistは何故希少種なのか？」

どうも。Yuuseiと申します。
家の近所でアナリストとしてB2B周りの分析をしてるんですが、
本格的にデータサイエンティストと名乗るために自分の中で整理をつけようと思い、
重い腰を上げた次第です。

※この投稿はシリーズものの一部です。

[part1](http://qiita.com/yuusei/items/f8850a0efb74f68f988b) <-[part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)->[part3](http://qiita.com/yuusei/items/25e606fe6961efd21794)

さて、
世の中ではData Scientistが足りてないという話はだいぶ前から出ていますが、
その大きな理由は「必要なスキル全てを兼ね備えるのは難しいから」と言われています。
それは確かにそうなんですが、僕は別の理由があるだろうなと思っています。

「都度数学的に裏付けのある方法を検討していたら、今のビジネスのスピードについていけない」

こう言う事なんだと思います。
つまり、Data Scientistは誰もが憧れる「理想」を見ている職業であり、
現場ではそんな理想なんかよりも「早く」「多くの」売り上げを上げる事が優先され、
その結果、

・ビジネス力のある人はサイエンスに必要な手順の細かさに我慢できずスキルアップできない
・サイエンス力のある人はビジネスのざっくりさが我慢できない。そもそも「利益を上げる」と言う事が我慢できない

このような理想と現実の乖離を埋める事ができず、
また、仕事の内容がこれらの乖離を埋める様な設計になっておらず、
Data Scientistはビジネス環境で育ちにくくなっているのだと思います。

これを踏まえると、最近は機械学習の実装エンジニアなどの仕事が出回っているのはわかる気がします。

誤解を恐れずに言うと、機械学習は「詳しいマナーを知らなくても誰でもそれなりの結果が出せる」様に設計された
数学的なツールであり、理解できてなくても性能が出せるだけに、ビジネスと相性がよく、
サイエンス力がなくても、数式がコードで書ければとりあえず実務には十分なのです。

その為、コードを書いて実装してきた人たちが即戦力として呼び込めるので、
幅広い知見を必要とするData Scientistよりもお手軽な職業なのでしょう。

個人的には数式を理解せずに手法を使うのは好ましくないと思っています。
不適切な手法を現実の問題に適用してしまうからです。

ですが、機械学習はデータといくつかの手法があれば
とりあえずその中から精度の高い予測をシステマチックに選べ、
ビジネスのざっくり感とスピード感を求めるニーズにマッチしてるので、
引き合いが増えてきてるのだろうと勝手に思っています。

なので、機械学習の実装エンジニアはData Scientistとは全く別物であり、
みんなが「必要だ」と考えるData Scientistは理想の中の存在として、
理想ニーズは高くても現実ニーズは低いまま、希少種であり続けるのだと思います。

Data Scientistはなるのが難しく、
機械学習実装エンジニアより働き口は少ないでしょうが、
応用系の数学や物理学を追求していきたい自分みたいな人間には適してるんだと思います。


最後に、完全に横道に逸れるんですが、
たまに覗く[Data Science Central](http://www.datasciencecentral.com) と言うウェブサイトに [良い/悪いデータサイエンティストを面接で見つける方法-How To Identify A Good/Bad Data Scientist In A Job Interview?](http://www.datasciencecentral.com/profiles/blogs/how-to-identify-a-good-bad-data-scientist-in-a-job-interview)と言うのがあったので、紹介しておきます。

ではこの辺で。par3はもう草稿ができてるので、そんなに時間かからないと思います。

できた->[part3](http://qiita.com/yuusei/items/25e606fe6961efd21794)
Laravel-MixでSASSのglob importを使う

よりよい方法があったら教えてください。

---

Laravel 5.4 から標準となったLaravel Mixで、Sass(SCSS)ではやっぱり欲しいglob importを使いたいと思ったところデフォルトでは対応してなかった。

こういうやつ。

```sass
@import "layout/*";
@import "modules/**/*";
```

とはいえ、`webpack.mix.js`で`mix.webpackConfig`を呼んでやればWebpackのオプションを簡単に拡張できる。

Webpackでglob importを使うにには [import-glob-loader](https://www.npmjs.com/package/import-glob-loader) を使った。2年以上更新されていないし作者が “this plugin is a dead” とか言っているのが気になるが、[とりあえず設定方法さえWebpack2に併せておけばWebpack2でも動く](https://github.com/Aintaer/import-glob-loader/issues/7)ようなのでこれを使った。

```bash:install
npm i -D import-glob-loader
```

```js:webpack.mix.js
const { mix } = require('laravel-mix');

mix.webpackConfig({
        module: {
            rules: [{
                test: /\.scss/,
                enforce: "pre",
                loader: 'import-glob-loader'
            }]
        }
    })
   .js('resources/assets/js/app.js', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .sourceMaps();

```

こんな感じでビルドを走らせればglobがいい感じに展開されて出来上がる。
SourceMapもちゃんと吐き出される。globは展開されている状態でだけど。
ETE Toolkitを使ってPythonで色々な形の系統樹を書く

(2017/2/22, OS X El Capitan)
#はじめに
系統解析をしていて、アライメント情報などを統合した系統樹を書きたくなったので、ETE Toolkitを導入しました。ETE Toolkitでは、Pythonを用いてアライメント、ドメイン、ヒートマップなどを統合した系統樹の作成ができます。今回は単純な系統樹とアライメント付きの系統樹、その他便利そうな機能についてご紹介しようと思います。
現在公式サイト以外にまとまった情報がない状態ですので、良い使い方などありましたら教えてください。

#参考サイト
http://etetoolkit.org

#インストール
+ ete3
+ ete3_external_apps

以上の2つをインストールする必要があります。OSはMacもしくはLinuxで利用可能です。
公式サイトではPythonの環境構築によく使われているanacondaを用いてETE Toolkitを導入することを推奨しています。以下のページ等を参考に、anacondaを導入してください。
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

anacondaが導入できたら、仮想環境を作ってcondaで入れてください。注意点としてはPython3.5以降ではインストールエラーが起こるようなので、Python3.4として仮想環境を構築したほうがベターです(2017/2/23現在)。
```
$conda install -c etetoolkit ete3 ete3_external_apps
```

最後に正しくインストールされたかチェックしてください。

```
$ete3 version
$ete3 build check

```

なお、公式サイトによると、ソースからビルドもできるとのことです。
http://etetoolkit.org/download/

#使い方

###シンプルな系統樹
neick形式のツリーファイルを準備します(拡張子は.txtでも可)。

```Python:phylotree.py
#!/usr/bin/env python
import sys
from ete3 import PhyloTree

t = PhyloTree(sys.argv[1]) #newicファイルを引数で指定。
t.render("motifs.png", w=2000, dpi=500) # 書き出しファイル指定。wで幅、hで高さ、unitで単位(“px”: pixels, “mm”: millimeters, “in”: inches)、dpiを指定可能
```


![画像](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRCLLYfMkz_M2vNqI8yLVvz0fzjWciXeMO2O-NZbCrdMm5194tq)


###円形の系統樹
TreeStyle()で"c"を指定することで、円形のスタイルにすることができます。それ以外にもTreeStyleではノードの色や、形状(ドットや太線など)など、様々なものを指定できます。以下の公式サイトを参考にしてください。
http://etetoolkit.org/docs/latest/reference/reference_treeview.html?highlight=treestyle#treestyle

```Python:phylotree_circular.py
#!/usr/bin/env python
import sys
from ete3 import Tree, PhyloTree, TreeStyle

t = PhyloTree(sys.argv[1])
circular_style = TreeStyle() #TreeStyle()で系統樹の形を指定できる
circular_style.mode = "c" #"c"を指定してcircular_styleのツリーにする
circular_style.scale = 60 #ノードのスケールを指定できる
t.render("circular_tree_3.png", w=800, dpi=200, tree_style=circular_style)  # 書き出し。wで幅、hで高さ、unitで単位(“px”: pixels, “mm”: millimeters, “in”: inches)、dpiを指定可能
```


![sample.png](https://qiita-image-store.s3.amazonaws.com/0/167106/949497f6-f932-070b-c58f-216c9fa549cd.png)



###アライメント付きの系統樹
newickファイルに加えて、mafftなどでアライメントしたfastaファイルを準備します。mafftの使い方は以下のサイトを参考にしました。
http://qiita.com/MaedaTaro_Umiushi/items/2d05225677ded15b19a7
通常の系統樹のスクリプトに加えて、`link_to_alignment`のオプションを使うことで、簡単に系統樹とアライメントを結合し、可視化することができます。

```Python:phylotree_align
#!/usr/bin/env python
import sys
from ete3 import Tree, PhyloTree, SeqMotifFace, TreeStyle

t = PhyloTree(sys.argv[1]) #newicファイルを引数で指定
t.link_to_alignment(sys.argv[2])   # alignment fileをツリーにリンクさせる。
t.render("motifs_align.png", w=2000, dpi=500) # 書き出し。wで幅、hで高さ、unitで単位(“px”: pixels, “mm”: millimeters, “in”: inches)、dpiを指定可能
```


![画像](http://etetoolkit.org/docs/2.3/_images/phylotree.png)

###その他の機能

ツリーに使った遺伝子リストを以下のようにして取得できます。

```Python:gene_list.py
import sys
from ete3 import Tree

t = Tree(sys.argv[1]) #ツリーを読み込む
gene_list = t.get_leaf_names() #遺伝子名の取得 (葉の名前)
print(gene_list)
```

#終わりに
ETE Toolkit公式サイトの"The Programmable Tree Drawing Engine"のページでは(http://etetoolkit.org/docs/latest/tutorial/tutorial_drawing.html?highlight=heatmap) 、ヒートマップから画像ファイルの付加まで様々なことができることが示されています。今後更に使用法が分かってきたら追加していこうと思っています。
自分メモ：関数の配列

配列の中に関数を作って呼び出せる。

```javascript:sample.js

var functions = [
  function(){
    console.log('0番目の関数');
  },
  function(){
    console.log('1番目の関数');
  },
  function(){
    console.log('2番目の関数');
  }
];
functions[0]();
```

今のところぱっと使い所が思い浮かばないけど知らなかったのでメモ。
"Ansibleで最新版のpecoをインストールする" が うまく動かなかったので改修した

pecoを導入する際に参考にさせていただいた記事です。
http://qiita.com/samurai20000@github/items/8d77f4b5a503ca58b64e
一部うまくいかなかったので修正しました。

ansibleのunarchiveとcopyコマンドがlocalのファイルを扱うものだということが原因だと思います。
http://docs.ansible.com/ansible/unarchive_module.html
http://docs.ansible.com/ansible/copy_module.html

### 改修したやつ

```yaml:playbook

- name: Get latest peco version
  shell: >
    curl -sI https://github.com/peco/peco/releases/latest | awk -F'/' '/^Location:/{print $NF}'
  register: peco_latest_version

- name: Download latest peco
  get_url: url=https://github.com/peco/peco/releases/download/{{ peco_latest_version.stdout }}/peco_linux_amd64.tar.gz dest=/tmp/peco_linux_amd64.tar.gz
  register: download_peco

- name: Extract peco
  when: download_peco.changed
  command: tar zxvf /tmp/peco_linux_amd64.tar.gz chdir=/tmp/

- name: Copy to /usr/bin/
  when: download_peco.changed
  command: cp /tmp/peco_linux_amd64/peco /usr/bin/

- name: chmod peco
  when: download_peco.changed
  file:
    path: /usr/bin/peco
    mode: 0755

- name: Add peco-history
  when: download_peco.changed
  copy: src=.bashrc.j2 dest=/home/deployer/.bashrc
```

```bash:files/.bashrc.j2
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

## peco-history
peco-select-history() {
    declare l=$(HISTTIMEFORMAT= history | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
}
if [ -t 1 ]
then
    bind -x '"\C-r": peco-select-history'
fi
```
- これでCtrl+rでpecoコマンド使えると思います
irbで入力した履歴を取得する

```
irb(main):001:0> 1
=> 1
irb(main):002:0> 2
=> 2
irb(main):003:0> 3
=> 3
irb(main):004:0> Readline::HISTORY.to_a
=> ["1", "2", "3", "Readline::HISTORY.to_a"]
irb(main):005:0> 
```
ArduinoYunからMilkcocoaへデータ送受信

# はじめに
## 機材
ArduinoYun
設定など，以下を参考にしてもらえれば
http://qiita.com/tkyko13/items/495b4b1bdc2d4eb00d0a

Milkcocoa
https://mlkcca.com/

## Arduinoライブラリ
これらはArduinoIDEからの「ライブラリの管理」からも探せると思います．

・arduino-mqtt
https://github.com/256dpi/arduino-mqtt
Adafruitの方のライブラリもあったが，自分は失敗したのでこっちを利用

・arduinoJson
https://github.com/bblanchon/ArduinoJson
これは，最悪なくてもテストはできます．



## 参考サイト
・milkcocoaにmqttで送る場合の注意点など
http://blog.mlkcca.com/iot/milkcocoa-mqtt/


# サンプルコード

ArduinoMqttライブラリ内の例に，参考URL先を参考に少しいじった感じ

``` ArduinoYun_MQTTClientMilkcocoa.ino

#include <ArduinoJson.h>
#include <Bridge.h>
#include <YunClient.h>
#include <MQTTClient.h>
#include <Console.h>

#define APP_ID      ".....app id....."
#define USER_NAME   "sdammy"
#define CLINET_ID   "jsclientid01"
#define SERVER      APP_ID ".mlkcca.com"
#define PORT        1883

YunClient net;
MQTTClient client;

unsigned long lastMillis = 0;

void setup() {
  Bridge.begin();
  Console.begin();

  client.begin(SERVER, PORT, net);

  connect();
}

void connect() {
  Console.print("connecting...");

  while (!client.connect(CLINET_ID, USER_NAME, APP_ID)) {
    Console.print(".");
    delay(1000);
  }

  Console.println("\nconnected!");

  // サブスクライブ設定しなくても送信エラーメッセージをmessageReceived関数で受け取れた
  //  client.subscribe("/example");
}

void loop() {
  client.loop();

  if (!client.connected()) {
    connect();
  }

  // 5秒ごとに送信
  if (millis() - lastMillis > 5000) {
    lastMillis = millis();

	// 送信JSONデータ作成
    DynamicJsonBuffer jsonBuffer;
    JsonObject& root = jsonBuffer.createObject();
    JsonObject& params = root.createNestedObject("params");
    params["fromYun"] = 1;
    params["Hello"] = "World";
    String rootStr;
    root.printTo(rootStr);

    Console.print("publish: ");
    Console.println(rootStr);
	
	// パブリッシュ!!
    client.publish(APP_ID "/message/push", rootStr);
  }
}

// メッセージ受信関数 今回は成功すると通らない
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  Console.print(topic);
  Console.print(" - ");
  Console.print(payload);
  Console.println();
}

```

「.....app id.....」はそれぞれのmilkcocoaのアプリIDに
今回は，2017年2月現在の段階でのmilkcocoaのデフォルトの設定で動くようになってるはずです．（登録はもっと前なのでデフォルトかどうか不安ですが設定いじってはいない）
参考URLでもあった注目点，注意点
・ユーザー名をsdammyに
・パスワードをアプリIDに
・クライアントIDを指定できるmqtt関数を実行して，そのIDは適当に，そして他のクライアントとかぶらないように
・その他，ArduinoMqttライブラリにあるYunMQTTClientを利用したら接続できなかった
・送信フォーマットはJSONのみ（今のところ）
・送信データはparams内に収める
・送信するときのトピックは"アプリID/任意/push"

こんな感じでできました
オブジェクト指向の「わかりやすい」たとえ話

## 


「オブジェクト指向」と言うと、「なんでオブジェクト指向を使うの？」という素朴な疑問への答えが、あまりないので書いておく。


## さて、

たとえば、今、あなたは小さな商売（駄菓子屋とか）を始めたとしよう。

初めは一人で全部の仕事をする。 仕入れから店番から帳簿付けまで。

そうするうちに、商売繁盛、ドンドン忙しくなって、２４時間働いても、仕事が終わらない・・・。


## 仕事を誰かにしてもらう

その場合の解決策は、「人を雇う」こと。

普通の人間社会では人を雇うと「お金が掛かる」が、「ここ」は不思議な世界で、人を雇ってもお金が掛からない。

必要な時に「誰か来て！」と言うと、いくらでも来てくれて、不要になるとサッといなくなってくれる、ステキな人たち。

小人（もしくは妖精）とかロボットみたいなものだと考えよう。


## 「あなた」の仕事は、小人を管理すること

あまりに忙しいので、小人を５人雇ったとしよう。

それぞれ、店番／仕入れ／帳簿／料理／洗濯係だ。

あなたの仕事は「小人を管理すること」だけ。

それぞれの小人に「○○しといてね～」とお願いすれば、「どのように処理されるか」は考えなくて良い。

基本は何もせず、小人たちが何か報告してくれば、それに対応すれば良いわけだ。


## 「構造化プログラミング」と「オブジェクト指向」

「構造化プログラミング」は、一人で全部やっていた状態。（状態Ａ）

小人の導入は「オブジェクト指向」である。（状態Ｂ）

状態Ａの場合、あなたの机の上に全ての必要なものが、全部乗っかっている。（帳簿やら、サンプルやら、なにやらで、机の上がゴチャゴチャ）

状態Ｂでは小人たちの机の上に、それらの物があるので、あなたの机の上はスッキリ！

小さいシステムの場合、「構造化プログラミング」でもＯＫ。 わざわざ、小人を作る手間が掛かるからね。

でも、ある程度大きいシステムの場合、全部を自分一人でやると、ゴチャゴチャになる。 よって、小人を雇って、それぞれの小人に任せればよい。

## 小人を使って「オブジェクト指向」を説明する

「クラス」というのは型で「オブジェクト」というのは実体。（オブジェクトは「インスタンス」とも呼ぶ）

- クラス ＝ 型
- オブジェクト ＝ 実体

小人は「クラス」で、小人のジョンは「オブジェクト」。小人のホルヘも「オブジェクト」。

- クラス ＝ 小人
- オブジェクト ＝ ジョン
- オブジェクト ＝ ホルヘ

小人という「クラス」を一回作っておくと、ジョン／ホルヘ／マーク／リンダ・・・、と無限に小人のオブジェクトを作れる。

- 小人クラス →【生成】→ ジョン（オブジェクト）
- 小人クラス →【生成】→ ホルヘ（オブジェクト）
- 小人クラス →【生成】→ マーク（オブジェクト）

さて、ジョンは「店番係の小人」、ホルヘは「仕入れ係の小人」だ。 この場合、「小人」のクラスからジョンやホルヘを作るよりも、「店番係の小人」「仕入れ係の小人」というクラスを作って、それからジョンやホルヘを作った方が良い。

- 店番係の小人クラス →【生成】→ ジョン
- 仕入れ係の小人クラス →【生成】→ ホルヘ

どうしてかというと「店番係の小人」がもっと必要になった場合、「店番係の小人」クラスを使って、「店番係」のマークとか「店番係」のリンダがすぐに作れるから。

- 店番係の小人クラス →【生成】→ マーク
- 店番係の小人クラス →【生成】→ リンダ




## 継承

「小人」クラスから、「店番係の小人」クラスや「仕入れ係の小人」クラスを作ることを、「継承」と呼ぶ。

- 小人クラス →【継承】→ 店番係の小人クラス
- 小人クラス →【継承】→ 仕入れ係の小人クラス

「店番係の小人」「仕入れ係の小人」は、「小人」としての特徴を持つから、まず「小人」クラスを作った方が楽なわけだ。

そして、小人の特徴が変わった場合、たとえば小人が進化して「空を飛べるようになった」場合、 「小人」クラスを変更すると、「店番係の小人」のジョンも空を飛べるようになる。

## カプセル化

「帳簿係の小人」マリアに帳簿を渡したため、あなたの机の上はスッキリ。帳簿を読むのはマリアだけだ。

こういう風に、それぞれのオブジェクト（マリアなど）に、データを渡してしまうことを、カプセル化と呼ぶ。

帳簿は誰でも読み書きできるよう（public）にしても良いし、マリアだけが読み書きできるよう(private)にしても良い。

普通はマリアだけが読み書きできよう(private)にする。誰かが勝手に帳簿を書き換えたると困るからね。


## 「メソッド」

マリアに、「今月の売り上げ出して～」とか「四半期の結果を集計して～」とか命令する。 あなたは帳簿を読む必要はない。読んで集計するのは「帳簿係」のマリアの仕事だ。

これをメソッドと呼ぶ。 必要なメソッドは用意しておく。「今月」「四半期」「通期」のボタンがあって押すと結果が出てくるみたいな感じ。

## まとめると

「オブジェクト指向」は一見難しいが、実は大したことは無い。 人間でも仕事が多いと、多くの人に分担する。

同じように複雑なシステムを「構造化プログラミング」だけで書くと、ゴチャゴチャになってくる。

「オブジェクト指向」は、誰かに任せる（特定のオブジェクトに任せる）ことで、分担しているだけの話。 実際の設計でも「各オブジェクトを小人だ」と思うと、設計しやすい。
モノトーン画像に色をつける


透過部分のあるモノトーンの画像を用意。

![wave_black.png](https://qiita-image-store.s3.amazonaws.com/0/136286/eadfc450-2bc2-e0e3-62e8-b594db789d14.png "wave_black.png")

用意した画像をcanvasで合成して以下のようにする。

![スクリーンショット 2017-02-23 18.22.03.png](https://qiita-image-store.s3.amazonaws.com/0/136286/fd3600d6-2a7d-fbf3-6049-1065fc04679e.png "スクリーンショット 2017-02-23 18.22.03.png")

デモ：https://mo49.github.io/qiita/20170223/

```javascript:MonotoneCanvas.js
class MonotoneCanvas {
  constructor(opts={}) {
    this.canvas = opts.canvas || document.createElement('div');
    this.fileSrc = opts.fileSrc || '';
    this.width = isNaN(opts.width) ? 0 : opts.width;
    this.height = isNaN(opts.height) ? 0 : opts.height;
    this.color = opts.color || '#000';

    this.init();
  }

  init() {
    this.preloadCanvas().then((value) => {
      // canvasのプリロード後に描画
      this.draw(value);
    })
  }

  preloadCanvas() {
    return new Promise((resolve, reject) => {
      const canvas = document.createElement("canvas");
      let img = new Image();
      img.src = this.fileSrc;
      img.addEventListener('load', () => {
        // 1度canvasに描く
        const ctx = canvas.getContext("2d");
        canvas.width = img.naturalWidth;
        canvas.height = img.naturalHeight;
        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
        resolve(canvas);
      }, false)
    })
  }

  draw(preloadCanvas) {
    const canvas = this.canvas;
    const ctx = canvas.getContext('2d');
    canvas.width = this.width;
    canvas.height = this.height;

    ctx.fillStyle = this.color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    ctx.globalCompositeOperation = 'destination-in';

    // 一度描画したcanvasを再びcanvasに描画する
    ctx.drawImage(preloadCanvas, 0, 0, canvas.width, canvas.height);
  }

}
```


```javascript:使用
(() => {

  new MonotoneCanvas({
    canvas: document.getElementById('canvas'),
    fileSrc: 'wave.png',
    width: 640,
    height: 87,
    color: '#f00'
  })
  new MonotoneCanvas({
    canvas: document.getElementById('canvas2'),
    fileSrc: 'wave.png',
    width: 640,
    height: 87,
    color: '#0f0'
  })
  new MonotoneCanvas({
    canvas: document.getElementById('canvas3'),
    fileSrc: 'wave_black.png',
    width: 640,
    height: 87,
    color: '#00f'
  })

})()
```
FirebaseのDatabaseにユーザフォロー機能を追加するライブラリを公開しました

[Firebase](https://www.firebase.com/ "Firebase")を利用して、手軽にアプリにユーザフォロー関連の機能を追加できるライブラリを公開しました。

[IF_FirebaseFollowHelperKit (github)](https://github.com/ICTFractal/IF_FirebaseFollowHelperKit "IF_FirebaseFollowHelperKit")

MITライセンスです。
IF_FirebaseFollowHelperを導入する事で、次の機能が実装されます。
- ユーザをフォローする
- ユーザをブロックする
- 他ユーザに自分がフォローやブロックされた事をリアルタイムに受け取る

Firebase内のデータ処理についてはライブラリでカプセル化されているので、機能を利用する際にFirebaseのデータ構造について気にする必要はありません。
例えば自分がフォローしているユーザ一覧を受け取る場合、結果は [(uid, timestamp)] といった単純なArrayで返されます。

詳細な仕様は次のドキュメントを参照してください。
[IF_FirebaseFollowHelperKit Document](http://ict-fractal.com/OSSDoc/IF_FirebaseFollowHelperKit/index.html "IF_FirebaseFollowHelperKit Document")

導入方法やサンプルの動かし方などは[github](https://github.com/ICTFractal/IF_FirebaseFollowHelperKit "github")で説明していますので、そちらをご覧ください。
重複しているレコードを検索するSQL(大量データも対応)

たまにしかやらないけど、
毎回やり方を調べている気がするので備忘録としてメモ。

DISTINCTを使って重複した行をまとめることはできるけど、
逆はできないので、強引に対応する。

## 列Aが重複しているデータを取得

```sql
SELECT
  列A
FROM
  テーブルA
GROUP BY
  列A
HAVING
  COUNT(列A) > 1
```

## 列Aが重複しているデータと重複している件数も一緒に取得

```sql
SELECT
  COUNT(列A) duplicate_count
  , 列A
FROM
  テーブルA 
GROUP BY
  列A
HAVING
  COUNT(列A) > 1
```
COUNT足しただけ。
このままだと重複している列のデータしかわからないので、他の列のデータも取得する

## 重複している列Aを含む全列取得

```sql
SELECT
  * 
FROM
  テーブルA
where
  列A in ( 
    SELECT
      列A
    FROM
      テーブルA
    GROUP BY
      列A
    HAVING
      COUNT(列A) > 1
  ) 
ORDER BY
  列A
```

## 重複している列Aを含む全列と重複している件数を一緒に取得

```sql
SELECT
 *
FROM
  テーブルA table1
  INNER JOIN ( 
    SELECT
      COUNT(列A) duplicate_count
	  , 列A
    FROM
      テーブルA
    GROUP BY
      列A 
    HAVING
      COUNT(列A) > 1
  ) table2
    ON table1.列A = table2.列A
ORDER BY
  table1.列A
```

上記のタイプのSQLだと
データ件数が多いと返ってこない可能性があるので、
こんな感じに書くとイケるはず(多分)。

## データの件数が多いとき

```sql
SELECT
  * 
FROM
  テーブルA table1
WHERE
  EXISTS ( 
    SELECT
	  *
    FROM
      テーブルA table2 
    WHERE
      table1.列A = table2.列A
    GROUP BY
      table2.列A
    HAVING
      COUNT(table2.列A) > 1
  ) 
ORDER BY
  table1.列A
```

書いてみて、最後のやつだけでいいじゃんってなったけど気にしないw

ORDER BYでソートしてるのは見やすくするためです。

もっと良いやり方あるかもしれないけど、とりあえずこれで。
Unity でShaderの勉強 その8 Point Lightを取り込む

正しいアクセスの仕方なのかはわからないけど
unity_LightColor[0]でライトにアクセスできた

```
Shader "Custom/TestShader" {
	Properties {
		_MainColor("MainColor",Color) = (1,1,1,1)
	}

	SubShader {
		Tags {"LightMode" = "ForwardBase"}
		Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			uniform float4 _MainColor;

			struct v2f {
				float4 wPos : SV_POSITION;
			};


			v2f vert(float4 pos : POSITION) {
				v2f output;
				output.wPos = mul(UNITY_MATRIX_MVP,pos);
				return output;
			}

			float4 frag(v2f input) : SV_TARGET {
				return _MainColor + (unity_LightColor[0]);
			}
			ENDCG
		}
	}
}
```
横並びのブロックの中身を上下中央にするやりかた（枠付いているver.）

個人的に出現率の高い、横並びブロックの中身を上下中央にするやり方です。
よく使うのでまとめます。

ベースのHTMLとCSSはこちら。
今回は枠のあるボックスを4つ、同じ横幅になるように並べます。

```html
<div class="hoge">
  <div>ひとつめ</div>
  <div>ふたつめ<br>ふたつめ</div>
  <div>みっつめだよ</div>
  <div>よっつめ</div>
</div>
```


```css
* {
  box-sizing: border-box;
}

.hoge {
  border-top: 1px solid #000;
  border-bottom: 1px solid #000;
  border-left: 1px solid #000;
  background-color: #f7f7f7;
  width: 450px;
}

.hoge div {
  border-right: 1px solid #000;
  padding: 10px 20px;
}
```

# table-cellをつかう

よく使いますよね。

```css
.hoge {
  display: table;
  table-layout: fixed;
}

.hoge div {
  display: table-cell;
  vertical-align: middle;
}
```

見た目はこんなかんじ

![image](https://qiita-image-store.s3.amazonaws.com/0/146963/bb0d367c-514d-a115-3a10-0a810ac0eca0.png)


ちゃんとテキストが1行のブロックも上下中央に寄ってますね。

# flexboxをつかう

古いOSだと崩れるものの、楽ですよね

```css
.hoge {
  display: flex;
  align-items: center;
}

.hoge div {
  flex: 1 0 25%; /* 各要素等倍にしてます */
}
```

align-itemsプロパティは、親要素に指定すると子要素の垂直方向の位置揃えをすることができます。

これでいけると思いきや…

![image](https://qiita-image-store.s3.amazonaws.com/0/146963/1dee57d4-5417-446c-668c-6042037d9561.png)


こんなかんじで、borderが縦いっぱいになってくれません…。
borderがあるばっかりに…うまくいかない…。

こういう時は、


```css
.hoge {
  display: flex;
  align-items: stretch;
}

.hoge div {
  display: flex;
  align-items: center;
  flex: 1 0 25%; /* 各要素等倍にしてます */
}
```

にすると

![image](https://qiita-image-store.s3.amazonaws.com/0/146963/860cddee-285f-8d71-fb55-79aab3305065.png)

borderがのびた！！！！！

親要素のalign-itemsをstretch（コンテナいっぱいにひろがる）にして、
※ただデフォルトがstretchなので、何も付けなくてもOK
子要素にさらにflexを追加、align-itemsをつければ真ん中に寄るんですね。

divの中身ただのテキストじゃん！何も囲ってないじゃん！不思議！
って思ったのですが、この場合flexの直接の子要素になっているテキストはflexアイテムに包まれてるとのことです。

# まとめ

flexboxむずかしいけどたのしい
[個人メモ]子モデルの集計はinner join をしてくれる joins をつかうRails

#関連する子モデルのカラムを集計する方法
Order 1 : * Statement


Statementにpriceというカラムがある時合計金額を集計したい

#inner joinを使う（短い）

```rb:
Order.joins(:statement).sum(:price)
```

#left outer joinを使う（条件式入る）
これでもできるし、条件式つけられる(これは0円のやつだけ合計するので結果も0円)

```rb:
Order.includes(:statement).where(statements: {price: 0}).sum(:total_price)
```

#超普通なアナログ方式でやるなら

```rb:
total = 0
Order.each do |order|
  total += order.statement.price
end
```
とするとできる。
Dialogflow(旧:API.AI)  Python SDKを使ってみる #dialogflow

#API.AI Python SDKを使ってみる
API.AIをPythonのコードから触ってみたいと思います。API.AIが何か知らない方は[こちら](http://qiita.com/flatfisher/items/76bc86b65e5f2150a1a0)をご参照ください。
今回のサンプルは[こちら](http://qiita.com/flatfisher/items/76bc86b65e5f2150a1a0)で作成したプロジェクトをベースに進めていきたいと思います。

##API.AI Python SDKをインストール
[Git hub](https://github.com/api-ai/api-ai-python)にSDKのプロジェクトが公開されています。簡単なサンプルも入っているのでオススメです。

pipでもインストール可能です。

```
pip install apiai
```

##CLIENT ACCESS TOKEN を取得する
コンソール上で任意のプロジェクトを選択し歯車マークをクリックするとTokenを確認することができる。Tokenをコピーしておきましょう。

<img width="500" alt="Screen Shot 0029-02-23 at 16.31.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/fd838900-228e-5dfb-8efa-4f2f0117f5c4.png">

##試してみる
[こちら](http://qiita.com/flatfisher/items/76bc86b65e5f2150a1a0)で作成したラーメンを注文するIntentに対して「味噌ラーメンをお願いします。」と送信してみます。

CLIENT ACCESS TOKEN に先ほど取得したTokenを入れましょう。

###Pythonコード

```py:send_text_example.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os.path
import sys

try:
    import apiai
except ImportError:
    sys.path.append(
        os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)
    )
    import apiai

CLIENT_ACCESS_TOKEN = 'CLIENT ACCESS TOKEN'

def main():
    ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN)

    request = ai.text_request()

    request.lang = 'ja'  # optional, default value equal 'en'

    request.session_id = '<SESSION ID, UNIQUE FOR EACH USER>'

    request.query = u'味噌ラーメンをお願いします。'

    response = request.getresponse()

    print (response.read())


if __name__ == '__main__':
    main()
```

###実行

```
python send_text_example.py
```

###レスポンス

```json:response
{
  "id": "",
  "timestamp": "2017-02-23T07:37:13.582Z",
  "lang": "ja",
  "result": {
    "source": "agent",
    "resolvedQuery": "味噌ラーメンをお願いします。",
    "action": "order",
    "actionIncomplete": false,
    "parameters": {
      "RamenMenu": "miso_ramen"
    },
    "contexts": [],
    "metadata": {
      "intentId": "",
      "webhookUsed": "false",
      "webhookForSlotFillingUsed": "false",
      "intentName": "Order"
    },
    "fulfillment": {
      "speech": "かしこまりました。",
      "messages": [
        {
          "type": 0,
          "speech": "かしこまりました。"
        }
      ]
    },
    "score": 1.0
  },
  "status": {
    "code": 200,
    "errorType": "success"
  },
  "sessionId": "<SESSION_ID,_UNIQUE_FOR_EACH_USER>"
}
```

##参考リンク
[API.AI Docs](https://docs.api.ai/)
PHP で "false" は true になるから注意

PHP で、文字列の `"false"` は true になるので注意しましょう。

```php
$test = "false";
var_dump((bool) $test);

// => bool(true)
```

環境変数に格納した値を評価したりする場合は要注意です。

```php
// デバッグモードを環境変数に保存
putenv("debug_mode=false");

if (getenv("debug_mode")) {
    echo "debug_mode = ON";
} else {
    echo "debug_mode = OFF";
}

// => 予想に反して debug_mode = ON が出力されてしまう
```

`===` を使用して評価するか、 `0 or 1` を使用すると良いでしょう。

```php
// デバッグモードを環境変数に保存
putenv("debug_mode=0");

if (getenv("debug_mode")) {
    echo "debug_mode = ON";
} else {
    echo "debug_mode = OFF";
}

// => 想定通り debug_mode = OFF が出力される
```
Slackでなりすましごっこをして遊ぶ（すぐバレる）

# はじめに
この記事はSlackで簡単ななりすましを行う方法を紹介しますが、悪用は厳禁です。
まぁ、すぐバレる程度のクオリティですが。。。

サークル活動の一環として作った記事のため、説明が適当かもしれませんがご了承ください。

こんな感じになります。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/45e98fef-b237-e8d2-ac7c-36a6145bb7a4.png)

# 実行環境の用意
PythonのSlackerというライブラリを使用します。
https://github.com/os/slacker

``` shell
$ pip install slacker
```


# なりすましを行おう

## なりすましたい相手の画像を用意する
なりすましたい相手のアカウントの画像を手元に用意します。**この作業が一番めんどくさいかもしれません。**

1. Slackの画面で相手のアカウントを選択して、画面右側にユーザ情報を表示させます。
2. その状態で画面のキャプチャを行い、適当にトリミングを行ってアカウント画像だけの画像を作成します。
   - 私のfirefoxの環境では、「FireGestures」アドオンを使うことで画像だけをダウンロードできたが、それ以外の環境では画像を保存する選択がなかった。
3. 画像を128x128の大きさに縮小します。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/039f8817-6591-ec6e-93ee-28c2800b3e59.png)
説明用の適当なチームを使っているので、わざわざ黒帯で隠す必要もないが。。。

## 作成した画像の絵文字を作る
作成した画像の絵文字を作ります。絵文字を作るという時点で、クオリティの低さがうかがえます。

1. Slackの画面の左上のチーム名をクリックするとメニューが表示されるので、「Customize Slack」を選択する。
2. 絵文字を追加できる画面が表示されるため、絵文字名と先ほど作成した画像を指定して、絵文字を作成する。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/cdfb26eb-0753-8e97-9b19-c5adc6cc674f.png)

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/e9e53956-1bf0-449e-1f4a-f7d845b4a34e.png)


## なりすましの投稿を行う
Pythonで以下のプログラムを作成します。

``` python:narisumasi.py
# coding: utf-8

# トークン、なりすましたいユーザー名、作ったアイコンを指定
token = 'xxxx-xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx'
username = 'sukesuke'
icon = 'suke_icon'

from slacker import Slacker

slack = Slacker(token)
icon = ':' + icon + ':'     # アイコンの絵文字はコロンで囲む

# なりすましを行う関数。チャンネルとテキストを指定
def narisumasi(channel, text):
    slack.chat.post_message(channel, text, username=username, icon_emoji=icon)
```

Pythonを起動して`narisumasi`関数を実行します

``` python
>>> from narisumasi import narisumasi
>>> narisumasi('#general', '今日休みます')
```

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/3b813d96-fcfe-6c38-bf6c-8b373f81cc1b.png)

このように、なりすましたい相手と同じ名前、アイコンで投稿することができます。

# すぐバレる理由
名前もアイコンも本人と同じであるのに何故バレてしまうのか。その理由は、名前の横に`APP`と表示されてしまうからです。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/145051/31d831ab-4b8f-d26a-1595-88036a37d51b.png)

# Pythonのプログラムを作るのがめんどくさい場合
なりすましの相手が変わるたびに、プログラムを書き直す必要があるのでめんどくさいかもしれません。
そのような人のために、コマンドライン上からユーザ名とアイコンを指定してテキストを投稿できるソフトを作成しました。
**実を言うと、このソフトを作った勢いでこんな記事を作りました。**
GitHubに公開しているので、**導入と使い方を各自で読んで下さい。説明は真面目に書いてます。**
https://github.com/sukesuke13/slackpost

導入が完了したら、以下のようなコマンドを実行することで、先ほどと同様の投稿が行なえます。

``` shell
$ slackpost -u sukesuke -i suke_icon 今日休みます
```

# おわりに
解説が雑になってしまいすいません。
こんな記事ですが、少しでも楽しめてもらえたら幸いです。
実際私はこれで知り合いをだましました。その後のネタばらしも含めて、少し楽しめましたね。
FCMを使用する際のGooglePlayServiceの有効チェック処理について

# FCMのリンクだけではGoogleApiAvailabilityが使用できない

## FCMのバージョンによって異なる。
2017/02/23時点の最新版(10.2.0)FirebaseCloudMessagingをリンクするだけではGoogleApiAvailabilityが参照できないようだ。
日本語マニュアル記載のバージョン10.0.1でもビルドが通らないので、10系はすべからくダメなのかも知れない。
FCM9.0.2の場合では、GoogleApiAvailabilityが参照できた。
GooglePlayService-baseをリンクすれば解決はすると思われるが正しい解決方法なのかは不明。
そこで**「dependenciesに重複するような記述を増やしたくない」**という思いもあって、GooglePlayService-baseをリンクするのが良いのか自分なりに調査を行った。

*(StackOverFlowには、「apply plugin: 'com.google.gms.google-services'」を記述する個所を「apply plugin: 'com.android.application'」の次の行にすればうまくいくと言う記事もあったが、私の環境では上手くビルドできなかった。)*

・以下の設定では上手くいかなかった。
`compile 'com.google.firebase:firebase-messaging:10.2.0' // (英語マニュアル記載のバージョン)`
又は
`compile 'com.google.firebase:firebase-messaging:10.0.1' // (日本語マニュアル記載のバージョン)`

※公式のマニュアル通り、２つのbuild.gradleに設定を追加している。
[Android プロジェクトに Firebase を追加する](https://firebase.google.com/docs/android/setup?hl=ja)

・過去バージョンを選択した場合、正常にビルドでき、デバッグ動作した。
`compile 'com.google.firebase:firebase-messaging:9.0.2'`

## 調査方法
公式のサンプルを参考にする。
[Firebase Quickstarts for Android](https://github.com/firebase/quickstart-android)

ソースを見た結果、組み込まれているのは10.2.0のFirebaseであり、最新に対応していると思われる。
が、肝心のGooglePlayServiceをチェックする処理(GoogleApiAvailabilityを必要とする処理)はコード中になかった。
FirebaseのサンプルだからFirebaseに関わる部分しかないんだろう、と言うのはわからなくもないが、Firebaseのスタートアップガイドには書いてるのに如何なものか。

最終的な判断としては、10系からはGooglePlayserviceとFirebaseの分離が進んで、FirebaseをリンクしただけではGooglePlayService由来のコードは使用できないものが増えたのだろうと判断。(「使用できない」と言い切らないのは、なぜかFCM(10.2.0)をリンクした場合でもcom.google.android.gms.common.ConnectionResultは参照できた為)

素直に[app/build.gradle]に以下を追記してビルドを行う様にした結果、無事に動作した。
`compile 'com.google.android.gms:play-services-base:10.2.0'`

## まとめ
Firebaseを扱う際にGooglePlayServiceをチェックする処理を入れるなら、「play-services-base」も追加でリンクすること。

※このあたりの内容について詳しい方は、ご連絡頂けると幸いです。
PythonでBasic認証ヘッダ付きのHTTPを送る

PythonでBasic認証ヘッダ付きのHTTPを送るメモ。

urllib2を使うのだが、マニュアルに従うとHTTPPasswordMgrWithDefaultRealmやらHTTPBasicAuthHandlerやら死ぬほどめんどい。

そんな場合は、自分でヘッダを書いてしまえば良い。

話は簡単で`authorization`というヘッダーキーに、 `Basic (「ユーザ名:パスワード」のbase64ハッシュ値)`という値を入れてあげるだけで良い。

コードで書くと

```py
headers["authorization"] = "Basic " + (user + ":" + pass).encode("base64")[:-1]
```

でOK。最後の[:-1]は改行コードを削っている。

コード全体は以下のよなう感じ

```py
import urllib2
url = "http://sample.com/index.html"
user = "XXXX"
password = "XXXX"
headers ={}
headers["authorization"] = "Basic " + (user + ":" + password).encode("base64")[:-1]
req = urllib2.Request(url=url, headers=headers)
res = urllib2.urlopen(req)
print(res.read())
```

めっちゃ簡単だった。
AWS上でLiferay 7 / DXPを利用した場合に、SAXParserエラーが発生する際の対処法

Liferay 7 / DXPをAWS上で動かす際に、ドキュメント＆メディアのリポジトリにS3を利用するのが一般的だが、その際にSAXParserエラーが吐かれる。それを解決するには以下の手順で解決する。

1. /webapps/ROOT/WEB-INF/classes下に system-ext.propertiesという名前でファイルを作成
2. org.xml.sax.driver=com.sun.org.apache.xerces.internal.parsers.SAXParser　という1行を挿入。
3. サーバーを再起動すると、エラーは発生しなくなっているはず。
IT・プログラム関連の勉強会関連サイト

# IT・プログラム関連の勉強会関連サイト
普段チェックしている、IT・プログラム関連の勉強会イベントを開催 or 参加できるサイトをメモしておきたいと思います。

## [connpass](https://connpass.com/)

一番見る機会の多いサイトで、内容も多岐に渡るので、「勉強会の選択肢」がたくさんあって重宝しています。
地域ごとにカテゴリが分けられていて自分の身近なイベントを手早く探せます。
参加イベントを探すにはオススメのサービスです。

## [Peatix](http://peatix.com/)

IT関連のアントレプレナー向けセミナーイベントやプログラミング関連スクールのイベントに参加できるイベントサイト。
参加無料のイベントもあって、IT・プログラミングに限らず、さまざまなイベントを扱っている。
スマホでチケットを発行していて、イベント参加しやすい仕組みが用意されている。

## [TALKPLACE](https://talkplace-world.com/)

完全オンラインのイベントプラットフォームで、ビデオチャットを利用して、自宅から勉強会に参加したり、勉強会が開催できるサイト。
勉強会に限らず、異業種交流会などさまざまなイベントが行える。
プライベートイベントが開催できるので、URLを知っている人のみ参加できるイベントが作れる。

## [dots](https://eventdots.jp/)

プログラム言語ごとにイベントが探せるなど、プログラミング学習に強い印象のサービス。
メールで毎日の新着イベントが届くなど、情報が入手しやすい仕組みが用意されている。

## [Doorkeeper](https://www.doorkeeper.jp/)

参加者へのアンケートフォームを作れるなど、イベント参加者の情報を集める仕組みが用意されている。
コミュニティにメンバ登録され、イベントを見逃さない仕組みがあり、継続的にイベントに参加しやすい。
ハッカソン・言語勉強会などさまざまなイベントが開催されている。

## Debian勉強会

■[関西勉強会](https://wiki.debian.org/KansaiDebianMeeting)
■[東京勉強会](http://tokyodebian.alioth.debian.org/)
Debianについて勉強会を開催している「Debian勉強会コミュニティ」です。
Debian JP Projectメンバーが運営している。

## [ATND(アテンド)](https://atnd.org/)

「感謝祭」などＩＴ以外のイベントも開催しているイベントプラットフォーム。
参加したいイベントが結構あるので重宝している。
参加人数が多いイベントが主体。

## [ストアカ](https://www.street-academy.com/myclass/2529)

勉強会以外にも「ヨガ」「ダンス」など、ホビー関連のイベント（講座）も豊富にある。
ライトな集まりというよりは、「ビジネス」活用のためのイベントが多い印象。

## [Event Force](http://eventforce.jp/event/it/)

初心者向けのプログラミング講座などが多い。
実務でコード書いている人にはかなり基礎的な内容の勉強会イベントが多数ある。
「ビジネス系」のイベントが多い印象。

## [PGColony](https://pgcolony.com/)

プログラミングを勉強できる仲間や「師匠探し」ができるサービス。
コンセプトは個人的に好きな内容。
個人間の「つながり」を意識したおもしろいサービス。
UE4-OSCの送受信を行う V15.0対応 #UE4Study

# Unreal Engine Pluginを作成する V15.0

UE4-OSCの送受信を行う
http://qiita.com/gansaibow/items/bb8cb4f9cd24db02531f

Visual Studio 2015がインストールされていることが前提

## 15.0でOSCPluginを使用してみたがエラーになる
「[UE4-OSCの送受信を行う](http://qiita.com/gansaibow/items/bb8cb4f9cd24db02531f)」を15.0で設定した。

新規プロジェクト作成時にC++ではなく、ブループリントを選択する
Pluginsフォルダを作成して、OSCフォルダをコピー。
以下のdialogが表示されて、Pluginがビルドされない。
Missing or incompatible modules OSC plugin - woud you like to disable it? You will no longer be able to open any assets create using it.
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/5a1568fc-395f-7016-3028-a0fe3fe0a805.png)

## プロジェクトにC++プロジェクトを作成する

Pluginsフォルダを作成して、プロジェクトを開く
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6ba25cbd-1697-c6b7-3415-b6ebd1c63222.png)


C++クラスを追加する

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/399f718d-e051-2768-07ba-76c8da74c193.png)

何かしらのC++クラスを作成する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/db1ae6e0-02d0-3196-c379-42271958c22f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/15941442-bd0a-86f3-8342-f8a4f503107d.png)

Binaryフォルダを削除する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b8504513-c012-c67c-d0c7-835b8c91ded8.png)


プロジェクトファイルを開く


Missing dialog

はい
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/93387ee2-ffc0-8d0b-7c71-c29fe6073a97.png)

進捗dialog
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f964f49d-028a-e677-1a1a-ca0633888f1f.png)

OSCプラグインの機能が使える
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/65b21396-f3b9-519a-b6fd-b1077487fd0c.png)

処理に関しては前回書いた処理を実装する
[受信用のブループリントクラス OSCReceiver を作成](http://qiita.com/gansaibow/items/bb8cb4f9cd24db02531f#%E5%8F%97%E4%BF%A1%E7%94%A8%E3%81%AE%E3%83%96%E3%83%AB%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E3%82%AF%E3%83%A9%E3%82%B9-oscreceiver-%E3%82%92%E4%BD%9C%E6%88%90)


2017/03/06
最新版でBuild.csが更新されていたので、Build.csの修正の記述は削除
![20170306_OSCPluginUpdate.png](https://qiita-image-store.s3.amazonaws.com/0/111261/0dac7118-5d7e-bfd7-9442-33d818053418.png)


## 参照

UE4 プラグインを自分でビルドしてみる
http://unrealengine.hatenablog.com/entry/2015/05/20/220000
Github レビューでの Approve / Request Changes / Comment の使い方

# Approveとは

>(…を)よいと認める、(…に)賛成する、(…を)(正式に)承認する、認可する

## 使い方

PRを見て「この変更でOK」って思ったら、Approveを選んでレビューを送ろう。
( ちなみにレビューコメント0個でも Approve を送れる )

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d4462453-d264-da87-2766-52120579c005.png)

## 一覧

PR ではこんな風に、Approveを付けた人が分かる。
レビュアーの誰がPRを承認していて、誰がしていないのかが分かりやすい。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/c2538b2f-7322-6051-7f9f-bdd5048211f6.png)


# Request Changes

「この状態ではPRは通せない」「修正が必要だ」と思ったら Request Changes を選んでレビューを送ろう。


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/960b77a6-fdad-2a09-113b-83c7f52f7cb7.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/536dd394-27e7-98d8-a6cf-0a06d26f2718.png)

# Comment

承認も非承認もしない場合は、 Comment を選んでレビューを送ろう。
「Approve とか Request changesとか、運用的に使わない」って場合は、この Comment だけでOKだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/8d2ad803-184e-9990-de25-2b71fb2836fe.png)


# 取り消し

いったん Approve / Request Changes を付けても、あとから取り消せる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/0c4ff009-85bd-2d21-a59a-8e85786ee5bf.png)

# 設定

**Approve が一個以上で、Request Changes が０個じゃないとマージできないよ** って設定もできるっぽい。

## 設定画面

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/77566fa8-d1ce-0a3b-6fc5-da83c80927e2.png)

## Approve がついていない場合

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/aedd9f1b-7308-0e6f-02d6-3246477c1f34.png)

## Request Changed がついている場合

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/96a3e811-92e9-d12f-299f-00c4a85f727a.png)

# 以前の運用

僕がいま所属しているプロジェクトでの以前の運用は、

- 変更を承認する場合は、Conversation (コード行に紐付かない、普通のコメント) で :thumbsup: ( + 1 ) マークを付ける
- 承認しない場合は :thumbsdown: ( -1 ) を付ける
- 合計して +2 になったらマージして良い、というものだった。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/eca05571-6b67-6136-1b58-174b79edeab2.png)


ただこれは、今プラマイ何個なのかが分かりにくい。
なので Githubに 新しいレビュー機能が出来てからは、Approve / Request Changes を使うことに。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
機械学習論文読みメモ_44


[SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient](https://arxiv.org/pdf/1609.05473v5.pdf), AAAI
シーケンスデータに対するGANモデルは基本的に実数データに対するものであり、テキストデータをはじめとする離散データに対応したものはなかった。
主な問題としては、discriminativeモデルで得られる勾配情報を、generativeモデルに与えてgenerativeモデルを少しずつ更新する場合に、訓練データに辞書に含まれない情報があった際に効果をなさない事である。
また損失はシーケンス全体に対して計算されるため、generativeモデルから得られた部分的なシーケンスに対する損失をどのように計算するかも問題になる。
本論ではgenerativeモデルを強化学習におけるagentとみなして逐次的な決定過程として考える。
利得は例えばBLEUなどの問題特化な指標を用いるのではなく、discriminativeモデルを用いて利得を返す。
stochastic parametrized policyを用いる事で、モデルを確率的に扱い、今までにないような情報に対する勾配も活用可能にする。
またpolicy gradientに基づく学習を用いる事で離散データにおけるモデル更新を可能にした。

[Equality of Opportunity in Supervised Learning](https://arxiv.org/pdf/1610.02413v1.pdf)
特定のセンシティブな属性情報に関するdiscriminationにおける指標を提案し、それに基づく教師あり学習を提案する。
具体的には、学習されたモデルに対し、それらセンシティブな属性情報に対するdiscriminationをなくすような調整を加える。
これは結果的に無意味な判別をなくし、より良い結果を生み出す。

[Fast Memory-efﬁcient Anomaly Detection in Streaming Heterogeneous Graphs](https://arxiv.org/pdf/1602.04844v2.pdf)
コンピュータネットワーク上のデータに見られるような、各サンプルが異なったグラフ構造を持つようなデータストリームに関する異常検知を考える。
ここでは類似度指標を、２つのグラフ間でどれくらいの頻度で同じ局所構造が現れるかを元に、定義し、これに基づいて異常検知を行う。
各局所構造はstringを用いて表され、それに基づきグラフ全体は高速演算が可能なベクトル表現へ変換される。
またメモリ制約に応じて要約的なデータだけを保持するsketchingも行う。
機械学習論文読みメモ_43


[Exponential expressivity in deep neural networks through transient chaos](https://arxiv.org/pdf/1606.05340v2.pdf), NIPS2016
deep NNにおける信号伝搬（feed-forward等）を、高次元カオスにおける平均場理論とリーマン幾何を組合せる事で解析する。
従来、実験的にある特定の関数はdeep NNでは多項式オーダーのパラメータ数で表現出来るのに対し、shallow NNでは指数オーダーのパラメータ数が必要な事が知られている。
この事が一般の関数に関しても言えるかどうかは従来研究されており、特定の関数、適用範囲に限定して確かめられている。
本論ではより一般的なフレームワークとして、任意の非線形関数、NN構造に適用可能で、自然なfunction complexityの測度を考える。
そのためのツールとしてRiemannian geometryとdynamical mean field theoryを用いる。
カオス理論の文脈で相転移を解析すると、各層における計算時の分散に応じて、ある２つのデータ点間の距離が近づいていくか、離れていくかが決まる。
Riemannian geometryの文脈で考えると、deep NNは層方向に信号伝搬していくに連れ、どのようにデータ多様体の長さやその曲率が変化するかを解析する事がわかる。
その結果、非線形活性化関数（シグモイド）を利用している層伝搬では、多様体の長さは単調増加していくが、曲率は減少しない事が分かった。
曲率の変化は相転移におけるカオス層に入り込んだか否かで決まり、カオス層の場合は層伝搬に従い曲率は大きくなり、隠れ層の多様体構造は複雑化する。
この多様体の長さ、曲率発展に伴うNN構造の複雑化により、最終的にdeep NNは複雑な関数を表現出来る事を可能にする。
対称的に、shallow NNでは、その多様体の長さはあるオーダーでバウンドされ、その表現力は、たとえ層の幅を大きくしたとしても改善幅は限定的である事が分かった。

[Full Resolution Image Compression with Recurrent Neural Networks](https://arxiv.org/pdf/1608.05148v1.pdf)
RNNに基づいた画像圧縮手法を提案する。
この手法は圧縮率を変える事が可能で、そのために再学習を必要としない。
ネットワークはRNNがベースのencoder、バイナリ変換を行いメモリ可能な形へ変換するbinarizar、RNNがベースのdecoderが存在する。
このパイプラインに対し、再構成後の出力画像と入力画像の間の誤差を計算し、それに対して同様のパイプラインを繰り返し適用する。
この時の各ステップの誤差値のL1和値を損失関数として最適化する事になる。
このプロセスは例えば1ステップしか適用しない場合でも1/192圧縮を実現する。
また得られるバイナリコードはエントロピー的に最適ではないため、entropy codingをさらに適用する事で圧縮率を向上させる。
entropy codingはPixelRNNの文脈を用いてNN的に実装される。
これはraster-scanで逐次的に入力を得る時、今までのバイナリコードをLSTM構造で用いて逐次的にbinary-codeを予測し、arithmeticに計算されるentropy conderとのクロスエントロピーを元に必要なコード長を学習する。

[Deep Directed Generative Models with Energy-Based Probability Estimation](https://arxiv.org/pdf/1606.03439v1.pdf)
エネルギーモデルに基づいたDNNは正規化係数の計算においてintractableでありMCMCに基づく近似計算を必要とする。
しかしながらMCMCは多峰分布におけるサンプリングを苦手としている。
代わりに本論ではDNNに基づく生成モデルによるサンプリングを提案し、これは決定的にiidな一様分布から対象とする分布へtransformを行う。
これによりMCMCで要求される長いシーケンスのサンプリングを回避する事が出来る。
結果的に学習されるモデルは２つの互いに双対なモデルとなる。
１つは元々扱っているエネルギーモデルであり、生成モデルから得られるサンプルを元に最尤推定が行われる。
もう１つはサンプリングに用いられる生成モデルあり、これはGANと同様の枠組みで学習される。
つまりエネルギーモデルはdiscriminatorとして捉え、エネルギーが最小化されるべき訓練サンプルに対するエネルギーは低く、生成モデルより得られるサンプルはfakeとしてエネルギーを高くするような解釈をする。
これに対して、生成モデルはエネルギーモデルを騙すためにエネルギーが低くなるようなサンプル、つまり対象分布を良く表すようなサンプルが得られる事になる。
DjangoサービスをPython 2.7からPython 3系へ変えた際の壁

チラ裏級。忘れると悲しいもん

# 前提

かなり前に Python 2.7で適当に書き散らしたものがまだ生きているので直してみました。
今の自分ではやらない、良くないプラクティスを中で平然とやっているので、それはそれでつらい感じ。

# Celery

djceleryが気づくとdeprecated？

Celery 3.1あたりから (今はCelery 4.0系？) Celery本体がDjangoをサポート。

それ自体は良いんですが、作法が少し変わった他、感覚的な表現ですが「Djangoの環境を読み込んだ後にCeleryの設定を読む」という流れが「Celeryを起動した後にDjangoのモジュールを読みにいく」順序になったせいなのか、実行ディレクトリにモジュールを置く羽目に

* /opt/proj ...  Djangoのプロジェクト置き場。ここにproj/ がある
* /home/proj ... ワーカのディレクトリ

とある際に /home/proj 下にproj/ がないとあかんようになった気がします。
あるいは Celery 起動後にモジュールの読み込みパスを足すか。

# social-auth

social-auth-app-django を使えとの指示。

移行パスは比較的しっかり書いてある印象でしたがそれでもかなり破壊的変更なのは違いなく、モジュール名全変更。

https://github.com/omab/python-social-auth/blob/master/MIGRATING_TO_SOCIAL.md

# 相対インポート

ある箇所で ``__import__()`` 相当の処理を行う流れで文字列でローカルのファイル(モジュール)名を指定していて、
これが2to3では補足されてなかった。 ``.`` 入ってないから「ない」ことになり、結果として丸々ロードされていない前提で
別の処理が走り、それが色々トラブルをぶちまいてくれました。

# 文字列, bytes

そもそも明確にstrとunicodeを区別しないでも書けてしまうことがある Python 2、
いきなりそれを厳密にしろと言われると混乱する部分が出てきます。

* データの扱いが雑だった自分を恥じる
* 外部モジュール (CPythonのもの含む) が雑だったのが厳密になって困惑する

システム上 `Popen()` を使うケースが多いんですが、このstdout等の文字エンコーディング絡みでいい加減なのが露呈。
特にstdoutから更に別の関数に投げるときに bytes なのか str なのか、とか。

外部モジュールが厳密になる方での困惑は今回はなかったかな。
以前だと、csvモジュールとかそういう基本的なのでも食らった記憶があります。
困惑した上で新しい作法に合わせるしかないんですけど。

# Python 3.4 -> Python 3.5

実験環境が Ubuntu 14.04, 別環境が Ubuntu 16.04 という構成になっていて、移行時に ``open(filename, 'b')`` を怒られました。
``open(filename, 'rb')``です。


# まとめ

今回は Python 2 -> 3というよりはしばらくメンテしてなかった災禍みたいなところの方が大きかった印象。
Apache Kafkaのトピックパーティション・レプリカ配置先をマニュアル選択する方法

# やりかた

Kafkaでのトピック作成時にパーティションとそのレプリカの配置先を特定のKafka Brokerにしたい場合は、トピック作成時に**replica-assignment**オプションを指定します。

```
$ ${KAFKA_HOME}/bin/kafka-topics.sh --create --topic replica-assignment-test --zookeeper localhost:2181  --replica-assignment 1:2,2:3
```

配置するBrokerをIDで指定(上の例だと1,2)します。
上の例だと、1つ目のパーティションはBrokerIDが1,2に配置され、2つ目のパーティションはBrokerIDが2,3に配置されることを意味しています。
つまり、このreplica-assignment-testトピックは2パーティションで構成され、それぞれのパーティションのレプリカ数は2ということになります。


確認してみるとちゃんとそのように配置されています。

```
$ ${KAFKA_HOME}/bin/kafka-topics.sh --describe --zookeeper localhost --topic replica-assignment-test
Topic:replica-assignment-test	PartitionCount:2	ReplicationFactor:2	Configs:
	Topic: replica-assignment-test	Partition: 0	Leader: 1	Replicas: 1,2	Isr: 1,2
	Topic: replica-assignment-test	Partition: 1	Leader: 2	Replicas: 2,3	Isr: 2,3
```

ちなみに各パーティションのレプリカのリーダーは、コロンの先頭に指定したものが選択されるようです。