OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyのblock、procについての学習まとめ

##Blocks and Procs(closures)
Blockはdo end で囲われた範囲のことで、そこでProc(procedure?)を決める。
メソッドとよく似ているが、メソッドは他のメソッドに渡せないのに対し、Procはメソッドに渡すことができる。
なぜならProcはobjectであり、メソッドは異なるため。
何回実行するのかといったprocの制御をmethodで記述するということができる。
同じ処理を繰り返す場合に使える。例えば、arrayに要素を追加していくなど。

また、methodにはblockだけを渡すことができる。

##hashes and symbol
hashはkey-valuenのペアである。
	meal = { “egg” => “yum”
 	 “rice” => "tasty",
  	 “milk” => “goood”,
  	 “miso-soup” => "juicy"

hashはkey value によって構成されているため、each文にてそれぞれ取り出すことができる。
　 	meal.each do | key, value |
		puts key, meal[key]
	end
存在しないkeyを指定した場合 nil が返される。nilとは nothing at all の意味。
ただし、hashをhash constructor notation で定義する際、keyを決めておくとそのkeyが返される。
またnilとfalseは同じではなく、falseは not true の意。


###hashの作り方
hashは
・hash literal notation
		new_hash = { ‘one’ => 1 }  # => これのことをhash rocket と呼んでいるらしい。
・hash constructor notation 
		new_hash = Hash.new
に作られることが多い。

###symbol
key はstringの他にsymbolを用いて表記できる。symbolとは:symbolのように頭に:がつけられている。
stringとsymbolは異なるものである。
“example”.object_id  != :example.object_id

ではsymbol key と string key　の違いとは何か。hashにおいてはsymbolを用いることが推奨されている。
1.　symbolは一度作られたら変更することができない。？？
2. symbolのコピーは一度に一つだけ。よってメモリ使用を抑える。
3. symbol key は　string key より早い 約２倍
string からsymbolへの変更は .to_sym またその逆は .to_s を用いて行われる。
to_symではなく.internを用いても良い。
######注意######
ruby 1.9  以降ではhashの作り方に変更が加えられ、jsやpythonのような表記をするようになった。
　	new_hash = {one:1,two:2}
hash内の要素を探す場合は.selectを使うことができる。
　	hash.select{|key,value| key == :someKey}
	hash.select{|key,value| value < 100}
 hashの他のmethodとしてはeach_key や　each_value がある。
##The Zen of Ruby
if文を一列で書くことができる。trueならその文を実行する。
ternaryについて
 if-else文を１行で書く方法。
	<boolean> ? true-action : false-action
elsifの分岐が多岐にわたる場合はcase -when文を使用するのが良い。
	case vatiable
		when — 
			action
		…..
		else
	end
conditional assignment ||=
	variableの状態を判断して値を代入するかどうか決める。nilであれば代入し、すでにvalueを持っていれば何しない。
returnについて
method内の値を他でも使用する場合、returnを使用するが、何もreturnしないとどうなるか。
JSではundefined、pythonではNoneが返されるが、rubyは違う。method内で最後に行われた処理の結果が返ってくる。
ANDとOR内での処理の順番
	基本的に左から順番に処理していく。orであれば左側がtrueならtrue、andであれば左がfalseであればreturn値が決定できるので処理が終わることになる。
.upto()と.downto()
	例えば1~10までprintしたい場合は 1.upto(10){ |num| print num}と書くことで出力できる。
.respond_to?
	something.respond_to?(:action)でsomethingにactionが行えるか調べられる。
<< 
	.pushや+の代わりに<<を用いて値を追加することができる。

stringに変数を代入する場合や、数値を代入する場合の表記は面倒くさい。
“   #{variable}    ” と入力すると簡単！！

###modify
不要な語は省いて、短くする。rubyではreturnは必要ない。
if文、unless文は１行にまとめる。
for-loopによる同じアクションの繰り返しは.timesに変更。
.pushも<<に変更。

##Blocks, Procs,and Lambdas
###Blockとは
Blockはdo-endもしくは{ }によって囲まれた範囲のこと。.timesなどのメソッドが組み込める。
—blockへ使用される他のメソッド　collect—
eachに似ている。arrayそれぞれの要素に処理を行う。collect は単にコピーを作る。上書きしたいのならcollect!を使用。
###Proc
rubyではほとんどがobjectである。 例外なのがblockで、そのために変数の保存ができない。そのためのprocがある。Procはsaved Blockと言われる。
ProcはProc.newと書くことで定義できる。Procを使うには単にmethodに渡せば良い。（頭に＆をつけるとBlockとみなせる）
Procを利用することで、Blockの際は何度も書かねばならない処理を一つにまとめることができる。
yield やProc自体は.call methodにて呼び出すことができる。
—lambda—
lambdaはProcと同じくオブジェクト。
	lambda {|param| block}で定義できる。
lambda Procと似ているが、lambdaが呼び出されたメソッドのreturnを優先するのに対し、Procはすぐreturnする
コマンドラインからPowerShellを使用してGUIDを生成

```powershell:コマンド&nbsp;プロンプト
powershell -Command "[Guid]::NewGuid()"

Guid
----
2876541a-22c1-4add-bebe-033b139f783d
```

Visual Studio 2013 がインストールされていれば...
C:\Program Files (x86)\Windows Kits\8.1\bin\x86\uuidgen.exe があるので

```batch:開発者コマンドプロンプト&nbsp;for&nbsp;VS2013
C:\Program Files (x86)\Microsoft Visual Studio 12.0>uuidgen
7c702e10-b2aa-4623-bef2-0eb071e0ad30
```
raspberry pi 1 model bで、node-red　その１１

#概要
raspberry pi 1 model bの、node-redで、古いandroidからLチカしてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#写真
![led.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/c85c2cd4-68bf-c5d0-1656-af3b9f63f09c.png)
androidの画面
![UnVa_w.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/33a97127-4ade-3c7f-332a-5710fa3e6106.jpeg)

#サンプルコード
```
[{"id":"a6f9f4a2.4c3f08","type":"debug","z":"4f4f703e.a2a9d","name":"","active":true,"console":"false","complete":"false","x":385,"y":226,"wires":[]},{"id":"ab990cde.150e9","type":"rpi-gpio out","z":"4f4f703e.a2a9d","name":"gpio4","pin":"7","set":"","level":"0","out":"out","x":398,"y":327,"wires":[]},{"id":"46d384c7.294a1c","type":"inject","z":"4f4f703e.a2a9d","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":124,"y":125,"wires":[["1248bde4.3f23d2"]]},{"id":"1248bde4.3f23d2","type":"function","z":"4f4f703e.a2a9d","name":"1","func":"msg.payload = 1;\nreturn msg;","outputs":1,"noerr":0,"x":193,"y":232,"wires":[["ab990cde.150e9","a6f9f4a2.4c3f08","fae2a91d.fa4718"]]},{"id":"3dffad10.d82172","type":"function","z":"4f4f703e.a2a9d","name":"0","func":"msg.payload = 0;\nreturn msg;","outputs":1,"noerr":0,"x":210,"y":419,"wires":[["a6f9f4a2.4c3f08","ab990cde.150e9","fae2a91d.fa4718"]]},{"id":"36048dca.149992","type":"inject","z":"4f4f703e.a2a9d","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":116,"y":348,"wires":[["3dffad10.d82172"]]},{"id":"2f6a622.110f69e","type":"http in","z":"4f4f703e.a2a9d","name":"","url":"/ledon","method":"get","swaggerDoc":"","x":109,"y":476,"wires":[["3dffad10.d82172"]]},{"id":"eaa506b8.08c548","type":"http in","z":"4f4f703e.a2a9d","name":"","url":"/ledoff","method":"get","swaggerDoc":"","x":113,"y":292,"wires":[["1248bde4.3f23d2"]]},{"id":"fae2a91d.fa4718","type":"http response","z":"4f4f703e.a2a9d","name":"res","x":398,"y":432,"wires":[]},{"id":"20342250.7d316e","type":"http in","z":"4f4f703e.a2a9d","name":"","url":"/led","method":"get","swaggerDoc":"","x":115,"y":56,"wires":[["39e7bd73.a5ca82"]]},{"id":"81beffdd.9bda9","type":"http response","z":"4f4f703e.a2a9d","name":"","x":398,"y":85,"wires":[]},{"id":"39e7bd73.a5ca82","type":"template","z":"4f4f703e.a2a9d","name":"html","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n<body>\n<input type=\"button\" value=\"led on\" onclick=\"on()\"/>\n<br />\n<input type=\"button\" value=\"led off\" onclick=\"off()\"/>\n<script>\nfunction on() {\n    var xhr = new XMLHttpRequest();\n    xhr.open(\"get\", \"/ledon\", true);\n    xhr.send(null);\n    xhr.onload = function() {\n\t    alert(xhr.responseText);\n    }\n}\nfunction off() {\n    var xhr = new XMLHttpRequest();\n    xhr.open(\"get\", \"/ledoff\", true);\n    xhr.send(null);\n    xhr.onload = function() {\n\t    alert(xhr.responseText);\n    }\n}\n</script>\n</body>\n</html>\n","x":261,"y":59,"wires":[["81beffdd.9bda9"]]}]

```

#補足
古いandroidは、node-redのエディタが表示されないので、ajaxで動かした。
今後のAngularバージョンアップの流れについて

#プロローグ
先日のAngular2ハンズオンに参加した際に、
今後のAngularのバージョンは~~3、~~4の様にメジャーバージョンが上がりますというお話を聞き、
今後のバージョンアップスケジュールについて調べてみました。

記載内容に不備がありましたら、ご指摘頂ければ幸いです。

※追記
Angular Routerのメジャーバージョン4に合わせる為、
Angularのバージョン3はスキップされ、次のAngularのバージョンは4になりました。

#TL;DR
* Angularのバージョン管理方法にSemantic Versioning(SemVer)を採用
* 今後のバージョンアップは6ヶ月毎のサイクルでメジャーバージョンを更新
* Angular4は2017年3月頃

#今後のバージョン管理方法
2.0.0の様なSemanticVersioning（SemVer）と呼ばれるバージョン管理方法を採用しました。


#Semantic Versioning(SemVer)とは
バージョンナンバーは、「メジャー.マイナー.パッチ」のフォーマットで記載されるバージョン管理方法です。
例)2.0.0、2.9.0、2.10.0

