OmniAICreator/Qiita-1.07M huggingface dataset:
【爆速3分】WindowsにLinux（WEBとDBサーバー）を入れてWordpressを立ち上げる

# カップラーメンを作ってる間に、WindowsへLinuxサーバーを立ち上げてWordpressをインストールする方法

[![カップラーメンを作ってる間に、WindowsへLinuxサーバーを立ち上げてWordpressをインストールする方法 ](http://img.youtube.com/vi/9QI9JXlFb3A/0.jpg)](http://www.youtube.com/watch?v=9QI9JXlFb3A)
クリックで動画が再生されます

## 立ち上げ後は、Windowsのディレクトリに設置したWordpressのフォルダのファイルを変更すれば即座にサーバーに反映されます。

## PHPのデバッグ機能であるxDebugも動作しており、127.0.0.1の9000番ポートに接続するとリモートでバッグが利用可能です
※Wordpress以外にも汎用的に利用が可能

-----

## ● [Dockerfileは、こちら(GitHub)](https://github.com/maemori/accon/blob/master/docker/ubuntu-nginx-phpfpm-redis-mysql/Dockerfile)

## ● [Dockerfile一式は、こちらからダウンロード](https://kurobuta.jp/download/get/15)

-----

# 導入手順

## 1. Dockerのインストール
https://www.docker.com/products/docker

## 2. Wordpressの取得とファイルの展開
https://ja.wordpress.org/

## 3. 取得したWordpressの圧縮ファイルを展開してホームディレクトリに配置

## 4. Dockerコンテナの取得と起動

### 4.1 Windows用
```bash:
docker run -d `
 -v $home/wordpress:/develop/www:rw `
 -p 80:80 `
 -t -i `
 -h wordpress-server-01 `
 --name wordpress-server-01 `
 accon/ubuntu-nginx-phpfpm-redis-mysql
```

### 4.2 Mac用
```bash:
docker run -d \
 -v ~/wordpress:/develop/www:rw \
 -p 80:80 \
 -t -i \
 -h wordpress-server-01 \
 --name wordpress-server-01 \
 accon/ubuntu-nginx-phpfpm-redis-mysql
```


※ Wordpressの設置後に「docker run」を実行してください

## 5. Wordpressのインストール

### 5.1. 「[http://127.0.0.1](http://127.0.0.1)」にアクセス

### 5.2. 「さあ、始めましょう !」ボタンを押す

### 5.3. 「データベース接続」のための詳細を入力

* データベース名: development
* ユーザー名: Develop
* パスワード: Temporary_Password
* データベースのホスト名: 127.0.0.1
* テーブル接頭辞: wp_

### 5.4. 「インストール実行」ボタンを押す

### 5.5. 「必要情報」の入力

* サイトのタイトル: Wordpressカスタマイズ環境構築のデモ ・・・任意
* ユーザー名: wordpress_admin ・・・任意
* パスワード: Develop_$Temporary^Password ・・・任意
* メールアドレス: develop@example.jp ・・・任意

「Wordpressのインストール」ボタンを押す  
※画面が切り替わらない場合、ブラウザの再読込を行ってください

## 6. 動作確認

### 6.1. 「[管理画面（ダッシュボード）](http://127.0.0.1/wp-admin/)」にアクセス

### 6.2. 「[フロント画面](http://127.0.0.1)」にアクセス

## 7. デバッグ

xDebug用にIPエイリアスを割り当てる

* Macの場合
```
sudo ifconfig lo0 alias 10.254.254.254
```

* Windowsの場合は、ネットワークと共有センターから

-----

## よく使うDockerコマンド

* コンテナのコンソールに接続
```bash:
docker exec -it wordpress-server-01 bash
```

* コンテナのストップ
```bash:
docker stop wordpress-server-01
```

* コンテナの削除
```bash:
docker rm wordpress-server-01
```

* コンテナの再開
```bash:
docker start wordpress-server-01
```
キノコ困った Pepperのタブレットが期待のWiFiに接続されていない

#タブレットのWiFiは別
Pepperのネットワークは、本体とタブレットで別ものです。通常は同じネットワークに繋がるのかと思います。
ただ、タブレットで通信をするアプリを作ったときに、PC上で擬似的に動かしたときは動くのに、Pepperにインストールしたら動かなくて、少しはまった。

#タブレットのWifiを設定するには
1. ターミナルなどからsshでPepperに接続します。
2. cd /var/www/apps/j-tablet-browser/ に移動
3. adbコマンドでWifi設定画面を起動する

`./adb shell am start -a android.intent.action.MAIN -n com.android.settings/com.android.settings.Settings$WifiSettingsActivity`

キノコでも設定することができましたが、しくじると不具合を起こす可能性があるので
自己責任でご注意を。

ロボットの本P.269にも載ってます！
http://robotstart.info/2016/06/25/robot-no-hon-love.html
WeakSet で GC されたかチェックできる

こういうことができた

```javascript
var a = {a: 1}
var b = {b: 1}
var s = new WeakSet()
s.add(a)
s.add(b)
s
// WeakSet {Object {b: 1}, Object {a: 1}}


//一度 developer tools を閉じてからまた開く

s
// WeakSet {Object {b: 1}, Object {a: 1}}

a = null
s
// WeakSet {Object {b: 1}, Object {a: 1}}


//一度 developer tools を閉じてからまた開く

s
// WeakSet {Object {b: 1}}
// ↑ a が消えてる
```

`a` と `b` にオブジェクトをセットして、 WeakSet にもいれておきます
`a = null` でオブジェクトの参照が無い状態にして developer tools を再起動すると、参照がなくなって GC で消えた `a` が WeakSet からも消えています

Chrome は developer tools の再起動で GC されてるみたい
Firefox は developer tools 再起動しても GC されないみたいなので about:memory から GC したら消えた
Edge はまず WeakSet の中身をみれない

「このオブジェクト、ちゃんと GC されてるの？」ってときに使えるかも
展示会とかで役立つ自動入力ブックマークレット

入力欄にプチプチ入力してるうちに見学者が離れていったり、、、ということがないように、ささっと入力するブックマークレット。当然ながら、展示会に限らず定形処理とかでも使えます。

```
javascript:(function(){document.getElementById("message-composer").value="Hello, World";})()
```

自動入力だと「なーんだ、紙芝居じゃん」みたいになってしまう人向けに、Ctrl+Cをするとクリップボードに値が入る、ということもできます。たまに見かける、コピペ用のメモ帳を裏で開いてるのよりスマートかと。

```
javascript:document.addEventListener('copy', function(e) {;e.preventDefault();e.clipboardData.setData('text/plain', 'Hello, World');});
```

どんな値がクリップボードに入ったか不安、というときのためにプロンプトを出すバージョンがこちら。

```
javascript:document.addEventListener('copy', function(e) {var data = window.prompt("copy","Hello, World");e.preventDefault();e.clipboardData.setData('text/plain', data);});
```
Google Cloud Datastoreの結果整合性を観察してみた

## Datastoreと結果整合性

私のようにRDBMSに慣れきったエンジニアには意外なことですが、Datastoreでは格納したデータがすぐに取り出せない状況があり得ます。もちろん一度格納したデータの永続性は保証されているわけですが、自分がたった今書き込んだデータが直後に取り出せなかったり、古いデータを取り出してしまう可能性があるのです。このような一貫性モデルを結果整合性（Eventual Consistency）と呼びます。

RDBMSで言えば、マスタースレーブ構成のときにスレーブからデータを読み込む状態に近いと言えるでしょう。スレーブから読み込んだデータは最新のデータとは限らないわけですが、これを忘れるとレプリケーション遅延が大きいときだけ再現するイヤなバグの原因になってしまいます。

Datastoreの一貫性モデルについては下記の公式ドキュメントが参考になります。

- [Google Cloud Datastore での強整合性と結果整合性のバランス  |  Cloud Datastore のドキュメント  |  Google Cloud Platform](https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/)

上の文書にもある通り、Datastoreからの読み込みはクエリの種類によって強整合性が保証されているものと結果整合性が適用されるものとに分かれています。

| Cloud Datastore API   | エンティティ値の読み取り | インデックスの読み取り |
|:----------------------|:--------------------|:-------------------|
| グローバルクエリ　　　　　       | 結果整合性 ①          | 結果整合性 ②        |
| キーオンリークエリ 　　　　　　　　　　　　　　　　| N/A                 | 結果整合性           |
| 祖先クエリ              | 強整合性 ③           | 強整合性            |
| キーによる検索（get()）  　　　　| 強整合性 ④           | N/A                |

これによれば、キーを明示的に指定した検索と祖先指定ありの検索は常に最新の結果が取得できる（＝強整合性）ことがわかります。それ以外の通常のクエリは最初に紹介したように最新の結果が得られるとは限りません。

## いま格納したデータが検索できない状況を観測してみる

しかし、趣味プログラマがGAEで遊んでいる程度の範囲だと結果整合性による影響の実感はないかもしれません。そこで、Datastoreに登録した直後に同じデータが検索できるかどうか、次の4つの場合について実験してみました。これらは上の表の①〜④に対応しています。

1. 通常クエリ
    - `datastore.NewQuery("testkind").Filter("name =", uniqueName)`
2. プロジェクションクエリ
    - `datastore.NewQuery("testkind").Project("value").Filter("name =", uniqueName)`
3. 祖先クエリ
    - `datastore.NewQuery("testkind").Ancestor(ancestorKey).Filter("name =", uniqueName)`
4. キー指定でのエンティティ取得
    - `datastore.Get(ctx, k, &d)`

それぞれ数千回ほど試行してみましたが、①と②についてはときどき最新のデータが読み取れないことがありました。その場合も、大抵は数回のリトライで正しいデータが取得できていました。これらについては一貫性モデルが結果整合性であることが確認できたわけです。

とはいえ、格納したデータが即座に読み取れない状況は100回試して1回起こるかどうかくらいの頻度でした。GAEをお試しで使っているくらいの段階では一貫性モデルの違いについて実感がなくても不思議はないと言えそうです。

また、③と④については必ず最新のデータが取得できました。少なくとも実験の範囲では強整合性に矛盾しない結果が得られたわけです。

下記に、上の実験を100回行ったときの読み込み時間をまとめました。①と②はリトライの時間も含んでいます（100回のうち①で1回、②では2回リトライが発生していました）。こうして並べてみると、祖先クエリは整合性担保のために遅くなることがあるのかもしれません。

|   | 最短[ms] | 平均[ms] | 最長[ms] |
|:--|--------:|--------:|--------:|
|①通常クエリ                | 15.95   | 18.91  | 52.63  |
|②プロジェクションクエリ        | 14.56   | 18.03  | 55.75  |
|③祖先クエリ                | 17.05   | 21.92  | 118.38 |
|④キー指定でのエンティティ取得  | 16.56   | 18.91  | 28.61  |

今回実験に利用したGAE/Goのアプリケーションは下記URLに公開してあります。また、実験は東京リージョンで行いました。再現実験をしたい方はご利用ください。

- https://github.com/hnw/gae-datastore-consistency

# 参考URL

enakai00さんがGCE+Datastore環境でほとんど同じ実験をされています。私の実験結果に比べると直後にデータが取得できない頻度が高そうですが、リージョンの違いなのか、GAEとGCEでの違いなのか、何らかの環境の差だろうと想像しています。

- [Cloud DatastoreのEventual Consistencyに関するメモ（google.cloudクライアント編） - めもめも](http://enakai00.hatenablog.com/entry/2016/10/26/100015)
Linuxで、常に「Copy on Selection」

# 動機

`Terminator` というソフトで、「Copy on Selection」機能を使って、WindowsのTeratermのようにテキストを選択したら自動的にクリップボードにコピーされるようにしていた。

が、先日のアップデートから？この機能がちょっと使いにくくなった。

テキスト選択中に画面が更新されると、更新後の画面にあるテキストをコピーしに行くようになった。そのため、画面スクロールなどすると意図しないテキストをコピーするようになり、非常に不便だった。

# Linuxのクリップボードについて

ちょっと調べたら、Linuxのクリップボードは3種類あり、「Primary」「Secondary」「Clipboard」がある。
これらの役割は

- Primary: X11により、何かテキストを選択した時に自動的にコピーされる領域
- Secondary: 不明
- Clipboard: GUIアプリケーションにより、C-cでコピーされる領域

となっているので、「Primary」と「Clipboard」を同期させれば、常に「Copy on Selection」が実現できるのではないかと考えた。

参考 http://unix.stackexchange.com/questions/139191/whats-the-difference-between-primary-selection-and-clipboard-buffer

# やったこと

`xsel` のマニュアルにある通り、 

- `xsel -o` で 「Primary」をPaste
- `xsel -bi` で 「Clipboard」にCopy

できるので、

```bash:~/.xinitrc
bash -c 'while true; do xsel -o | xsel -bi; sleep 0.5; done'  &
```

として、Primary と Clipboard を同期させた。

また、Vimからもシステムのクリップボードにコピーしたいので

```vim:~/.vimrc
vmap <C-c> :w !xsel -i<CR><CR>
```

とした。

# 結果

これによって、どのアプリケーションでも「Copy on Selection」が実現されるので、例えばChromeでも選択した瞬間にコピーされることになる。
これまでは[autocopy](https://chrome.google.com/webstore/detail/auto-copy/bijpdibkloghppkbmhcklkogpjaenfkg?hl=en)を使っていたがアンインストールできた。

# 追記

Mozcで変換していると、全てクリップボードに入ってきて使いづらくて仕方なかったので、止めた。
その代わり、 `Shift + Insert` で `prymary` クリップボードの内容を挿入できるので、それで十分になった。
Paper Plane xUI で peco を使ってフォルダ配下を検索


[Paper Plane xUI(PPx)に一発でソースコード検索&amp;表示できる「peco」改を移植した - Qiita](http://qiita.com/wordijp/items/057f71d78384030a1a55) に触発されて考えていたら昔やりたかったことができるようになった話。

やりたかったのは、howm のファイルをインクリメンタルサーチしたいというもの。
以下のスクリプトを `*script ppxpero.js9,C:\User\hokorobi\howm,^^=\s` と実行してやると、howm のタイトルが peco に列挙されるので migemogrep で migemo も使える。（コマンドプロンプトでは ^ がエスケープ文字なので二個続ける）
`*script ppxpero.js9` で 「peco」改のようにも動く。

``` js:ppxpero.js9
//!*script
// ディレクトリ配下のファイルを peco で選択してエディタで開く
// PPx 1.53+3 x64 + Script Module R16

var args = PPx.Arguments;

// 第一引数があればそのディレクトリへ移動して検索
// 移動せずにディレクトリを指定すると
// - peco のファイルパス表示が長くなりすぎる。
// - ファイルパスと行数を分離する際に : を分割文字に使っているので C:\ などの処理が面倒。
if (args.length > 0) {
    var dir = args(0);
    PPx.Execute('*jumppath ' + dir);
}

// 第二引数があれば peco の表示対象を絞り込み
var ptquery = '.';
if (args.length > 1) {
    ptquery = args(1);
}

// 第三引数があれば peco の初期クエリとする
var pecoquery = '';
if (args.length > 2) {
    pecoquery = ' --query ' + args(2);
}

// peco 実行
// peco の出力は UTF-8 なので CP932 へ変換してクリップボードへ渡す
// FIXME: 文字コード変換に iconv より軽い方法を使いたい
// FIXME: クリップボードを汚したくない
PPx.Execute('%Obsq pt /nogroup /nocolor /S /e ' + ptquery + ' .\ | peco' + pecoquery + ' | iconv -f UTF-8 -t CP932 | clip');

// クリップボードからファイルパスと行数を取り出してエディタへ渡す
var path_line = PPx.Clipboard;
if (path_line == '') {
    PPx.Quit(-1);
}
var list = path_line.split(':');
PPx.Execute("%'editor' %'editorL'" + list[1] + ' "' + list[0] + '"');


```
UnityのShurikenを利用して、ランダムな点滅を行う放出エフェクトを作る


## やりたいこと
キラキラと点滅しながら消えるエフェクトを作成する方法を解説します。
完成イメージは下の図のようになります

![myparticle.gif](https://qiita-image-store.s3.amazonaws.com/0/33026/0ddfa02e-49c1-381b-3b22-2161879a4c4e.gif "myparticle.gif")


## 方法

1. ParticleSystemを作成する
2. 下の図を参考にして、設定を行う

<img width="256" alt="解説" src="https://qiita-image-store.s3.amazonaws.com/0/33026/976f7cc1-bffe-9959-b73e-d2229afcce47.jpeg">

## ポイント
### Start Lifetimeを変更する
後述するColor Over Lifetimeと組み合わせてランダムタイミングでのキラキラを作るため。

### Color Over Lifetimeにて、アルファの調整
1. 最後消滅させるために、一番最後のアルファは0にする
2. 点滅のために、2,3度消滅までにアルファを0にして戻す設定を加える


### Dampenの設定
ここは、出現時におしゃれにするための設定です。
`Speed`を超えた速度のParticleを減速させるときに、一瞬で変えるのではなくLeapのように設定した割合に応じて緩急がついた原則となります。
初期スピードを上げることで、空気抵抗で減速するような速度効果になります。
mbedに書き込みしようとした時、失敗 - ダウンロードエラーが出る時の対処法

mbedにMacから書き込みができなくなった場合の復旧方法を書きます。

通常はOS Xに標準で搭載されている「ディスクユーティリティ」でmbedをフォーマットしてUSBを抜き差しすれば、ファイルが自動生成されて初期の状態に戻ります。
まれに「ディスクユーティリティ」のみではフォーマットができないことがあります。今回はその場合の直し方を書きます。

#### ディスクユーティリティでフォーマットする方法
「アプリケーション」→「ユーティリティ」→「ディスクユーティリティ」を開きます。消去したいmbedを選択して「消去」をクリックします。
フォーマットが完了してから、mbedをUSBで再度つなぎ直せば初期状態に戻ってるはずです。

### ディスクユーティリティでフォーマットに成功しない場合
「diskutli」コマンドを使用してUSBメモリを初期化します。

「アプリケーション」→「ユーティリティ」で「ターミナル」を開きます。ターミナルを開いたら、以下のコマンドを実行します。

>  diskutil list


> /dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER   0:                            MBED                   *2.1 MB     disk2


disk2がmbedなことがわかったので、以下のコマンドを実行し、ディスクをアンマウントします。

> diskutil unMountDisk /dev/disk2

最後に下記のコマンドを実行し、ディスクを消去します。フォーマットが完了してから、mbedをUSBで再度つなぎ直せば初期状態に戻ってるはずです。

$ diskutil eraseDisk HFS+ Untitled /dev/disk2
UIBezierPath で角の丸い多角形を作る

UIBezierPath で角の丸い多角形を作りたくて調べていたら[三角形での例](http://qiita.com/samekard/items/826f03f7537d0314e0f0)を見つけたので、多角形に応用するコードを書いてみました。

<img width="355" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/26040/88277692-0899-6119-01c5-b16f39ea88e9.png">

以下のコードは `UIView` の `draw(_:)` でこの三角形を描画する例です。`UIBezierPath` の自作イニシャライザに多角形の頂点を渡しています。

```swift
class ShapeView: UIView {
    
    override func draw(_ rect: CGRect) {
        guard let ctx = UIGraphicsGetCurrentContext() else {
            return
        }
        
        // 三角形の頂点座標を作成する
        let radius: CGFloat = 25
        let x: CGFloat = 25, y: CGFloat = 25
        let pos1 = CGPoint(x: x + radius * cos(0), y: y + radius * sin(0))
        let pos2 = CGPoint(x: x + radius * cos(2 / 6 * 2 * .pi), y: y + radius * sin(2 / 6 * 2 * .pi))
        let pos3 = CGPoint(x: x + radius * cos(4 / 6 * 2 * .pi), y: y + radius * sin(4 / 6 * 2 * .pi))

        // UIBezierPathの自作イニシャライザに頂点座標を渡す
        // ratio(0.0~1.0)で丸さを調整できる
        let path = UIBezierPath(roundedPolygon: [pos1, pos2, pos3], ratio: 0.5)
        // パスが閉じていないので、close()で閉じる
        path.close()
        
        ctx.addPath(path.cgPath)
        
        ctx.setLineWidth(4)
        ctx.setStrokeColor(UIColor.red.cgColor)
        ctx.strokePath()
    }

}
```

`UIBezierPath(roundedPolygon:ratio:)` の実装です。

```swift
extension UIBezierPath {

    public convenience init(roundedPolygon points: [CGPoint], ratio: CGFloat) {
        self.init()

        for i in 0 ..< points.count {
            var prev = i - 1
            if prev < 0 {
                prev = points.count - 1
            }

            var next = i + 1
            if next >= points.count {
                next = 0
            }

            let p1 = points[prev]
            let p2 = points[i]
            let p3 = points[next]

            let p12 = CGPoint(
                x: (p1.x + p2.x) / 2 * ratio + p2.x * (1 - ratio),
                y: (p1.y + p2.y) / 2 * ratio + p2.y * (1 - ratio)
            )
            let p23 = CGPoint(
                x: (p2.x + p3.x) / 2 * ratio + p2.x * (1 - ratio),
                y: (p2.y + p3.y) / 2 * ratio + p2.y * (1 - ratio)
            )

            if self.isEmpty {
                self.move(to: p12)
            } else {
                self.addLine(to: p12)
            }
            self.addQuadCurve(to: p23, controlPoint: p2)
        }
    }

}
```

## `ratio` の値による角の丸さの変化

![](https://qiita-image-store.s3.amazonaws.com/0/26040/fc2cc429-20f5-42e1-3af3-31439b0dc7ad.png)

![](https://qiita-image-store.s3.amazonaws.com/0/26040/bc54fa92-d5f6-3355-b1a1-0acab4195cfe.png)

## 参考 URL

- [おにぎりのような右向きの角が丸い三角形](http://qiita.com/samekard/items/826f03f7537d0314e0f0)
爆勝ちFXシストレ論文「Learning to Trade via Direct Reinforcement」を再現させたい

FXシストレ論文 「Learning to Trade via Direct Reinforcement」
http://dustwell.com/PastWork/MoodyRLTradingPresentation.pdf
http://people.idsia.ch/~juergen/rnnaissance2003talks/MoodySaffellTNN01.pdf

が、シミュレーション結果を見る限り爆勝ちしているので、この実装を再現させようとしているが、うまくいかない（同じような性能が得られない）。
要は価格の予測に応じてトレードするんじゃなくて、トレードしたら勝てるかどうか自体を直接予測すれば良いという内容だと思っているのだけど、その考えに従って、

http://qiita.com/ryo_grid/private/757fa93fc479439b2676

のプログラムを修正したり、やはり時系列のレートデータ（なり、時系列での差分データ）を入力すれば良いのか、と思い、TensorFlowでRNN/LSTMを使って試したりしたがうまくいかず。

で、一層のNN (のはず) で、時系列データを入力する方法を試したら多少うまくいった。
![direct.png](https://qiita-image-store.s3.amazonaws.com/0/12325/b5fc9d52-750e-1042-132c-143cbf304238.png)

予測結果が五分五分だとすると、スプレッド手数料の分で、単調減少になるのだけど、そうなっていないということはいくらかは予測が当たっているものと思われる。多分。

1層のNN (のはず) に 5分足を12本入れて、スプレッド含めて取引したら勝てるかどうかを予測して、その結果に基いて単純に売買した結果。買いの予測結果が出たら買って、保有ポジションは勝てると予測したタイミング（予測を行うタイミングから固定時間）には必ず売るという単純なストラテジー。

コードはこちら。
https://github.com/ryogrid/fx_systrade/blob/c9d93ef976d4565d25d17b70db18817ca6fe0327/keras_direct_rl_trade.py

PS:
可能性としては低いが、もしかして論文で評価が行われた期間と市場の動きが変わってしまっているとかあるのだろうか。例えば、証券会社にコンピュータを用いたトレードが普及したため、とか。

追記1:
論文を読み込んで、**学習中およびトレード中に、一回前に出したシグナルの種別を、入力に加えないといけないことは分かった**（その意味でこの論文は強化学習と言っているのだろう）。
しかし、このプログラムでそのような対応をするのは難しいというか、不可能なような。。。
TensorFlow先生に乗り換える感じかも。。。
としても、学習時間が膨大になるような。。。
という感じだが、同じ回帰なら似たような挙動になるだろうということで、NNではなくXgboostで書いてみた(KerasによるNNだと学習に時間がかかりそうだったので)。精度が出るかは不明。
https://github.com/ryogrid/fx_systrade/blob/4d644a05f4ffe5fa4aad466c51105bb559c22edf/xgboost_direct_rl_trade.py

結果。
下落幅が小さくなっている分、改善したように思われる。
![99a94b27b1bd128615f9e18db2b29b88.png](https://qiita-image-store.s3.amazonaws.com/0/12325/d28fd2f6-3547-4bee-90fd-db8145956ec0.png)

追記2:
追記1では、1時刻前の出力（予測結果）を入力に与えるという方法で精度が上がったようだったので、従来のテクニカル指標を入力して、ポジションの買いと解消も独自ストラテジーでするプログラムに、同様の仕組みを入れてみた。現在学習中。
https://github.com/ryogrid/fx_systrade/blob/cc65692fae0da92af793c72d2287c8659b18c381/xgboost_direct_rl_trade_v2.py

結果。元本割れしなくなっただけマシだが、既存プログラムは同じ期間(約7年間)で、+40%なので、全然期待はずれ。うーん。
![hoge2.png](https://qiita-image-store.s3.amazonaws.com/0/12325/200cbd09-c584-3ba9-9603-21acc634ef28.png)

ポジションを持つかの判断をするところでpredected_probaという変数を介して予測の信頼度を見ているが、そこを90%から50%まで落としたら、もう少しパフォーマンス上がった。
（上のもそうだけど、おおむね安定して増加傾向なので、レバレッジをかければ実運用でも使えるかも？。ただ、後者はまだマシだが、一ヶ月とか数ヶ月とかトレードしない期間が発生したりしているので、もっと頻度が多くなるようなプログラムにしないと厳しいか）
![hoge3.png](https://qiita-image-store.s3.amazonaws.com/0/12325/b5fbefe7-5c66-5f95-8145-c5dafc9a78a5.png)


学習データ数を8倍の8000まで増やしたらさらに良さげなパフォーマンスに（なお、学習時間の増加は単純に8倍では済まない）。
この調子で増やせばパフォーマンス改善していくのだろうか(既存コードは8万なのでさらに10倍しないと。。。)。。。
でも、8000データの時点で学習時間に2日近くかかっているので、10倍で20日。実際は10倍できかないだろうから30日とか、かかるのかなあ。辛い。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/12325/8aa9abca-9af0-c43e-4979-f40328fd4db1.png)

40000データ。最終イテレーションまでは、Xgboostのround数を1/3に減らしている。
とりあえず、データを増やせばいいというものではないようだ（途中のround数を減らした影響がなければ良い結果が得られた可能性もあるかもしれない）。
![40000.png](https://qiita-image-store.s3.amazonaws.com/0/12325/58e9689b-705a-2b33-0c17-bc3dd217bc93.png)
nodeで画像のディメンションを取得する方法

**インストール**
`npm install request-image-size`

**request-image-sizeで画像のディメンションを取得**

```
const requestSize = require('request-image-size');
const imageUrl = 'https://dzone.com/storage/temp/3117491-web.png';

requestSize(imageUrl, (error, imageSize) => {
  if (error) {
    return null;
  }
  
  // 結果: {width: 1200, height: 630, type: 'png'}
  return imageSize;
});
```

日本語を含む画像URLの場合、URLをエンコードする必要があると思います。
エンコードの為、`querystring`ライブラリ(インストールしなくても良い)、またはJavascriptの`encodeURI()`関数を使えます。
adb pppでリバーステザリング

##adb pppとは
PPP(Point-to-Point Protocol)をAndroidとPCの間で使うためのものです。
現在ではあまり一般的に使われていないプロトコルのように思います。
とても便利な機能なのですがネットに情報が全くないのが寂しいです。
root取得済みであることが前提です。

## 環境
- Ubuntu 16.04 LTS(Firewall: iptables)
- Android 2.2(今回これを使っただけであり最新の端末でも使えるはずです, ***rooted***)

## ファイアウォールの設定
```
$ sudo sysctl net.ipv4.ip_forward=1 # forwardを許可
$ sudo iptables -t nat -I POSTROUTING -s 192.168.0.2 -j MASQUERADE -o eth0 # eth0の部分は転送するインターフェースに置き換えてください。
$ sudo iptables -A FORWARD -i ppp0 -j ACCEPT
$ sudo iptables -A INPUT -i ppp0 -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # 確立済みの接続を許可
```

## adb ppp
```
$ sudo adb ppp "shell:pppd nodetach noauth noipdefault defaultroute /dev/tty" nodetach noauth noipdefault notty 192.168.0.1:192.168.0.2
```
これでifconfig等を実行してppp0インターフェースが作成されていれば成功です。
もし番号が違った場合は上のファイアウォールの番号を変えて設定し直してください。

## DNS
名前解決の設定です。不要であれば飛ばしてください。

```
$ adb shell setprop net.dns1 8.8.8.8 # 任意のDNSサーバ
$ adb shell
# echo "nameserver 8.8.8.8" >> /etc/resolv.conf
# exit
```
なぜかpingコマンドだけはこれらの設定ファイルを使ってくれないため名前解決ができませんでした。
解決方法をご存知の方がいれば教えていただけると幸いです。

## 終わりに
これで繋がるようになるはずです。
今回OSが古く色々な制限もあったためリバーステザリングは非常に困難でしたがなんとか情報を見つけることができインターネットに接続させることができました。(あと良いiptablesの勉強になりました。)
機会があればMacで行う方法についても検証していきたいと思います。

# 参考文献
- [How to set up Android ppp over usb with adb](http://www.xinotes.net/notes/note/1500/)  
ほとんどこのページを参考にさせていただきました。ありがとうございます。

# 追記
ifconfigコマンドで見たときにpppデバイスが残り続けてコマンドを実行するたびに増えて困っていたのですがpppdというプロセスが起動しているためそれを終了してやることで消えるようです。
[Unityで学ぶC#] まとめ


Unity勉強する上で， C#の勉強は必須です． 
その手助けとなればいいなと思います．

駆け足で説明が足りないところが多々あると思うので， 改善点をコメントしてくれると嬉しいです．

# C# 基礎
[[Unityで学ぶC#] 0 Hello World](http://qiita.com/Teach/items/a0bcd169d754e3362b24)
[[Unityで学ぶC#] 1 変数の使用](http://qiita.com/Teach/items/31ea7a3778e8202775a7)
[[Unityで学ぶC#] 2 条件分岐](http://qiita.com/Teach/items/541912efffb9ce783ac0)
[[Unityで学ぶC#] 3 スクリプトのルール1](http://qiita.com/Teach/items/fa9da53b6b334fa33645)
[[Unityで学ぶC#] 4 小数点を使う](http://qiita.com/Teach/items/7cea524b2d77adf92498)
[[Unityで学ぶC#] 5 文字の変数](http://qiita.com/Teach/items/24fa4ef0cac57e5eca8f)
[[Unityで学ぶC#] 6 bool 論理値](http://qiita.com/Teach/items/b413b8f19f7ead930511)
[[Unityで学ぶC#] 7 if - else](http://qiita.com/Teach/items/209a7bb8df61c791fc0e)
[[Unityで学ぶC#] 8 switch](http://qiita.com/Teach/items/db370beb7d21014425d5)
[[Unityで学ぶC#] 9 クラス](http://qiita.com/Teach/items/d2ac6b59bd1d55e7fc8e)
[[Unityで学ぶC#] 10 関数](http://qiita.com/Teach/items/c66e5732458e2e814cf6)
[[Unityで学ぶC#] 11 クラスとメソッド](http://qiita.com/Teach/items/f77de2fedb33f93f13bf)
[[Unityで学ぶC#] 12 static](http://qiita.com/Teach/items/20c0f6dc1dc4cb6eb55a)
Scrapyのインストールで困ったこと

自宅Mac環境が汚れているせいか、ちょっとインストールするにもすぐハマる。。。
というわけで、Scrapyインストールでハマったことのメモ。
#インストールコマンド
```
pip install scrapy
```

そうしたら以下のエラーとなった。

```
Installing collected packages: six, attrs, Automat, constantly, incremental, Twisted, queuelib, w3lib, cssselect, parsel, pyasn1, pyasn1-modules, service-identity, scrapy
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 778, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-xz1ZPD-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'
```



インストール時にsixのインストールを避けるように指定したら成功した。

```
pip install scrapy --ignore-installed six
```

軽い気持ちでScrapy入れようとしただけなのに、意外と手間取って疲れた。
CircleCIでRails4アプリをHerokuへデプロイする


Github管理のRails4アプリをHerokuへデプロイする。


## CircleCIプロジェクト作成

![Screen Shot 2017-03-05 at 0.34.55.png](https://qiita-image-store.s3.amazonaws.com/0/281/084ee0b1-df29-d33f-1dc3-39b3ccaf226f.png "Screen Shot 2017-03-05 at 0.34.55.png")


## CircleCIプロジェクト設定
### Github Deploy key設定
[Checkout SSH keys]からdeploy keyを追加する。(deploy keyはリポジトリごとに設定できる。一方、user keyを使う方法もある)

![Screen Shot 2017-03-05 at 0.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/281/5c69a3f0-ae14-6d2b-310c-fbb83539af47.png "Screen Shot 2017-03-05 at 0.37.46.png")


Githubリポジトリに移り、設定でDeploy keysに追加されていることを確認する。

![Screen Shot 2017-03-05 at 0.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/281/d6ab990b-1fed-c2f3-3d5e-d1bd3d6816ae.png "Screen Shot 2017-03-05 at 0.40.27.png")


### Heroku設定
Herokuアカウントの設定で、API keyを確認する。(Revealで内容が表示される)

![Screen Shot 2017-03-05 at 0.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/281/d761e9b0-3323-c416-a0d1-986d1068a0f2.png "Screen Shot 2017-03-05 at 0.43.17.png")

CircleCIのプロジェクト設定に戻り、[Heroku Deployment]からAPI keyを設定する。
続いてDeploy Userを設定する。
![Screen Shot 2017-03-05 at 0.39.03.png](https://qiita-image-store.s3.amazonaws.com/0/281/6362f3bf-8d74-4417-8b75-bc8f483485d0.png "Screen Shot 2017-03-05 at 0.39.03.png")






## circle.yml設定
Herokuへのpush時にmigrateするように設定する。

```circle.yml
deployment:
  staging:
    branch: master
    commands:
      - git push git@heroku.com:circleci-heroku.git $CIRCLE_SHA1:master
      - heroku run rake db:migrate --app circleci-heroku
```
これをaddしてgithubへpushするとCircleCIでビルドが走ってHerokuへデプロイされるのを確認する。

![Screen Shot 2017-03-05 at 0.56.06.png](https://qiita-image-store.s3.amazonaws.com/0/281/d94a1831-0970-3e1d-24a0-3862075482df.png "Screen Shot 2017-03-05 at 0.56.06.png")

## 参考
- [CircleCI: Continuous Deployment with Heroku
](https://circleci.com/docs/1.0/continuous-deployment-with-heroku/)
- [CircleCI: Heroku with pre or post-deployment steps](https://circleci.com/docs/1.0/configuration/#heroku-with-pre-or-post-deployment-steps)
markdown

## 运营系统接口文档##

[TOC]

#### 接口说明 **1、**新增机器人

- **请求URL**
> [api/v2/operating/newRobot](#)

- **请求方式** 
>**POST**

- **请求参数**
>
 | 请求参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| uid|  <mark>Long,**不可为空**</mark>|  机器人UID|
| status|   Integer,可为空|  机器人可用性,默认可用  **-1.不可使用 1.可用**|

- **返回参数**
> | 返回参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| success|   boolean|  请求成功与否|
| code|   Integer|  执行结果code|
| message|   String|  执行结果消息|

- **返回示例**
>    
```java 
{
  "success": true,
  "code": 200,
  "message": "操作正确"
}
```

#### 接口说明 **2、**查询机器人

- **请求URL**
> [api/v2/operating/robotList](#)


- **请求方式** 
>**GET**

- **请求参数**
> | 请求参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| status|   Integer,可为空|  机器人可用性 **-1.不可使用 1.可用**|
| curPage|   Integer,可为空|  当前页|
| pageSize|   Integer,可为空|  每页显示数量|

- **返回**
> | 返回参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| success|   boolean|  请求成功与否|
| code|   Integer|  执行结果code|
| message|   String|  执行结果消息|
| results|   Object|  执行结果集|

- **返回示例**
>    
```java 
{
  "success": true,
  "code": 200,
  "message": "操作正确",
  "results": [
    {
      "createdTs": 1471928107000,
      "updatedTs": 1471928107000,
      "id": 3,
      "uid": 23333,
      "useStatus": 1,(使用状态)
      "nickName": "朱阿便",
      "avatar": "http://7xljdd.com2.z0.glb.qiniucdn.com/fa767b500c58206f5f213a0fe4187e47.jpg"
    }
  ],
  "curPage": 1,
  "pageCount": 2,
  "count": 2,
  "hasRecords": true
}
```

#### 接口说明 **3、**修改机器人

- **请求URL**
> [api/v2/operating/updateRobot](#)


- **请求方式** 
>**POST**

- **请求参数**
> | 请求参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| uid|   <mark>Long,**不可为空**</mark>| 机器人UID|
| status|   Integer,可为空| 机器人可用性 **-1.不可使用 1.可用**|

- **返回**
> | 返回参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| success|   boolean|  请求成功与否|
| code|   Integer|  执行结果code|
| message|   String|  执行结果消息|

- **返回示例**
>    
```java 
{
  "success": true,
  "code": 200,
  "message": "操作正确"
}
```

#### 接口说明 **4、**删除机器人

- **请求URL**
> [api/v2/operating/deleteRobot](#)


- **请求方式** 
>**POST**

- **请求参数**
> | 请求参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| uid|   <mark>Long,**不可为空**</mark>| 机器人UID|

- **返回**
> | 返回参数      |     参数类型 |   参数说明   |
| :-------- | :--------| :------ |
| success|   boolean|  请求成功与否|
| code|   Integer|  执行结果code|
| message|   String|  执行结果消息|

- **返回示例**
>    
```java 
{
  "success": true,
  "code": 200,
  "message": "操作正确"
}
```
GoogleSpreadSheetで二つのシートに分かれたデータを結合する

# 本題
二種類の行事予定表があったとして、両者を結合して、一つのカレンダーを作りたいです。たとえば社内行事予定表に国民の祝日を合成したい。

# 実装
embed記法?を使えば二つの範囲を結合できます。

```
={events!a1:b4; happy_days!a1:b18}
```

複数の範囲をセミコロンで区切ってブレースで囲むんですね。

しかし、行単位で範囲を指定すると、データの増減に対応できません。かといって、次のように列全体を指定してしまうと空白行まで含んでまともに合成できません。

```
={events!a:b; happy_days!a:b}
```

そこで、列Aを必須項目として空行を除外します。この程度の条件であればフィルタで可能ですね。

```
={FILTER(events!A1:B,not( ISBLANK(events!A1:A)); FILTER(happy_days!A1:B,not( ISBLANK(happy_days!A1:A))}
```

これで両者が合成されます。
# おまけ
ほかのファイルのシートからデータを引っ張ってくるには、[IMPORTRANGE](https://support.google.com/docs/answer/3093340?hl=ja)を使います。滅多に編集しないマスターデータなどはインポートした方が使いやすいかもしれませんね。

```
IMPORTRANGE("https://docs.google.com/spreadsheets/d/abcd123abcd123", "sheet1!A1:C10")
```

ただし共有化したファイルに限ります。

# 結論
GoogleSpreadSheet は強力なので無理目の要望も実現できてしまいますが、計算負荷はそれなりに高そうです。こんな無茶するより、はじめから同じシートに蓄積した方が良いですよ。よその部署が管理するシートだから編集権限がないといった政治的な敗北を喫さない限りは。
Deis Workflow を Azure にデプロイするときには，vhd 用のストレージアカウントを流用してはいけない。

最近になって，Deis Workflow (以下，単に Workflow)を Azure にデプロイするための公式文書が出たようなので，その通りにやっていれば失敗しないはずなのだけれども。
自前でやりたい人，または自前でやった結果，イマイチなレスポンスになっている人のためのメモ。

タイトルは Workflow だけれども，Kubernetes (K8s) 一般でも成り立つかもしれない。

言いたいことは，タイトルで言い尽くしている。

## Azure での K8s 一般論

K8s 一般論として，起動時/再起動時には，OS がマウントしている vhd は， OS の起動処理や K8s 関連のコンテナのアクセスが集中して，ストレージアカウントへのアクセスが急増する。

アクセスが集中すると，ストレージアカウントのグレードにも依るけれども，帯域制限(スロットリング)がかかる。

## Azure での Workflow 一般論

Workflow のデフォルト設定では，registry は Workflow が提供するコンテナで，バックエンドストレージは，AzureBlob となっている。
Workflow では管理している Webアプリの情報を Postgres に保持するが，デフォルト設定では Workflow が提供するコンテナを用い，WAL-E を使ったバックアップ先は AzureBlob となる。

ここで，あんまり深いことを考えないで設定すると，既に存在するストレージアカウントに，これらののバックエンド Blob を置いてしまう。(__大抵，既に存在するストレージには vhds がある。__)

Workflow は，システム起動時に PaaS として管理していたコンテナの整合性を管理し，必要であれば registry コンテナの内容を再デプロイするよう K8s に対し指示を出す。

## 起動時に起こる高負荷

* K8s の一般論として，起動時には pods 作成のため，ディスクへアクセスは多くなりがち。
* Workflow の registry や postgres といった pods たちが，ストレージアカウントに対して，猛烈な勢いでアクセスを開始する。

同時に起こると，結果は考えるまでもない。ストレージへのアクセスは，スロットリングされ，下記のような事態に陥る。

* いつまでたっても postgres のバックアップリカバリは完了しない。タイムアウト等で `deis-postgres` コンテナの再起動が繰り返される。
* Workflow が管理しているアプリに対応する k8s の pods は， `ContainerCreating` のまま固まる。

コンテナ数 100 程度の規模でも復旧まで半日かかるような，長時間サービス停止に陥る。

# なので

Workflow が使う AzureBlob のストレージアカウントは，vhds が入っているものとは分けましょう。

あと，Premium Disk の利用を検討しましょう。再起動時だけですが，効果が実感できます[^premium-disk]。
それなりにお金がかかりますけれども。

[^premium-disk]: もちろん起動後もアクセスは速いはずなのだけれども，体感できるとまでは言い難い。
URLっぽいものを開く／強調表示する

ファイル編集中に本文中にあるURLっぽいものを目立たせたいな、ついでにクリックでブラウザを開けたらイイナ、ってことはよくある。そんなときは`goto-address-mode`を利用するのが良い。

つまりは、こんなパターン。

<img width="655" alt="コメント中にURLが含まれてるようす" src="https://qiita-image-store.s3.amazonaws.com/0/4121/d87b9452-a8bc-30ac-ccd2-c10d64bd63fc.png">

## 一時的に有効化したい

`M-x goto-address-mode`または`M-x goto-address-prog-mode`を実行する。

![goto-addr.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/56e14ffa-6437-1b59-be14-70fd0f72c33b.gif)

若干わかりにくいけど、Emacs内でブラウザウィジェット使ってるわけじゃなくて、デスクトップの標準Webブラウザ(Chrome)が開いてるだけ。

## 常に有効化したい

.emacsファイル(`~/.emacs.d/init.el`)で、`prog-mode-hook`とか`text-mode-hook`に登録してやればいい。

```el
;; goto-addr
(progn
  (add-hook 'prog-mode-hook 'goto-address-prog-mode)
  (add-hook 'text-mode-hook 'goto-address-mode))
```

`goto-address-prog-mode`は`goto-address-mode`と概ね同じなのだけれど、コメントとか文字列リテラルに含まれるURLだけをリンクにしてくれる。

Emacsのメジャーモードには継承の概念があって、「プログラミング言語のソースコードっぽいもの」を編集するモードは`prog-mode`を、「人間がそのまま読み書きするようなテキスト文書っぽいもの」を編集するモードは`text-mode`を継承するのがお作法になってゐる。

つまり`prog-mode-hook`に設定してやれば、`ruby-mode`とか`php-mode`とかの個別のhookに設定しなくて良い。(逆に、全体で反映したくないが個別のモードでのみ有効化したけれは`ruby-mode-hook`などに登録する)


## `goto-address-mode`は何をしてくれるのか

ざっくり

 * URLっぽい文字列をみつけて、リンクっぽい色を付けてくれる
    * 正確には`link`って名前のfaceを付ける
    * 興味あるひとは `M-x list-faces-display` で確認してみてね
 * そのリンクをクリックしたら`goto-address-at-point`コマンドが実行されるようになる
 * 参考: [Emacs25.1マニュアル日本語版 48.2 URLのアクティブ化](https://ayatakesi.github.io/emacs/25.1/Goto-Address-mode.html#Goto-Address-mode)

`goto-address-at-point`はカーソル位置のURLっぽいものを検出して`browse-url`してるだけなので`goto-address-mode`とは関係なく、いつでも実行できる。

つまり「色付けとかクリックとかどうでもいいから」って人は`goto-address-mode`を有効化せずに`goto-address-at-point`だけを使ってもいい。

## ちなみに`helm-find-file`でもいける

もし[Helm](https://github.com/emacs-helm/helm)を使ってたら、カーソルがURL上にある状態で<kbd><kbd>C</kbd>-<kbd>x</kbd> <kbd>C</kbd>-<kbd>f</kbd></kbd> (または`M-x helm-find-files`) するだけで同じような挙動になる。

![goto-addr-2.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/ca8d5914-59dd-2fb5-d910-337d3e08dec3.gif)

Helmを使ってなくても、Emacs標準にある[FFAP](https://ayatakesi.github.io/emacs/25.1/FFAP.html#FFAP)(`find-file-at-point`)を利用すれば同じようになります。(たぶん)

## 蛇足: ターミナルからリンクを開く

ターミナルの種類にもよるが、筆者が愛用してる[iTerm2](https://www.iterm2.com/)は<kbd>Command</kbd>を押すと、画面中のURLっぽい文字列がクリック可能になる。特にSSHで接続した先でEmacsを使ってる最中にGUIのブラウザで開きたい、といった場合はこうするのが簡単。

![goto-addr-iterm2.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/f9b1b5b5-1656-e1cb-12b9-5b03797c68bd.gif)

## リンクをクリックしたときの挙動を制御したい

先述の通り`browse-url`してるだけなので、設定してやればいいだけ。
例として、Emacs内で完結したい場合はこうする。

```el
(setq browse-url-browser-function #'eww-browse-url)
```

![goto-addr-internal.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/1318a9d6-f344-49ef-ec36-6d56256d194a.gif)

## まとめ

* `goto-address-mode`はURLをクリックできるようになってべんりだよ
* せっかく[最新版のEmacsマニュアルの和訳](https://ayatakesi.github.io/)があるので読まないと損だよ
    * 通読するのは大変だけど、目次から気になる項目をつまんで読んでおくと良い
convert youtube playlist to local m3u format file for smplayer (by toy tool )

### 承前
- [mplayer](http://www.mplayerhq.hu/) ( [smplayer](http://smplayer.sourceforge.net/) ) は [YouTube](https://www.youtube.com/) のページ URL を理解して動画を再生してくれるが、複数の動画を連続再生するにはあらかじめローカルに playlist file を作っておく必要がある。
- ブラウザで Youtube のプレイリストを再生するのはなんとなくうれしくない。
- [youtube-dl](https://rg3.github.io/youtube-dl/) は Youtube のプレイリストをすべてローカルにダウンロードすることができるが、ダウンロードせずにリストを作るような手段が -s オプションくらいしか見つからず、これは動画そのものの一時的な URL を並べる。削除されない限り恒久的な URL を並べることはコマンドラインからではできなさそうだ。
- youtube-dl コマンドの実体は python スクリプトであり、コマンドは python のライブラリを呼び出している。

では youtube-dl のライブラリをコマンドラインのpython から呼び出して、しばらくつかえるようなプレイリストのローカルファイルをつくろう、というハナシ。

###環境
今回、作りながら動作チェックしたのは Windows 10 上で、[gitbash](https://git-for-windows.github.io/#BASH) をシェルとし、[Conda](https://conda.io/) でインストールした Python , その pip からインストールした youtube-dl という構成。

###本体
```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import codecs
import sys
import youtube_dl

class yt_Listup:
    """ Wrapper for youtube-dl library
      * read youtube.com playlist
      * output by m3u format 
    """

    def __init__(self, url):
        self.url_list = []
        ydl = youtube_dl.YoutubeDL({'outtmpl': u'%(id)s%(ext)s', \
                'logtostderr': True})
        with ydl:
            result = ydl.extract_info(
                url ,
                download=False, # We just want to extract the info
            )

        if 'entries' in result:
            self.url_list.extend(result['entries'])
        else:
            self.url_list.append(result)

    def m3u(self, fileHandle = codecs.getwriter('utf_8')(sys.stdout)):
        for item in self.url_list:
            fileHandle.write( "# " + item['title'] + "\n" + \
                    item['webpage_url'] + "\n" )
        return


if __name__ == "__main__" :
    l = yt_Listup(sys.argv[1]).m3u()
```
とりあえず出力先を stdout にしてリダイレクトで保存する運用中　……なんて但し書きを必要とするひとはコード断片なんか読まないような気がするので蛇足

###なお
python に真面目なひとには叱られそうなことに、PEP8準拠するための整形もしていない。
開発に真面目なひとには叱られそうなことに、テストコードも内包していない。
この機能のまま拡張する気がないのならば、append() とか extend() とか使わず = で代入のほうがシンプルで正しい。
わたしの好みとしては、コマンドラインで使うのならば Usage() 関数とかつけたいし、このコードはリネームして最終的にはライブラリ・パスに置きたい。
再生画面はともかく smplayer のプレイリスト画面に URL がそのまま表示されるのが気に入らないところからはじまり、ここに挙げたコードからそこそこ手を加えた。多機能になればなるほど長くなる。

そのうえで、youtube の playlist をローカルファイルに保存するという「いかにも誰もが使いそうな」機能が検索してもほぼ見当たらなかったので。メインの部分がもっともわかりやすい、このコードだけ公開しておくのが Qiita というサイトのノリに近くて読みやすいかな、と思いました。

###Thanks
- [How to use youtube-dl from a python program](http://stackoverflow.com/questions/18054500/how-to-use-youtube-dl-from-a-python-program)
- [site-packages/youtube-dl/extroctor/youtube.py](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py) playlist で検索したり、テストコード用のURLみたり
- [site-packages/youtube-dl/youtubeDL.py](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/YoutubeDL.py) 135行目あたり、コマンドオプション
【Laravelメモ⑦】Google Books APIで検索した書籍情報を表示する

# 前提
- あるページの入力フォームから検索用の文字列を入力
- Google Books APIで本の情報を取得
    - とりあえず、本のIDをforeachで出力する

# メモ

## 入力ビュー
```html:input.blade.php
<form action="result" method="post">
<input type="text" name="book" size="20"/>
<input type="submit" value="Submit"/>
</form>
```

## ルーティング
```php:web.php
Route::post('result','testController@result');
```

## コントローラ
```php:testController.php
class testController extends Controller
{
    public function result(Request $request){
    	$post_data = $request->all();
    	$data = "https://www.googleapis.com/books/v1/volumes?q=".$post_data["book"];
    	$json = file_get_contents($data);
    	$json_decode = json_decode($json, true);
		return view('result', compact("json_decode"));
    }
}
```

## 出力ビュー
```php:result.blade.php
@foreach ($json_decode['items'] as $item)
	{{ $item['id'] }}
@endforeach
```
フロントエンドエンジニア用のコマンド関連

Webデザイナーやコーダー、マークアップエンジニアにとってはCLI（いわゆる黒い画面）に抵抗感を抱く人は割と多いのではないでしょうか。
フロントエンドを本格的にやる場合、CLIでの操作が必要になってきます。
最近ではpackage.jsonのnpm-scriptsにコマンドを記述しておき、CLI側でキーを入力して実行することが多いです。（npm run * とか yarn * とか）
よく使うコマンドやパッケージの調べ方あたりを簡単ではありますが、紹介します。

## Linuxコマンド

仕様頻度の高いものだけにとどめておきます。
オプションで詳細設定や違うこともできますが、その辺は参考記事をご確認ください。

| コマンド | 内容 |
|-------- | ----- |
| ls | ファイル・ディレクトリを表示<br>参考：[【 ls 】 ファイルやディレクトリの情報を表示する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230820/) |
| cd 移動先ディレクトリ | ディレクトリの移動<br>`cd ../`：一つ上のディレクトリへ移動<br>`cd js/vendor`：js/vendorへ移動<br>`cd /home/user1`：/home/user1へ移動<br>参考：[【 cd 】 ディレクトリを移動する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230726/) |
| mkdir ディレクトリ名 | ディレクトリの作成<br>下層ディレクトリを作成する場合は-pが必要<br>参考：[【 mkdir 】 ディレクトリを作成する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230831/?rt=nocnt) |
| touch 作成ファイル名 | 空ファイルの新規作成<br>参考：[【 touch 】 ファイルのタイム・スタンプを変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230905/) |

## npm公式サイト（英語）に慣れる

「npm パッケージ名」で検索するとよく上位に出てきます。
日本語で紹介されていないパッケージはどうしても公式を読むことになります。
英語がわからなくてもコマンドやコードを読めばなんとなくわかるようになってきます。
知りたいことは

* どうやってインストールするか（Installation）
* どうやって使うか（Usage）
* どのようなオプションがあるか（Options）
* 例えばどのように書くか（Examples）

だいたいこれくらいだと思います。
インストールは極力グローバル（-g）は避けましょう。ローカルにインストールする場合、バージョンの差異で将来苦しむ可能性があります。
-gはつけず-Dでpackage.jsonでプロジェクトごとの管理にしましょう。
npm-scriptsの中に

```json:package.json
{
  "scripts": {
    "test": "使いたいコマンド"
  }
}
```
と書いておき、CLIで

```
$ npm test
```
と実行すれば大体はOKです。（※後述）

最初は慣れないかもしれませんが、オプションは同じようなものを使うことが多いので慣れてしまえばラクです。
パッケージによっては「***-cli」という名前で提供しているものがあり、CLIを使用したい場合はこちらのインストールが必要な場合があります。
※オプションは大文字・小文字がパッケージによって違うことがあるので使用前に必ず公式を確認してください。

### よくあるオプション

| オプション | 内容 |
| --- | --- |
| -h, --help | ヘルプを表示 |
| -v, --version | バージョンを表示 |
| -w, --watch | 監視 |
| -d, --dir | 出力先ディレクトリの指定 |
| -o, --output | 出力先ファイルの指定 |

## 注意事項

CLIに直接入力して実行する場合とnpm-scripts側に用意し呼び出して実行する場合（※前述）があります。
npm-scripts側に用意し呼び出して実行する場合、Linuxコマンド
がそのまま通らないことがあったりOSごとに記述が違って複数OSでの実行ができなかったりします。
そこを解決するパッケージが存在するので、もしエラーを吐いてしまった場合にLinuxコマンドを使用していれば確認してみると良いでしょう。

### Linuxコマンドの機能を提供するパッケージ

| パッケージ名 |  |
| --- | --- |
| rimraf | ファイルやディレクトリを削除する<br>`rm -rf`を実行するツール<br>参考：[【 rm 】 ファイルやディレクトリを削除する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230871/) |
| mkdirp | ディレクトリ作成をnpm-scriptsで使用できる機能を提供<br>`mkdir -p`を実行するツール |

### さいごに

フロントエンドの作業をおこなう時のCLIに関する内容をまとめました。
他にもたくさんできることはありますが、最初の取っ掛かりとして参考になればと思います。
錬金術でゲームを作る（1）：技術選定

後の薄い本のためのメモ書きです。Elixir触って二日です。たーのしー！！

# 何を作りたいか
リアルタイムゲームです。

# 方針：最小構成で作る
静的ファイルはレンタルサーバにおいて、ゲームロジックはWebSocketを通じてVPSに置くことにしました。

個人的には、今後Webサービスを作る場合、頻繁に更新しないファイルは専用サービスに置いて、動的要素はAPI化してJavaScriptで取得という、SPAとMPAの中間のアーキテクチャが主流になると思っています。

そう思った背景としては

* SSGの普及、またSSG対象の静的ファイルホスティングサービスの台頭
* Ajaxによる動的ページをキャッシュするPre-renderサービスの台頭
* XHR2が普及して、CORSが利用可能

というところです。
MPAですとサーバ負荷が高く、レスポンスに劣ります。
SPAですと、エンジニア負荷が高いです。

この中間がいい案配ではないでしょうか。

# 技術選択
Elixir+cowboyを選択しました。
Elixirを選んだのは、単に面白そうだったから以上のなにものでもないですが、Phoenixはあえて除外しました。

Phoenixですと、大きすぎるからです。

今回WebSocketのみのAPIサーバのため、Plugも外しました。
このためせっかくならば最新版をと、cowboyのバージョンは2.0.0-pre7です。人柱万歳！！
Arduino の SPI接続

# Arduino Due とは

 - 2012年発売
 - ARM系のCPU
 ---- Atmel SAM3X8E (Cortex-M3, 84MHz)
 - Arduino MEGA のフォームファクタ

公式では初のATMEGA系以外のCPUを使ったArduino。
それまでは、開発環境はATMEGA系しか対応していなかったがバージョン 1.6.2 以降でこれ用のバイナリが作成できるようになった。
ARMだし、32bitだし、 パワフル！　ということで大いに注目を浴びたが・・・今はなんだかぱっとしないねえ。

これで、SPIを使うにはどうしたらいいかな・・・デジタルポートに配線しようとしたらハマったのでDue以外のSPI接続も調べてメモ。


# SPI
以下の3線を使う。
MOSI
MISO
SCLK
必要に応じ、マスタースレーブ切替の信号としてSSを使う。


# Arduino UNO のSPI接続

Arduino UNO とか Pro なんかはデジタルポートとICSPポート両方で使用できる。

D10 SS
D11 MOSI
D12 MISO
D13 SCK

ICSPコネクタ

1 MISO
3 SCK
4 MOSI

ATMEGA16用のICSPコネクタ

1 MISO2
3 SCK2
4 MOSI2


Dueも同じようにして、D10-D13に接続したらいいんじゃないの？？？・・・あれ？

# Arduino MEGA 2540 の SPI

Arduino Due のピン配置は Arduino MEGA 2540。なのでこれと同じかな？
Arduino MEGA 2540のSPI配置は

D50 MISK
D51 MOSI
D52 SCK
D53 SS

ICSPコネクタ

1 MISO
3 SCK
4 MOSI

ATMEGA16用のICSPコネクタ

1 MISO2
3 SCK2
4 MOSI2

だけれどもSPI接続についてはDueとMEGAは異なっているらしい。



# Arduino Due の SPI

SPIに関しては、DueはメインCPUのICSP機能は無くなり、JTAGポートが別に搭載されている。
メインICSPコネクタだったものはSPI用途だけになっている。

SPIコネクタ

1 MISO
3 SCK
4 MOSI

ATMEGA16用のICSPコネクタ

1 MISO2
3 SCK2
4 MOSI2

デジタルポートには出ていない。そうだったのか。デジタルポートがピンソケットなので、簡単にオスオスジャンパーでブレッドボードにつなげようと思ったけど、ちょいめんどいなあ。

# Arduino Leonardo

調べると、デジタルポートに出てないヤツはこれもそうらしい。

ICSPコネクタ

1 MISO
3 SCK
4 MOSI

だけ。デジタルポートには出ていない。

# Dueの拡張API

Extended SPI library usage with the Due
https://www.arduino.cc/en/Reference/DueExtendedSPI
これを使うと、CSピンとして4番ピン、10番ピン、52番ピンを使うことができるらしい。
SQLアンチパターン：SQL インジェクション

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 動的SQLを記述する
  - SQLクエリの文字列を作成し、実行する
  - アプリケーション内で文字列を作成、実行

# アンチパターン

- 未検証の入力をコードとして実行する

```sql

SELECT * FROM Bugs WHERE bug_id = $bug_id
```

```php
$bug_id = "1234; DELETE FROM Bugs"
SELECT * FROM Bugs WHERE bug_id = 1234; DELETE FROM Bugs
```

- SQL インジェクション は、SQL ステートメントが解析される前に構文を改変する

- 'プリペアドステートメント' を用いて防ぐことが多い
  - プレスホルダーを使いSQLを実行する
  - 最も強力な防御手段。だが万能ではない
     - 値のリストを扱えない（IN句）
     - テーブル識別子、列名、SQL予約語、もパラメータとして扱えない

## 用いてもいいパターン

- ない

# 解決策

- 誰も信用しない
  - 入力のフィルタリング
  - プリペアドステートメント
  - ユーザの入力をコードから隔離する
  - コードレビューしてもらう

# まとめ

ユーザーには、値の入力は許可しても、コードの入力を許可してはいけません。

# 感想

用いてもいいパターンの説明がはっきり書いてあります。
最大限注意するしかない


[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
ruby で最大値を求める方法の速度比較

結論：ruby 2.4 は素晴らしい

http://qiita.com/Nabetani/items/b48f5cb6361496ca7712
で議論になった、最大値の求め方。

```ruby:lazy_map_max
  size.times.lazy.map{ |x| f(x) }.max
```

```ruby:inject_cond
  size.times.inject(0){ |acc,x| t=f(x);acc=t<acc ? acc : t }
```

```ruby:inject_max
  size.times.inject(0){ |acc,x| [acc,f(x)].max }
```

```ruby:map_max
  size.times.map{ |x| f(x) }.max
```
と、いろいろ方法がある。で。実行時間を比較する。

対象は ruby 2.3.3p222 と、ruby 2.4.0p0 。

![Kobito.J9Rab0.png](https://qiita-image-store.s3.amazonaws.com/0/6854/a64ad6f1-8674-fdf9-133e-6269926de4e6.png "Kobito.J9Rab0.png")

実行時間なので、短いほど良い。

速度重視で選ぶなら、ruby2.3 だと、inject_cond 一択。ruby2.4 だと、lazy_map_max 以外ならどれでも同じ。という事になった。

https://docs.ruby-lang.org/ja/latest/doc/news=2f2_4_0.html
の
> いくつかの条件で [x,y].max と [x,y].min が一時的な配列を生成しないよう最適化されました。

の効果によって、 ruby2.4 では inject_max が速くなっていて、inject_cond に追いついた感じ。
map_max も相当速くなっていて、こちらも inject_cond に追いついているけど、これはなんでなんだろう。

lazy を使ったコードはやっぱり遅かった。

実験に使ったのはこんなコード：

```ruby:bench.rb
#encode:utf-8

(p RUBY_DESCRIPTION) rescue p "1.8.x or former"
require "benchmark"

def f(x)
  (x/3) & (x/7)
end

def map_max(size)
  size.times.map{ |x| f(x) }.max
end

def lazy_map_max(size)
  size.times.lazy.map{ |x| f(x) }.max
end

def inject_max(size)
  size.times.inject(0){ |acc,x| [acc,f(x)].max }
end

def inject_cond(size)
  size.times.inject(0){ |acc,x| t=f(x);acc=t<acc ? acc : t }
end

def run_bench( n, size )
  puts "n, size = #{n}, #{size}"

  m=[ :map_max, :inject_max, :inject_cond, :lazy_map_max ]
  len = m.map(&:to_s).map(&:size).max
  Benchmark.bmbm(len) do |x|
    m.each do |s|
      x.report(s.to_s){
        n.times do
          self.send(s, size)
        end
      }
    end
  end
end

run_bench( 100, 100000 )
```
Rubyで逆ポーランド記法の計算機と変換器を作った

RUBY_VERSION >= '2.1.0' で動作を確認しています。

```rb:rpn.rb
require 'ripper'

class String
  def to_rpn
    RPN.new(self)
  end
end

class RPN
  attr_reader :queue

  def self.calc(queue)
    stack = []

    until queue.empty?
      stack << queue.shift

      if %i(+ - * / ** << >> % & ^ |).include?(stack.last)
        receiver, arg, op = stack.pop(3).map { |e| e.instance_of?(String) ? eval(e) : e }
        stack << receiver.send(op, arg)
      elsif %i(~ -@ +@).include?(stack.last)
        receiver, op = stack.pop(2).map { |e| e.instance_of?(String) ? eval(e) : e }
        stack << receiver.send(op)
      end
    end

    stack.pop
  end

  def initialize(formula)
    @formula = formula
    stree = Ripper.sexp(@formula)
    @queue = parse(stree[1..-1]).flatten
  end

  def parse(tree)
    queue = []

    case tree[0]
      when :paren
        queue << parse(tree[1..-1])
      when :binary
        return [parse(tree[1]), parse(tree[3]), tree[2]]
      when :unary
        return [parse(tree[2]), tree[1]]
      when :@int
        return tree[1].to_i
      when :@float
        return tree[1].to_f
      when :@rational
        return tree[1]
      when :@imaginary
        return tree[1]
      else
        if tree[0].instance_of?(Array)
          queue << parse(tree[0])
        else
          raise "Parse failed. `#{@formula}' - #{tree.inspect}"
        end
    end

    queue
  end

  def calc
    RPN.calc(queue.dup)
  end

  def to_s
    queue.join(' ')
  end
end
```

数式を解析する部分は `Ripper#sexp` を使用しました。

## 使い方

`String#to_rpn` を使用して変換出来ます。

```rb
rpn = '1 + 2 + 3'.to_rpn
p rpn.queue #=> [1, 2, :+, 3, :+]
p rpn.calc  #=> 6
puts rpn    #=> 1 2 + 3 +
```

直接配列を渡して計算させることも出来ます。

```rb
p RPN.calc([3, 4, :*]) #=> 12
```

gemにもしてみました。（残念ながらrpnの名前は取られていました）

https://github.com/siman-man/rrpn


## 参考サイト

https://en.wikipedia.org/wiki/Reverse_Polish_notation
CentOS6.10 今より容量の少ないDISKに交換

# CentOS6.10 今より容量の少ないDISKに交換

## `Rescue installed system`にて起動

*  CentOS-6.10-x86_64-minimal.iso

```bash:
# format
fdisk /dev/vdb
mkfs.ext4 /dev/vdb1
mkdir /vdb1
mount /dev/vdb1 /vdb1

rsync --exclude sys/ --exclude proc/ -a /mnt/sysimage /vdb1
```

## UUIDの修正

`/sbin/blkid`にて/dev/vda1のUUID値を確認。

* /boot/grub/grub.conf 
* /etc/fstab

内を修正。

## (トラブル)kernel panic

> Kernel panic - not syscing: Attempted to kill init!
> Pid: 1, comm: init Not tainted 2.6.32.-279.5.2.el6.i686 #1

これは /boot/grub/grub.conf 内の UUID値 を更新し忘れた場合起こる。
修正し`grub-install /dev/vda`して解決


## 以下メモ

## runlevelが空

```bash:
mkinitrd \
 /boot/initramfs-2.6.32-642.15.1.el6.x86_64.img \
 2.6.32-642.15.1.el6.x86_64 \
 --force
reboot
```

## sshdが起動しない場合

> runlevel:/var/run/utmp: No such file or directory
> Starting sshd: Missing privillege separation directory: /var/empty/sshd [FAILED]

```
mkdir /var/empty/sshd
chmod 711 /var/empty/sshd
```

> touch: cannot touch '/var/lock/subsys/sshd': No such file or directory

```
mkdir -p /var/lock/subsys
```

### 起動確認

```
service sshd stop
service sshd start
```

## mysqld, httpd が起動しない場合

* 起動していない・・・。一旦あきらめることに。

## /var/spool/cron: No such file or directory

* え？
std::functionからアロケータが消える

　今現在、C++1zのドラフトを読みながらC++17に備えているところなのですが、なんと[n4618](http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4618.pdf)によると`std::function`のコンストラクタからアロケータが削除されるようですね。これを見て私はもしや`std::function`が動的なメモリ確保をしなくなるのかと思いましたが、[ドラフト](http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/n4618.pdf)と[proposal](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r1.html)を見るとどうやら動的なメモリ確保自体はする可能性が残るようです。
　これは……実装依存に悩まされることの多いC++愛好家としてはどうなんでしょうかねぇ……。


quote from: proposal [p0302r1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r1.html)
>The class template std::function has several constructors that take an allocator argument, but the semantics are unclear, and there are technical issues with storing an allocator in a type-erased context and then recovering that allocator later for any allocations needed during copy assignment. Those constructors should be removed.


>>// 超訳
>>クラステンプレート std::function はアロケータを引数に取るコンストラクタをいくつか持っているが、そのセマンティクスは不明瞭である。また型消去を用いる都合上、アロケータを保持しその後コピー代入の際にアロケータを再び用いるなどの操作に技術的な問題がある。よってこれらのコンストラクタは除いてしまうべきである。
機械学習論文読みメモ_50


[Towards Deep Symbolic Reinforcement Learning](https://arxiv.org/pdf/1609.05518.pdf), NIPS2016WS
Deep reinforcement learningはtrial-and-errorを実現する機構として注目されている。
しかしその性能はdeep learning固有の制約に縛られている。
それは例えば、大量のデータを要求する事であったり、大量データがあったとしても学習が遅い、学習内容の抽象化レベルが低い、
また学習モデルによる推論プロセスは人間にとって理解しがたい、などである。
本論で提案する構造は、バックエンドにニューラルネットワークを採用しつつフロントエンドでは記号表現を用いる事で上記問題を解決する。
実験結果では、学習モデルが一定のsymbolic ruleを表現し、人間に理解可能である事を示した。
また性能面においても従来手法を上回る事を示した。

[TENSORIAL MIXTURE MODELS](https://arxiv.org/pdf/1610.04167.pdf)
画像の部分パッチのような局所構造に対する分布を混合させたモデルとしてTensorial Mixture Model (TMM)を提案する。
TMMは各局所構造同士の関係についてprior tensorによって表現される事前分布によってモデル化される。
Prior tensorが指数的に大きくなるため、TMMは一般的にintractableである。
ただし、prior tensorが分解可能である事を想定すると、この問題を回避できる。
分解された構造をネットワークで表現すると、CANDECOMP/PARAFAC (CP)分解では1層、Hierarchical Tucker (HT) modelによる分解であれば、多層隠れ層に対応する。
この構造を利用する事で、tractableかつ少ないハイパーパラメータ数でモデル化が可能になる。

[Decoupled Neural Interfaces using Synthetic Gradients](https://arxiv.org/pdf/1608.05343.pdf)
通常のニューラルネットワークにおける学習は、forward propagationとbackpropagationがシリアルに発生するため、並列に処理する事が出来ない。
本論では、それらを予測する事で並列処理を可能にする。
特に今回gradient lossに注目し、真のgradientを用いる代わりにモデルから得られるsynthetic gradientを用いる事で局所的に別々のサブグラフを構築し、asynchronousに学習する事を可能にした。
結果、RNNなどで、各層はback propagationを待つ事なく更新を行う事が可能になる。
またこの手法を応用して入力の予測にも利用可能で、backward/forward双方に関するサブグラフも可能になる。