OmniAICreator/Qiita-1.07M huggingface dataset:
php、array_splice()、 配列の一部を削除し、他の要素で置換する

php、array_splice()、 配列の一部を削除し、他の要素で置換する
==========


■about
----------

 配列の一部を削除し、他の要素で置換する




■code
----------

```php:php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
// ここでは $input は array("red", "green") となる
```




■reference
----------

PHP: array_splice - Manual
http://php.net/manual/ja/function.array-splice.php
php、shuffle()、配列をシャッフルする

php、shuffle()、配列をシャッフルする
==========


■about
----------

配列をシャッフルする




■code
----------

```php:php
<?php
$numbers = range(1, 20);
shuffle($numbers);
foreach ($numbers as $number) {
    echo "$number ";
}
?>
```




■reference
----------

PHP: shuffle - Manual
http://php.net/manual/ja/function.shuffle.php
Selenium実行中にJavaScriptのコードを実行する

##Selenium実行中にJavaScriptのコードを実行する
JavaScriptで画面の値を取得/設定するコードをメモ。

```csharp:WebDriverEx.cs
// JavaScriptを実行（戻り値なし）
public static void ExecuteJavaScript(this IWebDriver driver, string script)
{
    if (driver is IJavaScriptExecutor)
        ((IJavaScriptExecutor)driver).ExecuteScript(script);
    else
        throw new WebDriverException();
}

// JavaScriptを実行（戻り値あり）
public static T ExecuteJavaScript<T>(this IWebDriver driver, string script)
{
    if (driver is IJavaScriptExecutor)
        return (T)((IJavaScriptExecutor)driver).ExecuteScript(script);
    else
        throw new WebDriverException();
}

```

```csharp:使い方
// <input name="hoge">のvalueに「1234567890」を設定
driver.ExecuteJavaScript("document.getElementsByName('hoge')[0].value = '1234567890';");

// <input name="hoge" maxlength="8">のmaxlengthを削除
driver.ExecuteJavaScript("document.getElementsByName('hoge')[0].removeAttribute('maxlength');");

// ページのタイトルをstring型で取得
string str = driver.ExecuteJavaScript<string>("return document.title;");

// ブラウザの現在時刻をDateTime型で取得
DateTime date = driver.ExecuteJavaScript<DateTime>("return new Date();");
```

##IWebElementをJavaScriptで操作する。
By.IdやBy.Nameで取得したIWebElementをJavaScriptで操作するには、
スクリプトの後に引数を追加します。

```csharp:WebDriverEx.cs
// JavaScriptを実行（戻り値なし）
public static void ExecuteJavaScript(this IWebDriver driver, string script, params object[] args)
{
    if (driver is IJavaScriptExecutor)
        ((IJavaScriptExecutor)driver).ExecuteScript(script, args);
    else
        throw new WebDriverException();
}

```

```csharp:使い方
// argumentsに引数の配列が渡されます。
IWebElement e = driver.FindElement(By.Name("hoge"));
driver.ExecuteJavaScript("arguments[0].value = 'piyo';", e);
```
YOLP Android のMapViewからBitmapを取得したい

Yahoo! AndroidマップSDK　を利用し地図アプリを作成しています。
表示された地図をBitmapで取得したいのですが、上手くいきませんでした。

次の２つ方法で取得できませんでした。
　・View.getDrawingCache() を利用しキャッシュから取得する方法
　・View.draw(Canvas)　を利用し、CanvasのBitmapを取得する方法 

良い方法はないでしょうか？
Qiita API の wrapper を書いてみた

まだまだ未熟ですが、Qiita API のラッパーを書いてみたので紹介です。
# 何これ
Go の Qiita API wrapper です。
https://github.com/Warashi/qiita-go

基本的にはqiita-rbをGoに移植した形になります。
https://github.com/yaotti/qiita-rb

# インストール
```sh
go get github.com/Warashi/qiita-go
```

