OmniAICreator/Qiita-1.07M huggingface dataset:
Antergos Minimalをインストール

本記事はArch Linux Advent Calendar 2015の6日目の記事です。

* AntergosというArch Linux派生のディストリビューションをインストールしてみました。

## ダウンロード

* [﻿﻿Try it | Antergos Linux](https://antergos.com/try-it/)

## インストール

![antergos0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7f276fb9-d2de-eba7-b820-a17010a14c0f.png)

![antergos1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7525eac8-5f1e-97f9-d060-b7fe1217a927.png)

![antergos2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7071b92b-634b-21ec-695e-f54398b98940.png)

![antergos3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/78175c9f-cb7a-2c4b-e6fa-7ad7a87cd07b.png)

![antergos4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e3d775a8-8353-f727-179a-0477deb46b61.png)

![antergos5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d77b3d9-c362-facb-d5d3-cc9c66268d03.png)

![antergos6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ed52ba4a-02ef-0ee3-930a-df0639fbebf0.png)

![antergos7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7c9b8b8a-4758-b9b7-ae6d-7e80510d54e5.png)

![antergos8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8f734046-8d6a-b9f1-dbbb-87b269a24dc8.png)

![antergos9.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b338c336-f0f6-2920-de10-a7f685fd3c16.png)

![antergos10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9ea1cb19-340c-518e-a800-590ec7068a42.png)

![antergos11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/98e593ca-c3d8-8d06-b657-1a1a3bf8e708.png)

![antergos12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f84e8431-2274-9849-2ffa-d03467f2f9c0.png)

![antergos13.png](https://qiita-image-store.s3.amazonaws.com/0/25728/593f50b2-362c-8bae-2bdb-c04929d2d134.png)

![antergos14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/afd70d1f-1174-24ee-7a3f-d223f08c40a0.png)

![antergos15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7006fb51-9acc-6c84-aa40-bb4d0e2ad630.png)

![antergos16.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d7f542a8-90ca-003a-f0b6-17141c83e6af.png)

### OSインストール後

![antergos17.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f676101c-5814-6b10-cdc1-cc9235f6993b.png)

![antergos18.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e5360c8c-c1fe-d29c-f2ec-75e39de450b1.png)

![antergos19.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6473a43f-97eb-24e9-e510-6aa3925f34ab.png)


## まとめ

* インストール時にパッケージの選択ができるので、Officeは不要なんだけど・・・という人に良いと思います。
* インストール時にダウンロードの時間がかかかる(20分位)のでそこだけ注意
技術英語 > I’m cutting this wood to help me [get by]. / Let me through. / Let go of me.

@ LOE > July 27, 2012

http://loe.org/shows/shows.html?programID=12-P13-00030
>  I’m cutting this wood to help me get by.

道を通るのに木を切った、ということ。

<hr>
関連して思い出したのは

Let me through.
http://ejje.weblio.jp/content/Let+me+through

この文の動詞ってLetなのだろうか? throughではないと思う。

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/Let+go+of+me.
> Let go of me.
放してください。

ofが入っているのが面白いので印象に残った。

<hr>

Put the thread through the eye of the needle.なんてのも思い出したが略。
ansible v2.0にアップデートする前に

まもなくリリースされるAnsible v2.0（rc1）を一足早く触ってみて地雷を踏んでみた。

## v2.0の主な変更点

https://github.com/ansible/ansible/blob/stable-2.0/CHANGELOG.md

- Coreのリファクタリング
- 新しい構文の追加（block/rescue/always）
- Syntax Errorがより詳細に
- Strategy Plugins
- モジュールの追加

## インストール

```
$ pip install paramiko PyYAML Jinja2 httplib2 six
$ git clone -b stable-2.0 git://github.com/ansible/ansible.git --recursive
$ cd ansible/
$ source ./hacking/env-setup
$ ansible --version
ansible 2.0.0 (stable-2.0 f241c70740) last updated 2015/12/08 02:59:55 (GMT +900)
...
```

## 既存のplaybookをv2.0で実行する上での注意

基本的にv1.9までのplaybookをそのまま実行できるよう、互換は保たれているが、一部注意する必要がある。

### Templateで空のvarは"None"ではなく空の文字列になる

```
# template
var a is {{ a }}!!
```

```
# playbook
vars:
  a:
tasks:
  name check empty value in template
  template: src=path/to/template.j2 dest=/path/to/template.out
```

```
# v1.9.4 in template
var a is None!!  # "None"が展開される

# v2.0.0 in template
var a is !!  # 空の文字列""が展開される
```

### varが暗示的に文字列へ変換しない

```
# playbook

vars:
  b: 123
  c: true
tasks:
  - name: check integer value
    debug:
      var: "{{ b }}"
  - name: check boolean value
    debug:
      var: "{{ c }}"
```

```
# v1.9.4 output
TASK: [check integer value] ***************************************************
ok: [xxx.xxx.xxx.xxx] => {
    "var": "123"
}

TASK: [check boolean value] ***************************************************
ok: [xxx.xxx.xxx.xxx] => {
    "var": "True"
}

# v2.0.0 output
TASK [check integer value] *****************************************************
ok: [xxx.xxx.xxx.xxx] => {
   "var": 123
}

TASK [check boolean value] *****************************************************
ok: [xxx.xxx.xxx.xxx] => {
    "var": true
}
```



### 改行コードが残る

```
# Syntax in 1.9.2
vars:
  message: >
    Testing
    some things
tasks:
- debug:
    msg: "{{ message }}"

# Syntax in 2.0.x
vars:
  old_message: >
    Testing
    some things
  message: "{{ old_messsage[:-1] }}"
- debug:
    msg: "{{ message }}"
```
```
# Output
"msg": "Testing some things"
```
> 引用：https://github.com/ansible/ansible/blob/stable-2.0/CHANGELOG.md

### エスケープの挙動が違う

```
# Syntax in 1.9.x
- debug:
   msg: "{{ 'test1_junk 1\\\\3' | regex_replace('(.*)_junk (.*)', '\\\\1 \\\\2') }}"
# Syntax in 2.0.x
- debug:
    msg: "{{ 'test1_junk 1\\3' | regex_replace('(.*)_junk (.*)', '\\1 \\2') }}"
```
```
# Output:
"msg": "test1 1\\3"
```

> 引用：https://github.com/ansible/ansible/blob/stable-2.0/CHANGELOG.md

## 参考資料

- http://docs.ansible.com/
- https://github.com/ansible/ansible/
- http://www.slideshare.net/jimi-c/whats-new-in-v2-ansiblefest-london-2015
- http://qiita.com/yuta_h3/items/30dcfd939cb13b7e24fa
EFIを有効化した VirtualBox に debian をインストールする

## はじめに

数年前はまだまだ一部の PC にしか搭載されていなかった UEFI ですが、今では殆どの PC が UEFI に対応しており、設定画面(いわゆる BIOS)でマウスが使えたり[^1]、サポートにメールが送れたり[^2]します。すごい時代になったものです。

さて、最近 VirtualBox で 新しく VM を作成する機会があったのですが、せっかくなので UEFI マシンにしようと思い「EFI を有効化」オプションを有効にしてみたのですが、うまく行かなかったので問題と対処方法を紹介します。

## 問題点

今回インストールした OS は debian です。インストール自体は正常に完了するのですが、VirtualBox の UEFI は電源を落とすと **設定が初期化されます **。

つまり、boot を指定しても再起動すればその設定は初期化され、UEFI シェルが起動してしまいます。

## 対策

UEFI は `/EFI/boot/bootx64.efi` というファイルをロードするらしいです。なので、少々強引ですが debian のブートローダのファイル名を変更してしまいます。

debian のブートローダは `/EFI/debian/grubx64.efi` です。

なので、UEFI シェルに入って

```
Shell>fs0:
fs0:\> cp -r EFI\debian EFI\boot
fs0:\> mv EFI\boot\grubx64.efi EFI\boot\bootx64.efi
```


としてから、再起動すれば debian が起動します。

## 参考

- [Ubuntu VirtualBox その22 - UEFIでUbuntuをインストールした後、UEFIの設定が保存されない時は - kledgeb](http://kledgeb.blogspot.jp/2014/04/ubuntu-virtualbox-22-uefiubuntuuefi.html)
- [HP UEFI シェルユーザーガイド](http://h50146.www5.hp.com/lib/products/servers/proliant/manuals/744994-191a_ja.pdf)


[^1]: https://twitter.com/zakuro9715/status/672336990080131072
[^2]: https://twitter.com/zakuro9715/status/672337386030825473
GitLab でサーバーサイドフックを記述する際には、 custom_hooks ディレクトリにスクリプトを置く。

普通の git レポジトリでは、サーバーサイドフックは `.git/hooks` ディレクトリに記述するが、 GitLab では、 `.git/custom_hooks` ディレクトリに記述する。これは、 GitLab-shell から利用する際の symlink の取り扱いにあたって、この方が都合が良いから、こうなっているらしい。

詳細は [Documentation](http://doc.gitlab.com/ce/hooks/custom_hooks.html) を参照。
CROSS 2016 予告（日本のIaaS裏トーク）

クラウドやデータセンターをやっているinoueisseiと申します

Web系エンジニアの勉強会のCROSS 2016でパネルディスカッションをやらせていただく予定なので、その軽い告知をさせていただきます :punch: 
※内容は仮なので、変わる可能性もあるのでご了承ください :construction_worker: 
　逆に、こんな話が聞きたい！などありましたらコメントいただければ幸いです :pray: 

# CROSS 2016

日時：2016年2月5日(金)
場所：[横浜港大さん橋ホール](http://www.osanbashi.com/map/index.html)
Webページ：http://2016.cross-party.com/

# タイトル

**日本のIaaS裏トーク ～インフラ×ソフトウェア～**
※CROSSと「×」をかけてます :dancers: 

# 発表者

ニフティ株式会社 日下部 雄也
GMOインターネット株式会社 中里　昌弘
さくらインターネット株式会社 大久保 修一
株式会社IDCフロンティア 井上 一清（このQiita記事の筆者です）

# 概要

各社クラウドコントローラはCloudStackだったり、OpenStackだったり、独自だったり、
HyperVisorはVMwareだったり、KVMだったり、UIはそれぞれ独自だったり、で
同じIaaS事業者ですが、特色があって非常に面白いと思います。
（実は打ち合わせ時が一番盛り上がっています :laughing: ）

日本のIaaS企業がここぞとばかりに自社のクラウドのアーキテクチャを暴露しちゃいます ので、興味ある方は是非いらしてください:bomb:
vvvvで再帰性反射材を使ってみよう

#準備するもの
・vvvv 64bit
・kinect v2など赤外線カメラ
・再帰性反射材

##再帰性反射材とは
入光を光源の方にまっすぐに反射させるもの。
つまり、入射角にかかわらず、光源に反射する。
工事現場の人がつけてるヤツ。

kinectなどの赤外線カメラでは、
距離がそのまま光を返すため、距離が近くなる。
（・・・で、あってるかな？汗）

##再帰性反射材買ってみた
・再帰性反射材テープ：3M Reflective sheeting 680シリーズ
・反射シート：3M反射シート1500シリーズ

今回は、東急ハンズで買いましたが、
似たような反射シートが売ってるので、それでもOKだったりします。
両方とも同じように使えました。

#vvvvで距離画像を作る
ご存知の通り、kinectにはRGBカメラとIRカメラが入っております。
赤外線カメラから、距離による色の変化の違いを表す距離画像を作ります。

赤で表示されているDepthを白に変換し、thresholdで閾値の設定をします。

###近い時
![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/ed76cf54-3ee4-a3e3-e1d6-6453aecd244e.jpeg)

###遠い時
![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/e2791747-843e-17b9-d6b7-e1418ca7173e.jpeg)

###再帰性反射材使用時
遠くても近くても赤外線を反射するため、下記のような画像になります。
反射してますねー。
![03.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/2a0b3b5e-91c3-a24d-8f4b-14f02b5604c1.jpeg)


##DX11 Rendererの画像をDX9へ変換する
DX11で扱いにくかったため、DX9へ今回は変換しました。
下記、参考にしてください。
http://qiita.com/Junky_Inc/items/4350be928f3a5de349f1

#パターン1.マスクにする
白抜きで画像が表示されるため、そこに画像を入れ込みます。
丁度良い記事が今年のAdvent Calendarに上がっております。参考にしてください。
http://design-ambience.com/blog/?p=908
![04.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/23a0f8d6-ba4d-35b3-1f19-a85e5b78c6ac.jpeg)

#パターン2.Color Tracking
Trackerにｔhresholdに入れている色を入力し、トラッキングさせる。
32bit版ではColor Trackerがあるが、今回は64bit版を使用したので、
Trackerにて記載している。
![05.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/9883d3b6-518d-e802-b8b8-45ca6b82c9ce.jpeg)


#パターン3.色の情報を利用して当たり判定をとる
Trackerだと、精度に不安定さも見られるため、
pipetで色の情報をとってきて、当たり判定をとってみました。
何かものを置いたときに反応するなどは、このように対応できそうです。
![06.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/1089cf38-1daf-9a89-568e-e3912c3e624a.jpeg)

#まとめ
再帰性反射材は距離画像を使って色々できる！

再帰性反射材使ってみた的な記事がすくなかったので書いてみました。
プログラムというより、材料の試しって感じですね。
VM上のNTPDが正しく同期しない

昔別ブログで書いた記事ですが、Qiitaでも転載します。

# VMでNTPDが正しく同期してくれない
以前、OVA形式として出力したVMwareのVMを、新たなホスト上に展開した時、
NTPDの時刻同期が正しく実行されないことがありました。

"正しく実行されない"という曖昧な言い方をしたのは、
`ntpq -p`コマンドで同期状態を確認すると、
正しく同期できているように見えるのですが、時刻がとんでもなくずれている状態だったためです。
※以下イメージです。

```shell-session
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
* XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX  3 u  408  512  377   2.056  123456.789  101.351
```

他の何かの時刻同期サービスと競合しているのか？と疑いましたが、
vmware toolsの時刻同期くらいしかそもそも競合ソフトがなく、そちらはOFFになっていました。

# frequency error 5xx PPM exceeds tolerance 500 PPM
情報を求めてsyslogを眺めていると、下記のようなntpdプロセスのログが大量に出ていました。

```shell-session
frequency error 512 PPM exceeds tolerance 500 PPM
```

PPMとは"Parts-per-Million"の略で、*時刻の進み方の誤差*を表しています。
ntpdは「自身のサーバの腹時計がどれくらいずれやすいか」を正しい時計と見比べて認識しており、
この情報を`/var/lib/ntpd/drift`というファイルに定期的に出力しています。

この機能は、親ntpdサーバとの同期頻度を抑えるための機構です。
16秒に1回、32秒に1回、64秒に1回・・・と徐々に同期回数を減らすことで、ntpdプロセスが使うリソースを抑えることができます。
同期頻度を下げた場合においても、時刻ズレが発生しないようにしているんですね。

NTPDは、このPPMが一定のしきい値に達すると「なんかおかしいぞ」とエラーをあげます。
PPMが大幅に大きくなってしまうと、同期周期の間に(正しいかは別として)大きく補正をかけてしまうためです。
その場合は、下記のようにdirftファイルを削除して再起動することで、一旦リセットすることができます。

```shell-session
# /etc/init.d/ntpd stop
# rm /var/lib/ntpd/drift
# /etc/init.d/ntpd start
```

これで正しく同期されるようになりました。
一件落着ですね。

# なぜPPMの値が大幅にずれてしまったのか
サーバの腹時計のズレ具合は、サーバのCPUクロック周波数などの主にハードウェア周りに依存します。
ここで肝なのが、VMの場合はハードウェアがホストによって変わってしまうことにあります。

今回のケースでは、一定時間稼働していたVMをOVAとして出力し、それを別ホストに配備して起動しました。
以前のホスト上でもntpdプロセスは稼働しており、そちらの環境で`/var/lib/ntpd/drift`ファイルは作成済でした。
この状態で新たなホスト上でntpdプロセスを稼働させると、別環境上で作成した`drift`ファイルを参照してしまいます。

違う腹で動いていた時計の傾向など、なんの参考になりません。

これを参考にして稼働させていると、徐々に時刻が狂いだすのではないかと僕は考えています。

# VMコピーしたらdriftファイルを削除する
この事象を受けて、個人的におまじないとして「VMコピーしたらdrift削除」をいつもやるようになりました。
特に引っ越しに引っ越しを重ねてきたVMは、多くの場合、offsetが思っていた以上に落ち着きません。
誤差といえば誤差ですが、チリツモですね。

この事象に出会ったのは2，3年前ですので、
最近ではVMのエミュレート能力向上に伴い、大幅なズレは発生しないかもしれません。
それでもなんとなくいつもdriftファイルは消してます。

# 【余談】Chronydについて
先日、CentOS7を初めて触る機会があったのですが、
長く親しんだntpdが不採用になったと聞いて少し悲しい気持ちになりました。

Chronydでもdriftファイルってあるのかなと思い設定ファイルを見てみましたが、
`/var/lib/chrony/drift`という場所にありました。

おまじないはソフトが変わっても健在しそうです。

# 余談中の余談
ntpdについて調査していた時に、下記サイトをよく見ていました。
とてつもなく詳しく、わかりやすくntpdの仕組みが書かれています。
参考：[NTP設定](http://d.hatena.ne.jp/incarose86/20110505/1312522379)

作者さまには陰ながら心より感謝しています。
ブックマークにいれて、ntpdトラブル時等に毎回閲覧させて頂いています。

---
初めてvisualStudioでopenFrameworksを使うとき,HRESULTからの例外と出た場合の対処法

#問題
![2015-12-08_01h09_13.jpg](https://qiita-image-store.s3.amazonaws.com/0/70435/3e4e2522-c13b-7a53-8078-421a32d6e0bf.jpeg)

http://openframeworks.jp/setup/vs/
openFrameworksをvisualStuidio2015で利用するとき
インストール解説の通りに進めると,Addons選択後｢HRESULTからの例外:0x80041FE2｣とでる

#解決策
先にopenFrameworks\apps\myApps\emptyExampleのプロジェクトを開く
インストールされていない機能のインストールをする

![2015-12-08_01h11_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/70435/353bdd36-a754-e0cf-f8a5-eec7338ce3e2.jpeg)
インストール画面が自動的に出ない場合は,ソリューションエクスプローラ内のソリューションを右クリックして選択する
VagrantでFuelPHP環境構築　その1

初めてVagrantを使ってFuelPHP開発環境構築してみたので備忘録がてら。
Fuelを使いたい人の助けになれば。

* 仮想マシン作成時の細かい概要の説明は省いてます。。。
* 実行環境　OS X Yosemite 10.10.5 

## 仮想マシンの作成と起動
* 前提として、Vagrant と VirtualBox を入手しておくこと 

* boxを取得
今回はCentOSのboxファイルダウンロードURLを使用。
fuel-centos　にはbox名を任意で

<pre>
$ vagrant box add fuel-centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
</pre>

<pre>
$ vagrant box list
</pre>
で作成したboxが見れればOK

* VagrantFileを作成する

<pre>
$ mkdir fuel-centos
$ cd fuel-centos
$ vagrant init fuel-centos
</pre>

* 仮想マシン起動

<pre>
$ vagrant up
</pre>

起動確認したらsshで接続可能なことを確認できれば、ひとまず仮想環境は作成完了！！
<pre>
$ vagrant ssh
</pre>

* vagrant ssh を快適に使ってみる

この仮想マシンへはVagrantFileが存在するディレクトリからしか接続できない状態なのでホスト名を指定して接続できるよう設定

<pre>
$ vagrant ssh-config --host fuel-centos >> ~/.ssh/config
$ ssh fuel-centos
</pre>

* VagrantFileを編集

<pre>
$ vi Vagrantfile 
</pre>

> \# config.vm.network :private_network, ip: "192.168.33.10"

ここの記述のコメントアウトを外す
VaglantFileは編集後再起動を忘れずに！

<pre>
$ vagrant reload
</pre>

## 仮想サーバ内にApacheとPHPインストール

サクサクっと
<pre>
$ sudo yum install php
$ sudo yum install httpd
</pre>

* ファイアウォールとSELinuxの停止＆無効化
<pre>
$ ssh fuel-centos
</pre>
で接続後、
<pre>
$ /etc/rc.d/init.d/iptables stop
$ chkconfig iptables off
</pre>
ファイアウォールの設定変更
<pre>
$ vi /etc/sysconfig/selinux
// この記述を
SELINUX=enforcing
// 以下に変更
SELINUX=disabled
</pre>
SELinuxを完全無効化

この2つ、やるの忘れてよくハマる。。。
こちらも設定変更したら vagrant reload しましょう

## シンボリックリンク作成

Vagrantではssh接続したrootの /vagrantの先と、
ローカルで作成したVagrantfileがあるディレクトリが同期されます
<pre>
// ssh接続後
$ cd /vagrant
</pre>
このディレクトリとローカルが同期しているので、
ローカルで変更を加えた内容をWebサーバ上に自動同期して確認できるようシンボリックリンクを作成しちゃいます

<pre>
$ sudo ln -s /vagrant/project /var/www/project
</pre>

今回は /var/www/project にリンクを作成

## FuelPHPをインストール

[FuelPHP環境構築まだまだつづくよその2](http://qiita.com/ave/items/50fa91e25f3e51cff0cb)　へ続きます＊ ﾟ･*:.｡.:*･゜＋ d(*´∀｀)b  ＋.:*･゜ﾟ･*:. ＊
SECCON 2015 オンライン予選

今年はチームshioshiotaで参加して結果は3100点で29位でした。
勝手に問題が解かれる分一人よりかは楽でした。

###Entry form
普通に入力したメールアドレス宛にメールが飛ぶと思って生きてるアドレスを入力してみたが、関係ないようなので適当にSQLインジェクションを試すが不発。
一旦時間を置いて適当に考えてURLを削ってみるとソースコードが読めた。OSコマンドインジェクションがあったのでlogをcatしようとするが権限が無かった。権限見るためにls -alRしたらbackdoorがあったのでそれを使ってフラグを取った。
それはそれとして、logに無駄にメールアドレス吐いて、他の人にも見えるのはやめて欲しい。

###Unzip the file
他の人がブルートフォースで頑張っていたが、zipファイルに明らかに怪しいバックナンバーのファイルがあったので、「既知平文攻撃とかできそう」って言ったらshioshiotaさんががんばってくれてた。

###Decrypt it
実行ファイルに引数を与えると引数が暗号化+base64されて出力される。何回か試した感じストリーミング暗号だったので1文字ずつ全探索するプログラムをC++で作成。C++で全部やるのは面倒なので下のような感じにして、result.txtに末尾の1文字の暗号結果が出力されるようにした。

```cpp
snprintf(command, 999, "./cryptooo '%s%c' | cut -d ' ' -f 2 | base64 --decode | tail -c 1 > result.txt", str, c);
system(command);
```
https://gist.github.com/cos65535/85d3351bd4b43863655e

###QR puzzle (Windows)
Windows上でプログラムを書けるまともな環境を持ってるのが自分しかいなかったぽいので担当した。C#でパズルのウィンドウの位置を固定して、デスクトップキャプチャ取って、パズル解いて、リーダに読ませて、結果をSendKeysで自動送信する。やるだけ問題だった。
https://gist.github.com/cos65535/e44bfdb0a07ee4e50586

###QR puzzle (Nanogram)
どうせピクロスのソルバーとか誰か作ってるやろう、と思って探したらすぐ見つかったのでやったら結構時間がかかった。
最終的には、クリップボードのテーブルタブの内容をパースしてソルバーに突っ込んで、ソルバーの出力をsvgに書き換えて、convertでpngに変換して、zbarimgで読み取ってクリップボードに出力するスクリプトを作った。クリップボード間は問題ページを開発ツールのインスペクタで開いておいて人力でコピペした。途中でzbarimgで読み取れないQRコードが出ることがあったので、諦めて30回連続で読み取れるまで人力でコピペし続けたので疲れた。

###その他
今回5人チームで参加時間もてきとうで思ったより良い成績が取れた。もうちょい真面目に頑張れば予選通過できるかもしれないので、来年は頑張りたい。
プレースホルダテキストでもう少し工夫してみる


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の8日目

# プレースホルダテキストでもう少し工夫してみる
せっかくできたネタなのでもう少し深堀りしてみる

## プレースホルダテキストはフィールドのヘッダー代わりになるか？
FileMakerのえらい人たち曰く
「プレースホルダテキストをフィールドのヘッダーの代わりにしないほうがいい」
ということらしいです
理由として

- フィールドに入力されるとプレースホルダテキストが見えなくなる

が挙げられるようです

## 要はインタラクションを書く
UXのえらい人たちの話を思い出しても、プレースホルダテキスト的なものには
「○○を入力します」
やら
実際の入力例を例示する
とした方がユーザー体験的にはベターなようです

## じゃあどうするか？
やっぱりつどつどインスペクタで設定してられない
どこかにまとめて登録しておけないか？

## フィールドのコメントを使おう
あんまり有用に活用していなかったフィールドのコメントを使ってみる
![151208-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/7529a332-a397-7378-1518-21959c5a0018.png)

フィールドのコメントを取ってくる関数はFieldComment関数
>FieldComment
目的 
指定したフィールドのコメントを返します。
構文 
FieldComment ( ファイル名 ; フィールド名 )
引数 
ファイル名 - 開いているデータベースファイルの名前（ローカルまたはリモート）
フィールド名 - 指定したデータベースファイルのフィールドの名前

インスペクタのプレースホルダテキストで

```
FieldComment ( Get(ファイル名) ; GetFieldName ( Self ) )
```

とすると
![151208-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/707cb2f3-3b16-1490-9cb3-f2eb5311be8d.png)
となる

## もう一工夫してみる
でもこれではコメントを設定していないフィールドでは...
なのでフィールドにコメントが設定されていたらコメント、されていなければフィールド名をプレースホルダテキストに表示させてみる

```
Let ( fc = FieldComment ( Get(ファイル名) ; GetFieldName ( Self ) ) ; If ( Length ( fc ) = 0 ; GetValue ( Substitute ( GetFieldName ( Self ) ; "::" ; "¶" ) ; 2 ) ; fc ))
```

## プレースホルダテキストを指定する時に色も指定してみる
```
TextColor ( FieldComment ( Get(ファイル名) ; GetFieldName ( Self ) ) ; RGB ( 255 ; 79 ; 0 ) )
```
とすると
![151208-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/80a1b543-91aa-89d6-a15a-197f59e16944.png)
みたいになる
もちろん色を付けているのはプレースホルダテキストだけなので、フィールドに文字を入力すると、普通に表示される
井戸端PySpa

PySpaというコミュニティがあります。

元は6-7年以上前ぐらいからPythonやDjangoあたりで集まった人たちが継続的につながっているような感じです。今は主にチャット上でつながっています。昔はSkype。今はSlack。

* [プライベートを犠牲にして勉強することについて、5年前に考えたこと](http://blog.shibu.jp/article/166708656.html)

個人ブログの方にもちょっと前にも書きましたけど、5年ほど前に出版させてもらった、つまみぐい勉強法は、半年に一回ぐらいはこの本に書いたような話が炎上したりして「前にもこういう話を聞いたことがあるなぁ」と思う程度に今でも使えるネタが書かれています。

勉強会と効率
=================

企画段階からnomicoxさんと話題にしていたのが「勉強会疲れ」です。週末は当然のこととして、平日の夜、場合によっては朝も勉強会漬けにして、忙しそうにしているけど、傍目から見てまったく成果が出ていないように見える人もちらほらいました。

偉い人の話を聞くと自分のステージがあがったような錯覚を覚えますが、まあ錯覚です。やる気だけがボトルネックで、アウトプットを出すための準備運動はバッチリみたいな人なら刺激を受けるだけでも効果はあるでしょう。それか、すでに自分がアウトプットできていて、プラスアルファのヒントを貰いに行くのも悪くはないと思います。

僕の感覚として、すごい話を聞いたとしても、インスピレーションを受けて改善できる量というのは、受け手のスキルの量の比例している気がします。自分の努力が足りない状態で話を聞いても受け取れる量はそれほど多くはないです。

もう１つあるのが勉強会の運営です。スタッフは得るものが大きいですが、その分自分の時間も使います。複数のスタッフを掛け持ちして自分の手を動かす時間が極端に減ってしまうと、時間効率はとても悪くなります。もちろん、目的が勉強ではなく「俺が愛したこの技術をもっと多くの人に伝えたい」とかであれば、その夢は実現できているので問題はありません。

勉強会というのは、勉強を目的としているのであればやり過ぎてはいけないのです。

融け合うコミュニティの壁
===========================

つまみぐい勉強法の執筆でもう１つ話題になったのが、Twitterの流行です。今までは「栃木県のRubyコミュニティに所属しています」のように、どこのコミュニティにいるか、というものがその人のパーソナリティを説明するのによく使われていました。どのメーリングリストにいます、どのフォーラムにいます、も類似のものですね。

Facebookはまだそれほどでもないですが、Twitterによって急に世界はフラットになりました。「友達の友達は友達」のような繋がりができやすくなり、組織よりも個人の個性の方が強くなってきました。

勉強会で大きな会場を提供してもらえる機会も増え、大人数が参加する勉強会も増えましたが、特に都内の場合は以前と違って「所属しているコミュニティの会合」という感覚は薄れてきていて(スタッフは除いて)、「流行のものの話を聞きに行く」という感覚が強くなってきているのではないでしょうかね？

PySpa
==========

勉強会を継続開催していると、同じメンバーが同じように毎回集まって近況報告する方がメインになってきたりもします。ああいう成れの果てがPySpaです。

PySpaというコミュニティは、Python温泉というプログラマーの慰安旅行的なものを何度か開催しつつ、ゆるくつながっているコミュニティです。たまに勉強会をしたり、忘年会もあったりはしますが、もはやPythonをやっていない、という人も多く(大多数？)、たまにPythonの話題が出ると「珍しくPythonの話をしているな」というコメントが出るぐらいです。

PySpaの運営的な話はVの字が書くと思うのでスルーするとして、参加者としてPySpaにいて感じることは、「常に勉強会をしている」感覚です。突然技術の議論が始まることもありますし、分からないことを詳しい人が教えてくれたりもしますし、新しい技術ネタやゲームやテレビ番組の話題が出たり・・・プリキュアとかの話をする人はいないですね。なぜか。スマホでSlackを覗くとそこに誰かがいる、というのは時間の制約がないので、特に家族持ちになるとありがたいです。場所や時間などの物理的な束縛はだんだんしにくくなってきますからね。あと、結構みんな適度に専門分野がバラバラなのが良いです。

そいういう場なので、特に運営だとかそういうものはないのですが、仕事も含めて、他の人がやっていなそうな新しいネタを提供できるようにいろいろ挑戦してみる、というのはやっています。見栄をはってもしょうがないので、自分の手を動かす。同じものをみんながやるのではなく、逆に多様性を強くしてバラバラにしていくことがPySpaのコミュニティの良さなんじゃないかと思っています。

PySpaそのものが万人にとって価値があるということはない(というか100人を超えた人数が同じチャットでコミュニケーションを取って活動するのは無理)ので、PySpaにみんな入ろうよ、というつもりはありません。このような「いつでも話せる仲間との場」というのも、かなり特殊な一形態だとは思いますが、そういう形のコミュニティもあるんだよ、というお話でした。

ぜひ、勉強会でつながった仲間とそのような方向性のコミュニティづくりをしてみてください。同じメンバーと顔を合わせる回数が比較的多くなる地方の方がやりやすいかも？
Raspberry PI 2 用の consul を作る (201512版

Dec.10.2015 - 追記
consul 0.6.0 が正式にリリースされましたが、バイナリ配布に ARM Linux が加わりました。
Raspberry Pi で動作させたいだけなら以下の手順は不要となっています。
***
自前サーバー群を consul にて管理し始めたので Raspberry Pi にも consul を入れたいと思いました。
ですが、Hashicorp でのバイナリ配布では ARM Linux がないのでソースコードからのビルドとなってしまいます。

RaspberryPi 版を作製するには下記の記事が大変参考になります。

「ARM版ConsulをAndroidスマートフォンなどで動作させる」
http://qiita.com/qb0c80aE/items/fb337ef46fc904a8f941

上記記事での consul は 0.5.0 なのですが、最新のコードをリポジトリから取得すると 0.6.0 RC2 となってしまいます。(2015/12/08 現在)
この 0.6.0 でのビルド事情が大分変わっているのでその修正分を記録しておこうというのが今回の記事となります。

# consul 0.6.0 のビルドで変わるところ

 - golang 1.5 以上が必須となります
 - golang 1.5 のビルドには golang 1.4 以上が必須となります
   - Raspbian のパッケージだと golang 1.3.3 なのでこれに頼らず自分で golang をビルドすることになります
 - golang 1.5 のクロスコンパイルはよくできているので、x64 の Linux 上でビルドが可能です
  - RaspberryPi でビルドするよりはるかに早く終わらせることができます

よって手順としては x86_64 の Linux 上で

1. golang 1.4 を gcc でビルド
2. golang 1.5 を 1.4 でビルド
3. consul のソースを github から clone
4. consul を golang 1.5 でビルド
5. golang のクロスコンパイラの種別分全部がクロスコンパイルされるので ARM Linux 版を RaspberryPi に転送して使用

とやるのがお勧めとなります。

# 手順

golang 1.4 のソースコードをクローンします

```
git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
```

ソースディレクトリに入りビルドを開始します

```
cd go1.4/src/
./make.bash
```

golang 1.5 のソースコードを取得します

```
wget https://storage.googleapis.com/golang/go1.5.2.src.tar.gz
tar xvf go1.5.2.src.tar.gz 
mv go go1.5
```

ソースディレクトリに入りビルドを開始します

```
cd go1.5/src/
./make.bash
```

go1.5 の bin にパスを通し、GOPATH を設定します

```
echo "PATH=\$PATH:\$HOME/go1.5/bin" >> ~/.bashrc
echo "PATH=\$PATH:\$HOME/go/bin" >> ~/.bashrc
echo "export GOPATH=$HOME/go" >> ~/.bashrc
mkdir go
source ~/.bashrc 
```

src ディレクトリを準備し、consul のソースコードを clone します

```
cd $GOPATH
mkdir -p src/github.com/hashicorp/
cd src/github.com/hashicorp/
git clone https://github.com/hashicorp/consul.git
```

consul をビルドします
zipコマンドを使うのでインストールしておいてください

```
cd consul/
make
```

ビルド完了後 pkg ディレクトリに各環境用バイナリができているので必要なものをコピーします。
使ってみたくなるディストロあれこれ

この記事はLinux Desktop Advent Calendar 2015の 8日目です。

みなさまLinuxをデスクトップで使ってますか。
MacやWindows10はとてもすてきなデスクトップ環境だと思います。
が、最近のLinuxも負けてはいません。

そんなわけで、すてきなデスクトップ環境なLinuxディストリビューションをいくつかご紹介します。
見た目にもいろいろ楽しいので、持て余しているPCがあれば、使ってみるのもよいかと思います！

（コメントは完全に主観なのであしからず。）
#個人的なお気に入り
## elemenyary OS
https://elementary.io/
![alt](http://distrowatch.com/images/cgfjoewdlbc/elementary.png)
[DistroWatch](http://distrowatch.com/table.php?distribution=elementary)ランキング: 17位(2015/12/08現在)

Ubuntuベースの、とても洗練されたエレガントなディストリビューション。
一見するとGnomeShellのようなUIですが、Parthenonというelementary独自のデスクトップ環境です。ブラウザも独自（ChromeベースのMidori）だったりします。
※もちろん他のブラウザをインストールすることもできますが。

全体的にまとまっていて、使いやすいディストリかと思います。

## Netrunner
http://www.netrunner.com/
![alt](http://distrowatch.com/images/slinks/netrunner.png)
[DistroWatch](http://distrowatch.com/table.php?distribution=netrunner)ランキング: 22位(2015/12/08現在)

最新のKDE（現時点での最新バージョンはPlasma 5.4.3）をつかうことができるディストリビューション。Kubuntuベース。
ひとむかし前のKDEはやぼったいイメージがあったのですが、
最近のKDEはすごく洗練されていて、とても使いやすいです。
Nertunnerは最新のKDEに追随しているので、GnomeShellはいまだにとっつきにくいところがある、という人にはKDEはすごくおすすめ。

## Manjaro
http://manjaro.org/
![alt](http://distrowatch.com/images/cgfjoewdlbc/manjaro.png)
[DistroWatch](http://distrowatch.com/table.php?distribution=manjaro)ランキング: 7位(2015/12/08現在)

ArchLinuxベースのディストリビューション。デスクトップ環境は豊富に選ぶことができ、GnomeShellからKDE、Xfce、Cinnamonなど、自由に選べます。
ただ個人的なイメージとしては、Xfceバージョンが強いかも。
Archベースなので、ローリング・リリース形式のディストロのため、
常に最新バージョンのソフトウェアが使えるのもいいところです。

## Antergos
http://www.antergos.com/
![alt](http://distrowatch.com/images/cgfjoewdlbc/antergos.png)
[DistroWatch](http://distrowatch.com/table.php?distribution=antergos)ランキング: 34位(2015/12/08現在)

ManjaroよりArchLinuxにより近いディストリビューション。もともとCinnarchというディストリビューションでした。
[Cnchi](https://github.com/Antergos/Cnchi)というグラフィカルインストーラが特徴で、
ArchLinuxをさくっとインストールして使いたいという人にもおすすめ。


# 今後に期待なもの
## Solus
https://solus-project.com/
![alt](http://distrowatch.com/images/cgfjoewdlbc/solus.png)
[DistroWatch](http://distrowatch.com/table.php?distribution=solus)ランキング: 48位(2015/12/08現在)

まだRC1の段階ですが、DistroWatchランキング48位と期待？されているディストロ。他のディストロをベースとしていない、独立系のディストロということもあり、今後がとても楽しみ。

## Apricity OS
https://apricityos.com/
elementaryっぽいような、gnome shellっぽいようなディストリビューション。まだbeta。

## Papyros
http://papyros.io/
マテリアルデザインなディストリビューション。まだalpha。

## Korora
https://kororaproject.org/
[Ozon OS](http://ozonos.github.io/)という開発中のディストロがあったのだけれど、
この記事書くにあたって久しぶりに覗いてみると、いつのまにかKororaに統合されておりました。。。
なので、ここに記載（試してない）。

Ozon OSの跡地はこちら。
https://github.com/ozonos


#まとめ
個人的に好みな（気になっている）Linuxデスクトップ向けディストロについて、いくつかまとめてみました。

「Linuxデスクトップどうなのよ」みたいなネタは定期的に話題にあがり、結果「まだ使えない」という結論になることが多いように思えます。
実際、万人受けはまだ難しいだろうなと思うのですが、例えば開発環境としてなら。。
例えば、ブラウザ、エディタ（EmacsやVimはもちろん、Atomなんかも動きますし）、あとはterminalがあればなんとかなる、という人はわりといるかもしれません。

そんなひとは選択肢の一つというか、試しにつかうのも楽しいと思いますよ！


##余談
Linux MintやUbuntu、Fedora、openSUSEなどはメジャーなので除外！
[tvOS]tvOS アプリケーション プログラミングガイド

<p>tvOSアプリケーション開発の日本語文書が公開された。これは助かる。</p>

<ul>
<li><a href="https://developer.apple.com/jp/documentation/General/Conceptual/AppleTV_PG/AppleTVOverview/AppleTVOverview.html">tvOS アプリケーション プログラミングガイド</a></li>
</ul>

<p>ざっと、自分にとってポイントになる点を列挙してみる。</p>

<ul>
<li>Apple TV Remoteを使っての操作上、フォーカスの制御が大事。なので、既存のiOSアプリをそのまま動作させることは難しい。</li>
<li>ゲームコントローラが接続されている可能性がある。制作するのがゲームでなくても、ゲームコントローラで操作されて問題ない？</li>
<li>Apple TV のユーザインタフェースガイドライン。iOSのままの操作でいいの？</li>
<li>リソース管理。ローカルに保存できるのはちょっとだけ。iCloudを使う。そして、ダウンロードしたリソースは削除される可能性があるので、それでも問題ないように作る。</li>
</ul>

<p>本日は電車トラブルで帰宅が深夜となってしまったので、続きは後日。</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://developer.apple.com/jp/documentation/General/Conceptual/AppleTV_PG/AppleTVOverview/AppleTVOverview.html">tvOS アプリケーション プログラミングガイド</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
Dockercon 15 SF 資料一覧

[DockerCon SF 2015: Ben Golub's Keynote Day 1]
(http://www.slideshare.net/Docker/dockercon-sf-2015-ben-golubs-keynote-day-1)
[DockerCon SF 2015: Keynote Day 1]
(http://www.slideshare.net/Docker/dockercon-sf-2015-keynote-day-1)
[DockerCon SF 2015: AWS w/ Deepak Singh]
(http://www.slideshare.net/Docker/dockercon-sf-2015-keynote-day-1-49845139)
[DockerCon SF 2015: Ben Golub's Keynote Day 2]
(http://www.slideshare.net/Docker/dockercon-15-keynote-day-2)
[DockerCon SF 2015: Docker at Lyft]
(http://www.slideshare.net/Docker/dockercon-sf-2015-faster-cheaper-)
[DockerCon SF 2015: Getting Started w/ Docker]
(http://www.slideshare.net/Docker/dockercon-sf-2015-getting-started-w-)
[DockerCon SF 2015: Orchestration for Sysadmins]
(http://www.slideshare.net/Docker/2015-dockercon-orchestrationsysadmins)
[DockerCon SF 2015: Networking Breakout]
(http://www.slideshare.net/Docker/dockercon-sf-2015-networking-breakout-)
[DockerCon SF 2015: Orchestration for Devs (machine + compose)]
(http://www.slideshare.net/Docker/dockercon-sf-2015-orchestration-for-devs-machine-)
[DockerCon SF 2015: How to talk to humans]
(http://www.slideshare.net/Docker/day-1-2-00-240how-to-talk-to-humans-different-approach-to-soft-skillssharon-steed)
[DockerCon SF 2015: AWS w/ Deepak Singh]
(http://www.slideshare.net/Docker/dockercon-sf-2015-keynote-day-1-)
[DockerCon SF 2015: Reliably shipping containers in a resource rich world using Titan]
(http://www.slideshare.net/Docker/dockercon-sf-2015-reliablilty-shippin)
[DockerCon SF 2015: Docker Security]
(http://www.slideshare.net/Docker/docker-security-for-)
[DockerCon SF 2015: Running Aground Debugging Docker in Production]
(http://www.slideshare.net/Docker/day-2-3-25-405running-aground-debugging-docker-in-productionbryan-cantrill)
Safety over EtherCAT


制御システムの話題です。

制御システムでは、通常のEthernetではなく産業用の特殊なプロトコル通信が行われています。

その種類は多岐にわたり、

+ PROFINET
+ EtherCAT
+ CC-Link
+ MECHATROLINK
+ ModBus
+ Sercos
+ ...

いろいろあるようです。

昨今、Industry4.0という言葉をIoT並みに聞くようになりましたが、制御システムも今やネットワーク化されクラウドにも繋がりつつあります。

2010年、イランのウラン濃縮工場に設置された遠心分離機が[Stuxnetウイルス](https://www.google.co.jp/search?q=Stuxnet%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9&oq=Stuxnet%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9&aqs=chrome..69i57.254j0j4&sourceid=chrome&es_sm=119&ie=UTF-8#q=Stuxnet)に感染した事件があったように、制御システムもセキュリティとは無縁ではありません。

(2018.11.16 追記 ここから)
セキュリティとセイフティ（機能安全）が混同されがちです。自分も見返してみると、元記事では混同した書き方をしておりました。失礼いたしました。
ここからは、機能安全の話です。なりすまし防止ではなく、安全に装置を停止させるための仕組みですね。
(2018.11.16 追記 ここまで)

例えば、EtherCATではSafetyという規格があります。IEC 61784-3で標準化されているものです。ただし、制御システムの場合、リアルタイム性が非常に重要ですので、計算に時間がかかっては問題です。インターネットの世界では「なりすまし」に対応するには認証方法として証明書だったり、一方向ハッシュ関数などを用いますが、制御の世界ではWatchDog TimerとCRCで担保するようです。つまり、ある一定時間(100msec程度ぽい?)でタイムアウトさせることで、 ~~なりすましさせないようにするようです。~~ 安全に停止できるようにしています。

EtherCATの仕組みを紹介しないと意味不明かもしれませんが、それはまたいずれ。


## 参考
+ [Overview Safety over EtherCAT (pdf)](http://www.ethercat.org/pdf/english/Safety_over_EtherCAT_Overview.pdf)
+ [Neue Kenngrößen in IEC 61784-3 Edition 3 (pdf)](https://www.vde.com/de/Veranstaltungen/konferenzen/vortraege/fs2013/Documents/15_Stripf.pdf)
+ [PROFIsafe System Description (pdf)](http://www.profibus.com/nc/download/technical-descriptions-books/downloads/profisafe-technology-and-application-system-description/download/9594/)
+ [通信とBlack Channel](http://www.zuken.co.jp/club_Z/z/safety/06/s_110929_4.html)


おわり。
[WebVR] 通常のWebサイトで利用するWebVR事例とその所感



この記事は[WebVR Advent Calendar 2015](http://qiita.com/advent-calendar/2015/webvr)の8日目の記事です。

そして立てたときに思ってたことですが、やっぱり登録が少ない( ;´Д`)
立てた責任として、ごく簡単な連載記事を13日週に書いてみようと思いますｗ

とりあえず今回は普通に書きます。

-------------------------------------------

今回の記事は、少し前に制作した[カヤックVR部](http://vr.kayac.com/)のサイトを作っての所感と、WebVR自体の使いドコロ、みたいなところを書いてみようと思います。

↓ちなみにサイトはこんな感じ。
[![カヤックVR部サイト](https://qiita-image-store.s3.amazonaws.com/0/5616/a99cf836-ce08-6aa0-7f1b-95bb4d7076ab.png "カヤックVR部サイト")](http://vr.kayac.com/)

## WebGLで普通のWebサイトを装う

サイトを見てもらうと分かりますが、ぱっと見は普通の、というよりむしろ一昔前な感じの構造をしたWebサイトに仕上がっています。
が、実はこのサイト、すべてのレンダリングをWebGLで行っています。

正直なことを言うと、モック作成からそのまま実サイトに仕上げてしまったのでいたるところが構造化されておらず、正直つらたんな感じのサイトになっちゃってます。（単純に力量の問題でもありますが）

## 普通のWebサイトをVRで見たらどうなるのか

ではなぜ、そんな中でWebGLでのレンダリングにしたのか。

このサイト、 **Oculus Riftで見れる**んです。

↓見るとこんな感じ。
![Oculus Riftで見た図](https://qiita-image-store.s3.amazonaws.com/0/5616/de3e13d7-25d6-6b49-3518-bfd37ed4e4c7.png "Oculus Riftで見た図")
[見た雰囲気が分かる動画](https://www.youtube.com/watch?v=0L-5vW6Cars&feature=youtu.be)も公開しています。

この、<del>どうでもいい</del> WebVR対応をしたかったがためにWebGLでレンダリングする、という暴挙に出たわけですｗ
VR部サイト立ち上げにあたって、どういうサイトにしたら面白いか、というブレストを行いました。
その中で、「普通のWebサイトをVRで見たらどうなるんだろう？」という話が持ち上がり、そこから色々とアイデアを出し合って今の形になりました。

実際にOculus Riftで見てもらうと分かりますが、意外と圧巻です。
サイトの一番下に移動してからOculus Modeを起動すると、まるで目の前に高層ビルでもあるのかっていうくらい高くそびえ立つWebサイトが眼前に広がります。

Webサイトってこんなにも巨大なものだったのか、と思わされること必至です。


## VRならではの見せドコロ

普通に見上げるだけだとそれで終わり、となってしまいますが、VR空間、つまり実際にWebサイトに自分が入り込んだらどう見えるのか、ということを徹底的に考えて、色々な小細工を仕込んでありますｗ

例えば、普段なにげなく行っている「マウスで選択してクリックする」とはどういうことか。
そんなことを真面目に考えました。
出した結論は、「きっと通信するためになにか信号を飛ばしているんだろう」ということで、マウスからレーザーが発射されている様子を見ることが出来ますｗ

さらに動画紹介のエリアでは、リアプロジェクタで投影されていると仮定して、VRならではの動きとして動画の「裏側」に行くことができます。
すると、リアプロジェクタの光がちらちらと動いているのが分かります。
（そしてその光の中に入って振り返ると、動画に自分の頭の影が映る、という小細工もあったりしますｗ）


## 今後のVRの活用

ただ正直なところ、今後VRをWebで活用するにはどうしたらいいのだろうか、というのは自分の中で答えは出ていません。
しかし実装してみて思ったのはとても手軽にVR体験を構築することができる、ということです。

そして意外にも **モバイルと相性がいい！** という気付きがありました。

実はこのサイト、WebVR対応としながら、さらにモバイルでもVR体験ができるように仕組んでいます。
最近特に、ハコスコやGoogleのCardboardに続く様々な[モバイルVRデバイス](http://www.amazon.co.jp/gp/product/B00V3A3UDU/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00V3A3UDU&linkCode=as2&tag=edom18-22)が発売されています。
（2000〜3000円で買えるものがほとんどなので手軽に試せるのもポイント）

↓こんな感じのやつです。
[![VR 3Dメガネ セット](https://qiita-image-store.s3.amazonaws.com/0/5616/426e2b5f-207b-a3b6-6eb3-1074a9c985a9.png "VR 3Dメガネ セット")](http://www.amazon.co.jp/gp/product/B00V3A3UDU/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00V3A3UDU&linkCode=as2&tag=edom18-22)



これらのデバイスを持っている人であればVR体験をすることが可能になっています。

そして大事なポイントとして、 **ほぼワンソースでOculus Riftとモバイルの両対応が行えている** という点です。
これは従来のVRコンテンツにはないメリットだと思います。

「[レスポンシブなVR](http://codezine.jp/article/detail/9073)」なんていう意見があったりするなど、VRが一般化すればするほどこうした考え方は重要になってくると感じています。
つまり、デバイスに関わらず同じ体験ができるということ。

WebVRの登場によって、こうした敷居はどんどん下がっていくと思います。
そしていずれは **商品をVRモードで確認できる機能がECサイトには標準搭載** になるだろうな、とも思っています。（というかそうなってほしい）


## Firefoxに標準搭載されたWebVR

![MozVR](https://qiita-image-store.s3.amazonaws.com/0/5616/898958d4-07cf-18fa-aa04-83d283d86488.jpeg "MozVR")


そして喜ばしいことに、先のFirefoxのカンファレンスで少し触れられましたが、Firefoxの安定版ですでにWebVRの実装が取り込まれています。
このことからも、ブラウザベンダもかなり力を入れていることが伺えます。

VR大好きな人たちでぜひ、WebVRも盛り上げていきましょう！
勉強のためNode.jsのフレームワークであるexpressで簡単なサンプルアプリを作成

![](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)  

- [express公式サイト：英語](http://expressjs.com/en/)
- [express公式サイト：日本語](http://expressjs.com/ja/)
- [npm - express](https://www.npmjs.com/package/express)

*Node.jsのための、高速で軽量なWebフレームワーク*

***

###expressのインストール  
```
$ npm install express
```


###サンプルコード  

app.jsファイルを作成し、下記コードを記入

```js:app.js
var express = require('express')  
var app = express()  
app.get('/', function(req,res){  
  res.send('Hello World')  
})  

app.listen(3000)
```

```
$ node app.js  
```  

ブラウザで [localhost:3000](http://localhost:3000/) を入力すると、Hello Worldが出力される


***

###expressのジェネレーターを使用して、アプリの雛形を作成

[express application generator](https://github.com/expressjs/generator)

```
$ npm install -g express-generator  
$ express testProject  
$ npm install   
$ npm start  
> testProject@0.0.0 start /Users/xxx/testProject  
> node ./bin/www  
```


ブラウザで [localhost:3000](http://localhost:3000/) を入力すると、Welcome to Expressが表示される

![スクリーンショット 2015-12-08 0.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/88331/d03856e1-f77d-7b48-5e9b-3d6572143a0d.png)


***
###express-generatorのインストールオプション
<dl>
	<dt>-h, --help<dt>
	<dd>ヘルプ  </dd>
      <dt>-V, --version<dt>
      <dd>バージョン</dd>
      <dt>-e, --ejs</dt>
      <dd>デフォルト(jade)のテンプレートをejsに変更</dd>
      <dt>-c, --css (engine)</dt>
      <dd>スタイルシートの指定 (less|stylus|compass|sass)     *デフォルトは普通のCSS</dd>
</dl>

***

### expressコマンドで生成されるファイル

```
$ express myapp

   create : myapp
   create : myapp/package.json
   create : myapp/app.js
   create : myapp/public
   create : myapp/public/javascripts
   create : myapp/public/images
   create : myapp/routes
   create : myapp/routes/index.js
   create : myapp/routes/users.js
   create : myapp/public/stylesheets
   create : myapp/public/stylesheets/style.css
   create : myapp/views
   create : myapp/views/index.jade
   create : myapp/views/layout.jade
   create : myapp/views/error.jade
   create : myapp/bin
   create : myapp/bin/www
```

###出力されたファイルの構造

```
.  
├── app.js  
├── bin  
│   └── www  
├── package.json  
├── public  
│   ├── images  
│   ├── javascripts  
│   └── stylesheets  
│       └── style.css  
├── routes  
│   ├── index.js  
│   └── users.js  
└── views  
    ├── error.jade  
    ├── index.jade  
    └── layout.jade  
  
7 directories, 9 files  
```
ESP-WROOM-02 + ArduinoOTAでスケッチのWiFi経由アップロード

ESP-WROOM-02がArduinoで開発できとても便利ですが、今回Arduino CoreにOTA(Over The Air, Wifi経由書き込み)の機能が取り込まれました。スケッチを書き込む際にUSBケーブルを繋ぐ必要もなくなり、開発が更に便利になりそうです。

##環境のセットアップ
今回はMacを使いましたが、Windowsでも大した違いはないと思います。
Wifiモジュールのセットアップは大量に情報がありますが、今回の回路はこんな感じにしてみました。
[秋月電子で買えるパーツでESP-WROOM-02のArduino開発環境セットアップ](http://qiita.com/minori24/items/87702bc1b997cd159923)

Arduino IDEに導入するESP8266 Arduino Coreは、Stable ReleaseにOTA機能が取り込まれたVersion 2.0.0(11/30更新)以降を使用します。ESP8266をセットアップする際にこれ以前のバージョンが導入された場合はBoard Managerから更新できるようです。

また、Python2.7も必要です。3.5では動きません。
CoreとPythonを入れたらArduino IDEを再起動しておきましょう。

##OTA対応スケッチの準備
まず、OTAに対応したスケッチを通常のUART経由で書き込む必要があります。
Arduino IDEにCoreを導入すると、「スケッチの例」に「BasicOTA」というスケッチが追加されているはずです。スケッチの中に接続先のSSIDとパスワードを書き込んでおきます。
![BasicOTA.png](https://qiita-image-store.s3.amazonaws.com/0/103148/815a424d-f04c-5136-cef2-c6b0fb36da90.png)
##OTAスケッチを書き込む
スケッチを書き換えたら、Wifiモジュールに書き込みます。
USBシリアルをPCに接続し、WifiモジュールをUART Download Modeで起動します。
ボードの設定はこんな感じ。
![Board_Settings.png](https://qiita-image-store.s3.amazonaws.com/0/103148/758fdf3e-a9bc-2515-cbb8-3b39aa1abe05.png)
シリアルモニタを開き、UARTのボーレートを115200に設定してモニタは開いたままにしておきます。
Arduino IDEの書き込みボタンを押すとUART Downloadが開始されます。書き込みが完了すると自動でリブートがかかり、アクセスポイントへの接続がうまくいけばこのように表示されるはずです。
![serial monitor.png](https://qiita-image-store.s3.amazonaws.com/0/103148/0334016e-9a9a-8aba-497e-f30738f41ef5.png)
これでOTA対応のスケッチ書き込みは終了です。今後OTAでスケッチを書き込むにはBasicOTAのソースコードが最低限必要になるので、BasicOTAのソースを改変しながら必要なコードを書き加えていくことになります。

##OTAでスケッチを書き込んでみる
OTAでスケッチを書き込むには、まずRST SWを押してWifiモジュールをFlash Boot Modeで起動します。
Arduino IDEが起動されているPCとWifiモジュールが同じネットワーク上にいる場合、このように"Network Ports"が表示されるはずです。Wifiモジュールが見つからない場合はArduino IDEを開きなおしてみましょう。
![OTA.png](https://qiita-image-store.s3.amazonaws.com/0/103148/8f1cb057-ebfe-9ccd-92e6-ad0b6d1ae306.png)

Wifiモジュールが見つかったら、先ほどのBasicOTAスケッチにLチカを入れたコードをOTA経由で書き込んでみます。

```cpp:BasicOTAwithBlink.ino
#define ledPin 13

void setup() {
  //----BasicOTAのコード---//
  //         ...
  //---------------------//
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
}

void loop() {
  ArduinoOTA.handle();
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(500);
}

```

ArduinoOTA.handle()はOTAを待ち受けるメソッドのようなので、消さずに残しておきます。
設定は以下のような感じで、WifiモジュールのIO13にLEDを繋いでおきましょう。

* Upload Using: "OTA"
* ポート: "esp8266 at ***" 

この部分だけ変更します。

![OTA Upload.png](https://qiita-image-store.s3.amazonaws.com/0/103148/87cfc616-fdd3-bade-b69e-f766424ba3e5.png)

ここまできたら、Arduino IDEの書き込みボタンを押すとアップロードが始まります。
![OTA_Upload.png](https://qiita-image-store.s3.amazonaws.com/0/103148/07cabc6e-4284-b3c1-c689-b5eb58a182c8.png)

正常にアップロードが終わるとWifiモジュールが自動的に再起動し、アクセスポイントに接続されるとLEDが点滅するはずです。
スケッチにOTAの処理コードを含んでいる限り、これ以降のOTAは同様の手順で行えます。

##OTAの制約
ArduinoOTAでは、現在走っているスケッチに加えて新しいスケッチをロードするのでUART経由より余分な容量を必要とします。元々のドキュメントを詳しく読んでないのでどの程度必要なのかはわかりませんが。

また、今回のセットアップではセキュリティを一切考慮していません。機能としてはパスワードやアップロード元ホストの制限を設定することが可能なようです。


##参考
[OTA Updates](https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/ota_updates.md)
CentOS 7にて環境を作ったけど、ゲストOSからIP指定でアクセスしてもアクセスできない件


##切ない瞬間...
![Capture 2015-12-07 23.14.02.png](https://qiita-image-store.s3.amazonaws.com/0/65994/c02f464d-2399-9a2c-e978-d5b5bede0b6b.png "Capture 2015-12-07 23.14.02.png")


##まず試すこと
`````ホストOS
curl [ホストOSのIP]
`````

![Capture 2015-12-07 23.15.49.png](https://qiita-image-store.s3.amazonaws.com/0/65994/2b1c2ffc-9346-5210-df2e-a3659f724dc9.png "Capture 2015-12-07 23.15.49.png")


表示されるであろうHTML等がコンソールに表示されたら、
環境自体はうまくできている可能性が高く、問題は他にあるハズ。
要は、firewalldで穴あけをしていないのでは？（察し
(nginxを題材としています)

## firewalldってなんぞ？
CentOS6.xまでは iptables でフィルタするのが一般的だったけど、
CentOS7.xからは firewalld で制御する。

## 具体的に何をすればよい？
2通り解決方法があるように思います。

###[対処法①] firewalldで、フィルタから除外する
`````ホストOS
vi /etc/firewalld/zones/public.xml
`````
`````ホストOS-public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="dhcpv6-client"/>
  <service name="ssh"/>
  <port protocol="tcp" port="80"/>  <!-- ポート80番をフィルタから除外する -->
  <port protocol="tcp" port="5601"/>
  <port protocol="tcp" port="9200"/>
</zone>
`````

wq!したら、

`````ホストOS
systemctl restart firewalld
`````

###[対処法②] firewalldをOFFにする

`````ホストOS
systemctl stop firewalld
`````

##最後に
環境構築における問題の切り分け観点として、
頭の片隅に置いておくとよさげ。
簡単にseekRで検索できるようにする (Chrome)

Chromeの検索エンジンの機能を使う
seekRに限らず、いろいろなサイトで使える

Chromeの設定 -> 検索 [検索エンジンの管理] -> その他の検索エンジンに以下を追加

検索エンジン: `seekR`
キーワード: `r`
URL: `https://cse.google.co.jp/cse?q=%s&cx=partner-pub-6801897182966827%3A61726vqhhgw&ie=utf-8&hl=ja`
（↑ 検索したあとのURLのquery部分を`%s`で置き換えるだけ）
![chrome_search_engine_settings.png](https://qiita-image-store.s3.amazonaws.com/0/5764/c02c40da-6562-74af-a6b1-70c6499cd531.png)

あとはChromeの検索（アドレス）バーで
`r` + スペースまたはタブ + 検索キーワード
![seekR.gif](https://qiita-image-store.s3.amazonaws.com/0/5764/245409fb-37bb-406d-2ecf-fea7d0cac01a.gif)
man zshroadmapを読もう

[zshのmanページを読んで解説しようという企画](http://qiita.com/mollifier/items/b8e5b1eb90e0f9307ea4)の2回目です。manページを読んで大事なところを紹介したり解説したりします。

今回は、`man zshroadmap(1)`を読みます。ここにはzshの代表的な機能の紹介と、詳細を知りたいときにどのmanページを読めばよいのかが書かれています。zshを使い始めたけど何が便利なのかが分からないという人は、このページをとっかかりにしてよさそうな機能を探してみるとはかどるでしょう。

それでは、さっそく読んでいきましょう。

## WHEN THE SHELL STARTS(シェルの起動処理)
zshは起動時に色々なファイルを読み込みます。これらのファイルは設定をカスタマイズするためにあります。`man zsh(1)`の「Startup/Shutdown  Files」の節に詳細が書いてあります。

## INTERACTIVE USE(対話的な使いかた)
シェルを対話的に操作するためには、ZLEと呼ばれるzsh組み込みのコマンドラインエディタを使用します。これについては`man zshzle(1)`に詳細が書かれています。

過去に入力した行の内容を取り出すために、履歴機能があります。ただし、zshは他のシェルと違って、ユーザーがシェル変数に値を設定しないかぎり履歴を保存しません。これらの詳細については`man zshparam(1)`のHISTFILE, HISTSIZE and SAVEHISTを参照してください。

### Completion(補完)
zshも含めて多くのシェルには補完機能があって、一部分を入力しただけでシェルが残りの部分を入力してくれます。zshの補完機能はプログラムによって拡張できます。拡張機能の詳細については`man zshcompsys(1)`を参照してください。

### Extending the line editor(コマンドライン編集機能を拡張する)
zshのコマンドライン編集機能はシェル関数によって拡張できます。実際、zshには便利な関数がすでに含まれています。詳細については`man zshcontrib(1)`のZLE Functionsを参照してください。

## OPTIONS(オプション)
zshにはシェルの動作を変えるためのオプションが大量にあります。
それらを理解するためには完全なドキュメントを読むのが良い方法です。
`man zshoptions(1)`を読んでください。

## PATTERN MATCHING(パターンマッチ)
zshには、ファイル名にマッチさせるためのさまざまなパターンが用意されています。例えば`**`(任意の階層のサブディレクトリにマッチする)、`~`、`^`(除外するパターンを指定する)などがあります。詳細については`man zshexpn(1)`のFilename Generationを参照してください。

## GENERAL COMMENTS ON SYNTAX(構文について)
zshの基本的な構文については`man zshmisc(1)`のShell Grammarの節に書いてあります。

## PROGRAMMING(プログラミング)
zshを拡張するための一番便利な方法は、zshの関数を書いてそれをautoloadできるようにすることです。関数については`man zshmisc(1)`のFunctionsの節に詳細が書いてあります。

## 最後に
今回はzshroadmap(1)を読みました。紹介ページなので難しい説明もなくて、分量も少なめです。ざっと読んでみて知らない機能があったら試してみると良いと思います!
Enterprise Licence Manager APIの実行結果（有償版）

GoogleAppsScript Advent Calendar 2015 3日目の記事を受けて実際に実行してみました。
無償版では使えないということで、有償版で実行した結果を載せています。



##元記事
Google Apps ScriptでEnterprise Licence Manager APIを叩く
http://qiita.com/ttyokoyama/items/ea8859fef7bdbbe51001


実行前の準備については元記事を参照ください。

#ライセンス一覧の取得

※ログ出力の部分を一部変えています。

```js:コード.gs
function myFunction() {
  var pageToken;

  var list = AdminLicenseManager.LicenseAssignments
  .listForProduct('Google-Apps', '<your domain>', {maxResults: 500,
                                                  pageToken: pageToken});
  
  for(var i = 0; i < list.items.length; i++) {
    Logger.log({
      productId: list.items[i].productId,
      skuId: list.items[i].skuId
    });
    Logger.log("-----------------");
  }
}
```

##実行結果
割り当てているライセンスの一覧が取得できました。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/7695/769be279-973a-4444-fe40-a141a7749fa7.png)


#ライセンスの削除

元記事では「これはできない」と記載されていましたが、管理コンソールからお支払い→ライセンスの管理と進んで、自動ライセンス割当を解除したらライセンスを削除することが出来ました。
※こうすればできるよというだけで、通常は自動割当で問題ないと思います。

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/7695/20e896c7-07b4-21da-770e-2047a3aed6fd.png)


```js:コード.gs

function deletesample() {
  AdminLicenseManager.LicenseAssignments.remove("Google-Apps", "Google-Apps-Unlimited", "<your account>");
}
```

なおvoidのため戻り値はありません。
##実行結果

実行前
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/7695/d2e3add2-1de1-c614-ea14-9bfe7f1d93ef.png)

実行後
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/7695/8039ffd5-b90b-ae5e-94ca-1ee602246d55.png)


ライセンスが割り当てられていないと、ログインしてもメールやドライブなどのサービスへのアクセス権がないということで使えません。


#ライセンスの更新

第1引数が変更後のライセンスで、後ろは現在のライセンスのproductId,skuIdを渡します。
※実行環境の都合で元記事から変更するライセンスの部分を変えています。

```js:コード.gs
function updatesample() {

  var res = AdminLicenseManager.LicenseAssignments.update({productId: "Google-Vault",
                                                           skuId: "Google-Vault-Former-Employee",
                                                           userId: "<your account>"}
                                                          , "Google-Vault", "Google-Vault", "<your account>");
  Logger.log(res);
}
```

##実行結果
実行前
![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/7695/c52876fe-83cb-93f7-e608-9bb6f6e9f5e8.png)

実行後
![ss6.png](https://qiita-image-store.s3.amazonaws.com/0/7695/c7fd70ec-1056-da1d-c940-b9d964713d21.png)


#まとめ
実行した結果です。
契約によって使えるライセンスが違ったりするので必ずしもサンプルコードで動くとは限りません。

自分はユーザー退職時のアカウント停止自動化で元従業員ライセンスを割り当てる部分を使用しています。
plotly の紹介


# plotly とは

[plotly](https://plot.ly/) はデータ可視化のためのプラットフォームです。
基本的に無料で利用することが可能です。

(可視化結果の

- 入出力データのプライベートなクラウドホストや共有
- SVG, PDF, EPS 形式での保存

もしくは「APIを頻繁に叩く」といった場合は有料プランへの加入が必要です。詳細は後述します。)

その可視化結果はインタラクティブに操作可能であり

- 棒グラフ
- 地図
- 箱ひげ図
- ヒストグラム

といった図に対し

- マウスオーバーでのデータ内容の表示
- ズーム、パン 

が可能、という特徴があります。

またデータ可視化における主要言語

- R
- Python
- MATLAB

のクライアントが提供されており、この他にも

- Excel
- Julia
- Igor
- Spotfire
- Nodejs
- Ruby
- Go
- F#
- Arduino や Rasberry PI のようなハードウェア

用にplotlyのAPIを叩くライブラリ、実例が提供されています。

https://plot.ly/api/

## APIについて

前述した「APIを頻繁に叩く場合は有料プランへの加入が必要」の詳細ですが
上記のクライアントリストの内

- APIを叩くもの (リモートのplotlyのサーバとの通信を行う)
- ローカルの plotly のjavascript ライブラリ「plotly.js」を利用するもの (セルフホスト)

があり後者の場合はどれだけ使っても無料です。
後者にとって大きかったのが今年11月17日に発表された [plotly.js のオープンソース化](https://plot.ly/javascript/open-source-announcement/) です。

## plotly.js のオープンソース化

plotly.js のオープンソース化が行われることで下記の実現が可能になりました。

- javascriptライブラリのフル機能の利用 (かつては3Dプロットは有料だった)
- クライアントからのplotly.jsの完全ローカル利用 (API制限を気にする必要がなくなった)

ソースコードはgithubで公開されています。
https://github.com/plotly/plotly.js

## RStudio 内での plotly を用いた可視化

plotly.js のオープンソース化の恩恵の実例として「RStudio 内での plotly を用いた可視化」を行ってみます。
下記の3ステップを行ってみてください。

1. R でライブラリ名 **plotly** をインストール
2. オフラインにする (APIを叩くには勿論ID情報などが要るかと思うのですが絶対にリモートサーバをcallしていないことを確認するために) 
3. 下記のコードをRStudioで実行

```r
library(plotly)
plot_ly(z = volcano, type = "surface")
```

下記画像のような可視化が(plotlyのサーバをcallすることなく)オフラインでも実現できているかと思います。

![Screenshot 2015-12-07 06.58.55.png](https://qiita-image-store.s3.amazonaws.com/0/7591/c11643d5-74fc-6de4-f33f-bc6bd3dad33b.png)

## まとめ

- plotly の概要
- plotly.js のオープンソース化とその恩恵を示す例

を中心にplotlyの紹介をしました。

R や Python から利用でき、インタラクティブな可視化を実現するものというと
これまでは「オープンソースである」という点で plotly ではなく [bokeh](http://bokeh.pydata.org/en/latest/) を利用されていた方もいるのではないでしょうか。
例に示したように plotly は bokeh がまだサポートしていない3Dプロットの可視化もできます。
plotly.js を活用していくことで可視化分野が今後さらにアクティブになることを期待しています。
AWS IoTから NumericなRangeKeyを持つDynamoDBテーブルへput-itemをする方法

注意：2015年12月の時点の情報す。改善されるはずです

概要
====

AWS IoTはDynamoDBへput-itemできますが、[NumericなRange keyを持つDynamoDBテーブルへput-itemができない](https://forums.aws.amazon.com/thread.jspa?messageID=689608)という制約があります
ですが、Lambdaをつかって変換することでput-itemできるので、その方法です

論よりコード
==========

検証用のDynamoDBテーブル作成
------------------

`id` というPrimaryKey(String型)と `timestamp` という RangeKey(Numeric型) を持つ `demo_dynamo_table` というDynamoDBテーブルを作成

```bash:DynamoDBテーブル作成
$ aws dynamodb create-table --table-name demo_dynamo_table \
  --attribute-definitions AttributeName=id,AttributeType=S \
    AttributeName=timestamp,AttributeType=N \
  --key-schema AttributeName=id,KeyType=HASH \
    AttributeName=timestamp,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
```

上記テーブルへput-itemするLambdaを作成
----------------------------------

ここでのポイントは `event` です。これには AWS IoT から送られてきたデータが入っています

```javascript:Lambda(put_item_to_dynamodb)
var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    var r = {
        "TableName": "demo_dynamo_table",
        "Item": {
            "id": event.id,
            "timestamp": parseInt(event.timestamp, 10),
            "field0": event.field0,
            "field1": event.field1
        }
    };
    dynamo.putItem(r, context.done);
}
```

AWS IoTのルールを作成
-------------------

トピック `topics/device0` に着信したデータを先のLambdaファンクションへ流す設定をします

json:AWS IoT ルール

* Rule Query Statement: `SELECT * FROM 'topics/device0`
* Action: Lambda ⇛ `put_item_to_dynamodb`

どんなエラーが吐かれているのか？
===========================

ちなみに AWS IoTから直接NumericなRangeKeyを持つテーブルへPut-itemすると、CloudWatchに下記のエラーが出力されます

```
2015-10-22 03:40:58.468 ... [ERROR] EVENT:DynamoActionFailure TOPICNAME:topics/device0 CLIENTID:... MESSAGE:Failed to put Dynamo record. The error received was One or more parameter values were invalid: Type mismatch for key id expected: N actual: S (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: DLQQIDMIGM2SGF3Q5GN0ISTIHNVV4KQNSO5AEMVJF66Q9ASUAAJG). Message arrived on: topics/device0, Action: dynamo, Table: demo_dynamo_table, HashKeyField: device0_id, HashKeyValue: device0_id, RangeKeyField: device0_timestamp, RangeKeyValue: device0_timestamp
```

あとがき
======

IoTのデータってtimestampベースなものが多いと思うので、これは是非とも対応してもらいたい。。。