OmniAICreator/Qiita-1.07M huggingface dataset:
【Android】Ankoでアラートダイアログを作る

AndroidのUI構築用DSLライブラリの「Anko」でアラートダイアログ（Alert Dialog）を簡単に作れるので紹介です。

## 環境
- kotlinバージョン: 1.1.3-2
- ankoバージョン: 0.10.1

## 準備
gradleに以下を追記

```
dependencies {
    compile "org.jetbrains.anko:anko:$anko_version"
}
```

## 標準のダイアログ

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/123122/adb760fa-6807-20ed-06c7-cf911fb4d66a.png)

```kotlin
alert("Message") {
    title = "Title"
    yesButton {}
    noButton {}
}.show()
```

## ボタンをカスタマイズしたダイアログ
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/123122/57f48d5a-3eaa-04be-953c-57c459b9a6a5.png)

```kotlin
alert("Message") {
    title = "Title"
    positiveButton("Positive") {}
    negativeButton("Negative") {}
    neutralPressed("Neutral", {toast("Foo")})
}.show()
```

↑みたいにトーストも簡単にできる。


## CustomViewを含んだダイアログ

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/123122/e4774481-f056-67d2-040f-d834610005eb.png)

```kotlin
alert("Message") {
    title = "Title"
    yesButton {}
    noButton {}
    customView {
        linearLayout {
            padding = dip(16)
            textView("Input: ")
            editText {
                hint = "Hint text"
            }.lparams(width = matchParent)
        }
    }
}.show()
```


## 参考
Anko Commons – Dialogs · Kotlin/anko Wiki
https://github.com/Kotlin/anko/wiki/Anko-Commons-%E2%80%93-Dialogs
Raspberry Pi 3 で赤外線リモコン&温度センサーを試す

# Raspberry Pi 3 で赤外線リモコン&温度センサーを試す
## はじめに
RaspberryPi 3を使って室温を計測し、一定の温度になったらエアコンをON/OFFするという仕組みをつくりたくて、手軽に試せるirMagicianを使ってみました。


