OmniAICreator/Qiita-1.07M huggingface dataset:
cocopar Raspberry pi 2B/3B用 3.5インチ MACで microSDにOSことインストール

### 1. Raspberry pi 3 3.5インチ タッチスクリーン設定方法
SSDカードにドライバー含むOS丸ことインストールする方法

### 2. ダウンロード
 - https://docs.google.com/uc?id=0B-Z1UZhyKaZ0RFVkSzlpOW15dXM&export=download


### 3. 解凍
![スクリーンショット 2017-04-26 0.59.57.png](https://qiita-image-store.s3.amazonaws.com/0/88511/90df8c09-9634-41d2-5582-0182c593ca3e.png)

### 4. macにmicroSDカードを入れる

### 5. 'diskutil list'で確認
```
(wemake)kin-no-MacBook-Pro:src free31$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 E0B079EE-57C0-43D4-B12A-252EADE1EEAA
                                 Unlocked Encrypted

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.8 GB    disk2
   1:             Windows_FAT_32 BOOT                    15.8 GB    disk2s1

```

### 6. 対象のmicroSDカードをunmountDiskする
```
(wemake)kin-no-MacBook-Pro:src free31$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

### 7. イメージライターでmicroSDに書き込む
```
sudo dd if=RPi-35inch-LCD-Raspbian-160728.img of=/dev/rdisk2 bs=1m
```


### 8. microSDから起動
画像変換手法CycleGANでパンダ生成モデルを作った話

UCバークレーが開発したディープラーニングによる画像変換手法[CycleGAN](https://github.com/junyanz/CycleGAN)で、クマの画像を突っ込むと、パンダに変換してくれるモデルを作りました。どうしてもクマをパンダに変換したい時って結構あるものですよね。

![bear2panda-7.png](https://qiita-image-store.s3.amazonaws.com/0/59997/da675f5e-fa2f-015f-411e-68e399a05528.png)


## CycelGANとは
ざっくり言うと、入力画像と出力すべき画像のペア無しに良い感じに画像を変換してくれる手法です。CycleGAN([論文](https://arxiv.org/pdf/1703.10593.pdf))では元の画像とそれに対応する変換の見本となる画像のペアは必要なく、例えば「りんご」と「オレンジ」のように２つのドメインに分けた画像を訓練データとして利用することが可能です。これによって、訓練データを集めるのが容易になります。

![スクリーンショット 2017-04-26 18.42.48.png](https://qiita-image-store.s3.amazonaws.com/0/59997/fe63a111-44df-0859-3c82-53ffd25d39e6.png)


具体的には、以下のように分類したものを訓練データとして利用します。

### 元ドメイン
![bear-domain.jpeg](https://qiita-image-store.s3.amazonaws.com/0/59997/2eeb9d39-c61d-823e-c3df-c6efccf35259.jpeg)


### ターゲットドメイン
![panda-domain.jpeg](https://qiita-image-store.s3.amazonaws.com/0/59997/bd6f371e-06ac-aee0-f675-bd2a757ea965.jpeg)




## bear2panda
クマ画像とパンダ画像をそれぞれ約1000個ほど突っ込んでモデルを作りました。Tesla K80を24時間ほど走らせています。

左が元の画像で、右がCycleGANによる変換後の画像です。

![bear2panda-7.png](https://qiita-image-store.s3.amazonaws.com/0/59997/3d7055fb-94ea-603e-9e26-3c8779f4363b.png)
![bear2panda-1.png](https://qiita-image-store.s3.amazonaws.com/0/59997/6a79f6c3-60ee-ceb5-2e29-e434d5140f6a.png)
![bear2panda-2.png](https://qiita-image-store.s3.amazonaws.com/0/59997/6772f6d5-cb84-0f3e-3b20-a94b9cc8d473.png)
![bear2panda-3.png](https://qiita-image-store.s3.amazonaws.com/0/59997/287f83f2-2b19-21b8-de56-c8ded9c364ac.png)
![bear2panda-6.png](https://qiita-image-store.s3.amazonaws.com/0/59997/8d55cd86-9f23-7dc6-2c73-ca9c5abaabb3.png)
![bear2panda-4.png](https://qiita-image-store.s3.amazonaws.com/0/59997/87545199-1a9d-d0ea-3e50-c98e0c44e168.png)

良い感じに仕上がってますね。ただこれらは良い例で、上手く行かないとDeep Dream的な不気味さを味わえます。

![スクリーンショット 2017-04-25 21.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/59997/1d43a745-e53f-85b2-32c3-d88712edb7ff.png)
![スクリーンショット 2017-04-25 21.23.00.png](https://qiita-image-store.s3.amazonaws.com/0/59997/f25651fa-6ff0-bd4b-9783-5188857de6e0.png)

## モデルの使い方

CycleGANのインストールについては[公式](https://github.com/junyanz/CycleGAN)に丸投げですすみません。
[こちらのレポジトリ](https://github.com/tatsuyah/CycleGAN-Models)に学習済みモデルが入っています。
詳しくは[README](https://github.com/tatsuyah/CycleGAN-Models)に記載していますが、CycleGANの学習済みモデルとしてbear2pandaを、テストデータとして任意のクマ画像を指定することで利用できます。

以上です。

## 参考文献
 * [論文](https://arxiv.org/pdf/1703.10593.pdf)
 * [はじめてのGAN](https://elix-tech.github.io/ja/2017/02/06/gan.html)
ハッシュについて(備忘)

#目的
ハッシュについて体系的に理解したいと思ったので記述しておく

##ハッシュについて

1. ハッシュは、本質的には配列と同じだが、インデックスとして整数値以外のものも使用できる点が配列と異なる。
2. 1.の理由から幾つかの言語 (特にPerl) ではハッシュを連想配列と呼ぶこともある
3. ハッシュのインデックス (キーと呼ぶのが一般的) は、通常何らかのオブジェクト。
4. ハッシュは、キーと値のペアを波かっこで囲んで表記する。
キーと値のペアを持たない波かっこの組 ({}) は空のハッシュを表す。

###1つ目の記法

```console:rails_console

>> user = {}                          # {}は空のハッシュ
=> {}
>> user["first_name"] = "Bob"     # キーが "first_name" で値が "Bob"
=> "Bob"
>> user["last_name"] = "Dylan"        # キーが "last_name" で値が "Dylan"
=> "Dylan"
>> user["first_name"]                 # 要素へのアクセスは配列の場合と似ている
=> "Bob"
>> user                               # ハッシュのリテラル表記
=> {"last_name"=>"Dylan", "first_name"=>"Bob"}

```

###2つ目の記法

ハッシュの1要素を角かっこを使って定義する代わりに、以下のようにキーと値をハッシュロケットと呼ばれる=> によってリテラル表現する方法(角かっこで表現するより楽)。

```console:rails_console

user = {"first_name" => "Bob", "last_name" => "Dylan"}

```

###3つ目の記法(シンボルによる記法)

**<ポイント>**
1. ハッシュのキーとして文字列を使用していたが、Railsでは文字列よりもシンボルを使用する方が普通
2. シンボルは文字列と似ているがクォートで囲む代わりにコロンが前に置かれている点が異なる。
3. Railsではシンボルをふんだんに使用している

####`シンボルによる記法(1)`

```
user = {:first_name => "Bob", :last_name => "Dylan"}
```

####`シンボルによる記法(2)`

シンボルとハッシュロケットの組み合わせを、以下のようにキーの名前の (前ではなく) 後にコロンを置き、その後に値が続くように置き換えたもの。

```
user = {first_name: "Bob", last_name: "Dylan"}
```

- どちらの記法もよく使われているので、両方の見分けがつくことが重要。
- :nameはシンボルとして独立しているが、引数を伴わないname:では意味が成り立たない。

以下のコードの:name =>とname:は、ハッシュとしてのデータ構造は全く同じ。

```console:rails_console
{ :name => "Bob Dylan" }
```

```console:rails_console
{ name: "Bob Dylan" }
```

ハッシュの値にはほぼ何でも使用することができ、他のハッシュを使用することすらできる。

```console:rails_console
>> params = {}        # 'params' というハッシュを定義。
=> {}
>> params[:user] = { name: "Bob", email: "bob@example.com" }
=> {:name=>"Bob", :email=>"bob@example.com"}
>> params
=> {:user=>{:name=>"Bob", :email=>"bob@example.com"}}
>>  params[:user][:email]
=> "bob@example.com"
```
ESP8266 (ESP-WROOM-02) に照度センサー(BH1750)を繋いでみた

ESP8266 (ESP-WROOM-02) に照度センサー(BH1750)を繋いでシリアルプロッタでグラフ化してみました。

![P5000963.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/0734bb04-05b9-5236-e733-45221140a863.jpeg)

## パーツについて
[BH1750](http://amzn.to/2oGChp4)は照度（ルクス）を高精度にデジタル測定できるセンサーです。￥180と激安です。
[CdSセル](http://amzn.to/2oGEb99)は、もっと安いですが抵抗値をルクスに変換するのに一手間掛かるので、客観的な数値を取りたい場合はこのセンサーがオススメです。

ESP8266は[NodeMcu Lua ESP8266 CH340](http://amzn.to/2zoZ2aj)という開発ボードを使っています。
中国から届くのに時間がかかりますが、￥480と激安です。

## 回路について
[BH1750](http://amzn.to/2oGChp4)は[I2C](https://ja.wikipedia.org/wiki/I2C)という規格で接続できるセンサーです。
この規格であれば、他のセンサーとカスケード接続でき、ESP8266からも簡単に利用できます。
Amazonでも[色々なI2Cデバイス](http://amzn.to/2omzxB0)が売られているので眺めているだけでも夢が広がります。

接続は、
SCLにGPIO5、SDAにGPIO4を繋いで、
後は電源とGNDを繋ぐだけです。

###回路図 っぽいもの
![image](https://qiita-image-store.s3.amazonaws.com/0/157770/51581d72-a491-c895-5424-336ec8d4189c.png)

## ソースコード（スケッチ）

[BH1750のESP8266用ライブラリ](https://github.com/claws/BH1750)が公開されていたのでそちらを利用しました。
lightMeter.beginの中で、Wire.begin()しているので、setup()では不要です。

```c:BH1750.ino

#include <Wire.h>
#include "BH1750.h"

BH1750 lightMeter(0x23);
float lux = 0.0;

void setup() {
  // BH1750  
  lightMeter.begin(BH1750_CONTINUOUS_LOW_RES_MODE);
  Serial.println("BH1750 start.");
  
  // シリアル通信を開始
  Serial.begin(115200);
  Serial.println("Serial start.");
}

void loop() {

  // 照度を計測してシリアルに出力
  uint16_t lux = lightMeter.readLightLevel();
  Serial.println(lux);

  delay(1000);
}

```

- BH1750_CONTINUOUS_LOW_RES_MODEの部分を変更すると測定精度やモードが設定できます。高精度にすると測定に120ms程かかるそうです。
    - BH1750_CONTINUOUS_HIGH_RES_MODE
    - BH1750_CONTINUOUS_HIGH_RES_MODE_2
    - BH1750_CONTINUOUS_LOW_RES_MODE
    - BH1750_ONE_TIME_HIGH_RES_MODE
    - BH1750_ONE_TIME_HIGH_RES_MODE_2
    - BH1750_ONE_TIME_LOW_RES_MODE
- ライブラリを利用する場合は、hファイルとcppファイルをino（スケッチ）と同じディレクトリに置けばOKです
- 置いたライブラリは`#include <xxxx.h>`ではなく`#include "xxxx.h"`で読み込みましょう

## グラフ
Arduino IDEのシリアルプロッタでグラフ化してみました。

**照度**
![image](https://qiita-image-store.s3.amazonaws.com/0/157770/7cfcb43a-35c4-9fe4-1ce5-d72472874a30.png)
手をかざして影を作ったり、作らなかったりしてみました。

**※最終的に、このセンサー＆ESP8266は自宅ガレージの環境監視に使う予定**

## 参考URL

BH1750のライブラリ
https://github.com/claws/BH1750

I2C
https://ja.wikipedia.org/wiki/I2C

I2C バス仕様およびユーザーマニュアル
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
Rで現在のディレクトリ確認と変更

Rの醍醐味は、大量のデータを簡単なコードで読み込ませ、計算させ、描画できちゃう点です。これには、未だに感動します。

そのためには、データを読みこませるステップが必要になります。さらにその前に、今Rのコンソールがどのディレクトリ（フォルダ）で作業しているのか、確認する必要があります。

##現在のディレクトリの確認
そのためのコードがこちら。

```ruby:qiita.rb
getwd()
```

すると、こんな値が返ってきます。

```ruby:qiita.rb
> getwd()
[1] "/Users"
```

getwd()は、現在Rが作業しているディレクトリの場所を教えてくれるコマンドです。現在、私は"/Users"というディレクトリ（フォルダ）で作業しています。ということを意味しています。つまり、このフォルダに読み込みたいデータを入れておけば、後で紹介するコマンドで読み込むことができます。

しかしながら、こんな上の階層（ルート"/"に近い）ディレクトリではあまり作業したくないですよね。きっと専用のフォルダを作成している方がやりやすいので、そのディレクトリに作業ディレクトリを変更する手続きをします。

 

##R本体でのディレクトリ変更方法
(Mac)　「その他　＞　作業ディレクトリの変更」　で任意の場所を指定
(Win)　「ファイル　＞　ディレクトリ変更？」　で任意の場所を指定



※今はMacで実行しているのでWinの設定画面は不明瞭。ただしWinのR画面の方がわかりやすい。

 

##RStudioでの変更方法
　Rを使う上では、RStudioというエディターが著名です。その際の設定法は、コンソール画面の上部にある矢印をクリック
 ![change directory.png](https://qiita-image-store.s3.amazonaws.com/0/176129/00b95ad0-2581-2308-cc73-305a8276d1f8.png)


＞　右下の画面の「Files」で任意のフォルダに移動
　＞　「move」ボタンをクリックし、「set as working directory」をクリック
![change directory1.png](https://qiita-image-store.s3.amazonaws.com/0/176129/736857f7-08e5-2078-2f89-9b2aafe2c4df.png)


少々厄介ですが、慣れるとこっちの方がスムースですね。

 
##ディレクトリの変更確認

さて、変更できたがどうか確認するためもう一度おまじないを

```ruby:qiita.rb
> getwd()
[1] "/Users/Desktop/R_study/in_data"
```

など、任意のディレクトリが表示されれば、最初の一歩が終わりです。

とりあえず、ここまで。


その他、Rに関する元記事はこちらです。（一つずつQiitaに移行中）
 http://demacassette2.hateblo.jp/archive/category/Tips-R
rfc5507-client  install for ubuntu

## OS

* ubuntu 14.04LTS

## install

```
sudo apt-get install -y pkg-config libssl-dev libev-dev libpcap-dev libgnutls-dev libnss3-dev
git clone https://github.com/vincentbernat/rfc5077.git
cd rfc5077/

※ openssl versionが 1.1 より古い場合
git checkout 3c37c33b46e0

git submodule init
git submodule update
make
```

参考(というか原文そのまま):
https://github.com/vincentbernat/rfc5077

>Then run make to build the executables. This currently needs OpenSSL 1.1. If you have an older version, go back to commit 3c37c33b46e0:

sessionID等のチェックにどうぞ
react-native-router-flux導入時に出るNo bundle url present

## How
mac os
react nativeでios app開発
## WHAT
https://facebook.github.io/react-native/docs/getting-started.html
公式チュートリアルをはじめて、
https://js.coach/react-native/cairn?sort=popular&category=styling
ここらへんでいい感じのライブラリを見つけて
https://facebook.github.io/react/docs/forms.html
Formの送り方を学び、
次はルーティングだ。react-native-router-fluxがstar数も多くて使えそうだ。ということで
` npm i --save react-native-router-flux `
を実行した。

すると突然シミュレーターが赤画面に。
## 試行錯誤
そのあと、pacakage.jsonから
"react-native-router-flux": "3.38.0",
の行を削除し
` rm -rf node_modules && npm i `
動かないので App/ios/buildを削除し
react-native run-ios
動くようだ。

https://github.com/facebook/react-native/issues/12754
こことかで最近みんな同じ問題に直面しているらしかった。
結局 reactとreact-nativeとreact-native-router-fluxのバージョンがいい感じのバージョンでないと動かないらしい。routerを公式のNavigationを使うてもあるが、、、

サーチを続けると秘伝のタレを紹介している神がいた
https://github.com/aksonov/react-native-router-flux/issues/1816#issuecomment-296857358
この通りにpackage.jsonを書き換えると全てうまく言った。

ようやくアプリの開発ができそうだ。
次はreduxでstateを管理しよう。

## 追記
packageの問題ではない場合でもNo bundle url present
が出る場合があった。
その時は、
App/ios/buildを削除してから
`react-native run-ios`
で正常に動いた
Jinja2のWhitespace Control機能についての調査メモ 

## はじめに

Python製のテンプレートエンジン、[Jinja2](http://jinja.pocoo.org/docs/2.9/)には[Whitespace Control](http://jinja.pocoo.org/docs/dev/templates/#whitespace-control)という機能があります。リファレンスにはマイナス記号(`-`)はブロック前か後の空白を削除するとの説明がありますが、その説明だけではピンとこず、挙動に悩んだのでメモしておきます。

<!-- ---------------------------------------- -->

## この記事中の記法について

わかりやすくするためにテンプレートソースとその出力のスペースは`-`に、改行は`\n`で表しています。

<!-- ---------------------------------------- -->

## 期待する出力

こうなってほしい。要素間には無駄な空行がなく、空白4つのインデントを持つ。

```txt
----foo
----bar
----baz
```

<!-- ---------------------------------------- -->

## 調査

### マイナス記号なしで普通に書く

```jinja
==============================\n
{% for x in ["foo", "bar", "baz"] %}\n
----{{ x }}\n
{% endfor %}\n
==============================
```

```txt
==============================\n
\n
----foo\n
\n
----bar\n
\n
----baz\n
\n
==============================
```

あらら、全然だめですね。

<!-- ---------------------------------------- -->

### 正解パターン

色々なパターンを試して、上手くいったパターンがこちら。

```jinja
==============================
{%- for x in ["foo", "bar", "baz"] %}\n
----{{ x }}\n
{%- endfor %}\n
==============================
```

```txt
==============================\n
----foo\n
----bar\n
----baz\n
==============================
```

期待通りですね。`-`はブロック前後の空白を取り除く、という説明だけでこの回答にすぐにたどり着けたでしょうか？

僕はなぜこのパターンで上手くいくのか小一時間悩みました。わかりやすくするために、前後に適当な文字列を追加してみます。

```jinja
==============================\n
\n
----AAA\n
-------\n
----{%- for x in ["foo", "bar", "baz"] %}-BBB\n
--------{{ x }}-CCC\n
    {%- endfor %}-DDD\n
-------\n
----EEE\n
\n
==============================
```

```txt
==============================\n
\n
----AAA-BBB\n
--------foo-CCC-BBB\n
--------bar-CCC-BBB\n
--------baz-CCC-DDD\n
--------\n
----EEE\n
\n
==============================
```

なるほど。順に図で示していこうと思いましたが、この出力を見れば動作がわかりますね。確かにブロック前後の空白が除去されてますw

残りは期待通りにならないダメパターンをいくつか紹介します。

<!-- ---------------------------------------- -->

### X ダメパターン1

```jinja
==============================\n
{% for x in ["foo", "bar", "baz"] -%}\n
----{{ x }}\n
{%- endfor %}\n
==============================
```

```txt
==============================\n
foobarbaz\n
==============================
```

<!-- ---------------------------------------- -->

### X ダメパターン2

```jinja
==============================\n
{% for x in ["foo", "bar", "baz"] -%}\n
----{{ x }}\n
{% endfor -%}\n
==============================
```

```txt
==============================\n
foo\n
bar\n
baz\n
==============================
```

<!-- ---------------------------------------- -->

### X ダメパターン3

```jinja
==============================
{%- for x in ["foo", "bar", "baz"] -%}\n
----{{ x }}\n
{%- endfor -%}\n
==============================
```

```txt
==============================foobarbaz==============================
```

<!-- ---------------------------------------- -->

### X ダメパターン4

```jinja
==============================
{%- for x in ["foo", "bar", "baz"] -%}
    {{ x }}
{%- endfor %}
==============================
```

```txt
==============================foobarbaz\n
==============================
```

## まとめ

綺麗に整形されたテンプレート出力を得るのは案外難しい。
npmのプロキシ設定にプロトコルを明記しなかったら繋がらなくなった話

## 概要
`npm` のプロキシ設定は, `proxy:port` ではなく `protocol://proxy:port` とする必要があるらしい。
今のところちゃんとしたエビデンスのあるドキュメントにたどり着いていないので、資料があれば教えて頂けると幸いです。

実行環境はこちら。

|OS|node|npm|
|:-:|:-:|:-:|
|OS X El Capitan|v7.3.0|4.5.0|

## ある日突然 `npm install` が終わらなくなった
`--verbose` オプションをつけたところ、どうやら接続に失敗して何度もリトライしているらしい。

出たエラーがこちら。
```
npm info retry will retry, error on last attempt: Error: tunneling socket could not be established, cause=connect EHOSTUNREACH
```

## プロキシ設定が怪しそう
~~何もしてないのに壊れた~~ 何もしてないはずがないので原因を考えてみる。
プロキシ環境下であり、前日に直接接続の環境では普通に動いていたことを考えると、怪しいのはプロキシ関連。疑ったことと実際の状況は以下のとおりである。

|疑ったこと|実情|
|:--|:--|
|プロキシが設定されてない|設定されていた|
|プロキシのアドレスが間違っている|合っていた|
|プロキシのポート番号が間違っている|合っていた|
|ユーザ認証でエラーが出ている|ユーザ認証不要|
|他のソフトもネットワークエラーを吐く|少なくともcurlもgitは通常通り動作|

最後の1つが決定的で、「おそらくプロキシ設定は合っているけど動作しない」という考えに至り始めていた。

## もしかしてプロトコル?
散々悩んだりstackoverflowを彷徨ったりした後、「もしかしてプロトコルを明記しないとダメ？」と思い当たる。以前の `npm` が正常に動作していた時と、設定ファイルをいじった後のアドレス設定は以下のようになっていた。

|いじる前のアドレス|いじった後のアドレス|
|:--|:--|
|`http://proxy:port`|`proxy:port/`|

そこで前のようにプロトコルも指定してみたところ、無事インストールができた。

この後確認のために1度プロトコルを外したプロキシアドレスを設定したところ、同じエラーが確認できた。原因はやはりプロトコルの明記にあるらしい。

## まとめ
- npmはプロキシのアドレスやポート番号が合っていてもプロトコルを明記しないと繋がらない場合がある
- 明記しなくても繋がる場合があるかどうかは不明(80番や443番を使うプロキシならいけるかも？)
- `--verbose` オプションは原因究明に役立つ
[Python] コレクション型をソート　を参考にした

(参考)[Python] コレクション型をソート
http://qiita.com/ysk24ok/items/b546471c37b2f443f4c7

```python
from operator import itemgetter
b= {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18}
print('#-------------------------------------------------------------------')
print('#b=',b,type(b))
c=b.get('Matsui')
print('#c=',c,type(c))
from sympy import *
var('i')
i=-1
for key, value in b.items():
    i=i+1
    print('#b[',i,']=',key,',' ,value)
print('#-------------------------------------------------------------------')
s=sorted(b.items(), key=itemgetter(1))
print('#s=',s,type(s))
print('#s[0]='   ,s[0]   ,type(s[0])   )
print('#s[0][0]=',s[0][0],type(s[0][0]))
print('#s[0][1]=',s[0][1],type(s[0][1]))
print('#-------------------------------------------------------------------')
d=dict(s)
print('#d=',d,type(d))

#-------------------------------------------------------------------
#b= {'Matsui': 55, 'Ichiroh': 51, 'Kuroda': 18} <class 'dict'>
#c= 55 <class 'int'>
#b[ 0 ]= Matsui , 55
#b[ 1 ]= Ichiroh , 51
#b[ 2 ]= Kuroda , 18
#-------------------------------------------------------------------
#s= [('Kuroda', 18), ('Ichiroh', 51), ('Matsui', 55)] <class 'list'>
#s[0]= ('Kuroda', 18) <class 'tuple'>
#s[0][0]= Kuroda <class 'str'>
#s[0][1]= 18 <class 'int'>
#-------------------------------------------------------------------
#d= {'Kuroda': 18, 'Ichiroh': 51, 'Matsui': 55} <class 'dict'>
```
fishでもdotを打った分だけ上の階層に行く方法

このエントリは，以下のエントリのfish版になります．

[zshでdotを打った分だけ上の階層に行くもう一つの方法](http://qiita.com/momo-lab/items/523fc83fbfa39fa5fd60)

私もzshを使っていた際には,`cd`で複数階層上に移動するのを簡単にするため

```zsh
alias -g ...='../..'
alias -g ....='../../..'
```

のようなグローバルエイリアスを設定していました．

fishでもこれと同様のことをしたかったのですが

- fishにそもそもグローバルエイリアスがない

ことに加え，仮に`...`を解釈可能なように`cd`を再定義[^omf-cd]しても

[^omf-cd]: `...`を解釈可能なように再定義された`cd`がoh-my-fishのプラグイン([oh-my-fish/plugin-cd](https://github.com/oh-my-fish/plugin-cd))として存在します．

- `...`それ自体は無効なパスなので，補完が効かない
- fishは標準でシンタックスハイライト有効なので`...`がエラーとして色付けされてしまう[^color]

[^color]: 別に実害はないのですが，エラーの色付けされているコマンドが実行できてしまうのがなんとなく気持ち悪かったです．

という問題がありました．
しかし[元エントリ](http://qiita.com/momo-lab/items/523fc83fbfa39fa5fd60)を見て，この方法ならfishでも上手くいく！ と気付き，さっそく真似してみました．

```fish:replace_multiple_dots.fish
function replace_multiple_dots
  set -l token (string match '*..' -- (commandline -tc))
  if test -d "$token"
    commandline -i '/..'
  else
    commandline -i '.'
  end
end
```

まず上記の関数を定義．その後`fish_user_key_bindings`関数内に以下を追加します．

```fish:fish_user_key_bindings
bind '.' replace_multiple_dots
```

ちょっとアレンジした点として，入力中の語が実在するパスでない場合は，普通に連続した`.`が打てるようになっています．

```sh
cd .. # <- ここで.を打つとcd ../..に展開
echo "...." # <- パスの一部でないときは普通に.が連打できる
```

これで`fish`でも，簡単に階層移動できるようになりました．
webpack, Jest, Flowのimportの相対パスを綺麗にする

ES2015とwebpackで何も考えずにコードを書いていたら、以下のような相対パス指定のimportをちらほら見かけるようになった。

```js
import Lib from '../../lib/Lib';
```

ぱっと見で辛いし、Jestでmoduleをmockしたいときにも辛いので、もろもろの設定をしてimportを綺麗にした。基本的には、各種ツールにnode_moduleのdirectory指定オプションがあるので、それを利用する。

`import Lib from '../../lib/Lib'` と書いてたやつが
`import Lib from 'lib/Lib'` と書けるようになる。

余談だけど、JestのAutomockingはバージョン15からはデフォルトでdisabledになったらしい。なので、デフォルト設定でmoduleをmockするならjest.mock('module_path')を書かないといけない。
<https://facebook.github.io/jest/blog/2016/09/01/jest-15.html#disabled-automocking>

各ツールのバージョンはこんな感じ。

- webpack: 2.4.1
- Jest: 19.0.2
- flow: 0.44.2

# ファイル構成
```
.
└── src
    ├── lib
    │   └── Lib.js
    └── main
        └── foo
            ├── bar.js
            └── bar.test.js
```

## Lib.js
```js
// @flow
export default class Lib {
    log() {
        console.log('log lib.');
    }
};
```

## bar.js
```js
// @flow
import Lib from '../../lib/Lib';

export default function bar() {
    const lib: Lib = new Lib();
    lib.log();
}

bar();
```


## bar.test.js
```js
import bar from './bar';
import Lib from '../../lib/Lib';
jest.mock('../../lib/Lib');

test('jest', () => {
    bar();
    expect(Lib.prototype.log).toBeCalled();
});
```

# 各種ツールの設定
以下の設定をすることでimport pathをいい感じにできる。
srcディレクトリをmodule directoryとして認識させることで、`import Lib from 'lib/Lib'`とかけるようになる。（元は`import Lib from '../../lib/Lib'`）


## webpack
```js
// webpack.confing.js
resolve: {
  modules: [
    path.resolve(__dirname, 'src'),
    'node_modules'
  ]
}
```
 
## Jest

```js
// package.json
"jest": {
  "moduleDirectories": [
    "src",
    "node_modules"
  ]
}
```

## Flow
```ini
# .flowconfig
[options]
module.system.node.resolve_dirname=src
module.system.node.resolve_dirname=node_modules
```

# 最終的なコード

## Lib.js
変更なしなので省略。

## bar.js
importのpathだけ変更。

```js
// @flow
import Lib from 'lib/Lib';

export default function bar() {
    const lib: Lib = new Lib();
    lib.log();
}

bar();
```

## bar.test.js
importのpathとjest.mockのpathを変更。

```js
import bar from './bar';
import Lib from 'lib/Lib';
jest.mock('lib/Lib');

test('jest', () => {
    bar();
    expect(Lib.prototype.log).toBeCalled();
});
```

# 動かせるサンプルコード
調査に使ったコードはこちらのリポジトリにあるのでご興味あれば。
<https://github.com/mwatanabe/cleanup-messy-imports-poc>


# おまけ:IntelliJ IDEA
あまりいないかもしれないけど、IntelliJでJSを書いている人は、IntelliJのProject Structureの設定から、Source Folderとしてsrcディレクトリを指定すると、importの補完がいい感じになる。
こんな感じ。

<img width="564" alt="intellij.png" src="https://qiita-image-store.s3.amazonaws.com/0/19616/55f259c4-4360-1fde-0731-5b7750f6d7af.png">
Laravel Installerをグローバルから叩けるようにする


公式サイトに書いてある以下の方法。
https://laravel.com/docs/5.4

> **Via Laravel Installer**

> First, download the Laravel installer using Composer:

> ```
> composer global require "laravel/installer"
> ```

> Make sure to place the `$HOME/.composer/vendor/bin` directory (or the equivalent directory for your OS) in your $PATH so the `laravel` executable can be located by your system.

何も考えずにターミナルで上記コマンドを実行するだけだと、そのあとの

```
laravel new blog
```

が叩けないので、その解決方法。

# `.profile` を編集

```
vim ~/.profile
```

で開いて

```
i
```

で `insertモード` にして

```
export PATH="$HOME/.composer/vendor/bin:$PATH"
```

を追加する。
そして `esc` + `:x` で保存して終了

##これでもできます

```
~/.composer/vendor/bin/laravel new blog
```
プログラミング言語Go読書会#6(3.5.5-4.3)[2017/04/19]

[Go読書会 #6 ](https://lancers-engineer.connpass.com/event/55352/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 3章 基本データ型
  + 3.5 文字列
    + 3.5.5 文字列と数値の変換
  + 3.6 定数
    + 3.6.1 定数精製器 iota
    + 3.6.2 型つけなし定数
+ 4章 コンポジット型
  + 4.1 配列
  + 4.2 スライス
    + 4.2.1 append関数
  + 4.3 マップ


## 話題に上がった話

### 3.5.5 文字列と数値の変換

Goの場合の文字列から数値の変換方法は、[fmt.Sprintf](https://golang.org/src/fmt/print.go?s=5291:5343#L184)か[strconv.Itoa](https://golang.org/src/strconv/itoa.go?s=790:813#L14)のようです。ここで話題になったのは、人によってはSprintfで変換するのを好まない人がいるというのと、PHPの場合は、文字列として宣言しても普通に数値として扱えます。場面によっては[intval](http://php.net/manual/ja/function.intval.php)とか使って保証したいときもあるでしょうけど。

```
> php -a

php > $data = "42";
php > echo $data + 100;
142
```

あとは、何故Goの型の宣言がこの順番になったのかという質問がでて、その場では分からなかったんですが、[Go's Declaration Syntax](https://blog.golang.org/gos-declaration-syntax)に書かれていました。パースに関連していた用です。


### 3.6.1 定数精製器 iota

この、[定数精製器iota](https://golang.org/ref/spec#Iota)は割と珍しい機能なのでちょっとだけ話題になりました。特に例に出てくる1024の累乗に名前をつけるこの書き方`_ = 1 << (10 * iota)`は面白かったです。


### 3.6.2 型つけなし定数

ここで気になったのは、`コンパイラは、型に結びついてない定数を基本型の値よりもはるかに高い数値精度で表現します`というところで、型が定まってないので精度高い状態で表現しておかないとまずいのでこうなってるのだろうなと思いつつ。こういう遅延みたいなことができるんだと驚きました。


### 4.1 配列

ここでは、配列が固定長であることのメリットは何なのかという疑問がでました。動的に確保するのは余計な処理が入りますし、パフォーマンス面が大きいとは思います。

### 4.2 スライス

ここでは、スライスの構造そのものに対しての初見の人は割と面食らっていました。話題になったのは、スライスに対するlenとcapが返す値がなんなのかでした。確かにスライス演算子を使用した場合のlenはともかくcapは分かりづらいです。しかし、中に書かれている図が割と分かりやすかったのでそれで助かりました。

### 4.2.1 append関数

ここで、実際にスライスに対して項目を足していく処理を行える関数appendが出てきました。ここで出てきたAppendIntの説明でスライスがどうやってデータを増やしているかなどが分かりやすく書かれていたので良かったです。ちなみに、現在の[AppendInt](https://golang.org/src/strconv/itoa.go?s=976:1028#L20)は中身が[formatBits](https://golang.org/src/strconv/itoa.go?h=formatBits#L60)というものになっていてこの本の内容とはちょっと変わっていました。

そのあと、Intがあるなら、他にも有るだろうと言うことで[AppendString](https://golang.org/src/vendor/golang_org/x/text/unicode/norm/normalize.go?h=AppendString#L259)とか[AppendFloat](https://golang.org/src/strconv/ftoa.go?h=AppendFloat#L50)とかを参加者で探してみたりしました。


### 4.3 マップ

スクリプト言語を扱っていると割と使用されるデータ構造ですね。ここでは、マップのkeyをforなどで取り出した場合、その順序がランダムなのか入れた順番が保持されているのかということが話題になりました。PHPの場合は順番が保持されていて、Perlの場合は5.18からhash randomizationが導入され、キーの順序が保証されなくなりました。C++のSTLでは自前でソートする必要があるようです。


ここまで読んだところで時間になりました。次回は 4.5 構造体からです。
async await に書き換えて、Promiseと 同期による例外の区別でハマった

ハマった

## 元のコード

```js
// async function の中
try {
  load().then(data => {
    console.log(data)
  }).catch(e => {
    // ...
  })
} catch (e) {
  // ... 例外処理
}
```

わかりやすく簡単にしている。実際にはもっと複雑なコードだった。Promise にすれば
 try と catch を一本化して綺麗にできるやん！と思っていた。最初は。

## 書き換えた

```js
// async function の中
try {
  const data = await load()
  console.log(data)
} catch (e) {
  // ... 例外処理
}
```

catch が一個減ってリファクタできたーと思っていた。確かに異なる例外処理のブロックが減ってしまっていたが、どうせ何かしらのデッドコードだろと思って消してしまった。

注: 意味的に変わってしまっているが、実際にはすごく複雑なコードで、大きな方のtryは別の例外をキャッチしていると思っていた…

## 何が起こったか

catch に来てた部分が、Promise の
 UnhandledRejectionError になってしまっていた(のにしばらく気づかなかった)。

ここで、状況を述べておくと、 `load()` はライブラリが提供してた関数で、Promiseを返すことは知っていたが、実装には詳しくなかった。これがハマる理由になった。

挙動をちゃんと追うと、ここの `load()` は **同期的な例外 または Promise を返す** という実装だった。期待していたのは **Promise の resolve or reject** だったので、ミスマッチがあったというわけ。


## どう直したか

```js
// async function の中
try {
  const loading = load()
  try {
    const data = await loading
    console.log(data)
  } catch (e) {
    // 非同期例外
  }
} catch (e) {
  // 同期例外
}
```

えーー！！ってコードになってしまった。でもこれが元々期待されてた挙動的に正しい…。

## 反省

- async/await の中でも同期例外と非同期例外を区別する
- 自分がPromiseの関数を実装するときは Promiseのインターフェースに押し込めるようしたいと思った
- 例外パターンに対するテストは常に書こう

以上、これで2日分ほどハマった現場よりの報告でした。
Async Functions はなぜ良いのか

# 忙しい人向け

読みやすいから。

[JavaScriptは如何にしてAsync/Awaitを獲得したのか](http://qiita.com/gaogao_9/items/5417d01b4641357900c7)もぜひ読みましょう。

# ひまな人向け

Chrome は[55](https://developers.google.com/web/updates/2016/11/nic55)から、 Node.js は[7.6](https://nodejs.org/en/blog/release/v7.6.0/) からデフォルトで Async Functions (async/await) をサポートしました。

これは明らかに世界平和に近づく出来事です。

## サンプル問題

Async Functions は事前に回数が決まっている非同期処理も書きやすくなりますが、**真価を発揮するのは何回実行するか実行時までわからない非同期処理**です。

今回は例として、（最大の試行回数、試行間の待機時間（ms）、実際の処理の Promise）を引数として受け取り、 Promise を返すというプログラムを考えてみます。

- 最大試行回数は10回
- 試行間の待機時間は100 ms
- 処理の内容は
    - ランダムで 0〜100 の数字を生成する
    - 95 以上なら成功（resolve）
    - それ未満なら失敗（reject）、[やり直す](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%A9%E3%83%8E%E3%82%A4%E3%82%A2_(TRPG))

というものにします。つまり、結果が

```
次はうまくやるでしょう: 93
次はうまくやるでしょう: 46
次はうまくやるでしょう: 34
次はうまくやるでしょう: 37
できました: 96
```

だったり

```
次はうまくやるでしょう: 79
次はうまくやるでしょう: 91
次はうまくやるでしょう: 17
次はうまくやるでしょう: 92
次はうまくやるでしょう: 46
次はうまくやるでしょう: 27
次はうまくやるでしょう: 83
次はうまくやるでしょう: 5
次はうまくやるでしょう: 88
できませんでした: 14
```

だったりするやつです。

## 実装例: Promise

```js:retryPromise.js
const retryWithPromise = (maxRetries, retryInterval, fn) => {
  return new Promise((rootResolve, rootReject) => {
    const f = (tries, maxRetries, retryInterval, fn, parentResolve, parentReject) => {
      return new Promise((resolve, reject) => {
        fn().then(r => parentResolve(r)).catch(e => {
          if (tries >= maxRetries) return parentReject(e);

          console.log(`次はうまくやるでしょう: ${e}`);

          setTimeout(() => f(tries + 1, maxRetries, retryInterval, fn, parentResolve, parentReject), retryInterval);
        });
      });
    };

    f(1, maxRetries, retryInterval, fn, rootResolve, rootReject);
  });
};

const test = () => new Promise((resolve, reject) => {
  const result = Math.round(Math.random() * 100);

  if (result >= 95) {
    resolve(result);
  } else {
    reject(result);
  }
});

retryWithPromise(10, 100, test)
.then(r => console.log(`できました: ${r}`))
.catch(e => console.log(`できませんでした: ${e}`));
```

## 実装例: Async Functions

```js:retryAsync.js
const retryAsync = async (maxRetries, retryInterval, fn) => {
  for (let tries = 1; tries <= maxRetries; tries++) {
    try {
      return await fn();
    } catch (e) {
      if (tries >= maxRetries) throw e;
      console.log(`次はうまくやるでしょう: ${e}`);
      await new Promise(r => setTimeout(() => r(), retryInterval));
    }
  }
};

const test = async () => {
  const result = Math.round(Math.random() * 100);

  if (result >= 95) {
    return result;
  } else {
    throw result;
  }
};

retryAsync(10, 100, test)
.then(r => console.log(`できました: ${r}`))
.catch(e => console.log(`できませんでした: ${e}`));
```

## まとめ

一目瞭然ですね。もし前者の方が理解しやすい人がいたら手を挙げてください。

環境がネイティブで対応してなくても Babel や TypeScript を使って async/await の庇護と恩恵を受け、完璧に幸福になりましょう！
各種表計算ツールでの散布図の出し方（Excel2010, numbers4.0.5, spreadsheet）

散布図を書きます。
ついでに、回帰直線も引きます。

## Excel

データがあります。

<img width="1353" alt="スクリーンショット 2017-04-25 21.03.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/73f7d730-826d-0783-70ce-4be9caed4eaf.png">

1. このデータを選択し、
1. 「グラフ」タブに移動しましょう。
1. そして、「散布図」を選択します。

<img width="1353" alt="スクリーンショット 2017-04-25 21.03.10のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/4ba2484c-55d2-6b1b-b9d5-b74cbe72a5ee.png">

こんなのが出てくるので、左上を選択。

<img width="476" alt="スクリーンショット 2017-04-25 21.03.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/e02077bb-d326-64e2-a082-17914d53cc20.png">

すると、散布図が出現します！

<img width="603" alt="スクリーンショット 2017-04-25 21.06.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/14e272e5-ea0e-0199-f6da-b45f58eb841f.png">

赤枠のエリアから、回帰直線を引くことが出来ます。

<img width="1353" alt="スクリーンショット 2017-04-25 21.04.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/88150359-ac0b-ddad-59de-b4d4a8b4835d.png">


## numbers 

データがあります。

![スクリーンショット 2017-04-25 21.09.21.png](https://qiita-image-store.s3.amazonaws.com/0/172474/2cab051e-b5ae-d0f4-55e2-63b2b8d269bb.png)

データを選択し、「グラフ」から、左下の散布図を選択します。

<img width="1353" alt="スクリーンショット 2017-04-25 21.09.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/58ac52d5-a2d8-1680-5780-8755989eb7b4.png">

すると、散布図が得られます！

![スクリーンショット 2017-04-25 21.09.39.png](https://qiita-image-store.s3.amazonaws.com/0/172474/3ea990e0-e9b8-7f9c-68ae-bfdd58e3272c.png)

図の感じの操作で、回帰直線等も出せます。

![スクリーンショット 2017-04-25 21.09.54.png](https://qiita-image-store.s3.amazonaws.com/0/172474/640d3e0b-0907-ef57-0712-932252845886.png)


## spreadsheet

データがあります。
データを選択し、

![スクリーンショット 2017-04-25 21.13.56.png](https://qiita-image-store.s3.amazonaws.com/0/172474/083b96e8-5b8a-9f49-5359-624d5c1ce6de.png)

「挿入」 > 「グラフ」を選択。

![スクリーンショット 2017-04-25 21.14.01.png](https://qiita-image-store.s3.amazonaws.com/0/172474/f30aa8d4-9e9f-22ad-85d7-68c267fe2329.png)

ちょっと手間ですが、「グラフの種類」タブを選択し、出てきたグラフたちのリストのところで舌スクロールして、

![スクリーンショット 2017-04-25 21.14.12.png](https://qiita-image-store.s3.amazonaws.com/0/172474/8d441a0a-3911-1734-f93f-366a32ec2402.png)

散布図を発見！
選択します。

![スクリーンショット 2017-04-25 21.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/172474/5a6e0b1e-434d-ae3e-6498-0315245289cc.png)

すると、散布図が手に入ります！

![スクリーンショット 2017-04-25 21.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/172474/826158e8-1cc3-a85b-0103-14e0c4ffa5ff.png)

右上の▼から「高度な編集...」を選択し、

<img width="740" alt="スクリーンショット 2017-04-25 21.18.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/846ac359-12ca-f1b2-837d-445563ad08e2.png">

一番下までスクロールして、「トレンドライン」から「線形」を選択すると

![スクリーンショット 2017-04-25 21.18.37.png](https://qiita-image-store.s3.amazonaws.com/0/172474/7dc2f398-e308-b148-c2fe-2c2b838b9900.png)

回帰直線が引けます。
式は出し方分かりませんでした。。。

![スクリーンショット 2017-04-25 21.18.51.png](https://qiita-image-store.s3.amazonaws.com/0/172474/47ca6553-f1af-4c39-85cc-2b5a60fbf9b1.png)


終わり！
SQLite3のデータをdumpしてMySQLに移行する


## はじめに

個人プロダクトでDjangoを扱っていて、デフォルトのままSQLite3で作業していたのですが、そろそろMySQLに移行しようかなぁと思っていつも通り、以下のコマンドを使って操作した場合、エラーがでてよくわからないまま対処できなかったのでメモ的な

```bash
$ python manage.py dumpdata --indent 4 > dump.json
# Databaseの向き先を変更する
$ python manage.py loaddata dump.json
```

## 環境

- Django 1.10.5
- mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64)
- Python 3.6.x

## SQLite3からデータをdumpする

```bash
$ sqlite3 db.sqlite3 .dump > dump.sql
```

または

```bash
$ sqlite3 db.sqlite3
sqlite> .output ./dump.sql
sqlite> .dump
```

これで  `dump.sql` といったようなファイルが指定したディレクトリにできたはず。

## SQLite3用のSQLデータをMySQLでも使えるようにコンバート

このままではMySQLでは使えないのでコンバートする必要があります。

http://www.redmine.org/attachments/download/6239/sqlite3-to-mysql.py

Redmineさんがいい感じなのを用意してくださってました！感謝！！
と思っていたのですが、スクリプト自体はPython2のみの対応。

といっても `print` がPython3に対応していないだけっぽいのでちょっと書き換え。

```python:sqlite3-to-mysql.py
#! /usr/bin/env python

import sys

def main():
    print("SET sql_mode='NO_BACKSLASH_ESCAPES';")
    lines = sys.stdin.read().splitlines()
    for line in lines:
        processLine(line)

def processLine(line):
    if (
        line.startswith("PRAGMA") or 
        line.startswith("BEGIN TRANSACTION;") or
        line.startswith("COMMIT;") or
        line.startswith("DELETE FROM sqlite_sequence;") or
        line.startswith("INSERT INTO \"sqlite_sequence\"")
       ):
        return
    line = line.replace("AUTOINCREMENT", "AUTO_INCREMENT")
    line = line.replace("DEFAULT 't'", "DEFAULT '1'")
    line = line.replace("DEFAULT 'f'", "DEFAULT '0'")
    line = line.replace(",'t'", ",'1'")
    line = line.replace(",'f'", ",'0'")
    in_string = False
    newLine = ''
    for c in line:
        if not in_string:
            if c == "'":
                in_string = True
            elif c == '"':
                newLine = newLine + '`'
                continue
        elif c == "'":
            in_string = False
        newLine = newLine + c
    print(newLine)

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

変えたのは `print` の文法のみ。Python2, 3の違いを知っていれば問題のない問題

### コンバート

```bash
$ cat dump.sql | python sqlite3-to-mysql.py > mysql.sql
```

みたいな感じにすると `mysql.sql` と言ったやつができているはず。

## MySQLに入れる

```bash
$ mysql -u USERNAME -p
mysql> CREATE DATABASE hoge CHARACTER SET utf8mb4;
mysql> USE hoge;
mysql> source /path/to/mysql.sql;
```

## 最後に

注意として特殊文字(絵文字等)はどうやらいい感じにコンバート後のインポートが上手く行かないのでそういうのが対処されてなくてもいいやっていう方は実践されてみてはいかかがでしょうか？
必要かどうかはわからんが、Watsonで物語の感情分析した結果

うちの会社のProductのアルファ版として、Watsonを使って、物語の感情分析をしてグラフ化するっていうのをしてるんですけど、英語はそこそこ取れました。そこで日本語は解析できないので、人間が英語に翻訳したものと、機械が英語翻訳したものでどれぐらい変わるのかなと調査しました。

使ったのは、宮沢賢治の注文の多いレストランです。

やり方は、代名詞が抽出できないので、まず名前を置き換えます。その後、ToneAnalyzerに掛けます。
（我々の場合はシステムでやりましたが、Toneだけ抽出するならPlayGrandだけでOKです）

その際、機械が抽出しやすいサイズに切ってから読み込ませます。

その時の結果の抜粋です。全部で56ページありますが、長いので5枚掲載します。

![「注文の多い料理店」 人の翻訳とGoogle翻訳の 解析結果の比較グラフ1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18072/52937782-be1e-0a68-47bf-1f7b6f78cdea.jpeg)

![「注文の多い料理店」 人の翻訳とGoogle翻訳の 解析結果の比較グラフ3.jpg](https://qiita-image-store.s3.amazonaws.com/0/18072/ff82123c-990c-e7ad-6e3e-d03d5cf6bc20.jpeg)

![「注文の多い料理店」 人の翻訳とGoogle翻訳の 解析結果の比較グラフ４.jpg](https://qiita-image-store.s3.amazonaws.com/0/18072/5aa220b2-78e1-1315-c6e2-2d500bfa2953.jpeg)

![「注文の多い料理店」 人の翻訳とGoogle翻訳の 解析結果の比較グラフ５.jpg](https://qiita-image-store.s3.amazonaws.com/0/18072/876b331e-5697-e320-c4ef-154fea161af9.jpeg)

![「注文の多い料理店」 人の翻訳とGoogle翻訳の 解析結果の比較グラフ６.jpg](https://qiita-image-store.s3.amazonaws.com/0/18072/ae76bae7-046c-876f-a045-cc2edbada513.jpeg)

これをみてもらうと、大体あっているところと、大幅にずれているところに分かれているのがわかると思う。これから言えるのは、物語であるから日本語からの翻訳時に感情で読み替えてしまっているため、人間としてはこのシーンの恐怖はより強く表現している、機械はニューラルネットワーク的（つまりは平均的）には、嫌悪を強く表現していたという風に解釈できたのかもしれないということです。

これは最近のGoogle翻訳だから出来たことだと思います。当然意味不明の翻訳になっている部分はあるものの、ToneAnalyzerは特定の単語に依存して抽出しているわけではないので、そのシーン（わたし達はスクリーンと呼んでいる）の平均値として返しています。

ちなみに、この抽出パラメーターをキャラクターごとにマッピングして、更に判定し直して、統計値を使ってグラフ化しているのが我々のサービスです。

現在は１２分割したものしか出していませんが、既に細かくデータを切っているので、表現だけ変えれば、より細かくグラフ化することは自動で可能です。

皆さんのご要望があるのか無いのか、わからなかったので、出してきませんでしたが、我々の研究の成果はこんな感じです。今後はGoogle翻訳APIを使っても粒度的には問題ないと判断して、日本語も含めてやっていこうと思います。

皆さんからのご意見お待ちしています。
組合せ最適化で星の調査

# これなに
- 光子ロケットで1列に連なる1000個の星を調査する。
- エイリアンがいないか調べよう。ただし、全ての星を調べることはできない。
- 星ごとに調査時間は異なる。調査対象の星の調査時間の総和は、10000日以内にしよう。
- 星ごとに発見確率を推定している。調査対象の星の発見確率の総和を最大化せよ。

# 解いてみる
[ナップサック問題](http://qiita.com/SaitoTsutomu/items/d3c07494e7ba992bf19d)として、考えることができる。Pythonで解いてみよう。
Pythonによる数理最適化については、参考リンクを参照のこと。

```py3:python3
import numpy as np
from pulp import *
np.random.seed(1)
星数 = 1000
調査時間 = np.random.randint(10,100,星数)
発見確率 = np.random.random(星数)/100000
m = LpProblem(sense=LpMaximize)
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
m += lpDot(発見確率,x)
m += lpDot(調査時間,x) <= 10000
m.solve()
print(value(m.objective)) # 発見確率の総和
>>>
0.0022822674119170536
```

実は、ロケットは、最大航続可能距離がある。ここでは、単純に距離ではなく、最大ホップ数+1をmxとする。
mxを変えたとき、目的関数がどうなるか見てみよう。横軸はmx、縦軸は目的関数である。

```py3:python3
r = []
for mx in range(4,17):
    m = LpProblem(sense=LpMaximize)
    x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(星数)]
    m += lpDot(発見確率,x)
    m += lpDot(調査時間,x) <= 10000
    for i in range(星数-mx+1):
        m += lpSum(x[i:i+mx]) >= 1 # mx以内に1か所以上調査する
    m.solve()
    r.append(value(m.objective))

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16);
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/0e33f07c-692f-3e94-9f91-0f2e592df774.png)


拡大してみる。

```py3:python3
plt.plot(range(4,17),r)
plt.hlines(0.0022822674119170536,4,16)
plt.xlim((9,16))
plt.ylim((0.00227,0.0023));
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/4b0ced6f-80b0-71fa-523d-572a509a8477.png)

デフォルトの無料のソルバーCBCだと、誤差のせいで、制約条件が厳しい方が解がよくなったりしている。

商用ソルバーは、より正確に解けた。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/32b1f28a-2e5f-950d-bde6-e9ca02bb21e2.png)


参考リンク
- [最適化におけるPython - Qiita](http://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)

以上
PhpStormでPHPUnitを設定する


Vagrant内のテスト（php7.1）を実行する場合の設定です。

#PHPUnitをConfigurationに追加

##Configurationウィンドウの呼び出し

右上の `▼` を押して `Edit Configurations..` を選択して、

![スクリーンショット 2017-04-25 12.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/109241/d78c5dd0-1bab-ab7c-4882-05ff5c1b4d5f.png "スクリーンショット 2017-04-25 12.54.18.png")


左上の `+` を押して `PHPUnit` を選ぶ。

![スクリーンショット 2017-04-25 12.55.46.png](https://qiita-image-store.s3.amazonaws.com/0/109241/ed6322fe-0597-4e55-a755-bc4010038f20.png "スクリーンショット 2017-04-25 12.55.46.png")

##入力する項目

今回はプロジェクト内にある `phpunit.xml` で設定してみます。

- `Name`：テストの名前（好きにつける）
- `Test Runner`：`Defined in the configuration file` にする
- `User alternative configuration file` をチェックし、フォルダ内の `phpunit.xml`ファイルを選択
- `Test Runner options` ：テストしたい場所（たぶん）
	- `commons` フォルダ内のテストのみを走らせたいなら `/common` と書く（たぶん）

入力したら「インタプリタの設定してください」と怒られたので、ウィンドウ下部の `Fix` をクリック。

##インタプリタの設定

リモートとしてVagrantを設定。

![スクリーンショット 2017-04-25 13.11.55.png](https://qiita-image-store.s3.amazonaws.com/0/109241/44d3457a-778f-3a98-a71c-521e4ba5ecff.png "スクリーンショット 2017-04-25 13.11.55.png")

`Vagrant Instance F...` でVagrantの入ってるフォルダを選択する。
`Vagrant Host URL` が表示され、 `PHP interpreter path` も変わってよしなにしてくれた。

#PHPUnitの設定

今回のVagrant内ではphp7.1に設定してあるので、PHPUnitのインタプリタも7.1に設定する。

- `Preference` > `Languages&Frameworks` > `PHP` > `PHPUnit` を選ぶ
- 左上の `+` でリモートを追加
- `CLI Interpreter` をVagrantの `Remote PHP7.1` に
- `PHPUnit library`： `Use Composer autoloader` にチェック
- スクリプトのパスを記入（今回は `/var/www/html/admin/vendor/autoload.php` ）

#実行

右上の虫マークを押すだけ。

![スクリーンショット 2017-04-25 17.33.18.png](https://qiita-image-store.s3.amazonaws.com/0/109241/95adc4a6-53cd-636a-169c-be0e9473eb64.png "スクリーンショット 2017-04-25 17.33.18.png")
Android メモ ー Permissionでハマった

##何があった
`SettingsActivity extends AppCompatActivity`のメンバークラス（メンバクラス）として`SettingsPreferenceFragment extends PreferenceFragment`を定義した。

`SettingsPreferenceFragment`で`ActivityCompat.requestPermissions()`を呼び出し、`onRequestPermissionsResult()`で受け取ろうとしたらなぜか呼び出されなかった事件

##どうした
理由はごく単純だった。
`ActivityCompat.requestPermissions()`を呼び出したら、この場合、`SettingsActivity.onRequestPermissionsResult()`が呼び出されていた。

`onRequestPermissionsResult()`を`SettingsActivity`に移動させたら呼び出された。

##まとめ
ちゃんとリファレンス読もう
Arduinoシリアルポートでラズパイと通信する（USB使用）


##はじめに
最近ラズパイとArduinoでシリアル通信をしてArduinoからモータに信号を出したり、Arduinoに繋いだセンサの値をラズパイで処理したりしています。なんだかんだで安定動作させるまで時間がかかったのでメモしておきます。ちなみに初投稿です。

##使用環境・ライブラリ
####Raspberry Pi3 modelB+
・node.jsを使用。シリアルポートの制御に[Node Serialport](https://github.com/EmergingTechnologyAdvisors/node-serialport)というnodeモジュールを使用
 
Arduino UNO
いつもながらのCっぽい専用言語。

##ラズパイ側
```js:serialTest.js
var SerialPort = require('serialport');
var port = new SerialPort('/dev/ttyACM0');
var flag = false;
/*Arduinoからの応答を受け取るdataイベントを登録*/
port.on('data',function(data){
    /*Arduinoを初期化する時、そのシリアルポートが準備されているか確認*/
    if(data.readInt8(0) == -1){
        flag = true;
        console.log("ready");
    }
    /*不正な値を検出して停止*/
    else if(data.readInt8(0) == -2){
        flag = false;
        console.log("abnormal stop");
    }
});
/*以降、flagを用いて処理を分ける。シリアルポートへの書き込みにはport.write(data)を使う*/

```

##Arduino側
```c:serialTest.c
byte dataAry[n];
void setup() {
  Serial.begin(9600);
  //シリアルポートの準備ができるまで待機
  while(!Serial){}
  //準備完了時に-1を送信
  Serial.write(-1);
}
void loop() {}
//シリアルポートにデータがある時呼び出される。
void serialEvent(){
  while(Serial.available()){
    //dataAryの先頭nバイトにシリアルからのデータが読み込まれる。
    Serial.readBytes(dataAry,n);
  }
}

```

ラズパイ側からシリアルポートを開く命令が届いてからArduinoの準備ができるまで、ラズパイからデータが届かないように注意しましょう。
分散, 標準偏差ぐらいまでの統計

まずは分布の異なる2種類のdataを作成する。

```py3:dataの生成
import numpy as np
np.random.seed(seed=32)
groupA = np.random.normal(100, 20, 100000) #平均100, 標準偏差20の数値をrandomに100000個生成
groupB = np.random.normal(100, 50, 100000) #平均100, 標準偏差50の数値をrandomに100000個生成

print("groupAのsample : {}".format(groupA[0:5]))
print("groupAのsample : {}".format(groupB[0:5]))
```

```text
groupAのsample : [  93.02211098  119.67406867  111.61845661  101.40568882  115.55065353]
groupAのsample : [ 122.71129387  134.76068077   88.52182502   92.52887435  107.2470646 ]
```

## 平均
まずは平均を見てみると、以下の通り、どちらのグループの数値も平均100付近となる（平均100を指定してるので当たり前）。

```py3:mean
meanA, meanB = np.mean(groupA), np.mean(groupB)
print("groupAの平均 = {}, groupBの平均 = {}".format(meanA, meanB))
```
```text
groupAの平均 = 100.0881959959255, groupBの平均 = 100.13663565328969
```

しかし、以下のようにhistgramを書いてみると明らかに分布が異なる。groupBはgroupAに比べて山の裾が広く、なだらかな感じ(標準偏差の値が違うので当たり前)。

```py3
import seaborn as sns
sns.distplot(groupA, bins=100, label='groupA', kde=False)
sns.distplot(groupB, bins=100, label='groupB', kde=False)
plt.legend()
plt.show()
```
![image](https://qiita-image-store.s3.amazonaws.com/0/107647/7060874b-30e5-6b6a-e97f-ec35cd85477a.png)

このように平均だけで比較するとGroupAとGroupBは同等の集団のように思えるが、実はgroupAよりもgroupBの方が値のバラつきが大きいという情報が捨てられている。こういった数字のバラつきを表現する要約統計量が分散や標準偏差である。
※平均も中央値も最頻値も四分位値も要約統計量なので、分散とか標準偏差だけがそう呼ばれているわけではないです。

## 分散
分散は以下の数式で計算できる

```math
S^2 = \frac{1}{n}{\sum_{i=1}^n(x_i-\bar{x})^2}
```

つまり `(各値 - 平均値)を二乗したものを全て足し合わせて、データ数で割ったもの` である。
各値から平均値をマイナスすることで、平均からどれくらい乖離しているのかを表す指標になりそうだが、それだと負の値になることもあるため、二乗している。
あとはそれを合算し、データ数で割ることで、そのデータのバラつき具合を表現できる。
ちなみに各値-平均値の結果は偏差、それを二乗し、全て足し合わせた値を偏差平方和という。

pythonで書くとこんな感じになる。

```ｐｙ３:偏差
groupA[0] - groupA.mean()
```

```py3:偏差平方和
s = np.sum((xi - groupA.mean())**2 for xi in groupA)
print(s)
```

```text
40178555.707617663
```

```py3:分散
var = sum / len(groupA) 
print(var)
```

```text
401.78555707618096
```

```python:groupA,B両方の分散を出してみる
a = ((groupA - groupA.mean())**2).sum()/len(groupA)
b = ((groupB - groupB.mean())**2).sum()/len(groupB)
print("groupAの分散:{:.2f}\ngroupBの分散:{:.2f}".format(a, b))
```

```text
groupAの分散:401.79
groupBの分散:2496.21
```

という事で、それぞれの分散がわかり、groupBはAより分散が大きく、数値が平均値付近に集中していない。つまり、ばらついているということがわかる。

## 標準偏差
Bの方がバラついていることはわかったが、groupAもgroupBも平均100付近の数値の集合だったのが「分散が2496」ですと言われてもよくわからない。そういうときは標準偏差を出すと良い。

```math
S=\sqrt{S^2}
``` 

標準偏差は分散の平方根である。分散を計算する際に2乗していたので、ココで平方根をとることにより、元の次元に戻っている。そのため、どの程度数字がばらついているのかを理解しやすくなる。

```py3:標準偏差
print("groupAの標準偏差:{:.2f}\ngroupBの標準偏差:{:.2f}".format(math.sqrt(a), math.sqrt(b)))
```
```text
groupAの標準偏差:20.04
groupBの標準偏差:49.96
```

## 最後に
numpyは便利なので、平均も分散も標準偏差も簡単に計算できます。

```py3
mean = groupA.mean()
var = groupA.var()
std = groupA.std()
print("平均:{:.2f} 分散:{:.2f} 標準偏差:{:.2f}".format(mean, var, std))
```
```
平均:100.09 分散:401.79 標準偏差:20.04
```
Visual Studio / WPF > コントロール > CheckBox > Indeterminateプロパティ > IsThreeStateをTrueにすることで選択可能

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.4211 / 9985

CheckBoxに関して「Indeterminate」プロパティの記載がある。
> IsCheckedプロパティがnullになったときに呼び出されます。

どういうものかというと、TrueでもFalseでもない「不確定」の状態のことのようだ。
参考: https://code.msdn.microsoft.com/windowsdesktop/XAML-CheckBox-Indeterminate-edf7b32f

CheckBoxのIsThreeStateプロパティをTrueにすることで、ユーザが「不確定」を選択できるようになる。

```xml:XAML
<Window x:Class="_170425_t1950_checkbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170425_t1950_checkbox"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <CheckBox Content="CheckBox1" IsThreeState="True"></CheckBox>
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d0333fe7-d9f3-6836-3dfd-9cabd4e2dbd5.png)
Visual Studio / WPF > コントロール > ToolBar

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.4119 / 9985
> ToolBarコントロールは、名前の通り、アプリケーションのツールバーを実装するためのコントロールです。ToolBarコントロールは、ToolBarTrayコントロール内に配置する形で実装します。

試してみた。

```xml:XAML
<Window x:Class="_170425_t1840_toolbar.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170425_t1840_toolbar"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="0, 30, 0,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ToolBarTray Grid.Row="0">
            <ToolBar x:Name="toolbar1">
                <Button Content="Button1"/>
                <Separator/>
                <Button Content="Button2"/>
                <Button Content="Button3"/>
            </ToolBar>
            <ToolBar x:Name="toolbar2">
                <Button Content="Button4"/>
                <Button Content="Button5"/>
                <Button Content="Button6"/>
            </ToolBar>
        </ToolBarTray>
        <Button Grid.Row="1" Content="Button1" 
                Click="reset_toolbar"
                MaxHeight="30" MaxWidth="100"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _170425_t1840_toolbar
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void reset_toolbar(object sender, RoutedEventArgs e)
        {
            toolbar1.BandIndex = 0;
            toolbar2.BandIndex = 1;
        }
    }
}
```

Buttonを押したときに配置を元に戻すようにしてみた。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1eb53056-c43d-433b-e7ce-0a43406c33c4.png)
Angularの declarations, imports, providers の使い分け


こんにちわ。はこです。
Angularを書くときに最初にこのように書きますね。

```
@NgModule({
    // なんやかや〜〜〜
    declarations: [AppComponent],
    imports: [BrowserModule],
    providers: [MyService],
    bootstrap: [AppComponent]
})
class AppModule {
}
```



あるいは、テストを書くときに、以下のように書きますね。

```
describe('MyGreatComponentのテスト', () => {
  let component;
  let fixture;

  // テスト準備
  beforeEach(async(() => {
    // テストベッド(テスト環境)構築
    TestBed.configureTestingModule({
      // なんやかや〜〜〜
      declarations: [ MyGreatComponent ],
      imports: [  ],
      providers: [  ]
    })
    .compileComponents();
  }));
  
  // テストコード
  it('isGreat() は常にtrueを返すこと。なぜならGreatだから', () => {
    expect(component.isGreat()).toBeTruthy();
  });
});

```


この「なんやかや〜〜〜」の部分は、どのように使い分ければよいのでしょうか。

### 実は簡単な使い分け


* **declarations** : ディレクティブ(含コンポーネント、パイプ）を書きます。 htmlテンプレートに書くもの、ですね。
* **providers** : Serviceなど、DIで解決するものをここに書きます
* **imports** : 外部のAngularモジュール。Httpモジュールとか、UIモジュールとか。



これだけです！

AppModuleの設定ではあまり悩まなくても、テストベッドの依存性解決では間違いやすそうですので注意したいですね！



#### その他、あまり使わない/設定変えないもの

* exports : モジュール作者向け。外部公開する対象を指定。
* bootstrap : 起動コンポーネント。 `AppComponent`を渡せばだいたい大丈夫
* entryComponents : テンプレート中で使ってない(`<app-my-great>`等の記述がない)コンポーネントを登録しとく
* schemas : 「Angular以外のカスタムエレメントのスキーマ指定」[らしい](https://angular.io/docs/ts/latest/api/core/index/NgModule-interface.html)…。おそらくAngular以外(ReactやVue.js)と共存するための機構。
 いまのところ`NO_ERRORS_SCHEMA`と`CUSTOM_ELEMENTS_SCHEMA `が指定できて、前者はあらゆるパターン、後者だと `<my-react-component>`等のハイフン区切りが許可されるみたい。