OmniAICreator/Qiita-1.07M huggingface dataset:
RuboCop | Style/SpaceInsideBlockBraces

# RuboCop | Style/SpaceInsideBlockBraces

## 概要

RuboCopの「Style/SpaceInsideBlockBraces」警告について。

ブロック呼び出しに利用するブレース開始直後、ブレース終了直前、空ブレースの間に半角スペースを必要とするかどうかを
設定・チェックする。
デフォルトでは、ブレース開始直後、ブレース終了直前ともに半角スペースが必要。
空ブレースの場合は半角スペースが不要。

## SpaceInsideBlockBraces

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|space|半角スペースが必要|○|
|EnforcedStyle|no_space|半角スペースが不要|--|
|EnforcedStyleForEmptyBraces|space|空ブレースに半角スペースが必要|--|
|EnforcedStyleForEmptyBraces|no_space|空ブレースに半角スペースが不要|○|
|SpaceBeforeBlockParameters|true|ブロック引数の前に半角スペースが必要|○|
|SpaceBeforeBlockParameters|false|ブロック引数の前に半角スペースが不要|--|

### 検証プログラム

~~~ruby:space_inside_block_braces.rb
print [*1..5].each { |e|puts e }
print [*1..5].each {|e|puts e }
print [*1..5].each { |e|puts e}
print [*1..5].each {}
print [*1..5].each { }
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
Style/SpaceInsideBlockBraces:
  EnforcedStyle: space
  EnforcedStyleForEmptyBraces: no_space
  SpaceBeforeBlockParameters: true
~~~

~~~bash
$ rubocop space_inside_block_braces.rb
Inspecting 1 file
C

Offenses:

space_inside_block_braces.rb:2:20: C: Space between { and | missing.
print [*1..5].each {|e|puts e }
                   ^^
space_inside_block_braces.rb:3:31: C: Space missing inside }.
print [*1..5].each { |e|puts e}
                              ^
space_inside_block_braces.rb:5:21: C: Space inside empty braces detected.
print [*1..5].each { }
                    ^

1 file inspected, 3 offenses detected
~~~

### 実行結果 no_space に設定した場合

~~~yaml:.rubocop.yml
Style/SpaceInsideBlockBraces:
  EnforcedStyle: no_space
  EnforcedStyleForEmptyBraces: space
  SpaceBeforeBlockParameters: false
~~~

~~~bash
$ rubocop space_inside_block_braces.rb
Inspecting 1 file
C

Offenses:

space_inside_block_braces.rb:1:21: C: Space between { and | detected.
print [*1..5].each { |e|puts e }
                    ^
space_inside_block_braces.rb:1:31: C: Space inside } detected.
print [*1..5].each { |e|puts e }
                              ^
space_inside_block_braces.rb:2:30: C: Space inside } detected.
print [*1..5].each {|e|puts e }
                             ^