## 準備する物
 - [アイ・オー・データ機器 UD-RP3BP Raspberry Pi メインボード（Bluetooth、Wi-Fi対応モデル） Raspberry Pi 3 Model B+](https://www.amazon.co.jp/dp/B07SDFCDYQ/)
 - [irMagician 温度センサー付完成品](http://www.rt-shop.jp/index.php?main_page=product_info&cPath=42&products_id=2837)
 - スマホの充電などに使用する[USBケーブル] (https://www.amazon.co.jp/gp/product/B003UIRIFO) (データ転送非対応だと使えないかもしれない)
 - エアコン、テレビ、室内照明などのリモコンと照射先の機器

## 前提条件
 - [RaspberryPi 3 model B に CentOS7をインストール](http://qiita.com/revsystem/items/9989a18116e554c133b6) のセットアップが完了していることとします。

## 参考情報
 - https://itdecoboconikki.com/2017/05/01/raspberry-pi-irmagician/
 - http://www.omiya-giken.com/?page_id=889
 - https://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/
 - http://netbuffalo.doorblog.jp/archives/4930959.html

## irMagicianセットアップ
irMagicianをRaspberryPi 3 に USB ケーブルで接続します。
デバイスドライバのインストールなど不要で、挿すのみで認識します。

黄色LEDが点滅すれば認識されています。
/dev 以下に ttyACM0 が存在することでも確認できます。

```shell-session
# ls -l /dev/ttyACM0
```

もし、認識しない場合は、USBケーブルを挿し直してみましょう。

### 制御プログラム
制御プログラムを動かすために、python-pipとpyserialをインストールします。

```shell-session
# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
# python get-pip.py
# pip install pyserial
```
制御プログラムを取得するために、gitをインストールします。

```shell-session
# yum install git -y
```
制御プログラムを git clone で取得します。

```shell-session
$ git clone https://github.com/netbuffalo/irmcli.git
```
制御プログラムのディレクトリに移動します。

```shell-session
$ cd irmcli
```

### 赤外線センサーの学習
コマンドを実行します。
ここでは、室内照明のリモコンで点灯ボタンを押した場合の例を記載します。

`Capturing IR...` と出力されたら、センサー部に向けてリモコンの点灯ボタンを押します。
学習すると`... 134`や`...132`などと出力されます。
失敗した場合やタイムアウトした場合は別のコードが出力されるので、再度コマンドを実行します。

```shell-session
$ sudo python irmcli.py -c
Capturing IR...
... 134
```

学習した赤外線データをJSONファイルに出力します。

```shell-session
$ sudo python irmcli.py -s -f light_on.json
Saving IR data to light_on.json ...
Done !
```
学習した赤外線データを、室内照明に発信します。
点灯すれば成功です。

```shell-session
$ sudo python irmcli.py -p -f light_on.json
Playing IR with light_on.json ...
... Done !
```

同様に、消灯や明るさ変更などのボタン操作を学習させ、それぞれのJSONファイルに保存することで、cron やプログラムからの呼び出しで様々な機器を操作することが可能です。
エアコンのON/OFF、テレビのON/OFFやチャンネル切替ができました。

試したところ、3,4m 程度離れた機器に赤外線データを発信できました。

### 温度センサー
コマンドを実行します。
irMagician の温度センサーが基板に接しているため、おそらく基板の熱の影響で気温は測れないようです。
周囲の温度と +10℃ 程度の誤差が生じます。
温度にあわせてエアコンを調整できないかと考えていたのでちょっと残念。

```shell-session
$ sudo python irmcli.py -t
Temperature: 39.3
```

### irMagician コマンドパラメータ

```shell-session
$ sudo python irmcli.py -h
usage: irmcli.py [-h] [-c] [-p] [-s] [-f FILE] [-t] [-v]

irMagician CLI utility.

optional arguments:
  -h, --help            show this help message and exit
  -c, --capture         capture IR data
  -p, --play            play IR data
  -s, --save            save IR data
  -f FILE, --file FILE  IR data file (json)
  -t, --temperature     measure ambient irMagicianT temperature in degrees
                        Celsius
  -v, --version         show firmware version
```
Unity Androidの実機確認を行おうとしたら「usbデバイスが認識されません」といわれた話

Unityでアプリを作る際、必ずAndroidで実機確認を行っている。

新しいPCに変えたので、新しい環境でUnity + Android実機確認を行おうとした。

ところが、Android端末をPCにUSBで接続したところ
**usbデバイスが認識されません**
**このコンピューターに接続されているUSBデバイスの１つが正しく機能しないため、Windowsによって認識されません**
とWindowsタクスバーに表示されてしまった。

私は新しいPCに変えたせいで
-Unity
-AndroidSDK(Google USB Driver)
-スマホ向けのUSB Driver
-スマホ端末(USB設定)
の設定のどこかに不備があるのあだろうと思っていた。

しかし結論から言うと**スマホ端末のUSB端子が壊れていた(充電は出来るがデータ通信は出来ない状態になっていた)**

スマホのmini USB端子を背面側から前面側へ物理的に押すと正しくUSBで認識された。

というわけで、同じ症状に合った人はまず「スマホ」または「USBケーブル」を疑ってみて欲しい。

UnityやAndroidSDKを疑いたくなるが、まずは端末それ自体をPC側で認識できるかどうかを見ておくのが良いと思う。

私は先にソフトウェアを疑ったせいで、数時間を無駄にした。
このエラーメッセージが出る場合は、ハードウェアを疑ったほうが良いと思う。
【メモ】PHPで二つの配列を重複無しでマージする。

開発していて２つの配列をマージしようとしたら重複がいくつかあったので重複を避ける様にマージする方法をメモ。
（他に良いやり方あったらご意見下さい><）

###１、２つ配列をマージ
とりあえず、```$array_1```,```$array_2```という二つの重複する値がある配列があるとします。

```php
$array = array_merge($array_1,$array_2);
```
※```array_merge()``` -> 二つの配列をマージ

###2、重複を削除

```php
$array = array_unique($array);
```
※```array_unique()``` -> 配列から重複した値を削除

###3、空文字等不要な要素（あれば）を削除

```php
$array = array_diff($array,array('','不要'));
```
※```array_diff() -> 第１引数と第２引数以降を比較して、第１引数にしか無い値の配列を返す（indexはそのまま）

###4、削除した分を詰める
indexを振り直します

```php
$results = array_values($array);
```

※```array_values()``` -> 配列 array から全ての値を取り出し、数値添字をつけた配列を返す

これで二つの配列をちゃんとマージ出来ます。

順番を意識する場合は、3の後に```sort()```でソートします。

以上。
これってできるの？@python辞書

稚拙な文でありますが、疑問を書かせていただきます。

Python3を勉強中で某学習サイトを使っていますが、
その中で辞書のvalueの中にまたkeyとvalueのセットを作ることができるような記述がありました。

具体例では、

dic = {'key1': {'key2': 1}}

というように使われており、
仮にkey2のvalueである1に値を追加する場合には、

dic['key1']['key2'] += 1

というように書かれていました。
辞書については、keyとvalueは一対と学びましたが、このことについては
調べてみてもわかりやすい説明がありませんでした。

もしよろしければ、どなたかこのことについて教えてくれませんか？
よろしくお願い致します。
LaTeXからkindle本を作る

#はじめに
これまでLaTeXで書いた資料をPDFにして配布したりしていたのですが、わけあってkindle本にすることになったので、調べてやってみたメモです。

# 参考記事
半ばあきらめていたところで、以下の記事により復活しました。感謝いたします。

* [Kindle Direct Publishingで教科書（理系書籍）を電子出版してみた　その２](http://aquarius10.cse.kyutech.ac.jp/~otabe/kindle2/)

# 準備
参考記事の内容と重複しますが、必要となるツールのインストール記録です。

* [TeXインストーラ 3](http://www.math.sci.hokudai.ac.jp/~abenori/soft/abtexinst.html)

LaTeXからkindle本を作るために、htmlに変換するのですが、そのためにはやはりTeXシステム一式が必要となります。インストールの仕方は色々なサイトで紹介されているので省略します。すでにインストールしている人は飛ばして結構です。

* helpers4htのインストール

LaTeXからhtmlに変換するtex4htはTeX一式の中に入っていますが、足りないファイルがあるそうなので、[helpers4ht](https://github.com/michal-h21/helpers4ht)をインストールします。

インストールの手順には、

````
cd `kpsewhich -var-value TEXMFHOME`
mkdir -p tex/latex
cd tex/latex
git clone git@github.com:michal-h21/helpers4ht.git
````

とありますが、Windowsの場合、

````
kpsewhich -var-value TEXMFHOME
````

でフォルダを確認した上で、さらにその下に`tex\latex`フォルダを作って、Download ZIPで取ってきたhelpers4ht一式をコピーします。

#LaTeX原稿の修正
tex4htではpLaTeXではなく、LuaLaTeXを使うので、プリアンブルの書き方が若干違います。なので、通常のLaTeX用のtexファイルとは別にkindle作成用のtexファイルを作っておくとよいでしょう。

以下は私がkindle用に修正した点です。TeXの書き方は人それぞれなので、必ずしもこうする必要はありません。

* 漢字コードはutf-8に

* プリアンブルを以下のように修正（jがつくクラスは使えないので注意）

````
\documentclass{book}
\usepackage{alternative4ht}
\altusepackage{fontspec}
\altusepackage{xeCJK}
\altusepackage{xunicode}
\setCJKmainfont{IPAMincho}
````

* インデントしない(zwの単位は使えない)

````
\parindent=0pt
````

* equation環境は使わず、eqnarray環境を使う

* 数式を左寄せにして式番号を付ける

````
\documentclass[fleqn]{book}
\mathindent=45mm
````
数式はpngファイルに変換されるのですが、数式の位置によって表示サイズが変わったりしたので、数式の環境と式の始まりから式番号までの幅を同じにして何とか凌ぎました。

* graphicのスケールをpdf用とkindle用で変える

図のスケールをpdfに合わせておくと、kindleに変換したときにかなり小さくなってしまいます。そこで、図の倍率をpdf用とkindle用で変えられるように`fp`というパッケージを使いました。

````
\usepackage{fp}
````

そして、倍率を表す`mult`という定数を使って、pdf用は、

````
\def\mult{1}
````

kindle用は、

````
\def\mult{3}
````

と変えておきます。そして、図を挿入するところで、

````
def\gscale{0.5}
\FPmul{\gscale}{\gscale}{\mult}
\includegraphics[scale=\gscale]{figure.png}
````

のように`gscale`を`mult`倍して渡すと、kindle用だと3倍の大きさにすることができます。

なお、最後にkindle本にするときに、サブフォルダ上のファイルは認識されないようなでの、図のファイルはサブフォルダに分けないで、texと同じフォルダに入れておきます。

* 数式のサイズ調整

図と同じくpngに変換される数式のサイズが小さいので、
C:\w32tex\share\texmf-dist\tex4ht\base\win32\tex4ht.env を編集します。

````
<dvipng>
G.png
%echo "dbg: got to dvi to png via (dvipng)"
Gdvipng -T tight -D 144 -bg Transparent -pp %%2:%%2 %%1 -o %%3
````
の部分の`-D 144` を `-D 288`に変えてみます。このサイズだと、解像度が低い端末ではかなり大きい数式になりますが、解像度が高い端末だとちょうどよいサイズとなります。

# htmlへ変換

make4htというコマンドを

````
make4ht -l -d dist main.tex
````

のように実行すると、main.texをhtmlに変換します。ここで、オプションの`-l`は、LuaLaTeXを使うことを、`-d`は出力ファイル一式を`dist`というフォルダにコピーすることを意味します。

ここで注意ですが、このコマンドは一時的なファイルを頻繁に作ったり削除したりするので、クラウドと同期したフォルダ上で実行すると、アクセス違反が起こってうまく変換できないことがあります。

#kindle本の作成
変換されたhtmlファイル一式をzipファイルにしてKDP(Kindle Direct Publishing)にアップロードすればkindle本の完成です。

出版前に内容を確認するためには、KDPの「Kindle 本のプレビュー」でダウンロード版プレビューアーのオプション「コンピューター上でプレビュー」を選んで、Mobiファイルをダウンロードします。これをPCやタブレットのKindleフォルダにコピーしてkindleアプリで確認します。

#おわりに
今回わけあってkindle本を作りましたが、LaTeXは普通にPDFファイルにした方が明らかに見た目がきれいです。kindle本は図形（LaTeXの数式も）のサイズが端末の解像度で決まってしまいます。文字のサイズは変えられるのに、図形サイズが変えられないのは残念なところです。今後の改善に期待します。

#ちなみに
上記の方法で作成したkindle本です。

* [ディジタル信号処理のサプリ](http://amzn.to/2w8l680)
* [ディジタルシステム基礎テキスト](http://amzn.to/2iAj0Yx)
elasticsearch kibana 個人記録メモ

### ■出来上がった環境
mac os x el capitain
homebrewにてインストール。
インストールは参考サイトに従ってインストール。ver5.5へのアップデートもbrewによってアップデートしただけ。アップデート前に起動していたElasticsearch, kibanaのプロセスはアップデート前に終了させておいたほうがアップデート後の動作確認で詰まらない。

```
elasticsearch --version
Version: 5.5.1, Build: 19c13d0/2017-07-18T20:44:24.823Z, JVM: 1.8.0_45
plugin -> analysis-kuromoji

python --version
Python 3.6.2(pyenv)

$ which python
/Users/xxxxx/.pyenv/shims/python

kibana --version
5.5.0
```
[kibana]http://localhost:5601/

### ■プログラムイメージ
twitterから情報取得(python)
elasticsearchへぶち込む(python)
ダッシュボードに表示(elasticsearch(+ analysis-kuromoji) + kibana)

### ■やったこと
1. elasticsearchインストール
2. kuromojiのpluginインストール
3. kibanaインストール
4. pyenvでpython versionを3.X系へ変更
5. elasticsearchのGUIからindex name = test_index を作成
6. elasticsearch mapping作成
7. pythonでtwitterからトレンド情報とトレンドツイート数、時刻を取得
8. python elasticsearchに登録
9. kibanaのDiscoveryに取得データが表示される事を確認

--- とりあえずココまで ---

### ■やりたい事
Twitterとインスタから楽しい事をする。
機械学習でTwitterとインスタどちらの投稿か違いを見つけて、それぞれの特徴を見つけて見るのもsampleとしては良い？だれかやってる気がするから調べておく。


### ■参考
##### ●elasticsearch + kibana 環境設定
[ElasticsearchとKibanaを使ってTwitterのトレンドワードを可視化してみた](http://qiita.com/yoppe/items/3e61fd567ae1d4c40a96)
[Elasticsearch+Kibanaでデータ解析](http://qiita.com/windows222/items/acb89451d6744e4361a3)
[elasticsearchの導入](http://qiita.com/ikawaha/items/c654f746cfe76b888a27)
##### ●python 環境設定
[pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](http://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)
##### ●twitter 環境
[twitter doc(ja)](https://syncer.jp/Web/API/Twitter/REST_API/)
[twitter developer](https://dev.twitter.com/)
ionic　iOSアプリをSafariDeveloperToolsでデバック

実機につないで、あれ？思うように動かないときに、
SafariDeveloperToolを使ってデバックします。

## Safari側の設定

- 開発者メニューを表示させます

![詳細.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/800da2b1-2742-d9a8-8de2-91731879d9a4.jpeg)

## iPhone側の設定

- インスペクターを利用可能にします 設定　＞Safari ＞　詳細

<img width="414" alt="IMG_1479.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/32215/3c49fa93-fa5b-f6d1-c39a-b8ecaa38896e.jpeg">

## Safari側の操作


MacBookとiphoneを繋いで、アプリを走らせます
開発者メニューに、繋いでいるiPhoneデバイスが見えるので、それを選択して、アプリを選びます


![ionic-app](https://qiita-image-store.s3.amazonaws.com/0/32215/01a05d66-4047-852b-36bb-07f10e73dff1.jpeg)


デバッガが表示されます

![Webインスペクタ — ashibuya — MyApp — Ionic App-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/89a4f791-c40f-703f-03de-c2b058b010c0.jpeg)
【MySQL】遅いselect文の原因を調査する【explainの読み方】

# ExplainでSQLのボトルネックを調査する
→select文の前に「explain」をつけて実行してみる

```SQL
explain select * from tableName;
```

# 実行結果の読み方
## select_type
### サブクエリの場合
| 値 | 説明 |
|:--|:--|
|PRIMARY|外部のクエリ|
|SUBQUERY|相関関係の**ない**サブクエリ|
|DEPENDENT SUBQUERY|相関関係の**ある**サブクエリ|
|UNCACHEABLE SUBQUERY|実行のたびに結果が変わるかもしれないサブクエリ|
|DERIVERD|from句で使われるサブクエリ|
外部クエリ→サブクエリの順序で実行されるが、DERIVERDのときだけはサブクエリ→外部クエリと実行順所が逆になる。
### UNIONの場合
| 値 | 説明 |
|:--|:--|
|PRIMARY|unionのときに最初にフェッチされるテーブル|
|UNION|２番目以降にフェッチされるテーブル|
|UNION RESULT|UNIONの実行結果|
|DEPENDENT UNION|DEPENDENT SUBQUERYがUNIONになっている場合|
|UNCACHEABLE UNION|UNCACHEABLE SUBQUERYがUNIONになっている場合|
UNOINは先頭から順に処理されていくので、処理順序がわかりやすい・・・はず。

## type
対象のテーブルに対してのアクセス方法。
致命的なものは見れば一発でわかる・・・らしい。

| 値 | 説明 |
|:--|:--|
|ALL|フルスキャンなので一番重い。改善必須:warning:|
|index|フルインデックススキャン。インデックスをALL検索するのでこれまた重い。改善必須:warning:|
|ref|インデックスを使った検索|
|range|インデックスを使った**範囲**検索。|
|eq_ref|joinのときにPKやユニークキーを使う場合。joinのときはこの値になれば最速。|
|const|join以外でPKやユニークキーを使う場合。最速。|

## key
テーブルにアクセスするために使ったindexを示す。
ちなみに、possible_keysは「使える候補」で、実際につかったかどうかはkeyの値を見る。

## key_len
選択されたキーの長さ。
インデックスのキー長が短いほうが高速になるので、迷ったら長さの短いほうにインデックスをつけるといい。

## rows
selectの取得件数の見積もり。
ざっくりとしたものなので、where句次第ではもっと少ない件数が返ってくることもある。

## extra
ほかに使用している条件などがあれば、ここに出力される。

# チューニング方法の例
## type=null かつ key=null の場合
→インデックスが張られてない＆テーブルのフルスキャンが行われている。
where条件で使うカラムにインデックスを張る。
もしくは、インデックスが張られたカラムをwhere条件の中に追加する。

## extra=Using filesort もしくは extra=temporary
→order byに指定しているカラムにインデックスを張る。
Javaだと、Listで取得してCollection.sort()もできるので、Java側にソート処理を入れるものアリかもしれない。
「extra=temporary」はjoinしているときに出現するので、joinしているテーブルのどこかにインデックスを張ればよい。

## インデックスを張ってあるはずなのにtype=all
→複合インデックスが使われてない。
複合インデックスが張ってあるカラムを、すべてwhere条件に使用する。
インデックスと同じ順序でwhere条件を組み立てること！

## possible_keysに出力があるのにkey=nullで使われてない
→MySQLの仕様が原因かもしれないので、SQLそのものを作り変える。
例）インデックスが張ってあるカラムをwhere条件に使用しているのに、テーブル検索が実施されている
MySQLが「インデックス検索よりもテーブル検索が早い」と判断してしまうことがあるようです。
SQLのつくりを変えるなどの、大きな変更が必要になる。
（仕様や設計を見直すことも視野に入れた方がよい）

## その他やってみるといいかもしれない方法
### joinのときにインデックスを使うような記述を追加する
```
SELECT * FROM tableA aa LEFT JOIN tableB bb USE INDEX(index名)
SELECT * FROM tableA aa LEFT JOIN tableB bb FORCE INDEX(index名) /* USEが効かない場合はこちら */
```
OpenAI GymのCopy-v0をQ学習で解く

## 主旨

OpenAI Gym[^1]の課題Copy-v0の解法です．

https://gym.openai.com/envs/Copy-v0

下記記事の続きで，Q学習で解いています．

http://qiita.com/namakemono/items/16f31c207a4f19c5a4df

## 解法

- Q学習

```math
Q(s,a) \leftarrow Q(s,a) + \alpha \left\{ r(s,a,s') + \gamma\max_{a}Q(s',a') - Q(s,a) \right\} \\
r(s,a,s') = \mathbb{E}[R_{t+1} | S_t=s, A_t=a, S_{t+1}=s']
```

- $\epsilon$-greedy法

### Q学習の導出[^2]

```math
\begin{align}
Q(s,a) &= r(s,a)+\gamma \sum_{s' \in S} \max_{a' \in A(s')} p(s'|s,a) Q(s',a') & \\
       &\simeq  r(s,a)+\gamma \max_{a' \in A(s')} Q(s',a') & (\because s' \sim p(s'|s,a), s'以外になる可能性は低いという前提) \\
       &\simeq  (1-\alpha)Q(s,a) + \alpha \left \{ r(s,a)+\gamma \max_{a' \in A(s')} Q(s',a') \right\} & (\because 平滑化) \\
       &=  Q(s,a) + \alpha \left \{ r(s,a)+\gamma \max_{a' \in A(s')} Q(s',a') - Q(s,a)) \right \}  &
\end{align}
```


### コード[^3]

```python
import numpy as np
import gym
from gym import wrappers

def run(alpha=0.3, gamma=0.9):
    Q = {}
    env = gym.make("Copy-v0")
    env = wrappers.Monitor(env, '/tmp/copy-v0-q-learning', force=True)
    Gs = []
    for episode in range(10**6):
        x = env.reset()
        X, A, R = [], [], [] # States, Actions, Rewards
        done = False
        while not done:
            if (np.random.random() < 0.01) or (not x in Q):
                a = env.action_space.sample()
            else:
                a = sorted(Q[x].items(), key=lambda _: -_[1])[0][0]
            X.append(x)
            A.append(a)
            if not x in Q:
                Q[x] = {}
            if not a in Q[x]:
                Q[x][a] = 0
            x, r, done, _ = env.step(a)
            R.append(r)
        T = len(X)
        x, a, r = X[-1], A[-1], R[-1]
        Q[x][a] += alpha * (r - Q[x][a])
        for t in range(T-2, -1, -1):
            x, nx, a, r = X[t], X[t+1], A[t], R[t]
            Q[x][a] += alpha * (r + gamma * np.max(Q[nx].values()) - Q[x][a])
        G = sum(R) # Revenue 
        print "Episode: %d, Revenue: %d" % (episode, G)
        Gs.append(G)
        if np.mean(Gs[-100:]) > 25.0:
            break

if __name__ == "__main__":
    run()
```


### スコア

```
Episode: 30229, Reward: 29
```

## References

[^1]: Brockman, [OpenAI Gym](https://gym.openai.com/), 2016.
[^2]: J.Scholz, [Markov Decision Processes and Reinforcement Learning](https://s3.amazonaws.com/ml-class/notes/MDPIntro.pdf), 2013.
[^3]: namakemono, [OpenAI Gym Benchmark](https://github.com/namakemono/openai-gym-benchmark/blob/master/envs/copy_v0_q_learning.py), 2017.
iOSからHomebridgeが見えないときの対処法

# 環境
- Raspberry Pi 3 Model B
- node 8.3.0
- npm 5.3.0

# 対処法
- `username`を変える
- `.homebridge`にある`persist`ディレクトリを消す

を行ってもiOSのHomeアプリでHomebridgeが検知できない場合，
ラズパイの`/boot/cmdline.txt`に`ipv6.disable=1`を追記して再起動すれば治るかもしれない．

# 例
```
sudo emacs /boot/cmdline.txt
sudo reboot now
homebridge
```

# 参考
https://github.com/nfarina/homebridge/issues/607#issuecomment-236471712
【linuxコマンド】grep


#grepコマンド
指定したファイルの中から指定した文字列を探すコマンド。
検索文字列やファイルは正規表現で書くことができる。


#基本のコマンド
```shell-session
$grep [オプション] [文字列] [ファイル]
```

`test.txt`ファイル中の`a`という文字を探す場合は以下のように書く。

```shell-session
$grep a test.txt
```

#オプション

###-i　
検索文字の大文字小文字を区別しない。

###-f [file]　
検索文字列としてfileの中身を使用する。

###-l
検索条件に一致したファイルを表示する。

###-c
検索条件に一致した行数を表示する。

###-v
検索に一致しなかった行を表示する。
-lvとすると、一致しなかったファイルを表示する。

###-w
検索を文字列全体に対して行う。

###-x
検索を行全体に対して行う。
複雑なC++のソースコードの解析


前提・実現したいこと

githubにあがっている「fts_fuzzy_match」関数をデータ検索に使用したところ、どうしてその結果になるのか疑問があり、ソースコードを見たが、難しくて理解できませんでした。
発生している問題・エラーメッセージ

ソースコードは２００行くらいで短いのですが自分では理解できないのでどのたか理解できる方がいれば教えていただけないでしょうか？
該当のソースコード

ソースコードはこちらです
https://github.com/forrestthewoods/lib_fts/blob/master/code/fts_fuzzy_match.h
作者の解説はこちらです
http://postd.cc/reverse-engineering-sublime-text-s-fuzzy-match/
試したこと

「１８ＣＰ」を「 １９ＣＰ」で検索したところヒットなしになりました。
補足情報(言語/FW/ツール等のバージョンなど)

javascript版もありますがロジックが異なると思います
Xamarin.Android アプリがデバッグできなくなった

androidのスマホ実機で開発中、突然実機へのデプロイが以下のエラーでできなくなった。

```
Android アプリケーションをデバッグしています。
logcat に接続できず、GetProcessId が返されました: 0
InspectorDebugSession(0): HandleTargetEvent: TargetExited
InspectorDebugSession(0): Disposed
```

#環境
Windows10
Visual Studio Community 2017 
Xamarin   4.5.0.486
Xamarin.Android SDK   7.3.1.2

#解決方法
・androidプロジェクト(〇〇〇.Droid)を右クリック
・プロパティを選択
・開いた画面の左パネルからAndroidオプションを選択
・共通ランタイムの使用のチェックボックスを外す
完了、引き続き楽しい開発を。
ただし、Fast Deploymentが無効化されるので遅いデプロイがさらに遅くなります。
他の解決策を見つけた方は教えてください。。

また、私の環境だけかもしれませんが、この状態の最初のデバッグで
MainActivityクラスのbase.OnCreateで内部例外が発生して強制終了しました。
本当は内部でキャッチされてるようなのでRelease構成でデバッグしてました。
その後、この手順を確立中にDebug構成に戻したら何ら問題なくデバッグできるように。。


#試したけど効果なかったこと、対象じゃないから試してないこと

- 解決方法の共通ランタイムは有効でFast Deploymentの使用だけを無効化
同じエラーが出てダメでした。

- ソリューションのクリーン、再配置、ビルド
同じエラーが出てダメでした。ちなみに、Xamarinで謎のエラー出るときはこれをやる解決するときがある。。

- adb（androidシミュレータ）の再起動
そもそも実機なのでやってない。
adb kill-server
adb start-server


#参考
message: Couldn't connect to logcat, GetProcessId returned: 0 — Xamarin Forums https://forums.xamarin.com/discussion/2274/message-couldnt-connect-to-logcat-getprocessid-returned-0
Lua で eval 関数を作る際に、なぜ assert を使うのか（もしくは、load 関数の戻り値について）

# 概要
Lua で eval 関数を作る場合、load() を使用することはもちろんですが、assert() を併用している例を多く見かけます。ここでは、eval の基本的な説明と、なぜ assert を併用するのかについて解説を行います。

# Lua での eval 基本編
文字列をプログラムとして評価する関数は、一般的に eval と呼ばれています（ちなみに evaluate という英単語は「評価する」という意味で、evaluation は「評価」という意味です）。Lua でも load 関数にて、この機能は提供されています。古い Lua では loadstring という関数名で提供されていたようです。

実際には、load に文字列を渡すだけでは実行してくれないので、次のようなコードを書く必要があります。

```lua:ex_load.txt
> a
nil
> load("a=1")()
> a
1
```

load の戻り値は関数であり、文字列として記述したプログラムを実行するためには、戻り値に () を付けて実行させる必要があるわけです。

```lua:ex_type_of_return_value_of_load.txt
> type(load("a=1"))
function
```

# ネットで見かける eval の実装例
Lua での eval の実装例として、以下のようなコードをよく見かけます。

```lua:eval.lua
function eval(inStr)
    return assert(load(inStr))()
end
```

これは、単に load 関数を用いるだけでは、与えられた文字列にエラーが含まれている場合などにうまく対処できないからです。

例えば、"a=" という不完全な文字列を評価する場合、いつもの "unexpected symbol near..." というエラーメッセージが出力されて欲しいものです。しかし、load("a=")() を実行すると、"stdin:1: attempt to call a nil value" というメッセージが出力されます。

これは、"a=" というプログラム片だから、nil value 云々というメッセージが出力されたわけではありません。どのようなエラーを含む文字列でも、全てこの nil value 云々というメッセージが出力されます。これは eval 関数の挙動として、あまり良いものではありません。可能であれば、適切なエラーメッセージが出力されて欲しいものです。

## load 関数の戻り値
load 関数の仕様は、公式サイトの https://www.lua.org/manual/5.3/manual.html#pdf-load で確認できます。それによると、引数として与えられた文字列にエラーがない場合は関数としてコンパイルされたチャンクが返され、そうでない場合（つまりエラーがある場合）は nil とエラーメッセージが返される、とあります。実際に、引数にエラーが含まれない場合、およびエラーが含まれる場合の挙動は以下のようにして簡単に確かめられます。

```lua:ex-load-without-with-error.txt
> select("#",load("a=1")) -- num of return values in case of no error
1
> select("#",load("a=")) -- num of return values in case of errors
2

> r,s=load("a=") -- in case of the argument with errors
> r
nil
> s
[string "a="]:1: unexpected symbol near <eof>
```

引数として与えられた文字列（＝評価される文字列）にエラーが含まれる場合、load 関数は常に nil を第 1 戻り値として返します。そのため、load("a=")() のように、単に load 関数の呼び出し直後に () を付けて実行する実装では、エラーが含まれる文字列の場合、常に "stdin:1: attempt to call a nil value" というエラーメッセージが表示されることとなります。

## assert の活用
上で見たように、load 関数は評価する文字列にエラーがある場合に nil を第 1 戻り値として返します。であれば、素直に eval を実装すると、例えば、以下のようなコードが考えられます。

```lua:rustic-eval.lua
function eval(inCodeStr)
    local r,s=load(inCodeStr)
    if r~=nil then
        return r()
    else
        error(s)
    end
end
```

もちろん、これでも動くわけですが、assert を使うと、より簡潔に記述できます。Lua のマニュアル https://www.lua.org/manual/5.3/manual.html#pdf-assert によると、assert は 2 つの引数をとり、第 1 引数が nil でなければ引数全てを返し、そうでない場合は第 2 引数をエラーオブジェクトとして error 関数に引き渡します（つまり、第 2 引数がエラーメッセージとして表示されます）。

これは、load 関数にとっては非常に都合の良い仕様となっています。load 関数で評価すべき文字列にエラーが含まれる場合は、nil とエラーメッセージが assert 関数に引き渡され、結果として、error 関数にエラーメッセージが引き渡されて実行されます。もし、load 関数に渡される文字列にエラーが含まれない場合には、第 1 引数は nil ではなく関数となります。そのため、assert 関数の戻り値は load 関数の戻り値と等しくなり、assert 関数の結果を関数として実行することは、与えられた文字列をプログラムとして実行することとなります。つまり、上で示した素朴な実装と同等の処理は、先に上げた次のコード（再掲）のように書けます。

```lua:eval.lua（再掲）
function eval(inStr)
    return assert(load(inStr))()
end
```

# まとめ
この文書では、eval 関数について簡単な説明を行い、Lua でも load 関数にて同等の処理ができることを示しました。ネットなどでは load と assert を組み合わせた例が多くみられるため、load 関数の仕様と assert 関数の仕様を説明し、assert 関数を活用することにより、簡潔に eval 関数を記述できることを示しました。

以下、個人的な感想ですが、Lua のライブラリはよく考えられているなぁ、と再認識しました。
HAMLの入れ子構造〜pタグの中にaタグ〜

# やりたいこと
例えば「詳しく読みたい方はこちらをご覧ください。」の「こちら」にだけリンクを貼りたい時の、HAMLの書き方。

# やりかた

```sample.haml
    %p
      詳しく読みたい方は
      %a{href: 'http://~(URL)'} こちら
      をご覧ください。
```

# ポイント
pタグの中にaタグが入れ子になるように書く。
その際、HTMLと違い閉じタグを必要としないため、改行やインデントに注意する。
SoracomAir接続をSystemdでサービス化したメモ


RaspberryPi3にSoracomAirのSIM挿したあとの話。

通信するにはSoracom提供の `connect_air.sh` を走らせておくのだが
それをサービス化する。 

----

### サービス化

```bash
mkdir -p /opt/soracom/bin

cd /opt/soracom/bin

#### Soracomで公開されているやつ
curl -L -O http://soracom-files.s3.amazonaws.com/connect_air.sh

chmod 555 connect_air.sh

#### startとstopだけのsoracom.shを作る
# connect_air.shを呼ぶだけ
cat > soracom.sh <<'EOF'
#!/bin/bash -e

BASE_DIR=$(cd $(dirname $0)/..;pwd)

case "$1" in
  "start")
    ${BASE_DIR}/bin/connect_air.sh
    ;;
  "stop")
    kill -SIGINT $2
    ;;
esac
EOF

chmod 555 soracom.sh

#### サービス化する
# $MAINPIDでProcessIDを参照できるらしい
cat > /etc/systemd/system/soracom.service <<'EOF'
[Unit]
Description = soracom air ppp connect

[Service]
ExecStart = /opt/soracom/bin/soracom.sh start
ExecStop = /opt/soracom/bin/soracom.sh stop $MAINPID

[Install]
WantedBy = multi-user.target
EOF
```

### 使いかた

```bash
#### 確認
# soracom.serviceが表示されればOK
systemctl list-unit-files --type=service

#### 起動
# 少し待ってからifconfig叩くとpppがUPになってるはず
systemctl start soracom

#### 停止
systemctl stop soracom
```

----

> USBドングル挿したら接続開始する、みたいな
> upnp的にやってくれるようにできたらいいな。。。
Discreet Log Contractsについて　（概要）

- 理解しきれてない部分もあるので間違っていたらごめんなさい


原論文
https://adiabat.github.io/dlc.pdf

解説されてるスライド？
https://bc-2.jp/materials/0305_DiscreetLogContracts.pdf


概要

```
Bitcoinを使って分散予測市場を作るためのコントラクト（Bitcoinスクリプトとその利用方法）を考えだした論文。
AugurなどはEthereum上にプログラムとして書かれているが、それを用いなくても良くなる。
また、Lightning Networkと共存できるため、高速で手数料のかからないやり取りができる。
```

この投稿は翻訳ではなく、単なるまとめ的なものなので詳細は原論文を解読してください。



##（前提）Schnorr署名についての知識
詳細は[こちら] (https://blog.visvirial.com/articles/721)


署名者は秘密鍵と、加えて乱数を生成

- A = aG ( A:公開鍵,  a:秘密鍵）
- R = kG (k:ランダムな自然数）

s = k - h(m, R)a を計算し、(R,s)を署名として公開


署名検証

公開された(A,m,R,s)より

- sG = R- h(m,R)A

が成立すれば検証完了（代入すると同じになるため）

---------------------


##Discrete Log Contractsの流れ


###登場人物

Alice <-> Bob (将来のある時点での日本円価格の予測をし、賭けをする）

Olivia: oracle(仲介者）

① Olivia

公開する： V ( V= vG) (G:ベースポイント　楕円曲線？)
公開する： R ( R = kG) k: ランダムな自然数

Rは署名の時に一度だけ使われる。

Oliviaはランダムな自然数kを生成する。

kは複数生成され、毎回R = kGを計算、meta dataと同時にRを公開

```
 meta data: mに値を入れる時の形式を定義したもの
 
 例）ここではjson形式で {name: value} をテンプレートにしてます。
 
 　　{jpy-in-satoshis: 1050} 対象の予測値が１つの場合
     
    { btc: 10000, ltc: 20000}　２つの場合
      など
  
```

今回はm=1000など、そのまま数値をmに代入していきます。

  
  
②　Bob,Alice

multisigアドレスに二人共BTCをデポジットし、コントラクトを含んだトランザクションに署名してbroadcastする。




③　closing transaction作成

TX<sub>1</sub>, TX<sub>2</sub>, .....,TX<sub>i</sub>,.....

これは以下のPubkeyに送金するトランザクションである。

- Pub<sub>i</sub> = Pub<sub>Alice</sub> + s<sub>i</sub>G
- s<sub>i</sub>G = R - h(i, R)V


iは署名するメッセージ部分だが、ここはOliviaの公開したmeta data形式に従って入力してRを計算しないといけない。


無数のあり得る日本円価格（satohis換算）に対してclosing transactionsをAliceとBobはそれぞれ作成し署名して、お互いに交換しておく。（いつでもClosing Transactionをブロードキャストできる）

＝＞signed Contract Execution Transactions(CET)

④ Olivia(金曜日になったら）

1050 satohis/yenになっていた。

m=1050として、

s<sub>1050</sub> = s = k- h(1050,R)v

が計算できるので、計算し、公開する。



⑤　Bob,Aliceはs<sub>1050</sub> に対応した秘密鍵を得ることができる。

Pub<sub>Alice</sub> = aGより

- Pub<sub>1050</sub> = Pub<sub>Alice</sub> + s<sub>1050</sub>G
 = aG + s<sub>1050</sub>G
 =(a+s<sub>1050</sub>)G
 
 Priv<sub>1050</sub> = a + s<sub>1050</sub>
 
Alice、Bob共にPub<sub>1050</sub> に対するトランザクションにPriv<sub>1050</sub> を使用して署名し、ブロードキャストする。

これによって最初に作ったmultisig address から双方とも出金できる。


（Aliceの予測が外れてしまって逃げた場合どうなるのか？当初のcontract(Bitcoin Script)にはOP_CLTVなどで期間が設定されており、期間を過ぎたらBobは全額出金できるため、逃げたらBobが得をすることになる。）
Raspberry PiとUSB WebカメラでストリーミングしてVLCで見る

# 概要

Raspberry Piに接続したWebカメラの映像をストリーミングしてVLCメディアプレイヤーで見る。

## 背景

古い賃貸マンションに住んでいて、備え付けられているのはチャイムのみ。身に覚えのない訪問客の姿を確認するために、ドアスコープを覗きにいくのが億劫。でも、ドアモニターをわざわざ買うと高いし、そもそも賃貸なので設置できる機種も限られる…。

そこで、ドアスコープにWebカメラを固定して、ストリーミングさせることにした。

## 使用するもの

* Raspberry Pi 3 Model B
* Logicool C270
* motion

## USBカメラが接続されているか確認

```
$ lsusb
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
```

## Motionインストール

```
$ sudo apt install motion
```

## 自動起動設定

`/etc/default/motion`を編集する。
`start_motion_daemon=yes`と設定。

## 撮影に関する設定

`/etc/motion/motion.conf`を編集する。
以下をデフォルトから変更。

画像ファイルの出力はいらないのでオフ

```
# Output 'normal' pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to 'first', only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to 'best'.
# Picture with motion nearest center of picture is saved when set to 'center'.
# Can be used as preview shot for the corresponding movie.
output_pictures off
```

動画のフレームレートを10（お好み）に
※効いてない疑惑あり。映像を見てると2fpsしか出ていない気が…

```
# Maximum framerate for stream streams (default: 1)
stream_maxrate 10
```

ストリームへの接続をローカルホストのみに制限をオフ
iPhoneやPCから見たいので

```
# Restrict stream connections to localhost only (default: on)
stream_localhost off
```

コントロール画面への接続をローカルホストのみに制限をオフ
iPhoneやPCから見たいので

```
# Restrict control connections to localhost only (default: on)
webcontrol_localhost off
```

## 稼働させる

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable motion
$ sudo systemctl start motion
```

## VLCメディアプレイヤーで映像を見る

「ネットワークストリームを開く」から設定する。
`http://[RaspberryPiのIPアドレス]:8081/`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195900/b438c6b8-2257-d3f9-0058-f85dfc3a4329.png)

