OmniAICreator/Qiita-1.07M huggingface dataset:
SpineをStarling1.7で使う:SkeletonAnimationの(変な)特徴

地味投稿です。
SkeletenAnimation(=DisplayObjectです)は普段Starlingを使っていると、ちょっと予想をしない動きをする構造なので、ここに投稿としてまとめておきます。

#DisplayObjectContainerではない
DisplayObjectではありますが、DisplayObjectContainerを継承していません。中に各ボーン（スロット）のパーツが存在するので、DisplayObjectContainerであるイメージがありますが、違います。各パーツはメッシュ(ポリゴン)として描画されます。
なお、SkeletenAnimationはSkeletenSpriteを継承していて、SkeletenAnimationはDisplayObjectを継承しています。Spriteって名前をつけないで欲しい感じですが、他と合わせているんでしょうか。

#SkeletonImageは画面に表示されない
[SkeletonImage](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-starling/spine-starling/src/spine/starling/SkeletonImage.as)というImageを継承したクラスが内部処理で使われてますが、SkeletenAnimationはDisplayObjectContainerではないので中にaddChildされません。ではなぜImageを継承しているのか？単純に考えるとテクスチャ情報だけ持っていれば良さそうですが、、その方が便利だったのか、歴史的な経緯なのか。

#大きさが常に0を返す
width、heightが常に0を返します。getBounds()で取得したRectangleを見てもx、y値は正しく存在しますが、width、heightが0です。続くhitTest処理では真面目にBounds計算をしているので、なぜこのようになっているのか考えると、パフォーマンスのためではないのかなと思います。boundsの計算はなかなかに処理が重たそうです。アニメーションをして絶えず大きさが変わる事を考えると、こうなるのも致し方ないのか。。とも思えますが、ここを知らないで大きさが０で帰ってくると、面食らいますね。

#タッチ/クリック判定は全体のバウンディングBOXで行われる。

![スクリーンショット 2016-06-25 0.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/8302/44b333e8-4cfa-ce54-d548-0aa61a7d3fe7.png)
例ですが、このキャラの場合、

![スクリーンショット 2016-06-25 0.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/8302/654ecd37-c4a6-98e3-ac43-4ba1df48a1b3.png)
各パーツの画像を赤い四角で表すとこのような状態になるのですが、タッチ判定はこの赤い部分**ではなく**全体のバウンディングBOXに対して行われます。