space_inside_block_braces.rb:3:21: C: Space between { and | detected.
print [*1..5].each { |e|puts e}
                    ^
space_inside_block_braces.rb:4:20: C: Space missing inside empty braces.
print [*1..5].each {}
                   ^^

1 file inspected, 5 offenses detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/space_inside_block_braces.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/space_inside_block_braces_spec.rb

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
クリックイベントをCSSで無効化する

#ポップアップをクリックしたら、下のボタンが反応した時
**いや、そこじゃないんだって！！**
という時に使ってみるCSSです。Javascriptを使ってうまく制御してやる必要があります。
(ポップアップが開いた時にクラスを付ける)

共通CSSにクラス定義を追加しておくと便利です

#CSSクラスを定義しておく
```css
.avoid-clicks{
  pointer-events: none;
}
```

クラスを付与したDOM以下のすべてのクリックイベントが停止されます。
復活させるロジックを書き忘れないよう、注意が必要です。
C++におけるstringのsplit

c++にはstring内にsplitメソッドが定義されていない。そのため自分で実装しなければならない。
##実装
###stringstreamを用いる

```cpp:split.cpp
#include <vector>
#include <string>
#include <sstream>

using namespace std;

vector<string> split(const string &s, char delim) {
	vector<string> elems;
	stringstream ss(s);
	string item;
	while (getline(ss, item, delim)) {
    if (!item.empty()) {
			elems.push_back(item);
		}
	}
	return elems;
}
```

###愚直に実装

```cpp:split_naive.cpp
#include <vector>
#include <string>

using namespace std;

vector<string> split_naive(const string &s, char delim) {
	vector<string> elems;
	string item;
	for (char ch: s) {
		if (ch == delim) {
			if (!item.empty())
				elems.push_back(item);
			item.clear();
		}
		else {
			item += ch;
		}
	}
	if (!item.empty())
		elems.push_back(item);
	return elems;
}
```

##ベンチマーク
###bench1: 入力文字は短く、関数の実行回数が多い

```cpp:bench1.cpp
void bench1() {
	string input = "This is  the part when I say I don't want ya";
	char delim = ' ';
	
	cout << "split: " << measeure(split, input, delim, 100000) / (CLOCKS_PER_SEC / 1000) << "ms" << endl;
	cout << "naive: " << measeure(split_naive, input, delim, 100000) / (CLOCKS_PER_SEC / 1000) << "ms" << endl;
}
```

###bench2: 入力文字は長く、関数の実行回数は少ない。

```cpp:bench2.cpp
void bench2() {
	string random_input = "";
	int len = 1000000;
	mt19937 engine;
	uniform_int_distribution<int> distribution(0, 25);
	char delim = distribution(engine) + 'a';
	for (int p=0; p<len; ++p) {
		int ch = distribution(engine);
    random_input += ch + 'a';
	}
	
	cout << "split: " << measeure(split, random_input, delim, 10) / (CLOCKS_PER_SEC / 1000) << "ms" << endl;
	cout << "naive: " << measeure(split_naive, random_input, delim, 10) / (CLOCKS_PER_SEC / 1000) << "ms" << endl;
}
```

結果:

||bench1[ms]|bench2[ms]|
|:-----------|------------:|------------:|
|split|604|477|
|naive|384|188|


##Reference
[1]http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c
three.js の Mesh を削除する

`scene.remove( mesh );`だけでは削除しきれていない。Meshを構成するオブジェクトがである...

- geometry
- material
- texture
- renderTarget

は`WebGLRenderer`にキャッシュされる仕組みになっているのでメモリに残りつづけてしまう。

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L590

削除したいときに`dispose()`メソッドを手動で実行すると、three.jsの内部で`dispose`イベントが呼ばれ、`WebGLRenderer`から削除される仕組みになっている。

```
scene.remove( mesh );
geometry.dispose();
material.dispose();
texture.dispose();
```

ポストプロセスの`renderTarget`はあまり頻繁に削除することはないだろうけど、もし削除する際にはこれも上記と同様にdisposeする。
UbuntuでCapsLockキーをCtrlキーとして使う

$sudo apt-get install gnome-tweak-tool
$gnome-tweak-tool
「Typing」の「Ctrlキーの位置」で「Caps LockをCtrlとして扱う」を選択する。

【参考】
http://asukiaaa.blogspot.jp/2013/12/ubuntu1310-capslockctrl.html
highlightコマンドでソースコードをハイライトしてKeynoteとかに貼り付ける

==========

Keynoteなどでハイライトされたソースコードを入れるときに、[highlight](http://www.andre-simon.de/doku/highlight/en/highlight.php)というコマンドをよく使っているのでメモです。

インストール (Homebrew)
----------

```bash:インストール
brew install highlight
```

ハイライトしてクリップボードにコピー
----------

```bash:例
highlight -O rtf -k 'Source Code Pro' -K 36 hello.c | pbcopy
```

貼り付ける
----------

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/36226/94374124-34de-a8af-e092-d297bd361578.png "screenshot.png")

よく使いそうなオプション
----------

* `-O [フォーマット]` 出力フォーマット (html, rtfなど)
* `-S [言語]` 入力ファイルの言語を指定 
* `-k [フォント名]` フォント
* `-K [フォントサイズ]` フォントサイズ
* `-s [テーマ名]` テーマ

### 一覧系

* `-p` 対応している言語の一覧
* `-w` テーマ一覧

バージョン
----------

* highlight 3.18
<br /> じゃなくて <br> だよ

# まとめ

HTMLでタグを書く時に、`<br />`のようにスラッシュ`/`を入れる書き方がありますが、`<br>`と書くほうが良いでしょう。`<img>`とか`<input>`とか`<meta>`とかも全部いっしょです。

# 詳細

## なんで後ろに `/` をつけるの？

昔 XHTML というものを流行らせようとしたときの名残です。
XHTMLはXMLとして正しくないといけないので `<br>`単独ではダメで`<br />`か`<br></br>`と書かなくてはいけません。
（ちなみにXML的には`<br/>`でよいのですが、当時のブラウザはそれを正しいタグとして認識できなかったため、`<br />`と書く必要がありました）


## XHTML ?

昔 W3C という団体が「これからのWebは機械からも利用できるようにすべきだ。だからXMLとして読める形式にしよう」と言い出しました。ところが

- XHTMLのMIME-TYPEだとWebページとして表示されないブラウザがある
- XHTMLで書くと正しく描画できないブラウザがある
- XHTMLで書くのは難しく、結局XMLの仕様が守れてないページが多い
    - というかXHTMLより単純なHTMLの仕様すら守れてないページがごろごろ

などの理由からあまり良い評価がされませんでした。さらに各ブラウザを作ってるところが W3Cに「理想だけの仕様を勝手にきめてんじゃねーよ」などといい WHATWG という組織がつくられ、HTML5の仕様策定する結果に。

というわけで、XHTMLはあんまり良いもんじゃないです。（と思ってます）

## それでも XHTML で書いてもいいんだよね

もちろんかまいません。ただ上記の通り、古いブラウザだと動かないことがある上に

- XML宣言とDOCTYPE宣言の両方が必要（追記: [XML宣言は省略する方法](http://www.kanzaki.com/docs/html/xhtml1.html#xmldcl-encoding)もあるようだ）
- いくつかの属性指定が冗長
    - HTMLの`lang`指定とXMLの`lang`指定は別
    - HTMLのエンコーディング指定とXMLの指定は別
- インラインでCSSとJSが書きにくい
    - 全部 `<`や`>`を含む場合は必ず CDATA セクションを用いる
- タグが省略できない
    - <del>殆どの人が省略してると気付いていない `tbody`要素とかね。</del>（追記： tbodyの省略についてはコメントを参照ください）
- 属性が省略できない
    - `<input autofocus="autofocus">` とか

などの面倒さがあるので「俺はどうしてもXHTMLで書きたいんだ」という人でなければ書くことはないでしょう。
またSEO的にもメリットは無いでしょう。

## じゃあXHTMLは守らないけど `<br />`って書きたい

かまいません、もし

> シーを渡り、べトナムでも皆にラブされている事を知り、この曲の凄さがボディにしみて来ました

> 引用: [名言・格言『ルー大柴さんの気になる言葉』一覧リスト | iso.labo](http://iso-labo.com/labo/words_of_lou-Oshiba.html)

のようなコードが書きたいのであれば、ですが。

# おわり

たぶん合ってるけど間違いがあれば突っ込みおねがいします。
PyCharm で matplotlib を使ってみる

[iPython](http://ipython.org/) あんまり便利と思えないので、一番ましな IDE である [PyCharm](http://www.jetbrains.com/pycharm/) を使ってみた。
しかし、matplotlib の使い方が分からなかったので調べてみた。
ちなみに [Canopy](https://www.enthought.com/products/canopy/) を入れている。

```py
from pandas import DataFrame, Series

index = ["America/New_York", "Unknown", "America/Chicago", "America/Los_Angeles", "America/Denver", "Missing",
         "Europe/London", "Asia/Tokyo", "Pacific/Honolulu", "Europe/Madrid"]
data = [1251, 521, 400, 382, 191, 120, 74, 37, 36, 35]
frame = DataFrame(data=data, index=index, columns=["count"])
print frame
```

```:結果
                     count
America/New_York      1251
Unknown                521
America/Chicago        400
America/Los_Angeles    382
America/Denver         191
Missing                120
Europe/London           74
Asia/Tokyo              37
Pacific/Honolulu        36
Europe/Madrid           35
```

```py
import matplotlib.pyplot as plt

frame.plot(kind="barh", rot=0)
plt.show()
```

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/2570/755f32aa-8b81-bb09-fdf3-9be3b80e9b23.png)
AWS S3で異なるアカウントが所有するバケット間をsyncする

アカウントが異なるS3 bucket間を `aws s3 sync` したい場合の設定例。

### 前提

* account: A
 * bucket: AAAA
* account: B 
 * bucket: BBBB

があったとして、AAAA → BBBB に `aws s3 sync` をしたい。

### 設定

B が AAAA に対して読み取ることを許可するため、AAAA の bucket policy　に以下のような設定をします。
[ACCOUNT-ID-B] は B の aws acccount id (12桁の数字) です。

要するに

* arn:aws:s3:::AAAA/* に対して s3:GetObject
* arn:aws:s3:::AAAA に対して s3:ListBucket

を許可ですね。

```json
{
	"Version": "2008-10-17",
	"Id": "Policy1406622286590",
	"Statement": [
		{
			"Sid": "Stmt1406622264456",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::[ACCOUNT-ID-B]:root"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::AAAA/*"
		},
		{
			"Sid": "Stmt1406622282256",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::[ACCOUNT-ID-B]:root"
			},
			"Action": "s3:ListBucket",
			"Resource": "arn:aws:s3:::AAAA"
		}
	]
}
```
j2objc(0.9.3)とXcode

zipやHttpURLConnectionへの対応が進んでいてますます地味に便利になっていますが、version0.9.3でのXCodeへの統合で若干手間取ったのでメモ。

基本的には下記ページの通りだが、このままではzip関連でリンクエラーが出る。

j2objcをXcodeに統合する方法
http://lab.sonicmoov.com/development/j2objc-xcode-integration/

対処法はここに。
https://code.google.com/p/j2objc/wiki/XcodeBuildRule#Update_the_Build_Settings

つまり、上記の「j2objcをXcodeに統合する方法」ページの手順に加え、以下が必要。

[Build Phases]-[Link Binary With Libraries]の[+]を押して、以下の2つを追加する。

* libz.dylib
* Security.framework
CoreOS で root に不思議なファイルが生成される


CoreOS で root に不思議なファイルがされていました.

```
$ ls -la /
...
-rw-r--r--  1 root root   51 Jul  6 18:21 ?*ATq?
-rw-r--r--  1 root root   51 Jul  4 13:57 ?H?Tq?
-rw-r--r--  1 root root   51 Jul 11 02:45 ?J?Tq?
-rw-r--r--  1 root root   51 Jul 12 13:29 ?N?Tq?
-rw-r--r--  1 root root   51 Jul  7 05:58 ?QbTq?
…
```

なんらかの外部からのクラッキングでしょうか? 気になりますね.
中を見ると以下のようなメッセージが. 

```
# This is private data. Do not parse.
STATE=failed
# This is private data. Do not parse.
STATE=failed
# This is private data. Do not parse.
STATE=failed
…
```

調べてみるとちょうど CoreOS の Issue に上がっていました.

https://github.com/coreos/bugs/issues/16

systemd(networkd)のバグっぽいですね. CoreOS 最新にすると直るようです. 期待ですね.
反射ベクトルを求める


## 壁に平行なベクトルを求める

ゲームなどでは壁に体当りすると少し壁を登るように移動する場合がありますが、そうした状況で使えるベクトルです。

![壁に平行なベクトル](https://qiita-image-store.s3.amazonaws.com/0/5616/b06072fc-0069-e936-c37f-defdc1002c4d.png "壁に平行なベクトル")

この「壁に平行なベクトル」を求めるのに必要なベクトルは、「進行ベクトル」と「衝突点に対する法線ベクトル」のふたつです。

![法線ベクトル](https://qiita-image-store.s3.amazonaws.com/0/5616/86403cc3-a93e-edf7-1de0-b54ec2edd23c.png "法線ベクトル")
*法線ベクトルを追加*

計算を分かりやすくするためにベクトルを移動してみます。

![係数a](https://qiita-image-store.s3.amazonaws.com/0/5616/887bcba2-6a6e-09da-0512-917a0211dd70.png "係数a")

進行ベクトルを$F$、法線ベクトルを$N$、壁に平行なベクトルを$P$とすると、$P$は、$F$と、法線$N$に$a$を掛けた長さのベクトルを足したもの、ということが分かります。

### （余談）ベクトルの足し算

ベクトルの足し算は、一方の終点に他方の始点をあわせ、最初のベクトルの始点から、次のベクトルの終点へベクトルを伸ばしたものが結果として得られるベクトルです。

![ベクトルの足し算](https://qiita-image-store.s3.amazonaws.com/0/5616/99854936-69ca-79cb-c462-b6629fc6bbfe.png "ベクトルの足し算")


### aを求める

ベクトル$F$、$N$は既知のものです。
この中で未知の値は$a$のみです。

$a$の値は内積を使うことで簡単に求めることができます。
*（[内積については前に記事を書いたのでこちらを参照](http://qiita.com/edo_m18/items/ae0c8ea57a0bd98f1cee)）*

$a$は進行ベクトルの逆ベクトルと法線ベクトルとの内積で求めます。

```math
a = -F \cdot N
```

最終的に求めたいベクトル$P$は、求まった$a$を使って以下のように計算できます。

```math
P = F + aN
```

展開すると、

```math
P = F + (-F \cdot N)N
```

という式から、壁に平行なベクトルを求めることができます。
あとはこのベクトルに対して、進行ベクトルの強さや減衰率など、ゲームで必要な要素を加味して最終的に必要なベクトルを得れば完成です。


## 反射ベクトルを求める

反射ベクトルは以下のようなベクトルです。

![反射ベクトル](https://qiita-image-store.s3.amazonaws.com/0/5616/2665edb4-d321-3ae5-0c67-1ec214332bb0.png "反射ベクトル")


実は壁に平行なベクトルを求めることができたら、ほぼ反射ベクトルは求まっています。
以下の図を見てください。

![反射ベクトル計算](https://qiita-image-store.s3.amazonaws.com/0/5616/da96348d-ee9a-549c-547f-9642de041d39.png "反射ベクトル計算")


進行ベクトルの終点に、仮に反射ベクトルの始点を置いています。
また、進行ベクトルを衝突点から同じだけ進めたベクトルを追加しました。

図を見てもらうと分かりますが、進行ベクトルを方向を変えずに同じだけ進めると反射ベクトルの対象ベクトルが得られます。
あとは得られたベクトルを、反射方向に向きを変えられればいいわけです。

そして対象の中心となる面は当然、壁の法線が示す面となります。
前回求めた壁ずりベクトルはちょうどこの壁と平行になるベクトルでした。
そこで求めた係数は$a$ですね。

つまり、対象ということは同じだけベクトルを移動すれば対象のベクトルが得られます。
以上を式に表すと以下になります。

```math
R = F + 2aN
```

壁と平行なベクトルは$P = F + aN$で求めていました。
この係数$a$を2倍にすることで目的の反射ベクトルが得られます。
これを展開すると以下となります。

```math
R = F + 2(-F \cdot N)N
```

ひとつひとつ紐解いて行けば比較的単純に反射ベクトルを求めることができますね。
Nginxを使用して、配信したHTMLと同一のポート番号で、socket.ioに接続できるようにする。


RailsやFlaskで実装したWebアプリケーションで、socket.ioを使ったチャット機能を追加する場合、
それらのアプリケーションで配信したHTMLに、socket.ioのスクリプトをロードして使う必要がありますが、
socket.ioが起動しているポートをHTMLに記述しなければなりません。

Production環境では、余計なポートを開放したくないので、クライアントからsocket.ioに接続する場合、
Webアプリケーションと同じポートで接続できるようにしたいところです。
前面にNginxをたてて、socket.ioのプロキシとして動作させれば実現できそうです。

## 前提

- Webアプリケーションは、ポート80でアクセス可能
- socket.ioは、ポート3000で起動
- Nginxは出来るだけ最新のバージョンを使用(v1.6とか)

## 手順

1. Webアプリケーションも、socket.ioもNginx経由で、クライアント(Webブラウザ)から接続できるようにする。
2. path:`/socket.io/`にアクセスがあったら、起動しているsocket.ioのURLに転送する。(Proxy)

## Nginxの設定

`/socket.io/`にアクセスがあったら、socket.ioに転送するだけです。

```conf
// app.conf
upstream io_nodes {
    ip_hash;
    // 起動しているsocket.ioの接続先URL
    server 127.0.0.1:3000;
}

server {
    listen 80;
    server_name foo.docker.dev;

    // Webアプリケーション側
    location / {
        uwsgi_pass  unix:///tmp/uwsgi.sock;
        include     uwsgi_params;
        client_max_body_size 20M;
    }

    // Webブラウザからsocket.ioにアクセスする際のパス`/socket.io/`だった場合、socket.ioに転送(Proxy)
    location /socket.io/ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_pass http://io_nodes;
    }
}
```

## HTML

Nginxの設定ができていれば、`<script>`タグで、socket.ioのスクリプトを読み込むのも、初期化するのもホスト名、ポート番号などを書かなくて良くなります。
また、Iptablesなどで、socket.io用のポートは開放する必要はなくなります。

```html
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();

  socket.on('connect', function(msg) {
    console.log(msg);
  });
  socket.on('chat message', function(msg) {
    alert(msg);
  });
  socket.on('test message', function(msg) {
    console.log(msg);
  });
</script>
```

## 追記

ただ、開発環境でnginxを立ててとかやるのは、めんどくさいので、直接socket.ioにも接続できるようにしたい場合は、
Webアプリケーション側で開発時にだけ、socket.ioの接続先URLを変数か何かに格納しておけばよいでしょう。


```html
<script id="socketIO" src="{{ IO_DIRECT_URL or '' }}/socket.io/socket.io.js"></script>
<script>
  var url;
{%- if IO_DIRECT_URL -%}
  url = {{ IO_DIRECT_URL|tojson|safe }};
{%- endif -%}

  var socket = io(url ? url : undefined);
  socket.on('connect', function(msg) {
    console.log(arguments);
    console.log(msg);
  });
  socket.on('chat message', function(msg) {
    alert(msg);
  });
  socket.on('test message', function(msg) {
    console.log(msg);
  });
</script>
```
無線lanルーターのDHCPを殺しつつ無線だけ生かす

corega製のwi-fi機能付きルーターを使ってたんですが
接続機器が多くなりすぎたのかwi-fi機能が死ぬことが頻発したので
新しいのを買ってきました。
で、その時にDHCP殺してハブ替わりに使うだけでなく
wi-fiも使えないかなーと、
やってみたらできたのでご紹介。

【やりたかったこと】
 おnewルーター経由で旧ルーターのコンソールに繋いでwi-fi設定

【出来たこと】
旧ルーターのwi-fiを使う


どういうことかっていうと
旧ルーターのセグメントの問題なのか
うまく繋がらない。
要するにかんりできなくなっちったw

でも、設定してたwi-fi情報は生きてて使えたのでとりあえずこのまま運用。
気が向いたらその後も書きます。


wi-fiのアクセスポイント増やしたい人はお試しあれ
マルチスレッド作成（MFC）


MFCでのマルチスレッド作成にて、やったことをまとめておきます。

##マルチスレッド作成
ワーカースレッドが終了したら対応関数を呼び出す処理を実装します。

###用意するもの

- スレッド関数（制御関数）
static UINT ThreadProc(LPVOID pParam);
- スレッド処理本体関数
void ThreadProc();
- スレッド終了後処理関数
afx_msg LRESULT OnCompleteLoadXML(WPARAM wParam, LPARAM lParam );
- スレッド用変数：CWinThread型


###作成手順

1. スレッド開始処理実装
2. スレッド終了処理実装

まずヘッダーはこの通り。

```MyDlg.h

class CmyDialog : public CDialog
{
//～もろもろ省略

/*変数*/
private:
	CWinThread* pThread;

/*関数*/
private:
	void collationReserve();
	void displayResultScreen();

public:
	static UINT ThreadProc(LPVOID pParam);
	void ThreadProc();
	afx_msg LRESULT OnCompleteLoadXML(WPARAM wParam, LPARAM lParam );
};
```

####1.スレッド開始処理実装
MFCのマルチスレッドはAfxBeginThread関数で開始できます。
それぞれの関数について。


* スレッド関数（制御関数）

```MyDlg.cpp
UINT CmyDialog::ThreadProc(LPVOID pParam){
    CmyDialog* pFileView = dynamic_cast<CmyDialog*>(reinterpret_cast<CWnd*>(pParam));
    if (pFileView)
    {
		pFileView->ThreadProc();
    }
    return 0;
}
```

スレッド関数ではメンバ関数が呼び出せないため、処理本体関数を別に作成します。

* スレッド処理本体

```MyDlg.cpp
void CmyDialog::ThreadProc()
{
	collationReserve();
	//AfxGetMainWnd()->SendMessage(WM_USER_COMPLETE_LOAD_XML, (WPARAM)&firstIndex, (LPARAM)firstFilePath.GetString() );
	this->PostMessageA(WM_USER_COMPLETE_LOAD_XML);
}
```

処理の最後にSendMessage関数かPostMessage関数でメッセージを送ります。これでワーカースレッドの処理が完了したことを元スレッドに知らせます。

* スレッド開始関数：AfxBeginThread

```MyDlg.cpp
pThread = AfxBeginThread(ThreadProc, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED , NULL);
ASSERT(pThread);
if (pThread)
{
	pThread->m_pMainWnd = this;
	pThread->m_bAutoDelete = TRUE;
	// スレッド処理の開始
	pThread->ResumeThread();
}
```

そのまま呼び出してもスレッドは開始しますが設定を行うために処理を追加しています。

####2.スレッド終了処理実装

スレッド終了時の処理を実装します。

* メッセージマップ登録

```MyDlg.cpp
BEGIN_MESSAGE_MAP(CmyDialog, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, &CmyDialog::OnBnClickedButton1)
	ON_WM_SHOWWINDOW()
	ON_WM_PAINT()
	ON_MESSAGE(WM_USER_COMPLETE_LOAD_XML, CmyDialog::OnCompleteLoadXML)// UserMessage
END_MESSAGE_MAP()
```

（cppファイル内にある）メッセージマップ内に追記します。

* スレッド終了後処理関数

```MyDlg.cpp
afx_msg LRESULT CmyDialog::OnCompleteLoadXML(WPARAM wParam, LPARAM lParam )
{
	displayResultScreen();
	//delete pThread;

	return 0;
}
```

スレッド終了後に行う処理を関数内に記載します。


##参考
http://simplestar.syuriken.jp/tips/MFC_0010_HowToUseThread.html
http://oissu2.blog77.fc2.com/blog-entry-18.html
Selenium Webdriver(Ruby) で ドラッグ＆ドロップする方法

あんまり理解できてないけどやり方だけわかったのでメモ。

# 環境(とりあえず動いたときのバージョン)
* Ruby : 2.0.0p451
* selenium-webdriver : 2.42.0
* Firefox : 31
* Chrome : 36
* IE : 11

# やりかた
## ドライバつくるとき
```rb:setup
ff_profile  = Selenium::WebDriver::Firefox::Profile.new
capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(:firefox_profile => ff_profile)

driver = Selenium::WebDriver.for :firefox,
                                 :desired_capabilities => capabilities
```
Chrome, IE の場合は、`firefox` の箇所をそれぞれ `chrome`, `ie` に変えればOK。

## 実際に D&D するとき
```rb:sourceをtargetまでD&Dするサンプル
source = driver.find_element(:id, "source_element")
target = driver.find_element(:id, "target_element")

driver.action.drag_and_drop(source, target).perform
```
Swiftで関数のカリー化(currying)入門

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/a/alex23drum/20140727/20140727225644.png" alt="swift_logo" title="swift_logo" style="border:none;">

今回はSwiftで関数のカリー化を実現する方法を紹介します！

## そもそもカリー化って何？

カリー化とは、
>複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること
>
><cite>引用元 : [Wikipedia](http://ja.wikipedia.org/wiki/カリー化)</cite>

です。ちょっとわかりづらいですかね...？

要は、aとbを引数にとってcを返すような関数fがあったとします。

```math
f(a, b) = c
```

このとき、引数にbをとってcを返す関数g(b)と、引数aをとって関数gを返す関数F(a)を定義すると、この関数Fは __関数fをカリー化した関数__ と言います。

```math
F(a) = g
```

```math
g(b) = c
```

すなわち、ざっくり言うとカリー化とは __複数の引数を1つに減らす__ ことを指します。

## Swiftで関数をカリー化してみる

では、早速関数をカリー化していきましょう！
例えば、「2つの整数を足し合わせる関数」を作るとします。普通に書いたら次のように書けるでしょう。

```swift
func addTwoNumbers(x: Int, y: Int) -> Int {
  return x + y
}
```

これをカリー化するためには、まず上の例でいう関数Fはどのようになるでしょうか？
関数Fとはwikipediaの説明によると、 __引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数__ であり、ここでいう __「もとの関数の残りの引数を取り結果を返す関数」__ が関数gにあたります。
すなわち、関数Fをadd(x)、関数gをaddToX(y)とおくと、add(x)は以下のように表せます。

```swift
func add(x: Int) -> (Int -> Int) {
  func addToX(y :Int) -> Int {
    return x + y
  }
  return addToX
}
```

おめでとうございます。この関数add(x)こそが、addTwoNumbersの __カリー化関数__ (curried function)です！！さらに、addToXをいちいち定義してから返さないで、無名関数としてreturnしてやると、次のように書けます。

```swift
func add(x: Int) -> (Int -> Int) {
  return { (y: Int) -> Int in x + y }
}
```
確認してみると

```swift
let add7 = add(7)
add7(3)   // 10
add7(5)   // 12
```

このようになっていることが分かります。

## そもそもカリー化なんかして何が嬉しいの？？

では、関数をカリー化する利点はなんでしょうか？それは、 __カリー化された関数によって、簡単に別の機能を持つ関数を作れる__ ということです。上の関数add(x)の例でいくと、引数に7を足す関数、引数に10を足す関数、引数に100を足す関数...が簡単に量産出来てしまいます。(処理が簡単なのであまり利点を感じないかもしれませんが、、、)

```swift
let add7 = add(7)
let add10 = add(10)
let add100 = add(100)
```

## [注意！]部分適用と意味を混合しないこと！

よく「カリー化」と「部分適用」の意味を混合して使ってしまう例があります。
しかし、これらは似ているようで違う意味を持ち、実は「カリー化」は「部分適用」の一部なのです。

最初に私は「カリー化とは __複数の引数を1つに減らす__ こと」と述べましたが、それに対し、部分適用は __「引数を減らすこと」__ です。すなわち、

```swift
func addThreeNumbers(x: Int, y: Int, z: Int) -> Int {
  return x + y + z
}
```

このような関数を、

```swift
func add(x: Int) -> ((Int, Int) -> Int) {
  return { (y: Int, z: Int) in x + y + z }
}
```

このように書き換えることを __部分適用__ と言います。
これらの違いや、使い道に関しては、[こちら](http://prezi.com/9brwewgcxtr2/?utm_campaign=share&utm_medium=copy&rc=ex0share)のスライドに分かりやすくまとまっていますので是非ご一読ください^^

## [備考]公式ドキュメントでは、、

Appleの公式ドキュメント __"The Swift Programming Language"__ では、カリー化関数を以下のように書けると記されています。

```swift
func addTwoNumbers(a: Int)(b: Int) -> Int {
    return a + b
}
addTwoNumbers(4)(5) // Returns 9
```
便利そうですね。しかし、実際にこの記述で実行しようとするとエラーが出てしまい、以下のように記述しなければなりません。

```swift
func addTwoNumbers(a: Int)(b: Int) -> Int {
    return a + b
}
addTwoNumbers(4)(b: 5) // Returns 9
```

二つ目の引数のみbというラベルが必要になります。
お気をつけ下さい！！

以上です！お疲れさまでした！

## ブログやってます！

[その時凡人が動いた](http://alex23drum.hatenablog.com)
CentOS 6 で Mahout を動かしてみる

とりあえず Hadoop が動かせたので、
本題の機械学習をするために Mahout 0.9 をインストールする
### Maven インストール
```shell-session
 # wget -P /usr/local/src/ http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.2.2/binaries/apache-maven-3.2.2-bin.tar.gz
 # tar zxvf /usr/local/src/apache-maven-3.2.2-bin.tar.gz
 # mv /usr/local/src/apache-maven-3.2.2-bin /usr/local/apache-maven
 # chown -R roor. /usr/local/apache-maven
```
/etc/profile に追記
```vim
export M2_HOME=/usr/local/apache-maven                                                                                                                                                                                           
export M2=$M2_HOME/bin                                                                                                                                                                                                           
export PATH=$PATH:$M2
```
インストールできてるか確認
```shell-session
 # mvn --version
```
バージョンが表示されればオッケー

### Mahout インストール
```shell-session
 # wget -P /usr/local/src/ http://ftp.meisei-u.ac.jp/mirror/apache/dist/mahout/0.9/mahout-distribution-0.9.tar.gz
 # tar zxvf /usr/local/src/mahout-distribution-0.9.tar.gz
 # mv /usr/local/src/mahout-distribution-0.9 /usr/local/mahout
 # chown root. /usr/local/mahout
```
/etc/profile に追記(Mahout 実行時に HADOOP_CONF_DIR が無いとかエラーが出るため、こちらも定義)
```vim
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export MAHOUT_HOME=/usr/local/mahout                                                                                                                                                                                             
export PATH=$PATH:$MAHOUT_HOME/bin 
```

### Mahout を動かしてみる(hadoop ユーザーで実行)
Mahout のサンプルデータをダウンロードし、HDFS に設置
```shell-session
 $ wget -P /usr/local/src/ http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data
 $ hadoop fs -mkdir testdata
 $ hadoop fs -put /usr/local/src/synthetic_control.data testdata
 $ mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
```
おー、動いた！何か解析してる
結果を見るために、テキストに書き出してみる
```shell-session
 $ mahout clusterdump --output clusterdump.txt --input data/kmeans/clusters-*-final --pointsDir data/kmeans/clusteredPoints --dictionary data/vector/dictionary.file-* --dictionaryType sequencefile -dm org.apache.mahout.common.distance.CosineDistanceMeasure --numWords 30
 $ cat /home/hadoop/clusterdump.txt
```
なんだこれ、データの意味が・・・
```text
CL-310{n=58 c=[30.778, 29.351, 28.767, 28.754, 28.602, 28.055, 27.711, 25.413, 26.161, 26.456, 
・・・}
```
そもそも synthetic_control.data の数値も分からん・・・

とりあえず、動いたので理解するのは今度で
次は、HBase 入れよう
PowerPoint/Keynoteでソースコードをシンタックスハイライトする


Homebrewのパッケージで`highlight`等がありますが、
正直思った通りにハイライトしてくれなかったり、
PowerPointとKeyNote両方に使えない方法だったりと何かと不便ですよね。。

そこでPowerPoint/Keynoteでソースのシンタックスハイライトを実現する方法を紹介します。

# 前提条件
- Mac OS X 10.9.4 Mevericks
- Microsoft Office
- KeyNote
- Homebrew

## 準備
既にpython 3.x系の環境がある方は飛ばしてください。

### pyenv
Rubyと同様にPythonもお手軽にバージョンを管理したいので`pyenv`を導入。
せっかくMacを使っているのでHomebrew経由でインストール。

```console:
$ brew install pyenv
```

### python3系のインストール
2014/07/30現在の最新バージョンの3.4.1をインストール。

```console:
$ pyenv install 3.4.1
$ pyenv rehash
```

インストール後のPATHと補完の設定はインストール後のプロンプトを参照してください。

#### 全体で使用するバージョンに指定
```console:
$ pyenv global 3.4.1

$ pyenv versions
  system
* 3.4.1
```
3.4.1にチェックがついていることを確認。

### Pygmentsのインストール
Pythonのパッケージ管理システムの`pip`で`Pygments`をインストール。

```console:
$ pip install Pygments
$ pyenv rehash
```

## シンタックスハイライトをrtf形式でクリップボートにコピー
```console:
$ pygmentize -f FILE_PATH | pbcopy
```

## ペースト
- `⌘+V`でPowerPoint/KeyNoteにペースト
	- 「形式を保持してコピー」をすれば色も反映される
	- 適宜フォントのサイズを調整する

### ※注意
- コメントの日本語は文字化けするので注意
	- 日本語部分のみ後から編集する等の工夫が必要

see also:
https://gist.github.com/ept/4475995
VMware Fusionの仮想マシンを自動起動させ、安全にシャットダウンさせるためのメモ


VMware Fusionで作成した仮想マシンをホスト起動時に自動起動させたかったのでそのためのメモです。(VMware Fusion 6.0.1で確認)

## VMをコマンドラインで起動させる方法

VMware Fusion内にあるvmrunコマンドを使用します。

```bash:Terminal
$ /Applications/VMware\ Fusion.app/Contents/Library/vmrun start /path/to/vm.vmwarevm/vm.vmx
```

headlessモードで起動したい場合は``nogui``をつけます。

```bash:Terminal
$ /Applications/VMware\ Fusion.app/Contents/Library/vmrun start /path/to/vm.vmwarevm/vm.vmx nogui
```

## VMを安全にシャットダウンさせるために

OS Xのlaunchdはデーモンプロセス終了時に``SIGTERM``を送ってきます。(参考: [Daemons and Services Programming Guide](https://developer.apple.com/library/mac/documentation/macosx/conceptual/bpsystemstartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-BCIEDDBJ))
そのため、vmxファイルにSignalに関する設定を追記します。

```bash:vm.vmx
signal.suspendOnHUP = "TRUE"
signal.poweroffOnTERM = "TRUE"
```

launchdのことだけを考えるなら``signal.suspendOnHUP``の設定はいらないのですが、一応。
この設定を行ってlaunchdからVMを起動し、``launchctl stop``を行った場合、VMはシャットダウン処理を行って終了するようになります。
AWS 認定システムオペレーション（SysOps）アドミニストレーター – アソシエイト合格した

[AWS 認定システムオペレーション（SysOps）アドミニストレーター – アソシエイトレベル](http://aws.amazon.com/jp/certification/certification-levels/certified-sysops-admin-associate/)に合格したので、内容をメモしておきます。
ちょっとでも誰かの資格とる手助けになったら幸いです。

# 試験の位置付け

[AWS認定プログラム](http://aws.amazon.com/jp/certification/)の種類は2014/07時点で以下のようにな感じです。

* AWS 認定ソリューションアーキテクト　　　：AWSのインフラデザインに関する認定
* AWS 認定デベロッパー　　　　　　　　　　：AWSインフラ上でのアプリ開発に関する認定
* AWS 認定システムオペレーション（SysOps）：AWSの管理、運用に関する認定 **【今回受験！】**

それぞれ習熟度に応じて以下のレベルの認定があります（下の方ほど難しい）。

* アソシエイトレベル **【今回受験！】**
* プロフェッショナルレベル
* マスターレベル

# 私のAWSスペック

 * AWS 認定ソリューションアーキテクト アソシエイト合格済
  * [AWSトレーニング(Architecting on AWS)](http://aws.amazon.com/jp/training/course-descriptions/architect/)も受講済
 * AWS歴：1〜2年
 * AWSの基本的なWebサイトを構成するためのサービスあたりは日常的にさわっていてQiitaで記事書いたりしているレベル

# 所感

AutoScalingなどを使った伸縮可能で可用性の高いAWSインフラが前提知識として求められ、そのインフラを管理・運用するための知識が求められると感じました。

AWS 認定ソリューションアーキテクト アソシエイトの試験でも思いましたが、割と実践的な問題が出ると思いました。
ちゃんとした知識があるのが前提でその知識が応用できることを確認していると感じますね。

試験時間80分は見直しまでふくめてギリギリでした。

最近大阪で受験できるようになったのが嬉しいですね。
これで頑張って東京行って落ちたら二度と受けないような状況から脱出できます。

# 勉強方法

[AWSトレーニング(Systems Operations on AWS )](http://aws.amazon.com/jp/training/course-descriptions/sysops/)を受けて、トレーニング期間中に各試験のサンプル問題を解くのでいけました。
AWSトレーニングを受ける場合は終わった後すぐの受験がいい感じです。

AWSトレーニングでは以下のような勉強方法が良いとアドバイスされましたが、確かに試験受けてみるとそんな感じです。
AWSトレーニング受けない場合もこの勉強方法でいけそうです。

* [AWS クラウドサービス活用資料集](http://aws.amazon.com/jp/aws-jp-introduction/)やAWS Black Belt Techシリーズのスライドを見て各サービスについて理解する
* Management Consoleで少なくとも主要なサービス(VPC、EC2、S3、IAMなど)をさわってみる
* 各試験のサンプル問題を解く
 * 内容が被る部分があるので受験する以外の試験問題を知っておくと良い
Pokebell gem でキムタクからのメッセージを復号してみよう

#復号化機能追加のきっかけ
以前に Pokebell gem を作って、文字列から数字列への変換（暗号化）を行うことが出来るようにしました。

[Ruby - 読みをポケベル入力数字に変換するPokebell gem - Qiita](http://qiita.com/riocampos/items/df546cb59eee2e91e839)

そして予定として数字列から文字列への変換（復号化）をいずれ行おうと思いつつ、なかなか機能追加を行えずにいました。

先日、このツイートを読みました。

<blockquote class="twitter-tweet" lang="en"><p>キムタクさんは当時からメンバー1人気あって、もらう手紙も多いのにメンバー1返事を書く人で、1日に2通渡したら2通とも返信くれたり、入りで渡した手紙の返事を楽屋で書いて外にいる私にわざわざ手渡ししに来た時には本当にビックリした。返事は全部で約50枚ある。宝物です。</p>&mdash; 紗希 (@saki78127) <a href="https://twitter.com/saki78127/statuses/493051391196147712">July 26, 2014</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>今リツイートさせていただいたツイートで確信しました。&#10;今から19年前、初めてSMAPのコンサートに行ったときの事。仙台サンプラザで、確か2日連続での公演で。私は2日目にいく予定で。仙台の1日目に行く友達に、拓哉宛の手紙を託して。&#10;その日の夜、ポケベルに読めないメッセージが来て。続</p>&mdash; まゆげ (@mayuge524) <a href="https://twitter.com/mayuge524/statuses/493367165353852929">July 27, 2014</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>その手紙の中に、私のポケベルの番号を書いてて…だからまさかなとは思ったけれど。。当時手紙を託した友達にはポケベルの番号を書いたことは伝えてなく、考えうる友人・家族に「イタズラで送ったんじゃないか」と確認をしたけれど、皆「送ってないよ」って。今まで19年間、信じきれなかったけど…続</p>&mdash; まゆげ (@mayuge524) <a href="https://twitter.com/mayuge524/statuses/493373341441355776">July 27, 2014</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>そのメッセージが、これ。&#10;一文字ずれると、カタカナじゃなくて数字で来ちゃうんだけど…&#10;-11493550241553272523244938588412381&#10;会えるのを楽しみにしてるよ 拓哉&#10;ぴったり20文字、初めてSMAPのコンサ <a href="http://t.co/wi2tuxF61g">pic.twitter.com/wi2tuxF61g</a></p>&mdash; まゆげ (@mayuge524) <a href="https://twitter.com/mayuge524/statuses/493376613434671105">July 27, 2014</a></blockquote>
<blockquote class="twitter-tweet" lang="en"><p>続き/初めてSMAPのコンサートに行く、14歳の私へくれた、拓哉からのメッセージ。涙&#10;ずっと半信半疑だったけど、先ほど見かけたツイートを読んで、確信できました。すぐ母(拓哉ファン)にも報告、二人で泣きました。ずっとSMAPの応援をしてこれてよかった。これからもずっと応援します。終</p>&mdash; まゆげ (@mayuge524) <a href="https://twitter.com/mayuge524/statuses/493377660207132672">July 27, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このツイートを読んだときに、これを復号化したいな、と強く思ったので、復号化機能を追加しました。

#バージョン
```bash
$ gem search pokebell --remote

*** REMOTE GEMS ***

pokebell (0.1.0)
```
#インストール
```bash
$ gem install pokebell
```

#復号化メソッド
数字からPokebellインスタンスを作るには、クラスメソッドの `Pokebell.number` を使います。
その後に復号された文字列を見るには `Pokebell#str` を使います。

```ruby
Pokebell.number("22734123").str
#=> "キムタク"
```
#キムタクからのメッセージ
ツイートでは `-11493550241553272523244938588412381` と書き起こしてありますが、添付写真をみると冒頭の1が足りないことが分かります。
また `-` はメッセージ冒頭であることを意味するだけだと思われます。

ということで `Pokebell.number` の引数に `"111493550241553272523244938588412381"` を渡して実行してみましょう。
ワンライナーで実行します。

```bash
$ ruby -rpokebell -e 'puts Pokebell.number("111493550241553272523244938588412381").str'
アエルノヲタノシミニシテルヨ　タクヤ
```
拓也、やさしいよね。

Pokebell gem の詳しい使い方は
* [File: README — Documentation for pokebell (0.1.0)](http://rubydoc.info/gems/pokebell)
をご覧ください。
CentOS6.0にTomcat8.0.9をインストールする手順

[How to install Tomcat 8 on a CentOS 6 VPS](http://www.rosehosting.com/blog/how-to-install-tomcat-8-on-a-centos-6-vps/)を参考にさせていただきました。

#javaバージョン確認
Tomcat8はjava7以降でないと動かない。
`# java -version`でバージョンを確認し、必要ならjava7以降をインストール
今回は`# yum install java-1.7.0-openjdk*`でインストールした。

#Tomcat8インストール
まずは専用ユーザ作成、/bin/falseでログイン不可にする。
`# useradd -r tomcat8 --shell /bin/false`

次にwgetでtomcat8をダウンロード
`# cd ~`
`# wget http://www.us.apache.org/dist/tomcat/tomcat-8/v8.0.9/bin/apache-tomcat-8.0.9.tar.gz`

解凍して展開
`# tar -xzvf ~/apache-tomcat-8.0.9.tar.gz`
`# mv ~/apache-tomcat-8.0.9 /usr/local/tomcat8`
`# chown -R tomcat /usr/local/tomcat8`
 ※2015/2/12追記
上のコマンドは
`# chown -R tomcat8 /usr/local/tomcat8`
の間違いでした。

#サービスに登録
```/etc/init.d/tomcat8
#!/bin/bash
#
# tomcat8
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat8
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Tomcat 8
# Short-Description: start and stop tomcat
### END INIT INFO

## Source function library.
#. /etc/rc.d/init.d/functions
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.65.x86_64
export JAVA_OPTS="-Dfile.encoding=UTF-8 \
  -Dnet.sf.ehcache.skipUpdateCheck=true \
  -XX:+UseConcMarkSweepGC \
  -XX:+CMSClassUnloadingEnabled \
  -XX:+UseParNewGC \
  -XX:MaxPermSize=128m \
  -Xms512m -Xmx512m"
export PATH=$JAVA_HOME/bin:$PATH
TOMCAT_HOME=/usr/local/tomcat8
TOMCAT_USER=tomcat8
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ] 
  then
    echo "Tomcat is already running (pid: $pid)"
  else
    # Start tomcat
    echo "Starting tomcat"
    ulimit -n 100000
    umask 007
    /bin/su -p -s /bin/sh $TOMCAT_USER $TOMCAT_HOME/bin/startup.sh
  fi


  return 0
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Stoping Tomcat"
    /bin/su -p -s /bin/sh $TOMCAT_USER $TOMCAT_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\nwaiting for processes to exit";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds"
      kill -9 $pid
    fi
  else
    echo "Tomcat is not running"
  fi
 
  return 0
}

case $1 in
start)
  start
;; 
stop)   
  stop
;; 
restart)
  stop
  start
;;
status)
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Tomcat is running with pid: $pid"
  else
    echo "Tomcat is not running"
  fi
;; 
esac    
exit 0
```

実行権限を追加
`# chmod +x /etc/init.d/tomcat8`
サービススタート
`# service tomcat8 start`
http://localhost:8080/にアクセスできるか確認
自動起動の設定
`# chkconfig tomcat8 on`
Xcode Preprocessor Macrosを使って本番とテストをコントロール

APIのURLが本番とテストで違う時などに、いちいちソースを直してビルドするのは面倒だし、間違ってテストのままストアにあげちゃったりするリスクがある。

##Xcodeの機能のひとつ Preprocessor Macros を使う
こんな感じにheaderファイルで `#ifdef DEBUG` を使って分ける。


```objc
#ifdef DEBUG
    #define SERVER @"http://api.test.com"
#else
    #define SERVER @"http://api.prod.com"
#endif
```

##Sample実装
すべてのViewControllerにかくのは面倒なのでPrefix headerにかく。
`ProjectName > Supporting Files > {ProjectName}-Prefix.pch`


```objc
//
//  Prefix header
//
//  The contents of this file are implicitly included at the beginning of every source file.
//

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

//テストと本番のサーバー設定
#ifdef DEBUG
    #define SERVER @"http://api.test.com"
#else
    #define SERVER @"http://api.prod.com"
#endif
```

この状態でビルドすると、#ifdef DEBUG のほうに入る。
本番環境でビルドしたいときはShemeを変更する。  

`Xcode > Product > Scheme > Edit Scheme... > Build Configuration`
ここを `Debug` から `Release` に変更してビルドすると #else に入る。

ログの出力とかにも使えるかも。
便利便利。
[Rails]paperclipでサムネイル画像のサイズを後から変更する


paperclip使っててサムネイル画像のサイズを後から変えたい場合のメモ。Webもリッチになってくしあとからもうちょい大きくしたいとかよくある。

まずサムネイル画像のサイズ指定を変更。

```app/model.user.rb
has_attached_file :avatar,
  styles: {
    thumb: "160x160#",
  }
```

rakeコマンドで一括変換。

```
rake paperclip:refresh CLASS=User
```

インスタンスに対しても個別に処理する事も可能。

```
User.find_each{ |user| user.avatar.reprocess! }
```

詳細はここに色々書いてあります。
https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation
match-caseにおけるas-pattern(@)の嬉しさとは

# as-patternとはなにか

まずは例示。

```scala
val l = List("hello", "world")
l match {
  case list @ List(first, _) => println(s"first element is $first : length = ${list.size}")
  case _ => println("other")
}
```

上記の@のところ。
長さ2のリストにマッチした場合、そのインスタンスをlistという変数で後続処理で利用できるようになる。

ただしこの例では全く嬉しさが伝わらない。
そもそもlとlistが同じものを指すからでわざわざas-patternを用いて新規に変数を充てる意味が無い。

# 嬉しさを感じるには

これが活きるシーンとして以下を考えた。
Boxは任意の型を任意個格納できる箱。
Boxを複数持つListからBoxの要素数が2つのものを取り出しtoStringを呼ぶ、というのがやりたいこと。
この時、as-patternがあるおかげでマッチした自身のインスタンスが簡単に取得できるためやりたいことが簡潔に書ける。

```scala
case class Box[T](args: T*) {
  override def toString = args.mkString(":")
}

val boxes = List(Box(), Box("A"), Box("A", "B"), Box(1, 2), Box("x", "y", "z"))
boxes.collect {
  case b @ Box(_, _) => b.toString
}
```

collectの結果はもちろん、List("A:B", "1:2")となる。

ちなみにas-patternが無ければ（もしくは存在を知らなければ）以下の様なコードを書くことになるはずで少し冗長。

```scala
case class Box[T](args: T*) {
  override def toString = args.mkString(":")
  val size = args.size
}

val boxes = List(Box(), Box("A"), Box("A", "B"), Box(1, 2), Box("x", "y", "z"))
boxes.collect {
  case b if b.size == 2 => b.toString
}
```

## その他

```scala
f() match {
  case success @ Success(_) => println(success)
}
```

とか

```scala
args match {
  case Array(arg1 @ "param1") => println(arg1)
```
MacのOSアップデートをすると、vagrantコマンドが消えた問題


MacのOSアップデートをすると、vagrantコマンドが消えた。

```
$ vagrant -v
-bash: vagrant: command not found
```

## 原因究明の調査

[command not foundになったときに確認すること](
http://x68000.q-e-d.net/~68user/unix/pickup?Command+not+found)

まずはこれを調べる・・・と思ったけど難しかったので自分用に

1. **vagrantのパスを調べる**

```
$ which vagrant
```
これは何も出なかった
2. **vagrantのファイルを調べる**

```
$ find / -name vagrant 2>/dev/null
/Applications/Vagrant/bin/vagrant
/Applications/Vagrant/embedded/gems/bin/vagrant
/Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/bin/vagrant
/Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/keys/vagrant
/Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/lib/vagrant
/Applications/Vagrant/embedded/gems/gems/vagrant-1.6.3/test/unit/vagrant
```
vagrant自体はなくなってなかった（しかも最新版だった）
`/Applications/Vagrant/bin/vagrant`で、command not found にならないことを確認したので、、
3. **パスの設定を調べる**

```
$ echo $PATH
```

必要なパス`/Applications/Vagrant/bin/`がないことを確認。

### 結論
command not foundになった原因は、パスが消えたこと。

## パスを通しましょう

いろんなブログに出ているとおり。


```.bash_profile
export PATH=/Applications/Vagrant/bin:$PATH
```
この１行を追加。
bash再起動。



以上！！！！！






いっぱい怒られたけど泣かない。









## 追記

`subl`コマンドも消えてた。
調査すると同じようにパスが消えてる。

ってことは同じようにパスを通すのか・・・
もしかしてこれ同じ現象になるたびやらなきゃなのか・・・と思ったけど、
最初にsublの設定したときはパスを通した記憶がなくて、確かシンボリックリンクにしたはず。

```
$ sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/bin/subl
```

毎回パスを追加しなくても、vagrantもシンボリックリンクにしてあげればよかったのか〜とちょっと後悔。
なので、後でシンボリックリンクでやり直します。

と思ってたら、先輩にvagrant入れ直したらって言われたので後で試してみよう。

#### まだあるよ

mysqlも消えてる。
こちらはパスを通すことによって対処しましたー。タイヘン。

```
/usr/local/Cellar/mysql/5.6.10/bin
```

/usr/bin の下が消えちゃう現象っぽいとのことです（先輩談）

#####（2014.10.17）
rbenvとかbrewの復活方法について
http://ichiko-revjune.hatenablog.com/entry/2014/03/25/172225
Garbage-collecting BOINC (remove old version apps)


Boinc applications are sometimes updated and old ones still remain in data directory.
Although the server might discard new ones later, usually old ones are just waste of the storage.
This Ruby script will garbage-collect the data directory.

```rb:boinc_gc.rb
#!/usr/bin/env ruby
#BOINC Garbage Collector (remove old files)

if ARGV.empty? or ARGV[0]!='--yes'
	dry=true
	puts 'Usage: boinc_gc.rb [--yes]'
	puts 'without --yes, it runs in dry-run mode.'
else
	dry=false
end

#http://wcg.wikia.com/wiki/Data_directory
DIR={
	win: 'C:/Documents and Settings/All Users/Application Data/BOINC/projects',
	#win: 'C:/ProgramData/BOINC/projects',
	osx: '/Library/Application Support/BOINC Data/projects',
	linux: '/var/lib/boinc-client/projects',
	freebsd: '/var/db/boinc/projects',
}

if RUBY_PLATFORM.include?('win32') || RUBY_PLATFORM.include?('mingw32')
	dir=DIR[:win]
elsif RUBY_PLATFORM.include?('linux')
	dir=DIR[:linux]
elsif RUBY_PLATFORM.include?('darwin')
	dir=DIR[:osx]
elsif RUBY_PLATFORM.include?('freebsd')
	dir=DIR[:freebsd]
else
	raise 'Unknown platform '+RUBY_PLATFORM
end

FILESIZE_THRESHOLD=1000000 #1MB
require 'find'
dict=Hash.new{|h,k|h[k]=[]}
Find.find(dir){|path|
	size=File.size(path)
	if size>=10**7
		base=path #File.basename(path)
		#x86_64 can exec x86 apps, so there might be mixture.
		base=base.gsub('i386','').gsub('i586','').gsub('i686','').gsub('x86_64','')
		if base=~/_([\d\.]+)_/
			base.sub!(/_([\d\.]+)_/,'')
			dict[base].push({ver:$1,size:size,name:path})
		end
	end
}
totalsize=0
dict.each_value{|v|
	a=v.sort_by{|e|e[:ver].split('.').map(&:to_i)}
	(a.size-1).times{|i|
		totalsize+=a[i][:size]
		puts 'Removing '+a[i][:name]
		File.unlink(a[i][:name]) unless dry
	}
}
puts 'Saved '+totalsize.to_s+' bytes.'
```

検索用：BOINCをガベージコレクションする(古いバージョンのアプリケーションを削除する)
use- / in- / def- 系のマクロを全部ハイライトする その2



デフォルトではハイライトされない def- 系のマクロ、 in- 系のマクロ、 use- 系のマクロをハイライト。前のバージョンは ` や , が入っているとハイライトが壊れていたので修正。ついでに読みやすくリファクタリング。(一番下)

![Screenshot_from_2014-08-16 22:20:30.png](https://qiita-image-store.s3.amazonaws.com/0/6090/5f74e964-d787-861b-88c1-8421247b1af4.png)
![Screenshot_from_2014-08-16 22:16:22.png](https://qiita-image-store.s3.amazonaws.com/0/6090/8aa38a1a-7939-b254-c69c-ecfe922dd85b.png)

ぐちぐち書いていたのを消した。
gist に変更。
https://gist.github.com/guicho271828/0296e2dfc2541ffee295
Node.jsで、Promise.denodeifyを使ってサクサクプログラミング

# Node.jsにおけるPromise

Node.jsのAPIの多くは、

```
fs.readFile(fileName, function(err, data) {
    if (err) {
      // onError
    }else{
      // onSuccess
    }
})
```

のような形式なので、逐次的に処理を行うとその分だけネストの階層が増えてしまいます。これを解消するために使われるのがPromiseです。上記に対応するコードは以下のようになります。

```js
new Promise(function(onFulfilled, onRejected){
    fs.readFile(fileName, function(err, data) {
        if (err) {
            onRejected(err);
        }else{
            onFulfilled(data);
        }
    })
})
.then(function(data){
        // onSuccess
    }, function(err){
        // onError
    });
```

thenが返す戻り値もPromiseなので、さらにthenをつなげることで逐次処理を実現できます。ここで、thenが返すPromiseの動作は2つの方法で決定されます一つは、onSuccessハンドラ内で、別のPromiseをreturnすることです。この場合、その結果が次のthenに渡されます。もう一つは、onErrorハンドラを省略することで、こうすると、エラー時には次のthenに処理が引き継がれます。

これらの性質を使うことで、逐次的な処理を、ネスト階層を上げずに実現することができます。

# denodeify

ただ、この方法、コード量的には短くなるどころかかえって長くなってしまっています。Node.jsではAPIのコールバックの形式がほとんど同じなので、Promiseの生成処理も毎回同じになるわけですが、それを毎回書くのは冗長です。そこで、Promise.denodeifyの出番です。上記のコードは、

```js
Promise.denodeify(fs.readFile)(fileName)
    .then(function(data){
        // onSuccess
    }, function(err){
        // onError
    });
```

と書き換えられます。denodeifyは関数を戻す関数で、戻り値となる関数は元の関数(fs.readFile)と同じ形式の引数を取って、Promiseを返します。

ただ、これはすべての関数に使えるわけではありません。たとえば、dbがデータベースへの接続を表すオブジェクトだとして、

```js
Promise.denodeify(db.open)()
```

は動作しません。関数呼び出し時にthisが正しく設定されないからです。この場合は、

```js
Promise.denodeify(db.open).call(db)
```

とthisを明示的に指定してあげる必要があります。実は先ほどのfs.readFileの場合も、

```js
Promise.denodeify(fs.readFile).call(fs, fileName)
```

としても動きます。というか、その方が無難です。fs.readFileが内部でthisを使っているかどうかは、コードの中身を見ないと分からないからです。fs.readFileは現状の実装では内部でthisを使っていないので、最初の記述でも動くだけです。denodeifyを使うときは、callを一緒に使うというのを基本パターンとして覚えておくと良いでしょう。

これは通常問題になりませんが、以下のような場合、

```js
var m = collection.find();
return Promise.denodeify(m.toArray).call(m);
```

中間の変数mを置かないといけないのでコードの見通しが悪くなります。これが嫌であれば、以下のようなラッパーを使うのが良いかもしれません。

```js
function promisize(obj, funcName){
    var func = Promise.denodeify(obj[funcName]),
        slice = Array.prototype.slice;
    return function(){
        func.apply(obj, slice.call(arguments));
    }
}
return promisize(db, 'toArray')()
```

# 互換性

こんな便利なdenodeifyですが、大きな注意点があります。それは、Node.jsのライブラリpromise.jsに固有の機能だということです。他の処理系のPromiseでは使えません。ただ、心配はいりません。というのも、denodeifyという名前の通り、この関数が対応しているのは、Node.js形式のコールバックを引数として取る関数だけだからです。なので、予期しない互換性の問題は、それほど頻繁には起きないのではないかと思います。
さくらVPS　スイッチ

#さくらVPS スイッチ

##スイッチの作成

サーバー一覧>ネットワーク>追加

##設定

サーバー一覧>接続設定>eth1
に作成したスイッチを設定

##サーバー側の設定

/etc/sysconfig/network-scripts/ifcfg-eth1

```
DEVICE="eth1"
IPADDR="XXX.XXX.XXX.XXX"
NETMASK="255.255.255.0"
ONBOOT="yes"
TYPE="Ethernet"
IPV6INIT="no"
IPV6_ROUTER="no"
ARPCHECK="no"
```

/etc/sysconfig/network-scripts/ifcfg-eth0

```
ARPCHECK="no" 
```
を追加

##再起動

```bash
# service network restart
```

##確認

```bash
#ifconfig
```

```ifconfig
eth1      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:XXX.XXX.XXX.XXX  Bcast:XXX.XXX.XXX.XXX  Mask:255.255.255.0
          inet6 addr: X::X:X:X:X/X Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:5352 (5.2 KiB)  TX bytes:3928 (3.8 KiB)
```

eth1が追加された
サーバー側とさくらVPSのMACアドレスが一緒か確認する

###確認

```bash
$ping XXX.XXX.XXX.XXX
```

OK
CentOS6でSSL対応HAProxy 1.5.3のrpmを作成する


```bash:SSL対応HAProxyのRPMを作成
rpmdev-setuptree
sudo yum -y install pcre-devel openssl-devel
cd ~/rpmbuild/SOURCES
curl -L -O http://www.haproxy.org/download/1.5/src/haproxy-1.5.3.tar.gz
tar zxf haproxy-1.5.3.tar.gz
cp -p haproxy-1.5.3/examples/haproxy.spec ../SPECS/haproxy153.spec
sed -i 's/USE_PCRE=1 /USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 /' ../SPECS/haproxy153.spec
rpmbuild -bb ../SPECS/haproxy153.spec
```

```bash:HAProxyをインストール
sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/haproxy-1.5.3-1.x86_64.rpm
```
s3cmd、timeoutの設定が s3cmd -helpで見当たらんなと思ったら 設定ファイルに socket_timeoutって項目があったわ

`~/.s3cfg` に `socket_timeout` って項目があった

10分くらい悩んだ…


[s3cmd timeout problems moving large files on S3 (&gt; 250MB) | Suman Srinivasan's Code Blog](http://sumanrs.wordpress.com/2013/03/19/s3cmd-timeout-problems-moving-large-files-on-s3-250mb/)
より引用：
> s3cmd –help doesn’t reveal much; there are no timeout settings in there.

helpにも書いといてほしいですね
PHPのクロージャの数少ない使いどころ

# ①Factoryパターンの代替

```php:呼び出し側

$type = "rakuten"; 
// 他には Yahoo, Amazonなど

// 在庫数を取得する
$arDef = ExampleStockFactory:factory($type);

// 配列内のクロージャは直接呼べないので、１度代入する
$fn = $arDef["fn"];

// 在庫数の取得
$stockNum = $fn();
```

```php:ExampleStockFactory
class ExampleStockFactory {

  public static function factory($type){

    switch( true ){
        case preg_match( "/[正規表現など]/", $type );
        case $type == "rakuten" : // 楽天APIを叩く
          // APIキー
          $apiKey = "secrete api key";

          // クロージャを定義
          $fn = function() use ($apiKey){
            return RakutenApi::getStock($apiKey);
          };
          break;
        case "...." : //others
        default : // 該当なしの場合は、NullObjectで返す
          $fn = function(){ return -1 };
    }

    // 配列形式で付随情報と共に返す
    return array(
      "type" => $type,
      "fn" => $fn
    );
  }
}
```

# なぜクロージャなのか
デザインパターンをご存知の方は、この記述がFactoryパターンとNullObjectパターンの代替である事は、お分かりになると思います。
しかし、

> PHPでわざわざクラス定義ファイルを書くのは面倒

という時に、この書き方をしてみるといいかもしれません。

# PHPにクロージャって必要？？
色々と使ってみたところ、リソース節約したい時に結構使えます。
Pythonでサブプロセスの標準出力を１行ずつ読み込む

# 概要

`subprocess`モジュールを使って子プロセスを作ることはあるかと思いますが，例えばそいつのログを監視するみたいなことをしたくなることがあると思うので，メモ．

# 子プロセス

0.5秒ごとに数字を標準出力します．

```child.py
import time
import sys
i = 0
while True:
   print i
   sys.stdout.flush()
   i += 1
   time.sleep(0.5)
```

ポイントは`flush()`してバッファに溜まったデータを吐き出すところです．

# 親プロセス

子が出力したらその都度出力します．

```parent.py
import subprocess
proc = subprocess.Popen(['python','child.py'],stdout=subprocess.PIPE)

print "ready"
for line in iter(proc.stdout.readline,''):
   print line
```

# 結果

```
ready
1
2
3
4
5
(以下略)
```

子プロセスから読み込む部分はスレッドを作って非同期で読み込んでデータをキューに入れるとかしたら色々できそうです．
Pythonにおけるリフレクション

Pythonで動的にインスタンスを作成したり、メソッドを取得して呼び出したり・・・といった、リフレクションの方法についてまとめ。

## 動的なインスタンス生成
Pythonで文字列などから動的にインスタンスを作成したい際は以下のようにする。
※例として、例外クラス(Exception)のインスタンスを作成してみる。

```py
mod = __import__("exceptions",fromlist=["Exception"])
class_def = getattr(mod,"Exception")
obj = class_def("message") # obj = Exception('message',)
```

先頭の`__import__`は、インポート宣言に該当する(上記の例では`from exceptions import Exception`を行ったのと同じ意味になる。なお、exceptionsは明示的に読み込む必要はない。あくまで例として挙げている)。

このモジュールから`getattr`により該当クラスのクラス定義を取得し、最後はそれを利用してオブジェクトを作成する。

＜参考＞
[How to dynamically load a Python class](http://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class)

## メソッド定義の取得
メソッドも含めたクラスなどの定義の取得には[inspect](http://docs.python.jp/2/library/inspect.html)を利用する。
`inspect.getmembers`によって定義を取得し、`getattr`でオブジェクトからの定義を取得、それを実行するという流れになる。
もちろん、メソッド名にあらかじめあたりがついていれば直接`getattr`を呼び出してよい。

```py
upper_method = filter(lambda f: f[0] == "upper", inspect.getmembers("String",inspect.isroutine))[0]
invoker = getattr("abc",upper_method[0])
invoker() # 'ABC'
```

デコレーターがついているものだけ取りたいなー、というのは当然の希望だが、現在のところ[非常に泥臭い方法](http://stackoverflow.com/questions/5910703/howto-get-all-methods-of-a-python-class-with-given-decorator)しかないようだ(具体的には、ソースコードを読み込み@始まりのものを探す感じになる)。

## プロパティの取得
Publicなプロパティ(メンバ変数)を全部取得したい、という場合は以下のようにする。

```py
attributes = inspect.getmembers(self, lambda a: not(inspect.isroutine(a)))
filter(lambda a: not(a[0].startswith("__")), attributes)
```

`isroutine`に該当しないもの=メンバ変数を抽出し、その名前の先頭が`__`で始まらないもの、を抽出している。
取得したプロパティから値を取得するには、メソッド同様`getattr`を利用する。