OmniAICreator/Qiita-1.07M huggingface dataset:
スパースモデリング：2.3 グラスマン行列の構築

Michael Elad著、玉木徹訳のスパースモデリングの第2章3節のグラスマン行列の構築をPythonでやってみました。

スパースモデリングでは
$$(P_0): \min_x ||\mathbf{x}||_0 \, \rm{subject \, to} \, \mathbf{b}=\mathbf{Ax}$$
という問題を解きます。$\mathbf{A}$は$n×m$の行列$(m>n)$とします。

ここで$\mathbf{A}$が直交行列に近い程($\mathbf{A}^T\mathbf{A}$が$\mathbf{I}$に近い程）$P_0$の解を得ることが容易になります。

$\mathbf{A}$は正方行列ではないので$\mathbf{A}^T\mathbf{A}$の非対角要素が全て0になることはなく、その下限は

$$\mu(\mathbf{A}) \geq \sqrt{\frac{m-n}{n(m-1)}}$$

となります。この$\mu(\mathbf{A})$を行列$\mathbf{A}$の__相互コヒーレンス__と呼びます。

何らかのアルゴリズムで$P_0$の解の候補$\mathbf{x}$を求めたときに$\mathbf{x}$が

$$ ||\mathbf{x}||_0 < \frac{1}{2}(1+\frac{1}{\mu(\mathbf{A})})$$

の条件を満たす場合、$\mathbf{x}$が$\mathbf{b}=\mathbf{Ax}$の制約の元で最もスパースな唯一の解であると言うことが出来ます（定理2.5）。つまり何らかの近似的なアルゴリズムで$\mathbf{b}=\mathbf{Ax}$を満たすスパースな$\mathbf{x}$を探していた場合に$\mu(\mathbf{A})$の値が小さい程、緩い基準で答えが見つかりやすいと言うことが出来ます。

と言う訳で$\mathbf{A}$の相互コヒーレンスが低い程うれしい訳ですが、

$$\mu(\mathbf{A}) = \sqrt{\frac{m-n}{n(m-1)}}$$

と相互コヒーレンスが下限に一致するような行列をグラスマン行列と言います。グラスマン行列は出来るだけ直交行列に近い$n×m$行列であると言うことが出来ます。

このようなグラスマン行列が構築できると$P_0$問題を解くのに何かと便利そうだなと言う気がする訳ですがスパースモデリングの「2.3 グラスマン行列の構築」に数値的にグラスマン行列を計算するMATLABコードが載っていたので、それをPythonに移植してみました（前置きが長い）。

アルゴリズム自体はグラム行列$\mathbf{G}=\mathbf{A}^T\mathbf{A}$の大きい値をシュリンクした後、SVD変換して行列のランクがNになるように処理する、を反復すると非対角成分の値が下限に近いグラム行列$\mathbf{G}$が得られ、最後にまたSVD変換で反復処理したグラム行列$\mathbf{G}$からグラスマン行列となった$\hat{\mathbf{A}}$を得るというものです。

グラスマン行列を構築するPythonコードは以下のGithubのipynbを参照。
https://github.com/kibo35/sparse-modeling/blob/master/ch02.ipynb

最後にグラスマン行列になった$\hat{\mathbf{A}}$を得る所は怪しいですがグラム行列への処理は教科書と同じ結果が得られていると思います。

![Grassmannian.png](https://qiita-image-store.s3.amazonaws.com/0/114365/b868e6ed-cb0c-5d44-b8dd-2a9103eb426a.png)

左上は正規分布で与えた冗長なシステム行列$\mathbf{A}$(50行×100列)のグラム行列$\mathbf{G}=\mathbf{A}^T\mathbf{A}$になります。右上は10000反復後のグラム行列になります。

下段の絶対値をとった画像を見ると非対角成分の値が一様になっていることがわかります。

![CoherenceIteration.png](https://qiita-image-store.s3.amazonaws.com/0/114365/44a9d47c-af24-214a-ae56-57f8aff5de1f.png)

上の図は各反復におけるグラム行列の非対角成分の値をプロットしたものです。

とにかくスパースモデリングの第2章からわかることは、冗長なシステム行列$\mathbf{A}$の相互コヒーレンス$\mu(\mathbf{A})$（グラム行列の非対角成分の絶対値の最大値）の値がわかっており、その値から求まるある閾値より$L_0$ノルムが小さい解$\mathbf{x}$を見つけることが出来れば、それが一意な解と言うことが出来るので、がんばって$P_0$問題を解いてみようということです。
GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016

ちょろっと書いたGAE/Goアプリで、チェック等のために本番環境のDatastoreをローカルにコピって来たい時がある。探すとbulkloaderなどの情報がちらほらと手に入るのだが、どうも古いし断片的。ということで、2016年版をまとめてみた。

# 前提

* GAE/Go環境でアプリが動かせていること

# 準備

準備はここに書いてある：<https://cloud.google.com/appengine/docs/go/tools/remoteapi/>

## app.yamlでremote_apiを有効にする

    - url: /_ah/remote_api
      script: _go_app

## アプリケーション側でremote_apiをハンドリングする

と言ってもパッケージをインポートするだけ

    import _ "google.golang.org/appengine/remote_api"

## デプロイする

    goapp deploy


# データのダウンロード

appcfg.pyでdownload_dataを使う。

    appcfg.py download_data --application="app-id" --url="https://app-id.appspot.com/_ah/remote_api" --filename=dump.datastore

# ローカル環境へのアップロード

## ローカル環境を起動しておく

    goapp serve

ちなみに今のローカルdatastoreの中を消すには-clear_datastoreオプションをつけよう。

    INFO     2016-08-28 08:56:42,616 devappserver2.py:769] Skipping SDK update check.
    INFO     2016-08-28 08:56:42,661 api_server.py:205] Starting API server at: http://localhost:64056
    INFO     2016-08-28 08:56:42,665 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-08-28 08:56:42,669 admin_server.py:116] Starting admin server at: http://localhost:8000

## 別ターミナルでupload_dataする

ローカルサーバ起動時のログで、APIサーバが何かしらのポート番号で起動しているはず（```Starting API server at: http://localhost:64056```）。これを使うと良いらしい。また、指定するアプリケーション名が "dev~*" になっていることにも注意する。

    appcfg.py upload_data --application="dev~app-id" --url="http://localhost:64056" --filename=dump.datastore

無事アップロードできました！

# access_token is expired. と言われはじめたら

これはローカル環境に持ってくる時だけの話ではないのだけれど、アクセストークンの期限切れを指摘される時がある。再取得したいのだが、いまいち正式なやり方がわからない。トークンはホームディレクトリ下に隠しファイルで存在しているので、 ```rm ~/.appcfg_oauth2_tokens``` してから実行するとトークンが新しくなる。
node.js + expressでPOSTを受け取る & POSTパラメータをJSONで取得する

# バージョン
- node.js: **v6.2.2**
- express: **4.14.0**
- body-parser: **1.15.2**

# expressでPOSTを受け取る
### app.js側を用意する

```app.js
const express = require('express');

const app = express();

app.listen(3000);
console.log('Server is online.');

app.post('/', function(req, res) {
    res.send('POST is sended.');
})
```

### curlでたたく

```
$ curl -X POST http://localhost:3000
```

# POSTパラメータをJSONで取得する
### app.js側を用意する
POSTパラメータをJSONで取得するには`body-parser`を使う。

```app.js
const express = require('express');
const bodyParser = require('body-parser');

const app = express();

// urlencodedとjsonは別々に初期化する
app.use(bodyParser.urlencoded({
	extended: true
}));
app.use(bodyParser.json());

app.listen(3000);
console.log('Server is online.');

app.post('/', function(req, res) {
	// リクエストボディを出力
	console.log(req.body);
	// パラメータ名、nameを出力
	console.log(req.body.name);

	res.send('POST request to the homepage');
})
```

### curlで叩く

HTTPHeaderで`application/json`を受け付けるように記述。
`-d`オプションでパラメータを追加。

```
$ curl -X POST http://localhost:3000 -H "Accept: application/json" -H "Content-type: application/json" -d '{ "name" : "tanaka" }'
```

### 出力結果
```
Server is online.
{ name: 'tanaka' }
tanaka
```

