OmniAICreator/Qiita-1.07M huggingface dataset:
bundleしてるgemのディレクトリにcdする

```zsh:~/.zshrc
# bundle cd [gem]
_orig_bundle=$(which bundle)
function bundle() {
    if [ "$1" = "cd" ]; then
        local gem
        if [ "$2" ]; then
            gem=$2
        else
            gem=$($_orig_bundle list | awk '{ print $2 }' | percol)
        fi
        cd $($_orig_bundle show $gem)
    else
        $_orig_bundle $*
    fi
}
```

### 使い方

```zsh
% bundle cd
```

Gemfileがあるディレクトリで実行するとpercolが起動して、選択したgemのディレクトリにcdできる。（pecoを使ってる人は適宜置き換える）

#### デモ

![](http://gifzo.net/l1hDW18T3Y.gif)

### 背景

githubのリポジトリを簡単に取ってこれる[ghq](https://github.com/motemen/ghq)というツールと[gem-src](https://github.com/amatsuda/gem-src)を組み合わせると`bundle install` 時に自動的にghqしてくれて便利！というブログが少し前に話題になった。

便利だなー思って使っていたけどいくつか問題点があって

- bundleしてるバージョンじゃなくてmasterが `ghq get` される
    - 常に最新版を使っている訳ではない
    - （見たい/パッチを当てたい）のはbundleしているバージョンであってmasterじゃない
- bundle installしてるのに、それとは別途gitないしhgのリポジトリを取ってくるのは無駄

というわけでgem-srcには退場いただいて、上記のシェル関数を導入するに至った次第。
Google AnalyticsのトラッキングIDをJavaScriptから取得する

Google AnalyticsのトラッキングIDを取得したくて、いろいろ調べてたらできたのでメモ。いずれのコードもトラッキングIDが配列で返ってくる。

## ga.js

```js
_gat._getTrackers().map(function(tracker) {
  return tracker._getAccount();
});
```

https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApi_gat?hl=ja

## analytics.js

```js
ga.getAll().map(function(tracker) {
  return tracker.get('trackingId');
});
```

https://developers.google.com/analytics/devguides/collection/analyticsjs/method-reference?hl=ja
逆引きgolang

*随時更新*

# Goroutine & Channel

## goroutineの終了を待つ

(http://jxck.hatenablog.com/entry/20130414/1365960707 が良記事です)

1つのgoroutineを待つだけならchannelを使えばok:

```go:main.go
package main

import "log"

func main() {
  ch := make(chan int)
  go func(ch chan int) {
    // do something

    log.Printf("end of goroutine")
    ch <- 1
  }(ch)
  log.Printf("waiting for goroutine")
  <- ch
  log.Printf("end of main")
}
```

複数のgoroutineを待つ場合はsync.WaitGroupを使うらしいです:

```go:main.go
package main

import (
  "log"
  "sync"
)

func main() {
  var wg sync.WaitGroup
  for i := 0; i < 3; i++ {
    wg.Add(1) // goroutineの数だけAdd()
    go func(i int) {
      defer wg.Done() // goroutineを抜けたらDone()
      log.Printf("goroutine: %d", i)
    }(i)
  }
  log.Printf("waiting for goroutines")
  wg.Wait() // ここでblockして待つ
  log.Printf("end of main")
}
```

ちなみに細かいことですが、Done()が呼ばれたそばから終了するので、複数のdeferを呼ぶ場合は、Done()を"最初に"書いておかないと他のdeferが呼ばれる前にプロセスが終了してしまう可能性があります (deferはLIFOで実行されます: http://blog.golang.org/defer-panic-and-recover)

# Build

## debug / release buildを分ける

build tagを使います。(例えば)env packageにenv_debug.goとenv_release.goをつくって、それぞれにbuild条件を書くと、build tagにmatchするファイルだけがbuildされます。

```go:env/env_debug.go
// +build !release

package env

const DEBUG = true
```

```go:env/env_release.go
// +build release

package env

const DEBUG = false
```

このとき、"// +build ..."は1行目に書く必要があって、且つ、1行空行が必要です。で、このpackageをimportして振る舞いを分けます。

```go:main.go
package main

import (
  "github.com/user/app/env"
)

func main() {
  if env.DEBUG {
    // ...
  }
}
```

debug buildは

```
$ go build github.com/user/app
```

で、release buildは

```
$ go build -a -tags=release github.com/user/app
```

になります (build tagを変えただけの場合は、正しく全てのライブラリがbuildし直されない可能性があるので、-aが無難です)。

# その他

## 呼び出し元のfuncを取得する

```
pc, _, _, _ := runtime.Caller(1)
caller_name := runtime.FuncForPC(pc).Name();
```

で出来ます。DEBUGフラグとかがあれば:

```go:debug.go
import (
  "log"
  "runtime"
  "github.com/user/app/env"
)

func Debug(format string, args ...interface{}) {
  if env.DEBUG {
    pc, _, _, _ := runtime.Caller(1)
    caller_name := runtime.FuncForPC(pc).Name();

    log.Printf(caller_name + ": " + format, args...)
  }
}
```

で、デバッグログが出力しやすくなる気がします。

## packageのprefixを省略する

```go:main.go
package main

import (
  "log"
)

func main() {
  log.Printf("hello")
}
```

とかの"log."を省略するには

```
import (
  . "log"
)
```

とすると

```
Printf("hello")
```

と書けます、まめ知識です。同様に、

```
import (
  foo "log"
)
```

とすれば

```
foo.Printf("hello")
```

でアクセスできます。

# See Also, and Reference Sites

* http://d.hatena.ne.jp/taknb2nch/20140414/1397459204
* http://jxck.hatenablog.com/entry/20130414/1365960707
cocos2d-xでクラス名とかつけてログだしたい。。。

## コード

```c:Macro.h
#define CCLOG_D(arg, ...) \
    do { \
        const std::type_info& info = typeid(*arg); \
        cocos2d::log("%s::%s(): %s", info.name(), __FUNCTION__, cocos2d::StringUtils::format(__VA_ARGS__).c_str()); \
    } while (0)
```

## 使い方

```cpp:HelloWorld.cpp

bool HelloWord::init()
{
    if (!Layer::init()) {
        return false;
    }

    CCLOG_D(this, "こんにちは〜");
    CCLOG_D(this, "進捗どうですか？ : %s", "ダメです"); 
}

```

## 結果

> cocos2d: 10HelloWorld::init(): こんにちは〜
> cocos2d: 10HelloWorld::init(): 進捗どうですか？ : ダメです

## 追記：__PRETTY_FUNCTION__版

コメントにて @moriturus さんからご指摘頂きましたので追記。
`__FUNCTION__`つかっておきながら、他に無いか調べるの失念してました。。完全に…

### コード

```cpp:Macro.h

#define CCLOG_D(arg, ...) \
    cocos2d::log(\
        "%s [L:%d]:\n-- %s", \
        __PRETTY_FUNCTION__, \
        __LINE__, \
        cocos2d::StringUtils::format(arg, ##__VA_ARGS__).c_str()\
    )

```

### 結果

> cocos2d: virtual bool HelloWorld::init() [L:41]:
> -- 進捗どうですか？ : ダメです

### 余談その２

大分良い感じ。
`typeid`版でつかってたクラス名取得のためのやつも必要ないし、
ちゃちゃっと調べると`__LINE__`というのも使えそうなので追加

ただこれ、クラス名＋メソッド名だけじゃなくて、
戻り値やら引数なんぞも出力されるのですよね

たとえば

```c

cocos2e::Sprite* createSprite(float x, 
                              float y, 
                              float w, 
                              float h,
                              std::function<void(const char* arg)> callback);

```

的な奴の中で使うと、結果は

> cocos2d: cocos2d::Sprite *HelloWorld::createSprite(float, float, float, float, std::function<void (const char *)>) [L:54]:
> -- create sprite

と出力される。
…長い(汗)
当初の目的は、ログ出力してるのは何処？っていうことなので、
にしては、ちょっといらない情報が。。(悪いわけではないけど
だから、出力フォーマットには改行を入れて、多少整形してみた

とはいえ、`typeid`版よりは個人的には好き＆満足なので、
こっち採用です♪

@moriturus さん、感謝です

## 余談

ログ埋め込んでおいたのは良いものの、
いざってときに、あれ？こいつ誰が吐いてるんだっけ？
ってなることが多く
(だいたい後でまとめてテストするから忘れる(笑))

ってことで、誰が吐いてるかわかりやすくするために
個人的必要に迫られ、定義したもの

`typeid`で判別して出力するようにしてるんだけど…
他に方法ないですかね…
できたら、第一引数は無くしたいんだけど…

これだとandroidの開発みたいに

```java
private static final String TAG = "クラス名";

private void hoge() {
    Log.d(TAG, "hoge");
}
```

と、
クラス名を直で文字列渡す感じで出力できるようにしちゃった方がいいかなぁ。。
とか思うし
でもこれはこれで、毎度毎度TAG宣言するのがアレだけど…
ファイル作成のテンプレートに盛り込んでしまえばいいのか…

なにかオススメの方法があれば、教えてくださいm(_ _)m
PHPで万とか億とかつける感じの

ザックリと作ってみた万とか億とかつけるアレ
桁ごとの変数作るのはなんとなくやだったので…
4の倍数桁になるように左側から0詰めして、四桁毎に配列化してゴニョります。
肥大化してしまったのが難(´・ω:;.:...
一応事故防止のためにPHP_INT_MAXは超えないようにしてます
表示用に早々そんな桁数使うこたー無いはずなので…
主に金額用だから国家予算超えちゃうし笑

```php:roundnumber.php
	public static $roundNumbers = array('', '万', '億', '兆', '京', '垓', '杼');

	public static function toRoundNumberFormat($amount, $options = array()) {
		$defaultOptions = array(
			'useThousand' => true,
			'unit' => ''
		);
		$options = array_merge($defaultOptions, $options);

		if (empty($amount) || !is_numeric($amount) || $amount > PHP_INT_MAX) {
			return 0 . $options['unit'];
		}

		if (!ctype_digit((string)$amount)) {
			$amount = floor($amount);
		}

		$characters = mb_strlen($amount);
		$restCharacters = $characters % 4;
		if ($restCharacters > 0) {
			$pad = $characters;
			while ($pad % 4 !== 0) {
				$pad++;
			}
			$amount = str_pad($amount, $pad, '0', STR_PAD_LEFT);
		}

		$spritAmout = str_split($amount, 4);

		$count = count($spritAmout);
		$roundNumbers = array();
		for ($i = 1; $i <= $count; $i++) {
			$roundNumbers[$i] = self::$roundNumbers[$i];
		}

		$result = 0;
		if (!empty($roundNumbers)) {
			$tmpResult = array();
			$spritAmout = array_reverse($spritAmout);
			foreach ($spritAmout as $k => $v) {
				$number = intval($v);
				$roundNumber = (isset($roundNumbers[$k])) ? $roundNumbers[$k] : '';
				if ($k == 0) {
					if ($options['useThousand'] === true && $v !== '0000') {
						$tmpResult[] = $number;
					}
					continue;
				}
				if ($v !== '0000') {
						$tmpResult[] = $number . $roundNumber;
				}
			}
			$result = implode('', array_reverse($tmpResult));
			if (empty($result)) {
				$result = 0;
			}
		}
		return $result . $options['unit'];
	}

```
`bundle exec rails`とか`bin/rails`とか打ちたくない

```
$ brew install direnv
$ cd /path/to/rails_project
$ vim .envrc
```

```.envrc
export PATH=$PWD/bin:$PATH
```

```
$ direnv allow
direnv: loading .envrc
direnv: export ~PATH
$ which rails
/path/to/rails_project/bin/rails
```
CakePHPのバリデーションのつけ方メモ

```php:Model
<?php

class Post extends AppModel{
	
	public $validate = array(
		'title' => array(
			'rule' => 'notEmpty'
			//'allowEmpty' => false
		),
		'body' => array(
			'rule' => 'notEmpty'
			//'allowEmpty' => false
		)
	);
	
	/*
	public $validate = array(
		'name' => array(
			'rule' => array('between',0,10),
			'required' => true,
			'allowEmpty' => false,
			'message' => '10文字以内で必ず入力して下さい'
		),
		'email' => array(
			'rule' => 'email',
			'required' => true,
			'allowEmpty' => false,
			'message' => 'メールアドレスの形式で必ず入力して下さい'
		),
		'password' => array(
			'rule' => 'alphaNumeric',
			'required' => true,
			'allowEmpty' => false,
			'message' => '必ず入力して下さい'
		)
	);
	*/
}
```
bash/zsh のヒストリを peco で便利にする

[centos,bash環境でpecoを導入してコマンド履歴を便利にするまで。](http://qiita.com/fortkle/items/52c1077a7963cb01c596) をやってみて、大変便利だったのですが、
以下の点について気になったため、少し手を入れました。

* Mac 環境（おそらく、*BSDなども）では、 ``tac`` コマンドが存在しない
    * ``tail -r`` を使うのがベタな手ですが、ヒストリ番号を使って ``sort -k1,1nr`` することで環境依存を少なくしてみました
* ヒストリは重複を含めてすべて残しておく派なのですが、 peco から選ぶときは重複をなくしたい
    * Perl でフィルタすることにしました

以下が自分のカスタマイズ後です

```bash:~/.bashrc
peco-select-history() {
    declare l=$(HISTTIMEFORMAT= history | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
}
bind -x '"\C-r": peco-select-history'
```
### 追記

zsh 版

```zsh:~/.zshrc
peco-select-history() {
    BUFFER=$(history 1 | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\*?\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$LBUFFER")
    CURSOR=${#BUFFER}
    zle reset-prompt
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```
[Swift] 乱数取得でキャストにハマったのでメモ(arc4random)

#問題

乱数取得で剰余(%)を使用したときにハマったのでメモを残します。

```Swift
func getRandomNumber(cnt:Int) -> Int{
    var result:Int
    result = arc4random() % cnt
    return result
}
```
arc4randomを使っている行で以下のエラーが発生します。
Could not find an overload for '%' that  accepts the supplied arguments

オーバーロードが見つからない？なんでしょう。。
%でエラーになっているので、剰余に問題がありそう、というところまでは解ります。

#失敗： キャストしてみた
```swift
func getRandomNumber(cnt:Int) -> Int{
    var result:Int
    result = Int(arc4random() % cnt)
    return result
}

```
剰余（余りを算出）しようとしたときに小数点を利用する型に変換されるのかなと思い、
キャストしてみましたが以下エラーが発生。
Could not find an overload for 'Init' that  accepts the supplied arguments

今度は Initです。どこかの初期化でエラーになっているんでしょうが詳細解りません。

# 気付き
```swift

func getRandomNumber(cnt:Int) -> Int{
    var result:Int
    result = Int(arc4random() % 20)
    return result
}
```

除数に数値をベタ書きするとエラーになりません。
どうやら除数の型が問題のようです。

# 失敗： 除数の型を浮動小数点型にしてみる
```swift
func getRandomNumber(cnt:Int) -> Int{
    var result:Int
    result = Int(arc4random() % Double(cnt))
    return result
}
```

エラーが解消しません。。。

# 正解：符号なし整数
```Swift
func getRandomNumber(cnt:Int) -> Int{
    var result:Int
    result = Int(arc4random() % UInt32(cnt))
    return result
}

```

なんとUInt32で解消。
~~剰余に使う除数は、符号なし整数を使うようです。~~


# 感想

~~Swiftの型推論に注目が集まり、柔軟なイメージでしたが、
今回、堅い一面を見ました。~~

2014.07.07 追記
arc4randomの戻り値がUInt32だったのでそれに合わせる必要がありました。

ただ、関数の戻り値確認方法が解らず。
いちおう、一応以下で確認できました。

```Swift

    var hoge = arc4random
    if hoge is UInt32 {

    }
    
```

if文のところで以下のエラーが出ます。
'is' hoge is always true


@Ushio@githubさん ありがとうございました。
ExpandableListViewで確実にスクロール位置を設定する方法


# 概要
ExpandableListViewでGroupを選択時にsetSelectionFromTopでスクロール位置を設定する。
この際、Galaxy S2(Android4.0.4)では設定した位置にスクロールされたがGalaxy J(Android4.3)ではY位置が0の位置に来てしまう

# 解決法
View.post(Runnable action)でスクロール位置を設定する

```
final ExpandableListView expandableListView = (ExpandableListView)findViewById(id);
expandableListView.post(new Runnable()
{
    @Override
    public void run()
    {
        expandableListView.setSelectionFromTop(position, y);
    }
}).start;
```

バージョン毎によるsetSelectionFromTopの設定タイミングは分からないが、post()でメッセージキューを設定することにより、ExpandableListViewの描画処理が終わった後にsetSelectionFromTopをするとこにより確実にスクロール位置を設定することが出来る。

# 参考
## AndroidのHandlerとは何か？
http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html
unityでマウスイベントを取得する

unityのマウスイベント一覧


```lang:C#

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {

    // マウスボタンが押された時にコールされる
    void OnMouseDown() {
        print("MouseDown!");
    }

    // マウスボタンを離した時にコールされる
    void OnMouseUp() {
        print("MouseUp!");
    }

    // マウスカーソルが対象オブジェクトから退出した時にコールされる
    void OnMouseExit() {
        print("MouseExit!");
    }

    // マウスカーソルが対象オブジェクトに進入した時にコールされる
    void OnMouseEnter() {
        print("MouseEnter!");
    }

    // マウスカーソルが対象オブジェクトに重なっている間コールされ続ける
    void OnMouseOver() {
        print("MouseOver!");
    }

    // マウスボタンが押された状態でマウスを移動させてる間コールされ続ける
    void OnMouseDrag() {
        print("MouseDrag!");
    }
```
CakePHPをインストールするときのApacheの設定


```
$ sudo vim /etc/httpd/conf/httpd.conf
```

以下の箇所がコメントになっていないか確認

```
LoadModule rewrite_module modules/mod_rewrite.so
```

httpd.confの行末に追記（vimで末尾「shift+G」 ⇔ 先頭「gg」）

```
<Directory "/var/www/html/CakePHPのフォルダ">
    AllowOverride All
</Directory>

```

apacheの再起動

```
$ sudo service httpd restart
```
例えば、pecoをビルドしない

pecoが浸透し始めてる。すばらしい！でも同時に「pecoをビルドしようと思ったらgoが入っていなかった…」というポストもちらほら見かけるようになった。

qiitaに書いてある記事も結構goをインストールしてコンパイルするところから触れているものが多い。

これらが「ついでだからgoをインストールしよう」という意図なのか「pecoはgoがないとインストールできない」と思ってるからなのかわからないのでこの記事を書くことにした。

# pecoを使うだけならgoをインストール必要する必要はない

*pecoの開発版を使いたいのでは無い限り、go本体をインストールする必要はありません。go getする必要もありません*

# リリースファイルをインストールする

[READMEにもあるように](https://github.com/peco/peco#installation)pecoには[リリース版のファイル群](https://github.com/peco/peco/releases)があります。この中から使いたいバージョンのリリースを探してファイルを解凍し、pecoのバイナリを/usr/local/binなどに配置して実行権限を付与してやれば終了です。

例：

* [linux 64bit](https://github.com/peco/peco/releases/download/v0.2.0/peco_linux_amd64.tar.gz)
* [windows 64bit](https://github.com/peco/peco/releases/download/v0.2.0/peco_windows_amd64.zip)
* [OS X (darwin) 64bit](https://github.com/peco/peco/releases/download/v0.2.0/peco_darwin_amd64.zip)

# OS X: homebrewを使う

OS X上であれば homebrewを使うのが一番簡単です。現時点ではTapとして登録してありますので以下のようにtapを指定してからのインストールとなります。

```
$ brew tap peco/peco
$ brew install peco
```

**追記** 2015年2月某日に pecoが本家homebrewにとりこまれたので上記tapは必要なくなりました！ 本家のほうが追従が遅いとか、なんらかの理由がある場合を考慮してtapは残しますが、今後は以下だけでpecoをhomebrewからインストールできるはずです：

```
$ brew install peco
```

# バイナリ版を使う上での注意

0.1.11以前ではOS X版等でクロスコンパイル対応に一部問題があったため設定ファイルが読み込まれない問題がありましたので、0.1.11かそれ以降をお使いください。


# というわけでバイナリ版がおすすめです

というわけでpecoを使いたいだけの場合、goをインストールする必要はありません。そもそもpercolのかわりにgo実装であるpecoを書いたのも「pythonとか設定せずに単体のバイナリが欲しい！」と思ったからでした。そういうわけでpecoではバイナリファイルを配布していますので、開発版を使いたい理由が無い限りはそちらからインストールしてください。
ksnctf q3 Crawling Chaos

http://ksnctf.sweetduet.info/problem/3
這い寄る混沌。
## やったこと（ネタバレ）
htmlのソースコードを見るとスクリプトが難読JavaScriptで書かれてる。
どう見ても[この記事](http://d.hatena.ne.jp/kusano_k/20120421/1335006525)の内容っぽい。
とりあえず全角文字は見づらいので半角文字に直す。
それと、+や,あたりで区切ってみるとなんか長い文字を作ってるぽかったのでconsole.logを仕込んでエンコードされた文字列を取得。
後はデコードして出てきたコードに合致する文字列を計算して終わり。
Windows7でPoderosaの設定が保存されない

管理者権限でコマンドプロンプトを起動

poderosaを解凍したディレクトリにcdする

以下のコマンドを実行

```
echo. >options.conf
cacls options.conf /e /g Users:C
echo. >ssh_known_host
cacls ssh_known_hosts /e /g Users:C
```

コマンドの内容は不明だがなおった
ファイル／ディレクトリを検索して、peco って cd するやつ 2

[ファイルを検索して、peco って cd するやつ - Qiita](http://qiita.com/yungsang/items/37b548e7a12be28cf01e)
`mdfind` でなくても、`find` でも -maxdepth を指定すれば性能が出ることがわかったので、改良版を作りました。

```
peco-find-cd() {
  local FILENAME="$1"
  local MAXDEPTH="${2:-3}"
  local BASE_DIR="${3:-`pwd`}"

  if [ -z "$FILENAME" ] ; then
    echo "Usage: peco-find-cd <FILENAME> [<MAXDEPTH> [<BASE_DIR>]]" >&2
    return 1
  fi

  local DIR=$(find ${BASE_DIR} -maxdepth ${MAXDEPTH} -name ${FILENAME} | peco | head -n 1)

  if [ -n "$DIR" ] ; then
    DIR=${DIR%/*}
    echo "pushd \"$DIR\""
    pushd "$DIR"
  fi
}

peco-git-cd() {
  peco-find-cd ".git" "$@"
}

peco-docker-cd() {
  peco-find-cd "Dockerfile" "$@"
}

peco-vagrant-cd() {
  peco-find-cd "Vagrantfile" "$@"
}

peco-go-cd() {
  peco-find-cd ".git" 5 "$GOPATH"
}
```

これで、最後の例のように go のソースに簡単に行けるようになりました。
docker-assemblerというものを作った

先日はDocker meetupでLTをさせていただきましたが、そのLTのために作った小さなツールを紹介します。
ちなみにスライドはこちら。
https://speakerdeck.com/ymatsuwitter/docker-flow-at-gunosy

## docker-assemblerとは

[docker-assembler](https://github.com/y-matsuwitter/docker-assembler)

簡単にいうと複数のDockerfileを組み合わせて一つのDockerfileをビルドするためのツールです。

幾つものDockerfileを作っていると、例えばどのイメージにも似たようなパッケージ（nginxなりtd-agentなり）をインストールする場面に出くわします。
ChefやAnsibleなどであればレシピ単位などで分割することで再利用を測りますが、（自分の知る限り）現状のDockerfileではinclude構文が存在しません。

※一応議論としては存在するようです。
[please add INCLUDE <file> to dockerfile build so we can build more complex images #735](https://github.com/dotcloud/docker/issues/735)

今回のツールはDockerfileのFROM部分をビルド時に上書きすることでとりあえず細かい単位でのビルドとそれを組み合わせたイメージを生成するものになります。

## 使い方
### install

@deeeetさんのcli-initを利用していますのでとりあえず`go get`してください。

```
$ go get github.com/y-matsuwitter/docker-assembler
```

### 初期化

```
$ docker-assembler create <your project name>
```

これで指定した名前のディレクトリが生成されその中にビルドなどに用いる設定ファイルが設置されます。

### Dockerfileの追加

```
$ cd <your project dir>
$ docker-assembler add <sub dockerfile name>
```

上記で指定した名前のディレクトリがプロジェクト内に生成され、Dockerfileの雛形が設置されます。
こちらは普段通りのDockerfileとして書いていただければ問題ありません。また、`ADD`などで必要なファイル群はそのDockerfileと同じサブディレクトリ内に設置してください。

### ビルド

```
$ cd <your project dir>
$ docker-assembler build <image name> <sub dockerfile names>...
```

上記で、指定したサブディレクトリ内のDockerfileを順次つなげてビルドし、image nameで指定したイメージが生成されます。

## 最後に
一晩で適当に作ったツールなので問題だらけかと思われます。
適宜Issueを発行してもらえれば改善いたしますのでよろしくお願い致します。
iOSのWebviewのキャッシュはどこにいくのだろう


## 検証端末

* iOS 7
* iPhone 4S

## Cache.dbの中をみる

WebviewのディスクキャッシュはどうやらCache.dbというファイルに記録されている模様である．そこでiFuxBoxで取り出してみて解析してみた．

iFunBoxで該当アプリ以下のLibrary/CachesをMac上に取り出す．
Caches/バンドルID/Cache.dbにsqliteのDBファイルがあるので，sqliteで開く．

```
% sqlite3 Cache.db
```

とりあえず，テーブル一覧を見てみる．

```
sqlite> .tables
cfurl_cache_blob_data       cfurl_cache_response
cfurl_cache_receiver_data   cfurl_cache_schema_version
```

次はスキーマを見てみる．

```
sqlite> .schema cfurl_cache_response
CREATE TABLE cfurl_cache_response(entry_ID INTEGER PRIMARY KEY
AUTOINCREMENT UNIQUE,                                     version
INTEGER, hash_value INTEGER, storage_policy INTEGER, request_key TEXT
UNIQUE,                                     time_stamp NOT NULL
DEFAULT CURRENT_TIMESTAMP, partition TEXT);
CREATE INDEX request_key_index ON cfurl_cache_response(request_key);
CREATE INDEX time_stamp_index ON cfurl_cache_response(time_stamp);
```

ほうほう．

他のテーブルのスキーマを調べたところ，こんな感じになっていた．
一部，勘だったり，わからないところもあった．

### cfurl_cache_responseテーブル

* entry_ID: キャッシュのID
* version: わからない（キャッシュのバージョン?)
* hash_value: たぶん，レスポンスのハッシュ値
* storage_policy: わからない
* request_key: リクエストのURL
* time_stamp: タイムスタンプ
* partition: わからない

### cfurl_cache_blob_dataテーブル
* entry_ID: キャッシュのID
* response_object: レスポンスヘッダ?(BLOB)，plist形式
* request_object: リクエストヘッダ?(BLOB), plist形式
* user_info: わからない

### cfurl_cache_receiver_dataテーブル
* entry_ID: キャッシュのID
* isDataOnFS: 1:ファイルとして保存，0: receiver_dataに保存
* receiver_data:
  isDataOnFS が0の場合は受け取ったデータのBLOB,
  1の場合はファイルとして保存されている場合のファイル名（Library/Caches/バンドルID/fsCachedData以下にある）


## キャッシュされたファイルを取り出す

上記のようなスキーマになっているので，ファイルを取り出すのは簡単だ．

まずは`cfurl_cache_response`テーブルから，それっぽいURLを検索して，entry_IDを絞る．
今回は`1x50.png`という画像を検索してみた．

```
sqlite> select * from cfurl_cache_response where request_key like '%/1x50.png';
108|0|3915446248|0|http://xxxxx/img/1x50.png|2014-07-06 14:24:26|
```

`entry_ID`が`108`なので，`cfurl_cache_receiver_data`を検索してみる．

```
sqlite> select entry_ID, isDataOnFS, hex(receiver_data) from cfurl_cache_receiver_data where entry_ID=108;
108|0|89504E470D0A1A0A0000000D4948445200000001000000320802000000129926DD0000001649444154789C626A68686062606018EA18100000FFFF51AF01E5F024F2350000000049454E44AE426082
```

このファイルは小さいので，ファイルとして書き出されずに直接DBに突っ込まれている．BLOBのまま出力しても化けるだけなので，hexで16進で表示させている．

ちなみに，`isDataOnFS`が1の時は，`Library/Caches/バンドルID/fsCachedData`以下に，ファイルとして保存される．そして，ファイル名は`receiver_data`に入っている．

```
sqlite> select * from cfurl_cache_receiver_data where isDataOnFS=1 limit 1;
140|1|327B2D66-B3E5-428D-B3EB-30FFA815875B
```

この場合は`327B2D66-B3E5-428D-B3EB-30FFA815875B`という名前で保存されている．

```
% file fsCachedData/327B2D66-B3E5-428D-B3EB-30FFA815875B
fsCachedData/327B2D66-B3E5-428D-B3EB-30FFA815875B: PNG image data, 1634 x 2224, 8-bit/color RGBA, non-interlaced
```

ちなみに，保存されていたのは，この画像．でかい．

![327B2D66-B3E5-428D-B3EB-30FFA815875B.png](https://qiita-image-store.s3.amazonaws.com/0/14952/1f957012-66be-f601-93d3-590b645cfdeb.png "327B2D66-B3E5-428D-B3EB-30FFA815875B.png")
Vagrant仮想マシン上のMySQLに接続


Sequel ProやMySQLWorkbenchなどのツールからの接続設定になります。
MySQLWorkbenchを使用して説明します。

# MySQLWorkbenchについて
データベースアーキテクト、開発者、DBAのための統合ビジュアルツールです。MySQL Workbenchは、データモデリング、SQL開発、およびサーバー設定、ユーザー管理、バックアップなどの包括的な管理ツールを提供します。

# ダウンロード
[MySQL公式サイト]からダウンロードできます。

[MySQL公式サイト]:http://dev.mysql.com/downloads/workbench/

Downloadボタン押下後の画面は「No thanks, just start my download.」を選択すればログインなしでダウンロードできます。

![kobito.1404661362.249306.png](https://qiita-image-store.s3.amazonaws.com/0/40866/37b52950-611a-e727-c570-a8174fe28412.png "kobito.1404661362.249306.png")

# 接続設定
![kobito.1404661535.705556.png](https://qiita-image-store.s3.amazonaws.com/0/40866/c965d005-d219-369b-53af-0c874631101f.png "kobito.1404661535.705556.png")

| パラメータ | 設定値 |
|--------|--------|
|SSH Hostname        |127.0.0.1:2222        |
|SSH Username        |vagrant        |
|SSH Password        |vagrant        |
|MySQL Hostname        |localhost        |
|MySQL Server Port        |3306        |
|Username        |root        |
|Password        |設定したパスワード        |

## リンク
[Vagrant初期設定](http://qiita.com/moscowmule2240/items/c5b9d8e261af5737ef5a)
[自分で作成したcookbookをVagrantで適用する](http://qiita.com/moscowmule2240/items/897189a0df144925442c)
[VagrantでCentOS外部レポジトリの追加](http://qiita.com/moscowmule2240/items/bf9bb3e0828e2986ce75)
[Vagrant仮想マシン上にMySQL5.5インストール](http://qiita.com/moscowmule2240/items/5d1efc2deb89c6219fd5)
[Vagrant仮想マシン上のMySQLに接続](http://qiita.com/moscowmule2240/items/88889195dc51948279fd)
[Vagrant仮想マシン上にredis2.8.12インストール](http://qiita.com/moscowmule2240/items/82cdf61a4168462f6644)
PlantUML を便利に使うための3つの Tips

## はじめに

### PlantUML について
PlantUML は Java でできており、独自の記法で書いたテキストファイルから UML の図をさまざまな形式に出力してくれる素敵なツールです。
**テキストなので Git や SVN 等で管理できてかなり幸せになれます！**

### PlantUML の基礎を学ぶのに役立ったサイト
* http://plantuml.sourceforge.net/
* http://yohshiy.blog.fc2.com/blog-entry-152.html
* http://shuzo-kino.hateblo.jp/entry/2013/10/02/000040

### 本記事の概要
インストールや基本的な使い方等は、上記で紹介したサイトで分かりやすく説明されていますので、本記事では PlantUML を実際のお仕事(受託系)でシーケンス図をつくる想定で、さらに便利に使うための3つの Tips を紹介しようと思います。


## Tips1. インクルード
PlantUML にはインクルード機能 `!include` が備わってますのでヘッダー、フッターや共通設定を別ファイルに切り出すことにより共通部分を一元管理することができます。

```
!include inc/sd_settings.pu
```


## Tips2. 定数
`!define` を使って定数を設定できるので、プロジェクト名などを共通設定ファイルで定義できて便利です。

```
!define _PROJECT_CODE_ SampleProject
```


## Tips3. スキン設定
PlantUML は割と細かい単位でスキン設定を行うことができます。
スキン設定は便利になる Tips ではないのですが、デフォルトのスキン設定がなぜか赤みがかっていて、個人的に落ち着いたトーンに変更したかったので Tips3 として挙げました。

### 例:ノートの背景色を指定する

```
skinparam noteBackgroundColor #ffffcc
```

### デフォルトのスキンイメージ
![PlantUMLデフォルトスキン](https://qiita-image-store.s3.amazonaws.com/0/23043/9f21f57c-f02d-ae04-8161-cf9f07eade26.png)

### 変更後のスキンイメージ
![PlantUMLカスタムスキン](https://qiita-image-store.s3.amazonaws.com/0/23043/769d564d-7c04-4d02-c9fc-2ace6e275f40.png)


## 最後に

最後に上記 Tips 3つを利用したサンプルを、実際のお仕事で使うイメージで紹介します。

```:src/project_sd_sample.pu
@startuml ../out/project_sd_sample.png
!include inc/sd_settings.pu
!define _TITLE_ _PROJECT_CODE_ 商品詳細 シーケンス図
!define _LAST_MODIFIED_ 2014-07-07
!define _VERSION_ 0.1.1
!include inc/sd_layout.pu

actor "ユーザー" as user

box "アプリケーション" #e9ffe9
  participant "Application" as app
  database    "<u>DataBase" as db
end box

box "外部サービス" #d4e1f5
  participant "API" as external_api
end box

user -> app : 商品詳細(GET /items/:id)
activate app
    app -> external_api : 商品情報取得API実行
    activate external_api
        app <-- external_api : JSONレスポンス
    deactivate external_api

    note right of app
        メモを書くこともできる
    end note

    alt 商品情報が存在しない時
        user <-- app : 404エラー画面を表示
    end

    user <-- app : 商品詳細画面を表示
deactivate app

@enduml
```

```:src/inc/sd_settings.pu
/' 定数 '/
!define _PROJECT_CODE_ SampleProject

/' スキン設定 '/
skinparam sequenceActorBorderColor #666666
skinparam sequenceActorBackgroundColor #ffe4e1
skinparam sequenceParticipantBorderColor #999999
skinparam sequenceParticipantBackgroundColor #ffe4e1
skinparam sequenceArrowColor #666666
skinparam sequenceLifeLineBorderColor #999999
skinparam sequenceBoxBorderColor #666666
skinparam noteBackgroundColor #ffffcc
skinparam noteBorderColor #999999

/' 共通設定 '/
hide footbox
autonumber
```

```:src/inc/sd_layout.pu
right header LastModified: <b>_LAST_MODIFIED_</b>　Version: <b>_VERSION_</b>　<img:./assets/1pac_logo_color.png>　
title <size:20> _TITLE_ \n<img:http://placehold.it/640x1/ffffff/ffffff&text=+>

right footer
<b>1PAC. INC.</b>　
　
endfooter
```

### ディレクトリ構成
```
.
├── out/
│   └── project_sd_sample.png
└── src/
    ├── assets/
    │   └── 1pac_logo_color.png
    ├── inc/
    │   ├── sd_layout.pu
    │   └── sd_settings.pu
    └── project_sd_sample.pu

4 directories, 5 files
```

### 出力されたシーケンス図
![シーケンス図出力イメージ](https://qiita-image-store.s3.amazonaws.com/0/23043/11a91016-d95b-29a3-b237-5d035ed3fdd0.png)
仮引数リストが空の場合

# 前フリ

先日、 C の未定義の挙動に関する質問記事がありました。

http://qiita.com/DQNEO/items/d28788265199fb8f62e9

C で未定義とされている挙動はかなりたくさんあり、特に不正なメモリアクセスにかかわる部分はコンパイル時に捕捉できないことも多いです。

しかし、そういった C の性質上どうしようもない **未定義** とは別に奇妙な方法でエラー検出をすりぬけるものがあります。

# 原理

関数宣言で仮引数リストの中身が空であった場合には、その関数の呼出し時の型をチェックしないというルールがあります。 つまり、定義とは異なる型・個数の値を渡して関数を呼出してもコンパイルエラーになりません。 ですが、もちろん実行時にどんなことが起こるかわかりません。

# 例

```c
#include <stdio.h>

void foo();

int main(void) {
  foo("foo", "bar", 123);
  foo(456);
  foo();
  return 0;
}

void foo(int x) {
  printf("%d\n", x);
}
```

# 補足

この奇妙な性質は歴史的経緯で意図的に設けられた **穴** です。
明らかに不用意なコードを誘発する不恰好な仕様です。

将来の仕様で廃止される予定になっており、仕様 (JIS X3010:2003) にはこうあります。

> 6.11.6 **関数宣言子**	空の括弧を伴う関数宣言子 (関数原型形式の仮引数型並びではない。)の使用は，廃止予定事項とする。

ちなみに C\++ では仮引数リストが空の場合は引数を受け取らない関数であるものとして扱われます。 つまり、 `void foo(void);` というように宣言したのと全く同じになるので、型チェックをしないなんてことはありません。 C\++ が C の上位互換ではない箇所のひとつです。
Vagrant仮想マシン上にMySQL5.5インストール


# MySQLインストール

## Berkshelf
Berkshelfファイルにcookbookを指定します。

```Berkshelf
source "https://api.berkshelf.com"

cookbook 'mysql'
```

## cookbookダウンロード
cookbooksディレクトリが存在するとダウンロード出来ないので、削除してダウンロードします。

```
rm -fr cookbooks
/opt/chef/embedded/bin/berks vendor cookbooks
```

## Vagrantfile
Vagrantfileへrecipeとattributesを追加します。

```Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "mysql"

    chef.json = {
      mysql: {
        version: "5.5",
        server_root_password: "",
      },
    }
  end
```

# MySQL conf
character-setをutf8にする設定を追加します。

## cookbookの作成
mysql-confという名前でcookbookを作ります。

```
knife cookbook create mysql-conf -o site-cookbooks/
```

### recipeの作成
site-cookbooks/mysql-conf/recipes/default.rbを編集します。
ここに実行する内容を記述します。

* cookbook内のファイルのコピー
* mysqldサービスの再起動

```Ruby:default.rb
cookbook_file "/etc/mysql/conf.d/character-set.cnf" do
  source "character-set.cnf"
  owner "mysql"
  group "mysql"
  mode "755"
end

cookbook_file "/etc/mysql/conf.d/engine.cnf" do
  source "engine.cnf"
  owner "mysql"
  group "mysql"
  mode "755"
end

service 'mysqld' do
  action [:restart, ]
end
```

### コピーファイルの作成
site-cookbooks/mysql-conf/files/default配下にファイルを置きます。

```character-set.cnf
[mysqld]
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8
```

```engine.cnf
[mysqld]
default-storage-engine = InnoDB
```

### recipeに追加
Vagrantfileにrecipeを追加します。

```Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "mysql::server"
    chef.add_recipe "mysql-conf"
  end
```

## 起動
```
vagrant up
```

## リンク
[Vagrant初期設定](http://qiita.com/moscowmule2240/items/c5b9d8e261af5737ef5a)
[自分で作成したcookbookをVagrantで適用する](http://qiita.com/moscowmule2240/items/897189a0df144925442c)
[VagrantでCentOS外部レポジトリの追加](http://qiita.com/moscowmule2240/items/bf9bb3e0828e2986ce75)
[Vagrant仮想マシン上にMySQL5.5インストール](http://qiita.com/moscowmule2240/items/5d1efc2deb89c6219fd5)
[Vagrant仮想マシン上のMySQLに接続](http://qiita.com/moscowmule2240/items/88889195dc51948279fd)
[Vagrant仮想マシン上にredis2.8.12インストール](http://qiita.com/moscowmule2240/items/82cdf61a4168462f6644)
PHPでexecを走らせると日本語だけ消える


#概要
新入社員として色々お仕事を手伝わせて頂いている中、頭には学校の研究があるどうしようもないクズですごめんなさい。
入社して３ヶ月経って自宅サーバなどが整いつつあるので、その時にハマった事について少し書きます。
今回は「PHPでexecを走らせると日本語だけ消える」件についてです。

#原因
単純な話、CentOSを英語圏のロケール設定でインストールするとapacheやphpなど様々なアプリケーションが英語圏の設定になってしまい、日本語を扱う場合は宣言しないとダメです。
特にPHPのexecを使う場合、PHPのシェル関数「escapeshellcmd」「escapeshellarg」を使うと想いますが、これはphp.iniの他に「/etc/sysconfig/httpd」に「HTTPD_LANG=ja_JP.utf8」の記述が必要です。
設定がされていない場合、マルチバイト文字は切り捨てられます。

##変更点

```bash:/etc/sysconfig/httpd

# Configuration file for the httpd service.

#
# The default processing model (MPM) is the process-based
# 'prefork' model.  A thread-based model, 'worker', is also
# available, but does not work with some modules (such as PHP).
# The service must be stopped before changing this variable.
#
#HTTPD=/usr/sbin/httpd.worker

#
# To pass additional options (for instance, -D definitions) to the
# httpd binary at startup, set OPTIONS here.
#
#OPTIONS=

#
# By default, the httpd process is started in the C locale; to
# change the locale in which the server runs, the HTTPD_LANG
# variable can be set.
#
#HTTPD_LANG=C
HTTPD_LANG=ja_JP.utf8 # 日本語対応

#
# By default, the httpd process will create the file
# /var/run/httpd/httpd.pid in which it records its process
# identification number when it starts.  If an alternate location is
# specified in httpd.conf (via the PidFile directive), the new
# location needs to be reported in the PIDFILE.
#
#PIDFILE=/var/run/httpd/httpd.pid
```
centos,bash環境でpecoを導入してコマンド履歴を便利にするまで。

最近TLでpercolやpecoが盛り上がっているので試してみました。

# 追記
lestrratさん、syohexさんからご指摘いただいた通り、そもそもpecoを使いたいだけの場合はGoのインストールは必要ありませんでした。
（percolだとpythonとかの設定が色々と面倒だった、という背景を忘れていました...）

詳細は下記記事を参考にしてみてください。

>例えば、pecoをビルドしない
>http://qiita.com/lestrrat/items/de8565fe32864f76ac19

## pecoの導入

```
## 例
$ cd
$ mkdir -p local/src
$ cd local/src
$ wget https://github.com/peco/peco/releases/download/v0.1.12/peco_linux_amd64.tar.gz
$ tar -C /home/*****/local -xzf peco_linux_amd64.tar.gz
```
あとはパスを設定すればOKです。


# 追記前(残しておきます)
## goのインストール
そもそもgoが入ってなかった...ので、ローカルにgoをインストールします。

```
## おもむろにディレクトリ作成
$ cd
$ mkdir -p local/src
$ cd local/src
$ wget http://golang.org/dl/go1.3.linux-amd64.tar.gz
$ tar -C /home/*****/local -xzf go1.3.linux-amd64.tar.gz
```

## golangの環境設定
パスを設定します。適当に.bashrcとか開いてコピペ。

```
export GOROOT="$HOME/local/go"
export GOPATH="$HOME/local/mygo"
export PATH="$PATH:$GOPATH/bin:$GOROOT/bin"
```

```
## 設定再読み込み
source .bashrc

# 確認
which go
```

## pecoのインストール
goがインストールできたので次はpecoをインストールします。

```
$ go get github.com/peco/peco/cmd/peco

# 確認
which peco
```

# pecoの設定
こちらの記事を参考に、.bashrcとかに書き込んでいきます。
>bashでもpercolをイイ感じに使う方法
>http://d.hatena.ne.jp/hirose31/20140612/1402559889

最初なので、コマンド履歴を便利にします。
下記ソースを.bashrcに適当にコピペ。

```
# settings for peco
_replace_by_history() {
    local l=$(HISTTIMEFORMAT= history | tac | sed -e 's/^\s*[0-9]*    \+\s\+//' | peco --query "$READLINE_LINE")
    READLINE_LINE="$l"
    READLINE_POINT=${#l}
}
bind -x '"\C-r": _replace_by_history'
bind    '"\C-xr": reverse-search-history'
```
```
# 再読み込み
$ source .bashrc
```
これであとはいつものようにC-rでインクリメンタルサーチすれば
あら不思議、pecoが使えます。

# おまけ（vimっぽいキーバインド）
動的にフィルターをかけていって選択するときに、
vimっぽくjとかkでラインを移動できたら便利なので、そのようにキーバインドを変えます。

```
# おもむろにディレクトリを作る
$ cd
$ mkdir -p .config/peco/

# 移動してvimを開く
$ cd .config/peco
$ vim config.json
```
下記内容をコピペすればOK。

```
{
    "keymap": {
        "C-j": "peco.SelectDown",
        "C-k": "peco.SelectUp",
        "C-f": "peco.ScrollPageDown",
        "C-b": "peco.ScrollPageUp"
    }
}
```

# 参考サイト
流行りのpecoをcentosにインストールしました
http://blog.10rane.com/installed-the-peco-to-centos/
bashでもpercolをイイ感じに使う方法
http://d.hatena.ne.jp/hirose31/20140612/1402559889
例えば、pecoをビルドしない
http://qiita.com/lestrrat/items/de8565fe32864f76ac19
VagrantでCentOS外部レポジトリの追加


## Berkshelf
Berkshelfファイルにcookbookを指定します。

```Berkshelf
source "https://api.berkshelf.com"

cookbook 'yum'
cookbook 'yum-epel'
cookbook 'yum-ius'
```

## cookbookダウンロード
cookbooksディレクトリが存在するとダウンロード出来ないので、削除してダウンロードします。

```
rm -fr cookbooks
/opt/chef/embedded/bin/berks vendor cookbooks
```

## Vagrantfile
Vagrantfileへrecipeを追加します。

```Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "yum"
    chef.add_recipe "yum-epel"
    chef.add_recipe "yum-ius"
  end
```

## 起動
```
vagrant up
```

## リンク
[Vagrant初期設定](http://qiita.com/moscowmule2240/items/c5b9d8e261af5737ef5a)
[自分で作成したcookbookをVagrantで適用する](http://qiita.com/moscowmule2240/items/897189a0df144925442c)
[VagrantでCentOS外部レポジトリの追加](http://qiita.com/moscowmule2240/items/bf9bb3e0828e2986ce75)
[Vagrant仮想マシン上にMySQL5.5インストール](http://qiita.com/moscowmule2240/items/5d1efc2deb89c6219fd5)
[Vagrant仮想マシン上のMySQLに接続](http://qiita.com/moscowmule2240/items/88889195dc51948279fd)
[Vagrant仮想マシン上にredis2.8.12インストール](http://qiita.com/moscowmule2240/items/82cdf61a4168462f6644)
vc2010でラムダ式を使ったスレッド

c++11だとラムダ式を使ったスレッドはstd::threadを使用して簡単にできるっぽいけど、
Visual C++ 2010では、まだ、実装されていないみたいで_beginthreadexを利用しないとスレッドは使えないみたい。
で、ググルと真っ先に出てきたのが[ここ](http://stackoverflow.com/questions/18367641/use-createthread-with-a-lambda)で、サンプルとして下記が書かれていた。

```cpp
unsigned int id;
HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex(0, 0,
    [](void* pData) -> unsigned int {
        return 0;
    }, pThreadData, 0, &id));
```

しかし、上記リンクに書かれている通り、これは2012からしか動作しないらしく2010では動作しない。
仕方がないので、間にランチャー関数を挟むことで実現。あんまり、ラムダ式の恩恵を受けてる感じがしない結果に・・・(´・ω・｀)

```cpp
unsigned int __stdcall threadLauncher(void *data)
{
	std::unique_ptr<std::function<void()>> thread(reinterpret_cast<std::function<void()>*>(data));
	(*thread.get())();
	_endthreadex(0);
	return 0;
}

int main()
{
	void *thread= reinterpret_cast<void*>(new std::function<void()>([]()
	{
		std::cout << "スレッドテスト" << std::endl;
	}));

	HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex(nullptr, 0, &threadLauncher, thread, 0, nullptr));

	WaitForSingleObject(hThread, INFINITE);
	CloseHandle(hThread);

	return 0;
}
```

メモリ管理とかの面から考えてめんどくさいし、もっとうまい方法があるのかも
Unity アニメーションを設定してみる


Mecanim じゃないほうのアニメーションの設定手順のメモ。

**新規アニメーションファイルを作成**
![create-anime-file.png](https://qiita-image-store.s3.amazonaws.com/0/20773/47ad28d5-6d15-dbde-d1d5-9a93f2b14fd5.png "create-anime-file.png")

**コンポーネントを追加**
![add-component.png](https://qiita-image-store.s3.amazonaws.com/0/20773/755c350b-30fa-949e-f0a0-fd1648d208cd.png "add-component.png")
アニメーションさせたい GameObject のインスペクタからコンポーネントを追加

**アニメーションコンポーネントを設定**
![set-animation.png](https://qiita-image-store.s3.amazonaws.com/0/20773/5e259b94-f98c-2367-5a2a-0f0f52f90f86.png "set-animation.png")

Animation を設定し、個数を1以上にすると Animations に追加できるようになる。

**アニメーションをつける**
![animation.png](https://qiita-image-store.s3.amazonaws.com/0/20773/0df4e176-b752-8f71-3504-2ea4ee6693e2.png "animation.png")
Animation タブからアニメーションをつけていく。
複数のアニメーションがある場合は、ドロップダウンから選ぶ。
また、カーブがなにもなければ [Add Curve] で操作したいプロパティを追加していく。

キーフレームは k で打つことができる。
LightTable + JewelでJuliaの環境を作る


JuliaTokyoでも[Andre Pemmelaar](https://twitter.com/QuantixResearch)さんから、Juliaを使うならこのエディタ！という話のあったLightTableを導入してみました。

Cmd+Enterで実行結果が確認できるので、感覚的にはRubyで言うところのPry付きのエディターという感じですね。

![スクリーンショット 2014-07-06 23.08.03.png](https://qiita-image-store.s3.amazonaws.com/0/11143/ef91f53b-577b-a0e4-756b-3881ac26c608.png "スクリーンショット 2014-07-06 23.08.03.png")

# 導入


予め、Julia v0.3系を入れておく。

[公式サイト](http://www.lighttable.com/)へ行き、ダウンロードしてくる

`Ctrl+Space`で補助画面がでてくるので、そこで"show plugin"と入れると適当に補完されて、Plugin managerを起動できる。


Juliaプラグイン入れたら、LTの再起動をして、[Jewelの説明](https://github.com/one-more-minute/Jupiter-LT/wiki/Installing-%26-Upgrading)を読みながら設定していく。

(ついでにEmacsバインドにもしておいた)

といっても、大事なところとしては、補助画面から選べる"user behavior"に下記の設定を加えること。

```
     :app [(:lt.objs.style/set-skin "dark")
           (:lt.objs.langs.julia/julia-path "/path/to/julia")]
```

これで、再起動をすれば大丈夫。

![スクリーンショット 2014-07-06 23.18.18.png](https://qiita-image-store.s3.amazonaws.com/0/11143/fbd45ee1-c29f-77dd-81c8-49387651323b.png "スクリーンショット 2014-07-06 23.18.18.png")

このように補完されたり、Cmd+Enterで評価したりできる。
go 1.3 と Windows における日本語ファイル名 

何も考えずに書いてみる

```readdirs.go
package main

import "fmt"
import "os"

func main(){
	fd , err := os.Open(".")
	if err != nil {
		fmt.Fprintln(os.Stderr,err)
		return
	}
	nodes , err := fd.Readdir(-1)
	if err != nil {
		fmt.Fprintln(os.Stderr,err)
		return
	}
	fd.Close()
	for _,n := range nodes {
		fmt.Println(n.Name())
	}
}
```

えーと、「☑」は SJIS にはなかったよね？

![スクリーンショット 2014-07-06 22.55.39.png](https://qiita-image-store.s3.amazonaws.com/0/29454/08d35e4c-3269-7481-ae1d-4f4073715755.png)

goだと、特に迷うことはない。Python も同様に早く Windows の Unicode API に対応してほしいです。(それとも、Python 3 とかだと対応してるのかな？)
自分で作成したcookbookをVagrantで適用する


# 自分でcookbookを作る
自分で作ったcookbookはsite-cookbooksに置きます。

## yum -y updateを実行するcookbookを作る

### cookbookの作成
yum-updateという名前でcookbookを作ります。

```
knife cookbook create yum-update -o site-cookbooks/
```

### recipeの作成
site-cookbooks/yum-update/recipes/default.rbを編集します。
ここに実行する内容を記述します。

```Ruby:default.rb
yum_package "yum-fastestmirror" do
  action :install
end

execute "yum-update" do
  user "root"
  command "yum -y update"
  action :run
end
```

### recipeに追加
Vagrantfileにrecipeを追加します。

```Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
    chef.add_recipe "yum-update"
  end
```

### vagrant起動
```
vagrant up
```

## リンク
[Vagrant初期設定](http://qiita.com/moscowmule2240/items/c5b9d8e261af5737ef5a)
[自分で作成したcookbookをVagrantで適用する](http://qiita.com/moscowmule2240/items/897189a0df144925442c)
[VagrantでCentOS外部レポジトリの追加](http://qiita.com/moscowmule2240/items/bf9bb3e0828e2986ce75)
[Vagrant仮想マシン上にMySQL5.5インストール](http://qiita.com/moscowmule2240/items/5d1efc2deb89c6219fd5)
[Vagrant仮想マシン上のMySQLに接続](http://qiita.com/moscowmule2240/items/88889195dc51948279fd)
[Vagrant仮想マシン上にredis2.8.12インストール](http://qiita.com/moscowmule2240/items/82cdf61a4168462f6644)
bundle installでrmagic 2.13.2がinstallできなくって困った時


	$ sudo /usr/bin/xcode-select  -switch /Applications/Xcode.app/Contents/Developer
	$ sudo PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.8.7-0/lib/pkgconfig gem install rmagick

参考サイト
http://lowreal.net/2013/05/27/3
VBAのクラスモジュール上でInterfaceを利用する

# 概要
退っ引きならない事情などでVBAを利用せざるを得ない場合に、
堅くプログラミングするためにInterfaceを使う方法です。

# やり方
まずはインターフェースを作成します（クラスモジュールとして作成します）
VBAでおなじみのハンガリアン記法でも問題ありませんが、通常クラスと区別するためにC#の命名規則に従ってインターフェース名を **I** 始まりとしています。

```vbnet:ISample.cls
Class ISample
    Public Sub MustImplement()
        '処理は書けません
    End Sub
End Class
```

作成したインターフェースを実装側のクラスでImplementsします。

```vbnet:clsSample.cls
Implements ISample

Class clsSample
    'インターフェースのクラス名 + _ がプレフィックスとしてつきます
    Public Sub ISample_MustImplement()
        'do stuff
    End Sub
End Class
```

呼び出すときは当然ながら?インターフェース名付きの名前で呼びます。

```vbnet:basSample.bas
Dim objSample As clsSample

Set objSample = New clsSample
'ダサいですね
Call objSample.ISample_MustImplement()
```

## まとめ
1. クラスモジュールとしてインターフェースを作成する
2. 継承する側のクラスモジュールにImplements構文を利用する
3. インターフェースのクラス名をFunction/Sub/Propertyの名前にプレフィックスで付与する
Windows コマンドラインからS3へファイルを送るバッチファイル

バッチファイルへのドラッグ＆ドロップでS3にフォルダをコピーすることができるので便利。

# dgsync.exe の入手方法
* DragonDisk( http://www.dragondisk.com/ )のサイトから、Command line sync tool 1.31 for Windows をダウンロード。

* ダウンロードページ。
http://www.dragondisk.com/download-amazon-s3-client-google-cloud-storage-client.html

# バッチファイル
適当なテキストエディタで下記をコピペして、拡張子を".bat"にして保存。

```bat:dg_upload.bat
@echo off

rem パラメータチェック
IF "%1"=="" GOTO ParaErrorNone
IF NOT EXIST %1\ GOTO ParaErrorFile

SETLOCAL
rem 環境変数を設定
SET DGTOOLS_ACCESS_KEY=xxxxxx
SET DGTOOLS_SECRET_KEY=yyyyyyyyy
SET ENDPOINT=ep.host.local
SET S3PLACE=s3://bucket/folder/

"%~dp0dgsync.exe" -v --ssl --endpoint %ENDPOINT% %1 %S3PLACE%
ENDLOCAL
pause
exit

:ParaErrorNone
echo パラメータがありません。フォルダを指定してください。
pause
exit

:ParaErrorFile
echo パラメータが不正です。フォルダを指定してください。
pause
exit
```

#注意事項
* 上記のバッチファイル内の設定ではフォルダは同期されます。
* 一時的なフォルダ保存に向いてます。
XVimで:runコマンドを実行しても何もおこらない時の対処法

XVimを使っているときに:runを実行してもbuildだけ行われて実際にRunされないという問題に長いこと悩まされていた。

システムのショートカット機能を使用してRunのショートカットをF5に割り当てていたのが原因だった。
ショートカットをデフォルトに戻すとうまく動くようになった。
バーチャルホスト設定で403エラー

[ubuntu14.04LTS Apach2.4.7]

Apach2でバーチャルホスト設定していていきなり403エラー
エラーログを見ると
AHO01630 :client denied by server configration: hogehoge

/etc/apach2/site-available/*.conf
の仕様が変わったらしく<Directory>の中に注意！

<Directory "hogehoge">
　　　　　AllowOverride All
        Order allow,deny
        Allow from all
</Directory>
「Allow from all」これがダメらしい
「Allow from allをRequire all granted」に変更

$sudo apachctl restart
これで再起動したら直りました。

ざっくりですが、2.2系から2.4系へアップデートした際の盲点かもしれないです
JavaでList, Set, Mapをリテラルっぽく記述するヘルパーメソッド


JavaでList, Set, Mapを簡単に生成するヘルパーメソッドです。
コードはパブリックドメインです。

```java:sample
import java.util.*;
import static org.example.CollectionsHelper.*;

List<String> list = $("foo", "bar", "foobar");
Set<String> set = $s("foo", "bar", "foobar");
Map<String, Integer> map = $m(_("foo", 1), _("bar", 2), _("foobar", 3));
```

```java:CollectionsHelper.java
package org.example;

import java.util.*;

public class CollectionsHelper {
    private CollectionsHelper() {
        throw new AssertionError();
    }

    public static <T> List<T> $(T... values) {
        final List<T> list = new ArrayList<T>(values.length);
        for (T value : values) {
            list.add(value);
        }
        return list;
    }

    public static <T> Set<T> $s(T... values) {
        final Set<T> set = new HashSet<T>(values.length);
        for (T value : values) {
            set.add(value);
        }
        return set;
    }

    public static <K, V> Map<K, V> $m(Map.Entry<? extends K, ? extends V>... entries) {
        final Map<K, V> map = new HashMap<K, V>();
        for (Map.Entry<? extends K, ? extends V> entry : entries) {
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }

    public static <K, V> Map.Entry<K, V> _(K key, V value) {
        return new AbstractMap.SimpleEntry<K, V>(key, value);
    }
}
```
An error occurred while installing sqlite3


vagrant上に作成したCentOSにrailsをインストールして、bundle installしたら下記のエラーが出た。
![スクリーンショット 2014-07-06 21.47.01.png](https://qiita-image-store.s3.amazonaws.com/0/35451/0d2c3343-03ee-c06d-d8bc-7d41e346b08c.png "スクリーンショット 2014-07-06 21.47.01.png")

下記に続くエラーの通りにyum install sqlite-develコマンドを実行したらうまくいった。
![スクリーンショット 2014-07-06 21.50.32.png](https://qiita-image-store.s3.amazonaws.com/0/35451/d0444a49-07ea-f49d-df05-f06dc0d276d1.png "スクリーンショット 2014-07-06 21.50.32.png")

ほぼ素のboxを使ったから入ってなかったんだろうな。
RuboCop | Style/IfUnlessModifier

# RuboCop | Style/IfUnlessModifier

## 概要

RuboCopの「Style/IfUnlessModifier」警告について。
1行で書くべき *if* / *unless* ステートメントに対して警告を出す。
1行で書くかどうかは、 1行にした場合に*IfUnlessModifier* の *MaxLineLength* 
で収まるかどうかで判断する。

デフォルトは 80 です。

## IfUnlessModifier

各設定値での検証結果をまとめます。

### 検証プログラム

if_unless_modifier.rb

~~~ruby
def hage(msg)
  if msg.nil?
    fail ArgumentError, 'Invalid argument nil.  Invalid argument nil.'
  end
  msg * 2
end

def hige(msg)
  if msg.nil?
    fail ArgumentError, 'Invalid argument nil.  Invalid argument nil. '
  end
  msg * 2
end
~~~

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

.rubocop.yml

※検証のために LineLength が発生しないように100に変更

~~~yaml
LineLength:
  Max: 100

IfUnlessModifier:
  MaxLineLength: 80
~~~

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

if_unless_modifier.rb:2:3: C: Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.
  if msg.nil?
  ^^

1 file inspected, 1 offense detected
~~~

### 実行結果 MaxLength を79に変更します

.rubocop.yml

~~~yaml
LineLength:
  Max: 100

IfUnlessModifier:
  MaxLineLength: 79
~~~

~~~bash
$ rubocop
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
第23回オフラインリアルタイムどう書くの問題をリアルタイムでなくRubyで解く

残念ながらリアルタイム参加できませんでした。
問題はこちら
http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/

```rb
def count(bd, i)
  [-1,1,-6,6].map{|d|
    bd[i + d].to_i > bd[i].to_i ? count(bd, i + d) + 1 : 1
  }.max
end

def solve(q)
  bd = '/'*6 + q + '/'*6
  (0..bd.size-1).map{|i| bd[i]=='/' ? 0 : count(bd, i)}.max
end

DATA.readlines.each do |line|
  no,q,a,_ = line.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans.to_s == a ? ' o' : ' x'
end
__END__
0	01224/82925/69076/32298/21065	6	0,1,2,3,6,8	
1	03478/12569/03478/12569/03478	10	0,1,2,3,4,5,6,7,8,9	
2	09900/28127/87036/76545/87650	10	0,1,2,3,4,5,6,7,8,9	
3	77777/77777/77777/77777/77777	1	7	
4	00000/11111/22222/33333/44444	5	0,1,2,3,4	
5	01234/12345/23456/34567/45678	9	0,1,2,3,4,5,6,7,8	
6	10135/21245/43456/55567/77789	8	0,1,2,4,5,7,8,9	
7	33333/33333/55555/55555/77777	2	3,5	
8	01234/11234/22234/33334/44444	5	0,1,2,3,4	
9	98765/88765/77765/66665/55555	5	5,6,7,8,9	
10	01234/10325/23016/32107/45670	8	0,1,2,3,4,5,6,7	
11	34343/43434/34343/43434/34343	2	3,4	
12	14714/41177/71141/17414/47141	3	1,4,7	
13	13891/31983/89138/98319/13891	4	1,3,8,9	
14	01369/36901/90136/13690/69013	5	0,1,3,6,9	
15	02468/24689/46898/68986/89864	6	0,2,4,6,8,9	
16	86420/68642/46864/24686/02468	5	0,2,4,6,8	
17	77777/75557/75357/75557/77777	3	3,5,7	
18	53135/33133/11111/33133/53135	3	1,3,5	
19	01356/23501/45024/61246/13461	5	0,1,3,5,6	
20	46803/68025/91358/34792/78136	4	0,3,5,8	
21	66788/56789/55799/43210/33211	9	0,1,2,3,5,6,7,8,9	
22	40000/94321/96433/97644/98654	9	0,1,2,3,4,6,7,8,9	
23	58950/01769/24524/24779/17069	6	0,2,4,5,7,9	
24	97691/01883/98736/51934/81403	4	0,3,4,6	
25	92049/27798/69377/45936/80277	5	3,6,7,8,9	
26	97308/77113/08645/62578/44774	5	0,1,4,6,8	
27	90207/17984/01982/31272/60926	6	0,1,2,7,8,9	
28	62770/65146/06512/15407/89570	4	0,1,2,6	
29	93914/46889/27554/58581/18703	5	2,4,6,7,8	
30	42035/12430/60728/30842/90381	5	0,3,4,7,8	
31	90347/53880/67954/95256/68777	6	0,3,5,6,7,9	
32	05986/60473/01606/16425/46292	5	0,4,7,8,9	
33	18053/90486/24320/04250/03853	5	0,2,3,4,8	
34	36865/13263/67280/18600/12774	5	0,3,5,6,8	
35	72456/72052/79971/14656/41151	5	1,2,5,7,9	
36	94888/28649/05561/76571/97567	5	0,5,6,7,9	
37	50214/94693/88718/78922/55359	5	0,2,6,7,8	
38	76502/99325/17987/31737/93874	7	0,2,3,5,6,7,9	
39	87142/14764/13014/00248/73105	6	0,1,3,4,7,8	
40	24573/71679/48704/19786/91834	7	1,4,5,6,7,8,9	
41	20347/61889/06074/61263/20519	7	0,1,2,6,7,8,9	
42	74344/97459/97302/14439/35689	6	0,3,4,6,8,9	
43	04794/52198/50294/09340/24160	5	1,2,4,7,9	
44	41065/69344/64698/54167/43348	7	1,3,4,6,7,8,9	
45	39947/15696/03482/19574/70235	7	0,3,4,5,7,8,9	
46	92767/16790/84897/69765/75734	7	3,4,5,6,7,8,9	
47	09654/79610/05070/23456/74687	8	0,2,3,4,5,6,7,8	
48	73998/98799/98707/05633/23915	8	0,2,3,5,6,7,8,9	
49	35661/17480/89723/64335/27217	7	1,2,3,4,6,8,9	
50	02489/77571/84873/03879/84460	7	0,2,4,5,7,8,9	
```
Ubuntu 14.04 で Riak をソースコードからビルドする

とりあえず使うなら最新版やろ、とあまり何も考えずに git clone して make したメモ。
ubuntu は Vagrant を使って建てた。

```bash
 $ vagrant box add ubuntu1404 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
 $ vagrant init ubuntu1404
 $ vagrant up
```

そのままだと色々足りていなかったので、適当にインストール。
（適当すぎるのでいらないものも含まれているかも）

```bash
 $ apt-get update
 $ apt-get upgrade
 $ apt-get install git libncurses5-dev g++ build-essential erlang libpam0g-dev
```

あとはソース取ってきて make するだけ。

```bash
 $ git clone git://github.com/basho/riak.git
 $ cd riak
 $ make rel
```

そもそも make に時間がかかるけれども、自分でやったときは apache solr のダウンロードにやたら時間がかかった。
とくにエラー吐いてなければ下のURLを参考に起動して riak-admin test が通ればOK。

https://github.com/basho/riak#starting-riak 

```bash
 $ cd rel/riak
 $ bin/riak start
 $ bin/riak-admin test
```

riak start した直後に riak-admin test してもまだ起動中のことがあるので、しばらく待った方がいい。