##各バージョンアップタイミング
* メジャーバージョン：APIの変更に互換性のない場合
* マイナーバージョン：後方互換性があり機能性を追加した場合
* パッチバージョン：後方互換性を伴うバグ修正をした場合

※バージョン番号は必ず正の整数を使用

SemVerを採用している他のソフトウェアとしては、Node.jsがあります。

#リリースサイクル
今後は以下の図の様に、6ヶ月毎のサイクルでバージョンアップが行われます。

![release-cycle.png](https://qiita-image-store.s3.amazonaws.com/0/136408/16a037bb-f731-1311-5618-86333fa38269.png)

#実際のスケジュール
Angular4、5は2017年中にはリリースされる予定となります。

| スケジュール | バージョン |
|:---------:|:-------:|
|2017年3月頃|Angular4|
|2017年9月頃|Angular5|
|2018年3月頃|Angular6|
|・・・|・・・|


#他のバージョン管理方法
SemVerを調べる際に他のバージョン管理方法についても調べてみました。
他のバージョン管理方法としては、「メジャー.マイナー.パッチ.ビルド」のフォーマットもあるようです。
SemVerとの違いとしては、ビルドの部分が違い、ここには自動的に付与される値が入ります。
例）ビルドバージョンやビルドした日、Git Commitした際のハッシュ値

他のバージョン管理方法を採用しているソフトウェアとしては、Ruby on Railsがあります。

#参考
* [Angular Blog - Versioning and Releasing Angular](https://angularjs.blogspot.jp/2016/10/versioning-and-releasing-angular.html "Angular Blog")
* [Semantic Versioning](http://semver.org/lang/ja/"Semantic Versioning")
* [Effective Techniques For Software Versioning](https://10kloc.wordpress.com/2013/01/05/3-effective-techniques-for-software-versioning/"Effective Techniques For Software Versioning")
Egdeでflexされたtdに対して、子要素が横並びしない

以下html・cssで、tdに対してflexをかました。
その子要素divは横並びするが、Edgeは横並びにならない。
【対策】
しかたなくtdへのflexはあきらめた。
またdivに対して、float:leftで対応した

▼css
* * *
`td{display:flex;}`
* * *

▼html
* * *
`<table>
<tr>
<td><div>AAAA</div><div>BBB</div></td>
</tr>
</table>`
* * *
新人教育で参考になった書籍 5選

#始めに
会社で、新人教育に関する仕事に色々関わらせていただきました。

その過程で、読んだ多数の書籍の中からこれはという本を、
立場ごとに5冊選定してみました。

#[行動科学を使ってできる人が育つ！教える技術](https://www.amazon.co.jp/dp/4761267550/)
該当者：OJT担当者

はじめにの部分に以下のことが書いてあります。
>人が育たないのは教え手の「上司」と、学び手である「部下」、どちらの責任だと思いますか?
>この本で私がご紹介している「行動科学マネジメント」の視点で言うと、実はどちらの責任でもありません。
>教えてが「教え方を知らない。原因はこの一点につきます。」

部下に対して、どのように仕事を振り、またどのようにフィードバックを行うか。
この点に関して丁寧に描かれており、とても参考になりました。


#[いまどきエンジニアの育て方](https://www.amazon.co.jp/dp/4863541929/)
該当者：OJT担当者の上司
弊社で行っているOJTはこの書籍に書かれている方法をベースに考えました。

もともと、ネット記事に掲載されていたものを書籍にまとめたものです。
内容は、「自然とエンジニアが育つ」環境をいかにして作っていくかが書かれています。

チームとして、部署として、会社として、新卒を育てる環境をどのように構築していくかの、
参考となりました。


#[モチベーション3.0 持続する「やる気!」をいかに引き出すか](https://www.amazon.co.jp/dp/4062816199)
該当者：メンター
よく、自己啓発系の書籍で引用されているベストセラーです。

私が、新卒教育の中で一番重要と考えているのが、SDS(Self　Development System)です。

導入部分に関しては、こちらでフォローを行うことはできます。
また、こういったことを勉強したいと質問をしていただければ、参考書や、勉強会を勧めることもできます。

しかし、自らが学び成長して行くサイクルがなければ一過性のものとなり、
あまり身につかないのではと考えています。

そして、勉強する上のモチベーションとして、
マズローの欲求5段階説のなるべく上位の欲求で学習する方が効率が良いのではと考えています。

その上で、本書はモチベーション3.0である自分が好きなことだから行動する（自己実現欲求・内的動機づけ）
について、書かれており、理解しやすく参考になりました。



#[ザ・コーチ](https://www.amazon.co.jp/dp/B0085RMG52)
該当者：メンター

上記で書籍で、モチベーションについて触れましたが、
具体的な目標やゴールに関してどのように設定するかはこの本が参考となりました。

文体がコーチ役の人とその生徒が話していると言う構成で、
3冊シリーズが存在しますが、どれも大変読みやすくなっています。

特に、一冊めの生徒役の方が自分の部下の目標と、会社の目標とを擦り合わせている場面は、
大変参考になりました。

#[GIVE & TAKE 「与える人」こそ成功する時代](https://www.amazon.co.jp/dp/4837957463/)
該当者：新人に関わって疲れた人

新卒教育は、投資であり本当にバックがあるかは時間が経って見なければわかりません。
さらに、周りが教育に対して理解がなかったり、批判的であればさらに大変なものとなります。

この本は、人は以下の三種類存在すると定義しています。

 * ギバー（与える人）
 * テイカー（受け取る人）
 * マッチャー（受け取ったら与え、与えたら受け取りを期待する人）

そして、以下にギバーが世の中で成功し、与えた以上のものを受け取っているかを、
現実のデータや、事実を元に記載されています。

上記のことを書いている時点で私はマッチャーですが、
与え続けることに間違いはなかった、そう感じさせてくれる本です。

#終わりに
以前こういった話を聞いたことがありました。

>最初にきちんとした教育を行う人は貴重な人材だが、
>その教育を受けた人も貴重な人材となる。
>それは、受けた人が教える側に回った時に、同じような教え方をするからだ。

また「最上の名医」と言う漫画でも「無限の樹形図」と言う言葉が出てきます。
これは、人に助けられた人がまた別の人を助けることで描かれる図だそうです。

ですので、今後も素晴らしい教育を受けることができるエンジニアを増やせように、
私自身も精進し、「無限の樹形図」を描く一部になれたらと考えています。
TensorFlow / 回帰 > Davi Frossardさん

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
```

関連 http://qiita.com/7of9/items/bc3385f2e085b414f85b

TensorFlowを使った回帰の学習のソースコード例。
https://www.cs.toronto.edu/~frossard/post/tensorflow/

こちらのソースはそのままでは動かなかった。
追加、修正が必要 (こちらでは動かすまでに至っていない)。
Alamofireでmultipart/form-dataをパラメータ付きでPostしてみた。(Swift3.0/Alamofire (4.0.1))

Just in case I forget how to use lol
Basically it is so simple, you just need to add "multipartFormData.append()".

Additional Requirement: Reorder if you would like to post many data (more than 2) because Alamofire automatically sorts post params.

#Purpose
Personal Note

#Development Environment
- OS X El Captain 10.11.2
- Xcode Version 8.0

#Language
Swift 3.0
Alamofire 4.0.1

# Source Code
```swift
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                self.addImageData(multipartFormData: multipartFormData,image: self.yourUIImage)

                // If you need to post many data, you need to sort with key.
                if let data = "LawQiita".data(using: String.Encoding.utf8) {
                    multipartFormData.append(data, withName: "yourPostData")
                }
                
                }
            },
            to: getUrl(),
            headers: getHeader(),
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        print (response)
                    }
                case .failure(let encodingError):
                    print(encodingError)
                }
            }
        )
