OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCVのcv::Matの要素の型、型のバイト数、チャンネル数、バイト列が連続かを取得する

OpenCVにおいてフィルタ系の処理を記述する際には cv::Mat が格納しているデータの型とチャンネル数をチェックする必要がある。

1.1系で主流だった IplImage 構造体の場合はヘッダに十分な記述があり、どのメンバをチェックすればよいかわかりやすかったが、2.4系で主流の cv::Mat クラスはヘッダのコメントが不十分であるため若干わかりにくい（筆者が「わからなかったらヘッダを読め」という人なのである）。

備忘的にまとめておく。

- mat.type() で型とチャンネル数の組み合わせ（CV_8UC3, CV_64FC2など）を得られる。
- mat.depth() で型（CV_8U, CV_64Fなど）を得られる。
- mat.channels() でチャンネル数を得られる。
- mat.isContinuous() でバイト列が連続かどうかを得られる。

以下は cv::Mat から型の情報を取得するサンプルコード。

```cpp
#include <opencv2/core/core.hpp>

#include <iostream>
#include <cassert>

void print_info(const cv::Mat& mat)
{
	using namespace std;

	// 要素の型とチャンネル数の組み合わせ。
	// 紙面の都合により、サンプルで使用する値のみ記述
	cout << "type: " << (
		mat.type() == CV_8UC3 ? "CV_8UC3" :
		mat.type() == CV_16SC1 ? "CV_16SC1" :
		mat.type() == CV_64FC2 ? "CV_64FC2" :
		"other"
		) << endl;

	// 要素の型
	cout << "depth: " << (
		mat.depth() == CV_8U ? "CV_8U" :
		mat.depth() == CV_16S ? "CV_16S" :
		mat.depth() == CV_64F ? "CV_64F" :
		"other"
		) << endl;

	// チャンネル数
	cout << "channels: " << mat.channels() << endl;

	// バイト列が連続しているか
	cout << "continuous: " <<
		(mat.isContinuous() ? "true" : "false")<< endl;
}

void some_filter(const cv::Mat& in, cv::Mat& out)
{
	// フィルタが unsigned char 3チャンネルのみ受け付ける場合のチェック
	// 大抵の場合、チェックが失敗する時は呼び出し側の実装がミスってるので
	// assert()で落ちてしまって良いと思う
	assert(in.type() == CV_8UC3 && "input image must be CV_8UC3");
}

int main(int argc, char* argv[])
{
	using namespace std;

	// unsigned char 3チャンネル
	cout << "print_info(cv::Mat(10,10,CV_8UC3));" << endl;
	print_info(cv::Mat(10,10,CV_8UC3));
	cout << endl;
	
	// signed short 1チャンネル
	cout << "print_info(cv::Mat(10,10,CV_16SC1));" << endl;
	print_info(cv::Mat(10,10,CV_16SC1));
	cout << endl;

	// double 2チャンネル
	cout << "print_info(cv::Mat(10,10,CV_64FC2));" << endl;
	print_info(cv::Mat(10,10,CV_64FC2));
	cout << endl;

	// double 2チャンネルの部分行列
	// ROI(region of interest)として、画像の一部分の矩形領域を処理する場合、
	// バイト列が不連続になる。したがって isContinuous() は false を返す。
	cout << "print_info(cv::Mat(10,10,CV_64FC2)(cv::Rect(2,2,3,3)));" << endl;
	print_info(cv::Mat(10,10,CV_64FC2)(cv::Rect(2,2,3,3)));
	cout << endl;

	return 0;
}
```


実行結果

```shell-session
print_info(cv::Mat(10,10,CV_8UC3));
type: CV_8UC3
depth: CV_8U
channels: 3
continuous: true

print_info(cv::Mat(10,10,CV_16SC1));
type: CV_16SC1
depth: CV_16S
channels: 1
continuous: true

print_info(cv::Mat(10,10,CV_64FC2));
type: CV_64FC2
depth: CV_64F
channels: 2
continuous: true

print_info(cv::Mat(10,10,CV_64FC2)(cv::Rect(2,2,3,3)));
type: CV_64FC2
depth: CV_64F
channels: 2
continuous: false
```
SunspotでReindexしない方法

SunspotはModelを変更すると毎回Reindexしますが、検索に利用しない`attribute`を変更したときにReindexされると、無駄なコストが発生します。
変更を無視して、Reindexしないようにするオプションが用意されています。

```ignore.rb
searchable :ignore_attribute_changes_of => [:favorites_count, :updated_at] do
  text :title
  text :description
end
```

これで`favorites_count`や`updated_at`が変更されてもReindexが行われません。
Android 3.0以降AsyncTaskがsingleThreadな件

AsyncTask使って非同期で処理してるはずなのになぜか遅い...
どうも裏の処理を待ってるっぽいので調べたら

>Starting HONEYCOMB, tasks are back to being executed on a single thread to avoid common application errors caused by parallel execution.
>[Developers:AsyncTask.execute](http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...))

Σ(・ω・ﾉ)ﾉ
という訳でAndroid 3.0以降は同期処理らしい…orz

>If you truly want parallel execution, you can use the executeOnExecutor(Executor, Params...) version of this method with THREAD_POOL_EXECUTOR; however, see commentary there for warnings on its use.
>[Developers:AsyncTask.execute](http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...))

とのことなのでこんな感じで修正。

```java:AsyncTask.java
AsyncTask asyncTask = new AsyncTask();
- asyncTask.execute(request);
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
+   asyncTask.execute(request);
+ } else {
+   asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, request);
+ }
```
画像のファイルタイプをバイナリヘッダで判定する

```
import static org.apache.commons.codec.binary.Hex.encodeHexString;
import static org.apache.commons.io.FileUtils.openInputStream;
import static org.apache.commons.io.IOUtils.closeQuietly;
import static org.apache.commons.io.IOUtils.toByteArray;

public static String getFileHeader(File f) {
    if (f.length() == 0) {
        return null;
    } else {
        byte[] b = new byte[8];
        InputStream in = null;
        try {
            in = openInputStream(f);
            b = toByteArray(in, 8);
        } catch (IOException e) {
            return "";
        } finally {
            closeQuietly(in);
        }
        return encodeHexString(b);
    }
}

public static boolean isImage(File image) {
    if (image == null) {
        return false;
    }
    String fileHeader = getFileHeader(image);
    if (fileHeader == null || fileHeader.isEmpty()) {
        return false;
    }
    fileHeader = fileHeader.toUpperCase();
    if (fileHeader.equals("89504E470D0A1A0A")) { // PNG
        return true;
    } else if (fileHeader.matches("^FFD8.*")) { // JPG
        return true;
    } else if (fileHeader.matches("^474946383961.*") || fileHeader.matches("^474946383761.*")) { // GIF
        return true;
    } else if (fileHeader.matches("^424D.*")) { // BMP
        return true;
    }
    return false;
}
```
L被覆

それなりに大変でした...

採点プログラムVer2を改修し、テトロミノ+ビンゴのテストデータのやりとりができるようにしました。
https://github.com/cielavenir/procon/commit/48bca328a40502f71432d996f6ca00b8c90ca9b1

```cpp
//http://qiita.com/Nabetani/items/7be4bc2a3514bbfbfc15
//http://nabetani.sakura.ne.jp/hena/ord16lcove/
#include <iostream>
#include <string>
#include <set>
#include <cstdlib>
using namespace std;

set<int> split_int(string &str, const char *delim){
	set<int> result;
	int cutAt;
	while( (cutAt = str.find_first_of(delim)) != str.npos ){
		if(cutAt > 0){
			result.insert(strtol(str.substr(0, cutAt).c_str(),NULL,10));
		}
		str = str.substr(cutAt + 1);
	}
	if(str.length() > 0){
		result.insert(strtol(str.c_str(),NULL,10));
	}
	return result;
}

main(){
	string line;
	int i,j,x,y,z,end;
	for(;getline(cin,line);){
		int Mx=0,My=0,mx=9,my=9,r=-1;
		set<int>s=split_int(line,",");
		if(s.size()==1){cout<<3<<endl;continue;}
		set<int>::iterator it=s.begin();
		for(;it!=s.end();it++){
			x=*it/10,y=*it%10;
			if(Mx<x)Mx=x;if(My<y)My=y;
			if(mx>x)mx=x;if(my>y)my=y;
		}
		if(s.find(mx*10+my)==s.end()){
			end=My;
			for(i=mx;i<=Mx;i++){
				for(j=my;j<=end;j++)if(s.find(i*10+j)!=s.end())break;
				end=j-1;
				if(r<(z=(j-my)*(i-mx+1)))r=z;
			}
		}
		if(s.find(Mx*10+my)==s.end()){
			end=My;
			for(i=Mx;i>=mx;i--){
				for(j=my;j<=end;j++)if(s.find(i*10+j)!=s.end())break;
				end=j-1;
				if(r<(z=(j-my)*(Mx-i+1)))r=z;
			}
		}
		if(s.find(mx*10+My)==s.end()){
			end=my;
			for(i=mx;i<=Mx;i++){
				for(j=My;j>=end;j--)if(s.find(i*10+j)!=s.end())break;
				end=j+1;
				if(r<(z=(My-j)*(i-mx+1)))r=z;
			}
		}
		if(s.find(Mx*10+My)==s.end()){
			end=my;
			for(i=Mx;i>=mx;i--){
				for(j=My;j>=end;j--)if(s.find(i*10+j)!=s.end())break;
				end=j+1;
				if(r<(z=(My-j)*(Mx-i+1)))r=z;
			}
		}
		r=(Mx-mx+1)*(My-my+1)-r;
		if(r>99)cout<<"-"<<endl;
		else cout<<r<<endl;
	}
}
```
UITableViewCellの選択色を設定した場合にsubviewが消えてしまう場合の対処法

