OmniAICreator/Qiita-1.07M huggingface dataset:
Multi WindowのPicture-in-pictureを試す方法を見つけたメモ

# 概要
ちょっと詳細は置いておいてPicture in pictureを利用できることがわかったので、メモとして書いておきます。
何か間違っていたら指摘お願いします。
Picture-in-pictureは常に上に一つのアプリを表示させることができます。
( // 常にPokemon GOを起動させておきたいという不純な動機で調べたりしていないです。)

**デバッグ用の機能だと思われるので自己責任でお願いします。**

# 手順

## force_resizable_activitiesをtrueにする

まず全てのActivityをresizeableにする以下の操作をします。

```
adb shell settings put global force_resizable_activities 1
```

これをした後に端末を再起動してください。

これをするとActivityManagerServiceの中でPictureInPictureが有効になるようです。

```
mSupportsPictureInPicture = supportsPictureInPicture || forceResizable;
```

## Activity Stackのidを確認する

adb shell am stack listを入力して
Picture-in-pictureで起動したいアプリがある stack idをメモします。 (1など)


```
$ adb shell am stack list
Stack id=1 bounds=[0,0][1080,1920] displayId=0 userId=0
  taskId=3236: com.android.settings/com.android.settings.Settings bounds=[0,0][1080,1920] userId=0 visible=true topActivity=ComponentInfo{com.nianticlabs.pokemongo/com.unity3d.player.UnityPlayerNativeActivity}
  taskId=3235: com.nianticlabs.pokemongo/com.unity3d.player.UnityPlayerNativeActivity bounds=[0,0][1080,1920] userId=0 visible=true topActivity=ComponentInfo{com.nianticlabs.pokemongo/com.unity3d.player.UnityPlayerNativeActivity}

Stack id=0 bounds=[0,0][1080,1920] displayId=0 userId=0
  taskId=3234: com.google.android.googlequicksearchbox/com.google.android.launcher.GEL bounds=[0,0][1080,1920] userId=0 visible=false topActivity=ComponentInfo{com.android.systemui/com.android.systemui.recents.RecentsActivity}
  taskId=3237: com.android.systemui/com.android.systemui.recents.RecentsActivity bounds=[0,0][1080,1920] userId=0 visible=false topActivity=ComponentInfo{com.android.systemui/com.android.systemui.recents.RecentsActivity}
```

## Picture-in-pictureする

1がstack idで その後に  LEFT,TOP,RIGHT,BOTTOMと続きます。

```
adb shell am stack move-top-activity-to-pinned-stack 1 0 0 400 800
```

これでこんな感じになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/c15248ed-70d5-5e8b-2634-fa634e6f58fe.png)

ちなみになぜmove-top-activity-to-pinned-stackでPicture in pictureなのかはわかりませんが、enterPictureInPictureMode()メソッド内で、moveActivityToPinnedStackLocked()を呼び出しているので内部的にはそう呼ぶのかもしれません。
https://github.com/android/platform_frameworks_base/blob/nougat-release/services/core/java/com/android/server/am/ActivityManagerService.java#L7536

解除は adb shell am stack remove スタックidでいけるはずです

##おまけ
ここだけメモすればOKかも

あるアプリ(pokemongoというパッケージが含まれるもの)をPicture-in-pictureで表示する

`adb shell am stack list|awk '/Stack id.*/{laststack = substr($2,4)} /.*pokemongo.*/{print laststack;exit}'|xargs -I^ adb shell am stack move-top-activity-to-pinned-stack \^ 0 0 100 150`

あるアプリのPicture-in-pictureを解除する

`adb shell am stack list|awk '/Stack id.*/{laststack = substr($2,4)} /.*pokemongo.*/{print laststack;exit}'|xargs -I^ adb shell am stack remove \^`
Perlを学ぶときに確認すること