```

```
    private func addImageData(multipartFormData: MultipartFormData, image: UIImage!){
        var data = UIImagePNGRepresentation(image!)
        if data != nil {
            // PNG
            multipartFormData.append(data!, withName: "targetImage",fileName: "targetImage", mimeType: "image/png")
        } else {
            // jpg
            data = UIImageJPEGRepresentation(image!, 1.0)
            multipartFormData.append((data?.base64EncodedData())!, withName: "targetImage",fileName: "targetImage", mimeType: "image/jpeg")
        }
        
    }
```
TensorFlow / GTX 1070 / GTX 1080 > link > マルチGPU自作PCの情報

@YusukeSuzuki@github さんの記事
http://qiita.com/YusukeSuzuki@github/items/1d8514045d8cc223879c

> 自分もクラウドではなくマルチGPUマシンを組む方向でいこうと思います。GTX 1080のメモリが8GBなのがネックでそれ以上のGPUは値段や発熱のハードルがあるのが悩みどころ。貯金をしながら最適解を探します。

自分の場合はGTX 1070(8GB)でとりあえずプロトタイプ計算を考えている。メモリが足りない場合に計算の条件を制約することで計算をできるようにしようとしている。
しかしながら２枚目のGPUが必要になるかもしれない。

そういう中で調べた情報を共有しておく。


### 1

http://jisakutech.com/archives/2016/06/18598
> GeForce GTX 1080/1070のSLIは実質2-wayまでに限定　3&4-wayはベンチマークのみで有効

GTX 10シリーズになってからSLIの制約が2-wayになった、という情報。
しかしながら、TensorFlowでマルチGPU時には1つのGPUとして見えるようにするSLIは不要、ということを書いている記事があった。（リンク先を失念したので要確認）。

### 2

GTX 1070 5枚の使用例
http://tatujin-dejimono.com/virtual_currency/sc-gtx1070/

色々詳しく記載されている。

### 3

GTX 970 4枚の使用例
https://hackaday.io/project/12070-32-tflop-deep-learning-gpu-box

hackadayという見覚えがあるところのプロジェクト。
4枚のGTX 970を使用してTensorFlowを実行。

> I finally got tensorflow compiled from source and running with python3 cudnn version 5 and cuda toolkit 7.5 on the single GTX 970 that I currently have in this box.

その後、GTX 1080に変更したという情報はない。

### 注意点

今わかっている注意点

- 電源の問題
   - GTX 1070にしてもTDP 150W
   - 枚数が増えると使用している電源で安定動作できなくなる
- 排熱の問題
- 電気代の問題
   - 上記2の例で月、13,500円程度と試算している。
- マザーボードのレーン数
   - GPU一枚をx16で使うか、x8で使うか
   

### 4

https://www.reddit.com/r/MachineLearning/comments/3x8cn2/6_gpu_pc_build_is_sli_necessary/

> I don't think SLI is used by CUDA scheduled work, only PCIe.

Titan X 4枚構成というすごいものを見たが、自分には関係ないだろう。
TensorFlow / 回帰 > FPGA開発日記さん > 多項式フィッティング > 実行してみた

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
```