※LAN内の任意のブラウザから同アドレスポート8080番にアクセスすることでも映像が見られる。

## ドアへのカメラの取り付け

凝った工作ができる材料も工具もスキルもないので、以下のような手段でドアに取り付けた。

取り付けに使ったもの

* マグネットフック
* C270のパッケージ内部でカメラ本体がはめ込まれていた段ボール
* ガムテープ

手順

1. フックに段ボールを引っ掛けて、いい感じの位置にフックをくっつける。
1. 段ボールにはいい感じに折り目がつけられているので、そこにカメラをはめる。
1. 段ボールの下端をガムテープでドアに固定する。

当然、見た目はすさまじく不格好である。
あと、「いい感じの位置にフックをくっつける」のが地味に大変。

## 本末転倒→解決

ドアの前にいなくてもドアの外側を見ることができるようになった。
しかし、ドアスコープをWebカメラで塞いでしまったため、**ドアの前に立ったときに外が見えない**。
常に映像を表示しつづけるものが欲しい…。

幸い、タイムセールで3480円で買ったものの、ほとんどキッチンタイマーと化していたFireタブレットがあったので、VLCアプリ（Google Playをゴニョゴニョしなくても、Fire用アプリストアで配信されている）を起動した状態で玄関に置いておくことにした。