# 使い方
[Github の README.md](https://github.com/Warashi/qiita-go/blob/master/README.md) にちょろっと書いてます。
GoDocには現状何も説明書いてないですが、そのうち書く予定です。
JavaScriptで強制的に文字入力させる際に気をつけるべきこと


# 経緯

[前に投稿した記事](http://qiita.com/clomie/items/2f7021637885c1494d2d)で、keydownで拾ったキー入力を元に別の文字を入力させるようなコードを書いたけど、コードを見ればわかるが実はどの位置でキー入力しても一番後ろにしか入力できない。

## 気をつけるべきだったこと

* readonly属性 
* maxlenth属性
* カーソル位置
* 文字選択の開始位置、終了位置

# コード

上記を踏まえて前回のコードを書き直すと、こんな感じになる。

```js
$.fn.insertChar = function insertChar(ch) {
  if (this.prop("readonly")) {
    return this;
  }

  var from = this.prop("selectionStart");
  var to = this.prop("selectionEnd");

  var val = this.val();
  var newValue = val.slice(0, from) + ch + val.slice(to);

  if (newValue.length >= this.prop("maxlength")) {
    this.val(newValue);
    var range = this[0].createTextRange();
    range.move("character", from + ch.length);
  }

  return this;
}

var charTable = {
    'ﾞ' : '@',
    'ﾚ' : '=',
    'ｹ' : '*'
};

$("input[type=text],textarea").on("keydown", function(e) {
    var converted = charTable[e.char];
    if (e.keyCode === 229 && e.shiftKey && converted) {
        e.key = e.char = converted;
        $(this).insertValue(converted);
        e.preventDefault();
    }
});
```

上の$.fn.insertValueは複数要素にマッチングした場合の処理を考えていないので、その場合はjQuery.accessとか使って実装したほうがいいんだと思う。
openQRM5.1をCentOS6.5にインストールしてみた

proxmox + OpenVzはオワコンなのか？
と思い別のソリューションを探してみたところ、openQRMが有名な様子。
インストールに時間がかかるが、Pluginが多いところと、ソースが公開されている点が魅力。
しかしごちゃごちゃパッケージ依存しているのであとで苦しむと思う。

![スクリーンショット 2014-06-23 6.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5eb4ff5d-df56-b441-11dd-8a92087a075d.png)


# インストール

```bash:
$ wget http://cznic.dl.sourceforge.net/project/openqrm/openQRM-Community-5.1/openqrm-community-5.1.tgz
$ tar xzf openqrm-community-5.1.tgz
$ cd openqrm-community-5.1
```

```diff:etc/openqrm-server.conf
-OPENQRM_SERVER_BASE_DIR=/usr/share
+OPENQRM_SERVER_BASE_DIR=/opt/
-OPENQRM_RESOURCE_BASE_DIR=/usr/share
+OPENQRM_RESOURCE_BASE_DIR=/opt/
```

```bash:60分かかる
$ time sudo make
# ../buildtmp/にファイルがダウンロードされる。次回以降はこれを使うと早いと思う。
```

```bash:
$ sudo make install
#/opt/openqrm にインストールされます。
```

```bash:10分かかる
$ sudo make start
# apacheの設定とかサービスの起動とかします。
```

* http://192.168.100.62/openqrm/
* openqrm : openqrm でログイン。
* ethの設定
* mysqlの設定

## Plugin Managerからインストール

* dhcpd
* local-server
* device-manager
* network-manager
* lxc
ProcessingでLinkedListを使う

# 概要
Processingでテキストエリアを自作しようとしたとき、行の管理(指定行の挿入や削除)をするために順序ありのリスト(LinkedList)が必要となった。
自分の思い込みでProcessingではLinkedListは使えないもんだと思っていたんですが、importすれば普通に使えたので、その方法について。

# 参考
『コレクション(LinkedList)』(JavaDrive)
http://www.javadrive.jp/start/linkedlist/

# 手順
LinkedListをimportし、newする。

``` lang:processing
import java.util.LinkedList;

LinkedList<String> lList = new LinkedList<String>();
```

要素の追加や削除は、要素番号を指定して行います。

``` lang:processing
lList.set(5,"hello");  // 5番目の要素を追加
lList.remove(5);      // 5番目の要素を削除
```

要素を追加・削除すると、それまでの要素番号は更新されます。

# まとめ
ProcessingではLinkedListはあまり使われないのか、見たことがなかった。たしかにArrayList使うことのほうが多い。順番を持った最大数の不定なものを作るときに使えるかなと思います。(具体的な例が思いつきませんが…)
Updating Firefox's addon-sdk easily

Abstract:
To update Firefox addon-sdk, using git repository (https://github.com/mozilla/addon-sdk) is good idea. However, addon-sdk's version and Firefox's version must be corresponding or the cfx command will not work well. So I have written update_addonsdk.rb, which reads `git tag` and determine the latest release.

Firefoxのaddon-sdkを更新する簡単な方法はgitリポジトリを使うことですが、sdkのバージョンをFirefox自体のバージョンと合致させなければうまく動きません。
masterはFirefoxのalpha(nightly)版でしか動かないそうです。
そこで次のようなアルゴリズムでaddon-sdkの更新を試みました。

1. `git checkout master`で一旦masterに戻す
2. `git pull`で更新する
3. `git tag`でタグ一覧を取得、数字とドットのみの行を取り出しソート、最大のものを取り出す
4. `git checkout VER`で当該バージョンに移行する

```rb:update_addonsdk.rb
#!/usr/bin/env ruby
devnull=['mswin','mingw'].any?(&RUBY_PLATFORM.method(:include?)) ? 'NUL' : '/dev/null'
com='git checkout master 2>'+devnull
puts '[*] '+com
IO.popen(com,'r'){|f|f.read}
com='git pull'
puts '[*] '+com
IO.popen(com,'r'){|f|f.read}
com='git tag'
puts '[*] '+com
ver='master'
IO.popen(com,'r'){|f|
	a=f.readlines.map(&:chomp).select{|e|
		e=~/^[\d\.]+$/
	}.map{|e|
		e.split('.').map(&:to_i)
	}.max
	ver=a.join('.')
}
puts '[+] selected '+ver
com='git checkout '+ver+' 2>'+devnull
puts '[*] '+com
IO.popen(com,'r'){|f|f.read}
```
ギークの精神と対人コミュニケーションとトレードオフスライダー

#リーダー論に対する違和感

最近、開発のプロジェクトマネージメントをしている。その仕事を通して、リーダー論や開発手法の書物を読むことが多くなった。

特に、リーダー論を読むことが多くなった。しかし、リーダー論に関する本を読んでいると、とても違和感を感じることが多かった。その違和感の正体をぼんやり考えていたのだが、アジャイル開発のインセプションデッキに関する話(アジャイルサムライという本に出てくる)で、トレードオフスライダーについて知ったところ、違和感の正体に思い至ったので書いておく。

#トレードオフスライダーとは

アジャイル開発の本(アジャイルサムライ)に、トレードオフスライダーというものが紹介されている。図示すると、次のようなものだ。

![tos2.png](https://qiita-image-store.s3.amazonaws.com/0/26986/bf7beb2b-6ad7-7a92-b2a9-b08b43cef1f6.png)

プロジェクトの重要項目に、優先順位をつけて、どれを犠牲にして、どれを守るか図示したものだ。例えば、ソフトウェアプロジェクトの四大要素(予算、時間、品質、スコープ)の内、どれを優先するかを、maxからminの間で、調整して図示するものになっている。いわば、プロジェクトにおいて、何を守り、何を捨てるかの見える化である。この仕組では、すべての項目をmaxにすることは許されない(それだと意味が無い)。何かが得たければ何かを捨てるしか無い。

このトレードオフスライダーでは、予算と品質を守るために、時間とスコープを犠牲にしている。この表によって、予算を守るために、時間を伸ばしたり、当初入れるべき機能を削ると言った判断を行えるようになる。

# 人間にだってトレードオフスライダーはある。

この考え方は人間や人生にだって応用できる。お金の項目の優先度を上げる人もいれば、余暇の項目の優先度を上げる人もいる。普通の人はスーパーマンではないだから、何かを得ようと思えば何かを捨てなければならない。

# ギークのトレードオフスライダー

私は長いこと、プログラマーをしてきたし、オープンソースとかを横目で見てきたら、ギーク(プログラミングやシステム開発がものすごく得意な人)の知り合いが何人かいる。彼らを観察した結果を、トレードオフスライダーにまとめたら次のようになる。

![TOS.png](https://qiita-image-store.s3.amazonaws.com/0/26986/a597bdf3-6996-9b65-dde0-75e6ccfb746c.png)

見てわかるようにプログラミングスキルに高い優先度を割り振る一方、対人スキルはあまり優先されない。私はドワンゴでプログラマーとして働いた経験があるが、エンジニアとして高いプログラミングを持つが、対人スキルが不得手な人を何人も見てきた。彼らは、プログラミングが本当に好きで、平日会社で仕事のプログラミングを書いたあと、休日も趣味のプログラミング開発に没頭する。プログラミングを愛していると言って良い。一方、対人スキルが高いかいえばそんなことは全然なく、よく分からないことに拘ったり、へそを曲げたりする(一応補足しておくが、そんなに変な人だけでなく一応まともな人も居た)。

ドワンゴのエンジニアはインターネット上で有名人も多いので、何人か思い浮かべればなんとなく納得できるのではないだろうか？

優れたエンジニアスキルやプログラミングスキルに向上に熱心なあまり、対人スキルが上手く行かないということはなんとなく専門家と言われる人たちを思い浮かべれば納得行くかもしれない。

しかし、彼らにも転機が訪れる。いわゆるリーダー問題である。

#リーダーにおけるトレードオフスライダー

リーダーの資質におけるトレードーオフスライダーはどのようになるだろうか？私はリーダー論の本を読む限り、次のようになる。

![leader.png](https://qiita-image-store.s3.amazonaws.com/0/26986/108b6c88-6924-9389-9ded-aee93ea5805f.png)

何はなくとも対人スキルなのだ。少なくとも対人スキルを軽視せよと書いたリーダー論の本は無い。しかも、腹立たしいことに、リーダー論の著者たちは、高度な対人スキルを事も無げに実行する。

今まで、対人スキルを磨かずに、プログラミングスキルを磨いてきたギークにはこれは辛い。真似しようにもどこから真似したら良いかも分からない。

# トレードオフを変更するとき

もともと、 **対人スキルを捨てる** ことで、 **高いプログラミングスキル** を身につけて来た。それを今日から、対人スキルも身につけましょうというメッセージは、それは今までプログラミングスキルを優先し、その代わり対人スキルを捨ててきた人生の優先度そのものの変更を意味する。その喪失感をどのように埋め合わせるのか、そのような気持ちにフォーカスしたリーダー論の本は無いように思う(あったら教えてほしい)。

# ギークの為のリーダー論があれば良いのに。

私が、リーダー論の本を読んで違和感を感じるのは、彼らは対人スキルを優先させることがあたりまえだと思っている所だ。日本の場合、現場で優秀であったプレイヤーが、管理職になることが多い。しかし、彼らは現場では、実際は対人スキルより、プログラミングスキルや設計スキルといった対人スキル以外のスキルに注力している。そのような専門家向けのリーダー論の本というものを見つけることができなかった。現場においてプログラミングや設計と言ったモノに情熱を傾けた人ほど、それらから離れてしまうことに心理的な抵抗感や喪失感を感じる。そのような感情をケアする本があれば良いのに思った。

# ちなみに、プログラミングスキルも対人スキルも高い人達は？

ちなみに、プログラミングスキルも高くて、対人スキルも高いナイスガイが世の中にいないかというと居るところには居る。Googleで会った人とかDeNAで会った人とかの中には、プログラミングも出来るし、ナイスガイな人が何人か居た。でも、彼らは、あまりに希少なので、ついでにお給料も、高めだった。トレードオフスライダーで図示するとこんな感じ。

![tarented.png](https://qiita-image-store.s3.amazonaws.com/0/26986/5982ba36-9a4d-3de5-03d2-eef11ea59f2e.png)


まあ、そんな優秀な人間がおいそれと居るわけもなく、大抵の場合は、極端なトレードオフスライダーをリーダーとして騙し騙し使っていくしか無いわけである。
JBOSSチューニング

# JBOSSチューニングパラメータ

## 環境

* Windows7
* JBOSS EAP 6

*standalone.conf.bat*
---------------------------------------------------

```bat
:JAVA_OPTS_SET
set "JAVA_OPTS=-Xmn2G -Xms4G -Xmx4G -XX:MaxPermSize=512M"  
set "JAVA_OPTS=%JAVA_OPTS% -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman"  
set "JAVA_OPTS=%JAVA_OPTS% -verbose:gc -Xloggc:%JBOSS_HOME%\standalone\log\gc.log"  
set "JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"  
set "JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M"  
set "JAVA_OPTS=%JAVA_OPTS% -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%JBOSS_HOME%\standalone\log\" 
```

## パラメータ詳細

### -Xmn                
> New領域サイズ

### -Xms
> ヒープ全体（New領域＋Old領域）の初期値

### -Xmx
> ヒープ全体（New領域＋Old領域）の最大値

### -XX:MaxPermSize
> Permanent 領域の最大値

### -Djava.net.preferIPv4Stack=true
> IPv4アドレス優先

### -Djboss.modules.system.pkgs=org.jboss.byteman
> バイトコード操作用

### -verbose:gc
> GCログ出力(簡易版)

### -Xloggc:%JBOSS_HOME%\standalone\log\gc.log
> GCログの出力と出力先の設定
このままだとファイル名が上書きされるのでタイムスタンプを付加できるようにしたい。
gc.log.\`date +%Y%m%d%H%M%S\`みたいな。でもDOSだとわかんない。

### -XX:+PrintGCDetails
> GCログを詳細に出力(New領域とJavaヒープそれぞれがどれだけ減ったか出力される)

### -XX:+PrintGCTimeStamps
> GCログにタイムスタンプ(Java起動時からの経過時間)を出力

### -XX:+UseGCLogFileRotation
> GCログのファイルローテーション

### ~~-XX:NumberOfGCLogFiles=5~~
> 5ファイルでローテーション
これ追加すると何故かメモリリークする

### ~~-XX:GCLogFileSize=10M~~
> 10Mでサイズローテーション
これ追加すると何故かメモリリークする

###-XX:+HeapDumpOnOutOfMemoryError
> OutOfMemoryError発生時にヒープダンプを出力

###-XX:HeapDumpPath=%JBOSS_HOME%\standalone\log\
>ヒープダンプ出力先の設定

## 今後決めておくべきパラメータ

### -XX:SurvivorRatio
> Eden領域のサイズをS0またはS1領域のサイズで割った値

### -XX:MaxTenuringThreshold
> マイナーGCの繰り返しによりOld領域へ配置される閾値

|-XX:TargetSurvivorRatio
> Survivor領域がいっぱいと判断される使用率

## クラスヒストグラムは定期的に取得する

### `jcmd <pid> GC.class_histgram`
> Javaヒープの多くを占めているクラスをテキスト形式で取得できる。


## 解析ツール
* [GCViewer](https://github.com/chewiebug/GCViewer)
* [Eclipse Memory Analyzer](http://www.eclipse.org/mat/)
* [HeapStats](http://icedtea.classpath.org/wiki/HeapStats/jp)

- - -

## 参考
* [nekop's blog](http://nekop.hatenablog.com/entry/20111215/1324005497)
* [Javaメモリ、GCチューニングとそれにまつわるトラブル対応手順まとめ](http://d.hatena.ne.jp/learn/20090218/p1)
* [JVMのチューニング](http://d.hatena.ne.jp/ogin_s57/20120709/1341836704)
* [Javaトラブルに備えよう](http://www.slideshare.net/agetsuma/java-34815905)
Ruby2.1.0からデフォルト値なしのキーワード引数が使えると聞いて

[Ruby 2.1.0リリース！注目の新機能を見てみましょう | TechRacho](http://techracho.bpsinc.jp/baba/2013_12_26/15026) に書いてある

```rb
def hello(name: )
puts name
end
 
hello("taro")
# => taro
# 実際はこうなる => ArgumentError: missing keyword: name
```

という例は動かないみたいだ. しばらく悩んでしまった. 「デフォルト値なし」というよりも「必須指定ができるようになった」と言う方がしっくり来た.

```rb
RUBY_VERSION
#=> "2.1.0"

def hoge(a: )
  p a
end

hoge(a: 'aaa')
#=> "aaa"

hoge('aaa')
#=> ArgumentError: missing keyword: a

hoge
#=> ArgumentError: missing keyword: a
```
using namespace stdに起因する誤作動をJava/C#でも

C++でusing namespace stdを使うと、衝突せずにコンパイルが通ってしまう場合があることを知った。
http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice#1453605

例えばこんなコード。

```cpp:conflict.cpp
#include <algorithm>
#include <cstdio>
//このmin関数はあってもなくてもコンパイルは通るが実行結果は全く異なる
int min(int a,int b){return a+b;}
using namespace std;

int main(){
	printf("%d\n",min(2,3));
	return 0;
}
```

衝突する場合しか知らなかったのですが、これは怖いですね…。
で、同じようなことをJava/C#でやってみたらできてしまったのでコードを紹介。

```java:conflict.java
import java.util.*;
//このRandomクラスはあってもなくてもコンパイルは通るが実行結果は全く異なる
class Random{
	public int nextInt(){return 123456789;}
}
class Main{
	public static void main(String[]args){
		System.out.println((new Random()).nextInt());
	}
}
```

- 異なるパッケージをワイルドカードでインポートしてクラスが衝突したら完全修飾名しか許容しない
- パッケージ名.クラス名でインポートすることは1度しかできず、そのクラスは必ずクラス名のみで使える
  - 上の例のRandomクラスはこれに相当

```csharp:conflict.cs
using System;
//このRandomクラスはあってもなくてもコンパイルは通るが実行結果は全く異なる
class Random{
	public int Next(){return 123456789;}
}
class Conflict{
	static void Main(){
		Console.WriteLine((new Random()).Next());
	}
}
```

- 異なる名前空間をインポートしてクラスが衝突したら完全修飾名しか許容しない
- usingディレクティブで(長い)名前空間に別名をつけることは可能

C++も今の状況になったら例えば::minかstd::minしか許容しなくなるようなオプション付けばよいですね。実行前に気づけるので。
…だったら必ずstd::使えばよいのか。using namespace stdして一部の例外だけstd::使うのは気持ち悪いということにもなるし。
Light TableでClojureScriptコードを書く

Light TableでClojureScriptの開発するにはどうするのがいいんでしょうか？
まだほとんど触ってませんが[cljs-kickoff](https://github.com/konrad-garus/cljs-kickoff)のLeiningenテンプレートを使うのが楽そうです。
（他にも何かいい方法ないでしょうか？）

これを使う場合、

1. `lein new cljs-kickoff my-project`でプロジェクト作成
2. 別々のシェルで
`lein ring server` 
`lein cljsbuild auto`
を実行して、サーバ起動(port:3000)とcljとcljsを自動コンパイルできるようにしておく
3. Light TableのWorkspaceに`my-project`を入れる
4. cljsファイルのns定義のところで`Ctrl-Enter`してLight Table内のBrowserに接続
5. Browserでlocalhost:3000を開く

とすれば、ClojureScriptのコードをリアルタイムにBrowserに反映して確認できそうです。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/5289df00-d294-c7e0-3b93-e75818cd6c2d.jpeg)

他に、Light TableではHTMLのページなども`Ctrl-Enter`しておけば修正内容がリアルタイムにBrowserに反映されるようになるので、いろいろ便利そうです。


注意点として、cljsファイルのコンパイル結果のjsファイルの読み込みがBrowserで開いているページでされていないと、cljsファイル中の式の評価をするときに`ReferenceError: goog is not defined`のエラーがでたりします。
※「Click here」のページだとエラー。「Click me」のページならOK
クリックするたびにツイート文が変わるTwitterボタン

クリックするたびに別の文章をつぶやけるTwitterボタンです。

デモ
http://jsdo.it/butchi/super_tweet

Twitterボタンのクリックイベントを拾うにはwidget.jsを読み込めばいいものだと思っていましたが、[こちら](https://dev.twitter.com/docs/tfw/set-up)の特別なスクリプトを読み込まなければいけないようです。

参考:
[Tweet Button の独自イベントを取得してみる - しばやん雑記](http://shiba-yan.hatenablog.jp/entry/20130418/1366272125)

```html:index.html
<html>
<head>
  <title>スーパーツイート</title>
</head>

<body>

<div class="twitter">
    <a href="https://twitter.com/share" class="twitter-share-button" data-via="butchi_y" data-hashtags="すごいパンチ"  data-url="http://jsdo.it/butchi/super_tweet">Tweet</a>
</div>

<script type="text/javascript" charset="utf-8">
  window.twttr = (function (d,s,id) {
    var t, js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
    js.src="//platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs);
    return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
  }(document, "script", "twitter-wjs"));
</script>

<script type="text/javascript" src="lib/jquery-1.10.2/js"></script>
<script type="text/javascript" src="lib/underscore-1.4.4/js"></script>
<script type="text/javascript" src="main.js"></script>
</body>
</html>
```

```js:main.js
var vocabulary = [
    'グレート',
    'エクセレント',
    'ネオ',
    '超絶',
    'ミラクル',
    '豪快',
    'ハイパー',
    'マスター',
    'ウルトラ',
    'グランド',
    'ワンダフル',
    'アルティメット',
    'メガ',
    'ギガ',
    'テラ',
    '何となくすごい',
    '面白'
];

var $twitterElm;
var superTxt;
var tweetHtml;

$(function() {
    $twitterElm = $(".twitter");
    tweetHtml = '<a href="https://twitter.com/share" class="twitter-share-button" data-via="butchi_y" data-hashtags="すごいパンチ"  data-url="http://jsdo.it/butchi/super_tweet">Tweet</a>'
    
    twttr.ready(function() {
        setTweet();
        
        twttr.events.bind('click', function() {
            setTweet();
        });
    });
});

function setTweet() {
    var superPrefix = _.first(_.shuffle(vocabulary),10).join('');
    superTxt = superPrefix + 'パンチ';
    $twitterElm.html(tweetHtml);
    $twitterElm.find('.twitter-share-button').attr('data-text', superTxt);
    twttr.widgets.load();
}
```
Dockerコンテナの状態保存/再開がCRIUでできるかどうか試す -> ダメでした。

VMにあってコンテナにないもの。色々あるでしょうが、一つはコンテナの停止/再開による状態保存でしょう。VMだと気軽にマシンをストップして途中の状態から再開とかできるんですが、コンテナだとできません。

色々調べている内に、[CRIU](http://criu.org/Main_Page)というプロジェクトがあることを知りました。CRIUはいわゆるCheckpoint/Restartツールで実行中のプロセスの状態をファイルに保存して、後で再開することができます。

コンテナはあくまでひとつのプロセスなので、これを使えばDockerコンテナの停止/再開ができそうです。

試してみた結果を[自分のブログ](http://kimh.github.io/blog/jp/criu/experiment-to-suspend-and-resume-docker-container-with-criu-jp/)に載せています。

結論をいうと、2014/06の時点で最新のCRIUではDockerコンテナの停止/再開はできないことがわかりました。理由はCRIUがcgroupsをサポートしていないからです。cgroupが導入される以前のコンテナならできるみたいですが、Dockerはcgroupを使っているのでできないのです。

ただ、 **CRIU** なかなかおもしろいやつです。もっと開発が進めば、状態保存の先にあるコンテナのLive Migrationとかも可能になりそうです。そうゆう可能性のわりには陰の薄いプロジェクトなので、興味がある方はぜひ試してみてください。
Missing argument label in curried function

Swiftでは名前付きパラメタを関数に設定することができる。

```swift
func add3(#v1: Int, #v2: Int, #v3: Int) -> {
    return v1 + v2 + v3
}

add3(v1: 1, v2: 2, v3: 3) // -> 6
```

`#`でパラメタ名と同じラベルを自動的に生成してくれるので呼び出すときにはこれを各パラメタの前につけてあげればいい。

ちなみに名前付きパラメタを生成した場合は必須となるらしく、名前を指定せずに利用しようとするとエラーになる。
```swift
add3(1, 2, 3) // -> Missing argument labels 'v1:v2:v3' in call
```

## Curried function
このことを踏まえると実はカリー化された関数では不思議なことが起きる。
先ほどの関数をカリー化する

```swift
func add3(#v1: Int, #v2: Int)(#v3: Int) -> Int {
    return v1 + v2 + v3
}

add3(v1: 1, v2: 2)(v3: 3) // -> 6
```

名前つきパラメタを生成したくない場合は#を外してみるが、

```swift
func add3(v1: Int, v2: Int)(v3: Int) -> Int {
    return v1 + v2 + v3
}

add3(1, 2)(3) // -> Missing argument label 'v3:' in call
```

エラーが出てしまう。どうやら`v3`のラベルが必要なみたい。以下のように呼んであげると正しく動作する。

```swift
add3(1, 2)(v3: 3) // -> 6
```

どうやらカリー化された最後の呼び出し部分は勝手に名前付きパラメタにされてしまうらしい。これはつらい

## どうしたらいいのか？

[Advanced Swift](https://developer.apple.com/videos/wwdc/2014/)にクラスのinitializerを名前付き引数から解放する方法が載ってた。
普通は以下のようになる。

```swift
class SomeClass {
    let v1: Int
    let v2: Int
    init(v1: Int, v2: Int) {
        self.v1 = v1
        self.v2 = v2
    }
}

let sc = SomeClass(v1: 1, v2: 2)
```

でもinitializerに名前付き引数は要らないのでパラメタをダイレクトに渡したい場合は以下のようにする

```swift
class SomeClass {
    let v1: Int
    let v2: Int
    init(_ v1: Int, _ v2: Int) {  // _をつけてあげる
        self.v1 = v1
        self.v2 = v2
    }
}

let sc = SomeClass(1, 2)
```

これがつかえないかとやってみた

```swift
func add3(v1: Int, v2: Int)(_ v3: Int) -> Int {
    return v1 + v2 + v3
}
// -> Extraneous '_' in parmeter 'v3' has no keyword argument name  

add3(1, 2)(3) // -> Missing argument label 'v3: in call
```

何故かWarningがでる。もともと名前付きパラメタじゃないから余分だよみたいなことを言われる。でもやっぱり呼び出すときは`v3`ラベルが必要みたい。結局どうしたらいいかはまだ分かっていません :cry:
メモ: writeToFile出来ない

json便利ですよね. みなさん大好きですよね？json.
httpリクエストのレスポンスは取り敢えずjsonにしてる皆様こんばんわ.

常識なのかも知れませんが, jsonにnullが入ってる奴をNSJSONSerializationでNSDictionaryとかNSArrayとかに変換してwriteToFileしようとすると保存出来ないんですね. さっき知りました.

これなかなか怖いですね.

大人しくjsonのまま保存するか https://github.com/ishkawa/ISRemoveNull 辺りを使って回避しましょう.

それでは, みなさま, 快適なjsonライフを.

一応追記:
正確には, NSNullが入ったNSDictionary/NSArrayをwriteToFileするとうまくいかないってことですね.
処理時間の計測

javaで処理時間を計測するにはSystemクラスのcurrentTimeMillisメソッドを使うのが一番簡単みたい？currentTimeMillisは現在の時間を所得するメソッドなので、計測したい処理の前後の時間を計測して、引き算で処理時間が求まるっていう感じですかね・・

```java:time.java
long start = System.currentTimeMillis();

//計測したい処理を記述

long end = System.currentTimeMillis();
System.out.println((end - start)  + "ms");
```
Objective-CとSwiftでのUNIX時間の変換


## UNIX時間とは

1970年1月1日午前0時0分0秒からの経過秒数で表す時刻表現。

UNIX時間 - Wikipedia
http://ja.wikipedia.org/wiki/UNIX時間

## Objective-Cの場合

```objectivec:main.m
// UNIX時間をNSDate形式に変換
NSString *stringDate = @"1402918625";
NSDate *date = [NSDate dateWithTimeIntervalSince1970:stringDate.doubleValue];

// NSDateFormatterを使用して任意のフォーマットの日本標準時間に変換
NSDateFormatter *outputFormat = [[NSDateFormatter alloc] init];
[outputFormat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"]];
[outputFormat setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSLog(@"Result:%@",[outputFormat stringFromDate:date]);
```

## Swiftの場合
```swift:main.swift
// UNIX時間をNSDate形式に変換
let stringDate = "1402918625"
let date = NSDate(timeIntervalSince1970:Double(stringDate)!)

// NSDateFormatterを使用して任意のフォーマットの日本標準時間に変換
let outputFormat = NSDateFormatter()
outputFormat.locale = NSLocale(localeIdentifier: "ja_JP")
outputFormat.dateFormat = "yyyy/MM/dd HH:mm:ss"
print("Result:\(outputFormat.stringFromDate(date))")
```
ブランチ切っときゃよかった（git勉強メモ）

# 参考にしたページ

* [Gitでブランチを作るのを忘れてmasterにコミットしてしまったときの対処法](http://qiita.com/atskimura/items/a90dfa8bfc72e3657ef9)
* [今さら聞けないgit pushコマンド](http://shoma2da.hatenablog.com/entry/2014/03/08/234523)

# 経緯

[某ソフトウェア](http://github.com/zetamatta/nyagos)に試しに Lua を組み込んじゃったけど、「master」ブランチでやっちゃった。「mruby」にするかもしれんし、別ブランチにしときゃよかったなー

# やってみた

Lua を組み込む前の commit で、ブランチを作成する

```text
git branch Lua 9ca44d6dce92e2c27476704feda38789fb280c1a
```

(HEAD表記はズレてたら、こわいんで。しかし、Lua を組み込む前なのに、なぜ、ここで Lua というブランチ名にするのだ＞俺)

master と Lua を入れ替える

```text
$ git branch -m master lua_
$ git branch
* Lua
  lua_
$ git branch -m Lua master
$ git branch -m lua_ Lua
$ git branch
  Lua
* master
```

git log を見る限り、これでよい気がした。これから、github に upしようと思ったが…

# まずそうだ。

```text
$ git checkout Lua
Switched to branch 'Lua'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
[C:nyagos]
$ git checkout master
Switched to branch 'master'
```

なんか、このまま git push --all すると、まずそうだ。なんとかしないと。

```text
git push -u origin Lua:Lua
```

こっちはうまいこといった。

```text
$ git push -u origin master:master
Username for 'https://github.com': zetamatta
Password for 'https://zetamatta@github.com':
To https://github.com/zetamatta/nyagos.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/zetamatta/nyagos.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

こっちは既に Up 済みの commit があったので、失敗した。

```text$ git push -u -f origin master:master
Username for 'https://github.com': zetamatta
Password for 'https://zetamatta@github.com':
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/zetamatta/nyagos.git
 + ef5ff32...9ca44d6 master -> master (forced update)
Branch master set up to track remote branch master from origin.
```

-f オプションで強制したら、いけた。そんな修正で大丈夫か？

# お願い

足りんとことか、まずいとこあったら、教えていただけると幸いです。
WebGL に対応する C++ なフレームワーク


Unity や UE4 といったゲームエンジンを使うには重すぎるけど、3D 描画処理を直接書きたくないという中間解な（シーングラフ）フレームワークをのせます。いずれも emscripten 経由で WebGL に対応。これ以外に何かあればコメントください。

## [minko](http://minko.io/)

もともと Stage3D を搭載する Flash Player 向けの 3D フレームワークだったが、[3.0 から C++11 を使って書き直され、OpenGL の汎用的な 3D フレームワークとなった](http://ics-web.jp/lab/archives/1014)。

 - [Windows/OSX/Linux/iOS/Android に対応](http://doc.v3.minko.io/wiki/Platform_compatibility_matrix)
  - WebGL 対応はプラグインとして提供されている
  - minko/plugin/webgl/README.md で言及している emscripten のインストール方法のリンクが 404 になってしまうが正しいリンクは [http://doc.v3.minko.io/wiki/Targeting_HTML5](http://doc.v3.minko.io/wiki/Targeting_HTML5)
 - プラグイン経由で SDL2 上で動作。作れば GLFW もいける？
 - JSON 形式のエフェクトでシェーダ言語は GLSL を使う
 - email 対応または電話対応によるサポートを行う商用版もある
 - [github](https://github.com/aerys/minko) 上でソースコードが公開されている
 - MIT ライセンス

## [bgfx](https://github.com/bkaradzic/bgfx)

クロスプラットフォームなレンダリングに特化したフレームワーク

 - Windows/OSX/Linux/iOS/Android に対応
  - Windows に関しては Direct3D に対応
  - SDL2 または GLFW 上で動作
  - C99 API もあり、それを使ったバインディングもある
 - GLSL に近い独自のシェーダを使う
  - エフェクトシステムはないようだ
 - [github](https://github.com/bkaradzic/bgfx) 上でソースコードが公開されている
 - 2条項 BSD ライセンス

## [magnum](http://mosra.cz/blog/magnum.php)

C++11 をベースとする 2D/3D 両利きのグラフィックエンジン

 - Windows/OSX/Linux に対応
  - SDL2 または GLUT 上で動作
 - OpenGL に特化
 - [github](https://github.com/mosra/magnum) 上でソースコードが公開されている
  - サンプルは [magnum-examples](https://github.com/mosra/magnum-examples) として公開されている
 - MIT ライセンス

## [oryol](https://github.com/floooh/oryol/)

C++11 をベースとするグラフィックエンジン

 - Windows/OSX/Linux に対応
 - ~~OpenGL に特化~~
   - 後述の sokol に置き換えたことからポータブルになりました
 - [github](https://github.com/floooh/oryol/) 上でソースコードが公開されている
   - Core/Gfx を中心として複数のモジュールで構成されている
   - [ライブデモ](http://floooh.github.io/oryol/) あります
 - MIT ライセンス

## [sokol](https://github.com/floooh/sokol)

C 言語でかかれた最小主義のグラフィックライブラリ

- Windows/macOS/Linux に対応
- [single_file_libs](https://github.com/nothings/single_file_libs) の流儀に沿う形でヘッダーオンリー
- 前述の Oryol が使用している
- サンプルは [sokol-samples](https://github.com/floooh/sokol-samples) で公開されてる
  - [ライブデモ](https://floooh.github.io/sokol-html5/index.html) あります
- zlib ライセンス

## 番外

WebGL 出力が出来ない、あるいは C++ ではないと条件を満たせなかったもの

### [three.cpp](https://github.com/jdduke/three_cpp)

three.js の C++ 移植。WebGL での出力に対応しているか怪しいため番外枠。また、実装ベース元は r50 と古く、現在 r65 ベースの実装が進められている

 - C++11 で記述
 - ヘッダーオンリー
 - [github](https://github.com/jdduke/three_cpp) 上でソースコードが公開されている
 - MIT ライセンス

### [libGDX](http://libgdx.badlogicgames.com/)

プレフィクスに lib ってついてるから C/C++ っぽく見えるけど Java の実装で、WebGL での出力が可能。ちなみに Qiita 内に [libGDX のタグ](https://qiita.com/tags/libgdx) がある

### [gfx-rs/wgpu](https://github.com/gfx-rs/wgpu)

Rust で書かれているものの `wgpu-native` による C API が存在するため C/C++ から利用することが可能だが WebGPU 向けのライブラリのため除外
RuboCop | Style/CaseIndentation Indent One Step

# RuboCop | Style/CaseIndentation Indent One Step

## 概要

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

when のインデントを case と end どちらに合わせるかを設定します。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|Indent One Step|false|whenをcaseかendに揃える。（どちらに揃えるかはSupportedStyles次第）|○|
|Indent One Step|true|whenをcaseかendより1段階インデントする（どちらに揃えるかはSupportedStyles次第）|--|

## CaseIndentation Indent One Step

各設定値（false, true）での検証結果をまとめます。

### 検証プログラム

indent_one_step.rb

~~~ruby
i = 1
rets = case i
       when 1
         print '1'
       when 2
         print '2'
       when 3..4
         print '3..4'
       end

print rets

rets = case i
       when 1
         print '1'
       when 2
         print '2'
       when 3..4
         print '3..4'
end

print rets

rets = case i
         when 1
           print '1'
         when 2
           print '2'
         when 3..4
           print '3..4'
       end

print rets

rets = case i
         when 1
           print '1'
         when 2
           print '2'
         when 3..4
           print '3..4'
end

print rets
~~~

### 実行結果 case の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
CaseIndentation:
  IndentWhenRelativeTo: 'case'
  IndentOneStep: false
~~~

whenがcaseと揃っていない場合に警告が出ます。

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

Offenses:

indent_one_step.rb:25:10: C: Indent when as deep as case.
         when 1
         ^^^^
indent_one_step.rb:27:10: C: Indent when as deep as case.
         when 2
         ^^^^
indent_one_step.rb:29:10: C: Indent when as deep as case.
         when 3..4
         ^^^^
indent_one_step.rb:36:10: C: Indent when as deep as case.
         when 1
         ^^^^
indent_one_step.rb:38:10: C: Indent when as deep as case.
         when 2
         ^^^^
indent_one_step.rb:40:10: C: Indent when as deep as case.
         when 3..4
         ^^^^

1 file inspected, 6 offenses detected
~~~

### 実行結果 end の場合

.rubocop.yml

~~~yaml
CaseIndentation:
  IndentWhenRelativeTo: 'case'
  IndentOneStep: true
~~~

whenがcaseから一段階インデントされていない場合に警告が出ます。

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

Offenses:

indent_one_step.rb:3:8: C: Indent when one step more than case.
       when 1
       ^^^^
indent_one_step.rb:5:8: C: Indent when one step more than case.
       when 2
       ^^^^
indent_one_step.rb:7:8: C: Indent when one step more than case.
       when 3..4
       ^^^^
indent_one_step.rb:14:8: C: Indent when one step more than case.
       when 1
       ^^^^
indent_one_step.rb:16:8: C: Indent when one step more than case.
       when 2
       ^^^^
indent_one_step.rb:18:8: C: Indent when one step more than case.
       when 3..4
       ^^^^

1 file inspected, 6 offenses detected
~~~
OpenCV2 + Pythonで背景を単色で埋める


OpenCVで画面を初期化するときに、背景に色つけたいなーと思ったのですが、思った以上に四苦八苦したのでメモ。

## この記事で行うこと

+ OpenCV2 + Pythonで画面を初期化する時に色を付ける方法を考える

## 四苦八苦するポイント

[cv::Matの基本処理](http://opencv.jp/cookbook/opencv_mat.html)を見ると、OpenCV1は、画像データとしてIplImageという構造体を使うのに対して、OpenCV2はcv::Matというクラスを使う形に変わっています。

OpenCV1では、cvCreateImageで初期化しているのですが、この部分をOpenCV2でどうするかがポイントです。

Pythonの場合は、numpyの配列構造がそのまま使えるので、慣れてくると簡単なんだろうなと思いつつ、慣れていないのでOpenCV1のCのサンプルをどのようにしたらいいのかわからんのです。

## いろいろ調べて試してみた

インターネットを潜ると、いろいろな方法があったので、並べてみました。ちなみに、OpenCVで画像を表示するときは色の並び順がBGRになります。

```example_colorfill.py
# coding: UTF-8
import numpy as np
import cv2


# 10 x 10 の3レイヤー(BGR)を定義
size = 10, 10, 3

# cv2.fillPolyで赤に埋める
red_img = np.zeros(size, dtype=np.uint8)
contours = np.array( [ [0,0], [0,10], [10, 10], [10,0] ] )
cv2.fillPoly(red_img, pts =[contours], color=(0,0,255))

# cv2.rectangleで青に埋める
blue_img = np.zeros(size, dtype=np.uint8)
cv2.rectangle(blue_img,(0,0),(10,10),(255,0,0),cv2.cv.CV_FILLED)

# np.fillで白に埋める
white_img = np.zeros(size, dtype=np.uint8)
white_img.fill(255)

# np.tileで緑に埋める
green_img = np.tile(np.uint8([0,255,0]), (10,10,1))

# 10 x 10 の単階調で灰色に埋める
gray_img = np.tile(np.uint8([127]), (10,10,1))

# リストの最初から最後までを紫に埋める
# 参考: http://stackoverflow.com/questions/4337902/how-to-fill-opencv-image-with-one-solid-color
purple_img = np.zeros(size, dtype=np.uint8)
purple_img[:] = (255, 0, 255)

# RGBの並びをBGRに変換して黄色に埋める
yellow_img = np.zeros(size, dtype=np.uint8)
rgb_color = (255,255,0);
yellow_img[:] = tuple(reversed(rgb_color))

cv2.namedWindow("yellow image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("yellow image",yellow_img)
cv2.namedWindow("purple image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("purple image",purple_img)
cv2.namedWindow("gray image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("gray image",gray_img)
cv2.namedWindow("green image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("green image",green_img)
cv2.namedWindow("white image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("white image",white_img)
cv2.namedWindow("red image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("red image",red_img)
cv2.namedWindow("blue image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("blue image",blue_img)
cv2.waitKey(0)
```

実行すると、それぞれの色で埋められた画像が表示されます。

## おすすめ
最初に０で埋めてリスト操作で色埋めする方法と、np.tileで最初から色で埋めてしまう方法のどちらかかなと思います。

どちらにしても、C++とはいまいち互換性のなさそうな部分ですね。
djbdnsメモ

```text:記号の意味
+       : lookup domainname -> ip
@ mx    : smaller num is high priority
' txt   : spf record
^ PTR   : lookup ip -> domainname
C CNAME : alias
```

```text:spf書き方1
'sample.jp:v=spf1 +ip4\07211.22.33.44/28 ~all:3600
```

```text:spf書き方2
'sample2.jp:v=spf1 include\072spf1.sample2.jp ?all:86400
'spf1.sample2.jp:v=spf1 ip4\07222.33.44.55/28 ip4\07233.44.55.66/28 ?all:86400
```
SwiftでCの配列を使う

Swiftの時代になっても、既存のAPIとの互換性とのために、Cの配列をやりとりするAPIが残っています。

## 例えば

APIリファレンスで次のようなAPIを調べてみると…

```objc
void CGContextSetFillColor ( CGContextRef context, const CGFloat components[] );
```

```swift
func CGContextSetFillColor(_ c: CGContext!,
                         _ components : CConstPointer<CGFloat>)
```

引数`components`はObjective-Cでは`CGFloat`の配列なのに、Swiftの`CConstPointer<CGFloat>`って何だよって感じですよね。

## 型の対応

基本的には、Swiftで配列を作って渡せばいいようになっていますが、ちょっと注意が必要な場合もあります。

まずは、[公式ドキュメント](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html)より、Cの型とSwiftの型との対応を見てみましょう。

| Cの型        | Swiftの型             |
|:-------------|:----------------------|
| const void * | CConstVoidPointer     |
| void *       | CMutableVoidPointer   |
| const Type * | CConstPointer&lt;Type&gt;   |
| Type *       | CMutablePointer&lt;Type&gt; |



## CMutablePointer&lt;Type&gt;

Cの型は`Type *`です。あらかじめ配列のメモリを確保して、呼び出した関数がそこに文字列を入れてくれるような関数などを思い浮かべてください。
`CMutablePointer<Type>`の場合は、配列の変数名の先頭に "&" を付けて渡します。

```swift
func takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ }
var a: Float[] = [1.0, 2.0, 3.0]
takesAMutablePointer(&a)
```

`NSString`の

```swift
func getCString(_ buffer: CMutablePointer<CChar>,
      maxLength maxBufferCount: Int,
       encoding encoding: UInt) -> Bool
```

というAPIを使って、もうちょっと具体的な例を見てみましょう。

```swift
let str = "Hello, Swift"
let strLength = Int(countElements(str))
// 文字列の長さ+1の長さの配列を作成
var charArray = CChar[](count: strLength + 1, repeatedValue: 0)
// 配列を渡してCCharを取得
(str as NSString).getCString(&charArray, maxLength: strLength + 1, encoding: NSUTF8StringEncoding)

charArray //[72, 101, 108, 108, 111, 44, 32, 83, 119, 105, 102, 116, 0]
```

## CConstPointer&lt;Type&gt;

Cの型は`const Type *`です。Cでconstが付いている配列は値が変更されません。
`CConstPointer<Type>`の場合は、変数名に何も付けずにそのまま渡します。

```swift
func takesAConstVoidPointer(x: CConstVoidPointer)  { /* ... */ }
var a: Float[] = [1.0, 2.0, 3.0]
takesAConstVoidPointer(a)
takesAConstVoidPointer([1.0, 2.0, 3.0])
```

`NSString`の

```swift
class func stringWithCharacters(_ chars: CConstPointer<unichar>,
                         length length: Int) -> Self!
```

というAPIを使って、もうちょっと具体的な例を見てみましょう。

```swift
let unicharArray:unichar[] = [72, 101, 108, 108, 111, 44, 32, 83, 119, 105, 102, 116]
let len = unicharArray.count
let s = NSString.stringWithCharacters(unicharArray, length: len) // "Hello, Swift"
```

## 補足

ちなみに、CでNULLポインタになるようにしたいときは、Swiftではnilを渡せばOKです。
LightBlue Beanのセットアップ方法(mac)


## LightBlueBeanに付属の電池を入れる
![IMG_1481.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/e14c5d31-19bb-58ba-dcd5-7f5ea47650f2.jpeg "IMG_1481.jpg")



## 以下のソフトをダウンロードする
Arduino
http://arduino.cc/en/Main/Software
Teensyduino
https://www.pjrc.com/teensy/td_download.html
OSX Beanloader
http://punchthrough.com/files/bean/loader/latest.php?download

## ArduinoIDEからプログラムを書き込む

上記3つのソフトウェアをダウンロードしたらArduinoIDEを立ち上げます。ArduinoIDEが立ち上がったら[Tools]->[Board]->[LightBlue Bean]を選びましょう。

![Screen Shot 2014-06-22 at 5.56.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/629b41f9-d0aa-537f-bbbc-be767a6876e9.png "Screen Shot 2014-06-22 at 5.56.04 PM.png")


次に[File]->[Examples]->[LightBlue-Bean]->[01_Basics]->[LightBlueDemoSketch]を選びましょう。

![Screen Shot 2014-06-22 at 5.56.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/4004a81c-b786-a9eb-3ad9-c1ffda5c4465.png "Screen Shot 2014-06-22 at 5.56.47 PM.png")


ArduinoIDEのチェックマーク、Verify(検証)を押すと、Bean Loaderが立ち上がります。立ち上がったら、お使いのLightBlueBeanデバイスが表示されますので、カーソルをデバイス名が表示されているところに持っていき、右クリックしましょう。[Connect]という表示が出ますので、クリックしましょう。そうするとLightBlueBeanのデバイスと接続を開始します。

![Screen Shot 2014-06-22 at 6.02.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/2ec821f8-dd80-4f1f-dc94-ca373aef4a3d.png "Screen Shot 2014-06-22 at 6.02.47 PM.png")


接続が完了したら、再度デバイス名を右クリックすると、一番上に[Program sketch]という項目がありますので、これをクリックします。そうするとプログラムがLightBlueBeanデバイスにアップロードされます。
アップロードが完了したら、LightBlueBeanをDisconnectしておきます。

![Screen Shot 2014-06-22 at 6.03.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41825/86ad1178-6d8f-2cc1-b355-e7e0c8d679b5.png "Screen Shot 2014-06-22 at 6.03.15 PM.png")

iphoneアプリの[LightBlue]をダウンロードします。お手持ちのLightBlueBeanが表示されるので、選びます。

![IMG_1480.jpg](https://qiita-image-store.s3.amazonaws.com/0/41825/46a27aea-20be-200a-a080-fc6e24cea2ed.jpeg "IMG_1480.jpg")

## テスト完了
iPhone経由でLightBlueBeanのRGBLEDを操作したり、加速度センサの値を読み込むなど基本機能のテストが出来ますよ。
apple swift 変数(variable)の基礎

## 変数の定義
変数を指定する際、型を指定しなくても使えるのが便利です。

**型指定なし**
【書式】var 変数名 = 値

````
var fruits1 = "apple"
var fruits2 = "banana"
````

**型指定あり**
【書式】var 変数名:型 = 値

````
var tmp1:String = "str"
var tmp2:Int = 5
var tmp3:Double = 3.14
var tmp4:Bool = true
````

swiftの代表的な値型には Int（整数型）Double（浮動小数点数型）String（文字列型）Character（文字型）Bool（真偽型）があります


## 変数の引用
バックスラッシュ、括弧を使用
macからバックスラッシュを入力する方法: option+¥

````
var like_fruits = "I like \(fruits1) and \(fruits2)"

// 一つの格好で文字連結は
var like_fruits = "I like \(fruits1 + fruits2)"

// int型同士の計算も可能
var num1 = 1
var num2 = 3
var result = "1 + 3 = \(num1+num2)"
````

## 定数の定義/引用

定数も変数同様型を指定しなくても使えます。
ただ、先頭にvarではなくletで書くのが違いますね。

````
let URI:String = "http://test.jp"
let URI2 = "http://test2.jp"
````

定数の引用も同じです。

````
var result2 = "\(URI)/?param=a"
````

簡単に変数の指定、引用ができるので、便利ですね。
playgroundを使うと変数の中身も自動的に表示されるので効率よく開発ができる気がしました！！

[IOS8アプリ開発日誌掲載中！！](http://qiita.com/kilhyungdoo/items/087dcbf971ac5e05d3f0)
Vagrant個人用メモ

Vagrant(ベイグラントと読む）は仮想環境の設定・構築を一つのワークフローでやってくれるツール。
以下のドキュメントがうまくまとめられてるので参照すれば大体のことはつかめるはず。
[Vagrant日本語ドキュメント](http://lab.raqda.com/vagrant/index.html) 
## ダウンロード
[最新はここ](http://www.vagrantup.com/downloads.html)から、古いバージョンは[ここ](http://downloads.vagrantup.com/)からダウンロードできる。
WindowsでもMacでもLinux(Ubuntu,CentOS)でも動く。プロバイダはVartualBox,VMware,AWS等。
また、vagrantには専用の用語も出てくるので、はやく慣れたい。
※box:仮想マシンを作るためのスケルトン
※Vagrantfile:Rubyの構文で記述する仮想マシンの設定ファイルのようなもの。

## コマンド一覧　※すべてを網羅してる訳ではない
コマンドとか全て覚えられないので、必要に応じてメモ。  

| コマンド | 説明 |  
| --- | --- |  
| vagrant --version | vagrantのバージョン確認 |  
| vagrant box add `box名` `url` | boxの設置されているURLから取得したboxを、任意の名前を付けて追加 |  
| vagrant box list | boxのリストを表示 |  
| vagrant init | VagrantFileを新規作成 |  
| vagrant init `box名` | box名付きでVagrantFileを自動作成 |  
| vagrant up | 仮想マシン起動 |  
| vagrant status | boxの状態を表示 |  
| vagrant reload | 仮想マシンを再起動 |  
| vagrant suspend | 仮想マシンをサスペンド |  
| vagrant resume | 仮想マシンのレジューム（サスペンドを復帰） |  
| vagrant halt | 起動中の仮想マシンをシャットダウン |  
| vagrant destroy | 仮想マシン削除 |  
| vagrant ssh | 仮想マシンにログイン |  
| logout | 仮想マシンからログアウト |  
| vagrant plugin install `プラグイン名` | Vagrantのプラグインを入れる |  
| vagrant box list | インストール済みのboxを表示 |  
| vagrant box remove `box名` `プロバイダ名` | 指定したboxを削除（プロバイダ名はオプション） |  

使っていくうちにコマンド一覧は追加していく予定。
Socket.IOを使ったスマホ用のサイトを作る上での問題点と対応

# はじめに
Socket.IOを使ったスマホ向けSPA(Single Page Application)のサイト[SmartFX](http://smartfx.minkabu.jp)を運用している際に気づいたことについてまとめてみました。

#Android標準ブラウザがloadingのままになる
## 理由
初期処理中のpollingにより読み込み途中と判断されるため。
## 対応
setTimeoutに0を指定して初期処理とタイミングをずらす

```javascript
setTimeout(function(){io.connect(url)},0)
```

# Android標準ブラウザがSocket.IO 1.0のサーバと接続できない
## 理由
pollingが上手く動いていない
## 対応
JSONPを強制

```javascript
io.connect(url,{forceJSONP:true})
```

# Socket.IO 1.0だとiPhoneのloading indicatorがクルクルしっぱなし
## 理由
WebサーバとSocket.IOサーバのURLが違う状態でwebsocketとxhrを同時接続するとiOSのsafariで上記現象になってしまう．
0.9の場合は接続順番がwebsocket -> xhrのだったため条件が発生しなかったが，1.0からxhr -> websocketになったため発生するようになった。
## 対応
iOSの場合にwebsocketを強制

```javascript
io.connect(url,{transports:["websocket"]})
```

# まとめ
上記を踏まえると下記のようなコードになります。

```javascript
setTimeout(function(){
  var socket = null;
  if(/iPhone|iPod|iPad/i.test(navigator.userAgent)){
    socket = io.connect(socket_io_url,{transports: ["websocket"]});
  }else{
    socket = io.connect(socket_io_url,{forceJSONP: true});
  }
  socket.on('connect', function(){
    socket.emit("message","Hello World!");
    socket.on('reply', function(msg){
      console.log(msg);
    });
  });
},0);
```
MKDirectionsを一年遅れで使ってみた


iOS7の *MapKit* に追加された *MKDirections* という経路検索の機能を使う機会があったので、
*MKDirections* の使い方を備忘録がてらまとめておきます。

使い方を知るために作成したサンプルは[GitHub](https://github.com/droibit/MKDirectionsSample)にあります。
豊橋駅周辺にピンを落として、タップした順に駅からのルートを表示するサンプルになっています。

## 経路検索の方法
*MKDirections* を使用した経路検索の方法は次のようになります。  

1. ルートの始点と終点の座標を用意
2. 移動手段を選択
3. 座標を元にルートをリクエスト
4. レスポンスのルートを地図にオーバーレイ

### 1. ルートの始点と終点の座標を用意
ルート検索では2点間の検索になりますので、その始点と終点の座標が必要になります。
座標はApple Mapsの座標系なので世界測地系緯度経度になりますので、 
サンプルではブラウザ版Google Mapsの「この場所について」から座標をとって使用しています。

``` swift
// 豊橋駅
let sourcePosition = CLLocationCoordinate2D(34.763653, 137.383003)
// 豊橋市役所
let destinationPosition = CLLocationCoordinate2D(34.769192, 137.391473)
```
### 2. 移動手段を選択
ルート検索では移動手段を選択することができます。選択できる移動手段は次の3種類になります。
ソースコード上では移動手段を識別するために *MKDirectionsTransportType* 列挙体を使用します。  

|No |移動手段   |対応する列挙値                        |
|:--|:--------|:-----------------------------------|
|1  |車        |MKDirectionsTransportTypeAutomobile |
|2  |徒歩      |MKDirectionsTransportTypeWalking    |
|3  |どちらでも |MKDirectionsTransportTypeAny        |

ルート検索のデフォルトでは3番の「どちらでも」が設定されています。

### 3. 座標を元にルートをリクエスト
用意した座標を元にルート検索する場合、 *MKDirectionsRequest* クラスを使用してアップルのサーバーへ
リクエストを送信する必要があります。リクエストを作成する際に次のクラスを使用します。

|No |クラス       |説明                                                 |
|:--|:-----------|:---------------------------------------------------|
|1  |MKPlacemark |Placemark（目印）でルート検索の地点の座標・住所を格納するクラス|
|2  |MKMapItem   |地図上のポイント情報を格納するクラス|

ルート検索のリクエストには最終的に 'MKMapItem' の形で座標をセットします。
これらのクラスと用意した座標を元にルート検索リクエストを作成・送信します。

``` swift
let request = MKDirectionsRequest()
request.setSource(MKMapItem(placemark:sourcePlacemark))
request.setDestination(MKMapItem(placemark:destinationPlacemark))
request.transportType = MKDirectionsTransportTypeAutomobile
// 複数のルートを検索する場合
// request.requestsAlternateRoutes = YES
// ルート検索のためのリクエストを送る。
let directions = MKDirections(request:request)
directions.calculateDirectionsWithCompletionHandler({
    (response:MKDirectionsResponse!, error:NSError!) -> Void in
    // ルート検索後に呼ばれる処理
})
```

### 4. レスポンスのルートを地図にオーバーレイ
最後にルート検索で得られる結果を地図上に重ねて表示します。
レスポンスで得られるルートにはポリラインが含まれているのでそれを *MapView* のオーバーレイに重ねて表示します。

``` swift
let directions = MKDirections(request:request)
directions.calculateDirectionsWithCompletionHandler({
    (response:MKDirectionsResponse!, error:NSError!) -> Void in
    // ルート検索後に呼ばれる処理
    if (error? || response.routes.isEmpty) {
        return
    }

    let route: MKRoute = response.routes[0] as MKRoute
    // 複数存在する場合
    // for route in response.routes {
    //     self.mapView.addOverlay(route.polyline!)
    // }
    self.mapView.addOverlay(route.polyline!)
})
```

地図上にオーバーレイ表示するルートの外観を調整する場合はデリゲートのメソッドを実装します。

``` swift
// 経路検索のルート表示設定
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    let route: MKPolyline = overlay as MKPolyline
    let routeRenderer = MKPolylineRenderer(polyline:route)
    routeRenderer.lineWidth = 5.0
    routeRenderer.strokeColor = UIColor.redColor()
    return routeRenderer
}
```

これで地図上にルート検索した結果をオーバーレイ表示できるようになります。
いまさら fluentd をはじめてみたLTSV なにそれ美味しいの？、その２

# いまさら fluentd はじめてみる２
最終的な構想は、「[fluentd](http://www.fluentd.org/) + [Kibana](Kibana) + [elasticsearch](http://www.elasticsearch.org/) + [MongoDB](http://www.mongodb.org/)」の落としどころだけど、[LTSV](http://ltsv.org/) っていうキーワードに引っ掛かったので調査してみた。

# LTSV って？
Labeled Tab-Separated Values というテキストのフォーマットの仕様らしい。発想そのものはGoodだと思いますが既存システムに対応しようとするとオッサンエンジニア群が理解できなくて拒否するに[300点](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#q=%E3%82%AF%E3%82%A4%E3%82%BA%E3%83%80%E3%83%BC%E3%83%93%E3%83%BC)（古いね）。
と冗談っぽかったですね（汗） LTSV は可読性が落ちるって感じました。ただ人間の目から見ての可読性であってプログラムから見れば書式が統一されているので余計なロジックが不要になるので良い傾向です（こういうとこでbugがでないのはいいこと）。あと特に最近動きのない [ASF](Apache Software Foundation) あたりが積極的に動くべきだと思うのだけど・・・そこはまあいいかｗ

# Apache, nginx で LTSV 
ちょいと config をいじくる必要があるぐらい。

```/etc/httpd/conf/httpd.conf
LogFormat "domain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\ttime:%{%d/%b/%Y:%H:%M:%S %z}t\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o" combined
```

> ・[ApacheログをLTSV形式にする際の２つの落とし穴と対処法＋Apache＆FluentdのLTSV設定サンプル](http://y-ken.hatenablog.com/entry/apache-tips-ltsv-access-log)
> ・[サイトのレスポンスタイムをリアルタイムでグラフ表示する方法 nginx → LTSV → Fluentd(td-agent) → GrowthForecast](http://www.e-agency.co.jp/column/20130423.html)

## fluentd の設定
```format ltsv``` を指定するだけ。
ハマるとこは、 /var/log/httpd/access_log ファイルを ```td-agent``` ユーザで参照できること。ここ大事ｗ

```lang:td-agent.conf
<source>
  type tail
  path /var/log/httpd/access_log
  format ltsv
  time_key time
  time_format %d/%b/%Y:%H:%M:%S %z
  tag td.apache.access
  pos_file /var/log/td-agent/apache_access.pos
</source>
```

# 次は
mongoDB を使った方法を勉強してみる（[その３](http://qiita.com/murachi1208/items/8dc03a77fdde97bb4b16)）の予定ですｗ
Eagleで新しい部品をライブラリに登録する方法


新しくライブラリを作る場合は「File」->「New」->「Library」を選びます

![新規ライブラリ作成.png](https://qiita-image-store.s3.amazonaws.com/0/41825/7271a3c1-7bd7-c04b-f252-512eb5bf87b8.png "新規ライブラリ作成.png")

既に出来ているライブラリを編集する場合は、Librariesの中にある編集したいファイルを開きます

![既存のライブラリを修正.png](https://qiita-image-store.s3.amazonaws.com/0/41825/3eee84f0-a3eb-fa4d-5d83-58d7fd4e24ab.png "既存のライブラリを修正.png")

ライブラリを作成すると下のような画面が出てきます。
ライブラリの作成では、Packageファイル、Symbolファイルの二つファイルを作成して、Deviceファイルで統合します。

![ライブラリ編集画面.png](https://qiita-image-store.s3.amazonaws.com/0/41825/daca90a1-d618-330b-f0b3-7cbff7032065.png "ライブラリ編集画面.png")

まず、Packageファイルを作成します。
ここには部品の仕様書を見ながら、正しい寸法を実寸で入力して部品のかたちを描いていきます。

![パッケージ.png](https://qiita-image-store.s3.amazonaws.com/0/41825/5a6e61e9-2635-b4b3-f4c6-16470dac5832.png "パッケージ.png")

部品のPackageファイルが完成したら、次は部品のSymbolファイルを作ります。こちらは部品のシンボルになるので、実寸ではなくて、サイズは見やすい適当なサイズでつくります。

![シンボル.png](https://qiita-image-store.s3.amazonaws.com/0/41825/b0ac9af1-86e7-facf-ad94-5d068be91ded.png "シンボル.png")

Symbolファイルの作成が終了したら、先ほど作ったPackageファイルと統合するために、Deviceファイルを開きます。
左側の画面には先ほど描いたSymbolを読み込み、右側の画面には先ほど作成したPackageファイルを読み込みます。

![デバイス.png](https://qiita-image-store.s3.amazonaws.com/0/41825/53a94d18-acc9-033f-ec21-d52c0480ddd6.png "デバイス.png")

SymbolファイルとPackageファイルを読み込んだら、それらを統合してDeviceファイルとして登録しましょう。

![コネクト.png](https://qiita-image-store.s3.amazonaws.com/0/41825/fd2b7cd3-bab8-b93a-52b1-7c293fe59010.png "コネクト.png")

以上がライブラリに新しい部品を登録する方法です。
同じ要領で新しい部品をライブラリに登録しましょう。
よく使う部品は事前に登録しておくと、あとで何か作品を
つくるときに便利です。
Gradleをmacにインストールした際のメモ

**現在はGVMからSDKMANに名称が変更されておりますので、現在こちらの記事は内容が間違っています。**
**下記の記事が参考になると思いますので、そちらを御覧ください。**
[[Java全般]SDKMAN（旧gvm）でJavaやGrvoovyをインストール](https://qiita.com/saba1024/items/967ee3d8a79440a97336)

~~いきなり`brew install gradle`ではなく、GVMというrubyでいうrbenvてきなものを使ってインストールする。~~

#GVMのインストール

以下を参考にしました。
~~GVM by gvmtool~~

$PATHに追加

```
export PATH=$PATH:$HOME/.gvm/bin
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
```

読み込み

`source ~/.zshrc`

#Groovyのインストール
`gvm install groovy`

###確認
`groovy -v`

#Gradleのインストール
`gvm install gradle`

###確認
`gradle -v`

#Gradleのバージョンを変更
`gvm ls gradle`

更新したいバージョンを確認

`gvm use gradle 2.2.1`
最新版をインストールするか聞かれるのでy

`gradle -v`

バージョンが更新されているのを確認

#EclipseからGradleプロジェクトの作成
Market Place -> Gradle Integration for Eclispe 3.5.1 RELEASEをインストール　-> 再起動

⌘ + n -> Gradle -> Gradle Project ->プロジェクト名を入力してSample Projectで Java Quickstartを選択し、完了。
フォルダやbuild.gradleを自動で生成してくれる。
重複組合せについてのメモ

# メモ

[アルゴリズムパズル](http://www.oreilly.co.jp/books/9784873116693/) の初級13を解くときに、これって確か重複組合せで解くんだよなあって思いつつ、中身を思い出すのに相当手間取ってしまったので、書けば覚える式に記事にしてしまいます。

# 重複組合せ

$n$種のものから重複を許して（つまり毎回元に戻して）$r$個取り出す組合せのことで、その総数を $_nH_r$ と表し、$_{n+r-1}C_r$ と等しくなります（[Wikipedia](http://ja.wikipedia.org/wiki/%E7%B5%84%E5%90%88%E3%81%9B_(%E6%95%B0%E5%AD%A6)#.E9.87.8D.E8.A4.87.E7.B5.84.E5.90.88.E3.81.9B)）。組合せなので順序は問いません。

ちなみに、順序を問う場合は、重複順列といって、総数は単純に $n^r$ となります。

$_nH_r＝_{n+r-1}C_r$ であることは、次のように説明できます。

$n$種のものから重複を許して$r$個取り出すとは、箱を一列にピタっと$n$個並べておいて、$r$個のボールを重複を許してそれらの箱に入れる組合せのことです。これは見方を変えると、$r$個のボールと$n-1$個のパーティションを1列に並べるときの、並べ方の組合せと見ることができます。$n=8, r=10$ だと次のような並びを含むすべての組合せを考えることになります。

|OOO||OOOO|||OO|O

もし、ボールとパーティションにすべて区別があれば、1列に並べる並べ方（順列）の総数は、$(n+r-1)!$ となります。しかし、ボールどうしには区別はなく、パーティションどうしにも区別はありません。そのためこの総数を $r!$ と、$(n-1)!$ で割れば、組合せの総数が出ます。

つまり、$_nH_r=\frac{(n+r-1)!}{r!(n-1)!}$ となり、これは $_{n+r-1}C_r$ と同じものになるわけです。

# 応用

碁盤の目状に東西と南北に道路が並んでいる都市があり、そのある交差点Aにいるとします。ここから、$n$ブロック東、$m$ブロック南の交差点Bに行く最短経路は何通りあるかという問題がよくあります。

この場合、AからBに到達するまでに、南北の道路$n+1$本のいずれかで、ちょうど$m$回南進しないといけません。重複してもいいですが、南進する順序は西から東しかないので、その順列には意味はなく組合せさえ決まれば経路が一意に決まります。つまり、$n+1$本の道路から重複を許して$m$本選ぶ組合せになるわけです。

したがって、この組合せの総数は $_{n+1}H_m = _{n+m}C_m$ と得られます。

[アルゴリズムパズル](http://www.oreilly.co.jp/books/9784873116693/) の初級13は交差点の1箇所に通行止めがあるという問題ですが、この応用で解くと、とても簡単に求めることができます。詳細は、宿題に残しておきます。

本の中の解答例では組合せの考え方を使わずにアルゴリズミックに解いています。通行止めの箇所やパターンが非常に多くなってくるとその方がいいかもしれません。