UITableViewCellの選択色を変える場合はUITableViewCellのカスタムクラスを作成し、`init`内などで以下のような記述をするのが一般的だと思います。

```objc
UIView *selectedBackgroundView = [[UIView alloc] init];
selectedBackgroundView.backgroundColor = [UIColor yellowColor];
self.selectedBackgroundView = selectedBackgroundView;
```

しかしCellのcontentViewに空のView（例えば以下のような縦の罫線を描画するための色付きの矩形）を置いているとき、そのViewが選択時に消えてしまうことがあります。

```objc
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(40, 0, 1, 40)];
v.backgroundColor = [UIColor blackColor]; // ←selectedにしたときに黒い色が消えてしまう
self.vertivalLineView = v;
[self.contentView addSubView:self.verticalLineView];
```

こちらに原因と対処方法がありました。
http://stackoverflow.com/questions/14468449/the-selectedbackgroundview-modifies-the-contentview-subviews

UITableViewCellは選択時にその下層Viewの色を全て透明色に変えてしまうのが原因とのこと。以下のように`setHighlighted:animated`と`setSelected:animated`メソッドをオーバーライドすれば直すことができます。

```objc
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];
    if (highlighted) {
        // subviewの背景色を復元する
        self.verticalLineView.backgroundColor = [UIColor blackColor];
    }
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    if (selected) {
        // subviewの背景色を復元する
        self.verticalLineView.backgroundColor = [UIColor blackColor];
    }
}
```
Auto Layoutは結構理解するの大変だよねメモ


自分がAuto Layoutを使ってみた感じでは、回転なしの基礎的なことを習得してプロジェクトに使えるようになるのに6時間位は使ってしまって、これは勉強するの無駄じゃないのって気もしないでもないので折角なら忘れないようにおさらい。

# Auto Layoutの使いどころ

Auto Layoutは画面サイズによって複数のUIコンポーネントの座標値がそれぞれ微妙に変化する場合に使える。画面デザインによるが、それ以外はAuto Reisizeと自前での座標値計算を行うことでなんとかなる事が多い。

また、回転を考慮する場合もAuto Layoutのほうが楽かもしれない。

### Auto Resizeのできること

Auto Resizeは親Viewからの相対的な位置と大きさの自動的な適用ができる。

例えば

- 画面の下にToolBarを固定することが出来る
- UITableViewCellのなかで画像位置を固定する

など

### Auto Layoutのできること

Auto Layoutは親Viewや同階層のViewからの制約をつけることで位置を変更できる。

例えば

- 画面の下にToolBarを固定することが出来る
- UITableViewCellのなかで画像位置を固定する
- 水平方向や垂直方向にViewをセンタリングできる
- 2つのコンポーネント間の位置制約として<=や>=のような制約もできる


2つのコンポーネント間の位置を動的に配置したい（<=や>=で決めたい）場合はRelationで"Greater Than or Equal"や"Less Than or Equal"を指定する。


# Auto Layoutでハマった時の解決法

## 見直しリスト

- Viewのサイズも制約に与えてみる（frameの値と同じにしてみる）
- 先に固定位置のコンポーネントから制約を与えて石橋を叩きながら進める
- Space Containtで=だけでなく<=や>=を使う時は特にエラーが出やすい
 - 位置情報を決定するための条件がまだ抜けている
 - 全ての条件（サイズや固定値との接続）を見直していくと一気に解決する

## 見直しのための覚書

2つのViewの距離感に<=や>=を使う場合が結構わかりづらい。

例えば、AとBのViewががあっとして、AとBの垂直方向の距離Lを
3.5inchディスプレイならば6ptになり、
4inchディスプレイなら20ptになるようにしたいとき、
Space Containtで6<=L<=20とする（Greater Than Equalが6でLess Than Equal が20）。

このとき、Aのy座標値は制約として固定されていないとBの位置が決められないために6<=L<=20を設定してもAmbiguity（不定）になる。逆にBが決まっている場合ならそれでいいが、Bが決まっていないとAmbiguityになる。決められる部分を決めていくとAmbiguityが無くなるので、そこから動的に変わる部分をいじっていく。

## さらに具体的な例

次の図に例としてタイトルラベル、アーティストラベル、UIImgeView、iTunesで探すボタンと下にToolBarなどがある構成をあげる。

左が4inchで、右が3.5inchで4inchのときは余白をなるべく分散するようにしたい。

