OmniAICreator/Qiita-1.07M huggingface dataset:
rails consoleでモデルからメソッドを呼び出そうとしたらハマった

# Ruby on RailsチュートリアルでUser.firstを行ったら大量のエラー

railsチュートリアルの2章(2.3.3)で


```ruby
% rails console
irb(main):001:0> first_user = User.first

 　　　　　　　　　　　〜略〜
 1591 /Users/home/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/relation/predicate_builder.rb
 1592 /Users/home/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0.1/lib/active_record/table_metadata.rb

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

```
のようなエラーが出ました。
設定でエラーの最初の部分が読めなかったのですが、gemに原因があるのではと当たりをつける。

google先生に聴いてみるとどうもsqliteに問題がありそう。
ということで……
`# gem uninstall sqlite3`
`# gem install sqlite3`
を実行。

再び`rails console`

```ruby

% rails console                                                                                                    (git)-[master]
Running via Spring preloader in process 3605
Loading development environment (Rails 5.0.0.1)
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
Ignoring sqlite3-1.3.11 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.11
No entry for terminal type "env/hooks";
using dumb terminal settings.
irb(main):001:0>
```
エラーの内容が変わっただけ…

あ、`bundle install`してなかった。

```ruby
% bundole install
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Using rake 12.0.0
Using concurrent-ruby 1.0.4
Using i18n 0.7.0
Using minitest 5.10.1
Using thread_safe 0.3.5
　　　　　　　　　　　　〜略〜
Bundle complete! 16 Gemfile dependencies, 62 gems now installed.
Gems in the group production were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```
これは来たのでは！！
３度目の正直になると信じて！
                                                                         だめでした……                                                                        最初のエラーと同じものが出てしまった。振り出し……
                                                                         sqliteもしくはgem周辺が怪しいので調べてみると、参考になりそうなものが見つかりました。         