「[新しい言語を学ぶときに確認すること](http://qiita.com/magnolia_k_/items/dd41fef72b74c170e665)」という記事の形式で「Perlを学ぶときに確認すること」をまとめてみました。

# セットアップ方法

## 言語のインストール方法

### Mac OS X

`$ brew install perl`

### Linux - Ubuntu

`apt-get install perl`

### Linux - CentOS

`yum install perl`

### Windows

ActivePerl

[http://www.activestate.com/activeperl](http://www.activestate.com/activeperl)

### plenv

plans

[https://github.com/tokuhirom/plenv](https://github.com/tokuhirom/plenv)

### perlbrew

perlbrew

[https://perlbrew.pl](https://perlbrew.pl)

## ビルドツールの使用方法

### ExeUtils::MakeMaker

[https://metacpan.org/pod/ExtUtils::MakeMaker](https://metacpan.org/pod/ExtUtils::MakeMaker)

### Module::Build

[https://metacpan.org/pod/Module::Build](https://metacpan.org/pod/Module::Build)

## パッケージ（ライブラリ）マネージャーの使用方法

### cpanm

[https://github.com/miyagawa/cpanminus](https://github.com/miyagawa/cpanminus)

### cpm

[https://github.com/skaji/cpm](https://github.com/skaji/cpm)

### Carton

[https://metacpan.org/pod/Carton](https://metacpan.org/pod/Carton)

## プロジェクトのひな形の作り方

### Minilla

[https://metacpan.org/pod/Minilla](https://metacpan.org/pod/Minilla)

## REPL(Read-eval-print loop)の使用方法

*現状定番モジュールは無い模様…*

## エディタの設定

たいていのエディタでは、拡張子を.pmか、.plにすれば、Perlと認識する模様

# 実際のコードを書く

## 基本的な文法を理解する

### 初めてのPerl

[https://www.amazon.co.jp/初めてのPerl-第6版-Randal-L-Schwartz/dp/4873115671](https://www.amazon.co.jp/初めてのPerl-第6版-Randal-L-Schwartz/dp/4873115671)

### 最速Perl文法マスター

[http://d.hatena.ne.jp/perlcodesample/20091226/1264257759](http://d.hatena.ne.jp/perlcodesample/20091226/1264257759)

## テストコードの書き方を理解する

### Test::More

[https://metacpan.org/pod/Test::More](https://metacpan.org/pod/Test::More)

## 外部リソースへのアクセス方法を確認する

### Furl

[https://metacpan.org/pod/Furl](https://metacpan.org/pod/Furl)

### JSON

[https://metacpan.org/pod/JSON](https://metacpan.org/pod/JSON)

## Web Application Frameworkの使い方を理解する

### Amon2

[http://amon.64p.org](http://amon.64p.org)

### Plack

[http://plackperl.org](http://plackperl.org)

# 情報リソース

## 言語やライブラリのリポジトリへのアクセス方法を確認する

### cpan

[http://cpan.perl.org](http://cpan.perl.org)

## ドキュメントへのアクセス方法を確認する

### cpan

[http://cpan.perl.org](http://cpan.perl.org)


## コミュニティ

### 五反田.pm

[http://gotanda-pm.connpass.com](http://gotanda-pm.connpass.com)

### 吉祥寺.pm

[http://kichijojipm.connpass.com](http://kichijojipm.connpass.com)
Chat Botをビジネスで使うときの3つの心得

# その１ Chat Botを作る目的を明確的にせよ！
Chat Botを使ってビジネスをする際には目的に対して以下のことを守る必要がある
- 解決したい問題がありChat Botが解決できること  
既存のシステムで用件を満たしている場合は無理やりChat Bot化しないこと

- 目的に対して、効率的であること  
例えばユーザーは特徴のみをChat Botに伝え、Chat Botが豊富な商品の中からそれに適した商品を選びユーザーにオススメするなど。  
ユーザーが「特徴にあった商品を探す」という目的に対して、Chat Botがユーザーに質問し「特徴にあった商品を探す」ことにより  
ユーザーは豊富な商品の中から効率的に「特徴にあった商品」を見つけることができる。

# その２ 操作ログのフィルタリングを行いBotを日々調整せよ！
良い反応をしないBotは利用されなくなるので、一度Botを作成したら終わりではなく　　
日々操作ログのフィルタリングを行い適切な応答をする調整をしよう。
コスト計算をする際はメンテの工数を忘れずに。

# その3 出来るだけ簡単な入力ができるようにせよ！
なるべくChat BotにはChat Botがやるべきことのみをやらせる。
「はい」や「いいえ」など定型的な入力はボタンを押させるなどにし文字入力にこだわらないようにしよう。

# 現在の自然言語処理ができること
### 2016年9月現在、心得その１で述べたChat Bot(自然言語処理)ができることは大まかに以下である
- 文章の分類
- 類似した文章の検索
- 頻出語や特徴語の抽出(マイニング)
- 文章の要約
- 質問回答  
企画をする際は上記を意識すると効率的なChat Botを作成できる。
Eclipse のワークスペースを別マシンを移動したメモ

先日職場で席替えがあり、そのときに Eclipse のワークスペースを移動したときのメモ。

Eclipse に慣れていないため物凄くアナロギーで、最適な方法ではないかも。

環境
----

### OS

- Windows 10

### Eclipse

- Eclipse 4.6.0 (Neon)

### 開発内容

- Java
- Dynamic Web Project
  - サーバーは Tomcat v8.0 を使用

移動元での作業
----

データをエクスポートするだけなので単純。

### USB にエクスポート

1. File → Export
1. General → Archive File → [Next]
1. Temp 系のフォルダ以外全てにチェックを入れる
1. [Finish]

移動先での作業
----

### インポート前

#### ワークスペースの場所を変えてもいい場合

1. Eclipse を起動しておく
1. ワークスペースの新規作成
  1. File → Switch Workspace → Other
  1. パス欄に新しいパスを入れる

#### ワークスペースの場所を変えてはいけない場合

特殊な例。

うちの環境ではワークスペースのパスを極力変えてはいけないようだったので。

1. Eclipse を終了しておく
1. ワークスペースのフォルダをどこか別の場所に移しておく
1. Eclipse を起動
1. ワークスペースの新規作成
  1. File → Switch Workspace → Other
  1. パス欄には上記のフォルダの位置がそのまま入っているはずなので、それを使う

### インポート

1. インポートのメニューを開く
  - File → Open Projects from File System
1. [Archive]
  - エクスポートしたファイルを選択
1. 一覧のうち、フォルダ名のみの項目を除いて選択
1. [Finish]

### インポート後の設定

個人的に忘れがちで、クリティカルになり得るものだけを抜粋。

#### 文字コード

1. Windows → Preferences
1. General → Workspace → Text file encoding
1. `UTF-8` に変更

#### サーバーのランタイム環境

上記の方法でインポートを行うと、サーバーを使った開発環境でエラーが起きている。

ランタイム環境を指定し直す必要がある。

1. Windows → Preferences
1. Server → Runtime Environments -> [Add]
1. Apache → Apache Tomcat {version} → [Next]
1. Tomcat のフォルダを選ぶ
1. [Finish]
RaspberryPiの初期設定


RaspberryPiで環境を作ってみたので備忘録。

# 環境
* RaspberryPi 3 Model B

# 手順
## OSのインストール
1. Raspberry Piの公式サイトより、OSインストーラー「NOOBS」をダウンロード
  * [公式](https://www.raspberrypi.org/downloads/)
2. SDカードフォーマッターでSDカードをフォーマット
  * [SDカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)
3. ダウンロードしたNOOBSの中身をフォーマットしたSDカードにコピー
4. RaspberryPiをセッティング
  * NOOBSをコピーしたSDカード
  * LANケーブル
  * USBキーボード
  * USBマウス
  * 電源
5. 電源を入れたらNOOBSが起動するので「Raspbian」を選択して「Install」

## パッケージの更新
```
$sudo apt-get update
$sudo apt-get upgrade
```

## タイムゾーンの設定
1. [Menu]->[Preferences]->[Raspberry Pi Configuration]を開く
2. [Localisation]の「Set Timezone」を押下
3. Areaを **Japan** にして「OK」を押下


## ネットワークの設定
### Wifiの有効化
1 無線の設定を設定ファイルに書き込む

```
$sudo sh -c 'wpa_passphrase SSID PASSPHRASE >> /etc/wpa_supplicant/wpa_supplicant.conf'
```
2 パスワードが記載されてしまうので削除

```
$sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```
```
...
 #psk="XXXXXXXXXXx"  ←この行を削除
...
```

3 RaspberryPiをシャットダウンし、LANケーブルを抜いて再起動

### ipの固定

1 設定ファイルを開く

```
$sudo vi /etc/network/interfaces
```

2 設定ファイルを変更

```
....
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    address 192.168.XX.XX   ←追加
    netmask 255.255.255.0   ←追加
    gateway 192.168.XX.XX    ←追加
....
```

(参考:[Raspberry Pi 3を買ってMacを使ってWiFi接続とSSHの接続するまで](http://qiita.com/toshihirock/items/8e7f0887b565defe7989))
## ユーザ関連の設定
### rootユーザのパスワードを設定
```
$ sudo passwd root
```

### 新規ユーザの追加
1 ユーザを追加

```
$ sudo adduser ユーザ名
```

2 追加したユーザをsudoグループに登録

```
$ sudo gpasswd -a ユーザ名 sudo
```

### piユーザのsudo解除
1 設定ファイルを修正

```
$ sudo vi /etc/sudoers
```

```
...
#pi ALL=(ALL) NOPASSWD: ALL  ←先頭に#をつけてコメントアウト
...
```

2 sudoから外す

```
$ sudo gpasswd -d pi sudo
```

（参考:[使用する前に行うべき設定 ](http://make.bcde.jp/raspberry-pi/%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%B9%E3%81%8D%E8%A8%AD%E5%AE%9A/)）
Xcode8環境下でrbenvにてrubyのコンパイルに失敗する

```shell-session
$ rbenv install 2.3.1

Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...

BUILD FAILED (OS X 10.11.6 using ruby-build 20160602)

Inspect or clean up the working tree at /var/folders/w1/_jhh90bj5lx0xg0hycdqvjs40000gn/T/ruby-build.20160918151039.20332
Results logged to /var/folders/w1/_jhh90bj5lx0xg0hycdqvjs40000gn/T/ruby-build.20160918151039.20332.log

Last 10 log lines:
  Referenced from: /private/var/folders/w1/_jhh90bj5lx0xg0hycdqvjs40000gn/T/ruby-build.20160918151039.20332/ruby-2.3.1/./miniruby (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _clock_gettime
  Referenced from: /private/var/folders/w1/_jhh90bj5lx0xg0hycdqvjs40000gn/T/ruby-build.20160918151039.20332/ruby-2.3.1/./miniruby (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

make: *** [encdb.h] Trace/BPT trap: 5
make: *** Waiting for unfinished jobs....
make: *** [.rbconfig.time] Trace/BPT trap: 5
```

Mac OS X 10.12 用のが入っているのが原因なようなので、必要なツールをインストールする

```shell-session
$ xcode-select --install

xcode-select: note: install requested for command line developer tools
```

そうすると

```shell-session
$ rbenv install 2.3.1                                                                      
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...
Installed ruby-2.3.1 to /Users/xxxx/.rbenv/versions/2.3.1
```

と解決
1分でonsenui ver2の開発環境を構築する(2016年9月時点)

# 前提条件
- npmがインストール済み
- mac OS(OSX)

# 構築後に使用可能になるもの
- monacaコマンド
- onsen ui(v2含む)各種開発環境

# 構築
## ステップ1 monacaコマンドのインストール
### monacaとは
ハイブリッドアプリの開発環境。日本製。有名。

### セットアップ
ターミナルを開き、以下コマンドを入力してください。

```
$npm install -g monaca
```

以上!

# サンプルコードの作成
## 生成
ターミナルを開き、サンプルコードを生成したディレクトリに移動し、
以下コマンドを実行してください。

```
$monaca create hogehoge
```

すると、どのようなフレームワークベースでサンプルコードを生成するか聞かれるので、
希望のフレームワークを方向キーで選択し、Enterを押してください。
フレームワークを使わないものも選択できます。

選択後、しばらくするとサンプルコードが生成されます。

## 実行
先程作成したサンプルコードのディレクトリに移動し、
以下のコマンドを実行してください。

```
$monaca preview
```

ブラウザが立ち上がり、サンプルコードが実行されます。

以上となります。
詳しく知りたい方は、公式サイト(英語)をご覧ください。
(https://onsen.io/getting-started/)
Swift3.0まとめ - 関数・クロージャ -

こちらのSwift3.0バージョンです
http://qiita.com/merrill/items/2e143c0e3ecfb04243a2


## 関数

**引数なし・戻り値なし**

```swift
func hello(){
    print("Hello!")
}
```

**引数なし・戻り値あり**

```swift
func hoge() -> Int{
    return 100
}
```

**引数あり・戻り値あり**

```swift
func hoge(num: Int) -> Int{
    return num
}

hoge(num: 100)
```

**引数あり（引数の名前を省略）**

```swift
func hoge(_ a: Int){
    print(a)
}

hoge(100) // a： を省略できる
```

**引数あり（複数）**

```swift
func hoge(a: Int, b: String){
    print(a)
    print(b)
}

hoge(a: 100, b: "テスト")
```

**引数あり（複数かつ数を指定しない）**

引数の値は配列として格納される。

```swift
func hoge(a: Int...){
    print(a[0])
    print(a[1])
}

hoge(a: 100, 200)
```


**引数あり（初期値を設定）**

```swift
func hoge(a: Int = 100){
    print(a)
}

hoge() // => 100
hoge(a: 200) // => 200
```

**引数を使って変数宣言**

引数のパラメータは、通常定数(let)として扱われるので、値を代入することはできない。

```swift
func hoge(a: Int){
    a = 200 // エラー
}

hoge(a: 100)
```

代入したい場合は、関数の中でvarの変数に入れ直す

```swift
func hoge(a: Int){
    print(a) // => 100
    var a = a
    a = 200
    print(a) // => 200
}

hoge(a: 100)
```

**引数名とは違う名前を呼び出し時に指定**

（あまりない使わない）

```swift
func hoge(num a: Int){
    print(a)
}

hoge(num: 100)
```

**戻り値が複数**

タプルを使用する

```swift
func compareNumber(arr: [Int]) -> (min: Int, max: Int) {
    let min = arr.min()
    let max = arr.max()
    
    return (min!, max!)
}

var result = compareNumber(arr: [1,2,3,4,5,6,7,8,9,10])
result.min // => 1
result.max // => 10
```

## オーバーロード

引数の数や、外部引数の名前が異なれば、同じ名前の関数をたくさん定義できる。

```swift
func hoge(){
    print(100)
}

func hoge(a: Int){
    print(a)
}

func hoge(b: Int){
    print(b)
}

hoge() // => 100
hoge(a: 200) // => 200
hoge(b: 300) // => 300
```

## クロージャ

名前がない関数。{}で囲まれたブロック。メソッドのように呼び出すのではなく、その場で実行される。関数の引数でよく利用される。

**引数なし・戻り値なし**

型は `() -> Void`

```swift
{() -> void in
  ...
}
```

**引数あり・戻り値なし**

型は `(a: Int) -> Void`

```swift
{(a: Int) -> Void in
  ...
}
```

**引数あり・戻り値あり**

型は `(a: Int) -> Int`

```swift
{(a: Int) -> Int in
    return a
}
```

クロージャを変数に入れることも可能

```swift
var block = {(a: Int) -> Int in
    return a
}

block(2) // => 2
```

サーバリクエストのコールバックとして、クロージャを引数で受け取る関数を書くのはよく使われる

```swift
# requestメソッド呼び出し
request(
    params: params,
    success: {() -> Void in
        print("通信成功")
    }, 
    error: {() -> Void in
        print("通信エラー")
    }
)

# クロージャを受け取るrequestメソッド
func request(request: [String:Any], success:()-> Void, error:()-> Void) {
    //渡されたクロージャを実行する
    success()
}
```

クロージャを Optional にする場合

```swift
func request(success: (()->Void)?) {
    success?()
}
```
Azureの各サービス別の課金状況を調べる

#はじめに
今月の課金、こんなに高くなっちゃった！等といったことに遭遇したことはありませんか？
複数のサービスやサブスクリプションをAzure上で持っている場合、どのサービスが高いのだろう？と調べたいかと思います。調査するには、Azure ポータルの「課金」機能を利用して確認できます。

#事前に準備するもの
課金状況を確認するには、「グローバル管理者」または「課金管理者」である必要があります。
権限の詳細については「Azure Active Directory での管理者ロールの割り当て」をご覧ください。
https://azure.microsoft.com/ja-jp/documentation/articles/active-directory-assign-admin-roles/


#確認方法
Azure Portalから、「その他のサービス」を選択し、「課金」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/4efe7756-6657-9862-9c42-33a0ab4af598.png)

「サブスクリプションコスト」から、明細を確認したいサブスクリプションを選択します。
複数持っている場合は、複数行表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/bce12ecb-0b4b-524a-09e7-30c64b733f17.png)

この画面からでも、金額の割合が確認できますが、詳細を確認するために、「リソースごとのコスト」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/75d608c2-0c96-3282-168d-df9a44de7e4d.png)

これで各サービス別での課金金額が確認できました。
フィルターをかけることもできます。
Resource Type：　リソースの種類を選択します。
Resource Group：　事前にデプロイ時に設定したリソースグループ名を指定します。
Timespan：　集計する期間を指定します。既定では、30日間（Past 30 days）、90日間（Past 90 days）が選べますが、「Custom」を選択することで、特定の開始日と終了日を指定することも可能です。
Tag：　事前に設定した、タグを指定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/136660/35c4f288-3126-c8f6-f5d0-15e6d4073a54.png)
コミット前にrubocop等のコーディングツールを実行する

gitの機能である Git フックを使用する
詳しくは[こちら](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)を参照する

Git フックとは特定のアクションが発生した時にスクリプトを実行する機能である


プロジェクトのフォルダにある.git/hooksの中にあるファイルをいじる

今回はコミット前にスクリプトを実行したいのでpre-commit.sampleというファイルをいじる
最初にファイルの名前をpre-commitに変更する、そして下記のソースを記入

```:pre-commit
#!/bin/sh

for FILE in `git diff --cached --name-only HEAD`
do
  if [[ "${FILE}" =~ ".css" || "${FILE}" =~ ".scss" || "${FILE}" =~ ".sass" ]]; then
    $(npm bin)/csscomb ${FILE}
  elif [[ "${FILE}" =~ ".rb" ]]; then
    bundle exec rubocop ${FILE}
    if [ $? != 0 ]; then
      >&2 echo "Rubocop check failed, try running: bundle exec rubocop --auto-correct ${FILE}"
      exit 1
    fi
    rails_best_practices ${FILE}
    if [ $? != 0 ]; then
      >&2 echo "rails_best_practicesがwaringを検知、${FILE}を修正してください"
      exit 1
    fi
    reek ${FILE}
    if  [ $? != 0 ]; then
      >&2 echo "reekがwaringを検知、${FILE}を修正してください"
      exit 1
    fi
  fi
done

```

[rubocop](https://github.com/bbatsov/rubocop)、[rails_best_practices](https://github.com/railsbp/rails_best_practices), [reek](https://github.com/troessner/reek), [csscomb](https://github.com/csscomb/csscomb)に対応しています

もし、pre-commitフックをスキップしたければオプションで「-n」を追加してcommitしてください
5分でmacにreactの開発環境を構築する(2016年9月時点)

# 前提環境
- Developer Toolsをインストール済み
- mac OS(OSX)

# 構築構築後使用可能になるもの
- nodebrew
- node.js v6.6.0(記事作成段階最新)
- npm
- create-react-app

# 構築
## ステップ1 nodebrewのインストール
### nodebrewとは
nodejsのバージョン管理ツール。
コマンド一つでPC内にインストールされたnodeのバージョンを簡単に切り替えることができるツール。

### セットアップ
ターミナルを開き、以下コマンドを入力してください。

```
$ curl -L git.io/nodebrew | perl - setup
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
```

以上！

## ステップ2 nodejsとnpmのインストール
### nodejsとは
一番有名と言っても過言ではないはサーバーサイドjavascriptの実行環境

### セットアップ
ターミナルを開き、以下コマンドを入力してください。

```
$ nodebrew install-binary latest #最新のnodejsをインストール
$ nodebrew list #インストースされたバージョンを確認
$ nodebrew use v6.6.0 #使用するnodejsを選択
```

以上！

## ステップ3 create-react-appをインストール
### create-react-appとは
react用の公式開発環境。サンプル作成、サーバー機能、jsxコンパイラ等を含む。

### セットアップ
ターミナルを開き、以下コマンドを入力してください。


```
$npm install -g create-react-app
```

以上！

# サンプルコードの作成
ターミナルを開き、サンプルコードを生成したディレクトリに移動し、
以下コマンドを実行してください。

```
$create-react-app hogehoge
$cd hogehoge
$npm start
```

以上!
create-react-appに関する詳しい情報はこちら
(http://qiita.com/takanorip/items/ba7caa25d4611bba1a37)

---

以上でreactの開発環境が一通り整います。
変数名の命名規則/＊＊ケースの使い分け

# 強そうな順番で

[コンスタントケース](#コンスタントケース)
[パスカルケース](#パスカルケース)
[キャメルケース](#キャメルケース)
[スネークケース](#スネークケース)
[ケバブケース](#ケバブケース)
[プライベート変数（正式名募集中）](#プライベート変数（正式名募集中）)



##コンスタントケース
すべて大文字、単語をつなげる場合はアンダースコア。
`APP`
`GLOBAL_OBJECT`

・用途
定数、グローバル変数、その他強い意味を持たせたい時。

*※アッパーケースと呼ばれているのも見たことがあります。*

##パスカルケース
文字の先頭を常に大文字。アッパーキャメルケースとも言う。
`Animal`
`CatTower`

・用途
クラス


*（クラス以外で使ったら注意されました。）*

##キャメルケース
最初の単語以外の文字の先頭を大文字。ローワーキャメルケースとも言う。

`sleepyDog`
`silentSea`

・用途
インスタンス化した全ての変数、関数等。

##スネークケース
文字の単語間にアンダーバー。大文字を使うのも有りみたい。
`snake_road`

・用途
apiで返却されるjson objectのkey（DB値の制約により利用されることが有る）



*（周りのjs使いの方には、あまり良いとされていませんでした。lintなどの設定環境にも寄るのかな？）*

##ケバブケース
文字の単語間にハイフン。

*※チェインケースと呼ばれているのも見たことがあります。*

`left-box`

・用途
htmlタグの属性(data-*など)
htmlタグのclass指定



##プライベート変数（正式名募集中）
変数の最初にアンダースコア。
`_privateVar`

・用途
プライベート変数に利用される。



#終わりに
スーパー初歩的なことみたいですが、単純に目立たせたいために使うとほかの開発メンバーに怒られてしまうのでまとめてみました。


js視点で適当に書いてみましたが、ほかの言語ではこういう用途/使い分け、上記ルールに無いケースがあれば是非教えてください～＾－＾
hubot hubot-slackをdockerizeする

hubotをdockerizeする

```:Dockerfile 
FROM node

RUN mkdir /myapp
WORKDIR /myapp
ADD . /myapp
RUN npm install

EXPOSE  8080
CMD [ "bin/hubot", "--adapter", "slack" ]
```

```:docker-compose.yml
version: '2'
services:
  web:
    build: .
    command: bin/hubot --adapter slack
    volumes:
      - .:/myapp
    depends_on:
      - redis
  redis:
    image: redis:latest
```

別途、環境変数はdocker-composeに追加する
Capistranoでunicornとsidekiqをシンプルにrestartする

デプロイ完了後、currentディレクトリが最新のものに切り替わりますが、その際、unicornやsidekiqを再起動しないと、以前のreleaseのものを参照してしまい、思わぬトラブルが起きてしまいます (起きました)。

#### 簡単なことはシンプルにこなしたい

デプロイ時に自動でunicornとsidekiqを再起動させるため、capistrano3-unicornやcapistrano-sidekiqといったプラグインも使ってみましたが、コールバックで実行されるタイミングがよくわからなかったのと、プラグイン用の設定項目がいくつもある上それがバージョンによっては有ったり無かったりで、つまりは面倒くさそうだったので採用しませんでした。

また、初めてCapstranoを使う身としてはshared_pathやcurrent_pathがどのような扱いになっているのか、自分で手を動かしながら確認したかったというのもあり、あえて自前でタスクを作ってみました。

unicornにはダウンタイム無しで再起動するやり方もあるそうですが、今運用中のものは起動にあまり時間がかからないため、シンプルに一旦プロセスを落として新たに起動するという方法をとっています (sidekiqも同じ)。

またstartとstopというタスクを別々に作るのも面倒なので、シンプルにrestartタスクとしてまとめています。今のところ、これで上手く動いています。

```ruby:config/deploy/production.rb
set :stage, :production
set :rails_env, :production

server 'example.com', user: 'user', roles: %w(app db web)

set :rbenv_ruby, '2.3.1'

set :unicorn_config_path, release_path.join('config/unicorn.rb')
set :unicorn_pid_path, shared_path.join('tmp/pids/unicorn.pid')
set :sidekiq_pid_path, shared_path.join('tmp/pids/sidekiq.pid')

before 'deploy:updated', 'bower:install'
after 'deploy:publishing', 'unicorn:restart'
after 'deploy:publishing', 'sidekiq:restart'

namespace :unicorn do
  task :restart do
    on roles(:app) do
      execute "kill -QUIT `cat #{fetch :unicorn_pid_path}`; true"
      within current_path do
        execute :bundle, :exec, "unicorn_rails -c #{fetch :unicorn_config_path} -E production -D"
      end
    end
  end
end

namespace :sidekiq do
  task :restart do
    on roles(:app) do
      execute "kill -QUIT `cat #{fetch :sidekiq_pid_path}`; true"
      within current_path do
        execute :bundle, :exec, 'sidekiq -d -e production'
      end
    end
  end
end
```

#### エラーを無視

初めてデプロイする際やなんらかのトラブルによりpidファイルが示すプロセスが死んでいる場合、killが通らずタスクが途中停止してしまうため、下記のようにkillのあとに; true を返しています。

```ruby
execute "kill -QUIT `cat #{fetch :unicorn_pid_path}`; true"
```

このようにLinuxコマンド側でエラーを無視することもできますが、下記のようにcapistrano3の機能を使っても同じことが実現できます。こちらの方が可読性は高いような気がします。

```ruby
execute "kill -QUIT `cat #{fetch :unicorn_pid_path}`", raise_on_non_zero_exit: false
```


参考URL: http://stackoverflow.com/questions/758774/capistrano-bash-ignore-command-exit-status
rails5  link_to :method=>:delete でポップアップを正常に表示させる

jsを読み込むタグがレイアウトファイルに書かれているか確認します

```ruby:app/views/layouts/application.html.erb
   <head>
        <title>LoginRails</title>
        <%= csrf_meta_tags %>
#*CSSを読み込むタグを生成します
        <%= stylesheet_link_tag    'application', media: 'all','data-turbolinks-track' => true %>
#*JSを読み込むタグを生成します
        <%= javascript_include_tag 'application' ,'data-turbolinks-track' => true %>
    </head>

```
```ruby:Gemfile
# Use jquery as the JavaScript library
gem jquery-rails 
gem jquery-ui-rails 
```
と記述しbundle install.

次にbootstrap-sassをインストールしますが､こちらのページでとても分かりやすく書かれていました｡
http://qiita.com/masamitsu-konya/items/e3630046774ac1fbd346

最終的に

```ruby:application.js
//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require bootstrap 
//= require_tree .
//= require jquery-ui
```

と記述された状態になっています｡

※therubyracerもgemfileでコメントから外してbundle installしました｡その際､libv8のupdateを求められたので､ターミナルでgem install libv8 -v '3.16.14.15'しています｡
ディスク容量を調査するコマンドレット

フォルダごと

```console
ls -r C:\temp | 
? PSIsContainer |
% {
    $result = ls -r $_.FullName | ? Length | measure Length -sum
    [PSCustomObject]@{
        Name = $_.FullName
        MB = $result.sum / 10000000
    }
} |
ft -autosize
```

ファイルごと

```console
ls -r C:\temp |
? { ! $_.PSIsContainer } |
select FullName,Length |
ft -autosize
```

ファイルに落とす場合は `ft -autosize` を `ConvertTo-CSV > FileName` もしくは `Export-CSV FileName` に。
直線位置調整 + 距離計 > 暴走対策: MOSFETのプルダウン抵抗追加 / 電圧から距離への変換式

http://qiita.com/7of9/items/e58040fbeb903c059e92
の続き。

### 暴走対策

MOSFETのソース・ドレイン間が電流が流れたままになる状態に対して、ゲート側のプルダウン抵抗を追加した。

参考 http://www.rohm.co.jp/web/japan/tr_faq
の「抵抗R2について」（トランジスタについてだが）。
ノイズ・リーク電流をグラウンドに逃がす。

参考 http://blog.goo.ne.jp/mk_nukkeyoh-/e/80f11c1512e7b9f82008beef40a5df39
> 図のようにプルダウン・プルアップ抵抗を足しましょう。

プルダウン抵抗の値については220と1.1kの組合せを以下に試していた。
http://qiita.com/7of9/items/c7b778b641927247d313

しかしながら、220を直列抵抗とした場合、3.3V / 0.22 = 15mAとなる。代わりに直列抵抗は1.1kとして、プルダウン抵抗は10kにした。
(プルダウン抵抗4.7kでは抵抗分圧によりゲート電圧が微妙だった）。

暴走なく測定できるようになった。

### 測定

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/57055319-2ef5-892d-1b89-7106fb58d85c.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/fe454112-76a5-5571-0a4d-feab07fccd00.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/56d41ea6-e4c9-919c-3683-009164390034.png)

移動距離については電池の状態により一定ではない。
140点ほどの測定時間は20分。

測定値のばらつきの理由も未消化。


### 変換式

距離140cmから50cmにおいて測定をし直した。

その結果、以下の図が得られた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c3de39e5-7166-3c03-34f2-0808f1baf540.png)

GP2Y0A710Kの電圧を0-1V範囲になるように分圧した測定電圧と距離の関係式が求まった。

図のいくつかの点で横軸の値がほとんど同じ(量子化している）なのが気になるところ。
少数2桁までしか書出ししてないのが原因の一つだろう。
rakuten_web_service の紹介


# おまえ、誰よ？

* Twitter, Qiita: @sato_ryu
* Facebook: [Tatsuya Sato](https://www.facebook.com/satoryu)

---

# 何してんの？

* 某Rのつくインターネットサービス企業の情シスっぽいところ
* RubyやRailsとかスクラムとか

---

# 好きなエディタ

* vim
* Visual Studio Code

---

# 今日のお題: 自作gem

ということで宣伝に来ました。

---

# `rakuten_web_service`

* 楽天ウェブサービスAPIのRubyクライアント

![Screen Shot 2016-09-18 at 12.41.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3662/31eb35eb-d3d2-fd6e-b7ca-e01e40fa3799.png)

---

# 楽天ウェブサービス

* 楽天が提供するサービスの情報を取得するためのAPI群
    - 楽天市場の商品
    - 楽天トラベルの宿泊施設、空き情報
    - 楽天ブックスの本、CD/DVD、雑誌
    - Koboの本
    - レシピのランキング
    - ゴルフ施設の情報、コース情報

など。

---

# 動機: 他に良いのが無かった。

* 既にたくさんあった。
* けど、満足いくものはなかった。
    * 最新のAPIに対応してない。
    * Web APIを意識してコードを書かないといけない。
* そもそも、弊社から公式クライアント無いの :crying_cat_face: 

---

# 2013年夏、爆誕 :tada: 

![Screen Shot 2016-09-18 at 12.51.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3662/bb3320f5-f2d7-e774-137d-fe670fad6f6e.png)

---

# 公式クライアントに :raised_hands: :smile: :raised_hands: 

![Screen Shot 2016-09-18 at 12.53.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3662/20042c4c-32a5-45be-ed5d-e0f9cd32a3e9.png)

---

# 使い方

--- 

# 準備: アプリケーションIDを設定

```ruby
RakutenWebService.configuration do |c|
    # アプリケーションID
    c.application_id = 'YOUR_APPLICATION_ID'

    # アフィリエイトIDを設定すればアフィリエイトも！
    c.affiliate_id = 'YOUR_AFFILIATE_ID'
end
```

* IDの取得は[楽天ウェブサービス](https://webservice.rakuten.co.jp/app/create) から。

---

# 商品を検索してみよう。

```ruby
require `rakuten_web_service`

items = RakutenWebService::Ichiba::Item.
  search(keyword: 'BABYMETAL')
```

---
# 商品の情報を取ってみよう。

```ruby
item = items.first

# オブジェクトっぽく
item.name #=> "BABYMETAL -来日記念限定盤ー (初回限定盤 CD＋DVD) [ BABYMETAL ]"

# JSONを扱う気分でも
item['itemName'] #=> 同上
```

---

# ページング

```ruby
items = items.page(3)  # 3ページ目

if items.has_next_page? #次があれば次のページに
  items = item.next_page 
end

# 面倒くさいときは#allで全部取ってくる。
items.all.each do |item|
  puts "#{item.name} - #{item.price}円"
end
```

---

# API間のスムーズな連携

* 商品検索、ジャンル情報、ランキングはそれぞれ別のAPI
* 違いを気にさせないインタフェース

```ruby
# さっき検索した商品と同じジャンルのTOP3
item.genre.ranking.first(3)
```

---

# ちょっと困ってること

---

# 開発のネタ探し

* 主要APIは対応済み
    * トラベル、ブックマークが残ってる
* ユーザーの声を見つけたい。
    * [作ったgemのエゴサーチをしてみよう。 - Satoryu's Diary(2016-06-14)](https://satoryu-diary.herokuapp.com/20160614.html#p01)
引数の渡し方を理解しよう

JavaScriptにおいて、関数や、オブジェクトのメソッドに引数を渡す際の扱い(Evaluation strategy）についてまとめておきます。
JavaScriptでは、関数呼び出し時に実引数のリファレンスが仮引数にコピーされて渡されと考えるとよいでしょう。この方式を「共有渡し」（call by sharing）あるいは「参照の値渡し」（call by value where value is the reference copy）などと呼びます。
他の言語でいうところの「値渡し」(call by value）や、「参照渡し」（call by reference）といった扱い方とは異なる点に注意してください。

## イミュータブルな引数を渡す場合
数値や文字列（あるいはStringオブジェクト）のようなイミュータブルな値を引数として渡す場合、関数内で、引数の変数に別の値を再代入しても、呼び出しもとには反映されません。
次の例を見てみましょう。

```js
function myFunc1(n) {
    n = n + 10; // (1)
}

var num = 10;
myFunc1(num);
console.log(num); // (2) 10
```

この例では、関数myFunc()を呼び出す際に、数値が代入された変数numを引数として渡しています。こうすると実引数numのリファレンスが仮引数nのリファレンスにコピーされます（、同じ実体を指し示しています）。(1)で仮引数の変数nに10を足して、再び変数nに代入しています。こうすると関数内の変数nのリファレンスは新たに生成された数値を指し示すようになります。したがって、実引数のnumと仮引数のnは異なる実体を指し示すようになります。
myFuncを呼び出して(2)で変数numの値を表示すると、関数myFunc()の呼び出し前の値と同じ「10」が表示されます。つまり、関数内での変数への再代入は反映されていません。

## ミュータブルな引数を渡す場合（変更が呼び出しもとに反映されないケース）
ミュータブルな値を引数として渡す場合も考え方同様です。関数内部で、引数として渡された変数に値を再代入して、リファレンス、つまり参照先を変更してしまった場合には、呼び出しもとの引数の値は変更されません。それぞれが異なる実体を指し示すようになるからです。次の例では、日付時刻を管理するDateオブジェクトのインスタンスを関数myFunc3()の引数に渡しています。Dateオブジェクトはミュータブルな型です。

```js
function myFunc3(day) {
    day = new Date() // (1)
}

var theDay = new Date(2016, 10, 1);
myFunc3(theDay);
console.log(theDay); // (2) Tue Nov 01 2016 〜
```

この場合 、(1)で新たなDateオブジェクトを生成し、それを引数の変数dayに代入していますのでリファレンスが変更されます。
関数呼び出し後に、(2)で引数として渡した変数theDayの値を表示すると結果はもとのままです。

## ミュータブルな引数を渡す場合（変更が呼び出しもとに反映されるケース）
ただし、関数内で引数の変数に値を再代入せずに、変数の内部の値を変更するようなメソッドを実行したり、あるいはプロパティを変更すると、呼び出しもとの変数に変更が反映されます。
次の例はDateオブジェクトを関数myFunc2()の引数に渡し、内部の(1)でsetFullYear()メソッドで年を変更しています。

```js
function myFunc2(day) {
    day.setFullYear(1950); // (1)
}

var theDay = new Date(2016, 10, 1);
myFunc2(theDay);
console.log(theDay); // (2) Wed Nov 01 1950　〜
```

この場合、実引数theDayと仮引数dayのリファレンスは同じ実体を指し示すため、関数内でのsetFullYear()メソッドによる年の変更が変更が反映されれるわけです。(2)では年が「1950」になった値が表示されます。

<参考>
[ECMA-262-3 in detail. Chapter 8. Evaluation strategy](http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/ "ECMA-262-3 ")
PostgreSQLCursor を使って order しつつ find_each 的なことを行う

# 概要

## find_each の問題点

[ActiveRecord::Batches#find_each](http://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_each) 便利ですよね。大量のレコードを処理する場合に、レコードの取得を分割することができます。ただ `find_each` には無視できない制約があります。それは `id` の昇順でしかレコードを取得できないことです。

```ruby
User.order(:name).find_each(batch_size: 10).map(&:name)
```
```
Scoped order and limit are ignored, it's forced to be batch order and batch size.
  User Load (0.4ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE ("users"."id" > 10) ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE ("users"."id" > 20) ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE ("users"."id" > 30) ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE ("users"."id" > 40) ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE ("users"."id" > 50) ORDER BY "users"."id" ASC LIMIT $1  [["LIMIT", 10]]

=> ["にしもと たまほ",
 "まつざき あやこ",
 "さかた らんな",
 "しまむら りさ",
 "どい めい",
 "あさの すみな",
 "たかぎ まもる",
 "かわかみ ひろみ",
 "なかやま かい",
 "たにがわ さやか",
 …
```

`Scoped order and limit are ignored, it's forced to be batch order and batch size.` という警告が表示され、発行された SQL に `ORDER BY name` が付与されていないのが分かります。

## 解決策

[PostgreSQLCursor](https://github.com/afair/postgresql_cursor) という Gem を使って、レコード分割しながらかつ任意の並び順で取得します。ここで、`find_each` の代わりに `each_instance` というメソッドを使用します。

一度の取得数を指定する場合は、`batch_size` ではなく `block_size` というキーで指定します。

```ruby
User.order(:name).each_instance(block_size: 10).map(&:name)
```
```
   (0.1ms)  BEGIN
   (0.3ms)  declare cursor_cc610a9c45d24652ae951cfd572712a6 cursor for SELECT "users".* FROM "users" ORDER BY "users"."name" ASC
   (0.2ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.2ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  fetch 10 from cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  close cursor_cc610a9c45d24652ae951cfd572712a6
   (0.1ms)  COMMIT

=> ["あさの こうぞう",
 "あさの すみな",
 "あずま やすあき",
 "あだち ひろみつ",
 "あべ あきお",
 "いしい りさ",
 "いしはら やすゆき",
 "いなば なお",
 "うえはら うり",
 "うえはら かなこ",
 …
```

正しくソートされていますね :blush: 

なお、PostgreSQLCursor は Postgresql の [カーソル](https://www.postgresql.jp/document/9.4/html/plpgsql-cursors.html) という機能を使って、レコードの分割取得を実現しています 。
<i class="fa fa-github"></i> [Using Cursors](https://github.com/afair/postgresql_cursor#using-cursors)

そして `order` が使用可能になること以外にも `find_each` が抱えるデメリットを解消しています。
<i class="fa fa-github"></i> [Background: Why PostgreSQL Cursors?](https://github.com/afair/postgresql_cursor#background-why-postgresql-cursors)
[備忘録] Twilio の音声データを GAE 経由で Google Speech API に投げてテキストにする

# まとめ
タイトル通りのシステムを組み実際に動かしてみました。
(最終的にはルンバを動かしました)

音声データが短すぎて(5 秒以下)あまりよい認識精度(~50%)は得られませんでしたが、手元で長い音声データを取って直接 Google Speech API に投げた場合は結構な精度で認識してくれていたので、ちゃんとやればいいところまでいくかもしれません(twilio の無料枠を使い切るのが怖かったため時間を短めに設定していたのが敗因)。

ローカルで音声認識させればもっと簡単に色々できると思いますが、こんなやり方もあるよということで。

# システム構成

電話 ->  twilio -> GAE -> Google Speech API -> ローカル PC -> roomba

※実際は twilio から GAE には 2 回 POST が飛びます(後述)

- 電話: 普通の電話です
- [twilio](http://twilio.kddi-web.com/): 電話の着信や発信などを自動化できるサービス。今回は着信と音声データの保存を担当
- GAE: Google の PaaS。今回は Twilio からの Webhook のハンドリングと音声データを Google Speech API  に投げる部分を担当
- Google Speech API: Google 謹製の音声認識サービス。
- ローカル PC: 音声認識結果を元に作られたコマンドデータをポーリングして roomba に色々やらせる。
- roomba: お掃除ロボット。歌ったりしちゃうおちゃめなやつ。

# やったこと

コードは[こちら](https://github.com/hagifoo/roomba-call)。突貫で作ったのでお世辞にも綺麗とは言えないです。

1. twilio にアカウントを作成し、電話番号を取得、Webhook を設定。

    <img width="1231" alt="TwilioWebhook.png" src="https://qiita-image-store.s3.amazonaws.com/0/45086/68c0c8dc-5dd7-5612-85cd-8e89172754bb.png">

2. [GAE のコード](https://github.com/hagifoo/roomba-call/blob/master/main.py)を作成し(Python)、着電した際の Webhook のハンドラと、音声データの保存が完了した際の Webhook のハンドラを用意。
    - 音声データ(.wav)を取得し、適宜変換して Google Speech API に投げる。
    - 返ってきた文字列中に指定した文字列が含まれていたらコマンドデータを登録
3. [ローカルで動かすサービス](https://github.com/hagifoo/roomba-call/blob/master/bin/roomba.py)（Python）を作成。
    - GAE のコマンドデータをポーリング
    - コマンドが更新されていたら指示通りルンバを動かす

# 説明とか

## twilio からの Webhook

twilio には [TwiML](https://jp.twilio.com/docs/api/twiml) という仕組みがあって、着信時の Webhook に対して適当な XML を返すことで挙動を簡単に制御できます。

例えば、以下のように書くことで「おはようございます」を日本語で読み上げた後、 5 秒間音声データを録音して、録音に成功したら `http://hogehoge/record` に対してリクエストを送る、という挙動になります。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice" language="ja-JP">おはようございます</Say>
    <Record maxLength="5" action="http://hogehoge/record" />
</Response>
```

- `Response` は root 要素です、お約束。
- 今のところ `voice="alice"` 以外は日本語に対応していません。

録音完了後のリクエストに含まれる `RecordingUrl` というパラメータに録音データの保存先が記載されているので、簡単にダウンロードすることができます。

なお、この録音データは `WAV` 形式で sample rate は 8000 のようです(仕様は見つからず)。


## GAE から Google Speech API へのリクエスト

認証をどうすればいいのかドキュメントが見つからず意外と悩みました。結論から言うと GAE サービスの Default Credential を利用すれば OK です([参考](https://developers.google.com/identity/protocols/application-default-credentials))。

```python
from oauth2client.client import GoogleCredentials

# Global Variables
credentials = GoogleCredentials.get_application_default()

...

service = build('speech', 'v1beta1', credentials=credentials)
request = service.speech().syncrecognize(
    body={
        ...
    })
response = request.execute()
```

ただ、この際に利用する `oauth2client` はデフォルトでは利用できないので [vendoring]((https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27#installing_a_library)) する必要があります。

必要なライブラリを適当なディレクトリの下に置いて、 `appengine_config.py` の中で以下のように指定すれば普通に `import` できるようになります。

```python
from google.appengine.ext import vendor

# Add any libraries installed in the "hoge" folder.
vendor.add('hoge')
```
python boto3でS3操作

## インストール
pipか何かでboto3をインストール. 自分はcondaを使ってインストール.
```
$ conda install -c anaconda boto3=1.3.1
```

aws cliを使って、クレデンシャル情報とデフォルトの地域を登録

```
$ aws configure
aws_access_key_id = ACCESS_KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
region = ap-northeast-1
output = json
```

なお、直接, 下記のようにファイルに追記してもok

```
$ vim ~/.aws/credentials
[default]
aws_access_key_id = ACCESS_KEY_ID
aws_secret_access_key = SECRET_ACCESS_KEY
```

```
$ vim ~/.aws/config:
[default]
region = ap-norteast-1
output = json
```

## バケットリストの取得

```
import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    print(bucket.name)
```

## アップロード

```
import boto3

s3 = boto3.resource('s3')

data = open('test.jpg', 'rb')
s3.Bucket('my-bucket').put_object(Key='test.jpg', Body=data)
```

---

下記、リファレンス
http://boto3.readthedocs.io/en/latest/index.html
NetlifyでHugoのビルドを自動化する



[Hugoなどで静的サイトを作る](http://qiita.com/satzz/items/e24bd703fc04fb45f7ef)場合、毎回ビルドする必要があり手間なので、GitHub Pagesの代わりにビルドとホスティングをいっぺんにやってくれる[Netlify](https://www.netlify.com/)を試してみる。Railsアプリに対するHerokuのようなサービスのイメージ。どうでもいいが何度もNetflixと書きそうになった。

こちらをなぞっていく。

- [A Step-by-Step Guide: Hugo on Netlify](https://www.netlify.com/blog/2015/10/06/a-step-by-step-guide-hugo-on-netlify/)

# ローカルでホスティングする

## Hugoでサイトを作る
```
$ cd
$ hugo new site netlifytest
$ cd netlifytest/
$ hugo new about.md
$ hugo undraft content/about.md
```
サイトの中身はないが、気にしない。

## テーマを入れる

- http://themes.gohugo.io/

```
$ git clone https://github.com/pedrodude/martial-paper themes/martial-paper
```

## ローカルで動作確認

```
$ hugo server -t martial-paper
```
hugoが出力するURLへアクセス。(デフォルトでhttp://localhost:1313/)

![Screen Shot 2016-09-15 at 7.16.31 AM.png](https://qiita-image-store.s3.amazonaws.com/0/281/52cdf02f-b0f9-2e82-1c37-9df929c375e5.png "Screen Shot 2016-09-15 at 7.16.31 AM.png")

# GitHubへpushする

Netlifyでホスティングするために必要なものをGitHubへpushする。
まず小細工する。


```
$ echo /public >> .gitignore
$ touch static/.gitignore
$ hugo undraft content/about.md
$ rm -rf themes/martial-paper/.git
```

```config.toml 
baseurl = "/"
languageCode = "en-us"
title = "My New Hugo Site"
```

ビルド前のファイルを、カジュアルにGitHubリポジトリ(private可)のmasterへつっこむ。

```
$ git init
$ git status
$ git add .
$ git commit -m'first commit'
$ git remote add origin git@github.com:satzz/netlifytest.git
$ git push origin master
```
  
# Netlifyでホスティングする
GitHub側の準備ができたのでいよいよNetlifyにサイトを作る。

![Screen Shot 2016-09-15 at 7.36.16 AM.png](https://qiita-image-store.s3.amazonaws.com/0/281/be6c4a0f-beb3-988c-a55d-031cb6d1f881.png "Screen Shot 2016-09-15 at 7.36.16 AM.png")

## リポジトリを選ぶ

![Screen Shot 2016-09-17 at 5.01.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/f5a82a84-d15a-4d98-364f-10e985e7456d.png "Screen Shot 2016-09-17 at 5.01.14 PM.png")
 
## ビルドの設定をする

- Branch: `master`
- Dir: `public/`
- Build Command: `hugo --theme=martial-paper`

![Screen Shot 2016-09-17 at 7.34.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/c4e07bc9-4f3e-6126-a362-bc84fddfb58e.png "Screen Shot 2016-09-17 at 7.34.27 PM.png")


## ビルドする
10秒程度。

![Screen Shot 2016-09-17 at 7.35.01 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/19b1b8dc-ec02-bb2c-ca91-fd7e0ce5ae15.png "Screen Shot 2016-09-17 at 7.35.01 PM.png")

ビルド完了したら、ページ上部のタイトルがホスティングしたサイトへのリンクになっているので開いてみる。
![Screen Shot 2016-09-17 at 8.43.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/0606cd4c-181f-0e76-a89b-c4fb4a5622b5.png "Screen Shot 2016-09-17 at 8.43.46 PM.png")


CSSへの参照がうまくいっていないようだ。

![Screen Shot 2016-09-17 at 8.38.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/281/89d05220-ba34-d8a0-b435-d5be0ade0ee1.png "Screen Shot 2016-09-17 at 8.38.09 PM.png")


HTMLを見ると`href="//css/main.css"`となってしまっている（テーマ依存？）。
ここではとりあえず`baseurl`をホスティング先のNetlifyのURLにしてしまうことにする。


```config.toml
-baseurl = "/"
+baseurl = "http://explorer-snake-61260.netlify.com"
```

変更をGitHubへpushするとNetlifyのビルドが走り、ローカル同様にCSSが適用された。めでたし。


# 参考
- [A Step-by-Step Guide: Hugo on Netlify](https://www.netlify.com/blog/2015/10/06/a-step-by-step-guide-hugo-on-netlify/)
Macで無料ツールを使ってiSCSIボリュームをマウントする

# はじめに

iTunes や Photos のような Macの内蔵ディスクに入れるにはでかく、
AFP や SMB でアクセスするにはディスクIOは恐ろしく遅く、使い物にならないケースで
iSCSI で作成したディスク上で作業したいことがありました。

だましだまし AFPマウントしたディスクを使っていましたが、我慢の限界を超えましたので
今回 iSCSI でマウントしたボリュームを使うことにします。

# iSCSI ボリュームを作成

私はQNAPを利用しているので、QNAPの管理画面から新しく iSCSI ボリュームを作成しました。

# iSCSI イニシエータのインストール

GlobalSAN というプロダクトがデファクトスタンダードになっているようですが、有料です。
無料の方法を探した結果

https://github.com/iscsi-osx/iSCSIInitiator

こちらのイニシエータを使うと良さそうです。

## データ保護を無効化

ただ、El Capitan 以降の Mac はデータ保護がかかっており、そのままだと導入できません。
一度Macの電源を落とし、 Command+Option+R を押しながら電源を入れます。
すると、リカバリモードで起動すると思うので、ここでターミナルを開きます。

````
csrutil disable
````

と入力することで、このデータ保護を無効化できます。
作業が終わったらもとに戻すことを忘れないようにしましょう。

設定が終わったらMacを再起動します。

## iSCSIInitiator のインストール

再び通常モードの macOS が起動したら
github の release にある dmg からインストールします。
今回は 1.0.0 beta4 というバージョンをインストールしました。

# Mac で iSCSI をマウント

ターミナルを開きます。

````
iscsictl add target 作成したiSCSIのIQN名,iSCSIのターゲットホスト
iscsictl login 作成したiSCSIのIQN名,iSCSIのターゲットホスト
````

これでマウントが完了します。

<img width="815" src="https://qiita-image-store.s3.amazonaws.com/0/100723/ad21f1e2-0979-e235-2a57-8d2101edbb5a.png">
こんな感じで、マウントしたボリュームがディスクユーティリティに表示されれば準備完了です。

<img width="816" src="https://qiita-image-store.s3.amazonaws.com/0/100723/3c262b6b-3f84-41b1-cc4d-6fab3453cca4.png">
上部のメニューから”消去”を選択して、ディスクをフォーマットします。

これで iSCSI 上のディスクをマウントできました。
[小ネタ] material design lite のtabsのデザインを再現する

`tabs`ってコレのこと
https://getmdl.io/components/index.html#layout-section/tabs

タブ切替えによって、ページ内のコンテンツを動的に表示させるコンポーネント。
これと同じデザインでnavbarみたく、グローバルメニューとして使いたい。つまり`href`をアンカーリンクじゃなくて、ページリンクにしたかった。
ちなみに `href="/hoge"` みたいに単純に置き換えると、tabs.jsのエラーで動かなくなる。タブ用のコンポーネントだから当然か…😔

そこで、MDLから生成されるHTMLとcssを見ながら、自力で以下のように再現してみた。
ただし残念ながらripple effect（クリックすると一瞬キランと光るやつ）までは再現できなかった。（mdl-buttonでripple-effectを追加すればイケルとかと思いきや、history backした時に思ったように動作してくれなかったので諦めた）

```html:sample.html
  <div class="tabs">
    <div class="tab-bar">
      <a href="/hoge1" class="tab active">HOGE1</a>
      <a href="/hoge2" class="tab">HOGE2</a>
      <a href="/hoge3" class="tab">HOGE3</a>
    </div>
  </div>
```

```sass:sample.sass
  $activeColor: #3f51b5 // アクティブになった時の下線とか文字色を指定

  @mixin flexbox
    display: -webkit-box
    display: -moz-box
    display: -ms-flexbox
    display: -webkit-flex
    display: flex

  @mixin flex-direction($direction)
    -webkit-flex-direction: $direction
    -ms-flex-direction: $direction
    flex-direction: $direction

  @mixin justify-content($param)
    -webkit-justify-content: $param
    -ms-flex-pack: $param
    justify-content: $param

  .tabs
    display: block
    width: 100%

  .tab-bar
    @include flexbox
    @include flex-direction(row)
    @include justify-content(center)
    -webkit-align-content: space-between
    -ms-flex-line-pack: justify
    align-content: space-between
    -webkit-align-items: flex-start
    -ms-flex-align: start
    align-items: flex-start
    height: 48px
    padding: 0
    margin: 0
    border-bottom: 1px solid #e0e0e0

  .tab
    margin: 0
    border: none
    padding: 0 24px
    float: left
    position: relative
    display: block
    text-decoration: none
    height: 48px
    line-height: 48px
    text-align: center
    font-weight: 500
    font-size: 14px
    text-transform: uppercase
    color: rgba(0,0,0,.54)
    overflow: hidden 

  .active
    color: $activeColor
    &:after
      height: 2px
      width: 100%
      display: block
      content: " "
      bottom: 0
      left: 0
      position: absolute
      background: $activeColor
      -webkit-animation: border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards
      animation: border-expand .2s cubic-bezier(.4,0,.4,1).01s alternate forwards
      transition: all 1s cubic-bezier(.4,0,1,1)
ansible のrole まとめ

#intro
ansible でファイルを使い回す方法に include がある。これは、 task, handler (task の一種), play[^play] を他のファイルから読み込める。 

[^play]: あるホストグループに対する処理の流れを記述したもの(task などの列)

一方で、roles を使うことで一つのファイルでなく、タスクや変数・ハンドラごとのファイルをまとめて読み込める。

# 使い方
ディレクトリが以下のような構成だとする。

```ansible.directory
main.yml
roles/
    common/
        files/
        templates/
        tasks/
        handlers/
        vars/
        defaults/
        meta/
```

```main.yml
--
- hosts: webservers
  roles:
     - common
```

このとき、main.yml には以下が追加される.
* roles/common/tasks/main.yml のタスク
* roles/common/handlers/main.yml ハンドラ
* roles/common/var/main.yml の変数
* roles/common/default/main.yml の変数
* roles/common/meta/main.yml のrole dependencies [^v1.3]
(これらのファイルでは、roles/common/files のファイルを、copy,script,template,include タスクで、相対パスも絶対パスもなく指定できる)

[^v1.3]: version 1.3 から

# オプション
##変数を設定したいとき
``` main.yml
---
- hosts: servers
  roles:
     - { role: some_role, dir: 'opt/a/', app_port: 500 }
```

##ある条件を満たすときのみ role
``` main.yml
---
- hosts: servers
  roles:
     - { role: some_role, when: "ansible_os_family == 'RedHat'" }
```

##タグの割り当て
``` main.yml
---
- hosts: servers
  roles:
     - { role: some_role, tags: ["bar", "baz"] }
```

#注意点
## タスクとの共用
すべての `tasks: `は`roles: `の後に処理される。 それより前にタスクを処理したいなら、`pre_tasks: `を使うこと。

#Role Dependencies
ロールの中から他のロールを読み込むために、meta/main.yml に依存関係を記述できる。


``` meta/main.yml
---
dependencies:
  - { role: common, some_parameter: 3 }
  - { role: apache, apache_port: 80 }
  - { role: '/path/to/common/roles/foo', x: 1 }
```

読み込まれたロールは読み込んでいるロールより先に実行される.
同じロールが以前に実行されていた場合はそのロールは実行されない. ただし `meta/main.yml` に `allow_duplicates: yes` を記述すれば、再度実行される.


# ref
* http://docs.ansible.com/ansible/playbooks_roles.html#roles
新しい言語を学ぶときに確認すること

新しい言語を学ぶときに確認することをまとめています。随時更新するので、コメントが有ればお願いします。

# セットアップ関連

## 言語のインストール方法

- Mac OS Xならhomebrew
- Linuxならパッケージマネージャ
- Windowsなら個別のインストーラ
- LL系ならxxxbrew、xxxenv系のバージョンマネージャー

## ビルドツールの使用方法

- 標準ライブラリか、別パッケージか
- 基本的なビルドスクリプトの書き方、実行方法

## パッケージ（ライブラリ）マネージャーの使用方法

- 標準ライブラリか、別パッケージか
- パッケージ（ライブラリ）はグローバルインストールか、プロジェクトローカルインストールか

## プロジェクトのひな形の作り方

- ビルドツール／パッケージマネージャーで作れるか、専用のツールが有るか
- ひな形のテンプレートのカスタマイズ方法

## REPL(Read-eval-print loop)の使用方法

- 標準ライブラリか、別パッケージか
- パッケージ（ライブラリ）の読み込み方法
- REPL固有の制約や、機能は有るか

## エディタの設定

- vim
- emacs
- IDE

# 実際のコードを書く

## 基本的な文法を理解する

- 入門書
- 入門サイト
- チートシート
- 特に、よく使われるデータ構造（配列、マップ、リスト…）

## テストコードの書き方を理解する

- テスティングフレームワークは標準ライブラリか、別パッケージか
- テスティングフレームワークのスタイル

## 外部リソースへのアクセス方法を確認する

- httpアクセス
- JSONの組み立て、パース
- テキストファイルの読み書き

## カバレッジの計測方法を確認する

- カバレッジ取得用のツールの使い方

## プロファイラの使い方を確認する

- プロファイラ取得用のツールの使い方

## デバッガの使い方を確認する

- コマンドラインからの使い方
- IDEからの使い方

## Web Application Frameworkの使い方を理解する

- 主要なフレームワーク
- サーバプロセスとアプリケーションのインタフェース

# 情報リソース

## 言語やライブラリのリポジトリへのアクセス方法を確認する

- パッケージ（ライブラリ）のアーカイブサイト
- GitHub
- コントリビューションの方法

## ドキュメントへのアクセス方法を確認する

- オンラインドキュメントの場所、検索方法
- ローカルドキュメントの検索方法
- 代表的な入門書、リファレンス（cookbook的な）
- パッケージ（ライブラリ）サイトへのアクセス方法・検索方法

## コミュニティ

- 勉強会
- メーリングリスト
- チャット
LINQで複数のプロパティをキーに重複を除去＆子要素の先頭を取得

# 複数プロパティをキーに重複を除去
例として、以下のような「商品」クラスがあるとして

``` SalesItem.cs
    /// <summary>
    /// 商品
    /// </summary>
    public class SalesItem
    {
        /// <summary>
        /// ID
        /// </summary>
        [Key, Column(TypeName = "int")]
        public int Id { get; set; }

        /// <summary>
        /// 商品コード
        /// </summary>
        [Column(TypeName = "nvarchar")]
        public string SalesItemCode { get; set; }

        /// <summary>
        /// 商品名
        /// </summary>
        [Column(TypeName = "nvarchar")]
        public string SalesItemName { get; set; }
    }
```

商品コードと商品名で重複を除去して集計するには以下のようになる。

``` test.linq
// LINQPadでLanguageにC# Expressionを選んでいる場合の例。
SalesItems.GroupBy(s => new { s.SalesItemCode, s.SalesItemName }).Select(g => g.FirstOrDefault()).ToList().Dump() // LINQPad上で結果を見る場合は .Dump() を追加
```

なんだか若干分かりにくいが、上記のようにGroupBy、Select、FirstOrDefaultを組み合わせるとできる。
どうやらIGroupingインターフェイスをFirstOrDefaultすると最初のデータが取得されるらしい。
LINQ to ObjectsでもLINQ to EntitiesでもOK。
ちなみにEntity Frameworkの場合、LINQPadでSQLを確認すると以下のようなSQLが発行されている。

``` 発行されるsql.sql
SELECT 
    [Limit1].[SalesItemId] AS [SalesItemId], 
    [Limit1].[SalesItemCode] AS [SalesItemCode], 
    [Limit1].[SalesItemName] AS [SalesItemName]
    FROM   (SELECT DISTINCT 
        [Extent1].[SalesItemCode] AS [SalesItemCode], 
        [Extent1].[SalesItemName] AS [SalesItemName]
        FROM [dbo].[SalesItems] AS [Extent1] ) AS [Distinct1]
    OUTER APPLY  (SELECT TOP (1) 
        [Extent2].[SalesItemId] AS [SalesItemId], 
        [Extent2].[SalesItemCode] AS [SalesItemCode], 
        [Extent2].[SalesItemName] AS [SalesItemName]
        FROM [dbo].[SalesItems] AS [Extent2]
        WHERE ([Distinct1].[SalesItemCode] = [Extent2].[SalesItemCode]) AND ([Distinct1].[SalesItemName] = [Extent2].[SalesItemName]) ) AS [Limit1]
```

※DISTINCTしたテーブルをOUTER APPLYしてSELECT TOP 1。
　うーん、あんまり見慣れない感じのSQLだけど集計効率的にはどうなのだろうか・・・

# 子要素の先頭を取得
あるデータに子要素が複数あって1件だけ取得したい場合も同様の実装で実現できる。
以下のようなUserクラスを内包するLoginクラスがあり、同じユーザーのレコードが複数あるとして、
※Userクラスの中身は割愛

``` Login.cs
    /// <summary>
    /// ログイン情報
    /// </summary>
    public class Login
    {
        /// <summary>
        /// ログインID
        /// </summary>
        [Key, Column(TypeName = "uniqueidentifier")]
        public Guid LoginId { get; set; }

        /// <summary>
        /// ログインユーザID
        /// </summary>
        [Column(TypeName = "int")]
        public int UserId { get; set; }

        [ForeignKey("UserId")]
        public User User { get; set; }
    }
```

Userごとの1件分のLoginを取得するコードは以下のようになる。

``` test.linq
// LINQPadでLanguageにC# Expressionを選んでいる場合の例。
Logins.GroupBy(l => l.UserId).Select(g => g.FirstOrDefault()).Dump() // LINQPad上で結果を見る場合は .Dump() を追加
```