OmniAICreator/Qiita-1.07M huggingface dataset:
Securing OpenAM 実践Ⅳ

> Set the OpenAM advanced property openam.auth.soap.rest.generic.authentication.exception to true. This causes OpenAM to return the same exception both when the user does not exist, and also when the password is not valid.

ユーザ名が存在していない場合でも、パスワードが誤っている場合でも同じ例外を返すようにするため、拡張プロパティで「openam.auth.soap.rest.generic.authentication.exception」を「true」に設定せよとのこと。

調べてみるとREST APIおよびSOAP APIで認証を行ったときにデフォルトだと
ユーザ名が適切な場合(パスワードが誤っている場合)とユーザ名が不適切な場合とでエラーメッセージが異なるらしいです。

デフォルトの状態で、存在するユーザ名と存在しないユーザ名でREST APIを実行してみたが、両方とも以下のエラーとなり、違いはありませんでした。。。

> {"code":401,"reason":"Unauthorized","message":"認証に失敗しました。"}

OpenAMのドキュメント([https://backstage.forgerock.com/docs/openam/13/dev-guide#rest-api-auth](https://backstage.forgerock.com/docs/openam/13/dev-guide#rest-api-auth))を見てみると、こんなエラーになることが記載されている。

> $ curl \
 --request POST \
 --header "Content-Type: application/json" \
 --header "X-OpenAM-Username: demo" \
 --header "X-OpenAM-Password: badpassword" \
 https://openam.example.com:8443/openam/json/authenticate
{
  "code":401,
  "reason":"Unauthorized",
  "message":"Invalid Password!!",
  "failureUrl": "http://www.example.com/401.html"
}

うーん、とりあえず設定はしておくけど、どういったときに効果を発揮するのかは知っておきたいな。英語の読解力がないだけかも。また気が向いたら、調べます。。。

> Remove the demo user account. For example, if you configure the embedded OpenDJ directory server as a configuration and CTS store, the default demo user account gets created during the installation process. You should remove the user using the OpenAM console under Realms > Top Level Realm > Subjects > User.

demoユーザは消しましょうとのこと。
入門書を読み終わったらゲームを作ろう #3 シューティングゲームを作る 1/3

#前回までのあらすじ
ようやくそれらしいゲームが出来たけど、まだ何か物足りない。具体的には、操作感や爽快感、すなわちリアルタイム性が足りていないような気がする。

#課題の前に
課題に入る前に、以下の準備を行うこと。

| 段階0 ウィンドウの表示 |
|:--|
| ウィンドウを表示し、Escapeキーを入力するとウィンドウが閉じるようにせよ。  |

今回からはよりゲームらしく、プレイヤーの入力をリアルタイムに読み取って操作を行う。言語やライブラリ等は一任するので、キーボードの読取りができるようにしておこう。筆者は**C++**をベースに、基本的なライブラリとして**DXLib**を用いた。

#今回の課題
それでは、基本的なシューティングゲームを制作しよう。シューティングゲームは次の基本動作を実装する。

+ プレイヤーの操作するオブジェクトを「自機」とする。
    + 自機は、ゲーム画面内を上下左右に移動することができる。
    + 自機は、特定のボタンを押すと画面右方向に弾を発射する。
    + 自機が弾を敵に当てると、得点が1増える。
    + 自機が敵の弾に当たると、ゲームが終了する。
+ プレイヤーを攻撃するオブジェクトを「敵」とする。
    + 敵は、画面の右方向から左方向へ移動する。
    + 敵は、ランダムになタイミングで画面左方向に弾を発射する。
    + 敵が自機の弾に当たると、敵はその場で消えて新しい敵が右端に誕生する。
    + 敵がゲーム画面内左端に到達すると、ゲームが終了する。
+ 自機や敵が発射するオブジェクトを「弾」とする。
    + 弾は、ゲーム画面端に到達すると消える。
    + 自機の発射する弾は、同じ画面に5個まで存在できる。
    + 敵の発射する弾は、同じ画面に10個まで存在できる。


##ゲームの完成図を予想する
以上の実装を聞いて、ゲーム画面を想像することができるだろうか。オブジェクトの色は？速度は？動きは？大きさは？と、考えることが無数に出てくるだろう。このまま作ると大変な目に遭うので、コーディングをする前にゲームの設計をしよう。

##ゲームの設計図「仕様書」
これから、各オブジェクトを「クラス」として扱う。それぞれのモノが**何を持ってる**か、そして**何ができるか**を与えてゲームを作っていこう。

###自機
**自機**は、自分自身の大きさや速度、色や得点を知っているだろう。これらの値を列挙しよう。

| 自機 |
|:--|
| 大きさ / 速度 / 色 / 得点 |

そして、移動と弾を発射することができる。下段に行動を列挙する。

| 自機 |
|:--|
| 大きさ / 速度 / 色 / 得点 |
| ・移動する　・弾を発射する |

また、自機は「自分が何発弾を発射したか」も知っているだろう。
さらに、何かに対して「自分は何かに衝突をしているか？」を確認できるはずだ。

| 自機 |
|:--|
| 大きさ / 速度 / 色 / 発射数 / 得点 |
| ・移動する　・弾を発射する　・衝突しているか？|

ゲームの構成という意味で、自分自身を画面に表示する機能も追加しよう。

| 自機 |
|:--|
| 大きさ / 速度 / 色 / 発射数 / 得点 |
| ・移動する　・弾を発射する　・衝突しているか？　・描画|

これが、今回のゲームで作る自機の要素となる。

###敵

**敵**についても同様に作ってみよう。最低限、以下のようなものが必要になるだろう。
自機の要素から得点を引いたものができる。

| 敵 |
|:--|
| 大きさ / 速度 / 色 / 発射数 |
| ・移動する　・弾を発射する　・衝突しているか？　・描画|

###弾

**弾**が弾を発射することがないので、敵からさらに発射に関係するものを削除するとよいだろう。
発射数などは自機などが管理するので、弾自身が弾の数を知る必要はない。

| 弾 |
|:--|
| 大きさ / 速度 / 色 |
| ・移動する　・衝突しているか？　・描画|

###共通部分を抜き出す
「自機」「敵」「弾」の3種類のオブジェクトが完成した。これらには共通する値や処理が多く存在している。それらをまとめて**インターフェース化**してみよう。各オブジェクトはこの要素を必ず持つことになる。

| インターフェース <<オブジェクト>> |
|:--|
| 大きさ / 速度 / 色 |
| ・移動する　・衝突しているか？　・描画|

###更に技巧的な話
ここから更に3つの要素を追加しよう。

1つめはオブジェクトの形を司る**矩形クラス**だ。衝突判定の際に、その形だけを情報として渡すと後々都合がよいので、始点と終点を与えた矩形をつくる。

| 矩形 |
|:--|
| 始点 / 終点 |
|  |

さらに、弾の管理をするための**弾テーブル**を作る。
自機が自分の弾すべてに指示を出そうとすると後で面倒なことになる。ましてやどの弾が生きているかを判断する機能まで備えると訳が分からなくなる。そこで、**弾についての情報を一元管理するクラス**を作成し、それに命令を出すようにしよう。弾テーブルは次のような形になる。

| 弾テーブル |
|:--|
| 現在の弾数 / 最大弾数 |
| ・描画　・移動　・弾の生成　・弾の削除　・弾が画面外に出たか？　・弾の矩形生成|

同様に、複数の敵の状態を管理する**敵テーブル**も作ろう。

| 敵テーブル |
|:--|
| 現在の敵の数 / 敵の最大数 |
| ・描画　・敵の生成　・敵の削除　・弾の発射　・敵の矩形作成|

###ゲーム全体を管理するクラス

最後に、ゲームそのものを作る**基底クラス**を作る。この中で各オブジェクトが活動する。
今回、基底クラスはタイマーの役割も兼ねることとする。

| 基底クラス |
|:--|
| タイマー / カウント / ウィンドウ生成関連ステータス |
| ・ウィンドウを作る　・タイマーを進める　・指定された間隔で信号を送る|

#今回のまとめ
今回はコーディングから離れて、以下のクラスを考えた。階層構造は以下のとおりである。

~~~
基底クラス
│
├自機<<オブジェクト>>
│└矩形
│
├敵テーブル
│├敵<<オブジェクト>>
││└矩形
│├敵<<オブジェクト>>
││└矩形
│:
│
└弾テーブル
 ├弾<<オブジェクト>>
 │└矩形
 ├弾<<オブジェクト>>
 │└矩形
 :
~~~

先にこのようなゲームに必要な要素を考えだすだけで、行き当たりばったりのコーディングよりよほど快適にゲームを作ることができる。これらのクラスは必要なものがあれば随時追加することを考慮しているため、必要最小限に留めていることを忘れてはいけない。

次回はこれらを用いてコーディングに入ろう。


#あとがき
今回の内容は非常に自信がないので、改善提案があればどんどんコメントやリクエストをお願いします。
kintoneでスペースにボタンを追加し、クリックでレコードを更新する

kintoneに「スペース」要素を追加し、そこにボタンを表示させてクリック時に特定のレコードを更新する処理です。

```javascript
kintone.events.on('app.record.create.show', function(e) {
    var record = e.record;

    /* ボタンの作成 */
    var button = document.createElement('button');
    button.innerHTML = 'click me';
    button.addEventListener('click', function() {
        var record = kintone.app.record.get();
        record['record']['xxx']['value'] = 'click the button!';
        kintone.app.record.set(record);
    });
    kintone.app.record.getSpaceElement('xxxx').appendChild(button);
});
```

- [kintone導入・開発支援 \| H2O space](https://h2o-space.com/service/kintone/)
macOSでpyenvで入れたpythonをPyCallで使うには

# 背景

pyenvで入れたpython 3.6.0でGPUを有効にしたtensorflowを入れた。

それを、JuliaからPyCall経由で使うため、

```jl
ENV["PYTHON"]="/Users/foo/.pyenv/versions/3.6.0/bin/python"
Pkg.build("PyCall")
```

とPyCallをPYTHON環境変数を指定してリビルドして、

```jl
using PyCall
```

すると、

```shell-session
ImportError: No module named site
```

# 対策

pyenvで入れる際に、libpythonがスタティクリンクなのが原因の模様。
pyenv install時にCONFIGURE_OPTS="--enable-shared"と、libpythonを
ダイナミックリンク指定で作成するオプションを渡すことで対応できた。

```shell-session
CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.0
```

# 参考資料

- http://qiita.com/some-nyan/items/56f2e23cc8c0134e33a7

# 関連記事

- [PYTHONビルド時の--enable-frameworkと--enable-sharedの違い](http://abrakatabura.hatenablog.com/entry/2017/07/08/130407)

- [mruby-juliaでPythonもmrubyから呼び出せるようになった](http://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [aobenchをjuliaでやってみた](http://abrakatabura.hatenablog.com/entry/2016/07/15/074022)
- [1/7がつくる楕円をJulia言語でプロットする](http://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
- [Julia言語で任意の点を散布図に描画するには - non vorrei lavorare](http://abrakatabura.hatenablog.com/entry/2016/11/12/081354)
- [Windows(MSVC)でmrubyからGPU対応のTensorflowを動かせた](http://abrakatabura.hatenablog.com/entry/2017/01/28/125353)
js 配列にロードローラー......だッ！

##お題
配列にロードローラー、つまりネストの異なる多次元配列を平らにならす。


```script.js
function roadroller(arr) {
//write your code.
  return arr;
}
roadroller([1, [2], [3, [[4]]]]); //[1, 2, 3, 4]
```

##出力結果 例

```js
([1, [], [3, [[4]]]])  //[1, 3, 4]
([1, {}, [3, [[4]]]]) // [1, {}, 3, 4]
```

##つかったもの
if文
isArray()
array.forEach()
push()

##考え方
引数が配列であるか判定して条件分岐する。
配列であれば、for...in文で順に取り出して再帰する。
配列でなくなるまで再帰を繰り返して、処理が終わったところで用意した別の配列に入れる。
上記をarray.forEach()で配列の各要素に実行する。
平らになった配列が返ってくる。
おわり


##コード

```script.js
function roadroller(arr) {
  var flattenedArray = [];
  var flatten = function(arg) {
    if (!Array.isArray(arg)) {
      flattenedArray.push(arg);
    } else {
      for (var a in arg) {
        flatten(arg[a]);
      }
    }
  };
  arr.forEach(flatten);
  return flattenedArray;
}
```

##その他コード

```js
function roadroller(arr) {
  return arr.reduce(function (flat, toFlatten) {
    return flat.concat(Array.isArray(toFlatten) ? roadroller(toFlatten) : toFlatten);
  }, []);
}
```

###他にもコードが浮かんだ方、コメントお待ちしております。
無線LANで固定IPアドレスを設定する

この記事は、無線LANを使用した場合に、決まったIPアドレスの割り当てを行う方法について、記載したものです。

今回は、Ubuntu desktop 16.10 のノートPC に IPアドレス 192.168.179.2 を割り振る場合についての方法を記載します。

・始めに試して、ダメだったもの：
/etc/network/interfaces に 以下の記載を追加して、ifdown、コマンドを行ったが、うまくいきませんでした。
allow-hotplug wlp1s0
iface wlp1s0 inet
address 192.168.179.2
netmask 255.255.255.0
network 192.168.179.1
geteway 192.168.179.1

ターミナルより、ifdown のコマンドを入力すると、以下のエラーとなり、設定できません。
~# ifdown wlp1s0
  unknown or method and no inherits keyword specified

・いろいろ調べたところ、以下のコマンドを入力することで、設定できました。
~# ifconfig wlpls0 down
~# ifconfig wlpls0 192.168.179.2 netmask 255.255.255.0 up
neovimのターミナルモードの色をTrue Colorで設定する

「[tmux on iTerm2 で斜体 & True Color を使う](http://qiita.com/delphinus/items/b8c1a8d3af9bbacb85b8)」を参考にTrue Colorの設定をしたところ、iTerm2上で設定した色がneovimのターミナルモードに反映されなかったので、設定方法を調べました。

# 設定

.nvimrcで以下の変数を設定します。

```vim:.nvimrc
let g:terminal_color_0  = "#1b2b34" "black
let g:terminal_color_1  = "#ed5f67" "red
let g:terminal_color_2  = "#9ac895" "green
let g:terminal_color_3  = "#fbc963" "yellow
let g:terminal_color_4  = "#669acd" "blue
let g:terminal_color_5  = "#c695c6" "magenta
let g:terminal_color_6  = "#5fb4b4" "cyan
let g:terminal_color_7  = "#c1c6cf" "white
let g:terminal_color_8  = "#65737e" "bright black
let g:terminal_color_9  = "#fa9257" "bright red
let g:terminal_color_10 = "#343d46" "bright green
let g:terminal_color_11 = "#4f5b66" "bright yellow
let g:terminal_color_12 = "#a8aebb" "bright blue
let g:terminal_color_13 = "#ced4df" "bright magenta
let g:terminal_color_14 = "#ac7967" "bright cyan
let g:terminal_color_15 = "#d9dfea" "bright white
let g:terminal_color_background="#1b2b34" "background
let g:terminal_color_foreground="#c1c6cf" "foreground
```

番号と色の対応があっているかあまり自信はないんですが、これでneovimのターミナルモードの色をTrue Colorで設定できます。

# 参考

* https://github.com/neovim/neovim/issues/4696
* https://www.reddit.com/r/neovim/comments/3iycxl/24bit_color_inside_neovim_terminal_possible/
SVN から Git(GitHub) へ移行した話と手順まとめ

## はじめに
少し前に会社のバージョン管理システムを Subversion（以下 SVN）から Git へ移行した。
こういう作業は滅多にやらないので、記憶があるうちに、手順や紆余曲折した点を記載しておこうと思う。
作業自体は Mac で行った。

## 事前準備
- パスワードや API キーなどが書いてある機密性が高いファイルは、環境変数に移行する
- `.gitignore`を作成し、バージョン管理しないファイルを記述する
- Git で無視されないように空のディレクトリに`.gitkeep`を追加する
- SVN リポジトリから不要なファイルを削除する（あれば）
- 作業用 PC に Git をインストールする
- GitHub にリポジトリを作成する
- 作業（ワーク）フローを決める（後述）

## 移行作業
### SVN から ローカルにクローン
- git svn clone -s --trunk=trunk -r HEAD http://SVNのtrunkリポジトリ

### リモートリポジトリ を origin として登録
- git remote add origin https://github.com/GitHubのリポジトリ/hoge.git

### Git の更新を読み込む
- git fetch

### Git の更新を取り込む
- git pull

### クローンしてきた SVN のソースを Git リポジトリにコピーする
- これは GUI でもコマンドでもOK

### 追加した内容（SVNのソース）をコミットする
- git add .（.でカレントディレクトリ全て）
- git commit

### Git リモートリポジトリへ push する
- git push -u origin master
- 強制的にプッシュしたい場合は`-f`オプションを代わりに付ける

### GitHub のリポジトリにあがっていれば成功

## 作業（ワーク）フローを決める
実質 git flow と github flow の 2 択だと思うが、
今回は github flow に リリース専用のブランチを足したオリジナルのフローで運用することにした。
つまり、

- master
- release
- feature/dev1
- feature/dev2
- ...

といった構成になる。

### 具体的なワークフロー
1. master から feature ブランチを作成
2. feature ブランチで作業を行い、完了したら release ブランチへプルリク（マージ）
3. release ブランチで本番環境までデプロイ
4. 本番環境で問題ないことが確認できたら release ブランチを master へプルリク（マージ）

こうすれば master ブランチは常に正常に動作するものだと保証ができる。
release ブランチをデプロイした際に不具合があれば、master ブランチをデプロイすれば良い。
現時点でこのフローで大きな問題は特に起きていない。

## 最後に
大変だったことをあげるとすれば、関係者が多すぎたこと。
1 つのリポジトリに対して、3 部署 ＋ 1 外注デザイナーが使用しているという構造だった。
移行作業は足並みが揃わないと実施できないため、合意してもらうための根回しとスケジュール調整に物凄く時間がかかった。

## その他よく使ったコマンド一覧
### ローカルの変更を確認
- git status

### Git の変更をマージ
- git merge --allow-unrelated-histories origin/master

### 現在のブランチとローカルブランチを表示
- git branch

### リモートブランチを表示
- git branch -r

### SVN で更新した差分を取り込む（便利）
- git svn rebase
Shpinxを使いつつメモ


## 方法がわからないけどできたらいいな

### 置換で複数行を使う

* その上で、引用だとわかる（リンク）ような書式にしたりしなかったり指定したい。

### 置換の定義を用語集に追加したい

* 置換テーブルを定義しておけば用語集としても使えるという用途。
* 用語の定義とわけたりマージしたりして表示したい。




## メモしたいトピック

### 全ドキュメントで定義して置換する

いくつかちょっとしたパターンがありそうだがなんとなく下記が良いかな。

```conf.py
rst_prolog= u"""
.. include:: definition.txt
"""
```

```conf.py
rst_prolog= u"""
.. include:: /define/definition.txt
"""
```

ビルド設定ファイル(conf.py) — Sphinx 1.4.4 ドキュメント http://docs.sphinx-users.jp/config.html#confval-rst_prolog

用語を定義したい — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会 http://sphinx-users.jp/reverse-dict/writing/replace.html

### Todoリスト

下記を設定した

```conf.py
todo_include_todos = True
```

### 注釈の表示で見やすくする

見た目だけでいれば見やすいな。。

```
.. note::

    これは注釈です！

.. warning::

    これは警告です！
```

4. Sphinxでの文章の書き方(reStructuredText) — study sphinx 1 documentation http://planset-study-sphinx.readthedocs.io/ja/latest/04.html#id22


### 画像の挿入

Cacooで書いた画像をSphinxに埋め込む拡張を使ったら便利だった - 毎日Learning
http://yoshiyoshifujii.hatenablog.com/entry/2015/02/04/172954

	idではなくて、urlを記載する必要があった

Sphinx に PlantUML のコードを埋め込む|へっぽこプログラマー クッツンの備忘録
http://kuttsun.blogspot.jp/2016/10/sphinx-plantuml.html

sphinxcontrib-plantuml 0.8.1 : Python Package Index
https://pypi.python.org/pypi/sphinxcontrib-plantuml

	newpageで区切っていると最初のページになってしまう

文章の途中に画像を埋め込みたい — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会
http://sphinx-users.jp/reverse-dict/images/inline.html


## 図を書く

https://github.com/mgaitan/sphinxcontrib-mermaid

markdown-preview-enhancedのマークダウンを取り込むSphinxフィルタ - Qiita
https://qiita.com/pashango2/items/cd78658bc16240ef23d8

	rawじゃないとうまく動いてくれなかった。

簡単にガントチャートとかクラス図とか書けるやつ - Qiita
https://qiita.com/rana_kualu/items/da394fd33ce019bf0ba7

## 参考

reStructuredText入門 — Sphinx 1.4.4 ドキュメント http://docs.sphinx-users.jp/rest.html#paragraphs

	脚註とか引用とか置換とかあるらしい

sphinx handson — study sphinx 1 documentation http://planset-study-sphinx.readthedocs.io/ja/latest/index.html

	一歩踏み込んだ使い方としてざっと読んだ方が良さそう

文章を書くときに — Python製ドキュメンテーションビルダー、Sphinxの日本ユーザ会 http://sphinx-users.jp/reverse-dict/writing/

	気になるトピックスを読んだ
遅すぎるMacを多少速くする

対象環境＝macOS Sierra
1. システム環境設定→ユーザとグループより、ユーザアカウントを新規に作る
2. システム環境設定→キーボード→入力ソースより、「ライブ変換」と「推測候補表示」をOFFにする
3. システム環境設定→アクセシビリティ→ディスプレイより、「透明度を下げる」をOFFにする
(Ubuntu desktop 16.10)でDiCEを動かす方法

この記事は、今まで Ubuntu Server 11.04 で使用していた、diced を Ubuntu desktop 16.10 で 動かしたときに「コマンドがみつかりません」のエラーとなり、起動しない為、その対処方法について、記載をしたものです。

・原因
いろいろ調べたところ、diced は 32bit用の実行プログラムで、Ubuntu desktop 16.10 は 64bitOS の為、動作しないことがわかりました。

・対応方法
以下のホームページを参考にさせて頂きました。
 http://yoshihiko.shodai.tokyo/archives/99

まず、lib32stdc++6 のパッケージをインストールします。
ターミナルを起動して、以下のコマンドを入力します。
 $ sudo apt-get install lib32stdc++6
   ここで、下記のエラーが出力されて、インストールができない状態となりましたが、原因がよくわからなったので、reboot したら、うまくできました。
   E: ロック /var/lib/apt/lists/lock が取得できませんでした - open (11: リソースが一時的に利用できません)
 　E: ディレクトリ /var/lib/apt/lists/ をロックできません

インストール後、以下のコマンドを入力してみると、ちゃんと diced が起動しました。
 $ cd /usr/local/bin/DiCE
 $ ./diced | nkf -uw
mysqlでgroup byを使用したときの結果が違う

mysql version: 5.5.42

mysqlこんな値を書いたとします。

```sql

select max(price) as max_price, products.* from products group by category_id

```

このようにした場合、max_priceと products.*は同じrowから取得されるとは限らないので注意！

http://stackoverflow.com/questions/979034/mysql-shows-incorrect-rows-when-using-group-by

私は同じrowから取得されると勘違いしていたので、自戒とメモの意味を込めて投稿しました。
Breadcrumb NavXTでliに付けたclassやitemcopeが削除されて保存される場合の対処法



## 何が起きたか

「[Breadcrumb NavXT](https://ja.wordpress.org/plugins/breadcrumb-navxt/)」というWordPressプラグインを用いて生成するパンくずリストをSchema.orgのBreadcumbに対応させるため、以下のように出力タグに属性をつけようと思いました。

```html
<!-- リンクなし -->
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name">%htitle%</span><meta itemprop="position" content="%position%"></li>
<!-- リンクあり -->
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a itemscope itemtype="http://schema.org/Thing" itemprop="item" title="%title%" href="%link%"><span itemprop="name">%htitle%</span></a><meta itemprop="position" content="%position%"></li>
```

しかし、出力されるタグには`<li>`の属性だけなくなった状態で出力されてしまいました...。

```html
<!-- リンクなし -->
<li><span itemprop="name">%htitle%</span><meta itemprop="position" content="%position%"></li>
<!-- リンクあり -->
<li><a itemscope itemtype="http://schema.org/Thing" itemprop="item" title="%title%" href="%link%"><span itemprop="name">%htitle%</span></a><meta itemprop="position" content="%position%"></li>
```



## 対処法

functions.phpに、Breadcrumb NavXTの`bcn_allowed_html`という関数にhookする関数を加えることで解決できました。

```php:functions.php
function my_bcn_allowed_html($allowed_html)
{
    $allowed_html['li'] = array(
        'title' => true,
        'class' => true,
        'id' => true,
        'itemprop' => true,
        'itemscope' => true,
        'itemtype' => true
    );
    return $allowed_html;
}
add_filter('bcn_allowed_html', 'my_bcn_allowed_html');
```



## 参考

https://wordpress.org/support/topic/why-cant-i-add-itemscope-and-itemtype-to-category-template/
https://mtekk.us/archives/guides/how-to-add-li-and-other-tags-to-breadcrumb-templates/
今日から始めるiOS Development

# やることリスト

* developer programへの登録（任意）
* dependency management toolのインストール
* dependencyの記述
* dependencyの追加(この記事はここまで)
* storyboardでのUI設計
* UI Controller実装
* Emulator
* 実機確認
* リリース

## 前提

Xcodeがインストールされていて、プロジェクトも作成されていること。
Xcodeは8.2以降で、swiftは3.0以降とする。
バージョン確認は、XcodeならPreferenceから。swiftは`swift --version`で。

## developer programへの登録（任意）

https://developer.apple.com/programs/
ここから登録をする。年間約12000円也。
リリースするまでは保留で良い予感。

## dependency management toolのインストール

[CocoaPods](https://cocoapods.org/)か[Carthage](https://github.com/Carthage/Carthage)のどちらかを選択。
今回はCarthageを選択する。

インストールは[homebrew](http://brew.sh/index_ja.html)で行うことにする。

```bash:bash
brew update && brew doctor
brew install carthage
# installされていることを確認
carthage version
```

## dependencyの記述

CarthageではProjectに`Cartfile`というファイルを作成する必要がある。
詳しくは https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile を参照のこと。

ここでは`PromiseKit`と`PromiseKit/Alamofire`をProjectのroot directoryに追加する。

```bash:
cd <project-root>
cat > Cartfile << EOF
# Promise Kit for Alamofire
github "PromiseKit/Alamofire-" ~> 1.0

# Promise Kit
github "mxcl/PromiseKit" ~> 4.0
EOF
```

```text:Cartfile
# Promise Kit for Alamofire
github "PromiseKit/Alamofire-" ~> 1.0

# Promise Kit
github "mxcl/PromiseKit" ~> 4.0
```

新しいファイルが作られるのでgitでバージョン管理しないものを`.gitignore`に追加する。

```bash:
cat > .gitignore << EOF
# Carthage
Carthage/
EOF
```

```text:.gitignore
# Carthage
Carthage/
```

## dependencyの追加

carthageで取得したdependencyをprojectに追加する。
ここからはXcode上の操作となります。

### Project -> General -> Linked Frameworks and Libraries
`+`を押して`Add Other...`から、`Carthage/Bulid/iOS`内の`.framework`のフォルダをopenで追加
今回は、以下の3つを追加する。

* Alamofire.framework
* PMKAlamofire.framework
* PromiseKit.framework

### Project -> Build Phases
`+`(左上にある)を押して`New Run Script Phase`で追加

### Project -> Build Phases -> Run Script
Shellにscriptを実行するshellを追加して、下のボックスに実行するscriptを記述

```text:ボックス
/usr/local/bin/carthage copy-frameworks
```

`Add input files here`に使用するframeworkを追加

* $(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
* $(SRCROOT)/Carthage/Build/iOS/PMKAlamofire.framework
* $(SRCROOT)/Carthage/Build/iOS/PromiseKit.framework

キャプチャ
<img width="862" alt="Screen Shot 2017-01-29 at 18.39.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/102965/49c50b9f-71c7-7b85-dbc2-163ae6269fdf.png">

これで、Souce Codeに追加したFrameworkをimport出来るかと思います。
次は機会を見つけて実装以降について書こうかと思います。
Faradayを使ったプログラムをRspecでテスト（Railsでない）

Faradayを使ったプログラムをRSpecでテストする際に、どうテストコードを書いたら良いのかわからずに詰まってしまったので、その時のメモ。

結論としては２つ。
* Faradayにはテストを意識したスタブ作成用のクラスが用意されているのでそれを使う。
* RSpecでFaradayのconnectionを取得する箇所を差し替える。

## サンプル
Faradayを使う普通のrubyクラス。これがテスト対象

```rb

require "faraday"

class TestFaraday
  def get
    con = connection
    res = con.get('http://google.co.jp')
    res
  end

  private
  def connection
    Faraday.new
  end
end
```

次に上のクラスをテストするテストケース

```rb
require 'json'
require_relative '../test_faraday.rb'

describe 'test faraday spec' do

  let!(:test_faraday) do
    # ここでスタブの定義
    stub_con = Faraday.new do |conn|
      conn.adapter :test, Faraday::Adapter::Test::Stubs.new do |stub|
        stub.get('http://google.co.jp') do
          # 左からstatus code, response_header, response body
          [200, {}, {id: 3, foo: "bar"}.to_json ]
        end
      end
    end

    # TestFaraday内のconnectionメソッドの返却値をスタブに差し替える
    instance = TestFaraday.new
    allow(instance).to receive(:connection).and_return(stub_con)
    return instance
  end

  it 'faraday test' do
    res = test_faraday.get
    expect(res.status).to eq 200
    json = JSON.parse res.body
    expect(json['id']).to eq 3
    expect(json['foo']).to eq "bar"
  end
end
```

## 参考
[公式]("https://github.com/lostisland/faraday")
[Faraday の スタブテスト]("http://dev.classmethod.jp/tool/faraday-stub-test/")
Macの環境構築をAnsibleに任せる (システム環境設定)

新型MacBook Proが出たということで買い替えを検討していますが、買い替えをする前に自分の環境構築を振り返っておこうと思いました。

以前 [Macの環境構築をAnsibleに任せる](http://qiita.com/itkr/items/82ddb1902b0051940526) で `git` や `copy` を使って設定ファイルの設置や、`homebrew` でライブラリのインストールなどを行いました。今回はその続きで、システム環境設定についてです。

## `defaults` コマンドによるシステム環境設定

前回の記事のコメントで、「Macのシステム環境設定は"defaults"コマンドで各設定ファイルを書き換えることで変更することができます。」と教えていただきました。`default` コマンドを使うといろいろMacの設定を変更できるようです。

### コマンドの使い方

例えば下のコマンドを実行することでファインダーの効果音を無効にできます。

```
$ defaults write com.apple.finder FinderSounds -bool false
```

`defaults` コマンドについての詳細は

```
$ man defaults
```


### Ansibleでの実行

調べてみるとAnsibleにも `defaults` 用のモジュールがありました。(http://docs.ansible.com/ansible/osx_defaults_module.html)

```yml
- osx_defaults:
    domain: com.apple.finder
    key: FinderSounds
    type: bool
    value: false
```

このように書くことで、Ansibleでも `defaults` コマンドを実行できます。

### 実装例

参考までに、自分のplaybookの一部を書いておきます。osx/tasks/main.yml に実際のタスクを書いておき、osx/vars/main.yml に変数としてそれぞれ個別の設定を入れています。

```osx/tasks/main.yml
- name: Set OSX Defaults
  osx_defaults: >
    domain={{ item.domain }}
    key={{ item.key }}
    type={{ item.type }}
    value={{ item.value }}
    state={{ item.state|default('present') }}
  with_items: "{{ osx_settings }}"
```

```osx/vars/main.yml
osx_settings:
  # フルキーボードアクセスの有効化
  - {
      domain: NSGlobalDomain,
      key: AppleKeyboardUIMode,
      type: int,
      value: 3
    }
  # ファイル拡張子を常に表示
  - {
      domain: NSGlobalDomain,
      key: AppleShowAllExtensions,
      type: bool,
      value: true
    }

# ...
```

## 設定探しの旅へ

`defaults` コマンドは非常に便利なのですが、Apple公式の一覧が存在するわけではなく、自分で探し出すかネット上の情報を頼りにする必要があります。

Ansibleで環境設定ができるようにはなったのですが、まだまだ自分の好みの設定の全てをplaybookにはできていないので `defaults` の設定探しの旅が続くと思います。
落として泣く前にHoloLens実機にケーブルなしでアプリをデプロイする

#はじめに
なかなかお高いHoloLensですが、未来が見たいので思わずポチってしまいました。
早速、簡単なアプリをネットの記事を参考にUSBケーブルでデプロイ！というときに、PCとHoloLensを繋いでいるケーブルを引っ掛けてヒヤリという経験をしました（汗）危ない。
この記事ではそんなHoloLensを落として泣くリスクをへらすためのWifi経由のデプロイについて書きます。

#環境
- Windows 10 64bit
- Unity 5.5.0f3
- HoloLens(Development Edition)
- VisualStudio2015
- Wifi

#前提
この記事はUSBケーブルでの実機デプロイができていることを前提とします。
なので、アプリの作成、ビルド、初回デプロイ時の設定は割愛します。
ちなみに私は下記のページを参考にしました。
http://www.buildinsider.net/small/hololens/002

#Wifi経由のデプロイ
手順自体はhttps://developer.microsoft.com/en-us/windows/holographic/holograms_100
のChapter 5に書いてありますが、UnityからVisual Studio solutionを出力したところから始めます。

1. 出力したVisual Studio solutionを起動し、赤枠で囲った箇所をRemote Machineに変更します。（USB接続の場合はDeviceです）
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/d61dc6b6-57be-d47f-ab85-0ab257378332.png)　　　　　　　　　　　
2. Remote Machineに変更すると下図のリモート接続の設定画面がでてくるので、Addressに入力するIPをHoloLensで調べます。  
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/8259f0fb-36e9-d26e-a5cf-f16f842b9674.png)
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
3. HoloLensを起動し、Settings→Network & Internet→Advanced Optionsを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/03f77889-d8c1-c665-d94a-b335a895406b.png)　　　　　　　　　　　　　　　　　　　　　
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/490e468d-e085-3a12-9c99-326634e58985.png)　　　　　　　　　　　
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/7c857f2a-06ad-d33e-1b5a-83169d667711.png)　　　　　　　　
4. 表示されたIPv4 addressをメモし、先ほどのリモート接続の設定画面に入力し、Selectを押下。
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/2227cf1f-066b-2e07-beb6-4ecfe4e059a3.png)　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/9ebfe0a4-977c-5dc4-f8aa-f9e1c9c237f1.png)　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
5. Remote Machineを押下するとデプロイ処理が行われ、デプロイ完了後にアプリが起動します。デバック起動したくない場合はDebug→Start without debuggingで起動してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/d61dc6b6-57be-d47f-ab85-0ab257378332.png)

#IPの設定を間違えた場合
一度IPを設定するとリモート接続の設定画面が出てこなくなるので、IPの設定エラーが出た場合は以下の手順で修正します。
( "Hey Cortana, What's my IP address?"で取得したIPがLANの構成の関係？で間違っていたので、ハマりました。)
1. Solution Explorerでアプリのプロジェクトを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/5bfd06e5-1128-9fb8-7a53-62208c1fd2f6.png)　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
2. Project→(プロジェクト名) Propertiesを選択 
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/c70714f9-cdac-4a1e-1989-b8f18f817d53.png)　　　　　　　　
3. 表示されたプロジェクト設定画面のDebugにIPの設定があるので修正します。
![image](https://qiita-image-store.s3.amazonaws.com/0/60734/76b307f0-c6be-b66d-ba54-d36498b6613c.png)

#おわりに
HoloLensを落として泣くリスクをへらすとともにHoloLensを被りながらデプロイできるので、やったことない方は是非試してみてください！
Ubuntu 16.04.LTS に TensorFlow をインストール

Ubuntu 16.04.LTS には Python3 がついてくる。
Python2 系に戻る気がなければ pip でやるのが一番簡単。

# pip3 のインストール
sudo apt install python3-pip

# TensorFlow のインストール
## CPU のみなら
pip3 install tensorflow
## GPU を使う場合
pip3 install tensorflow-gpu


これだけ！
{old_status}_to_{new_status}が効かなかった話

```php:function.php
function my_func($post_obj){
  //do something...
}
add_action( 'new_to_publish', 'my_func' );
add_action( 'draft_to_publish', 'my_func' );
```

こんな感じで記事が新規に公開された時にフックしてる人は多いと思う。僕も過去に実績があって、何の違和感もなく実装した。しかし動かなかった。

#検証した

```php:function.php
function test( $new_status, $old_status, $post_obj ){
    debug_print($new_status,"new");
    debug_print($old_status,"old");
}
add_action('transition_post_status','test',10,3);
```

`debug_print`は`var_dump`をファイルに出力するための関数だと思ってくれ。

```text:結果
new------
string(7) "publish"
old------
string(10) "auto-draft"
```

`自動下書き`から`公開`に遷移していたらしい。
なので`auto-draft_to_publish`を追加して解決しました。

```php:function.php
function my_func($post_obj){
  //do something...
}
add_action( 'new_to_publish', 'my_func' );
add_action( 'draft_to_publish', 'my_func' );
add_action( 'auto-draft_to_publish', 'my_func' ); //これを追加した。
```
wordpressのテーマデプロイを自動化する

## 現状のwordpressデプロイの問題提起
wordpressのデプロイには[wordmove](https://github.com/welaika/wordmove)や以前に自分が紹介していた[wp-deploy](https://github.com/Mixd/wp-deploy)、他にも[bash-wp-deploy](https://2inc.org/blog/2017/01/22/5594/)などがありますが、どれもwordpressのコアファイルも全て取り扱うのを主軸に考えて使われているツールになります。
(紹介時の記事はこちら <a href='http://qiita.com/soramugi/items/6ccf715293dffce9a1b0'>WordPressのデプロイをwp-deployで設定する - Qiita</a>)

ですが、実際にwordpressでの開発をするときにはテーマファイルのみを編集する事が推奨されています。テーマファイル以外の編集をしてしまうとwordpressのバージョンアップが出来なくなるため、通常であればテーマファイルのみの編集で開発をしていきます。

前述の通りのデプロイツール群のようにwordpressのコアファイルを取り扱ったり、コアを丸ごとバージョン管理をしたい気持ちも分からないでも無いですが、そのままだとwordpressが持っている自動アップデート機能を本番環境で実行してしまうと手元のバージョンとの不一致が出て自動更新が出来なくなります。本来持っている自動アップデート機能を存分に発揮させるためにはテーマ単体でのバージョン管理を行い、テーマ単体でのデプロイが本来必要な機能なのかなと考えます。もっとカジュアルに開発していきたいですしね。

## 提案
テーマファイルのデプロイだとテーマの更新機能が既にあるので、それを公式のwordpressテーマに載っていないもの=野良テーマ(開発を行うテーマ)でも更新機能の恩恵が受けられないかと調べてみると、案外[簡単にできる](http://nelog.jp/theme-update-checker-php)ようだったので、この設定をgithubのリポジトリから更新検知されるように設定しました。テーマの更新を検知してしまえば[Advanced Automatic Updates](https://wordpress.org/plugins/automatic-updater/)のプラグインなんかを使えば自動アップデートを行うことも簡単かと思います。

それと、テーマとコアを分離することが出来れば、[テーマのテスト](http://qiita.com/horike37/items/1014a8405475c6bf2daa)をバージョン毎で実行する事が簡単に出来るようになるので、自動アップデートをしたくなく、手動でアップデートをする際にもあらかじめテスト実行で問題が無いかが確認出来るのでメリットがあるかなと思います。

以下、設定方法。

## 設定方法

- ライブラリの設置
- jsonファイルの設置
- functions.phpにコードを記述

<a href='http://w-shadow.com/blog/2011/06/02/automatic-updates-for-commercial-themes/comment-page-8/'>Automatic Updates For Private And Commercial Themes | W-Shadow.com</a>
の「Client library」からphpファイルのダウンロード、テーマディレクトリに設置

jsonファイル`update-info.json`の設置

```json
{
  "version" : "1.0",
  "details_url" : "https://github.com/soramugi/react-wp-sample",
  "download_url" : "https://github.com/soramugi/react-wp-sample/archive/master.zip"
}
```

functions.phpに以下を記述

```php
<?php
require 'theme-update-checker.php';
$example_update_checker = new ThemeUpdateChecker(
  'react-sample',
  'https://raw.githubusercontent.com/soramugi/react-wp-sample/master/update-info.json'
);
```

この状態でコミット、で実際のコミットログは以下
https://github.com/soramugi/react-wp-sample/commit/cda3bbb508041de89671ba4e0b91201b108fdd40

このテーマリポジトリをzipでダウンロード、wordpressにテーマインストール、jsonファイルのバージョンアップデートしてコミット&プッシュ
https://github.com/soramugi/react-wp-sample/commit/767960a81d9aac390f744793e236a28ecc1be4da

で画面のように更新検知が出来ました

![スクリーンショット 2017-01-29 16.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/6406/11432aa8-1aa3-9542-2c6e-126d5092d475.png)


あとは前述の通り、[Advanced Automatic Updates](https://wordpress.org/plugins/automatic-updater/)等の設定を行えば自動アップロードが可能かと思います。

この方法だとパブリックなgithubの環境に置いておくものだと、jsonファイルの情報やテーマファイルが閲覧出来ているので簡単に設定できるのですが、ソースコードを公開したくないテーマの開発を行う際にはjsonファイルやテーマのzipファイルを非公開環境に設置して、wordpressでのサーバーからのみ閲覧可能にしておく対応が必要になります。

参考: <a href='http://nelog.jp/theme-update-checker-php'>野良Wordpressテーマにも公式のような更新通知機能をつけるカスタマイズ方法</a>
UNIXコマンド一覧

[UNIXコマンド入門 (一般ユーザー編) (全16回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_unix)　より、頻出コマンドを一覧にしました。

###プロンプト
`[vagrant@localhost ~]$　`
//ユーザー名@ホスト名  ~ は、チルダと呼び、ホームフォルダを示す。　$は、一般ユーザーを示す。

##コマンド一覧

###パスワードの変更コマンド
`passwd`

###今いるディレクトリを表示
`pwd`

###ディレクトリを変更
`cd`

###ディレクトリの相対指定・絶対指定
`.` 相対指定
`..` 絶対指定

###ディレクトリの中身をリスト表示
`ls`

##オプション

`ls -l`  そのファイル/フォルダの情報を表示
表示されたプロンプトについて

例
`d rwxr-xr-x. 3 vagrant vagrant 4096 9月 10 03:59 2016 centos65`
`d` はディレクトリを示す　`rwxr-xr-x.`はパーミッション※　`vagrant`は所有者　`vagrant`は属しているグループ　`4096`はサイズ　`9月 10 03:59`は最終更新日　`centos65`は名前
※(rwxは所有者のパーミッション、r-xはグループのパーミッション、r-x.は全ての人のパーミッション。`r:read w:write x:`実行)

##※パーミッションの変更について

___ には、 rwxの数字の足し算で、「所有者・グループ・全ユーザー」のそれぞれのパーミッションを設定
`4:r:read`
`2:w:write`
`1:x:` 実行

`chmod ___ `ファイル名かディレクトリ

###例
`chmod 755 /home/js/foobar.js`
これだと、所有者はrwx、グループはr-x、全ユーザーはr-x

`ls -a` 隠しファイルを表示

###ディレクトリの作成
`mkdir` ファイル名

###ディレクトリの削除
`rmdir` ファイル名

ファイルのコピー
`cp` ファイル名 ファイル名(コピー)

###ファイルの削除
`rm` ファイル名

###ファイルの移動
`mv` ファイル名 移動先ディレクトリ

###ファイルの名前変更
`mv` ファイル名 変更後のファイル名

###☆複数ファイルをまとめてリネーム
`rename {正規表現} {処理対象}`
####例: txtファイルをまとめてcsvファイルに変更
`$ rename 's/.txt/.csv/' *.txt`

###ファイルの中身を表示
`cat ファイル名`

###ファイルの中身を１画面づつ表示
`less ファイル名`
`more ファイル名`

###先頭だけ/最後だけ表示
`head ファイル名`
`tail ファイル名 -表示したい行数`

###ワイルドカード
任意の文字いくつでも
`*`

###任意の文字1文字
`?`

###ファイルの検索
`find [検索したい場所とか] -name "名前" -type [ファイル形式]`
例 test_　と記してあるファイルを検索したい ファイルだけ検索したい
`find . -name "test_*" -type f`

###ファイルの中身を検索する
`grep -オプション 探したい文字列 対象となるファイル`
例 111の記述を、全ファイルから検索.記述されてる数も知りたい
`grep -c 111 *`

例 111の記述を、全ファイルから検索. ディレクトリが同一階層にある場合、下のディレクトリも全部検索
grep -r 111 *

##その他コマンドラインの便利な使い方
###ファイル指定などの補完
`tab`

###過去のコマンドを遡る
`↑↓` (キーボード)

###リストから遡る
`history`

###そのリストからコマンドを選んで実行
`!リストの番号`

直前のコマンドをもう一度実行
`!!` 

###過去のコマンドから補完実行
例 grepをやりたい
`!gr`
実行せずに表示するだけ
`!gr:p`

##その他便利なコマンド

###コマンドマニュアル表示
`man コマンド名`

###ディレクトリ構造をツリー構造で表示
`tree`

###現在時刻表示
`date`

###ファイルの行数表示
`wc -l ファイル名`
コマンドラインから自分のグローバルIPアドレスを取得する for Windows PowerShell

[コマンドラインから自分のグローバルIPアドレスを取得する](http://qiita.com/hyone/items/8b7132c8f0d8c8f53f40)

のWindows　PowerShell版を作ってみた。

[IP Address Details - ipinfo.io](http://ipinfo.io/) というサイトほんと便利ですね。

（そして頭かくして尻隠さずなところはお約束）

```
PS C:\tmp> #オブジェクトを取得
PS C:\tmp> $infos = Invoke-RestMethod -Uri "ipinfo.io"
PS C:\tmp> #オブジェクトをそのまま表示
PS C:\tmp> $infos


ip       : **.***.***.**
hostname : hogebank************.bbtec.net
city     : HogeCity
region   : HogeCity
country  : JP
loc      : **.****,***.****
org      : AS***** Hogebank BB Corp.
postal   : ***-****



PS C:\tmp> #オブジェクトのメンバー表示。StringじゃないところがPowerShellっぽい
PS C:\tmp> $infos | gm


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
city        NoteProperty string city=HogeCity
country     NoteProperty string country=JP
hostname    NoteProperty string hostname=hogebank************.bbtec.net
ip          NoteProperty string ip=**.***.***.**
loc         NoteProperty string loc=**.****,***.****
org         NoteProperty string org=AS***** Hogebank BB Corp.
postal      NoteProperty string postal=***-****
region      NoteProperty string region=HogeCity


PS C:\tmp> # 結局はこうすればグローバルIPが表示されます
PS C:\tmp> $infos.ip
**.***.***.**
PS C:\tmp> # さらに簡略系
PS C:\tmp> (Invoke-RestMethod -Uri "ipinfo.io").ip
**.***.***.**
PS C:\tmp>
```
Fluentdを使ってTwitter Public streamsをAmazon S3に保存する

Twitter Public streamsに対して分析を行いたいと思っても、ウェブ上にDumpを公開するのはNGとされており必要なら自分で収集する必要があります。
以前は自作のPythonスクリプトを常時実行していたのですが、雑過ぎてプロセスが死ぬことが多発することとローカルのディスクに溜め込み続けていたためディスクが逼迫してしまう問題が発生。
この辺ちゃんと作り込めばいいんでしょうが、FluentdにはPublic streamsにもAmazon S3にもアクセスできるプラグインが用意されていたのでそれを使って全自動で収集し続けられるように設定してみました。

※手順はかなり昔に設定した内容を思い出しながら書いているので抜け漏れあるかもしれません。。その時はご指摘お願いします:bow_tone1:

#インストール

今回はCentOS 7にインストールして動かしてみました。

```
#curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
#sudo /etc/init.d/td-agent start
#sudo /etc/init.d/td-agent status
```

#プラグインのインストール
TwitterとAmazon S3へのアクセスのためのプラグインをインストールします。

```
#sudo td-agent-gem install fluent-plugin-twitter
#sudo /usr/sbin/td-agent-gem install fluent-plugin-s3
```

#td-agent.confの設定
設定をtd-agent.confの行末に追加

```/etc/td-agent/td-agent.conf
<source>
  type twitter
  consumer_key xxxxxxxxxxxxxxxxxxxxxxxxxxx
  consumer_secret xxxxxxxxxxxxxxxxxxxxxxxxxxx
  oauth_token xxxxxxxxxxxxxxxxxxxxxxxxxxx
  oauth_token_secret xxxxxxxxxxxxxxxxxxxxxxxxxxx

  tag input.twitter.sampling
  timeline sampling
  lang ja
  output_format nest
</source>

<match input.twitter.sampling>
  type copy

  <store>
    type s3
    aws_key_id xxxxxxxxxxxxxxxxxxxxxxxxxxx
    aws_sec_key xxxxxxxxxxxxxxxxxxxxxxxxxxx
    s3_bucket hogehoge
    s3_region ap-northeast-1
    s3_enpoint s3-ap-northeast-1.amazonaws.com
    path streaming_api_logs/
    buffer_path /var/log/td-agent/s3

    time_slice_format %Y%m%d%H
    s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}.%{file_extension}
    time_slice_wait 5m
    buffer_chunk_limit 256M

    utc
  </store>
</match>
```
事前にTwitterとAWSのAPIは取得しておきます。
日本リージョンにバケットを作成し、バケットにAPIからアクセスの許可をしておくことが事前に必要です。

# 動作結果
うまく動作すると1時間おきにAmazon S3にgz圧縮されたファイルが転送されます。
時々ファイル名が_1のものが作成されますが、圧縮前のファイルサイスが256MBを超えた場合自動で連番にしてくれるようです。

![img.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/d15106d0-ca6d-d033-789a-a3f7f0e7c98d.png)

データは溜め込めたんですが、これからどうやって活用していくかはこれから考えます:stuck_out_tongue:

## 参考
こちらを参考にいたしました。
ありがとうございます。

[fluentd インストール](http://qiita.com/ohayougenki/items/5341b313a2226093480b)
wordpressの初期テーマを作成

<a href='http://qiita.com/soramugi/items/10aec0c510f3b0ba23aa'>wordpressをローカル環境に設定を行う - Qiita</a>
の設定を行ってからの人を対象とする。
といってもディレクトリ作ってファイル置くだけなのでなんてことは無いが。

```
cd wp-content/themes/
mkdir react-sample
cd react-sample
echo 'Hello React Sample' > index.php

cat <<EOF > style.css
/*
Theme Name: React Sample
*/
EOF
```

これだけでwordpressの管理画面からテーマの設定が出来る。
![スクリーンショット 2017-01-29 15.20.35.png](https://qiita-image-store.s3.amazonaws.com/0/6406/5e3c35a2-a1d1-2f4d-e2a6-610f5b41d8b0.png)

で設定できた画面がこちら
![スクリーンショット 2017-01-29 15.20.44.png](https://qiita-image-store.s3.amazonaws.com/0/6406/4c88054f-cca4-7eb1-8750-4d7d31771180.png)
wordpressをローカル環境に設定を行う

```sh

    curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    chmod +x wp-cli.phar
    sudo mv wp-cli.phar /usr/local/bin/wp
    
    
    export DB_NAME='wpdev'
    export DB_USER='root'
    export DB_PASS=''
    export DB_HOST='127.0.0.1'
    export PORT='8080'
    
    wp --info
    wp core download --locale=ja
    
    wp core config \
    --dbhost="$DB_HOST" \
    --dbname="$DB_NAME" \
    --dbuser="$DB_USER" \
    --dbpass="$DB_PASS"
    
    wp core install \
    --url=http://127.0.0.1:$PORT \
    --title="WordPress" \
    --admin_user="admin" \
    --admin_password="admin" \
    --admin_email="admin@example.com"
    
    open http://127.0.0.1:$PORT
    wp server --host=0.0.0.0 --port=$PORT
```

wp-cliの機能のみでwordpressのインストール、設定ファイルの記述、dbの作成や初期ユーザーの作成、ビルトインサーバーを使用してのサーバー立ち上げが可能です
React Native事始め。macOSでReact Nativeの開発環境を準備する


必要なものを入れる
------

まずはHomeBrew入れておきます。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

必要なパッケージを入れる。

```
brew install node
brew install watchman
```

React Native CLIを入れる。

```
npm install -g react-native-cli
```

開発環境
------

Atom + React Nativeパッケージで開発します。

Atomは下記からダウンロード
https://atom.io/

Atomのパッケージインストールで下記を入れる。
- atom-react-native-autocomplete
- atom-react-native-css

デバッグ環境
------

chromeのConsoleで可能ですがStandaloneのDebuggerの方が諸々便利なので入れておきます。

```
brew cask install react-native-debugger
```

まとめ
------

開発環境までの準備も非常に簡単ですぐに始められるのが良いですね。

Please enjoy React Native.


参考URL
------

React Native公式
https://facebook.github.io/react-native/docs/getting-started.html

React Native Debugger
https://github.com/jhen0409/react-native-debugger
フォームの入力に対して高コストな関数を遅延実行させる

# 問題
ユーザーのフォーム入力に対してそこそこ高コストな処理（ファイルを読み込んでcanvasに描画,結果をimageとしてプレイビュー表示)を行う必要があった
フォームの変更(inputイベント)に対して即座に描画関数を呼び出すと高負荷でフォームの変更を妨げてしまった
# 対処
フォームの変更から一定時間後に高コストな関数を実行させるようスケジュールし,ディレイ中にフォームが更新され再度イベントが起きたらスケジュールをキャンセルし再度スケジュールし直す.
これで短時間に何度もフォームが更新されても一度しか関数は実行されない.

# コード
setTimeoutとclearTimeoutでスケジューリングを行う.
promiseを使ったコードは勉強不足ですぐに書けなかったので調べておきたい.

```js
// フォームの入力が変わると呼ばれる関数.
function (val, old) {
  if (val === old) {
    return
  }
  const highCostFunc = (val) => {
    // 新しい値を受け取って処理を行う高コストな関数.
  }
  if (this._timeout) {
    clearTimeout(this._timeout)
  }
  const delay = 200
  this._timeout = setTimeout(highCostFunc(val), delay)
}
```

書いてみるとなんともないコードだったのですがすぐに書くことが出来なかったので備忘録がてら記載させて頂きます.
xml変換

http://raining.bear-life.com/php/xml%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E9%85%8D%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B
Ransackで A and (B or C)

自分用メモ

条件A = `users.name like %山田%`
条件B = `users.email like %gmail.com%`
条件C = `users.address like %東京都%`

```rb:app/controllers/users_controller.rb
def index
  @q = User.search(params[:q]))
  @q.build_grouping unless @q.groupings.any?
  @users = @q.result
end
```

```haml:app/views/users/index.html.haml
= search_form_for @q do |f|
  = f.search_field :name_cont
  = f.grouping_fields do |g|
    = g.hidden_field :m, value: 'or'
    = g.search_field :email_cont
    = g.search_field :address_cont
```

こんな感じのSQLが作成される

```sql
SELECT  "users".* FROM "users"
WHERE ("users"."name" ILIKE '%山田%'
       AND ("users"."email" ILIKE '%gmail.com%'
            OR "users"."address" ILIKE '%東京都%'))
```

参考

http://stackoverflow.com/questions/32349699/ransack-grouping-to-use-or-combinator
プログラマが知るべき97のことを読んでみる-1日目

会社の上司に[プログラマが知るべき97のこと](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4)を読んでみるといいと言われたので、読んでみることにした。
1日で全部読むのもあれなので、1日1個ぐらいのペースで読んで簡単にまとめてみようと思う

[[01] 分別のある行動](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%88%86%E5%88%A5%E3%81%AE%E3%81%82%E3%82%8B%E8%A1%8C%E5%8B%95)

- 同じことを「正しくやる方法」と「手早くやる方法」があれば、後者のほうが魅力的に見えてしまう
- 手早くやった結果生まれた修正箇所は、のちの`技術的負債`になる（借金のようなもので、短期的には利益になるが、完済するまで利息を払い続けなくてはならない
- 技術的負債はできるだけ早く返済する。分別のある人ならそうするはずです。

#### まとめ
納期に間に合わせることを優先して雑なものを作ってしまうと、結果のちに自分の首、あるいはチームの首を絞めることにつながる。
どうしても負債を生んでしまった場合は、負債の存在を忘れないようにし、できるだけ早く返済するようにする。
無敵のエディタを作りたい 第0回  宣言

#こんにちは
こんにちは。地図大好(ペンネーム)です。今回は初投稿ながら、いきなりとんでもないことを言って、「この人大丈夫なんだろうか」とか、「生意気だ」とかなどと思った方も多いやもしれません。しかし、安心してください。そんな変なことはいたしません。ただただ、初心者なりに、より良いエディタを作ろうと(稚拙ながら)努力するだけです。それでは、何をしたいかをお話しします。
##どうせなら自分で作る
これは、すべて好奇心です。何もすごい理想があるわけではありません。この世には素晴らしいエディタがたくさんあります。例えば、Xcode、VScode、VisualStudio、Atom、Emax、Vim、CotEditorなどです。私は、このようなエディタたちを使うたび、「自分もこんなのが作れたらいいな」と思うのです。だったら作ってしまおうというだけの話です。
##具体的には…
 私は、普段Xcodeを利用しています。最終的には、Xcodeのようなエディタを目指しています。ソースコントロール、実行、デバッグ、製品化、GUI開発などができる統合開発環境を目指しています。
##しかし
 前述のように私は超が二の六十兆乗個(数字に深い意味はありません)付くほどの初心者です。コマンドライン上で動くエディタさえ、作りきれていません。
 この私の無謀なる計画(いや、野望)が終焉するのがいつか、全く見当はつきません。進展があり次第、投稿していきたいと思っています。
 次の投稿が明日になるか、何十年後になるかわかりませんが、アドバイス等していただけると幸いです。ただ、時間の使い方が下手な性分ですので、返答している時間はないと思われます。この場を借りて、あらかじめ感謝を申し上げます。
#以上です
 できるだけ気をつけましたが、誤字脱字、生意気な表現、無理解等あるかもしれませんが、どうかご容赦ください。暖かい目で見守っていただけると嬉しい限りです。
 本当に中身のない文で申し訳ございませんでした。応援していただけると嬉しいです。では、頑張ります。
 誠に愚文ながら、ご一読いただきありがとうございました。
AmazonLinuxでJupyterを稼働させる

# 前提

・利用AMI
amzn-ami-hvm-2016.09.1.20170119-x86_64-gp2 (ami-56d4ad31)

・Pyenv
  -Anaconda(2.x)
  -Anaconda(3.x)

# Pyenv
https://github.com/yyuu/pyenv

## 導入に必要な処置

> CentOS/Fedora 21 and below:
> FIXME: you may need to install xz to build some CPython version

```
yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

```

## Gitとコンパイラの導入
```
yum install git gcc-c++
```

## Pyenvの導入

```
cd /usr/local/src/
git clone https://github.com/yyuu/pyenv.git
```

サーバにログインできるユーザ全てが利用できるように、Pathを通してあげる
profile.d配下に以下を作成


```
echo 'export PYENV_ROOT="/usr/local/src/pyenv"' >> /etc/profile.d/pyenv.sh
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /etc/profile.d/pyenv.sh
echo 'eval "$(pyenv init -)"' >> /etc/profile.d/pyenv.sh
```

# Anacondaの導入

```
pyenv install -l | grep anaconda
pyenv install anaconda2-4.2.0
pyenv install anaconda3-4.2.0

```

## 導入確認
```
pyenv versions
```

## 起動ファイルの作成・修正
```
jupyter notebook --generate-config
vim ~/.jupyter/jupyter_notebook_config.py
```
> c.NotebookApp.open_browser = False
> c.NotebookApp.ip = '{privateIP}'

## 起動

```
jupyter notebook
```

# Jupyter
![スクリーンショット 2017-01-29 14.23.47.png](https://qiita-image-store.s3.amazonaws.com/0/90505/01d7078f-33a4-bc49-4967-1887031784fb.png)


次は手前にNginxを置いてやってみよう。
誰かの参考になれば嬉しい。

# 参考にさせていただきました！
http://www.task-notes.com/entry/20151206/1449378009
tensorflowで株価予測のつづき

http://qiita.com/northriver/items/81b79e7e6785f2b89b95
でとりあえず、DNNに株価をぶち込んで予測させた。そこで、RNN/LSTMを使ったらというアドバイスをいただき、RNNでやってみたのを書きます。

outputをx%上がったかに戻し、
inferenceを以下に変えてやってみた。

```
def inference(input_ph, istate_ph):
     with tf.name_scope("inference") as scope:
        weight1_var = tf.Variable(tf.truncated_normal([num_of_input_nodes, num_of_hidden_nodes], stddev=0.1), name="weight1")
        weight2_var = tf.Variable(tf.truncated_normal([num_of_hidden_nodes, num_of_output_nodes], stddev=0.1), name="weight2")
        bias1_var   = tf.Variable(tf.truncated_normal([num_of_hidden_nodes], stddev=0.1), name="bias1")
        bias2_var   = tf.Variable(tf.truncated_normal([num_of_output_nodes], stddev=0.1), name="bias2")

        mean1, variance1 = tf.nn.moments(input_ph,[0])
        bn1 = tf.nn.batch_normalization(input_ph, mean1, variance1, None, None, 1e-5)

        in1 = tf.transpose(bn1, [1, 0, 2]) 
        in2 = tf.reshape(in1, [-1, num_of_input_nodes]) 
        in3 = tf.matmul(in2, weight1_var) + bias1_var
        in4 = tf.split(0, length_of_sequences, in3)   

        cell = rnn_cell.BasicLSTMCell(num_of_hidden_nodes, forget_bias=forget_bias)
        rnn_output, states_op = rnn.rnn(cell, in4, initial_state=istate_ph)
        output_op = tf.matmul(rnn_output[-1], weight2_var) + bias2_var
        
        return output_op, states_op
```

訓練データの正解率は５割をちょっと超えるぐらい。２０％枠を作り、そこと同じ幅かどうかで見ています。
まあまあいいのかな？

で、２０１７/2/5までの120日間のデータを使って、1ヶ月後何％上がるかを3000銘柄すべてで予測させてた。高いのは以下みたい

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/124303/66f964c9-ce2f-054f-1de9-e11418c6ee93.png)

(株への投資はご自身の責任で行いください。等記事は一切の責任を持ちません)
MODXでリソースID・ページタイトルなどと同時にテンプレート変数の値も取得する

```php
$rs = db()->select('id,pagetitle,content','[+prefix+]site_content','id=5');
```
MODXでは上記のように書くことで、リソース変数の値に直接アクセスすることができます。
が。
テンプレート変数の値を引っ張ってくるのは工夫が必要です。

```php
db()->select (
    array(
        'id'        => 'sc.id',
        'pagetitle' => 'sc.pagetitle',
        '住所'      => 'addr.value',
        '電話番号'  => 'tel.value'
    )
    , array(
        '[+prefix+]site_content sc',
        'LEFT JOIN [+prefix+]site_tmplvar_contentvalues addr ON sc.id=addr.contentid AND addr.tmplvarid=3',
        'LEFT JOIN [+prefix+]site_tmplvar_contentvalues tel ON sc.id=tel.contentid AND tel.tmplvarid=5'
    )
    , 'sc.id=5'
);
```
上記のように書きます。

```sql
SELECT
  sc.id,
  sc.pagetitle,
  addr.value AS 住所,
  tel.value AS 電話番号
FROM modx_site_content sc
  LEFT JOIN modx_site_tmplvar_contentvalues addr
     ON sc.id=addr.contentid AND addr.tmplvarid=3
  LEFT JOIN modx_site_tmplvar_contentvalues tel
     ON sc.id=tel.contentid AND tel.tmplvarid=5
WHERE sc.id=5
```
1.0.21Jよりも古いバージョンなら上記のように生SQLで記述します。DBAPI自体は昔から使えますが、複雑なパラメータを配列を使って整理して与えることができません。

**※2020年3月7日追記**

冒頭の例が間違っていたので修正しました。`[+site_content+]` と書いていましたが、正しくは `[+prefix+]site_content` です。
あと、DBAPIによる記述を追記しました。

**※2020年4月13日追記**

DBAPI記述のほうをメインにしました。
RaspbianでRaspberry Piを動かす

Raspberry Piは刺されたmicroSDに書き込まれたOSを、本体が読み出すことで起動します。そのため、まずはmicroSDにOSを書き込む必要があります。

やることとしては

- OSの入手
- OSの書き込み
- Raspberry Piへのログイン

です。

# OSの入手
何を使えば良いかわからない人はとりあえずRaspbianを手に入れるのが良いと思います。以下から入手できますが、GUIが必要ないならRASPBIAN JESSIE LITEがオススメです。

https://www.raspberrypi.org/downloads/


# OSの書き込み
公式サイトに詳細な手順が乗ってます。
https://www.raspberrypi.org/documentation/installation/installing-images/README.md

Mac用の手順を抜粋すると以下のようになります。

## microSDをMacに繋げる
買って繋げてください。

## microSDのパスを調べる
`diskutil list`で、Macに繋がっているデバイスの情報を見られます。
(sudo fdisk -l に相当)

私の場合は以下のようになり、使用した32GBのmicroSDが`/dev/disk2`ということがわかりました。

```
diskutil list

〜省略〜

/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.7 GB    disk2
   1:             Windows_FAT_32 NO NAME                 31.7 GB    disk2s1
```

## アンマウント
マウントされていると書き込み時に使用中と言われて作業できないので、Macに標準で入っているディスクユーティリティから、SDカードのマウントを解除してください。
![07630cd2-a11a-4beb-a1b8-96e744329b2a.png](https://qiita-image-store.s3.amazonaws.com/0/273/537330fc-30d3-a1be-42e6-4072d430b8c1.png)

デバイスにアクセス出来るがマウントされていない状態が必要なので、取り出しは行わないでください。

## OSの書き込み
ddコマンドで書き込みます。
オプションの`if`(input file?)にOSイメージファイルを、`of`(output file?)にmicroSD(今回は`/dev/disk2`)を指定します。
ofを間違えるとMacの全てのデータを壊す場合があるので注意してください。

きちんと書き込みが終われば終了です


```
sudo dd bs=1m if=./2017-01-11-raspbian-jessie-lite.img  of=/dev/disk2

1326+0 records in
1326+0 records out
1390411776 bytes transferred in 579.587161 secs (2398969 bytes/sec)s
```

なお、ディスユーティリティでアンマウントしてないと、リソースが使用中と言われて書き込めません。

```
sudo dd bs=1m if=./2017-01-11-raspbian-jessie-lite.img of=/dev/disk2
dd: /dev/disk2: Resource busy
```

# Raspberry Piへのログイン

## microSDカードを挿す
OSを書き込んだmicroSDを本体裏のスロットに差します。
公式ケースの場合、つけたまま抜き差しが出来ます。
![cdca4c82-647a-429b-b5f8-cc02d1f63b74.png](https://qiita-image-store.s3.amazonaws.com/0/273/460faee2-c24d-2cc1-ff64-45f0af198ead.png)



## ログイン
スイッチは無いため、電源を繋ぐと自動で起動するので、キーボード、HDMIケーブルを繋ぎ、ログインします。デフォルトだとuserはpi、passはraspberryでログインできます。
ログインすれば後は基本debianなので自由に出来ます( ﾟ∀ﾟ)o彡ﾟ
Vue.jsでpug+Sassの環境設定（webpack）

## はじめに

Vue.jsでスッキリしたコードで書きたかったのでpugとSassを使えるように環境構築しました。
最近はHTMLやCSSは他の言語で記述してHTMLやCSSにトランスパイルする手法が増えてきていますが、Vue.jsと併用できるとのことだったのでやってみました。

* html => pug（旧名：Jade）
* css => scss

ちなみにJavaScriptはECMAScriptの最新仕様（babelでトランスパイル）で記述したりTypeScriptで記述する方法があります。
babelでの導入については[npmパッケージまとめ（BrowserSync+webpack+babel）](http://qiita.com/buchiya4th/items/5f5f83acdbdad07e1dfc)をご覧ください。

※Vue.jsとwebpackには深く触れていないので他の記事を参考にしてください。

### 参考
* [【Jade】ゴリラでもわかるJade入門 〜Jadeを使ってみる〜](https://blog.mismithportfolio.com/web/20160117jadebeginner)
* [【Pug】ゴリラでもわかるJade改めPug入門](https://blog.mismithportfolio.com/web/20160326pugbegin)


## Vue.jsの導入

### 必要なパッケージ

```
vue
vue-loader
```

### webpackの設定

```js:webpack.config.js
// ...（省略）...
  module: {
    loaders: [
      // ...（省略）...
      {
        test: /\.vue$/,
        loader: 'vue'
      }
    ]
  },
// ...（省略）...
```

## pugの導入

### 必要なパッケージ

```
pug-html-loader
vue-html-loader
vue-loader
vue-template-compiler
```

### webpackの設定

設定なくて動いた

### vueファイル

```vue:app.vue
<template lang="pug">
  section.test
    .test-child テキスト
    .test-child
      | テキスト
    ul
      li: a(href="#") アンカーテキスト
</template>
```

### 注意事項

* pug-loaderはバグがあって動かなかった
* Reactと同じくDOMのトップレベル（上記だとsection.test）は複数記述できない
    * Reactと違ってdiv要素以外も許容されている模様

### 参考
* [Setting pug via webpack config won't render templates #454](https://github.com/vuejs/vue-loader/issues/454)

## Sassの導入

SassはSCSS記法とSASS記法がありますが、CSSの記述と近いSCSS記法で導入しました。

### パッケージ

```
css-loader
node-sass
sass-loader
vue-style-loader
```

### webpackの設定

```js:webpack.config.js
// ...（省略）...
  module: {
    loaders: [
      // ...（省略）...
    ]
  },
  vue: {
    loaders: {
      scss: 'vue-style!css!sass'
    }
  },
// ...（省略）...
```

### vueファイル

```vue:app.vue
<style lang="scss">
  .test {
    .test-child {
      // ...（省略）...
    }
  }
</style>

```

### 参考
* [Problem configuring `scss` lang for stylesheets #58](https://github.com/vuejs/vue-loader/issues/58)