> [Rails5 + sqlite3のrails consoleでsqliteのエラーでハマったこと](http://qiita.com/emahiro/items/ec3a875dbc671651d4c4)

参考サイトのように`bundle update`を試してみたら無事に解決しました。

## まとめ
**まずは環境を最新にしてみること！！**
こんなオチですみません（汗
MacでPDFからコピペした時のNFD問題対策

# MacでPDFからコピペした時のNFD問題の対策。

MacでPDFからコピペした文字が、濁点/半濁点が離れる。  

- 「お読みください」
- 「お読みくた゛さい」  

Macのファインダーのコピーだと見た目的な違いが無いので判別が難しい。

## 原因
MacOSのファイルシステムであるHFS+が使用している、UTF-8の正規化方法が「NFD」というもので、２文字に分けて正規化されてしまうことが原因。

- [Mac で PDF からコピーした濁点/半濁点付きの文字列を Firefox に貼り付けた時におかしくなる問題の対処方法 ](http://d.hatena.ne.jp/nakamura001/20120529/1338305696)



## 対策とどこでクリアするか？
### NFD → NFCに変換をする。
[nkf（Network Kanji Filter）](https://ja.wikipedia.org/wiki/Network_Kanji_Filter)で変換が可能。 
- [UTF-8にもいろいろある](http://d.hatena.ne.jp/zariganitosh/20131124/utf8_nfd_nfc_bom)  


### どこで？

1. コピーした時点で変換する。
2. タスクランナーに組み込んで変換する。

とりあえずの前者の仕組みを MacのAutomaterでシェルスクリプトを実行してクリップボードにコピーするで実現する。


## やる

### nkfをインストール（npm でもインストールが可能）

- [Macにnkfコマンドをインストールしてみる]
(http://kengo92i.hatenablog.jp/entry/2016/09/06/120854)

### nkfで `--ic=UTF8-MAC`オプションを指定して実行

- [Macでファイル名をコピペすると濁点と半濁点がおかしくなる。]
(http://qiita.com/damassima/items/1813af7e501994aa0cf8)

実行するシェルスクリプトは以下  

```
/usr/local/bin/nkf -w --ic=UTF8-MAC
```

### ↑コレをAutomaterで処理を登録

<img width="668" alt="スクリーンショット 2017-01-26 23.41.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/85559/d0f7ff19-6b33-38b8-6b8a-fa7f7802c3df.png">

この処理だけでok。

`クリップボードの内容を取得`のフローを入れてたら、テキストが2重に表示されたりしてちょっとハマった。



### 検証

テキストファイルを2つ用意して、
コピペしてみる。


NFCとNFDのサンプルは↓こちらからお借りします。
http://pollux.sakura.ne.jp/test/unicode/


```
【NFDのサンプル】  
ガギグゲゴ|パピプペポ  
```

####変換前

```
cat test.txt | od -tx1c
```
```
0000000    e3  80  90  4e  46  43  e3  81  ae  e3  82  b5  e3  83  b3  e3
          【  **  **   N   F   D  の  **  **  サ  **  **  ン  **  **  プ
0000020    83  97  e3  83  ab  e3  80  91  0a  e3  82  ab  e3  82  99  e3
          **  **  ル  **  **  】  **  **  \n  カ  **  **    ゙  **  **  キ
0000040    82  ad  e3  82  99  e3  82  af  e3  82  99  e3  82  b1  e3  82
          **  **    ゙  **  **  ク  **  **    ゙  **  **  ケ  **  **    ゙  **
0000060    99  e3  82  b3  e3  82  99  7c  e3  83  8f  e3  82  9a  e3  83
          **  コ  **  **    ゙  **  **   |  ハ  **  **    ゚  **  **  ヒ  **
0000100    92  e3  82  9a  e3  83  95  e3  82  9a  e3  83  98  e3  82  9a
          **    ゚  **  **  フ  **  **    ゚  **  **  ヘ  **  **    ゚  **  **
0000120    e3  83  9b  e3  82  9a                                        
          ホ  **  **    ゚  **  **                                        
```

####変換後

```
cat test_nfc.txt | od -tx1c
```

```
0000000    e3  80  90  4e  46  43  e3  81  ae  e3  82  b5  e3  83  b3  e3
          【  **  **   N   F   D  の  **  **  サ  **  **  ン  **  **  プ
0000020    83  97  e3  83  ab  e3  80  91  0a  e3  82  ac  e3  82  ae  e3
          **  **  ル  **  **  】  **  **  \n  ガ  **  **  ギ  **  **  グ
0000040    82  b0  e3  82  b2  e3  82  b4  7c  e3  83  91  e3  83  94  e3
          **  **  ゲ  **  **  ゴ  **  **   |  パ  **  **  ピ  **  **  プ
0000060    83  97  e3  83  9a  e3  83  9d                                
          **  **  ペ  **  **  ポ  **  **                                
```

変換できてる。


### サービスに登録

<img width="668" alt="スクリーンショット 2017-01-26 23.41.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/85559/ace5b679-b7db-b5d4-6a9f-80decb3721d9.png">

PDFからコピーするときは、これを選んで変換する。
通常のコピー（cmd + c）を上書きすると常に実行されたりもする。

以上。
Railsでhtml5で追加されたaudioタグを使う

##前提
まず,`assets/audios/任意のファイル`
のようなディレクトリ構成にする必要がある。
##詳細
`<%= audio_tag("audio.mp3",id:"audio") %>`で
 `<audio></audio>`を生成
一引数にファイル名,二引数にidを指定
調べたところ、mobile環境下では、ボタンを押したら音が流れるというように、ワンクッションおく必要がある。

よって、`audio_tag`にidを付与し、jsで制御していく
※ここでは、submitボタンが押されたら音がなるようにする。

`<%=f.submit "I got it!" ,class:"waves-effect waves-light btn deep-purple darken-2 audioButton"%>`

```XXX.html.erb
<%=javascript_tag do%>
        document.querySelector('.audioButton').onclick = function () {
        document.querySelector("#audio").play();
        alert("You answered")
        Materialize.toast("You Answered", 4000,'rounded')
        }
<%end%>
```

##まとめ
```
    <%= audio_tag("audio.mp3",id:"audio") %>
    <%=f.submit "I got it!" ,class:"waves-effect waves-light btn deep-purple darken-2 audioButton"%>
    <%=javascript_tag do%>
        document.querySelector('.audioButton').onclick = function () {
        document.querySelector("#audio").play();
        alert("You answered")
        Materialize.toast("You Answered", 4000,'rounded')
        }
    <%end%>
```
`<%=audio_tag%>`の情報はあまりなく、そもそもRailsの基本機能を使って音を流せると知っている方も少ないと思うので、是非お試しください。
【Swift】AppStoreのレビューフォームを開くパラメーターが新登場 - action=write-review - 

# TL; DR
AppStoreアプリの**レビューフォーム**を直接開くパラメーターが、間接的ながら公式に発表されていました。[^1]

# これまでの課題
これまでは下記のようなコードを使って、①AppStoreアプリのトップページにユーザーをリダイレクトさせ、②レビュータブをタップしてもらい、③フォームまでたどり着いてもらう必要がありました。

```swift
// {YOUR_APP_ID}を置換
if let url = URL(string: "https://itunes.apple.com/us/app/itunes-u/id{YOUR_APP_ID}") {
   UIApplication.shared.open(url)
}
```

実行すると、トップページにリダイレクトされます。

<img width="150" alt="IMG_0504.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119686/9f98050f-0007-4b42-0ed9-80e7d9350f2f.png">


# レビューフォームを直接開けるように！
上述の手間を省いて、直接、フォームを開けるようになりました。
方法は、URLに`action=write-review`を追加するだけです。

```swift
// {YOUR_APP_ID}を置換
if let url = URL(string: "https://itunes.apple.com/us/app/itunes-u/id{YOUR_APP_ID}?action=write-review") {
   UIApplication.shared.open(url)
}
```

<img width="150" alt="IMG_0505.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119686/ac8b7ef6-1188-d808-be97-a32f0a86f801.png">

# どこ情報？
iOS 10.3から利用可能になる[SKStoreReviewController](http://qiita.com/mshrwtnb/items/6b9b7e9850f02f43e254)を眺めていたところ、こんなコメントがあったので、iOS8、iOS 10で試してみました。

>For presenting a write review form, a deep link is available to the App Store by appending the query params "action=write-review" to a product URL.

iOS 8でも成功したのは意外でした。

---
[^1]: `action=write-review`を Googleで検索しても2017年1月26日現在ヒットしないため、新機能かと思われます。間違いがありましたら、ご指摘ください。
機械学習と歴史

# 機械学習とは
インターネット社会の発展に伴い、コンピュータで扱うことのできるデータがインターネット上に大量に蓄積されるようになった。

しかしこれらのデータはあまりにも大量すぎるため、人間が手作業でデータを閲覧しても、そのままでは役に立つことが少ない。

そこで、こうした大量のデータをコンピュータに学習させることで、単なる事実の羅列を役に立つ知識に変換を行う。このような方法を機械学習と呼ぶ。

## 学習とは
人間の学習は…

- 学校に通って知識を身につけたり、物の考え方を教わったりする
- 教えられた知識を元に、自ら考えることで自分自身を向上させる

→ 知識の増加、問題解決能力の向上

機械の学習とは…

- 内部状態の変化に着目し、何らかの過程によって状態を変化させる挙動

機械学習とは

→ 内部状態の変化を生じさせるような挙動

## 機械学習の例

- Twitterの前回ログインからのできごと機能
ユーザーがTwitterにログインしたとき、重要なニュースやツイートを表示する機能に、機械学習技術を用いている。

- 天気予報への応用　　
膨大なデータから、経験則に基づく処理の自動化を行う機械学習は有効である。


# 機械学習の歴史

## チェッカー（第1次人工知能ブーム）

- 人工知能の研究として、1950年代から取り上げられてきた。
- プログラムに組み込んだ作戦を、機械学習を利用して調整することで、自律的に強くなる。
    → パラメタ調整

**パラメタ調整**
過去の人間同士の対戦結果などを参照して、ある局面で指した着手がその後の展開において良い手だったか悪い手だったかを評価し、評価が良くなるようにパラメタを調整する。

## エキスパートシステム（第2次人工知能ブーム）

- 特定分野に特化した専門知識のデータベースを元に推論を行い、その分野の専門家に近い判を下すことができる人工知能システム。
- 例えば、病気に関する知識がほとんどない患者が自分の病気を調べるためにエキスパートシステムを使う、といった、専門知識を持たない人が専門家の助けを借りる形での利用が考えられている。
- **ニューラルネットワーク**が注目される。

## ディープラーニング（第3次人工知能ブーム）
- 2000年代から、コンピューターの性能向上により、ニューラルネットワークの階層を4層、5層と増やし、精度の高い機械学習が実現可能になった。
- 2010年代からは、**ビッグデータ**を扱うようになった

# 機械学習の種類
## 教師あり学習
問題と答えのセットから傾向を学習し、新しいデータがどこに分類されるか予測する。
例）分類問題、回帰問題

## 教師なし学習
「出力すべきもの」があらかじめ決まっていない。
データの背後に存在する本質的な構造を抽出するために用いられる。
例）クラスタリング

## 強化学習
何かがうまくいったらその方法をよく使うようにする
コード内に書いた複数行のテキストを手っ取り早くリストにする

コード内に複数行のテキストを書いて、
1行1要素のリストに変換したい場合のコードです。

```py3:textlist.py
textlist = """\
手っ取り早く
複数行のテキストを
リストにしたい。
ここにテキストを
貼り付けるイメージです。
""".splitlines()
```

```py3:確認
print(textlist)
['手っ取り早く', '複数行のテキストを', 'リストにしたい。', 'ここにテキストを', '貼り付けるイメージです。']
```

なお、1行目末尾の `\` がないと、最初に改行コードが来るので、結果的に1つ目の要素に空文字が来てしまいます。

```py3:textlist.py
textlist = """
手っ取り早く
複数行のテキストを
リストにしたい。
ここにテキストを
貼り付けるイメージです。
""".splitlines()
```

```py3:確認
print(textlist)
['', '手っ取り早く', '複数行のテキストを', 'リストにしたい。', 'ここにテキストを', '貼り付けるイメージです。']
```


# 参考
https://docs.python.jp/3/tutorial/introduction.html#strings の 「三連引用符」の箇所
Javaでよく使うメソッド




## 入力

### Scanner

クラス定義は下記のようになっています。

```
java.lang.Object
┗java.util.Scanner
public final class Scanner extends Object implements Iterator<String>
```

使用する場合は「import java.util.Scanner;」を行って下さい。

#### Scannerインスタンスの作成と標準入力（System.in）の読み込み

まずはScannerインスタンスを作成し、標準入力の情報をScannerインスタンスに渡します。
新しくScannerインスタンス「sc」を作成する場合、「Scanner sc = new Scanner();」と記述すればよいです。scに渡す情報を、右辺の括弧の中に引数として入力します。


続いて標準入力ですが、Javaの場合、標準入力はSystemクラスのinフィールドから取得できるので、「System.in」をScannerインスタンスに渡すことで、入力情報が取得できます。

※クラスには、そのクラスから作り出されるモノが持つ機能(メソッド)とデータ(フィールド)を記述していきます。

```
class クラス名{
  フィールド1
  フィールド2
  ...
  メソッド1
  メソッド2
  ...
}
```

以上をまとめると、System.inを引数として、Scannerインスタンス「sc」に情報を渡す場合は「Scanner sc = new Scanner(System.in);」と記述。
これで、全入力情報がインスタンスscに渡されます。

#### 区切り文字までの読み込み（5〜11行目）

ここでは改行・スペースが区切り文字となる場合の取得方法を記載します。
文字列を取得する場合は「next」メソッド、整数を取得する場合は「nextInt」メソッドを使用します。
記述としては、「int a = sc.nextInt();」や「String s = sc.next();」のようになります。

<a href="http://todai-neet.hateblo.jp/entry/2015/09/01/131413" target="_blank">引用：&lt;Java&gt; Scannerクラスの使い方（その1：基本編） - 東大ニート</a>
【Parrotドローン】ARSDKをSwiftから参照する

#はじめに
MacでARSDKを使って、Parrot社のドローンを操作できるiOS版アプリケーションを開発するために必要な最低限の準備について記します。

この記事を執筆した時点のARSDKのバージョンは3.11.0、Swiftのバージョンは3.0.2です。

執筆にあたっては、[こちら](http://blog.btrax.com/jp/2016/01/14/drone-hack/)の記事を参考にさせていただきました。

#開発言語によらず必要な準備
開発言語としてObjective-Cを使うにしろ、Swiftを使うにしろ[こちら](http://developer.parrot.com/docs/SDK3/#creating-a-project)の"Creating Project"に記された準備は必ず必要です。

空のプロジェクトを作成して、こちらの準備をしてください。

作成したプロジェクトを第三者に利用してもらうことを考えているのであれば、インクルードファイルやラリブラリファイルへのパスの記述に注意してください。相対パスを使って記述するか、マクロを使って記述して開発環境に依存しないようにしましょう。

#どのコントローラ相当のアプリとするか
アプリケーションは、ドローンのコントローラの代わりにBLEもしくはWiFiでドローンに接続します。

そのため、アプリケーションがどのコントローラとして振る舞うかを決めたうえで、リンカのオプションを指定する必要があります。

[こちら](http://developer.parrot.com/docs/SDK3/#creating-a-project)に記されている通り、SkyController相当のアプリとするのであれば、リンカオプションの"-lardiscoverywithouteacc"はそのままで良いですし、追加で特に必要な作業はありません。

SkyController2相当のアプリとするのであれば、リンカプションの"-lardiscoverywithouteacc"は"-lardiscovery"としたうえで、ExternalAccessoryフレームワークをプロジェクトに追加する必要があります。

プロジェクトの追加手順については、検索するといくつか見つかるのでそちらを参考にしてください。追加するフレームワークはExternalAccessory.frameworkです。

<img width="1021" alt="スクリーンショット 2017-01-26 22.31.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/161462/f2eb8aad-e89c-0d36-db83-3eaa92240d92.png">

筆者は、SkyController2相当のアプリとする形で設定しました。

#Swiftからの参照
[こちら](http://developer.parrot.com/docs/SDK3/#start-coding)を見てわかるとおり、いまライブラリが用意されている言語はObjective-C、Java、Cだけです。

そこで、SwiftからObjective-C向けのライブラリを参照できるように準備します。

こちらも、検索するとたくさん手順が見つかりますが、必要な手順をまとめると次のとおりです。

1. プロジェクトにBridging-Header.hファイル(例:ARSDK-Bridging-Header.h)を追加する。
2. ターゲットの"Build Settings"にある"Objective-C Bridging Header"に、追加したBridging-Header.hファイルのパスを設定する。

<img width="1022" alt="スクリーンショット 2017-01-26 22.40.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/161462/19715233-ca0f-5835-8e01-d59d80d3354e.png">

まずは、ここまで設定したらプロジェクトをビルドしてエラーがでないことを確認します。エラーがあれば、ターゲットの"Build Settings"に設定した各種パスとリンカプションを見直してみてください。

# swiftファイル内でARSDKが参照できることを確認する
swiftファイル内から、ARSDKが参照できることを確認してみましょう。

ARSDKのクラスやそのメソッドにアクセスするには、プロジェクトに追加したBridging-Header.hファイルで、次のヘッダファイルをインポートする必要があります。

1. swiftファイルから参照したいクラスやメソッドが定義されたヘッダファイル
2. 上述1のクラスから参照されるクラスやメソッドが定義されたヘッダファイル

まずは、[こちら](http://developer.parrot.com/docs/SDK3/#start-coding)に記された"Start Discovery:"に相当する処理をswiftファイルに記載してみることにします。

空プロジェクトにデフォルトで追加されているViewController.swiftに次のメソッドを記述してみましょう。

```swift:ViewController.swift
    private func startDiscovery() {
        ARDiscovery.sharedInstance().start()
    }
```

Bridging-Header.hファイルにARDiscoveryを利用するために必要なインポート行を記述していないので、当然このままではエラーが発生します。

そこで、次の記述をBridging-Header.hファイルに追記します。追記したらビルドしてみてください。

```objc:Bridging-Header.h
#import <libARDiscovery/ARDISCOVERY_BonjourDiscovery.h>
#import <libARDiscovery/ARDISCOVERY_Device.h>
#import <libARDiscovery/USBAccessoryManager.h>
```

ここまでのターゲットに対する設定が正しければ、ビルドが成功するはずです。

#ここまでとこれから
これでARSDKのObjective-C向けライブラリがSwiftから利用できることがわかりましたので、[こちら](http://developer.parrot.com/docs/SDK3/#start-coding)の内容を元にアプリケーションからドローンを探索して接続する処理を記述してみます。
Riotのタグ作成で起こした、ちょっとしたトラブル

既存のプロジェクトの一部に使えるぐらいの取り回しの良さや、素直な記法に引かれてRiot.jsを使いだしたのはいいのですが、テンプレートのコンパイルに失敗してしまいました。

## コンパイルに失敗したテンプレート
まずは、失敗したものを上げておきます（再現できる程度に、実際の例とは変えてあります）。

```html:failed.tag
<failed>
  <some-other-custom-tag
    foo={bar}
  /> hoge

  <script>
    // 略
  </script>
</failed>
```

このままコンパイルすると、`<some-other-custom-tag .../>`部分までJavaaScriptとみなしてコンパイルされてしまい、コンパイルエラーとなりました。

## 敗因
はじめは、カスタムタグまわりで何か失敗したのかなと思いましたが、原因は別なところにありました。

Riotのマニュアルには、「（`<script>`タグを省略した）場合、ロジックは最後のHTMLタグの後に開始されます。 」とありますが、タグよりあとに`hoge`と文字列があるために、JavaScriptとみなされてしまってエラーになった、ということでした。

## 解決策
幸い、今回の例ではテンプレートが作成途中ということで、最後に文字が出ていただけで、あとあと修正すれば回避できるものだったのですが、どうしても「タグで括らない文字」を最後に置く必要があるケースがあるかもしれません。

そのような場合は、`<virtual>`要素を使いましょう。これは、Riotの処理後には消えてしまうタグです。「外側を括る」以外にも、「ループや分岐に使う」などもできます（[V3のマニュアルの該当節](http://riotjs.com/guide/#the-virtual-tag)）。
ESXi を直接 Ansible で操作する

**vsphere_guest**は**Ansible 1.6**からあるモジュールである。VMware vSphere を通じて**vCenterなしでも直接操作**できる。vCenterを介しても可能。ただその場合はAnsible v2.2 から利用可能な**vmware_guest**を使う方がよい。

>記事投稿時点ではPreview

#既存のVMをブートアップ
既存で構成されているVMをブートアップさせるときは以下のように書く。

```ini:hosts
localhost ansible_connection=local
```

```yaml:site.yml

- hosts: localhost
  connection: local
  become: true
  become_user: root
  gather_facts: no

  tasks
    - name: Boot up instance
      vsphere_guest:
        vcenter_hostname: 192.168.0.12
        username: root
        password: password
        guest: testvm
        state: powered_on
        validate_certs: False
        esxi:
          datacenter: ha-datacenter
          hostname: 192.168.0.12
```
パラメータ自体に一部、vcenterほにゃららとあるので紛らわしいが、そこにはESXiのアドレスやユーザ名、パスワードを入れる。そして、**datacenter**には**ha-datacenter**と入れる。これによりスタンドアロンで実行できる。つまり、ESXi直操作。

> 「validate_certs: False」 は
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "pysphere does not support verifying certificates with python < 2.7.9.  Either update python or set validate_certs=False on the task"}
と怒られたので入れた。


実行

```shell-session
$ ansible-playbook -i hosts site.yml

PLAY [localhost] ***************************************************************

TASK [Boot up instance] ********************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0
```
冪等性もok

```shell-session
$ ansible-playbook -i hosts site.yml

PLAY [localhost] ***************************************************************

TASK [Boot up instance] ********************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0
```

# テスト環境
* vSphere ESXi 5.5
* Ubuntu 14.04.2 LTS
* Ansible 2.2.1
* Python 2.7.6
* pysphere 0.1.7

#参考

* http://docs.ansible.com/ansible/vsphere_guest_module.html
* http://docs.ansible.com/ansible/vmware_guest_module.html
Dockerコンテナ上でのassets precompileの扱い 2017

基本的にassetsファイル系はクラウドなりCDNに上げてるはずで、dockerイメージの中にそんなものを含めたくはないわけですよ。
しかし、未だにsprocketsという世界から抜け出ることはできてないわけで、デプロイまでのどこかでassets precompileをしなければならない。
で、基本的にイメージビルド時にやるかデプロイ時にやるか、になるのですが今のところ私の環境ではデプロイ時にやってます。

イメージをビルドする時はassetの事は考えない。
そして、deployをする時にデプロイ前にフックを挟んでコンテナでrakeを動かし、`assets:precompile`及び`assets:sync`(asset_sync gemを使っている場合)を行う。
しかし、rake実行コンテナと、アプリケーションが起動するコンテナは別々のため、manifestファイルをどこかに保持しておく必要がある。
なので、コンテナ内から環境変数でビルドした時のコミットハッシュを読める様にしておいて、それとRAILS_ENVの組み合わせをキーにしたsuffixを付けてS3上にmanifest.jsonを上げてしまう。
ここまでをrakeで行う。

起動時には、アプリ起動前にフックを仕込んでS3からmanifestファイルをDLして`public/assets/manifest.json`に配置する処理を挟む。
(その他にS3上にKMSで暗号化して保持している秘密鍵的なもの等もDLしている)

これで、基本的にはそんなに問題無くassetが扱える。

しかし、一つ厄介な野郎が居る。roadieだ。メールのビューにCSSを当ててくれるgemなのですが、こいつはその性質上、S3に上げてそこ見れば良いや、というわけにはいかない。メール内にインラインでCSSを仕込まねばならない。

幸いにして、roadieには`AssetProvider`という仕組みがありCSSの探索プロセスを差し替えられる様になっている。
roadie-railsのデフォルトは`FileSystemProvider`と`AssetPipelineProvider`だ。
`public/assets`の下を探して、無かったらsprocketsから探すという感じの動きをする。

この`FileSystemProvider`の動作を拡張すればいい。
ファイルが無かったらS3上のbucketからファイル取得をしてローカルに保存する処理を挟めばちゃんと動くはずだ。
で、雑に書いたのが以下の`S3Provider`だ。

```ruby
require 'aws-sdk'
require 'fileutils'
require 'zlib'

module Roadie
  # Override builtin Provider
  class S3Provider < FilesystemProvider
    def initialize(path = Dir.pwd, bucket: nil, aws_access_key_id: nil, aws_secret_access_key: nil, region: nil)
      super(path)

      @bucket = bucket
      raise "Need bucket" unless @bucket

      @options = {access_key_id: aws_access_key_id, secret_access_key: aws_secret_access_key, region: region}.reject do |_, v|
        v.nil?
      end
    end

    # @return [Stylesheet, nil]
    def find_stylesheet(name)
      file_path = build_file_path(name)
      if File.exist? file_path
        Stylesheet.new file_path, File.read(file_path)
      else
        find_stylesheet_from_s3(name, file_path)
      end
    end

    # @raise InsecurePathError
    # @return [Stylesheet]
    def find_stylesheet!(name)
      file_path = build_file_path(name)
      if File.exist? file_path
        Stylesheet.new file_path, File.read(file_path)
      else
        stylesheet = find_stylesheet_from_s3(name, file_path)
        unless stylesheet
          basename = File.basename file_path
          raise CssNotFound.new(basename, %{#{file_path} does not exist. (Original name was "#{name}")}, self)
        end

        stylesheet
      end
    end

    private

    def s3_client
      @s3_client ||= Aws::S3::Client.new(@options)
    end

    def find_stylesheet_from_s3(name, file_path)
      key = name[0] == "/" ? name[1..-1] : name
      obj = s3_client.get_object(bucket: @bucket, key: key)
      if obj.content_encoding == "gzip"
        body = Zlib::GzipReader.new(s3_client.get_object(bucket: @bucket, key: key).body).read
      else
        body = s3_client.get_object(bucket: @bucket, key: key).body.read
      end
      FileUtils.mkdir_p(File.dirname(file_path))
      File.open(file_path, "w") { |f| f.write(body) }
      Stylesheet.new file_path, body
    rescue
      @s3_client = nil
      nil
    end
  end
end
```

一応、無事動いた。良かった。
Docker for Windowsでpostgresのデータマウントができない人へ

## Docker for macで動くけどDocker for windowsで苦戦している人は私以外にもいるはず

> [過去の私のブログ記事](http://kyo-bad.hatenablog.com/entry/2017/01/21/194046)

ここでは、postgresのvolumeマウントについての解決策が見つかったので紹介。

### postgresのデータ永続化
postgresのデータ永続化のために、
``-v ./postgres-db:/var/lib/postgresql/data``

や

```docker-compose.yml
volumes:
  - ./postgres-db:/var/lib/postgresql/data
```

のようなオプション設定をして、has wrong ownershipといった形でエラーをはくことがDocker for windowsでは起こる。
これは公式issueでも言及されている問題の模様
> [issue docker/for-win](https://github.com/docker/for-win/issues?q=is%3Aopen+is%3Aissue)

解決法としては、volumeコマンドを使ってデータを永続化させてあげることが無難だと判断した。
参考
> http://www.lukaszewczak.com/2016/09/run-postgresql-using-docker-with.html

と、いうことで解決法。
サンプルのdocker-composeファイルを紹介

```docker-compose.yml
version: '2'
services:
  db:
    image:
      postgres
    ports:
      - "5432"
    volumes:
      - test_db:/var/lib/postgresql/data
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

volumes:
  test_db:
    external: true
```

postgresのみを一部抜粋。
最後のvolumesで、外部(composeの外)のvolumeを探してきてマウントします
> http://docs.docker.jp/compose/compose-file.html#external

したがって、
``docker volume create --name test_db``
とした後に、
``docker-compose up``
とすることで、Docker for Windowsでも問題なく動作することを確認したので備忘録的に載せておきます。
ちなみに、mysqlではこのようなエラーは起こりません
BigQueryの外部テーブル機能を使ってGoogleスプレッドシートの値で複数キーワードのあいまい検索を行う

# 概要
複数キーワードであいまい検索を行いたいが、SQLを書き換えるのは面倒なのでGoogleスプレッドシートをWHERE句のパラメータ代わりに使用する。

下記"temp.daikusyohin"テーブルから"釘"と"ナット"を含む文字を検索したい場合、

| syohin_code      |syohin_name  |
|-----------------:|:------------------|
|1	|丸釘|
|2	|スクリュー釘|
|3	|ナベ小ねじ|
|4	|皿小ねじ|
|5	|六角ナット|
|6	|六角ボルト|

通常は下記SQLのように条件指定するが、"釘","ナット"の部分を自由に変更したい場合、毎回SQLを書き換えるのはしんどい＋非エンジニアはSQL書けないので、スプレッドシートに釘、ナットと書けば自動で抽出されるような仕組みを考える。

```SQL:
#standardSQL
SELECT syohin_code, syohin_name from temp.daikusyohin
WHERE
syohin_name like '%釘%' OR syohin_name like '%ナット%' 
ORDER BY 1
```

# 手順
1.GCP設定
2.スプレッドシート作成
3.外部テーブル作成
4.SQL実行

## 1.GCP設定
1.1  Google ドライブ API を有効にする。
1.2  Google ドライブで認証する。

```
gcloud auth login --enable-gdrive-access
```

## 2.スプレッドシート作成
下記のような条件を入力するスプレッドシートを作成
![bq-ss.png](https://qiita-image-store.s3.amazonaws.com/0/106673/5b1b724f-7fb0-9958-5eaa-c25a374d02a3.png)

## 3.外部テーブル作成
bqコマンドを実行して外部テーブルを作成

```
bq mk --external_table_definition=syohin_name:string@GOOGLE_SHEETS=[2.で作成したスプレッドシートのURL] temp.syohinjoken
```

## 4.SQL実行

```SQL:
#standardSQL
SELECT
   A.syohin_code
  ,A.syohin_name
FROM
 temp.daikusyohin A
INNER JOIN
 temp.syohinjoken B
ON
 A.syohin_name LIKE CONCAT('%',B.syohin_name,'%')
ORDER BY
 1
```

釘とナットのみが表示される事を確認

![result1.png](https://qiita-image-store.s3.amazonaws.com/0/106673/bf61ef0c-bdd8-58f7-3b3e-00577492b030.png)

スプレッドシートの値を変更し、
![bq-ss2.png](https://qiita-image-store.s3.amazonaws.com/0/106673/4cb92f84-8100-aabd-2a1a-0a6a9395cf44.png)

同じSQLを実行
![result2.png](https://qiita-image-store.s3.amazonaws.com/0/106673/94888029-2c27-2e90-48c1-24bb2d3b7b05.png)

今度は"ナベ"と"六角"を含むデータのみ抽出された事を確認

# まとめ
上記SQLをビュー化し、BIツールからアクセスすれば、ユーザーはSQLを意識する事なく、スプレッドシートの値を変更する事で自由に条件を設定する事が可能。

BigQueryの外部テーブル機能は使える！
データ可視化記述フォーマットVega(Vega-lite)とPythonバインディングのAltair

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">描画設定とデータが入ったJSONをぶっ込むと一意にプロットされるmatplotlibが欲しい</p>&mdash; 塩こんぶ (@mojaie) <a href="https://twitter.com/mojaie/status/790045207043584000">2016年10月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あった <a href="https://t.co/YoUCTeWzl5">https://t.co/YoUCTeWzl5</a> <a href="https://t.co/n19jmsIywA">https://t.co/n19jmsIywA</a></p>&mdash; 塩こんぶ (@mojaie) <a href="https://twitter.com/mojaie/status/822996250400149505">2017年1月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">プロットのデータ自体はJSONなのでオフラインWebアプリとJupyter notebookでいろいろアレできそう <a href="https://t.co/cnyorF2TDA">https://t.co/cnyorF2TDA</a> <a href="https://t.co/6rQsW4fqck">https://t.co/6rQsW4fqck</a></p>&mdash; 塩こんぶ (@mojaie) <a href="https://twitter.com/mojaie/status/823170130704101376">2017年1月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

仕事で実験装置が吐く大量のデータから大量の棒グラフや折れ線グラフを書いてレポーティングするルーチンがよく発生するので、プロットを自動化する必要があった。あとJupyter notebookでグラフを作成したい。ついでにD3で作っている可視化Webアプリケーションでもグラフを表示したい、ということでJSONで記述されたデータ可視化言語のようなものがあったらいいなあと思っていた。


### Vega

https://vega.github.io/vega/

JSON形式でデータプロットの設定やデータを記述すると、CanvasやSVGでデータプロットが表示される。今後各言語に対応したVegaパーサの開発が進めば、D3やmatplotlibなど各プログラミング言語の可視化ライブラリに特有の文法や細かい表示の違いに悩まされること無く、共通フォーマットで可視化されたデータを共有することが可能になるだろう。

Vega Editorというウェブアプリケーションを使って動作を確認することも可能。上部のプルダウンメニューから様々な使用例を見ることができる。

下記はアメリカの空港の分布、マウスオンで路線が表示される。
http://vega.github.io/vega-editor/?mode=vega&spec=airports


### Vega-lite

https://vega.github.io/vega-lite/

Vegaの軽量版。棒グラフ、折れ線グラフ、散布図などを作成するにはこれで十分。Vegaと同様に、Vega Editorでフォーマットと使用例が確認できる。


### Altair

https://altair-viz.github.io/index.html
Vega-liteパーサのPythonバインディング。

Pandasで処理したデータをAltairで可視化という感じになる。Jupyter notebookでの使用例も豊富にあるので、説明するよりは例を見てもらったほうが早そう。
https://altair-viz.github.io/gallery/index.html

(2017.2.10 追記)
Jupyter notebookで使うだけならAltairは必要なさそう。
IPython VegaというnotebookのextensionをインストールしてVegaかVega-liteのJSONを読み込めばより簡単にグラフをnotebook上に表示できる。

IPython Vega
https://github.com/vega/ipyvega
dovecot 2.x〜　よく使うコマンド

dovecot 2.x〜　でよく使うコマンドについて記載


起動
```
dovecot
```

停止
```
doveadm stop
```

設定の再読み込み
```
doveadm reload
```

ログファイルパスの確認
```
doveadm log find
```

プロセスの確認
```
ps auxw|grep "dovecot"
```




以上
Flexboxでレイアウトした画像がChrome・Safariで表示されたりされなかったりするとき

flexbox便利ですね。カチッと指定しなくても良い感じになってくれるし、適当にやってもなんとなくうまいこと並ぶし。
中にどんな大きさの画像やテキストが入るかわからない要素をレイアウトするときなどに重宝します。

が。時にflexboxには深い闇が潜んでおります。
flexアイテムとして指定したimgタグの縦横比を固定するために安易に`height: 100%`などと指定してはなりません。

一見問題なく縦横比が固定されたように見えますが、真の恐怖は遅れてやってくるのです。

それはリモート環境でのみ起こる…再現性の低いバグ…
PCのChromeとSafariでのみ、ページを開いたときに画像が表示されたり……されなかったり……
画像データはロードされ、そこにあるはずなのに、imgタグのheightが0となっていて表示されない…

そんなことが起こります。

Flexアイテムに指定したimg要素の高さが伸びたりするのは、flexコンテナの`align-items`がデフォルトで`stretch`になっているからです。
これを`flex-start`なり、`center`なりの適当な値にセットしてあげると縦横比は崩れず表示されます。


仕組みを理解して使えばとても便利なFlexbox… ご利用は計画的に…(2日間悩みました)
多用するCloud9ショートカット集

【随時更新します】
Cloud9はネットにRails,node.js,pythonなど、必要な開発環境が揃っていて、とても便利です。独学の初心者の方が必ずぶつかる「開発環境の壁」を簡単にクリアすることができます。
中級者の方でも、ハッカソンのイベントに参加するときや、初学者にプログラミングを教えるときにもとても重宝しますよね。


しかし、Webで動いているサービスであるがゆえ、ショートカットをよく間違えてしまいます。
**command + WでCloud9が落ちる**
なんてことも多々あって、ストレスが溜まりました。

今回の投稿では**快適に使っていた常駐のエディターのようにショートカットを使う**ため、頻出のCloud9ショートカットをまとめました。


# ショートカット記号一覧

Cloud9の左下のtabのcommandsを押すとショートカット一覧が表示されるので、記号を忘れた際に、すぐに確認できるようにしておきます。

[Macのショートカット記号](https://support.apple.com/ja-jp/HT201236)

```
command ⌘
shift ⇧
option ⌥
control ⌃
caps lock ⇪
fn
```

# 新しいファイルを作る
`control + N`

基本的なEditorではcommand+Nですね。

 

# ファイルを閉じる
 `option + W `

既出ですが、command + Wだと、chromeのショートカットが実行され、Cloud9自体のタブが閉じるので注意。

**Weblioのプラグインが反応して表示される際**は、開いたタブから、もしくは詳細設定から、その他の設定より、

`ショートカットキーでオプション画面を表示`

こちらを無効にしてWeblioの設定を保存します。
# プロジェクト内のファイルを検索する
 `command + P`

Windowsの場合は、

```shortcut:Windowsの場合
ctrl + E
```

 または画面左の「Navigate」からファイル名を検索`

# 文字列を全ファイルから検索検索
 

`shift + command + F`

```shortcut:Windowsの場合
ctrl + shift + F
```


で文字列検索後、右下Tabの 「Search Results」 を確認して、ファイルのパスをクリック
VAPID対応のWeb Pushをやってみてはまったこと

#はじめに
かつては、gcm_sender_idが必要だったりと事前登録が必要で面倒だった、Service Workerを用いたWeb Pushですが、VAPIDという仕組みの出現によって、事前登録なしにWeb Pushを行うことができるようになりました。

これによって、僕自身、実装のモチベーションが上がりました。が、しかし、謎の400エラーに悩まされたりしたので、同じ苦しみを味わっている人たちへの何かしらになればとここに書き残します。

VAPIDを用いたWeb Pushの手順等は、書いてくださっている方がいらしたので、
[GCMの登録が不要になったChromeのWeb Pushを試してみる](http://qiita.com/tomoyukilabs/items/9346eb44b5a48b294762) 
こちらを参考にすると幸福かもしれません。

また、Server側の処理に関しては、web-pushというライブラリがかなり参考になります。
https://github.com/web-push-libs/web-push/
自分で1から実装したい場合は、このコードを参考にするとよいかもしれません。

かなり雑ではありますが、node の web-pushを用いた簡単なサンプルに関しては
https://github.com/kanataxa/webpushtest
こちらに上げました。かなり雑かつシンプルなので、ほんのちょっとの参考程度に。

また、Service WorkerのActivate等のタイミングなどは知っておいた方が良いと思います。
[Service Workerの紹介](https://developers.google.com/web/fundamentals/getting-started/primers/service-workers?hl=ja)
こちらが簡単かつ非常に分かりやすかったので参考にしてください。

英語ではありますが、簡単にWeb Push の体験をしたい場合は、こちらを使うと幸せです。
[Adding Push Notifications to a Web App](https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/)

以下は、僕がやっていて悲しくなったことです。

#web-push libraryのこと
単純に、ソースコード諸々読むの怠っただけなんですが。
最初始めたときに色々なサイトを参考にしてごちゃごちゃ書いてしまって嵌っただけです。

nodejsで　web-pushのライブラリを使う方がいらっしゃったら参考にしてください。

上で紹介させて頂いた記事にも書いてありますが、ざっくり雑に言うとVAPIDを用いる場合は、
サーバの共通鍵とJWTを用いた暗号的な云々で検証等を行います。
・subscribe()時にアプリケーションサーバの公開鍵を含めて登録する。
・Pushサーバの認証のために,Push通知のリクエストをアプリケーションサーバがPushサーバに行う際に、JWTが必要になる。

ここで、web-push libraryは非常に便利で、これらのことを勝手にやってくれます。
どういうことかというと、GithubのREADMEに色々書いてありますが、
webpush.sendNotification()にきちんと正しい引数を与えれば、それだけで終わります。
JWTもこいつが勝手に作ってくれるので、まったく気にする必要がありません。
足りなければErrorを投げてくれます。

#悲しい400エラー
webpush.sendNotification()で発生したエラーなんですが。
これソース追うと、PushServerからのレスポンスのエラーをCatchしているようです、たしか。(うろ覚え)

  name: 'WebPushError',
  message: 'Received unexpected response code',
  statusCode: 400,
  headers:
   { 'content-type': 'text/html; charset=UTF-8',
     date: 'Thu, 26 Jan 2017 10:57:59 GMT',
     expires: 'Thu, 26 Jan 2017 10:57:59 GMT',
     'cache-control': 'private, max-age=0',
     'x-content-type-options': 'nosniff',
     'x-frame-options': 'SAMEORIGIN',
     'x-xss-protection': '1; mode=block',
     server: 'GSE',
     'alt-svc': 'quic=":443"; ma=2592000; v="35,34"',
     'accept-ranges': 'none',
     vary: 'Accept-Encoding',
     connection: 'close' },..........

こんな感じのエラーですね。
400エラーなのでサーバがPushサーバに送る際にミスってるのかなぁと思って嵌ったんですが、
どうやらpushManager.subscribe()の問題のようでした。

デモで作ってるときなんて、頻繁にサーバ再起動すると思うのですが、それによってサーバの鍵が更新されるように作っていました。
subscribe()は登録されていたらそれを使うようになっているので、古いサーバ鍵でPush通知の処理を行おうとしていたので400エラーを吐いていたようです。

unsubscribe(),subscribe(),getSubscription()等を用いて、きちんと購読の更新もしてあげるようにしましょう。

商用で使いたい場合には
serviceWorkerにpushsubscriptionchangeイベントがあるのでこいつを上手く使って、更新を書けるようにすると良いらしいです。

#終わりに
GoogleのProgressive Web appとかInstant Appsとか、そんなものを見ていると、Webに回帰する動きは今後強まりそうな気がします。
そうなるとPush通知も当然、必要になりそうな予感がします。
是非やってみてください、そしてできれば僕に教えてください。

ServiceWorkerのPushイベントのリスナーだけやりたい場合は、
デベロッパーツール(F12)のApplicationのServiceWorker使うとよいです、便利です。

※まだ、不特定多数に送るような処理は、やっていないので、やったらそこらへんやったらまた追記とかするかもしれません。
Terraform -forces new resource-

# 発端
* code変更した記憶がないけど、`forces new resource`が出力されていた


```bash
$ terraform plan
-/+ aws_instance.*******
(snip)
security_groups.#:           "0" => "1" (forces new resource)
security_groups.3175896941:  "" => "sg-*****" (forces new resource)
(snip)
```

# 調査
* tfstateを見たらkeyが２つある・・・

```
(snip)
"security_groups.#": "0",
"vpc_security_group_ids.#": "1",
"vpc_security_group_ids.4130972961": "sg-*****"
(snip)
```
* `forces new resource`?
    * パラメータが変更された際はリソースを再作成する処理のようです。

```https://github.com/hashicorp/terraform/blob/v0.6.11/builtin/providers/aws/resource_aws_instance.go#L106-L123
"security_groups": &schema.Schema{
  Type:     schema.TypeSet,
  Optional: true,
  Computed: true,
  ForceNew: true,
  Elem:     &schema.Schema{Type: schema.TypeString},
  Set:      schema.HashString,
},

"vpc_security_group_ids": &schema.Schema{
  Type:     schema.TypeSet,
  Optional: true,
  Computed: true,
  Elem:     &schema.Schema{Type: schema.TypeString},
  Set: func(v interface{}) int {
    return hashcode.String(v.(string))
  },
},
```

# 対策
* tfファイルでは`vpc_security_group_ids`を使用していたので、リソースを再作成しない`vpc_security_group_ids`へ変更することでリソース再作成を回避できる。

* before

```bash
security_groups = ["${aws_security_group.******.id}"]
```
* after

```bash
vpc_security_group_ids = ["${aws_security_group.******.id}"]
```

# 確認
* `forces new resource`が出力されていない

```bash
$ terraform plan
-/+ aws_instance.*******
security_groups.#:                 "0" => "<computed>"
(snip)
vpc_security_group_ids.#:          "1" => "1"
vpc_security_group_ids.3175896941: "sg-*****" => "sg-*****"
(snip)
```
#　補足
* `instance_type`など、リソース再作成を回避できないものも数多くある。しかも、`stopp`ではく`terminated`されるので要注意
ArUco マーカーの検出

[Detection of ArUco Markers](http://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) を参考にやってみる。

環境: Max OS X El Capitan
OpenCV 3.2

## 準備

ArUcoの機能は、OpenCV の contribに入っています。なので、homebrewでOpenCVをインストールしているなら、--with-contrib オプションを付けてインストールしましょう。

```
% brew install opencv3 --with-contrib
```

[少し前のOpenCV](http://qiita.com/hitomatagi/items/83e08082a12beb25ff46) では、ArUcoのPython対応は完全では無いようでした。ですが現在はバリッと使える感じがします。

```python
import cv2
aruco = cv2.aruco
dir(aruco)
```

このように出力されました。

```
['Board_create',
'CharucoBoard_create',
'DICT_4X4_100',
'DICT_4X4_1000',
'DICT_4X4_250',
'DICT_4X4_50',
'DICT_5X5_100',
'DICT_5X5_1000',
'DICT_5X5_250',
'DICT_5X5_50',
'DICT_6X6_100',
'DICT_6X6_1000',
'DICT_6X6_250',
'DICT_6X6_50',
'DICT_7X7_100',
'DICT_7X7_1000',
'DICT_7X7_250',
'DICT_7X7_50',
'DICT_ARUCO_ORIGINAL',
'DetectorParameters_create',
'Dictionary_create',
'Dictionary_create_from',
'Dictionary_get',
'GridBoard_create',
'__doc__',
'__name__',
'__package__',
'calibrateCameraAruco',
'calibrateCameraArucoExtended',
'calibrateCameraCharuco',
'calibrateCameraCharucoExtended',
'custom_dictionary',
'custom_dictionary_from',
'detectCharucoDiamond',
'detectMarkers',
'drawAxis',
'drawDetectedCornersCharuco',
'drawDetectedDiamonds',
'drawDetectedMarkers',
'drawMarker',
'drawPlanarBoard',
'estimatePoseBoard',
'estimatePoseCharucoBoard',
'estimatePoseSingleMarkers',
'getPredefinedDictionary',
'interpolateCornersCharuco',
'refineDetectedMarkers’]
```

## 辞書を作る

予め定義されている辞書を使って dictionary オブジェクトを作ります。この場合はマーカーのサイズが4x4で、マーカーの数は50です。

```python
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
```

次にマーカーを描画します。２番目のパラメータがマーカーの保持する値で、3番目のパラメータはマーカー画像の大きさです。

```python
marker = aruco.drawMarker(dictionary, 4, 100)
```

こんなものが出来ました！
![download (1).png](https://qiita-image-store.s3.amazonaws.com/0/42252/e5c423c1-df3b-b198-40b1-932cf0ede942.png)


## マーカーを検出する

マーカーが写っている画像を用意して、以下のように呼び出します。
お試しているjupyterの画面をキャプチャし、画像を20分の1に縮小して検出させてみました。

```
img = cv2.imread('スクリーンショット.png')
img = cv2.resize(img, None, fx=0.05, fy=0.05)
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
```

マーカーのサイズが十数ピクセルでも正しく検出できています。優秀ですね！

```python
for number, corner in zip(ids, corners):  
    print number, corner

[4] [[[ 11.  34.]
  [ 26.  34.]
  [ 26.  48.]
  [ 11.  48.]]]
[4] [[[ 11.   6.]
  [ 26.   6.]
  [ 26.  20.]
  [ 11.  20.]]]
```

他にも色々機能があるようなので、遊んでみようと思います。
rails でWatson APIを使ってみる。(personality insights編)

rails でWatson APIを実装する方法です。

#1 IBM Watson Developer Cloudに登録する。
Watson API を使う為にはIBMが提供しているDeveloper Cloudに登録し、
使いたい機能のユーザーIDとパスワードを取得する必要があります。
https://www.ibm.com/watson/developercloud/
Personality Insights の場合、サービス資格情報の表示よりユーザーnameとパスワードを控えてください。

#2 rails で使ってみる。
コードを書く前にgemのインストールをしてください。

```Gemfile
gem  "watson-api-client"
```

```controller.rb
require 'watson-api-client'
service = WatsonAPIClient::PersonalityInsights.new(:user=>ENV["user_name"],
                                                   :password=>ENV["user_pass"],
                                                   :verify_ssl=>OpenSSL::SSL::VERIFY_NONE)
    data = service.profile(
      'version'          => "2016-10-20",
      'Content-Type'     => "text/plain",
      'Accept'           => "application/json",
      'Accept-Language'  => "ja",
      'Content-Language' => "ja",
      'body'             => '検証したい文章')
      '結果' =  JSON.parse(data.body)
```

こんな感じで検証結果を取得することができます。

#補足
取得した結果を可視化する方法もまとめました。
http://qiita.com/takuya-kodama/items/04702209478982a7e0e1
ターミナルにadbのパスを通す(Mac)

なんのひねりもない記事です。ただ、地味に（特に前半）迷ったのでまとめておく。
単にbashrcに書けばよかった。


Android SDK locationを調べる。
Android Studioを起動、
File->Other Settings->Default Project Structure
SDK Locationをコピー。
だいたい、「/Users/ユーザ名/Library/Android/sdk」

adbコマンドはsdkフォルダのplatform-toolsにあるので、

```sh
export PATH=$PATH:/Users/ユーザ名/Library/Android/sdk/platform-tools
```

をとりあえず叩く。これでadbにパスが通ったはず。USBデバッグを有効にした上でUSBケーブルでスマホをつなぐ。

```sh
$adb devices
```

これ叩いてデバイスがつながっていることが確認できればOK。
あとは次回以降も使えるように、

~/.bashrcに以下を追記する

```sh
export PATH=$PATH:/Users/ユーザ名/Library/Android/sdk/platform-tools
```

```sh
source .bashrc
```


で反映できる。
React NativeでiOSアプリをビルドした際に":CFBundleIdentifier", Does Not Existとエラーが発生した場合の対処方法。


# 概要

React Nativeが公開された際に一度動かしてから触っていないので、改めてReact Nativeプロジェクトの作成から、ビルドしてiOSシミュレーターで表示するまでをやってみたが、`Print: Entry, ":CFBundleIdentifier", Does Not Exist`というエラーが発生しビルドが失敗した。この投稿はエラーが解決するまでに試したことのメモ。

# 結論

**macOSとXcodeを最新にしましょう。**

# ReactNateiveを利用する準備

公式サイトの[Getting Started]()を読み、必要なライブラリやツールをインストールする。

## Node.jsのインストール

Homebrewで入れるよう指示があるが、`nodebrew`や`nvm`でインストールするほうがバージョンを簡単に切り替えられるのでおすすめ。

- [nodebrew](https://github.com/hokaccha/nodebrew)
- [nvm](https://github.com/creationix/nvm)

## Watchmanのインストール

Watchmanをインストール。ReactNativeプロジェクトのファイルの変更を監視するために使うらしい。

```bash
$ brew install watchman
```

## React Native CLIのインストール

```bash
$ npm install -g react-native-cli
```

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

チュートリアルどおりにプロジェクトを作成

```bash
$ react-native init AwesomeProject
$ cd AwesomeProject
$ react-native run-ios
```

## エラーの発生

`react-native run-ios`実行時に以下のエラーが発生。

```bash
Print: Entry, ":CFBundleIdentifier", Does Not Exist
```

`CFBundleIdentifier Does Not Exist`で検索すると以下のページがトップにくる。

[http://qiita.com/iwamatsu0430/items/ba3c5d14e4b525c80e23](http://qiita.com/iwamatsu0430/items/ba3c5d14e4b525c80e23)

この方法を試したが改善されなかった。

`brew upgrade`でwatchmanを最新に更新。状況変わらず。

また、以下を試したが改善せず。

[https://github.com/facebook/react-native/issues/7308#issuecomment-250231736](https://github.com/facebook/react-native/issues/7308#issuecomment-250231736)

# macOSのアップグレード

macOSのバージョンがyosemite、Xcodeが7.2という環境だったので、OSをSierraアップグレードし、Xcodeを8.2.1にアップデートした。

その結果上手くビルドできた。

![hello_react_native.png](https://qiita-image-store.s3.amazonaws.com/0/43438/5bf5495b-4f7b-3151-4eb9-347d1da2016f.png "hello_react_native.png")
Kotlinを学ぶ際に最低限必要な情報

[Kotlin](https://kotlinlang.org/)を改めて学ぼうと思い、最低限学習に必要な情報をまとめてみました。

# Kotlinとは？ 
Wikiからの引用です。Javaとの相互運用性が担保された安心のJetbrains製です。
KotlinでAndroidアプリを書くことも、Webアプリケーションを書くこともできます。
Swiftと構文が近いのでiOSアプリを開発している人は非常に馴染みやすいとおもいます。

> Kotlin言語は、ロシア連邦レニングラード州都のサンクトペテルブルクにある、ジェットブレインズ社の研究所で生まれた。
ジェットブレインズ社は Java、Ruby、Python などのプログラミング言語による開発環境などを開発して販売してきた。Kotlin言語は、同社の経験を活かしJava言語をもっと簡潔・安全になるように改良した産業利用向け汎用言語として開発され、2011年7月20日に発表された。
オペーレーティング・システムによらずJava仮想マシン上で動く。Java言語が書かれたプログラムと同じほど速くコンパイルされ同じほど速く動作するとしている。
Java言語に望まれている機能であっても互換性を保つために実現できていない機能や、将来のJava言語の仕様で実現が予定されている機能から、有用と思われる機能を採用した。また、Java仮想マシンで動く点で似ているスクリプト言語 Groovy や関数型プログラミング言語の要素が強い Scala から、機能や簡易記法（糖衣構文）を採用した。

# Kotlinを試したい！ or 問題をときながら学びたい！  

## Try Kotlin or Kotlin Koans
こちらの[Try Kotlin](http://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt)で実際にコードを動作させることができ、[Kotlin Koans](https://play.kotlinlang.org/koans/overview)では簡単な問題をときながら学べます。Ctrl+RでプログラムをRunできます。（全部英語です。）    
## IntellijのKotlin REPL
ちなみに写経ならTry KotlinよりもIntellijのKotlin REPLの方が楽です。  
shiftキーをダブルタップするとsearch everywhereが立ち上がるのでそこから探して下さい。  
![スクリーンショット 2017-06-14 13.00.04.png](https://qiita-image-store.s3.amazonaws.com/0/9628/ec4a1eeb-2356-a9c2-8fdd-f191f164ef0a.png)



# その他参考情報など  

## 本、PDF、ドキュメント  
* [Kotlinスタートブック](https://www.amazon.co.jp/Kotlin%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E6%96%B0%E3%81%97%E3%81%84Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%95%B7%E6%BE%A4-%E5%A4%AA%E9%83%8E/dp/4865940391)
* [Kotlin助走読本(PDF)](https://drive.google.com/file/d/0Bylpznm149-gTGRjOFRkWm9PODg/view)    
* [基本文法](http://kotlinlang.org/docs/reference/basic-syntax.html#defining-functions) 
* [SpringBoot+Kotlin](https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin)  


## 勉強会  
* [Kotlin読書勉強会](https://read-kotlin.connpass.com/)  
* [KOTLIN BLOG（JetBrains公式）](https://blog.jetbrains.com/kotlin/)
* [SansanのKotlin勉強会](https://sansan.connpass.com/event/44710/)

## Twitter, Slack, Podcast, Weekly Mail
* [Twitter: Kotlin公式](https://twitter.com/kotlin)
* [Twitter: JetBrains黙認のKotlinエバンジェリストのたろうさん](https://twitter.com/ngsw_taro)  
* [Slackグループ Kotlin](http://kotlinlang-jp.herokuapp.com/)
* [Kotlin Weekly](http://www.kotlinweekly.net/)
* [Podcast: talkingkotlin](http://talkingkotlin.com/)

## Github
* [Github: Kotlin](https://github.com/JetBrains/kotlin)
Oracle RDBMSに格納したJSONデータに容易にSQLアプリでアクセスする方法（12c R2新機能：データ・ガイド）

# Oracle RDBMSに格納したJSONデータをSQLから簡単にアクセスする方法
Oracle RDBMSのVARCHAR2/BLOB/CLOB型にJSONデータを格納する方法を以下で紹介しました。
[Oracle RDBMS に JSONデータを格納する](http://qiita.com/kenwatan/items/1bb8e78cf311d9bbbd71)

Oracle12c R2(12.2)では新機能（データ・ガイド）により、JSONデータを解析し、Viewや仮想列としてSQLからアクセスすることが可能です。

## 準備
- JSONデータを格納する表の作成
- JSONデータが格納された列にJSON検索索引を作成
- (オプション)JSON検索索引の統計取得
    - EXEC DBMS_STATS.GATHER_INDEX_STATS での取得

### 例
- JSONデータを格納する表の作成
` CREATE TABLE JSON (id number(4),doc CLOB CONSTRAINT valid_json CHECK (doc IS JSON)); `

- JSONデータ格納列にJSON検索索引を作成
` CREATE SEARCH INDEX JSON_IDX ON JSON (doc) for json; `

- サンプルデータの挿入

``` sql:index.sql


INSERT INTO JSON VALUES (1,
'{
"firstName": "Gerald",
"lastName": "Venzl",
"location": {
"country": "UK",
"city": "London",
"postCode": "EC2M"
}
}');

INSERT INTO JSON VALUES (2,
'{
"firstName": "Dominic",
"middleName": "Patrick",
"lastName": "Giles",
"location": {
"country": "UK",
"city": "London"
}
}');
commit;

```
***
## View or 仮想列の作成
- VIEWの作成
- 仮想列として作成
    - （オプション）仮想列の削除

### 例
- JSON 表のDOC列にJSONデータが格納されている場合で JSON_VIEW1というVIEWを作成

``` sql
EXEC DBMS_JSON.create_view_on_path('JSON_VIEW1','JSON','DOC','$');
```

- 作成されたVIEWの確認

`DESC JSON_VIEW1`

| Name | Type |
|:---|:---|
| ID  | NUMBER(4)  |
| DOC$lastName  |VARCHAR2(8)   |
| DOC$city  | VARCHAR2(8)  |
| DOC$country  | VARCHAR2(2)  |
| DOC$postCode  | VARCHAR2(4)  |
| DOC$firstName  | VARCHAR2(8)  |
| DOC$middleName  | VARCHAR2(8)  |

- JSON 表のDOC列にJSONデータが格納されている場合で 仮想列を追加

``` sql
EXEC DBMS_JSON.add_virtual_columns('JSON','DOC');
```

- 作成された仮想列の確認

`DESC JSON`

| Name | Type |
|:---|:---|
| ID  | NUMBER(4)  |
| DOC  | CLOB  |
| DOC$lastName  |VARCHAR2(8)   |
| DOC$city  | VARCHAR2(8)  |
| DOC$country  | VARCHAR2(2)  |
| DOC$postCode  | VARCHAR2(4)  |
| DOC$firstName  | VARCHAR2(8)  |
| DOC$middleName  | VARCHAR2(8)  |

- 仮想列の削除

``` sql
EXEC DBMS_JSON.drop_virtual_columns('JSON','DOC');
```

作成された VIEW や 仮想列には SELECT文でアクセスが可能

``` sql
SQL> select * from json_view1;

        ID DOC$last DOC$city DO DOC$ DOC$firs DOC$midd
---------- -------- -------- -- ---- -------- --------
         1 Venzl    London   UK EC2M Gerald
         2 Giles    London   UK      Dominic  Patrick
```
***
## データ・ガイドとは
#### JSONドキュメントの集合から生成するスキーマ情報
##### 対象となるJSONデータ格納列にJSON検索索引があるとJSONデータの更新に追従して、データ・ガイドが更新されます。

###### 注）JSON検索索引はJSON形式のチェック制約(is json)がある列に対して作成が可能です。
` 制約がない場合 DRG-10720: syntax only supported with constraint: IS JSON が発生 `

####### JSON検索索引の作成構文が12c R2(12.2)から新しくなっており、12.1にて作成した検索索引はドロップして、CREATE SEARCH INDEXにて再作成が推奨
####### JSON検索索引について統計を取得すると、最大値、最小値、出現率、スカラー値がJSON nullの数なども取得します。

##### JSON検索索引が作成できない場合は、VIEW作成、仮想列作成のプロシージャに階層フォーマットのデータ・ガイドを引数として引き渡します。
TypeScript 2.1でES3/ES5コードにasync/awaitを使う

TypeScript 2.1でターゲットがES3/ES5でも、async/awaitが使えるようになりました。
（※以前は、ES2015（ES6）ターゲットのときのみ利用可能でした。）

私は、非同期APIのテストで活用しています。

サンプルコードは以下のURLの「Downlevel Async Functions」で確認できます。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html

tsconfig.jsonでlibを追加します。

* "dom", "es2015"
* もしくは "dom", "es2015.promise", "es5"

```tsconfig.json
{
    "compilerOptions": {
        "lib": ["dom", "es2015.promise", "es5"]
    }
}
```

* 以下のサンプルの場合、Helloと出力後、500ミリ秒おきに "." が3回出力され、最後に "World!"と出力されます。

```dramaticWelcome.ts
function delay(milliseconds: number) {
    return new Promise<void>(resolve => {
        setTimeout(resolve, milliseconds);
    });
}

async function dramaticWelcome() {
    console.log("Hello");

    for (let i = 0; i < 3; i++) {
        await delay(500);
        console.log(".");
    }

    console.log("World!");
}

dramaticWelcome();
```
TypeScriptでES2015のCollectionを利用する


ES2015には、以下のようなCollectionクラスが定義されています。

* [Map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map)
* [Set](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Set)
* [WeakMap](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
* [WeakSet](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)

TypeScriptでは、tsconfig.jsonのcompileOptions.libに"es2015.collection"を追加することで、Collectionクラスが利用できるようになります。

```tsconfig.json
{
  "compilerOptions": {
    "lib": ["es2015.collection"]
    // その他の定義
}
```

importなしでCollectionが使えるようになります。

```
let myMap = new Map<String, number>();
myMap.set("a", 1);
myMap.set("b", 1);
```

型定義は以下で見れますので、ご確認ください。

https://github.com/Microsoft/TypeScript/blob/master/lib/lib.es2015.collection.d.ts
パナソニック製照明のリモコン

10年くらい前に買った、蛍光灯の照明(HHLZ402)のリモコンを調べてみました。

付属のリモコンはHK9335

![1428107878068.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/598b0ed2-4113-97e2-fccc-c26be18a7596.jpeg)


でボタン一つのタイプです。ボタンを押すと、点灯強、点灯弱、常夜灯、消灯の順に変わります。横にスイッチがあってチャンネル1と2を切り替えられます。

家電協フォーマットのようで、EZ-USB FX2をロジアナにして信号をみるとこんな感じです。

![20180219-104539.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/1dd33ec1-b504-8ec8-b2ac-8736a9e3458b.jpeg)


このボタンの信号は

|チャンネル|信号|
|:--|:--|
|1| 344A901484 |
|2| 344A900C9C |

で40ビットになります。



信号のチェックにはATTiny85/V-USBを使ったモジュールを作って、Macでlibusbな簡単な解析プログラムで確認しています。

https://sourceforge.net/p/ubsa-osx/svn/HEAD/tree/avrir/

成功率50%くらいですが、V-USBの割り込みで取りこぼすので、何度か試して確認しています。

[アルマジロのお使い](http://hp.vector.co.jp/authors/VA009278/ubsa-osx/armadillo.html)でFTDIのbitbangで試してみましたが、感度が悪いようで近づけないと反応しませんでした。

試しにFUATABA WEB/リモコン・データベースにあったデータを試してみたところ下記の信号にも反応するようです。(チャンネル2の信号のようです)

344A902CBC -> ON

344A90EC7C -> OFF

344A906CFC -> 常夜灯

344A90CC5C -> 調光 暗

344A904CDC -> 調光 明

製品のリモコンは3つLEDが付いてて、出力が大きいようです。LEDが1つの自作モジュールではシーリングから1mくらいに近づけないと反応しませんでした。

親戚の家に同系のリモコンのHK9327があり、チャンネル切り替えのスイッチがセロハンテープで固めてありました。おそらく不用意に切り替わってコントロールできなくなり、大騒ぎした末にそうしたのではないかと思われます。チャンネル切り替えは表面につける必要ないと思います。

LEDシーリングライトに付属のHK9803ではチャンネルのスイッチは蓋の中に隠れています。またチャンネル設定は本体ではなくリモコンだけでできるようになっています。このリモコンの信号は確認していません。

参考にしたページ

http://itline.jp/~svx/diary/?date=20110612

http://hello-world.blog.so-net.ne.jp/2011-05-07
辞書型(Dictionary, Hash)に入ってるかどうかanyやallを使って確かめる方法

### 背景
複数のキーや値が辞書型に入っているか確かめたい状況のときに、anyやall使えないかなと思ってたので、Tipsとして書いておく

### 概要
例えば、3つ必須項目があって、設定ファイルにその設定があるかどうかを確かめる

```py
settings = {} # <-- ここに設定が読み込まれる

# 例えば、REDIS_HOSTとREDIS_PORTとREDIS_DBというキーがあるか確かめたいときに
if not settings['REDIS_HOST'] or not settings['REDIS_PORT'] or not settings['REDIS_DB']:
  print('error')
```

みたいにするんじゃなくて

```py
requirements = ['REDIS_HOST', 'REDIS_PORT', 'REDIS_DB']
if not all(x in settings for x in requirements):
  print('error')
```
みたいにできる
dockerめも

#### バージョン確認

```
$docker version
Client:
 Version:      1.13.0
 API version:  1.25
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Wed Jan 18 16:20:26 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      1.13.0
 API version:  1.25 (minimum version 1.12)
 Go version:   go1.7.3
 Git commit:   49bf474
 Built:        Wed Jan 18 16:20:26 2017
 OS/Arch:      linux/amd64
 Experimental: true
```

#### コンテナの実行

```
docker run -it イメージ名 コマンド名
```

```
docker run -it ubuntu bash
```


#### プロセスの確認

```
docker ps -a
```

#### イメージ一覧の表示

```
docker images
```

#### Dockerfileからのイメージ作成

Dockerfileがあるディレクトリで実行する

```
docker build -t イメージ名 .
```

```
docker build -t docker-whale .
```


#### タグの作成

```
docker tag イメージID アカウント名/イメージ名:バージョン名
```

```
docker tag 7d9495d03763 maryatdocker/docker-whale:latest
```

#### Docker Hubへのログイン

```
docker login
```

#### イメージのアップロード

```
docker push アカウント名/イメージ名
```

```
docker push maryatdocker/docker-whale
```

#### イメージの削除

```
docker rmi -f イメージIDまたはイメージ名
```

```
docker rmi -f 7d9495d03763
docker rmi -f docker-whale
```

#### ネットワーク名の表示

```
docker network ls
```

#### ネットワークの中で動いてるコンテナの表示

```
docker network inspect ネットワーク名
```

#### ネットワークからコンテナを削除

```
docker network disconnect ネットワーク名 コンテナ名
```

#### ネットワークにコンテナを追加

```
docker network connect ネットワーク名 コンテナ名
```

#### 新しいネットワークの作成

```
docker network create -d bridgeまたはoverlay ネットワーク名
```

- bridgeはシングルホスト用のネットワーク
- overlayはマルチポスト用のネットワーク

#### 指定したネットワークに指定したコンテナを起動

```
docker run -d --net=ネットワーク名 --name ローカルイメージ名 リモートイメージ名
```

```
docker run -d --net=my-bridge-network --name db training/postgres
```


参考URL
https://docs.docker.com/