# 参考
- [node\.js \- bodyParser is deprecated express 4 \- Stack Overflow](http://stackoverflow.com/questions/24330014/bodyparser-is-deprecated-express-4)
Sublime Text Keyboard Shortcut


## Code
|Key|Description|
|:---|---|
|`⌘ K`, `⌘ B`|サイドバーを表示非表示トグルする|
|`⌘ C`|何も選択していないと現在行をコピーする|
|`⌘ D`|現在選択している文字列を検索する|
|`⌘ L`|現在カーソルのある行を選択する|
|`⇧ ⌘ D`|カーソル位置の行をコピーしてすぐ下に貼り付ける|
|`⌃ ⇧ K`|行を削除する|


## Macの特殊記号一覧
http://penguinlab.jp/blog/post/2035
⌘
⇧
⌥
⌃
⌫
⌦
⏎
↩
⎋
⇪
↑↓←→
Windowsのコマンド忘れてて使いづらかったのでMacやLinuxのコマンドぽく使えるようにしてみた


私は普段Macで開発しているのですが、
Macが壊れてSurface(Windows10)にNodeJS入れたのですが
ターミナルで叩いてたコマンドがコマンドプロンプトでことごとく使えなくて~~(久しぶりすぎて忘れてた)~~
イラッとしたので基本的なコマンドはマクロ作成してMacぽくしました。
Windowsつらい・・・
（ぁ、でもEdgeのWebノート機能はMacにはなくてイケてると思います。）

# コマンド代用バッチ
最低限これくらいほしいよねってことでマクロ作成しました。
あくまでそれっぽいってだけでそもそも違うので完全に代用は無理です。

* ファイル操作(cd,ls,pwd,cat,touch,mkdir,mv,cp,rm)
* ネットワーク(ifconfig)
* プロセス制御（open,ps,kill）

```init.bat
chcp 65001
doskey alias=if "$1"=="" (doskey /macros) else (doskey $*)
doskey unalias=doskey $*=
doskey h=doskey /history $*
doskey history=doskey /history $*
doskey ls=dir /w $*
doskey pwd=echo %CD%
doskey ll=dir /ad $*
doskey lv=more /E $*
doskey cat=type $*
doskey cp=if exist $*\nul (echo d $b xcopy /E $*) else (copy $*) 
doskey mv=move $*
doskey touch=type nul $g $*
doskey rm=if exist $*\nul (rd /s /q $*) else (del /q $*)
doskey ifconfig=ipconfig
doskey open=start
doskey ps=tasklist $*
doskey kill=Taskkill /PID $* /F
```

cd,mkdirはそのまま使えるので作る必要なし
sshはTeraTermとかソフトウェア使ったほうがよさげ

## 初期設定
regedit（レジストリ）のHKEY_LOCAL_MACHINEにAutoRunとして上記init.batのパスを設定するとコマンドプロンプトを開いたタイミングでinit.bat内のdoskeyが適用されます。

ここ参考：
http://qiita.com/yufu/items/86a455f948a3e1c0ef97

## 解説

コマンドプロンプトのdoskeyコマンドはalias的な感じでコマンドのマクロを登録ができます。

文字化けを防ぐための設定

```
chcp 65001
```

ディレクトリかの判定

```
if exist $*\nul
```

\$gは特殊文字>に該当、ファイル出力
\$bは特殊文字&に該当、複数コマンド実行

### 補足
~でホームディレクトリパスなんてないので環境変数%USERPOROFILE%にホームディレクトリのパスが入ってます。
なのでホームディレクトリ移動は下記コマンド

```
cd %USERPROFILE%
```

あとよくハマるのが
WindowsのパスはMacやLinuxのように/スラッシュでなく、\バックスラッシュ

結果の絞り込みは
grepなんて便利ものはないのでfindもしくはfindstrを使います。

```
history | find 'ls'
```


# おまけ1:エクスプローラをタブ化する
下記のソフトウェアでできます。
ウィンドウ増やしたくない
[QTTabBar](http://qttabbar-ja.wikidot.com/)

# おまけ2:コマンドプロンプトをタブ化する
下記のソフトウェアでできます。
やっぱりNodeJSのプロセスとか立ち上げてると複数開きたいですよね。
[ConEmu](https://conemu.github.io/)

# おまけ3：ウィンドウ半透明化
下記のソフトウェアでできます。
エディタとかのウィンドウを半透明化できます。
[なんでもすけ](http://www.vector.co.jp/soft/winnt/util/se399376.html)

# 結論
完全代用とかなると
PowerShellやexe作って呼び出すんだろうな・・・
手間の割が合わないので必要に駆られない限りやりませんが・・・
Bash on WindowsとかGit for Windows(MSYS2)とか
あるのですが、結局エミュレータでエミュレータ外のパスの操作とか
コマンド自体が微妙に対応しきれてなかったり中途半端な感じがするので
やっぱりMacが一番開発しやすい
（なんか良い手があったら教えてください）
vimrcメモ

# vimrcメモ

私が使っているvimrcで普段からお世話になっているオススメの設定を晒します。
※あくまでvim標準の機能に絞っています。
※新しい発見があれば随時更新していきます。

## タブ機能の設定

vimに標準でタブ機能があるのをご存知でしょうか。
複数ファイルを編集するとき瞬時に切り替えられて便利なのでオススメです。
バッファ間の切り替えや、ウィンドウ分割によっても対応できますが、
編集ファイル数が多い場合はタブ機能を併用すると良いです。
もちろんコマンドでも操作できますが、私はよく使う機能をキーに割り当てて使用しています。
下記設定による割り当ては次の通りです。

+ tc：新しいタブを作成する
+ tx：開いているタブを閉じる
+ tn：次のタブに移る
+ tp：前のタブに移る
+ t\<number>：\<number>で指定した数字に該当するタブへ移動する
  - ex) t1：1番左のタブへ移動、t2：左から2番目のタブへ移動

```vim
" The prefix key.
nnoremap    [Tag]   <Nop>
nmap    t [Tag]
" Tab jump
for n in range(1, 9)
  execute 'nnoremap <silent> [Tag]'.n  ':<C-u>tabnext'.n.'<CR>'
endfor

map <silent> [Tag]c :tablast <bar> tabnew<CR>
map <silent> [Tag]x :tabclose<CR>
map <silent> [Tag]n :tabnext<CR>
map <silent> [Tag]p :tabprevious<CR>
```

## ハイライトのオフ

ハイライトをオンにしていると検索時に該当文字列がハイライトされます。
検索ワードの場所が分かりやすくて良いものの、ずっとハイライトされていては
チカチカして目によくありません。
そこでオススメは、\<C-l>にハイライトオフの設定を含めることです。
※もともと\<C-l>には画面をリフレッシュする機能があり、その機能に追加する形です

```vim
nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>
```

## 増分検索

スラッシュ(/)で検索するとき、文字を入力する度に検索を実行します。
特に正規表現を使って検索する際、構文が意図した動きをするか逐次確認できるので便利です。

```vim
:set incsearch
```

ちなみにvimの正規表現は少し特殊ですが、以下のように冒頭に"\v"を追加して、
「very magic モード」にすれば、perlなどで使い慣れたいつもの正規表現を（ほぼ）利用できます。

```vim
/\v^テスト
```

## ペーストモードの切り替え

自動インデントを設定していると、外部からコピーしたソースコードなどをvimに貼り付ける際、
勝手にインデントが入って困ることがあります。
そんな時は以下のように、ペーストモードに切り替えると上手く貼り付けられます。

```vim
:set paste
```

いちいちコマンドを打つのが面倒なので、私は下記のようにモード切替をキーに割り当てています。

```vim
set pastetoggle=<f5>
```

## emacsキーバインドの設定

編集中はemacsキーバインドが使えると色々捗るため、
以下のようにキーバインドを設定しています。

```vim
imap <C-e> <END>   " 行末に移動
imap <C-a> <HOME>  " 行頭に移動
imap <C-f> <Right> " 右に移動
imap <C-b> <Left>  " 左に移動
```

## バックアップファイル設定

vimを使っているとswapファイルなどのバックアップファイルが生成されます。
私はバックアップファイルをほとんど使わない、というか使ったことがなく、
ただ邪魔なだけなので下記のように設定をオフにしています。
※Gitなどで管理していれば問題ないと思ってます。

```vim
set noswapfile
set noundofile
set nobackup
```
メソッド宣言 Javaの問題をTypeScriptにしてみる6-1

6-1.メソッド宣言の記述として正しいものを選びなさい。

A.Void sample(){}
B.void sample(){return "sample";}
C.sample(){}
D.int sample(){return "sample";}
E.void sample(){}

答え：E

これをTypeScriptにします。
A.function sample():Void{}
B.function sample():void{return "sample";}
C.function sample(){}
D.function sample():number{return "sample";}
E.function sample():void{}

typescriptでも正解はEですが、コンパイルはCでも通ります。
Cは戻り値を書かないJavaScriptでは問題なく実行できるためコンパイルが通ってしまいます。
Typescriptはクロスコンパイラでjsにコンパイルして使われることを想定しているため、jsと互換性をもたせているからです。
FuelPHPのPHPUnitテスト時に、ファイルを指定するとエラーが発生する場合の対処方法

# 発生するエラー

FuelPHPのユニットテストで --file オプションをつけると、以下のようなFatal errorが発生する。
(php oil test 実行時には Fatal error は発生しない)

もちろん、`fuel/core/classes/cli.php` の中で `class Cli{}` は定義されている。

```
$ php oil test --file=./fuel/app/tests/utils_test.php                                                                                                         

Tests Running...This may take a few moments.
PHPUnit 3.7.38 by Sebastian Bergmann.

Configuration read from /PATH/TO/PROJECT/fuel/app/phpunit.xml

.F

Time: 268 ms, Memory: 10.50MB

There was 1 failure:

1) utils_Test::test_HOGEHOGE
Failed asserting that false matches expected true.

/PATH/TO/PROJECT/fuel/app/tests/utils_test.php:29

FAILURES!
Tests: 2, Assertions: 3, Failures: 1.

Fatal error: Uncaught exception 'Exception' with message 'File "COREPATH/classes/cli.php" does not contain class "Fuel\Core\Cli"' in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php:397
Stack trace:
#0 /PATH/TO/PROJECT/fuel/core/classes/autoloader.php(236): Fuel\Core\Autoloader::init_class('Fuel\\Core\\Cli', '/Users/XXXX/Do...')
#1 [internal function]: Fuel\Core\Autoloader::load('Fuel\\Core\\Cli')
#2 [internal function]: spl_autoload_call('Fuel\\Core\\Cli')
#3 /PATH/TO/PROJECT/fuel/core/classes/autoloader.php(247): class_alias('Fuel\\Core\\Cli', 'Cli')
#4 [internal function]: Fuel\Core\Autoloader::load('Cli')
#5 /PATH/TO/PROJECT/fuel/core/bootstrap.php(62): spl_autoload_call('Cli')
#6 [internal function]: PHPUnit_Util_Fileloader::{closure}()
#7 {main}
  thrown in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php on line 397

```


# 対処方法

ユニットテスト起動時に、ダミーとして ```$tmp = new cli()```を実行することで回避できる。

そのためには、以下の2点の変更点が必要。

1. phpunit実行時のbootstrapファイルを変更
1. bootstrap時に上記ダミーを実行


## phpunit実行時のbootstrapファイルを変更

基本のbootstrapファイルをカスタマイズ用にコピー

```
$ cp -p fuel/core/bootstrap_phpunit.php fuel/app
```


```fuel/app/phpunit.xml
-<phpunit colors="true" stopOnFailure="false" bootstrap="../core/bootstrap_phpunit.php" backupGlobals="false">
+<phpunit colors="true" stopOnFailure="false" bootstrap="bootstrap_phpunit.php" backupGlobals="false">
```

## bootstrap時にダミーを実行

```fuel/app/bootstrap_phpunit.php

(略)

$tmp = new cli();
$tmp = new Crypt();
```


# Appendix

```$tmp = new Crypt();``` も追加する理由。

```new cli();``` だけだと、以下のようなエラーが発生するため。

```
Error: File "COREPATH/classes/crypt.php" does not contain class "Fuel\Core\Crypt" in /PATH/TO/PROJECT/fuel/core/classes/autoloader.php on 397
```
Golangでディレクトリ内のファイル一覧を入手する

指定したディレクトリ配下にあるファイル一覧をスライスで返す。
サブディレクトリがあれば再帰で掘っていく。

```go:main.go
package main

import (
	"fmt"
	"io/ioutil"
	"path/filepath"
)

func main() {
	fmt.Println(dirwalk("./test"))
}

func dirwalk(dir string) []string {
	files, err := ioutil.ReadDir(dir)
	if err != nil {
		panic(err)
	}

	var paths []string
	for _, file := range files {
		if file.IsDir() {
			paths = append(paths, dirwalk(filepath.Join(dir, file.Name()))...)
			continue
		}
		paths = append(paths, filepath.Join(dir, file.Name()))
	}

	return paths
}
```

```bash
$ ls
main.go	test

$ tree test
test
├── file
├── test1
│   ├── file1-1
│   └── file1-2
└── test2
    ├── file2-1
    └── file2-2

2 directories, 5 files

$ go run main.go
[test/file test/test1/file1-1 test/test1/file1-2 test/test2/file2-1 test/test2/file2-2]
```
暗号技術　その２

#メッセージ認証コード
なりすましと改ざんの検知
message authentication codeの頭文字を取ってMACと呼ばれる

メッセージと共有鍵を元にして、固定ビット長の出力(MAC値)を計算する関数
メッセージ認証コードは鍵に依存したハッシュ関数である

再生攻撃やブルートフォース、誕生日攻撃に弱い

第三者に対する証明や否認防止性がない

#デジタル署名
公開鍵暗号方式を逆に使うことでメッセージに署名する

メッセージを暗号化すると時間がかかるのでハッシュ値を暗号化する

書き換えの防止はできないが検知はできる
機密性は守れない
man-in-the-middle攻撃に弱い

#公開鍵基盤
###証明書
公開鍵がその人のものだと証明する
認証局に自分の公開鍵に署名をしてもらう
自分の秘密鍵を紛失、盗難した場合、認証局に連絡し証明書破棄リスト(CRL)に登録してもらう

#乱数
無作為性、予測不可能性、再現不可能性のすべてを持つものが真の乱数
プログラム上でワンタイムパスワードなどを使用する際、通常の擬似乱数生成関数を使用すると予測される可能性があるため暗号論的擬似乱数生成器を使用する

#PGP
デジタル署名と暗号化の組み合わせ

#SSL/TLS
HTTPの下に来るプロトコル

#まとめやら
一番の脆弱性は人間
防御は完全でならないが、攻撃は一点でいい
秘密の暗号アルゴリズムを使わない
弱い暗号化をするなら暗号化しない方が安全
Coursera Machine Learning ex6 の error対処法 (octave)

CourseraのMachine Learning講義のweek7のプログラミング課題において、

```
error: get: unknown hggroup property Color
error: called from:
error:   /usr/local/octave/3.8.0/share/octave/3.8.0/m/plot/draw/private/__contour__.m at line 201, column 5
error:   /usr/local/octave/3.8.0/share/octave/3.8.0/m/plot/draw/contour.m at line 73, column 16
error:   /Users/***/machine-learning-ex6/ex6/visualizeBoundary.m at line 21, column 1
error:   /Users/***/machine-learning-ex6/ex6/ex6.m at line 109, column 1
```

といった様なエラーが頻発しているようです。
ここで、`visualizeBoundary.m` 内の

`contour(X1, X2, vals, [0 0], 'Color', 'b');`
を
`contour(X1, X2, vals, [0 0], 'linecolor', 'blue');`
とすれば解決するという[記事](http://blog.livedoor.jp/kmiwa_project/archives/1034089224.html)を見つけましたが、私の環境では解決しませんでした。

私の環境では同じ行を
`contour(X1, X2, vals, [1 1], 'LineColor', 'b');`
とすることで解決したのでここに記しておきます。
※[0 0]ではなく[1 1]です。
Unity で使える C# と .NET Framework のバージョンとその調べ方

気になったので、ちょっと調べてみました。

# 調査環境
* Unity 5.4.0f3 personal
* Visual Studio Tool for Unity 2.3.0.0

# 調査結果
上記の調査環境で調べた結果は以下のとおりです。

|名前|バージョン|
|---|---|
|C#|4.0|
|.NET Framework|3.5|

# 調べ方
今後のバージョンアップでこの結果が変わる可能性もあるので、今回調べた方法を載せておきます。

## C# のバージョンについて
試しに、C# 6.0 で導入された nameof 演算子を使うコードを書いてみます。

```csharp
nameof(typeof(MonoBehaviour));
```

すると、Visual Studio のエラー一覧に以下のようなエラーが表示されます。

```
エラー	CS8025	機能 'nameof 演算子' は C# 4 では使用できません。6 以上の言語バージョンを使用してください。
```
この結果から、**使用できる C# のバージョンは 4.0** であることがわかります。

## .NET Framework のバージョンについて
巷では .NET Framework 3.5 という情報が流れていたので、まずは 4.0 未満かどうかを調べます。

試しに、.NET Framework 4.0 で追加されたという、HasFlag を使用するコードを書いてみます。

```csharp
[Flags]
public enum TestFlags
{
    Value1 = 0x0001,
    Value2 = 0x0002,
    Value3 = 0x0004,
};

public class TestClass
{
    void TestFunc()
    {
        TestFlags Flags = TestFlags.Value1;
        Flags.HasFlag(TestFlags.Value1);
    }
};
```

すると、Visual Studio のエラー一覧に以下のようなエラーが表示されます。

```:
エラー	CS1061	'TestFlags' に 'HasFlag' の定義が含まれておらず、型 'TestFlags' の最初の引数を受け付ける拡張メソッド 'HasFlag' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。
```

この結果から、**.NET Framework は 4.0 未満**であることがわかります。

4.0 未満であることがわかったので、次は 3.5 であるかどうかを調べます。

3.5 ではクラス System.Collections.Generic.HashSet&lt;T&gt; が追加されているので、これを使ったコードを書いてみます。

```:
public class TestClass
{
    void TestFunc()
    {
        System.Collections.Generic.HashSet<int> v = new System.Collections.Generic.HashSet<int>();
        v.Add(10);
        v.Add(100);
    }
};
```

すると、今度はエラーが表示されずにビルドが通ります。

この結果から、**.NET Framework のバージョンは 3.5** であることがわかります。

# 最後に

わざわざこんなことするのも面倒なので、ひと目でバージョンがわかるようになってなってるとありがたいんですが……。
Github の contribution のグラフを立体的に表示させる

[isometric-contributions](https://github.com/jasonlong/isometric-contributions)

これ面白いですね笑

GiuHub のプロフィールページに以下のような Contribution 数を表示したグラフがあると思いますが、

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/262b3e69-ac63-0b1d-e1c2-2b2728801d59.png)

[isometric-contributions](https://github.com/jasonlong/isometric-contributions) を入れると

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/a15517b5-c75a-f176-33b1-472989eb1b66.png)

こう表示されます笑
わかりやすい！

Firefox, Safari 用の Extension もあるようなので、是非使ってみてください！

その他にも GitHub を拡張する Extension を紹介しているので、こちらは（本当に）便利なので入れてみてください。

[Gemfile や package.json に書かれたライブラリの Github ページに飛べるようにする Extension](http://qiita.com/pekepek/items/777ad1c0b677b1d971a6)
Ruby: カタカナをひらがなに、英数字は半角に変換する方法

[Moji](http://gimite.net/gimite/rubymess/moji.html)というGemを使って

* 全角英数字は半角英数字に変換
* カタカナはひらがなに変換
* 半角カタカナはひらがなに変換

といったことを行う方法です。

インストールは、`gem install moji`を実行してください。

使いかた:

```rb
Moji.kata_to_hira(Moji.han_to_zen(Moji.zen_to_han(value, Moji::ALNUM), Moji::KATA)) 
```

実行結果:

```
[39] pry(main)> value = 'halfＦｕｌｌ123１２３ひらがなｶﾀｶﾅﾀﾞカタカナダ'
=> "halfＦｕｌｌ123１２３ひらがなｶﾀｶﾅﾀﾞカタカナダ"
[40] pry(main)> Moji.kata_to_hira(Moji.han_to_zen(Moji.zen_to_han(value, Moji::ALNUM), Moji::KATA))
=> "halfFull123123ひらがなかたかなだかたかなだ"
```
テスト支援ツール「chibineko」をDockerで動かしたい

わからないなりにDockerイメージとして固めてみたものを公開しています。
https://hub.docker.com/r/kuluna/chibineko/
DockerfileもBitBucketで公開しています。
https://bitbucket.org/kuluna/docker-chibineko

# chibinekoとは？
[ノンプログラマーが3ヶ月でWebサービスを作ってみた](http://qiita.com/tabbyz/items/6513e84f319843c316d5)で公開されているテスト支援ツールです。chibinekoいいですよね！

# はじめに
このchibinekoをもっと簡単にオンプレ導入できたらなと思い今回Dockerで実行できるようにしてみました。ちなみに私のスキルですが、

* C# / Java大好き
* Dockerは最近覚えたてで、 `docker pull` なら得意(ﾄﾞﾔｧ)
* Ruby?Rails? あぁ、Redmineのプラグイン入れるときに非常に苦労するアレね・・・

といったスキルセットです。RubyやRailsを書いたことはないけど、bundleとかrakeとかいうコマンドを叩くといいんだという程度です。

# Dockerfile
まずは私の書いたDockerfileです。

```Dockerfile
FROM ruby:2.3.0
MAINTAINER kuluna

# Download chibineko
RUN git clone https://github.com/tabbyz/chibineko.git /opt/chibineko

# Setup
WORKDIR /opt/chibineko
RUN mv config/mailer.yml.example config/mailer.yml
RUN bundle install
RUN rake db:migrate
RUN rake db:seed

# Port
EXPOSE 3000
# Volume
VOLUME /opt/chibineko/db

# Start server
CMD rm -f /chibineko/tmp/pids/server.pid;rails server -b 0.0.0.0
```

## FROM
FROMはベースとなるDockerのイメージです。chibinekoのソースを見たところrubyで書かれていたので、ここでは初めからrubyの環境が揃っているイメージを利用しています。
rubyのバージョンを2.3.0と指定していますが、これはchibinekoソース内の`Gemfile`を見たところ`ruby '2.3.0'`と書かれていたのでそのバージョンに合わせました。

## MAINTAINER
Dockerfileを管理している人の名前を入力するのがDockerfileを書く上でのマナーのようです。(実行には影響ありません)

## RUN
RUNは続く文字列をコマンドとして実行してくれます。ここではgit cloneでchibinekoのソースをダウンロードしています。

## WORKDIR
ダウンロードしたソースのルートディレクトリに移動しています。
`RUN cd /opt/chibineko`だとその時はcdしてくれるのですが、次のRUNでまた元に戻ってしまうようです。cdではなくWORKDIRを使うところはハマりやすそうな気がします。

## 怒涛のRUNコマンド
このあたりはchibinekoの`README.md`にあったコマンドを順次実行している感じです。
`rake db:migrate RAILS_ENV=production`とやるとエラーが出てしまいました。よくわからんのでつけずに実行しています。

## EXPOSE
開放する(?)ポート番号を指定しています。これを指定するとPCとDocker内のイメージで指定したポート番号と通信することができるようになるようです。Railsサーバーを起動したときに3000番でWebサーバーが立ち上がりましたので3000番を書いています。

## VOLUME
いまいちよくわかっていないDocker volumeです。イメージとしては指定したディレクトリをPCがマウントできるようにする感じでしょうか。
Dockerイメージが壊れたりバージョンアップをしたときにイメージ内にデータを残すやり方にしているとその時に一緒にデータも葬り去ってしまうので、このように書くとデータを退避できるという使い方をするようです。

chibinekoソース内の`config/database.yml`にsqliteの保存先が書かれてたのでそのディレクトリをVOLUMEとして指定しています。__この使い方であってるんでしょうか・・・？__

#CMD
Dockerイメージが起動できたときに自動的に実行してくれるようです。`rails server -b 0.0.0.0`でサーバーを起動させています。
その前に`server.pid`を削除していますが、これはdocker stop -> docker startとしたときにこのファイルがあるためrails serverができなかったということがありました。なので先にファイルを消す処理をしています。

# 実行
このDockerfileをローカルでビルドし、実行することでchibinekoが起動します。

```
docker build -t kuluna/chibineko:latest {Dockerfileのあるディレクトリ}
docker run -d -p 3000:3000 kuluna/chibineko
```

一応stopしたりもう一度startしてもデータが永続化していたところまでは確認しました。

# さいごに
わかんないことなりに調べて3時間ぐらいでDockerfileができあがりました。
もちろんchibineko自身が少ないコマンド数で実行できるようになっているのが素晴らしいのですが！
Dockerfileの書き方が間違ってたり、こうしたほうがいいというのありましたら連絡いただけると助かります。
__dirnameを使ったらeslintに怒られたのでpathで書き直す

webpack.config.bable.jsのentryやらで__dirnameを使っていたらeslintに「pathを使え！」と怒られたのでpathを使って書き直す。

もともとは

```js
__dirname + '/src'
```

みたいな感じで書いていたのを下記に書き換えた。

```js
path.resolve(path.join('src')),
```

**追記**
コメントで指摘を受けたので下記に修正しました！

```js
path.join(__dirname, 'src')
```
UIViewのアニメーション


UIViewの中にsubviewとして登録したUIImageViewを動かしてみるサンプルです。位置(x,y)、傾き(angle)、サイズ(scale)を適当に乱数で指定して、もとのサイズと行ったり来たりする動きをします。

```
let x = CGFloat(random() % 200)
let y = CGFloat(random() % 200)
        
imageView = UIImageView()
imageView.frame = CGRectMake(x, y, image.size.width,image.size.height)
self.view.addSubview(imageView)
        
let angle = CGFloat(random() % 30) / 100.0
let scale = CGFloat(random() % 20) / 100 + 1
imageView.center = CGPointMake(imageView.frame.origin.x + imageView.frame.size.width / 2,imageView.frame.origin.y + imageView.frame.size.height / 2)
imageView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, -angle)
```

animateWithDurationでアニメーションを登録します。

```
let opts:UIViewAnimationOptions = [.Repeat,.Autoreverse]
UIView.animateWithDuration(1.0, delay: 1.0, options: opts,
  animations: {
  let t1 = CGAffineTransformRotate(self.imageView.transform, angle*2)
  let t2 = CGAffineTransformScale(t1, scale, scale)
self.imageView.transform = t2
  }, completion: { (b) in })
```

アニメーションを止める方法が分かりません。とりあえず強引にビューを消してから、再度（止まった状態で）置き直すという実装をしています。

```
imageView.removeFromSuperview()
```
gulpでProtractor(Selenium+Jasmine)を動かす

ProtractorはAngularJSのためのE2E(End To End)テストのフレームワークです。
AngularJSのための、といっても中身はSelenium(ブラウザの自動操作ツール)とJasmine(javascript用のテストフレームワーク)なので、普通にWebシステムのE2Eテストとして使うことができます。
今回は、Protractorのインストールからgulpで実行するまでについてまとめます。

#インストール
npm(node.js)とgulpは入っている前提で。
Protractorはnpmからインストールし、webdriver-managerのupdateを実行します。
`npm install protractor`
`node node_modules/protractor/bin/webdriver-manager update`

#Protractor単体で動かす
##Seleniumサーバの起動
まずは、gulpを使わずにProtractor単体で動かしてみます。
Seleniumを動かすためにSeleniumサーバを起動します。
`webdriver-manager start`
正常に起動すれば、4444ポートで起動します。
起動後に
http://localhost:4444/wd/hub
を開くと、サーバステータス情報を確認できます。
もし、うまくいかないときは4444ポートを別のタスクで使ってないか調べてみましょう。
Protractorを使うときは常に起動した状態にしておきます。

###Seleniumサーバを閉じる場合
Seleniumサーバは一度起動した場合、コマンドプロンプトなどを閉じても実行されたままになります。
閉じる場合については、今のところタスクを強制的に終了する方法しかわかってないです。
Windowsでタスクを強制終了するには、まず`netstat -oa | grep 4444`を実行してタスクのプロセスIDを取得します(プロセスIDはSeleniumサーバ起動時にも表示されるので、それがわかるのであれば不要)。
その後、`taskkill /F /PID [プロセスID]`を実行するとタスクを終了させることができます。

##Protractorの設定
Protractorの設定ファイル(protractor.conf.js)を作成します。
ブラウザはとりあえずChromeを使います。

```js:protractor.conf.js
exports.config = {
  //Seleniumサーバアドレス設定
  seleniumAddress: 'http://localhost:4444/wd/hub',
  // テストコードの設定
  specs: ['spec.js'],
  // 使用するブラウザの設定
  multiCapabilities: [{
    browserName: 'chrome'
  }]
}
```

##テストコードの作成
テストコードをJasmineで書いていきます。
今回は自作のページではなく、[Protractorのデモサイト](http://juliemr.github.io/protractor-demo/)に対するテストコードを作成します。

```js:spec.js
describe('AngularJSホームページ', function() {
  it('タイトルを持つ', function() {
    // 接続先URLの設定
    browser.get('http://juliemr.github.io/protractor-demo/');
    // タイトルが指定文字列に一致するかどうかのテスト
    expect(browser.getTitle()).toEqual('Super Calculator');
  });
});
```

##Protractorの実行
Protracotrの実行は、(Seleniumサーバが起動している状態で)`protractor [設定ファイル名]`で実行することが可能です。今回の場合、`protractor protractor.conf.js`で実行できます。
実行して少し待つと自動的にChromeが開いて、Protractorのデモサイトが開かれた後、Chromeが閉じます。
コマンド上には`1 spec, 0 failures`と出力されると思います。これは、Jasmineの実行結果で1つのテストメソッドに対して失敗が0という意味です。

#gulpで動かす
##gulp-protractorパッケージをインストール
gulpからProtractorを動かすためのパッケージ、[gulp-protractor](https://github.com/mllrsohn/gulp-protractor)をインストールします。
`npm install gulp-protractor`

##gulpfile.jsを作る
gulpで実行する処理を定義するgulpfile.jsを作成します。

```js:gulpfile.js
var gulp = require('gulp');
var protractor = require('gulp-protractor').protractor;
var webdriver_standalone = require('gulp-protractor').webdriver_standalone;

// Seleniumサーバの起動
gulp.task('webdriver', webdriver_standalone);

// Protractorの実行
gulp.task('protractor', function() {
  return gulp
  .src(['./spec.js'])
  .pipe(protractor({
    // Protractorの設定ファイル
    configFile: './protractor.conf.js'
  }))
  .on('error', function(e) { throw e; });
});
```

##gulpでの実行
`gulp protractor`を実行することで、Protractorが起動します。
Seleniumサーバを起動するには、`gulp webdriver`で起動できますが、こちらは最初の一度だけ実行し、起動しておけばＯＫです。

#参考
[AngularJS用テストフレームワーク「Protractor」チュートリアル日本語訳)](http://qiita.com/weed/items/30098f7be2f753580f63)

あと、gulpからProtractorを動かす処理については、gulp-protractorのフォルダ内にあるexampleを参考にしました。
webpack.config.jsをes2015で書く方法

```webpack.config.js``` もes2015で書きたい。
その場合、ファイル名を ```webpack.config.babel.js``` にすればこのファイルもbabelとして解釈してくれて、babelを実行してくれる。

なので.babelrcのpresetsに ```es2015``` を入れていればwebpackのconfigもes2015で書けるようになる。
git config --global で設定した値を削除する方法


とても基本的なことですが、知らないと困るし、忘れちゃうと困るので備忘録。
unset　を使えば🆗です。

```
$ git config --global http.proxy proxy.exmple.com:8080
```
で設定した値を削除したい場合は　unset を使って下記のようにする


```
$ git config --global --unset http.proxy
```


せっかくなので git の使い方

#git の基本的な使い方
##確認
```
$ git config --list
$ git config キー名
```
##登録・更新
```
$ git config キー名　設定値　#ローカルリポジトリに設定
$ git config --global キー名　設定値　#全てのローカルリポジトリに設定
```
##削除
```
$ git config --unset キー名
```
check_boxによって送られてくるパラメータを真偽値として扱う方法

# はじめに

例えば、以下の様なフォームがあった場合、

```erb
<%= form_for @user do |f| %>
  <%= f.check_box :enabled %>
<% end %>
```

チェックの有無に応じて、サーバサイドの処理を分岐させるために以下のようなコードが書きたくなる場合がある。

```rb
if params[:user][enabled] == '1' # or 1.to_s
  do_something
end
```

でも、上記のコードだと、特定の文字列リテラルを直接比較に使っているため、次のような意見をもらったりする。

* Viewが修正されて、`'1'`ではなく`'true'`という文字列が渡されてきた時にどうする？
* `'1'`がマジックストリング的で意図がわかりにくい<br>※ マジックストリングかどうかは議論の余地あるけど、Rubyだと`0`も`1`も真なので気持ちはわかる

じゃあ、どう書き換えればいいかという話。

# Rails 4.2の場合

`ActiveRecord::Type::Boolean#type_cast_from_user`メソッドが使える。
引数と戻り値は以下のようなパターンになる。

```rb
ActiveRecord::Type::Boolean.new.type_cast_from_user(0) # false
ActiveRecord::Type::Boolean.new.type_cast_from_user(1) # true
ActiveRecord::Type::Boolean.new.type_cast_from_user('0') # false
ActiveRecord::Type::Boolean.new.type_cast_from_user('1') # true
ActiveRecord::Type::Boolean.new.type_cast_from_user(false) # false
ActiveRecord::Type::Boolean.new.type_cast_from_user(true) # true
ActiveRecord::Type::Boolean.new.type_cast_from_user('false') # false
ActiveRecord::Type::Boolean.new.type_cast_from_user('true') # true
ActiveRecord::Type::Boolean.new.type_cast_from_user(nil) # nil
```

冒頭のコードは以下のようになる。

```rb
if ActiveRecord::Type::Boolean.new.type_cast_from_user(params[:user][:enabled])
  do_something
end
```

# Rails 5の場合

Rails 4.2系で使えた上記メソッドが削除されている。

代わりに`ActiveRecord::Type::Boolean#cast`メソッドが使える。

引数と戻り値は以下のようなパターンになる。
（`ActiveRecord::Type::Boolean#type_cast_from_user`と同じ）

```rb
ActiveRecord::Type::Boolean.new.cast(0) # false
ActiveRecord::Type::Boolean.new.cast(1) # true
ActiveRecord::Type::Boolean.new.cast('0') # false
ActiveRecord::Type::Boolean.new.cast('1') # true
ActiveRecord::Type::Boolean.new.cast(false) # false
ActiveRecord::Type::Boolean.new.cast(true) # true
ActiveRecord::Type::Boolean.new.cast('false') # false
ActiveRecord::Type::Boolean.new.cast('true') # true
ActiveRecord::Type::Boolean.new.cast(nil) # nil
```

冒頭のコードは以下のようになる。

```rb
if ActiveRecord::Type::Boolean.new.cast(params[:user][:enabled])
  do_something
end
```

# 所感
マジックストリング（？）は排除できたけど、コードをパット見ても、何をやっているのか少しわかりづらくなった感じがする。

ifの条件式に直接指定するのは気が進まないので、条件判定用のメソッドを切り出す感じにするかなぁ。

```rb
def enabled?(user)
  ActiveRecord::Type::Boolean.new.cast(user[:enabled])
end

if enabled?(params[:user])
  do_something
end
```

ここまでやる必要があるかについてはわからない。
DockerのMySQLイメージ起動時に渡す環境変数


## 概要

自身の備忘のために、以下の「Environment Variables」部分の和訳です。
[MySQLの公式イメージ on DockerHub](https://hub.docker.com/_/mysql/)

本記事の最終更新時点での公開バージョンは以下の通りです。
> 8.0.19, 8.0, 8, latest
> 5.7.29, 5.7, 5
> 5.6.47, 5.6


## 環境変数

`mysql`イメージを起動する際に、`docker run`コマンドにおいて
1個かそれ以上の環境変数を渡すことで、MySQLインスタンスの設定を調整できます。

既にデータベースを含んでいるデータディレクトリを利用してコンテナを起動する際は
以下のいずれの変数も影響を及ぼさないということに注意してください。
つまり、既存のデータベースはコンテナの起動時に変更を加えられません。

[MySQLが提供する環境変数のドキュメント](https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html)も参照してください。
（特に`MYSQL_HOST`のような変数はイメージ使用の際に問題になることがあります）

### `MYSQL_ROOT_PASSWORD`

この変数は必須のもので、MySQLにおけるスーパーユーザである
`root`アカウントに設定するためのパスワードを指定します。
ページ内の例においては`my-secret-pw`を設定しています。

### `MYSQL_DATABASE`

この変数はオプションで、イメージの起動時に作成するデータベースの名前を指定します。
もしユーザ名とパスワードが指定された場合（下記を参照）は
ユーザはこのデータベースへのスーパーユーザアクセス権（`GRANT ALL`に相当）を与えられます。

### `MYSQL_USER`, `MYSQL_PASSWORD`

これらの変数はオプションで、新規ユーザの作成とそのユーザのパスワード設定に使用されます。
このユーザは`MYSQL_DATABASE`変数で指定されたデータベースに対して
スーパーユーザとしての権限（上記を参照）を与えられます。
どちらの変数も、作成されるユーザのためには必須です。

この仕組みを、rootユーザの作成に使う必要はないことに注意してください。
rootユーザはデフォルトで作成され
`MYSQL_ROOT_PASSWORD`変数により指定されたパスワードが設定されるためです。

### `MYSQL_ALLOW_EMPTY_PASSWORD`

オプションの変数です。
`yes`を設定することで、rootユーザに空のパスワードを設定して
コンテナを起動することを許可します。

*注意*:
この変数に`yes`を設定することはおすすめしません。
この設定は誰もがスーパーユーザの権限を得ることを許し
MySQLインスタンスがまったく保護されていない状態になるためです。

### `MYSQL_RANDOM_ROOT_PASSWORD`

オプションの変数です。
`yes`を設定することで、rootユーザのための初期パスワードを
（`pwgen`を利用して）ランダムで生成します。
生成されたパスワードは標準出力に表示されます。（`GENERATED ROOT PASSWORD: ...`）

### `MYSQL_ONETIME_PASSWORD`

（`MYSQL_USER`で指定されたユーザではなく）rootユーザにおける
初回のログインのパスワード変更を強制するために
一度でパスワードを期限切れにするための設定を行います。

*注意*:
この機能はバージョンが5.6以上のMySQLのみにおいてサポートされています。
バージョン5.5でこのオプションを使用した場合、初期化時にエラーが投げられます。

## 和訳してわかったこと

Ansibleのユーザモジュールのように
パスワードをハッシュ化して書けたりすればいいなと思って読んでたんですが
このドキュメントを読んだだけだとダメそうです。

`Dockerfile`や`docker-compose.yml`として公開するのであれば
環境変数に埋めて渡すしかないんですかね。
c++ builder > ProgressBarの描画 > Sleep()のループの組合せ

```txt:動作環境
C++ Builder XE4 on Windows 7pro (32bit)
```

関連 http://qiita.com/7of9/items/047ea9aa935ea8836ca0

```
FormProgress->SetCurrentPosition(value);

for(int loop=0; loop<10; loop++) {
    Application->ProcessMessages();
    Sleep(50);
}
```

TProgressのpositionsを変更しながら描画するとき、TThreadなどから実行するようにしているが、ソフトの組み方によってはフォームなどからApplication->ProcessMessages();を使うことになる場合があるかもしれない。

そのような場合、上記のようにApplication->ProcessMessages();をループ処理しないとプログレスバーが100%まで到達しないような症状が見られた。

いくつか試した結果が以下となる。
組合せの表記は上の例の場合、50 x 10としている。

| 組合せ | 到達 |
|:-:|:-:|
| 300 x 5 | 100% |
| 100 x 5 | 90%  |
| 100 x 10 | 100%  |
| 20 x 10 | 80%  |
| 500 x 2 | 100%  |
| 100 x 6 | 100%  |
| 600 x 1 | 90% |
| 50 x 10 | 90% |
| 200 x 3 | 90% |

待ち時間が600msecでも100x6と600x1の待ちでは到達パーセントが異なる。

一番待ちSleep()時間が短い100%到達の組合せは100x6で600msec。

上記結果についてはTProgressの設定により変わる可能性はある。
数値計算での注意点

# 数値誤差について
数値計算の過程で発生する誤差の基礎について，簡単にまとめる．
間違っているかも．

## 小数の表現
プログラムで小数を保持する際には，浮動小数点数で2進数として表す．
浮動小数点数とは，(符号)(仮数部)×２(基数)の(指数部)乗 と表すことである．このように表すことで，桁によらず同じ相対誤差とすることができる．浮動小数点数にすることを正規化と呼ぶ．2進数では，仮数部の最上桁は1で固定であるので，ここにビット(情報)は必要はない．
c++ではfloat(4 bytes，有効数字7桁)ないしは，double(8 bytes)が一般的である．

## 丸め誤差
コンピュータでは数値が2進数で表されるので，10進数は2進数でメモリ上に置かれる．例えば，0.1(10進数)=0.00011001100110011....(2進数)となる．しかしながら，変数のサイズは有限なので，どこかで打ち切る必要がある．このとき行う0捨1入の操作を丸めると呼び，このとき発生する元の値との誤差が丸め誤差である．

## 桁落ち
これもそもそも有効桁数が有限であるために発生しているのだろう．二つのほぼ同値である数に対して，小数点の深いところでの差を見ようとすると，そもそも互いに有効桁数のために情報が削減されているところを見ることとなる．その為に，例えば差分をとると，小数点の深いところが殆ど0となり，有効桁数が減少する．これを桁落ちと呼ぶ．
参考URL:
http://technologicaladvance.blog.fc2.com/blog-entry-45.html

## 情報落ち
大きな数に小さな数を足しても，有効桁数の有限性から数は変化しないという問題．
embulk の liquid template でハマったトコ

いくつかハマったので、メモがてら・・・。
動かした embulk は・・・0.8.11 だったと思います（調べたら直しておきます）。

# include のパス

include で設定するパスは、最初に読み込む liquid ファイルからの相対パスになります。
読み込んだ先の liquid ファイルで、さらに include しても、最初に読み込んだファイルからの相対パスになります。
しかも、パスにカレントディレクトリを表す「.」や、親ディレクトリを表す「..」が使えません。
なので、最初に読み込む liquid ファイルが、一番上にディレクトリにゴチャッと溜まることに・・・。


# env の罠

~~embulk は実行時に引数を渡すことができないので、環境変数を使うことになります。
で、どの liquid ファイルで使用するかわからないので、全部最初に読み込む liquid ファイルで指定してたんですけど、~~

```
{% include 'child', args = env.ARGS %}
```

~~こんな感じで直接 include 先のファイルに渡すことができないみたいです。
一度、assign すると渡せます。~~

```
{% assign args = env.ARGS %}
{% include 'child', args = args %}
```

**これウソでした。
もうちょっと調査して修正します。**


# include での渡し方

~~include で変数を渡すには、「:」で指定するか、「=」で指定することができます。
でも、これも謎の罠があって・・・~~

```
# parent.yml.liquid
{% include 'child', args = 'ar' %}
```

```
# _child.yml.liquid
{% assing args = args | append: 'gs' %}
{% include 'grandchild1', args: args %}  # 'ar' が渡される
{% include 'grandchild2', args = args %}  # 'args' が渡される
```

~~おわかりいただけたでしょうか？
append した内容が反映されるかどうかの差異があるようです。~~

**これウソでした。
もうちょっと調査して修正します。**


# 文字列に「'」と「"」を混在させたい

片方だったら、'aaa"aaa' というような感じで書けば良いのですけど、両方使いたい場合は、append するか、replace で適当な文字をあとで置き換えるかする必要があるようです。
エスケープなんてなかった（たぶん）。
配列の重複の有無をチェック（es2015 ver）

```js

const isDup = (arr) => arr.length !== new Set(arr).size
```

```js
isDup([1,2,3,4,5]) // false
isDup([1,1,2,3,4]) // true
isDup(new Array(5))// true. [undefined, undefined,...] のため
```

なお、`[...new Set(array)]`　とやれば、重複のない配列が作れる


[You Might Not Need Underscore](https://www.reindex.io/blog/you-might-not-need-underscore/#create-a-copy-of-an-array-with-duplicates-removed)
unicornが起動できない問題(unicorn.pid not writable (ArgumentError))

## unicornがunicorn.pid not writable (ArgumentError)エラーで起動できない

```
bundle exec unicorn -E production -c config/unicorn.rb -D
```
で起動できない。

ps aux | grep unicornしてもプロセスは起動していない。  
pidファイルも残ってない。

## エラー

```
/home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/configurator.rb:88:in `block in reload': directory for pid=/home/username/appname/tmp/unicorn.pid not writable (ArgumentError)
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/configurator.rb:84:in `each'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/configurator.rb:84:in `reload'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/configurator.rb:65:in `initialize'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:76:in `new'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/lib/unicorn/http_server.rb:76:in `initialize'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/bin/unicorn:126:in `new'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/gems/unicorn-5.1.0/bin/unicorn:126:in `<top (required)>'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/bin/unicorn:23:in `load'
  from /home/username/appname/vendor/bundle/ruby/2.0.0/bin/unicorn:23:in `<main>'
master failed to start, check stderr log for details
```

## unicorn.rb
一応

```rb
rails_root = File.expand_path('../../', __FILE__)

worker_processes 2
working_directory rails_root

listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"

stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"
```

##解決方法=>suでrootユーザーで実行

```
su
パスワード:XXXXXXX
```
でrootユーザーになったら

```
bundle exec unicorn -E production -c config/unicorn.rb -D
```
が実行できた。

## まとめ
エラーで検索したら、unicorn.sockが存在しないからダメって回答しているサイトがあったけど、そもそも勝手に作られるしあんまり関係ないのかなと思う。実際sock作っても解決しなかった。
suでrootユーザーにならないと実行できなくなった理由は不明、、、
Spherical Harmonics > Link > Unlimited Engine - Spherical Harmonics Illumination using SCAO

Spherical Harmonicsを用いて、リアルタイムに動画のような描画ができる。

https://www.youtube.com/watch?v=pUFV64KHABw&index=66&list=FLyaPKuly9idxmlWDPmaYrpg

>  After the conversion I proceed as if it would be precomputed radiance transfer and calculate the final lighting by calculating the dot product between the basis functions, the lighting coefficients and the transfer coefficients and get the irradiance. 

最初に時間のかかる計算を終わらせ、あとはdot productを計算することで、様々な特性での計算をリアルタイムに行っている。
Spherical Harmonics > Link > Quantum Chemistry - Orthonormality of Spherical Harmonics (Old Version)

TMP CHEMによる講義。

https://www.youtube.com/watch?v=iT1vIc7A5mA&list=WL&index=34

「Spehrical Harmonics Weta」などで検索して見つけた。

Chemistry: 高校時代挫折
Quantum: いくつか本を読んだがしっくりこない

しかしながら、SHを理解して使えるようになるにはこのビデオと関連ビデオ159本は見ておいたほうがいいかもしれない。

7分-12分を毎日1,2本見て3ヶ月弱。

[Arthur MattuckのMIT Open courseware](http://ocw.mit.edu/courses/mathematics/18-03-differential-equations-spring-2010/)を見た時も結構時間がかかったが、上記のビデオは短いので区切りが良さそう。


159本。
https://www.youtube.com/playlist?list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

例としてDirac Notatin
https://www.youtube.com/watch?v=QCiWuNpIjmE&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=31
ブラ、ケット表記はDirac Notationと言い、積分の表記を簡単にするものというのが分かった。


最初のリンクである
https://www.youtube.com/watch?v=iT1vIc7A5mA&list=WL&index=34
の内容としては

- クロネッカーのデルタを表記として使用
- ブラ、ケット表記使用
- 複素共役(complex conjugate)使用
- wave equation ψを変数分離する (θの関数、φの関数)
- θの関数はPJ(),PJ'()の積分からorthonormalと分かる
- φの関数はPhi*()とPhi()の積分からorthonormalと分かる
- 2者の積であるwave equationはブラケット表記で整理してクロネッカーのデルタよりorthonormalと分かる
zsh/bashのカスタマイズ


## zsh

zshをデフォルトで使用



```bash:ログインシェルの変更
chsh -s /bin/zsh
```



```bash:~/.zshrc(パスの変更)
# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH
```

```bash:~/.zshrc
LANG=ja_JP.UTF-8

# 最新のディレクトリのみ表示
PS1="%1~ %(!.#.$) "

# ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# cd した先のディレクトリをディレクトリスタック（履歴）に追加する
# `cd +<Tab>` でディレクトリの履歴（新しい順）が表示され、そこに移動できる
setopt AUTO_PUSHD

"~/.zshrc" 50L, 1110C

DIRSTACKSIZE=100

autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:cd:*' ignore-parents parent pwd
# zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

# エイリアス設定
alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'

# ディレクトリ移動
alias ..='cd ../'
alias ...='cd ../..'
alias ....='cd ../../..'

# 関数
# 差分表示
function diff(){
        git diff $1 --name-only
}

# 差分のみでzipをつくる
function zip(){
        git diff $1 --name-only | xargs -I {} zip $1.zip {} -x .DS_Store
}
```

oh-my-zsh
https://github.com/robbyrussell/oh-my-zsh

## bash

`~/.bash_profile`：最初のログイン時に読み込まれる
`~/.bashrc`：ターミナル・エミュレータのウィンドウを開くたびに読み込まれる

```bash:~/.bash_profile
export PATH="$PATH:$HOME/bin"

if [ -f ~/.bashrc ]; then
	source ~/.bashrc
fi
```

```bash:~/.bashrc
LANG=ja_JP.UTF-8
PS1='\W \$ '
export LESS='--no-init'

set -o ignoreeof

# コマンド履歴設定
shopt -s histappend
HISTSIZE=1000000
HISTFILESIZE=1000000
```

※ aliasや通常の変数は引き継がれないため、~/.bashrcに記述する必要がある

※ 例えばaliasに登録したlsを一時的に無効に（本来のlsを実行）する場合は`command ls ` もしくは ` \ls `


> 参考
[新しいLinuxの教科書](http://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A4%A7%E8%A7%92-%E7%A5%90%E4%BB%8B/dp/4797380942/ref=sr_1_2?ie=UTF8&qid=1457791762&sr=8-2&keywords=linux)




```
export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting

LANG=ja_JP.UTF-8

# 最新のディレクトリのみ表示
PS1="%1~ %(!.#.$) "

# ヒストリの設定
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000

# cd した先のディレクトリをディレクトリスタック（履歴）に追加する
# `cd +<Tab>` でディレクトリの履歴（新しい順）が表示され、そこに移動できる
setopt AUTO_PUSHD

# pushd したとき、ディレクトリがすでにスタックに含まれていればスタックに追加しない
setopt pushd_ignore_dups

DIRSTACKSIZE=100

autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:cd:*' ignore-parents parent pwd
# zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

# エイリアス設定
alias ls='ls -F'
alias la='ls -a'
alias ll='ls -l'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'

# ディレクトリ移動
alias ..='cd ../'
alias ...='cd ../..'
alias ....='cd ../../..'

# 関数
# 差分表示
function diff(){
        git diff $1 --name-only
}

# 差分のみでzipをつくる
function gzip(){
        git diff $1 --name-only | xargs -I {} zip $1.zip {} -x .DS_Store
}


export PATH="/usr/local/sbin:$PATH"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

> 参考
[初めて Mac で zsh を使う人のためのチュートリアル](http://mollifier.hatenablog.com/entry/2013/02/22/025415)
[【図解】ゼロから始めるモダンなコマンドライン環境作り #iTerm2 #tmux #zsh](https://codeiq.jp/magazine/2014/01/5143/)
CentOS6系から7系へのRedmineのマイグレーション手順

# Redmineのマイグレーション

外部のクラウドサービス上のVM（CentOS6系）にRedmineを立てていたが、
自宅のVMにRedmineを立てることにしたのでマイグレーションを行った。
せっかくなのでCentOS7を覚えるためにも移行先はCentOS7にした。

## 概要

### 移行方法について

既存Redmineのデータベースから情報を抜き取る。
MySQLで動かしていたので mysqldump を用いる。
Redmine上に添付したファイルは直接サーバ上のディレクトリにあるため、tarなどでアーカイブして移行する。
CentOS7上にredmineを作成できるredmine-centos-ansibleというansible-playbookを公開してくださっている方がいたので今回はそちらを使わせて頂いた。

### 環境

* 移行先
 - OS：CentOS7.x
 - DB:MariaDB
* 移行元
 - OS：CentOS6.x
 - DB:MySQL

### 参考にしたサイト

* [redmine-centos-ansible](https://github.com/farend/redmine-centos-ansible)

## Redmine構築手順

1. 設定
  1. SELINUXを無効化
<pre>
vi /etc/selinux/config
SELINUX=disabled
</pre>
  2. 再起動
<pre>
reboot
</pre>
  3. パッケージインストール
<pre>
yum install firewalld epel-release ansible git
</pre>
  4. redmine-centos-ansible.gitをクローン
<pre>
git clone https://github.com/farend/redmine-centos-ansible.git
</pre>
  5. データベースの redmine ユーザーのパスワードを設定
<pre>
cd redmine-centos-ansible
vi group_vars/redmine-servers
db_passwd_redmine: <パスワード>
</pre>
  6. ansible-playbookでインストール
<pre>
ansible-playbook -i hosts site.yml
</pre>
  7. rubyのインストールでこけるので手動で展開し、再度実行する
<pre>
cd /tmp/redmine-setup/
tar xjvf ruby-2.2.3.tar.bz2
ansible-playbook -i hosts site.yml
</pre>

2. 既存Redmine（MySQL)からマイグレーション
  1. 移行元ホスト上でDBのダンプ
<pre>
mysqldump -uroot -p db_redmine > db_redmine.dump
</pre>
  2. 移行元ホスト上の添付ファイルをアーカイブ
<pre>
cd /var/lib/redmine
tar zcvf files.tar.gz files/
</pre>
  3. データの転送  
移行先ホストから移行元ホストへscpなどでデータ取得  
ここでは移行元データは/var/tmp/にあることを想定  
<pre>
scp root@<移行元ホストのIPアドレス>:/var/tmp/db_redmine.dump .
scp root@<移行元ホストのIPアドレス>:/var/tmp/files.tar.gz .
</pre>
  4. MariaDBをインストール
<pre>
yum install mariadb-server mariadb-devel
cp -pi /etc/my.cnf /etc/my.cnf.org
</pre>
  5. my.cnfに設定を追加
<pre>
vi /etc/my.cnf
character-set-server=utf8
</pre>
[]( 6. 作業
##### コメントアウト #####
# 下記手順が必要が不明のためコメントアウト
<pre>
bundle install --without development test --path vendor/bundle
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
</pre>
##### /コメントアウト #####
)
  6. 設定編集
<pre>
diff /var/lib/redmine/config/database.yml.org /var/lib/redmine/config/database.yml
2,3c2,3
<   adapter: postgresql
<   database: redmine
---
>   adapter: mysql2
>   database: db_redmine
6c6
<   password: "redmine" 
---
>   password: redmine
</pre>
  7. redmineユーザの作成
<pre>
mysql -uroot -p
create database db_redmine default character set utf8;
grant all on db_redmine.* to redmine@localhost identified by 'redmine';
flush privileges;
\q
mysql -uredmine -p
\q
</pre>
  8. MySQLのダンプファイルをインポート
<pre>
mysql -uroot -p db_redmine < /var/tmp/db_redmine.dump
</pre>
  9. アーカイブした添付ファイルを展開
<pre>
  cd /var/tmp/
  tar zxvf files
  mv files /var/lib/redmine/
</pre>
  10. MariaDBを起動
<pre>
systemctl enable mariadb
systemctl start mariadb
</pre>
  11. MariaDBのステータス確認
<pre>
systemctl status mariadb
</pre>

3. firewalldの設定
  1. firewalldの起動  
<pre>
systemctl start firewalld
systemctl status firewalld
</pre>
  2. httpの許可設定  
<pre>
firewall-cmd --add-service=http --permanent
</pre>
  3. 設定確認
<pre>
firewall-cmd --list-services
</pre>
ベイジアンネットワークのパッケージ　〜Peblのチュートリアル実行〜

　前回、Attribution ModelにMarkov連鎖を使うネタがあったので、簡単な触りをしました。
Attribution Modelには、ベイジアンネットワークを用いたものもあるようなので、そちらのパッケージや使い方の確認もしたいと思います。
　ベイジアンネットワーク自体は、色々な記事と書籍を確認してください。ベイジアンネットワークそのもので検索したり、グラフィカルモデルでも関連するものが出てきます。
## Pythonパッケージ
- Pebl(https://pypi.python.org/pypi/pebl)
- Open Bays(https://github.com/PyOpenPNL/PyOpenPNL)

どうもこの２つがあるみたいです。
まずは、Peblを使って見たいと思います。
## Pebl
### インストール
※ 普段はmac利用ですが、[もふもふ技術部](http://tech.mof-mof.co.jp/blog/bayespy-quick-start.html)の記事によると、macでpeblは動作しないとの情報がありました。今回は、virtualboxにubuntuを入れて動かします。
動作環境は
```OS: Ubuntu16.0.4
anaconda: 3-4.1.0
python: 2.7.12
pydot: 1.0.28
numpy: 1.11.1```
です。

本体と関連するパッケージは以下のものをインストールしました。
```pip install pebl
conda install Graphviz
pip install simple_json```
※ nose_testが通らなかったですが、Tutorialは実行できました。
### 利用データ
[公式ページのTutorial](http://pythonhosted.org/pebl/tutorial.html)を見ながら、サンプルデータを確認したいと思います。
そちらから、"pebl-tutorial-data1.txt"をDLして、実行するディレクトリに格納しておきます。
これは、ゲノム系のテストデータで、76行12列のデータみたいです。列名を見ても残念ながらよくわかりませんでした。
### 実行例
続いて、Tutorialのテストデータを実行します。
First Example中のコマンド`ex1result.tohtml("example1-result")`で以下のエラーが出ました。
```/home/usrname/.pyenv/versions/anaconda3-4.1.0/envs/py27/lib/python2.7/site-packages/pebl/network.pyc in layout(self, width, height, dotpath)
    287         dotgraph = pydot.graph_from_dot_file(dot2)
    288         nodes = (n for n in dotgraph.get_node_list() if n.get_pos())
    --> 289         self.node_positions = [[int(i) for i in n.get_pos()[1:-1].split(',')] for n in nodes]
    290
    291 ```
文字列の浮動小数点（'99.9'みたいなもの）をint()に入れている所がエラーの原因らしいです。
仕方ないので、該当行に変更を加えました。
リファレンスのものとは少し違う出力が出る可能性が出てきましたが、実行はできました。
```変更前) self.node_positions = [[int(i) for i in n.get_pos()[1:-1].split(',')] for n in nodes]
変更後) self.node_positions = [[int(round(i)) for i in n.get_pos()[1:-1].split(',')] for n in nodes]```

Tutorialが回って、htmlファイルが出力されました。
Log Scoreなどが出てきましたが、この辺りの意味がわからないと読み解けないので、その辺りも調べないと。。。
PhpStorm(on Windows10) 基本設定メモ(3) - SVN/Git設定

$tan^2x$番煎じのメモ
SVN/Git設定
(※2016/08/28時点)

 * [PhpStorm(on Windows10) 基本設定メモ(1) - php+xdebug環境](http://qiita.com/ckit_idle/items/8b0361f0eedc5d41c4f7)
 * [PhpStorm(on Windows10) 基本設定メモ(2) - Editor設定+plugin](http://qiita.com/ckit_idle/items/8df858d5b77135a440aa)
 * PhpStorm(on Windows10) 基本設定メモ(3) - SVN/Git設定(本記事)
 * [PhpStorm(on Windows10) 基本設定メモ(4) - PHPUnit設定](http://qiita.com/ckit_idle/items/17b979f08c3d1d40a354)
 * vagrant+remote debug設定(書く予定)

| software   | version  |
|:-----------|---------:|
| PhpStorm   | v2016.02 |
| Subversion Command line tools | 1.9.4    |

# SVN設定

## SVNコマンドラインクライアント install

[Subversion Command line tools](https://www.visualsvn.com/downloads/)

zipファイルの中身を例えば下記に設置
```
C:\Program Files\Apache-Subversion-1.9.4
```

## PhpStorm Setting

ツールバーの File > Setting

### Version Control > Subversion > General

```
Use command line client: C:\Program Files\Apache-Subversion-1.9.4\bin\svn.exe
```

### リポジトリ追加

ツールバーのVCS > Import into Version Control > Import into subversion...

リポジトリを追加

## 使ってみる

ツールバーのVCS > Checkout from Version Control > Subversion
追加したリポジトリを選択してチェックアウト


# Git設定

## Git for windows install

[Git for windows](https://git-for-windows.github.io/)

exeファイルを実行

※Git設定は省略

## PhpStorm Setting

ツールバーのFile > Setting

### Version Control > Git

インストールしたgit.exeを指定

```
Path to Git executable: C:\Program Files\Git\cmd\git.exe
```

### 秘密鍵の設置
#### %USER_HOME%/.ssh/id_rsa(任意)

PhpStormは%USER_HOME%/.sshを利用する。

既存の鍵があれば、.ssh以下に設置。
鍵がなければputtygen等を利用してOpenSSH形式の鍵を作成し、リポジトリ側(GitHub等)に公開鍵を設定。

#### %USER_HOME%/.ssh/config


```
Host (任意の名前)
HostName (ドメイン名)
User (ユーザ名)
IdentityFile ~/.ssh/(任意の鍵名)
```

## 使ってみる

ツールバーのVCS > Checkout from Version Control > Git
追加したリポジトリを選択してclone
Google Cloud Speech APIを試す


## APIを利用できるようにする

* [Cloud Platform Console](https://console.cloud.google.com/)でCloud Speech APIを有効化
* [Set Up a Service Account](https://cloud.google.com/speech/docs/common/auth#set_up_a_service_account)で認証キー（サービスアカウント）を作成  
→JSON（Key file）はローカルに保持しておく

## 音源準備
* 音源を作成するために、sox, flacをbrewしておく

```
$ brew install sox
$ brew install flac
```

* wav録音  

```
$ rec --bits 16 --channels 1 --rate 16000 sample.wav
```
"これはテストです。"で保存した。

> bit => 16bit
> rate => 16000Hz
> [AudioEncoding](https://cloud.google.com/speech/reference/rest/v1beta1/RecognitionConfig#AudioEncoding)

* wavをflacへ変換 
  
```
$ flac -V sample.wav
```
同一ディレクトリ内にsample.flacが作成される。

* Google Cloud Storageに格納
ブラウザなどからバケット作成して、格納しておきます。

* （念のため）格納されているか確認
  
```
$ gsutil ls -R gs://<your bucket name>/demo
gs://<your bucket name>/demo/:
gs://<your bucket name>/demo/
gs://<your bucket name>/demo/sample.flac
```

## リクエストデータ作成

* Syncrecognize用のRequest Bodyを作成

```
$ more sync-request.json
{
  "config": {
      "encoding":"FLAC",
      "sampleRate": 16000,
      "languageCode": "ja-JP"

  },
  "audio": {
      "uri":"gs://<your bucket name>/demo/sample.flac"
  }
}
```

* サービスアカウントをアクティベート
 
```
$ gcloud auth activate-service-account --key-file=<your service account keyfile>
```
* Access Token取得

```
$ gcloud auth print-access-token
ya29.Ci9LA40J64Je5BmoFDPeexIKUcyAk4RdnEeTRLxqsNImU3xU0pZa_s94DsBMB2Oadw
```

* Curl実行  
  
```
$ curl -s -k -H "Content-Type: application/json" -H "Authorization: Bearer ya29.Ci9LA40J64Je5BmoFDPeexIKUcyAk4RdnEeTRLxqsNImU3xU0pZa_s94DsBMB2Oadw" https://speech.googleapis.com/v1beta1/speech:syncrecognize -d @sync-request.json
{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "これはテストです",
          "confidence": 1
        }
      ]
    }
  ]
}
```


## 補足
languageCode => ja-JPを指定したが、これを指定していないとうまく日本語変換してくれないかもしれない。

## 参考
http://qiita.com/lethe2211/items/7c9b1b82c7eda40dafa9

## 続き
[Google Cloud Speech APIを試す Part2（Goで書いてみる）](http://qiita.com/tsuchi83/items/0058c8f167be2aa5cc57)