OmniAICreator/Qiita-1.07M huggingface dataset:
Write文のバッファリング

#Write文でハマったのでメモ

```python
f=open('hoge.txt'.'w')

LOOP = True
While LOOP:
    f.write('aaaaa\n')
    if 満足:
        LOOP=False
````

だと、8192バイトのファイルしか出来ないので、

```python
f=open('hoge.txt'.'w',buffering=1)
```

として、1行ずつ書き込むようにすると、8192の壁を超えられる。
awk 歴 23 年のおっさんが 2017 年に知った awk の小技 : 「プログラムファイルの分割」と「処理対象ファイルごとの分岐」

# これは何
タイトルのとおり。23 年もずっと使い続けているスクリプト言語は awk ぐらいしかないかも。

# プログラムファイルの分割
コマンドマンドラインオプション `-f` (`--file`) は複数与えられる。gawk のどのバージョンからなのか、など調べていませんが、今日初めて知りました。
ということは、プログラムファイルを分割することができますね。
もちろんネームスペースとかスコープとかカプセル化とか、そういう概念とは無縁でしょうから、単に一本のプログラムファイルに書いていたものを管理しやすいように分割するだけです。
まあ、よく使う関数群を一つのプログラムファイルに書いておいて (そのファイルは `function` 定義がいっぱい書いてある) あちこちから使うというのがいちばんイメージしやすいですね。ときおり `BEGIN` ブロックが巨大化するときがありますが、そういうときも別ファイルに括りだしておいた方がスクリプトの見通しはよくなりますね。

# 処理対象ファイルごとの分岐
`awk -f test.awk test1.csv test2.csv` みたいに複数のファイルを処理対象にして、なおかつ、その処理対象ファイルごとに違う処理をしたい場合、プログラムファイル内で `FILENAME` を基に分岐する処理を描くわけです。普通に書けば、

```awk
FILENAME == "test1.csv" {
    ...
}
```

とかそういうパターンを書くのでしょうが、`FILENAME` がフルパスだったりすると比較する部分がもっと長くなるし、そもそも `FILENAME` というのも長いし、もうちょと短く書けないかな、と考えて、さっきこういうのを思いつきました。

```awk
FNR == 1 {
    fname = gensub(/^.*\/([^\/]+)\.csv$/, "\\1", 1, FILENAME);
    delete m;
    m[fname] = 1;
}

m["test1"] {
    # test1.csv に関する処理
}

m["test2"] {
    # test2.csv に関する処理
}
```

ミソは、`m[***]` がどれか一つだけ真 (`1`) になることを利用して、パターンが短く書ける、というところですね。

これだとプログラムファイルが散らかる可能性があるので、たとえば、test1.csv の処理に特化した部分と test2.csv の処理に特化した部分を、さきに書いたように分割すればいいのかな、と。

# 例

```awk:testmain.awk
FNR == 1 {
    fname = gensub(/^.*\/([^\/]+)\.csv$/, "\\1", 1, FILENAME);
    delete m;
    m[fname] = 1;
}
```
```awk:testsub.awk
function stderr(msg) {
    print msg > "/dev/stderr";
}
```
```awk:test1.awk
m["test1"] && FNR < 3 {
    stderr(sprintf("[%s:%03d] %s", fname, FNR, $0));
}
```
```awk:test2.awk
m["test2"] && FNR % 2 == 0 {
    stderr(sprintf("[%s:%03d] %s", fname, FNR, $0));
}
```

こんな感じにしといて、

```shell-session
[takeyuki@jupiter ~]$ `(echo -n "awk "; ls -1 test*.awk | while read f; do echo -n "-f $f "; done; echo /var/test/*.csv)`
```
と実行するとか (↑は `-f testmain.awk -f testsub.awk ...` のようにすべての `test○○.awk` に `-f` を前置して `awk` のコマンドラインオプションとして渡し、`/var/test/` 直下の CSV ファイルを全部処理させます。あ、testmain.awk は test1.awk なんかより先に読み込ませないと駄目だね)。

# 追記 2017-02-02
`m["***"]` で分岐するって話、処理対象ファイルごとに分岐するときだけでなく、一つのファイルを処理するときに途中でモードが変わるケースにも使えますね。たとえば、なにがしかの方法でマークアップされたファイルがヘッダ、メイン、フッタに分かれるときに `m["header"]` や `m["footer"]` を定義する、みたいな。
Hammerspoon のイベント監視が止まるのはGCのせい

[Hammerspoon](http://www.hammerspoon.org/) は Mac の OS イベントの割り込み処理を Lua で書けるソフトウェアです。

実は、公式ドキュメントのここ http://www.hammerspoon.org/go/#appevents らへんから始まるサンプルコードには罠があって、ちょっと注意が必要です。

本当のドキュメントはこの issue のほう [Eventtap randomly stops intercepting events · Issue #1103 · Hammerspoon/hammerspoon](https://github.com/Hammerspoon/hammerspoon/issues/1103)

結果どうするべきかというと、GC に回収されないように注意して Lua を書かないといけないよということ。

こういうのはダメです:

```lua
local i = 0
hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end):start()
```

```lua
local i = 0
local secTimer = hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end)
secTimer:start()
```

```
2017-02-02 16:31:41: -- Loading ~/.hammerspoon/init.lua
2017-02-02 16:31:41: -- Loading extension: eventtap
2017-02-02 16:31:41: -- Loading extension: timer
2017-02-02 16:31:41: -- Done.
2017-02-02 16:31:42: 1
2017-02-02 16:31:43: 2
2017-02-02 16:31:44: 3
2017-02-02 16:31:45: 4
2017-02-02 16:31:46: 5
2017-02-02 16:31:47: 6
2017-02-02 16:31:48: 7
2017-02-02 16:31:49: 8
2017-02-02 16:31:50: 9
2017-02-02 16:31:51: 10

>  collectgarbage('collect')
0

```

GC 直後に `hs.timer.doEvery():start()` が死んでいます。

正解はこう:

```lua
local i = 0
-- これをグローバル変数にする
secTimer = hs.timer.doEvery(1, function()
    i = i + 1
    print(i)
end)
secTimer:start()
```

```
2017-02-02 16:32:57: -- Lazy extension loading enabled
2017-02-02 16:32:57: -- Loading ~/.hammerspoon/init.lua
2017-02-02 16:32:57: -- Loading extension: eventtap
2017-02-02 16:32:57: -- Loading extension: timer
2017-02-02 16:32:57: -- Done.
2017-02-02 16:32:58: 1
2017-02-02 16:32:59: 2
2017-02-02 16:33:00: 3
2017-02-02 16:33:01: 4
2017-02-02 16:33:02: 5
2017-02-02 16:33:03: 6
2017-02-02 16:33:04: 7
2017-02-02 16:33:05: 8
2017-02-02 16:33:06: 9
2017-02-02 16:33:07: 10

