OmniAICreator/Qiita-1.07M huggingface dataset:
EMRをコマンドで実行

EMRをコマンドラインから起動した時の忘れないようにするためのメモ。（昔のメモなので２年以上前）
S3に日付毎にフォルダがあってその配下のデータをEMRにくわせて結果を出す感じだったと思う。

```shell-session

#!/bin/bash

START_DATE=$1
END_DATE=$2
UNIXSTART_DATE=`date -d ${START_DATE} "+%s"`
UNIXEND_DATE=`date -d ${END_DATE} "+%s"`
DAYS=`expr "${UNIXEND_DATE}" - "${UNIXSTART_DATE}"`
ROOPS=`expr ${DAYS} / 86400`

cd /opt/emrtool
for day in `seq 0 $ROOPS`
do
    DATETARGET=`date -d "${START_DATE} ${day} days" +%Y%m%d`
     /opt/emrtool/elastic-mapreduce --create --name 'xxxxxxxxxx' \
     --instance-group master --instance-type m1.small \
     --instance-count 1 \
     --instance-group core --instance-type m1.small \
     --instance-count 4 \
     --bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-hadoop \
     --args "-c,fs.s3n.multipart.uploads.enabled=true,-c,fs.s3n.multipart.uploads.split.size=524288000,-s,mapred.task.timeout=2000000" \ 
     --log-uri s3n://hogehoge/index/_log/ \
     --enable-debugging \
     --jar s3n://hogehoge/jar/hogehoge.jar \
     --args 'hogehoge,s3n://hogehoge/${DATETARGET},s3n://hogehoge/index/${DATETARGET}'done 
```
CakePHP3リレーションまとめ

CakePHP3でリレーションの定義を書くときに、どれを書いていいかわからなくなってきたと耳にしたので簡単にまとめてみます。

テーブル同士の繋がり（リレーション）は大きく分けて一対一・一対多・多対多の３種類があります。
これらに関してまとめていきます。

# 一対一

カラムが沢山あるテーブルを分解するときとかに使いますね。

![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/62367/33b40ae0-ca17-49a6-b8ac-3e5792e396a3.png)

```php:UsersTable.php
// ユーザー詳細を1件持っているのでhasOne
$this->hasOne('UserDetails', [
    'foreignKey' => 'user_id',
]);
```

```php:UserDetailsTable.php
// ユーザーに所属するものなのでbelongsTo
$this->belongsTo('Users', [
    'foreignKey' => 'user_id',
]);
```

# 一対多

よく使うリレーションでね。一般的な親子関係のやつ。

