OmniAICreator/Qiita-1.07M huggingface dataset:
capistrano3.3.xでbin以下に配備されなくなる

### 現象
bundle updateをしてcapistrano3.3.4にupdateをしたところ、サーバー側の/binにコマンド系が配置されなくなってしまいました。そのせいで、rails_consoleなどがdeploy先でつかなくなってしまっていました。

```3.3.4
INFO [565559b3] Running ~/.rbenv/bin/rbenv exec bundle install --path /mnt/app/shared/bundle --without development test --deployment --quiet as vagrant@127.0.0.1
DEBUG [565559b3] Command: cd /mnt/app/releases/20150226200217 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.3 ~/.rbenv/bin/rbenv exec bundle install --path /mnt/app/shared/bundle --without development test --deployment --quiet )
```

```3.2.1
INFO [20972687] Running ~/.rbenv/bin/rbenv exec bundle install --binstubs /mnt/app/shared/bin --path /mnt/app/shared/bundle --without development test --deployment --quiet as vagrant@127.0.0.1
DEBUG [20972687] Command: cd /mnt/app/releases/20150226201624 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.3 ~/.rbenv/bin/rbenv exec bundle install --binstubs /mnt/app/shared/bin --path /mnt/app/shared/bundle --without development test --deployment --quiet )
```

比較すると
--binstubの指定がごっそり抜けていることがわかりました。

### 対策

```rb:config/deploy.rb
set :bundle_binstubs, -> { shared_path.join('bin') }
```

として無事解決しました。


### 原因
以下は御時間ある方どうぞ。