>  collectgarbage('collect')
0
2017-02-02 16:33:08: 11
2017-02-02 16:33:09: 12
2017-02-02 16:33:10: 13
2017-02-02 16:33:11: 14
2017-02-02 16:33:12: 15
2017-02-02 16:33:13: 16
2017-02-02 16:33:14: 17
2017-02-02 16:33:15: 18
2017-02-02 16:33:16: 19
2017-02-02 16:33:17: 20
```

[IntelliJとかJVMのIDE使いでもKarabinerなしでバックスラッシュを片手入力したい](http://qiita.com/tanakahisateru/items/d8a67ad89c07baf8c0da#comment-68192d162203ad3fbc05)

で修正したバグの詳細でした。
golangによる細線化処理

以下注意点です。
* ここにソースと学習の変遷は書かれています。(https://github.com/kaepa3/effector)

#hiditchの方法
http://qiita.com/TatsuyaOGth/items/45965e1632f41f3eb139
に似たようなことが書かれていました。
こんなことをしようと何年か前のテキストから把握しております。

にしても、ここもあっちも関数が長くて読む気がしません。
でもまぁ、やってみましょう。

#解釈の概要
周囲８点を観察して、ある条件に一致すればその点（今後注目点と記載）を白にする
で、ある条件が下です

* 注目点が画像の端でないこと
* 注目点の画素が白くなっても連結数が保たれること
* 線幅２が消滅しないこと

一つ目は線の端ではないことを考慮します。周囲の黒の数が３以下なら端と判断します。
二つ目は連結数を解釈しないといけない、個人的には以下で解釈しました。
### 連結数
複数の直線には平行でなければ当然交点が存在します。注目点には一体何本の線が交差しているのか？を定義するのが連結数と定義します。
従って、
周囲をぐるっと走破して、白→黒の変化がいくつか？で連結数を調べます。

三つ目は周囲をぐるっと走破して一つずつ消した時に連結数が変化しないこと、更に対象となるのは注目点の上３つと左側だそうです。何故かは記載されておらず「そういうもんだよ」って感じでした、書いてよ。
無理やり解釈すると、左上から左下に向かって処理をするからで、どちらかでやればいいのだろうというのが大方の予想。両方でやると出るけど、線がガタツクと予想する。

## ソースコード

```go
func Thinning(srcImg image.Image) image.Image {
	//白を出すだけの関数
	white := func(aVal uint32) color.Color {
		return color.RGBA64{ex.ColorWidth, ex.ColorWidth, ex.ColorWidth, uint16(aVal)}
	}
	//出力画像
	var workImg *image.RGBA
	for {
		workImg = image.NewRGBA(srcImg.Bounds())
		draw.Copy(workImg, image.Point{0, 0}, srcImg, srcImg.Bounds(), draw.Src, nil)
		counter := 0
		icom.ImageLoop(srcImg, func(x int, y int) {
			//判定を行う値かチェックする
			if false == isCheckValue(x, y, srcImg) {
				return
			}
			//周囲8の値を取得する
			srcAround, sum := getArounds(srcImg, x, y)
			workAround, _ := getArounds(workImg, x, y)
			//aの値を取得しておく
			_, _, _, a := workImg.At(x, y).RGBA()
			switch sum {
			case 0:
				workImg.Set(x, y, white(a))
			case 2, 3, 4, 5:
				if true == doesKeepConnect(srcAround, workAround) {
					workImg.Set(x, y, white(a))
				}
			}
			r, _, _, _ := workImg.At(x, y).RGBA()
			if r == ex.ColorWidth {
				counter++
			}
		})
		if counter == 0 {
			break
		}
		// 元画像に戻す
		srcImg = workImg
	}
	return workImg
}
```
全貌でございます。
処理順序は以下になります。

1. 現状と比較したいので、元画像をワークにコピーする
2. 判定を行うところかチェックする（画像の端、すでに白い所は無視）:isCheckValue
3. ワークと元画像の近傍を取得する
4. 白でない場所の数（0〜8）から処理を分割して、白くできる場合は白くする
5. 一旦１画像すべて走査して、どこかを変えたらもう一回やる。なかったら終了

以上です。
ここまでくれば面倒なのは、黒を１で表現しやがって、今までRGBの値でどーのこーのやってたくせにどう言うことだと言いたいテキストと４番目の関数(doesKeepConnect)の中身でしょう

```
func doesKeepConnect(srcAround, workAround Around) bool {
	flg := false
	if countConnect(srcAround) == 1 && countConnect(workAround) == 1 {
		var tmpArd Around
		isAll := true
		for i := 1; i < 5; i++ {
			if workAround[i] != 0 {
				tmpArd = srcAround
				tmpArd[i] = ex.ColorWidth
				if countConnect(tmpArd) != 1 {
					isAll = false
					break
				}
			}
		}
		if isAll == true {
			flg = true
		}
	}
	return flg
}
```
連結数は１であるか？、そのあとに上と左をぐるっと走査して連結数に変化がないことをチェックしています。この記事を書いてる時に

```
if workAround[i] != 0 {
```
が単なる高速化を目指してる気がしてきた。いらん気がする。

## 出力結果
### input
![test_vari_th.png](https://qiita-image-store.s3.amazonaws.com/0/51009/823511c3-c043-786a-e6e0-fcb988739e5b.png "test_vari_th.png")

### output
![test_thinning.png](https://qiita-image-store.s3.amazonaws.com/0/51009/2004535b-43f8-5de0-c065-c5cd9e354fd8.png "test_thinning.png")

結果、数式ってのはわかる。だんだん人工知能の匂いがしてきた気がします。
Cloud9の開発環境上でgit-ftpを設定する

最近、Cloud9上でconcrete5やWordPressの構築を行って、git-ftpで直接本番サーバーに変更をアップロードする事が多いので、
毎回やっている手順を下記にまとめました。

# Cloud9の開発環境上でgit-ftpを設定する

## git-ftpを取得する

まず、git-ftpをcloneします。
cloud9の作業ディレクトリ直下でcloneした場合は、 /home/ubuntu/workspace/ 以下にファイルがダウンロードされます。

```shell-session
$ git clone https://github.com/git-ftp/git-ftp.git
$ cd git-ftp
$ pwd
/home/ubuntu/workspace/git-ftp
```

## 取得したgit-ftpにパスを通す

### 現在の設定を確認

設定変更前はこうなっています。

```shell-session
$ echo $PATH
/home/ubuntu/.nvm/versions/node/v4.6.1/bin:/usr/local/rvm/gems/ruby-2.3.0/bin:/usr/local/rvm/gems/ruby-2.3.0@global/bin:/usr/local/rvm/rubies/ruby-2.3.0/bin:/mnt/shared/bin:/home/ubuntu/workspace/node_modules/.bin:/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mnt/shared/sbin:/opt/gitl:/opt/go/bin:/mnt/shared/c9/app.nw/bin:/usr/local/rvm/bin
```

### 設定追加

.profile に設定を追加することで $PATH を変更する事が出来ます。

```shell-session
$ vi ~/.profile
```

ダウンロード時に`pwd`で確認したパスを追加します。
追加の際、 $PATH の記述がないと、設定されていたパスが消えてしまうので注意しましょう。

```:.profile
PATH="$PATH:/home/ubuntu/workspace/git-ftp"
```

### 設定変更を反映

通常は再起動やログアウトして再ログインしないと設定が反映されませんが、
下記コマンドで設定を即時に反映出来ます。

```shell-session
$ source ~/.profile
```

### 変更後の設定を確認

```shell-session
$ echo $PATH
/home/ubuntu/.nvm/versions/node/v4.6.1/bin:/usr/local/rvm/gems/ruby-2.3.0/bin:/usr/local/rvm/gems/ruby-2.3.0@global/bin:/usr/local/rvm/rubies/ruby-2.3.0/bin:/mnt/shared/bin:/home/ubuntu/workspace/node_modules/.bin:/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mnt/shared/sbin:/opt/gitl:/opt/go/bin:/mnt/shared/c9/app.nw/bin:/usr/local/rvm/bin:/home/ubuntu/workspace/git-ftp
```

末尾に追加したパスがあれば設定完了です。

### 確認

念のため、コマンドを入力してエラーが出ないか確認しましょう。

```shell-session
$ git ftp
git-ftp <action> [<options>] [<url>]
```

## git-ftpの設定

`git config`でFTPの接続情報を設定します。
FTPSが使える場合は、URLは`ftpes://`にします。
FTPSが使えない場合は`ftp://`です。

```shell-session
$ git config git-ftp.url ftpes://<ホスト名>/<公開ディレクトリまでのパス>
$ git config git-ftp.user <FTPユーザー名>
$ git config git-ftp.password <FTPパスワード>
```

## git-ftpで本番サーバーの更新

### 初期設定

本番サーバーにファイルがない場合は、`git ftp init`で初期化作業を行います。

```shell-session
$ git ftp init
```

既に本番サーバーにファイルが存在する場合は、`git ftp catchup`で、次回のcommitからgit-ftpで更新出来るようになります。

```shell-session
$ git ftp catchup
```

### 更新

設定後は、変更をcommitした後に、`git ftp push`で本番サーバーに変更したファイルをアップロード出来ます。

```shell-session
$ git ftp push
```


## 参考にしたQiitaの記事

[Gitでサイトを更新したい！](http://qiita.com/dojineko/items/b11d279d1ff8cfacf3dc)

[UbuntuのPATHの設定方法](http://qiita.com/takanemu/items/6027291be8a2a6af9adc)
Reduxの非同期処理に、どのMiddlewareを採用するか

Reduxで非同期処理をしたい場合、Middlewareを使ったほうがいいというのはなんとなく理解したが、どのMiddlewareを使えばいいのか迷ったのでまとめてみる。
参考：[Reduxで非同期処理をしたいときに、なぜMiddlewareを使わないといけないのか](http://qiita.com/enshi/items/557dcd7df60e6128249e)


いろいろと検索してみた所、「redux-thunk」「redux-saga」「redux-promise」というのが人気らしいと判断し、それぞれのメリットデメリットを調べてみた。


#redux-thunk
ActionCreatorではActionしか返すことができなかった。
それを、redux-thunkを使うことによって関数も返すことができるようになる。

今までのようなActionを返す関数と、非同期処理をしてその結果を使って上記関数を実行する関数を返す関数。
この２種類の関数をActionCreatorに書くことで非同期処理を動かす仕組みになっている。


##所感
新たに覚えることがほとんどなく、わかりやすいと思った。
ただ、「処理が完了した後に～」と続けていくとコールバックが大量にネストされていき見づらくなりそう。

#redux-saga
1. １つのGenerator関数を実行する。
2. 初めのActionがdispatchされるまで処理をストップさせる。
3. dispatchされたら返り値を受け取って先に進む。
4. HTTPリクエストを実行し、Promiseが完了されるまで処理をストップさせる。
5. 完了したら返り値を受け取って先に進む。
6. 受け取った返り値をつかって別のActionをdispatchする。
7. 全ての処理が終わったら、また初めに戻りActionのdispatchを待つ。

上記例のように、Reduxの標準機能と関係ないところで同期的に処理をさせるGenerator関数（タスクと言う）を作成することによって、アプリケーションとして非同期処理を行う。

[redux-sagaで非同期処理と戦う](http://qiita.com/kuy/items/716affc808ebb3e1e8ac)
詳しく知りたい場合は、この記事がわかりやすい。

##所感
redux-saga独自の書き方が結構な数ある。
学習コストは高くなるが、ActionCreatorを汚さない、要件追加に対応しやすいなど
理解できれば一番見やすいコードになると思った。


#redux-promise
redux-actionsと同じ作者。

Promiseがresolve(成功)、またはreject(失敗)したらdispatchが実行される
ActionCreatorにresolve処理とreject処理を書いてあげれば、勝手に非同期で実行してくれる。

##所感
ググっても情報が少なすぎて、わからないところもあるが、
HTTPリクエスト処理をaxiosやfetchなどのPromiseに対応したパッケージを使えば、綺麗なコードになるのではと思った。


#まとめ
| Middleware | メリット | デメリット |
|:-:|:-:|:-:|
| redux-thunk  | 覚えることがほとんどない  | コールバック地獄になる  |
| redux-saga  | ActionCreatorを汚さない<br />要件追加に対応しやすい  | 学習コストが高い  |
| promise  | redux-actionsとの相性がいい  | 情報が少ない  |
Azure Resource Manager について調べるときのメモ

# 概要

Azure Resource Manager についてよく調べることがあるので、いくつか重要そうなものをまとめておく、メモ

# まとめ

## テンプレートの構造についての説明

* [Azure デプロイ用テンプレートの作成 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-authoring-templates)

## テンプレート

テンプレートは、いかにたくさんある。

* [Azure/azure-quickstart-templates: Azure Quickstart Templates](https://github.com/Azure/azure-quickstart-templates/)



## APIversion のスキーマ

テンプレートの中ででてくる、APIversionごとの、スキーマの内容を知りたいことがあるので、そんなときは、おそらく以下の場所。

* [Azure/azure-resource-manager-schemas: Schemas used to author and validate Resource Manager Templates](https://github.com/Azure/azure-resource-manager-schemas)

## Azure Linux Extensions

### CustomScript

* [azure-linux-extensions/CustomScript at master · Azure/azure-linux-extensions](https://github.com/Azure/azure-linux-extensions/tree/master/CustomScript)

# copyindex の開始点 offset の設定

```
copyindex(2)
```

詳しくは、以下のページ、日本語のものが見つかればそれを書く

* [Deploy multiple instances of Azure resources | Microsoft Docs](https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple)

# 関数などのリファレンス

* [Resource Manager テンプレートの関数 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-template-functions)

# 大量に何かをつくるとき

以下のブログがおもしろかった。
まだ読みきれてないものもあるけど、メモ。

* [大量の Azure VM を展開してみる – 一身独立して、一国独立す。](http://www.syuheiuda.com/?p=3945)
* [Azure VM に大容量ディスクを作ってみる – 一身独立して、一国独立す。](http://www.syuheiuda.com/?p=3908)

* [Azure PowerShell で多数のリソースを並列作成する – 一身独立して、一国独立す。](http://www.syuheiuda.com/?p=3641)

# リソースにタグをつける

* [論理的に整理するための Azure リソースのタグ付け | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-using-tags)

名前と値のペアを複数書くことができる。

# Microsoft.Compute/virtualMachines で指定できること

* [Create or update a virtual machine | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/virtualmachines-create-or-update#osprofile)

# ちょっと違うかもしれないが

* [Microsoft Azure でシステムを構築する際に参照すべきドキュメント【3/13 更新】 – Microsoft Partner Network ブログ](https://blogs.technet.microsoft.com/mpn_japan/2017/03/13/microsoft-azure-reference-archtecture-documents/)
swift_grammar_refs Swiftの文法を見る別の方法

https://github.com/Arczzir/swift_grammar_refs


[4_view_db_in_app_SwiftGrammarRefs_v1.zip](https://github.com/Arczzir/swift_grammar_refs/raw/master/4_view_db_in_app_SwiftGrammarRefs_v1.zip)の中にあるmacOS アプリを使って、Swiftの文法を別の方でみることができます。

![Screen Shot 2017-02-03 at 1.52.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/163219/adf12c18-d95f-8b18-cbf8-856c6a2a4b57.png)
PandocでLaTeXをWordに変換する

# LaTeXで書いた論文をWordファイルにしたい
あまり需要ないかもしれませんが，最初にLaTeXで書いた原稿をPandocつかって，Wordにしたときのはなし。

#反映される内容
数式，引用文献，式の参照等があるLaTeX原稿を変換したときに反映されるもの，反映されないものがあります。以下まとめ。
日本語の有無にかかわらず以下のようになりました。（article, jsarticle使っても同じ結果になりました）

* \ref{}は変換されずにTeXの命令がそのままWordに出力される。
* \eqref{}は変換されないで消えてしまう。
* \cite{}は変換されないで消えてしまう。
* \begin{thebibliography}で直接書いた引用は消えてしまう。

#文献引用をWordで反映させるには
参考文献はbibTeXを使って作成します。mybibfile.bibで参考文献を作ったとすると，LaTeXのソース内に以下のようなコマンドを書くと思います。

``` TeX
\bibliography{mybibfile}
```

これをPandocで処理するときに，bibファイルを指定して変換します。

```
$ pandoc --bibliography=mybibfile.bib source.tex -o source.docx
```

引用のスタイルを指定したいときはCSLファイルを適当にダウンロードしてきます。デフォルトはChicago author-dateフォーマットで著者名，年という感じで出ます。
こことかからダウンロードできます。
http://zotero.org/styles

Physical Review Lettersのスタイルを使うと，

```
$ pandoc --bibliography=mybibfile.bib --csl=physical-review-letters.csl source.tex -o source.docx
```

#参考
http://sky-y.github.io/site-pandoc-jp/users-guide/#citations
[Swift 3.0] ViewController単位で画面の向きを制御する

(おそらくSwift3.0から)デバイスの回転による画面の向きの制御を行う`shouldAutorotate`や`supportedInterfaceOrientations`が、メソッドからreadonlyのプロパティに変わりました。

ソースは[API Reference](https://developer.apple.com/reference/uikit/uiviewcontroller#symbols)の "Configuring the View Rotation Settings" のセクションをご参照ください。

したがって、ViewController単位でデバイスの回転による画面の向きを制御するには、これらのプロパティをオーバーライドしてgetで返したい値を設定することになります。
以下に、ViewControllerをPortrait固定にする例を示します。

```swift:FooViewController.swift
class HogeViewController: UIViewController {
    // 省略

    // 画面の自動回転をさせない
    override var shouldAutorotate: Bool {
        get {
            return false
        }
    }

    // 画面をPortraitに指定する
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        get {
            return .portrait
        }
    }

    // 省略
}
```
docker-fluentd-image のカスタマイズを試す

[README の How to build your own image](https://github.com/fluent/fluentd-docker-image#how-to-build-your-own-image) のところを見ながら、docker-fluentd-image のカスタマイズを試してみたメモ。

## Create a working directory

ディレクトリを作って移動。

```
$ mkdir custom-fluentd
$ cd custom-fluentd
```

手順どおり curl で fluent.conf をダウンロードしようとしたら、404 エラーになってしまった。

```
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/fluent.conf > fluent.conf
$ cat fluent.conf
404: Not Found
```

ので、fluent.conf.erb のほうをダウンロード。

```
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/fluent.conf.erb > fluent.conf
$ cat fluent.conf
(正常な設定ファイル)
```

(不要な気もするけど、元の手順に従って) プラグイン用のディレクトリを作っておく。

```
$ mkdir plugins
```

サンプルの Dockerfile をダウンロード。

```
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/Dockerfile.sample > Dockerfile
$ cat Dockerfile
(正常な設定ファイル)
```

## Customize `fluent.conf`

ダウンロードした fluent.conf には `docker.**` にマッチしてイメージ内の /fluentd/log/ にログを保存する設定が入っているので、とりあえずこの手順は飛ばす。

## Customize Dockerfile to install plugins (optional)

サンプルの Dockerfile では fluent-plugin-secure-forward をインストールするカスタマイズが入っているので、とりあえずこの手順は飛ばす。

## Build image

普通にビルド。

```
$ docker build -t custom-fluentd:latest ./
(略)
```

## Test it

ログディレクトリを作成し、そのディレクトリをコンテナにマウントした上で、ビルドしたイメージからコンテナ起動。
(元の手順にはないが、手元の環境だと root で作業していたため chmod 777 log も必要だった。)

```
$ mkdir log
$ chmod 777 log
$ docker run -it --rm --name custom-docker-fluent-logger -v `pwd`/log:/fluentd/log custom-fluentd:latest
```

うまく起動するとこんな感じのメッセージが標準出力に表示される。

```
2017-02-02 05:55:17 +0000 [info]: listening fluent socket on 0.0.0.0:24224
```

上記のコンテナを起動したままの状態で、別のターミナルに入り作業する。
上記コンテナの IP アドレスを取得。

```
$ docker inspect -f '{{.NetworkSettings.IPAddress}}' custom-docker-fluent-logger
172.17.0.5
```

fluentd をログドライバーに指定して別のコンテナを立ち上げ、ログを送ってみる。
(標準出力に出力した文字列が fluentd に送られるはず。)

```
$ docker run --log-driver=fluentd --log-opt fluentd-address=172.17.0.5:24224 python:alpine echo Hello
```

想定通りにログが出力されている。

```
$ docker exec custom-docker-fluent-logger cat /fluentd/log/docker.log
20170202T055916+0000    docker.aa89aa191723     {"container_id":"aa89aa1917230756751e0e2652c5d01783c25fa3d631ee1821d12b74637c7f00","container_name":"/boring_curran","source":"stdout","log":"Hello"}
```

今回はやらなかったけど、ログが出ない場合は元の手順に書いてある下記を試すとよさそう。

```
$ docker kill -s USR1 custom-docker-fluent-logger
```

## まとめ

とりあえず基本的なカスタマイズ手順を試すことができた。
次は [fluent/fluent\-plugin\-kafka](https://github.com/fluent/fluent-plugin-kafka) を組み込んで試してみようと思う。
リフレクションで引数名を取得するときはjavacに-parametersオプションをつける

Javaでリフレクションを利用してメソッドの引数名を取得したかったのですが、ちょっと詰まったのでメモ。

結論としてはコンパイル時、javacに**-parametersオプション**をつける必要がありました。
以下検証までの手順です。

## 問題：リフレクションで取得した引数名がargNになる
```java
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class GetArgsName {
	public static void main(String... args) throws NoSuchMethodException, SecurityException {

		Method m = Calc.class.getDeclaredMethod("add", int.class, int.class);
		Arrays.stream(m.getParameters())
			.map(Parameter::getName).forEach(System.out::println);
	}

	public static class Calc {
		public int add(int x, int y) {
			return x + y;
		}
	}
}
```

上記のプログラムで引数名を取得できると思い、実行してみたところ以下のような結果が。
```
arg0
arg1
```
引数名であるx,yを取得したかったのですが、なぜかargNで取得されました。

## 解決法：javacに-parametersオプションをつける
いろいろ調べた結果、以下のサイトにドンピシャの答えが書いてありました。
ひしだまさんにはいつもお世話になっています。笑

- [Javaリフレクションメモ(Hishidama's Java Reflection Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/reflection.html#h_parameter)


リフレクションで引数名を取得したい場合、javacに**-parametersオプション**をつける必要があるとのこと。
またEclipseで実行するときは、プロジェクトのProperties ＞ Java Compiler より以下にチェックを入れればOK。  
![Properties_for_amateras_allocate_claim_debt_fw.png](https://qiita-image-store.s3.amazonaws.com/0/41569/33bc8d0f-804e-abcd-cc15-6180b6bec23c.png)



再度実行した結果、以下のように思惑どおり引数名を取得できました。
```
x
y
```
Luigiにおけるアンチパターン

Luigiの流儀に沿わず、コードを書いてしまい、何度も書き直したため、アンチパターンをこちらにまとめておきます。

Luigiを扱う上での注意点については、下記の記事にまとめてあります。
[Luigiを扱う上での注意点](http://qiita.com/masahiro_toriumi/items/2699f8a35626768ed70f)


# 並列タスク後の直列によるタスクへの依存

## 本来作りたいもの
並列で処理回して、最後に必ずやりたい後続処理(TaskC)を実施して終了

## 出来あがるもの
TaskBが一個でも失敗したらTaskCが動かない処理

```python
from Luigi import Task, LocalTarget
from luigi.format import UTF8

class MyTask(Task):
  def output(self):
    return LocalTarget("MyTaskOut.txt", format=UTF8)

  def run(self):
    with self.input() as fin:
      yield [TaskB(data) for data in fin]

    yield TaskC() # 絶対やらなきゃいけない処理

    with self.output().open('w') as fout:
      fout.write('終わったよー')
```

# 出力ターゲットを指定しているが、ファイルを作らない処理

## 本来作りたいもの
成功した際に結果をファイルの出力して終了するタスク

## 出来上がるもの
永遠に終わらないタスク

```python
from Luigi import Task, LocalTarget
from luigi.format import UTF8

class MyTask(Task):
  def output(self):
    return LocalTarget("MyTaskOut.txt", format=UTF8)

  def run(self):
    if なんかやばい処理:
      with self.output().open('w') as fout:
        fout.write('成功した！やったね！')
    # 失敗した時はほっておこう
```

タスクを失敗させるため何か例外を起こさないとだめ。
OctaveをJupyter notebookで使う

# OctaveをJupyter notebookで使う
Courseraの機械学習コースでOctaveを使いたい。
それもできたらJupyter notebookの上で使いたい。
これがモチベーション。

環境
- macOS Serra
- Anaconda 1.5.1


```
$ conda install octave_kernel
```
ひとまずこれでJupyter notebookにOctaveが使えるようにはなる。しかし、中身のOctaveがインストールされていないのでどうにもならない。

```
$ brew install octave
You can install with Homebrew-Cask:
  brew cask install xquartz
```

xquartzが入ってないので怒られた。
指示に従ってxqurtzを入れる。

```
$ brew cask install xquartz; brew install octave
```

入った。

<img width="893" alt="Untitled1.png" src="https://qiita-image-store.s3.amazonaws.com/0/34526/e39bc1c9-ce00-b5b5-9b4a-c08a8b536502.png">
Dockerでファイル共有をするための、VirtualBoxの設定

defaultの設定を使用してwindows PCにDocker Toolboxをインストールして、その後でVirtualBoxのファイル共有の設定を見ると、Pathのところに`\\?\`という不可解な文字が入っていました。これが原因で、コンテナとのファイル共有が失敗しました。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/134781/5cf3e75f-052d-d1db-122b-697e5a304b1e.png)

以下のように変更するとファイル共有可能になりました。まずEditを選ぶと下の画面になります。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/134781/8857320c-dcc8-3fe1-6707-3ed5a40814fd.png)
`\\?\`を取り除くと、Folder Nameのところが`Users`になってしまいます。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/134781/0c1c2efe-0135-5aa3-c641-ebd5b063d45e.png)
Folder Nameを元の`c/Users`に戻します。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/134781/70e64e14-2ff2-0651-2ec7-35ce7dc2c16f.png)
OKをクリックすると下の画面になります。完成です。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/134781/ebeb9ab4-a69f-7e0f-ff58-5a9147f98406.png)
ML. Java

package samples.string.japanese;
public class ZenkakuAlphabetToHankakuAlphabet {
public static String zenkakuAlphabetToHankaku(String s) {
StringBuffer sb = new StringBuffer(s);
for (int i = 0; i < sb.length(); i++) {
char c = sb.charAt(i);
if (c >= 'ａ' && c <= 'ｚ') {
sb.setCharAt(i, (char) (c - 'ａ' + 'a'));
} else if (c >= 'Ａ' && c <= 'Ｚ') {
sb.setCharAt(i, (char) (c - 'Ａ' + 'A'));
}
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(zenkakuAlphabetToHankaku("☆Ｊａｖａプログラミング☆"));
}
}
![1486017045769.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/f92106a8-5ecd-4162-d2f4-f1b7a4706696.jpeg)
![1486017061386.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/fb3a589b-37b3-f760-b3ad-a0968cc11df5.jpeg)
![1486017076123.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/45767738-4c6e-2d0e-8a11-c6253feb6fca.jpeg)
![1486017094102.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/6ddd5db3-9e9b-319d-5009-14eea8d02c0c.jpeg)
![1486017107606.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/eaf86d59-cfea-4c6e-c9cd-b4035d7d37f9.jpeg)
![1486017120502.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/14284d83-681d-dd7e-6e35-f27c1d54b616.jpeg)
![1486017129875.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/119dedce-e991-9b2c-26bd-12d10028960e.jpeg)
![1486017146363.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/0f6aa021-ee87-88d0-f936-31f21cb58d05.jpeg)
![1486017157226.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/ca4b8bbd-cec6-c3a0-98a5-89126aa2e79a.jpeg)
![1486017167315.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/0f074b6d-4d2d-803e-c937-51dd12ccafa1.jpeg)
![1486017177744.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/f1909118-64e7-90ef-79d3-25609131c015.jpeg)
プロダクトを選定する際に参考になるサイト

プロダクトを比較選定する際に参考にしているサイトをまとめただけの記事

StackShare
https://stackshare.io/trending/tools

どこの企業がどんなプロダクトを使っているのかわかるため、同業種のトレンドなどを調べることができます。
また、そのプロダクトをどういう理由で気に入っているのかカテゴライズされているため、ざっと概要を眺めるのに、役に立ちます。
レビューは少なめです。

G2Crowd
https://www.g2crowd.com/

レビュー多めです。
2軸マトリクスなども表示されているため、自分のニーズに沿ったプロダクトを探しやすいです。

StackShareでざっと概要を掴んで、G2Croudでプロダクトをしっかり調べるという使い方がおすすめです。
make loveする

今日は皆さんと一緒にmake loveしようと思います。環境はmacです。

Love2DでAndroidとかiOSの動作確認するときに`.love`ファイルを作成するのがめんどうだったのと、Makefile使ってみたかった。

# make loveの準備

main.luaとMakefileを用意します。

こんな感じに配置してください。

```zsh
$ tree
.
├── Makefile
└── main.lua
```

```lua:main.lua
function love.draw()
  love.graphics.print('Not war.', 400, 300)
end
```

```Makefile:Makefile
love_path := /Applications/love.app/Contents/MacOS/love #適宜変更

love: /
        mkdir -p bin/
        zip -x '*~' -9 -r bin/game.love .
        $(love_path) bin/game.love
```

# make love
あとは`make love`するだけです。

```zsh
$ make love
```
<img width="912" alt="スクリーンショット 2017-02-02 14.04.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/113692/7f410685-0352-b0ab-ec8f-dbf9ee0842ee.png">

`make love`じゃなくて`make`だけでもいけるけど、そこはツッコまないください。

それではさようなら。

# おわり

なんとなく[GitHub](https://github.com/xsota/makelove)にも置いておいたので上記の作業はだるいけど`make love`はどうしてもしたいって方はどうぞ。

```zsh
$ git clone https://github.com/xsota/makelove.git
$ cd makelove
$ emacs Makefile # love_pathを編集してください
$ make love
```
「warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます」の本当の対処法

## 結論：UseDebugLibraries 属性が不足している

**プロジェクトをアップグレードすると vcxproj ファイルに本来記述されるべき UseDebugLibraries 属性が記述されないため、vcxproj ファイルをテキストエディタで開いて記述を追加する。**

```xml
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>StaticLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>StaticLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v120</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
```

## 解説

> warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 

これは古い Visual C++ プロジェクトを、新しいバージョンにアップグレードした際によく見られる警告です。

どうやら Visual C++ のアップグレード処理には不具合があるようです。新規プロジェクトではプロジェクトファイルに UseDebugLibraries 属性が適切に記述されますが、アップグレードしたプロジェクトでは省略されてしまいます。

UseDebugLibraries 属性が明記されていないと、Debug ビルドの設定と Release ビルドのデフォルト設定が混在してしまい、結果として警告が表示されます。

この背景を正しく理解するのはなかなか困難なので、どちらかのオプションを無効にする解決策を示すサイトがとても多いのですが、本当はプロジェクト設定全体に影響がある恐ろしい問題です。多分これが一番正しい対処法と思います。

## 参考

* [UseDebugLibraries and Wrong Defaults for VC\+\+ Project Properties \| Ofek's Visual C\+\+ stuff](https://ofekshilon.com/2014/06/23/usedebuglibraries-and-wrong-defaults-for-vc-project-properties/)
Machine L 

package samples.string.japanese;
public class ZenkakuAlphabetToHankakuAlphabet {
public static String zenkakuAlphabetToHankaku(String s) {
StringBuffer sb = new StringBuffer(s);
for (int i = 0; i < sb.length(); i++) {
char c = sb.charAt(i);
if (c >= 'ａ' && c <= 'ｚ') {
sb.setCharAt(i, (char) (c - 'ａ' + 'a'));
} else if (c >= 'Ａ' && c <= 'Ｚ') {
sb.setCharAt(i, (char) (c - 'Ａ' + 'A'));
}
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(zenkakuAlphabetToHankaku("☆Ｊａｖａプログラミング☆"));
}
}![1486009991676.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/8418ff7d-2b20-f76e-5c29-6d04f27ba971.jpeg)
![1486009832895.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/48622a14-9b4b-50d3-f83b-8bf1ef8d4a4d.jpeg)
![1486009850649.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/cf7b7947-fa05-8da0-c211-5014230a4611.jpeg)
![1486009868386.jpg](https://qiita-image-store.s3.amazonaws.com/0/121250/9b99e985-931b-447c-cd5a-cfe4d540aa63.jpeg)
![error]()
OpenVASがredisの不整合で起動しなくなる？

OpenVASのmanagerやscannerが何らかの原因で異常終了してしまった様な場合にOpenVASが利用しているredisのキャッシュ不整合でopenvas-scannerやopenvas-managerのサービスを再起動しても正常にサービスを起動できなくなることがあるようです。

この場合、大抵は以下の様にOpenVASのプロセスをpsで確認するとopenvassdがNVTのリロードで固まっています。

```shell:
openvassd: Reloaded all the NVTs
```

そのような場合には、以下の様にしてredisのCLIよりキャッシュを一旦消去してからOpenVASのサービスを再起動すれば治る(場合もある)ようです。


```shell:
# redis-cli -s /tmp/redis.sock
redis /tmp/redis.sock> keys *
1) "OpenVAS.__GlobalDBIndex"
redis /tmp/redis.sock> del OpenVAS.__GlobalDBIndex
(integer) 1
```
Sass(SCSS)でIEハックのmixin設定

ハック方法はこちらを参考にしました。→[Browserhacks](http://browserhacks.com/)
#設定
##SCSS
```
/* IEハック用mixin */
@mixin hack($IE-ver: null) {
  @if $IE-ver == 'lteIE8' { // IE8以下
    @media \0screen\,screen\9 {
      @content;
    }
  }
  @else if $IE-ver == 'gteIE9' { // IE9以上
    @media screen and (min-width:0\0) {
      @content;
    }
  }
  @else if $IE-ver == 'gteIE10' { // IE10以上
    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
      @content;
    }
  }
  @else if $IE-ver == 'gteIE11' { // IE11以上
    @at-root _:-ms-fullscreen,:root & {
      @content;
    }
  }
  @else if $IE-ver == 'notIE8' { // IE8じゃないとき(他のブラウザも含める)
    @media all and (min-width: 0) {
      @content;
    }
  }
}
```
#使い方
##SCSS
```
.is-lteIE8 {
  @include hack(lteIE8){ /* IE8以下 */
    color: red;
  }
}
.is-gteIE9 {
  @include hack(gteIE9){ /* IE9以上 */
    color: red;
  }
}
.is-gteIE10 {
  @include hack(gteIE10){ /* IE10以上 */
    color: red;
  }
}
.is-gteIE11 {
  @include hack(gteIE11){ /* IE11以上 */
    color: red;
  }
}
.is-notIE8 {
  @include hack(notIE8){ /* IE8じゃないとき(他のブラウザも含める) */
    color: red;
  }
}
```
##CSS(↑のコンパイル後)
```
@media \0screen\,screen\9 { /* IE8以下 */
  .is-lteIE8 {
    color: red;
  }
}

@media screen and (min-width: 0\0) { /* IE9以上 */
  .is-gteIE9 {
    color: red;
  }
}

@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { /* IE10以上 */
  .is-gteIE10 {
    color: red;
  }
}

_:-ms-fullscreen, :root .is-gteIE11 { /* IE11以上 */
  color: red;
}

@media all and (min-width: 0) { /* IE8じゃないとき(他のブラウザも含める) */
  .is-notIE8 {
    color: red;
  }
}
```
##HTML
```
<p class="is-lteIE8">IE8以下で赤くなります</p>
<p class="is-gteIE9">IE9以上で赤くなります</p>
<p class="is-gteIE10">IE10以上で赤くなります</p>
<p class="is-gteIE11">IE11以上で赤くなります</p>
<p class="is-notIE8">IE8じゃないとき(他のブラウザも含める)赤くなります</p>
```
#表示
| ブラウザ          | キャプチャー　　　 |
|:-----------------|:------------------|
| IE8で見たとき                 | ![ie8.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/65e13a17-9a99-8596-cdd9-8fc1fee9d4db.jpeg)    | 
| IE9で見たとき                 | ![ie9.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/10327037-6306-9278-c726-45c997b2e9b9.jpeg)    | 
| IE10で見たとき                | ![ie10.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/059801dd-80a9-a252-eb2f-2743f4692886.jpeg)   | 
| IE11で見たとき                | ![ie11.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/2d302b5a-6157-0785-680c-479300c1870b.jpeg)   | 
| Edgeで見たとき                | ![edge.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/b3730e12-94b2-1ad0-50d2-4d593aee05ea.jpeg)   | 
| IE以外で見たとき(これはChrome) | ![notIE8.jpg](https://qiita-image-store.s3.amazonaws.com/0/62182/cbe72238-d5af-fbd4-a6af-eccfc921c130.jpeg) |
vmkfstoolsメモ

■変換方法

vmkfstools -i monosparseDisk.vmdk -d thin /vmfs/volumes/hoge/disk.vmdk

■thin　可変長ディスク。(物理ディスク使用量を節約できる)
vmkfstools -i /vmfs/volumes/backupNFS/102/latest/XXXXXXX.vmdk -d thin /vmfs/volumes/datastore1/henkan/XXXXXXX.vmdk

■eagerzerothick　固定長ディスク。(VM運用時にディスクアクセスが高速)
vmkfstools -i /vmfs/volumes/backupNFS/102/latest/XXXXXXX.vmdk -d eagerzeroedthick /vmfs/volumes/datastore1/henkan/XXXXXXX.vmdk

■zeroedthick　固定長ディスク。(初回ディスク作成が高速)
vmkfstools -i /vmfs/volumes/backupNFS/102/latest/XXXXXXX.vmdk -d zeroedthick /vmfs/volumes/datastore1/henkan/XXXXXXX.vmdk

※NFS上で変換はしない。datastore上に変換ファイルが出力させる。
同じApache下で複数環境ごとにPHPのxdebugの設定値を変更する

ローカルでの開発時、たとえば VirtualHost とかで幾つかの擬似サイトを動かしている場合、Master Value の xdebug 設定値が全ての環境で効いてしまう。PHPStormなんか使っていると、効いて欲しくないところで中断しちゃう、とかある。

### 解決方法

各環境のドキュメントルートの `.htaccess` に、パラメタを設定すると良い。

```apache:.htaccess
php_value xdebug.remote_port 9999
```
tomcatのシェルスクリプトをjava8で実行させる

tomcatを起動してknowledge.warをデプロイするときにエラーになってしまう。

tomcatのcatalina.yyyy-mm-dd.logを見ると
***
19-Jan-2017 15:41:20.568 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.95.x86_64/jre
***
jdk1.7が使用されているようでした。
もともとインストールされていたjava7が邪魔して認識されないようです。
そこで

/opt/apache-tomcat*/bin/startup.shとcatalina.shの先頭に以下を追加。
```
JAVA_HOME=/usr/java/jdk1.8.0_73
PATH=$JAVA_HOME/bin:$PATH
```

***
19-Jan-2017 17:03:30.561 情報 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/java/jdk1.8.0_73/jre
***
上手くjava8が認識されるようになりました。
CakePHP3で多言語化する

基本的な使い方は[CakePHP2の時](http://qiita.com/ran/items/dbd183bd188ff1f10417)と変わらないのですが、少し変更点があります。(内部的にはだいぶ変わったようですが。)

## Localeコード
`eng`のように3文字のものを使っていましたが、`en`のような2文字のものを使うようになりました。

## 使用するLocaleの変更方法

```
Configure::write('Config.language', 'fr_FR');
```
とかしていたのが

```
I18n::locale('en_US');
```
のようになりました。

## Localeディレクトリの構成
```
/app/Locale/eng/LC_MESSAGES/default.po
```

が

```
/src/Locale/en/default.po
```

のようになってます。

## Validation message
CakePHP2ではModelの$validateプロパティに書いていたmessageは、そのまま

```
'message' => '選択してください'
```
とか書いていれば良かったのですが、

CakePHP3では

```
'message' => __('選択してください')
```
のように書かないといけなくなりました。(という記述を探すのに苦労しましたが、[3.0移行ガイド](https://book.cakephp.org/3.0/ja/appendices/3-0-migration-guide.html#extracttask)に書いてありました。)

上記のように書くと、`bin/cake i18n extract`で抽出されます。
これでも良いのですが、バリデーションメッセージは

```
'message' => __d('validation', '選択してください')
```
と書くようにしておけば、`bin/cake i18n extract`した時に、validation.potファイルがdefault.potと別に出力されるので、状況に応じて。

## おまけ

poファイルを変更したりした時は、`tmp/cache/persistent/` 以下のキャッシュファイルを消した方が良さそうです。

##### 参考：

- [3.0 移行ガイド](https://book.cakephp.org/3.0/ja/appendices/3-0-migration-guide.html)
- [国際化と地域化](https://book.cakephp.org/3.0/ja/core-libraries/internationalization-and-localization.html)
- [I18N シェル](https://book.cakephp.org/3.0/ja/console-and-shells/i18n-shell.html)
- [定数および関数 - グローバル関数](https://book.cakephp.org/3.0/ja/core-libraries/global-constants-and-functions.html#id2)
XMLツリーをファイルに出力

よく忘れるのでメモ
docを受け取ってfileにxmlとして出力する方法

```java
public static void export(Document doc, File file) throws TransformerException {
    TransformerFactory transFactory = TransformerFactory.newInstance();
    Transformer transformer = transFactory.newTransformer();
    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    Source src = new DOMSource(doc);
    Result result = new StreamResult(file);
    transformer.transform(src, result);
}
```
Kotlinでdata classにParcelerを使うときはParcelConstructorが便利

# Parcelerとは

例えばActivityから別のActivityに自分で作ったクラスのオブジェクトを渡したりするとき、そのクラスにParcelableを実装する必要がありますが、それが結構面倒で、かつクラスの要素を変更したら、Parcelableの実装もきちんと追従しないとオブジェクトの中身が適切に渡せなかったりします（Androidで昔からある機能なので、詳細は検索したり、[こちら](http://y-anz-m.blogspot.jp/2010/03/androidparcelable.html)を参照してください）。

そのParcelableを簡単に実装できるライブラリが[Parceler](https://github.com/johncarl81/parceler)です。

ちなみに、似たようなもので[PaperParcel](https://github.com/grandstaish/paperparcel)というライブラリもありますが、今回はParcelerの話をします。また、旧アノテーションプロセッサを用いた方法となります。

```
kapt {
    generateStubs = true
}
```

# Kotlinで書くときの問題

以下の記事に書いてある問題があり、その解決通りに変更すれば動きます。

[KotlinでParcelerを使う話](http://qiita.com/kazhida/items/a085d5c662ce03bd5696)

要はkotlinのdata classを作っても、引数なしコンストラクタが必要なのでParcelerのためにそれを定義してやる必要があるということです。そしてこれは、Parcelerのために書かれていることが分かりにくかったり、privateにしても、そのdata classをプロパティに持つ別のdata classがあったら引数なしコンストラクタをpublicにせざるを得ないという問題がありました。

```Foo.kt
@Parcel
data class Foo(
        val id: Int,
        val hoge: String,
        val huga: List<String>
) {
    constructor() : this(0, "", emptyListOf()) // Barクラスの引数なしコンストラクタで使いたいのでprivateにできない
}
```

```Bar.kt
@Parcel
data class Bar(
        val hoge: Foo,
        val fuga: String,
        val piyo: List<String>
) {
    private constructor() : this(Foo(), "", emptyListOf()) // FooはpublicでBarはprivateという違和感
}
```

引数なしコンストラクタからthisに適当な値をそれぞれ入れてやるのも面倒です（よく忘れたり、順番変えておかしくなる）。

また、引数なしコンストラクタの代わりにデフォルト値をもたせてもいいのですが、不要なときはなるべくもたせたくありません。

# ParcelConstructorとParcelPropertyを使う

Parcelerのドキュメントに書かれている`@ParcelConstructor`と`@ParcelProperty`をつか合うことで回避することができました。

```Foo.kt
@Parcel
data class Foo @ParcelConstructor constructor(
        @ParcelProperty("id") val id: Int,
        @ParcelProperty("hoge") val hoge: String,
        @ParcelProperty("fuga") val fuga: List<String>
)
```

プライマリコンストラクタに`@ParcelConstructor`をつけて、初期化時にこのコンストラクタを使うようにします。また、各プロパティに`@ParcelProperty(:name)`をつけてあげましょう。

これならプライマリコンストラクタしか必要ないし、デフォルト値も不要で、Parcelerに関係するものはアノテーションで明示されているので、分かりやすくなったのではないでしょうか。

# 独自のParcelConverterを使っていた場合

[ThreeTenABP](https://github.com/JakeWharton/ThreeTenABP)のZonedDateTimeをParcelerで扱うために、独自のConverterを書いていたのですが、これがうまく組み合わせられませんでした。具体的には、実行時にエラーが発生します。

```Foo.kt
@Parcel
data class Foo @ParcelConstructor constructor(
        @ParcelProperty("id") val id: Int,
        @field:ParcelPropertyConverter(ZonedDateTimeParcelConverter::class)
        @ParcelProperty("hoge") val hoge: ZonedDateTime
)
```

ということで、module単位でParcelConverterを定義する方法で回避しました（ParcelConverterが一つしかないなら、`@ParcelClass`でもいいです）。

```App.kt
@ParcelClasses(
        ParcelClass(value = ZonedDateTime::class, annotation = Parcel(converter = ZonedDateTimeParcelConverter::class)),
        ...
)
class App : Application() {
    ...
}
```

間違いや改善案等ありましたら、優しくご指摘いただけると嬉しいです。
CentOS6 のネームサーバの設定を変更したら SSH でのログインがやたらと時間がかかるようになった


## 条件
* ラック内に BIND サーバ群を立てていたが、老朽化に伴い廃止
* ラック内の外部サービス提供用のサーバはネームサーバとして上記サーバ群を参照していた
* 移行先はデータセンタが提供しているネームサーバを利用することにした

## 状態
* ssh ログインするとコマンドを受け付けるようになるまですごく時間がかかる
* yum などを使うと探すのにやたらと時間がかかる
* `ping yahoo.co.jp` は遅延もなく普通に通る

## 解決策
以下の記述を追記する。

```/etc/resolv.conf
options single-request-reopen
```

追記位置はどこでもいいらしいけど、個人的には先頭に書いておいた(今後忘れないように)。
特にネットワーク等を再起動させる必要はない。
`options single-request-reopen` ではなく `options single-request` でも良いらしい。

## 原因
`/etc/resolv.conf` などにネームサーバの IP を複数書いてある場合、 CentOS6 では名前解決をする際に書いてあるサーバすべてに *同時に* 問い合わせをする。
名前解決には 53 番のポートを利用するというのは周知のことだけど、ファイアウォールによっては、同一ポートからの通信があるとうまく処理できないらしい。
それで `options single-request-reopen` と書くことで、 *同時に* ではなく、 *順次に* 問い合わせするようになるそうだ。
詳しいことは、どこかにお任せします。

## 蛇足
調べてみると `ping` は名前解決で遅延しないらしいが、 `curl` なんかはするそうだ。
ネットワーク周りの設定を変更した時、とりあえず `ping` っていう習慣になっていたので、まんまと罠にはまった格好。
設定変更したサーバはウェブサーバだったので、基本的にサービスとして名前解決をすることがなく、なかなか顕在化しなかった。
SSH が遅いのはたまたま調子が悪いのかな？くらいしか思ってなかったけど、いくつかのサーバが同じ状況になったので、慌てて調べてみたところ CentOS6 特有の問題があることが発覚した。
CentOS5 まではそもそも問い合わせを順次実行していたらしい。
AWS ELBで5XXが出たときの調査

# やりたいこと
CloudWatchでHTTPCode_ELB_5XXを検知したときの調査方法

# 前提
事前にアクセスログを有効化しておく
http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-access-logs.html

# 調査方法

## ログの取得
上記で設定したところからログを取って来る。
容量に注意しつつ s3cmd get とかで。

## 内容確認
取得したログを適当にまとめて以下のような形で確認。
該当件数を事前に見る...一応。
```
awk '{if($8 != "200")print }' elblog.tsv |wc -l
awk '{if($8 != "200")print }' elblog.tsv
```

なおELBのステータスコードは8番目

|index| 内容 |
|:--|:--|
|$1  |timestamp   |
|$2  |elb   |
|$3  |client:port   |
|$4  |backend:port   |
|$5  |request_processing_time   |
|$6  |backend_processing_time   |
|$7  |response_processing_time   |
|$8  |elb_status_code   |
|$9  |backend_status_code   |
|$10 |received_bytes   |
|$11 |sent_bytes   |
|$12 |リクエスト   |
|$13 |user_agent   |
|$14 |ssl_cipher   |
|$15 |ssl_protocol   |

http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/access-log-collection.html#access-log-entry-format
に書いてあるのだけど、毎回エクセルに上記みたいなテーブルを作って確認してたのでメモとして。
UnityProの購入について

# 概要
会社のアカウントで、UnityPro購入したので、その際のメモ


## アカウント状態
管理用アカウントが１つ
個人アカウントが複数

# 実現できたこと

* 管理アカウントで会社組織作成
* 個人アカウントを組織に招待
* 個人アカウントにUnityProライセンスを付与

# 方法

## 1:組織作成
管理アカウントでログインし、組織作成する
（https://id.unity.com/ja/）

## 2:グループに個人アカウントを招待
メンバー＆グループでメンバーを追加する
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/24266/9f3ab300-aaa6-88c9-deff-175179551941.png)

## 3:UnityProの購入
サブスクリプションから、個人アカウント数だけ購入する。

## 4:UnityProのライセンスを個人アカウントに付与
シートの管理からシートの割り当てを行うことでできる
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/24266/44e77ffe-4c89-217b-735e-0eab9cc0ffe5.png)

## 5:UnityProライセンスをUnityアプリケーションで認証
Unityアプリケーションを開いて、ライセンス認証
windowsの場合
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/24266/e40f4eac-e78f-5d80-4c43-25870c8239b6.png)
Manage License...を押す
そして、Active New Licenseを押す
ライセンスキーの入力する。ライセンスキーは招待したメールに来てます

## 6:動作チェック
試しに、プロジェクトをビルドして、スプラッシュスクリーンの表示からPersonalが消えてるのを確認するのが簡単だと思います

# その他
購入するライセンス数に、管理者アカウントを含めないこともできそうです。
ただ、アセットを社内で共有したい場合は、管理者アカウントで購入し、ログインするのでめんどうですね。。。みなさんはどう運営してるんですか？？？
Ubuntuのlocaleを変更する

Ubuntuのlocaleを変更しようとして、ググって実行したがうまくいかなかったので、備忘録として残しておきます。

```
LANG=ja_JP.UTF-8
```

このコードで、うまくいかなかったので別の方法を試してみた。

```
$ printenv
```

prinenvコマンドを実行して環境変数の表示を行ってみたところ、LANG変数がなく代わりにLANGUAGE変数が存在していた。

```
LANGUAGE=en
LIBGL_ALWAYS_SOFTWARE=1
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
UPSTART_INSTANCE=
LESS=--no-init
UPSTART_EVENTS=xsession started
XDG_SESSION_DESKTOP=ubuntu
LOGNAME=kohei
COMPIZ_BIN_PATH=/usr/bin/
QT4_IM_MODULE=xim
・・・
```

この場合、LANGUAGE変数を上書きしてしまえばいい

```
$ LANGUAGE=ja
```

ただ、このままだとbashを終了すると設定は全て消えてしまいます。
次回以降もログインした時に同じ設定にするには、bashの設定ファイルを記述すれば大丈夫です。

設定ファイルには 「.bash_profile」と「.bashrc」がありますが、基本的には「.bashrc」に記述すれば問題ないです。

```
$ vim ~/.bashrc
```

コマンド実行後、末尾に「LANGUAGE=ja」の記述をしてあげれば、次回ログインした時も日本語設定になっています。
rails g で Expected string default value for '--helper'; got true (boolean) 

rails g を実行すると以下の警告が表示される


```
Expected string default value for '--helper'; got true (boolean)
Expected string default value for '--assets'; got true (boolean)
Expected string default value for '--decorator'; got true (boolean)
Expected string default value for '--decorator'; got true (boolean)
Expected string default value for '--jbuilder'; got true (boolean)
```

thor の0.19.2以降で仕様が変わったのが原因、らしい。
(0.19.2では例外が発生する)

以下追加（or更新)で bundle update thor & bundle rails gで発生しなくなった

```rb:Gemfile
gem "thor", "0.19.1" 
```

特に問題なさそうだけど気になったので変更した。

関連する Issue

https://github.com/rails/rails/issues/27229
React NativeプロジェクトでFlowのよる型チェックが「Flow: Waitng for diagnostics」と表示され実行されない場合の対処方法


# 概要

React NativeのプロジェクトをReact Native CLIで新規作成し、[Nuclide](https://nuclide.io/)で開発を始めると以下のように「Flow: Waitng for diagnostics」と表示されFlowによる型チェックが実行されませんでした。

![Kobito.KlbxZW.png](https://qiita-image-store.s3.amazonaws.com/0/43438/5be1d003-4fd1-5f9a-536b-282df93d396a.png "Kobito.KlbxZW.png")


この記事は型チェックが正常に動くまで行ったことのメモです。

# 対処方法

## 1. Flowのバージョンを最新に更新

Flowのバージョンが`0.37.4`であったので最新に更新します。

```bash
$ brew upgrade flow
$ flow version
Flow, a static type checker for JavaScript, version 0.38.0
```

**Flowのバージョン最新にした結果問題は解決せず、Flowのバージョンが問題ではありませんでした。**

## 2. .flowconfigを更新

ReactNativeプロジェクトの`.flowconfig`を確認します。今回作成したプロジェクトでは以下のようになっていました。

```:.flowconfig
[version]
^0.36.0
```

どうやら`.flowconfig`で指定したバージョンとローカルにインストールしたFlowのバージョンが異なっていたのが原因のようです。

指定するバージョンを`^0.38.0`に変更します。

```:.flowconfig
[version]
^0.38.0
```

Nuclideをリスタートすると正常に型チェックが動作しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/43438/0eb36cec-505e-8c5b-7b73-1b0be001c444.png)

# まとめ

- .flowconfigでFlowのバージョンを指定する場合ローカルのFlowのバージョンと合わせる
- Flowのバージョンが古い事は直接の原因では無かったが、常に最新のバージョンを使う用にする
	- 問題が発生した時に原因を切り分けやすくなる

# 参考
- https://facebook.github.io/react-native/docs/getting-started.html
【iOS】ViewController 最前面のViewControllerの取得方法

最前面のViewControllerを取得する方法を一部書きます。



~~~ Objective-C
// 一番最初に呼ばれるViewController
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

// 最前面のViewControllerを取り出す
while (topController.presentedViewController) {
    topController = topController.presentedViewController;
}
~~~

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
機械学習論文読みメモ_37


[Variational Information Maximisation for Intrinsically Motivated Reinforcement Learning](https://papers.nips.cc/paper/5668-variational-information-maximisation-for-intrinsically-motivated-reinforcement-learning.pdf), NIPS2015
相互情報量は様々な領域で用いられるコアとなる統計量である。
相互情報量に関する最適化は主にBlahut-Arimoto algorithmを用いる。
このアルゴリズムは例えば、入力に対して圧縮された出力を、入力との誤差を最小化しつつ得るための、逐次最適化手法であり、相互情報量に基づいた考え方に基づいている。
しかしながらこの手法は指数的なcomplexityを持つために、昨今の大規模な最適化問題には適用が難しい。
本論では、deep learning及び変分推論の理論を用いて、この手法に対するスケーラブルな最適化手法を提案する。
ここでは強化学習の文脈で提案されているempowermentの理論を用いた学習手法を適用する。
この理論は環境からの利得が得辛い場合に、agent自身に内在する動機、hunger, boredom, curiosityなど、を定義し探索を可能にする考え方に基づく。
そのような内在的な動機を定義するにあたり、empowermentはagentがどれだけ環境に影響を与える、コントロールする事が可能かを、行動とそれによる将来状態の間の相互情報量にて測り、それを最大化する事を動機とする。
この考え方は、生物界においても、同様に環境に対するコントロール性（empowerment?)を最大化する行動様式が見られる事から提案されている。
提案手法ではこの相互情報量の変分下界をCNNを用いた最適化にもとづいて学習する。

[Column Selection via Adaptive Sampling](https://papers.nips.cc/paper/6011-column-selection-via-adaptive-sampling.pdf), NIPS2015
巨大データ行列に対して、例えばsparse PCAのように、より少ない部分列を選択して表現し直す問題をcolumn subset selection problem(CSSP)と呼ぶ、
本論では特に逐次的な手法に注目し、active learningの考え方を取り入れて各ステップにおいて今までのステップで選択した来た部分列にもとづいてadaptiveに新たな部分列を選択していく手法を提案する。
特に各ステップにおけるresidualは、今まで選択してきた部分列では表現できない部分を計算し、それを用いて次の部分列を計算する。
この手法はrelative-error column selectionに関する手法すべてに適用可能である。
この手法を適用する事でよりタイトなboundが導出可能である。

[Hidden Technical Debt in Machine Learning Systems](https://papers.nips.cc/paper/5656-hidden-technical-debt-in-machine-learning-systems.pdf), NIPS2015
機械学習は複雑な予測モデルの構築をいち早く行うために便利な道具である。
しかしながら、これらを導入するためには大きなメンテナンスコストを支払う必要がある。
本論では機械学習特有のこうしたコストについていくつか論じる。
システムレベルにおいては、従来システム間の独立性を保つ事が、その後の改良、保全時に効率的だが、機械学習システムにおいては、その独立性を保つ事が難しい。
これは機械学習システムが、それ自身だけでなく外部データに依存する事より明らかである。
あるいは、機械学習システムは入力された信号を行列演算により混ぜ合わせて利用するために、各信号を分離、変更する事は全体への影響なしに不可能である。
他には、ある問題を解くモデルを少し変更して似た問題を解きたい場合に、そのモデルの出力を用いてカスケード的にモデルを追加して解く場合が多い。
しかしこの手法を機械学習システムに適用するとモデル間の依存性が強くなり、独立性の担保は難しくなる。
さらに、機械学習システムがdeclareされていないユーザーに利用可能な場合で、そのユーザーが機械学習システムの出力を別のモデルの入力に用いる場合、そこには隠れたカップリングが発生する事となり、これは大きなリスクになりえる。
機械学習論文読みメモ_36


[Optimal Ridge Detection using Coverage Risk](https://arxiv.org/pdf/1506.02278.pdf), NIPS2015
Density ridge検知問題に関して誤差測度として利用可能なcoverage riskコンセプトを提案する。
Density ridge検知問題では、ある空間における高密度領域を１次元曲線を用いて表示する事を目的とする。
従来手法では、mean shift algorithmを修正し、局所的な幾何構造を取り入れたsubspace constrained mean shift(SCMS)が提案されている。
Mean shift algorithmは各点を近傍点群平均値へ近づけていくアルゴリズムである。
SCMSは代わりに、勾配空間上をリッジへ到達するまで移動させる手法となっている。
SCMSはカーネル密度推定に基づいているために、バンド幅パラメータの設定が必要になってくる。
このパラメータ設定は重要で、適切でない値を用いると適切なリッジをうまく検知する事が出来ない。
本論ではこの問題に対処するために、coverage riskを提案する。
これは推定したリッジ曲線の近傍に真のリッジ曲線が含まれているかどうかのリスクを計算する。
この値はdata splittingやsmoothed bootstrappingにより推測可能で、これを最小化するようなハイパーパラメータを選択すれば良い事になる。

[A Nonconvex Optimization Framework for Low Rank Matrix Estimation](https://papers.nips.cc/paper/5733-a-nonconvex-optimization-framework-for-low-rank-matrix-estimation.pdf), NIPS2015
非凸最適化を通じた低ランク行列復元を考える。
凸最適化と比較し、実用的な性能は高いが、理論的な解析は限定的である。
本論では、projected oracle divergenceを定義し、それにより非凸最適化が全体最適へ収束するための十分条件を構築した。
ここでprojected oracle divergenceは非凸最適化を含む一般的な最適化手法においてその進展を評価する事ができる。
この十分条件によれば、gradient descent, coordinate descentなどの手法が、全体最適な低ランク表現を獲得できる事が分かった。

[Fast and Accurate Inference of Plackett–Luce Models](https://papers.nips.cc/paper/5681-fast-and-accurate-inference-of-plackettluce-models.pdf), NIPS2015
ペアワイズ比較や部分的なランキング情報を用いた推論は色々な領域で必要になってくる。
この時の一般的な公理として過程されるのがLuce’s choice axiomである。
この公理はある２つのアイテムに関するオッズは、それ以外のアイテムに依存しないというものである。
この公理にもとづいて、k-wayランキング問題に対するモデルであるPlackett-Luceモデルが提案されている。
このモデルに関して、ML推定値が、観測された選択に関するマルコフ連鎖の定常分布で表せる事を示す。
またこの２つのつながりから、マルコフ連鎖の観点からspectral methodによりML推定を解析し、新たなエラーレートを導出した。
加えて、spectral algorithmをchoice modelに適用する手法を提案、厳密にマルコフ連鎖を定義する事で、計算コストを増やすことなくより良い性能を得る事が出来た。
また提案手法を少し修正する事でiterativeな手法に拡張し、それはML推定値に収束する事を示した。