OmniAICreator/Qiita-1.07M huggingface dataset:
Setup Ansible client on Windows Server

# Overview

# How to Set up 

## Setup Ansible server
 See the following link
* http://qiita.com/ainamori/items/122011aac7ce68925de5

## Setup Ansible (Windows) Client

### Configure & Allow from ansible server

1. Get ansible setup script from the following URL.
    * http://docs.ansible.com/ansible/intro_windows.html
2. Run this script as an Administrator
<pre>
 PS: powershell.exe -ExecutionPolicy RemoteSigned .\ConfigureRemotingForAnsible.ps1
</pre>

 Note: Run the script as Administrator

## Create play-book on Ansible server

1. Create host list
<pre>
 $ vi hosts
----
[Windows]
192.168.0.1
</pre>

2. Create log in parameter
<pre>
 $ vi group_vars/Windows
----
ansible_user: 'Windows User Name'
ansible_password: 'Windows Password'
ansible_port: 5986
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore
</pre>

3. Run 
<pre>
 $ ansible Windows -i /etc/ansible/hosts -m win_ping -v 
</pre>

# Use Case

## Scope
 1. Copy Installer from ansible server to Windows client.
 2. Install the application programs (PandoraFMS)
 3. Copy application setting from server to Windows client.
 4. Start service

## play book
<pre>
 $ vi /etc/ansible/roles/Windows/task/main.yml
----
#
# PandoraAgent-Windows Main Playbook
#
- name: Transfer pandoraFMS Agent Installer
  win_copy: 
    src: /etc/ansible/roles/pandoraAgent-Windows/files/var/tmp/PandoraFMS-WindowsAgentv6.0SP2-160509_x86_64.exe
    dest: C:\Users\Administrator\PandoraFMS-WindowsAgentv6.0SP2-160509_x86_64.exe
  tags: prod

- name: Install the latest version of pandoraFMS Agent
  raw: C:\Users\Administrator\PandoraFMS-WindowsAgentv6.0SP2-160509_x86_64.exe /S
  tags: prod

- name: pandoraFMS Agent settings
  win_template: 
    src: /etc/ansible/roles/pandoraAgent-Windows/templates/etc/pandora/pandora_agent.conf
    dest: C:\Program Files\pandora_agent\pandora_agent.conf
  tags: prod

- name: Starting & enable pandora agent
  win_service:
    name: PandoraFMSAgent
    state: started
    start_mode: auto
  tags: prod
</pre>