[https://github.com/capistrano/bundler/blob/master/CHANGELOG.md](https://github.com/capistrano/bundler/blob/master/CHANGELOG.md)

```html
1.1.4 (22 Jan 2014)
Don’t generate binstubs by default (#61)
```

該当のissue#61を追っていくと
[https://github.com/capistrano/bundler/pull/61](https://github.com/capistrano/bundler/pull/61)

```
Two reasons:
1) bin/ is often checked out into repo
2) #45 (comment)
```

ってことらしく。
さらに該当のissue#45を追っていくと、

```
I have in fact checked in a bin with executables generated by Rails, but they are not used, because by default bin is symlinked to shared/bin, containing executables with bundler-generated executables. Of course it is trivial to configure bundler such that this doesn't happen, but since everyone using Rails 4 needs to do that, it would be better to just do 'the right thing' out of the box.
```
bin/以下については、gitにみんな入れるし、symlinkされたファイルだからいらないよね（超訳）な議論があったみたいで。

```
add line set :bundle_binstubs, nil
remove bin from linked dirs set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
```

ということみたいです。
【Unity】 AnimatorのTriggerをBoolを使って再現する

**UniRxについての記事のまとめは[こちら](http://qiita.com/toRisouP/items/48b9fa25df64d3c6a392)**

---
#やりたいこと
* PhotonAnimatorViewを使ってTriggerの同期がしたい
* ただし現時点でTrigger同期は未対応
* 仕方がないのでAnimatorのBoolを使ってTriggerを再現する

#そもそも「Trigger」とは
* 基本はBoolと同じ
* ただしTrueにすると自動的にFalseに戻る性質がある
* 一瞬だけ動作するアニメーションに切り替える時等によく使う

**つまり、BoolにTrueを設定したら次フレームでFalseに書き換えてやればよい**

#作ってみた

私は何でもコンポーネントに分割する派なので、今回はアニメーション管理コンポーネントを作り、そこにTrigger機能を持ったメソッドを作りました。
外から「SetTriggerAttackA」「SetTriggerAttackB」を実行すれば、アニメーション遷移するようにしてあります。

```csharp:PlayerAnimationController.cs
[RequireComponent(typeof (Animator))]
public class PlayerAnimationController : MonoBehaviour
{
        private enum AnimatorParameters
        {
            IsAttackA,
            IsAttackB
        }

    private Animator _animator;

    /// <summary>
    /// Actionデリゲートを流すSubject
    /// </summary>
    private Subject<Action> _actionSubject = new Subject<Action>();
        

    private void Start()
    {
        _animator = GetComponent<Animator>();

        //1フレーム遅延させてActionデリゲートを実行
        _actionSubject.DelayFrame(1).Subscribe(x => x());
    }

    /// <summary>
    /// 攻撃アニメーションA開始
    /// </summary>
    public void SetTriggerAttackA()
    {
        //IsAttackATriggerをTrueにする
        _animator.SetBool(AnimatorParameters.IsAttackA.ToString(), true);
        //IsAttackATriggerを次のフレームでFalseにする
        _actionSubject.OnNext(() => _animator.SetBool(AnimatorParameters.IsAttackA.ToString(), false));
    }

    /// <summary>
    /// 攻撃アニメーションB開始
    /// </summary>
    public void SetTriggerAttackB()
    {
        //IsAttackBTriggerをTrueにする
        _animator.SetBool(AnimatorParameters.IsAttackB.ToString(), true);
        //IsAttackBTriggerを次のフレームでFalseにする
        _actionSubject.OnNext(() => _animator.SetBool(AnimatorParameters.IsAttackB.ToString(), false));
    }
}
```

#処理を次フレームに持ち越す方法

「**Trueにした次のフレームでFalseにする**」といった処理はUniRxを使って実現しています。
Actionデリゲートを流せるSubjectを生成し、それにDelayFrame(1)を挟むことでフレームを遅延させてSubscribeでActionデリゲートを実行するようにしています。

```csharp:UniRxを使った遅延実行
private void Start()
{
    _animator = GetComponent<Animator>();

    Subject<Action> _actionSubject = new Subject<Action>();

    //1フレーム後にActionデリゲートを実行する
    _actionSubject.DelayFrame(1).Subscribe(x => x());

    Debug.Log(string.Format("Startで実行:{0}",Time.frameCount));

    //_actionSubjectに流したActionデリゲートが次フレームで実行される
    _actionSubject.OnNext(() => Debug.Log(string.Format("1フレーム後に実行:{0}", Time.frameCount)));
}
```
```text:実行結果
Startで実行:1
1フレーム後に実行:2
```

#まとめ
ちゃんとTriggerと同じ挙動をしてくれました。
やはりUniRxは便利ですね（今回の使い方はかなり変則的な方だと思うけど）

ちなみにこの方法で作ったTrigger（中身はただのBool）をPhotonAnimatorViewに食わせたところ、ちゃんと動いてくれました。
ただ同期してくれないタイミングがあったりしたので調査が必要そうです。

# **3/29 追記**

次のフレームに処理を実行するならObservable.NextFrameを使うだけで良さそうです

```csharp
public void SetTriggerAttackA()
{
    _animator.SetBool("IsAttackATrigger", true);
    Observable.NextFrame()
        .Subscribe(_ => _animator.SetBool("IsAttackATrigger", false));
}
```
RaspberryPiでpm2が動かなかった件


## RaspberryPiでNode.jsプロセス動かそうと思ってpm2起動したら止まった

RaspberryPiで音楽サーバー的なものを作ってたのですが、あるときpm2起動させようとしたら

```
$ pm2 start music.js
[PM2] Spawning PM2 daemon
```

ここで動作が止まり、エラーも出ないという現象がありました。

##容量問題でした

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
rootfs           3.6G  3.4G   13M  100% /
/dev/root        3.6G  3.4G   13M  100% /
devtmpfs         238M     0  238M    0% /dev
tmpfs             49M  236K   49M    1% /run
tmpfs            5.0M     0  5.0M    0% /run/lock
tmpfs             97M     0   97M    0% /run/shm
/dev/mmcblk0p1    56M   15M   42M   26% /boot
```

だいぶ容量圧迫されてましたね。

tmpファイルとか削除して整理したら通常に動作しました。


SDカード容量あげなきゃですな汗
【PhotonCloud】 PhotonAnimatorViewでAnimatorの同期を行う

[前回のTransformの同期](http://qiita.com/toRisouP/items/10af1e0edbfc171e2f62)に続いて、今回はAnimatorの同期についてです。

といっても前回ほど難しくはなく、PhotonAnimatorViewを使えば終わりだぜ…と思っていた時期がありました。
微妙に罠があるっぽいので注意してください。

# PhotonAnimatorViewの使い方

## 1.PhotonViewにPhotonAnimatorViewを登録する
![PhotnAnimatorView.png](https://qiita-image-store.s3.amazonaws.com/0/47146/fe9e1f98-1cfb-cd13-433e-ee31767dd5de.png)
PhotonViewのObserverにPhotonAnimatorViewを追加します

## 2.同期したいレイヤとパラメータを選択する

### Synchronize Layer Weights
よくわからない。そのままの意味で読み取ればLayerWeightの同期だが、自分の設定では「Animator doesn't have any layers setup to synchronize」のままだった。誰か教えて下さい。

### Synchronize Paramergers
ここでAnimator上で使用しているパラメータの同期の設定ができる。

![PhotnAnimatorView.png](https://qiita-image-store.s3.amazonaws.com/0/47146/f098d298-316d-1fcd-0b5c-9e3117344a48.png)


* **Disable**：同期しない
* **Discrete**：1秒間に10回のペースで同期を行う
* **Continuous**：1秒間に10回のペースでの同期は同じ。ただしこちらは毎フレームのパラメータ値を保存し、同期のタイミングでまとめて送信する。受信側では送られてきたパラメータ値を１フレームに１つずつ読み込んで再現する

IntegerやFloatなどの、値が細かく変動するものはContinuousで、大雑把で良いboolはDiscreteで良いかも。
ただしContinuousは通信量が増えるので帯域と相談して使うべき。

**注意点として、Triggerの同期には現時点(v1.50.3)では対応していない模様。罠。**

##まとめ

Animatorの同期がすごく簡単にできるようになったのは助かります。
ただ**Trigger**の同期はbool + Continuousで代用するしかないのが残念ですね…。

→[BoolでTriggerを再現する方法](http://qiita.com/toRisouP/items/72c8950b53f79fadc4af)
bashスクリプトで子プロセスを全部殺すイディオム

シェルスクリプトでバックグラウンドで子プロセスを動かしている場合、何も考えずに書くと元のプロセスを殺しても子プロセスが残ってしまいます。例えばこんな風に書くと:

```bash
#!/bin/bash

vmstat 1 > vmstat.log &
iostat 1 > iostat.log &

wait
```

Ctrl-C で止めても vmstat, iostat が残りっぱなしになります:

```console
% ./stat.bash 
^C
% ps
  PID TTY          TIME CMD
 7951 pts/2    00:00:00 zsh
10423 pts/2    00:00:00 vmstat
10424 pts/2    00:00:00 iostat
10446 pts/2    00:00:00 ps
```

こんな時は `EXIT` を trap して `jobs -p` した結果を kill すればよいそうです:

```bash
#!/bin/bash
trap 'kill $(jobs -p)' EXIT

vmstat 1 > vmstat.log &
iostat 1 > iostat.log &

wait
```

こうしておけば Ctrl-C で子プロセスも一緒に止まってくれます:

```console
% ./stat.bash 
^C

% ps
  PID TTY          TIME CMD
 7951 pts/2    00:00:00 zsh
10763 pts/2    00:00:00 ps
```

`kill -9` した場合は残りますが、それはしかたないですね。

参考: http://stackoverflow.com/questions/360201/kill-background-process-when-shell-script-exit

備忘録として。
CSVとかマスターデータを特定のKeyでList化してDictionaryで保持する奴

https://gist.github.com/enpel/6a763d7191ca40521353

```csharp:CSVDataHolder.cs

public class CSVDataHolder<T> where T: ICSVData, new()
{
	Dictionary<string, List<T>> masterData = new Dictionary<string, List<T>>();
	public void Load(string filePath)
	{
		masterData.Clear();
		TextAsset asset = Resources.Load(filePath) as TextAsset;
		var text = asset.text;
		var lines = text.Split('\n').ToList();
 
		List<T> list = new List<T>();
		foreach(var line in lines)
		{
			T t = new T();
			if (t.Parse(line))
			{
				Debug.Log(t.ToLog());
				list.Add(t);
			}
		}
 
		IEnumerable<string> keys = list.Select(item => item.Key);
		foreach(var key in keys)
		{
			var keyList = list.Where(item => item.Key == key);
			if (keyList == null || keyList.Count() == 0)
				continue;
 
			masterData[key] = keyList.ToList();
		}
	}
 
 
}

```


```csharp:ICSVData.cs
public interface ICSVData
{
 
	string Key { get; } // 分類する用のKey
	bool Parse(string line); // パース失敗したらfalse返して！
 
	string ToLog(); // Log用 ToString とかでも可
}
```

CSVでParseが違うだけであとは殆ど同じ
且つ実際にデータ使う時に特定のKeyで分類されていた方が都合が良い時に
（キャラごとのレベル1〜99の必要経験値をまとめて1つのCSVにしたりする時とかにつかう）

Loadの所とかいろいろやりようあると思うけど最低限これだけあればいいやみたいな感じ
Move servo while button is pushing.

```
#include <Servo.h>

const int BTN = 7;
const int LED = 13;
const int MIN = 20;
const int MAX = 170;

Servo myservo;
int pos = 0;
int value = 0;
int stat = 0;

void setup() {
  myservo.attach(2);
  Serial.begin(9600);

  pinMode(BTN, INPUT);
  pinMode(LED, OUTPUT);
  
  pos = MIN;
}

void loop() {

  stat = digitalRead(BTN);

  if (stat > 0) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }

  myservo.write(pos);
  value = myservo.read();
  Serial.println(value);
  delay(20);
  
  if (pos >= MAX) {
    pos = MIN;
  } else {
    if (stat > 0) {
      pos++;
    }
  }

}

```
servo min to max and max to min

```
#include <Servo.h>

const int MIN = 20;
const int MAX = 170;
const int DELAY = 5;

Servo myservo;
int pos = MIN;
int value = 0;
int stat = -1;

void setup() {
  myservo.attach(2);
  Serial.begin(9600);
}

void loop() {
  
  if (pos <= MIN || pos >= MAX) {
    stat = stat * -1;
  }
  
  pos = pos + stat;

  myservo.write(pos);
  value = myservo.read();
  Serial.println(value);
  delay(DELAY);
  
}
```
withFileの使いどころではまった時のメモ

学習の素材は、
[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/すごいHaskellたのしく学ぼう-Miran-Lipovača/dp/4274068854)

> この表記は、私見・感想です。

## 期待するファイル読み込みができない

文字列を読み込むためだけのIOアクションを引数にとった `withFile` を使ってはいけない。その後に`putStrLn` , `writeFile` などで取得した文字列を参照しようとしても、空文字になってしまう。

例えばこのようなケース。

```:入力ファイル
$ cat baabaa.txt 
Baa, baa, black sheep,
Have you any wool?
Yes, sir, yes, sir
Three bags full;
$
```

```hs:サンプルコード
import System.IO
main = do
	str <- readFile'' "baabaa.txt"
	writeFile	"output.txt" str -- (*1)読み込んだ文字列をファイルに書き出す

readFile'' :: FilePath -> IO String
readFile'' name = withFile name ReadMode hGetContents
```

このプログラムを起動すると `output.txt`　には何の文字列も入っておらず、これは期待通りではない。

```:出力ファイル
$ cat  output.txt 
$ 
```

これは、次の要因で起こってしまう。

* `withFile` は、関数の終了とともにファイルハンドルを閉じてしまう
* 遅延IOなので、必要になるまで( putStrLnなどが呼び出されるまで ) `withFile` の結果は評価されない

このため、必要になった時にはハンドルが閉じていて期待していた文字列を評価できず、IOアクションの結果が`""` となってしまう。

なお次のプログラムでも、同じように文字列を取得できなかった。

```hs
import System.IO

main = do
	handle <- openFile "baabaa.txt" ReadMode
	contents <- hGetContents handle
	hClose handle
	putStrLn contents
```

> ハンドルが閉じている状態で`contents` に関数を適用しても、エラーとはならないようだ。また、途中で`let a = contents` などと変数にバインドしても、浅いコピーしかされていない様子だった。
> 

## 参考サイト
http://stackoverflow.com/questions/9406463/withfile-vs-openfile
http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-IO.html#v:withFile
Vanilla JS 入門

# Vanilla ことはじめ

## Vanilla JSとは?

Vanilla JSは、**超高速軽量クロスプラットフォームフレームワーク**です! 
実は結構なところで使われているフレームワークでして、

Facebook Google YouTube Yahoo Wikipedia Windows Live Twitter Amazon	LinkedIn MSN eBay Microsoft Tumblr Apple Pinterest PayPal Reddit Netflix	Stack Overflow

などなど数々の企業で採用実績のあるとても実用的なフレームワークです! なんと、**jQueryよりも使われている**という、とんでもないフレームワークです!

## 環境構築!


まずは環境構築しないとダメですよね?

### ダウンロード

[Vanilla.js](http://vanilla-js.com/)のページより、お好きな機能をクリックして、

Downloadをクリック!

![スクリーンショット 2015-02-27 1.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/31381/6efa4e0d-ae10-b1db-32aa-3722abad22b8.png)

ちなみに、ファイルサイズがHuman readableなサイズじゃないので、Human Readableのチェックボックスをオンにすれば、ファイルサイズが分かって良いでつよ!

![スクリーンショット 2015-02-27 1.16.57.png](https://qiita-image-store.s3.amazonaws.com/0/31381/5153043e-a013-ae3e-7ad8-4040f20ca3ef.png)

### Getting Start!

ダウンロードしたら、どのJSのフレームワークと同様にscriptを読みこむだけで良いのですが、....

```html
<script src="path/to/vanilla.js"></script>
```

なんと、Vanilla JSはあまりにも広く使われているため、**ブラウザが自動的に読み込みます!!! なんで、なにも書かなくても使えちゃいます!!!** しゅごい。

```html
```

### Vanilla JSで書いてみる。

例として
http://vuejs.org/

Viewを書く。

まず、ちょっと準備しましょう。

```js
function Elm(name, attributes, children = []){
    let elm = document.createElement(name);
    for(let attributeName in attributes ){
        let attributeValue = attributes[attributeName];
        elm.setAttribute(attributeName, attributeValue);
    }
    children.forEach(e=>elm.appendChild(e))
    return elm;
}

let Text = (nodeValue=>document.createTextNode(nodeValue))
```

と書けば、

```js
var message = "Hello Vanilla JS";
var input = Elm("input",{ "value" : message },[]);
var text = Text(message);

var view = Elm("div",{}, [
    input,
    Elm("p",{}, [text])
]);
```

と簡単にDomが書けます。そんで、

```js
input.addEventListener("keyup",function(e){
   text.nodeValue = input.value;
});
input.addEventListener("keydown",function(e){
   text.nodeValue = input.value;
});
document.body.appendChild(view);
```

とでも書けばOk 簡単でしょ?
コードはJS Fiddleで書きまつた。 https://jsfiddle.net/dwdjLLmu/

## 参考文献

### Vanilla JS本家

http://vanilla-js.com/

### ドキュメント!

https://developer.mozilla.org/en-US/docs/Web/JavaScript

### 書籍群

http://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=javascript

### 豊富なプラグイン!

http://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks
Yosemiteにアップデート後bundle install ができなくなった話

# Error内容
```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -r ./siteconf20150227-81577-1d96vgb.rb extconf.rb
checking if the C compiler accepts ... no
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
-----
The file "/usr/include/iconv.h" is missing in your build environment,
which means you haven't installed Xcode Command Line Tools properly.

To install Command Line Tools, try running `xcode-select --install` on
terminal and follow the instructions.  If it fails, open Xcode.app,
select from the menu "Xcode" - "Open Developer Tool" - "More Developer
Tools" to open the developer site, download the installer for your OS
version and run it.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
        --help
        --clean
        --use-system-libraries
        --enable-static
        --disable-static
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
        --enable-cross-build
        --disable-cross-build

extconf failed, exit code 1

Gem files will remain installed in /Users/***/.gem/ruby/2.0.0/gems/nokogiri-1.6.6.2 for inspection.
Results logged to /Users/***/.gem/ruby/2.0.0/extensions/universal-darwin-14/2.0.0/nokogiri-1.6.6.2/gem_make.out
An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
```

# 実施内容(エラー改善せず。。。)
## gem install 実施
* エラーの一番下にあるgem installのコマンドを打ってnokogiriはinstallできるもののbundle installはできず。。。

```
gem install nokogiri -v '1.6.6.2'`
```

## 別の方法でnokogiri install
* こちらを参考にしてみましたがダメでした。。。(nokogiriのインストールには成功)
 * [Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法](http://qiita.com/t_732_twit/items/a7956a170b1694f7ffc2)

# 解決方法
* エラーをよくみたらコマンドラインツールが正しくinstallされてないみたいだからinstallしろと書いてあるので、以下を実行したら正常にbundle installが成功しました。

```
xcode-select --install
```
MacBook Pro を壞して直した記録 (1)

MacBook Pro を壞して直した記録 (1)

# 2014年7月23日

MacBook Pro (MBP) を2囘，hibernate 状態で，10 cm ほどの高さから落とした．このときの OS は Lion だつた．

# 2015年7月24日

Hibernate からの復歸後，動きが重い．ScanSnap を使つての scan は正常にできた．

その後，hibernate から復歸しなくなつた．PRAM, SMC の reset, safe mode での起動を試みたが，いづれも失敗した．Apple mark は表示するが，progress bar が 5 % ほどで消えた．

Recovery HD からの起動に成功した．Disk utility から，Macintosh HDの檢證をした．成功した．同 disk の修復は失敗した．

この時點で，今後の方針を，

- SSD を買つて Macintosh HD を backup する．
- HDD を買つて Macintosh HD を backup する．
- Macintosh HD を backup せず，Lion を再 install する．
- Macintosh HD を backup せず，Time Machine から復元する．

のいづれかにすることを考へた．
SubversionからGitへ移行 - 移行用環境構築編

# SubversionからGit移行環境構築

## 概要

SvnからGitへ移行するにあたりの作業内容を記載します。
この記事では、移行環境構築にスポットを充てているので、移行手順自体は別記事を参照してください。

※作業自体は1年ほど前のもので、眠っていた記事を掘り起こしているため、情報が古い可能性がありますがご容赦ください。

移行の概要などは、[SVN から Git への移行 | アトラシアン](https://www.atlassian.com/ja/git/migration)によくまとまっているので、そちらを参考にしてください。

## 環境構築について

SvnからGitへの移行は、ローカルマシンで行う必要があるため、以下の環境を構築します。

* ローカルマシン  
CentOS 6.5（移行専用環境なのでVagrant使用）
* ミドルウェア
 * git  
1.7.7.5 以上
 * svn  
1.6.17 以上
 * java
 * git-svn

CentOS 6.5 は yum では対象のミドルウェアのバージョンを満たせないため、ソースコンパイルで対応します。
手順を一つ間違えるとやり直しなので、 Vagrant に sahara を入れて、 sandbox を使用することをお勧めします。

## 各ミドルウェアインストール手順

### Javaインストール

公式のインストール手順[RPMを使用したLinux x64版Javaのインストール方法](http://java.com/ja/download/help/linux_x64rpm_install.xml)に沿って行けば、難なくインストール可能です。

### Git インストール

[CentOSに標準インストールされている古いgitのバージョンを最新版にあげる方法 - 手が震えたらBARに行こう](http://tabunmuri.hatenablog.com/entry/2014/01/06/CentOS%E3%81%AB%E6%A8%99%E6%BA%96%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%8F%A4%E3%81%84git%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7)を参考にさせていただきました。

```
$ sudo yum remove git
$ sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
$ cd /usr/local/src
$ sudo wget https://git-core.googlecode.com/files/git-8.5.5.tar.gz
$ sudo tar zxvf git-8.5.5.tar.gz
$ cd git-8.5.5
$ sudo ./configure --prefix=/usr/local/
$ sudo make prefix=/usr/local all
$ sudo make prefix=/usr/local install
$ git --version
```
バージョン1.8.5.5になれば成功です。

### Subversionのインストール

[Subversion 1.7系を CentOSで使いたい   at softelメモ](https://www.softel.co.jp/blogs/tech/archives/3457)を参考にさせていただきました。

```
$ sudo yum remove subversion
$ cd /usr/local/src/
$ sudo wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/subversion/subversion-1.7.16.tar.bz2
$ sudo tar jxf subversion-1.7.16.tar.bz2
$ cd subversion-1.7.16
$ sudo ./get-deps.sh
$ sudo ./configure --without-berkeley-db --without-apxs --without-swig --without-serf --with-ssl --with-neon
$ sudo make
$ sudo make install
$ svn --version
```

バージョンが、1.7.16になれば成功です。

### git-svn インストール

yum でインストールして、問題なく動作することが確認できたので、yumでインストールすれば完了です。

* 依存関係
 * git
 * perl-Git
 * perl-TermReadKey
 * subversion
 * subversion-perl

## まとめ

以上でSvnからGitへ移行するための環境構築が完了です。
実際の移行手順は、概要に記載の記事で対応可能ですが、少しだけはまりポイントがあったので、別途記事を起こします。
Swiftで細かいこと気にせずログを出したい


Objective-CとSwiftとの大きな違いの一つとしてマクロの扱いが挙げられます。
そのためマクロ前提のロギングなどのObjective-CライブラリはSwiftでは利用できなくなりました。



ネット上でよく見かける擬似コードは以下のようになります。

```swift
func MyLog(message: String, function: String = __FUNCTION__, line: Int = __LINE__) {
#if DEBUG
	println("")//省略
#endif
}
```

上記の場合、以下の２点が気になります。

1. `DEBUG`ではない場合も`message`が評価される
	+ `MyLog("\(fibonacci(100))")`のような重い処理が表示されなくても実行されてしまう
1. `MyLog(1, 2, "3")`のように複数の値を同時に表示することができない

##`1`の対策

Swiftの`assert`関数のように`@autoclosure`で包み込む

```swift
func MyLog(message: @autoclosure () -> String, _ function: String = __FUNCTION__, _ line: Int = __LINE__) {
#if DEBUG
	println("\(message())")//省略
#endif
//DEBUGではない場合、message内部は評価されない
}
```


##`2`の対策

こちらはGenericsとオーバーロードの力技で対応します。

```swift
func MyLog<T>(message: T, _ function: String = __FUNCTION__, _ line: Int = __LINE__) {
#if DEBUG
	println("")//省略
#endif
}


func MyLog<T1, T2>(t1: T1, _ t2: T2, _ function: String = __FUNCTION__, _ line: Int = __LINE__) {
	MyLog((t1, t2), function, line)
}

func MyLog<T1, T2, T3>(t1: T1, _ t2: T2, _ t3: T3, _ function: String = __FUNCTION__, _ line: Int = __LINE__) {
	MyLog((t1, t2, t3), function, line)
}

//以下、必要な個数分続く

```

```swift
MyLog(1) //MyLog<T>(...)が呼ばれる
MyLog(1, "2") //MyLog<T1, T2>(...)が呼ばれる
```


---

`1`はともかく`2`は単純に手間なので、それらを踏まえ実装した自作ライブラリがこちらになります。

#### [LoggingKit](https://github.com/sora0077/LoggingKit)

Swift1.1の記法に対応しました。
[LoggingKit tag:swift/1.1](https://github.com/sora0077/LoggingKit/tree/swift/1.1)

## 使い方

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

#if DEBUG
	LOGGING_VERBOSE() //デバッグ時は全てのログを表示
#endif
}
```

```swift
Logging.e(someError)

let v: String! = nil
Logging.v(1, "2", 3.0, v, Optional(5)) //(1, 2, 3.0, nil, 5)
```

## 補足

~~Swift1.2 Beta1で作成しているためSwift1.1では今のところ利用できません。~~
~~週末にSwift1.1に対応したいと思います。~~
Apache のコンテンツネゴシエーションによる言語振り分けについて

## 言語振り分け設定
### httpd.conf 追記
```
# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">

    Options +MultiViews
    DirectoryIndex index
```

### Apache再起動
```
# service httpd restart
```

### ファイル用意
```
# ls -l /var/www/html/
-rw-r--r-- 1 root root 17 2015-02-27 00:38 index.html.en
-rw-r--r-- 1 root root 34 2015-02-27 00:37 index.html.ja
```

### 確認
```
# curl -H 'Accept-Language: ja, en;q=0.8' localhost
# curl -H 'Accept-Language: en, ja;q=0.8' localhost
# curl -H 'Accept-Language: ja-jp, ja, en-us, en;q=0.8' localhost
```

## 補足
「ja-jp」「en-us」はデフォルトのApacheの設定に含まれていないため、適宜追加する。

```
# grep AddLanguage /etc/httpd/conf/httpd.conf
# DefaultLanguage and AddLanguage allows you to specify the language of
# language code is pl) may wish to use "AddLanguage pl .po" to
AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw
```

### 追加する（Apache要再起動）
```
AddLanguage ja-jp .ja
AddLanguage en-us .en
```

### 追加例

```
# curl -H 'Accept-Language: en-us, ja, en;q=0.8' localhost
Japanese contents

<-- Add httpd.conf 「AddLanguage en-us .en」-->
# service httpd restart

# curl -H 'Accept-Language: en-us, ja, en;q=0.8' localhost
English contents
```

※本設定は「.htaccess」に記載することも可能。
bubbleソートを作ってみる

# 最初に書いたもの

```haskell
bubblesort :: Ord a => [a] -> [a]
bubblesort [] = []
bubblesort xs = (bubblesort $ init xs') ++ [last xs']
  where
    exchangeNeighbors ys = case ys of
      (a:b:zs) -> (min a b):(exchangeNeighbors $ (max a b):zs)
      (a:_)    -> [a]
    xs' = exchangeNeighbors xs
```

ソート順の指定などが出来なかったり、型指定がベタ書きだったりする所がイケてない。

# ソートで共通の型とメソッドを作ってみたもの

```hs
data Order = Asc | Desc

type Sort a = Order -> [a] -> [a]

left :: Ord a => Order -> a -> a -> a
left Asc  = min
left Desc = max

right :: Ord a => Order -> a -> a -> a
right Asc  = max
right Desc = min

bubblesort :: Ord a => Sort a
bubblesort _ []     = []
bubblesort order xs = (bubblesort order $ init xs') ++ [last xs']
  where
    exchangeNeighbors ys = case ys of
      (a:b:ys') -> (left order a b):(exchangeNeighbors $ (right order a b):ys')
      (a:_)     -> [a]
    xs' = exchangeNeighbors xs
```

Order, Sort, left, rightは任意のソートメソッドで共通的に使える想定。

```hs:結果
*Main> bubblesort Desc [1..10]
[10,9,8,7,6,5,4,3,2,1]
*Main> bubblesort Asc $ reverse [1..10]
[1,2,3,4,5,6,7,8,9,10]
```

# ハマったところ

## `type Sort = Ord a => Order -> a -> a -> a`といった書き方は出来ない。

少なくともGHCでは受理されない。
http://stackoverflow.com/q/22945348

## NumがShowやEqの小クラスじゃない

ソートの動作検証を行うのに、こんな感じのメソッドを作ってみた:

```hs
test :: Num a => Sort a -> IO ()
test sort = do
  print $ sort Asc [1]
  print $ sort Asc [2,1]
  print $ sort Asc [3,2,1]
```

```text:結果
p2.hs:24:3:
    Could not deduce (Show a) arising from a use of ‘print’
    from the context (Num a)
      bound by the type signature for test :: Num a => Sort a -> IO ()
      at p2.hs:22:9-32
    Possible fix:
      add (Show a) to the context of
        the type signature for test :: Num a => Sort a -> IO ()
```

しかし手元にあるプログラミングHaskellを見ると、

```hs
class (Eq a, Show a) => Num a where ...
```

とある。

しばらくググってみた結果、どうやらGHC 7.4でNumからEqとShowが分離されたということが判明。
http://stackoverflow.com/a/11194912

とりあえず、以下のように複数指定してやればOKであった。

```hs
test :: (Num a, Show a) => Sort a -> IO ()
```

一方で、型推論では以下のような型が導出された。

```hs
test :: (Show s, Num t) => (Order -> [t] -> s) -> IO ()
```

また、今回のbubblesortメソッド自体は、任意のOrdな値に適用できる。つまり、

```hs
bubblesort Asc ['d','c','b','a']
```

は全く問題なく動作する。

そこで、以下のようにtestメソッドにCharのパターンも加えてみたのだが、

```hs
test sort = do
  print $ sort Asc [1]
  print $ sort Asc [2,1]
  print $ sort Asc [3,2,1]
  print $ sort Asc ['d','c','b','a']
```

```text:結果
p2.hs:24:21:
    Could not deduce (Num Char) arising from the literal ‘1’
    from the context (Show s)
      bound by the inferred type of
               test :: Show s => (Order -> [Char] -> s) -> IO ()
      at p2.hs:(23,1)-(27,36)
    In the expression: 1
    In the second argument of ‘sort’, namely ‘[1]’
    In the second argument of ‘($)’, namely ‘sort Asc [1]’
```

bubblesortに渡すリストの各要素の値が、NumでもありCharでもあるので、型推論できないと言われる。

こちらについてはどうすれば解決できるか今のところ不明。
便利ツール PopUp Icons

重宝してます。
　[PopUp Icons](http://chihiro718.jpn.org/)


現在使っているアプリを表示したままデスクトップの内容を最前面に表示させることができる。
![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/64360/b3452b5e-bc31-24c7-6581-1273cc435cf1.jpeg)

そのまま操作することもできる。
![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/64360/df932fc3-f310-7423-1e3c-dc6b41489dcb.jpeg)
CloseableHttpClient のCloseableとは？

#はじめに
HttpClient 4.3を使って、POSTのサンプルを作っていた時に疑問に思ったことがありました。
CloseableHttpClient のCloseableとは何なんだろう？


```java:CloseableHttpClientSample.java
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        try {
            // do something useful
        } finally {
            instream.close();
        }
    }
} finally {
    response.close();
}
```

#調べたこと

Java 1.5からCloseable インターフェースが追加された。

> Closeable は、閉じることができるデータの転送元または転送先です。終了メソッドは、オブジェクトが保持しているリソース (開いているファイルなど) を解放するために呼び出されます。
http://docs.oracle.com/javase/jp/7/api/java/io/Closeable.html


閉じることができるということは、処理が終わったらちゃんと閉じなさいという意味と解釈しました。
Koshianがperipheral.advertisement.serviceUuidsを返してくれないっぽい

Bluetooth LE勉強しようとしているところなので、すっとんだ事を言っていたらごめんなさい。

nobleを使ってKoshianを触ってみているのですが、
`peripheral.advertisement.serviceUuids`を返してくれない様です。
Konashiの方はちゃんと`180f`と`00ff`を返してくれます。

noble.startScanning(serviceUuids)が使えない
==========================================
`noble/lib/linux/bindings.js`を見てみると、noble.startScanningでUUIDを指定した場合は
渡されたUUIDが`peripheral.advertisement.serviceUuids`に含まれているデバイスを検索しています。
しかしながらKoshianの`peripheral.advertisement.serviceUuids`は空です。
つまり、**Service UUIDを指定したデバイスの検索ができません！**困りましたね。
とりあえず、connectしちゃってからperipheral.discoverServicesでService UUID探して
見つかったら処理続行、見つからなかったら処理中断とかしてみました。

Koshian2.0は治ってるのかな～?
Swift:CocoaPodsでObjective-Cのライブラリをインストールする方法

1. Xcodeでプロジェクトを作成する。


2. http://kazuy.net/?p=266 を参考に、CocoaPodsでライブラリをインストールする。
　（`１`で作ったプロジェクトと同じディレクトリに）
　swiftなので、Podは必ず最新版で。

3. Xcodeで、.xcworkspaceを開く。
　.xcodeprojではない方。

4. New Fileから、BridgingHeaderを作成する。
　`${ProductModuleName}-Bridging-Header.h`
  という名前で作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/67504/7cf03849-606d-f55c-3e28-6396ec0b76f3.png)

5. Bridging-Headerを設定する。
`${ProductModuleName}/${ProductModuleName}-Bridging-Header.h`
  という名前で作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/67504/a148e26f-ff8c-a5ad-9564-4e8290f74afd.png)

6. `5`で作成したBridgingHeaderに、
  `2`でインストールしておいたライブラリをimportする。
　今回はFlatUIKit。
![image](https://qiita-image-store.s3.amazonaws.com/0/67504/1885e099-ad50-e230-939b-9befffa5c1c3.png)

7. 完了！
　これだけで、.swiftファイルの方へのimportは無しで、
　Objective-Cのライブラリが使えるようになります！
SwiftでArray#flattenする

## Array#flatten
以下のような実装をしてみました。

    extension Array {
        func flatten() -> [AnyObject] {
            var flattenArray = [AnyObject]()
            for element in self {
                if let element = element as? NSArray as? [AnyObject] {
                    flattenArray += element.flatten()
                } else {
                    flattenArray.append(element as NSObject)
                }
            }
            return flattenArray
        }
    }

    var temp = [1, [2, 3, 4, [5, 6]]]
    var flat = temp.flatten()
    println(flat) // [1, 2, 3, 4, 5, 6]



## 実装について補足
`if let element = element as NSArray as? [AnyObject] {}` 
という処理について少し補足します。

まず、なんで`NSArray`にキャストしてから`Array<AnyObject>`にキャストしているんだ？
と疑問に思われるかもしれませんが、
これは`T`型(placeholder type)の`element`を直接`Array<AnyObject>`へキャストしようとすると、`element`の実際の型が`Array<AnyObject>`だったとしても`nil`になるためです。

`if let element = element as? [AnyObject] {}`とした場合、この挙動は以下のような期待していない結果を招きます。

    var temp:[Any] = [[1, [2, 3, 4, [5, 6]]]]
    var flat = temp.flatten()
    println(flat) // [(1,(2,3,4,(5,6)))]

つまり`element`を`Array<AnyObject>`にキャストすることに失敗し、再帰的に平坦化できなくなっていまっている、ということです。

#### 解決策
そこで、[Working with Cocoa Data Types](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html)で説明されている、
「要素の型がクラスのインスタンスでない`Array`を`NSArray`にキャストしたときに、Swiftは暗黙的に要素の型も`AnyObject`互換な型にキャストする」

    let schoolSupplies: NSArray = ["Pencil", "Eraser", "Notebook"]
    // schoolSupplies is an NSArray object containing NSString objects

という性質を利用して、`element`を間接的に`Array<AnyObjec>`にキャストしています。
ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第5回 お題「 esa.io 」 } #esa_io

## <i class="fa fa-image" style="font-size:1em;"></i> 概要
Ascii Art ならぬ EA (Emoji Art) で 3 x 3 の絵を作る。

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
CodeIQ で <i class="fa fa-external-link" style="font-size:1em;"></i> [Emoji-サザンイマジネーション](https://codeiq.jp/ace/tbpgr_badge/q1323)
という問題の出題を始めました。

Emoji で 3 x 3 の絵を作るプログラムを作成する問題です。

この問題のフィードバック時に、解答者の 3 x 3 の Emoji に対して、
3 x 3 の Emoji でフィードバックする、という試みをしています。
これが結構楽しかったので、 Qiita 上でも出題期間中 ( ～ 2015年3月6日) は
1日1お題くらいやってみたいな、と思いました。

最近の チャットツール とか GitHub とか、多くのツールが Emoji をサポートしてるので
面白いものを作っておくと、開発メンバー間のコミュニケーションツールとして使えそうですよね。

Emoji のリストと対応サービスはこちらで確認。
<i class="fa fa-external-link" style="font-size:1em;"></i> [EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)

## :flower_playing_cards: 作品 「 esa.io 」

※ esa.io のみで有効な emoji

~~~
:esa2: :rocket::recycle: 
:esa:  :sparkles::boy: 
:esa2: :sparkles::woman: 
~~~

![esa.png](https://qiita-image-store.s3.amazonaws.com/0/43480/088cdc08-b540-1739-4b4a-c175df0491c9.png)

* 素早いフィードバック
* 輝くプログラマ
* 輝くデザイナ

うーん、まとまりがない感じに。

## :books: 関連情報
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [emoji 関連記事](http://qiita.com/tbpgr/items/b32c83e2f3f348a4ce0a)
ConEmuを使ってGitHub for WindowsのPowerShellを使う

GitHub for Windowsを入れた時のPowerShellが使いやすい

[GitHub for Windows](https://windows.github.com/)

普段、会社でMacのTerminalを使っていると、自宅のWindowsのコマンドプロンプトなどコンソール環境の乏しさにストレスが溜まる
VPSを弄るときもSSHクライアントをインストールしていた
cygwinとか入れれば良いのかもしれないが、大層な気もするし

そんな折、Gitを使うためGitHub for Windowsをインストールしたときに、同時に使えるようになったGitShellというのがめちゃくちゃ使いやすかった
gitはもちろんlsやsshも実行できるので、リモートログインなんかですごく重宝した
（中身はPowerShellで、内部的にはMSYSを使ってるらしい）

ちなみに、GitShell起動コマンドは以下

    C:\Users\XXX\AppData\Local\GitHub\GitHub.appref-ms --open-shell

ちなみにこちらのバッチを実行するとコマンドプロンプト版を起動できるようだ

    C:\Users\XXX\AppData\Local\GitHub\PortableGit_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\git-cmd.bat

で、非常に便利なGitShellだったのだが、一つ不満点があった
フォントがアンチエイリアスの効いていない「ＭＳ ゴシック」なので、逐一絶妙に心に引っかかりが生じる
コピペがたやすく出来ないのも地味に響く

やはりコンソールは美しくあってほしい

だが、どうもPowerShellのフォントを変更するのは一苦労っぽい
どうしたものかと、二の足を踏んでいた時にComEmuを知った

[conemu-maximus5 - Windows Console Emulator, Far Manager plugins - Google Project Hosting](https://code.google.com/p/conemu-maximus5/)

コマンドプロンプトやpowershell、sygwinなど入れていればbashなどを起動できるコンソールエミュレータとのことらしい
これは使えるのではないか、何とかGitShellを起動するように設定を試行錯誤してみた

まず、そもそもGitHub for WindowsがどうやってPwerShellを起動させているのかが分からない
C:\Users\XXX\AppData\Local\GitHubのフォルダをみると、怪しそうなps1ファイルがある
覗いてみると、どうもこのスクリプトが起動時の設定をしているようである
じゃあ、起動時にPowerSehllでこのスクリプトを実行すればよいのかと思い、以下の様な設定を書いてみた

    Settings > Startup > Tasks > Commands
    powershell.exe -NoExit -File C:\Users\XXX\AppData\Local\GitHub\shell.ps1

行けた！

やはりコンソールは美しくあってほしい
コンソールがアンチエイリアス効いてて綺麗だと、カタカタするときのテンション上がるというもの
VPSいじるときも捗りそうだ

コマンドプロンプト版がよいなら、以下の設定でOK

    Settings > Startup > Tasks > Commands
    C:\Users\XXX\AppData\Local\GitHub\PortableGit_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\git-cmd.bat

Windows版のパッケージ管理ツールであるchocolatryという物も知ったので、これもいれていみよう

---

リモートログインした先で、nanoが開かず以下のエラーが出る場合

    Error opening terminal: msys

どうも、環境変数のTERM=msysが影響しているようだ
リモートログイン先で、.bash_profileに以下を追記すると直った

    export TERM=cygwin

普通にGitShellを起動した時は問題なかった（TERM=cygwinが設定してある）ので、何か起動時のスクリプト指定に問題があるのかも…
気軽に使用可能なゲームライブラリー紹介

# ゲームライブラリーとは？
* 汎用性の高い複数のプログラムを、再利用可能な形でひとまとまりにしたものである。
* ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言うことができる
* 詳しく知りたい方は[こちら](http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)へ

# 種類
## [Siv3D](http://play-siv3d.hateblo.jp/)
* Siv3D は C++ で楽しく簡単にゲームやメディアアートを作れるライブラリです。Kinect や Leap Motion, カメラやマイクといった多くのデバイスに対応し、複雑なインタラクションを短いコードで書くことができます。
* 最近、Slackでコミュニティを作成したらしい。

## [Cinder](http://libcinder.org/)
* Cinderとは、画像、音声、動画等を簡単に処理＆可視化できる、主にビジュアルデザイン向けの強力なC++ライブラリであり、オープンソースとして開発が進められています。
* 同様の思想を持つProcessingやopenFrameworksによく似ており、C++で簡単に記述できるうえ、Windows、MacOSX、iOS(iPhone/iPad)といった複数のプラットフォームをカバーしています。

## [DXライブラリー](http://homepage2.nifty.com/natupaji/DxLib/)
* ＤＸライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたＣ＋＋言語用のゲームライブラリです。
* プログラムは、オープンソースになっています。

## [SFML](http://www.sfml-dev.org/index.php)
* OpenGLのラッパーライブラリである、
* クロスプラットフォームなマルチメディアライブラリ。
* DXライブラリーのOpenGLバージョンみたいです。


## [openFrameworks](http://openframeworks.cc/documentation/)
* openFrameworksとは、「創造的なコーディング」のためのC++のオープンソースツールキットである。
* MIT ライセンスで配布され、Windows、Mac OSX、Linux、iOS、Android のプラットフォームで作動する。
* コードにまつわる様々な事柄をずっと容易にしてくれるツール

## [Irrlicht Engine](http://irrlicht.sourceforge.net/)
* C++で書かれたオープンソースの3次元ゲームエンジン。
* 公式にも Windows、Mac OS X、Linux、Windows CE とクロスプラットフォームで動作し、そのオープンな性質からXboxやPlayStation Portable、Symbian OS、iPhone、Google Native Clientにも移植されている。
* Irrlichtは、オブジェクトが小さく、各種ハードウェアへの移植性・互換性が高く、学習が容易で、コミュニティが活発である。
* 海外では人気があるらしい

# その他
* 上記に書いてあるライブラリーはこの世にあるライブラリーの一部になっています。
* 個人的な意見なんですが、ゲームを作るなら一からライブラリーを作る必要はないと思います。なので、自分と合ったライブラリーを使用しましょう。
RGBをCMYKに変換

# はじめに

RGBをCMYKへ変換するコードをSwiftで書きます。
前回投稿した[HTMLカラーコードの16進数10進数変換](http://qiita.com/arthur87/items/f6749315264bdb061105) の続きとなります。

CMYKは色の表現法の一種でシアン（Cyan）、マゼンタ（Magenta）、イエロー（Yellow）とキー・プレート（Key Plate）から頭文字1字を取ったものです。
RGBからCMYKに絶対変換できるとは限らないため、アプリケーションによっては異なる値を表示するかもしれません。
CMYKからRGBでは、やや鮮やかな色、RGBからCMYKでは、やや暗めの色に変換されます。

# RGBをCMYKに変換

前回と同様に#8a2be2（BlueViolet）を変換していきます。
10進数に変換すると`(r, g, b) = (138, 43, 226)`となります。
はじめにKを求めます。そしてC、M、Yを求めます。

```swift
let r = 138
let g = 43
let b = 226

let KeyPlate:CDouble = min(1 - CDouble(r) / 255.0, min(1 - CDouble(g) / 255.0, 1 - CDouble(b) / 255.0))
let cyan:CDouble = (1 - (CDouble(r) / 255.0) - KeyPlate)/(1 - KeyPlate)
let magenta:CDouble = (1 - (CDouble(g) / 255.0) - KeyPlate)/(1 - KeyPlate)
let yellow:CDouble = (1 - (CDouble(b) / 255.0) - KeyPlate)/(1 - KeyPlate)

let c:CInt = (cyan < 0.0 || cyan.isNaN) ? 0 : CInt(cyan * 100.0)
let m:CInt = (magenta < 0.0 || magenta.isNaN) ? 0 : CInt(magenta * 100.0)
let y:CInt = (yellow < 0.0 || yellow.isNaN) ? 0 : CInt(yellow * 100.0)
let k:CInt = (KeyPlate < 0.0 || KeyPlate.isNaN) ? 0 : CInt(KeyPlate * 100.0)
```

結果は`(c, m, y, k) = (38, 80, 0, 11)`となります。

# nan(not a number)

一部のカラーコードでは計算結果がnan(not a number)となります。
例えば、#000000（Black）です。
10進数に変換すると`(r, g, b) = (0, 0, 0)`となります。
中間の計算結果は、`(KeyPlate, cyan, magenta, yellow) = (1.0, nan, nan, nan)`となります。

`CDouble`には`isNaN`というメソッドがあり、これを使ってnanか判定します。

最終的な計算結果は`(c, m, y, k) = (0, 0, 0, 100)`となります。
ฅ(｀・ω・´)ฅ { はじめてさわる Sinatra で qiita_scouter サーバーを 8 分で構築する } #sinatra #ruby #qiita_scouter

## :tophat: 概要
はじめてさわる Sinatra で qiita_scouter サーバーを 8分で構築してみます。
※ Sinatra について全く前提知識がないところからググってこの記事を書きながら完成させるまでの時間が 8 分でした

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール
### :tophat: sinatra のインストール

~~~bash
gem install sinatra
~~~

### :computer: thin ( Web Server ) のインストール

~~~bash
gem install thin
~~~

### :sunglasses: qiita_scouter のインストール

~~~bash
gem install qiita_scouter
~~~

## <i class="fa fa-search" style="font-size:1em;"></i>:books: 資料を探す
これだ。

<i class="fa fa-external-link" style="font-size:1em;"></i> [sinatrarb Official](http://www.sinatrarb.com/intro-ja.html)

## <i class="fa fa-file-code-o" style="font-size:1em;"></i> サーバーのソースコードを実装

qiita_scouter_server.rb

~~~ruby
require 'sinatra'
require 'qiita_scouter_core'

get '/:name' do
  power_levels = QiitaScouter::Core.new.analyze(params[:name])
  format("ユーザー名: %s 戦闘力: %s 攻撃力: %s 知力: %s すばやさ: %s\n", params[:name], *power_levels)
end
~~~

## :running::computer: サーバー起動

~~~bash
% ruby qiita_scouter_server.rb
~~~

## :ballot_box_with_check: 結果を確認

* http://localhost:4567/tbpgr にアクセス

![qiita_scouter_server.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e468e291-3294-c028-7565-94bd46482ad0.png)

## :hourglass: 8 分で終了！！

Ruby の エコシステムと Google 先生の力を実感
Bacon.jsで"ダブルクリック"イベントのストリーム

# 掻い摘んで言うと

- [【翻訳】あなたが求めていたリアクティブプログラミング入門](http://ninjinkun.hatenablog.com/entry/introrxja)←こちらの記事を読んでRPを試してみた。
- RxJSの代わりにBacon.jsを使ってみようと思った。
- 嵌った。

# RxJSのコード(dblclk.js)
最初は素直にRxJSでコードを書いてみた。

```js
function main() {
    var Rx = require('rx');

    var target = document.getElementById('btn');
    var clicks = Rx.Node.fromEvent(target, 'click');
    clicks
        .buffer(clicks.throttle(250))
        .map(function(xs) { return xs.length; })
        .filter(function (n) { return n === 2; })
        .subscribe(function() { target.innerText = ++target.value; });
}

window.addEventListener('DOMContentLoaded', function() {
    main();
});
```

てきとーなindex.htmlを用意。

```html
<doctype html>
<html>
    <head>
        <title>Clicker</title>
        <script src='bundle.js'></script>
    </head>
    <body>
        <button id="btn">0</button>
    </body>
</html>
```

requireを使っているのでbrowserifyを使ってbundle.jsにまとめる。

```bat
browserify -o bundle.js dblclk.js
```

んで、http-serverを起動する。入ってなければ、

```bat
npm i -g simple-http-server
```

で、インストールしてから、

```
start http-server
```

※Windowsを使ってなかったらstartは無視してください。

これで、http://localhost:8080/ にアクセスして、ボタンをダブルクリックするとカウントアップされるデモが見れます。

# Bacon.jsに書き換えてみる

まずは、インストール。

``` bat
npm i baconjs
```

RxJSとイベントストリームの取得の仕方が違うみたい。

```js
    var clicks = Bacon.fromEvent(target, 'click');
```

こんな感じ。

ダブルクリックイベントストリームの胆はこの部分だけど、

```js
        .buffer(clicks.throttle(250))
```

Bacon.jsにもbuffer、throttleメソッドがあるので、とりあえずこのままにして実行。動きません。シグネチャを調べてみたらRxJSとは違っていたので順番を入れ替えたり色々試してみた。が、ダメ。

で、正解は

```js
function main() {
    var Bacon = require('baconjs').Bacon;

    var target = document.getElementById('btn');
    var clicks = Bacon.fromEvent(target, 'click');
    clicks
        .bufferWithTime(250)
        .map(function(xs) { return xs.length; })
        .filter(function (n) { return n === 2; })
        .subscribe(function() { target.innerText = ++target.value; });
}

window.addEventListener('DOMContentLoaded', function() {
    main();
});
```

あれ？butterとかthrottleとかはどこへ行った？

```js
        .bufferWithTime(250)
```

そもそも使うメソッドが違ったという。

結論：ライブラリのドキュメントはちゃんと読め。(前回と同じオチな気がする)
Scalaで正規表現とパターンマッチを使って文字列を抽出して操作するその２：大喜利編

これは、[Scalaで正規表現とパターンマッチを使って文字列を抽出して操作する](http://qiita.com/agata/items/46790c751ce235527592)の続編です。

以前のエントリーを社内のチャットで共有（大喜利）したところ、何名の方から別の書き方を教えてもらいました。

# 秒に変換する処理を別関数化して処理する方法

これは秒に変換する処理を関数としてまとめてあります。重複がなくなり、かつ処理に名前が付いたので以前のもとのよりわかりやすいんじゃないかと思います。正規表現も以前のと比べると`?:`（前方参照を行わない正規表現グループ）を使って、本当に必要な時分秒の３つだけを抽出する形で書かれています。

```scala
val youtubeDurationPattern = "PT(?:([0-9])+H)?(?:([0-9])+M)?(?:([0-9])+S)?".r
def toSec(s: String, unit: Int) = Option(s).map { _.toInt * unit }
def duration(s: String) = s match {
  case youtubeDurationPattern(h, m, s) =>
    (toSec(h, 3600) ++ toSec(m, 60) ++ toSec(s, 1)).sum
}

println(duration("PT2H7M56S"))
println(duration("PT7M56S"))
```

# 抽出子を利用する方法

これが一番Scalaっぽいかも。Timeで定義しているunapplyメソッドを使って、値をInt型として抽出してそのままmatchのcase節に適用できています。Timeを定義するのが少し面倒ですが、最終的なコードは直感的で可読性が高いと思いました。

```scala
object Time{
  def unapply(s: String): Option[Int] = Some(if(s == null) 0 else s.toInt)
}

object YoutubeDuration {
  val youtubeDurationPattern = "PT(?:([0-9])+H)?(?:([0-9])+M)?(?:([0-9])+S)?".r

  def unapply(st: String):Option[Int] = {
    st match {
      case youtubeDurationPattern(Time(h), Time(m), Time(s)) =>
        Some(h * 3600 + m * 60 + s)
      case _ => None
    }
  }
}

val YoutubeDuration(s) = "PT2H7M56S"
```

# おまけ：Java版

Java8の`Optional.ofNullable`と`orElse`を使ったパターンです。Javaのif文では値が返せないので、別のメソッドや集計用の変数を使わずにやるならこんな感じになると思います。

```java
public class YT {

    private final static Pattern YOUTUBE_DURATION_PATTERN
            = Pattern.compile("PT(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)S)?");

    public long duration(String s) {
        final Matcher matcher = YOUTUBE_DURATION_PATTERN.matcher(s);
        if (matcher.find()) {
            return
                Optional.ofNullable(matcher.group(2))
                    .map(it -> Long.parseLong(it)).orElse(0L) * 3600L +
                Optional.ofNullable(matcher.group(4))
                    .map(it -> Long.parseLong(it)).orElse(0L) * 60L +
                Optional.ofNullable(matcher.group(6))
                    .map(it -> Long.parseLong(it)).orElse(0L);
        }
        return 0L;
    }

    @Test
    public void xxx() {
        System.out.println(duration("PT2H7M56S"));
        System.out.println(duration("PT7M56S"));
    }

}
```

## 結論

社内大喜利おもしろい！ :blush:
ofxSQLite is dead.

# 大事なこと

とりあえず, ofxSQLite使わない様にしましょう. ややこしいことになるだけなのでフォークするのもやめましょう.
あと, ofxSQLite is dead. とかdisってるように映りかねない書き方してますが, **roxluをdisりたいわけでは無いです.** これ大事. roxluはカッコイイです.

# [ofxSQLiteCpp](https://github.com/bakercp/ofxSQLiteCpp)を使いましょう.

## why?

[ofxSQLite](https://github.com/roxlu/ofxSQLite) 使ってみたけどかなりイケてない.
sqlite3のバージョンも古いままだし, ofxSQLiteSimpler.h/.cppとかいうわけわかんない動かないソース混ざってるし, 頑張って使えってもメモリリークするって話だし, OUTER JOIN使えないし, WHERE句で `<` とか `>` を使おうとしてもよく分からないし（これに関しては僕の書き方が悪いのかもしれないけど, 少なくともソースのコメントに書いてある様にはやってみた）.

で, 無茶フォークされてて誰もPR投げてないなんて...！とか思ったら[bakercp](https://github.com/bakercp/ofxSQLite)が去年くらいにPR投げてる(他にも修正PR投げてる人は多数居る)んだけどroxluが受け入れてない.

ということで, ofxSQLiteはbakercp版を使いましょう. と思ったらbakercpがofxSQLite使うな, [ofxSQLiteCpp](https://github.com/bakercp/ofxSQLiteCpp)使えってさ.

## ofxSQLiteCpp?

このofxSQLiteCpp, 別にofxSQLiteCppってクラスがあるわけじゃないんだけどSQLiteCppってライブラリがサクッと導入出来てbakercpがそれの使い方のexample書いてくれてるので親切. それはaddonなのかどうかって話もあるけど, まあ, サクッと使えるようになってるし, 無駄にラップしてリークしてもしゃーないし現状としては最高.

どうせofxSQLiteみたいに

```
db->select("data1, data2, data3").from("table_name").when("x", 4).execute();
```

みたいにメソッドチェーンみたいな書き方出来ても結局生のDBクエリが分かってないと使えないわけだしね. （ちゃんと出来たらかっこいいのかもしれないけど）

## それではみなさんもう一度ご唱和ください

#[ofxSQLiteCpp](https://github.com/bakercp/ofxSQLiteCpp)を使いましょう.

## はい

ということでofxSQLiteを使おうとしてハマる人が出ないことを祈ってこの記事を書きました.
_ofxSQLite is dead._ とかdisってるように映りかねない書き方してますが, roxluを責めたいわけじゃないってことだけもう一度最後にきちんと記しておきます.
Microsoft Azure .NET の管理ライブラリのメモ

WindowsはOSで、プラットフォームであり巨大なAPIの塊です。
Azureもプラットフォームであり、APIを多数そろえています。

そこで、そんな視点で見たAzureの関わり方として
やはりAPIから入るってのも面白いんじゃないのかな？と思った今日この頃です。

というわけで、C#からAzureを管理するライブラリです。
MSDNで以下のように簡単なチュートリアルがあります。

#[.NET の管理ライブラリの概要](https://msdn.microsoft.com/ja-jp/library/azure/dn722415.aspx)

上記リンクの流れは概ねこんな感じでしょうか。

１．管理サービス有効化
２．開発環境構築
３．認証方法
４．管理を行う実装
５．動いた！

#[ClassLibrary 英語](https://msdn.microsoft.com/ja-jp/library/azure/dn602775.aspx)
ドキュメントが豊富とはいえないのですが、
APIリファレンスのようなものはあるようです。

触ってみた感じでは

アカウント＞Azureサブスクリプション＞各種サービス

という 1..n の階層構造で成り立っているようです。

また、.Net管理ライブラリは、REST APIを呼び出しているようです。

#REST API
上記の実体？ともいえるような[サービス管理 REST API リファレンス](https://msdn.microsoft.com/ja-jp/library/azure/ee460799.aspx)というのもあるようです。
こちらは日本語のドキュメントが豊富で、入りやすい気がします。
逆にこっちから入って、.Netのクライアントアプリを作ろうというときに、管理ライブラリを使うっていう選択肢もよさそうな気がします。

***
そんなところで、自分好みのUIやら、ツールやら、WEBサイトを作って
世界を股にかけてみる（リージョン）・・・なーんてこともできますね！
react.jsでQiitaの特定ユーザのストックをとってきてみる

react.js本家の[Tutorial](http://facebook.github.io/react/docs/tutorial.html)をちょっと書き換えてQiitaのAPIを叩くようにしてみました。

実際に動くJSFiddleは[こちら](https://jsfiddle.net/69z2wepo/3030/)。

```js
var Stock = React.createClass({
  render: function() {
    // 無駄にスタイルを適用してみる
    var pStyle = {
      color: 'red'
    };
    // StockListコンポーネントのstockNodesをthis.props.childrenでアクセス
    var tags = React.Children.map(this.props.children, function(child) {
      return <p style={pStyle}>{child}</p>
    });
    return (
      <div>
        <h1>
          {this.props.title}
        </h1>
        <h2>
          {this.props.author}
        </h2>
        {tags}
      </div>
    );
  }
});

var StockList = React.createClass({
  render: function() {
    var stockNodes = this.props.data.map(function (stock) {
    console.log('stock',stock);
      return (
        <Stock author={stock.user.id} title={stock.title}>
          {stock.tags.map(function(tag){ return tag.name})}
        </Stock>
      );
    });
    return (
      <div className="stockList">
        {stockNodes}
      </div>
    );
  }
});

var StockBox = React.createClass({
  loadStocksFromServer: function() {
    // ajaxでAPIを叩く
    $.ajax({
      // とりあえずちょっと取得してみたいだけなので3ストック限定で取得
      url: 'https://qiita.com/api/v2/users/' + this.props.userName + '/stocks?page=1&per_page=3',
      dataType: 'json',
      success: function(data) {
        // 取得に成功したらstateに反映
        this.setState({data: data});
      }.bind(this),
      error: function(xhr, status, err) {
        console.error(this.props.username, status, err.toString());
      }.bind(this)
    });
  },
  getInitialState: function() {
    return {data: []};
  },
  componentDidMount: function() {
    // コンポーネントがマウントされたら読み込み開始
    this.loadStocksFromServer();
  },
  render: function() {
    return (
      <div className="stockBox">
        <h1>Stocks</h1>
        <StockList data={this.state.data} />
      </div>
    );
  }
});

// StockBoxコンポーネントのuserNameを適当に変えることで
// 誰かしらのストックをとってくる
React.render(
  <StockBox userName="kenfdev" />,
  document.getElementById('content')
);
```