OmniAICreator/Qiita-1.07M huggingface dataset:
RancherでDockerクラスタを構築する-② VultrにRancher Server を立ち上げる

[Vultr](https://www.vultr.com/)のサーバを起動し、Rancher ServerをDockerで立ち上げます。次にGitHubによるアクセス制限を行います。

## Rancher Serverで何をするのか

Dockerは複数のコンテナの連携を行って初めてサーバアプリケーションとして機能します。その際、

* どのホストにどのコンテナをupするのか
* コンテナ間の連携(link)をどうするか
* ホストをまたがる連携(link)
* ロードバランサはどうするか
* Webサーバのクラスタ構成をどうするか

などの問題がいつもつきまといます。Rancher Serverでは、Dockerのホストを管理し、ホストをまたがる連携などを簡単に管理することが出来ます。

## Vultrサーバの起動

vultrは今一番ノリに乗っているクラウドプロバイダ（当社調べ）です。メリットとしては

* 東京リージョンがある
* （比較的）安い
* Server TypeにCore OSを選択できる

などでしょうか。逆にデメリットとしては、

* 自動課金が出来ず、プリペイド方式でチャージしないといけない

ことです。きっちり使いたい場合は定期的にチャージする必要がある点が難点です。また、東京リージョンの人気が高かったのか、数日間__売切れ__になったことが何回かありました。

### インスタンスを起動

Vultrにログインし、

![qiita_rancher_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/143640/bcc09b98-b076-9897-0802-d9811e17a2b6.png)

上記のように

* Server Location: Tokyo
* Server Type: CoreOS

を選択し、起動します。また、SSHキーログインにしておいた方が今後の作業が楽になります。今回はCoreOSにしましたが、他のOSでももちろん問題ありません([Rancher OS](http://rancher.com/rancher-os/)もあり、vultrでRancher OSを起動するように[Script Template](https://www.vultr.com/docs/install-rancher-os-via-ipxe)を書けば出来るらしいですが、そこまではやっていません)

しばらくすると、

![qiita_rancher_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/143640/711b5525-266c-9059-a22b-b4e3672a45e3.png)

__Running__に変わります。


## Rancher Serverのインストール

[Installing Rancher Server (Single Node)](https://docs.rancher.com/rancher/v1.2/en/installing-rancher/installing-server/#bind-mount-mysql-volume)を参考にRancher Serverをインストールします。

SSHで先程起動したサーバにログインし、

    $ mkdir ~/data
    $ docker run -d -v data:/var/lib/mysql --restart=always -p 8080:8080 rancher/server

とします。すべて完了するまで少し時間がかかります。
ここでVolumeを設定したのは、再起動後もMySQLのデータが消えないようにするためです。

ブラウザで ``` http://[HOST]:8080/ ``` にアクセスします。

![範囲を選択_001.png](https://qiita-image-store.s3.amazonaws.com/0/143640/bc959d49-16ba-066f-c232-6651fe9e6a32.png)

このように表示されれば成功です。

## アクセス制限を設定する

この時点ではアクセス制限が設定されていません。ということは、上記のURLで誰でもアクセス出来てしまいます。そこでアクセス制限を設定しましょう。

メニューから ```ADMIN > Access Controll ``` を選択します。

Rancherでは、いろいろなアクセスコントロールが設定できますが、ここでは一番わかり易いgithubで設定してみます。

![範囲を選択_002.png](https://qiita-image-store.s3.amazonaws.com/0/143640/61816f70-8e37-52ee-1ca1-33c61f1069a2.png)

```1. Setup a Github Application```の下にある```click here```をクリックします。githubにログイン済みであれば、新しくアプリケーションを登録する画面が開きます。

githubで```Register New Application```をクリックします。

![範囲を選択_003.png](https://qiita-image-store.s3.amazonaws.com/0/143640/d80bb3c6-7eef-33d8-6c93-2ecefb658d62.png)

4つの項目は、Rancher画面上の```Register new application" and fill out the form```を参考に入力していきます。入力が完了し、```Register Application```をクリックしてアプリケーションを登録します。

アプリケーションの登録が完了すると、アプリ固有の```Client ID```と```Client Secret```が生成されますので、それをRancher側にコピペし、```Authenticate with GitHub```でGitHubによるアクセス制限が完了します。

以上で完了です。

ProductionではSSLにしたり、クラスタを構築したりする必要があるかと思いますが、詳しくは[Rancher Document](http://docs.rancher.com/rancher/v1.2/en/)を参考にしてください。

## 次回予告

次回は、もうひとつvultrのサーバをたて、そこにRancherのスタックを構築して行きたいと思います。
RancherでDockerクラスタを構築する-① 準備編

Dockerクラスタを構築する場合、コンテナ間の連携を考慮する必要があります。 docker-composeでもある程度のことは出来ますが、複数ホストで運用したり、ロードバランサ等を含めた少し複雑な構成になってくると、途端にややこしくなります。

Web UI でDockerクラスタを管理出来るサービスといえば、Tutum改め[Docker Cloud](https://cloud.docker.com/)などがありますが、私は[Rancher](http://rancher.com/rancher/)を使っています。

今後数回に渡って、Rancherを使ったDockerクラスタの構築方法をご紹介して行きたいと思います。

## 目次

1. RancherでDockerクラスタを構築する-① 準備編
2. [RancherでDockerクラスタを構築する-② VultrにRancher Server を立ち上げる](http://qiita.com/TongTheDopeness/items/58713ed877cb0f409de8)
3. [RancherでDockerクラスタを構築する-③ RancherからVULTR APIでDockerホストを追加する](http://qiita.com/TongTheDopeness/items/e469ea72bcd2aaeb6af3)
4. [RancherでDockerクラスタを構築する-④ 【DockerHub編】Railsスタックを立ち上げる](http://qiita.com/TongTheDopeness/items/ca9538b2f16a756e68e5)

## Rancherのメリット

Rancherのメリットは、

* オープンソース
* `docker run`一発でRancherサーバを構築できる
* ホストをRancher管理下に置くことで、例えば「このホストにはこのコンテナを上げない」等の細かな設定がスケーリングできる
* 色々なクラウドプロバイダに対応している（Amazon EC2・Azure・DigitalOceanはもちろん、みんな大好き[vultr](https://www.vultr.com/)にも対応している)

それ以外にもいろいろありますが、一番の理由は__*Herokuに載せるよりも遥かに安く、Heroku並に簡単にデプロイ出来る*__ということでしょうか。

## そうは言っても、本番で本当に使ってるの？

私のクライアントはエンタープライズCRM（しかもオンプレ・スクラッチ）が多いのですが、それ以外の小規模案件または特に指定がなかったときはHerokuや格安のクラウドプロバイダを使います。

Heroku上で10個ほどのプロダクトが動いています（しかも全部一人でDevOps orz）が、コスト削減のため、少しずつDocker on Rancherに移行しています。

Docker on Rancherで動いているプロダクトは現時点で5つほどあります。どのプロダクトも、特に問題なく稼働しています。


## 前提条件

今回ご紹介するサンプルの前提条件は

* アプリは一般的な構成 ( Ruby on Rails / Postgresql )
* クラウドプロバイダは[vultr](https://www.vultr.com/)
* DockerホストのOSはCoreOS
* コンテナリポジトリは Amazon ECR[^1]
* Postgresのデータを定期的にS3にバックアップしたい！
* Postgresデータのリストアも簡単にしたい！
* github + CircleCIで自動デプロイ
* PaperTrailでロギング

という感じです。

[^1]: もちろん、DockerHubでもOK。どちらかというとDockerHubの方が普通に設定可能ですが、Amazon ECRは東京リージョンが使え、Rancher内で使うときにちょっとしたTipsがありますので、~~今回はAmazon ECRを使います~~ DockerHubとAmazon ECR両方ご紹介します。

## それでは、始めましょう

なにはともあれ、Rancherを立てるところからはじめます。

もっと良い方法がありましたら、ツッコミ大歓迎です。

## あわせて読みたい

Rancherの記事は以下の記事でまとめてあります。こちらもあわせてどうぞ。

[【Docker】RancherOSで本格的な自宅サーバーを構築しよう(1) ~ 要件と構成 ~](http://qiita.com/okamu_/items/da52b4dc12221feca55c)

Rancherについて、非常にまとまって書かれています。私も大いに参考にさせていただきました。
BigQueryで気象データを使ってみる

#祝★気象データが入りました！
BigQueryのPublic-dataに気象データが入るようになりました。
http://googlecloudplatform-japan.blogspot.jp/2016/10/ghcn-bigquery.html
これはアメリカのGHCNってやつらしいです。詳しくはブログを見てください。

**※2016/10/07現在**
2016/09/28までのデータが入ったというだけで、毎日更新されるわけではなさそうです。
こういうのって自動的にGoogle側で入れてくれると便利だよなぁと思ったり。
甘えるなって話しですかねぇ。(´・ω・`)

**※2016/10/11**
このデータですが、TMAX（最高気温）、TMIN（最低気温）がちょいちょい抜けていることがわかりました。

#じゃ、使ってみましょう。
##日本の観測ポイントを知る
観測ポイントは `[bigquery-public-data:ghcn_d.ghcnd_stations]` っていうテーブルに入っています。約10万の観測ポイントがあり、そこから自分が知りたいポイントを指定します。
それをさすがに目で探すのは大変です。ブログにはCloudDataLabで地図上にプロットして、そこから探せば？的なことを書いていますが、CloudDataLabを使うにはちょっとハードルがあるかと。
そこで、データを見てみたところ**緯度**と**経度**も入っており、コレを使ってみればよいのでは？と思いました。
![000087768.jpg](https://qiita-image-store.s3.amazonaws.com/0/49108/7197cf62-a1f2-3c9f-fcc2-55ad4c17c54a.jpeg)
国土地理院で公開されている[地図](http://www.gsi.go.jp/KOKUJYOHO/center.htm)を見たところ**緯度**30°-45°で**経度**130°-150°で北海道～九州まで、**緯度**25°-30°で**経度**125°-130°で沖縄をだいたいカバーできることがわかります。
じゃ、これをSQLにしてみましょう。

```sql:station.sql
SELECT
 *
FROM
(SELECT
  *
FROM
  [bigquery-public-data:ghcn_d.ghcnd_stations]
WHERE
 latitude between 30 and 45 and
 longitude between 130 and 150),
(SELECT
  *
FROM
  [bigquery-public-data:ghcn_d.ghcnd_stations]
WHERE
 latitude between 25 and 30 and
 longitude between 125 and 130)
ORDER BY
 2,3
```
結果はこんな感じになります。
![station_result.jpg](https://qiita-image-store.s3.amazonaws.com/0/49108/56b734c3-29e4-26dc-06be-31f8ec6ea1dd.jpeg)

ちなみにもっと絞りたい！って言う人は[都道府県別の緯度経度](http://www.gsi.go.jp/KOKUJYOHO/CENTER/zenken.htm)も記載があります。

**※あ、日本だけで抜き出すのであればこっちでも出来た**

```sql:station_ja.sql
SELECT
  *
FROM
  [bigquery-public-data:ghcn_d.ghcnd_stations]
WHERE
  left(id,2) = 'JA'
```
##気象データとJOINしてみる。
では、2016年の気象データが入っている`[bigquery-public-data:ghcn_d.ghcnd_2016]`から先ほど抽出した日本だけを抜き出してみましょう。
JOINするのは**id**というカラム同士で行います。**element**に情報の区分が入っており、代表的なものは**PRCP（降雨量）**、**SNOW（降雪量）**、**SNWD（積雪量）**、**TMAX（最高気温）**、**TMIN（最低気温）**だそうです。自分的には**TAVG（平均気温）**も使えると思います。
で、各**element**に対して**value**が入っています。

**※注：PRCPなのにSNWDがあったりします。うーん。。。**

今回は大雑把ではありますが、**PRCP**だけ見てみましょう。

```sql:prcp.sql
SELECT
  W.date date,
  S.name name,
  W.element element,
  W.value value
FROM
[bigquery-public-data:ghcn_d.ghcnd_2016] W
JOIN
[bigquery-public-data:ghcn_d.ghcnd_stations] S
ON
W.id = S.id
WHERE
  left(W.id,2) = 'JA' and
  W.element = 'PRCP'
order by
  date
```
そして、これを今回はViewに保存してみて[**DataStudio**](https://www.google.com/analytics/360-suite/data-studio/)で可視化してみます。
**Filter control（観測地点）**に**name**を設定し、**data range**をつけて折れ線グラフを作ってみました。
![data_studio.jpg](https://qiita-image-store.s3.amazonaws.com/0/49108/cf9ae957-88c7-fd5a-c57f-d20c5887ff12.jpeg)

せっかく**緯度**と**経度**があるので**map**にしてみようかと思いましたが、もう眠いので勘弁してください（笑）

取り急ぎ使ってみたという感じなので、改版したり、mapをがんばってみたりするかもです。
VSCode で今開いているフォルダより上の階層にあるフォルダを（無理矢理）サイドバーに登録する

Visual Studio Code ですが、現状 Sublime Text 3 のプロジェクト機能のように
**別々の箇所にある複数のフォルダをサイドバーでまとめて管理する**という機能がありません

そのため、作業フォルダとは全然別のところにあるライブラリフォルダに入っているようなコードなどを見るのにちょっと苦労します
`Ctrl+p` で見に行くことも出来ません（サイドバーに居ないので）

これはちょっと困った…ということで色々調べたのですが、機能そのものは見つからず…
`project-manager` なんて拡張もありますがコレはあくまで開くルートフォルダを選べるだけで複数のルートフォルダを同時に展開なんかはできません
（何か情報があったら教えてもらえると泣いて喜びます）

# 環境

Windows 10
Visual Studio Code 1.5.3

# 対処

シンボリックリンクを使えば良いという事に気づきました

Visual Studio Code はシンボリックリンクもちゃんと認識してくれるため、
今開いているフォルダの下にリンクを置いておくと、ファイルの実体がどこにあろうと `Ctrl+p` で飛べるようになります
（ちなみに、ファイルリストのパス表示もちゃんと実体のパスが出てきます）

シンボリックリンクの作り方については↓の辺りを参考に…
http://dev.classmethod.jp/etc/make_windows_symbolic_link/

また、↓を使うと非常に楽にリンク作成ができます
http://www.gigafree.net/system/explorer/hardlinkshellextension.html

エクスプローラで見るといらんものが映っているような感じになるのでちょっと気持ち悪いですが、
擬似的にルートフォルダを複数サイドバーに登録するということがこれで可能になります
なにか適当にフォルダ一個作ってその中にシンボリックリンクはまとめておくとか、
少し工夫してみるとそこまで気にならなくなりそうです

# 雑感

`.vscode` フォルダなんて大層な設定フォルダを作ったりするんですから、
プロジェクト機能あってもいいのに、とか思ってしまいます…
ciscoスイッチ・ルーターの基本設定のメモ

ciscoルーターとスイッチについて3ヶ月ほど勉強したところで一度これまで行ってきたciscoデバイスの基本設定をメモします。

##CLIのモードについて
ciscoデバイスを設定する際に、現在CLI(コマンドラインインターフェース)においてどのモードにいるかが重要となります。モードを簡単に分類すると、

・ユーザーモード
Router>
・特権モード
Router#
・グローバルコンフィグレーションモード
Router(config)#
・ライン
Router(config-line)#
・インターフェース
Router(config-if)#

ここでのRouter>などは、実際のコンソール画面の入力待ち画面に出るので、これを基準にどのモードなのかを考えながら作業します。

##基本設定
###ホストネームの変更
`Router(config)# hostname R1`
`R1(config)#`
###DNSlookupの防止
`(config)# no ip domain lookup `
このコマンドを使用して、名前解決の機能を停止させることにより、コマンドのタイプミスをしてしまっても、すぐに入力し直すことができ、無駄な時間を減らすことができます。

###デバッグメッセージ出力後のコマンドの再表示
`(config)# line console 0`
`(config-line)# logging synchronous`
このコマンドにより、コマンドを打っている途中でデバッグメッセージが出力されても、気にしないでコマンドを打つことができます。

###バナーの表示
`(config)# banner motd#`
`Hello!!`
`#`
```
このように#でくくった箇所がバナーとして出力されるようになります。

###設定をNVRAMに保存
`# copy running-config startup-config`
このコマンドにより、現在のルーターの設定をNVRAMに保存し電源を落としても次回以降同じ設定で使えるようにする。

##パスワードの設定
###特権モードのパスワードを設定
`Router(config)# enable secret [password]`
#コンフィグレーションモードのパスワードの設定
`Router(config)# line console 0`
`Router(config-line)# password [password]`
`Router(config-line)# login`

###パスワードの暗号化
`Router(config)# service password-encryption`
この設定で、show run などをした時パスワードがそのまま見えてしまうのを防ぐため。

##アドレスの設定
###IPv4
`Router(config)# interface Fast-Ethernet 0/0`
`Router(config-if)# ip address 192.168.1.1 255.255.255.0`
`Router(config-if)# no shutdown`

0/0はルーターの物理ポートでもう一つは0/1
スイッチでVLANの設定をしたければ、`vlan1`をここに入れる。
`no shutdown`を忘れずに。

###IPv6
`Router(config)# ipv6 unicast-routing`
`Router(config)# interface Fast-Ethernet 0/0`
`Router(config-if)# ipv6 enable`
`Router(config-if)#  ipv6 address 2001:DB8:1::1/64 `
`Router(config-if)# no shutdown`

上記ではipアドレスは手動で割り振ったが、自動で割り振る場合は
`Router(config-if)# ipv6 address 2001:DB8:1::/64 eui-64`

リンクローカルアドレスを設定する場合は
`Router(config-if)# ipv6 address FE80::1 link-local`

###デフォルトゲートウェイ
`(config)# ip default-gateway 172.16.15.4`

###DNSの設定
`(config)# ip name-server 192.168.1.100`

##セキュリティーの強化
###最低文字数
`(config)# security password min-length 10`
パスワード設定が最低10文字となります。

###ブロック
`(config)# login block-for 120 attempt 3 within 60`
この例だと、60秒間で3回入力ミスすると、120秒間ブロックするという設定。

###実行タイムアウト
`(config)# iine vty 0 15`
`(config-line)# exec-timeout`


##設定ファイルのTFTPバックアップ
`# copy startup-config tftp`
ルーター -> サーバー　(バックアップ)

`# copy tftp startup-config`
サーバー -> ルーター (リストア)

##SSH,Telnet接続
`(config)# hostname R1`
`(config)# ip domain-name [ドメイン名]`
`(config)# crypot key generate rsa`
`・・・・・・[512]:1024`
`(config)# username [ユーザー名] password [パスワード]`
`(config)# line vty 0 15`
`(config-line)# login local`
`(config-line)# transport input ssh telnet`

rsaを生成するためにはホスト名とドメイン名をつけなければいけないらしい。
最後のい1行はsshだけやtelnetだけでもいい。

##CDPコマンド
`# show cdp neighbors`
近くのデバイスをL2から探索することができる。
【PHP】Pleiades（XAMPP/Eclipse）環境でComposer使う

##Composer使う（今更）

今は何が主流なのか知らないですが
ずっと敬遠していたComposerを使うことにしました。
どこのブログを探してもPHPフレームワークのインストールにはComposer。
流行りのフレームワークを使おうとしたら避けては通れない。



##環境は汚したくない

開発はWindows7でやってます。
PleiadesでXAMPPとEclipseを準備。
Composerインストールしようとしたら環境変数をいじらないといけないんだと。
環境いじりたくないからXAMPP使ってるのに・・・。





##必要なもの

こんな感じでバッチを用意します。

```
xampp\htdocs\php.bat
xampp\php\composer.bat
xampp\htdocs\composer.bat
```


composer.pharはここ

```
xampp\php\composer.phar
```

バッチの中身

```bat:xampp\php\composer.bat
@ECHO OFF
php "%~dp0composer.phar" %*
```
```bat:xampp\htdocs\composer.bat
@echo off
SET PHP_HOME=C:{XAMPPのおいてあるフォルダ}\xampp\php\
SET PATH=PHP_HOME
SET CURRENT_DIR=%~dp0
PATH=%PHP_HOME%
php "%PHP_HOME%composer.phar" %*
```

```bat:xampp\htdocs\php.bat
@echo off
SET PHP_HOME=C:{XAMPPのおいてあるフォルダ}\xampp\php\
SET CURRENT_DIR=%~dp0
SET PATH=%PHP_HOME%

%PHP_HOME%php %*
```

##実行

htdocsに移動して、
ウインドウの余白をShift+右クリック。
コマンドウインドウをここで開く（ｗ）　をクリック。
コマンドプロンプトが立ち上がるので、以下をタイプしてEnter。
（Slimのスケルトンプロジェクト生成用のコマンドです。composerだけでも確認はとれる。）

```bat:コマンドプロンプト
> composer create-project slim/slim-skeleton slim_san

```

####ちなみに
phpコマンドも微妙に打てます。
全部同じというわけにはいかないが。
```php artisan```とかもいける。
React VRでWebにもVRを

Oculus Connect 3でOculusは今後ネイティブアプリだけでなくWebの世界のVRもサポートすることを発表しました。
![IMG_20161006_103442.jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/2861dfc9-cf02-1093-f71a-25a650a1f3aa.jpeg)
WebでもVRができるようになることの利点は以下のようなものがあります。

* 開発と、開発した作品の共有がシンプルであること
* 見てくれる人がたくさんいること

Web VRを使ったWebページを制作するために、React VRフレームワークを開発中です。
![IMG_20161006_103630.jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/e16480d8-bd20-e929-2050-44d9546b12cd.jpeg)

とはいえ、現段階ではWeb VRのWebページを作ってもRiftやGear VRでは表示できません。そこで、Web VRのWebページを表示するためのブラウザCarmelを開発しています。
![IMG_20161006_103713 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/068d1a90-81f3-268f-7814-1dbf3d085277.jpeg)

React VRのコードはこんな感じになります。
![IMG_20161006_154440.jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/2a58b03b-3bea-27f4-b893-c6871693bbd0.jpeg)

React VRはFacebookの開発しているReactフレームワークを元につくられています。
React VRは二つのコンポーネントからなっており、ボタンやテキスト表示を提供するTHREE.jsベースのUIライブラリと、それをReactのシステムに組み込むReact VRライブラリから構成されます。
![IMG_20161006_154028.jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/3344543a-71ae-df72-efdb-b239efa3496d.jpeg)

詳細は [ocul.us/webvr](http://ocul.us/webvr) で要チェックや！
![IMG_20161006_160300.jpg](https://qiita-image-store.s3.amazonaws.com/0/56668/75fa97fe-537f-c860-17a0-5437d830915d.jpeg)
【デザインパターン】ダブルトンパターンの実装

##参考例

ダブルトンパターンの参考例です。
C#で書いています。


```csharp

public class Doubleton {

    private static Doubleton oneInstance;

    private static Doubleton twoInstance;

    private Doubleton () {


    }

    public static Doubleton OneInstance {

        get {

            if( oneInstance == null ) OneInstance = new Doubleleton();

            return OneInstance;
        }
    }

    public static Doubleton TwoInstance {

        get {

             if( doubleInstance == null ) DoubleInstane = new Douleton(); 

             return DoubleInstance;

        }
    }

    public int x;
}
```

##使い方

```csharp

Doubleton.OneInstance.x;

DOubleton.TwoInstance.x;
```

このように各インスタンスにアクセスして使います。


##説明
クラスのインスタンスを**必ず２つ**に保証したい場合に利用できます。
また、インスタンス数を増やすとスリートン、フォートンなどのNトンパターンが実装可能です。
ダブルトンはNトンパターンの1つです。
perl使いのpythonメモ - 辞書型（大文字小文字無効）


- pythonのjoinであれ？とおもったことをメモしときます。

## perlでいうとこのhashです。

- hashのキーが大文字でも小文字でもいいってのがあるそうです。便利ですね。
- 素のpythonじゃなくてモジュールなんですけどね。CaseInsensitiveDictという名前だそうです。
- 事前に```pip install requests```でモジュールをインストールしておいてください。

```python
>>> from requests.structures import CaseInsensitiveDict
>>> cid = CaseInsensitiveDict({'Apple': 'osx', 'NeXT': 'STEP'})
>>> cid
{'Apple': 'osx', 'NeXT': 'STEP'}
>>> cid['apple']
'osx'
>>> cid['APPLE']
'osx'
>>> cid['next']
'STEP'
>>> cid['nEXT']
'STEP'
```

- うむ便利！

## キーがないとエラー

- perlだとhashにないと””が戻ってきますがpythonだとエラーが出ちゃうんですね。（めんどい...）

```python
>>> cid['microsoft']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "〜〜/python3.5/site-packages/requests/structures.py", line 54, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'microsoft'
```

- 怒られました...

## キーの存在確認

- キーの存在確認をするには、in演算子とhas_keyメソッドが使えるようですが...
- CaseInsensitiveDictだと制約があるようです。
- has_keyは用意されてませんでした。

```python:has_key
>>> cid.has_key('microsoft')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'CaseInsensitiveDict' object has no attribute 'has_key'
```

- inなら平気です。

```python:in
>>> 'microsoft' in cid
False
>>> 'apple' in cid
True
>>> 'Apple' in cid
True
```

## perlなら...

- Hash::Case::Preserveというモジュールを使います。
- こちらはキーがないときの挙動も素のhashと変わらないようですね。

```perl:cid.pl
use Hash::Case::Preserve;
tie my(%cid),'Hash::Case::Preserve';
$cid{'NeXT'} = 'STEP';
$cid{'Apple'} = 'osx';
print $cid{'next'};
print $cid{'APPLE'};
print $cid{'microsoft'};
print keys %cid
```

```shell
sh-3.2$ perl -l cid.pl 
STEP
osx

AppleNeXT
```
Xcode8で開いて保存してしまったStoryboard(xib)ファイルをXcode7で開けるようにする方法

## はじめに
Xcode 8 の beta 版が出たとき，
画面の比率を変えたまま編集できたりと
Storyboard の使い勝手が上がって嬉しかった。

そのままコミットしたりしてたけど
Xcode 7 で開こうとしたら下記のワーニングが出て
編集できなくなって Xcode 8 を使うのためらった。
(Swift 3 に躊躇ってたのが正しい。)

> The document “hogehoge.storyboard” requires Xcode 8.0 or later.

![warningXcode8.png](https://qiita-image-store.s3.amazonaws.com/0/88266/52503363-2f5d-4414-4ae2-9478d0b360a4.png "warningXcode8.png")


この件について調査する機会があったので対処について備忘録を兼ねて書きます。

## Xcode 8 -> Xcode 7

Xcode 7 で開きたい場合は，
Xcode 8 で Storyboard ファイルを開き，
ユーティリティエリア(右側) の **Show the File Inspector** の
**Interface Builder Document** の
**Open in Latest Xcode (8.0)** を **Xcode 7.x** に変更する。

![ChangeSettings.png](https://qiita-image-store.s3.amazonaws.com/0/88266/247db769-6ab4-6214-21b5-eb813ce1698c.png "ChangeSettings.png")

選択すると保存するか聞かれるので，
保存して閉じる。
**<u>また開こうとしたらダメ。設定が元に戻る。</u>**

![closeSettings.png](https://qiita-image-store.s3.amazonaws.com/0/88266/8a6b1959-e37c-7480-c10a-8c8bb6bffda8.png "closeSettings.png")


これで Xcode 7 系で開けるようになったはず。
Git で管理している場合は，コミットしてプッシュ。
みんなにはプルしてもらう。

Xcode 8 変更を保存してしまった全ての Storyboard，xib ファイルで
この作業を行う必要がある。メンバーが画面を実装してないタイミングで
サクッとやってしまうのが良い。


## 運用について

運用上，Xcode 7 系と Xcode 8 系をどちらも使う場合は，
Storyboard を実装する際にどちらの Xcode で実装するか
できるだけ決めておいたほうがいい。
ベテランばかりならいいけど，大概はそうではない。
何かやらかしてからだと面倒なので。

コードは Swift の場合は気にしなきゃだけど
Objective-C に関してはどっちで実装してもそこまで気にする必要はないかな。
推測とか Xcode 8 の方が使いやすいかもですね。

Xcode の移行のタイミングは言うまでもなく
みんな同時に，しかるべきタイミングで。

## おわりに
今回は Xcode 8 で開いてしまって Xcode 7 で開けなくなった場合の
対処法について書いた。もっと早く調べればよかったと後悔。
もっと適切な変更の仕方があるかもしれない。共存もできると嬉しいのだが。
良い Xcode ライフを。

ここまでご覧いただきありがとうございました。
python numpy アレイを作る

# numpyのアレイを作ってみる

## １次元のアレイ

``` python
>>> import numpy as np
>>> my_array1 = np.array([1,2,3,4])
>>> my_array1
array([1, 2, 3, 4])
```

## １次元のアレイ-リストからの変換（↑と同じ）

``` python
>>> my_list1 = [1,2,3,4]
>>> my_array1 = np.array(my_list1)
>>> my_array1
array([1, 2, 3, 4])
```

## 2次元のアレイ

``` python
>>> my_lists = [my_list1,[11,22,33,44]]
>>> my_array2 = np.array(my_lists)
>>> my_array2
array([[ 1,  2,  3,  4],
       [11, 22, 33, 44]])
```

## アレイのサイズを調べる

``` python
>>> my_array2.shape
(2, 4)
```

## アレイのデータ型を調べる

``` python
>>> my_array2.dtype
dtype('int64')
```

## いろいろなアレイを作る（ゼロ、ワン、empty、単位行列、arange)

``` python
>>> np.zeros(5)
array([ 0.,  0.,  0.,  0.,  0.])

>>> np.ones((5,5))
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

>>> np.empty(5)
array([  0.00000000e+000,   7.84296818e-315,   4.94065646e-324,
                     nan,   1.02378882e-311])

>>> np.eye(5)
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])

>>> np.arange(5)
array([0, 1, 2, 3, 4])
```
SwaggerでAPI仕様を書いてBluemix上のNode.jsで公開

# 概要
SwaggerでAPIの仕様書を書いてIBM Bluemix上のNode.jsで公開するまでの手順です。

# 環境
- MacOS EI Captain
- [Node.js](http://nodejs.org/) v4.5.0
- [Swagger Editor](http://swagger.io/swagger-editor/) v2.10.3
- cf version 6.12.4
- bluemix version 0.4.2

# Swagger Editor
### インストール
```shell:install.sh
git clone https://github.com/swagger-api/swagger-editor.git
cd swagger-editor
npm install
npm start
```
### 注意点
- Swagger Editorで書くと遅い、間違ったら固まる  
対策： エディタで書く → Swagger Editorにペーストして確認
- HTML出力はバグがあるようでモデルの一部が出力されない?

# IBM BluemixのNode.jsで公開
- Swagger EditorからNode.jsに出力
- package.jsonの修正  
  - 必要に応じ、Licenseを修正
  - "cfenv": "*"を追加  

```json:package.json
{
  "name": "APIの名前",
  "version": "1.0.0",
  "description": "説明",
  "main": "index.js",
  "scripts": {
	"prestart": "npm install",
	"start": "node index.js"
  },
  "keywords": [
    "swagger"
  ],
  "license": "All Rights Reserved",
  "private": true,
  "dependencies": {
    "connect": "^3.2.0",
    "js-yaml": "^3.3.0",
    "swagger-tools": "0.10.1",
    "cfenv": "*"
  }
}
```

- index.jsを修正

```js:index.js
var cfenv = require( 'cfenv' );
var appEnv = cfenv.getAppEnv();
var serverPort = appEnv.port;
```

# IBM Bluemixへ公開
```shell:bluemix.sh
bluemix api https://api.ng.bluemix.net
bluemix login -u email_address -o your_use_name _org -s dev
cf push "your_application_name"
```
[Mac] スタバでwifiが接続しなくなったときに自動的にwifiを再起動するshellscript

Qiita初投稿です．
突然ですが，Macをスタバでドヤリングしているときに，突然Wifiが使えなくなることありませんか？
Wifiのアイコンは接続されていると言っているのに，ネットに繋がらない😢

一時的な解決方法は，WifiをOFF/ONしてもう一回つなぎ直すわけですが，これを自動化するスクリプトを書きました．

```shellscript:starbacks_wifi.sh
#! /bin/sh
while [ $? == 0 ]
do
  ping -c 1 8.8.8.8
  while [ $? == 0 ]
  do
    sleep 1s
    ping -c 1 8.8.8.8
  done
  networksetup -setairportpower en0 off
  networksetup -setairportpower en0 on
  sleep 20s
done
```

at_STARBACKS_Wi2 以外でも使えるとは思いますが，ICMPカットしているような領域で実行すると永遠にWifiをOn/offし続けるので，注意してくださいｗ
gitの不要なブランチを消すコマンド

## 不要になったブランチは削除しましょう

多くのメンバーや他の会社と共同で開発作業を行う場合、どうしても同時並行で作業するためのブランチは増えます。
しかし、本当にアクティブなブランチ数は人数分＋αはずなのに、ブランチを消す作業をしておかないとどんどん残っていきますよね。
ブランチが増えすぎると同時進行中のタスクの見通しが悪くなり、Githubなどでブランチを切り替えたりする際にも非常に使いづらくなってしまいます。
ローカルブランチ・リモートブランチ共に、不要になったブランチは削除してこまめにメンテナンスしておきましょう。

## 今回紹介するコマンド

```
$ git branch --merged                    # マージ済みブランチの一覧
$ git branch -d                          # マージ済みブランチの削除
$ git branch -D                          # 強制的なブランチの削除
```

```
$ git fetch -p                           # リモートブランチの最新状態を取得（リモートブランチの削除も同期）
$ git for-each-ref refs/remotes --merged # マージ済みリモートブランチの一覧
$ git push --delete                      # リモートブランチの削除
```

## ローカルブランチの削除

gitでは一つのブランチを基準としてマージ済みになっているブランチの一覧を出力できます。

```
$ git branch --merged [branchname]
```

`[branchname]` は基準となるブランチです。
`[branchname]` を省略した場合は現在チェックアウトしているブランチになります。

逆に、マージされていないブランチ一覧は `git branch --no-merged` で確認できます。

### マージ済みローカルブランチの削除

さて、マージされているブランチなら削除可能でしょう。 `-d` を付けてさっさと削除しちゃいましょう。

```
$ git branch -d [branchname]
```

削除せずにまだ開発するかもしれないから残す？
いやいや、そんなことをするくらいなら一度消して同じ名前のブランチを最新の状態から作り直しましょう。
古いブランチを残しっぱなしにしてると、結果として最新版に追いつくためにマージやコンフリクト解消がコストになります。
**用途が完了したブランチは潔く消すべし！**

### マージ未完了のローカルブランチの削除

マージが完了していないブランチは `-d` では消せません。実行してみると次のようなエラーメッセージが出力されます。

```
error: The branch 'branchname' is not fully merged.
If you are sure you want to delete it, run 'git branch -D branchname'.
```

「ブランチは完全にマージされていません。もしどうしても削除したい場合は `git branch -D branchname` を実行して下さい。」
基本的にはマージ未完了のブランチを削除すべきではないので `-d` を使いましょう。
ローカルで実験するために作ったブランチや実装不要になった場合などの「マージする予定のない」ブランチに関しては、 `-D` を使って強制的に削除することもあります。

## リモートブランチの削除

ローカルブランチをいくら削除してもGithubなどにPushしたリモートブランチは消えません。
ちゃんと整理して消すために、まずはリモートブランチのマージ状態を確認しましょう。
以下のようにコマンドを実行すると `branchname` にマージが完了しているリモートブランチ一覧と最終コミット日、最終コミット作成者の名前をCSV形式で取得できます。

```
$ git checkout branchname
$ git fetch -p
$ git pull origin branchname
$ git for-each-ref --sort=committerdate --format='"%(committerdate:short)","%(authorname)","%(refname:short)"' refs/remotes --merged
```

- `git fetch -p` : リモートブランチの最新状況を取得します。 `-p` を付けない場合はリモートブランチの削除を同期しません。
- `git for-each-ref refs/remotes`: リモートブランチ一覧を出力
    - `--merged` : マージ済みブランチのみ出力
    - `--sort=committerdate` : ブランチの最終コミット日でソート
    - `--format='"%(committerdate:short)","%(authorname)","%(refname:short)"'` : コミット日、コミット作成者、ブランチ名を出力

CSV以外の方法で取得したい場合や、その他の情報をリストに出したい場合は `git for-each-ref` のリファレンスを参照しましょう。
https://git-scm.com/docs/git-for-each-ref

### リモートブランチの削除コマンド

リモートブランチを削除する場合は以下のようにします。

```
$ git push --delete origin branchname
```

リモートブランチは共同作業者に配慮して消しましょう。
特にGithubなどではPull Requestがマージされたタイミングで削除することもできるので活用しましょう。
CloudWatch Plugin for collectd でApacheのステータスを可視化する


cloudpack大阪の佐々木です。

待望のCloudWatch Plugin for collectdがリリースされたので、ApacheのステータスをCloudWatchに表示させてみました。

# セットアップ
このへん見てください。
https://aws.amazon.com/jp/blogs/aws/new-cloudwatch-plugin-for-collectd/

# Apacheプラグインのインストール

```bash:
$ sudo yum install collectd-apache
```

# collectdの設定
```bash:/etc/collectd.conf
LoadPlugin apache

<Plugin apache>
  <Instance "local">
    URL "http://localhost/status?auto"
  </Instance>
</Plugin>
```

```bash:/opt/collectd-plugins/cloudwatch/config/whitelist.conf
apache-.*
```

再起動

```bash:
$ service collectd restart
```

# Apacheの設定
mod_statusが見えるようにする

```/etc/httpd/conf/httpd.conf
LoadModule status_module modules/mod_status.so

ExtendedStatus On

<Location /status>
  SetHandler server-status
</Location>
```

再起動

```bash:
$ service httpd restart
```

---
できた！

![Kobito.lv70bH.png](https://qiita-image-store.s3.amazonaws.com/0/3246/c08dfd63-7012-c4a0-20d7-851f3cad027f.png "Kobito.lv70bH.png")

---
これはいじりがいがある！
Chocolatey CheatSheet

# CheatSheet for Chocolatey v0.10.11
毎回検索するはめになるので、頻出コマンドのメモです。

## Commands
### Chocolatey 本体関連
chocolatey のアップデート 
`choco upgrade chocolatey`
バージョン確認
`choco version`

### パッケージ関連
インストール済パッケージ一覧
`choco list -l`
検索
`choco search pkgname`
インストール
`choco install pkgname`
アンインストール
`choco uninstall pkgname`
アップグレード
`choco upgrade pkgname`


## リンク
[CommandsReference](https://github.com/chocolatey/choco/wiki/CommandsReference)
routes.rb内だけで不正なURLを正しいURLに直してリダイレクトさせる


例えば```https://hogehoge.com/animal/10/```みたいなURLがあったときに、```https://hogehoge.com/animal/00010/```みたいなidの先頭に0が混じったURL（不正なURL）でもアクセスできてしまっててGoogleの検索エンジンに登録されてしまってGoogle Search Console上で重複コンテンツ扱いになってしまったというケースがあったとします。

この不正なURLを正しいURLにリダイレクトさせて解決しようとしたときに、コントローラーでパラメータチェックして不正（00010）だったら正しいURLにredirect_toみたいな処理を想像していたけど、routes.rb内だけで完結できるか探してみたらありました。

```routes.rb
get 'animals/:animal_id' => 'animal#detail', as: 'animal_detail', animal_id: /[1-9][0-9]*/
get 'animals/:animal_id' => redirect { |params| "animals/#{params[:animal_id].to_i}" }, status: 301
```

参考：[初心者じゃなくても役に立つかもしれないRailsのroutingの記述方をまとめてみた](http://shiro-16.hatenablog.com/entry/2015/03/19/001656)
調べてもこのparamsを使った書き方に中々辿り着かなかくて諦めかけていたので参考になりました！
簡易うるう年判定は、4で割り切れるかで判定すれば良いのでは (2016年〜2099年まで対応)

100とか400で計算するの考えるのがだるかった
なお2100年はうるう年ではない。

## 簡易うるう年判定

* 4で割り切れるかで判定すれば良い (2016年〜2099年まで対応)

```php
$last_day = 28;
if (($year % 4) == 0) {
    $last_day = 29;
}
```

## (追記)phpに判定があった

* http://php.net/manual/ja/function.date.php

| L  | 閏年であるかどうか。  | 1なら閏年。0なら閏年ではない。 |
|:--|:--|:--|

```php
<?php
if(date('L')) {
    echo "うるう年";
} else {
    echo "うるう年ではない";
}
```
對 app 資訊架構設計的想法

從大學幫學校做網站以來
就開始會留意頁面上資訊的排列方式

像是什麼資訊對使用者是重要的、該怎麼排版、放置位置等等
個個都會代表資訊的重要性和性質等等

這方面的設計方法轉換到小螢幕上，
可以說是手機版網頁或是 app ，甚至是智慧型手錶的使用者介面
我覺得顯得更加重要

這時候螢幕相對有限制的情形之下
Menu 該放什麼東西、什麼功能的東西應該有條理的群組起來等等，
在在都在考驗規劃的人的能力

如何做最適合的資訊架構，
同時最容易幫助使用者能夠取得營運方想要提供的服務核心價值
以及提供容易閱讀理解及操作的產品等等，
都是非常重要的
[Blender] [自分用メモ] パス追従コンストレインが働く期間を設定する

#内容
パス追従コンストレインでオブジェクトをアニメーションさせるときに
追従させる期間を限定させる方法。

#環境
blender 2.77a
windows10

#手順

追従させるパスオブジェクトを選択したときにプロパティエディタビューに
「パスアニメーション」の項目がある。
このフレームに設定した値がパス追従コンストレインでの期間となった。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/49a39218-257b-25de-0632-df1b5d45ccf5.png)

パス追従コンストレインを追加したボーンで先ほどのパスオブジェクトをターゲットに設定して
オフセットを設定する。
このオフセットの値がパスアニメが開始するフレーム数になった。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/99f9bda5-2850-42f1-af63-2f37d7966f5e.png)

オフセットと期間を設定すれば、任意の時間にアニメーションをつけることができた。

ちなみに-Yを前としてモデリングしてて(blederのデフォルト)
パス追従コンストレイン設定のデフォルトがYが前なので
そのまま適用するとアニメーションがZ軸180度回転して元にもどらなくなったよ、、、(T^T)

もっといい方法あるかもね！
PowerShellでプロセスごとのCPU使用率を取得する


##プロセスごとのCPU使用率の取得って簡単とおもいきや…
意外にはまったのでメモ。
結論はGet-Counterがいちばん正確。
##コード
```ps1
################
#プロセスIDを取得
################
#プロセスのコマンドラインからとるならこっち
$procId = Get-WmiObject win32_process | ? {$_.commandline -like "*[コマンドラインに含まれる文字列]*"} | select Handle
#プロセスの名称からとるならこっち
$procId = Get-WmiObject win32_process | ? {$_.Caption -like "*[名称に含まれる文字列]*"} | select Handle
################
#プロセスIDからプロセス名を取得
################
$procName=(Get-Process -Id ${procId}.Handle).Name
################
#Get-CounterでCPU使用率取得
################
$perCpu = ((Get-Counter "\Process(${procName})\% Processor Time").CounterSamples).CookedValue
################
#マルチコアCPUの場合は、CPU使用率を論理コア数で割る。
#$env:NUMBER_OF_PROCESSORSはマシンの論理コア数を取得できる。
################
$perCpu = $perCpu / ($env:NUMBER_OF_PROCESSORS)
```

#Win32_PerfFormattedData_PerfProc_Processの悪い点
PercentProcessorTimeでもCPU使用率は取得できるが、マルチコア環境だと難しそう。
PercentProcessorTimeが100%に張り付いている状態でもタスクマネージャーは25%で推移する。(4コア環境)

じゃあ、値をコア数で割ればいいかと考えるが、PercentProcessorTimeは100%以上まで上がらない。
このあたりの挙動をみると、シングルコアの値しか取ってきていないっぽい。

ならば、各CPUの負荷を取って合算しようかとも思ったけど、取り方が見つからない。
ここでお手上げで、複数CPUに負荷が散るような処理では正確なCPU使用率が取れないという結論に達した。
なんか方法はありそうだけど、力及ばず。

##参考にしたページ
ありがとうございます。助かりました。
http://tech.guitarrapc.com/entry/2013/01/08/030100
[Blender] [自分用メモ] アニメーションでオブジェクトをn回転させるときのグラフエディター

#内容
オブジェクトを何回転もさせたいときのグラフエディターの設定方法。
(クォータニオンを使えばいいのかもしれないけど、ここではオイラー角)

#環境
blender 2.77a
windows10


#手順
Z軸で回転するオブジェクトの設定方法は以下のとおり。

3Dビューでオブジェクトの角度設定を「XYZオイラー角」に変更
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/71eb1782-4e69-cadc-c62d-7342f40368eb.png)

ドープシートで回転軸のキーを打っておく。
さらに1フレーム直前にもキーを打っておく。
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/8f825c4f-9284-36a8-a6db-291cea4fad25.png)

グラフエディタービューを開いて、プロパティを表示する。
1フレーム直前にうったキーのフレーム値をコピペで入力する。
(なぜか左右の増減では入力できなかった)
![image](https://qiita-image-store.s3.amazonaws.com/0/36154/b2e2b595-2b4d-5487-eaa1-6995e6f70627.png)

また、なんらかの条件では入力が正しく反映されずにキーが消えてしまうことがあった。
これについては原因不明。

また、なにかあったら更新予定。
【開発者向け】iOS10で追加された新機能一覧


最近ようやく、僕が開発している[Annyアプリ](https://itunes.apple.com/us/app/dan-sheng-riya-ji-nian-rinogifutowo/id1056989588?l=ja&ls=1&mt=8)もSwift2.3、Xcode8で開発をし始めたので、日本語で全体をまとめたものもあまり無かったし、iOS10での新機能について振り返りがてらまとめてみました。
みなさんのアプリの新機能が思いつく起点とかになってくれたら嬉しいです！

## App Search Enhancements
Core Spotlight frameworkに機能追加がありました。
Core Spotlightでの検索クエリをアプリに引き継いだり、アプリ内でも、インデックス済みのデータを検索できるようになったみたいです。

![spotlight.png](https://qiita-image-store.s3.amazonaws.com/0/54826/59392f48-7555-62f8-a507-1533a8279c3c.png "spotlight.png")


[参考記事](https://www.captechconsulting.com/blogs/core-spotlight-enhancements-in-ios-10)

## User Notifications
- ローカル通知の配信タイミングを位置情報や時間などからスケジューリングできるようになった
- ローカル通知やPUSH通知をユーザが受け取った後でも内容を変更できるようになった
- ローカル通知やPUSH通知の見た目をよりリッチにする事ができるようになった
[コチラの記事が参考になりました](http://qiita.com/mishimay/items/9451b85982e2288ee4aa)

## Speech Recognition
iOS10から、音声認識の新しいAPIが`Speech Framework`として追加されました。音声を認識し、文字に直してくれます。
対応言語は58言語もあるようです。リアルタイム音声にも、録音済み音声にも対応しています。
[【iOS 10】Speechフレームワークで音声認識 - 対応言語リスト付き](http://d.hatena.ne.jp/shu223/20160615/1466036672)

## CallKit
`CallKit framework`というフレームワークが新たに追加されて、VoIPアプリに対して
- iPhoneの電話UIの提供
- ロック画面での着信画面の表示
- 連絡先の管理

ができるようになりました。よりiPhoneの電話アプリと近い体験を提供できます。

![callkit.png](https://qiita-image-store.s3.amazonaws.com/0/54826/306834d2-a662-7192-1991-e3466edab0b9.png "callkit.png")


## Haptic Feedback

iPhone7とiPhone7Plusでは、ピッカー選択の時などに振動で伝える機能が備わっているのですが、そのような新たな物理的フィードバックを実装することができます。
`UIFeedbackGenerator`クラスと3つのそのサブクラスで実現します。

### UIImpactFeedbackGenerator
２つの物体が衝突した時などに、それを補完するようなしっかりした振動を与える。

### UINotificationFeedbackGenerator
何かの行動をした時に、それが完了したのか、失敗したのか、なんらかの警告が出たのかを示すような振動を与える

### UISelectionFeedbackGenerator
選択が変化している事を感じさせる振動を与える。ピッカーをスクロールしている間など

## SiriKit
サードパーティのアプリが、Siriに機能提供をできるようになりました。
例えば、「”アプリ名”から”だれだれさん”に”ありがとう”とメッセージを送って」とSiriに言うと、そのアプリからメッセージが送れるみたいなイメージです。
現在以下の機能がSiriを使って提供できます。
- 音声通話の開始
- ビデオ通話の開始
- 通話履歴の検索
- メッセージの送信
- メッセージの検索
- 写真の検索
- スライドショーの再生
- 他のユーザへの支払い
- 他のユーザへの支払い要求
- ワークアウトの開始
- ワークアウトの一時停止
- ワークアウト再開
- ワークアウト終了
- キャンセル
- 乗車予約
- 乗車の予約状況
- 車での音楽操作
- 車の設定変更
- 車の環境変更（温度など）
- レストラン予約情報の取得

[詳しくはコチラ](https://developer.apple.com/library/prerelease/content/documentation/Intents/Conceptual/SiriIntegrationGuide/SiriDomains.html#//apple_ref/doc/uid/TP40016875-CH9-SW2)

Intents Extensionというものが追加されているので、Extensionとして作成すれば良いです。

## Proactive Suggestions
![mapitem.png](https://qiita-image-store.s3.amazonaws.com/0/54826/caf995cb-cc77-3c7b-df9b-8aecb9c7bda2.png "mapitem.png")

NSUserActivityにアプリの情報を渡してあげることで、Mapアプリでのサジェスションに出たり、iMessageでの入力補完に登場してくれる。

## Integrating with the Messages App
Extensionを開発することによって、Messageアプリと連携できる。
「ステッカーパック」と、「Messageアプリで使えるカスタムインターフェイス」を作ることができる。
[リファレンス](https://developer.apple.com/reference/messages)
DockerでSwiftが動くUbuntu環境を立ち上げる

# 概要

LinuxでSwiftを試したいときにDockerを使うと簡単に環境が作れるのでメモしておく。

# 必要な環境

- Dockerが動く環境
CentOSであれば７系以上が必要です。

- Dockerがインストールされてる
当たり前ですがdockerをインストールしておきましょう。[この辺](https://docs.docker.com/engine/installation/)をみればよいかと。

# イメージのダウンロード

[swiftdocker/docker-swift](https://github.com/swiftdocker/docker-swift)

すでにDockerfileを作ってくれてる人がいるので、それを利用します。
このイメージのディストリビューションは、Ubuntu14.04になっています。

```shell-session
% docker pull swiftdocker/swift
```

ネット環境によりますが、5分もあればダウンロードしてこられます。

# 起動

ダウンロードができたら、次にダウンロードしたイメージを使ってコンテナを起動をします。

```shell-session
% docker run --privileged -i -t --name swiftfun swiftdocker/swift:latest /bin/bash
```

`--name`の`swiftfun`はてきとうに変えてもらってOKです。
起動後はシェルプロンプトが返ってくるので、`Ctrl+p Ctrl+q`で抜けます。

>ちなみに、この`Ctrl+p Ctrl+q`は[「docker-1.10.0からデタッチキーが変更できるようになった」](http://qiita.com/hironobu_s/items/358b0ba5a7089521b60e)ここにあるように、事前に変えておくと幸せになれます。

# CoreFoundationを読み込めるようにしておく

上記のイメージを使うと、CoreFoundationのパーミッションがrootしかreadableになってないので、以下のようにパーミッションを変えておいた方がいいです。

ログインしたコンテナの中で以下のようにパーミッションを変えておきましょう。

```shell-session
# chmod 644 /usr/lib/swift/CoreFoundation/*
```

# Swiftを起動する

普通にパスが通ってるので、コマンドを実行すればOK。

```shell-session
# swift --version
Swift version 3.0 (swift-3.0-RELEASE)
Target: x86_64-unknown-linux-gnu
```

あとは煮るなり焼くなりしたら良いと思います！
サンプルアプリからQuickstartへpublish

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

#サンプルアプリからQuickstartへpublish
- 以下のアプリを使用してQuickstartへpublishします
- `python pub.py`で実行します

```py:pub.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import paho.mqtt.client as mqtt
import random
import sys

MQTT_BROKER="quickstart.messaging.internetofthings.ibmcloud.com"

MQTT_PORT=1883
MQTT_TIMEOUT=60

MQTT_PUB_TOPIC="iot-2/evt/status/fmt/json"

latTuple = (36.065269, 36.045284, 36.058608, 36.178417, 36.305790, 36.293616, 36.238253, 36.172874, 35.976411, 35.878552, 35.987524)
longTuple = (-112.123288, -112.263364, -112.428159, -112.511929, -112.399319, -112.216672, -112.051877, -111.850003, -111.703061, -111.856870, -112.128781)

def on_connect(client, userdata, flags, rc):
	print("on connect")

def on_disconnect(client, userdata, rc):
	print("on disconnect")
	client.unsubscribe(MQTT_SUB_TOPIC)

def on_message(client, userdata, msg):
	print("on message: " + msg.topic + " " + str(msg.payload))

def mqttConnect():
	print("mqttConnect")
	try:
		global client
		client = mqtt.Client("d:quickstart:myThing:001122334455")
		client.on_connect = on_connect
		client.on_message = on_message
		client.on_disconnect = on_disconnect
		client.connect(MQTT_BROKER,MQTT_PORT,MQTT_TIMEOUT)
		print("connected")
	except KeyboardInterrupt, kex:
		sys.exit()
	except Exception, ex:
		print("mqttConnect error")

def mqttPublish():
	while client.loop() == 0:
		for lat in latTuple:
			index = latTuple.index(lat)
			long =longTuple[index]
			temp = random.randrange(250,450)/10.0
			humid = random.randrange(500,1000)/10.0
			print "#" + str(index) + ", temp = " + str(temp) + ", humid = " + str(humid) + ", lat = " + str(lat) + ", long = " + str(long)
			msg = " {\"d\": {\"temperature\": " + str(temp) +",\"humidity\": " + str(humid) +", \"latitude\": " + str(lat) +", \"longitude\": " + str(long) + "} }";
			client.publish(MQTT_PUB_TOPIC, msg, 0, True)
			try:
				print raw_input("[Enter] to send another request")
			except:
				sys.exit()

def mqttPublishAuto():
	while client.loop() == 0:
		for lat in latTuple:
			try:
				index = latTuple.index(lat)
				long =longTuple[index]
				temp = random.randrange(250,450)/10.0
				humid = random.randrange(500,1000)/10.0
				print "#" + str(index) + ", temp = " + str(temp) + ", humid = " + str(humid) + ", lat = " + str(lat) + ", long = " + str(long)
				msg = " {\"d\": {\"Temperature\": " + str(temp) +",\"Humidity\": " + str(humid) +", \"latitude\": " + str(lat) +", \"longitude\": " + str(long) + "} }";
				client.publish(MQTT_PUB_TOPIC, msg, 0, True)
				time.sleep(2)
			except:
				sys.exit()

if __name__ == "__main__":
	print("--- started ---")
	mqttConnect()
	mqttPublishAuto()

	print("--- program ended ---")

```

- Node-RED側では`Device ID`に上記の`001122334455`を指定して受信します。

![スクリーンショット 2016-10-07 18.31.16.png](https://qiita-image-store.s3.amazonaws.com/0/125842/23118571-bd70-692b-68ab-05239524e048.png)
![スクリーンショット 2016-10-07 18.31.05.png](https://qiita-image-store.s3.amazonaws.com/0/125842/3660173f-03cb-08de-b74a-24b54bb67d17.png)
NodeREDからQuickstartへpublishする

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

#Node-REDからQuickstartへpublishしてみます
- [Node-REDのフローをコピーする方法](http://qiita.com/egplnt/items/84b244a50d8bdaced324)を参照して以下のフローをコピペします。


```lang:Node-REDからQuickstartへpublish
[{"id":"25299f9e.3b6c58","type":"ibmiot in","z":"36890dfe.1ec31a","authentication":"quickstart","apiKey":"","inputType":"evt","deviceId":"001122334455","applicationId":"","deviceType":"+","eventType":"+","commandType":"","format":"json","name":"IBM IoT","service":"quickstart","allDevices":"","allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":"","x":510,"y":240,"wires":[["ee533a9b.228c48"]]},{"id":"ee533a9b.228c48","type":"debug","z":"36890dfe.1ec31a","name":"","active":true,"console":"false","complete":"false","x":670,"y":240,"wires":[]},{"id":"9a1895de.b51ed8","type":"mqtt out","z":"36890dfe.1ec31a","name":"","topic":"iot-2/evt/status/fmt/json","qos":"","retain":"","broker":"9ce74b4e.cb3c5","x":710,"y":180,"wires":[]},{"id":"f00fc92.52b2438","type":"inject","z":"36890dfe.1ec31a","name":"","topic":"","payload":"{  \"temp\" : \"25\", \"humidity\" : \"50\"}","payloadType":"str","repeat":"","crontab":"","once":false,"x":510,"y":180,"wires":[["9a1895de.b51ed8"]]},{"id":"9ce74b4e.cb3c5","type":"mqtt-broker","z":"36890dfe.1ec31a","broker":"quickstart.messaging.internetofthings.ibmcloud.com","port":"1883","tls":null,"clientid":"d:quickstart:myThing:001122334455","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""}]

```

![スクリーンショット 2016-10-07 18.10.01.png](https://qiita-image-store.s3.amazonaws.com/0/125842/536dc772-2804-f781-f2ac-29c2b577c063.png)
[PHP] laravelを利用したので、インストールメモ

# laravelインストール記事
1. [PHP] laravelを利用したので、インストールメモ
2. [[PHP] laravelでsqliteを利用](http://qiita.com/kshimadutsu/items/ec801d8406936b3688cb)
3. [[PHP] laravelでseederを利用](http://qiita.com/kshimadutsu/items/f2558419718b47ed0c5d)

# laravelとは
PHPのフレームワークで、Symfonyのコンポーネントをよく利用されている。
https://laravel.com/

# laravelのVersion
5.3.18

# 環境
VirtualBoxを利用したCentOS6.8
(Webサービスを8000番ポートで起動するため、ポートフォワーディング設定に8000番を設定)

OS：CeontOS6.8

```:
$ cat /etc/redhat-release
CentOS release 6.8 (Final)
```

php：5.6.24

```:
$ php -v
PHP 5.6.24 (cli) (built: Aug  9 2016 20:51:15)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```

# 何はともあれComposerが必要
https://getcomposer.org/
https://getcomposer.org/doc/00-intro.md

```:
curl -sS https://getcomposer.org/installer | php
mv composer.phar ~/bin/
```
※ 私の場合、homeディレクトリのbin以下に配置しておけば、コマンドとして使えるので、bin以下に設置します。

# laravelのインストール

```:
$ composer global require "laravel/installer"
$ ~/.composer/vendor/bin/laravel --version
Laravel Installer version 1.3.3
```
※  ~/.composer/vendor/laravel/ 以下にlaravelのインストーラがインストールされる。

# プロジェクトの作成

```:
$ ~/.composer/vendor/bin/laravel new {プロジェクト名}
$ cd {プロジェクト名}
$ php artisan --version
Laravel Framework version 5.3.18
```

※ プロジェクト名と書いているが、インストールディレクトリ名です。指定しなければ、ワーキングディレクトリにインストールされます。

# 起動する

```:
$ php artisan serve
```
※ ここで罠にはまる。外部からのアクセスを許可するには、"--host 0.0.0.0"のオプションをつける必要がある。

```:
$ php artisan serve --host 0.0.0.0
```

http://localhost:8000/
![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/115974/1e0eecc2-5864-a5a3-1433-7b4df9a395d5.png)


# git

```:
$ git init
$ git add .
$ git commit -m "initial commit"
```


Webサーバの起動まで。
pretty_midiを使って、PythonでMIDIファイルを作成する

# はじめに
TensorFlow製の音楽生成プロジェクト「[Magenta](https://github.com/tensorflow/magenta)」をいじっています。

参考：[サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。]
(http://qiita.com/tackey/items/1295a0347a8b4cc30d46)

その前処理として、PythonでMIDIファイルをいじりたいなと思い調べたところ、Magentaでは[pretty_midi](https://github.com/craffel/pretty-midi)を利用しているようでした。
この投稿では、[pretty_midi 0.2.6 documentation](http://craffel.github.io/pretty-midi/#pretty_midi.Note)のサンプルを動かして、pretty_midiの仕組みについてみてみます。


# サンプルコード
サンプルコードと、コメントを書き記載します。

``` sample.py
import pretty_midi

# Create a PrettyMIDI object
# Pretty MIDIオブジェクトを作る。
cello_c_chord = pretty_midi.PrettyMIDI()

# Create an Instrument instance for a cello instrument
# Instrument Instanceを作る。ここではCello

# 楽器名を入れると、対応するGeneral MIDI program numberを返してくれる
cello_program = pretty_midi.instrument_name_to_program('Cello')


# Instrument instanceをCelloとして作成
cello = pretty_midi.Instrument(program=cello_program)


# Iterate over note names, which will be converted to note number later
# メロディをNoteNameで記載していますが、後ほどNoteNumberに変換されます。

for note_name in ['C5', 'E5', 'G5']:
    # Retrieve the MIDI note number for this note name
    # NoteNameからNote Numberを検索しています。
    note_number = pretty_midi.note_name_to_number(note_name)

    # Create a Note instance, starting at 0s and ending at .5s
    # NoteInstanceを作成します。音(pitch)の開始時間と終了時間、
    # velocityを定義します。
    note = pretty_midi.Note(
        velocity=100, pitch=note_number, start=0, end=.5)
    
    # Add it to our cello instrument
    # 上記で作成したNoteInstanceをCelloInstrumentに加えます。
    cello.notes.append(note)
    
    
# Add the cello instrument to the PrettyMIDI object
# ChelloInstrumentをPrettyMIDIオブジェクトに加えます。
cello_c_chord.instruments.append(cello)


# Write out the MIDI data
# PrettyMIDIオブジェクトをMIDIファイルとして書き出しましょう。
cello_c_chord.write('cello-C-chord.mid')
```

# 作成されたMIDI

ドミソの音が0.5秒（120　BPMだと一拍）のMIDIファイルができました。(logic Xで表示)

<img width="312" alt="スクリーンショット 2016-10-07 17.56.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/82763/6800b12a-ef95-b206-1d8f-10dba30a8490.png">


# 終わりに

次は、既存のMIDIファイルを読み込み、楽器ごとにファイルを分割する、ということをやってみたいと思います。

ありがとうございました。
Swift3.0で絵文字かどうかを判定するスマートな方法を考えた


## はじめに

Objective-C時代から絵文字の判定方法には **絵文字の文字コードを全部メモリーに持っておいて照合する** という泥臭い方法を採っていたのですが、iOSのバージョンアップに伴う絵文字の追加に追従するのが面倒くさいので、もう少しスマートに判定できないか考えてみました。

* 2016/12/16 Xcode8.2 + iOS 10.2 頂いたコメント等を元に再編

## 考えたもの

仕組みは簡単、`CoreText`を使ってAppleColorEmojiフォントに対し、文字コードを渡し、グリフ値（フォントの文字のインデックス値）へ変換できたら絵文字とみなす、というものです。

ただ、AppleColorEmojiフォントは何故か0,1,2,3...と言った文字のグリフも持っているため、その辺りだけ例外的に除外してあげる必要があります。

![スクリーンショット 2016-10-07 15.59.15.png](https://qiita-image-store.s3.amazonaws.com/0/31347/38dbf678-55fc-e548-29ec-8c1a88ce70db.png "スクリーンショット 2016-10-07 15.59.15.png")
（スクショはmacのフォントですが）

また、`String.CharacterView`では一部の絵文字が正しく処理されない事が判っています。

> let w2 = "👩‍👩‍👧‍👦"
> w2.characters.count // 4


そのため、`String.CharacterView`ではなく`String.enumerateSubstrings`を使って書記素クラスタへ分解、分解された文字列ごとに絵文字かどうかを判定すると今の所うまく行くようです。

以下、完成したソースです。

```swift:Swift
import UIKit

fileprivate var appleColorEmojiFont = CTFontCreateWithName("AppleColorEmoji" as CFString, 20, nil)

extension String {
    var isAppleColorEmoji: Bool {
        let chars = Array(self.utf16)
        if chars.count == 1 && chars[0] <= 57 { // 制御文字やスペース、数字を除外
            return false
        }
        var glyphs = [CGGlyph](repeating: 0, count: chars.count)
        return CTFontGetGlyphsForCharacters(appleColorEmojiFont, chars, &glyphs, glyphs.count)
    }
}
```

## 実験結果

```swift:
let str = "あ🍣😱🇨🇳0123*#👪👩‍👩‍👧‍👦👯ABC漢\n _❄️❄︎"

str.enumerateSubstrings(in: str.startIndex..<str.endIndex, options: .byComposedCharacterSequences) { str2, _, _, _ in
    if let str2 = str2 {
        let result = str2.isAppleColorEmoji ? "[絵文字]" : ""
        let code = str2.utf16.map({ String(format: "0x%04x", $0) }).joined(separator: " ")
        print("|\"\(str2)\"|\(result)|\(code)|")
    }
}
```

|文字|絵文字判定|文字コード|
|-----------|------------|------------|
|"あ"||0x3042|
|"🍣"|[絵文字]|0xd83c 0xdf63|
|"😱"|[絵文字]|0xd83d 0xde31|
|"🇨🇳"|[絵文字]|0xd83c 0xdde8 0xd83c 0xddf3|
|"0"||0x0030|
|"1"||0x0031|
|"2"||0x0032|
|"3"||0x0033|
|"*"||0x002a|
|"#"||0x0023|
|"👪"|[絵文字]|0xd83d 0xdc6a|
|"👩‍👩‍👧‍👦"|[絵文字]|0xd83d 0xdc69 0x200d 0xd83d 0xdc69 0x200d 0xd83d 0xdc67 0x200d 0xd83d 0xdc66|
|"👯"|[絵文字]|0xd83d 0xdc6f|
|"A"||0x0041|
|"B"||0x0042|
|"C"||0x0043|
|"漢"||0x6f22|
|(改行)||0x000a|
|" "||0x0020|
|"_"||0x005f|
|"❄️"|[絵文字]|0x2744 0xfe0f|
|"❄︎"||0x2744 0xfe0e|

## 考察

とりあえずうまく判定できているように見えます。
"❄️"と"❄︎"のように同じ文字コード＋異体字セレクタで絵文字か否かを指定しているものも、正しく判定してくれているようです。

もし、誤判定しそうなものや、そもそも他にもっと良い方法がありましたら、情報提供していただけると助かります。
AWS IoT Device SDK for Ruby を使ってみた #1 -  Raspberry pi 初期設定

// 当記事は, 以下親記事の Setup Flowの一部です.
// [AWS IoT Device SDK for Ruby を使ってみた](http://qiita.com/Satoshi_Numasawa/items/2b89799a92e5a4edefcd)

当記事の内容は, 以下記事を参考とさせて頂きました. (整理したのみで内容はLink先と同一です)
ありがとうございます.
http://qiita.com/toshihirock/items/8e7f0887b565defe7989




# DL raspbian lite on mac
DL from https://www.raspberrypi.org/downloads/raspbian/

```bash:console
$ unzip 2016-05-27-raspbian-jessie-lite.zip
```



# OS imageをSDへ書き込み on mac
- [x] macへSDを挿入
- [x] install

    ```bash:console
    $ diskutil list // sdのdisk番号確認。以下は、/dev/disk1と想定
    $ diskutil eraseDisk FAT32 RPI /dev/disk1
    $ diskutil unmountDisk /dev/disk1
    $ sudo dd bs=1m if=2016-05-27-raspbian-jessie-lite.img of=/dev/rdisk1
    ```


# ssh接続 to raspberry
  - [x] LAN cable接続

  - [x] Micro SD 挿入

  - [x] 電源投入

  - [x] DHCP 払い出し IP address を確認

  - [x] Raspberry へ ssh接続

    ```bash:console
    $ ssh pi@192.168.1.18
    pi@192.168.1.18's password: raspberry
    ```

# Wi-Fi接続設定
- [x] wireless interfaceの存在確認

    ```bash:console
    $ ip addr
    // wlanが表示される事
    ....
    3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
        link/ether b8:27:eb:1b:f4:49 brd ff:ff:ff:ff:ff:ff
        inet6 fe80::a82f:f154:7a35:b999/64 scope link tentative
        valid_lft forever preferred_lft forever
    ```

- [x] ssid設定

    ```bash:console
    $ sudo sh -c 'wpa_passphrase [SSID] [PASSPHRASE] >> /etc/wpa_supplicant/wpa_supplicant.conf'
    ```


- [x] commet部のpassword削除

    ```bash:console
    $ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
    comment outしている生passwordを削除して保存
    ```


- [x] wi-fi IP 固定

    ```bash:console
    $ sudo vi /etc/network/interfaces
    ```

    ```bash:/etc/network/interfaces
    allow-hotplug wlan0
    iface wlan0 inet static
        wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
        address 192.168.1.100
        netmask 255.255.255.0
        gateway 192.168.1.0
    ```

- [x] 再起動

    ```bash:console
    $ sudo shutdown -r now
    ```

- [x] wi-fi接続を確認

    ```bash:console
    $ ssh pi@192.168.1.100
    pi@192.168.1.100's password: raspberry
    ```

以上.
次は, [#2 - Raspberry pi / sensor 配線](http://qiita.com/Satoshi_Numasawa/items/3350d61fef10650f757d)
AWS IoT Device SDK for Ruby を使ってみた #2 - Raspberry pi / sensor 配線

// 当記事は, 以下親記事の Setup Flowの一部です.
// [AWS IoT Device SDK for Ruby を使ってみた](http://qiita.com/Satoshi_Numasawa/items/2b89799a92e5a4edefcd)



# 配線
// 電源は落として作業するのが無難.
// 配線の番号は後述する参考画像にて確認.

- DHT11温度/湿度 Sensor
    - [x] Board f21,22,23へ (写真参照)
- 抵抗
    - [x] i21,22へ
- code
    - [x] Pi3 Pin#01 to Board j21 (red)
    - [x] Pi3 Pin#07 to Board j22 (purple)
    - [x] Pi3 Pin#09 to Board j23 (black)




# 参考画像
## Raspberry Pi
![pi3_gpio.png](https://qiita-image-store.s3.amazonaws.com/0/118627/f063dfdb-734b-3875-3748-ee0ae4049935.png)

## 配線完了写真
![P_20160616_122037.jpg](https://qiita-image-store.s3.amazonaws.com/0/118627/1c56cc44-22e9-bd5e-7e14-cd5ce760c991.jpeg)

![Pi3_1500.jpg](https://qiita-image-store.s3.amazonaws.com/0/118627/d199f380-8134-d6d1-3e2a-61a5a3e55c8c.jpeg)

![P_20160616_122004.jpg](https://qiita-image-store.s3.amazonaws.com/0/118627/dd53a90f-d582-fa67-246d-d9cd323f9770.jpeg)

![P_20160616_121927.jpg](https://qiita-image-store.s3.amazonaws.com/0/118627/de2997ca-d74a-4fa3-74a5-c5cf3b89fd1e.jpeg)


以上.
次は, [#3 - AWS IoT 設定](http://qiita.com/Satoshi_Numasawa/items/bccf813325ddba7e549e)