![スクリーンショット 2016-06-25 0.21.39_.png](https://qiita-image-store.s3.amazonaws.com/0/8302/fc82bb57-cafd-da9a-8691-92541cb315c9.png)
図にすると、この青いBOX領域で値判定が行われます。パーツが回転していると予想より広い範囲に反応するの注意です。なお、画像パーツ(=りジョンアタッチメント)でなく、メッシュアタッチメントに対してもあたり判定が行われますが、全体のバウンディングBOXであたり判定がまとめて行われうのは同じです。（の、ようです。コードを見る限り。）

このバウンディングBOXを計算する処理は複雑なパーツ構成をもつSkeletenAnimationでは、けっこうな高負荷になりそうなので、SkeletenAnimationのtouchableはfalseにして、自前で座標値などからあたり判定を行うことを推奨したく思います。なお、特定の画像領域などとあたり判定演算をする方法は別記事にまとめる予定です。

#フィルタを適用すると消えて無くなり見えなくなる
な　ん　て　こ　と　だ　！　！

#まとめぽい事
[spine-starlingランタイム](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-starling)は[spine-as3ランタイム](https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-as3)を利用する形で、作られています。spine-as3は基本的なSpineランタイム部分を担当し、NativeのDisplayObjectをSkeletonのViewとして使います。spine-starlingはそのView部分の実装をStarlingのDisplayObjectにすげ替えたものです。spine-as3の[SkeletonSprite](https://github.com/EsotericSoftware/spine-runtimes/blob/master/spine-as3/spine-as3/src/spine/flash/SkeletonSprite.as)は、Spriteの中に各SlotとしてBitmapがたくさん含まれる構造になっていますね。素直なつくりで扱いやすそうですが、ソースを見る限り、spine-as3は メッシュアニメーションをサポートしていないので、実行速度もあわせて考えると、やはりspine-starlingを使う事になりそうです。メッシュを扱うので、ちょっと特殊な作りになっているのかなと思っています。

ところが上に述べたように、SkeletenAnimationは若干残念な作りです。もちろんSpineランタイムは素晴らしいものですが、コア部分が良いだけに余計に悔やまれます。コアなランタイム部分に手を入れるのは大変ですが、幸いspine-starling部分だけなら、カスタマイズするのは辛くないので、自分のスタンスとしては、spine-starling側で使いづらい部分は積極的にカスタマイズしていく心づもりです。特にフィルタのところはなんとかしたいですが、、。

とはいえ、そろそろStraling2.0用のランタイムも作り始めてくれそうなので、可能であればそちらに要望も出してみようと思います。
CakePHPでFacebook php-sdk-v4使ってもstateなんちゃらで怒られないようにする

今更感も否めませんが、CakePHP2.x系の話。3でも同じことが起きるのかもしれない。

## 問題の概要
既存のCakePHP2アプリ（Session管理にRedisを利用）にfacebook/php-sdk-v4(~5.0)を使ってソーシャルログイン機能を追加しようとしても

```
Cross-site request forgery validation failed. Required param "state" missing from persistent data.
```

という例外が発生して、上手くアクセストークンを取得できない。

## なぜか

どうも、CakePHPのSessionとFacebookSDKのSessionが競合しているようで、SDKのDocument通りsession_start()とかしたら、今度はCakePHPのSessionが上手く機能しなくなり、setFlash等のメッセージが表示されないといったトラブルが起きる。

## どうする

php-sdk-v4のセッション管理をCakePHPっぽく書いてあげれば問題を回避できる。
具体的には、FacebookSessionPersistentDataHandlerを修正する。

```php:FacebookSessionPersistentDataHandler.php
    /**
     * @inheritdoc
     */
    public function get($key)
    {
        if (isset($_SESSION[$this->sessionPrefix . $key])) {
            return $_SESSION[$this->sessionPrefix . $key];
        }
        return null;
    }

    /**
     * @inheritdoc
     */
    public function set($key, $value)
    {
        $_SESSION[$this->sessionPrefix . $key] = $value;
    }
```
ここを

```php:FacebookSessionPersistentDataHandler.php
    /**
     * @inheritdoc
     */
    public function get($key)
    {
        if(\CakeSession::read($this->sessionPrefix . $key)){
            return \CakeSession::read($this->sessionPrefix . $key);
        }
        return null;
    }

    /**
     * @inheritdoc
     */
    public function set($key, $value)
    {
        \CakeSession::write($this->sessionPrefix.$key,$value);
    }
```

このような形でCakeSessionに書き換える。

ただ、これだけでは上手く行かない場合があるので、その時はFacebookRedirectLoginHelper::getAccessToken, ::getLoginUrlなど、Sessionを使うメソッドの呼び出し前に

```php
CakeSession::start();
#あるいは
\CakeSession::start()
```

で明示的にSessionをスタートさせてあげれば良かった。
Windowsでのファイルパス文字列の連結の言語別結果ッ

ファイルパス文字列の連結は人それぞれで「あるべき仕様」の見解があると思いますが、基本的に自分は

- パスA + パスB の結果は、「cd A」した状態で B が指すパスを示すものと等価

であってほしいと考えます。具体的には

（例）
- `foo` + `bar` = `foo\bar` (相対パスどうし）
- `foo` + `\bar` = `\bar` (二項目が絶対パスだから）
- `c:foo` + `\bar` = `c:\bar` （二項目は絶対パスだが、ドライブレターがないので、そこだけ一項目が生きる）

で、各言語での結果を確認しました。



Windows Scripting Host(JScript)
===============================

```javascript
var fsObj = new ActiveXObject("Scripting.FileSystemObject");
WScript.Echo( fsObj.BuildPath("c:\\foo","\\bar") );
```

結果 → `c:\foo\bar` : Oh...

.NET Framework(PowerShell)
==========================

```powershell
Write-Host([IO.Path]::Combine("c:\foo","\bar"))
```

結果 → `\bar` : 惜しい。なぜ、そこでドライブレターを消す！まぁ、でも、許容できなくはない

Go
==

```go
package main

import "path/filepath"

func main(){
	print( filepath.Join(`c:\foo`,`\bar`) , "\n")
}
```

結果 → `c:\foo\bar` : orz

VC++
====

```cpp
#include "atlpath.h"
 /* 中略 */
CPath path1;
path1.Combine(_T("c:\\foo"), _T("\\bar"));

_fputts((LPCTSTR)path1, stdout);;
(void)getchar();
```

結果 → `c:\bar` : よりにもよって、お前が一番（俺にとって）正しい結果を返すか！


とりあえず、以上
（また、他の言語で試せる機会があったら追記します）
activemodel callback

http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

http://vishnuatrai.com/blog/2011/03/17/rails-3-e28093-activemodel/

```rb
class Pet
	extend ActiveModel::Callbacks

  define_model_callbacks :test

  before_test :motherfucker

  after_test do
  	puts "after that"
  end

  around_test do
  	puts 'around that'
  end

  def lala
  	puts "just a test"
  	# _run_test_callbacks do
  	# 	puts "real work"
  	# end

  	run_callbacks :test do
  		puts "real work"
  	end

  	
  	run_callbacks :test do
  		puts "real work"
  	end
  end

  def motherfucker
  	puts "before that"
  end
end

Pet.new.lala
```


```rb
class Pet
    extend ActiveModel::Callbacks

  define_model_callbacks :test

  before_test :motherfucker

  after_test do
    puts "after that"
  end

  around_test do
    puts 'around that'
  end

  skip_callback :test, :before, :motherfucker

  def lala
    puts "just a test"
    # _run_test_callbacks do
    #   puts "real work"
    # end

    run_callbacks :test do
        puts "real work"
    end


    run_callbacks :test do
        puts "real work"
    end
  end

  def motherfucker
    puts "before that"
  end
end

Pet.new.lala
```

但是好像skip_callback不能用于proc block
http://stackoverflow.com/questions/19021465/skip-before-filter-defined-with-block
TypeScriptで任意の関数をカリー化する(D言語で以前実装したものを書き換えたらできた)

以前D言語を書いている時に、任意の関数をカリー化したくなって、次のようなテンプレートを書きました。

```d
// カリー化用テンプレート
template curry(alias func){
  import std.algorithm, std.conv, std.range, std.traits;
  alias argsintuple = ParameterTypeTuple!func;
 
  immutable lambdaStr = (lamArgs =>
    (temp){
      foreach(i, e; argsintuple)
        temp ~= "(" ~ e.stringof ~ " " ~ lamArgs[i] ~ ") => ";
 
      return temp ~ "func(" ~ lamArgs.join(", ") ~ ")";
    }("")
  )(argsintuple.length.iota.map!(i => "arg" ~ i.to!string));
 
  enum curry = mixin(lambdaStr);
}
```

それで、先ほどTypeScriptを書いている時に同様のカリー化する関数がほしいなぁと思って上のテンプレートをTypeScriptで書いてみました。

Dでの実装もTypeScriptでの実装も単純で、ざっくり言うと
引数の数だけ `"(arg0) => (arg1) => (arg2) => .... (argN) => "`という文字列をつくり、最後に `"func(" + args.join(", ") + ")"`としてるだけです(引数の数だけ展開して、一引数のラムダ式をつくり、それをネストさせているだけです)。
僕はTypeScript(JavaScriptも)まったくの素人ゆえ、これがTypeScript(/JavaScript)として妥当なアプローチなのかはわかりませんが...

とりあえず、TypeScriptに上のテンプレートを書き換えたものがこちらです:

```ts
function isFunction(obj: any): boolean {
  return typeof(obj) == "function";
}

function iota(cnt, init = 0, inc = 1) { 
  var ret = []; 

  for (var i = 0, j = init; j < cnt; i++, (j = j + inc))
    ret[i] = j; 

  return ret; 
}

function curry(func: any) {
  if (!isFunction(func)) {
    console.log("Fatal Error. An invalid value was given. It was not a function");
    return;
  }

  const lamdbdaStr = (lamArgs =>
    ((temp) => {
      for (var i = 0; i < lamArgs.length; i++) 
        temp += "(" + lamArgs[i] + ") => ";

      return temp + "func(" + lamArgs.join(", ") + ")";
    })("")
  )(iota(func.length).map(x => "arg" + x));

  return eval(lamdbdaStr);
}
```

D言語ではカリー化する対象が関数(もしくはdelegate/function)であるかはコンパイル時に判定されるので変な引数が渡されてもコンパイル時に弾けますが、TypeScriptではそうはいかないので(ただ単に僕がしらないだけで、TypeScriptでオブジェクトが`関数である`ということを型で表せるのであれば、トランスパイル時に弾けると思います)適当な判定関数を噛ませています。

試しに次のコードを動かしてみると、きちんとカリー化されていることが確認できます。

```ts
function add3(a: number, b: number, c: number) {
  return a + b + c;
}

console.log("isFunction(curry(add3))          : " + isFunction(curry(add3)));//true
console.log("isFunction(curry(add3)(1))       : " + isFunction(curry(add3)(1)));//true
console.log("isFunction(curry(add3)(1)(2))    : " + isFunction(curry(add3)(1)(2)));//true
console.log("isFunction(curry(add3)(1)(2)(3)) : " + isFunction(curry(add3)(1)(2)(3)));//false

console.log(curry(add3)(1)(2)(3) == 6);
```
OS X El Capitan 10.11.5にCocoaPodをインストールする際の手順

つい先日、自宅のiMac環境(OS X El Capitan 10.11.5）の環境にCocoaPodをインストールした際の構築手順を備忘録代わりに記載します。

##1.Rubyのインストール
以下のコマンドでRubyGemを最新版にアップデート

`$ sudo gem update --system`

##2.CocoaPodのインストール
下記のコマンドでCocoaPodをインストール

`$ sudo gem install -n /usr/local/bin cocoapods`

##3.SSL関連のエラーが発生しないようにするためのおまじない
このままpod setupを実行しても、SSL関連のエラーが発生して失敗するので、下記のコマンドでエラー回避

`$ git config --global http.sslVerify false`

##4.これまたおまじない
上記の状態だとやっぱりpod setupでエラーが出るので、いろいろ試した結果、下記のようにpsychと言うライブラリをバージョン指定してインストールすると上手くいく

`$ sudo gem install psych -v 2.0.0`

##5.あとはpod setup

`$ pod setup`

これで終了。pod setupコマンドが終わるまで１時間近くかかった。
sklearnのナイーブベイズでテキストフィルターリング

from sklearn.datasets import fetch_20newsgroups
のデータセットを使ってみます。


カテゴリを出力するコード

```
from pprint import pprint
pprint(list(newsgroups_train.target_names))
```

これが記事のカテゴリらしいけど始め何が書かれてるのか不明だった。

```
['alt.atheism',
 'comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x',
 'misc.forsale',
 'rec.autos',
 'rec.motorcycles',
 'rec.sport.baseball',
 'rec.sport.hockey',
 'sci.crypt',
 'sci.electronics',
 'sci.med',
 'sci.space',
 'soc.religion.christian',
 'talk.politics.guns',
 'talk.politics.mideast',
 'talk.politics.misc',
 'talk.religion.misc']
```

調べているとネットニュースプロトコルということが判明。

読んでいるニュースグループ
fj.comp.applications.excel, fj.comp.oldies, fj.comp.misc, fj.os.ms-windows.win95, fj.os.msdos, fj.net.providers, fj.net.words, fj.life.hometown.hokkaido, fj.jokes.d, fj.rec.autos, fj.rec.motorcycles, fj.news.group.*, fj.news.policy, fj.news.misc, fj.news.adm, fj.news.net-abuse, fj.questions.fj, fj.questions.internet, fj.questions, misc, fj.sci.chem, fj.engr.misc
http://www2s.biglobe.ne.jp/~kyashiki/fj/arukikata/WonderfulFj.html


Network News Transfer Protocolってプロトコルを使ったfj (ニュースグループ)ってニュースだった。


```python:sample.py
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
import nltk
from pprint import pprint

def stopwords():
    symbols = ["'", '"', '`', '.', ',', '-', '!', '?', ':', ';', '(', ')', '*', '--', '\\']
    stopwords = nltk.corpus.stopwords.words('english')
    return stopwords + symbols

newsgroups_train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
newsgroups_test  = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'))

#ニュースカテゴリを表示
pprint(list(newsgroups_train.target_names))
#記事データ
#print(newsgroups_train.data)

#CountVectorizerクラスを作る
vectorizer = CountVectorizer(stop_words=stopwords())
#print(vectorizer)
#語彙辞書を作る
vectorizer.fit(newsgroups_train.data)

# Train
#ドキュメント用語マトリクスをXに代入
X = vectorizer.transform(newsgroups_train.data)
# print(newsgroups_train.target)
y = newsgroups_train.target
# print(X.shape)

clf = MultinomialNB()
clf.fit(X, y)
print(clf.score(X,y))

# Test
X_test = vectorizer.transform(newsgroups_test.data) 
y_test = newsgroups_test.target

print(clf.score(X_test, y_test))

```



![スクリーンショット 2016-06-24 23.23.53.png](https://qiita-image-store.s3.amazonaws.com/0/64334/78072fe0-c90a-2f30-0cd4-0ed5edcfd03f.png)

データ：正解率６0%
テストデータ：正解率80%

ってことらしいです。


参考にしました。非常に助かりました。
http://qiita.com/kotaroito/items/76a505a88390c5593eba
自己書き換え再帰でFizzBuzzやってみた

```rb:self-rec-fizz-buzz.rb
n = 1

if n%15  == 0
  puts "FizzBuzz"
elsif n%3 == 0
  puts "Fizz"
elsif n%5 == 0
  puts "Buzz"
else
  puts n
end

if n == 100
  n = 1
  cmd = "exit"
else
  n += 1
  cmd = "system('exec ruby #{__FILE__}')"
end

lines = File.readlines(__FILE__)
lines[0] = "n = #{n}\n"
File.write(__FILE__, lines.join)
eval cmd

```
cocos2d-x を Swift プロジェクトに組み込み

普通の Swift プロジェクトに Cocos2d-x の HelloWorld を組み込んでみました

# 環境

1. Mac OS X 10.11.5 (英語)
2. Xcode 7.3.1
3. Cocos2d-x 3.12

# 手順

1. 詳細は https://github.com/ken1ma/ios-storyboard-cocos2dx を参照
    1. Main.storyboard に View Controller を追加して、そこで cocos2d-x を動かしてます
    2. そのまま Xcode で開いて結果を試せるプロジェクトを commit しました

## ポイント

1. ```cocos new -l cpp``` でコピーされる cocos2d-x-3.12/templates/cpp-template-default のファイルをほぼそのまま使えました
    1. Classes/AppDelegate.cpp ([portrait 向けに width と height を入れ替え](https://github.com/ken1ma/ios-storyboard-cocos2dx/commit/4ff651801e193618af4d7c61d2cb27b887f30b89#diff-ff08ffcd63d73a28774794fb6d833a03))
    2. Classes/AppDelegate.h (変更なし)
    3. Classes/HelloWorldScene.cpp (変更なし)
    4. Classes/HelloWorldScene.h (変更なし)
    5. proj.ios_mac/ios/AppController.h (変更なし)
    6. proj.ios_mac/ios/AppController.mm (変更なし)
    7. proj.ios_mac/ios/RootViewController.h (変更なし)
    8. proj.ios_mac/ios/RootViewController.mm ([viewWillDisappear を追加](https://github.com/ken1ma/ios-storyboard-cocos2dx/commit/52ecf7ac2cd8224023baee77c8a646bac8817442#diff-96570a26213e3e7ece8509425665d682))
2. [Swift から呼ばれ C++ を呼び出す Objective-C クラスを作成しました](https://github.com/ken1ma/ios-storyboard-cocos2dx/commit/857f7450dee91e451d8cd6d3cdc384a7d7c11f1e#diff-b4a847cd19ea7637a10406a61982ace0)
3. [static ライブラリをビルド](http://qiita.com/ken1ma/items/d1b39378e10df65fe10e) してリンクしてます

# メモ

1. 公式レポジトリの [cocos2d-x-swift-bindings](https://github.com/cocos2d/cocos2d-x-swift-bindings) は 2 年以上 commit がないので試してない
2. [Swift から C, C++, Objective-C, Objective-C++ を呼ぶ方法](http://stackoverflow.com/questions/32541268/can-i-have-swift-objective-c-c-and-c-files-in-the-same-xcode-project/32546879#32546879)
機械学習のライブラリ　Shogun

Shogunという名の機械学習のライブラリがあることに気づいた。
これの日本語情報はどれくらいあるだろう。
http://www.shogun-toolbox.org/


Shogun features
http://www.shogun-toolbox.org/page/features/
に他のライブラリとの比較が書いてある。




- [機械学習ライブラリ SHOGUN入門](http://rest-term.com/archives/3090/)
  C++のコードとPythonのスクリプトの例が書いてあります。

- [Shogun toolbox使ってみた](http://eizoo.hatenablog.com/entry/2013/07/06/052523)
 ubuntuでのインストールとpythonスクリプトの実行例が書いてあります。

- [Shogun](https://robotics.naist.jp/edu/text/?Robotics%2FShogun)
　UbuntuでC++でのコードの例です。

- [機械学習ライブラリShogun3.2をWindowsのCygwinで使う](http://cvl-robot.hateblo.jp/entry/2014/09/05/155727)
　cygwinでのインストールとC++でのコードでのビルドのしかたが書いてあります。

- [shogunをpython modular付きでインストールする(OS X Yosemite)](http://qiita.com/ysak/items/be0058046e35abb44165)

- [Python - 機械学習ライブラリ SHOGUN入門 ](http://b.hatena.ne.jp/entry/qiita.com/wellflat/items/ac1769d359d36b3a6108)



[scikit-learn](http://scikit-learn.org/stable/)のようなpythonのライブラリをC++で移行して実行できるようなC++で標準的な機械学習のライブラリはなんなのだろうか？

もちろん、PythonのモジュールをC/C++言語から使う流儀をすればよいという考えもあるのだが。


わかってきたこと
C++とpythonの両方で使えること。
SVMに関する限りlibSVMがオリジナルであること。
ShogunライブラリをWindowsでC++で使う場合、VisualStudioではなくて、cygwinを使っているようである。

C++で使う際にはSGMatrix　という独自形式の行列を使っている。
Pythonの場合にはnumpyのarrayを使っている。
このことは、線形代数にかかわるデータの扱いでは、pythonの方が他のライブラリとのデータ形式の共通性が高いように思われる。
Selenium WebDriverでの要素解析はPromise.allで

WebDriverでの要素解析って、Promiseで返るので、たくさん解析する要素あるといちいちthen then繋げるの面倒だなあと思ってたんですけど、よく考えたら、Promise.allで並列化した上でthenしてまとめて受け取ってやれば無問題どころか直列でのインタフェースより快適でした。

```html:サンプル
<div id="header">ヘッダ</div>
<div id="list">
  <div class="item"><span class="title">名前</span><span class="desc">内容</span></div>
  <div class="item"><span class="title">なまえ</span><span class="desc">は</span></div>
  <div class="item"><span class="title">Name</span><span class="desc">ないよう</span></div>
</div>
<div id="footer">フッタ</div>
```

みたいなhtmlなら、サンプルとして壮絶ダサいですけどそれはおいておいて、

```js:Promise.allサンプル1
Promise.all([
    driver.findElements(By.xpath('//div[@id="header"]')),
    driver.findElements(By.xpath('//div[@class="item"]')),
    driver.findElements(By.xpath('//div[@id="footer"]'))
])
.then(function(args){
    var headerPromise = args[0];
    var itemsPromise  = args[1];
    var footerPromise = args[2];
});
```

みたいな感じで、直列にしなくてもPromise.allでまとめてしまえばガサッと取れる。

なんだったらもっと処理してしまってもいい。

```js:Promise.allサンプル2
Promise.all([
    driver.findElements(By.xpath('//div[@id="header"]'))
        .then(function(headers){
            return headers.length ? headers[0].getText() : "";
        }),
    driver.findElements(By.xpath('//div[@class="item"]'))
        .then(function(items){
            return items.map(function(item){
                return Promise.all([
                    item.findElement(By.xpath('./span[@class="title"]'))
                        .getText().catch(function(err){ return ""; }),
                    item.findElement(By.xpath('./span[@class="desc"]'))
                        .getText().catch(function(err){ return ""; })
                ]);                
            });
        }),
    driver.findElement(By.xpath('//div[@id="footer"]'))
        .getText()
        .catch(function(err){
            return "";
        })
])
.then(function(args){
    var headerText = args[0]; //"ヘッダ"
    var items      = args[1]; //[["名前","内容"],["なまえ","は"],["Name","ないよう"]]
    var footerText = args[2]; //"フッタ"
});
```

まあ考えたら当たり前なんですけども、最初は思いついてなかったので、記事にしてみました。
Serverless Framework1.0がリリースされたので触ってみる

## 概要
<img width="974" alt="スクリーンショット 2016-07-14 22.57.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/26dc9ce7-2b3b-d1a9-9e3e-293c78c30f3a.png">

http://blog.serverless.com/serverless-v1-0-alpha1-announcement/
サーバレスな構成でアプリケーションをさくっと作れるServerless Framworkの1.0ALPHA版がリリースされたとのことで触ってみました。

## インストール
以下のコマンドでインストールします

```shell-session
$ npm install -g serverless@alpha
```

以下のコマンドでヘルプが表示されればインストールOKです

```shell-session
$ serverless -h
```

## セットアップ
以下のコマンドでまずはサービスを定義します。

```shell-session
$ serverless create --name first-service --provider aws
```

0系のバージョンではこれがプロジェクトという単位で分けられていました。`first-service`は名前を変えてください。これはバグでS3のグローバルな名前空間制限に引っかかるみたいっす。以下該当のissue
https://github.com/serverless/serverless/issues/1458


作ったサービスのディレクトリ構成を見てみましょう。めっちゃシンプルになってる！！
後、JSONじゃなくてyamlになってる！！

```
├── handler.js
├── serverless.env.yaml
└── serverless.yaml
```

用途は以下の通り

- handler.js:Lambdaファンクションの実体
- serverless.env.yaml:リージョンやステージなどのサービス全体の環境設定
- serverless.yaml:クラウド側の使用するリソースの設定

## API Gateway + Lambdaのセットアップ
serverless.yamlの設定は以下のとおり。helloってLambdaファンクションをhttps://\<API Gateway エンドポイント\>/dev/hello をGETメソッドで呼び出すための設定です。

短か！！設定ファイル、、短か！！！

```yaml:serverless.yaml
service: horike-service
provider: aws
functions:
    hello:
        handler: handler.hello
        events:
            - http:
                path: hello
                method: GET
```

そして以下のコマンドでAWS上にデプロイします。

```
$ serverless deploy
```

以下のとおりcurlでデプロイしたAPIにアクセスすると。ちゃんとLambdaファンクションの結果が返ってきました。

```
[horike@horiketakahiro-no-MacBook-Pro horike-service]$curl https://ctlje3drz2.execute-api.us-east-1.amazonaws.com/dev/hello
{"message":"Go Serverless v1.0! Your function executed successfully!"}
```

## まとめ
というわけで、Serverless Framework1.0のさわりを紹介しました。
大きく変わったところとして、API Gatewayの超絶面倒くさい設定がほとんどなくなったことがよくなったところかなと思います。これなら心を折れること無く設定ファイルを書くことも出来そうです。

ちなみに、1.0ではAWS以外にもGoogle Cloud Functions, Microsoft Azure, IBM OpenWhiskなどの対応も実施されるみたいです。これからますます楽しみっすね！
TITAN XとGTX1080の比較メモ

[cnn-benchmarks](https://github.com/jcjohnson/cnn-benchmarks)でGPUやCNNによる実行時間の比較していたので、メモしておきます。

GPUの比較ではGPU,CPUの比較をしています。  

+ GeForce GTX 1080
+ GeForce GTX TITAN X
+ dual Intel Xeon E5-2630 v3


また、CNNでは以下のネットワークの比較をしています。

+ AlexNet
+ VGG-16
+ VGG-19
+ ResNet-18
+ ResNet-34
+ ResNet-50
+ ResNet-101
+ ResNet-152
+ ResNet-200

### 比較結果で参考になったところ

+ TITAN X より GTX1080のほうが1.1～1.15倍程度速い。
+ ResNet-50がVGG-16より1.5倍速い。
+ ResNet-200はメモリが8GBのGTX1080では動かない(それ以外はGTX1080でも動く)
+ ただし上記比較の際のバッチサイズは16のため、バッチサイズを64などにすると
　ResNet-50も動かなくなる可能性がある。

### まとめ

GTX1080を買おうと思った時にメモリ8GBで、どの程度の規模のニューラルネットが実行できるか見当がつかなかったので、この比較はとても参考になりました。入力のデータサイズが、16×3×224×224の場合でもResNet-152まではGTX1080で動くだろうということがわかったので、GTX1080はこれから買うには良い選択肢になるかと思います。

ただし、上記比較はCUDA8.0での比較なので、各ライブラリがCUDA8.0に正式に対応するまでは、以下の記事のようにインストールする段階で苦労する可能性があります。

[Qiita - GTX1080に換装すると一部のtensorflowのコードが動かなくなっていた件](http://qiita.com/tymob/items/b8b50001f6f9b99adebf)

CUDA7.5では[GeForce GTX1080 と TITAN XのDeepLearning学習時間ベンチマーク比較](http://www.univpc.com/newsinfo/v/574f8edd20ab9)を見るとTITAN Xの方が速いという結果になるようです。
Windows10にGradleをインストール

# はじめに

案外、単純にWindowsへGradleをインストールする手順が、検索しても見つけられなかったので、記事にしたいと思います。

# 環境

```
C:\>ver
Microsoft Windows [Version 10.0.10586]
C:\>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
```

# 手順概要

* ダウンロード
* 環境変数の設定
* 動作確認

# ダウンロード

Gradle Download
https://gradle.org/gradle-download/
から
Complete distribution
を、ダウンロードします。

2016年7月14日では
gradle-2.14-all.zip
が、ダウンロードできました。

適当な場所へ展開します。
ここでは簡単の為に`C:\`の直下に、`C:\gradle-2.14`と展開したとします。

# 環境変数GRADLE_HOME登録

スタートメニューを右クリック→システム
コンピューター名、ドメインおよびワークグループの設定の設定変更
詳細設定タブ→環境変数
システム環境変数の新規

変数名←`GRADLE_HOME`
変数値←`C:\gradle-2.14`

OKします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/77421/dfa791c5-e028-0981-48fa-c295b7bde7cb.png)

# 環境変数Pathへ追記

続けて、システム環境変数の一覧からPathを選択し、編集をクリック。
新規をクリックし、`%GRADLE_HOME%\bin`と入力しOKします。
環境変数ウィンドウをOKして閉じます。
システムのプロパティウィンドウをOKして閉じます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/77421/652aea72-7347-4fd9-8cd3-e115a042b3f9.png)

# 動作確認

スタートメニューを右クリック→コマンドプロンプト
コマンドを下のように打ち込んで、バージョン情報がでれば完了です。

```
C:\Users\yourname>gradle -version

------------------------------------------------------------
Gradle 2.14
------------------------------------------------------------

Build time:   2016-06-14 07:16:37 UTC
Revision:     cba5fea19f1e0c6a00cc904828a6ec4e11739abc

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_91 (Oracle Corporation 25.91-b15)
OS:           Windows 10 10.0 amd64
```
Android向けopenFrameworksをWindows+MSYS2で使おうとするとビルドが失敗する場合

# 前提

[android eclipse | openFrameworks](http://openframeworks.cc/ja/setup/android-eclipse/ "android eclipse | openFrameworks")の手順（Android向けopenFrameworksの環境をEclipseで作る）に従っている場合を前提とします。

ちなみに筆者は、これ以外に「NDK_ROOT=」の指定が間違っていたために動作しなかった、というミスもやらかしています。

# 私が遭遇したエラーとその対応

ビルドの際に実行されたg++などのコマンドを見て、それが

- 「android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/**windows-x86_64**/bin/arm-linux-androideabi-g++」

などではなく

- 「android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/**linux-x86**/bin/arm-linux-androideabi-g++」

のようになっている場合、以下が原因と見られる。

ダウンロードしたAndroid向けopenFrameworks中のファイル `libs\openFrameworksCompiled\project\android\config.android.default.mk` における、プラットフォームを判定する部分において、「↓ここから追加部分」と「↑ここまで追加部分」という部分を書き加える。

```mf
# libs\openFrameworksCompiled\project\android\config.android.default.mk の抜粋

ifeq ($(shell uname),Darwin)
ifneq ($(wildcard $(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/darwin-x86_64),)
	HOST_PLATFORM = darwin-x86_64
else
	HOST_PLATFORM = darwin-x86
endif
else ifneq (,$(findstring MINGW32_NT,$(shell uname)))
ifneq ($(wildcard $(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/windows-x86_64),)
	HOST_PLATFORM = windows-x86_64
else
	HOST_PLATFORM = windows
endif
	PWD = $(shell pwd)
# ↓ここから追加部分
else ifneq (,$(findstring MSYS_NT,$(shell uname)))
ifneq ($(wildcard $(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/windows-x86_64),)
	HOST_PLATFORM = windows-x86_64
else
	HOST_PLATFORM = windows
endif
	PWD = $(shell pwd)
# ↑ここまで追加部分
else
ifneq ($(wildcard $(NDK_ROOT)/toolchains/$(TOOLCHAIN)/prebuilt/linux-x86_64),)
	HOST_PLATFORM = linux-x86_64
else
	HOST_PLATFORM = linux-x86
endif
endif
```

というのも、MSYS2の場合、`uname`コマンドの実行結果が「MSYS_NT-10.0」という具合になり（私の環境）、上記のスクリプトではそれが検出できないためである。
ASP.NET MVC ViewからControllerへ値をModelに詰めて渡す方法 

<a href="http://qiita.com/maachii/items/b6ee0b252dfcf1ba9b49">ASP.NET MVC ViewからControllerへ値を渡す方法</a>の続きです。
環境は以下の通りです。
・Visual Studio 2015
・ASP.NET MVC5

Viewに複数のinputやselectなど入力項目がある場合に、
それらをModelに詰めて、ViewからControllerにデータを渡す方法です。

#viewからcontorllerへ値を渡す方法
##Modelを使わない方法
以下の様なViewがあるとします。

      <input type="text" name="data1" />
      <input type="text" name="data2" />
      <input type="text" name="data3" />

※上記の記載はformタグで囲まれています。

この値をControllerに渡したいとすると・・・もちろんcontroller側のアクションの引数を以下の様してもOKです。

    public ActionResult Action1(string data1, string data2, string data3)
    {
        中身・・・
    }

Viewのinputタグのnameの値と、Controllerのアクションの引数名を一致させればOKです。
これで自動的に紐づけをしてくれます。
##Modelを使う方法
ただ、渡す項目が多くなった時、上記の「引数に全項目を書く」方法をとるのは大変だし可読性もよくありません。
そこで、項目をModelに詰めて渡したいと思います。
以下の様に、Viewの入力項目のnameとおなじ名前のフィールドを
持つModelを作ります。


      public class SampleModel
      {
        public string data1 { get; set; }
        public string data2 { get; set; }
        public string data3 { get; set; }
      }

Controllerのアクションの引数を、上記のModelにします。

    public ActionResult Action1(SampleModel model)
    {
        中身・・・
    }

これで、ViewからControllerへ、Modelを値を渡すことができます。
今いる場所を地図(MapKit)で表示する方法

地図で今いる場所を表示する方法でうまくいかなったのでメモ



importするのはこちら

```
import MapKit
import CoreLocation
```

以下をviewDidLoadに追加

```
myLocationManager.delegate = self
let status = CLLocationManager.authorizationStatus()
if status == CLAuthorizationStatus.NotDetermined {
    // 認証ダイアログを表示
    myLocationManager.requestAlwaysAuthorization()
}
// 位置情報の更新
myLocationManager.startUpdatingLocation()
```

これだけではダメでinfo.plistに以下を追加しないとダメでした。

```
NSLocationWhenInUseUsageDescription
```
こんな感じに認証ダイアログの文言を追加
<img width="556" alt="スクリーンショット 2016-07-14 22.10.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/64331/56d4018b-bbf8-40a9-927d-4e4fe429352c.png">
差分ビルドが賢いninja-build


こんにちは。
最近はC言語で書かれたAndroid/iOS SDKのプロジェクトにjoinしまして、ビルドや単体テストの自動化について色々試行錯誤しております。

最初はMakefileで色々頑張っていたのですが、前から試してみたかったninja-buildというビルドツールを使ってみて、意外と便利だったため共有します。
[apple/swift](https://github.com/apple/swift) のビルドにも使われていたので、CやC++の皆さんの間では有名なのかもしれませんね。オープンソースで、C++で実装されているようです。
https://ninja-build.org
https://github.com/ninja-build/ninja

*Windowsでも使えるようですが、この記事ではMacで動作確認しております。
homebrewでインストールできました。

```bash
$ brew install ninja
$ ninja --version
1.7.1
```

例えばMakefileで下記のように書いていたビルドスクリプト。

```Makefile
obj=clang -c -g
app=clang

add:
	$(obj) add.c

addapp: add
	$(obj) addapp.c -o addapp.o

main: addapp add
	$(app) addapp.o add.o -o main
```

add.cを書き換えても、mainのジョブは差分を検知してくれません。
(*追記：[これはMakefileの書き方が間違っているだけでした。Makefileでも差分ビルドはできます！](#comment-78827f4ccd5b44133347))

```bash
c $ make main
clang -c -g add.c -o add.o
clang -c -g addapp.c -o addapp.o
clang addapp.o add.o -o main
c $ make main
make: `main' is up to date.
c $ echo "// hello" >> add.c
c $ make main
make: `main' is up to date.
```

ninja-buildで依存関係を記述しておけば、簡単に差分ビルドの問題を解決できます。

```build.ninja
rule obj
    command=clang -c -g $in -o $out

rule app
    command=clang $in -o $out

build addapp.o: obj addapp.c
build add.o:    obj add.c
build main:     app addapp.o add.o

default main
```

```bash
c $ ninja -v
[1/3] clang -c -g add.c -o add.o
[2/3] clang -c -g addapp.c -o addapp.o
[3/3] clang addapp.o add.o -o main
c $ ninja -v
ninja: no work to do.
c $ echo "// hello" >> add.c
c $ ninja -v
[1/2] clang -c -g add.c -o add.o
[2/2] clang addapp.o add.o -o main
```

add.cしか書き換えてないので、addapp.o はそのまま置いておいてくれました。
構文もシンプルで、出力もわかりやすい気がします。

書き方についてはドキュメントや参考サイトを参考にして欲しいのですが、差分検知の対象($in)に指定するのはディレクトリでも良いため、大きなプロジェクトにも対応できると思います。

環境変数を読み込むような難しいことはできないため、実際の運用ではbuild.ninjaファイルを出力してninjaコマンドを実行するスクリプトを別途書くことになると思います。

```Makefile
ninja = ninja -v

build-hoge:
    ./createbuildninja.sh hoge
    $(ninja)

build-fuga:
    ./createbuildninja.sh fuga
    $(ninja)
```

余談になりますが、[Xcode8でLLVMの大幅なパフォーマンス改善がされ、複雑な差分ビルドにも対応した](https://developer.apple.com/videos/play/wwdc2016/405/)とのことでした。
今後も色々検証してみたいと思います。

参考：
http://bigoyayubi.hatenablog.com/entry/2015/08/02/222909
http://mattn.kaoriya.net/software/ninja/20140121141906.htm
PhpStormで1プロジェクトで複数Gitを管理

# 初めに
PhpStormってとても便利なIDEですよね。
その中でも特に気に入っているのがGitのGUIツールです。
この記事では、そのツールのひとつの機能として、1プロジェクトで複数のGitを管理することができる方法を、備忘録も兼ねて記載していきます。

# プロジェクト準備
新規でも、既存のものでも構いません。
Gitで管理しているディレクトリが2つ以上あるプロジェクトを準備します。
私は以下のように2つのGitで管理されたディレクトリを用意してみました。

```bash
.
├── TestA/ TestAリポジトリ
└── TestB/ TestBリポジトリ
```

![ディレクトリ.jpg](https://qiita-image-store.s3.amazonaws.com/0/64362/1e8bcba0-858d-3aa8-873b-5273b4327dc6.jpeg)

# Gitツール
早速Gitの表示を行います。
Ctrl+Alt+S、またはFile>Settingsから設定画面を開いてください。Shiftを2回押してSettingsでもOKです。

その画面の検索窓からVersion Controlと検索しVersion Controlの設定画面を開いてください。
探すと以下に近い画面が表示されるはずです。
![バージョン設定1.jpg](https://qiita-image-store.s3.amazonaws.com/0/64362/e2ac7fd4-fc00-7327-5eb5-51e668908546.jpeg)

各Gitのレポジトリが表示されているはずです。
そうしたら、各レポジトリを選択して、右の緑のプラスボタンを押して、プロジェクトのリポジトリの管理に追加してください。
これでひとまずはGitの複数管理の設定が完了です。
下記のように左下にVersion Controlというタブが追加されます。
![完了後下.jpg](https://qiita-image-store.s3.amazonaws.com/0/64362/c6685e5d-1809-cf69-ad05-412efae6c73d.jpeg)

実際にVersion ControlタブからLogのタブを開いてみてください。
そうすると通常、ひとつしか表示されないLogのツリーに2つのリポジトリが表示される状態になっていると思います。
![GitLog.jpg](https://qiita-image-store.s3.amazonaws.com/0/64362/9a8b6861-cf65-36e4-0f26-cc800c96d7fe.jpeg)

また、Pathsを選択すると、表示するリポジトリを選択することができます。
片方のリポジトリのみ、全部表示といったことが簡単に行えるので、とても便利ですね。

恐らくIntelliJ IDEAやRubyMineでも同様のことができると思います。お試しください。
RSpecのletで変数を作成した値がnilになる

## letで作成した変数をかきかえようとするとnilになる

タイトルがわかりづらくてごめんなさい

どういうことかというと。。。

```
let(:str) { 'str' }

before do
 str = str+'ing'
end

#=> strがnilになる。
```

このような現象が起きる。
問題解決としては単純に違う変数名を指定すればいいだけのこと。だけど、まさかnilになるとはおもってもいなかったので、共有する。

## なぜこのような問題となったのか？

2.3.0から導入されているfrozen_string_literalをrspecないに導入した際に

```
can't modify frozen string
```
このようなエラーが起きた。
だったら、変数に代入すればいいじゃんということで、同じ変数名で代入したら、違うエラーが発生したのだ。binding.pryなどで調べると上記の問題を発見！！！

まーrubyとかなら変数の中身が書きかわるという感じでそのまま無意識でこのようなことをしてしまうと思う。

みんなの役に立てるといいなー。。。

このような記事をみつけることができなかたので、自分のためにももしかしたらほかの人のためにもなるのではないかと思い今回投稿することにした。

なにか間違っていることや、違うアプローチがあればコメントお願いします。


追記
コメントでもいただいたように自分が勘違いをしていた。
そもそもletは変数ではなくmemoized helper methodを定義しているらしい。

コメントいただいた方、ありがとうございます。
新たに勉強になりました。
MACにMongoDBをインストール＆ちょっと使ってみる

# インストール
```
$ sudo brew update
$ sudo brew install mongodb
```

# 起動
```
$ brew services start mongodb
```

# 動作確認
```
$ mongo -version
MongoDB shell version: 3.2.8
```

# MongoDBへの接続
```
$ mongo
MongoDB shell version: 3.2.8
connecting to: test
```

# コレクション作成とデータ追加
```
> use sample-mongo
> db.test.insert({_id:1,title:"MongoDBタイトル１",price:100});
WriteResult({ "nInserted" : 1 })
> db.test.insert({_id:2,title:"MongoDBタイトル2",price:200});
WriteResult({ "nInserted" : 1 })
```

# データ取得
```
# 全件取得
> db.test.find()
{ "_id" : 1, "title" : “MongoDBタイトル1", "price" : 100 }
{ "_id" : 2, "title" : "MongoDBタイトル2", "price" : 200 }
# 条件指定
> db.test.find({_id:{$eq:2}});
{ "_id" : 2, "title" : "MongoDBタイトル2", "price" : 200 }
```

# データ更新
```
> db.test.update({ _id:2 }, { $set : { title: "MongoDB タイトル Updated" } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
# 確認
> db.test.find({_id:{$eq:2}});
{ "_id" : 2, "title" : "MongoDB タイトル Updated", "price" : 200 }
```

## update field operator
updateの第3引数にtrueを渡すと、下記の場合にはinsert、そうでなければupdateという動作になります。
- コレクションが存在しない
- 該当するドキュメントがない

　上のupdateで指定している「$set」とは、「update field operator」と呼ばれるものです。
詳細はField Update Operatorsへ。

# データ削除
```
> db.test.remove({ _id:1 })
WriteResult({ "nRemoved" : 1 })
# 確認
> db.test.find({_id:{$eq:1}});
>
```

# コレクション削除
```
> db.test.drop()
true
```
【Laravel】【PHP】json_decode（配列化）/ json_encode（JSON化）

EloquentでとってきたDBの全データを取得 & `dd()` でデバッグすると

```php:MemberController.php
<?php

namespace App\Http\Controllers\;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Model\Member;
use Carbon\Carbon;

class MemberController extends Controller
{
    protected $request;
    public function __construct(
        Request $request
    ){
        $this->request = $request;
    }

    public function getMemberList() {
        $members = Member::all();
        dd($members);
    }
}
```

こういう感じでブラウザに返ってくる。

```ブラウザ
Collection {#281 ▼
  #items: array:8 [▼
    0 => Member {#282 ▼
      #table: "account"
      #fillable: array:1 [▶]
      #connection: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:23 [▼
        "mail" => taro.yamada@gmail.com
        "accountcode__c" => "100000"
        "name" => "山田太郎"
        "id" => 1
        "createddate" => "2016-03-25 00:43:30"
      ]
      #original: array:23 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    1 => Member {#283 ▶}
    2 => Member {#284 ▶}
  ]
}
```

###ちなみにDBの値をそのままBladeに表示するとJSONで表示される

`dd()` を外してビュー(Blade)に埋め込むと

```php:test.blade.php
@foreach($members as $member=>$index)
    <tr>
        <td>{{ $index }}</td>
    </tr>
@endforeach
```

ブラウザには **JSON** として表示される。

```ブラウザ
{"name": "山田太郎", "email": "taro.yamada@gmail.com"}{"name": "田中花子", "email": "hanako.tanaka@gmail.com"}{"name": "佐藤一郎", "email": "ichiro.sato@gmail.com"}
```

でもこれじゃ読みにくすぎるので

|名前|email|
|:--:|:--:|
|山田太郎|taro.yamada@gmail.com|
|田中花子|hanako.tanaka@gmail.com|
|佐藤一郎|ichiro.sato@gmail.com|

みたいにちゃんとテーブル表示したいなら

```php:test.blade.php
@foreach($members as $member=>$index)
    <tr>
        <td>{{ $index->name }}</td>
        <td>{{ $index->email }}</td>
    </tr>
@endforeach
```

#json_encode（JSON化）

###値をJSON形式にしてくれる関数。
第二引数に `JSON_PRETTY_PRINT` をつけると読みやすい形にしてくれる。

```test.php
$array = [];
$json = json_encode($array,JSON_PRETTY_PRINT);
```






#json_decode（配列化）

###JSONをPHPの配列にしてくれる。
**true/false** は **array/object** で返ってくる。
ちなみにデフォルトだとfalseになり **object** で返ってくるので注意。

```php:MemberController.php
public function getMemberList() {
	$members = Member::all();
	
	$json = json_decode($members, true);
	dd($json);
}
```

こんな感じでphp配列として返ってくる。

```ブラウザ
array:8 [▼
  0 => array:23 [▼
        "mail" => taro.yamada@gmail.com
        "accountcode__c" => "100000"
        "name" => "山田太郎"
        "id" => 1
        "createddate" => "2016-03-25 00:43:30"
  ]
  1 => array:23 [▶]
  2 => array:23 [▶]
]
```
Scrutinizerのphpunitが失敗するようになった

設定は特に変えていないのにあれれ？

```txt
PHP Parse error:  syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' 
in /home/scrutinizer/.composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php on line 63
```

Scrutinizerの現状の設定はこちら

```yaml
checks:
    php: true
filter:
    excluded_paths:
        - Resources/*
        - Tests/*
coding_style:
    php:
        spaces:
            around_operators:
                concatenation: false
build:
    tests:
        override:
            -
                command: 'phpunit --coverage-clover=coverage.clover'
                idle_timeout: 600
                coverage:
                    file: 'coverage.clover'
                    format: 'php-clover'
```

エラーの該当箇所を見てみると
https://github.com/phpDocumentor/ReflectionDocBlock/blob/3.1.0/src/DocBlock.php#L63

ということでphpunitを実行しているphpのバージョンが古かったのが原因。
特に何も指定しないと5.4.41で実行される。
5.5以上になるように設定を追加する。

```yaml
build:
    environment:
        php: '5.5.25'
```

これでphpunitが動くようになった。
なんか create_function が速い件



# なんか create_function が速い件

※ 2016/07/14 追記

**下記内容は間違っています。原因は xdebug のせいでした。**

※ 追記ここまで

```php
<?php

// グローバルなただの関数(内容に意味はないです)
function gfunc($a)
{
    $b = $a + 51;
    $c = $b * 2;
    if ($c === 111) {
        return;
    }
    $s = 0;
    for ($i = 0; $i < 22; $i++) {
        $s += $c;
    }
    return $s;
}

// create_function した関数(内容に意味はないです)
$cfunc = create_function('$a', '
    $b = $a + 51;
    $c = $b * 2;
    if ($c === 111) {
        return;
    }
    $s = 0;
    for ($i = 0; $i < 22; $i++) {
        $s += $c;
    }
    return $s;
');

// 無名関数(内容に意味はないです)
$closure = function ($a) {
    $b = $a + 51;
    $c = $b * 2;
    if ($c === 111) {
        return;
    }
    $s = 0;
    for ($i = 0; $i < 22; $i++) {
        $s += $c;
    }
    return $s;
};

$t = microtime(true);
for ($i = 0; $i < 100000; $i++) gfunc($i);
echo 'gfunc    :', microtime(true) - $t, PHP_EOL;
// double(0.39156198501587)

$t = microtime(true);
for ($i = 0; $i < 100000; $i++) $cfunc($i);
echo '$cfunc   :', microtime(true) - $t, PHP_EOL;
// double(0.27994298934937) ← ！！！！

$t = microtime(true);
for ($i = 0; $i < 100000; $i++) $closure($i);
echo '$closure :', microtime(true) - $t, PHP_EOL;
// double(0.59706401824951)
```

どういうこっちゃい。

グローバルな関数より create_function の方が速いのは理由に全く検討がつかない。

関係ないけど、無名関数が遅めで可哀想なので、リフレクションでコード部分取って create_function すると無名関数を高速化できる？ と思ってやってみた。

```php
<?php

// 無名関数を高速化する関数（実装はかなり適当）
function fast_closure(\Closure $c)
{
    $ref = new \ReflectionFunction($c);
    $sl = $ref->getStartLine();
    $el = $ref->getEndLine();
    $ll = $el - $sl - 1;

    // コードスタイルとか use とか scopeClass とかで判定してダメそうならそのまま返す(多分無理)
    if (false) {
        return $c;
    }

    // 引数部分（create_function の第1引数）
    $params = $ref->getParameters();
    $args = array();
    foreach ($params as $param) {
        $arg = '$' . $param->getName();
        if ($param->isPassedByReference()) {
            $arg = '&' . $arg;
        }
        if ($param->isDefaultValueAvailable()) {
            $arg = $arg . '=' . var_export($param->getDefaultValue(), true);
        }
        $args[] = $arg;
    }

    // コード部分（create_function の第2引数）
    $lines = file($ref->getFileName());
    $lines = array_slice($lines, $sl, $ll);
    $code = ltrim(implode("\n", $lines), "\r\n\t {");

    // 無名関数のコードブロックで create_function して返す
    return create_function(implode(',', $args), $code);
}

$fclosure = fast_closure($closure);
$t = microtime(true);
for ($i = 0; $i < 100000; $i++) $fclosure($i);
echo '$fclosure:', microtime(true) - $t, PHP_EOL;
// double(0.28115391731262)
```

おおお、速くなった。超黒魔術。

ちなみに手持ちの

- php 5.4.16
- php 5.5.31
- php 5.6.16
- php 7.0.4

で全部同じだった（php7 はむしろ 2.5 倍くらい早かった）。

まぁ create_function なんて前世紀の遺物だしこんな些細な速度差は気にしたら負けだと思う。
Make：Makefileの書き方 (1)


# 概要
GNU Makeについて。
# 基本
```make:Makefile
# コメント行

CC := gcc
OBJ_FILE = \
	 main.o

SampleProj: $(OBJ_FILE)
	$(CC) -o SampleProj$(OBJ_FILE)

clean:
	$(RM) *.o
	$(RM) SampleProj

```
# 汎用的にしてみた（ほぼパクリ）
```make:Makefile
TARGET    = SampleProj   # ターゲット名：実行形式のファイル名になります
EXTENSION = c            # 拡張子
CC        = gcc          # コンパイラ指定

CFLAGS    = -g -MMD -MP
LDFLAGS   = 
LIBS      = 

INCLUDE   = -I ./include
SRC_DIR   = ./src
OBJ_DIR   = ./build

SOURCES   = $(shell ls $(SRC_DIR)/*.$(EXTENSION))
OBJS      = $(subst $(SRC_DIR),$(OBJ_DIR), $(SOURCES:.$(EXTENSION)=.o))
DEPENDS   = $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET): $(OBJS) $(LIBS)
	$(CC) -o $@ $(OBJS) $(LDFLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.$(EXTENSION)
	@if [ ! -d $(OBJ_DIR) ]; \
		then echo "mkdir -p $(OBJ_DIR)"; mkdir -p $(OBJ_DIR); \
		fi
	$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<

clean:
	$(RM) $(OBJS) $(TARGET) $(DEPENDS)

-include $(DEPENDS)

.PHONY: all clean
```
# 注意点
以下コードのように字下げする行は「タブ」とすること。
半角スペースはダメのようです。全角スペース？もちろんダメ。

```
SimpleSvCl: $(OBJ_FILE)
	$(CC) -o SimpleSvCl $(OBJ_FILE)
```

# 参考サイト
＊[C言語を使うならMakeを使おうよ](http://qiita.com/j8takagi/items/74232a00cc33623f7844)
＊[分割コンパイルについて](http://sa.eei.eng.osaka-u.ac.jp/eeisa003/tani_prog/HOWTOprogC/split.htm)
＊[makeでコンパイルしよう](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=cpp003_make)
＊[Make と Makefile の説明](http://www.unixuser.org/~euske/doc/makefile/)
＊[汎用的に使えそうなMakefileを書いてみた](http://boysenberrypi.hatenadiary.jp/entry/2014/03/15/113703)
rex0220 数字チェック・プラグイン

kintone アプリで、数字項目の入力時チェック・半角変換など、入力を簡単・効率化するプラグインです。
数字入力後にエラーがわかりますので、直しも簡単です。

追加画面・編集画面・一覧画面の項目入力時および「保存」時の機能です。

- 必須項目チェック
- 数字チェック
- 最小値チェック
- 最大値チェック
- 小数桁チェック
- 全角数字を半角数字変換

フォームの項目設定により、チェックする内容が変わります。

[数字チェック・プラグイン](https://rex0220.stores.jp)

# 追加画面・編集画面の数字チェックエラー表示

![ncheck01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4d552ac6-4c61-5a4f-990e-8731c619d46b.png)

# 一覧編集画面の数字チェックエラー表示

![ncheck02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ac48b914-34e5-09ab-335e-59fc9a8ebb5c.png)

# 小数桁チェック

フィールドの設定において、「小数点以下の表示桁数」を指定している場合、
入力された数値の小数桁をチェックします。

![ncheck03a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/377bf021-a697-54bb-633b-c71dde5e4119.png)


# 半角数字変換

全角数字で入力されても、自動で半角数字に変換します。

![ncheck03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0bb911d6-b018-88ac-8ffb-b15b7dfb7159.png)


# 旧デザイン画面

旧デザイン画面にも対応しています。

![ncheck04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/301dd198-8527-f011-bb58-479524d64f95.png)


# フォーム設定

フォームの項目設定により、チェックする内容が変わります。

![ncheck06.png](https://qiita-image-store.s3.amazonaws.com/0/100572/dcce3a4d-5195-5d0d-4037-9971aa084e17.png)


# プラグインの追加

![ncheck11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/05065953-0935-fda9-eef8-063fdb6e27bb.png)


# プラグインの設定

![ncheck12.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d1cc31bc-970a-9db1-ea20-ee6435af5631.png)


設定画面を開くと数字項目が表示されますので、チェック対象にする項目を選択します。
設定後に、「保存する」ボタンをクリックします。
※項目変更後、タブまたはエンターキーで入力が確定します。

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- フォームを変更した場合は、プラグインを再設定してください。
なぜ教師あり学習でバリデーションセットとテストセットを分ける必要があるのか？

どうも。最近 Coursera で機械学習のコースを受講している @QUANON です。

# 概要

教師あり学習のデータセットには、

1. トレーニングセット (training set)
1. バリデーションセット (validation set)
    * 使用しない場合もある。
1. テストセット (test set)

があります。しかし、バリデーションセットとテストセットの違いが未だによく分からない、あるいは、なぜテストセットだけでなくバリデーションセットも必要なのかがピンと来ていないので、調べてみました。

# バリデーションセットの役割

トレーニングセットを使って分類器を訓練した後で、その分類器のハイパーパラメータをチューニングするために使用します。様々なハイパーパラメータについて、同じトレーニングセットを使って訓練した後で、さらに同じバリデーションセットを使ってそのパフォーマンスを計測します。そして、最もパフォーマンスの優れたパラメータを採用します。

バリデーションセットを使うケースは色々考えられますが、例えば、以下のケースが挙げられます。

* ニューラルネットワークで、精度を計測して隠れ層 (hidden layer) の数を決定する。
* ロジスティクス回帰で、F値を計測して分類のためのしきい値を決定する。

# テストセットの役割

トレーニングセットを使って分類器を訓練した後で、その分類器のパフォーマンスをテストするためだけに使用します。テスト後には、それ以上分類器モデルをチューニングしてはいけません。

# バリデーションセットとテストセットを分ける理由

最適なパラメータをするためにバリデーションセットを使っているため、そのバリデーションセットを流用してテストを行えば、その他の未使用のデータセットを使うよりもよい結果が得られそうなことは明らかです。つまり、実際よりもエラー率が低くなってしまいます。そのため、最終的なパフォーマンス計測時には、未使用のデータセットとしてのテストセットを用意しておく必要があるわけです。

言われてみればごく当たり前のような気がしますが、これを理解するのに時間がかかってしまいました。

# 参考

この投稿は Cross Validated というサイト (機械学習版 Stack Overflow かな？) の [What is the difference between test set and validation set?](http://stats.stackexchange.com/questions/19048/what-is-the-difference-between-test-set-and-validation-set) というページにある [mohsen najafzadeh 氏の回答](http://stats.stackexchange.com/a/96869) を参考にしました。

サイト名がなかなかタイムリーでした。 :flushed: 

# 最後に

僕は機械学習歴が (2016/07 時点で) 2 ヶ月程度とまだまだ浅いので、正直理解に自信がないです。 :sweat:
もし投稿内容に誤りがあったり、よりスマートな説明があったりすればご教示頂けると幸いです。
pythonのtupleをイテレーションするときの話



こんな風に書けることを知りました。使ったのは2.7.11だけど3も同じかと。

```python
items = [1, 2, 3, 4, 5]
pairs = [('aaa', 100), ('bbb', 200) ,('ccc', 300), ('ddd', 400), ('fff', 500)]

for key, value in pairs:
    print key, value
#>>>
#aaa 100
#bbb 200
#ccc 300
#ddd 400
#fff 500

for item, pair in zip(items, pairs):
    print item, pair[0], pair[1]    
#>>>
#1 aaa 100
#2 bbb 200
#3 ccc 300
#4 ddd 400
#5 fff 500

for item, (key, value) in zip(items, pairs):
    print item, key, value
#>>>
#1 aaa 100
#2 bbb 200
#3 ccc 300
#4 ddd 400
#5 fff 500

```
[JavaScript] 音声ファイルの経過時間(ミリ秒) を [分:秒] 形式に変換する

## やりたいこと
JavaScriptで、ミリ秒で渡される音声ファイルの経過時間を、[分:秒] 形式に変換したい。(最大で　59:59 まで表示できればよい。）

例

|入力(ミリ秒)|出力|
|:-----|:-----|
|1000|0:01|
|122000|2:02|

以下のコードはJSFiddleで実行できます。
https://jsfiddle.net/kjugk/4z1tLder/9/

## JavaScript で書いてみる

```js

function millisToMinutesAndSeconds(milliseconds){
  if(milliseconds >= 3600000){
    return "0:00" 
  }
  
  var seconds = parseInt((milliseconds / 1000) % 60, 10)
  var minutes = parseInt((milliseconds / (1000 * 60)) % 60, 10)
  
  seconds = (seconds < 10) ? "0" + seconds : seconds
  
  return minutes + ":" + seconds;
}
```



## Moment.js を使う
[Moment.js](http://momentjs.com/) を使うと、以下のように書けました。

```js
import moment from 'moment';

function millisToMinutesAndSeconds (milliseconds) {
  var duration = moment.duration(milliseconds);
  var seconds = duration.seconds();
  seconds = (seconds < 10) ? "0" + seconds : seconds;

  return duration.minutes() + ":" + seconds;
}
```
activeadminをGemfileに書いたときにbundle updateできませんでした。

Gemfileにactiveadminに追加すると、`bundle update`できなくて困りました。

# bundle updateでエラー
Gemfileにactiveadminを書きました。

```rb:Gemfile
gem 'activeadmin', github: 'activeadmin'
```
bundle updateします。

```bash
bundle update
Warning: the running version of Bundler is older than the version that created the lockfile. We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
Updating git://github.com/activeadmin/activeadmin.git
Updating git://github.com/carrierwaveuploader/carrierwave.git
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies........................
Bundler could not find compatible versions for gem "actionpack":
  In Gemfile:
    rails (= 5.0.0) ruby depends on
      railties (= 5.0.0) ruby depends on
        actionpack (= 5.0.0) ruby

    rails (= 5.0.0) ruby depends on
      railties (= 5.0.0) ruby depends on
        actionpack (= 5.0.0) ruby

    rails (= 5.0.0) ruby depends on
      railties (= 5.0.0) ruby depends on
        actionpack (= 5.0.0) ruby

    activeadmin (>= 0) ruby depends on
      inherited_resources (~> 1.6) ruby depends on
        actionpack (< 5, >= 3.2) ruby
```
失敗しました。

# inherited_resourcesを追加
Gemfileをに`inherited_resources`を追加しました。

```
gem 'inherited_resources', github: 'activeadmin/inherited_resources'
```
参考サイトだと`devise`と`inherited_resources`を追加しろとあったのですが、`devise`は書いてあったので`inherited_resources`だけ記述しました。

# bundle update
今度はうまくいきました(☝ ՞ਊ ՞)

# 参考
https://github.com/activeadmin/activeadmin/issues/4177
C#でUSB接続したTHETA Sを操作できるライブラリを作成してみた

RICOH THETA SではUSB MTPの仕様が公開されています。
https://developers.theta360.com/ja/docs/v2/usb_reference/
ただ、仕様を見ただけではどうやって実現したらよいかわかりませんでした。
調査を進めると、WindowsではWPDからMTPコマンドを実行できることがわかりました。
自分はC#が好きなので、C#から使えるライブラリを作成しよう！となりました。

WpdMtpLib
https://github.com/kon0524/WpdMtp
こちらが作成したライブラリです。
WpdMtpLibを使用するにはMTPの知識が少し必要なのでものすごくざっくりと説明します。

MTPではカメラ側をレスポンダー、接続機器（今回はWindows PC）側をイニシエータといいます。
イニシエータがレスポンダーにリクエストを送信すると、レスポンダーがイニシエータにレスポンスを送るという流れになっています。
リクエストには、リクエストの種別・パラメータ・データフェーズの有無の情報が含まれています。
データフェーズとはリクエストとレスポンスの間にある状態で、データを送信または受信するフェーズです。
リスエストの種別によって、データフェーズが無い場合、イニシエータからレスポンダーへデータを送る場合、レスポンダーからイニシエータにデータを送る場合の３ケースがあります。

例えば静止画撮影のリクエストの場合は以下のようになります。
リクエスト種別：0x100E(InitiateCapture)
パラメータ：StorageID, ObjectFormatCode
データフェーズ：なし
上記リスエストをレスポンダーに送り正しく受理されれば撮影されます。

詳しくは上記THETA SのMTP仕様にある、MTPの仕様書をご確認ください。

では早速やってみましょう。
まずはUSB接続したTHETA Sへ接続します。

```csharp
MtpCommand command = new MtpCommand();
string[] deviceIds = command.GetDeviceIds();
command.Open(deviceIds[0]);
```

例ではdeviceIdsの最初のidをopenしていますが、本当はここでTHETA Sかどうがチェックする必要があります。
この時、THETA Sの電源ボタンのLEDが赤色の場合は、電源ボタンを押して撮影可能状態にしましょう。

次に撮影です。

```csharp
command.Execute(MtpOperationCode.InitiateCapture, new uint[2] { 0, 0 }, null);
```

ピヨっと音が鳴ると思います。
Executeの引数は3つあります。最初がリクエスト種別で二つ目がパラメータ。InitiateCaptureのパラメータはStorageIdとObjectFormatCodeの2つ設定する必要がありますが、THETA Sの場合はどちらも0を指定してくださいと書いてあるため0が2つの配列を指定しています。最後がデータフェーズのデータですが、InitiateCaptureにはデータフェーズがないためnullです。

操作が終わったら正しく切断しましょう。

```csharp
command.Close();
```

他にも画像の取得などもできるので、MTPの仕様とにらめっこしてチャレンジしてみてください。