TensorFlowを使った多項式フィッティングの例を見つけた。
[TensorFlowを使って多項式のフィッティングを実装してみる @ FPGA開発日記さん](
http://msyksphinz.hatenablog.com/entry/2015/11/19/085852)

ソースコードが公開されていて、それを試してみた。
プログラムはlinreg.pyという名前にした。

```txt:結果
$ python linreg.py 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: GeForce GTX 1070
major: 6 minor: 1 memoryClockRate (GHz) 1.7715
pciBusID 0000:01:00.0
Total memory: 7.91GiB
Free memory: 7.47GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0)
4999 9.25199 -13.6215 3.59225 0.667213
```

同じような係数が得られた。

y4の定義については以下を使えばよさそう。
http://docs.python.jp/2.5/ref/power.html

```py
#y4 = W3*x_data*x_data*x_data+W2*x_data*x_data + W1*x_data + W0
y4 = W3*(x_data**3)+W2*(x_data**2) + W1*x_data + W0
```

```
...
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0)
4999 9.0852 -12.8266 2.61043 0.952773
```

以下の記事も参考になります。
[TensorFlowを使って多項式のフィッテイングを実装してみる(学習サンプル数と学習結果)](http://msyksphinz.hatenablog.com/entry/2015/11/20/020000)

## TODO

自分がしたいことはADDAという数値計算において、通常計算を終了した時の線形方程式の係数を学習すること。
その係数を初期値として線形方程式を解くと、計算が速くなることは2007年頃に確認済。[ポスター資料 @ トルコ発表](https://www.cps-jp.org/~21coeps/pub/POSTER/PDF/sg01-Okada-ELSX.pdf)
ある条件の場合の初期値を90%程度まで近似できれば、あとは線形方程式を続けて解くことで正確な結果を速く得ることができると目論んでいる。

上記のソースを元に望む方向に持っていく。

- x_data, y_dataのファイルからの読込み
- y4の式の検討
  - どういう式/ネットが最適か?
      - ただの多項式? 次数は?
      - ConvNet / Fully Connected Neural Network?
        - ConvNetは多クラス分類のみ有効なのか?
  - 活性化関数の検討
      - softmaxではないという現状認識
技術英語 > Debugging by Superstition

@ Code Complete (No. 17446 / 36077)

> Debugging by Superstition

http://eow.alc.co.jp/search?q=Superstition
> 1.〔不合理な〕迷信、盲信

上記の文の下の方には

> demon machines, mysterious compiler defetcs, hidden language defects that appear when the moon is full

デバッグに時間がかかる人はきちんとプロファイリングを取ったり、状況を把握しないままにデバッグしているのだと思う。数年前の自分でもそうだった。

似たような用語としては以下のようなものがありそう。

Optimization by Superstition

3%の効果に対して多大な時間をかけるか、90%の効果に対して多大な時間をかけるか。プロファイリングが取れる状況であれば、きちんとプロファイリングを取ってから検討するほうがいい。

<hr>
moonで思い出した

> once in a blue moon

http://ejje.weblio.jp/content/once+in+a+blue+moon

> ごくまれに、めったに…ない
Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話


Deep Learningを勉強するためにGPUを買ってUbuntuマシンにドライバーをインストールしたもののGUIログインできなくなってしまいました..。いろいろ試しながら何とかGUIログインできるようにしたときの話です。

#### 自分のマシン環境

OS 

- Ubuntu 14.04 LTS 	(Windows7とのDualブート)

GPU

- GeForce GTX 950 (購入して追加したもの)
- Quadro NVS 295 (PCに最初から搭載されてたもの)



## 最初にやったこと

NVIDIAのドライバーをインストールするとGUIログインできなくなるというのはよく起こるようで記事はそこそこ見つかります。以下あたりを参考にしたのですが自分の環境の場合解決されませんでした。環境によってはこれらの方法でうまくいく人もいるかもしれません。

- [http://may46onez.hatenablog.com/entry/2016/02/26/020208]()
- [http://askubuntu.com/questions/658040/ubuntu-14-04-nvidia-drivers-for-geforce-gtx-960m]()
- [https://askubuntu.com/questions/61396/how-do-i-install-the-nvidia-drivers]()
- [http://qiita.com/FaithnhMaster/items/b129268ef4718e61dd9a]()
 
## 結局、うまくいった方法

最終的に以下の記事を参考にやったら問題を解消できました。（少しアレンジしなくてはいけない部分もありましたが）

- [https://devtalk.nvidia.com/default/topic/878117/-solved-titan-x-for-cuda-7-5-login-loop-error-ubuntu-14-04-/]()

ポイントは **NVIDIAドライバをインストールするときにopenglのライブラリをインストールしないオプション設定を有効にする** ことでした。

アレンジしなければいけなかった部分は **NVIDIAドライバはCUDAのインストーラでインストールするのではなく先に手動でインストールしておく** です。（そうしないと ERROR: Unable to build the NVIDIA kernel module. が出てしまった）

全体の手順をまとめると以下になります。

```
sudo apt-get update
sudo apt-get install -y build-essential wget

# /etc/modprobe.d/blacklist-nouveau.conf を作成する
## 内容は以下
## blacklist nouveau
## options nouveau modeset=0

sudo update-initramfs -u

# 再起動する
sudo reboot

# CUI(Ctrl+Alt+F1)でログイン

# NVIDIAのドライバとCUDAをサイトからダウンロード
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/367.57/NVIDIA-Linux-x86_64-367.57.run
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run

chmod a+x NVIDIA-Linux-x86_64-367.57.run
chmod a+x cuda_7.5.18_linux.run

# X Serverを停止
sudo service lightdm stop

# openglなしでNVIDIAドライバをインストール
sudo ./NVIDIA-Linux-x86_64-367.44.run --no-opengl-files

# CUDAをドライバインストールなしでインストール
sudo ./cuda_7.5.18_linux.run --silent --no-opengl-libs --toolkit

# 環境変数追加
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_ PATH' >> ~/.bashrc
echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc
source ~/.bashrc
```

めでたくGUIでログインできるようになりました。
pyenvとAtomのメモ

# 久しぶりにMacに戻ったのでPython開発環境を改めて

vimに戻る気マンマンだったのだけれど、もういい年してそれは辞めようかと思いまして。
日頃は文書を書くことも多くなったし、ATOMメインで良いかなって...

さて、そんな事はさておき、Macリスタートに際してメモ

homebrew 入れて pyenv 入れて、それ以降について。

pyenvとAtomの良好な関係を築くために、やはり init.coffee に一行仕込みます。

```
process.env.PATH = ["/Users/hoge/.pyenv/shims/python", process.env.PATH].join(":")
```

ということで、無事解決。
で、話が違うけど、Atomってパッケージ管理出来たんだ、知らなかった。
どんどん自分もオヤジ化していっているので気をつけよう。

```
apm list --installed --bare > my_packages.txt
apm install --packages-file my_packages.txt
```

さてさて、子どもに一通り教えるまで、先っちょの方は把握しておきたいと思う今日このごろ。
ということで、これからもPythonを軸にして、色々と追っかけていこう。
機械学習論文読みメモ_12

[Data-driven Rank Breaking for Efficient Rank Aggregation](http://jmlr.org/proceedings/papers/v48/khetan16.pdf), ICML2016
個人の好み情報を集め、それらに基づき全体的なランク情報を取得する。
全体的なランク情報を学習する際、その計算コストを低減するためにrank breaking手法を用いる。
この手法では、個人の好み情報を互いに独立なベアワイズ比較情報へ分解し、その情報に適用可能で効率的な手法を用いる。
しかし各比較情報間を独立に扱うため、その予測結果は一貫性が低い。
本論ではこの欠点を、データのトポロジーを考慮する事で、各比較情報を不均等に扱う事で改善する。
この考え方にもとづき、提案する手法は一貫性のある結果を最適な誤差バウンドの元得る事が出来る。
この事で、精度とモデル複雑性のトレードオフを理想的な形で獲得出来た。

[Persistence weighted Gaussian kernel for topological data analysis](http://jmlr.org/proceedings/papers/v48/kusano16.pdf), ICML2016
topological data analysis (TDA)において、persistence diagramはデータ表現手法として広く使われる。
これは、各データ点周りの半径rの球を考え、rを変化させた時の各点間のオクルージョンに基づく接続関係（r-neighbor graph）を見る事で構造（環がいつ出来るか等）の変化、あるいは一貫性を表現する。
本論では、データから得られたpersistence diagramをカーネル関数を用いる事でベクトル化し、それを用いてカーネル手法を適用可能にする。

[Stratified Sampling meets Machine Learning](http://www.cs.yale.edu/homes/el327/papers/lls15.pdf), ICML2016
データベースに対してクエリを投げた時、各データ点毎のクエリに対する点数を合計した値を返したい。
これを単純に行うと計算コストが膨大なので、データベースからサンプリングした部分集合だけを用いて近似したい。
従来はこれを一様サンプリングに基づいて行っていたが、本論では非一様なサンプリング、つまりstratified sampling、に基づいても行う。
提案するサンプリング手法はPACの文脈、つまり機械学習の文脈に基づいて提案される。
ここでは、各データ点のサンプル確率と、訓練データとして今までのクエリ結果とを用いてモデルを学習していく。
これは正則化経験リスク最小化アルゴリズムとして提案でき、理論的な一般化も行った。
結局の所、訓練データが十分でないと過剰適合を起こすため、正則化が鍵となってくる。
PPAPテストをPHPで

# PPAPテストをPHPで
## 概要

- [PPAPテストを Web Audio API で](http://qiita.com/kichiki/items/c0b760375fd9cdcd9065)
- その発想はなかった

## 環境

- PHP 7.1.0RC5

## 実装

- 以前実装したネタとはできるだけ被らないようにする
 - [ズンドコキヨシ with PHP](http://qiita.com/shinderuman@github/items/7c432e8cb7719d35342a)
 - [変数を使わずズンドコキヨシ with PHP](http://qiita.com/shinderuman@github/items/fcf384a6fff319765615)
 - [こんなズンドコキヨシは嫌だ with PHP](http://qiita.com/shinderuman@github/items/15fe031ab9ff74ce8fb2)
 - [こんなズンドコキヨシは嫌だ with PHP その２](http://qiita.com/shinderuman@github/items/5d26a92331247f231fc7)
- 追記：途中から本筋でなく無理矢理なループの実現に力を入れ始めた :puke: 

### シンプルに

```php
<?php
$ppap = [
	'ペン',
	'パイナッポー',
	'アッポー',
	'ペーン',
];

while (true) {
	shuffle($ppap);
	$result = implode('', $ppap);
	echo $result . PHP_EOL;;
	if ($result === 'ペンパイナッポーアッポーペーン') {
		break;
	}
}
echo '＼(^o^)／ﾋﾟｺ!' . PHP_EOL;
```

### iterator

```php
<?php
class PPAP implements Iterator
{
    public $ppap = [
        'ペン',
        'パイナッポー',
        'アッポー',
        'ペーン',
    ];

    public function current()
    {
        shuffle($this->ppap);                                                                                                                                   
        return array_shift($this->ppap); 
    }

    public function key()
    {
    }

    public function next()
    {
    }

    public function rewind()
    {
        $this->ppap = [
            'ペン',
            'パイナッポー',
            'アッポー',
            'ペーン',
        ];
    }

    public function valid()
    {
        return count($this->ppap);
    }
}

$ppap = new PPAP();
loop:
$result = '';
foreach ($ppap as $p) {
    $result .= $p;
}
echo $result . PHP_EOL;
if ($result !== 'ペンパイナッポーアッポーペーン') {
    $ppap->rewind();
    goto loop;
}
echo '＼(^o^)／ﾋﾟｺ!' . PHP_EOL;
```

### generator

```php
<?php
$result = '';
foreach ((function () {
    $ppap = [
        'ペン',
        'パイナッポー',
        'アッポー',
        'ペーン',
    ];
    shuffle($ppap);

    foreach ($ppap as $p) {
        yield $p;
    }
})() as $p) {
    $result .= $p;
}

echo $result . PHP_EOL;
if ($result !== 'ペンパイナッポーアッポーペーン') {
    require __FILE__;
} else {
    echo '＼(^o^)／ﾋﾟｺ!' . PHP_EOL;
}
```

### generator (意地でもshuffle使いたくなかった版）

```php
#!/usr/local/bin/php
<?php
$result = '';
foreach ((function () {
    $ppap = [
        'ペン',
        'パイナッポー',
        'アッポー',
        'ペーン',
    ];

    $f = function ($ppap) {
        $rand = array_rand($ppap);
        $p = $ppap[$rand];
        unset($ppap[$rand]);
        $ppap = array_values($ppap);
        return [$p, $ppap];
    };

    $count = count($ppap);  
    for ($i = 0;$i < $count;$i++) {
        list($p, $ppap) = $f($ppap);
        yield $p;
    }
})() as $p) {
    $result .= $p;
}

echo $result . PHP_EOL;
if ($result !== 'ペンパイナッポーアッポーペーン') {
    system(__FILE__);
} else {
    echo '＼(^o^)／ﾋﾟｺ!' . PHP_EOL;
}
```
敵キャラとかを自動的に動かす　NavMesh

## NavMeshとは
経路を探索してくれるAIみたいなもの。移動する順番を指定したり、障害物を避けてくれたりする。

めっちゃ簡単。

工夫次第でいかにも敵に意思があるように作れる。

### 使い方
大きく分けて以下の2つ。
1. エリアに対してNavMeshをBakeする。
2. 移動させたいもの（ここではキャラクター）に対してNav Mesh Agentをアタッチする。
3. 移動に関するスクリプトを書き、キャラクターにアタッチする。

### 1.エリアに対してNavMeshをBakeする

エリアは既にあるものと仮定する。

メニューから**Window -> Navigation**をクリック。

Navigationタブが表示されるので**下のBake**をクリック。

するとエリアに青い面が現れる。これが移動ルートになる。

移動ルートは自動で生成してくれるが、**上のBake**をクリックすると詳細設定画面になるので、そこで調整できる。

### 2.キャラクターに対してNavMesh Agentをアタッチする。

キャラクターをクリックし、**Add Component**で**Nav Mesh Agent**をクリック。

### 3. 移動に関するスクリプトを書き、キャラクターにアタッチする。

スクリプトを作成し、移動させたい対象にアタッチする。

単純にある対象（ここではtarget)に向かっていくスクリプトを以下に書きます。

```C#:Move
public class Move : MonoBehaviour {

	public GameObject target;

	void Start () {
		NavMeshAgent agent = GetComponent<NavMeshAgent> ();
		agent.speed = 1;//このようにスクリプトからNavMeshのプロパティをいじれる。
		agent.destination = target.transform.position;
	}
}
```

#### ハマリポイント

1. エリアのオブジェクトを**static**にしておかないと動かない。(Inspectorビュー上のチェックボックス)
2. キャラクターに**RigitBody**がついてると目に見えない何かに衝突してしまう。
Swift2.2 -> Swift3.0 への移行が辛すぎてプロジェクトを作り直した話

esa.io の iOS アプリを作っていて、それを Swift3 へ移行しようとしたが辛すぎてプロジェクトをゼロから作り直した話。
移行前、移行後のリポジトリは以下です。

Swift3: [starhoshi/pi\-chan2](https://github.com/starhoshi/pi-chan2)
Swift2.2: [starhoshi/pi\-chan](https://github.com/starhoshi/pi-chan)

## 移行前

* [Swift3移行を振り返って \- Qiita](http://qiita.com/dondoko-susumu/items/c54bd887aabaaceb9708)
* [Swift2\.2 から Swift3 へ頑張って移行した話 \- Qiita](http://qiita.com/takayama/items/096d7fa6780f232da142)
* [Swift 2\.2のプロジェクトをSwift 3\.0に書き換えるタスクリスト \- Qiita](http://qiita.com/shobyshoby/items/dac7996b042c7d893f36)
* [iQONをSwift 3\.0\.1にアップデートしたときに対応したポイント \- Qiita](http://qiita.com/WorldDownTown/items/29e8026fe76f4294bf8b)

ここら辺読んで、大変そうだけどなんとかなるっしょって思って移行スタート。
利用しているライブラリを一通り確認して、問題ないことを確認。

## 移行を試みる

1. Xcode コンバート
2. Cocoapods ライブラリの更新
3. エラーを頑張って直す

まず Xcode を開いて、コンバートを促されたので Swift2.2 から Swift3.0 へコンバートして、Cocoapods も更新した。
コンバート後に大量のエラーが出てマジかよってなったけど、他のみんなも頑張ってるみたいだし黙々と直していた。

ただ、どれだけエラー直しても終わる気がしないしライブラリの更新とか地獄で、

1. エラーが出る
2. ライブラリの README 読む
3. 直す
    * ライブラリの README が古かったりする...
    * github では podspec が更新されてるけど cocoapods に push されてなくてハマる

というのを何回か繰り返して、これ人間がやることじゃねえって思ったし、終わりが見えないのが辛い...。
コンパイルが通るまでにめっちゃ時間かかりそうだし、コンパイル通ってからもエラーでるんだろうな、という感じで心が折れた。

移行スタートからここまで 3 時間くらい。

## 作り直す

Project を作り直して、コンパイルが通るレベルで小さく移行 & 書き換えしていくことにした。

1. Project 作る
2. Cocoapods 入れる
3. とりあえず起動する
4. 対象ファイルを Swift2.2 の Project からコピってくる
5. エラー出る
6. 直す
7. Build が通る

という手順で少しずつ、少しずつ動くように直していった。

移行完了まで 1.5 日くらい。
作り直すときは「多分 2 日あれば余裕で作り直せる」という感覚があったし、だいたいそのくらいの期間で作り直せた。

ただし、Swift ファイルは 70 くらいしかない Project だったのでそれくらいの時間で済んだと思う。

### メリット

基本的に 1 ファイルずつ直していくのでテンポが良くサクサク進んでいける。
どこまで進んだかが把握しやすく、5つ画面動くしあと4つで終わりだ〜という気持ちで行ける。

また、同時にリファクタリングしながら進められる。
ライブラリも Himotoki から ObjectMapper に移行したり、なくてもなんとかなるライブラリ削除したりと結構大きめの修正もすることができた。

`レッド(コンパイルエラー) -> グリーン(アプリ起動) -> リファクタリング` となるので TDD っぽいって思ったけど、テストは 1 行も書いてないので全然違いますね :rolling_eyes: 

## 感想

作り直すのは何かに負けた気がして後ろめたい気持ちが少しありますが、感想としては作り直してよかった。

とりあえずエラーが出ない状態まで持っていけば良いという状況を作り出せるのがポジティブに進めていけた。
Issue Navigator に大量にエラーが残っている状態でひらすらそれを解消するのは辛すぎる...。

Swift2.3 のサポートが切れる日も遠くないとのことなので、なんとか頑張って移行していきましょう :muscle: 

## esa.io 使ってる人は

[ピーちゃん](https://itunes.apple.com/jp/app/pichan-unofficial-esa.io-client./id1107328970?mt=8) をぜひ使ってみてください :bow:
PHPで日付をループする方法と罠

PHP の DatePeriod で日付をループする。
見慣れないし存在自体忘れそう＆地味に面倒くさい仕様なのでメモ。

# 使い方
ループする期間の始点、終点（？）、間隔を指定する。

```PHP
<?php
$start    = new DateTime('2016-11-02'); // 16/11/02 から
$end      = new DateTime('2016-11-08'); // 16/11/08 まで
$interval = new DateInterval('P2D');    // 2日間隔で（最初に P）

$period = new DatePeriod($start, $interval, $end); // 順番注意

foreach ($period as $date) {
    echo $date->format('Y-m-d');
    echo "\n";
}

// 出力（16/11/08 は出てこない）
/*
2016-11-02
2016-11-04
2016-11-06
*/
```

**終点はループに含まれない**ので注意。わかりづら。

# 終点の日付も含める
DatePeriod という名前だけど突っ込んでるのもループしてるのも DateTime オブジェクトなので、時刻も見てる＆持ってる。

終点の日付も含めたいなら、終点の時刻を始点より後に設定しちゃえばいい。

```PHP
<?php
$start    = new DateTime('2016-11-02');          // 16/11/02 00:00:00
$end      = new DateTime('2016-11-08 00:00:01'); // 16/11/08 00:00:01
$interval = new DateInterval('P2D');

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $datetime) {
    echo $datetime->format('Y-m-d H:m:s');
    echo "\n";
}

// 出力（16/11/08 も出てくる）
/*
2016-11-02 00:00:00
2016-11-04 00:00:00
2016-11-06 00:00:00
2016-11-08 00:00:00
*/
```

考えるの面倒くさいし始点には```00:00:00```、終点には```23:59:59```とでもつけちゃうのがいいとおもう。

ちなみに、既にある DateTime オブジェクトの時刻を書き換えるのは```setTime()```。

```PHP
<?php
$today = new DateTime(null, new DateTimeZone('Asia/Tokyo')); // 2016-11-07 01:17:38
$today->setTime(12, 34, 56); // 2016-11-07 12:34:56
```

破壊的操作。

## （11/13 追記）終点を表示させたい日の翌日にする
コメントにてアドバイスを頂いたので追記。
こちらでも思った通りの表示ができます。（詳しくはコメントのほうを）

```php
$end = new DateTime('2016-11-09'); // 16/11/08 まで表示され、16/11/09 は表示されない。
```

ちなみに 1日後にするのはこう。（筆者による）
出たな DateInterval……！

```php
$end = new DateTime('2016-11-08');
$end->add(new DateInterval('P1D')); // 16/11/09
```

# 時刻をループする（脱線）
ちなみに時刻でもループできる。

```PHP
<?php
$start    = new DateTime('2016-11-02 22:33:44');
$end      = new DateTime('2016-11-08');
$interval = new DateInterval('P1DT2H3M45S'); // 1日と2時間3分45秒間隔で

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $datetime) {
    echo $datetime->format('Y-m-d H:i:s');
    echo "\n";
}

// 出力
/*
2016-11-02 22:33:44
2016-11-04 00:37:29
2016-11-05 02:41:14
2016-11-06 04:44:59
2016-11-07 06:48:44
*/
```

DateInterval って他にどこで使うか知らないけどどうして最初に```P```つけるんだろう……。
単位は下表のとおり。複数並べるときは表中で上にあるものから。

|単位|記号|
|:---|:---|
|年|Y|
|月|**M**|
|日|D|
|時間|H|
|分|**M**|
|秒|S|

まさかの```M```かぶってるっていう。
そのせいか**時刻の前には```T```をつける**ことになってる。
```'P3M'```だと3ヶ月、```'PT3M```だと3分。ウケる。

例えば「1日と2時間」のつもりで```'P1D2M'```と書くと Fatal error 吐かれる。
正しくは```'P1DT2M'```。ウケる。

ていうかこれ DateTimeInterval, DateTimePeriodって呼ぶべきでは。長いからかな。

- [PHP: DatePeriod::__construct - Manual](http://php.net/manual/ja/dateperiod.construct.php)
- [PHP: DateInterval::__construct - Manual](http://php.net/manual/ja/dateinterval.construct.php)
- [PHP: DateTime - Manual](http://php.net/manual/ja/class.datetime.php)
- [PHP: サポートする日付と時刻の書式 - Manual](http://php.net/manual/ja/datetime.formats.php)
MOSA Software Meeting in 湘南 2016に行ってみた。

こんにちは、フリーランスの永田大祐と申します。
今回はmosaの勉強会が楽しかったので、投稿させていただきます。

##本日は2016/11/05-11/06でmosaの勉強会に出席しました。

国際村センターで開催！！！湘南の景色の良いホテルでした。
![14915313_602819576563664_5425091555719501381_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/131469/b602676f-cbba-5d81-e8e3-c6e8e0a50acc.jpeg)


###1日目
iosのホームオートメーションについて、音声のインターフェースについて、人工知能、雰囲気メガネ、温度センサーのSDK、iMessageやステッカーについて、ios10の新機能関連の発表、勉強会がありました。

###夜には懇親会
私は、openCVで輪郭を明示的にコントロール、抽出して、合成した黒い画像に輪郭を貼り付ける手順を簡単に紹介させていただきました。急遽確定して、30分で仕上げる必要があったので,FaceBookに書き込み作成しました。
![14991152_602908269888128_4573001295094767511_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/131469/500d1f67-f7d8-ddb2-e8bf-ae205e25cef5.jpeg)


###ミッドナイトセッション
があり、ホテル内の２階建の部屋を貸し切り、Star Warsのollieや海外のアプリケーション、自作のハードをiphoneと連携してシャボン玉を生成する玩具などの発表がありました。

###2日目
音声認識、bluetooth、ビーコン、ハードとiosの連携などのセッションがありました。

様々に知見を発見、収穫できた２日間でした。
最後のセッションでios10の音声認識のSDKを作成したコードを配布していただきました！実施にカメラのシータと連携できる実装になっていました。

忘れないうちに、簡単にアプリケーションを作りました。カメラと音声認識を合わせただけです。
機能は、しゃべると写真が撮れるというものです。

こちらの方々の情報を確認すれば、出来ると思います。作成してから微調整をしたかったので、調べていたら、とてもわかりやすい情報でした。

こちらが、音声認識でカメラを撮影出来るサンプルになります。Xcode8,ios10.0になります。
https://github.com/daisukenagata/SoundCamera

音声認識
http://qiita.com/KentaKudo/items/8473146d5d596069b857

カメラ
http://qiita.com/tfutada/items/3e415cbe176d6f801b1d


#Speech Frameworkについて
[こちらが Appleの公式サンプルです。]
(https://developer.apple.com/library/content/samplecode/SpeakToMe/Introduction/Intro.html#//apple_ref/doc/uid/TP40017110-Intro-DontLinkElementID_2)

この中に、、、


    SFSpeechRecognitionTask

というメソッドがあります。

こちらは約１分間動き続けます。声だけの文字列の編集が難しい仕様になっています。


    result.bestTranscription.formattedString

という文字列に変換するメソッドがあるのですが、声だけですと、文字列が合体し続けます。
Appleのサンプルではボタンで編集できましたが、ボタンでは音声認識の意味がないなという感想です。


GoogleのOK Googleのような声で反応させて、声で編集や、終了などはメモリをコントロールしながら、実装をするには、結構大変という感想でした。しかし方法はないわけではないらしく、mosaの勉強会でSDKの紹介と、ともに知見を共有していただきました。

こちらは教えれません。すみません。

#まとめ
二日間の結構豪華な勉強会でした。
OCRの文字解析の検出方法の知見なども出席者の方に教えていただき、とてもありがたいと思います。
非公開な情報の方が多かったので、自分の実力、オリジナルなロジックなど出来ましたら、その際は対応を共有できればと思います。
貴重な時間を割き、お読み下さいましてありがとうございました。😀
テーブルが壊れているかと思ったので、mysqlcheckで修復したときのメモ

# mysqlcheckとは

mysqlcheckは、MySQLのテーブルメンテナンス、修復を行なうことができる。
内部的には、CHECK, ANALYZE, REPAIR, OPTIMIZEのコマンドを利用して作業を行なう。
また、MySQLを稼働しているときに、実行することができる。

# 1. check（テーブルのエラーチェック）

* オプション

```
-c, --check
テーブルエラーを確認する
```

* 全データベースを確認する場合

```
# mysqlcheck -c -u root -p --all-databases
```

* sampleデータベースのみを確認する場合

```
# mysqlcheck -c sample -u root -p
```

# 2. analyze（テーブルの分析）

* オプション

```
-a, --analyze
テーブルを分析する
```

* 全データベースを確認する場合

```
# mysqlcheck -a -u root -p --all-databases
```

* sampleデータベースのみを確認する場合

```
# mysqlcheck -a sample -u root -p
```

# 3. optimize（テーブルの最適化）

* オプション

```
-o, --optimize
テーブルを最適化する
```

* 全データベースを確認する場合

```
# mysqlcheck -o -u root -p --all-databases
```

* sampleデータベースのみを確認する場合

```
# mysqlcheck -o sample -u root -p
```

# 4. repair（テーブルの修復）

* オプション

```
-r, --repair
一意ではないユニークキー以外のすべてを修正できる修復を実行する

--auto-repair
確認されたテーブルが壊れていた場合、自動的に修復
```

* 全データベースを修復する場合

```
# mysqlcheck -r -u root -p --all-databases
```

* sampleデータベースのみを修復する場合

```
# mysqlcheck -r sample -u root -p
```

* エラーチェックと修復を組み合わせて実行する場合

```
mysqlcheck --auto-repair -c -o sample -u root -p
```

# 結果

OKが出てくることを確認して、完了
[Trailhead] Salesforce外部連携 - Salesforce Connectの設定

Salesforceと外部システムの連携がわりと頻繁にニーズとして出てきたこともあり、外部連携についていろいろ試しているが、Salesforceの学習ツール：[Trailhead](https://trailhead.salesforce.com/ja)に[Salesforce Connect](https://trailhead.salesforce.com/ja/module/lightning_connect)というモジュールがあったので、やってみた。
（Lightning Connectとしてリリースされた後に、Ruby on RailsでHerokuに簡単なアプリをデプロイ後、PostgresのテーブルとSalesforceを外部オブジェクトとして連携したことがあったので、あらためて再学習を含めてやった感じ。）

本モジュールのダイジェストを備忘としてメモ。

# 1. Salesforce Connect概要
Salesforce Connectとは、Salesforce外の別システムに登録されているデータをSalesforceのオブジェクト(外部オブジェクト)として取扱い、データ表示／変更を可能とするもので、リアルタイムなデータアクセスとなっている。
外部システムからのデータコピーではなく外部データへのライブ接続となる。

## Salesforce Connect利用について
### Salesforce Connectに適した環境
- 大量のデータがあり、Salesforce 組織にコピーしたくない
- 常に少量のデータが必要である
- 最新データにリアルタイムでアクセスする必要がある
- データをクラウドまたはバックオフィスシステムに保存しているが、そのデータを Salesforce 組織で表示または処理したい

### Salesforce Connectに適さない環境
- 大量の外部データに頻繁にアクセスする必要がある
　(ETLツールの方が適している)

## 外部オブジェクトとして取り扱うことのメリット
- カスタムオブジェクトと同様にリストビュー、詳細ページ、レコードフィード、カスタムタブが利用可能
- 標準オブジェクトまたはカスタムオブジェクトとのリレーション設定可能
- 外部オブジェクトページ上でChatter利用可能(同僚とのコラボレーション)
- グローバル検索、SOSL／SOQLクエリ、Apex、Visualforce、API等で利用可能

　カスタムオブジェクトとの[機能比較](https://trailhead.salesforce.com/ja/lightning_connect/lightning_connect_introduction#lightning_connect_external_objects)はTrailhead参照。

## 外部接続の種別
外部システムに保存されているデータに接続するために、特別に設計されたいずれかのアダプタを使用

- OData 2.0または4.0 アダプタ : Microsoftなどは既に本プロトコルサポート済み
- 組織間アダプタ : 別のSalesforce組織に保存されているデータに接続
- Apexで作成されたカスタムアダプタ : ODataアダプタや組織間アダプタが適用できない場合、Apex Connector Frameworkを使用して独自のアダプタを開発


# 2. Salesforce Connectの設定
設定の詳細は[こちら](https://trailhead.salesforce.com/ja/lightning_connect/lightning_connect_setup)を参照
サンプルの外部連携データとしてHeroku上に公開データあり(OData 2.0 データソース)

## 外部データソースに接続
　1.　[設定]画面の[クイック検索/検索...]に入力して[外部データソース]へ遷移。
　2.　[新規外部データソース]ボタンをクリック。
　3.　'外部データソース'に表示名を入力し、'名前'はAPI名として英数字で入力。
　4.　'種別'に[Salesforce Connect: OData 2.0]を選択。
　5.　'URL'にHeroku上の外部接続向けデータ先のURLを入力。※本来はHerokuで設定必要(Heroku Connect)だがこのモジュールでは既に設定済みのURLあり
　6.　その他の設定はデフォルト値のままで[保存]。

## 外部オブジェクトを作成
　1.　作成済みの外部データソースの詳細画面に遷移。
　2.　[検証して同期]ボタンをクリック。
　3.　連携したいテーブルを選択し、[同期]ボタンをクリック。
　4.　上記3で外部オブジェクトとして定義が保存されているので必要に応じてカスタムタブ等を設定する。

　    　- 外部オブジェクトAPI名のサフィックスは、「\_\_c」ではなく「\_\_x」
　    　- 参照関係を作成して、外部データを既存のデータにリンク可能

## ユーザ認証を設定
本モジュールでは接続先(Heroku)への認証はないが、実際のシステム構築ではログイン情報が必要となるのが通常である。
###ID種別
- 指定ユーザ : Salesforce組織全体で外部システムの1つのログインアカウントを共有
- ユーザ : Salesforce組織で外部システムの複数のログインアカウントを使用。ユーザが外部システムの個人認証設定を指定。

###認証プロトコル
- OAuth 2.0
- パスワード認証


ということで今回はここまで。(実は初Qiita投稿）
次回はMicrosoft等とのシステム連携を実施予定。
rex0220 生年月日プラグイン

簡単に生年月日を入力できるプラグインです。

- 10年単位に移動できるので、楽に生年を表示できます。
- ラベル欄に年齢を表示します。

※サブテーブル内の日付項目は、対象外

[rex0220 stores で、販売中です。](https://rex0220.stores.jp/)


![birth01.png](https://qiita-image-store.s3.amazonaws.com/0/100572/72597cef-8530-45a0-e543-e47857025961.png)

# 生年月日入力後の年齢表示

ラベル欄に年齢を表示します。

![birth02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/76e0b1c2-728a-2deb-5e1a-69afde9486b4.png)

# 一覧画面の年齢表示

一覧画面の対象日付も年齢表示されます。

![birth03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/df357bda-e76b-7850-4693-a676f2e171f3.png)


# 一覧画面の生年月日編集

一覧画面の生年月日編集もカスタマイズしています。

![birth04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3d9117b5-846d-9e61-510f-0b43833f0602.png)

# プラグインの追加

![birth11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/4db3999a-3812-fcb0-a822-3274917eb1e4.png)

# プラグインの設定
プラグイン設定画面を開くと、日付項目が表示されますので、対象にする項目をチェックします。
設定後に、「保存する」ボタンをクリックします。

対象アプリのフォームを変更する場合は、フォーム変更を本番環境に反映後に、プラグインを再設定してください。

![birth12.png](https://qiita-image-store.s3.amazonaws.com/0/100572/552f5d59-803a-08c5-e401-9ed5c89e8ed0.png)




# 注意事項
- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- フォームを変更した場合は、プラグインを再設定してください。
node で aws-sdk を利用する


## npm での使用準備

````
$ npm i aws-sdk -S
````

## IAM の設定 - グローバル設定

`AWS`モジュールのグローバル設定は`AWS.config`プロパティでアクセス可能。

これは`AWS.Config`クラスのオブジェクトになっていて、コレを用いて認証情報を更新することが可能。

値の更新には、JSONファイル名で指定する`loadFromPath`とオブジェクトで更新する`update`が使用できる。
 
AWS.Config 
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html

オプションオブジェクトのフォーマット
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#constructor-property

## IAMの設定　- サービス単位の設定

通常、AWSのサービス利用には、各種AWS名前空間下のクラスを`new`して利用する。

```
const s3 = new AWS.S3();
```

この場合、`AWS.config`に設定されている認証情報がデフォルトで利用されるが、任意にコンストラクタのオプションを指定することで、サービス単位の認証情報を利用する事も可能

````
var ec2_regionA = new AWS.EC2({region: 'ap-southeast-2', maxRetries: 15, apiVersion: '2014-10-01'});
var ec2_regionB = new AWS.EC2({region: 'us-east-1', maxRetries: 15, apiVersion: '2014-10-01'});
````

## その他参考

各種サービスごとのリファレンス等は下記を参照


APIリファレンス

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html

APIリファレンス - S3

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

APIリファレンス - SQS

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SQS.html

APIリファレンス - SES

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html
遠隔のAndroid端末のログをリアルタイムで見たい人生だったので作ってみた。

## 結論
できた。
![log_sample.png](https://qiita-image-store.s3.amazonaws.com/0/16532/7bbd353e-b9a6-e8d6-dc35-a668138135b5.png)


## 問題
遠隔にあるAndroidにインストールされた開発中のアプリのログを見たい。
例
* 開発中のアプリを使ってた時のログを後で見たい
* GPSの取得具合を見たい
* アプリ内で定期的に実行されるタスクのログを忘れずに確認したい
* など
例に賛同できなかったとしても、僕は見たい。

## 解決案
### 解決案1
google analytics とかでできそうだけど、あれは基本ユーザーが操作したことを保存する用だと思ってる。クリックとか。

### 解決案2
deploygateのログ機能がほしいものに近い。けど、過去ログは見れない。あと、月3,000円払う経済力が無い。

### 解決案3
Fabricなどのクラッシュレポートも近い。普段クラッシュ情報だけではなくExceptionが発生したときもFabricに送ったりしている。でもそうじゃなくて、もっと日常的なログをぶわーっと見たい。

### 解決案4
coolなAndroidエンジニア集団が居るcookpadさんもログツール作ってた。[cookpad/puree-android: A log collector for Android](https://github.com/cookpad/puree-android)

使ってないんだけど、なんかちょっと設定が大変そうなのと、ログクラスを別途作ったりしなきゃいけなさそうな感じがした。ログというより、google analyticsに近い感じがした。

### 解決案５
作った。
[shikajiro/android_stackdriver_log: Android of the log is a project to be able to display in StackDriver of GCP](https://github.com/shikajiro/android_stackdriver_log)

## android_stackdriver_log
これは ログをGCMで送り、自前サーバーがその情報を受け取り、GCPのStackDriver に送るというもの。
`Android -> GCM -> android_stackdriver_log(XMPP) -> StackDriver` みたいな流れです。

### 準備する流れをざっくり
githubのreadmeに書いてますので基本はそちらを御覧ください。
1.android_stackdriver_log を docker でdeployする。（GCPでしか動作確認してません）
2.AndroidのログをGCMで送信する仕組みを作る。（きっとみんなTimberなどを使っていることを祈る）
3.StackDriverにログが流れ出てくるのを見て（・∀・）ﾆﾔﾆﾔする。

なんかあったらコメントどうぞー
windows環境でのdocker-composeのInteractive Modeが実行出来ないのが解決した

Dockerの勉強をやってたら、docker-composeでInteractive modeが使えないということで詰まったけど解決した話です。

→現状のDockerではこの問題は解決しているのでこれをやる必要はありません。

## 環境

* Windows 10 Pro 64bit
* Cmder
* なおdocker Toolboxを利用です。docker-composeは1.8.0を利用しておりました

## 問題点

docker-compose runやexecなどを行おうとすると、WindowsではInteractive modeがサポートされてないからdetachで動かしてねって返ってきます。

```
Interactive mode is not yet supported on Windows.
Please pass the -d flag when using `docker-compose run`.
```

detachモードでとりあえず動かしてたわけですが、厳しかったので以下のようなコマンドで乗り切ってました。

```
docker exec -it コンテナ名 composer install
```

調べると結構躓いた人がいるみたいです。。。私も調べてたら以下の記事にぶち当たりました。

* [Windows10 環境で Docker を使った快適な開発環境を作ろうとして諦めた話](http://qiita.com/hal_sk/items/db9ddd86f0eb5f7ee2fc)
* [windows環境でのdocker-composeによるrailsチュートリアルの補足](http://qiita.com/Seisan0044/items/b21d11716dd912506789)

## 実は次のdocker-compose バージョン1.9で解決する

実はこれ、次のバージョンの1.9で解決します。

[Attach interactively on Windows by shelling out](https://github.com/docker/compose/pull/3980)

上記がマージされた内容です。Docker for Windowsを利用している人はDOCKER_HOSTのenvを設定する必要がある模様？

## まだリリースされてないけど使いたい

~~すでに1.9.0-rc1から上記がマージされたものが利用できます。
私が見たときはrc3が最新だったので、rc3を利用します。(すでにrc4でした~~
→もうリリースされたようです。Docker ToolBox側が対応したかはまだ不明です。

* [Releases · docker/compose](https://github.com/docker/compose/releases)

1. ダウンロードは上記の1.9.0-rc3のdocker-compose-Windows-x86_64.exeを選びます。(もっと新しいバージョンが出ていたらそれを使いましょう)
2. ダウンロードし終えたら、DockerToolboxが入っている`C:\Program Files\Docker Toolbox`に移動します。
3. `docker-compose.exe`を`docker-compose.exe.old`などにリネームしておきます
4. `docker-compose-Windows-x86_64.exe`を`docker-compose.exe`にリネーム

```
$ docker-compose -v
docker-compose version 1.9.0-rc3, build c1e5515
```

これでwindowsのdocker-composeでInteractive modeが利用できるようになりますー。
やったー！

### 追記

このdocker-composeの1.9に変更をするとパスの問題が出てくるらしいので、環境変数を設定しておかないとupができなくなります。
(なおこれはDockerToolboxの場合だけみたい？releaseにも書いてますが)

```
COMPOSE_CONVERT_WINDOWS_PATHS=1
```

### 追記その２

Docker ToolBoxのほうでは、~~v1.12.4からdocker-compose v1.9に対応する模様です。まだRC版ですが・・・。待つ方は待ちましょう。~~ v.1.12.5でdocker-compose 1.9が導入されてます。これからはそのままtoolboxを入れても動くようになってるでしょう
https://github.com/docker/toolbox/releases

ではでは～
RubyのAuto_Clickが動かないときの対処

ruby2.0からdl/importはfiddle/importに変わったので書き直す

```ruby:auto_click.rb(修正前)
require 'dl/import'
```

```ruby:auto_click.rb(修正後)
require 'fiddle/import'
```
```ruby:autoclick/user32.rb(修正前)
extend DL::Importer
```

```ruby:autoclick/user32.rb(修正後)
extend Fiddle::Importer
```

他にrubyでいい感じにマウスやキーボード操作できるgem知りませんか
(gem使わずに素直にwin32api使うべきなのだろうか)
golang echoでCORSサーバーにする設定

dockerで動かしている`localhost:8080`から
echoで構えている`localhost:5000`にアクセスできなかったので共有

client側で使っているのは`whatwg-fetch`

こんなエラー

```
Fetch API cannot load http://localhost:5000/. No 'Access-Control-Allow-Origin' 
header is present on the requested resource. 
Origin 'http://localhost:8080' is therefore not allowed access. 
If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```

echoにcorsの設定を追加。とても簡単。

```go:main.go
package main

import (
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
    "github.com/labstack/echo/middleware"
)

type User struct {
    Name  string `json:"name"`
}

func main() {
    e := echo.New()

    //こいつを追加
    e.Use(middleware.CORS())

    e.GET("/", func(c echo.Context) error {
        user := User{Name: "hello world"}
        return c.JSON(http.StatusCreated, user)
    })

    e.Run(standard.New(":5000"))
}

```

これでclient側からapiに対してリクエストを送り、レスポンスを受け取れるようになった。

```js:client.js

    import 'whatwg-fetch';

    fetch('http://localhost:5000', {mode: 'cors'})
         .then(function(response) {
              return response.json();
         })
         .then(function(json) {
              console.log('parsed json', json)
         });
```

echoを作ったlabstackさんは新しくarmor(https://github.com/labstack/armor)
なるものを作ったみたい
何が進化したのか気になりますね。。
Wio Node を Arduino として使うときのメモ

[MobileHackerzのmiroさんがWio Node便利だと言っていた](http://blog.mobilehackerz.jp/2016/09/pclanwol.html)気がしたので試しに使ってみたときのメモ．

# Wio Nodeとは

[Wio Node](http://wiki.seeed.cc/Wio_Node/)はSeeed Studioの[Groveシステム](http://wiki.seeed.cc/Grove_System/)に対応したWiFiモジュールです．バッテリーの充電回路まで搭載してるのでつなぐだけで簡単にバッテリー駆動もできます(すごい)．

- 秋月 1100円 http://akizukidenshi.com/catalog/g/gM-10631/
- Amazon(スイッチサイエンス) 1231円 https://www.amazon.co.jp/dp/B01HT253O4

今回は，Wio Nodeらしい使い方はしないのでWio Node自体の説明は省きます．

Groveシステムはシリアルのコネクタにセンサなどのモジュールを接続するだけで簡単に使える便利なシリーズですが，色々なモジュールやキットが手軽に入手できるので，Groveシステムに興味がない場合も知っておいて損は無いです．

# Wio NodeをArduinoとして使う

Wio NodeのWiFiは，安価て技適通っててArduino IDEも使えることで有名なESP-WROOM-02を使っています．つまりファームウェアを書き換えればArduinoとして使えます．

## 書き込み

事前にArduinoの開発環境と，ESP-WROOM-02をArduinoとして使うための環境を整えておきます．

- Arduino IDE+ESP-WROOM-02でLチカ http://qiita.com/hnw/items/df6f62584909f426df55

まず，Wio NodeのPORT0 にシリアルでPCと接続します(TX,RX,GNDをつなぐ)．適当なコネクタが無かったので2mmピッチのピンソケットで代用しました．電源は通信用のコネクタからは取れないので別途USB等で供給する必要があります．

![wionode.jpg](https://qiita-image-store.s3.amazonaws.com/0/58515/f5426778-4cc9-8d55-df08-3c24fa8ff21f.jpeg)


FUNCボタンを押しながらリセットすることで，書き込みモードになります．以下のページを参考にしました．

- http://dev-moyashi.hatenablog.com/entry/2016/09/08/185933
- http://blog.mobilehackerz.jp/2016/09/pclanwol.html

ファームウェアはOSSとして開発されているようなので，元の状態に戻すことも可能です(試してはいません)

- https://github.com/Seeed-Studio/Wio_Link/wiki/Advanced%20User%20Guide

## IOピン等

回路図も公開されているので，どこに何が繋がってるのか確認しました．

![wionodeport.png](https://qiita-image-store.s3.amazonaws.com/0/58515/bf1c9fa9-710e-3132-1e4d-8e1d0d275738.png)

Arduinoのスケッチには以下のように書いておくと良さそうです．

```cpp
const uint8_t PORT0A = 1;
const uint8_t PORT0B = 3;
const uint8_t PORT1A = 4;
const uint8_t PORT1B = 5;
const uint8_t PORT_POWER = 15; // (common with RED_LED)

const uint8_t FUNC_BTN = 0;
const uint8_t BLUE_LED = 2;
const uint8_t RED_LED = PORT_POWER;

const uint8_t UART_TX = PORT0A;
const uint8_t UART_RX = PORT0B;
const uint8_t I2C_SDA = PORT1A;
const uint8_t I2C_SCL = PORT1B;
```

- 自由に使えるGPIOは4本(IO1,3,4,5)
- ※PORT_POWER(IO15) を HIGH にしないと，Groveコネクタのポートに電源3.3Vが供給されない(消費電力が気になる場合はON/OFFしろってことなのだと思う)
- 赤色のLEDはPORT_POWERにつながってるので，コネクタに電力供給が必要な場合は単体でON/OFFはできない(ちなみに緑色のLEDは電源の状態を表しているので制御できない)
- I2C も Wireライブラリで簡単に使える

たとえば，Wio Node の PORT0 を UART， PORT1 を I2C として使う場合のsetup関数は以下のようになります．

```cpp
#include <Wire.h>
void setup() {
  pinMode(FUNC_BTN, INPUT);
  pinMode(BLUE_LED, OUTPUT);
  pinMode(PORT_POWER, OUTPUT);
  digitalWrite(PORT_POWER, HIGH);
  Serial.begin(115200);
  Wire.begin(I2C_SDA,I2C_SCL);
  // ...
}
```

## 色々

HDC1000(I2Cでつながる温度・湿度センサー) を使って温度と湿度を定期的にサーバに送信するようにしたりしました．
(BME280を使えばArduinoとして使わなくても標準で対応してたのは後から気づきましたが．．．)

- HDC1000 http://akizukidenshi.com/catalog/g/gM-08775/
- BME280 http://akizukidenshi.com/catalog/g/gK-09421/

Wio Nodeは外に出ているIOピンが少ないのでちょっと物足りない気もしましたが，コンパクトで電源周りの回路もついてて楽なので，次からは積極的にこちらを使おうと思いました．