OmniAICreator/Qiita-1.07M huggingface dataset:
項目反応理論(IRT)の1PLMをPHPで実装の検証

#はじめに
テスト理論では、古典的テスト理論と現在一般的に用いられている項目反応理論(IRT)と呼ばれる理論がある。古典的テスト理論はテスト全体の受験者集団に依存するテスト理論であるが、IRTは、１人の被験者がテストの１項目(問題)に応答する際の解率をモデル化した理論である。モデルには様々なモデルであるが、ここでは比較的分かりやすいパラメータロジスティックモデルを使うことにする。内容は後述。
IRTに関しては、PythonでパッケージやRでもパッケージが存在するが、自分が現状開発したシステムから使うにはハードルが高く振り回されてしまったので今回自作しようと考えた。
実装は理論を知っていれば容易にできるのでここでは、理論についてできる限り分かりやすく説明し簡易的にPHPで実装したソースコードを載せる。

私自身もIRTについては学習途中なので、間違っている点などがあればご指摘お願いします。
#IRTのパラメータロジスティックモデル [^1]
![スクリーンショット 2016-12-21 18.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/62202/b237619a-3deb-4f9c-facf-5daa5415b75a.png)・・・・(1)
a=識別度、b=困難度、c=当て推量、D=1.7(定数)、j=項目番号、θ=受験者能力、exp=指数関数
で求めることができる。
主に、IRTは下記のような項目特性曲線を描画して表示されることが多い。 [^2]
![img-0288.png](https://qiita-image-store.s3.amazonaws.com/0/62202/5d94d46c-b1fb-2071-77b5-d212a9c72914.png)
この図は、横軸がθであり、縦軸がPを表した図である。
この図を作るために今回は実装を行うといっても過言ではない。

・1PLM(one - parameter logistic model)
困難度のみをモデル化したもの。困難度は項目ごとに定まるが、全ての項目の識別力パラメタは等しいと考えるモデル。a=1、c=0、θとbは求めることができる。
・2PLM(two - parameter logistic model)
項目の困難度と識別力によってテスト項目の正答確率を表現するモデル
a=1、c=0、θとbは求めることができる。
・3PLM(three - parameter logistic model)
項目の困難度と識別力の他に、当て推量(あてずっぽう)により被験者が偶然正答する確率についてのパラメータを導入しているモデル
すべて求めることができる。
・その他にも4パラメータロジスティックモデルがあるがここでは割愛する。
#実装
以下がコードです。

```php:1plm.php
<?php
echo "IRT項目反応理論1PLM";
$theta = array(-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3);
$b = 0;
for($i = 0;$i < 13;$i++){
    $P = 1 / (1 + exp(-1.7 * ($theta[$i] - $b)));
    echo "</BR>シータ:". $theta[$i] ."　確率：".$P;
}
```
こんな感じで表示されるはずです↓
これをプロットすれば項目特性曲線ができる。曲線実装はD3.jsでやる予定。
![スクリーンショット 2016-12-21 18.18.26.png](https://qiita-image-store.s3.amazonaws.com/0/62202/bc1c6e49-4243-7dfd-a1a0-7bd8cc04965c.png)

実装方針としては、1PLMでbはあらかじめ求められている前提で書いた。
bの求め方はこちらを参考にすると良い。[^3]
→http://www.mizumot.com/method/06-06_Sumi.pdf

θの値はグラフ描画の都合上こちらで定義し、グラフ描画の際に点をプロットすることで項目特性曲線が出来上がる。

θの求め方も同じくこちらを参考にして求めることができる。[^3]
→http://www.mizumot.com/method/06-06_Sumi.pdf
Dは定数である1.7を用いた。


#さいごに
正直、実装にかかる時間は4~5分程度であったが、理論を正しく記述できるか見極めることに時間がかかってしまっていた。
IRTは、すでに様々なパッケージ化もされているため、本当にこの実装方法であっているか不安ではあるが、結果から見るとθがあがるにつれて確率が上がっているのでこの計算方式であっていると思われる。
本当はbを求めるコードも実装しようと思ったが、時間の都合上カットした。冬コミ準備が終わったら実装します。絶賛、冬コミ炎上中。修論も書かないと・・・・
また、今回は、1PLMだけであるためそこまで時間はかからないが2PLMなどを実装する場合にはPythonで処理してPHPで表示のような形にするかもしれない。
来年以降頑張っていきたいと思います。
拙い記事で、なおかつ長文で読みにくくて申し訳ありません！
余裕があったら、記事編集してもっと見やすくしたいと思います。


#参考文献
[^1]: 1PLM，2PLM，3PLM，多段階反応モデル,外国語教育メディア学会 (LET) 関西支部メソドロジー研究部会 2013 年度報告論集 住政二郎 （pp. 34–62）http://www.mizumot.com/method/04-04_Sumi.pdf
[^2]: 6.2 項目特性曲線と項目パラメータ、奥村太一（上越教育大学）http://www.juen.ac.jp/lab/okumura/test/sect0032.html
[^3]: 外国語教育メディア学会（ LET ）関西支部メソドロジー研究部会 2014 年度第 6 号報告論集 住政二郎（ pp. 96–116 ）http://www.mizumot.com/method/06-06_Sumi.pdf
bool値を自己代入する


キャッシュしようとして

```ruby
def hoge
  @hoge ||= fuga
end

```
とすると、falseのときに再実行されてしまう。

なのでこういうのはどうか

```ruby
def hoge
  (@hoge ||= fuga.to_s) == 'true'
end

```

```ruby
def hoge
  (@hoge ||= [fuga]).first
end

```
ElixirでCowboy2を使ってhello world

Elixir、Cowboy２でhello worldを出力するところまでです。

Cowboy1系と書き方が変わってたり、ネットでサンプルみてもうまくいかなかったので
どこらへんの書き方が違ったかまとめていきたいと思います。

##mix.exs

```
#Cowboy1
defp deps do
  [{:cowboy, "~> 1.0"}]
end

#Cowboy2
defp deps do
  [{:cowboy, github: "ninenines/cowboy"}]
end
```

##cowboy1.ex

```
defmodule Cowboy1 do
 use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    dispatch = :cowboy_router.compile routes
    {:ok, _} = :cowboy.start_http :http, 100, [{:port, 3000}], [{:env, [{:dispatch, dispatch}]}]

    children = [
    ]

    opts = [strategy: :one_for_one, name: Cowboy1.Supervisor]
    Supervisor.start_link(children, opts)
  end

  defp routes do
    [
      {:_, [
            {"/", Cowboy1.Handlers.Hello, []},
          ]
      }
    ]
  end
end

```

##cowboy2.ex

```
defmodule Cowboy2 do
 use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    dispatch = :cowboy_router.compile routes
    {:ok, _} = :cowboy.start_clear(:http, 100, [{:port, 3000}], %{:env => %{:dispatch => dispatch}}) ←ここの書き方が変わった

    children = [
    ]

    opts = [strategy: :one_for_one, name: Cowboy2.Supervisor]
    Supervisor.start_link(children, opts)
  end

  defp routes do
    [
      {:_, [
            {"/[:id]", Cowboy2.Handlers.Hello, []}
          ]
      }
    ]
  end
end

```

##hello.ex

```
#Cowboy1
defmodule Cowboy1.Handlers.Hello do

  def init(_type, req, []) do
    {:ok, req, :no_state}
  end

  def handle(req, state) do
    {:ok, reply} = :cowboy_req.reply 200, [{"content-type", "text/plain"}], "hello world, cowboy1", req
    {:ok, reply, state}
  end

  def terminate(_, _, _), do: :ok

end

#Cowboy2
defmodule Cowboy2.Handlers.Hello do

  def init(req, state) do ← initのパラメータが変わった
    handle(req, state) ←　１系はinitのあとにhandleが呼ばれていたみたいが2系は呼ばれないみたい
  end

  def handle(req, state) do
    {:ok, req} = :cowboy_req.reply( 200, %{"content-type" => "text/plain"}, "hello world, cowboy2", req)　←2番目の引数がMapになった
    {:ok, req, state}
  end

  def terminate(_, _, _), do: :ok

end
```

たいした内容ではないですがサンプルのソースは[github](https://github.com/sumiyoshi/cowboy_elixir)に置いてあります。
ExtractTextPluginの使い方（webpack）

# ExtractTextPluginでうまくいかなかったことがあったので
メモです。詳細なところまでは踏み込んでいません。

__（2017.2.27 追記）この記事で扱っているwebpackのバージョンは1.14.0。webpack2ではちょっと使い方が違う模様。__
https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-breaking-change

ExtractTextPluginを使用し、本番環境ではhead内にスタイルを展開しないようにしようと試みていた。以下の様に設定していたけれど、失敗してしまっていた。

## うまくいかなかった例
```javascript:webpack.config.js
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = [{
〜中略
  module: {
    loaders: [
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract("style-loader", "css-loader")
      },
      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader")
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin("stylesheets/style.css")
  ]
}]
```
こちらの設定で実行してみるとエラーがでる。

```
Module parse failed: 〜中略〜 Unexpected character '@' (1:0)
You may need an appropriate loader to handle this file type.
```
@import の@で躓いてるのかな… よくわからない。
次の行ではローダーが適切ではないようなことが指摘されている。

## うまくいった例
以下のように設定を修正してみた。
相違点は、extractをクラスメソッドではなくインスタンス経由で実行したのと、cssをヘッダに展開する必要がないため style-loader を削除した。

```javascript:webpack.config.js
var ExtractTextPlugin = require('extract-text-webpack-plugin')
  , extractTextPlugin = new ExtractTextPlugin('stylesheets/[name].css');

module.exports = {
  entry: {
    'index': [
      './src/javascripts/modules/main/indexmain.js'
    ],
    'others': [
      './src/javascripts/modules/main/othersmain.js'
    ]
  },
  output: {
    path: path.join(__dirname, 'dist/assets/'),
    filename: "javascripts/[name].bundle.js"
  },
  module: {
    loaders: [
      { test: /\.js$/, loaders: ['babel-loader'], exclude: /node_modules/},
      { test: /\.css$/, loader: extractTextPlugin.extract("css-loader")},
      { test: /\.scss$/, loader: extractTextPlugin.extract("css!sass")},
    ]
  },
  plugins: [
    extractTextPlugin
  ]
};
```

うまくいった。
RODEMとIFTTTの組み合わせで、ビジネスマンを「めんどくさい」から解放しようとした話

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、21日目の今回は「めんどくさい」からの解放シリーズ第3弾をお送りします。
・第1弾：[FAQBotを使ってプロダクトオーナーを「めんどくさい」から解放しようとした話](http://qiita.com/valitoh/items/ce4a260e0f3990a01d84)
・第2弾：[IoTを使ってチームを在席確認の「めんどくさい」から解放しようとした話](http://qiita.com/valitoh/items/1de0138696b731397137)

##irucaのステータスをカレンダー上の予定に連動させたい
[前回](http://qiita.com/valitoh/items/1de0138696b731397137)は、在席状況のステータス変更を簡単にするために[MESH](http://meshprj.com/jp/)を使った[iruca](https://iruca.co/)のコントローラーを作りましたが、これを作る過程で[IFTTT](https://ifttt.com/)を使ってみて汎用性の高さに気づいていました。

カレンダーの予定内の記述をトリガーにしてirucaのステータス更新ができそうだというところまではすぐに思いついたのですが、そのためには
**・「カレンダーに打ち合わせ予定、移動予定が細かく入っていること」
・「一定の記述ルールで予定が登録されていること」**
が必要です。
そこで、自分が開発に関わった[RODEM](https://ekiworld.net/service/lp/rodem/)というサービスとIFTTTの組み合わせでこれを実現しようと考えました。

##RODEMとは
RODEMは、外出の多いビジネスマンを「めんどくさい」から解放するためのサービスとしてこの夏にリリースしたものです。

![RODEM_header.png](https://qiita-image-store.s3.amazonaws.com/0/152460/be86694c-7066-950d-7c4e-c7ef04dfe6e8.png)

カレンダーに外出打ち合わせ等の訪問予定を登録すると、予定の内容から行き先の場所を特定し、開始時刻に間に合うような経路を「駅すぱあと」で算出、移動予定を作ってカレンダーに登録してくれます。
同時に、この移動予定にかかる運賃も算出しているので、そのデータを使えば毎月の交通費精算も効率化できるというものです。

![スクリーンショット 2016-12-21 15.25.46.png](https://qiita-image-store.s3.amazonaws.com/0/152460/55632515-8ca4-64e6-96b3-1c5f23ec0985.png)

カレンダーへの予定登録から移動予定を算出、カレンダーへ登録する様子はこちら。
※YouTube動画へのリンクです
[![](http://img.youtube.com/vi/XTiaZ0uhy3Q/0.jpg)](https://www.youtube.com/watch?v=XTiaZ0uhy3Q)

RODEMを使うことで、「移動(行き)→打ち合わせ中→移動(帰り)→帰社」という一連の予定を簡単に作ることができます。
![スクリーンショット_2016-12-20_19_40_35.png](https://qiita-image-store.s3.amazonaws.com/0/152460/2fe712b2-a7e3-b566-b69c-7645f07340e7.png)
※「やまびこ」「さくら」は弊社の会議室名です。新幹線の名前なんですよ！

##カレンダーの予定からirucaのステータスを更新する仕組みを作る
IFTTTで、Googleカレンダーに登録された予定内のキーワードをトリガーにirucaのステータスを更新するアプレットを作成します。
irucaのステータス更新については前回と同様に[irucaAPI](https://iruca.co/api)を使用しています。
![スクリーンショット_2016-12-20_19_43_09.png](https://qiita-image-store.s3.amazonaws.com/0/152460/640082f0-c713-4a9a-e991-fd5fe513e721.png)
![スクリーンショット_2016-12-20_19_43_31.png](https://qiita-image-store.s3.amazonaws.com/0/152460/b7a470b2-6357-e49e-19d8-1749edfb61e8.png)

この要領で
・移動開始時刻になったら「外出」
・外出打ち合わせ開始時刻、社内打ち合わせ開始時刻になったら「取込中」
・帰社したら「在席」
とステータスが更新されるようにアプレットを作成しました。

##名付けて「Auto iruca Powered by RODEM」
こうして、カレンダーに登録された一連の予定に連動する形で、irucaが更新されるようになりました。
![スクリーンショット_2016-12-20_19_40_35.png](https://qiita-image-store.s3.amazonaws.com/0/152460/2fe712b2-a7e3-b566-b69c-7645f07340e7.png)![スクリーンショット 2016-12-20 19.41.06.png](https://qiita-image-store.s3.amazonaws.com/0/152460/d8dd9606-e555-b172-ecf8-ac36139df186.png)

行き帰りの移動開始まで反映するのはややクドいよう思えるかもしれませんが、外回りの多い営業担当であれば「今は連絡がつく時間帯なのか？(＝外出はしているが打ち合わせ中ではない)」ということが共有される事のメリットもありそうです。

##まとめ
・RODEMを使うと、外出打ち合わせ予定の登録だけでカレンダー上に「移動(行き)→打ち合わせ中→移動(帰り)→帰社」という一連の予定を簡単に作ることができます
・IFTTTを使うと、この一連の予定をトリガーにして自動的にirucaのステータスを更新する仕組みを作ることができます


***
#####※残課題メモ
・IFTTTでは、カレンダー上のイベント開始時刻〜15分前のどこかで通知を出す仕組みになっている(本当は予定開始時刻ぴったりに更新される方が気持ちがいい)
・共有された予定にも反応してしまう(参加しないと返答しても、削除でもしない以上はIFTTTが拾ってしまう)
・予定の完了に反応するトリガーがない(社内の打ち合わせ予定終了後は「在席」に更新したい)
・[GAS](https://developers.google.com/apps-script/)を使ったら解決できるかも？
[Visual Studio Code]コンパイルしたexeファイルをコンソールから実行したい

2016/12/21 自分用にメモを残しておこう。


#いきさつ
　Visual Studio Codeを使い始めて、どうせなら簡易C/C++開発環境を構築したいと思って様々ググっておりました。

[[Visual Studio Code][Windows] C言語をビルド(コンパイル)＆ステップ実行する
](http://gabekore.org/vscode-c-windows)

　こちらで紹介されているbatファイルなのですが、コンパイルした後に**Visual Studio Codeの出力画面で実行されてしまう**。適当におググり申したけど、この出力画面から標準入力を流し込む方法が見つからなかった。残念。

　ということで、コンパイルしたあとにコンソールから自動で実行するようにbatファイルをごにょごにょしました。安全性は保障しませんので、使用は自己責任でお願いします。

#ソース

```crun_gcc.bat
@echo off
 
REM --------------------------------------------
REM 引数が必要
REM 引数が相対パスでもフルパスに変換
REM %~d1 - %1 をドライブ文字だけに展開
REM %~p1 - %1 をパスだけに展開
REM %~n1 - %1 をファイル名だけに展開
REM %~x1 - %1 をファイル拡張子だけに展開
REM --------------------------------------------
if "%~dpnx1" equ "" goto :eof
 
REM --------------------------------------------
REM 環境変数のローカル化開始
REM --------------------------------------------
setlocal

REM --------------------------------------------
REM 追記：カレントディレクトリ変更
REM [Dir] : お好みのカレントディレクトリ
REM --------------------------------------------
REM cd [Dir]

REM --------------------------------------------
REM コンパイル実行(gcc)
REM 追記：ソースファイル名をそのままexeファイルの名前にするよ
REM --------------------------------------------
gcc -o %~n1.exe "%~dpnx1"
 
REM --------------------------------------------
REM EXEファイル実行
REM 追記：新しいコンソールで実行するよ
REM --------------------------------------------
start "" %~n1.exe
 
REM --------------------------------------------
REM 環境変数のローカル化終了
REM --------------------------------------------
endlocal
```

#注釈
　欠点はexeファイルが自動で消えないことかな？再利用できるしあって困るものでもないし自分は放置しています。
気になる人は各自修正をしたあとこっそり教えてください。

　あとはソースファイルの実行場所によってはPermission deniedエラーが発生します。僕はなりました。
そんなときはbatファイルの*cd*の行をコメントアウトを削除して、お好みのディレクトリにしてください。

　c言語以外でも似たような箇所をごにょごにょすると動くかもぞい！※未検証です
CSSだけで複雑な背景画像を作ってみた

# CSSで作成した背景
![スクリーンショット 2016-12-21 13.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/63056/676ecb20-91dd-1cd4-3f38-9e431644df53.png)

これらのパターン模様をCSSのみで作成しました

## linear-gradient と radial-gradient と repeating-linear-gradient

CSS3で追加された線形グラデーション ``` linear-gradient ``` と円形グラデーション ``` radial-gradient ``` を使用すれば、さまざまなパターンを表現することが可能です。
これに ``` background-size ``` プロパティを組み合わせれば、CSSだけで背景画像を作成することができます。
CSS3をサポートするブラウザが増えてきている現在では、ほとんどのパターンがCSSだけで作成可能になっています。
また、 ``` repeating-linear-gradient ``` を使用すれば複雑なストライプ模様を簡単に作成できます。

作成方法の例についてはこちらに書きました。
[CSSだけで複雑な背景画像を作ってみる](http://sottar.hatenablog.com/entry/2016/12/21/121542)

## サイト作成しました。
CSSだけでリッチな背景画像を作成できるサイト elastic CSS というサイトを作成しました。

[Elastic | A collection of background image created by CSS only](http://www.sottar.net/elastic/)
<img width="1312" alt="site_elastic.png" src="https://qiita-image-store.s3.amazonaws.com/0/63056/a94a9a54-afdc-82da-a716-ac911f13d452.png">

対応ブラウザはモダンブラウザとie10以降 になってます
github : https://github.com/sottar/elastic


ちなみにこのサイトはReactJSを使用して作成しました。
webpackを使ったReactJSの環境構築の方法はこちらに書かれています。
[webpack で react, scss のコンパイルと ESLint を設定する方法](http://sottar.hatenablog.com/entry/2016/11/02/194030)
参考にしてください。

# 追記

アニメーションする背景画像を作成・追加しました。

@keyframeを使うとcssを動的に任意のタイミングでアニメーションさせることができるため、これを使用して作成しました。

簡単な使い方はこちらに書いてあります。
[CSS の @keyframe, animation 属性の使い方](http://sottar.hatenablog.com/entry/2017/01/24/105455)
↑ の背景にも使用しています。


以前こちらで紹介したサイトにも追加したのでよかったら活用してください。
![Screen Shot 2017-01-24 at 11.55.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63056/2300334a-3e92-6790-0934-c12284e6b33f.png)
[Elastic | A collection of background image created by CSS only](http://www.sottar.net/elastic/)

コードはこちらに上がっています。
https://github.com/sottar/elastic
Arduinoで鉄道模型のコントローラを作ってみたお話

# 電車でGO!コントローラとの出会い
皆さんは`電車でGO!`というゲームをご存知でしょうか？
1996年から今日までに、アーケード、PS、64などで展開されたTAITO製の電車運転ゲームです。
![dengo_pro1_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/ad7106d6-e305-dc99-1723-63fe0cfcc956.jpeg)


今回はそんな名作ゲームと同時に発売されたPlay Station専用のツーハンドル電車でGO!コントローラと、Arduinoを組み合わせて鉄道模型を走らせるコントローラを作ってみました。
何分、当方も知識が皆無に等しいので滅茶苦茶な解説になってしまいます(汗)
![IMG_2969 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/aaeb5e1f-2d4f-20ef-519d-7600fefa68ae.jpeg)


#PSコントローラの解析方法
コントローラを作るにあたって問題となるのは、電車でGO!コントローラの信号の解析です。
極端な話、やることはただ単に、PSコントローラの信号解析なのです。でも1から解析するのは面倒...

幸運にも、偉大な先人方がArduino専用のライブラリを作ってくださっていたので、今回はそれを利用させていただきましょう。

[Arduino用PS2インターフェース・ライブラリ](http://pspunch.com/pd/article/arduino_lib_gpsx.html)

#電GO!コントローラとArduinoを接続する装置を作ろう
プログラムの前に、先ずはArduinoとコントローラの接続装置からです。
![IMG_2979 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/bd18e572-5e16-2e3d-c287-98309412f467.jpeg)

ハードオフに行き、108円でPSコントローラ専用のハブを購入。分解して線を引き出し、ブレッドボードに接続。
![IMG_2981 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/b334d60a-9a2a-8052-9f7a-b692b8ba11fe.jpeg)




#鉄道模型の駆動に特化したArduinoを作ってみよう
さて、接続装置が完成したところで、鉄道模型の駆動に特化したArduinoを作ってみましょう。
少々投げやりな感じもしますが、拓啓ぽん氏が運営する以下のサイト「Arduino/Arduino互換マイコンで模型を走らせよう」を参考に作ってみて下さい。
[鉄道模型と電子工作](http://www.geocities.jp/y_taka216/ramonino/home.html)

![IMG_2978 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/d50f65c0-08f8-d953-cd72-9c87068e2599.jpeg)



#プログラムをArduinoに書き込もう
私が作ったコードをgithubにアップロードしてあるので、以下からダウンロードして下さい。
[コントローラのソースコード](https://github.com/Matrix5411/Densya_de_go)

これをそのままArduinoに書き込んで下さい。

#Arduioとコントローラ接続装置の接続
「Arduino用PS2インターフェース・ライブラリ」の「2.ハードウェアのピン配置」を参考に、接続して下さい。配線を間違えると、マイコン本体やコントローラが十中八九壊れてしまいますので、慎重に作業して下さい。
私のように、ブレッドボードを介してコードやプルアップ抵抗などを接続すると簡単です。また、配線間違いも見つけやすくなります。
[Arduino用PS2インターフェース・ライブラリ](http://pspunch.com/pd/article/arduino_lib_gpsx.html)

![IMG_2963 のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/151979/cc3a4610-0261-323c-6fa7-5e9596eeb9d8.jpeg)


#鉄道模型を走らせてみよう
最後に、コントローラを接続して、Arduinoの電源を入れましょう。後は走らせるだけです。
ブレーキハンドルを解除位置まで回し、ノッチを引くと...

[![](http://img.youtube.com/vi/_pqAi7csAh0/0.jpg)](https://www.youtube.com/watch?v=_pqAi7csAh0)

鉄道模型が走りはじめました！気分は運転士ですね！

<!--
#最後に...


***
実は3年前にサウンドコントローラを作ったことがあるんです。すごいでしょこれ。↓↓↓↓
[![](http://img.youtube.com/vi/igvOCX7Av8g/0.jpg)](https://www.youtube.com/watch?v=igvOCX7Av8g)
-->
[WordPress]画像挿入時に、自動で付与されるclass、title、リンクを削除する方法

WordPressでは、画像を挿入する時に、自動でalt、title、width、height、classなど属性が自動挿入されますが、alt以外はいらないってことの方が多くないですか？


通常画像を挿入すると、下のコードのような感じで、属性が挿入されます。

````
<a href="http://test.com/wp-content/uploads/2014/06/piano.jpg">
<img src="http://test.com/wp-content/uploads/2014/06/piano.jpg" 
alt="piano" title="piano" width="1000" height="667" class="alignnone 
size-full wp-image-x" /></a>
````
たまにしか更新しないんだったら、別にその都度削除すればいいんだけど、毎日更新したり大量に画像を使ったりするときは、めんどくさいっすね。
なので、消してしまいましょう。

alt以外削除する方法

以下のコードをfunction.phpに記述してください。
````
add_filter( 'image_send_to_editor', 'remove_image_attribute', 10 );
add_filter( 'post_thumbnail_html', 'remove_image_attribute', 10 );
 
function remove_image_attribute( $html ){
	$html = preg_replace( '/(width|height)="\d*"\s/', '', $html );
	$html = preg_replace( '/class=[\'"]([^\'"]+)[\'"]/i', '', $html );
	$html = preg_replace( '/title=[\'"]([^\'"]+)[\'"]/i', '', $html );
	$html = preg_replace( '/<a href=".+">/', '', $html );
	$html = preg_replace( '/<\/a>/', '', $html );
	return $html;
}
````
PassengerPoolIdleTime を指定したのに、アイドル時間経過後もプロセスが殺されない時に見るページ

# 環境

- Phusion Passenger version 4.0.60
- Apache/2.2.15

# 先に結論

`PassengerMinInstances 0` を設定すれば解決する 

# それぞれの設定の意味

- `PassengerPoolIdleTime` は、設定したアイドル時間を超えたらプロセスが殺される
- `PassengerMinInstances` は、最低限維持するプロセス数

# なんでそうなるの?

`PassengerMinInstances` の デフォルト値は　`1` だから

# `PassengerPoolIdleTime` と `PassengerMinInstances` がそれぞれある場合

**`PassengerMinInstances` に設定した数のプロセスだけ、`PassengerPoolIdleTime` 経過後も生き続ける**

- なので、 `PassengerPoolIdleTime` を指定して `PassengerMinInstances` を指定しない場合、1プロセスが `PassengerPoolIdleTime` 経過後も生き続ける...!

# どうしたら良いの?

明示的に `PassengerMinInstances 0` と記載すればよい
Cron設定ではまった罠

Linuxにおいて、複数のユーザで実行ログを同じファイルに同時に書き込もうとすると失敗します。競合しているからでしょうか。でもそのせいで、実行しようとしているプログラム自体も停止するのでめんどくさい。

何気ないことですが、今日ハマったのでメモ。
SQLServer: Index付Viewをリリースするときに注意すべきこと

インデックス付Viewは便利ですが、導入するときには気をつけないといけないなーという失敗をしたので書いておきます。

インデックス付Viewは、作成のSQLだけ通ればめでたしめでたしというわけにもいかないです。。
インデックス付Viewの元テーブルに更新をかけてるクエリやストアド実行時のSETオプション次第では、クエリ実行がエラー終了してしまうという恐ろしい罠があります。

```sql
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
```
上記2オプションが必須です。ここがOFFになってるとNG。ストアドのCREATE文を実行するときに使ったクライアント次第では自動でOFFになったりするので注意が必要です。
デフォルトはどっちもONなので、普通にSSMSからCREATEしている分には問題ないと思います。

インデックス付Viewの元テーブルを使っていて、かつ更新があり、かつオプションがインデックス付View的にNGなストアド一覧を見つけ出すには↓のSQLを実行すればOKだと思います。

```sql
SELECT OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsQuotedIdentOn') AS 'ExecIsQuotedIdentOn'
	,OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsAnsiNullsOn') AS 'ExecIsAnsiNullsOn'
	,*
FROM information_schema.routines
WHERE routine_definition LIKE '%テーブル名%'
	AND routine_type = 'procedure'
	-- ANSI_NULLS または QUOTED_IDENTIFIER オプションが0のものに限定（=index付Viewの元テーブルに対して更新かけるようなストアドだとエラー）
	AND (
		OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsQuotedIdentOn') = 0
		OR OBJECTPROPERTY(OBJECT_ID(ROUTINE_Name), 'ExecIsAnsiNullsOn') = 0
		)
	-- 更新かけてるストアドに限定（SELECTは問題なし)
	AND (
		routine_definition LIKE '%insert %'
		OR routine_definition LIKE '%update %'
		OR routine_definition LIKE '%delete %'
		OR routine_definition LIKE '%drop %'
		OR routine_definition LIKE '%truncate %'
		)
ORDER BY CREATED DESC
```

以上、同じ罠にかかる人がでてこないように。。

※さらに詳しくは↓を参照ください。
https://msdn.microsoft.com/ja-jp/library/ms191432.aspx
Time.nowとTime.currentのタイムゾーンの違い

##いきなり結論
Time.nowはENV['TZ']、Time.currentはconfig.time_zoneの値に影響される。

```
irb(main):001:0> ENV['TZ'] = 'UTC' # TZ環境変数をUTCにセットする
=> "UTC"
irb(main):002:0> Time.now
=> 2016-12-18 09:19:18 +0000
irb(main):003:0> Time.current
=> Sun, 18 Dec 2016 18:19:21 JST +09:00

irb(main):007:0> ENV['TZ'] = 'Asia/Tokyo' # TZ環境変数をAsia/Tokyoに変更する
=> "Asia/Tokyo"
irb(main):008:0> Time.now
=> 2016-12-18 18:21:45 +0900
irb(main):009:0> Time.current
=> Sun, 18 Dec 2016 18:21:48 JST +09:00

irb(main):004:0> ENV['TZ'] = 'JST' # TZ環境変数を無効な値にしてみる
=> "JST"
irb(main):005:0> Time.now
=> 2016-12-18 09:19:44 +0000
irb(main):006:0> Time.current
=> Sun, 18 Dec 2016 18:19:46 JST +09:00
```

```
# application.rbで、config.time_zone = 'UTC'にセットする
irb(main):002:0> Time.now
=> 2016-12-18 09:34:37 +0000
irb(main):003:0> Time.current
=> Sun, 18 Dec 2016 09:34:40 UTC +00:00

# application.rbで、config.time_zone = 'Tokyo'にセットする
irb(main):001:0> Time.now
=> 2016-12-18 09:36:10 +0000
irb(main):002:0> Time.current
=> Sun, 18 Dec 2016 18:36:12 JST +09:00
```
Eclipseが死んだ時にやったこと

# Eclipseが死んだ

“Computing Git status for repository Application”
とかいうメッセージを履きながらずっとぐるぐる回っている。
この時CPU使用率は１００％
３０分放置も終わる気配がない

再起動

してみるも全く解決せず、CPUをガンガン使いながらずっとぐるぐる

死んだと結論づけた

# こうした

Google先生に問い合わせたらすぐに答えが帰ったきた
https://rizkykojek.wordpress.com/2015/02/17/eclipse-hangs-computing-git-status-for-repository-application/

ようするに、ワークスペース内の特定のファイルを消してみてよってこと

``` command
rm -r .metadata/.plugins/org.eclipse.core.resources/.projects/*/org.eclipse.egit.core
rm -r .metadata/.plugins/org.eclipse.core.resources/.projects/*/.indexes/properties.index
```

削除後にEclipseを再起動すると見事に復活しました

よかったー、、、
Spreeでモデルの特定カラムのvalidatesを外す

ちゃお。田中です。SpreeのAddressモデルの `phone` を必須入力させないように四苦八苦してたので共有します。
モデルのカスタマイズについては[公式のサイト](http://guides.spreecommerce.org/developer/logic.html)にあるので割合します。:santa:

```ruby:app/models/spree/address_decorator.rb
module Spree
  Address.class_eval do

      #validates :phone, presence: true, if: :require_phone?

  end
end
```
こんな感じでコメントアウトでいけるだろっー！って思っていたけど無理でした（笑

やり方は以下のような感じです。

```ruby:app/models/spree/address_decorator.rb
module Spree
  Address.class_eval do

      _validators.reject!{ |key, value| key == :phone }
      _validate_callbacks.each do |callback|
        callback.raw_filter.attributes.reject! { |key| key == :phone } if callback.raw_filter.respond_to?(:attributes)
      end

  end
end
```
AndroidのClipboardからの情報漏洩について

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「6.1. Clipboardから情報漏洩する危険性」のものとなります
詳細やサンプルコードについては原著の方を参考ください

## チェックポイント
- [ ] センシティブな情報が含まれている場合は、コピー・カットを出来ないようにする

## Tips
### Clipboardについて
コピー＆ペーストを使う際に、ユーザーやアプリによってコピーされた情報は、一旦Clipboardと呼ばれるバッファに格納されます。このClipboardは端末につき1つの実体しかなく、どのアプリからでも常時中身が取得できるようになっています。
つまり、コピー・カットした情報は全て漏洩する危険性があります

### 対策について
考える状況が2つあります

* 他アプリから自アプリへコピーする状況
* 自アプリから他アプリへコピーする状況

前者に関しては、根本的な対策はありません。Androidには第三者アプリのコピーを制御が出来ないからです
後者に関しては、Viewのコピー・カットを禁止することで、Clipboardに情報がいかないようにすることが出来ます。方法としては、長押しの無効化と項目からコピー・カットを消す方法があります

### 対策を行うべきViewと状況
* TextViewはデフォルトで選択不可能なので、対策は必要ありません。ただし、コピー可否を動的に設定できるため、コピーを可能にする場合、センシティブな情報が表示される可能性がないかを検討する必要があります
* EditTextは属性がPasswordになっている場合、コピーが禁止のため、対策は必要ありません。ただし、平文表示する場合、入力タイプが変化し、コピーカットが有効になるので対策が必要です。
* ルールを適用するには、ユーザビリティの面を考慮する必要があります。例えば、センシティブな情報を表示する可能性があるからと言って、コピーを無効化した場合、使い勝手が悪くなります。その場合、センシティブな情報を表示する場合は、別のコンポーネントを使用する、注意喚起をするなど検討して、対応を決めると良いです
【ゲリラアドカレ】UE4ゲーム実装　進捗報告 9日目

【非公式】某会社設立記念ゲリラ Advent Calendar 2016 18日目の記事です。

FlashゲームをUE4で再実装するゲリラアドカレです。
少しだけ進捗したので記載します。

・注意
許可を取ってないので通常業務の空いた時間を利用して作成するため、作成中のゲーム、及びアドカレは完成保証がなければ、ゲーム自体もリリースされる保証も皆無なので、あんまり期待しないでください。

#タイトルを少し改良した

![タイトル](https://qiita-image-store.s3.amazonaws.com/0/104377/bfb7f04d-0bde-a25d-3959-f0784b484bf8.jpeg)

すみません、2日間仕事と別のアドカレを書いていて時間が取れなかったため、今回はこれだけです。
C言語でマルチプラットフォーム対応のコンストラクタ処理（MSVCでの__attribute__((constructor))相当など）

# 背景
　最近いじっているCのソフトに、マルチプラットフォーム対応の静的なプラグイン機構[^1]をつけたくて、明示的に呼ばずに初期化処理を走らせる方法をいろいろ調べてみました。
　なおDLLやSOなどはエントリポイントがあるのでそちらを使ってもよいと思います。
[^1]: 既存コードに手を入れずに、作成したCソースファイルをビルドに含めるだけで、機能一覧に登録されるような機構。ユニットテスト作成時等にも便利。

# 解
1. C++に妥協し、static変数のコンストラクタを使う
2. `__attribute__((constructor))`を使う（gcc拡張）
3. `.CRT$X??`セクションに配置する（VCのCRT機能）

Stack Overflowの以下の回答がわかりやすいです。
[c - \_\_attribute__((constructor)) equivalent in VC? - Stack Overflow](http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc/2390626#2390626)

コードも抜粋しておきます。public domainなので、使いやすくてよいですね。

```initializer.c
    // Initializer/finalizer sample for MSVC and GCC/Clang.
    // 2010-2016 Joe Lowe. Released into the public domain.
#include <stdio.h>
#include <stdlib.h>

#ifdef __cplusplus
    #define INITIALIZER(f) \
        static void f(void); \
        struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \
        static void f(void)
#elif defined(_MSC_VER)
    #pragma section(".CRT$XCU",read)
    #define INITIALIZER2_(f,p) \
        static void f(void); \
        __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \
        __pragma(comment(linker,"/include:" p #f "_")) \
        static void f(void)
    #ifdef _WIN64
        #define INITIALIZER(f) INITIALIZER2_(f,"")
    #else
        #define INITIALIZER(f) INITIALIZER2_(f,"_")
    #endif
#else
    #define INITIALIZER(f) \
        static void f(void) __attribute__((constructor)); \
        static void f(void)
#endif

static void finalize(void)
{
    printf( "finalize\n");
}

INITIALIZER( initialize)
{
    printf( "initialize\n");
    atexit( finalize);
}

int main( int argc, char** argv)
{
    printf( "main\n");
    return 0;
}
```

# 参考サイト（調査時の閲覧順）
* [main() の前に関数を呼ぶ - bkブログ](http://0xcc.net/blog/archives/000091.html)
gcc関係だとおそらく真っ先にヒットする解説ページ。arでリンクされなくなる問題への対処法（`--whole-archive`）も。

* [c - \_\_attribute__((constructor)) equivalent in VC? - Stack Overflow](http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc/2390626#2390626)
Stack Overflowでのやりとりとマルチプラットフォームのエレガントな回答

* [ブログズミ: C で main の前に関数コール](http://srz-zumix.blogspot.jp/2012/04/c-main.html)
テスティングフレームワークiutestを作成されている方の調査記事。
iutestはインクルードのみで利用できるらしく、なかなか便利そう。

* [MSDN : CRT の初期化](https://msdn.microsoft.com/ja-jp/library/bb918180.aspx)
VCの初期化の仕組み

* [Common Function Attributes - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes)
gccのオンラインマニュアル
dockerでジャッジシステム作りたい時

Aizu Online JudgeやAtcoderなどのオンラインジャッジシステムを作る時のメモ．

オンラインジャッジシステムを作る上で必要なことは

* プログラムに入力を与えて期待する出力かどうか判定する
* リソースを均等にする

細かく言えばたくさんありますが，こんな感じだと思います．

今までは一つ目しか満たしてなかった（とてもよくない
とりあえず安全に実行できる環境にするべきだろうということでdockerを導入した．
その上で，幾つかハマりどころが合ったので残しておく．


### 要件
* 入力と出力は数MBになりえる
* 実行時間制限を指定できる．
* メモリ使用量を制限できる．
* プロセス数を制限できる．
* 生成されるファイルサイズを制限できる（今回は無し
* cpu使用率を均等にする（今回は無し
* 使用したメモリ量を取得できる．
* 実行時間を取得できる．
* プロセスのステータスを取得できる．

###　仕様
* サーバーの性能的に，同時に実行できるプログラムは１つ

### プログラム

プログラムは以下．

```ruby
require 'docker'

image = 'gcc:latest'
tmp_path = File.expand_path('../tmp', __FILE__)
memory = 128


options = {
    'Image': image,
    'Tty': true,
    'HostConfig': {
        'Binds': [ tmp_path + ":/tmp" ],
        'Memory': memory * 1024 * 1024,
        'PidsLimit': 10
    },
    'WorkingDir': '/tmp'
}

container = Docker::Container.create(options)
container.start

p container.exec(["sh", "-c", "g++ source.cpp"])
p container.exec(["sh", "-c", "/usr/bin/time -f \"%M KB\" ./a.out > result.log"])
container.delete(force: true)
```

createに渡すオプションは基本的に [ここ](https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/create-a-container)の構造をrubyで実現すればいい．

'Tty' を trueにしないといい感じに動かなかった．
'Memory'はByte指定なので適当に掛け算してMBにした．
'Binds'はマウントの指定．

**　あと，createしただけではstartされないので注意**

execの渡し方は基本的には配列だけど，まとめた長いコマンドとかはこんな感じにするといい．

終了後にdeleteするようにしておく．
play2.5.x でアプリケーション起動時に処理を行いたい（のに上手くいかない）

# 概要

play2 の以前のバージョンでは GlobalSettings.onStart 内にアプリ起動時の処理を記述すれば良かったのですが、play2.4 から非推奨になりました。

では、どうすればいいのでしょうか。

# 初期化処理が軽い場合

初期化処理が必要なクラス（クラスA）を他のクラス（クラスB）にDI しておけば、クラスB 生成時にクラスA が自動で生成されますよね。なので、クラスA のコンストラクタに必要な処理を記述しておいて、処理結果を利用するクラスBに DI すればええやん、というのが一番簡単な代替案になります。

でも、時間を要する処理の場合には、アプリ起動時に処理しておきたいですよね。

# 初期化処理が重い場合

google guice の eager singleton を使用する方法があります。eager singleton は binding の定義時にインスタンスが生成されるので、binding 中に初期化処理が行えるというわけです。

サンプルコードです。

root パッケージに以下のように Module.scala を作成します。

```Module.scala
import com.google.inject.AbstractModule
import logic.AppStart

class Module extends AbstractModule {
  def configure() = {
    /**
      * アプリケーションスタート時の処理
      * https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection#Eager-bindings
      */
    bind(classOf[AppStart]).asEagerSingleton
  }
}
```

初期化処理を記述するクラスです。

```logic.AppStart
package logic

import javax.inject._

@Singleton
class AppStart @Inject()() {
  print("future start")
}
```

こうしておけば、アプリ起動時に AppStart のコンストラクタが呼ばれます。

で、ここまでは公式サイトを読めば分かるのですが、
上記の初期化処理は、デバッグモード（sbt run）だと、最初のアクセスがあるまで実行されないんですね。プロダクションモードだとアプリ起動時に実行されます。個人的に、デバッグモードで動作確認をしていて、嵌ってしまいました。

# 初期化処理内で DB やら WS やら使いたい場合はどうすれば・・・？

上記の初期化処理は binding の定義内で行われるので、google guice の初期化が完了していません。なので、DB やら WS やらを AppStart クラスに inject するとエラーになります。

初期化処理を google guice の初期化完了後に実行できればいいのですが・・・スマートな方法が分かりません。苦し紛れですが、以下のように Future を使うとかでしょうか・・・。

1s あれば google guice の初期化処理は完了しているとして、

```
@Singleton
class AppStart {

  import scala.concurrent.ExecutionContext.Implicits.global
  // WSClient を利用するクラスの生成を別スレッドで行います。処理の開始を 1s 遅らせます。
  Future {
    Thread.sleep(1 * 1000)
    Play.current.injector.instanceOf[LoadData]
  }
}
```
※ちなみにですが、Play.current の使用は deprecated になっています。必要なクラスに DI して欲しいらしいです。でもこの用途だと DI できないですよね。。。

LoadData に WSClient を inject しておきます。

```LoadData.scala
class LoadData @Inject()(ws: WSClient) {
  import scala.concurrent.ExecutionContext.Implicits.global
  ws.url("https://www.playframework.com/documentation/2.5.x/ScalaWS").get().map {
    response => println(response.body)
  }
}
```

まあ、これでも実用性が無くはないのですが、Thread.sleep している間にアプリの起動が完了して、そのタイミングでアクセスがあった場合には、LoadData 内の処理が完了していないことになるのですよね。なので、上記の対応はあまり良くないです。

どうすればいいのだろうか・・・。
JavaScriptのdebuggerステートメントでブレークポイント


こんにちはsekitakaです。

今日初めて知ったのですがJavaScriptにはdebuggerステートメントというものがあります。
これはブレークポイントと同様の働きをします。
つまり開発者ツールを開いた状態で、`debugger;`と書いておけば任意の場所で処理を停止することができます。

```JavaScript
function() hoge{
  debugger; // ブレークポイント
  console.log('hoge');
}
```

今まで私はブレークポイントを設定するために、ブラウザの開発者ツールで任意のjsファイルを開き行番号をクリックしていました。
しかしこの方法だと以下のような問題がありました。

* 開発者ツールで目的のjsを開くのが面倒
* コードを修正し行番号が変更されるとブレークポイントが意図しない行に設定される

debuggerステートメントを使えばIDEで編集中のファイルに、即座にブレークポイントを設定することができます。
地味に開発効率化に繋がりそうな発見でした。
Android StudioでAndroid NDKをインストールする


### 環境
- Mac OSX
- Android Studio 2.2.3

# 対処方

1. [File] > [Project Structure] > [SDK Location]
2. NDKがインストールされていない場合、`Android NDK location`にダウンロード用のリンクが表示されているのでそこからダウンロード開始
3. しばし待機して再度1に戻る
4. `Android NDK location`でデフォルトのNDKパスに設定するか聞かれるので設定してもらう

これでNDKをインストールできるはず。
Cognos Report Authoring 逆引き辞典 B1 画面を遷移せずにグラフやリスト表示の切替を行う

![B1.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9d5e131e-0ae4-da14-0e78-97b41c68abe0.png)


■詳細手順
http://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-b1conditionalblock

Cognos Report Authoring 逆引き辞典 - 目次一覧
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
擬似アニーリングと量子アニーリング

本日、代打で投稿します。

数式は１行しかでてきませんので、気軽に読めます。（物理の素人が書いたので、読み物としてご笑読ください。）

#Simulated Annealing(擬似アニーリング)とは？
探索空間の中から所望のものを発見するするための探索手法です。加熱して柔らかくなった鉄が、冷されるにつれて結晶構造が定まっていく様子に類似していると思う科学者もいます。このことが、焼きなましの英語であるAnnealingになります。

探索アルゴリズムは、広い空間を捜索するエージェントと考えることができます。ある位置から別の位置へと移動しながら、最低の高度の場所を見つけようとします。このようなエージェントのふるまいをランダムプロセスと呼びます。もし、エージェントの記憶能力が悪かったとすると、１単位時刻より過去の記憶については、「どこから跳んできたんだっけ？」と忘れてしまうでしょう。これは、マルコフ鎖と呼ばれている概念です。機械学習をかじったからなら、聞いたことやったことがあるでしょう。では、ある種の探索アルゴリズムは、複数のエージェントを持っているでしょう。そして、エージェント同士で通信をすることもありえます。このような場合、探索アルゴリズムは、ある位置の集合から、別の位置の集合への遷移とみなせます。

温度という考えが出てきます。最初のうちは、エージェントは、活発です。結果として、位置の低い方ではなく、高い方向に行ってしまうことさえあります。これは、最小の高度を見つけるという目的のためには、悪いことじゃないかと思う方もいることでしょう。しかし、高度の高い位置にある谷底に落ち着いてしまうこともあります。機械学習や最適化などで局所的な最小（Local Minima）などと呼ばれている概念です。このような、極小解の谷底に陥らずもっと深い谷底、つまり、高度が低い位置を見つけることができるようになるのです。さて、活発さの度合いを、受理基準と呼ぶことにします。乱数によって決めます。温度スケジュールによって、エージェントの活発さを徐々に低下させていきます。すると、高度の高い方向へと向かう割合が少なくなります。言い換えると受理基準を満たすことは、温度が低下するにつれて困難になります。

#

#アニーリングのための量子力学（存在することと、認識することの違い）

突然ですが、お昼の時間帯に窓を閉めきった建物の中にいるときに、太陽が存在しないかも？なんて不安になったりしないですよね？？が、しかし、物理学者という人たちはそんなこともシリアスに考える人たちなのです。

細かい話はさておき、量子力学では、以下の仮設（議論の前提とし、無条件で成立するとみなす事柄）を２つ置いています。（e.g http://www2.math.kyushu-u.ac.jp/~hara/lectures/09/QM_structure2.pdf 3.5.1）

（仮設１）ミクロな世界でのあるもの（原子など）単体の運動法則は、時間を含む式で記述できるよ（シュレディンガー描像）
（仮設２）「あるものAが存在することをA以外の何か（装置、人）が認識するためには」は「そのものが存在する確率分布」でしか測ることができない。くじ引きをするしかないよ（波束の収縮）。

仮設１では、あるもの（原子など）が存在して運動していたとしても、他の装置や人によって認識されていないということに気をつけましょう。

#量子アニーリング
今までに、考えられた、量子力学の法則を使ったコンピュータの理論（量子チューリング機械、ゲートモデル等）はもっぱら（仮設２）のくじ引きの操作をしやすくするための前処理をどうするか？という点に主眼が置かれていました（Shorの素因数分解アルゴリズムで使用されている、QFTなど）。長所としてどんな関数や手続きも計算できる一方で、物理的な装置として作成するのがとっても困難でした。

これに対して、量子アニーリングでは（仮設１）の時間が経過するに連れてどうなるかという性質に主眼をおいています。

擬似アニーリングを量子力学の法則を使って、拡張したのが量子アニーリングです。


さて、量子アニーリングで最小化される目的関数は以下のような形式です。

```math
H = \frac{t}{T}H_{0}+(1-\frac{t}{T})H_{1}
```



$H,H_{0},H_{1}$のいずれも物理屋さんが与えた量（ハミルトニアンという名前）だと思って下さい。ただし、実用上の問題をこの量の定義式（省略します）で記述する必要があります。

$H$は、目的関数です。この値を最小化します。

$H_{1}$は擬似アニーリングのエージェントの活発さを量子版で記述するための量です。
$t=0$のとき$H=H_{1}$になります。
$H_{0}$から、求めたい最小値が取り出せます。
$t=T$のとき$H=H_{0}$になります。

といういうわけで、最初($t=0$)は活発な探索を行います。可逆過程と呼ばれる操作をしながら、最終的には（$t=T$）求めたい答えを含んだ物理量の最小化という作業を行っていることになります。最初から、$H_{0}$を最小化すればよいのでは？と思う方もいるかもしれません。しかし、それだと局所的最小を避けることができなくなってしまいます。また、$H_{0},H_{1}$の２つの項を含む式は、物理屋さんが「量子ゆらぎ」と呼んでいるもので、量子論の枠組みのなかで、局所的最小解をさけるには$H_{1}$は必要です。



#量子アニーリングは、擬似アニーリングより計算時間が速い？？
状況証拠はありますが、確定ではないです。が、物理実験などで、活発に調べられている分野です。
#何が、実際の適用で難しい？
（１）物理屋さんが与えた量ハミルトニアンを使って、実用上の問題をこの量の定義式で記述しないといけない部分
（２）「可逆過程」と呼ばれる操作をしながら、という部分です。理論通りにやろうとすると、計算時間が膨大すぎるので、近似しないといけないです。
ApacheのProxy配下にSpringSecurity認証を入れたらハマった

## やりたいこと

Spring Bootで作ったアプリをサーバ上のTomcat配下のコンテキストに配置し、
ブラウザからはルートコンテキストでアクセスさせたい。
ログイン認証も中でやりたい。

Tomcatに複数アプリを設置する必要がある場合等、コンテキストがついてしまうケースがままあると思う。
コンテキストがつくと扱いが面倒なので開発はルートコンテキストでなんとかやりたい。

## 前提

- サーバ上のTomcatにspring-bootアプリを配置
    - tomcatには複数アプリを配置する必要があったので、ルートコンテキストを専有できない
    - contextは/appとする

- ブラウザからアクセスする際は```http://app.example.com/```のようにアクセスしたい
    - Apacheで```localhost:8080/app```にプロキシさせる感じで

- ソースコード上でコンテキストを意識したくないので、```server.contextPath```は指定しない

- appはSpring Securityによるセッションを使った認証を伴う
    - 事前にローカル環境でフォーム認証くらいができる状態にしておいた

## とりあえずやってみたら

Tomcatにwarを配置。
Apacheにはとりあえず以下のようにプロキシさせてみた。
（例ではAJPを使わずにhttpでproxyしているけど、AJPでも同じ動作のはず）

```
<VirtualHost *:80>
  ServerName app.example.com
  ProxyPass / http://localhost:8080/app/
  ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

```

これでブラウザから```http://app.example.com/```にアクセスしたら
ログイン画面が表示された。
なんだ、簡単だなと思った矢先。

usernameとpasswordを打っても打ってもログイン画面に戻ってくる。
なんで？と思ってブラウザのcookieを調べたら何も存在（session idがない）していなかった。
ここからが長かった

## Cookieをなんとかするには

色々調べた結果、リクエストのコンテキスト（今回はルートコンテキスト）とproxy後のコンテキスト（今回は/app）が違う場合、cookie pathが異なる為、ブラウザとサーバのcookieがうまくいかないらしい。

ただApacheのmod_proxyにはこれに対応する為、proxy時にcookie pathを書き換える機能が
存在するとのこと(```ProxyPassReverseCookiePath```)。
また、合わせてapp.example.comからlocalhostへとドメインが変わっていることから
cookie domainの書き換えも実施する(```ProxyPassReverseCookieDomain```)

早速やってみる

```
<VirtualHost *:80>
  ServerName app.example.com
  ProxyPass / http://localhost:8080/app/
  ProxyPassReverse / http://localhost:8080/app/
  ProxyPassReverseCookiePath /app/ /
  ProxyPassReverseCookieDomain localhost app.example.com
</VirtualHost>
```

これで再度ブラウザからアクセスすると、ブラウザ側にcookieが現れました！

よっしゃー！と喜び勇んでusernameとpasswordを打ち込むと相変わらずログイン画面に戻ってくる。
なんなのか。

## 続・Cookieをなんとかするには

どうもcookieを発行したが、サーバ側が認識していないっぽい。
ログイン画面アクセスの都度、新しいcookieが発行されてる。

色々調べた結果、以下のproxyでついにちゃんと動くようになりました

```
<VirtualHost *:80>
  ServerName app.example.com
  ProxyPass / http://localhost:8080/app/
  ProxyPassReverse / http://localhost:8080/app/

  RewriteEngine on
  RewriteRule /app/(.*)$ http://localhost:8080/app/$1 [P]

  ProxyPassReverseCookiePath /app/ /
  ProxyPassReverseCookieDomain localhost app.example.com
</VirtualHost>
```

proxyだけでなくmod_rewriteを使ってURLの書き換えもしました。
これでちゃんと動きます。

なぜか？
mod_proxyで飛ばすと```HTTP Location header```だけ書き換えになるのですが
これだとSpring側がちゃんと書き換わったように受け取らないっぽい。
mod_rewriteでURLごと書き換えて上げるとちゃんとcookieもつながったみたいです。

## まとめ

- リクエストのコンテキストとproxy後のコンテキストが違う場合、cookieに問題が出る
- proxy前と後でcookie pathとcookie　domainを揃えてやる必要がある
    - ```ProxyPassReverseCookiePath```と```ProxyPassReverseCookieDomain```を使う
- springにちゃんとcookieを認識してもらうには更にmod_rewriteでURLの書き換えも必要

## 参考にさせて頂いたサイト。ありがとうございました。

http://hogem.hatenablog.com/entry/20091205/1260023908

http://kadoppe.com/archives/2011/04/tomcat-cookie-path-mod-proxy.html

http://serverfault.com/questions/654764/apache-reverse-proxy-setting-for-site-having-spring-security
export defaultは import { default }で受け取れる



ES6のモジュールシステムで
モジュールをまとめてindexするだけのモジュールを書く時など、
インポートしたモジュールをそのままエクスポートしたい時に、
以下のような構文がありますが、

```js:foo.js
export class Foo {}
```

```js:index.js
export { Foo } from './foo';
```

`export`だけによるNamed exportであれば問題ないのですが、
Default exportされたモジュールをそのままエクスポートしようとすると

```js:index.js
export Foo from './foo'; // Error
```

どうしても構文エラーになります。


Default exportされたモジュールをそのままエクスポートしたい時は

```js:index.js
export { default as Foo } from './foo';
```

とするといいみたいです。

なぜこうなるかというと、

```js:foo.js
export default class Foo {}
```

```js:index.js
import { default } from './foo';
```

`export default`されたモジュールは、上記のように
Named import構文で`default`という名前で受け取ることができるみたいです。


参考

[import - JavaScript | MDN](https://developer.mozilla.org/en/docs/web/javascript/reference/statements/import)

[typescript-export-vs-default-export | stackoverflow.com](http://stackoverflow.com/questions/33305954/typescript-export-vs-default-export)
How To Set Up Devise AJAX Authentication With Rails 4.0

なかなか賢い。

http://blog.andrewray.me/how-to-set-up-devise-ajax-authentication-with-rails-4-0/

Controller.respond_to :json すると積み上がるのね確認

```
module ClassMethods
     def respond_to(*mimes)
       options = mimes.extract_options!
       only_actions   = Array(options.delete(:only))
       except_actions = Array(options.delete(:except))
       new = mimes_for_respond_to.dup
       mimes.each do |mime|
         mime = mime.to_sym
         new[mime]          = {}
         new[mime][:only]   = only_actions   unless only_actions.empty?
         new[mime][:except] = except_actions unless except_actions.empty?
       end
       self.mimes_for_respond_to = new.freeze
     end
     def clear_respond_to
       self.mimes_for_respond_to = ActiveSupport::OrderedHash.new.freeze
     end
```
node --inspectの chrome-devtools://... コピペを自動化するChrome拡張を使う

## 要約

`node --inspect`の`chrome-devtools://...` を開く作業を自動化する[NIM](https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj)が便利

## `node --inspect` ではURLコピペが必要
`node --inspect` オプションが実装されChromeDevToolsでデバッグができるようになりました :tada: 
しかし、生成されるURL(`chrome-devtools://...`の部分)をコンソールからコピーしてChromeのアドレスバーに貼り付ける必要があるのが、少し面倒です。

![before2.gif](https://qiita-image-store.s3.amazonaws.com/0/127847/f05a22ec-2cd7-aeff-9050-53a58e28eac3.gif)


## NIMでコピペを自動化

[NIM](https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj) というChrome拡張を使えば、自動でChromeDevToolsが立ちあがってくれます 😊

### 使い方

インストールした拡張のアイコン（下図ピンク部分）をクリックします。
<img width="300" alt="拡張アイコンの画像です" src="https://qiita-image-store.s3.amazonaws.com/0/127847/f4c01e53-c5ea-06fe-04b6-b445cd3dfa28.png">

設定画面が開きます。`Manual`を`Auto`に変更します。
<img width="300" alt="拡張の設定画面の" src="https://qiita-image-store.s3.amazonaws.com/0/127847/2eb781c8-28e8-fc11-6e62-6ffcf7c38ec6.png">

`node --inspect`コマンドを実行します。
![after2.gif](https://qiita-image-store.s3.amazonaws.com/0/127847/36f4d727-ff48-ad56-813c-8eedb3c497c5.gif)

URLコピペなしでChromeDevToolsが立ち上がりました。 :tada:

## おわりに

NIMで楽しいデバッグライフを！

## リンク

### node --inspectの使い方
- [`node --inspect --debug-brk`を使ってE2Eテストをデバッグするのめちゃ便利 \- Qiita](http://qiita.com/takoba/items/5fcd541a3c0742d61afe)
- [node-inspectorなしでNode.jsをデバッグする  \- Qiita]
(http://qiita.com/y_fujieda/items/c190cbcc2fab6dd49809)
- [Debugging Node.js with Chrome DevTools \- Medium](https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27#.b4wz9eiel)

### NIM
- [公式サイト](http://nim.ucraft.com/)
- [Chrome ウェブストア](https://chrome.google.com/webstore/detail/nim-node-inspector-manage/gnhhdgbaldcilmgcpfddgdbkhjohddkj)
xdebugをwindowsのphpに設定する方法で悩んだ件

xdebugをwindowsのxampp環境にて使いたいと思って、xdebug.dllを適当に
php\extの中に配置して
そこのアドレスをphp.iniに書けばいいやと思っていたけど、実はかなり奥深かった件をお伝えします。

Linuxだと簡単かもしれません。

Windowsだとxdebugのホームページにアクセスし、ダウンロードして、インストールなのですが、
ちょっといろいろあります。そこで見つけたのが以下のサイト。
[Tailored Installation Instructions](https://xdebug.org/wizard.php)
https://xdebug.org/wizard.php

これ、すごく便利でした。
phpinfo()によって出力されたweb全体をコピーして上記アドレスにあるテキストエリアに貼り付けます。

あとは、「analysis」をクリックして解析させると
いろいろな情報からxdebugの最適なdllを教えてくれます。

それをダウンロードしインストール。さらにはphp.iniの設定記述まで指示してくれるので無問題です！
30 Days of React を意訳していく Day1 - What is React?

# はじめに

[Fullstack React: 30 Days of React](https://www.fullstackreact.com/30-days-of-react/) の意訳です。

ちょいちょい読んでるのでせっかくなので訳そうと思った次第。飽きるまで続きます。

ぼく自身はjQueryおじさんで、あんまりJSまわりへの理解も深くないのでなんか間違っていたら指摘よろしくです。

終わったらをこっちを買う予定。

[Fullstack React 🐬 Book \- The Complete Guide to ReactJS and Friends](https://www.fullstackreact.com/)

# 本編

https://www.fullstackreact.com/30-days-of-react/day-1/

Reactの何が良いのか説明していく。

## What is React?

Reactは、Javasrciptのライブラリでwebアプリのviewレイヤーを担当する。

Reactの肝はコンポーネントです。コンポーネントは自己完結型のモジュールで、コンポーネントを使ってボタンとかテキストインプットとかを作ることができる。

あと、コンポーネントは内部に他のコンポーネントを持てる。つまり複数のコンポーネントを組み合わせて別のコンポーネントを作れる。

実際にReactを使ってアプリを書こうとするといろんなコンポーネントを作ることになる。１つ１つの単純なコンポーネントを組み上げて1つのアプリを作る。

例えばフォーム。フォームは、いろんな要素（ボタンとかラベルとインプット）からできてるけど、それらの要素1つ1つをReactで書くことができて、それらを使ってフォームコンポーネントを作ることができる。フォームコンポーネントでは、ボタンとかラベルとインプットをどこか置くかとか、そういうことを決めてあげればよい。

それぞれのコンポーネントは厳密なデータを管理する原則に従う。複雑なUIは複雑なデータを持ちがち。Reactは、いろんな状況でUIがどのように見えるか、すぐにわかる感じに限定して使えるツールを目指してるっす。あとの章で深掘ります。

## Okay, so how do we use it?

ハローワールドな！！

```
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Hello world</title>
  <!-- Script tags including React -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.min.js"></script>
  <script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
</head>
<body>
  <div id="app"></div>
  <script type="text/babel">
    ReactDOM.render(
      <h1>Hello world</h1>,
      document.querySelector('#app')
    );
  </script>
</body>
</html>
```

数行のJSでHello Wroldが出てるのでビビるかもしんないけど、いくつかのライブラリをインクルードする必要があるよ！

## How does it work?

ReactはブラウザのDOMを直接いじるんじゃなくて、バーチャルDOMを操作するよ。

ブラウザのDOMを直接いじるとすごく遅くなることがあるので、 React Virtual DOM を通じてDOM操作をすることで、そうならないようによきようにVirtual DOMがやってくれます。

Day 2は実際にコンポーネント作る！あと、JSXにも触れていく！
mix.exs の中の version の値を外部ファイルに外出し

諸般の事情により mix.exs の中で設定しているバージョン番号をコントローラから取得するニーズがあってちょっと調べてみたんですが、残念ながら直接そういう機能が無かったため、簡単なマクロで実現してみました。

ロジックは非常に単純で、mix.exs と同じ場所に `VERSION` というファイルを置き、その中にバージョン番号を記入するだけです。

コンパイル時にこの値を読み込んで、モジュールの中に `version()` という関数を動的に生成してくれるので、あとは mix.exs あるいはコントローラの好きな場所で呼び出すだけです。

```elixir:VERSIONファイルの例
1.2.3
```

```elixir:mix.exs
defmodule Foo.Mixfile do
  use Mix.Project

  ########## ここから追加
  version = File.stream!("VERSION", [], :line)
  |> Enum.at(0)
  |> String.strip()

  def version(), do: unquote(version)
  ########## ここまで追加

  def project do
    [app: :foo,
     version: version(),   ##### ← version()に変更
     elixir: "~> 1.3",
     elixirc_paths: elixirc_paths(Mix.env),
     compilers: [:phoenix, :gettext] ++ Mix.compilers,
     build_embedded: (Mix.env == :stg) or (Mix.env == :prod),
     start_permanent: (Mix.env == :stg) or (Mix.env == :prod),
     aliases: aliases,
     deps: deps]
  end
```

・コントローラからバージョンを取得する時用の関数

```elixir:controller/foo.ex
defmodule Foo.util do

  version = File.stream!("VERSION", [], :line)
  |> Enum.at(0)
  |> String.strip()

  def version(), do: unquote(version)
end
```


本当は DRY にしたかったんですが、mix.exs から他のモジュール（上記の例だと `Foo.util.version`）の関数を呼び出しても、おそらく優先度の関係でモジュールを見つけることができずエラーになってしまいました。

その逆に `Foo.Mixfile モジュール` の中の関数を `Foo.util.version()` から呼ぼうとしても、まぁ当たり前ですがリリースビルド版では `* (UndefinedFunctionError) function Foo.Mixfile.version/0 is undefined (module Foo.Mixfile is not available)` になってしまいました。

まぁロジックも短いので気にしないことにします（いい解決方法をご存知の方、ぜひコメントを！）
機械学習とコンピュータビジョンのリンク集（自分用）

# 顔認識

* 実装 
    * https://github.com/kpzhang93/MTCNN_face_detection_alignment

# 感情認識

* https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data

# 画像データセット

* 動画 
    * Google https://research.googleblog.com/2016/09/announcing-youtube-8m-large-and-diverse.html
* 画像
    * 顔検出
        * TODO
    * 顔認識
        * アカデミックでのデファクト http://vis-www.cs.umass.edu/lfw/
            * 13000image, 1680human
            * Viora-Jonesで検出した
            * funneled imageを使うと認識が良くなる
            * 250x250 jpg 1人に1枚のがほとんど。何に使うの？
        * http://vintage.winklerbros.net/facescrub.html
        * http://www.cbsr.ia.ac.cn/english/CASIA-WebFace-Database.html
    * 多クラス
        * https://research.googleblog.com/2016/09/introducing-open-images-dataset.html
        * http://image-net.org/
* 一覧 
    * 比較用 http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html

# IDE

* [PyCharm Community Edition (Free)](https://www.jetbrains.com/pycharm/download/)

# 通る論文の書き方

* http://yamaguchiyuto.hatenablog.com/entry/2016/01/18/154613

# 実装の土台

* TensorFlow
* Keras
* chainer
* torch
* CNTK
* https://github.com/tflearn/tflearn
* theano
* 基本的なもの
    * numpy
    * cv2
    * scikit-learn

# ドキュメント記述

* Jupyter

# 他社のビジネスアイデア

* グラフを文字にする http://gigazine.net/news/20150225-automated-insights-wordsmith/
    * わかりやすくするためのAI
* 名刺管理アプリ
    * 各情報の認識の精度を上げる
* 動画生成
    * ユーザが投稿した複数の動画からクライマックス部分を抜き出して動画生成

# 他人のアイデア

* 線画への着色
* 絵のテーマ変更（ゴッホ風など）

# 自分のアイデア

* インスタから服認識して商品リンクへ
    * ユーザが付けるのはWEARでやられている
    * 全く同じ品じゃないと、似てても意味なさそう
    * 似てるけどより安いものなら需要あるかも
* ニュースを動画に
    * すでに情報商材系Youtuberがやっているがそれを自動化
* 出会い系
    * この人を好きならこの人もどうですか？（顔の類似度）
* ARによる不要物除去 :eyes:
    * 街を歩いているときの広告を置き換える
    * プレゼンで前の人の頭を見えなくしてスライドを補間する
Ubuntu上でLAMPとNeo4jの環境構築

# UbuntuをVirtualBox上に構築

1.下記のURLで仮装ハードディスクイメージ(多分.vhd)をダウンロード
https://www.ubuntulinux.jp/download

2.下記のURLを参考にインストール(スペックは適宜)
https://mtfield.net/virtualbox-ubuntu-14-04-image-disk/

# Ubuntuの更新
```
sudo apt-get update 
sudo ape-get upgrade
```

# MySQL, PHP, Apacheの環境のインストール
```
sudo apt-get install php apache2 mysql-server php-mysql libapache2-mod-php php-mbstring php-gettext
```

# Neo4jの環境のインストール
下記のURLを参照
http://qiita.com/mickey390/items/dc195f40acb9e97e99ba


# その他必要な環境のインストール
```
sudo apt-get install git phpmyadmin 
```
docker composeでファイルパスが長すぎるエラー(windows)

# 概要

Docker compose ver1.9.0で扱うファイルのファイルパスが長すぎるとエラーになる問題への対処方法
とくにnodejs系のライブラリを扱う時に発生しやすいのではないかと

## 動作環境

Docker 1.12.5
Docker Compose 1.9.0
Windows 10 pro x64

# エラー

```cmd:cmd
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose\cli\main.py", line 62, in main
  File "compose\cli\main.py", line 114, in perform_command
  File "compose\cli\main.py", line 835, in up
  File "compose\project.py", line 382, in up
  File "compose\service.py", line 305, in ensure_image_exists
  File "compose\service.py", line 727, in build
  File "site-packages\docker\api\build.py", line 55, in build
  File "site-packages\docker\utils\utils.py", line 95, in tar
  File "tarfile.py", line 2007, in add
  File "tarfile.py", line 1879, in gettarinfo
WindowsError: [Error 3] The system cannot find the path specified: 'k:\\Users\\xxxx\\dev\\tmp\\foobar\\node_modules\\gulp-clean\\node_modules\\gulp-util\\node_modules\\dateformat\\node_modules\\meow\\node_modules\\normalize-package-data\\node_modules\\validate-npm-package-license\\node_modules\\spdx-correct\\node_modules\\spdx-license-ids\\LICENSE'
docker-compose returned -1
```

# 結論

~~Docker composeを一つ前のver 1.8.1にダウングレードする~~
~~レジストリやグループポリシーで回避する方法もありましたが、私のWindows10にはそれらの項目がなかったため、ダウングレードしました。~~
~~Windows Anniversary Update以降はこの制限が緩和されているようなので、Update可能な方はUpdateしてみてください~~

Windowsのbuild 1607以上にアップグレードした後に「グループポリシー」 - 「ファイルシステム」 - 「Win32の長いパスを有効にする」にしてください。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/30522/ce4c75db-94ee-ba34-49c5-120dcf0cca41.png)


Githubでチケットが上がっていたので、そのうち対応されると思います
レジストリでの回避方法も記載されています(レジストリだけでは回避できませんでした。。。)
https://github.com/docker/docker-py/issues/1356


~~# ダウングレード方法~~

~~過去版のDocker for windowsのインストーラが見つかりませんでしたので、~~
~~[Github](https://github.com/docker/compose/releases/tag/1.8.1)にあがってたdocker-compose.exeをローカルのdocker-compose.exeに上書きします~~

最新版のDockerと組み合わせると動作が不安定になることがあるので、非推奨とさせて頂きます