![1-N.png](https://qiita-image-store.s3.amazonaws.com/0/62367/94e55088-124d-6031-3a3f-cfbaddf2d683.png)

```php:ArticlesTable.php
// タグを沢山持っているのでhasMany
$this->hasMany('Tags', [
    'foreignKey' => 'tag_id',
]);
```

```php:TagsTable.php
// 記事に所属するものなのでbelongsTo
$this->belongsTo('Articles', [
    'foreignKey' => 'article_id',
]);
```

# 多対多

ちょっと大きな設計になってくるとよく出現します。
同じタグは他の記事でも使いまわせるようにしたいとかの時。

![1-N-1.png](https://qiita-image-store.s3.amazonaws.com/0/62367/fcca5a75-014e-e16f-7a38-d82e939885f5.png)

```php:ArticlesTable.php
// 中間テーブルをjoinTableに記載てbelongsToMany
$this->belongsToMany('Tags', [
    'joinTable' => 'ArticlesTags',
]);
```

```php:TagsTable.php
// こっちも同じくbelongsToMany
$this->belongsToMany('Articles', [
    'joinTable' => 'ArticlesTags',
]);
```

belongsToManyが地味に楽ですね。
containで取得時も中間テーブルのレコードは省かれるので、不要な場合はこちらがいいかもしれないですね。
nginx のログでVariableに値が存在しないとき、ダッシュ(-)ではなく空白または任意の文字列を出力する

# やりたいこと

nginx のログの書式設定には、`log_format` ディレクティブを使いますします。
その中には Variable が使用できて、[ここ](http://nginx.org/en/docs/http/ngx_http_core_module.html) に書いてあるような変数を埋め込めます。

で、その変数のうち、以下のようなものはリクエストによっては値が無い可能性があります。

- httpヘッダー由来のもの `$http_name` 
- cookie の値を取り出すやつ `$cookie_name`
- httpクエリパラメータを取り出すやつ `$arg_name`

これらをそのまま log_format で指定すると、値が存在しないときは値の代わりに `-` ダッシュを出力してしまいます。

この挙動を変えたい。具体的には空白を出したい。

# やり方

## [map ディレクティブ](http://nginx.org/en/docs/http/ngx_http_map_module.html#map) を使う

```nginx
map a $lang { default $http_accept_language; }
map a $argp { default $arg_p; }

log_format dummy 'lang:$lang\tp:$argp'
```

とかすると、HTTP ヘッダに `Accept-Language` が無いときは空白を出してくれます。query に p が与えられなかったら、空白が出ます。

### そうなる理由
map の説明を見るとわかるのですが、`map string $lang {}` は、string（上の例の場合は固定の `a` という文字列) から `$lang` という新たな変数を作るのだけど、その際に `{}` 内の処理をする、という動きをするようです。

で、そこに `default $baz` と書いておくと、string にかかわらず、$baz の値を使うようになる。値が無いので、空白文字列が入ると。

値が無いときに `-` を入れるのは、ロギング時の仕様で、変数の値を評価するときの仕様というわけでは無さそうです。

この、変数を評価する仕組みが場所によって異なる（というか、log_format の指定が他と異なる？）のを利用して、例えば通常は使えない `-` を名前に含むような cookie の値を出力するときの [hack](https://moeffju.net/blog/nginx-automatic-variables-with-dashes) などにも使われるようです（というか、そこから inspire した）。

### 発展。値が無いときに任意の文字を使う
ログに変数の値が存在しないとき、`-` ではなく空白を出すことはできましたが、「任意の文字列」を出せるようにしてみましょう。

```nginx
    map $http_x_forwarded_for $xff {
        default $http_x_forwarded_for;
        "" "=";
    }
```
こうです。
`$http_x_forwarded_for` から `$xff` を作りますが、`""`(空文字列)と一致したときは `=` を使い、一致しなかったとき（つまり、値があるときですね）は `$http_x_forwarded_for` の値を使う、という意味です。

任意の文字に変えるのはあんまりニーズ無さそうですが、なんか応用ができるかもしれません。

## 他の方法を知りたい
もっとスマートな方法は無いのですかね...
SSL購入から1時間以内にHerokuに適用する方法

サーバー構築時にいつもやってることなので、メモ

## 使用するSSL証明書

- RapidSSL
    - さくらインターネットで購入
    - http://www.sakura.ad.jp/campaign/rapid_ssl/
     
## サーバー

- Heroku

## 手順

- CSR(証明書情報)の生成

````
openssl dgst -md5 /var/log/system.log > rand.dat
openssl genrsa -rand rand.dat -des3 2048 > rapidssl.pem
openssl req -new -key rapidssl.pem -out rapidssl-csr.pem
````

- 色々聞かれる
- `A challenge password []:` と `An optional company name []:`は空でok
- `Common Name (e.g. server FQDN or YOUR name) []:`
    - ここだけ間違わないように！
    - 今回はワイルドカードでのサブドメインでの認証はできないので、FQDNで入力

```
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

```

- 購入画面に進む
- CSR(証明書情報)の内容確認のフォームが表示されるので上記のrapidssl-csr.pemの中身をコピーして、textareaに貼り付ける

![スクリーンショット 2015-12-17 16.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/51849/7229992f-cb16-c8b8-9c7e-c7c547ca9958.png)

- 30分程度待つ
- https://secure.sakura.ad.jp/menu/top/
- [契約情報] -> [契約サービスの確認] -> SSL ラピッドSSLの表のところのサーバ- - 証明書のボタンを押す
- 手続きの欄にボタンがあればそれを押す
- htmlファイルがダウンロードされるので、DocumentRoot直下にダウンロードしたファイルを設置
- 5分以内にサーバーの確認が取れるので、再度上記のページに行くと`サーバー証明書DL`というボタンに変わってるのでボタンを押す

- `server.crt`がダウンロードされる

```
cp -rp server.crt cert.pem
```

- サーバ証明書と中間CA証明書の結合
    - 中間CA証明書は以下から、`-----BEGIN CERTIFICATE-----`から`-----END CERTIFICATE-----`までをコピー
        - https://www.geotrust.co.jp/resources/rapidssl/repository/intermediate_sha2.html#b
    - `cert.pem`を以下の順番に並ぶようにファイル作成

```
サーバー証明書
中間証明書
```

- 秘密鍵のパスワードを解除したければ

```
openssl rsa -in rapidssl.pem -out cert.key
```

- Herokuサーバーへ反映

```
heroku certs:update cert.pem cert.key --app [app name]
```
Swift/BondでUItextFieldとviewModelに対して、bidirectionalBindToを設定する


## 状況
textFieldをviewModelのプロパティと双方向バインディングしようとすると以下のように怒られました

```:viewModel.swift
class ViewModel: NSObject {
	static var str = Observable("")
}
```

```:MyViewController
import UIKit
import Bond

class MyViewController: UIViewController {
	@IBOutlet weak var textField: UITextField!

	override func viewDidLoad(){
	   textField.bnd_text.bidirectionalBindTo(viewModel.str)

	}
}
```

```:エラー文
Cannot invoke 'bidirectionalBindTo' with an argument list of type '(Observable<String>)'
```

## 解決方法
viewModelの定義時に、ちゃんと型を合わせてあげれば良いことがわかりました

```:viewModel.swift
class ViewModel: NSObject {
	static var str:Observable<String?> = Observable("")
}
```

## 失敗例
以下はやってみて、ダメだったものたちです。
Stringがoptionalなので、`Observable<String>?`はだめなんですね

```:viewModel.swift
static var str:Observable<String> = Observable("")
static var str:Observable<String>? = Observable("")
static var str:Observable<String?> = ""
```
jade でアクティブページの html 要素に class 等を付与する パート２

[関西フロントエンドUG Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kfug) 15日目の記事です。

先日開催された、[関西フロントエンドUG 年忘れLT大会](http://kfug.connpass.com/event/22377/) で以下を内容しゃべりました。

Dreamweaver を使うのやめた話
<http://www.slideshare.net/shimakyohsuke/dreamweaver-56109864>

19 スライド目の「グローバルナビにアクティブな class を付与するのに困った」件は、以前 Qiita へ投稿した以下内容になります。

[jade でアクティブページの html 要素に class 等を付与する](http://qiita.com/shima_x_o/items/bd6d3896c7cb1a127caa)

こちらについてを Mixin 使えばなんとかなるんじゃねとフィードバックいただいたのでちょっとアップデートしてみます。

----

ファイル構成

```
├── gulpfile.js
├── meta.json
├── dist
│     └── index.html
└── src
      └── jade
            ├── include
            │      └── _inc_gnavi.jade
            └── index.jade

```

サイトの meta 情報を JSON で管理するので、 `gulp-data` を使ってます。

```gulpfile.js
var gulp = require('gulp');
var jade = require('gulp-jade');
var data = require('gulp-data');

gulp.task('jade', function(){
    return gulp.src('./src/jade/*.jade')
        .pipe(data(function(file){
            return require('./meta.json');
        }))
        .pipe(jade({
            pretty: true
        }))
        .pipe(gulp.dest('./dist/'));
});
```

```meta.json
{
  "one": {
    "title": "1 だよ",
    "directory": "/one"
  },
  "two": {
    "title": "2 だよ",
    "directory": "/two"
  },
  "three": {
    "title": "3 だよ",
    "directory": "/three"
  }
}
```

```_inc_nav.jade
mixin list(id, ...items)
  ul(class=id)
    each item in items
      if (item.pageName == pageName)
        li
          a.is_active(href="#{item.directory}")= item.pageName
      else
        li
          a(href="#{item.directory}")= item.pageName

+list(
  'gnav',
  {pageName: one.title, directory: one.directory},
  {pageName: two.title, directory: two.directory},
  {pageName: three.title, directory: three.directory}
)
```

```index.jade
//- one || two || three
- pageName = one.title;
include ./include/_inc_nav.jade
```

ファイルできたらコマンド叩く

```bash
$ gulp jade
```

こうなる。

```index.html
<ul class="gnav">
  <li><a href="/one" class="is_active">1 だよ</a></li>
  <li><a href="/two">2 だよ</a></li>
  <li><a href="/three">3 だよ</a></li>
</ul>
```

----

Mixin 使えば以前に比べコードが短くなりましたが、もはや自分の理想はなんなのかわかりません。
Express 使えばいいと思う。

以上です。
SourceTreeで、GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する

##概要
xtetsujiさんの[GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する](http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873)をSourceTreeで操作してみました。
コマンドラインに慣れている方は、xtetsujiさんの投稿を参照した方が幸せになれます。
私のように、SourceTreeバンザイな人は、参考にしてくださいませ。

##フォークしたリポジトリをクローンする
Github上で、リポジトリのフォークを行います。
フォークしたリポジトリのクローンを行うと下記のような画面になります。
今回は、活発なリポジトリが良かったので、electronをフォークしました。
![fork1.png](https://qiita-image-store.s3.amazonaws.com/0/7839/8bc1610f-5820-d9fb-6ea5-12fd32e92910.png)

##リモートリポジトリとして、オリジナルのリポジトリを upstream という名前で設定する
Gitは複数のリモートリポジトリが持てるので、オリジナル側のリポジトリをupstreamという名前で登録します。
![fork4.png](https://qiita-image-store.s3.amazonaws.com/0/7839/43e6b4c8-2fe1-c848-deea-dbbcfda02f1f.png)
登録を行うとリモートに、upstreamが並びます。
![fork5.png](https://qiita-image-store.s3.amazonaws.com/0/7839/8f655b07-c322-2670-926d-6a8db33ed603.png)

##本家リポジトリの変更を取り出すためにフェッチを行う
upstreamをフェッチします。
フェッチとは、リモートからローカルへ情報を取得する処理のことで、情報を取得してマージまで行う処理をプルと呼びます。
![fork6.png](https://qiita-image-store.s3.amazonaws.com/0/7839/8f8713c8-a477-5e1d-9c8a-6323364e0dcd.png)
フェッチは、ローカルファイルの状態を変化させないので、慎重になる必要はありません。
フェッチが成功すると下記のように、upstreamのコミットが先に進んでいるのが確認できると思います。
（フォークからクローンを行う時間が短いと変化しないかも知れません。少し時間を置いてからフェッチを再実行してみてください）
![fork7.png](https://qiita-image-store.s3.amazonaws.com/0/7839/1d865b88-cdb5-e45c-bd6b-c86e9097070f.png)

##本家リポジトリの変更をmasterへマージする
先行しているupstreamのコミットを選択して、masterへマージを行います。
これで、最新のコミットをフォークしたリポジトリへ取得することができました。
![fork8.png](https://qiita-image-store.s3.amazonaws.com/0/7839/3635081d-cc72-b7d4-aa9a-20bf8f455f1c.png)

以上です。
【Ruby】 gem Nokogiri を使ったスクレイピングのやり方

Nokogiri便利ですね。
今回は某コンビニののホームページから店舗名と住所をcsvに書き出す処理を行いたいと思います。
今回は基本的な使い方だと思います。

## gem 「Nokogiri」のインストール
`gem install nokogiri`

## まずは正しく読み込めるか確認

```test.rb
require 'open-uri'
require 'nokogiri'

url = "http://store.lawson.co.jp/store/243168/" # 対象店舗のURL
doc = Nokogiri::HTML(open(url)) # urlの読み込み

p doc.css('h3#pr_store').inner_text # 店舗名の出力
p doc.css('td#pr_address').inner_text # 住所の出力

```

無事にサンプルに選んだ店舗名と住所が出力されました。
cssセレクタやXPath（今回は未使用ですが）については下記ページが参考になりました。
[Nokogiri の基本(翻訳版)](http://www.engineyard.co.jp/blog/2012/getting-started-with-nokogiri/)

## csvへの書き込み

```test2.rb
require 'open-uri'
require 'nokogiri'
require 'csv'

CSV.open("list.csv", "w") do |csv|
  url = "http://store.lawson.co.jp/store/243168/" # 対象店舗のURL
  doc = Nokogiri::HTML(open(url)) # urlの読み込み

  p doc.css('h3#pr_store').inner_text # 店舗名の出力
  p doc.css('td#pr_address').inner_text # 住所の出力
  csv << [shop, address] # csvへの書き込み
end
```

サンプルに選んだ店舗名と住所がcsvファイルに書き込みされることが確認できました。
最後に、全店舗をcsvに書き出す方法も考えてみたいと思います。


## 全店舗をcsvに出力

 **[重要]コメントで数点ご指摘を頂いているので、必ずご確認ください**
 **[重要]特にsleep処理が行われていないので、下記のままコードを使用しないでください**

URLの最後の6桁がそれぞれの店舗ページへのパスになっています。
ただし、000000から999999までの全てにリンクがあるわけではなく、404ページも存在するため、繰り返しに加えて例外処理も記載します。

```scraping.rb
require 'open-uri'
require 'nokogiri'
require 'csv'

CSV.open("list.csv", "w") do |csv|
  for path in 000000..999999 do # 繰り返し処理
    url = "http://store.lawson.co.jp/store/#{path}/" 
    # 例外処理
    begin
      html = Nokogiri::HTML(open(url))
    rescue
      next
    end
    
    shop =  html.css('h3#pr_store').inner_text
    address = html.css('td#pr_address').inner_text
    csv << [shop, address]
  end
end
```

これで、全店舗の店舗名と住所がcsvに出力されました。

**[追記]下記の方が望ましい処理だと思われます**

```rb
require 'open-uri'
require 'nokogiri'
require 'csv'

CSV.open("list.csv", "w") do |csv|
  for path in 100000..150000 do 
    url = "http://store.lawson.co.jp/store/#{path}/"
    begin
      _html = open(url)
    rescue OpenURI::HTTPError
      sleep 1
      next
    end
    doc = Nokogiri::HTML(_html)

    shop =  doc.css('h3#pr_store').inner_text
    address = doc.css('td#pr_address').inner_text
    csv << [shop, address]
    sleep 1
  end
end
```

## おわりに
例外処理の部分で、多分もっと高速な書き方があるはず。
今回は妥協します。
PublicとInternalのELBでどの程度レスポンスが違うのか気になったので見てみた


ふと気になったので調べてみただけの話。あまり参考になる内容ではないかもしれないがメモとして。

# ELBは2種類
## Public
昔からあるやつ。インターネットからトラフィックを受け取ってVPC内のサーバーに割り振る。
## Internal
VPC内に置ける内部割り振り用のELB。VPC内にあるので外に漏らしたくない通信や、中で完結出来る物はこちらを使うと良い。

# Internal ELBはやはり速度も速いのか？
## 環境
- ec2 instanceにnginxを立てる。publicに静的fileを一つだけ置いておいてそれを返すようにする。
- publicなELBを立てて、作ったec2を紐づける。
- internalなELBを立てて、作ったec2を紐づける。
- 同じVPC内のec2上からパフォーマンスを計る。

コマンドはこんな感じ。

```
$ for i in $(seq 1 20); do curl -kL 'http://test.local/test.html' -o /dev/null -w "%{time_total}" 2> /dev/null; echo ""; sleep 0.5; done;
```

# そこまで大きな差はなかった
## internalの結果
誰がどう見ても安定している。どう見ても平均は約0.08。

```
$ for i in $(seq 1 20); do curl -kL 'http://test.local/test.html' -o /dev/null -w "%{time_total}" 2> /dev/null; echo ""; sleep 0.5; done;
0.008
0.008
0.008
0.008
0.010
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
0.008
```

## Publicの結果

平均は、0.010。そんなにばらつきも無い。
差は、0.002秒。人間が分かる差ではない。

```
$ for i in $(seq 1 20); do curl -kL 'http://test.co.jp/test.html' -o /dev/null -w "%{time_total}" 2> /dev/null; echo ""; sleep 0.5; done;
0.017
0.012
0.008
0.011
0.008
0.010
0.008
0.012
0.008
0.011
0.008
0.012
0.009
0.011
0.008
0.011
0.009
0.010
0.008
0.010
```

# まとめ
一度インターネットを経由するといっても地理的に同じところにまたアクセスするので予想以上に差がなかった。
まあパフォーマンス以前に内部で閉じる事が可能なトラフィックは内部で閉じるというのは鉄則ですね。
Grafana で CloudWatch のメトリクスを表示

# 概要
Grafana 2.6.0 がリリースされたので最近追加された以下のダッシュボードを設定する

- CloudWatch DataSource (2.5から)


#AWS credential
Grafana が動作しているサーバに AWS credential ファイルを作成

```:~/.aws/credential
[default]
aws_access_key_id = AKXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = ap-northeast-1
```
Grafana を rpm でインストールしている場合は、/usr/share/grafana/.aws に credential ファイルを作成

**複数アカウントある場合**

```:~/.aws/credential
[dev]
aws_access_key_id = AKXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = ap-northeast-1

[prod]
aws_access_key_id = AKXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
region = ap-southeast-1
```

#CloudWatch DataSource 追加
Data Sources メニューより、
[Add new] クリック → [Type] で CloudWatch 選択 → [Name] に任意の名前入力 → [Default Region] リージョン選択 → [Add]
[Test Connection] をクリックして Success になれば完了
![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/f6e15bf4-7ac9-acfb-f3f9-65d1ab0cd887.png)

複数のアカウントがある場合は、[Credentials profile name]を入力
(上記の例だと dev, prod とか)


#グラフ作成
DataSouce より cloudwatch を選択してグラフを作成する

![02png.png](https://qiita-image-store.s3.amazonaws.com/0/105824/8b143d8f-6c71-294a-b7de-81aafbdb23be.png)


設定からグラフを作成するまでは以上

※注意点
無料枠を超えたAPIリクエストは、以下の料金が発生するため注意

Amazon CloudWatch API リクエスト
GetMetricStatistics、ListMetrics、または PutMetricData のリクエスト 1,000件あたり $0.01
Electronを導入してみる

ElectronはNode.jsを使用したJavascriptでデスクトップアプリケーションを作成するフレームワークです
※Node.jsが入っている事が前提

# 事前準備

npm初期化

```bash:
npm init
```

## インストール
Electron本体

```bash:
npm install electron-prebuilt --save-dev
```

リリース用アプリケーションを出力するためのpackager

```bash:
npm install electron-packager --save-dev
```

今回は--save-devとともに-gでグローバルにもインストールしました

# Hello World

## package.json

```json:package.json
{
  "name": "FirstApp",
  "version": "0.0.1",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron-packager": "^5.2.0",
    "electron-prebuilt": "^0.36.0"
  }
}

```

## index.js
エントリポイントとなるjsファイル

```javascript:index.js
// アプリケーション作成用モジュールをロード
var app = require('app');
var BrowserWindow = require('browser-window');

// クラッシュレポート
require('crash-reporter').start();

var mainWindow = null;

// 全てのウィンドウが閉じた時のハンドラ
app.on('window-all-closed', function() {
  // アプリケーションを終了
  app.quit();
});

// アプリケーションの初期化ハンドラ
app.on('ready', function() {
  // メインウィンドウの背臭い
  mainWindow = new BrowserWindow({
    width: 1000,
    height: 600
  });
  // メインウィンドウに表示するURLを指定
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
  // メインウィンドウ終了ハンドラ
  mainWindow.on('closed', function() {
    // 参照を破棄
    mainWindow = null;
  });
});
```

## index.html
index.jsで指定した最初に表示するhtmlファイル

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="description" content="">
  <meta name="keywords" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <link rel="stylesheet" href="style.css">
  <title>HelloElectron</title>
</head>
<body ng-app="app" ng-controller="RootCtrl as root">
<h1>HelloElectron</h1>
</body>
</html>
```

# 実行
起動します

```bash:
electron index.js
```
electron indexとかでも起動できます

## リリース
HelloElectronという名前のアプリケーションをリリースしてみます
今回はwindowsとos x向けの64ビットアプリケーションをリリースします


```bash:
electron-packager ./ HelloElectron --platform=darwin,win32 --arch=x64 --version=0.29.2 --overwrite
```
Backbone.js(Marionette.js) + stickit で自分自身の要素をバインディングしたい時

`stickit`は、Backbone.jsで相互バインディングをしたい時に便利なライブラリですが、サンプルを見ると、`bindings:` に子要素のセレクタを指定する例ばかりで、自分自身をセレクタとして指定したい場合にどうしたらいいのか分からずハマりました。

結論としては、セレクタに `':el'` と指定するだけです。
[公式ドキュメント](http://nytimes.github.io/backbone.stickit/#el-selector) をよーく見たら書いてありました… orz


```js:sample.js
var itemView = Marionette.ItemView.extend({
  tagName: 'textarea',
  id: 'test1',
  template: _.template("<%= text %>"),

  bindings: {
    ':el': 'text'
  },

  onRender: function() {
    this.stickit();
  }
});
```
Pythonまとめ

# pip
pipはPythonのパッケージ管理を行うコマンド

## インストール
```bash
curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```

## pip自体をアップデート
```bash
$ pip install --upgrade pip
```

## パッケージの検索
```bash
$ pip search パッケージ名
```

# ライブラリ

## json
https://docs.python.org/2/library/json.html

```py
import json

FILEIN = 'sample_in.json'

f = open(FILEIN, 'r')
data = json.load(f)
f.close()
```
MySQL | 英数字以外とアンダーバー 以外をデータベース名 / テーブル名に使う時はバッククォートで囲う

# データベースが作れない

たとえばハイフン入りの名前でデータベースを作りたい。
でもこう書いても。

```sql
mysql> CREATE DATABASE e-x-a-m-p-l-e;
```

ダメだ。

```sql
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to
 use near '-x-a-m-p-l-e' at line 1
```

MySQL は親切なエラーなんか出してくれやしない。

# 英数字とアンダーバー

***「英数字」と「アンダーバー」以外*** の文字を使うときは、バッククォートで囲うこと。

```sql
mysql> CREATE DATABASE `e-x-a-m-p-l-e`;
```

```sql
Query OK, 1 row affected (0.01 sec)
```

他にも。だいたいバッククォートで囲えばうまくやってくれる。

```sql
CREATE DATABASE `e x a m p l e`;
CREATE DATABASE `e/x/a/m/p/l/e`;
CREATE DATABASE `e*x*a*m*p*l*e`;
CREATE DATABASE `えぐざんぷる`;
```

# 例外

最初か最後にスペースが入っている場合は、不正な名前だとみなされ。
バッククォートで囲っても無理だった。

```sql
CREATE DATABASE ` e x a m p l e `;
```

```sql
ERROR 1102 (42000): Incorrect database name ' e x a m p l e '
```



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Heroku で Capybara - Poltergeist を使う時に注意すること

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2170">元の記事はコチラ</a>
- - - - - - - - - - - 
Heroku で Capybara と Poltergeist を使う時につまずいたのでメモ。

<!-- extract -->

原因は PhantomJS がないから。
ローカルではインストールして動いているけど、はて、herokuではどうするのかなと。
何もしないと下のようなエラーが出ます。

```
Cliver::Dependency::NotFound: Could not find an executable ["phantomjs"] on your path.
```


###実装

まずはこのコマンド。

```
$ heroku buildpack:set https://github.com/ddollar/heroku-buildpack-multi.git
```

　　
ルートに ```.buildpacks``` を作ろう。

```
$ touch .buildpacks
```

　　
その中身はこう。
.buildpacks

```
https://github.com/heroku/heroku-buildpack-ruby
https://github.com/stomita/heroku-buildpack-phantomjs
```

　　
~~herokuに環境変数を追加。~~
コメントで教えてもらいました。今はいらないらしい。
[Ruby - Herokuのapp作成手順（buildpack-multiを使う場合も含む） - Qiita](http://qiita.com/riocampos/items/a372294bdcaed8b02711#heroku%E3%81%AE%E7%92%B0%E5%A2%83%E9%96%A2%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A)

```
$ heroku config:set PATH="/usr/local/bin:/usr/bin:/bin:/app/vendor/phantomjs/bin"
$ heroku config:set LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/lib:/app/vendor/phantomjs/lib
```

　　
これで完了かなと思ってたら、Procfileがいるようで。
せっかくなので WEBrick 使ってたけど Puma にしました。

　　
Gemfile 

```ruby
group :production do
  gem 'puma'
end
```

　　
Procfile （ルートに設置）

```
web: bundle exec puma -C config/puma.rb
```

　　
config/puma.rb

```ruby
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 5)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end
```

　　
でOK！と思ってたら、まだだめ。
なぜかHerokuでエラー。ログはこんな感じ。

```
at=error code=H14 desc="No web processes running"
```

Dynoが一つも稼働してない模様。
試しにこうやって 0 Dyno増やしてみた。

```
$ heroku ps:scale web+0
Scaling dynos... done, now running web at 0:Free.
```

やっぱり 0 やん。
```heroku ps:scale web+1``` で良いのかなと思ったけど
念のため Heroku のダッシュボードでも確認して、そちらで起動しました。

以上！


###参考
[Heroku, Ruby on Rails and PhantomJS](https://gist.github.com/edelpero/9257311)

[Add explanation on README.md, that just setting buildpack on config is not enough · Issue #51 · ddollar/heroku-buildpack-multi](https://github.com/ddollar/heroku-buildpack-multi/issues/51)

[Deploying Rails Applications with the Puma Web Server | Heroku Dev Center](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server)

[Buildpacks | Heroku Dev Center](https://devcenter.heroku.com/articles/buildpacks)

[node.js - Heroku Error H14 (No web processes running) - Stack Overflow](http://stackoverflow.com/questions/9970151/heroku-error-h14-no-web-processes-running)

　　


 → <a href="http://workabroad.jp/posts/2170">http://workabroad.jp/posts/2170</a>
git rebaseでのブランチ融合でコンフリクト解消

# 問題

git rebaseでブランチを融合しようとしたらエラーが出てしまう。。

```
$ git branch
  master
* branch

$ git rebase master

First, rewinding head to replay your work on top of it...
Applying: Hoge hoge
Using index info to reconstruct a base tree...
/省略/
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/articles/hoge
CONFLICT (content): Merge conflict in app/views/hoge
Auto-merging app/views/articles/poge
CONFLICT (content): Merge conflict in app/views/articles/poge
Failed to merge in the changes.
Patch failed at 0001 Poge poge
The copy of the patch that failed is found in:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
```

こんな感じのエラーでとにかくコンフリクト。

# 解決

```
$ git branch
* (no branch, rebasing sns_button)
master
branch
```

変なとこいるけど大丈夫。

```
$ git status

rebase in progress; onto 1234567
You are currently rebasing branch 'branch' on '1234567'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   app/views/page
Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

	both modified:   app/views/hoge
	both modified:   app/views/poge
```

コンフリクト箇所を修正してaddする。そうすると、

```
$ git status

rebase in progress; onto 1234567
You are currently rebasing branch 'branch' on '1234567'.
  (all conflicts fixed: run "git rebase --continue")

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   app/views/page
	modified:   app/views/hoge
	modified:   app/views/poge
```

ここで、rebaseを再開。

```
$ git rebase --continue
```

OK!

以下の感じに確認してみてください！

```
$ git status

On branch branch
nothing to commit, working directory clean

$ git log --oneline -10
```
gitで特定フォルダ内の差分ファイル名の取得



```
var exec = require('exec');

exec('cd folderName', function(){
	exec('git diff --name-only', function(err, stdout, stderr){
		if(err) throw err;
		console.log(stdout);
});
```
これではうまくいかなかったので調べてみたところ。
*Each command is executed in a separate shell, so the first cd only affects that shell process which then terminates.*
ということで、どうやら異なるシェルとして動いているためうまくいかないようです。

<br>

```
var exec = require('exec');

exec('git diff --name-only', {cwd: './folderName'}, function(err, stdout, stderr){
	if(err) throw err;
	console.log(stdout);
});
```
このように書くとうまくいきました。
ELB ProxyProtocolの設定方法。

ELBでTCPの負荷分散をしていて、後ろにあるInstanceで接続元IPを知りたい時に設定する。



■プロキシプロトコル型のポリシー作成::

 aws elb create-load-balancer-policy --load-balancer-name TEST_ELB --policy-name TEST-PROXYPROTOCOL-POLICY --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true
 aws elb create-load-balancer-policy --load-balancer-name {{ELB NAME}} --policy-name {{POLICY NAME}}       --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true

■ポリシーを追加設定する。
指定するポートはELB-バックエンドInstance間の通信に利用するポート番号。
aws elb set-load-balancer-policies-for-backend-server --load-balancer-name TEST_ELB    --instance-port 443            --policy-names TEST-PROXYPROTOCOL-POLICY
aws elb set-load-balancer-policies-for-backend-server --load-balancer-name {{ELB NAME}} --instance-port {{対象ポート}} --policy-names {{POLICY NAME}}

■ポリシーを削除する。
aws elb set-load-balancer-policies-for-backend-server --load-balancer-name TEST_ELB    --instance-port 443            --policy-names
aws elb set-load-balancer-policies-for-backend-server --load-balancer-name TEST_ELB    --instance-port {{対象ポート}} --policy-names {{残したいポリシーは書く}}

■確認
aws elb describe-load-balancers --load-balancer-name TEST_ELB
aws elb describe-load-balancers --load-balancer-name {{ELB NAME}}

aws elb describe-load-balancer-policies --load-balancer-name TEST_ELB
aws elb describe-load-balancer-policies --load-balancer-name {{ELB NAME}}
RubyでK-means法でクラスタ分析してみた

# RubyでK-means法でクラスタ分析してみた

## K-means法とは

下記のサイトが分かりやすくアルゴリズムを解説しています。

http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/


## コード

```
require 'set'

# クラスタをランダムに割り振る
def random_clusterize data, cluster_num
  data_num = data.size
  clusters = []
  cluster_num.times do |i|
    _start = (i*data_num/cluster_num).to_i
    _end = (i!=cluster_num-1) ? ((i+1)*data_num/cluster_num).to_i : data_num
    clusters[i] = data[_start..._end]
  end

  clusters
end

# クラスタの中心座標を取得
def get_center_point cluster
  result = [0.0, 0.0]
  cluster_size = cluster.size.to_f
  cluster.each do |point|
    result[0] += point[0]
    result[1] += point[1]
  end
  result[0] /= cluster_size
  result[1] /= cluster_size

  result
end

# 点の距離を取得
def distance point1, point2
  (point1[0]-point2[0])**2 + (point1[1]-point2[1])**2
end

# dataをcluster_numにクラスタライズ
def clusterize data, cluster_num
  center_points = []

  # ランダムに分割
  data.shuffle!
  clusters = random_clusterize data, cluster_num

  # 仮中心を作る
  clusters.each_with_index do |cluster,i|
    center_points[i] = get_center_point cluster
  end

  # 終わるまでループ
  while(true) do
    tmp_clusters = []
    cluster_num.times do |cluster_index|
      tmp_clusters[cluster_index] = []
    end
    data.each do |datum|
      tmp_min_distances = Float::INFINITY
      minimum_index = 0
      center_points.each_with_index do |center_point, center_point_index|
        # 重心との距離を計算
        dist = distance(center_point, datum)
        if distance(center_point, datum) < tmp_min_distances
          tmp_min_distances = dist
          minimum_index = center_point_index
        end
      end
      # 近い重心を判断
      tmp_clusters[minimum_index] << datum
    end

    # 仮中心を決定
    cluster_num.times do |index|
      center_points[index] = get_center_point tmp_clusters[index]
    end

    # クラスタの決定
    if tmp_clusters.to_set == clusters.to_set
      break
    end

    clusters = tmp_clusters
  end

  # クラスタを返却
  clusters
end

```

##  使い方

```
require 'csv'

# さっきのコード...

# 3つのクラスタに分類
cluster_num = 3

# 元データを読み込む
data = CSV.read("test.csv").map do |datum|
  [datum[0].to_f, datum[1].to_f]
end

# クラスタリング
clusters = clusterize data, cluster_num

# クラスタ後のデータごとにcsvとして吐き出す
cluster_num.times do |i|
  CSV.open("myfile#{i}.csv", "w") do |csv|
    clusters[i].each do |row|
      csv << row
    end
  end
end
```

## 動かしてみた

元データを以下のようにある程度クラスタが見える程度に配置して作ってみました。

![元データ群](https://qiita-image-store.s3.amazonaws.com/0/28990/2d524059-c595-3a0e-61f7-8462870f589a.png)


* * *

これをCSVデータとして、さっきのコードに読み込ませてクラスタ毎に色分けして出力しました。

![クラスタリング後のデータ群](https://qiita-image-store.s3.amazonaws.com/0/28990/9e327ff0-cd00-2fae-74dd-be5ed8fd0618.png)

* * *

ちゃんとクラスタに分かれてることが分かります！！

## まとめ

今回は2次元にしましたが、ちょっと変えれば、n次元のクラスタ分析もできます！

何か、大きいデータを分類しなきゃいけないなどがあれば、是非、お試しください。
R Markdownの番号リストについて

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R Markdownの番号リスト(基礎編)
R Markdownでも当然番号リストが使えます。Markdownの通常の記法で表現できます:

```
1. hoge
2. hige
3. huge
```

なお、開始番号を変更すると、その開始番号からとなります:

```
5. hoge
6. hige
7. fuge
```

この場合、5からスタートします。なお、以下のようにした場合も5,6,7となります:

```
5. hoge
2. hige →6番になる
3. huge →7番になる
```

## 番号リストの数字を自動で割り当てさせる
Pandocには`Numbered example lists`という拡張機能[^1]があり、これを使うといちいち自分で番号を入力しなくてもOKとなります:

[^1]: 詳しくは[こちら](http://rmarkdown.rstudio.com/authoring_pandoc_markdown.html#lists)を参照してください。

```
(@) hoge
(@) hige
(@) huge
```

この場合、自動的に1,2,3と番号が振られるようになります。つまり`@`が特別なマーカーとなって機能するのです。なおこれはそのドキュメント通しで持続します。

また、この`@`の後ろに文字列をつければ識別子として機能し、以下のようなこともできます:

```
(@hege) これはhegeです。

さて、さきほどの(@hege)ですが...
```

このようにすると、「自動で番号が振られる」+「識別子によってその番号を持ってこれる」ようになります。便利ですね[^2]。ぜひ実際にやってみて出力を確認してみてください。

[^2]: 要するに引用文献リストのように使えますが、Referenceは別途機能としてあります。詳しいところは[Bibliographies and Citations](http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html)をご覧ください。

Enjoy!
mysqlの出力結果をファイル出力する

## ポエム

フルスタックエンジニア的には、リモートサーバのプライベートネットワーク内のDBを触ることが多いだとか、黒い画面が好きだとか、諸々の理由によりMySQLクライアントとして素のmysqlコマンドを使用することが多いかと思います。
mysqlコマンドは、まあ、死ぬほど使いやすいとは言い難いのですが \\# などでカラム名等がキャッシュされTAB補完さえできれば、比較的困ることはないです。
但しクエリの実行結果を保存する方法について、知見があまり共有されていないようなので以下に書きます。

先ず、クエリの実行結果を保存する方法としてよく検索に引っかかるのは[SELECT文のINTO OUTFILE句を使用したもの](http://d.hatena.ne.jp/fukumura/20110223/1298460946)と思います。
但しこの手法には大きな問題があり、*保存先がMySQLサーバが動作しているマシンのローカルディレクトリ*になります。

これはこれで良いのですが、WebサーバとDBサーバが別マシンというよくある構成の場合は、出力したファイルを取得するために、DBサーバに潜る必要があります。最悪の場合は出力できてもDBサーバの中身が見れないためファイルが取得できません。

クライアントローカルに保存するには以下のコマンドを使用します。

## \T [filename]

`tee [filename]`でも同じ動作になります。
このコマンドを実行したあと、*全ての入出力*が指定したファイルに出力されます。出力をやめるには `\t` を実行します。

またteeとは若干趣が異なりますが、下記コマンドを応用することでも出力可能です。

## \P [command]

`pager [command]`と同義となります。
このコマンドを実行したあと、mysqlはクエリの実行結果を指定したコマンドを利用して出力します。
通常はlessやlvを指定するものと思います。
機能をオフにする際は、コマンドを指定せず単に `\P` とします。

このmysqlコマンドは、指定した（lessなどの）コマンドを起動し、そこにクエリの実行結果を標準入力として渡すものです。

このため、例えば`\P tee out.txt`とすることで、出力がout.txtに出力されます（クエリのたびにファイルが上書きされるので注意が必要です）。

`\P vim -`で出力結果を編集できたりします。

[パイプも使用可能](http://b.l0g.jp/mysql/mysql-commands-on-cli/)だそうです。ということで、CSV形式に出力するには以下の様な感じになります。

```shell-session
ysql> \P sed -e "1,3d" | sed -e "s/|/,/g" | sed -e '/^+/d' | sed -e 's/^,//' -e 's/,$//'
PAGER set to 'sed -e "1,3d" | sed -e "s/|/,/g" | sed -e '/^+/d' | sed -e 's/^,//' -e 's/,$//''
mysql> select * from status;
  1 , 未処理          ,    0
  2 , 出荷待ち        ,    1
  3 , 出荷手配中      ,    2
  4 , 出荷済み        ,    3
  5 , 配送済み        ,    4
  6 , 保留            ,    5
6 rows in set (0.00 sec)
```

こっちのほうがいいのでは。GNU sedは;でコマンドを区切れるのだが、mysqlのREPLがパースしてしまうので使えない様子。

```
\P sed -e '1d' -e '3d' -e '$d' -e 's/ *| */,/g' -e 's/,//' -e 's/NULL//g' | tee なんか適当なファイル名.csv | less
```
[システム間連携]接続方向を逆転させるとうまくいく

システムAの更新内容を、別のサーバにあるシステムBにも反映させるためにデータ送る、というケースを考えます。


主流はWeb APIかMOMを使う方法かと思います。(俯瞰的な話は、20日目のこざけさんが書いてくれる、はず)
しかし、A,B間で同時に一貫性を保たなくても良いケースは、企業間システム連携ではよくあります。

[CAP定理](https://ja.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86)でいうところの可用性＋分断耐性をとりにいくパターンです。が、最大数秒程度で[結果整合性](https://ja.wikipedia.org/wiki/%E7%B5%90%E6%9E%9C%E6%95%B4%E5%90%88%E6%80%A7)は保ちにいきます。

## システム間の接続

非同期ながら、ほぼリアルタイムでデータを反映していくので、応答性の高い接続手段が求められます。だが中間経路をHTTPでないプロトコルを通すハードルが高かったり、ファイヤーウォールなどで長時間接続を切られたりする問題があるので、私はよくWebSocketを使います。

だいたいの構成は以下のようになります。同期エージェント間をWebSocketでつなぎ、データの転送を行います。A→B間の接続がWebSocketです。

全体の構成は下記図のようになります。システムAでデータ変更があったら、変更差分テーブルにも同時に変更内容を書き込みます。これが成功したら、同期エージェントに通知し、未処理の変更データを抽出しシステムBに送信する。という仕組みです。システムBで正常に反映ができたら、変更差分の該当レコードを送信済みにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/f7d4096c-475d-6f4b-e943-90c8c926fe85.png)

サーバBからのレスポンスが戻ってこない場合、再送をします。更新処理に冪等性があるのは稀なので、すでに処理済みであれば対象のトランザクションをスキップするように設計します。
このため、転送データ内で一意になるようにトランザクションIDをふり、BのテーブルにもトランザクションIDを格納しておくようにします。

さてこの設計で考慮すべきは、システムBがダウンしていた場合、復旧し次第再送しますが、その責任をAが負っているところです。これはシステムAとシステムBのオーナーの力関係によっては、もめることがあります。

### サーバ間のWebSocket実装(Java)

WebSocketの標準仕様JSR-356はクライアントも用意されていて、サーバ間のWebSocket実装は非常に簡単になっています。

```java:サーバ側
@ServerEndpoint("/")
public class WebsocketProvider {
    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig) {
        logger.debug("Client " + session + " open");
    }

    @OnMessage
    public void onBinaryMessage(ByteBuffer msg, Session session) {
        logger.debug("ReceiveMessage: " + msg);
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.debug("Client " + session + " closed for" + closeReason);
    }

}
```

いくつか実装の方法はありますが、サーバ側と同じようにイベントハンドラ的に実装します。

```java:クライアント側
@ClientEndpoint
public class WebSocketEndpoint extends Endpoint {
    @OnOpen
    public void onOpen(Session session, EndpointConfig config) {
        this.session = session;
        session.addMessageHandler(new MessageHandler.Whole<ByteBuffer>() {
            @Override
            public void onMessage(ByteBuffer buf) {
            }
        });
    }
}
```

EEサーバでなくてもUndertow, Jetty, Tomcatの上で実行可能です。

## 接続方向の逆転 :sparkles: :sparkles: :sparkles: 

前述の問題を解消するには、接続の方向を逆転させることです。AからBへ送るのではなくて、BからAへ変更データを取りに行くという方式です。

変更データに順序保証されたシーケンシャルな番号をふっておき、Bは何番まで処理できたかを管理しておきます。そしてBからAに、「○番以降の変更データをくれ」とリクエストします。ここでWebSocketが役に立って、変更がなければBの要求を待たせておいて、変更があった瞬間にAからBに送ることができるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/3f6ba0fa-d14d-191d-0994-a5ec3d7482fc.png)

大きなメリットは、データを転送する際のトランザクションがシステムBだけに閉じられていることです。データ転送エラーになっても、A側は何もすることはなく、B側から再度とりにいくだけです。

### Clojureでの実装

[ulon-colonというプロダクト](https://github.com/kawasima/ulon-colon)で、逆向きWebSocket転送を実装しています。

[![image](https://qiita-image-store.s3.amazonaws.com/0/8475/a30963c5-83fb-51ae-05f1-75dba7b6780b.png)](http://www.slideshare.net/kawasima/excel-40109001)

## まとめ

設計がいまいち複雑になってしまうなー、というときは発想を逆転させるとうまくいく…かもしれません。
Swiftで条件繋げすぎるとXcodeがエラー吐く

```swift
var nullable0: String?
var nullable1: String?
var nullable2: String?
var nullable3: String?
var nullable4: String?
var nullable5: String?
var nullable6: String?

guard nullable0 == nil &&
    nullable1 == nil &&
    nullable2 == nil &&
    nullable3 == nil &&
    nullable4 == nil &&
    nullable5 == nil &&
    nullable6 == nil && else {
        return false
}
return true
```

（SonarQubeで「条件はなるべくまとめろ」的なチェックもありこういうコードになったのだと思います）
条件を7つ以上繋げると、
`Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions`
というエラーが出るようです。

直し方は各々好きなように（笑）して頂ければ良いのですが、今回は下記のように修正してみました。

```swift
var nullable0: String?
var nullable1: String?
var nullable2: String?
var nullable3: String?
var nullable4: String?
var nullable5: String?
var nullable6: String?

// 全てnilの場合のみtrue
let requiredStrings = [
    nullable0,
    nullable1,
    nullable2,
    nullable3,
    nullable4,
    nullable5,
    nullable6,
]
guard let _ = requiredStrings.indexOf({ $0 != nil }) else {
    return true
}
return false
```
Magento2@Githubの動向（11月17日〜12月17日）

＠[Magento Cafe Plus 東京](https://magento-cafe-plus.doorkeeper.jp/)

# 直近一ヶ月のdevdocs＠Github動向

- 最後のアップデート：2015-12-16 18:09:15 UTC
- 26PR (21Merged)
- 25 authors
- 271 commits
- 375 files have changed
- 19 issues(12closed + 7open)

__フルタイムコミッターのお二人__
[Steve Johnson（Magento Inc.）](https://github.com/xcomSteveJohnson)
[almarchenko](https://github.com/almarchenko)

__issues 観測__

- [現在のレスポンシブは崩れるけれど、スマホ対応版を用意しているらしい（27日前）](https://github.com/magento/devdocs/issues/360)
- 公式内部で利用しているGitHub Enterpriseはebay（27日前）
- ttps://github.corp.ebay.com/magento2/magento2ce/

# 直近一ヶ月：M2@Github動向
- 最新リリースは2.0.0のまま。
- 36 PR(3Merged)
- 52 authors
- 286 commits
- 1295 files have changed
- 381 issues（193closed + 188open）

2.0.0のリリース後もリリース直前ほどではないがゴリゴリ開発を進めている。
コミット内容を追うと、コアもまだ結構いじっている状態。
2.0.1辺りで一段落させてくるものが多そう
Rails 4.2.4でMountable Engineの設定

## 環境
- Ruby 2.2.3
- Rails 4.2.4

Rails4.2.4で、Mountable Engineを使おうとして設定している際に、
サブドメインの設定ではまったので、設定手順とあわせて、はまったポイントをメモ。


## Mountable Engineを作成
```
$ rails plugin new myenginename --mountable
```

上記コマンドを実行すると、app/の下に、myenginenameというディレクトリが作成され、
その中身は、Railsとほぼ同じ構成になっている。
Railsの中にさらにRailsがインストールされた感じ。


## Gemfileに追記
次に、親アプリケーションのGemfileに下記の記述をし、
親アプリケーションから呼び出せるようにする。

```lang:Gemfile
gem "myenginename", path: "myenginename"
```

## mount設定
次に、親アプリケーションのconfig/routes.rbで、mountの設定。
方法は2通り。

####1, 階層を切る場合
`http://サイトドメイン/myenginename`でアクセスさせる場合は下記の設定。

```lang:config/routes.rb
mount Myenginename::Engine => '/myenginename'
```



####2, サブドメインでアクセス可能にする場合
下記の記述をすると、
mountしたEngineに、サブドメインでアクセスできるようになるらしい。
`ex)http://myenginename.ドメイン/`

```lang:config/routes.rb
mount Myenginename::Engine => '/', constraints { subdomain: 'myenginename' }
```



**しかし！！ この設定をしたら、railsコマンドでエラーが出るようになった！**


例えばrails sをすると

```
$ rails s
(略)
/home/myuser/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:268:in 
	`load': /home/myuser/htdocs/config/routes.rb:64: syntax error, unexpected ':', expecting '}' (SyntaxError)
  mount Myenginename::Engine => '/', constraints { subdomain: 'myenginename' }
```

syntax errorが出る。
なぜだ？[参考記事](http://techlife.cookpad.com/entry/2015/04/06/155940)の手順通りにやったのに。。。


**よくよく見てみると、参考記事に書かれている、config/routes.rbの構文に間違いが・・・**
正しくは下記だった。

```lang:config/routes.rb
mount Myenginename::Engine => '/', constraints: { subdomain: 'myenginename' }
```
「constraints」のうしろにコロンが必要だった。
ただそれだけ(汗)


気を取り直して、設定の続きを。

## gemspecの設定
作成したEngineのディレクトリの直下にある、gemspecファイルの設定をする。

```lang:myenginename/myenginename.gemspec
$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "myenginename/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "myenginename"
  s.version     = myenginename::VERSION
  s.authors     = ["authorname"]
  s.email       = ["メールアドレス"]
  s.homepage    = "サイトのURL"
  s.summary     = "アプリケーションの説明"
  s.description = "アプリケーションの説明"
  s.license     = "MIT"

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  s.add_dependency "rails", "~> 4.2.4"

  s.add_development_dependency "sqlite3"
end
```

これで、基本的な設定は完了。
下記の記事を参考にしました。


[参考]
[新規サービスの管理画面を短期間で見栄え良く実装する](http://techlife.cookpad.com/entry/2015/04/06/155940)

[関連記事]
[Rails4のMountable Engineで、link_toに:method => deleteを指定しても、Getアクセスになってしまう](http://qiita.com/Esfahan/items/202b719154127b69a1f2)
PowerShellでActive Directoryのユーザ名とメールアドレス一覧を取得する

超小ネタ。

ADのユーザ名とメールアドレスを抜いて、全員にメール送ろうとした時に使った。

``Get-ADUser`` は、色んな取得方法ができるので活用。
これに、リダイレクトでファイル出力を付ければファイル化もできて便利。

```ps1
> Get-ADUser -Filter * -SearchBase "OU=hoge,DC=fuga,DC=local" -Property mail | select name, mail
```
NodeJS で AESなどで暗号化する方法メモ


こんな感じのプログラムを実行すると、

```javascript:memo.js
crypto = require("crypto");

plainText = 'abcdefghijklmnopqrstuvwxyz';
passowrd = 'WIdlbs9pDHoLnLo4xEnVKc1DKA0XUFS0';
alg = 'aes256'
encoding = 'base64'  // 'binary' or 'hex'

cipher = crypto.createCipher(alg, passowrd);
cipheredText = cipher.update(plainText, 'utf8', encoding);
cipheredText += cipher.final(encoding);

decipher = crypto.createDecipher(alg, passowrd);
dec = decipher.update(cipheredText, encoding, 'utf8');
dec += decipher.final('utf8');

console.log('crypted: '+ cipheredText);
console.log('decrypted: ' + dec);
```


こんな感じになります。

```
% node memo.js
crypted: 6RM52ZdyXDsi+PtGBTB58L5SlgythPJfVlld2z65YPo=
decrypted: abcdefghijklmnopqrstuvwxyz
```
PHPフレームワークのPHP7対応状況

こんにちは。セカイエの大西です。
この記事は[セカイエ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/sekaie) 16日目の記事です。

## はじめに
12月3日にPHP7がリリースされて、およそ2週間経ちましたね。
弊社システムはPHP5 + CakePHP2系で構築されているのですが、できればPHP7に移行してPHP7の恩恵を受けたいと思ってます。
※パフォーマンスの改善とか！！

そこで、弊社で利用しているCakePHP2系を含め、PHPの各フレームワークがPHP7にアップデートしてそもそも動作するのか、っていうのを簡単に調査してみました。

あくまで、マニュアルのチュートリアルに載っているプログラムを動かしてみた調査内容なので、システムによっては今回の調査結果と違う結果になることもありますので、ご了承ください。

## 調査対象
|framework      |version  |
|:--------------|--------:|
|CakePHP        |2.5.6    |
|CakePHP        |3.0.15   |
|Laravel        |5.1.26   |
|Symfony        |2.8      |
|Symfony        |3.0      |
|CodeIgniter    |3.0.3    |

バージョンの選定に関してはなんとなくで決めました。
時間あれば他のフレームワークも調査してみたいと思います。

## 調査結果
|framework      |version  |result  |
|:--------------|---------|-------:|
|CakePHP        |2.5.6    |NG      |
|CakePHP        |3.0.15   |OK      |
|Laravel        |5.1.26   |OK      |
|Symfony        |2.8      |OK      |
|Symfony        |3.0      |OK      |
|CodeIgniter    |3.0.3    |OK      |

**2016/01/15 追記**
@okinaka さんから情報をいただきました。
CakePHP2.x系は 2.8 から PHP7 対応予定のようです。
リリースされたら試してみます。

## 考察
なんと動作しなかったのはCakePHP2系だけでした。。
理由としては、CakePHP2系には「Stringクラス」が存在するのですが、
PHP7から「型と同じクラス名」を作れないという変更があるので、それに引っかかって例外が発生している状態です。

弊社のシステムがCakePHP2で構築していてPHP7にアップデートすると動作しなかったので、他のフレームワークもほどんど動かへんのちゃう？って思って調査したんですが。。
まさかの結果。CakePHP2のハミゴっぷり┐(´д｀)┌

まあ、後方互換性がしっかりしているPHP7が素晴らしいのでしょう！


## さいごに
パフォーマンスが上がると期待できるので、早くCakeのバージョンを上げるなり、フレームワークを置き換えてPHP7対応にしたいなと、思いながらの調査でした。

この記事は[セカイエ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/sekaie) 16日目の記事でした。
明日は中島さんです。

ほな！
機械学習よくわかってない人がPythonでGBDT使ってみる話

なぜか日本語のGBDTのページが少なかったので書いてみました。
タイトルの通り機械学習よくわかってない人なのでガチ勢からのツッコミには対応できません。ご了承ください。
俺みたいな「機械学習ちょっと知ってるけど高度な話になると何もわからない」人の助けになればいいなと思っています。

## GBDTとは
教師有り機械学習の一つ。Gradient Boosting Decision Treeの略です。SVMみたく教師データをもとにクラスタリングしてくれます。ただ基本二値分類のSVMとは違って他クラス分類ができます。Randomforestなど他の他クラス分類との違いは調査不足です。ごめんなさい。
理論など詳しい話はもっと頭のいい人がまとめてくださっているので省きます。
http://www.housecat442.com/?p=480
http://qiita.com/Quasi-quant2010/items/a30980bd650deff509b4


## とりあえずやってみる
[SVMでCodeIQの問題を解いている記事](http://qiita.com/yasunori/items/8720c85e75b4679cae47)があったので真似してGBDTでもやってみます。

```lang:sample_gbdt.py
# -*- coding: utf-8 -*-
from sklearn.ensemble import GradientBoostingClassifier
import numpy as np

# 学習データ
train_data = np.loadtxt('CodeIQ_auth.txt', delimiter=' ')
X_train = [[x[0], x[1]] for x in train_data]
y_train = [int(x[2]) for x in train_data]

# 試験データ
X_test = np.loadtxt('CodeIQ_mycoins.txt', delimiter=' ')
y_test = np.array([1,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,0,0,0,1])

clf = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1,
        max_depth=1).fit(X_train, y_train)

print ("Predict ",clf.predict(X_test))
print ("Expected", y_test)
print clf.score(X_test, y_test)

```

SVMを使っていたのをGBDTでやるだけです。今回は二値分類で。labelの種類を増やせば勝手にそれに応じて他クラス分類してくれるみたいですけど。

結果がこちら
```
('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.85
```
3か所間違えてますね。。。

## パラメータ調整
ここでsklearnのページを見てみましょう。別に見なくてもいいですけど。
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html
パラメータの数がたくさん。15個。しかも英語でよくわからない。
しかしよくみるとmax_depthのdefaultが3とある。自分のは1だ。なんでだ。

てなわけで直して再チャレンジ。
```
('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.95
```
あがった。あがりましたよ。あがりましたけどやっぱり1か所間違えてますね。
ここで調子の乗ってmax_depthをあげてみましょう。例えば5とか
```
('Predict ', array([1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0]))
('Expected', array([1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1]))
0.9
```
下がりましたね……。あげればいいなんてものではないのはわかっていましたがやっぱりそうなんですね。
しかしこの規模の問題でさえパラメータを変えるだけで結果が変わるんですね。如何に機械学習においてパラメータ調整が大切か身をもって知りました。

そしてこのパラメータ調整。もうちょっと専門的知識がないとうまくできない気がします。pythonでちょっと動かして喜んでるようでは難しそうです。

もうちょっとまじめに勉強して出直そうと思います。
algorithm > 自然数と0が交互に来るようにする実装

0と自然数[1,2,3]が交互に来るようにする実装。

力技で実装した。

http://ideone.com/NnPWWz

```NnPWWz.c
#include <iostream>
using namespace std;

int getNextIndex_1(int curIdx)
{
	// [0, 1, 10, 2, 20, 3, ..., 8, 80], then [0, 1, ...]
	int work = curIdx;
	if (work >= 10) {
		if (work >= 80) {
			return 1;
		}
		return (work / 10) + 1;
	}
	work = work % 10;
	if (curIdx == 0) {
		return 1;
	}
	return curIdx * 10;
}

int main() {
	int idx = 0;
	int useIdx;

	// [0, 1, 0, 2, 0, 3, ... 0, 8], then [0, 1, ...]
	//
	for(int loop=0; loop < 20; loop++) {
		useIdx = idx % 10; // needed
		cout << useIdx << endl;
		idx = getNextIndex_1(idx);
	}

	return 0;
}
```


```txt:結果
Success	time: 0 memory: 3460 signal:0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
1
0
2
```

読みやすさの点では配列を使うほうがいいかもしれない。

関数の外で10の剰余を取るのがいけてない。

ポインタなり参照なり使って、2つ前の状態を覚える変数を別途用意すればまた違うようにできる。

関数内でstatic変数を使うのはしたくはない。


使い道。

- 0: primaryな処理
- 1,2,3,4...8: secondaryな処理

primaryな処理を繰り返しながらsecondaryな処理をする。
インスタンスは[0..8]で定義しているとする。
Android Studio 1.4で「File → New → Android Component」と同じ操作を実現する方法

概要
----
Android Studioの基本的な使い方で、layoutに「Layout resource file」を作成してから、java以下のアプリケーションの階層に「Android Component」メニューを使ってActivityを追加する手順があります。しかし、私が使っているバージョン1.4には、「File → New → Android Component」もしくはコンテキストメニューで「New → Android Component」というメニューがありません。ここでは、同じ操作をどのように実現するかを紹介します。

LayoutとActivityの作成
----------------------
LayoutとActivityを作成する際、Android Studio 1.4では、「Layout resource file」でLayoutを、「Android Component」でActivityをと個別に作成するのではなく、「File → New → Activity → Blank Activity」（Activityの種類は作るものによって選択）というメニューを使って、LayoutとActivityをまとめて作成します。Blank Activityを作成する場合の手順は以下のとおりです。

* 「File → New → Activity → Blank Activity」の実行

layoutを選択して、メニューバーの「File → New → Activity → Blank Activity」を実行するか、layoutのコンテキストメニューを表示して、「New → Activity → Blank Activity」を実行します。

![NewActivityMenu.png](https://qiita-image-store.s3.amazonaws.com/0/74651/e417ef3d-fa2f-8f6f-f51b-650573d5b57e.png)

* Cutomise Activity画面

「Blank Activity」を実行すると、以下の様な画面が表示されますので、Activity Name、Layout Nameなどを入力して、「Finish」をクリックします。

![NewActivity.png](https://qiita-image-store.s3.amazonaws.com/0/74651/fe4b3535-af62-9238-110a-b571aaa9e4b7.png)

これで、ActivityとLayoutがまとめて作成されます。
Swift: map情報の表示


AppleのMapを使った地図の表示ができるようになったのでメモ。

---
###【重要】Swiftで地図情報の表示を行うには以下の２つの要素が必要。

- 地図で表示したいポイントの指定
- 表示する広さの指定


---
###手順イメージ：

・MapViewをストーリーボードに設置 (outlet化、delegate化を実施)
・必要なライブラリ：MapKitの導入
・位置（緯度/経度）の指定
・広さ（タテの広さ、ヨコの広さ）の指定

---

###実装：

VewContlolerに以下のように記述。


``` swift:viewcontler.swift

import MapKit

class ViewController: UIViewController {

 @IBOutlet weak var map: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()        

        //緯度の指定
        var latitude:CLLocationDegrees = Y（緯度)

        //経度の指定
        var longtude:CLLocationDegrees = X（経度）

        //地図の広さ：画面の端から端までの緯度の差 (これを大きくするとズームアウト)
        var latDelta:CLLocationDegrees = 0.01 
        var lonDelta:CLLocationDegrees = 0.01 

		//地図の広さを指定して広さ(span)を割り出す
        var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

		//経度と緯度を指定して位置(location) を割り出す
        var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longtude)

        //region:位置と広さを指定して地図を表示する。
        var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)

		//Mapに位置情報を指定して表示。
        map.setRegion(region, animated: true)

    }
```



実用的にはGoogleMapを使うことが多いだろうけど、
緯度経度の関数の使い方についてはこんなかんじ。

自分の位置をトレースするツールはよくあるものの、
自分用に秘密で作ってみるのも面白いかも（いろいろ怖いけどな）

###ではまた！