Fireタブレットは無操作状態でスリープに入るまでの時間を最長30分までしか設定できないが、「ストリームの受信中は無操作扱いにならない」ようなので、映像を垂れ流すままにさせておける。
※嘘かもしれない。たまにスリープしている。
→確証はないが見当はついた。おそらくOSアップデートのタイミングでスリープしている。それ以外は基本映りっぱなし。
ISOのドラフトの種類

発行までに6つのステージがある

**Proposal stage**
作ろうとしている規格が本当に必要か確認。

**Preparatory stage**
working draft (WD)を作る。

**Committee stage (option)**
committee draft (CD)を作る。

**Enquiry stage**
draft international standard (DIS)を作る。変更がなければ、publication stageに進む。そうでなければ、approval stageに進む。

**Approval stage**
final draft international standard (FDIS)を作る。

**Publication stage**
発行

[ISO, stages and resources for standards development](https://www.iso.org/stages-and-resources-for-standards-development.html)
matplotlibのinteractive modeを非同期で実行する

matplotlibのinteractive modeは遅い．定期的に計算結果を可視化するような場合，描画をする間にメインの計算がブロックされてしまうのを避けたい．

```test.py
import numpy as np
import matplotlib.pyplot as plt
import time
import multiprocessing as mp

class Worker(object):
    def __init__(self, queue):
        self.queue = queue

    def loop(self):
        while True:
            obj = np.random.random((100, 100))
            self.queue.put(obj)
            time.sleep(1)

    def __call__(self):
        self.loop()

queue = mp.Queue()
worker = Worker(queue)
p = mp.Process(target=worker)
p.daemon = True

# initialize plot
plt.ion()
imshow = plt.imshow(np.random.random((100, 100)))
plt.show()

p.start()

while True:
    obj = queue.get()
    imshow.set_data(obj)
    plt.draw()
    plt.pause(0.0001)
```

`Worker`に計算を実行させて，計算が終わる度に`Queue`を通して計算結果を受け取って描画する．
gitエラー「GitLab: The project you were looking for could not be found.・・・」


gitlab.comで以下エラーとなりハマってしまったので、備忘録として記録する。


```
$ git fetch
GitLab: The project you were looking for could not be found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

久しぶりにgitlabのリポジトリから```git fetch```時にエラー。
その前まではgitでpushも実施していたため、なぜエラーになったのかわからず。gitlabまたなんかやっちまったか〜と思っていた。


## 解決方法
gitlabへはsshでリポジトリ操作しているが、
```Host``````Port```の値がssh接続との整合性が取れておらずアクセスできなかった。前までは操作できてたのにな〜。
```Host``````Port```を変更後の値に変更したら解決した。

``` cat:変更前
$ cat ~/.ssh/config 
Host gitlab
  User git
  Port 443
  HostName gitlab.com
  IdentityFile ~/.ssh/rsa_gitlab
  TCPKeepAlive yes
  IdentitiesOnly yes
```

```　cat:変更後
$ cat ~/.ssh/config 
Host gitlab.com
  User git
  Port 22
  HostName gitlab.com
  IdentityFile ~/.ssh/rsa_gitlab
  TCPKeepAlive yes
  IdentitiesOnly yes
```

gitlab.com疑ってすいません。。。
[javascript]プロパティの属性の整理

【参考】[パーフェクトjavascript](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88JavaScript-PERFECT-4-%E4%BA%95%E4%B8%8A-%E8%AA%A0%E4%B8%80%E9%83%8E/dp/477414813X)



#一覧

属性名|意味
---|---
writable|プロパティ値の書き換え可能
enumerable|for in文で列挙可能
configurable|属性を変更可能。プロパティの削除可能
get|プロパティ値のゲッター関数を指定可能
set|プロパティ値のセッター関数を指定可能

#例：writable,enumerable,configurableの使い方

http://qiita.com/namitop/items/24f73b33a4fe7f842b03

メソッドのpreventExtensions,seal,freezeも内部的には、
sealはプロパティのconfigureable属性を偽に、
freezeはwritable属性を偽にしている。


#例：get,setの使い方

```js
function createObject(){
  var _x = 0;
  return {
            get x() { return _x; }
            set x(value) { _x = v; }
         }
}

var obj = createObject();
obj.x      //=> 0 （内部的にゲッターを使っている）
obj.x = 1; // （内部的にセッターを使っている）
obj.x      //=> 0
```
emacs + elpy + pyenv-virtualenv でシステムの python が使われてしまう

どうも elpy のもろもろの補完が頭悪いと思っていたら、 python 環境が pyenv のものではなくてシステムのものが使われていた。というメモ。

# elpy?
https://elpy.readthedocs.io/en/latest/index.html

python 開発の IDE 的な機能をやってくれる賢いやつ。

- オブジェクトのメンバやそのたいろんなものを補完
- メソッドやクラスのドキュメントを見る
- 定義に飛ぶ

などなどやってくれる。
それらをやってもらうには、 pip install jedi で入れた jedi とかいうやつらがよしなにやってくれるらしい。

# 現状の確認
`M-x elpy-config` でみれる

```
   1 Elpy Configuration
   2
   3 Virtualenv........: ml_test (/home/harumitsu.nobuta/.pyenv/versions/3.5.2/envs/ml_test)
   4 RPC Python........: 2.7.12 (/home/harumitsu.nobuta/.pyenv/shims/python)
   5 Interactive Python: python (/home/harumitsu.nobuta/.pyenv/shims/python)
   6 Emacs.............: 24.5.1
   7 Elpy..............: 1.15.1
   8 Jedi..............: Not found (0.10.2 available)
   9 Rope..............: Not found (0.10.5 available)
  10 Importmagic.......: Not found (0.1.7 available)
  11 Autopep8..........: Not found (1.3.2 available)
  12 Yapf..............: Not found (0.16.3 available)
  13 Syntax checker....: flake8 (/home/harumitsu.nobuta/.pyenv/shims/flake8)
  14
```
Virtualenv は 3.5.2 になってるのに、なぜか RPC Python は 2.7.12 に。。。
2.7.12 はシステムの python コマンドを叩いたときのものなので、何故か pyenv がうまく動いていないくてシステムのものを参照させてしまっている。

当然、 jedi とかを入れた環境は virtual_env の ml_test なのでシステムには入っていない。よって補完などがアホになる。

# 原因
https://github.com/jorgenschaefer/elpy/issues/803
作者がむりぽっていってるからむりぽい。

# 対応策
https://github.com/gregnewman/emacs.d/blob/master/greg.org
を参考に、自前で .python-version を読みよしなに設定するスクリプトを書く。
意外とかんたんにできた。

## 1. 以下の elisp を作る
https://github.com/halhorn/.emacs.d/blob/master/elisp/set-pyenv-version-path.el

```el:.emacs.d/elisp/set-pyenv-version-path.el
(defun set-pyenv-version-path ()
  "Automatically activates pyenv version if .python-version file exists."
  (f-traverse-upwards
   (lambda (path)
     (let ((pyenv-version-path (f-expand ".python-version" path)))
       (if (f-exists? pyenv-version-path)
           (pyenv-mode-set (s-trim (f-read-text pyenv-version-path 'utf-8))))))))
(provide 'set-pyenv-version-path)
```

## 2. init.el に追記
もしくは .emacs に追記。
https://github.com/halhorn/.emacs.d/blob/master/init.el#L193

```el:.emacs.d/init.el
(require 'set-pyenv-version-path)
(add-hook 'find-file-hook 'set-pyenv-version-path)
(add-to-list 'exec-path "~/.pyenv/shims")
```
オフラインリアルタイムどう書くE16の回答

配列でビットアクセスして解いています。
50分ほどかかりました。

```ruby:e16.rb
def solve( input )
  num = input.to_i + 1
  size = num.to_s(2).length
  (size-1).downto(0) { |i|
    if num[i+2] == num[i+1] and num[i+1] == num[i]
      num &= (1 << (size+1)) - (1 << i)
      if num[i] == 0
        num += 1 << i
      else
        num += 1 << (i+1)
      end
    end
  }
  num.to_s
end

def test( input, expected )
  actual = solve( input )
  if expected != actual
    puts 'NG, input = %s, expected = %s, actual = %s' % [ input, expected, actual, ]
    exit(1)
  else
    puts 'OK, input = %s, actual = %s' % [ input, actual, ]
  end
end

test( "1441", "1444" )
test( "1", "2" )
test( "2", "3" )
test( "3", "4" )
test( "7", "9" )
test( "43690", "43691" )
test( "349525", "349526" )
test( "209715", "209716" )
test( "209919", "210066" )
test( "209664", "209700" )
test( "65536", "74898" )
test( "1048575", "1198372" )
test( "14", "18" )
test( "13", "18" )
test( "27", "36" )
test( "44", "45" )
test( "136", "146" )
test( "383", "402" )
test( "649", "658" )
test( "1227", "1228" )
test( "2693", "2706" )
test( "4943", "4946" )
test( "9152", "9362" )
test( "8336", "9362" )
test( "36993", "37449" )
test( "81868", "84260" )
test( "73287", "74898" )
test( "305901", "305956" )
test( "555516", "599186" )
test( "691590", "692809" )
test( "3112217", "3295524" )
test( "5235890", "5392676" )
test( "6804756", "6890642" )
test( "13653246", "13781284" )
test( "20099429", "20099657" )
test( "107304545", "107304548" )
test( "227978622", "227978642" )
test( "380810157", "380810386" )
test( "268435455", "306783378" )
test( "536870912", "613566756" )
test( "1072693248", "1227133513" )
```
オフラインリアルタイムどう書くE15の回答

ギャスケット上の位置に変換した後、上下左右の位置を数字に戻しています。
1時間ほどかかりました。

```ruby:e15.rb

def get_bitarray(num, div)
  ret = num.divmod(div)
  while ret[0] >= div
    ret = ret[0].divmod(div) + ret[1..-1]
  end
  ret.reverse
end

def pos_to_num(pos)
  bitx = get_bitarray(pos[0], 2)
  bity = get_bitarray(pos[1], 2)
  length = [bitx.length, bity.length,].max
  sum = (0...length).inject(0) { |sum, i|
    return [ false, ] if bitx[i] == 1 and bity[i] == 1
    next sum + 3**i if bitx[i] == 1
    next sum + 3**i*2 if bity[i] == 1
    sum
  }
  [ true, sum, ]
end

def solve( input )
  bit = get_bitarray(input.to_i, 3)
  posx = 0
  posy = 0
  bit.each_with_index { |n, i|
    case n
    when 1; posx += 2**i
    when 2; posy += 2**i
    end
  }
  [
   [ posx-1, posy, ],
   [ posx+1, posy, ],
   [ posx, posy-1, ],
   [ posx, posy+1, ],
  ].each_with_object([]) { |check, obj|
    next if check[0] < 0 or check[1] < 0
    is_num, num = pos_to_num(check)
    obj << num if is_num
  }.sort.join(',')
end

def test( input, expected )
  actual = solve( input )
  if expected != actual
    puts 'NG: input = %s, expected = %s, actual = %s' % [ input, expected, actual, ]
    exit(1)
  else
    puts 'OK: input = %s, actual = %s' % [ input, actual, ]
  end
end

test( "21", "19,22,23" )
test( "0", "1,2" )
test( "1", "0,3" )
test( "2", "0,6" )
test( "3", "1,4,5" )
test( "4", "3,9" )
test( "9", "4,10,11" )
test( "15", "11,16,17" )
test( "27", "13,28,29" )
test( "32", "30" )
test( "47", "45,51" )
test( "65", "63,69" )
test( "80", "78,162" )
test( "199", "198,201" )
test( "204", "200,205,206" )
test( "243", "121,244,245" )
test( "493", "492" )
test( "508", "507" )
test( "728", "726,1458" )
test( "793", "792,795" )
test( "902", "900,906" )
test( "981", "976,982,983" )
test( "1093", "1092,2187" )
test( "1202", "1200" )
test( "1300", "1299,1305" )
test( "1962", "1952,1963,1964" )
test( "2188", "2187,2190" )
test( "2405", "2403,2409" )
test( "3326", "3324" )
test( "6561", "3280,6562,6563" )
test( "6612", "6608,6613,6614" )
test( "7058", "7056,7062" )
test( "8444", "8442,8448" )
test( "9841", "9840,19683" )
test( "15243", "15239,15244,15245" )
test( "19946", "19944,19950" )
test( "21148", "21147" )
test( "39365", "39363" )
test( "39366", "19682,39367,39368" )
test( "55694", "55692,55698" )
test( "57245", "57243" )
test( "66430", "66429,66432" )
test( "92740", "92739" )
test( "115250", "115248" )
test( "163031", "163029" )
test( "221143", "221142,221157" )
test( "410353", "410352" )
test( "412649", "412647,412659" )
test( "550391", "550389" )
test( "699921", "699880,699922,699923" )
test( "797161", "797160,1594323" )
test( "1000000", "999999,1000002" )
```
用語 > データの正規化 | データの標準化

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

Neural Networkのoutput nodeの値をmean, stdevで範囲を変更する。
http://qiita.com/7of9/items/cdd5a2895cc5c3fcd49e

@ 深層学習 by 岡谷貴之さん
> データの正規化 (normalization of data) あるいはデータの標準化 (standardization of data)は最も基本的な前処理で、各サンプル$x_n$に線形変換を施し、その成分ごとの平均や分散を揃えます (図3.4)

@ Python機械学習プログラミング by Sebastian Raschkaさんら
> p38
> ここでは、標準化 (standardization)というスケーリング手法を用いる。
...

```math
x'_j = \frac{x_j - \mu_j}{\sigma_j}
```

sigma_jに対する正規化をしているとも考えられるので、「正規化」という用語が間違いではないようにも思う。

上記のような処理を自分は「標準化」として扱うか、「正規化」として扱うか。
( 検索時にうまく見つかるように。)
link > algorithm > string difference > Longest common subsequence (LCS) problem > Delphi実装

```txt:動作環境
C++ Builder XE4
```

2つのファイルの差分を知りたい時にどうするか。

2つの文字列の差分の取り方の実装例(Delphi)は以下で見つけた。
https://www.codeproject.com/Articles/508682/StringpluscomparisonplusinplusDelphi

> Have you ever wondered how utilities like Beyond Compare or DIFF are comparing files? They do it (I guess) by solving the longest common subsequence (LCS) problem.

実行例では追加された部分が青色で、削除された部分は赤色で示されている。

中の処理は再帰処理をしているようだ。

2つのファイル差分取得に使えるかどうか。

自前実装よりも外部ツールで差分を見る方が見やすいかもしれない。
MacのRubyをrbenvでバージョンアップする

# はじめに
ちょっとrailsが触りたくなったのでrubyのバージョンを最新にしようと思いました。

何個か方法はあるようですが、今回は ***rbenv*** と ***brew*** でちょっとやっていきますね（・ω・）

ちなみに、僕のMacはこんな感じ。

- OS X Yosemite 10.10.5
- ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]

# brewをinstall
入っていない方はインストールしましょう。
参考： https://brew.sh/index_ja

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

$ brew -v
Homebrew 2.1.11
```

# rbenvをインストール

```bash
$ brew update
$ brew install rbenv ruby-build

# Error: rbenv 1.0.0 is already installed
# To upgrade to 1.1.1, run `brew upgrade rbenv`
# Error: ruby-build 20160330 is already installed
# To upgrade to 20170726, run `brew upgrade ruby-build`

$ rbenv --version
rbenv 1.0.0
```

すでに僕のMacには入っていました。
rbenvのグレードを上げることができる模様。

```bash
$ brew upgrade rbenv
$ rbenv --version
rbenv 1.1.1
```

リストからバージョン探します。

```bash
$ rbenv install --list | grep 2.4.1
　　 2.4.1
　　　　rbx-2.4.1
```

インストールして設定します。

```bash
$ rbenv install 2.4.1
$ rbenv global 2.4.1
$ gem install railties && rbenv rehash
```

ちなみに、インストールしたやつを見たいときはこちら。

```bash
$ rbenv versions
  system
  2.1.0
  2.4.1 (set by /Users/arashidatakashi/.rbenv/version)
```

# brewでいってみよう

一応これでもいけるみたいです。
rbenvの方が扱いやすいのでそちらでいいと思いますが(；´Д｀)

```bash
$ brew update
$ brew install ruby
# 退避
$ sudo mv /usr/bin/ruby /usr/bin/ruby2.0.0
# シンボリックリンクを作る
$ sudo ln -s /usr/local/bin/ruby /usr/bin/ruby
$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin14]
```

# 終わりに
エラー出るかなと思ったけど何もなかったです。
（もうインストールしてるってエラーは出ましたすみません）

結構簡単にできました＼(^o^)／
フロントエンド実装中に使えるモックサーバを爆速で準備する

# 結論
[json-server](https://www.npmjs.com/package/json-server)がめっちゃ便利

# 手順
## インストール

npm 環境がすでにあれば
 
```bash
npm install -g json-server
```
で完了

なければ [nodeのバージョンをnで管理する](http://qiita.com/bigplants@github/items/2d75bf552e0da4a7e822) などを読みつつnodeとnpmをインストールしてください

## 準備するもの
- コンソール
- db.json
- ブラウザ（動作確認用）

## やること
### db.json ファイルを作成する
bashの `touch` コマンドやWindowsなら右クリックからなどでお好きなようにファイルを作ってください

### db.json にリソースを登録する
ここでモックサーバから返して欲しいデータリストを列挙します

**最上位の階層の `key` がエンドポイントになります**

```json
{
  "users": [
    {"id": 1, "name": "hoge"},
    {"id": 2, "name": "fuga"}
  ],
  "tweets": [
    {"id": 1, "contents": "あー眠い", "user-id": 1},
    {"id": 2, "contents": "ファビュラス！", "user-id": 1}
  ]
}
```

### db.json ファイルがあるところでjson-serverを実行
**db.jsonファイルがあるディレクトリ**で 

```bash
json-server db.json
```
を実行！

## 動作確認
デフォルトだと `localhost:3000` で実行されるので、ブラウザを使ってアクセス


## 完了！

### root エンドポイント([http://localhost:3000](http://localhost:3000))
![Screenshot from 2017-08-12 16:03:03.png](https://qiita-image-store.s3.amazonaws.com/0/108554/efbbcaf2-60b1-29a1-db6e-ddc8ba9cfbf9.png)

### /users エンドポイント ([http://localhost:3000/users](http://localhost:3000/users))
![Screenshot from 2017-08-12 16:03:14.png](https://qiita-image-store.s3.amazonaws.com/0/108554/16f83922-a152-d805-47c2-376669b750e4.png)

### /tweets エンドポイント ([http://localhost:3000/tweets](http://localhost:3000/tweets))
![Screenshot from 2017-08-12 16:03:23.png](https://qiita-image-store.s3.amazonaws.com/0/108554/cabf72da-b17a-1d19-09c4-acc9f28fa95a.png)

※ 筆者が [JSON View](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc) というChrome拡張を入れているため、見た目が異なる場合がございます。

## その他便利機能
### モックサーバから送られるデータをサーバ再起動無しで書き換える

`--watch` オプションというめっちゃ便利なオプションを使えば
`db.json` ファイルに対して行った変更を検知してサーバのレスポンスに反映させてくれます！

便利！(*´∀｀)

### 現状のDBの状態をスナップショットとして保存する
たくさんPOSTのリクエストを行った後や一通りテストを走らせた後などに、現状のリソースの状態(db.jsonの中身)を保存したいときには

コンソールにフォーカスを当てた状態で **`s → Enter`** とタイプすれば自動的に別名でJSONファイルを書き出してくれます！

便利！(*´∀｀)

## 追記(2017/08/23)
はてなブックマークのコメントにとても良いコメントがあったので（勝手に）追記させていただきました！
[Chinosoko](http://b.hatena.ne.jp/Chinosoko/) さん、読んでくださり有り難うございます！
もし、問題がありましたら [Twitter](https://twiiter.com/ahaha0807_alg) かこちらのコメントでご連絡ください…！

> ソートやページネーションもできる、この記事で想像したよりずっと高機能な代物だった。/ 部品として使って自分で処理を書けば、レスポンスを改変して任意のステータスにすることもできる。一から書くより大分楽そう
【シェル】プルリクメーカー 【夏休みの宿題】

最近業務で大量のプルリクを作る事があって
ルーティンワークを軽減させたくシェルで
ある程度ラクできるようにしました。

シンプルなシェルで作っているので
ディスクリプションの内容をお好みで
編集して使って下さい。

どういう風に使うかイメージが湧きやすいように
動画を撮影しましたので、参考にしてみて下さい。

[<font size='5' color='BLUE'>![【シェル】プルリクメーカー 【夏休みの宿題】](http://www.google.com/s2/favicons?domain=https://www.youtube.com/watch?v=4W8WHSGnM34)プルリクメーカーを作ってみた 🎶 </font>](https://www.youtube.com/watch?v=4W8WHSGnM34)

make_pull_req.sh 

```
#!/bin/bash

echo "【タイトルを入力して下さい。】"
read TITLE
echo "【ブランチを入力して下さい。】"
read BRANCH
echo "【チケットのURLを入力して下さい。】"
read URL
echo ""
echo "【ブランチ元がmasterではない場合は入力して下さい。】"
read NOTMASTER
echo ""



if [ -n "$NOTMASTER" ]; then
    echo "[タイトル]:$TITLE  [ブランチ]:$BRANCH  [チケットURL]:$URL [ブランチ元]:$NOTMASTER"
    echo ""
    echo ""

    echo "###【Git Operation】########################################################"
    echo "# ローカルブランチ作成"
    echo "git checkout $NOTMASTER"
    echo "git pull"
    echo "git checkout -b $BRANCH"
    echo ""
    echo "# 空のコミット"
    echo "git commit --allow-empty -m \"[WIP] $TITLE\""
    echo ""
    echo "# リモートブランチに push"
    echo "git push origin $BRANCH"
    echo ""
    echo "# リモートブランチと紐付け"
    echo "git branch -u origin/$BRANCH"
    echo ""
    echo "# ローカルブランチがどのリモートブランチと紐付いているか確認"
    echo "git branch -vv"
    echo ""

    echo "###【Pull Request Description】########################################################"
    echo "#  **【調査中】**"
    echo ""
    echo "# やる事"
    echo "- [ ] xxxx"
    echo "- [ ] xxxx"
    echo "  - [ ] xxxx"
    echo "- [ ] xxxx"
    echo "  ~~- [ ] xxxx~~"
    echo ""
    echo "# やらない事"
    echo ""
    echo "# スクリーンショット"
    echo "## TITLE"
    echo "| 修正前 | 修正後 |"
    echo "|:-----------:|:------------:|"
    echo "|修正前画像|修正後画像| "
    echo ""
    echo "# Backlog"
    echo "[$TITLE]($URL)"
    echo ""
    echo "# ブランチ元"
    echo "$NOTMASTER"
    echo ""
    echo "# 備考"
    echo "[TITLE](URL)"
else
    echo "[タイトル]:$TITLE  [ブランチ]:$BRANCH  [チケットURL]:$URL"
    echo ""
    echo ""

    echo "###【Git Operation】########################################################"
    echo "# ローカルブランチ作成"
    echo "git checkout master"
    echo "git checkout -b $BRANCH"
    echo ""
    echo "# 空のコミット"
    echo "git commit --allow-empty -m \"[WIP] $TITLE\""
    echo ""
    echo "# リモートブランチに push"
    echo "git push origin $BRANCH"
    echo ""
    echo "# リモートブランチと紐付け"
    echo "git branch -u origin/$BRANCH"
    echo ""
    echo "# ローカルブランチがどのリモートブランチと紐付いているか確認"
    echo "git branch -vv"
    echo ""

    echo "###【Pull Request Description】########################################################"
    echo "#  **【調査中】**"
    echo ""
    echo "# やる事"
    echo "- [ ] xxxx"
    echo "- [ ] xxxx"
    echo "  - [ ] xxxx"
    echo "- [ ] xxxx"
    echo "  ~~- [ ] xxxx~~"
    echo ""
    echo "# やらない事"
    echo ""
    echo "# スクリーンショット"
    echo "## TITLE"
    echo "| 修正前 | 修正後 |"
    echo "|:-----------:|:------------:|"
    echo "|修正前画像|修正後画像| "
    echo ""
    echo "# Backlog"
    echo "[$TITLE]($URL)"
    echo ""
    echo "# 備考"
    echo "[TITLE](URL)"
fi
```
linux command > ( (symbolic linkの) symbolic linkの) オリジナルを探す > readlink -f [シンボリックリンクファイル]

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

Symbolic linkのSymbolic linkをはっていると、オリジナルのファイルがどこのフォルダのどのファイルか分かりにくい。

https://unix.stackexchange.com/questions/167631/finding-the-original-file-of-a-symbolic-link

readlinkを使うようだ。

### テストデータ作成

```bash
$ touch original
$ ln -fs original kagemusha1
$ ln -fs kagemusha1 decoy_of_decoy
```

decoy_of_decoy
から
original
を探したいということ。


### 試用

```bash
$ readlink -f decoy_of_decoy 
/home/yasokada/WORK/LINUX/original
```