![autolayout1.png](https://qiita-image-store.s3.amazonaws.com/0/16400/7b79a23c-571f-3531-4bb5-f4b1ccd98c74.png "autolayout1.png")

ナビゲーションバーとタイトルの間を2<=L<=10のように動的にした時、まずエラーになる。解決するため水平位置をどうするかを決め、それからタイトルとアーティストの距離を決める。

アーティストの位置が固定であればそれで終わりだが、アーティストの位置もUIImageViewの位置との制約があるので同じように6<=L<=20とする。UIImageViewの位置が固定だったら終わりだが...という風に繰り返していくと最後に全てのAmbiguityが消える。



# まだ飲み込めてないこと

- Viewのサイズも制約で大きくしたり小さくしたりできるんだろうか
- placeholderのサイズ指定がどのように効果的なことになるのか
- 回転させるときどうやるのか

# 参考

Apple公式: Auto Layout（PDF）
https://developer.apple.com/jp/devcenter/ios/library/documentation/AutolayoutPG.pdf

Developer.IO 特集カテゴリーXcode 5 / Auto Layout
http://dev.classmethod.jp/referencecat/xcode-5-auto-layout/

iOSアプリを作ってみる (8) - Autolayoutに振り回される その1
http://deutschina.hatenablog.com/entry/2013/09/16/164838
git hookを共有する

.git/hooks/以下に設置するのでどうしたもんかと思って調べてたらsimlinkで設置するのが一般的っぽいけどベストプラクティスがよく分からない。
共有サーバーがあればそこにpre-commitおいて読み込んで実行とかかな？

http://stackoverflow.com/a/427269
http://kokukuma.blogspot.jp/2012/10/git-git.html
http://labs.gree.jp/blog/2011/03/2885/
http://blog.dataich.com/2010/12/05/git-init-template/
encoding/gob のメモ



### メモ

* 主にRPC用のシリアライザ
* 型情報をデータに含む。ただし型情報を出力するのはその型を最初にEncodeしたときのみ。なので、たとえシリアライズ後のデータサイズがわかっていたとしても途中から読み初めることはできない
* 再帰型(treeのような型)もサポートしているが将来のバージョンで変更される可能性がある
* 内部的にはリフレクションをつかっている


### サンプルコード
```
package main

import (
        "encoding/gob"
        "fmt"
)

type Buf struct {
        buf []byte
        pos int
}

func NewBuf() *Buf {
        return &Buf{make([]byte, 0), 0}
}

func (b *Buf) Write(p []byte) (n int, err error) {
        b.buf = append(b.buf, p...)
        n = len(p)
        return
}

func (b *Buf) Read(p []byte) (n int, err error) {
        for n = 0; n < len(p) && b.pos < len(b.buf); {
                p[n] = b.buf[b.pos]
                n++
                b.pos++
        }
        return
}

func main() {
        buf := NewBuf()
        e := gob.NewEncoder(buf)
        e.Encode("asdf")
        e.Encode(1)
        e.Encode(2)

        var s string
        var i int
        var err error
        d := gob.NewDecoder(buf)
        err = d.Decode(&s)
        fmt.Println(s, err)
        err = d.Decode(&i)
        fmt.Println(i, err)
        err = d.Decode(i)
        fmt.Println(i, err)
        err = d.Decode(&i)
        fmt.Println(i, err)
}
```

http://golang.org/pkg/encoding/gob/



### 所感

* Goだけで完結することがわかってるなら簡単につかえて便利だが、
型情報がデータ中のどこに現れるかわからないので、途中からデコードしたりはできない。
* 独自ファイルフォーマットのためのシリアライザとしては使いにくい
capistranoでSOCKS5プロキシを設定する

 * config/deploy/staging.rbあたりで以下のように設定

```rb
require 'net/ssh/proxy/socks5' 

...

set :ssh_options, {
  proxy: Net::SSH::Proxy::SOCKS5.new('socks.server', 1080,
                                     :user => ENV['SOCKS5_USER'],
                                     :password => ENV['SOCKS5_PASSWD']),
  ...
}
```
[2013年] javascriptで外部xmlを同期的に取得してjQueryでパースする

これは無知な私の失敗談です。
知った気でいると足元をすくわれるというか無駄な努力をする羽目になるという備忘録です。

### 非同期で書いた
元の要件としては、とあるXML中にある値が含まれているかどうかを判定する、といったものでした。
そのためjQueryでxmlを取得して使うことを考え、以下のようなメソッドを実装しようとしていました。
※コールバックや判定の処理を省略しています。

```js
function checkXml() {
  var deferred = $.ajax({
      dataType: 'xml',
      url: 'test.xml'
  });
  /* 呼んだ先でコールバックを登録 */
  return deferred;
}
```

### XMLHttpRequestで同期処理に書き直した
ところが実際にはメソッドを呼んだ返り値としてtrue or falseを得たいということになったため、
同期的にxmlを取得する方法を調べてみました。
するとXMLHttpRequestのopenで第三引数にfalseを渡してやれば同期的に実行される、ということがわかりました。
そのため、以下のようにしました。

```js
function checkXml(str) {
  var xmlHttp;
  xmlHttp = new XMLHttpRequest();
  xmlHttp.open("GET", 'test.xml', false);
  xmlHttp.send(null);
  var doc = $.parseXML(xmlHttp.responseText);
  var xml = $(doc);
  var ret = false;
  /* jQueryを使ってstr が含まれるかどうか判定 */
  return ret;
}
```

### XMLHttpRequest.responseXMLを使う
先ほどの例で、xmlHttp.responseTextをjQueryでXMLパースしてからjQueryオブジェクトにしてやればいいやと安易に考えていたのですが、よくよくXMLHttpRequestの仕様を調べてみるとresponseXMLなる便利なプロパティがあることを知って書き直しました。

```js
function checkXml(str) {
  var xmlHttp;
  xmlHttp = new XMLHttpRequest();
  xmlHttp.open("GET", 'test.xml', false);
  xmlHttp.send(null);
  var xml = $(xmlHttp.responseXML);  // わざわざパースしなくてもdocumentが取れる
  var ret = false;
  /* jQueryを使ってstr が含まれるかどうか判定 */
  return ret;
}
```


### 結局jQuery.ajax()を使う
その後 jQuery.ajax() のドキュメントを見ていたら 実は非同期フラグがある、と気が付きました。
そして結局以下のような形になりました。
返却値を取るためにコールバックと判定処理が入る程度でほとんど最初と同じようなものになってしまいました。

```js
function checkXml(str) {
  var xml;
  $.ajax({
      async: false,  // 非同期オプション(デフォルト true)
      dataType: 'xml',
      url: 'test.xml',
      success: function(data) {
         xml = $(data);
      }
  });
   /* jQueryを使ってstr が含まれるかどうか判定 */
  return ret;
}
```

なんとなくネットで見つけたやり方とかを仕様も確認せず使うのは危険だということを改めて思い知りました。
YUIDocのmarkdownとか設定のいろいろ

## markdownを使う

YUIDocは説明部分をマークダウンで記述することができる。

```js
/**
* [see this](http://www.mamoida.com/)
*
* ```
* parseHoge('number',15);
* ``` 
* 
* @method parseHoge
* @param {String} name
* @param {String | Number} value
*/
```

yuidoc.jsonのmarkdownオプションには<a href='https://github.com/chjj/marked' target='_blank'>marked</a>へのオプションを渡すことができる。

GitHub flavored markdownを無効にしたり。

```js:yuidoc.json
"options": {
  "markdown": {
    "gfm" : false
  }
}
```

サニタイズを有効にしたり。

```js:yuidoc.json
"options": {
  "markdown": {
    "sanitize" : true
  }
}
```

## スタンドアロン・サーバ

yuidocはスタンドアロンのサーバがついていて、オプションを付けてコマンドをたたくと起動する。
ポート番号も指定できる。

```bash
yuidoc --server 5000
```

ポート番号5000に立ち上がる。デフォルトは3000。


## テーマを指定する

simpleとdefaultというビルドインテーマがあるので、特にこだわらなければ--themeオプションでどちらかを指定する。(指定しなければdefault)

```
yuidoc --server 5000 --theme simple
```

カスタマイズしたものを使うときは、起動時に--themedirオプションでテーマディレクトリへのパスを渡すか、yuidoc.jsonにパスを記述することでテーマを指定することができる。

テンプレートは<a href='http://handlebarsjs.com/' target='_blank'>Handlebars</a>テンプレートが使用されている。

```js:yuidoc.json
"options": {
  "themedir": "themes/custom/",
}
```

ビルドインテーマは<a href='https://github.com/yui/yuidoc/tree/master/themes' target='_blank'>GitHub</a>で公開されている。カスタムテーマを作るならこれを元にするといい感じ。ドキュメントは<a href='http://yui.github.io/yuidoc/themes/index.html' target='_blank'>こちら</a>。

## Gruntに組み込む

<a href='https://github.com/gruntjs/grunt-contrib-yuidoc' target='_blank'>grunt-contrib-yuidoc</a>を使う

npmでインストール。

```bash
npm install grunt-contrib-yuidoc --save-dev
```

設定はyuidoc.jsonと同じなので、階層が同じであればyuidoc.jsonを読み込むだけでいい。

```js:Gruntfile.js
  yuidoc: {
    build: grunt.file.readJSON('yuidoc.json')
  },
```

おしまい
複数のherokuアカウントを切り替える？

heroku login で切り替えればいいのですが、同じPCから２つ目以降のアカウントでログインしようとしたら、sshkeyの重複問題が起きます。

１．キーペアの作成

ssh-keygen コマンドで別のキーペアを予め作って置けば、heroku login した時にキーペア選択が出来るようになります。

２．pushする前に。。。

ここがカッコ悪いですが、~/.ssh/config ファイルにIdentityFileの設定値があるので、正しいキーペアを設定しておいて下さい。さもないと git push しようとしても間違ったIDで実行しようとしてアクセスエラーになることがあります。

~/.ssh/config ファイルはHost単位に設定するので、同じheroku.comで異なるIDでpushしたい場合どうすりゃいいんだ？

まとめ

heroku loginで切り替える。キーペア設定の切り替えも忘れずに。
RewriteMapとrubyスクリプトで動的にrewrite先を切り替えてみる

RewriteMapとrubyスクリプトを使って最新のディレクトリにrewriteするのを試してみた

## RewriteMapのprgについて
 * [Using RewriteMap - Apache HTTP Server](http://httpd.apache.org/docs/current/rewrite/rewritemap.html)のprg: External Rewriting Programより
 * プログラムについて
  * プログラムはapacheサーバ起動時に一度起動してから標準入出力経由で書き換えエンジンと通信する。
  *  各マッピングでは標準入力で1引数を待って標準出力で1行完結の応答文字列を返すべきである。
  * 対応する値がない場合は4文字の文字列"NULL"を返すべきである。
 * 注意事項
  1. ハングしないようにプログラムをシンプルにする。ハングすると応答を無期限に待つ。
  1. 出力待ちでハングしないためにプログラム内のバッファリングをオフにする。
  1. 起動するプログラムは1つだけなので、大量のリクエストがプロセスを通過したりスクリプトが遅い場合はかなりの速度低下がありえる。

## 試した手順

* EC2のAmazonLinux上で実施
* 最終的なファイル構成

```bash
/var/www/html/
├── rewrite.rb            # rubyスクリプト
├── test01                 # rewrite対象1
│   └── index.html
└── test02                # rewrite対象2
    └── index.html
/etc/httpd/conf.d/
└── test.conf            # apche設定ファイル
```

* apacheインストール

```bash
$ sudo yum install httpd
```

* /var/www/html/rewrite.rb配置

```rb
#!/bin/env ruby
 
# Turn off I/O buffering
$stdin.sync = true
$stdout.sync = true

while $stdin.gets
  $stdout.puts `ls -xdr /var/www/html/*`.split[0]
end
```

* スクリプト準備

```bash
$ sudo chmod 755  /var/www/html/rewrite.rb
$ sudo mkdir /var/www/html/test01
$ echo "test01" | sudo tee -a /var/www/html/test01/index.html

# 動作テスト
$ /var/www/html/rewrite.rb
test
/var/www/html/test01
```

* /etc/httpd/conf.d/test.conf配置

```apache
RewriteEngine on
RewriteLock /tmp/map.lock

<VirtualHost *:80>
  RewriteMap retest prg:/var/www/html/rewrite.rb

  RewriteRule ^/(.*)$ ${retest:0}/$1 [L,QSA]
</VirtualHost>
```

* apache起動

```bash
$ sudo /etc/init.d/httpd start
```

 * サーバのDNSにアクセス
  * => test01が表示
 * 以下のファイルを作成してブラウザをリロード(apacheはreloadしない)
  * => test02が表示

```bash
$ sudo mkdir /var/www/html/test02
$ echo "test02" | sudo tee -a /var/www/html/test02/index.html
```

## はまった
 * RewriteMapをVirtualHostの外に書いて返る値が空
PATHを見やすく一覧表示する

`sed`を使って、区切りで改行してやると見やすい。

```console
$ echo $PATH | sed -e 's/:/\n/g'
```

```console:Before
$ echo $PATH
/home/ginpei/.nvm/v0.9.5/bin:/home/ginpei/.rvm/gems/ruby-2.0.0-p247/bin:/home/ginpei/.rvm/gems/ruby-2.0.0-p247@global/bin:/home/ginpei/.rvm/rubies/ruby-2.0.0-p247/bin:/home/ginpei/.rvm/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
```

```console:After
$ echo $PATH | sed -e 's/:/\n/g'
/home/ginpei/.nvm/v0.9.5/bin
/home/ginpei/.rvm/gems/ruby-2.0.0-p247/bin
/home/ginpei/.rvm/gems/ruby-2.0.0-p247@global/bin
/home/ginpei/.rvm/rubies/ruby-2.0.0-p247/bin
/home/ginpei/.rvm/bin
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
```

`sed`はファイル群を対象に置換処理するのにも使えて大変便利。

参考:

* [Linuxコマンド集 - 【 sed 】 文字列の置換，行の削除を行う：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/)
rails/herokuで環境変数を使ってsecret keyなどを管理する

パスワードやauth, awsのsecret keyなどコードに直接埋め込みたくない情報を管理する方法として環境変数を使うのが良さそうだったので、Mac、herokuでの設定方法を調べたのでまとめます。

ruby/railsで環境変数を参照するには以下のように呼び出します。
`var = ENV['HOGEHOGE']`

#Macでの環境変数の設定
1. $User/.bashrcを開き、以下のように変数を追加。
`export HOGEHOGE="xxxxxxxxxxxxxxxxxxxx"`
HOGEHOGEに変数名、xxxに値が入ります。改行コード<strong>LF</strong>(unix)で保存します。

1. ターミナルで以下のコマンドを入力すると、.bashrcに保存した内容がすぐに反映されます。
`source ~/.bashrc`

1. 環境変数の確認するにはターミナルで以下のコマンドを入力します。
すべての環境変数
`printenv`
特定の環境変数
`echo $HOGEHOGE`

1. ここまで設定したところ、再起動した時に.bashrcの内容がまた反映されなくなっていました。$User/.bash_profileを開き、以下のコマンドを追加します。

```rb
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

.bash_profileはログイン時に読み込まれるファイルです。
ログイン時にのみ設定されればOKならexport〜を最初から.bash_profileに書いてもいいようです。
【追記】ターミナル以外の開発環境から実行する場合は.bash_profileに1の内容を書かないとダメなようです。

#Herokuでの環境変数の設定
設定コマンド
`heroku config:add HOGEHOGE="xxxxxxx"`

登録した環境変数の確認コマンド
`heroku config`

以上です。
Knockout.js 親の親にアクセス

# 目的

Knockout.js で foreach を多重にしたとき、ループの中から親の親にアクセスしたいが、

```js
$parent.$parent.foo
```
では undefined になってエラーがおこる。

# どうやるか

```js
$parents[1].foo
```

http://stackoverflow.com/questions/17069381/access-parents-parent-in-knockout-view
BoostCake の Form::input で Horizontal form を作る方法


Horizontal Form: http://getbootstrap.com/css/#forms-horizontal

割りと手間取った。ドキュメントの方（ http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html ）には上手くまとめられてないし…

```html
<?php echo $this->Form->input("User.data", array(
    'type' => 'text',
    "value" => $user['User']['data'],
    "div" => array('class' => "form-group"),
    "class" => "form-control",
    "wrapInput" => array('tag'=> "div", "class" => "col-sm-10"),
    "label" => array('class' => 'col-sm-2 control-label', 'text' => 'ラベル'),
));?>
```

吐出されるデータ。

```html
<div class="form-group required">
    <label for="UserData" class="col-sm-2 control-label"> ラベル </label>
    <div class="col-sm-10 required">
        <input name="data[User][data]" value="ユーザデータ" type="text" id="UserData" required="required" class="form-control" />
    </div>
</div>
```

追記: class => 'form-control' が抜けてた
動的にメソッドを生成する例

クラス定義をいじることなく、configの情報からメソッドを生成できる

```rb
CONFIG = {name: 'taro', age: '20', lang: 'ruby'}

class Me
  def initialize
    CONFIG.each do |k, v|
      self.class.send(:define_method, k) { v }
    end
  end
end

me = Me.new

puts me.name
puts me.age
puts me.lang
```
Haml のインストールから grunt の設定まで

Haml を使い始めました。とっても語彙力の無い子に見えるかもしれませんが、ヤバいですねこれ！

ということで、インストールから grunt の設定までを書いてみます。

# インストール

```sh
$ sudo gem install haml
```

# <a href="https://github.com/concordusapps/grunt-haml" target="_blank" title="grunt-haml">grunt-haml</a> のインストール

```sh
$ sudo npm install grunt-haml --save-dev
```

# Gruntfile.coffee の設定

```coffeescript::Gruntfile.coffee
module.exports = (grunt) ->
	pkg = grunt.file.readJSON 'package.json'
	grunt.initConfig
		haml:
			one:
				files:
					'index.html': 'src/index.haml'
		watch:
			files: ['src/*.haml']
			tasks: ['haml']

	for t of pkg.devDependencies
		if t.substring(0, 6) is 'grunt-'
			grunt.loadNpmTasks t

	grunt.registerTask 'default', ['haml']
```
設定は、<a href="http://qiita.com/wings1685/items/67446d856a10d890c650" target="_blank" title="Gruntfile.js を CoffeeScript で書いて見やすくする">こちら</a>もご参考までに。
godepを利用して依存ライブラリの管理を行う

# godep

Go言語のライブラリが依存しているパッケージの管理ツールとして、
[godep](https://github.com/kr/godep)というものを見つけた。

試しに使ってみたところ良さそうなのでメモ。

自分の手元では自作のゴミライブラリである[simple-irc-bot-go](https://github.com/futoase/simple-irc-bot-go/)で確認した。

# godepを使った形に自己ライブラリを改める

以下の手順を踏む。

## godepのインストール

```go get github.com/kr/godep``` で終わり。

# 依存パッケージの保存

カレントディレクトリを自分が作成しているライブラリに切り替えて、
```godep save```を実行する。するとカレントディレクトリ以下に```Godeps```ディレクトリが作成される。

```Godeps/Godeps.json``` ファイルに依存しているライブラリの情報が登録される。

```json
{
        "ImportPath": "github.com/futoase/simple-irc-bot-go",
        "GoVersion": "go1.1.2",
        "Deps": [
                {
                        "ImportPath": "code.google.com/p/gomock/gomock",
                        "Rev": "ae48011f41cd01e8e4e77d501502d2e734816da2"
                },
                {
                        "ImportPath": "github.com/ActiveState/tail",
                        "Rev": "36ba8bccb91f119d56866e51ae0dd11ba2731ec2"
                },
                {
                        "ImportPath": "github.com/fluffle/goevent/event",
                        "Rev": "972f9141f4868fad5cd0704bb998b56b18742133"
                },
...
```

## .gitignoreに配布側として不必要なファイルを登録する

```godep save``` を実行すると、```Godeps``` ディレクトリ以下に依存している
パッケージの本体そのものが```_workspace``` ディレクトリにコピーされる。
```godep go build main.go``` という形で goコマンドの前に godep をつけると
```_workspace``` ディレクトリ以下にあるパッケージを使う形になり、
```$GOPATH/src``以下にライブラリをインストールしなくても使える状態になる。

...けど、自作ライブラリを配布するときには必要がないので```.gitignore```に記述する。

```
Godeps/Readme
Godeps/_workspace
```

## git pushを行う

```Godeps/Godeps.json``` ファイルを```git add``` する。

これでライブラリ配布側の準備は終わり。

# godepを使ったライブラリを利用したい場合

godepを使ってパッケージ管理をしているライブラリを
利用し、godepを使って依存しているパッケージをインストールしたい場合は以下の手順を踏む。

## go getする。

使いたいライブラリを```go get``` してインストールする

```
go get github.com/futoase/simple-irc-bot-go
```

## 依存しているライブラリをインストール

ライブラリのパスに移動して(この場合は$GOPATH/src/github.com/futoase/simple-irc-bot-go)、
```godep get```コマンドを実行する。

そうすると、```$GOPATH/src``` 以下に依存ライブラリがインストールされる。
GMGridView 等でスクロールインジケータがビューに潜ってしまう場合の対処法

**※バッドノウハウ。**

UICollectionView が使えない iOS 5系以前で重宝している [GMGridView](https://github.com/gmoledina/GMGridView) だが、スクロールインジケータがセルの裏に潜ってしまうというバグ（？）がある。

**事例**
![bad.png](https://qiita-image-store.s3.amazonaws.com/0/3603/87636221-a1e4-38fc-918f-64bcc702694e.png)

ビューの再利用機構を備えたスクロールビューを独自に作った場合にこのような現象を見かける事がある。

手っ取り早い対処法として、スクロールビューのサブビュー配列からスクロールインジケータ（UIImageView）を見つけ出してそいつに `bringSubviewToFront:` をしてやるという方法がある。
GMGridView の場合は layoutSubviews を少し改造する。

```objc:GMGridView.m
// GMGridView は UIScrollView のサブクラス

@property (weak, nonatomic) UIImageView *vScrollIndicator;
@property (weak, nonatomic) UIImageView *hScrollIndicator;

……

- (void)layoutSubviews 
{
	[super layoutSubviews];
	
	
#if FixGMGridViewsScrollIndicator
	// スクロールインジケータを常に最前面に
	{
		if (!self.vScrollIndicator)
		{
			for (UIView *view in self.subviews)
			{
				// iOS 6以前ではスクロールインジケータの幅が7ptなので、決め打ちしている
				if ([view isKindOfClass:[UIImageView class]] && CGRectGetWidth(view.frame) <= 7)
				{
					self.vScrollIndicator = (UIImageView*)view;
					break;
				}
			}
		}
		
		if (self.vScrollIndicator)
		{
			[self bringSubviewToFront:self.vScrollIndicator];
			self.vScrollIndicator.layer.zPosition = UINT_MAX;
		}
		
		
		if (!self.hScrollIndicator)
		{
			for (UIView *view in self.subviews)
			{
				if ([view isKindOfClass:[UIImageView class]] && CGRectGetHeight(view.frame) <= 7)
				{
					self.hScrollIndicator = (UIImageView*)view;
					break;
				}
			}
		}
		
		if (self.hScrollIndicator)
		{
			[self bringSubviewToFront:self.hScrollIndicator];
			self.hScrollIndicator.layer.zPosition = UINT_MAX;
		}
	}
	// ---
#endif
	
    
    if (_rotationActive) 
    {
        ……
}
```

サブビューに他の UIImageView が含まれる可能性を想定していない、将来的にスクロールインジケータが UIImageView ではなくなる可能性がある、ライブラリの .m を直接書き換えている等とあまり良くはないが、あくまで対症療法として。

（iOS 7 でもスクロールインジケータは UIImageView だった。）

**改造後**
![good.png](https://qiita-image-store.s3.amazonaws.com/0/3603/20c5ff3f-0b79-1ce5-ff15-84682de73116.png)
Pythonのパッケージ管理ツールez_setupの覚書

以下からダウンロード

<del>http://peak.telecommunity.com/dist/ez_setup.py</del>

＜2013.11.28追記＞
現在(2013/11/28)の最新版は以下のようです。（情報ありがとうございます！）
https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

```html
$ sudo python ez_setup.py
```
Migrating from Android BOINC to NativeBoinc

*Japanese procedure is below.*

You might want to register [BAM (BOINC Account Manager)](http://boincstats.com/en/bam/) after using [official Android BOINC client](https://play.google.com/store/apps/details?id=edu.berkeley.boinc) for a while. Unfortunately it isn't supported. But you can switch to [NativeBoinc](https://play.google.com/store/apps/details?id=sk.boinc.nativeboinc) to get BAM access. This article explains how to do that.

- Please note that this is unusual stuff, so you need **root access**.
- Before installing NativeBoinc, you need to uninstall official client, for they cannot coexist. So please backup your data using [TitaniumBackup](https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup).
   - Free version is sufficient. You **don't have to buy** Pro version.
- Install NativeBoinc then install "Native Client" to internal memory.
- Shutdown Native Client immediately.
- Enter your phone using ADB (or Terminal, but I don't recommend) and open **root shell**.
  - cd /data/data/sk.boinc.nativeboinc
  - rm -rf files/boinc
  - tar xzf /sdcard/TitaniumBackup/edu.berkeley.boinc-*.tar.gz # * depends on environment.
  - mv data/data/edu.berkeley.boinc/files/client files/boinc
  - rm -rf data
- Restart Native Client and set the hostname according to Project Website.
- Synchronize with BAM.
- Set hostname to desired name then re-synchronize with BAM.
  - (Now it is safe to move Native Client into SD, optionally)

*Japanese procedure*

- 普通の事ではありませんので、rootが必要です。
- NativeBoincと公式クライアントは共存できないので、先に公式クライアントを削除する必要があります。削除する前に[TitaniumBackup](https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup)でバックアップを取って下さい。無料版で十分です。Pro版を購入する必要はありません。
- NativeBoincをインストールし、"Native Client"を内蔵メモリに導入します。
- Native Clientをすぐに閉じて下さい。
- ADB(もしくはおすすめしませんがターミナル)を開き、rootプロンプトにして、下記を実行します。
  - cd /data/data/sk.boinc.nativeboinc
  - rm -rf files/boinc
  - tar xzf /sdcard/TitaniumBackup/edu.berkeley.boinc-*.tar.gz # *は環境によって変化します
  - mv data/data/edu.berkeley.boinc/files/client files/boinc
  - rm -rf data
- Native Clientを再開し、プロジェクトウェブサイトにあるのと同じホスト名をセットします。
- BAMと同期します。
- ホスト名を任意に変更し、再びBAMと同期すれば移行完了です。
  - (Native ClientをSDカードに移しても安全です)
WordPressのRSSフィードまとめ

よく利用するRSSの形式を一覧でまとめ。
最近良く、ECサイトとの連動で記事のRSSを引いたりするので。基本のRSS2.0。
取得数はカスタマイズしていな限り、
「設定」⇒「表示設定」の「RSS/Atom フィードで表示する最新の投稿数」で決まる。（デフォルトは10件）

## 基本
新着記事を取得

```
http://example.com/?feed=rss2
```

## カテゴリ
指定のカテゴリ記事を取得する方法（カテゴリ番号「1」の記事を取得）

```
http://example.com/?feed=rss2&cat=1
```

複数のカテゴリ記事を取得する方法（カテゴリ番号「1」と「2」の記事を取得）
カンマで区切ります。

```
http://example.com/?feed=rss2&cat=1,2
```

指定のカテゴリ記事を除外する方法（カテゴリ番号「1」の記事を取得しない）
カテゴリ番号の前に「-（マイナス）」記号を入れます。

```
http://example.com/?feed=rss2&cat=-1
```

カテゴリ名で取得する方法。あんまり使わないかも。

```
http://example.com/category/categoryname/?feed=rss2
```

## タグ
指定のタグ設定記事を取得する方法
複数の場合はカテゴリと同様にカンマで区切る。

```
http://example.com/?feed=rss2&tag=windows,linux,mac
```

こちらもカテゴリと同様にタグ名で取得する方法。う～ん、あんまり使わないかも。

```
http://example.com/tag/tagname/?feed=rss2
```

## 記事
指定の記事を取得する方法
記事はカンマで区切って複数取得できないみたい。

```
http://example.com/?feed=rss2&p=1
```

## 検索結果
検索結果で得た記事を取得する方法

```
http://example.com/?feed=rss2&s=美味しい料理
```


GETパラメータを組み合わせて、Feed取得できるみたい。（カテゴリ3番のタグ「windows」とか）

```
http://example.com/?feed=rss2&cat=3&tag=windows
```



必要が出てきたら追記しよー。
nodebrewでnode.js & npmをラクチンインストール + バージョン管理

社内勉強会で発表したスライドを簡易にまとめ直して、すこし追記したもの。

---

## nodebrew

- Perl製node.jsバージョン管理コマンド
- 似たコマンドにnvmとかnaveとか

---

## インストール

```bash:Terminal
$ curl -L git.io/nodebrew | perl - setup
```

もしくは

```bash:Terminal
$ wget -qO - git.io/nodebrew | perl - setup
```

あとはパスを通すだけ。

```bash:.bashrc
nodebrew=$HOME/.nodebrew/current/bin
[ -d "$nodebrew" ] && export PATH=$nodebrew:$PATH
```

---

## install-binary, use

```bash:Terminal
$ nodebrew install-binary 0.10
...
$ nodebrew use 0.10
use v0.10.22
$ node --version
0.10.22
$ npm --version
1.3.14
```

0.10の最新版がインストールされる。あとnpmもついてくる。
`use`で使うバージョンを指定する。

---

## selfupdate

```bash:Terminal
$ nodebrew selfupdate
```

nodebrew本体のアップデートをする。

---

## migrate-package

```bash:Terminal
$ nodebrew use 0.10
$ nodebrew migrate-package 0.8
```

指定したバージョンでグローバルにインストールされていたパッケージを、現在のバージョンで再度インストールし直す。で、いいのかな？

---

## Snow Leopard対応

[Snow Leopardでnodebrewを使ってnode.jsがインストールできなかったのを修正してもらった](http://d.hatena.ne.jp/sasaplus1/20131001/1380637599)

動かなかったので直してもらった。早くMacBook Pro Retina/Mavericks届いてほしい。

---

## バージョンマネージャは要りません

[Node.js初級入門](http://glide.so/geta6/29f41e22a97380ea20fb)

まー、確かにnode.jsの場合はあまり必要ない気がする。特に使うだけなら本当に。
たまに開発版入れて試したいときとかあるので、そういうときは便利なのだけど、そういう機会もあまり多くないし。

`$HOME`以下にインストールされることと、コマンドラインからインストールできるところを気に入ってるのかも。
fabricで鍵認証をセットする

chefとかfabricとか使ってると、いちいちサーバログイン時に認証を聞かれるのが面倒だし、公開鍵認証で行けたらいいなぁ、と思うことがあります。

通常は `ssh-copy-id` を使えばいいと思うんですが、fabricで事前にセットアップしたホスト一覧があるならこういうのも便利かと思うので、作ってみます。

ゴリゴリに書いてますが、一応登録済みキーでないか確認して追加しています。

```py
from fabric.api import *

@task
def copy_id(file="~/.ssh/id_rsa.pub"):
    """Identityをauthorized_keysに追加する"""
    put(file, "/tmp/id.pub")
    try:
        run("if [ ! -d ~/.ssh ]; then mkdir -p ~/.ssh; fi")
        run("if [ ! -f ~/.ssh/authorized_keys ]; then cp /tmp/id.pub ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys; fi")
        run("cat ~/.ssh/authorized_keys /tmp/id.pub | sort -u > /tmp/uniq.authorized_keys")
        run("if [ `cat ~/.ssh/authorized_keys | wc -l` -lt `cat /tmp/uniq.authorized_keys | wc -l` ]; then cat /tmp/id.pub >> ~/.ssh/authorized_keys; fi")
    finally:
        run("rm -f /tmp/id.pub /tmp/uniq.authorized_keys")
```

通常の鍵認証( `~/.ssh/id_rsa.pub` )であれば特に引数は必要ないですが、もし特定の鍵ファイルを使いたい場合も対応できます。ちなみに鍵を作る部分( `ssh-keygen` )は含んでいません。自分で作ってくださいね。

```bash
fab -H target copy_id:file=~/.ssh/custom_id.pub
```
MacOSXでUSBデバイスからの入力を取得する

USBデバイスと直接やり取りするには、IOKitを利用します。今回はマウスからのデータを取得してみます。

おもむろにIOHIDManagerを作成します。

```objc:LowLevelMouse.mm
#import <IOKit/hid/IOHIDManager.h>
void main() {
	IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDManagerOptionNone);
}
```

次に、取得するデバイスの条件を指定します。
デバイスがどのようなプロパティを持っているかは、`$ ioreg`などを利用して調べます。
今回はデバイスの種類（マウス）と、ベンダーID、プロダクトIDを指定してみました。

```objc:LowLevelMouse.mm::main
	NSDictionary* dict = @{
						   @kIOHIDDeviceUsagePageKey: @(kHIDPage_GenericDesktop),
							@kIOHIDDeviceUsageKey: @(kHIDUsage_GD_Mouse),
							@kIOHIDVendorIDKey: @(7119),
							@kIOHIDProductIDKey: @(7),
							};
	IOHIDManagerSetDeviceMatching(hidManager, (CFDictionaryRef)dict);
```

IOHIDManagerOpen(2)で、デバイスを開きます。このとき、第二引数でこのデバイスをシステムから奪うかどうか指定できます。
デバイスを開いたら、入力に対するコールバック関数を登録します。

```objc:LowLevelMouse.mm::main
	IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
	IOReturn rv = IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeSeizeDevice);
	if (rv != kIOReturnSuccess) {
		NSLog(@"Cannot open HIDManager");
	} else {
		IOHIDManagerRegisterInputValueCallback(hidManager, &Handle_IOHIDInputValueCallback, NULL);
	}
```

コールバックの中身はこんな感じです。

```objc:LowLevelMouse.mm
void Handle_IOHIDInputValueCallback(void *context, IOReturn result, void *sender, IOHIDValueRef valueRef) {
	if (result == kIOReturnSuccess) {
		IOHIDElementRef elementRef = IOHIDValueGetElement(valueRef);
		uint32_t usage = IOHIDElementGetUsage(elementRef);
		
		switch (usage) {
			case kHIDUsage_GD_X:
				printf("x: %f\n", IOHIDValueGetScaledValue(valueRef, kIOHIDValueScaleTypePhysical));
				break;
			case kHIDUsage_GD_Y:
				printf("y: %f\n", IOHIDValueGetScaledValue(valueRef, kIOHIDValueScaleTypePhysical));
				break;
			case kHIDUsage_GD_Wheel:
				printf("wheel: %f", IOHIDValueGetScaledValue(valueRef, kIOHIDValueScaleTypePhysical));
				break;
			default:
				printf("usage:%u", usage);
				break;
		}
	}
}
```

まずusageがどんな値を取るか調べます。
一般的なデバイスについては、http://www.usb.org/developers/hidpage#HID_Usage に一覧があります。
今回調べたマウスは、x、y、wheelの3つの値から構成されていました。

値の種類が分かったら、IOHIDValueRefから生のバイト列を取得できます。が、通常はIOHIDValueGetScaledValue(2)を使います。この関数は、バイト列を扱いやすいdoubleに変換してくれます。

```objc:LowLevelMouse.mm::main
	CFRelease(hidManager);
```

終わったら、HIDManagerを解放します。

# 参考資料
- [HID Class Device Interface Guide](https://developer.apple.com/library/mac/documentation/devicedrivers/Conceptual/HID/intro/intro.html)
ターミナルで標準出力をクリップボードにコピーする

社内勉強会で発表したスライドを簡易にまとめ直して、Ubuntuについて追記したもの。

---

OS Xにはpbcopyという、標準出力を受け取ってクリップボードにコピーするコマンドがあります。
使い方はとっても簡単で、

```bash:Terminal
$ echo 'Hello, World!' | pbcopy
```

とするだけで`Hello, World!`がクリップボードにコピーされます。当然、`⌘ + v`で貼付けられます。

---

また、pbpasteという、pbcopyとは逆にクリップボードのデータをターミナルに出力するコマンドがあります。

```bash:Terminal
$ pbpaste
Hello, World!
```

---

Ubuntuなどではpbcopy/pbpasteの代替として、xselが使えます。

```bash:Terminal
$ sudo apt-get install xsel
```

あとは`.bashrc`に以下を書いておくと良いかも。

```bash:.bashrc
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'
```

ただ、pbcopy/pbpasteはmanを見た感じだともっと高度なことが出来るようなので、xselでは完全な代替にはならないかもです。

---

内容が完全に被っている……

http://qiita.com/catatsuy/items/0fd67f706366b2355e8f
IntelliJ IDEAでカーソル行をポイントしてgithub(enterprise含む)を開く

GitHub pluginでできました。

cf. [第27回　バージョン管理 ─GitHub連携とおまけ：Android Studio最速入門～効率的にコーディングするための使い方｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/android_studio/0027#sec2)

## プロジェクトをGit連携する

メニューの VCS からgit repoを連携させます。これをしておくとgit blame (行番号を右クリック -> annotation) ができるのでよい。GitHub とは関係ないかも。

## プロジェクトをGitHub連携する

Preferences -> Version Control -> GitHub で id/password を入力すると連携できる。その際、IntelliJ IDEA自体のマスターパスワードの設定も求められる。

## Open in Browserが使えるようになる

エディタのコンテキストメニューに Open in Browserが！！便利！！
ChefSpecの始め方

# はじめに

Chefのテストは[serverspec - Home](http://serverspec.org/)とか[test-kitchen/test-kitchen](https://github.com/test-kitchen/test-kitchen)とか[Cucumber-chef](http://www.cucumber-chef.org/)とか色々あります。
ただ、これら３つは実際に仮想マシンを動かしてそれに対してクックブックを実行してテストするものです（たぶん）。

nodeの値変えたら設定ファイルの値がちゃんと変わるかとか、not_ifが期待通り動くかとかレシピのロジックのテストをするなら、[ChefSpec](https://github.com/sethvargo/chefspec)が実行が速いし向いてるんじゃないかと思います。

# ChefSpecのインストール

Gemfileに以下を追加
ChefSpec 3.0からknife cookbookコマンドでspecの雛形を作る機能が別gemになったので、knife-specを追加する。（[詳細](https://github.com/sethvargo/chefspec/issues/247)）

```rb:Gemfile
source "https://rubygems.org"

gem "chefspec"
gem "knife-spec"
```

インストール

```
$ bundle install
```

.rspecにデフォルト設定を追加

```:.rspec
--colour
--format documentation
```

# 雛形作成

knife-specを入れると、`knife cookbook create`でテストコードの雛形が一緒に作られます。（ChefSpec 2.xにあった`knife cookbook create_specs`はなくなりました。）

```
$ bundle exec knife cookbook create nginx -o site-cookbooks/
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx
** Creating specs for cookbook: nginx
```

# レシピとテストコードを書く

以下にサンプルが山ほどあるので、参考にしてテストコードを書く。
https://github.com/sethvargo/chefspec/tree/master/examples

例えば、nginxのポート番号を可変にするレシピがあって、ちゃんと渡したポート番号がはまるかのテストだったら、こんな感じ。

```rb:site-cookbooks/nginx/spec/recipes/default_spec.rb
require_relative '../spec_helper'

describe 'nginx::default' do
  let(:chef_run) do
    ChefSpec::Runner.new do |node|
      node.set["nginx"]["port"] = "8080"
    end.converge(described_recipe)
  end

  it "creates /etc/nginx/sites-available/default" do
    expect(chef_run).to create_template("/etc/nginx/sites-available/default")
  end

  it "changes port to 8080 in /etc/nginx/sites-availabel/default" do
    expect(chef_run).to render_file("/etc/nginx/sites-available/default").with_content(/[\s]+listen[\s]+8080;/)
  end
end
```

レシピ

```rb:site-cookbooks/nginx/recipes/default.rb
# nginxのインストール
package "nginx" do
  action :install
end

# /etc/nginx/sites-available/defaultの配置
template "/etc/nginx/sites-available/default" do
  source "nginx/default.erb"
  mode 00644
end
```

こんなノードファイルを渡すイメージ。

```json:nodes/nginx.json
{
  "run_list":[
    "nginx"
  ],
  "nginx":{
    "port":"8080"
  }
}
```

`/etc/nginx/sites-available/default` はご想像に任せます。

# 実行

全部実行

```
$ bundle exec rspec site-cookbooks/nginx/spec/

nginx::default
  creates /etc/nginx/sites-available/default
  changes port to 8080 in /etc/nginx/sites-availabel/default

Finished in 0.02586 seconds
2 examples, 0 failures
```

default_spec.rbの10行目だけ実行

```
$ bundle exec rspec site-cookbooks/nginx/spec/recipes/default_spec.rb:10

nginx::default
  creates /etc/nginx/sites-available/default

Finished in 0.00448 seconds
1 example, 0 failures
```
【JavaScript】キャスト（型変換）に出くわす。

こんにちは。
今日も初級PGの戯言備忘録です。

たとえばこんな形


```js
var baseYear = 1988 ;
var heisei ;
heisei = prompt("現在の年号を書いてください", 23) ;

nowYear = baseYear + heisei ;
window.alert(nowYear) ;
```

これだと残念な結果になります。

「198823」
と表示されてしまうんですね～。

この場合、 heisei が文字列として扱われてしまっているので
連結されてしまうという残念な結果になります。

ということで、この文字列を数値として扱えるようにするのが
キャスト（型変換）になります。

```js
var baseYear = 1988 ;
var heisei ;
heisei = prompt("現在の年号を書いてください", 23) ;

nowYear = baseYear + parseInt(heisei) ;
window.alert(nowYear) ;
```

このparseInt(変数)と書くことで、文字列→数値に変換することができます。

逆に数値→文字列にするには
String( 変数 )　を使います。


僕はPHPで開発していたときキャストを気にしなかった（遠回りしてた？）のですが
Javaの研修を受けたときにかなりキャストについて重要だと教わったので、記しました。

ほかにもキャストに関しては複数あるので、ぜひ見てみてください。

これからも駆け出しPGを宜しくお願いいたします。
JBoss起動時にportが既に使われててエラーになる

1. portを使用しているプロセスを終了する
1. JBossの使用ポートを変更する
1. portをエフェラメルポートから除外する

まず1から。

+ netstat -ao でポートを使用しているプロセスのプロセスIDを確認する
+ タスクマネージャでPIDを表示させ、該当のプロセスを終了する
+ JBossを起動する

次に２。これは実際に試してない。

+ jboss\server\defaul\conf\jboss-service.xmlのattribute name="Port" もしくは "RmiPort"の指定値を変更

３はレジストリとかをいじるらしい。
SRM150 DIV2 250


##問題文概略
一日に与えられる仕事とこなせる仕事の量が決まっている。
仕事を終えられる日数を求めよ。

## 書いたコード

解けなかった。

## 他の参加者のコードを読んで修正した
```
public class WidgetRepairs {

	public int days(int[] arrivals, int numPerDay) {

		int n = arrivals.length;
		int w = 0, ans = 0;
		for (int i = 0; i < n; i++){
			w += arrivals[i];
			if(w > 0) {
				ans++;
				w -= Math.min(w, numPerDay);
			}
		}
		if(w > 0) {
			ans += (int) Math.ceil( ((double) w/ numPerDay));
		}
		return ans;
	}
}


```
## 雑感
仕事の量も配列にいれて管理しようとコードを書いていたら混乱して解けなかった。
単純に一つ変数を用意して、管理すればよかったのか。

仕事量を計算する時の以下の考えかたは覚えておこう。

```
w -= Math.min(w, numPerDay);
```
ntpサーバ自身がntpdateで時刻合わせする方法

不具合調査のため手元のproxmoxサーバーの時刻をちょくちょく変更するのですが、
`ntpdate`で戻そうとするとエラーが出ます。
proxmoxでntpサーバーが動いているからです。

その時はntpサーバーを停止してから実行すると良い。

```bash:
# date -s "2013/11/19 20:01:00"
# date
2013年 11月 19日 火曜日 20:01:03 JST
# ntpdate ntp.ubuntu.com
19 Nov 20:23:05 ntpdate[663922]: the NTP socket is in use, exiting
# /etc/init.d/ntp stop
Stopping NTP server: ntpd.
# ntpdate ntp.ubuntu.com
26 Nov 07:26:18 ntpdate[664000]: step time server 91.189.94.4 offset 558161.549046 sec
# /etc/init.d/ntp start
Starting NTP server: ntpd.
# date
2013年 11月 26日 火曜日 07:26:24 JST
```

もしくは`ntpdate -u ntp.ubuntu.com`で別ポートで時刻合わせすればよい。


```
@reboot /usr/sbin/ntpdate -u ntp.jst.mfeed.ad.jp
```
`rake db:test:prepare`  と `rake test:prepare` の違い

`task 'test:prepare' => 'db:test:prepare'`と定義されてるので、短い方使ってりゃOK！

## 参考

Rails: rake db:test:prepare Vs rake test:prepare - Stack Overflow
http://stackoverflow.com/questions/12156936/rails-rake-dbtestprepare-vs-rake-testprepare
【PHP入門講座】 ちょっとひといき

### [目次に戻る](http://qiita.com/mpyw/items/752e19a578cf7d96fc5f)

# さてと・・・

## わけわからん！

さすがに一気に詰め込み過ぎた気がします。でも実践全くしないで **理論ばっかり学んでても楽しくない** でしょ？というコンセプトのもとにゴリ押ししてみました。

## ゴリ押しして終わりですかそうですか…

そんな残酷なことは出来ないのでQ&A形式で軽く復習します。

# テキトーにQ&A

## 変数とは？

何かを入れておくための **箱** 。自由に見たり中身を入れ替えたり出来る。

## 定数とは？

変数が箱ならこちらは **ショーケース** 。最初に作ったらもうあとは見るだけ。入れられるものも限られている。

## 関数とは？

**自動調理機** 。 材料(引数)を必要個数だけぶち込むと、中で処理した後に完成したものを返して(returnして)くれる。

## 配列とは？

**重箱**。同じ階層の箱には順番が定められている。

## もしかして `$_GET` も配列なの？

それに気付いたあなた、なかなかいいいセンスしてると思いますよ・・・！

## XSS攻撃って何だっけ？

JavaScriptを埋め込む攻撃。`htmlspecialchars` 関数を使えば無効化出来る。但し属性値への割り当ては注意が必要。

## `isset` 関数だけ何でエラー発生しないの？

`isset` は関数ではなく **言語構文** であって、<ins>エラーを抑制しながら存在を確認できる</ins>特別な能力を持っている。

## `is_string` 関数があるってことは他にも `is_***` とかあったり？

全部挙げると・・・

#### 「変数操作」関数に属するもの

`is_array` `is_bool` `is_callable` `is_double` `is_float` `is_int` `is_integer` `is_long` `is_null` `is_numeric` `is_object` `is_real` `is_resource` `is_scalar`

#### 「数学関数」に属するもの

`is_​finite` `is_​infinite`  `is_​nan`

これだけあるみたい。中には中身が全く同じで別名の **エイリアス** というものが大量に紛れているから全部覚える必要なんて全くない。

## 俺がC言語で見たのは `!=` だったと思うんだけど、 `!==` って…？

PHPの **`!=`** 演算子は非常にお節介な子だから絶対に使っちゃダメ！詳しくは後ほど！

# もういいかな・・・

## まだ全然分かんねぇ何とかしてくれ

次の項から丁寧に言語構造をちゃんと押さえていくので安心したまえ
virtualBox内のubuntuをディアルディスプレイしてみる


virtualBox内でubuntuを実行しています。
モニターが２つあるので、折角なので、２画面で表示したくなったので、調べてみました。
設定自体はとても簡単なんですが、ぶっちゃけはまりましたw

##VirtualBoxの設定
まずはVirtualBoxの設定を行う必要があります。

 [設定]⇒ [ディスプレイ]の [ディスプレイ数(N)]を **2** にします。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/25562/c5bcd113-bf02-fda0-b36a-90550e9ad99a.png "スクリーンショット")
 
この状態で VMを起動します。
すると以下の画面のように、２画面表示されます。
※これはMacで試しているので、1画面に表示しています。ご愛嬌。

![スクリーンショット 2013-11-26 12.42.02 AM.png](https://qiita-image-store.s3.amazonaws.com/0/25562/3dac405f-fbee-b1da-2c3f-050df4265f84.png "スクリーンショット 2013-11-26 12.42.02 AM.png")

ご覧の通りですが、
同じ画面が描画されてしまっています。
この状態でなにかウィンドウを立ち上げると両方の画面に同じ
ウィンドウが表示される感じです。

やりたいのはこうじゃなく、
2画面で別々のものを表示できるようにします。

##xrandrコマンドを使う。
このコマンドで、表示を別々にできます。
まずは、そのまま実行します。

```
$ xrandr
Screen 0: minimum 64 x 64, current 617 x 731, maximum 16384 x 16384
VBOX0 connected 617x731+0+0 0mm x 0mm
   617x731        60.0*+
   800x600        60.0  
   640x480        60.0  
VBOX1 connected 588x731+0+0 0mm x 0mm
   588x731        60.0*+
   800x600        60.0  
   640x480        60.0  
```

ここで両方の画面の名前がわかります。
今回の場合、`VBOX0`と`VBOX1`ですね。

で、現在の状態は簡単にいうと、`VBOX0`と`XBOX1`が
重なっている状態なのです。これを分離してやります。


```VBOX1の画面をVBOX0の右に移動させるコマンドです。
$ xrandr --output VBOX1 --right-of VBOX0
```


これでできあがり。
別々の画面として分離することができました。じゃんじゃん。


![スクリーンショット 2013-11-26 12.51.09 AM.png](https://qiita-image-store.s3.amazonaws.com/0/25562/f0e37fc9-1f85-15c0-f0ed-a275658bb592.png "スクリーンショット 2013-11-26 12.51.09 AM.png")
lldbで便利なコマンド


### バックトレースの表示(bt -c 件数)

``` 
(lldb) bt -c 3
* thread #1: tid = 0xf50fa, 0x0022845e hogehoge`CharacterBoxLayer::mShowContents(this=0x16c55e00) + 318 at CharacterBoxLayer.cpp:49, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1
    frame #0: 0x0022845ehogehoge` CharacterBoxLayer::mShowContents(this=0x16c55e00) + 318 at CharacterBoxLayer.cpp:49
    frame #1: 0x002282e9 hogehoge`CharacterBoxLayer::init(this=0x16c55e00) + 57 at CharacterBoxLayer.cpp:32
    frame #2: 0x002288a7 hogehoge`CharacterBoxLayer::create() + 119 at CharacterBoxLayer.cpp:85
``` 

### コマンド履歴(command history -c 件数)
``` 
(lldb)  command history -c 3
   0: p mListView
   1: p winSize
   2: po winSize
``` 

### コマンド実行 (p コマンド)
``` 
(lldb) p mpListView->isRunning()
(bool) $8 = false
``` 

### 次のブレークポイントまで実行 (c)
``` 
(lldb) c
```
Node x MongoDB on MacOS X での設定


nodeが入っていることが前提

```
$ npm  \-v
```

packageのinstall

```
$ npm install
```

## MongoDB

brew確認

```
$ brew update
```

brewでmongoDB install

```
$ brew install mongodb
```

### mongoDB start
server side DB start command

```
$ mongod
```

client side DB start command

```
$ mongo
```

node app start

```
$ node app
```

## Apache

- vhostsにdomainでvertial hostを作成
- ReverseProxyをsetting
- etc/hosts にlocal IP(127.0.0.1)にvhostsに当てたdomainを割り当て
で、nodeとApacheを連携させる。

## Access

ブラウザからvhostsで設定したdomainにアクセス
ローカルP2Pアプリをつくるためにググりまくった結果


##GKSession、GKVoiceChatServiceがiOS7からdeprecated orz...

[こんな感じ](http://www.devx.com/wireless/Article/43756)で紹介されていたGKSessionとGKVoiceChatServiceの組み合わせによる構成も今は推奨されていない。

##iOS7からはMultipeer Connectivity Framework

今まで、GKSession等を使って構成していたP2Pを専用のフレームワークを使ってつくることができる。

まずは、[WWDC 2013 Session Videos](https://developer.apple.com/wwdc/videos/)の``Nearby Networking with Multipeer Connectivity``で概要を確認。
そのあとAppleの公式サンプルアプリ[MultipeerGroupChat](https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MultipeerConnectivityFramework/Introduction/Introduction.html)をビルドして実機確認。

##【簡単】MCAdvertizerAssistantとMCBrowserViewController
クラスメソッドさんのこの記事[「[iOS 7] P2P 通信を手軽に実現する Multipeer Connectivity Framework を使ってみる」](http://dev.classmethod.jp/references/ios-multipeer-apiusage/)に実装例を含めて詳しく書いてある。
MCAdvertizerAssistantとMCBrowserViewControllerが端末を探して、相手と接続するまでの煩わしい部分をよしなにしてくれるので、非常に簡単！

MCBrowserViewControllerはフレームワークでUIまで用意してくれちゃっているので、公式のサンプルアプリも併せるとすごく簡単にわりとリッチなP2Pのチャットアプリまで作れてしまう。

##「デフォルトのピア選択画面はねーよ」という意見もあり、

![Screenshot 2013.11.26 00.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/1722/b90869f5-d516-41c6-1c9a-d7cbcc719312.png "Screenshot 2013.11.26 00.25.24.png")


iOS7のフラットなデザインと相まって、MCBrowserViewControllerで提供してくれるUIは非常にシンプルで洗練されているのですが、いかんせん味気がないため、用意しているデザインなどとフィットしないということが十分にありえます。

※今回はその目的のために色々と調べてきたわけです。

##【カスタマイズ】MCNearbyServiceAdvertiserとMCNearbyServiceBrowserを使ってP2P接続

こんな感じで実際にも需要はありそうなところだと思います。

一番、欲しい形でまとまっていたのがこの方の記事です。
[[iOS 7 SDK] Multipeer Connectivity framework で Peer-to-Peer Connectivity](http://hirooka.pro/?p=3264)

ここで紹介されているテスト接続用のアプリを同じように書いてみて、接続できたので、一応は調べたいところまでは行きました。

##以下、気になる点
- Wi-fiではうまく接続できたが、Bluetoothでは？？になるときがあった。

このあたりドキュメント上、Wi-fiもBluetoothも問題なくいけるはずだけどちょっと心配。

- 接続を許可するところなどもこっちで書かないといけないので、汎用的に使えるように書いておきたい。

- VoiceChat部分の実装。

いいのなんかないかな。
PlayFrameworkとAngularJSでなんか作ってみる

なんかチュートリアルとして定番らしいのでTODO管理アプリでも作ってみよう。

## 完成予想図

![かんせいよそうず](https://qiita-image-store.s3.amazonaws.com/0/31010/12aea46b-fb3c-f4ef-32a9-6576660f0855.png)

## 大雑把なアーキテクチャ

* scalaテンプレートは使わない（サーバーサイドでのレンダリングはしない）
    * ViewはAngularJSのテンプレ
    * PlayのコントローラーはJSONを返すAPI
* DBは付属のH2
    * やる気になったらMySQLに変えてみる
* DBの連携はAnormで
ghc-mod.elのauto-complete.el用ソースを自分で作ってるEmacs使いHaskellerに告ぐ

もう公式であります
ac-modesを有効にするだけで良いようです.
ソースは, ac-source-ghc-mod
直接実行したい場合は (ac-complete-ghc-mod)

以上
ゲーム制作計画1日目！

ゲームの条件
・HTML5
・カジュアルゲーム（誰でもすぐにできるゲーム）

HTMLでゲームを作ったことがないので、
まず使用する言語から決めようと思います。

以前Unityを少しだけ使ったことがあり、作っていてとても楽しかったので、
今回もUnityやそれに類するものが使用出来ればいいなと思います。
調べてみたところ、Unityを使ってHTML5向けにエクスポートするGDKを発見しました。(https://www.frost.io/fwt)
これが使用出来ればベストかなと思います。
紹介していただいたcocos2d-iphone,enchant.jsなどを使用する作戦もあるのですが、
自分がenchant.jsについてはJavaScriptを一度も書いたことがないのが大きなネックです。
cocosについては名前からはじめましてなので、それが敬遠している原因です。
ですが物理エンジンがついてる（使いこなせるかはおいといて）というのが魅力的なので、
時間があればダウンロードとハローワールドくらいやってみれたら良いなと思います。

ゲームの内容についても少し検討をしておきたいと思います。
案をいくつか考えたのですが、中でもボーリングゲームとかがわかりやすくていいのではないかと思います。
もしUnityが使えるのであればつくりやすそうというのもあります。

また、パズルゲームも良いと思うのですが、どうせならばオリジナリティが欲しいので、
そのオリジナリティの部分を模索中です。

ものすごい大まかなくくりですが、
短い時間に遊んで楽しいゲーム、ということなので、
スッキリ・スカッとする系のゲームがいいかなと思っています。

まとめ
・使用するエンジンはできればUnity
→早いうちに動かせるかどうか試してみる。
・ゲームの内容は、ボーリング？パズル？
・スカッとする系