Note: [PandoraFMS](http://pandorafms.org)

# Link
* http://qiita.com/yunano/items/f9d5652a296931a09a70
Zybo > Chronicles blog 32 > Adafruit Neopixel > daisy chain でのデータ転送について

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-32-Driving-Adafruit-RGB/ba-p/457596


> NeoPixels have no clock line. They use a unique self-clocking, non-return-to-zero (NRZ) waveform to specify the bit values, as shown below:
 
図についてはblog参照

> The waveform’s bit period and duty cycle both change depending on whether the bit value represented is a 1 or 0. The timings are: T0H = 0.35μsec, T0L = 0.8μsec, T1H = 0.7μsec, and T1L = 0.6μsec. All timing values have a tolerance of ± 150nsec. These times give slightly different durations for a Low bit (1.15μsec) compared to a High bit (1.3μsec). We will analyze this serial communications scheme in much more detail when we write the software driver in a future blog.
 
>If a NeoPixel does not start receiving another word within 50μsec after receiving all 24 data bits in a data word, it loads the received 24-bit word into an internal register and lights its three LEDs using that 24-bit value. However, if the NeoPixel does receive another 24-bit word within the 50μsec timeout period, it retransmits the previously received word on its Dout port instead of using it internally. This mechanism allows you to use one serial signal line to control a large number of pixels in a very simple manner.

最後の節の処理は電子工作で連結した基板通信に使えるかもしれないのでメモとして残す。
Zybo > Chronicles blog 31 > Adafruit Neopixelについて > 3-wire interface / RGB (each 8 bit) / daisy chained / Din to Dout

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Zynq-DMA-Part-Two-Adam-Taylor-s-MicroZed-Chronicles-Part-29/ba-p/443324

> The AdaFruit NeoPixel strip has a very simple 3-wire interface consisting of power, return, and Din (Data In). You set the light output of each of the three NeoPixel LEDs (red, green, or blue) with an 8-bit value, which provides 256 brightness levels per single-color LED. When combined with the other two LEDs in each NeoPixel, you get 24-bit color (16777216 colors). The range of colors combined with the simple serial interface makes these devices very interesting for a number of applications.

- 3-wire interface 
- R,G,B各色が8bitで設定可能


> What makes these NeoPixels even better is that pixels can be daisy chained together. Each pixel has a buffered Dout (Data Out) pin and each NeoPixel passes along the data it receives on its Din pin to the Dout pin if another command word arrives immediately after the first. In this manner it is possible to build a large strip or other arrangement of individually addressable NeoPixels with just one I/O line, provided you can power them all.

- can be daisy chained
- Dinに来たものをDoutで出力
Zybo > Chronicles blog 31 > Adafruit NeoPixel使用プロジェクトで試す事項 > PL peripheral開発 / PS-PL通信 / I/O Carrier Card使用(PMOD) / PSソフト開発

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-31-Systems-of-Modules/ba-p/453336


NeoPixelを使って試す事項は以下の４通り。

> This example will look at driving an Adafruit NeoPixel digital RGB LED array from the PL under the control of the PS. We will pull together the following aspects:
 
>1. Developing a PL peripheral to drive the NeoPixels
2. Communication between the PS and PL
3. Using the Zynq I/O Carrier Card and the card’s PMOD expansion ports
4. Developing a PS application that uses all of these items
技術英語 > that also [paved the way] for the evolution of [full-fledged] human language | pavement | full-fledged engineer

http://www.scientificamerican.com/podcast/episode/ancient-human-ancestors-heard-differently/

> that also <font color=red>paved the way</font> for the evolution of <font color=red>full-fledged</font> human language


http://eow.alc.co.jp/search?q=pave+the+way
> pave the way for
～のために道を開く、～の地固め［地ならし・下ごしらえ・下準備・お膳立て・準備工作・道具立て］をする、～の下地を作る

http://eow.alc.co.jp/search?q=pavement
> pavement
1. 舗装道路、舗道、舗装、敷石


http://eow.alc.co.jp/search?q=full-fledge&ref=sa
> 2.〔人の技能などが〕一人前の、ひとかどの
3.〔程度・機能などが〕本格的な

...

[デルタ・フライヤー](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%AB%E3%82%BF%E3%83%BB%E3%83%95%E3%83%A9%E3%82%A4%E3%83%A4%E3%83%BC)の全センサーシステムを設計、実装できるfull-fledged engineerになれるのはいつの日か。
Emacs@MacのDired Modeの初期設定

Emacs@Macで表示されるエラーメッセージ

```
ls does not support --dired; see `dired-use-ls-dired' for more details.
```

は、coreutils を

```
brew update
brew install coreutils
```

などとしてインストール後に ~/.emacs.d/.init に

```elisp
(let ((gls "/usr/local/bin/gls"))
  (if (file-exists-p gls) (setq insert-directory-program gls)))
```

を追加する。

# 参考にしたページ
-  http://qiita.com/maangie/items/5a80ae50c13d14368a72
CentOSにrbenvをインストール

[rbenv](https://github.com/rbenv/rbenv)はRubyのバージョン管理をするためのツール。他にも似たようなツールには[RVM](https://rvm.io/)がある。あまりRubyに詳しくない私が感じる限り、最近はrbenvが'はやり'のようだ。

# 最新安定版のRubyをインストールする

CentOS7のyumでRubyのバージョンを確認してみたところ、下記の様な感じ。

	2.0.0.598-25.el7_1

最新の安定版は2.3なのでせっかくRubyなら最新版が良かろう、ということでrbenvをインストールする。

## 余談

PHPは現状5.xでもいいと思っているのだが、Rubyは最新版をインストールするのは何故か。仕事でないということと、数少ないrailsの案件を扱っていて、保守しなかった場合の辛さがPHPに比べて非常に大きく、Rubyではアップデートについていく事が重要に思えるからだ。

## インストール

### 概略

githubのrbenvのサイトにある通りで問題なくインストールできた。
git cloneして、コンパイル後、PATHを通せば動作する。
ポイントはコンパイル後に[ruby-build](https://github.com/rbenv/ruby-build)をgit cloneしておかないとinstallコマンドが動作しない。

### rbenvをgit clone

```:commandline
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

### コンパイル

```:commandline
cd ~/.rbenv && src/configure && make -C src
```

### パスを通す

```:commandline
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

下記コマンドで.bash_profileを再読込するか、ログインし直すと上記で追記されたbash_profileが反映される。

```:commandline
source ~/.bashrc
```


### [ruby-build](https://github.com/rbenv/ruby-build)をgit clone

```:commandline
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## 動作確認

```:commandline
rbenv install -l
```

```:commandline
rbenv install [version]
rbenv global [version]
```

確認して見る。

```:commandline
rbenv global
```

インストールしたrubyのバージョンが表示される。

```:commandline
ruby -v
```

インストールしたrubyのバージョンが表示される。
【Ruby on Rails】GitHubに公開したくない変数や値を隠してpushする方法

GitHubで公開したくないデータ(パスワードなど)を別ファイルに書いておいて、viewやcontrollerでそのデータを使う方法を紹介します。今回は環境変数を使用してデータを参照できるようにします。

# 環境
Ruby on Rails 4.2.6
Ruby 2.0.0p353

# dotenvのインストール
環境変数を使うためにdotenvを導入します。`Gemfile`に下記を追加します。追加する場所はループの中以外ならどこでもOKです。

```ruby:Gemfile
gem 'dotenv-rails'
```

上記を追加したら`bundle install`を実行します。

`$ bundle install`

# 環境変数を定義
dotenvでは`.env`というファイルの中に書いてあるデータを参照します。`.env`をアプリケーションディレクトリのルートディレクトリ(appやdbやGemfileがあるディレクトリ)に作成し、公開したくないデータを定義します。

```ruby:.env
LOGIN_NAME='noraworld'
LOGIN_PASSWORD='fh328sd9fshkq342bsfhsfuew'
```

# 環境変数の使い方
viewやcontrollerで以下のように書けば使えるようになります。

```ruby:viewやcontroller内のファイル
ENV['LOGIN_NAME']
ENV['LOGIN_PASSWORD']
```

# gitignoreに追加
隠しておきたいデータを定義した`.env`ファイルをGitHubに公開してしまっては意味が無いのでこのファイルは公開しないようにします。`.gitignore`に下記を追加します。

```lang:.gitignore
/.env
```

これで`.env`内のデータを隠してGitHubでコードを公開できるようになります。

# 参考サイト
[Railsで環境変数をライトに使う](http://mikazuki-ttp.hatenablog.com/entry/2015/07/24/170434)
Go1.5以降でのnet/http Requestの新しいキャンセル方法

[net/http/#Transport.CancelRequest](https://golang.org/pkg/net/http/#Transport.CancelRequest)

> ```go
> func (t *Transport) CancelRequest(req *Request)
> ```
> CancelRequest cancels an in-flight request by closing its connection. CancelRequest should only be called after RoundTrip has returned.
> 
> Deprecated: Use Request.Cancel instead. CancelRequest can not cancel HTTP/2 requests.

久しぶりにガッツリGoを書いていて気づいたのですが、Transport.CancelRequest()メソッドがDeprecatedになっていました。代わりにRequest.Cancelを使えとのこと。Request.CancelはGo1.5で追加されたらしい[^1]。

[^1]: [Go 1.5 Release Notes](https://golang.org/doc/go1.5#minor_library_changes)

[net/http/#Request](https://golang.org/pkg/net/http/#Request)

```go
type Request struct {

        // Cancel is an optional channel whose closure indicates that the client
        // request should be regarded as canceled. Not all implementations of
        // RoundTripper may support Cancel.
        //
        // For server requests, this field is not applicable.
        Cancel <-chan struct{}
}
```

Request構造体のドキュメントを見てみると確かにCancelフィールドが追加されています。Request.Cancelに`chan struct{}`型のチャネルを代入しておいて、そのチャネルに送信するか閉じるかすればリクエストがキャンセルされるということのようです。

```go
package main

import (
	"log"
	"net/http"
)

func main() {
	done := make(chan struct{})

	req, _ := http.NewRequest("GET", "http://www.google.com/", nil)
	req.Cancel = done

	go func() {
		close(done)
	}()

	_, err := http.DefaultClient.Do(req)

	log.Println(err) # Get http://www.google.com/: net/http: request canceled while waiting for connection
}
```

以前だとRequestをキャンセルするのに一々Client.Transportへの参照が必要だったのですが、その必要がなくなったおかげでClientのモックがやりやすくなりました。ありがたいです。

さて、このRequest.Cancelですが一つ面白い使い方があります。[Go 1.5 Release Notes](https://golang.org/doc/go1.5#minor_library_changes)にもあるとおり、Request.Cancelフィールドの型は[golang.org/x/net/context](https://godoc.org/golang.org/x/net/context)のContext.Done()の戻り値と互換性があります。つまりこのようなことができます。

```go
package main

import (
	"log"
	"net/http"
	"time"

	"golang.org/x/net/context"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
	defer cancel()

	req, _ := http.NewRequest("GET", "http://www.google.com/", nil)
	req.Cancel = ctx.Done()

	_, err := http.DefaultClient.Do(req)

	log.Println(err) # Get http://www.google.com/: net/http: request canceled while waiting for connection
}
```

便利ですね。

ちなみに、Go1.7ではgolang.org/x/net/contextが標準パッケージに組み込まれるそうです[^2]。

[^2]: [Go 1.7 Release Notes DRAFT](https://tip.golang.org/doc/go1.7)
react-routerでページ遷移する際の小技

どうもヒロです！
梅雨入りしましたねヾ(･ε･`*)
今年も、もうそんな季節かと考えると1年あっという間ですよね汗

時が経つのも早いので、今回も忘れないうちにreact-routerでページ遷移する際に詰まった事をメモ代わりに残しておきたいと思います。

今回のサンプルはこちらにございます。
https://github.com/takahiro-saeki/react-router-browserHistory-sample
サンプル用意する程のことでもないですが汗

##browserHistoryで404エラーを回避する方法
react-routerでbrowserHistoryを使用してページ遷移をする時、何も設定しないと404エラーが出ます。
ただおそらく多くのフロントの方はgulpなりwebpackなりでビルド環境を構築し、ローカルサーバーを導入している(browser-syncやwebpack-dev-server等)と思うので、gulpの場合ですと[connect-history-api-fallback](https://github.com/bripkens/connect-history-api-fallback)を導入したり、webpackだとwebpack-dev-serverの[historyApiFallback](https://webpack.github.io/docs/webpack-dev-server.html#the-historyapifallback-option)をtrueにしてあげればローカルサーバーで見る分には404エラーを起こすことは無くなります。

ただ、もし上記のようなことをしなかったり、S3等の静的ホスティングサービスでreact-routerを使用した際に(そもそもそのような状況でreact-routerを使用するなという話しは除いて)`<Link to='your path'>`のような記述では仕様を満たせず、location.assignと同等のことを使用したくなった場合に、404エラーを起こさない方法はないかと色々探した結果、見つかりました。

`browserHistory.push(`your path`);`と記述することによって404エラーを起こすことなく遷移することが出来ます。

簡単にまとめると以下のような感じ

```js:sample.js
import React, {Component} from 'react';
import { browserHistory } from 'react-router';
import Header from '../component/header';

export default class sample extends Component {
  location() {
    browserHistory.push('/sample');
  }

  render() {
    return (
      <main>
        <div onClick={this.location}>サンプル</div>
      </main>
    )
  }
}
```

`browserHistory`をimportして`browserHistory.push()`してあげればOK！

ただし、リロードした時には404エラーになるので、S3や静的ホスティングサービスでリロードに対する404エラーを回避する場合はインフラ側で設定しないといけないですがヽ(´･д･`)ﾉ

というわけで手短ですが以上です。
Nginxのproxy先にうまくHostヘッダーが渡らなかった事案と対応

タイトルそのままなのですが、このような事案がありました。
単純に `proxy_set_header` つければ良い、
という話とはちょっと異なります。

## upstreamディレクティブでproxyすると…

パフォーマンス改善のため[^1]、proxy_passにエンドポイントをそのまま指定するのではなく
upstreamディレクティブを利用するように変更しました。
こんな感じ？

### 変更前

```nginx
location / {
  proxy_pass http://oreore-microservice.com;
  proxy_set_header Host $proxy_host;
}
```

### 変更後

```nginx
upstream hogehoge_server {
  keepalive 10;

  server oreore-microservice.com:80;
}

location / {
  proxy_pass http://hogehoge_server;
  proxy_set_header Host $proxy_host;
}
```
  
すると変更後、upstream先に渡るHostヘッダーが **hogehoge_server** になってしまったんですね。まいっちんぐ。  

<br>

## 対応策

根本対応としては
「proxy_set_header に固定でproxy hostを設定する」
しかなさそうでした[^2]
今回であれば、以下の様な感じでしょうか。

```
proxy_set_header Host oreore-microservice.com;
```

### 複数ホスト指定の場合

[serverfault](http://serverfault.com/questions/598202/make-nginx-to-pass-hostname-of-the-upstream-when-reverseproxying)にあったのですが、直接proxyするのではなくローカルに複数port立てちゃって
そのport毎にヘッダー設定する、というテクニックを使っていました。
なるほどー

```nginx
server {
  listen      8001 default_server;
  server_name oreore-microservice-a;
  location / {
    proxy_pass       http://oreore-microservice-a.com;
    proxy_set_header Host oreore-microservice-a.com;
  }
}
server {
  listen      8002 default_server;
  server_name oreore-microservice-b;
  location / {
    proxy_pass       http://oreore-microservice-b.com;
    proxy_set_header Host oreore-microservice-b.com;
  }
}

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
}

server {
  listen      80;
  server_name example.com;
  location / {
    proxy_pass http://main;
  }
}
```

### Luaで変えちゃう

実は今回、upstream先もupstream名もNginx+Luaで動的に生成していたので固定指定だとつらい感じでした。
しかし幸いにもLua側でもホスト取得することが可能だったので、今回はnginx変数に突っ込んで対応しました。

```
-- Lua側
-- 実際にはなんかロジックで入れてる
ngx.var.oreore_proxy_host = "oreore-microservice.com"


# Nginx側
proxy_set_header Host $oreore_proxy_host;
```

<br>

以上、ちょっとした罠に引っかかった、というお話でした。


[^1]: 例のkeepalive対応
[^2]: 他の方法知ってる方がいれば教えて下さい〜
Sentryの環境を手元に作る


Mac上にSentryの環境を試しに作成したのでそのメモ。

## Sentryの環境構築

### Dockerの環境を作る

普通にインストーラーでインストールするだけなので割愛。

https://docs.docker.com/mac/

### Sentryの環境を作る

https://hub.docker.com/_/sentry/

Docker CLIで、「How to setup a full Sentry instance」の手順を実行する。

sentry-celery-beatが起動しないけど、ここに書いてある範囲を動かすだけなら大丈夫っぽい。

Workerの監視か何かをするっぽい。

### Dockerのポートの設定

Docker内でSentryが9000番で動いているので、8080で外からアクセスできるようにしておく。

8080という数字は意味はないので、すでにどこかで使っているなら適当な番号でも問題なし。

1. Kitematicを開く
2. my-sentryを選択する
3. Settingsを開く
4. Portsを開く
5. MAC IP:PORTのPORTに8080を入力する
6. SAVEボタンを押して保存する
7. ブラウザで http://(MAC IP):8080 にアクセスする

とりあえずログイン画面っぽいものが出たらOK。

### VirtualBoxのポート設定

上の手順だけだとMacの外からアクセスできないので、Virtualboxの設定を変更してMacの外からでもアクセスできるようにする。（といってもLAN内のみ）

1. Dockerの仮想マシンを選択する（多分defaultという名前）
2. 設定ボタンを押す
3. ネットワークを選択する
4. ポートフォワーディングを押す
5. 右側の＋ボタンを押す
6. ホストポート(= Mac)に8080を入力する
7. ゲストポート(= Docker)に8080を入力する
8. OKボタンを押してポートフォワーディングの設定を閉じる
9. もっかいOKボタンを押して仮想マシンの設定を閉じる

うまくいっているかは次の「Sentryにアクセスする」で確認する。

### Sentryにアクセスする

1. http://(マシン名.local):8080 にアクセスする
2. 歓迎されるのでContinueボタンを押す
3. Dashboardが表示される

とりあえずDashboardっぽいものが表示されたらOK。

IPだと後で変わりそうなのでマシン名.localにしたけど、Bonjour解釈できないクライアントだと困るかもしれんね。

## Sentryを試してみる

とりあえずシンプルなエラーイベントがSentryで記録されるか試してみる。

### Projectを作成する

Dashboardを開いて、以下のようにしてProjectを作成する。

1. 画面左のProjects & Homesをクリックする
2. 画面右上のNew Projectを押す
3. プロジェクトの作成画面が出るので、適当な名前を入力して作成ボタンを押す
4. Configure your applicationの画面が表示されるので、ここではJavaScript（多分Popularの一番最初のやつ）を選択する
5. 画面の内容をどこか適当な場所に控えておく（また後で確認できるので別になくても困らない）

### サンプルを配置する

githubに置いたので、適当に動かしてブラウザでアクセスする。

https://github.com/circled9/sentry-js-example

```bash
git clone https://github.com/circled9/sentry-js-example
cd sentry-js-example/
npm install
vi src/script.js # 前の手順で控えていたコードで上書き
npm start
```

### 結果を確認する

再びSentryにアクセスすると、サンプルから送信されたエラーイベントが追加されている。
(Mac) SourceTreeでコミットしたファイルたちをエクスポートする

Windows であったTortoiseSVN のような、指定したコミットのファイルを抜き出したい。SourceTreeで。

## 概要

所謂`checkout-index`を使用するカスタムアクション。
コミット当時のファイルを抜き出すのではなく、現在のindexの状態からエクスポートするので、**完全にTortoiseSVNと同様の操作というわけではありません。**
動作保証は特に無しでお願いします。

## カスタムアクションを定義しよう

ネットでよく見かけるカスタムアクション。
ネットで見つかるカスタムアクションのスクリプトは1つか2つのコミットを指定して差分ファイルを持ってくる系。
ここで掲載するスクリプトは、`Cmd + click`で複数選択可能(飛び飛びでもok)!
カスタムアクションのパラメータは `$SHA` で。
設定方法はこちらを参照してください。
http://qiita.com/lab3-34/items/e69ab8d0c51c9b64fe02

## カスタムアクションのスクリプト

```bash
#!/bin/sh

# custom action for SourceTree
# params $SHA

ARCHIVE_TO="$HOME/Desktop/archive_$(date +'%Y%m%d%H%M%S')/"

for commit_hash in $@; do
  git diff --name-only ${commit_hash}~...${commit_hash} | git checkout-index --prefix=${ARCHIVE_TO} --stdin
done
```

[gistもつくりました](https://gist.github.com/Yuji-Kuroko/57ca5e5df2e6e3f026cf716cdc709a57)

### 使用方法

任意の場所に上記カスタムスクリプトを置いて、 `chmod 755 file_name.sh` で実行権限を付与。カスタムアクションの登録。
適当にコミットを選択した状態でカスタムアクションを実行してください。記載のスクリプトでは、デスクトップ上に`archive_#{YYYYmmddHHMMSS}`というフォルダ名でエクスポートされます。

## 動作の解説

引数に渡されたSHAの前回から今回までの変更(該当コミットの変更ファイル)を取り出して、コミット回数分 `checkout-index` を実行しているだけ。
`ARCHIVE_TO`変数で出力先を指定しているので、`Desktop`出力から変えたい人はそこを変更してください。
注意: `~`展開は行われないため、`~`の代わりに`$HOME`を使ってください。



## (おまけ)カスタムアクションの作り方

パラメータ `$SHA` を選択すると、スクリプトの引数に選んだcommitの`sha`が渡されます。

```:実行例(適当)
hoge.sh 930920094 390239480 098kd09302
```

`shebang` を記述すれば、基本的にどの言語も実行できるようです。
(ターミナル上でファイル名を指定して実行できる形式)
RubyでもPerlでも使えるので、自由度は恐ろしく高そう。
RequireJS + babel-standalone + JSX

# 概要
JSXの変換ができるbrowser.js([babel-browser](https://babeljs.io/docs/usage/browser/))が廃止されたみたいですが、[babel-standalone](https://github.com/Daniel15/babel-standalone)で代わりのことができるので備忘録に残しました。
Node.jsを使わず、ブラウザのみでJSXのコードをランタイムに変換します。
RequireJSを使用する前提で書いています。

# サンプル
- JSXに限らず、es2015も書けるとは思いますがパフォーマンスの面からあくまでもSandbox環境での確認に留めたほうが良さそうです。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
    
    <script type="text/babel">
      // JSXをtext/babel内に書く
      define('main', ['react', 'react_dom'], function(React, ReactDOM) {
        var Main = function() {};
        Main.prototype.load = function() {
          ReactDOM.render(<span>Hello World</span>, document.getElementById('container'));
        };
        return Main;
      });
    </script>
    
    <script>
      requirejs.config({
        paths: {
          babel: 'https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.7.7/babel.min',
          react: 'https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min',
          react_dom: 'https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min',
        }
      });
      
      // まずbabelをロードする
      require(['babel'], function(Babel) {
        
        // text/babel部分を取得(複数あればその分だけ)
        var babel_scripts = document.querySelectorAll('script[type="text/babel"]');
        Array.prototype.forEach.call(babel_scripts, function(script) {
          
          // JSXを変換してロードする
          new Function(Babel.transform(script.textContent, {
            presets: ['es2015', 'react'],
            filename: 'embedded',
            sourceMaps: 'inline'
          }).code)();
        });
        
        // Babelでロードしたdefineの呼び出し
        require(['main'], function(Main) {
          
          // ロードする
          var main = new Main();
          main.load();
        });
      });
    </script>
  </head>
  
  <body>
    <div id="container"></div>
  </body>
</html>
```
SSH による 複数 ホスト への 連続的 な コマンド 実行

sshでは、ホストにログインせずにコマンドを指定して実行結果を得ることができます。

　ssh -l hoge 192.168.0.5 "date;hostname"

各対象ホストにコマンド「ntpdate -q」を連続的に実行させる場合は
<pre>
$ for i in 192.168.0.5 192.168.8.2 10.0.1.101; do ssh hoge@${i} "hostname; /usr/sbin/ntpdate -q nict.go.jp"; done
</pre>

テキストファイルからIPアドレスを抽出する場合
テキストファイル「host.txt」
<pre>
192.168.0.5
192.168.8.2
10.0.1.101
</pre>

<pre>
$ ssh2list() { cmd=$*; for i in `cat host.txt`;do ssh hoge@${i} ${cmd}; done; }
$ ssh2list "hostname; df -h; free; w; date"
</pre>
【Docker】RancherOSで本格的な自宅サーバーを構築しよう(1) ~ 要件と構成  ~

# Dockerで本格的なサーバーを構築する

![rancher-docker.png](https://qiita-image-store.s3.amazonaws.com/0/62822/fc4e37d1-4d32-8b0e-f1f4-c6d588650fe1.png)

## RancherOSとは
+ **プロダクション利用可能なDocker向けミニマルOS**
+ Dockerと競合を引き起こすおそれのあるsystemdのようなinitシステムを不要にし、最小限のコードベースとOSで動作するシステムサービスによってセキュリティを高めている
+ Kernel上に即座にDockerコンテナを実行するよう設計されており、これらのコンテナがコアとなるLinuxサービスをユーザに提供する
+ ライブラリが豊富

## 構築目次
+ **[RancherOSで本格的な自宅サーバーを構築しよう](http://qiita.com/okasho1010/items/da52b4dc12221feca55c)　←　今ここ**
+ [RancherOSでrancher-serverをインストールしよう](http://qiita.com/okasho1010/items/305e0af4545901d44a94)

+ [RancherOSでrancher-agentを構築しよう](http://qiita.com/okasho1010/items/500c3705d2f4610cebe0)

+ [RancherOSでGlusterFSを使ってデータを永続化しよう](http://qiita.com/okasho1010/items/2620da1b2e93437e8a74)

+ [RancherOSでprivate registory でdocker imageを管理しよう](http://qiita.com/okasho1010/items/cf0a9569638d00a9e451)


+ [RancherのCATALOGのライブラリー一覧](http://qiita.com/okasho1010/items/f6875d5bce2ac6752758) 
## 要件
+ dockerで動く
+ OSはRancherOSを使用
+ インフラの詳しい知識がない人でもrancherの管理画面からサービスを展開し、開発・公開ができる
+ データの復元・共有が可能
+ 保守・管理が安全にできる

## 仕様
+ 管理画面top
<img width="1680" alt="Screen Shot 2016-06-07 at 00.02.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/4af67130-4127-7d03-53a7-efef48a4f9fd.png">

+ コンテナの管理
 	- **基本的にrancher/serverさん(管理画面)がいい感じにしてくれる**
 	- rancher/serverさん(管理画面)がagentにコンテナをつくってくれる
	- 管理画面でぽちぽちコンテナをスケーリングとかupgradeとかデプロイできる


+ アクセス
	- rancher-serverに{domain.com}443もしくは80番でアクセスが来た場合HAProxyでagentに振り分ける


+ イメージ図
![Screen Shot 2016-06-01 at 23.02.13.png](https://qiita-image-store.s3.amazonaws.com/0/62822/a68230af-5c2f-4848-14d5-55c073080bfe.png)

+ コンテナの管理・様子
<img width="1680" alt="Screen Shot 2016-06-07 at 00.03.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/ff5a9587-dc0c-df51-2d66-7f02d1c3876d.png">

+ 基本的にはdocker-composeをコピると勝手に作ってれる
<img width="1680" alt="Screen Shot 2016-06-07 at 00.13.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/a55bf460-a148-4d74-69b5-1bfebfa64950.png">


## 前提条件
+ 物理マシンが2台以上必要となる(rancher/serverとrancher/agent)
	- 今回の場合はserver1台、agentを2台、計３台物理マシンを設置した。

+ rancher-server
	- rancherOS
	- 443 - 443
	- 80 - 80
	- 22 - 22
	- 5000 - 5000(private registry用)
	- publicIP
		* ??.??.??.??
	- privateIP
		* 192.168.3.100

+ rancher-agent01
	- rancherOS
	- 80 - 80
	- 1022 - 22
	- privateIP
		* 192.168.3.101

+ rancher-agent02
	- rancherOS
	- 80 - 80
	- 2022 - 22
	- privateIP
		* 192.168.3.102

## 実装予定機能
+ コンテナ・agent間でのデータ共有
	* glusterFS
	* Convoy Gluster

+ プライベートdockerhub
	- registory

+ データのバックアップ
	- Convoy

+ データの復元
	- Convoy

+ gitリポジトリ
	- gitlab

+ ciツール
	- gitlab ci

+ ssl
    + lets encryptもしくはwosign

+ セキュリティー
    + rancher-bench-security

+ 死活管理ツール
    +  DATADOG
    +  Prometheus

## 便利なライブラリたち
+ rancherではすぐ動かすことのできるライブラリーが多くある
+ [RancherのCATALOGのライブラリー一覧](http://qiita.com/okasho1010/items/f6875d5bce2ac6752758) 

<img width="1680" alt="Screen Shot 2016-06-07 at 00.04.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/69750c97-582d-bdf2-b3b9-43f21ec7fb8d.png">

+ jenkinsとかgitlab、無料sslのlets encryptも用意されている
+ なのでこの辺をうまく使って、いろいろしたいと思う
readfile()でファイルを読み込んでからiconv()で文字エンコーディングを変換する

環境Debian 8.5/Vim 7.4.1902


readfile()でファイルを読み込んでも自動的に文字エンコーディングの変換をしてくれません。
iconv()も自動的に文字エンコーディングを判断して変換してくれないので、事前に文字エンコーディングを調べる必要があります。



サンプルでは文字エンコーディングcp932で保存したファイルcp932.txtを読み込ませます。

```text:cp932.txt
あ
```

Vim起動

    vim -Nu NONE -S sample.vim

サンプルスクリプト

```vim:sample.vim
let filename = 'cp932.txt'
let f = readfile(filename)
echo f
```

結果

```
['<82><a0>']
````


リストに含まれる値がバイナリで表示されてしまいました。
**['あ']**が表示されません。
どうにかして**['あ']**を表示させたいので方法を調べました。

## バッファにファイルを開いて文字エンコーディングを取得してから変換する

fileencodingsを設定する必要があります。
cp932.txtを新規バッファに開くと、&fileencodingで文字エンコーディングが取得できます。

tabeditを実行した時に自動コマンドが発動しないように、noautocmdを使って一時的に自動コマンドを無効にしています。

Vim起動

    vim -Nu NONE -S sample1.vim

サンプルスクリプト

```vim:sample1.vim
set fileencodings=ucs-bom,utf-8,euc-jp,sjis,cp932,default,latin1
let filename = 'cp932.txt'
execute 'noautocmd tabedit ' . filename
let enc = &fileencoding
bwipeout
let f = readfile(filename)
call map(f, 'iconv(v:val, enc, &encoding)')
echo f
```

結果

```
['あ']
```

文字エンコーディングが変換されて**['あ']**と表示されました。


## 外部プログラムで文字エンコーディングを取得してから変換する

外部プログラムでファイルの文字エンコーディングを調べてから変換する方法です。
サンプルではPHPを使って文字エンコーディングを取得しています。
このサンプルを動かすにはPHPが利用できる環境が必要です。


Vim起動

    vim -Nu NONE -S sample2.vim

サンプルスクリプト

```vim:sample2.vim
let filename = 'cp932.txt'
let phpcmd = "php -r " .
            \ "\"mb_detect_order('UTF-8,eucJP-win,SJIS-win');" .
            \ "echo mb_detect_encoding(" .
            \ "file_get_contents('" . filename . "'));\""
let enc = system(phpcmd)
let f = readfile(filename)
call map(f, 'iconv(v:val, enc, &encoding)')
echo f
```

文字エンコーディングが変換されて**['あ']**と表示されました。

## その他

iconv()の第二引数に渡せる文字エンコーディング名については、Linuxではターミナルで**iconv -l**を実行すると確認できます。

今回は試してませんが拡張インターフェース(if_pyth、if_rubyなど)を使って文字エンコーディングを取得することも出来ると思います。
【論文シリーズ】強化学習と深層学習を組み合わせる

## 原文 
[強化学習における自己符号化器付き深層ニューラルネットワーク(Deep Auto-Encoder Neural Networks in Reinforcement Learning)](http://goo.gl/Ck4oSS)
Sascha Lange and Martin Riedmiller (2010)





## 1. 要約
* (メモリ基盤の)バッチ強化学習(Reinforcement Learning; RL)アルゴリズムを考案した。これにより、自己符号化器でDNN (Deep Neural Network)を学習し、特徴空間を創出することができる。
* メインの機械学習アルゴリズムは、MLP(Multi Layer Perceptions) 、いわゆる多層自己符号化器を使う。


## 2. 背景
強化学習は、次の2ステップからなる。
①入力データから特徴を抽出する
②特徴空間から、教義(Policy)を学び、行動に落としこむ
これまで、①は人の手で行われてきたが、Deep Learningが取って代わるように期待されている。


## 3. 骨子の理論
全体の分析構図を以下に示す。
ポイントは、DLで取得した特徴空間を、従来のRLの学習アルゴリズム(Fitted Q-Iteration)に組み込む点である。
強化学習の基礎は、他書に譲るが、エージェント(学習する主体)は、Q値(関数)を貪欲法(Greedy method)という計算規則で算出し、その値に基いて、行動規範(Policy)を決定する。

![151125112601_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/4eb897f7-2621-f217-ac7d-356c84f40059.jpeg)


![151125112601_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/32cd1285-6778-fa62-cf78-4c610dd3bbe3.jpeg)




## 3. モデル適用例
6*6=36ピクセルの画像を用意し、アルゴリズムのもとで事前学習(特徴抽出)。
400エポックで、分類が完成した。

![151125112601_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/e568190d-0b0c-3d99-a177-f5c2ac50ab7d.jpeg)

上図の分類は、自己符号化器の文脈で行われている。入力データの再構成時の元データとの誤差について、その他の手法と比較した。

![151125112601_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/84dc0902-b83d-4b32-1944-e2a3bdec5075.jpeg)

主成分分析に比べて、誤差が拮抗している点もある。
だが、マニュアルの特徴抽出が可能な点で、この手法の優位性が立つ。
最後に、学習させたパターンに基づき、エージェントに行動させた時の報酬(Reward)関数の結果を示す(これは強化学習の文脈)。
300回あたりで、極大に近づき、600エピソード経過したところで、ほぼ最大報酬に収束した。

![151125112601_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/df149f56-fd2d-3f2f-bce0-4d68d0fbcdf2.jpeg)
【論文シリーズ】Dist Beliefの仕組み

## 原文
[大規模分散深層ネットワーク(Large Scale Distributed Deep Networks)](http://goo.gl/YoD1p3)
Jeffrey Dean, Greg S. Corrado, Rajat Monga, Kai Chen (2012)

## 1. 要約
Googleが開発した**Dist Belief**に関する論文である。
並列処理によるDeep Learning計算の高速化を理解する上でも参考になる。



## 2. 骨子の理論
DistBeliefは大規模機械学習装置の機能をもつ。
TensorFlowの前身となるシステムになっている。

以下に、DistBeliefを構成するKey Technologyを整理する。

**①Downpur SGD**
SGDの計算過程を最適化するプログラム。
常に学習係数の最適化を志向する。レプリカが非対称に重みを更新する。
凸性のない、勾配消失問題が起きやすいケースにも対応できる。

![151125022516_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/7107cd7b-07ce-6d7f-fa91-2a6679ceb2f9.jpeg)



**②Sandblaster L-BFGS**
並列処理プログラムであるL-BFGSの発展版。
データの読込みからモデル計算まで、並列計算による高速化を実現する。

![151125022516_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/f537cac1-ef04-3cb7-bf68-52af727b9606.jpeg)



※過去の並列計算プログラムは、Deep Networkの計算に不向きである。
MapReduce→多層ネットワークにおける繰り返し計算に向かない
GraphLab→構造化されたグラフにおいて、計算効率が悪くなる


## 3. モデル適用例
下図は、異なる4つの多層ネットワークをDistBeliefで処理した結果である。
ポイントは、パラメータの多いモデルに対して、並列処理の規模が大きくなるほど、スピード向上の効果が認められることが判明した。
![151125022516_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/092020c3-f71a-fe3c-bb05-6a518d219129.jpeg)


Googleは、DistBeliefの仕組みを使って、10億を超えるノードのNNにおいて、20000超の大規模画像認識の機械学習システムを構築している。
簡単なイベントハンドラを自作してみる

## コンポーネント間で通信を行いたい

勉強がてら、簡単なイベントハンドラを自作しました。
Fluxとか色々流行っているみたいですが、いまいちよくわからず、
「コンポーネント間で、イベントを送受信できればとりあえずいいかな...」というヌルい気持ちで作りました。

https://jsfiddle.net/k0zjqg0q/

```js:
class BasicService {
  constructor() {
    this.listers = [];
  }
  
  on(name, event) {
    this.listers.push({
      name: name,
      event, event
    });  
  }

  emit(name, args) {
    this.listers.forEach((func) => {
      if (name === func.name) {
        func.event.apply(func.event, args);
      }
    });
  }
}
```

実際に使うとこんな感じです。

```js

const mysrv = new BasicService();

mysrv.on('eventSend', (e) => {
	console.log(e);
});

function test() {
	mysrv.emit('eventSend', [this]);
}

test();
```

1. .on()でイベントをlistenし、.emit()でイベントを送信します。
2. 送信したイベントと同名のイベントがlistenされていれば、on()の第二引数に指定した関数を実行します。
3. emit()の第二引数で、onのコールバック関数の引数を指定できます。

小さいwebサービスくらいであれば、これくらいで事足りるんじゃないかな。。とか考えるんですが、(あとはonceとdeleteを追加するくらいかな)ダメでしょうか。どうでしょうか。
試してみたいと思います。
【論文シリーズ】DropConnectという手法について

# 原文
[DropConnectを用いたニューラルネットワークの正則化(Regularization of Neural Networks using DropConnect)](http://goo.gl/1GlgKf)
Li Wan (2013)



## 1. 要約
* DropConnectは、Dropoutを一般化した手法のことである。
* Dropoutは、設定した割合に応じて、ランダムにユニットを選択し、そのユニットの重みを「ゼロ」にする。
* DropConnectは、上記の「ゼロ」を任意の重みに設定できる。さらに言うと、中間層の線形結合の「結合」に注目し、設定した割合に応じて、ランダムに「結合」を取り上げる。そして、結合に重みをかけて、活性化関数にかける。


## 2. 骨子の理論
DropConnectのモデルを式に落としこむと次のようになる。；

$$r = a(({\bf M} * {\bf W})v)$$

行列${\bf M}$が、それぞれの結合に対して、指定した重みをかけるか、かけないか決める。
それで処理した線形結合を活性化関数にかけ、アウトプットベクトル**r**に落としこむ。
下の模式図は、CNNにおいて、特徴抽出した後に、DropConnectを適用したきの場合である。

![151124202640_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/0474343e-59a1-7662-c282-a9ec01199404.jpeg)




## 3. モデル適用例
コード例は、下記リンクよりダウンロード
http:///cs.nyu.edu/~wanli/dropc

例によって、MNISTによる画像認識精度を対照テクニックとともに比較した。
128枚をセットにした、ミニバッチ学習を施した。
モメンタムを適用し、定数は0.9。
60000枚のトレーニングから、10000枚分テストした。

![151124202640_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/bc2dbfcd-bb4d-cc47-203e-ad6b2575b35f.jpeg)


Dropテクニックを使わないと、汎化誤差が目立つ。
だが、テクニックを適用すると、隠れ層のユニットが増えても、過学習になりにくいことが、下図より分かる。

![151124202640_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/17b02e00-09f6-55e0-7136-56ed2e23641a.jpeg)
nimのデバッグ

### 概要

2018/09/10 [VSCodeによるNimのデバッグ](https://qiita.com/6in/items/10325115859c93a1d6ba)を追加しました。VSCodeによるステップ実行ができます。

nimでのデバッグ・ステップ実行の手段は今のところ２種類あるようです。

* デバッグオプションを指定して実行
* KDevelopでnimプラグインを利用してデバッグ(おすすめ！！nim-0.14.0でも可能です)

#### デバッグオプションで実行

以下のようなコマンドラインで実行すると、起動時にプロンプトモードとなります。
[Embedded Nim Debugger](http://nim-lang.org/docs/endb.html)
注意：Emedded Nim Debuggerは、もうメンテされていないようで、次のバージョンで使えるかどうかはなんとも言えないようです。

```shell-session
# 実行例
nim c --run --debugger:on ref_basic.nim
```

実行結果

```shell-session
$nim c --run --debugger:on ref_basic.nim
Hint: system [Processing]
Hint: ref_basic [Processing]
Hint: strutils [Processing]
Hint: parseutils [Processing]
ref_basic.nim(14, 7) Warning: 'l' should not be used as an identifier; may look like '1' (one) [SmallLshouldNotBeUsed]
ref_basic.nim(16, 5) Warning: 'l' should not be used as an identifier; may look like '1' (one) [SmallLshouldNotBeUsed]
ref_basic.nim(20, 1) Warning: 'l' should not be used as an identifier; may look like '1' (one) [SmallLshouldNotBeUsed]
ref_basic.nim(22, 8) Warning: 'l' should not be used as an identifier; may look like '1' (one) [SmallLshouldNotBeUsed]
ref_basic.nim(24, 5) Hint: 'i' is declared but not used [XDeclaredButNotUsed]
Hint:  [Link]
Hint: operation successful (12979 lines compiled; 0.306 sec total; 20.209MB; Debug Build) [SuccessX]
*** endb| ref_basic.nim(15) ref_basic ***
*** endb| >>　(<-デバッガが起動して、コマンド待ち状態です)

```

これ以降は、コマンドにてブレークポイントを設定したり、ステップイン・ステップオーバー、ステップアウトなどを実行していきます。

|コマンド  |内容    |
|:--|:--|
| h  | ヘルプを表示  |
| q  | デバッガを終了  |
| s  | ステップイン  |
| n  | ステップオーバー  |
| f  | 現在の行の実行をスキップ  |
| c  | 実行を継続  |
| r  | ブレークポイントか終了まで実行(cと同じかな?)  |
| b  | ブレークポイントを設定<br>例)<br>test.nim の１０行目にブレークポイントを設定<br>b 10 test  |
| toggle | ブレークポイントのON/OFFを設定する<br>例)<br>toggle 10 test |
| i  | ブレークポイントをすべて無視する  |
| breakpoints | ブレークポイント一覧を表示 |
| l  | ローカル変数の値を表示  |
| g  | グローバル変数の値を表示<br>(うまく動きませんでした・・・)   |
| e  | 式の評価を行う<br>(うまく動きませんでした・・・)  |
| stackframe  | コールスタックの表示  |
| bt  | バックトレース(コールスタック)の表示(python風？)  |
| w  | 現在の行位置を表示します  |

ソースコード内にも、プラグマを利用して、ブレークポイントやウォッチポイントを指定出来ます。

#### Kdevelopでのデバッグ

* [こちら](https://github.com/xyz32/KDevelop-template)のGithubにて公開されています。
* [デモ動画](https://vimeo.com/135918228)もあるよ

CentOS7のGnome環境でKDevelopを実行してみましたが、かなり快適です。
当面は、KDevelopでnimの勉強が捗りそうです。

追記: 2016/6/10
nim-0.14.0での動作も確認できました。
【論文シリーズ】人体モーションキャプチャをRBMで学習する

## 原文
[二値隠れ変数を用いた人体動作モデリング(Modeling Human Motion Using Binary Latent Variables)](http://goo.gl/hcwA6k)
GrahamW. Taylor, Geoffrey E. Hinton and Sam Roweis (2006)



## 1. 要約
* 人体の動作のキャプチャをRBMを利用して学習させた。
* 過去のモデルには難があった:

　　　　- **線形動的システム**: 線形である以上、非線形の複雑な動作(例：筋肉の動き)をモデリングできない。
　　　　- **隠れマルコフモデル**: 単層かつ多項式形式でしか、系列伝播できない。さらに、指数関数的に隠しユニットが増大するため、実用性がない。


## 2. 骨子の理論
可視ユニットは、2値(0/1のような符号値)ではなく、ノイズ入り連続実数を使う。
そのもとで、可視および隠しユニットのパラメータの分布は、ボルツマン分布に従う。
$$-\log p({\bf v}, {\bf h}) = \sum_i \frac{(v_i - c_i)^2}{2\sigma_i^2} - \sum_jb_jh_j - \sum_{i,j}\frac{v_i}{\sigma_i}h_jw_{ij} + const.$$

系列RBMモデルは、下図のようになる。
![151124135655_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/8e8efc9f-c234-286e-2928-3e51c2401907.jpeg)

すなわち、過去のステップにおける可視ユニットのうち、直近$q$ステップを本ステップの可視ユニットに、隠しユニットそれぞれに繋げるようなモデルである。
過去データの接合に伴い、可視ユニットと隠しユニットのバイアスの更新量はそれぞれ次のようになる；
$$ \Delta a_{ki}^{t-q} \propto v_{k}^{t-q}(v_{i}^{t}- 〈v_i^t〉_{recon})$$

$$ \Delta b_{ij}^{t-q} \propto v_{i}^{t-q}(〈v_{i}^{t}〉data  - 〈h_j^t〉_{recon})$$

タイトルの通り、隠しユニットは2値変数で構成する。



## 3. モデル適用例
フレームレートは共通で30、ソースは異なる2つの動画サンプルを用意。
一方の次元は62、他方は49である。
系列が自動回帰でつながっており、白色化と、主成分分析による次元低減は施していない。
新しい可視ユニットのサンプリングは、ギブスサンプリングではなく、系列的に取得している。
2813フレームを利用して歩行と走行の動きを学習させた。下図に結果を図示する。

![151124135656_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/cbb0dd78-f43a-847d-af37-0893afb58753.jpeg)

(上図が歩行、下図が走行の、学習による再現)
学習によって、欠損したフレームを補う動きが会得された。(dropout様効果)
これは、単純に欠損フレームを内挿するより、自然さの増した動きになった。
Railsのアソシエーションされたモデルを使ってランキングシステムを作る

私的メモ

Noteに関連付けされているLikeがあり、Like数が多いノートをランキング表示する。

#モデル

User
Note
Like: belongs_to :user　note_id:integer

likeテーブルには、note_idカラムとuser_idカラムがあります

likeをすると、note_idとuser_idをデータベースに記録する

```ruby:likes_controller.rb
like = current_user.likes.build(note_id: note.id)
like.save
```

#コントローラー

```ruby:notes_controller.rb
def rank
  @rank = Note.find(Like.group(:note_id).order('count(note_id) desc').limit(5).pluck(:note_id))
end
```

とする。
中身は

```ruby:notes_controller.rb

group(:note_id)#で、ノートの番号が同じものにグループを分ける
order('count(note_id) desc')#で、番号の多い順に並び替える
limit(5)#で、表示する最大数を指定して
pluck(:note_id)#で:note_idカラムのみを取り出すように指定。


Note.find(integer)#最終的に、取り出される数値オブジェクトをノートのIDとすることで表示される
```

#ヴュー

あとは、`@rank`をeachで表示させるだけ。

```ruby:rank.html.erb
<% @rank.each do |rank| %>
  <%= rank.title %>
<% end %>
```

TIPS:
もし、第１位！とか表示させたいときは、`with_index(1)`を使うと便利
```ruby:rank.html.erb
<% @rank.each.with_index(1) do |rank, i| %>
  <%= "第#{i}位" %>
  <%= rank.title %>
<% end %>
```
`rails console`で、各実行の開始・終了時刻を自動で表示する方法


## スクリーンショット / Screenshot
![実行開始と終了をフックして時刻を表示します](https://qiita-image-store.s3.amazonaws.com/0/6368/e8703f13-81e7-86ca-0b39-763111673011.png "実行開始と終了をフックして時刻を表示します")

## 必要なもの / requirements
- [Pry gem](https://github.com/pry/pry#readme)

Railsで利用するにはGemfileに以下を追記して`bundle install`

```ruby:Gemfile
gem "pry"
gem "pry-rails"
```

## コード / code
`~/.pryrc`（Pryの環境設定ファイル）に以下を記載。
プロジェクト毎に設定する場合は、プロジェクトディレクトリに置いてもOK

```ruby:~/.pryrc
Pry.config.color = true
Pry.hooks.add_hook(:before_eval, "display_start_time"){|code| puts "\001\e[0;90m\002Start:  #{Time.now}\001\e[0m\002" }
Pry.hooks.add_hook(:after_eval, "display_finish_time"){|result| puts "\001\e[0;90m\002Finish: #{Time.now}\001\e[0m\002" }
```

ちなみに、ここでの`\001\e`といった文字はエスケープシーケンスで、出力する時刻の文字色を指定しています。

他の色を使用する場合は[ターミナルで使える色一覧（8色ANSIエスケープシーケンス） - Qiita](http://qiita.com/hidai@github/items/1704bf2926ab8b157a4f)を参照してください。

## 環境情報 / environments

```linux:pry_gem
% gem list pry
*** LOCAL GEMS ***
pry (0.10.3)
```

```linux:ruby
% ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
```
運用でよく使うDocker関係コマンド

Dockerをテスト・運用していてよく使うコマンド
※随時更新します

# docker
使われていないDockerイメージを一括削除
```
$ docker rmi $(grep -xvf <(docker ps -a --format '{{.Image}}') <(docker images | tail -n +2 | grep -v '<none>' | awk '{ print $1":"$2 }'))
```

使われていないdocker volumeを一括削除
```
$ wget https://raw.githubusercontent.com/chadoe/docker-cleanup-volumes/master/docker-cleanup-volumes.sh && sudo bash docker-cleanup-volumes.sh
```

# docker swarm
swarm関係以外のコンテナを一括削除
```
$ docker rm -f $(docker ps -a | grep -v swarm | grep -v NAME | awk '{print $NF}')
```
# docker machine
swarm master以外のホストを全削除
```
$ docker-machine rm $(docker-machine ls | grep -v master | grep -v NAME | awk '{print $1}')
```
リモートホストでコマンド実行
```
$ docker-machine ssh <hostname> <cmd>
(Ex) docker-machine ssh remote-host sudo cat /var/log/upstart/docker.log
```
リモートホストでスクリプト実行
```
$ docker-machine scp <script_name> <hostname>:~ && docker-machine ssh <hostname> sudo bash <script_name>
(Ex) docker-machine scp test.sh remote-host:~ && docker-machine ssh remote-host sudo bash test.sh
```
Rspec APIのspecを見やすくする"shared_context"

社内でよくRailsでAPIを書くことが多く、そのテストをするときによく使うAPI用の`shared_context`を紹介します。

## ApiHepers
以下が`shared_context`本体となります。
`spec/support/api_helpers.rb`として作成します。

```rb:spec/support/api_helpers.rb
module ApiHelpers
  shared_context 'api helper', type: :api do
    subject { call_api }

    let(:path) { nil }
    let(:method) { nil }
    let(:body) { nil }
    let(:header) { nil }
    let(:default_header) do
      {
        'Content-Type' => 'application/json'
      }
    end

    let(:call_api) do
      before_call_api if respond_to?(:before_call_api)

      body_json = body ? body.to_json : nil
      merged_header = default_header.merge(header.to_h)
      send(method.to_s.downcase, path, body_json, merged_header)

      after_call_api if respond_to?(:after_call_api)
    end
  end
end
```

そして、`rails_helper`に以下を記載し、作成したmoduleを読み込ませるます。

```rb:spec/rails_helpers.rb

# supportが読み込みがコメントアウトされてないか確認
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 

RSpec.configure do |config|

  # 追加するmodule
  config.include ApiHelpers
end
```

## 解説

APIの呼び出しの根幹部分はこちらの、`call_api`になっています。
処理の仕組みは簡単で、`method`に指定した文字列を小文字化 => シンボルに変えて、requestのspecのメソッドとして呼び出しています。

```rb
    let(:call_api) do
      before_call_api if respond_to?(:before_call_api)

      body_json = body ? body.to_json : nil
      send(method.to_s.downcase.to_sym, path, body_json, default_header.merge(header.to_h))

      after_call_api if respond_to?(:after_call_api)
    end
```

そしてこの`call_api`は、基本`subject`を呼ぶことで呼ばれるようになっています。

```rb
    subject { call_api }
```

また、PUTやPATCHのようにAPIを読んだ後に特定のオブジェクトを更新したい場合のために、`after_call_api`というメソッドを`call_api`の後で呼び出すようにしています。

## 使用例

```rb
RSpec.describe API::V1::Sessions do
  describe 'POST /api/v1/sign_in', type: :api do
    let(:path) { '/api/v1/sign_in' }
    let(:method) { 'POST' }
    let(:body) do
      {
        email: 'hoge@example.com',
        password: 'password'
      }
    end
    
    let(:after_call_api) { user.reload }

    let(:user) do
      user = FactoryGirl.create(:user, email: 'hoge@example.com')
      user.set_password_with_encrypt('password')
      user.save
      user
    end


    it do
      subject
      expect(response.status).to eq(201)

      json = JSON.parse(response.body)
      expect(json[:id]).to eq(user.id)
      expect(json[:access_token]).to eq(user.session.access_token)
    end

    it { expect { subject }.to change(Session, :count).by(1) }
end
```

重要な部分としては、

```rb
describe 'POST /api/v1/sign_in', type: :api do
```
の部分。
ここの`type: :api`を指定することでAPIの`shared_context`を呼び出しています。
OSX ServerのApacheでユーザディレクトリ（/~hoge）を有効化

OSX ServerでServer.appをアップデートすると、Apache2のhttpd.confがサクっと上書きされて、手書きで入れてた設定が消えてしまい、どこになに書いてるかわからなくなりがち。
今回は、/~hogeでアクセスするユーザディレクトリを有効化する設定が消えてしまい難儀したので覚え書き。
やることはググればいくらでも出てくる。コメントアウトされた

~~~
LoadModule userdir_module libexec/apache2/mod_userdir.so
~~~
や

~~~
Include /private/etc/apache2/extra/httpd-userdir.conf
~~~
の有効化と、ユーザディレクトリ内に`Sites`フォルダを作成すること。
しかい設定ファイルの場所が問題。
OSXでは/etc/apache2/や/private/etc/apache2/にhttpd.confがあるけど、これを書き換えても反映されない。
正解は、
`/Library/Server/Web/Config/apache2/httpd_server_app.conf`
でした。また上書き前のファイルは、
`/Library/Server/Web/Config/apache2.previous/`
にフォルダごと残ってた。
サイトを複数作ってる場合は、その下の`sites/`に個別のインクルードファイルがあるので、そっちを書き換えた方がいいかも。
どこかに、Server.app上書きやOSアップデートでも上書きされず、かつデフォルトでインクルードされるファイルもあるのかも知れないですが、よくわかりません。ご存じの方がいたら教えていただきたく。

そして、上記に指定した通り、
`/private/etc/apache2/extra/httpd-userdir.conf`
にユーザ共通の設定がありますが、さらにここから
`/private/etc/apache2/users/*.conf`
がインクルードされていて、ユーザ毎にAllowOverrideしたりするのはこっちでやるのがいいみたい。

ついでの参考にデフォルトのドキュメントルートは、
`/Library/Server/Web/Data/Site/`
ですね。サイト毎の親フォルダがこの下にできてるはず。

やっぱ自宅サーバー減らしたくて集約してみてるけど、やっぱLinuxの方が情報も多いし慣れてて手早いなぁ。VMWare FusionでCentOSサーバーでも立てるか、流行のDockerに手を出すべきか...
CakePHP3のEntityのaccessibleでハマった話

# CakePHP3のEntityのaccessibleでハマった話

CakePHP3にはEntityに`$_accessible`プロパティというものがあります。
http://book.cakephp.org/3.0/ja/orm/entities.html#mass-assignment

↓Bakeするとよく見るコレです。

```
    protected $_accessible = [
        'id' => false,
        '*' => true,
    ];

```

この状態だとidは変更不可、それ以外は変更可ということになり、Save時のEntityのプロパティに値をセットしたとしても保存されません。
これを利用して、今回ある項目はinputフォームにはreadonlyを付けてPOSTされるけど保存されない、というような実装を行いました。

という前提を元に今回ハマった点について話します。

## ハマった問題

リレーションを貼った先のEntityに想定したaccessible設定しているのに保存されない！

## 構成

### テーブル関係

企業情報テーブルとそれに紐づく口座情報を格納する2つのテーブルがあり、hasmanyでリレーションが貼られています。

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/25290/19e9d46f-56f4-7c31-6d7f-d0103f847a34.png)

### コード

企業情報は全て編集不可であるため全ての項目をfalseにしています。

```
class Company extends Entity
{
    protected $_accessible = [
        '*' => false,
    ];
}
```

口座情報は全て編集可であるため全ての項目をid以外trueにしています。

```
class Bank extends Entity
{
    protected $_accessible = [
        '*' => true,
        'id' => false,
    ];
}
```


### 画面

同画面で企業と口座情報を同時に編集している。

## 結論

こう書かないといけなかった

```
class Company extends Entity
{
    protected $_accessible = [
        '*' => false,
        'bank' => true,　<-リレーション先をココに書く
    ];
}
```

## どういうことか

POSTされるデータ構造でaccessible指定をしないといけないということでした。
リレーション構造をみて、CakePHPが良きに計らってくれるようなことはありません。


## まとめ

accessibleをうまく使うことでsave時のプロパティから削除するような記述が不要になるかと思います。
Entityを見れば、保存されるのか、されないのか、が一発で分かるかと思うので使ってみると良いかもです。

※guradオプションをfalseにした場合はこの限りではないですが...
http://book.cakephp.org/3.0/ja/orm/entities.html#id9
【Java】巨大なテキストファイルを生成するメソッド

パフォーマンスを測るとき、巨大なテキストファイルが欲しいときがある。そんなわけで、1行100文字の100万行からなるテキストファイル（約100MB）を生成するメソッドを作った。

```java
// インポート宣言
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
import org.apache.commons.lang3.RandomStringUtils;

// メソッド定義
public static void createHugeFile(final String path) throws IOException {
    Iterable<String> lines = () -> Stream
        .generate(() -> RandomStringUtils.randomAlphanumeric(100))
        .limit(1000000).iterator();
    Files.write(Paths.get(path), lines);
}
```

`RandomStringUtils.randomAlphanumeric()`を使用するには、org.apache.commons.lang3_X.X.X.vXXXXXXXXXXXX.jarをビルドパスに追加する必要がある。このJARファイルは、Eclipseのpluginsフォルダにあった。
DHCP再取得

#概要

クソ投稿量産しすぎ・・・。
YAMAHAルータが何故かRaspberry Piに固定IPを振れなかったメモ。

#解決方法

```bash
dhclient -r eth0
dhclient eth0
```

#OS起動時にも上記同様のことを

```bash:/etc/network/interfaces
auto eth0
iface eth0 inet dhcp
```

##メモ

YAMAHAルータを再起動してもダメ、Raspberry Piの持つDHCP側の開放が必要。
OS起動時は
サクラエディタの覚え書き


# はじめに

サクラエディタは現場の業務でしか使用しません。
Macでも動作する方法があるらしいですが試してません。
Atomで使用したいコマンドの棚卸でもあります。

2017年時点なので、最新ではコマンドが変わったものなどがあるかもしれません。
環境はWindowsです。

# サクラエディタについて

https://sakura-editor.github.io/

2020年に Ver.2.4.1 がリリースされており、
最新版はWindows10のみサポートされている。

# コマンド一覧

| アクション | コマンド | 
|:---------------------|-----------------:|
| 全て選択             | Ctrl + A         | 
| コピー             | Ctrl + C         | 
| 検索             | Ctrl + F         | 
| Grep             | Ctrl + G         | 
| 指定行へジャンプ             | Ctrl + J        | 
| 新規作成             | Ctrl + N         | 
| 印刷                  | Ctrl + P         | 
| 置換             | Ctrl + R         | 
| 上書き保存             | Ctrl + S         | 
| 貼り付け             | Ctrl + V         | 
| 切り取り             | Ctrl + X         | 
| やり直し               | Ctrl + Y         | 
| 元に戻す               | Ctrl + Z         | 
| ファイル内容比較               | Ctrl + Enter         | 
| 選択行の昇順ソート　　　　| Alt + A          |
| 左(先頭)の空白を削除　　　　| Alt + L          |
| 選択行のマージ          | Alt + M          | 
| 折り返さない          | Ctrl + Alt + X          | 

# 置換による挿入

・先頭に単語を挿入
>置換前；「＾」
>置換後；「（挿入したい文字列）」

・末尾に単語を挿入
>置換前；「$」
>置換後；「（挿入したい文字列）」

# データの重複を除去する
>選択行の昇順ソート
>選択行のマージ 

# 日付形式を正規表現で検索

>¥d{4}/¥d{2}/¥d{2}
>¥d{4}-¥d{2}-¥d{2}
>[A-Z][a-z]{2}. ¥d{1,2} ¥d{4}
wxPythonでオセロをつくろう

# はじめに
プログラミングをしたいけれど何をつくったらいいか分からないという方は、簡単なゲームをつくることからはじめてはいかかでしょうか。
今回は簡単にマルチプラットフォームのGUIアプリを作成できるwxPythonを使用してオセロをつくってみます。
この記事に触発されてマインスイーパや五目並べなど、つくっていただければと思います。
ソースは[GitHub](https://github.com/kanlkan/reversi-py/tree/master)に上げてありますので、そちらから取得してください。
**2016/6/10 : バグ修正しました。masterブランチの最新版を取得してください**

## wxPythonのインストール
LinuxMint, Ubuntu, Debianの方

```
$sudo apt-get install python-wxgtk2.8
```

Windowsの方

 + python2.7.11のインストール
[こちらのpython.org](https://www.python.org/downloads/release/python-2711/)からバイナリをダウンロードしてpython2.7.11をインストールします。32bit/64bitは環境に合わせて選んでください。

 + wxPythonのインストール
その後、[こちらのwxpython.org](http://www.wxpython.org/download.php#msw)からpython2.7用のバイナリをダウンロードしてインストールします。32bit/64bitは先にインストールしたpython2.7.11と合わせてください。

## 動作確認環境
 + LinuxMint17.3 (python2.7.6 + wxpython3.0.3)
 + Windows10 (python2.7.11 + wxpython3.0.2)

wxpythonは2.8でも動作すると思います。
Windows10では遊ぶことは可能ですが、BoxSizerの動作がおかしいのか、表示が崩れます。。。

## 遊び方
![screen_shot.png](https://qiita-image-store.s3.amazonaws.com/0/127380/f6700001-61be-e858-102c-577001c0bf86.png)
Game modeを選んでSTARTを押してプレイします。先攻が必ず黒です。

 + Man vs Computer : 人が先攻
 + Computer vs Man : コンピュータが先攻

マウスの左クリックで石を置きます。
マウスの中ボタンクリックはデバッグ用なので使用しないでください。

# 補足
ソースコードは解説するより[実物](https://github.com/kanlkan/reversi-py/tree/master)を見ていただいたほうが分かるかもしれませんが、ひとつだけ。
自分でコンピュータのAIを作成しようと思う方は以下の場所にインプリしてください。現状、インプリ時に使用できるのは「石を置ける場所のリスト(pos_list)」、「その場所に石を置いた際に取れる石の数のリスト(gain_list)」です。
現在のAIはAIと呼ぶのもおこがましいもので、石を置ける場所で最初に見つかった場所に置く、としています。

```py
    def decideComputerNext(self, pos_list, gain_list):
        print ("pos_list :" + str(pos_list))
        print ("gain_list:" + str(gain_list))
        
        # Insert a computer's AI here
        next_pos = pos_list[0]
        
        return next_pos
```

ぜひ自分で強いAIを作成して、友人と戦ってみてください。
一人が Man vs Computer, もう一人が Computer vs Manを使用すれば、それぞれのコンピュータAI同士で勝負できます。
(相手の手をManの手としてそれぞれ入力していく)

ちなみに、なぜComputer vs ComputerというGame modeがあるのか、と疑問を持つ方もいると思いますが、あまり気にしないでください。
とりあえず自分のAI同士の戦いが実現できます。

# 参考
[Python-izm](http://www.python-izm.com/contents/gui/wxpython.shtml)