OmniAICreator/Qiita-1.07M huggingface dataset:
Ceylon言語をIntelliJ IDEAで

## Ceylonとは
https://ceylon-lang.org/

```sample.ceylon
shared void run() => newServer {
        Endpoint {
            path = startsWith("/");
            acceptMethod = { get };
            (request, response) =>
                response.writeString("Say more, more clearly");
        }
    }.start();
```

JVMとNode.js上で動かせる、やや新しめの言語です！
Kotlinとだいたい同期で同じ立ち位置だったけれど、いつの間にか色々と差がついたよ！
でもいい言語だと思うので興味があって暇してる人は触ってみてほしいです。
最近Android開発にも使える感じになりました。


## Ceylon IDE for IntelliJ

https://ceylon-lang.org/documentation/1.3/ide/intellij/features/

Eclipse用のCeylonプラグインは以前から存在していました。
参考（Eclipseで使う場合）：[Ceylon開発環境セットアップ！](http://qiita.com/newta/items/d84200874645fa5cef26#_reference-027dbc9afdcdee6ef180)

しかし、JavaプログラマにはIntelliJじゃなきゃやだという方も多いかと思います。
そんな人のために、割と最近IntelliJ IDEA用のプラグインも公開されました。
Android Studioでもちゃんと使えるということで、夢が広がりますね。

（でも現在のバージョンだと私の環境ではそこそこエラー吐いて死にます）

### インストール方法

#### 前提
- [IntelliJ 2016.x](https://www.jetbrains.com/idea/) or [Android Studio 2.x](https://developer.android.com/studio/index.html)
- Java7+

Java7か8が必要です。

#### プラグインをインストールする
1. IntelliJかAndroid Studioを起動します
2. `Preference > Plugins > Browse repositories...`を開く
3. 検索ボックスに*Ceylon*と入力
<img width="413" alt="ceylon_plugin.png" src="https://qiita-image-store.s3.amazonaws.com/0/126701/61df1a03-8f8a-9cf9-394e-4b114dca907a.png">
4. プラグインのダウンロードが完了したら、表示されるプロンプトに従ってIDEを再起動

簡単！


## Hello worldしてみる

### プロジェクトの作成

プラグインが正常にインストールされれば、NewProjectのウインドウに**Ceylon**が追加されるので、まずはプロジェクトを作成しましょう。
色々と設定項目がありますが、とりあえずデフォルトのままで大丈夫かと思います。

### ファイルの作成

プロジェクトができたら、sourceディレクトリの中にCeylonファイルを作成します。

<img width="498" alt="create_ceylon_file.png" src="https://qiita-image-store.s3.amazonaws.com/0/126701/c8f5b941-4f15-9de0-d883-5efdb0d2e3ae.png">

名前は適当につけてfunctionを定義しましょう。
ただしクラスの頭文字は大文字、それ以外の変数や関数の定義は小文字で命名しないと怒られます。

<img width="186" alt="create_ceylon_file2.png" src="https://qiita-image-store.s3.amazonaws.com/0/126701/32915028-666a-87ed-cf22-0e4b56f18f32.png">

### ソースコード

```hello.ceylon
shared void hello() {
    print("Hello, world!");
}
```

**shared**（Javaでいうpublic）をつけた関数がエントリポイントになりえます。
行数表示のところに実行ボタンが表示されるのでクリックしましょう。
Async Functionで_.deferだらけの非同期テストを若干マシにする

非同期関数の中身が実行された後の結果を検証したい時は、下記のように `_.defer` を使って書いていました。コールバックに次の処理を書いていくのでインデントが増えるし、`done`を呼ばないといけない（そして、よく忘れる）のが、面倒くさい。

```js
it('should be ok', (done) => {
  assert.equal(wrapper.find('.upload-button').text(), 'アップロード');

  wrapper.find('.upload-button').simulate('click');

  assert.equal(wrapper.find('.upload-button').text(), '画像をリサイズ中');

  // 非同期に行われる画像のリサイズが完了するのを待つ
  _.defer(() => {
    assert.equal(wrapper.find('.upload-button').text(), 'アップロード中');

    server.respond();

    // レスポンスを処理するコールバックの完了を待つ
    _.defer(() => {
      assert.equal(wrapper.find('.upload-button').text(), 'アップロード');

      done();
    });
  });
});
```

ECMAScript 2017に入る[^1]Async Functionを使うと、下記のように書き直せます。インデントと`done`がいらなくなりました。

[^1]: ECMAScript 2017: the final feature set http://www.2ality.com/2016/02/ecmascript-2017.html


```js
const defer = () => new Promise((resolve) => setTimeout(resolve, 0));

it('should be ok', async () => {
  assert.equal(wrapper.find('.upload-button').text(), 'アップロード');

  wrapper.find('.upload-button').simulate('click');

  assert.equal(wrapper.find('.upload-button').text(), '画像をリサイズ中');

  // 非同期に行われる画像のリサイズが完了するのを待つ
  await defer();

  assert.equal(wrapper.find('.upload-button').text(), 'アップロード中');

  server.respond();

  // レスポンスを処理するコールバックの完了を待つ
  await defer();

  assert.equal(wrapper.find('.upload-button').text(), 'アップロード');
});
```

各種バージョンは下記の通りです。たぶんmochaでも動くはず。
- node 6.9.4
- react 15.4.2
- jest 18.1.0
- enzyme 2.7.1
- babel-preset-es2017 6.22.0
【Jenkins】外部リンクのRefferを無効にする

# 概要
Jenkinsの中から外部リンクを作成した場合などに発生するHTTPリクエストの中にリファラが入ってるという話を聞いて、プログラム本体を改造しないで何か対処できないか試してみました。

結論から言うと
- Simple Theme Plugin で任意のJavaScriptを読込設定できるため、
  JavaScriptでHEADのメタタグにreferrer=no-referrerを追加する。
- ジョブ別であれば、おそらくjQueryプラグイン内で似たようなことは出来そう(未検証)

Reffererの制御自体は以下を参考にしました。
[Qiita: Referrer を制御する](http://qiita.com/wakaba@github/items/707d72f97f2862cd8000)
# あらまし

事の始まりはJenkinsから発行されるHTTPリクエストにリファラがついていて、社内サーバーのドメイン名が見えるのがよろしくない、という話を聞いたことから始まります。

まあ、細かいセキュリティの話はさておき、静的なHTMLであればHEADにMETAタグ追加すれば良い話。
あるいはApacheサーバー側の設定か。

ただ、今のJenkins鯖はaptでパッケージ取得してapt-get upgradeでバージョンアップについていく方法を採用しており、
jenkins.warファイル内の中身を書き換えてしまうとバージョンアップの都度ローカル修正が必要になってしまい、あまりおいしくない。
Jenkinsのバージョンアップがけっこう激しいことを考えるとけっこうシンドイ。

HTMLのHeadを自由に編集できる機能もなく、そういうプラグインもなかったので、代替としてSimple Themeプラグインが持つScriptのロード機能を利用してDOMをいじる方式を採用してみました。

# 手順

１．トップ画面左側のJenkinsのメニューからJenkinsの管理を選ぶ

![000.png](https://qiita-image-store.s3.amazonaws.com/0/17270/f20d2a4b-75d8-cdf3-ab46-67e938f843fa.png)

２．メイン画面側の設定メニューからプラグインの管理を選ぶ

![001.png](https://qiita-image-store.s3.amazonaws.com/0/17270/3709808b-fd0f-a705-11ca-d0c1996cfee6.png)

３．インストール可能タブから「Simple Theme Plugin」をインストール

４．Jenkins再起動後、システム設定から「Theme」セクションのURL of theme JSにuserContent/noRefer.jsを指定する。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/17270/261b8abe-0cc9-eb94-d25a-f0e3bf141aba.png)

５．JENKINS_HOMEで指定されたディレクトリにuserContentディレクトリが出来ているため、その中にnoRefer.jsを以下の内容で設定する。

```javascript
// ドキュメントのロード時、headタグにリファラの設定を追加
window.addEventListener("load", function() {
    var head = document.querySelector('head');

    var noReffer = document.createElement('meta');
    noReffer.setAttribute('name','referrer');
    noReffer.setAttribute('content','no-referrer');

    var noRefferNever = document.createElement('meta');
    noRefferNever.setAttribute('name','referrer');
    noRefferNever.setAttribute('content','never');

    head.appendChild(noReffer);
    head.appendChild(noRefferNever);
}, false);
```

上記設定後、Jenkinsの各ページのHTMLヘッダタグを確認すると

```html
<meta name="referrer" content="no-referrer">
<meta name="referrer" content="never">
```

がついており、その後のHTTPリクエストを見ても REFERRER が出てこなくなったので多分これでうまく行ってる、っぽい。
ATmega1284pのArduino化

#Adruinoのバージョン
Arduinoバージョン：1.6.12（1.7系では、ボードマネージャが追加できなかった）

#ボードマネージャの追加
1. Arduinoより、ファイル > 環境設定　を開く。
2. 「追加のボードマネージャのURL」に以下のURLを追加する。（Githubにある[MightyCore](https://github.com/MCUdude/MightyCore)参照）
`https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json`
![image-4.png](https://qiita-image-store.s3.amazonaws.com/0/53064/e5c27dd9-9c87-04a6-70de-902f9553a1c9.png)
　
3. ツール > ボード > ボードマネージャ を開く。
4. ボードマネジャをスクロールをし、`MightyCore`をクリックする。
5. インストールボタンより、インストールを実行する。
![image-3.png](https://qiita-image-store.s3.amazonaws.com/0/53064/6b972b9e-1b61-653a-1793-799d89fe7fe3.png)

6. インストールが完了したら、ボードマネージャを閉じる。
7. ツール > ボード に`MightyCore`が追加されていることを確認する。

#Arduino UNOを書き込み装置にする
Arduino UNOをPCに接続し、Arduino IDEより以下ように作業する。
1. ツール > 書き込み装置 → `Arduino as ISP`に設定
　![image-1.png](https://qiita-image-store.s3.amazonaws.com/0/53064/4d179d99-8e12-bbbb-62cf-060398cc081c.png)
　
2. ツール > シリアルポート → `Arduino UNOのCOMポート番号`に設定
3. ファイル > スケッチの例 > Arduino ISP → Arduino ISP を開く
4. スケッチ（Arduino ISP）をマイコンボードに書き込む

#Arduino UNOとATmega1284pの接続
Arduino UNOとATmega1284pを下図のように配線する。

［使用分品］
● セラミックコンデンサ　22pF　2個
● セラミックコンデンサ　0.1uF　2個
● 抵抗　10kΩ　1個
● クリスタル　16MHz　1個

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/53064/84d76621-f9d7-1054-d9bf-92456c5f2f42.png)

| 信号名 | Arduino UNO | Atmega1284p | Atmega1284p-AU |
|:------:|:----------:|:-----------:|:--------------:|
| RESET  | 10         | 9           | 4              |
| MOSI   | 11         | 6           | 1              |
| MISO   | 12         | 7           | 2              |
| SCK    | 13         | 8           | 3              |
| +5V    | (5V)       | (VCC)       | (VCC)          |
| GND    | (GND)      | (GND)       | (GND)          |


#ATmega1284pにブートローダーを書き込む
1. ツール > ボード → `ATmega1284`に設定（他はデフォルトでOK）
2. ツール > シリアルポート → `Arduino UNOのCOMポート番号`
3. ツール > ブートローダーを書き込む

![image-2.png](https://qiita-image-store.s3.amazonaws.com/0/53064/9fc2a42d-772a-f3e0-47e5-9ca15e26d499.png)

Arduino IDEは、Arduino ISP化されたArduino UNOのSPI端子経由でAtmega1284Pにブートローダーを書き込みはじめます。書き込みが完了すると、Arduino IDEのコンソール上に書き込み完了通知が表示されます。

#ATmega1284pにスケッチを書き込む
1. [シリアル変換アダプタ](https://www.switch-science.com/catalog/1032/)とATmega1284pを、下図ように接続する
2. シリアル変換アダプタとPCを接続する
3. Blink（01.Basics）やASCIITable（04.Communication）など適当なスケッチを開く
4. ツール > ボード → `ATmega1284`に設定する
5. ツール > シリアルポート → `シリアル変換アダプタのCOMポート番号`に設定する
6. スケッチをマイコンボードに書き込む

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/53064/50c4f508-732d-e679-766f-c1f6a89616c7.png)

|信号名 | ATmega1284p | Atmega1284p-AU |
|:-----:|:----------:|:--------------:|
| RX    |     14     |       9        |
| TX    |     15     |      10        |
| RESET |      9     |       4        |
| +5V   |   (VCC)    |    (VCC)       |
| GND   |   (GND)    |    (GND)       |
jQueryでajax処理

#内容
jQueryでサーバーとアクセスする場合に使うajaxのメモ。
以下は指定URLにdata[id,key]をpostして、dataType[text型]の戻り値のサンプルとなります。

###処理
```js:$.ajax()
$.ajax({
    type: "POST",
    url: "https://hoge.hoge@hoge.hoge",
    data: {
        "id": "hoge",
        "key": "key"
    },
    dataType: "text"
}).done(function(msg){
    alert('メッセージの送受信に成功しました。' + msg);
}).fail(function(data){
    alert('メッセージの送受信に失敗しました。');
});
```
※オプションの詳細は下記リファレンス参照
###リファレンス
■ajax
http://js.studio-kingdom.com/jquery/ajax/ajax
Gitの使い方備忘録 (git merge --squash)

# はじめに
いい感じにGitを使うための備忘録。
Githubにリポジトリを置いときたいけど、細かいコミットは上げたくない人用。

# 流れ
1. topic branchを切ってその下にさらにtopic-develop branchを切る
2. topic-develop branchはローカルだけに置いといて、適当にコミットを生やす
3. いい感じのところでtopic branchにgit merge --squashする。

こうすると2.の部分でコミットメッセージに悩まなくて済む。
2.で生やしたコミットは3.でSquashされる（まとめられる）ので、
Githubから見たときに変にコミットが増えなくて済む。

いい感じ。

# topic branch
2つのbranchを切る。

```bash
$ git branch
* master
$ git checkout -b topic-branch
Switched to a new branch 'topic-branch'
$ git checkout -b topic-branch-dev
Switched to a new branch 'topic-branch-dev'
$ git branch
  master
  topic-branch
* topic-branch-dev
```

# コミットを生やす
topic-branch-devへのコミットはフランクにしていい。
とりあえずコンパイルが通ったコードは（どんなものであれ）ここにコミットするようにしてる。

```bash
$ touch hoge
$ git add .
$ git commit -m "ほげした"
[topic-branch-dev 3321e9d] ほげした
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hoge
$ 
$ touch fuga
$ git add .
$ git commit -m "ふがした"
[topic-branch-dev db4e233] ふがした
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fuga
```

# topic-branch に merge --squash
```bash
$ git checkout topic-branch
Switched to branch 'topic-branch'
$ git merge --squash topic-branch-dev
Updating 0332922..db4e233
Fast-forward
Squash commit -- not updating HEAD
 fuga | 0
 hoge | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fuga
 create mode 100644 hoge
```

この状態ではまだコミットされないので、git commitすることによってsquash mergeが完了する。

```bash
$ git commit
```

コミットメッセージは、1行目にかっこいいコミットメッセージを書いて、
それ以下は自動でててくるやつをそのまま残しておく。

```COMMIT_MSG
Implement hoge & fuga

Squashed commit of the following:

commit db4e233fb2f58211d2364dca66afc0112470cda5
Author: Kenta Hamanaka <hamanaka@cs.info.mie-u.ac.jp>
Date:   Wed Feb 8 12:31:18 2017 +0900

    ふがした

commit 3321e9d63eef8f956073a72bd6170ac6a4e0c373
Author: Kenta Hamanaka <hamanaka@cs.info.mie-u.ac.jp>
Date:   Wed Feb 8 12:30:58 2017 +0900

    ほげした
```

そしてこれをpush。

```bash
$ git push origin topic-branch
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 1.02 KiB | 0 bytes/s, done.
Total 7 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To git@github.com:kentahama/test.git
   0cd8dc9..cc82330  topic-branch -> topic-branch

```

# まとめ
git merge --squashが便利だった。

開発端末にしかtopic-branch-devが残らないので、逆に言うと、他の端末から、mergeしてないtopic-branch-devのコミットを引き継ぎたいみたいなことはできない。
そういう時は両方の端末からアクセスできるリモートサーバでgit init --bareしてそこにpushすればいい。もしくはgithubにプライベートリポジトリを作ろう。なんか本末転倒な気がする(？)
Python > list > pop() > インデックスを{指定して/未指定で}取得 + del()

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1292 / 12833)

> Get an Item by Offset and Delete It by Using pop()

試してみた。

http://ideone.com/wWqImS

```py
mylist = [ 'zundoko', 'zun', 'KIYOSHI', 'zun' ]

print(mylist.pop())
print(mylist.pop(1)*2)
print(mylist.pop(0))
print(mylist.pop())
```

```txt:結果
Success	time: 0 memory: 9024 signal:0
zun
zunzun
zundoko
KIYOSHI
```
CakePHP2のpaginationでORDER BY FIELD

# 任意の方法でソートしたい
今回のお題は上記の通りです。
CakePHPでpagiantionしたいときにハマりかけたので備忘録として置いておきます。

## MySQL
MySQLではORDER BY FIELDを使います。

```sql
SELECT team 
FROM league 
WHERE division = 1
ORDER BY FIELD 
(team, "札幌", "仙台", "鹿島", "浦和", "大宮", "柏", "F東京", "川崎", "横浜F", "甲府", "新潟", "清水", "磐田", "G大阪", "C大阪", "広島", "鳥栖"); 
```

## CakePHP pagination
ここから本題です。
これをCakePHPのpaginationで行います。

```php
<?php 
$this->paginate = array(
'order' => 'FIELD(League.team, "札幌", "仙台", "鹿島", "浦和", "大宮", "柏", "F東京", "川崎", "横浜F", "甲府", "新潟", "清水", "磐田", "G大阪", "C大阪", "広島", "鳥栖"),
); 
?>
```
paginationのorderは配列を使って条件を入れるものだと思っていましたが、
配列を使わなくてもいけるんですね。


## 変数を使う場合
ここでは配列を文字列化してから代入しています。

```php
<?php 
$arrayTeams = array("札幌", "仙台", "鹿島", "浦和", "大宮", "柏", "F東京", "川崎", "横浜F", "甲府", "新潟", "清水", "磐田", "G大阪", "C大阪", "広島", "鳥栖");
$strTeams = implode(',', arrayTeams);

$this->paginate = array(
'order' => 'FIELD(Works.id, ' . $strTeams . ')',
); 
?>
```

参考になれば嬉しく思います。
お後がよろしいようで。
Amazon Linux に Docker Compose を install する方法

https://github.com/docker/compose/releases/

から Install したい Docker Compose を探す。

https://github.com/docker/compose/releases/tag/1.10.1

を Install したいとすると、

```
curl -L https://github.com/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

を行う。

docker-compose.yml

を用意し、

docker-compose up -d

すると、

```
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```

などとでる。

Docker version 1.12. などだと tcp ではなく unix domain socket でやっているため、上記 docker-compose コマンドを実行したユーザにそれにアクセスできる権限を付与する必要がある。

例えば、
Dockerコマンドをsudoなしで実行する方法( http://qiita.com/DQNEO/items/da5df074c48b012152ee )
の方法などで解決する。
位置情報を持つデータをfoliumでscatter plotっぽく表示する方法

#前提
・foliumをある程度使える

#本文
位置情報を持つデータをscatter plotすると、いちおう、それっぽいものになるかと思いますが、地図との重ね合わせができないと思います。Geopandasなど、利用しようとしても、ベースになる地図データの用意が難しかったりすると思います。

そこで、foliumのcircle markerの色を指定することで、地図上に、scatter plotっぽい表示をすることとしました。

そうなると、foliumのcircle markerの色は、16進のカラーコードで指定する必要があるので、データをカラーコードに変換する必要があります。

順序は、
データを0～1に正規化→0～1をRGBカラーコードに変換→変換されたカラーコードを16進に変換、
となります。

データの正規化は、

```.py
import matplotlib.colors as cl
norm = cl.Normalize(vmin='最小値', vmax='最大値'])

norm('値を代入')
```
で行います。

正規化された値のRGBへの変換は、たとえば

```.py
import matplotlib.pyplot as plt
henkan = plt.get_cmap('magma')
henkan('0～1の値')
```
で行います。

16進への変換は、```cl.to_hex()```で行います。


あとは、for文でデータ数分だけ、foliumのcircle markerをプロットすればOKです。

cl.to_hex(henkan(norm(data)))という感じです。
mysql 外部接続で noroute nohost

外部接続しようと思うと、 noroute , nohost とかいうエラーが出る。
原因は firewall らしい。
centos7 からは標準搭載とのこと。

これがあると外部接続できないので、切りましょう。

```ssh
systemctl stop firewalld
systemctl disable firewalld
```

これで外部接続できるようになります。
JavaScriptでRGBからLab色空間への変換

RGBからLab色空間に変換するJavaScriptスクリプトです。変換のアルゴリズムは以下のwikipediaのページを参考にしています。

- [sRGB#The reverse transformation - wikipedia](https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation)
- [Lab color space#CIELAB-CIEXYZ conversions - wikipedia](https://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions)

RGBからLabに変換するためのアルゴリズムを探してみたのですが、見つけることができなかったため、RGBからXYZに変換して、XYZからLabに変換といった事を行なっています。

```js:rgbToLab
function rgbToLab(r,g,b) {
	//https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation
	var r = r / 255;
	var g = g / 255;
	var b = b / 255;

	r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
	g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
	b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);

	var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
	var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
	var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);

	//https://en.wikipedia.org/wiki/Lab_color_space#CIELAB-CIEXYZ_conversions
	var L;
	var a;
	var b;

	x *= 100;
	y *= 100;
	z *= 100;

	x /= 95.047;
	y /= 100;
	z /= 108.883;

	x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (4 / 29);
	y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (4 / 29);
	z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (4 / 29);

	L = (116 * y) - 16;
	a = 500 * (x - y);
	b = 200 * (y - z);

	return [L, a, b];
}
```

## 関連リンク
- [JavaScriptでHSVからRGBに変換](633d1bf6baf008e82847)
- [JavaScriptでCIEDE2000色差計算](860f061a2ab7a4f2d06f)
- [JavaScriptでCIE94色差計算](3488df50b7082d4fcffb)
- [JavaScriptでCIE76色差計算](cda9b95395468ee7e0f8)
- [JavaScriptでユークリッド色差計算](28c7b61d6b8ca54c5b94)
- [色差アルゴリズムの違いをビジュアル化してみた](98c218bc5616eaaba9a0)
Wercker上でprivateリポジトリのsubmodule

- Wercker上でsubmoduleをclone ( `update --init` ) したい
- submoduleはbitbucket上のprivateリポジトリ

## 設定方法

### 1. Wercker上でSSHキー作成

### 2. 作成したSSHキーをbitbucketアカウントに追加

### 3. `wercker.yml` 調整

```yaml
build:
  steps:
    # ...
    #  `git` `openssh-client` がないboxの場合は事前にインストール
    - script:
        name: package install
        code: |
          yum install -y git openssh-client
    # see http://devcenter.wercker.com/docs/git/submodules
    - add-ssh-key:
        keyname: BITBUCKET_KEY
        host: bitbucket.org
    # see https://github.com/wercker/step-add-to-known_hosts
    - add-to-known_hosts:
        hostname: bitbucket.org
        fingerprint: 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40
        type: rsa
    - script:
        name: git submodule
        code: |
          git submodule update --init
```

- `keyname: BITBUCKET_KEY` 部分は「1. Wercker上でSSHキー作成」で設定したkeynameを設定

## 参考

- http://devcenter.wercker.com/docs/git/submodules
- https://github.com/wercker/step-add-to-known_hosts
Arduino > Link / 比較 > Operating / Input Voltage > SPI 5Vのものを物色

5V SPI入出力のMCUが気になってきた。

以前、[紹介いただいた](http://qiita.com/7of9/items/d878439a5c17cbebe3de/#comment-324ccc52fccf1447b142)STM32は5V SPIではないようだ。
https://strawberry-linux.com/pub/ds_stm32f103xx.pdf

やはりArduinoあたりだろうか。

Arduinoは色々種類があり、どれが5V SPIなのかよく分からない。

以下を見つけた。
https://www.arduino.cc/en/Products/Compare

Operating Voltageが5Vのものを選べば良さそうか。

ProやPro Miniはリビジョン?によってOperating Voltageが変わる点に注意が必要。

<hr>
Uno / Leonardo / MEGA 2560の比較
http://arms22.blog91.fc2.com/blog-entry-501.html
JQueryでリアルタイムプレビューっぽいものをつくる

前回の続きで、リアルタイムプレビューの理解をするため、メモを残します。
[Railsでmarked.jsを使用してみる](http://qiita.com/naoki85/items/0519694230f8a441c748)

# vue.jsに関して
マークダウンのリアルタイムプレビューで参考にさせていただいた記事では、`vue.js`を使用しておりました。
[Railsにマークダウンのリアルタイムプレビューを実装する](http://qiita.com/fujitora/items/425ed05d213dd07c6ab5)

私自身に知識がなかっただけなのですが、`vue.js`はフレームワークでした。
他のフレームワーク（ReactやAngular）と比べ、軽量で、View層にだけ焦点を当てている分導入コストが低い、とのことです。
詳しくはドキュメントをご参照ください。
[vue.jsのドキュメント](https://jp.vuejs.org/)

とはいえ、フレームワークであるならば、ふつうにJavaScriptやJQueryを使ってできるだろうと思い、勉強がてら作成してみました。

# コード
RailsへのJQueryインストールは割愛します。
参考にさせていただいたサイトは下記になります。
[jQueryで色々なフォーム入力値をリアルタイム取得する](http://www.kaasan.info/archives/1676)

まずはビューのHTMLです。
Railsの`scaffold`で作成されるフォームを少し修正したくらいです。

```html
<form>
  <%= form_for @post, :url => {:action => :create} do |f| %>
      <div class="form-group">
        <%= f.text_field :title , class: 'form-control', placeholder: 'タイトルを入力してください'%>
      </div>
      <div class="form-group">
        <div id='editor'>
          <textarea name="post[content]" class="form-control" rows="20"></textarea>
          <div id="marked-area"></div>
        </div>
      </div>
  <% end %>
</form>
```

続いて、Javascript（JQuery）側です。
最終的にはマークダウン出力したいので、関数名は`replaceMarkdown`となっています。

```js
$(function() {
  $("#editor textarea").each(function () {
    $(this).bind('keyup', replaceMarkdown(this));
  });
  function replaceMarkdown(elm) {
    var v, old = elm.value;
    return function () {
      if (old != (v = elm.value)) {
        old = v;
        str = $(this).val();
        $("#marked-area").html(str);
      }
    }
  }
});
```

# JSのコードに関して

まずは、対象の`textarea`に関して`keyup`イベントと関数をバインドさせます。
`keyup`はキーボードのキーが押され、上がった際に呼び出されます。
[JQuery 日本語リファレンス -keyup-](http://semooh.jp/jquery/api/events/keyup/fn/)

`keyup`されたタイミングで`replaceMarkdown`を呼びます。

ここで詰まったことが、この変数の宣言です。
[参考にさせていただいたサイト](http://www.kaasan.info/archives/1676)にてこの宣言をしておりました。

```js
var v, old = elm.value;
```
勝手に勘違いしておりまして、`v = old = elm.value`で読み進めておりました。
JQueryでは変数をこのように宣言できます。
（どうりでページロード時に`v`を出力させると`undefined`になるわけです。。。）

```js
var v;
var old = elm.value;
// ↓
var v, old = elm.value;
```
[jQueryを読むために知っておきたい6つの知識](http://techblog.kayac.com/jquery-codereading-tips.html)

あとは`v`と`old`を比較して、異なれば書き換えます。

```js
  function replaceMarkdown(elm) {
    var v, old = elm.value;
    return function () {
      if (old != (v = elm.value)) {
        old = v;
        str = $(this).val();
        $("#marked-area").html(str);
      }
    }
  }
```
なお、`marked.js`を使用してstrをマークダウンに変換すれば、ちゃんと出力されます。

```js
$("#marked-area").html(marked(str));
```
CUDAインストールの罠

CUDAとインストールには罠が多い。OS, グラフィックボード,　CUDA, 深層学習フレームワークのそれぞれのバージョンの違いでうまくいかないことが多すぎる。  
  
なので自分の失敗例をまとめておく。  
  
## Ubuntu16.04の外部カーネルの罠
今までUbuntu14.04を使っていたが、新しいLTSである16.04が出たので、こちらでやってみようと試した。  
まずは基本となるNVidiaのドライバーを入れねばならない。  
GPUによって入れるべきドライバは異なるので、[これ](http://qiita.com/salty-vanilla/items/8ff76cd634f0640b77c7)を参考にして入れる。  
今回の場合、GTX1080のUbuntuなので、nvidia-367をインストールした。  

```
sudo apt-get install nvidia-367
```

しかし、再起動すると、ログイン画面から進まなくなる。  
どういう状況かというと、正しいパスワードを入れても、すぐに画面が暗くなり、再びログイン画面に戻される。ログインループである。  sshではログインできる。
  
これは、さっき入れたグラフィックドライバが正しく動作していないからだ。  

> 16.04からubuntuのセキュアブート仕様が厳格になって、セキュアブートが有効の時は署名のないカーネルモジュールを読み込まなくなったみたいですね。
nvidiaのドライバーは署名のないカーネルモジュールとしてインストールされるので、セキュアブートを無効にするのが最も簡単な対処のようです。

https://forums.ubuntulinux.jp/viewtopic.php?id=18599  
  
これに尽きる。セキュアブートをdisableにすると、きちんとログインできた。  
  
## Ubuntu 16.04にはCUDA7.5がインストールができない？
CUDA7.5の公式ページには、Ubuntu14.04用と15.04用しかなく、16.04の選択肢がない。  
https://developer.nvidia.com/cuda-75-downloads-archive  
  
だが、一応２通りのインストール方法がある。  

### aptによるインストール
一つは、aptを使うやり方。  

```
sudo apt install nvidia-cuda-toolkit
```

登録されているパッケージが7.5なので、これを叩くとCUDA7.5がインストールできる。  

参考 
[Ubuntu 16.04へのCUDAインストール方法](http://qiita.com/yukoba/items/3692f1cb677b2383c983)  
  
しかしこの方法では、ChainerやTensorFlowでCUDAを利用できる方法が見つからず、どうしようもなかった。ネットを調べたが、このインストール方法は推奨されていないそう。  
なのでもう一つの方法をお勧めする。  
  
### 14.04用runファイルでインストール
どうやら14.04用のものでインストールできてしまうらしい。ソースは思い出せないが、ubuntuの人が、16.04と14.04は似てるから14.04用でもインストールできると書いてあった。  

[公式](https://developer.nvidia.com/cuda-75-downloads-archive)から14.04のrunファイルをダウンロード、実行権限与えて実行してあげるとうまくいく。  
  
PATHをちゃんと通してあげると、chainer等でも使えるようになる。  
  

参考
[Install Ubuntu 16.04 or 14.04 and CUDA 8 and 7.5 for NVIDIA Pascal GPU](https://www.pugetsystems.com/labs/hpc/Install-Ubuntu-16-04-or-14-04-and-CUDA-8-and-7-5-for-NVIDIA-Pascal-GPU-825/)


## GTX 1080にはCUDA8.0以上
CUDA7.5をインストールしてみてChainerのMNISTを実行させても、エラーが出てうまくいかなかった。  
エラーの内容及び調べたサイトは忘れてしまったが、内容としては、GTX1080ではCUDA7.5を使えないという内容だった。CUDA8.0以上が必要らしい。  
  
なので、CUDA7.5でしか動かないフレームワーク依存のライブラリは使えないので注意。
Alexa + IoT (esp8266) Custom ,アナログセンサー編

![IMGP6419.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/7d1bf168-ba54-3b06-4ae6-6c4bb1cf00dd.jpeg)

前回と同様のamazon Alexa関係となります

amazon Alexa と、esp8266連携で
custom Skill を追加し、
今回も、echo系の代用品は、echosim.io(モバイル版chrome) を使用しています

デモは、
設置場所のIoT-アナログ センサー値を、Alexa に読み上げ実行してもらうように
機能追加しています。(植物や農作作物の対応　)

会話の例：
呼ひかけ: [ask Moisture to check ]
Alexa : [ok, moisture is 56 % ,  time is 10 hour 48 minute. ]

*) 日本時刻も含む内容も応答内容に含まれていますが、おまけです。

*) esp8266モジュールは、arduinoマイコンも搭載し、ADCが数本使用可能な
　機種で、連携しています。

***
### Youtube
https://www.youtube.com/watch?v=Lk5_azTy-Fo


***
### Git:
checkMoisture:
https://github.com/kuc-arc-f/alexa-custom-esp8266-2

esp8266-Driver
https://github.com/kuc-arc-f/makeKuc-moisture1


### 回路図
![ss-moi-SCH-0207a4.png](https://qiita-image-store.s3.amazonaws.com/0/159710/47f1b6b2-23f8-9cd9-c3c0-8508fd43ee62.png)

***
### 関連のページ： Alexa + IoT (esp8266) Custom Skill (1)
http://qiita.com/knakaqi/items/f656804d64fc89ffc936
***
### 関連のまとめ：Alexa + IoT のリンク集となります。
http://kuc-arc-f.com/make/?p=1262
***
Virtualbox に IE デバッグ用windowsをインストールして設定したメモ


普段はVirtualBox上にサイトのマシンを起動させて作業しているのですが、IEデバッグが必要になったのでメモ書き。(追記あると思う）

おおむね、[MacでIEのブラウザテストをする方法](http://minto.tech/mac-ie/)で書かれていることです。

Vagrant で開発しているサイトに、ここでダウンロードしたIEからアクセスするための設定が必要なので書いています。VagrantのIPは`192.168.33.22`とします。

最後のネットワーク設定だけ補足した文章です。

# ダウンロード

IE8からIE11,Edge10Stable などを選択できます。

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

`Select platform`を`VirtualBox`を選択してダウンロードします。

今回は`IE8 on Win7`をダウンロードしました。

# VirtualBox にインポート

1. VirtualBoxを開きます
2. メニューから`仮想アプライアンスのインポート`を選び、ダウンロードして展開したファイルを選びます。

ライセンス切れ等で使えなくなった場合は、VMを削除した後で、この作業をすればいいと思います。

# 起動する前にネットワーク設定

インストールした直後に設定が必要です。

1. 「IE-8 Win7」の「設定」→「ネットワーク」→「アダプター2」を選択します。
2. 「ネットワークアダプターを有効化」し、割り当てを「ホストオンリー」にします。

OK ボタンを押し、起動をします。

# 起動後のネットワーク設定

1. タスクメニューから「Network and Shareing Center」を選び、「Local Area Connection 3」を選びます。
2. 「Properties」で画面を開く「Internet Protocol Version 4」を選び、「Properties」ボタンを押します。
3. 「Use the following IP address」を選択して、IP Addressを「192.168.33.2」Default gatewayを「192.168.33.1」にします。
4. OKボタンを押して、ブラウザで「192.168.33.22」等と打ち込んでアクセスできることを確認してください。

とりあえず以上です。
ターミナルで参照してるフォルダをファインダーに表示。

macです。
/private/etcのxxxxというファイルを開きたい。
/private/etcどこやねんって時に。

とりあえずfinderで表示したかっただけなので、以下で　ok


	$ cd /private/etc
	$ open .


>  参考
> https://book.mynavi.jp/macfan/detail_summary/id=27268
Linux(Cent OS)でSSL証明書の有効期限をチェックするスクリプト

ApacheなどのWebサーバーやPostfixなどのMTA、iOSのPush Notification(Push通知)の送信などに利用するためのSSL証明書の有効期限をチェックして、期限切れが近くなったらメールを送信して有効期限を通知するためのスクリプトです。
crontabなどから定期的に実行することで証明書の有効期限WARN_DAYS以下で有効期限が残っているうちは1日に1回、有効期限が切れているならcronで実行される度にスクリプト中で指定されたメールアドレスに通知メールを送信します。

```bash:check_certificates.sh
#!/bin/bash

. ./sendmail.sh

today=`date '+%s'`
hostname=`hostname`
# SSL証明書の場所 (複数ある場合はスペースで区切って連記)
CERT_FILES="/etc/letsencrypt/live/host.example.domain/cert.pem"
# 残りの有効期限が7日間になったら警告
WARN_DAYS=7
for cert_file in ${CERT_FILES}; do
  cert_md5sum=`echo -n ${cert_file} | md5sum | cut -d' ' -f1`
  expire_date=`openssl x509 -text -in ${cert_file} -noout -dates|grep "Not After"|sed -e 's/.*Not After : //'`
  expire=`date -d "$expire_date" '+%s'`
  if [ $today -gt $expire ]; then
    # すでに証明書の期限が切れている
    from="root@host.example.domain"
    to="admin@host.example.domain"
    cc=""
    bcc=""
    subject="SSL証明書の期限が切れています"
    contents="サーバー(${hostname})にインストールされているSSL証明書(${cert_file})の期限が$expire_dateで切れています。\n至急新しい証明書を取得してインストールしてください。"
    sendMail "$from" "$to" "$cc" "$bcc" "$subject" "$contents"
    if [ $? -eq 1 ]; then
      echo "Send E-Mail failure"
      exit 1
    fi
    echo "Send E-Mail success"
  else
    # まだ証明書の期限まで日数が残っている
    leftdays=$((($expire-$today)/86400))
    echo "leftdays:$leftdays"
    if [ -f /var/tmp/${cert_md5sum}_cert_leftdays ]; then
      # 前回警告を行なった際の有効期限の残日数を取得
      prev_leftdays=`cat /var/tmp/${cert_md5sum}_cert_leftdays`
    else
      prev_leftdays=0
    fi
    if [ $prev_leftdays -ne $leftdays ]; then
      # 前回の警告より残日数が変化していればそれを記録して再度警告
      echo $leftdays > /var/tmp/${cert_md5sum}_cert_leftdays
      if [ $leftdays -lt ${WARN_DAYS} ]; then
        from="root@host.example.domain"
        to="admin@host.example.domain"
        cc=""
        bcc=""
        subject="SSL証明書の期限が近づいています"
        contents="サーバー(${hostname})にインストールされているSSL証明書(${cert_file})の期限があと$leftdays日です。\n期限までに新しい証明書を取得してインストールしてください。"
        sendMail "$from" "$to" "$cc" "$bcc" "$subject" "$contents"
        if [ $? -eq 1 ]; then
          echo "Send E-Mail failure"
          exit 1
        fi
        echo "Send E-Mail success"
      fi
    fi
  fi
done
```

上記スクリプトでは以下のメール送信用のスクリプトを呼び出します。

```bash:sendmail.sh
#!/bin/sh

sendMail() {
    from="$1"
    to="$2"
    cc="$3"
    bcc="$4"
    subject="$5"
    contents="$6"

    inputEncoding="utf-8"
    outputEncoding="iso-2022-jp"
    subjectHead="=?$outputEncoding?B?"
    subjectBody="`echo "$subject" | iconv -f $inputEncoding -t $outputEncoding | base64 | tr -d '\n'`"
    subjectTail="?="
    fullSubject="$subjectHead$subjectBody$subjectTail"
    mailContents="`echo -e \"$contents\" | iconv -f $inputEncoding -t $outputEncoding`"

cat << __MAIL_CONTENTS__ | /usr/sbin/sendmail -- $to
From: $from
To: $to
Cc: $cc
Bcc: $bcc
Subject: $fullSubject
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

$mailContents
__MAIL_CONTENTS__

    return $?
}
```
Homebrewをアップデート(brew update)したら、エラー


## 事の発端

[yarn](https://yarnpkg.com/)の導入を考えておりそろそろ使ってみようと思い、久しぶりに`brew update` したら、エラー。
相変わらずの日々エラーでございます。 

## brew updateしてみた

出ました、エラー。
mergeできません的な感じでしょうか。

```
% brew update
error: The following untracked working tree files would be overwritten by merge:
  Library/Homebrew/extend/enumerable.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull --quiet origin refs/heads/master:refs/remotes/origin/master

```


## 対応法
fetchしたあとにリモートの最新を上書きする。
※`cd /usr/local` は`cd $(brew --prefix)`でも可能。

```
$ cd /usr/local
$ git fetch origin
$ git reset --hard origin/master
```

## 再度、brew update

アップデートが無事、完了できたらバージョンの確認。

```
% brew -v
Homebrew >1.1.0 (no git repository)
Homebrew/homebrew-core (git revision f8a0; last commit 201X-XX-XX)
```


## 参照

[brew update fails #5128](https://github.com/Homebrew/legacy-homebrew/issues/5128)
Browserifyでのビルドでモジュールへのフルパスが混入する問題への対応

# 発生した事象
browserifyでビルドしたファイルに
```
_where : "user/local/path"
```
といったパスが混入されている箇所が幾つかある。

# 原因
調べるとmoduleによってはインストール先をpackage.jsonにインストール時に保存して、それをrequireで取り込んでいるものがあるらしい。しかも機能的には使われておらず削除しても問題ない。

ref. https://github.com/indutny/elliptic/issues/106

# 対応
`package-json-versionify` を使ってversion情報以外読み込めなくする対応をいれることにした。`package-json-versionify` をインストールしてビルドタスクに組み込む。

```
var versionify = require('package-json-versionify');

中略

  browserify({entries: [srcPath]})
    .transform({ global: true }, versionify)

以下略
```

globalで動くようにしないと機能しないので他への影響もないか注意する。

これによりpackage.jsonをrequireしたときversion情報しか取り込めなくなり、ビルドしたファイルにパスが入らなくなる。

# 最後に
ビルドされたソースは挙動が問題なくとも内容は確認しましょう。
Alexa + IoT (esp8266) Custom (1)

![IMGP6414.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/8dd78ae3-9a97-06d0-10e0-c0b24369529d.jpeg)

amazon Alexa関係となります

amazon Alexa と、esp8266連携で
custom Skill を追加し、
今回も、echo系の代用品は、echosim.io(モバイル版chrome) を使用しています

デモは、
設置場所のIoT センサー値を、Alexa に読み上げ実行してもらうように
カスタマイズしています。

会話の例：
呼ひかけ: [ask Sensor to check ]
Alexa : [ok, temperature is 17 degree, and humidity is 44 % , now time is 10 hour 48 minute. ]

*)
日本時刻も含む内容も応答内容に含まれていますが、おまけです。
***
### Youtube
https://www.youtube.com/watch?v=IUOTHY_mWp4

***
# 構成
![ss-custom-1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/0a1f9193-5833-491c-1679-fd8de85a86ab.png)

alexa は拡張方法として、
Skill Kit が利用可能で、この場合　問合せ系の機能で
custom Skill を使っています。

custom Skillから、Lambda function 呼出までは、事例でよくありそうでしたが、
今回は IoT連携部分は、Lambdaから Rest-APIで、ec2などのweb serverから
センサー値を取得し、alexa に渡してもらいます。
センサー値は事前に esp8266から、web serverのストレージ側に定期更新させておき、
最新データを、alexa に出力可能な構成としています。

*) esp8266の周辺センサはdht11 で、温度/湿度が計測可能でクラウド連携も可能

# code
公式ヘルプや、先人様の記事を参考にしています。
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-lambda-function

*) 環境面は、下記にログインして作業が必要です。
alexa Skill Kti : developer amazon ( developer.amazon.com  )
Lambda : AWS ( aws.amazon.com )　のマネジメントコンソール

(1) 参考のサンプル, node.js版
https://github.com/amzn/alexa-skills-kit-js

helloWorld:
samples/helloWorld/ --カンタンな[hello world] 応答するサンプル、
設定手順や、コードが参考になりました。

[custom Skill 設定 ]：
name : helloWorld
InvocationName : hello world
*) alexa の呼出に関係するキー単語

Interaction model/ intent Schema:
https://github.com/amzn/alexa-skills-kit-js/blob/master/samples/helloWorld/speechAssets/IntentSchema.json

Interaction model/ sample Utterances:
https://github.com/amzn/alexa-skills-kit-js/blob/master/samples/helloWorld/speechAssets/SampleUtterances.txt
*) custom Skill を呼出す、単語パターンみたいなもの？

configuration:
endPoint: Lambda functionを呼び出す指定が必要。

[ Lambda function ]
src/
下のコードを zip圧縮して、デプロイしておきます

テストは、echo系デバイス/ /echosim.io で使用可能です。

tell, Hello world to say hello
ask, Hello world to say hello
と、alexa に話しかけると。[hello world]と返答してくれます。


*) IoT連携部分の実装は、次回で説明したいと思います。
http://qiita.com/knakaqi/items/fa201a0053fe9dd2d016

***
### 関連のまとめ： Alexa + IoT のリンク集となります。
http://kuc-arc-f.com/make/?p=1262
コマンドラインからWiFi経由iPhoneバックアップをキックする方法

### iPhoneをUSBでMacに繋ぎ、iTunesの「WiFi経由でこの iPhone と同期」にチェックを入れる。

<img width="1100" alt="iTunes.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/5fbbe689-2ac5-365a-e119-492df8f0efe0.png">

### iPhoneをUSBから外す。

### 下記スクリプトをbackup-iphone.scptという名前で作成する。
 
```applescript:backup-iphone.scpt
tell application "iTunes"
  update
end tell
```

### 下記コマンドをターミナルから実行する。

```
osascript backup-iphone.scpt
```

![2017-02-08 10.56.53.gif](https://qiita-image-store.s3.amazonaws.com/0/889/3764e89b-fc6e-e7ee-cfcc-ef2d77917c35.gif)
Alexa + IoT (esp8266) Custom Skill(2) IoT連携

![IMGP6414.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/15edde08-0dcc-7938-73eb-cbd339fc9315.jpeg)

### 前回と同様のAlexa関係となります

前回は、custom Skill実装の概要やサンプルの説明でした
今回は、IoT連携部分の説明としています。

### code :
参考のGit : https://github.com/kuc-arc-f/alexa-custom-esp8266-1
Lanmbda function (python): Lambda-function.py

lambda_handler から、on_intent()が呼ばれ、
intentName検証後、rest-API経由でセンサー値と取り出し
Alexaに　出力メッセージ渡しています。

*) cutom skill 設定：
Invocation Name: sensor

IntentSchema:
text/IntentSchema.json

sampleUtterrances:
text/sampleUtterrances.txt

rest-API のresponse:
text/rest-data.json
*) esp8266からの更新処理を追加し、
 jsonレスポンスを出力する機能の準備が必要です。

### esp8266 ドライバ:
/esp8266

### Youtube:
前回と同じ動画ですが、最終目標として、キーワードを音声入力して
alexaに IoT連携センサー値を、発言してもらうデモとなります。

https://www.youtube.com/watch?v=IUOTHY_mWp4
***
### 関連のページ： Alexa + IoT (esp8266) Custom Skill (1)
http://qiita.com/knakaqi/items/f656804d64fc89ffc936

***
### 関連のまとめ：Alexa + IoT のリンク集となります。
http://kuc-arc-f.com/make/?p=1262
CHIRIMENにfundoshiを装着する

> この記事は[fabble](http://fabble.cc/tadfmac/chirimen-fundoshi)に投稿した記事を再編したものです。

# errata（正誤表）

Fundoshiの印字に誤りが見つかりました。
次のVersionで修正予定です。

## v0.1のみ

- CH1-8 が `198d` となっているが、`197d`の誤り

## v0.1、v0.11共通

- CH1-4 が `283d` となっているが、`283u`の誤り
- CH1-5 が `284u` となっているが、`284d`の誤り

# Summary

本記事はCHIRIMENへの[fundoshi](https://github.com/chirimen-oh/Cases/tree/master/fundoshi)の装着手順です。

## fundoshiとは?

CHIRIMEN用ケースの一種です。

![fundoshi](http://chrmn.dfm.lrv.jp/blog/fundoshi/fundoshi-image.jpg)

ケースといっても底面のカバーしかしませんが、様々な場所に気軽に置けるようになります。また、GPIOピンのガイドが印刷されているので、ちょっとだけ便利です。

> v0.1は GPIO-197が GPIO-198と印字されている不具合があります。v0.11で修正済みです。

fundoshiはプリント基板製造サービスを利用して簡単に製造できます。[elecrow](https://www.elecrow.com/)にすぐに発注可能なデータ含めて下記リポジトリで公開していますので、どなたでも自由に製造することが可能です。

https://github.com/chirimen-oh/Cases/tree/master/fundoshi

# 材料

![parts.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/parts.jpg)

- CHIRIMEN × 1
- [fundoshi](https://github.com/chirimen-oh/Cases/tree/master/fundoshi) × 1
- ネジ (M2 4mm長) ×4
- ナット (M2) × 2
- 長ナット (M2) 5mm長× 2
- スペーサー※ (M2) ナット部分が5mmのもの × 2 

※長ナットの片側がオスネジになっているもの

ネジ、ナット、スペーサーは、すべて秋葉原にある[西川電子部品さん](http://nishikawa.or.tv/)で入手可能です。

### ネジ、ナット、スペーサー詳細

![boltnut.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/boltnut.png)

## 工具

- プラスドライバー(ネジに合うプラス部分が小さめなもの)
- ピンセットタイプのラジオペンチ

# つくりかた

1. fundoshiのDummy holeに長ナットとネジを付ける（2箇所）
2. CHIRIMENにスペーサーとナットを付ける（2箇所）
3. CHIRIMENとfundoshiをThru holeで接続する

## (確認) fundoshiの穴について

fundoshiには2mm径の穴が4箇所あります。
穴は2種類あります。dummy holeと thru hodeです。

![holes.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/holes.png)

- thru hole : CHIRIMENとfundoshiを接続する穴です。
- dummy hole : こちらはCHIRIMENがガタつかないよう支える足になります

## Step 1. fundoshiのDummy holeに長ナットとネジを付ける（2箇所）

![step1.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/step1.png)

まず、fundoshiの底面側からいDummy holeにネジを通して反対側から長ナットで留めてください。
2箇所ともとめます。

> **コツ**
> ネジを穴に刺してから長ナット側を回します。最後はネジをドライバーでしっかりしめましょう

## Step 2. CHIRIMENにスペーサーとナットを付ける（2箇所）

今度は、CHIRIMEN側に先につけた方が作業がやりやすいです。
CHIRIMEN側の底面からスペーサーを差し込んで、ナットで留めてください。
ナットを指で押さえてスペーサーを回せば手で付けられます。

![step2.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/step2.png)

## Step 3. CHIRIMENとfundoshiをThru holeで接続する

![step3.png](http://chrmn.dfm.lrv.jp/blog/fundoshi/step3.png)

最後に、CHIRIMENをfundoshiの上に重ねて、Thru Holeをネジで留めましょう。
2箇所できたら完成です〜！

# 参考

- [elecrow](https://www.elecrow.com/)
- [西川電子部品](http://nishikawa.or.tv/)
docker-compose で立ち上げたコンテナの IP アドレスを調べる

## やり方

docker run コマンドとかでネットワークを指定せずに立ち上げたコンテナの IP アドレスは、

```
docker inspect -f "{{.NetworkSettings.IPAddress}}" CONTAINER
```

で調べることができるが、docker-compose で立ち上げたコンテナとかは専用のネットワークに所属するので、

```
docker inspect -f "{{.NetworkSettings.Networks.NETWORK.IPAddress}}" CONTAINER
```

とする必要があった。

## 動作確認したメモ

```
$ cat docker-compose.yml 
version: "2"
services:
  test:
    image: ubuntu
    command: tail -f /dev/null

$ docker-compose up -d
Creating network "test_default" with the default driver
Creating test_test_1

$ docker inspect -f '{{.NetworkSettings.Networks.test_default.IPAddress}}' test_test_1
172.23.0.2

$ docker-compose down
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
```
「プログラミング」と「趣味」を結びつけたら楽しくなるのか検証してみた。


仕事はIT屋です。
JavaやらRubyやらでプログラム書いてるんですが、楽しさを見出したい。

趣味は料理です。
料理してる時って何も考えずに、手だけ動かせばいいので好きなんですよね。

料理感覚でプログラミングって出来ないかな...

##今日のレシピは「ハンバーグ」
**ﾊﾝﾊﾞｧｧｧｧｧｧｧｧｸﾞ!!!!!!!!**

###材料
- タネ
    - ひき肉
    - たまねぎ
    - 卵
    - パン粉
- ソース
    - ケチャップ
    - ウスターソース
    - 赤ワイン
    - 蜂蜜

###工程
1. タネを混ぜる
2. 1を焼く
3. ソースを煮詰める
4. 焼けたハンバーグを皿に乗せる
5. ソースをかける

簡単だね。

##それでは早速。

今回はJavaで作っていきます。  

```java
// ハンバーグ調理クラス
// - 各調理工程のクラスはあるものとして継承する
// - お皿クラスもあるものとする
class CookingHamburgSteak extends Cooking {
  public static void main( String[] args ) {
    // 焼く
    Seed beakedSeed =
        super.beak( new Seed() );
    // 煮詰める
    Sauce boilDownSauce =
        super.boilDown( new Sauce() );
    // 盛り付ける
    Dish dish = new Dish();
    dish.on( beakedSeed );
    dish.on( boilDownSauce );
    // 食べる
    System.out.println( dish.isBeautiful() ? "looks so good!!" : "looks so bad..." );
    System.out.println( dish.isTaste()     ? "yummy!!"         : " yucky..." );
  }
}

// ハンバーグのタネ
// - 各材料のクラスはあるものとする
class Seed {
  // field
  private Meat meat;
  private Onion onion;
  private Egg egg;
  private Breadcrumbs breadcrumbs;
  // getter
  // (･･･面倒なので省略･･･)
  // setter
  // (･･･面倒なので省略･･･)
}

// ハンバーグのソース
// - 各材料のクラスはあるものとする
class Sauce {
  // field
  private Ketchup ketchup;
  private Worcestershire worcestershire;
  private RedWine redWine;
  private Honey honey;
  // getter
  // (･･･面倒なので省略･･･)
  // setter
  // (･･･面倒なので省略･･･)
}

```


##結論
プログラミングで料理しても楽しくない。
電子工作 > SPI > MISOをuC接続時にノイズが全ラインに載る

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
```

関連 http://qiita.com/7of9/items/49d7a462732cbd41cb82


RPiにてSPIのクロックを出力できるようになった。

試用中のセンサーはCSBをLowにしてからSCKのラインにクロックを生成すると、MISOに応答があるというもの。
SCKのクロックは50kHzから800kHzの範囲。

uCへMISOライン未接続時はMISOライン(センサー側)のラインは応答が見られた。

![F0000TEK.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/29ab9c66-5f8f-17db-d212-c75a1ac3b3a9.jpeg)

一方で、uCへMISOラインを接続時は、ノイズが全ラインに載るようだ。

![F0001TEK.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/cd19a24e-2ab6-7500-3990-586a426814bc.jpeg)

データシートにはMISO, SCK, CSBラインすべての1kΩ以上のプルアップ抵抗を付けるように、とある。
こちらの基板では、3.3Vから5Vにレベル変換をして、5Vのセンサーと通信をしている。
レベル変換IC前後にプルアップ抵抗(15kΩ)を接続したが、問題は解消しない。

次はどうするか。

## ロジックレベル双方向変換モジュール交換後
(追記 2017/02/10)

@ozwk さんに[紹介いただいた](http://qiita.com/7of9/items/95dc68315088d32b3413/#comment-eaebfd198c314a622f07)ロジックレベル双方向変換モジュールを使用開始しました。
また、3.3Vから5V昇圧をやめて、5Vは別途供給したものを使用開始。

センサ側(5V駆動)のCSB(オレンジ色), SCK(水色), MISO(紫色)が以下です。
MISOの電圧変化を見るため、2本の水平線カーソルを表示。

![F0000TEK.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/69a9a4be-8993-3b39-02bf-e5800b65d670.jpeg)

![F0001TEK.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/d4aee456-ebcd-9896-c718-0bfab94240b3.jpeg)

以下の二点を解消しないといけません。

- MISO(紫色)のLowレベル電圧が0Vと2.2Vの二種類ある
- MISO(紫色)の(Highレベル - Lowレベル)電圧差が2.2V程度しかない (5Vが正常)

SCKの周波数は、50kHzと800kHzで上記の結果は同じ。
vmwareリストア手順

# 1 既存データ(フォルダ)をフォルダ.oldに変更
# 2 backupNFS→datastore1にフォルダ事移動させる
# 3 vsphereからデータストアブラウザを開いて対象フォルダ(henkan)の～.vmxを右クリックの「インベントリへの追加」をする。
　　ウィザードを続行して仮想マシンを追加します。
Digdagの変数定義をincludeする際にincludeされ側はインデントは不要

http://qiita.com/pilot/items/98d464d5a4301baec19b の続き

```parent.dig
_export:
  !include : params/params1.dig
    # サブディレクトリにないと"includes unknown keys"エラーになる
+task1:
  _export:
    !include : params/params2.dig
  echo>: ${a} ${b} ${c} ${d}
+task2:
  echo>: ${a} ${b}
    # ${c} ${d}は"not defined"エラーになる
```
```params/params1.dig
a: aaa
b: bbb
```
```params/params2.dig
c: ccc
d: ddd
```
```shell-session
$ digdag run parent.dig
2017-02-08 10:29:21 +0900: Digdag v0.9.3
～略～
2017-02-08 10:29:29 +0900 [INFO] (0016@+parent+task1): echo>: aaa bbb ccc ddd
aaa bbb ccc ddd
2017-02-08 10:29:30 +0900 [INFO] (0016@+parent+task2): echo>: aaa bbb
aaa bbb
```
xzをマルチスレッドにしたら爆速になった

xzは5.2からマルチスレッド対応になったと聞き
Ubuntuで簡単に導入できないか検証しました。
調査したところXestyであれば5.2に対応しております。

#インストール(Ubuntu16.04の場合)
```
sudo vi /etc/apt/sources.list.d/xesty.list
+ deb http://jp.archive.ubuntu.com/ubuntu/ zesty main restricted
+ deb http://security.ubuntu.com/ubuntu zesty-security main restricted

sudo vi /etc/apt/preferences.d/xz
+ Package: *
+ Pin: release n=xenial
+ Pin-priority: 501
+ 
+ Package: xz-utils liblzma5
+ Pin: release n=zesty
+ Pin-Priority: 502

sudo apt-get update
sudo apt-get install xz-utils
xz --version
```

#インストール(CentOS6の場合)
```
cd /tmp
wget http://tukaani.org/xz/xz-5.2.3.tar.bz2
tar xzvf xz-5.2.3.tar.bz2
cd xz-5.2.3
yum groupinstall 'Development tools'
./configure
make
make install
xz --version
```

#測定
検証機は32コアと8コア、速度が安定するようSSDにしてあります。
検証にはmysqldumpを先頭1Gだけ切り出したものを使用しました。
`xz -v --threads=32 ファイル名`という風に使います。
`cat 入力ファイル名 | xz --threads=32 > 出力ファイル名`
にしても速度は変わりませんでした。

gzipはシングルスレッドなので
pigzにしないと本来は不公平なのかな？

#結果

##32コア
| 圧縮 | 時間 | サイズ | 速度比 |
|:----|-----:|-------:|------:|
| xz(5.1.1) | 7:30 | 158,246,724 | 100.0% |
| xz(5.2.2) | 7:01 | 158,246,724 | 104.5% |
| xz(マルチスレッド) | 0:46 | 158,608,200 | 1434.7% |
| gzip | 0:34 | 244,416,462 | 1941.1% |

##8コア(別環境)
| 圧縮 | 時間 | サイズ | 速度比 |
|:----|-----:|-------:|------:|
| xz(5.2.3) | 15:47 | 158,246,724 |  100.0% |
| xz(マルチスレッド) | 2:33 | 158,608,200 | 620.0% |
| gzip | 1:08 | 244,416,458 | 1392.6% |

##32コア
| 解凍 | 時間 | 速度比 |
|:----|-----:|------:|
| xz(5.2.2) | 0:14 | 100.0% |
| xz(マルチスレッド) | 0:14 | 100.0% |
| gzip | 0:06 | 233.3% |

##8コア(別環境)
| 解凍 | 時間 | 速度比 |
|:----|-----:|-------:|------:|
| xz(5.2.3) | 0:27 | 100.0% |
| xz(マルチスレッド) | 0:27 | 100.0% |
| gzip | 0:20 | 135.0% |

#まとめ
いかがでしょうか。サイズが若干増えましたが8コアあれば実用速度になったのではないでしょうか。

MySQLのInnoDBなら32コアまでなら確実にスケールするので1個16CPUのMySQLサーバを用意してNUMAを回避
足りなくなってきたら2個目の16CPUを用意とかいかがでしょう。
なお、負荷からすると切り離さないとこの負荷ではユーザの接続が不安定になりますね。
バックアップはまず使わないものなのでxzにするのはいかがでしょうか。
filezillaでロリポップサーバーに接続する

ロリポップサーバーに接続するときの覚書。

使うソフト:　 filezilla
接続するサーバー: ロリポップで契約しているサーバー

| 一般             |  |
|:-----------------|:------------------|
| ホスト            |ＦＴＰＳサーバー|
| プロトコル         |FTP-ファイル転送プロトコル|
| 暗号化            |明示的なFTP over TLSが必要|
| ログオンの種類      |通常|
| ユーザー          |ＦＴＰ・WebDAVアカウント|
| パスワード         |設定したFTPパスワード|


| 転送設定             |  |
|:-----------------|:------------------|
| 転送モード            |パッシブ|


> 参考
> http://ameblo.jp/winmikan/entry-11154196886.html
rails consoleでコマンド実行時のbcryptに関するエラーとその対処法

Ruby on Railsの勉強として[railsチュートリアル](https://railstutorial.jp/)を進めていたのですが、
7章付近で詰まったので経緯をメモしておく。

##ざっくりrailsチュートリアルについて
このチュートリアルでは、
Twitterもどきみたいなミニポストアプリケーションを作成しながら、railsアプリケーション作成の基本的な流れを抑えるのがゴールとなっていて、
その中にはユーザー登録、ログイン機能の実装も当然含まれます。
パスワードを安全に管理する必要があるわけでして、
そのためにbcryptライブラリをgemでインストールして使用します。

##手順
インストール手順自体はものすごく簡単です。
Gemfileに追加したいライブラリとそのバージョンを追加してコマンドを実行するだけ。

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails',        '5.0.0.1'

gem 'bcrypt',         '3.1.11' #追加
.
.
.
```

```
$ bundle install
```
これ自体は他の言語にもあるので難しいものではないです。Composerとか。

##bcryptがあるのにないと言われる

インストール完了後、`rails console`というrailsの対話ツールを開き、コードを実行しようとした時でした。

```
>> user = User.first
You don't have bcrypt installed in your application. Please add it to your Gemfile and run bundle install
.
.
.
```

・・・なんでやねん。
間違いなくGemfileにbcrypt書き加えてインストールしたんだけどなあ。
調べてみると、おなじようにチュートリアルを進め、嵌った方がたくさんいらっしゃって、
「Weblickの再起動」など色々載っていたのですが、解決には至りませんでした。

##解決策
色々みているうち、Gemfile.lockにbcryptが記述されていないことに気がついた。
Gemfile.lockについては参考を参照して頂きたいのですが、
要は

**「bcryptの依存性を解決しないまま実行しようとした」**

ということなんだと思います。たぶん。
なぜ最初のインストール時に実行されなかったのは謎ですが、
しょうがないので、bcryptを再インストールしました。
手順は以下です。

- gemfileからbcryptの箇所をコメントアウトする
- `bundle install`する
- コメントアウトを解除して再度`bundle install`する

こうしたら、

```
$ rails console
Running via Spring preloader in process 1744
Loading development environment (Rails 5.0.0.1)
>> user = User.first
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2017-02-07 07:18:22", updated_at: "2017-02-07 13:40:30", password_digest: "*************">
>>
```

ちゃんと実行されました。よかった。

・・・ただ、これが根本的な解決要因だったかと言われると、微妙なので、他の対処法も調べてみることをお勧めします。
幸い情報はたくさんありますので。

##参考
bcryptについて
[BCrypt(Blowfish暗号)について調べたので文書化してみました](https://yuskamiya.tumblr.com/post/100503173956/bcryptblowfish%E6%9A%97%E5%8F%B7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%9F%E3%81%AE%E3%81%A7%E6%96%87%E6%9B%B8%E5%8C%96%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F)

Gemfile, Gemfile.lockについては以下が参考になります。
[GemfileとGemfile.lockの簡単なお話](http://normalse.hatenablog.jp/entry/2015/11/14/135835)
[Gemfile | Bundler日本語ドキュメント | Ruby STUDIO](http://ruby.studio-kingdom.com/bundler/gemfile/)
[Bundlerを使ったGemパッケージの管理 - Ruby on Rails入門](http://www.rubylife.jp/rails/ini/index2.html)
SQLiteとSystem.Data.Linq.Mappingで自動インクリメント

C#のSystem.Data.Linq.MappingでSQLiteを操作しようとして右往左往したのでメモ

# INTEGER PRIMARY KEY AUTOINCREMENT

生のSQLを実行する場合は、**AUTOINCREMENT**を付けてないと自動インクリメントされない。

# Linq

C#のSystem.Data.Linq.Mappingで自動インクリメントさせたい場合は、DB側で**AUTOINCREMENT**を外して、C#側で**IsDbGenerated = true**を外して型をNullableにする。

# 参考

[c# - Error using System.Data.Linq.Mapping and auto incrementing the primary key in a sqlite db - Stack Overflow:](http://stackoverflow.com/questions/31665788/error-using-system-data-linq-mapping-and-auto-incrementing-the-primary-key-in-a)
poltergeistでステータスコードが304が返ってくる場合の対処法

## 問題

Railsのfeature specでのステータスコードの検証の箇所にて、今まで200を返していたのに急に304を返す様になりました。

社内で相談したところ、PhamtomJSのバージョンアップしたとかない？と言われたので、調べたら、どうもそれが原因のようでした。
かといって、バージョンを古いまま固定するのも嫌なので、新しいバージョンでも200を返すようにする方法を調べました。

同じ内容で困っていた方の投稿を見つけました。

[phantomjs 2.0.0以降にするとpoltergeistでstatus_codeが304になることがある](http://ja.stackoverflow.com/questions/21706/phantomjs-2-0-0%E4%BB%A5%E9%99%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8poltergeist%E3%81%A7status-code%E3%81%8C304%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8B)

> phantomjs 2.1.1 では 1.9.8 では送信されなかった If-None-Match が送信されるようになっていて、Rack::ConditionalGet と Rack::ETag で 304 Not Modified になっていたようです。
> test environments だけ 304 になるので、もう少し調べてみたところ、production や development では csrf_meta_tags が毎回違うので 304 にならずに 200 になっていました。
> そこで config/environments/test.rb で config.action_controller.allow_forgery_protection = false と設定されているのをコメントアウトしたところ、304 にならなくなって解決しました。

ということのようです。が、しかし、この設定にすると、`link_to`ヘルパーメソッドで`method: :delete`を使っているところが動かなくなり、他のテストが落ちまくりました。

## 対処法

poltergeistに、ページキャッシュをクリアするメソッドが追加されていました。
それを使うと、キャッシュがないため304を返さず、再び200を返すようになります。

```rb
page.driver.clear_memory_cache
```

再度ページにアクセスする直前にこのメソッドを実行しましょう。

## 参考ページ

- [phantomjs 2.0.0以降にするとpoltergeistでstatus_codeが304になることがある](http://ja.stackoverflow.com/questions/21706/phantomjs-2-0-0%E4%BB%A5%E9%99%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8poltergeist%E3%81%A7status-code%E3%81%8C304%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8B)
- https://github.com/teampoltergeist/poltergeist/issues/719
- https://github.com/teampoltergeist/poltergeist/pull/767
line monitor > 情報表示部分 (v0.8) > (固定IPアドレス設定 + 有線ケーブル未接続)時にWiFiのIPアドレスが表示できるように対応

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
```

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

v0.4-v0.7
http://qiita.com/7of9/items/0f66fa3b09a0dd444c86#_reference-8aefea568bdd47ef958d

## 概要

[7セグメントLEDシールド (自作)](http://qiita.com/7of9/items/33296849786e38ff3467#_reference-4c304bc23e60a23260b4
)にて使用中のIPアドレスを表示するようにしている。

これにより、キーボード、マウスを接続せず、`ssh -X`接続にてCentOSなどからX転送をして使用しやすい (接続先のIPアドレスが分かる)。

## v0.8の変更

[v0.8 @ github](https://github.com/yasokada/python-151127-7segLed_IPadrDisplay/releases/tag/v0.8)

`/etc/network/interfaces`にてeth0の固定IPアドレス設定をして使い始めた。

- 追記 2019-02-06 
    - [2019-02-06 Raspberry Pi 3 Model B > セットアップ (raspbian Stretch) > 固定IP設定 + SSH接続設定 + lxsessionでの開通確認](https://qiita.com/7of9/items/10ee85777757c3426f88)に記載の通り、`/etc/dhcpcd.conf`にて固定IPアドレス設定をする場合もある

この場合、eth0の優先ケーブル未接続時にもeth0のIPアドレスが表示されてしまう。

wlan0のIPアドレスが表示して欲しい。

以下のように対応した。

### 変更前

```IPadrDisplay.py
...
while True:
	ipadr = NetworkIP_get_ipAddress_eth0()
	if "0.0.0.0" in ipadr:
		ipadr = NetworkIP_get_ipAddress_wlan0()
	disp_ipAddress(ipadr, 0.5)
...
```

### 変更後

```IPadrDisplay.py
...
while True:
	ipadr = NetworkIP_get_ipAddress_wlan0()
	if "0.0.0.0" in ipadr:
		ipadr = NetworkIP_get_ipAddress_eth0()
	disp_ipAddress(ipadr, 0.5)
...
```

### 動作

- モバイルルータOFF, 有線ケーブル接続時
   - 固定IPアドレス表示
- モバイルルータOFF, 有線ケーブル未接続時
   - 0.0.0.0表示
- モバイルルータON, 有線ケーブル接続時
   - モバイルルータ付与IPアドレス表示

IPadrDisplay.pyでチェックし続けるため、動作途中のネットワーク変更時にはIPアドレスが切り替わる。