OmniAICreator/Qiita-1.07M huggingface dataset:
rubotyのbotをSlackでkick => inviteする ruboty-reinvite を作成しました #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
rubotyのbotをSlackでkick => inviteする ruboty-reinvite を作成しました

## <i class="fa fa-cube" style="font-size:1em;"></i> 用途
局所的に必要な機能なのですが某所のrubotyが急にListenしなくなる、
という現象がありまして、それを解決するには `kick` - `invite` をし直す必要があります。
しかも、一般ユーザーは権限によって `kick` ができないため都度管理者に依頼する必要があります。
そこで再inviteを行う **ruboty plugin** を作ることにしました。

## <i class="fa fa-cube" style="font-size:1em;"></i> Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruboty-reinvite'
```

And then execute:

    $ bundle

## <i class="fa fa-terminal" style="font-size:1em;"></i> Commands

|Command|Pattern|Description|
|:--|:--|:--|
|reinvite|reinvite #<?channel>(.+)|kick and invite bot|

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Usage
### reinvite
* kick and invite bot

~~~
reinvite #times_tb
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i> ENV
Slack の Token は https://api.slack.com/web で作成・確認します

|Name|Description|
|:--|:--|
|SLACK_API_TOKEN|SlackAPI Token|

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Dependency

|Name|Description|
|:--|:--|
|Slack API|https://api.slack.com/|
|Slack API Ruby Client|https://github.com/aki017/slack-ruby-gem|

## <i class="fa fa-pencil" style="font-size:1em;"></i> メモ
ちなみにこの gem の作成・この記事の作成・GitHubのREADMEの作成には

* **ruboty-gen**
* **ruboty-megen**
* **ruboty-articlegen** 

を使いました。
詳しくは下記を参照。

[Ruboty | 各種 Generator を利用して Ruboty のプロダクトコード・README・Qiita記事の作成コストを下げる ](http://qiita.com/tbpgr/items/1987fef9bb228b07e5eb)

ちなみに、 **ruboty-gen** は保守が停止しているみたいなのですが今実行するとエラーがでます。
プルリクエストの内容を適用して1行コメントアウトすると動作するようになります。

[ruboty-gen pull request #5](https://github.com/blockgiven/ruboty-gen/pull/5/files)

余力があるときに同等の機能をもつ generator を作るかも。

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-reinvite GitHub](https://github.com/tbpgr/ruboty-reinvite)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-reinvite RubyGems](https://rubygems.org/gems/ruboty-reinvite)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [aki017/slack-ruby-gem RubyGems](https://github.com/aki017/slack-ruby-gem)
JavaScript本に書いてあった簡単な図形描画をMathematicaで

Mathematicaの記事にいきなりJavaScriptで恐縮です。

「[オブジェクト指向JavaScript](http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91JavaScript-Stoyan-Stefanov/dp/4048706705)」という本に

> 割り算の余りを計算する演算子を利用して、雪の結晶のような形状を作るサンプルを紹介します。

と以下のコードが掲載されていました。

```js:dashed_grid.js
var res = '\n', i, j;
for(i = 1; i <= 7; i++) {
  for(j = 1; j < 15; j++) {
    res += (i * j) % 8 ? ' ' : '*';
  }
  res+= '\n';
}
```

実行すると以下のような文字列が出力されます。

```text
"
       *      
   *   *   *  
       *      
 * * * * * * *
       *      
   *   *   *  
       *      
"
```

これを（canvasでもいいのですが）Mathematicaで描いてみました。

```mathematica:dashed_grid.nb
ArrayPlot[Table[Boole[Divisible[i j, 128]], {i, 1, 255}, {j, 1, 255}], PixelConstrained -> True, Frame -> False]
```

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/butchi_y">@butchi_y</a> (More info: <a href="https://t.co/HBUuaZOB3w">https://t.co/HBUuaZOB3w</a>) <a href="https://twitter.com/hashtag/wolframlang?src=hash">#wolframlang</a> <a href="https://t.co/EvdXebLC89">pic.twitter.com/EvdXebLC89</a></p>&mdash; Tweet-a-Program (@wolframtap) <a href="https://twitter.com/wolframtap/status/679322456709079040">2015, 12月 22</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こんなです。
なんだか罫線に応用できそうですね。
Ubuntu 15.10 で TOPPERS/ASP 用コンフィギュレータをビルドする

# はじめに

私は、特に TOPPERS/ASP などの uITRON の専門家ではないため、あまりよく分かっていないことをご容赦ください。

# ビルド

* Ubuntu Mate 15.10 x86_64 (Desktop, 64-bit)
* TOPPERS/ASP カーネル用コンフィギュレータ Release 1.9.4
    * [TOPPERS新世代カーネル用コンフィギュレータ](https://www.toppers.jp/cfg-download.html)
* g++ 5.2.1
* boost 1.58.0
    * see /usr/include/boost/version.hpp

```
$ sudo apt-get install libboost-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev
```

```
$ tar xvfJ cfg-1.9.4.tar.gz
$ cd cfg
```

ここにある README.txt にビルド手順や使い方などが記載されています。

Boost C++ ライブラリのあるディレクトリを configure に追加します。

```
$ vi configure
```

```lang:configure
# Boost C++ Librariesのライブラリファイルがあるディレクトリをサーチ
for dir in $library_path "/usr/local/lib" "/opt/local/lib" "/opt/lib" "/usr/lib" "/lib" "/mingw/lib" "/usr/lib/x86_64-linux-gnu"
```

```
$ ./configure

sh: 11: 105800: not found
sh: 11: 1_58: not found
LIBBOOST_SUFFIX=
BOOST_VERSION=
BOOST_DIR=/usr/include
XERCES_DIR=/usr/include
LIBBOOST_DIR=/usr/lib/x86_64-linux-gnu
LIBXERCES_DIR=/usr/lib/x86_64-linux-gnu
OPTIONS=
```

not found と表示されましたが、エラーではないのでしょうか...
次の make は成功しているようにみえます。

```
$ make
```

cfg ディレクトリの下にバイナリ cfg (cfg/cfg/cfg) ができています。

```
$ cd cfg
$ file cfg

cfg: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=xxx, not stripped
```

この cfg を所定の場所に配置して、利用します。

# おわりに

上記 not found 等、どなたかご存知の方、教えて頂けると幸いです。
Excelファイルの中でjinja2テンプレートを使う


# 背景

システム開発をやっていると、Excelで書かれたドキュメントを書かせていただく機会がしばしばあります。
場合によっては、下記のようにほとんど同じ内容のファイルを大量に作らなければならないケースも、稀によくあります。


八百屋買い物手順書.xlsx
![yaoya.png](https://qiita-image-store.s3.amazonaws.com/0/41617/efbb93ac-1e8a-aeb1-3dac-0c20648e87fb.png "yaoya.png")

魚屋買い物手順書.xlsx
![sakanaya.png](https://qiita-image-store.s3.amazonaws.com/0/41617/39b871b9-7f53-6a9f-d653-42db4e644647.png "sakanaya.png")

上記の2つは、買いに行く店と、買う物を除いてまったく同じ内容です。

このような場合、「八百屋買い物手順書を作成してから、文字列置換によって魚屋バージョンを作成する」という方法がありますが、Excelの貧弱な置換機能では実現できない場合もあり、泣く泣く手動による置換(いわゆる手sed)を敢行する場合も多いのではないかと思います。

そこで、Pythonからxlsxファイルを読み書きする[openpyxl](https://openpyxl.readthedocs.org/en/default/)と、Pythonの代表的なテンプレートエンジン[jinja2](http://jinja.pocoo.org/docs/dev/)を使って、Excelファイル内のテキストをテンプレートで生成することを試してみました。

https://gist.github.com/kokumura/c44970102e1f33685152

```sh:
pyxl.py [jinjaテンプレートを含むxlsxファイル名] [出力ファイル名] [テンプレート変数(YAML)]
```

このように実行することで、元のxlsxファイルに含まれる全シートの全セルを走査し、jinja2テンプレートが含まれていれば展開し、結果を別のファイルに出力します。

# 使い方

まず、Excelを使って下記のようなテンプレートファイルを用意します。
文法は[jinja2](http://jinja.pocoo.org/docs/dev/templates/)そのものです。

template.xlsx
![template.png](https://qiita-image-store.s3.amazonaws.com/0/41617/e6a523db-9cf2-46b7-5bd8-9c229d34fb4e.png "template.png")

テンプレートで使う変数をYAMLで記述します。

```yasai.yml
---
place: 八百屋
targets:
  - name: みかん
    num:  3
  - name: りんご
    num:  2
  - name: にんじん
    num:  1

```

```sakana.yml
---
place: 魚屋
targets:
  - name: さんま
    num:  2
  - name: いか
    num:  1
  - name: たこ
    num:  1
```

下記のように実行することで、template.xlsxとYAMLファイルから、「八百屋買い物手順書.xlsx」「魚屋買い物手順書.xlsx」が生成されます。
めでたしめでたし。

```
python xljj.py template.xlsx 八百屋買い物手順書.xlsx yasai.yml
python xljj.py template.xlsx 魚屋買い物手順書.xlsx sakana.yml
```

---

# おまけ

openpyxlは案外多機能で、頑張ればスタイルなども変更することができます。
ただし、ドキュメントがあまり充実していないので、ドキュメントに明記されていない機能や、プライベートメソッドを呼ぶ覚悟も時には求められます。

下記は、「Excelファイルを開き、すべてのシートの"A1"セルを選択し、最初のシートに切り替えてから保存する」というこれまたよくある作業を自動的に行う関数です。

```
from openpyxl import load_workbook
import openpyxl.worksheet.views

def select_a1(workbook_path):
    wb = load_workbook(workbook_path)
    wb._active_sheet_index = 0
    for ws in wb.worksheets:
        ws.sheet_view.selection = (openpyxl.worksheet.views.Selection(),)
    wb.save(workbook_path)

```
SwiftでMixinを実現する

継承あまり使いたくないけど、同じメソッドを異なるクラスで使えるようにしたいことがある。
RubyではMixinという機能が提供されており、簡単に実現できる。
Swiftでも、Swift2.0で追加されたprotocol拡張を使うと、Mixinを実現できる。

protocolにextensionを作ってあげると、メソッドのデフォルト挙動を設定することができる。

```swift
protocol DogStyle {
    func bow()
}

extension DogStyle {
    func bow() {
        print("bow wow!!")
    }
}

class Human: DogStyle {
}

class Fish: DogStyle {
}

let kenji = Human()
kenji.bow()         //"bow wow!!"

let iwana = Fish()
iwana.bow()         //"bow wow!!"
```

上の例だと、DogStyle protocolをくっつけてやると、HumanもFishもbow()が使えるようになる。

インスタンス変数にアクセスするようなメソッドでも、protocolに変数の定義を書いてあげれば使えるようになる。

```swift
protocol DogStyle {
    func bow()
}

extension DogStyle {
    func bow() {
        print("bow wow!!")
    }
}

protocol CatStyle {
    var times: Int { get set }
    func meow()
}

extension CatStyle {
    func meow() {
        for _ in 0..<times {
            print("mew meow!!")
        }
    }
}

class Human: DogStyle, CatStyle {
    var times: Int
    init(times: Int) {
        self.times = times
    }
}

class Fish: DogStyle, CatStyle {
    var times: Int
    init(times: Int) {
        self.times = times
    }
}

let kenji = Human(times: 5)
kenji.bow()
kenji.meow()

let iwana = Fish(times: 10)
iwana.bow()
iwana.meow()
```

上の例だと、CatStyle protocolのmeow()メソッドは、変数timesを参照している。
その場合も、protocol内で変数timesを定義してあげて、protocolに準拠するクラスの方でも用意してあげれば良い。
便利。
CouchbaseのデータI/Fについて図でまとめてみる

#前回の続き
前回の概要編、[「NoSQL」とCouchbase](http://qiita.com/fujisan3/items/59ad5c7d47270bb51ca8) に続き、CouchbaseのデータI/Fについてまとめてみます。

#データI/F
Couchbaseをシステムのどの部分に使うのか、システム内の配置を考える上で重要となるのが、データI/Fとなります。

図で示します。![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/53823/e5c38a4f-5681-f174-21f6-cffc6b76c5a9.png)


#Couchbaseの配置とI/F
Couchbaseをシステムのどの部分に使うのかによって、使うI/Fが変わってくると思います。

##①Native SDKを使ってプログラムを開発する
各言語用のSDKを使い、プログラムを開発する。プログラミングスキルがあれば、最も柔軟にBucketデータが扱えると思います。

##②モバイルデータの入口にCouchbaseを配置する
Couchbase Lite、Couchbase Mobileを用いて、モバイルや組込機器等からデータをSync Gateway経由でCouchbase Serverに投入するパターン。
①との違いは、②はデータを一旦ローカルDBに保存し、サーバデータとSync（同期）する動きとなります。そのため、モバイル機器が一時的に圏外になった場合でも問題ありません。

##③RESTアクセス
Couchbase Server上にあらかじめView（RDBのそれと近い概念）を作成し、URLでアクセスすることで、ViewからWeb経由でデータを出力します。
このメリットは、プログラムを書かなくてもデータにアクセス出来ることです。例えば、既存のEAIツール等とも、設定のみで連携出来る可能性があります（AsteriaやDataSpiderなど）

##④N1QLアクセス
Couchbase 4.0から実装されたN1QLによって、SQLライクな命令文でデータにアクセスすることが出来るようになります。
コマンドラインベースのcbq（OracleのSQL*PLUS的なもの）や、ODBC,JDBCドライバ経由でアクセスすることが出来るようになっています。
このメリットは、RDBに対するプログラム開発の経験者が、新たな知識を習得することなく、NoSQLに対するプログラム開発が出来るようになることだと思っています。

##⑤他プロダクトとの連携
Connecterを使うことで、検索や分析、ETLにデータ連携が可能となります。他のOSSと組み合わせる際に、プログラムを書くことなく、連携出来るようになります。


#最後に
ここで述べた様々なI/Fについては、それぞれ、それなりの技術検証が必要と思いますが、システムの概要設計として、まずはどういうことができるかを理解していただく一助になれば幸いです。
おわり

#参考
Guides and References
http://developer.couchbase.com/guides-and-references
キーボード打鍵環境について

http://qiita.com/advent-calendar/2015/dvorak

Dvorak Advent Calendar 23日目．

-----

## キーボード打鍵環境について

前回はパームレストのみについて書きましたが，それ以外の環境や
最近の研究結果など[要出展]を含めてざっくりまとめました．


### 座り方

背筋伸ばして仕事頑張ってます！綺麗な見た目大事！みたいな座り方は腰に負担を掛けるだけです．
背もたれを思いっきり倒して135°くらいで作業しましょう！（ファーストクラスの人が理想？）

また，腰周りにクッションや緩衝やつがあるとより腰への負担が少ないみたいです．


### スタンディングデスク

国内だと使ってる会社は少なそうですが，そろそろ【スタンディングデスク（笑）】になりそうな感じが個人的に否めません．
とある調査結果では立って作業する事で作業効率が落ちたと言うのもあります．

勝手にまとめますが，要は座りっぱなしだろうが立ちっぱなしだろうが，同じ体勢で長時間いる事がダメなんだと思います．
たまには背筋伸ばして座ったり，どっかフラフラ散歩したりする方が良いと言うことですね．


### デスク

エンジニアだろうがデザイナーだろうが，とにかく部屋のスペースに問題がないなら広いデスクを買うべき．
理由はいくつかありますが，大前提として，液晶モニタが年々でかくなってるから，デスクも広いのを買うべきなんです．

あとは，手前に引けるタイプ，手前がU字型で肘置きスペースがあるタイプ．スタンディングデスクとしても使えるタイプなど，
自分にあった良さ気なモノをチョイスしましょう．
もう1度書きますが，デスクは広い方が絶対いいです．


### チェア

Herman Miller買っておけばいいんだと思います．（適当）
ヘッドレストもあったらいいと思います．


### フットレスト

分厚い本でもコミケカタログでもぬいぐるみやクッションでもいいので足をドカッと置ける奴があるといいです．
別に斜め角度にこだわる必要はないです．
広くて高さがある方が良いと思います．最近はハンモックタイプが流行ってきてます．


### モニター台

CRT時代はモニターの上にモノが置けましたが今は液晶モニタが主流で余りモノが置けないのでモニター台に小物を置いたりできるのは良いです．また，デスク，チェアなどでモニターが調節し難いケースでもモニター台があると重宝しそうです．


### ラップトップスタンド

デスクトップPCでなくラップトップPCを据置の用に自宅や職場などで長時間使う場合，そのまま使うよりもラップトップスタンドを使った方がいいと思います．
角度や高さの調整だけでなく，モニター台と同じく下に空間ができるのと，外部キーボード，マウスのが使い易く疲れにくいからです．
最近は軽量でコンパクトに畳めるモノが増え，カフェで作業する際に使う人も増えて来た印象を受けます．


### アーム

モニターアームは良いですが，キーボード，マウスもアームでやるのはオススメしません．
アームにも負荷が掛かりますし，多少なりとも意識をアームに持っていかれるのでデスク平置きのが良いです．


### 肘置き

どっちかと言われたら，チェアよりもデスクにある方が良いです．普通の事務用デスクに後付けで設置できるタイプもあるのでオススメです．
肘置きスペースができる分，デスクも広く使えます．


### フットスイッチ

足元，膝に当たる部分などにショートカットキーを仕込んだフットスイッチがあると入手補助として作業が捗ります．
足元の配線などに余裕があればこちらもオススメです．
需要が少ないのか価格がそこそこします．個人的にはBluetoothで無線化して欲しいインプットデバイスです．


### エルボーレスト

肘置きとは用途が若干異なり，接地する肘が気になる（痛いなどの）時は使ってみると良いと思います．
人によってはリストレストよりエルボーレストのが必要と言う方もいらっしゃいます．


## まとめ

正しい姿勢とか割りとどうでもいいです．同じ体勢でずっといるのがまずいのです．
上で上げたアイテムなどは所詮作業効率上げるなどの目的を補うモノでしかないです．
適度に身体を動かす事に意識したり休憩取ってリフレッシュしましょう．
node-redでmeshbluにつなぐ

#概要
nede-redでmeshbluにmqttでつなぐ。
#写真
![meshblu.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/a002ccb3-3e26-f539-df45-f767534098b1.jpeg)
#設定
```
url: you .jp-east.compute.idcfcloud.com
user: trigger-1 uuid
pass: trigger-1 token
topic: trigger-1 uuid
payload: {"devices": [trigger-1 uuid], "payload": "ohisama"}
```
.gitignore ファイルをブランチごとに別の内容にする

.gitignore ファイルに限らないのですが、ブランチごとに特定のファイルの内容を変えたく、その設定をしたメモ。

## 前提 (困っていたこと)

Web開発で、何人かで git 使ってコード管理しています。
で、ビルド後に生成される css, js, sourcemapファイルなどを git管理に含めていると、いちいちコンフリクトが起きまくって困る！！！！
という状況でした。

(そもそもビルド後のファイルを gitに含めなくていいのでは？ って話になるのですが、開発サーバへのコード反映を git でさくっとやりたくてですね……。サーバ側でビルドできればいいんだけど、環境によっては簡単にはいかず。なので、git管理にビルド後の cssファイル等も含めておきたかったのです。)

## どうするか

以下の方針でなんとかできないか？

- 普段の開発用ブランチでは、ビルド後の生成ファイルは `.gitignore` で無視させる **→ コンフリクト起きない**
- デプロイ専用のブランチを作り、そこではビルド後のファイルも git管理する **→ git経由でサーバに転送できる**

つまり、ブランチ別に `.gitignore` の設定を変えられれば、なんとかならないか。

## どうやったか

`.gitattributes` ファイルの `merge=ours` 設定を使いました。

まず、 `.git/config` ファイルに以下の設定を記述。

```
[merge "ours"]
    name = "Keep ours merge"
    driver = true
```

次に `.gitattributes` ファイルに以下のように記述。

```
/.gitignore merge=ours
```

こう設定することで、マージ時に `/.gitignore` ファイルはマージ対象外となり、常に自分側のファイル内容をそのまま残すようになります。
つまり、ブランチごとに `.gitignore` の内容を別にすることができる！

## こうなった

結果、作業はこんな流れに。

- 開発ブランチではビルド後の生成ファイルは `.gitignore` で無視。(もちろんコンフリクトは起きない)
- デプロイ時は、デプロイ用ブランチに内容をマージ。
- デプロイ用ブランチでは `.gitignore` の内容を変えており、ビルド後のファイルは無視されない。なので add して commit する。
- その内容を開発サーバにデプロイ。


## 以上

いまのところ、この方法でなんとかしています。
(もっと上手いやりかたあれば教えてください)

また、この `merge=ours` を使った方法は、やむを得ず環境設定ファイル等を git管理に含めないといけない & ブランチ毎に設定ファイルの内容を変えないといけない、という場合にも使えると思います。

#### 参考

- [Git - Git の属性 #マージの戦略](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7#マージの戦略)
- [Gitで内容が異なるファイルをマージ対象から除外(無視)する設定 | サボり屋の技術メモ](https://angelndxp.wordpress.com/2014/01/27/git%E3%81%A7%E5%86%85%E5%AE%B9%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%9E%E3%83%BC%E3%82%B8%E5%AF%BE%E8%B1%A1%E3%81%8B%E3%82%89%E9%99%A4%E5%A4%96/)
Pepper と Firstserver と私

（おっさんにしかわからないどっちらけのタイトルですみません）

今年はウチの会社にPepperくんがやって来ました。
Pepperパートナープログラムの試験にも合格したのでPepperに関するご相談はなんでも受け付けております！

- Pepperで何ができるの？
- Pepper触ってみたい
- Pepperをイベントで使いたい
- Pepperに接客して欲しい
- Pepperに客寄せして欲しい
- Pepperのアプリを開発してみたい

などなど、気軽にご相談ください！
yatani@firstserver.co.jp

というわけで今回は、Pepperくんとの出会いからアプリ開発までのこれまでの経緯をつづってみたいと思います。

#出会い
今年の6月3日、Pepperがオフィスに届きました。

箱にはなんだかくすぐることが書いてあります。

![IMG_8305.png](https://qiita-image-store.s3.amazonaws.com/0/12406/f183574b-d902-09f9-1345-e5e90e13cede.png)

![IMG_8275.png](https://qiita-image-store.s3.amazonaws.com/0/12406/defd5d4c-eab5-3218-e7cf-65ffeb41b0e5.png)

箱から出すときが一番ドキドキしました（笑）。
最初はどうやって取り出せばいいのか、どうやって立たせればいいのかわからない状態でよいしょと出してみたところ全ての関節が外れているような状態でぐにゃぐにゃ。なんとも不安です。

![IMG_8292.png](https://qiita-image-store.s3.amazonaws.com/0/12406/0af4f9bf-6991-abec-7b74-fd116d58bd33.png)
うなだれてしまうので起こしてみると。。。


![IMG_8295.png](https://qiita-image-store.s3.amazonaws.com/0/12406/a0ad06d7-074a-f799-c7dd-f27c9f2491fa.png)
これでいいのか！？これがPepperの正しい姿勢なのか！？


出し終わった後でようやく取り出し方などが載ってるスタートアップガイドを発見。
関節の固定や電源を入れるためにいろんなピンを抜いたり刺したりするのですが、ガイドには非常に大雑把にしか書いてないのでみんなで「こうじゃないか？」「ちが、ちょ、おま、かせ」と悪戦苦闘を広げました。ここが一番楽しかったです（笑）。

![pp.png](https://qiita-image-store.s3.amazonaws.com/0/12406/32a662b1-dce8-ecab-a4f0-4ffc8eddf1e9.png)


その後は結構地味な作業が続きます。充電し、起動したら約款同意やNWへの参加設定などを行い、１時間以上に渡るソフトウェアアップデート（涙

アップデートが終わるとPepperくんがキョロキョロしはじめ、Pepperとの接し方に関する説明やチュートリアル的なやり取りが始まります。
記念撮影などの演出はありますがもう少しぎょうぎょうしい感動的な演出を期待していました。まあ突貫工事のファーストリリースだったようですし今後に期待したいところ。

#触れ合った感想
Pepperくんがなかなか話しかけた言葉を認識してくれないのがさみしかったです（涙
ウチのPepperくん特有の問題かもしれません。

感情マップアプリでPepperの感情をみることができるのですが私が近寄ると「きらい」という感情がぐんぐん上がっていました（号泣

それでもやはり、一緒にいると少しづつ愛着が湧いてきますね。

#開発してみた感想
Pepperアプリの開発にはChoregrapheという開発ツールを使います。

（うわ、qiitaにアップロードできる画像の容量がなくなったので以下の画像は後日アップします）

MacでChoregrapheを使ったのですが落ちまくる上にロボットビューで表示がおかしくなる不具合があります（version：2.3.1.25時点）。
Windowsでは問題無いそうなので、Pepperでアプリを開発するならWindowsマシンはマストです。

### Choregrapheでの開発
基本はsayやmove toといったボックスをつなげて開発していきます。
Pythonで提供されるAPIを呼ぶことで独自のボックスを作ることも可能です。

Pepperのインターフェースは大きく下記のものを持っています。

- 入力
    - マイク
    - カメラ
    - タブレット（タッチ）
- 出力
    - スピーカー
    - タブレット
    - ランプ（目と肩）
    - モーター：モーション

※細かくはジャイロやソナーなど他にもいろんなセンサーを持っています

開発する上での注意点としては、モーター駆動しているので発熱や障害物に気をつけましょう。

#パートナープログラム
Pepperアプリの開発者などを総合的に支援するパートナーに認定されるためには実技試験と筆記試験に合格する必要があります。

###実技試験
私は実技試験に参加しませんでしたが、声の抑揚やボックスの配置まで丁寧に作りこんだほうが良さそうな印象でした。

###筆記試験
出題傾向としては、さほど難解なものは出ませんがうろ覚えだと答えられない引っかけ問題が多い印象を受けました。ポイントは大きく2つ。「学科試験　学習用ワークブック」をまんべんなく全体的に暗記してハードウェアの仕様からトラブルシューティングまで理解して覚えることと、Choregrapheをしっかり使って画面や機能をしっかり覚えましょう。どんなパネルがあってそのパネルで何ができて、どんなボックスがあってそれぞれどんなプロパティがどんな範囲で設定できるのかまで出題されていました。

私が勉強に使ったドキュメントは下記です。

- Pepperアプリ開発　〜入門編〜
- Pepperパートナープログラム　OJTトレーニング
- Pepperパートナープログラム学科試験　学習用ワークブック

駅から試験会場までは迷うかもしれないので駅を降りた後の方角に間違わないように（うちわネタ
あとはマークシートに試験日を書くところがあるので誕生日を書かないように（うちわネタ

以上です！
やっぱりBSDが好き

「私はこれで会社を辞めました」

![150px-NewTux.svg.png](https://qiita-image-store.s3.amazonaws.com/0/104066/655b8463-630a-c640-c801-31f9d604a935.png)

禁煙パイポのCMで使われたこの台詞は1985年の新語・流行語大賞の流行語部門・大衆賞でした。歳がわかりますね。

私がUNIXな仕事をはじめてしたのは、四半世紀前にオムロンででした。当時オムロンはSystemVなワークステーションを作っていたのですが、BSDベースのOSとしてUniOS-Bをリリースすることになっていて、コマンドのテストなどをオムロンソフトウエアの方からいろいろ教えてもらいながらやっていた記憶があります。

考えてみるとBSDをやるので人員が必要だったので、ちょっと変わった自分が部長に気に入られ入社することができたのかもしれません。

自分はいまでもtcshを自分のアカウントのログインシェルとして使っているのですが、これは当時bashはまだ無くてtcshがKABAでよく使われていたので、それに影響されてそのままになってしまいました。そのケンブリッジ大学由来な著作権者不明なtcshをUniOS-Bに入れてKABAの人にえらく怒られた記憶があります。

88Kの開発の時にはクパティーノに行っていて、当時何もできなかったのですが、シリアルコンソールが起動した時の記憶が今でも鮮明に思い出され、あの瞬間を思い出していろいまだにいろ[いじって](http://qiita.com/yamori813/items/0d2945f2cb771cd2fba9)いたりします。

オムロンには3年くらいしか在籍してなくて91年くらいには退職していたのですが、退職する時にはもうUNIXな仕事をする事はないだろうなと思っていました。

その後はパソコンのパッケージソフトに関係したいくつかの会社にお世話になり、90年代後半からまたUNIXな仕事をするようになりました。

最初は会社のUUCPベースのメールサーバの構築をFreeBSD 2.0でおこなったような記憶があります。

ついこの間までいたpeterさんがいる会社のco.jpな会社に入った時にはFreeBSD 2.2.8がスタンダードで使われていていました。

入社した当時の技術系社員はメーカーから来た方が多くFreeBSDの利用経験があって入社したのは自分が最初だったかもしれません。このころはTCPなどの経験が無い方も多く、社外からサーバ間のRPCのコントロールポートがアクセスできる状態などあり、かって知ったるFreeBSDだったので、こつこつtcpwrappersを設定していた記憶があります。

かの会社での仕事ではkqueueやjailなどを使って楽しく仕事をしていた時期もありました。

そんな会社も時代の流れで、Linuxがスタンダードな会社になってしまったので、先日退職しました。

なぜFreeBSDが好きかというと、堅実な実装でシンプルなOSであることがひとつの理由なのかもしれません。最初に仕事で使ったUNIXがBSDだったからなのかもしれません。天の邪鬼な性格なので、あまりメジャーじゃないところにも引かれているのかもしれません。ただそれほど確固たる理由ではないのですが、やっぱり好きです。

最近考えている事で、自由(Free)は平和によってもたらされているもので、自由(Free)は絶対に無くしてはいけないものだと思います。

水木しげるさんの「好きの力を信じる」という言葉もありますので、これからもFreeBSDをいろいろいじっていきたいと思っています。
Visual Studio Team ServiceをAPIでアクセスしてみる

この記事は[Visual Studio / Visual Studio Code Advent Calendar 2015](http://qiita.com/advent-calendar/2015/vs)の23日目の記事です。
また、この記事は[Xamarin Advent Calendar 2015](http://qiita.com/advent-calendar/2015/xamarin)の11日目の記事、[Xamarinでマルチプラットフォーム用のプロジェクトを作る](http://qiita.com/yakumomo/items/ecb4a6f1fc3e8e8d966e)の続きになります。

## Visual Studio Team ServiceにはAPIがあります

[Visual Studio Team ServiceのAPI](https://www.visualstudio.com/en-us/integrate/api/overview)は、リンク先を見てもらえば分かりますが、OAuth2の認証とアクセス方式でアクセスできます。
（BASIC認証も使えますが、OAuth2の方がいいですよね）

## アプリを登録する

よくあるOAuth2サイトと同じように[事前にアプリを登録](https://app.vssps.visualstudio.com/app/register)してClient IDとClient Secretで認証を行います。
それで得たAccess TokenをAuthorizationヘッダにBearer形式で付加してAPIアクセスを行います。
まさにOAuth2。

## アクセスを行う

アプリを登録する際にScopeを適切に設定しておくことでAPIでアクセスできる範囲が変わります。
ただし、一度設定すると変更できないようになっています。
認可を行う範囲をよく考えて決めておきましょう。

## サンプルアプリ

サンプルアプリは[GitHubに登録](https://app.vssps.visualstudio.com/app/register)してあります。
Visual Studio 2015のプロジェクトです。
UWPのプロジェクトしか入れてませんが、Forms.Initして、LoadApplicationでVsoAppを指定してやればiOSでもAndroidでも動くと思います。

ただ、サンプルなのでログインとチームの選択画面を表示するところまでしか行っていませんが…。

また、アプリを登録したら、[Constantsクラス](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonData/Constants.cs)に登録されている値を設定してください。

## APIアクセス方法

APIのアクセスは、以下のクラスで行っています。

| クラス | 機能 | 備考 |
|:---:|:---|:---|
| [VsoApi](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonData/VsoApi.cs) | APIアクセスルーチン | APIアクセスのみ |
| [VsoController](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonData/VsoController.cs) | APIアクセスコントローラー | シーケンス制御 |
| [VsoToken](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonData/VsoToken.cs) | OAuth2認証用 |  |
| [VsoAccount](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonData/VsoAccount.cs) | アカウント情報 | 認証後のチーム情報取得用データ |
| [LoginForm](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonForms/LoginForm.cs) | ログイン時の画面 | WebViewを貼り付けただけ |
| [AccountSelectForm](https://github.com/yakumo/VsoLoginTest/blob/master/VsoLoginTest/CommonForms/AccountSelectForm.cs) | チーム選択用画面 | ListView |

## プロジェクト構成

前回のXamarinのでも書いたのですが、MV+VとVでプロジェクトが分かれていて、それぞれが共有プロジェクトです。
他言語化していないので、文字列部分は無し、XAMLも使っておらず、という状態。
非常に鬱陶しいかもしれません（笑）

また、バインディングにはINotifyPropertyChangedを使う形式にしてあります。

## APIの話

APIを使えば一通りのことができるようになっているようです。
（Git部分はまあ仕方ない）

ただ、前にも書きましたが、[.Net用Clientライブラリ](https://www.visualstudio.com/en-us/integrate/get-started/client-libraries/dotnet)を使う方が後々のためとは思います。

## 終わりに

駆け足で概要だけ見てみましたが、真面目に使おうと思うと…使い所が無いんです。このAPI。
アプリを登録しておかないとダメだし、ユーザーは認可制だし。
かなり内々でないと使わないかもしれませんねー。
Slack-「夜中の通知が迷惑なので空メンションしたら発言自体見逃した！」の終焉

Slack に **Do Not Disturb** 機能が追加されました。
これにより、タイムゾーンが違う人(あるいは夜型人間)と協業するときの悩みが一つ解消されますね。

また、深夜帯以外に関しても今通知はしたくないけど空メンションしたり
発言自体を後で行おうとすると忘れてしまう。そんな時には **reminder** が便利です。

## <i class="fa fa-frown-o" style="font-size:1em;"></i> Do Not Disturb 機能の追加
就寝中の通知などを防ぐ、Do Not Disturb 機能が追加になりました。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Knock, Knock: Introducing Do Not Disturb](http://slackhq.com/post/135387122640/do-not-disturb)

### <i class="fa fa-list" style="font-size:1em;"></i> Do Not Disturb の設定手順
* Do Not Disturb schedule を選択する

![dont_disturb.png](https://qiita-image-store.s3.amazonaws.com/0/43480/36ea710a-3d6d-7da8-468c-973027485edb.png)

* デフォルトで 10pm - 8am まで非通知になります

![dont_disturb2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/041891eb-bb05-2c53-0cc0-1713694272ac.png)

夜中に通知をしても夜10時から翌朝8時までは通知が飛ばなくなります。
これで夜中でも気兼ねなくメンションできます。

## <i class="fa fa-graduation-cap" style="font-size:1em;"></i> reminder
任意の日時に任意のチャンネルで任意のメッセージを表示することができます。
詳しくは下記の reminder 公式ドキュメントをご確認ください。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Setting reminders - Using Slack](https://get.slack.help/hc/en-us/articles/208423427-Setting-reminders)

### <i class="fa fa-file-text" style="font-size:1em;"></i> メッセージフォーマット
以下のようなフォーマットで発言すると `reminder` が設定されます

```
/remind #<channel_name> @<who> <what> <when>
```

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
12月21日の午前9時に田中くんに実装の丸投げを通知する場合の設定例です。

```
/remind #general @tanaka じゃ、丸ごと実装よろしくっ！ on December 21th at9:00am
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Setting reminders - Using Slack](https://get.slack.help/hc/en-us/articles/208423427-Setting-reminders)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Knock, Knock: Introducing Do Not Disturb](http://slackhq.com/post/135387122640/do-not-disturb)
TitaniumのビジネスロジックをNode.jsで開発

クリスマスまであと僅か。
今年は初参加で2枠いただきましてありがとうございます。@shinoutといいます。
Titanium-JP界の著名な方々にお世話になりながら医療系スタートアップを始めたJSerです。
前回と関連した内容になりますが自身の関心あるマルチプラットフォームJavaScriptの話をさせて下さい。
わかりづらかったらすみません。。

# ビジネスロジック層とUI層は、分離するとよい
それは
1. 規模が大きくなっても扱いやすい、変更に強い
2. ビジネスロジック部分をNodeで開発できたら開発スピード早くなる
からです。
(規模が小さいときは[スマートUIパターン](http://d.hatena.ne.jp/minekoa/20100116/1263657955)で作って逃げ切るのも選択肢のひとつです。)

# どう分けるか
モデルとその振る舞い(model)、モデルの生成(factory)、モデルのCRUD部分(repository)を
ビジネスロジックとして分離します。いわゆる「ドメイン」という部分です。
(これを綺麗に切り出すのが大変なんですがその話は割愛...)

例としてMBaaS(Mobile Backend as a Service, データの永続化に関するRESTfulなAPIを提供するもの)を利用したサービスを考えます。

この場合、データ層がHTTPを介する汎用的なものになるため、プラットフォームに依存しにくくなります(ファイルやDB直触りだと、プラットフォーム間で事情が異なる事が多いですが、HTTP Requestはどのプラットフォームも持っています)。

前回紹介した[ti-superagent](https://github.com/smclab/ti-superagent)を用いれば、HTTP Requestライブラリの[superagent](https://github.com/visionmedia/superagent)をTitaniumでも用いることができ、データアクセス部分も含めて Node.js / Web / Titanium で動くようになります。

開発/テストはNode.jsで行うことができ、PDCAサイクルを素早く回すことができるでしょう。
特にネットワークを介したテストがNodeでできるのは大きな利点です。


# ドメインは複数のプラットフォームで再利用可能
MBaaSのほかに管理用のサーバーが必要になったりだとか、Webアプリが必要になったという需要はあるでしょう。
その際、モデル含めたビジネスロジックの再定義は必要なく、そのままドメインを使えばよいです。

下記に概念図を載せました。

![スクリーンショット 2015-12-22 22.28.20.png](https://qiita-image-store.s3.amazonaws.com/0/1371/81e6f1d2-019c-f5d0-a282-d6f7687557c3.png)


[browserify](http://browserify.org)や[tisomorphic](https://github.com/CureApp/tisomorphic)を用いることで、require()等の差分を吸収し、
各々のプラットフォームで動かすことができるようになります。

# Alloyのmodel(Backboneのもの)はどうする？
現状では使っていません。利用する利点もあるとは思いますが、
1. 開発スピード
2. 再利用
という点で、プラットフォーム依存をなくすことのほうが重要と考えています。

例えば皆が気になっている[Cordova](https://cordova.apache.org/)や[React Native](https://facebook.github.io/react-native/)にも同様にドメインを再利用できるので、
簡単に既存のプロジェクトをこれらのプラットフォームで試すこともできるでしょう。

# まとめ
- UIとビジネスロジック(ドメイン)を分離し、ビジネスロジックは汎用的なJSにするとよい。
- 汎用的なJSはNode.jsで開発/テストするとサイクルが早い！
- データ層がネットワークにあると多プラットフォーム展開しやすい！
- 分離されたビジネスロジックは、あとで別なプラットフォームで再利用できる！
みんな大好きGoogle+のプロフィール登録状況をチェックしてみた！

#【まえがき】
みんな大好きGoogle+のプロフィール登録状況をチェックしてみた。ということで、
Google+を社内展開した時に、
ちゃんとプロフィールの登録が済んでいるかをチェックするために作ってみました。

#【めんどくさくてやらなかったこと】
ドメイン内のユーザーの取得をGASで引っこ抜けば常に最新にできたのでは・・・
と思いながらも時間が無かったので、社内のEmailのマスタからコピー・・・

#【作成したもの】
####★SpreadSheet １シート
A列：部署名（Emailマスタとともにもってきた）
B列：氏名（Emailマスタとともにもってきた）
C列：Emailアドレス（キー項目として使用）
D列：取得したGoogle+プロフィールURL
E列：取得したGoogle+のユーザーID
F列：取得日時

####★GoogleAppsScript １本

#【注意事項】
リソース⇒Googleの拡張サービス
⇒「Google+ Domains API」を有効化してください！

```getProfile.gs
function getProfile() {
  var now = new Date();
  var start         = Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd hh:mm");  
  var today         = Utilities.formatDate(now, "Asia/Tokyo", "yyyy/MM/dd");

  Logger.log("プロフィール取得処理　開始時刻："+start);
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var SheetValues = sheet.getDataRange().getValues(); //シートのデータを取得
  var LastRow = sheet.getLastRow(); //最後の行番号を取得
  for(var i=2;i<=LastRow;i++) { 
    var end  = new Date();
    var span = end - now;
    if(span < 5*60*1000){ //処理エラーを起こしたくないから             
      var id = SheetValues[i-1][4];
      if(id == "" || id == "プロフィールなし"){        
        var date_check = SheetValues[i-1][5];
        if(date_check !== ""){
          var date_check = Utilities.formatDate(date_check, "Asia/Tokyo", "yyyy/MM/dd")
          }else{
            var date_check = "2014/01/01";
          }
        if(date_check < today ){
          try{        
            var userId = SheetValues[i-1][2];
            var profile = PlusDomains.People.get(userId);
            sheet.getRange(i,4).setValue(profile.url); 
            sheet.getRange(i,5).setValue(profile.id); 
          }catch(e){
            sheet.getRange(i,4).setValue("プロフィールなしor取得できませんでした");       
          }
          sheet.getRange(i,6).setValue(today);
        }
      }
    } else{      
      Logger.log("5分経過したため終了");
      SpreadsheetApp.flush();
      return;
    }
  }
  var end         = Utilities.formatDate(new Date(), "Asia/Tokyo", "yyyy/MM/dd hh:mm");   
  Logger.log("終了時刻："+end);
}
```
#【ポイント】
下記の箇所で、アカウントが無くなった人を飛ばすようにして、エラーを回避
try{ 
}catch(e){
}

#【まとめ】
E列の"プロフィールなし"以外のカウントをどっか別シートにしておけば、
登録者数の推移がとれますよー
⇒さらにグラフにしとけば報告も楽チン

さらにUserIDを使えば、投稿を全部取ってくることもできるし、
さらにさらにとってきた投稿の共有権限をチェックすれば、
外部に誤って共有されてしまっている情報がないかもチェックできます。

そこも作ってあるけど、そこはまた別の機会に…
コメント等で要望があれば・・・
mrubyボードenziとmyThingsでIoT

#はじめに
mrubyを使ってプロトタイピングが出来るボード[enzi](http://enzi.cc)と[myThings](http://mythings.yahoo.co.jp/)を使って簡単にIoTサービスを作ります。
enziはArduino互換のピン配置でmrubyを使ってコーディング出来るプラットフォームです。Web開発のほかPCに接続するだけですぐに始められるmirbを使ったインタプリタ開発(仮想COMポート経由)ができます。[Amazon](http://www.amazon.co.jp/enzi-EBB-01-basic-board%E3%80%90mruby%E3%83%A9%E3%83%94%E3%83%83%E3%83%89%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%80%91%E8%BB%BD%E9%87%8FRuby%E3%81%8C%E5%8B%95%E4%BD%9C%E5%8F%AF%E8%83%BD%E3%81%AA%E7%B5%84%E8%BE%BC%E5%9F%BA%E6%9D%BF/dp/B00PRO1JOU)で販売中です。

![enziboard.png](https://qiita-image-store.s3.amazonaws.com/0/34169/9d6110fc-e302-1634-ec8c-0370653b56a7.png)


#センサー
温度・湿度・気圧が測定可能な[Bosche社のBME280](https://www.bosch-sensortec.com/de/homepage/products_3/environmental_sensors_1/bme280/bme280_1)を使ったセンサボードを使いました。[スイッチサイエンスさんのデバイス](https://www.switch-science.com/catalog/2323/)と同様の品です。I2C経由で通信するために以下のように配線します。

| BME280     | enzi        |
|:-----------|------------:|
| 3.3V       |        3.3V |
| GND        |          GND|
| SDI(SDA)   |         D10 |
| SCK(SCL)   |           D5|
| SDO        |         GND |

※なお、I2C用のプルアップ抵抗が必要ですのでご注意下さい。

より詳しい情報は[enziのピンアサイン](http://wiki.enzi.cc/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8#enzi_basic_board)や[スイッチサイエンスさんのBME280搭載　温湿度・気圧センサモジュールの使い方
](http://trac.switch-science.com/wiki/BME280)で確認できます。

#myThingsの設定
##IDCFクラウドの設定
[masato](http://qiita.com/masato)さんの[myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする](http://qiita.com/masato/items/f9be4a15216fe29de7fb)を参考にIDCFクラウドの設定をします。
##IDCFチャンネルの認証
[masato](http://qiita.com/masato)さんの[myThingsをはじめよう - Part4: 「IDCF」チャンネルを認証する](http://qiita.com/masato/items/3d958b4b427020b83b94)を参考にしてIDCFチャンネルを認証します。

##トリガーの設定
[masato](http://qiita.com/masato)さんの[myThingsをはじめよう - Part6: 「IDCF」のトリガーからHTTPで「Gmail」のアクションを実行する](http://qiita.com/masato/items/152870ff7fd2f5d96cf1)を参考にしてトリガーの設定を行います。RaspberryPiがenziに変わるイメージです。トリガーは簡単な例として温度が10度を下回ったら実行されるようにしました。

#enziの設定
1. [myThings用のアプリケーション](http://enzi.cc/apps/fa64f3ac-996c-4d7a-9459-9b5842009577?rev=2)を準備しましたので開いて下さい。
1. エディタを一番下までスクロールしてIPアドレスをお使いのIDCFクラウドの仮想インスタンスのIPアドレスに書き換えて下さい。
1. ユーザー登録とenziボードの登録済みでしたらエディタ下に"compile"ボタンが表示されていますので、クリックしてenziバイナリをダウンロードします。
![enzi_compile.png](https://qiita-image-store.s3.amazonaws.com/0/34169/2b11c867-4952-fec2-763f-dcc2a41a75dd.png)
1. ダウンロード済みのバイナリをenzi.ezbという名前でmicroSDカードに保存します。
1. [enzi.cfgの設定](http://wiki.enzi.cc/enzi.cfg)を行います。
1. microSDカードをenziボードに挿入して起動します。

#結果
無事通知が届きました。

#enziとIoTについて
本サンプルではすでに作成済みのプログラムを使いましたが試作はインタプリタによる対話型のインターフェースで高速開発を行いました。インタプリタを使うことで例えばピン番号を間違うなどのミスが有っても、コンパイルしてロードするという手間を省いて、その場で実行し直すだけで修正ができます。
また、このプログラムはわずか200行程度でセンシングとHTTP通信が実行されている上にオブジェクト指向言語ならではのクラスで定義されてますので再利用が容易です。
Vimで各言語のreplをすぐに開きたい…そこでrepl.vim！


この記事はVim advent calendar 2015の23日目の記事です！

昨日の記事は  
[プログラミング初心者が某氏が提言していた「 Vim駆動学習 」をやってみた](http://wanshot.github.io/2015/12/22/vim-advent-callendar-2015.html)  
でした！

某氏、一体 何ぶささんなんだ…。


# そこで[repl.vim](https://github.com/ujihisa/repl.vim)！

　はい！ 今貴方は小物のプログラムを書いています！  
はい、今classを書きました！！

(__コードの内容を理解する必要はありません__)

```ruby
class Kawaii
  def initialize
    @messageList = [
        'おはよう、よく眠れましたか？',
        '朝ごはん、もうできてますよ！ ずんだもち。',
        "モナド？ 単なる自己関手の圏におけるモノイド対象だよ。\n何か問題でも？",
        'むちむちじゃありません！ もちもちです！',
        "皆のハート打ち抜くぞ〜\nずんだアローシュート！",
        "お口開けてください、あーん♡\nたこ焼き味のずんだもちです！"
    ]
  end

  def message(_)
    n = rand(0 .. @messageList.count() - 1)
    @messageList[n]
  end
end
```

　ｱｯｱｯ、このクラスをロードしたい、今したい。  
そう…なんというかこう…チェック用のコードを書くまでもなく…すぐ動かしたい！

***そこで[repl.vim](https://github.com/ujihisa/repl.vim)！***

![ruby_repl_vim.png](https://qiita-image-store.s3.amazonaws.com/0/84945/cb83a7da-c8e1-96f1-4028-30c666017a77.png)



- - -

## repl.vim

　repl.vimは[ujihisaさん](https://github.com/ujihisa)作の、quickrun.vimをrepl用にしたためたかのようなVimプラグインです。 ( ※この感想は個人のものです )  
上記では、編集中かつ、未保存のコードをRubyのインタプリタ(irb)に読み込ませています。

* 対応言語 (2015-12-17時点)
  - Haskell (ghci)
  - Ruby (irb)
  - Python (python (python2もしくはpython3))
  - Erlang (erl)
 
※ JavaScript (node.js repl) に対応しました！ (2016-02-06)

また、各言語に対応するインタプリタはユーザ側で指定可能です。  
( filetype 'python'に対して 'python2' を起動する…など )


## repl.vimの役に立ち力

### 即実行力の強さ

　はい！ 今貴方は小物のプログラムを(以下略  
今度はHaskellとしましょう。

以下のようなコードを書きました

```haskell
data List a = Nil | Cons a (List a) deriving Show

emp = Nil :: List Int
uni = Cons 10 Nil
xx  = Cons 10 (Cons 20 Nil)

fromGeneral :: [a] -> List a
fromGeneral []     = Nil
fromGeneral (x:xs) = x `Cons` fromGeneral xs

xxx = fromGeneral [1,2,3]
```

　Rubyであれば、下の方に動作チェック用のコードを付け足せばすぐに動かせますが、
Haskellの場合は`main`を書かなければいけません。  
具体的には以下のようなもの。

```haskell
main :: IO ()
main = do
  print emp
  print uni
  print xx
  print xxx
```

動作確認のためにこれを書くのは面倒です。  
*そこでrepl.vim！*

　repl.vimを使えば、List型及びそれ以下の関数を読み込んだHaskellのインタプリタを起動することができます。

![haskell_repl_vim.png](https://qiita-image-store.s3.amazonaws.com/0/84945/541f9990-9a48-e841-28d2-70caced212fd.png)


### 終わりに
　使ってみてね★

　全く別の話なのですが、この前repl.vimのコミット権を貰えたので
最近repl.vimにコミットとかしてます。
UItextViewでプレースホルダーを使えるようにする方法2015年Swift対応版

UItextViewでプレースホルダーを使えるようにする方法。
昔からやりつくされていますが、必要に迫られたので @himara2 先輩が過去に書いた[記事](http://himaratsu.hatenablog.com/entry/objc/placeholderview)を参考に、SwiftかつIBInspectableを使えるようにしました。

```swift
import UIKit

class UIPlaceHolderTextView: UITextView {
    
    lazy var placeHolderLabel: UILabel = UILabel()
    @IBInspectable var placeHolderColor: UIColor = UIColor.lightGrayColor()
    @IBInspectable var placeHolder: String = ""
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textChanged:", name: UITextViewTextDidChangeNotification, object: self)
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textChanged:", name: UITextViewTextDidChangeNotification, object: self)
    }
    
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    override func drawRect(rect: CGRect) {
        
        if(self.placeHolder.characters.count > 0) {
            self.placeHolderLabel.frame           = CGRectMake(4,8,self.bounds.size.width - 16,0)
            self.placeHolderLabel.lineBreakMode   = NSLineBreakMode.ByWordWrapping
            self.placeHolderLabel.numberOfLines   = 0
            self.placeHolderLabel.font            = self.font
            self.placeHolderLabel.backgroundColor = UIColor.clearColor()
            self.placeHolderLabel.textColor       = self.placeHolderColor
            self.placeHolderLabel.alpha           = 0
            self.placeHolderLabel.tag             = 999
            
            self.placeHolderLabel.text = self.placeHolder
            self.placeHolderLabel.sizeToFit()
            self.addSubview(placeHolderLabel)
        }
        
        self.sendSubviewToBack(placeHolderLabel)
        
        if self.text.characters.count == 0 && self.placeHolder.characters.count > 0 {
            self.viewWithTag(999)?.alpha = 1
        }
        
        super.drawRect(rect)
    }
    
    func textChanged(notification: NSNotification?) {
        if self.placeHolder.characters.count == 0 {
            return
        }
        
        if self.text.characters.count == 0 {
            self.viewWithTag(999)?.alpha = 1.0
        } else {
            self.viewWithTag(999)?.alpha = 0.0
        }
    }
}
```

Storyboard上でUITextViewを配置し、クラスをUIPlaceHolderTextViewに変更します。
<img width="890" alt="スクリーンショット 2015-11-28 15.01.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/8748/bfed93a7-b69c-f4c9-560a-9f3c3544ea65.png">

変更すると、Place HolderColorとPlaceHolderの値をInterfaceBuilderから変更することができます。
便利ですね。
<img width="899" alt="スクリーンショット 2015-11-28 15.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/8748/33271eb8-a811-2de7-ecaf-780961416401.png">

一点、自分の環境ではBackgroundColorをClearにしないとTextViewの背景が黒くなってしまいました。
そこで、IB上でClearColorに設定しています。
BitVisor のインストール（ローカルディスク）

# はじめに

BitVisor をローカルディスクにインストールする方法をいくつか紹介します（予定）。

# Linux

ここでは CentOS 7 や Ubuntu 14.04 LTS などの grub2 を使ったシステムを対象とします。

## bitvisor.elf のインストール

[BitVisor Advent Calendar 2015](http://qiita.com/advent-calendar/2015/bitvisor) の [8日目](http://qiita.com/shina/items/8579d1c17962b0842431)に従って bitvisor.elf がコンパイルしてあるものとします。

以下のようにして bitvisor.elf を /boot にインストールします。

```bash
$ cd ~/bitvisor
$ sudo cp bitvisor.elf /boot/
```

## grub の設定

以下のファイルを 99_bitvisor という名前で /etc/grub.d/ 以下に作成します。

```bash:99_bitvisor
#!/bin/sh
set -e

datarootdir="/usr/share"

. "${datarootdir}/grub/grub-mkconfig_lib"

if [ \! -f /boot/bitvisor.elf ]; then
    exit 0
fi
echo "Found BitVisor image" >&2

cat <<EOF
if [ "\${bitvisor_next_entry}" ]; then
    set default="\${bitvisor_next_entry}"
    set bitvisor_next_entry=
    save_env bitvisor_next_entry
else
    set bitvisor_next_entry="\${default}"
    save_env bitvisor_next_entry
    set default="BitVisor"
fi

menuentry "BitVisor" {
$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)
	echo 'Loading BitVisor ...'
	multiboot /boot/bitvisor.elf
}
EOF
```

読めば内容は分かると思いますが、初回起動時には bitvisor_next_entry という環境変数に本来起動するべきエントリを保存しておいてから BitVisor を起動します。BitVisor が起動して GRUB に戻ってきたら、bitvisor_next_entry に保存しておいたエントリを default に設定します。

もともと Linux が自動的に起動する環境では、BitVisor が自動的に起動した後に Linux が自動的に起動します。grub-reboot コマンドで次回起動するエントリを指定した場合や、grub-set-default コマンドでデフォルトを指定した場合などでも、まず BitVisor を起動してから、指定したエントリを起動するようになります。

### 設定ファイルの更新

### CentOS 7
```bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
```

### Ubuntu 14.04 LTS
```bash
$ sudo update-grub2
```

# Windows
TBA

# Mac
TBA
Angular 2: upgrading from 1.x

Angular 2のBetaが出ましたね。そろそろ使い始めてもいいのかな。
Angular 2はAngular JSに比べ、書きやすく、また動作が速くなっているようです。
みなさんはすでにAngular JSで何かしらのアプリケーションを動かしてますか？すべてをAngular 2で書き直していきますか？ngUpgradeというものを使えば、Angular JSでの資産をAngular 2でも利用できるかも。
AnuglarチームはAngular 1からAngular 2へのマイグレーションを楽できるよう考えてくれているみたいです。
ということで、今回はngUpgradeについて書きたいと思います。

#前提
- Angular 2のバージョンは2.0.0-beta.0
- Angular JSのバージョンは1.4.8

#参考
- [Angular 2公式](https://angular.io/)
- [Angular JS公式](https://angularjs.org/)
- [Upgrading from 1.x 公式チュートリアル](https://angular.io/docs/ts/latest/guide/upgrade.html)
- [ngUpgrade repository](https://github.com/angular/angular/tree/master/modules/angular2/src/upgrade)
- [Angular 1 to Angular 2 Upgrade Strategy document](https://docs.google.com/document/d/1xvBZoFuNq9hsgRhPPZOJC-Z48AHEbIBPlOCBTSD8m0Y/edit)
- [thoughtram Blog](http://blog.thoughtram.io/angular/2015/10/24/upgrading-apps-to-angular-2-using-ngupgrade.html)
- [ngForward](https://github.com/ngUpgraders/ng-forward)
- [Angular 1.5 and beyond (Angular Connect)](https://docs.google.com/presentation/d/13Or2TAxZ9aIora69E3_iNUwFz5hM3FegnyWt83f76jE/preview?slide=id.p)

#Strategy
既存のAngular JS 1アプリを移行する手段としては、

- 全部えいやっと書き換える
- 少しずつ書き換えていく

少しずつ書き換えていくやり方もいくつかあるようで、Typescriptに置き換え、[ng-forward](https://github.com/ngUpgraders/ng-forward)や、Angular JS 1.5での[Component](https://toddmotto.com/exploring-the-angular-1-5-component-method/)を使ってAngular JS 1にて、Angular 2っぽく記述していき、Adapterを利用しAngular 2で動くようにして、最終的にAdapterがなくても動くように書き換えていく。

#どんな感じか
```index.ts
import "angular";
import "reflect-metadata";
import {Component} from "angular2/core";
import {UpgradeAdapter} from "angular2/upgrade";

var adapter: UpgradeAdapter = new UpgradeAdapter();

//本来ならちゃんとd.tsを利用しなければいけないところでしょうか
declare var angular:any;
var app = angular.module("myApp", []);

@Component({
  selector: "ng2",
  template: `
    <div>
      Angular 2 component
    </div>
  `
})
class Ng2 {
}

app.directive("ng2",
  adapter.downgradeNg2Component(Ng2));

adapter.bootstrap(document.body, ['myApp']);
```

`UpgradeAdapter`を利用します。ComponentをDirectiveに接続していきます。
`adapter.bootstrap()`を利用して、Angular JSでの`ng-app="myApp"`の代わりとします。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <ng2></ng2>
    <script src="./bundle.js"></script>
</body>
</html>
```

`<body ng-app="myApp">`とかの`ng-app`属性は取り除きます。

#最後に
Service等々も少しづつ置き換えていく感じなのかな。
具体的な完全移行の流れは[Upgrading from 1.x 公式チュートリアル](https://angular.io/docs/ts/latest/guide/upgrade.html)を見れば書いてあります。結構なボリュームです。
シンボリックリンクの作成方法(Linux & Windows)

#概要
シンボリックリンクの作り方をLinuxとWindowsで紹介します。

#Linux
```bash
$ ln -s [シンボリックリンク貼り付け先パス] [シンボリックリンク貼り付け元パス]    # folder & file
```
#Windows
```bat
> mklink /D [シンボリックリンク貼り付け先パス] [シンボリックリンク貼り付け元パス]    # folder
> mklink    [シンボリックリンク貼り付け先パス] [シンボリックリンク貼り付け元パス]    # file
```
プロ生ちゃんモデルですぐできる簡単トゥーンレンダリング

プロ生ちゃんアドベントカレンダーの２３日が空いてたので何か書いてみようと思って書いていたら埋まってしましました（笑）

#トゥーン適用前
![Before](https://qiita-image-store.s3.amazonaws.com/0/59191/9bc1c717-ed63-a503-5221-1b89bff45057.jpeg)

さすがに３Ｄそのままだと陰影が濃ゆいですねー。
いきなりこれが来るとびびりますね。
この記事を下書き保存して開いたとき自分でびっくりしました。
これをもっと薄くするのが今回の目的です。

ちなみに画像はすべてBlenderのスクショです。

#トゥーン適用後
![After](https://qiita-image-store.s3.amazonaws.com/0/59191/d80ec0fd-457d-2074-7f94-78eb79dbe8df.jpeg)

薄くなりました。
ライトを無くしただけっぽくも見えますが、アゴのあたりとかに陰影があります。
口のあたりも結構それっぽく線が出てますね。口のテクスチャの線は事前に消してあります。
首の後ろの髪には影が落ちてます。
　
　
　
　

#撮影風景
![撮影風景](https://qiita-image-store.s3.amazonaws.com/0/59191/684b11db-4c15-0cbf-24eb-88f055d8582c.jpeg)

0.25倍に薄くしています。
他の設定は全て同じです。
　
　
　
　
　
　
　
　
　
　


#なぜこんなことを考えたのか
とある昔のゲームが最近リメイクされたとき、「絵が薄くなった」「絵がペラい」という感想を聞きました。感じ方は人それぞれだと思いますが、自分もある程度同じように感じたのと同時に、「薄い」「ペラい」とはどういうことだろうと色々考えました。

そのなかで「薄いというのは本当に薄いのではないか？」と思い、やってみた次第です。
プロ生ちゃんモデルのクォリティに相当助けられていると思いますが、意外とそれっぽい絵になったので面白かったです。

既出だったらごめんなさい。調べてません。

ということで、これをトゥーンと呼んでいいのか謎ですが、プロ生ちゃんモデルで簡単トゥーンレンダリングでした。
新卒研修で作ったアプリケーションをNode.jsで書き直していく話(進捗)

# はじめに
この記事はアイスタイルアドベントカレンダー22日目の記事であり、
11日目の[新卒研修で作ったアプリケーションをNode.jsで書き直していく話(序章)](http://qiita.com/ktarow/items/fd70dbc151a49b0092a2)の続きの記事となります。

まずはじめに、

~~__進捗ダメです！！！！__~~

今のところ終わっている作業は下記の通りになります。

1. DBの設計
2. 技術選定
    3. Exprescs
    4. gulp
    5. Babel(ES2015)
3. 実装
    4. ユーザー追加(途中)

以上です！！
なんともお粗末な結果になってしまっていますが、とりあえず詳細な進捗報告をしたいと思います。

# DBの設計
DBは下記のような構成になっています。


|テーブル名|詳細|
|:-------|:---|
|capsule_types|選べるカプセルのタイプ(マスタ)|
|items|商品(マスタ)|
|order_logs|注文のログ(トランザクション)|
|orders|当月分の注文(トランザクション)|
|users|ユーザー情報(マスタ)|

以前は非常に無駄なマスタテーブルが複数あったため、それらをすべて削除し、凄まじくシンプルな構成にしました。

# 技術選定
WAFは、Express(~~特に何も考えず決めました~~)を使い、BabelでES2015の文法を用いながら書いています。Class最高です。

また、ビルドツールとしてgulpを用いることで、常に変化をwatchしながらトランスパイルしています。
まだgulptaskも育てられていないので、今後育てていきます。

# 実装
実装は、ユーザーの追加機能を作っている途中です。
フォームから渡されたデータにバリデーションをかけたり、パスワードをハッシュ化したりして登録するという当たり前のことしかやっていません。
アプリケーションの構成は以下のようになっています。

1. route
2. service
3. dao
4. view

ここも詰め切れていないオレオレ設計になっています・・・
徐々にDDDに寄せていこうと思っています。

## 実装時にハマったポイント
まだほぼ機能を作っていないんですが、Node.js独特のハマりポイントに見事にハマったので、それをちょっと説明しておきます。
ハマったポイントは、__非同期__の部分です。
__MySQLへのデータ登録時にレスポンスがundefined__になっていたことからすべてが始まりました・・・(といっても30分ぐらいで解決できましたがw)

悩んだ部分は下記の通り。

1. レスポンスの返り値がundefined
2. 例外処理がうまくいかない

以上、2点です。

### 解決策としてのPromise
このハマリポイントを解決してくれたのが、__Promise__でした。
初めて使いましたが、__Promise最高です。__

Promiseの詳しい内容については、下記を参照してください。
[JavaScript Promiseの本](http://azu.github.io/promises-book/)

今回は上記の通り、mysqlでのユーザー登録が成功した場合に、resolveを失敗してコールバックにエラーが渡された場合にrejectを実行するようになっています。
実装は下記の通り。

```userdao.js
add(name, email, password) {
  let sql = "insert into users set name = ?, email = ?,password = ?";
  let prepare = [name, email, password];
  sql = connection.format(sql, prepare);
  return new Promise(function(resolve,reject) {
    connection.query(sql, function(err, result) {
      console.log(err);
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  });
}
```

ここでのレスポンスを下記のように受けています。

```singup.js

result.then(function(success) {
  req.session.email = req.body.email;
  res.redirect(301, '/users');
}).catch(function(err) {
  res.render('singup', { errors: [{msg: 'ユーザー登録に失敗しました。'}]});
});
```

Promise最高！

# 最後に
早くも最後になってしまいました。
今後も実装を続けていき年末までに完成させようと思います！

アプリについては、[ktarow.com](http://ktarow.com)という自前のブログに書こうかなと思っています。

以上、最後まで読んでいただきありがとうございました！

明日は、@ytakeさんによるgoについての何かです！！！
[Android] Timber で debug ビルド時のみにログを出力する


![スクリーンショット 2015-12-21 19.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/35733/dd1d5e20-047e-5a8c-0bb9-13ce0dd8ddcb.png "スクリーンショット 2015-12-21 19.10.31.png")

Timber は、かの Jake Wharton 氏が開発したログ用のライブラリです。

> GitHub ⇒ https://github.com/JakeWharton/timber

プロジェクトへの導入は Android Studio ベースのプロジェクトであれば簡単です。

```Gradle
dependencies { 
    compile 'com.jakewharton.timber:timber:3.1.0'
}
```

> 最新バージョンは執筆時点で `4.1.0` ですが、プロジェクトの `minSdkVersion` が 15 以上でないとエラーとなる(勘違いかもしれない)なので、私のプロジェクトでは `3.1.0` を使っています。

次のようなコードで感じでログ出力ができます。

```java:
Timber.tag("hoge").i("piyo=%s", "fuga");
```

> `%s` `%d` 等が利用できる。それ以外に便利な点としては `Tree` によりログの挙動を変えたりカスタマイズできる点なのですが、それは今回は置いておきます。

本題の表題の件ですが、ログ出力を仕込む場合、debug ビルド時のみ出力することが多いと思います。その場合、コードは次のようになり、

```java:
if (BuildConfig.DEBUG) {
    Log.i("hoge", "piyo=fuga");
}
```

至るところに判定がはいると煩雑になってしまいます。また `if` 判定せず気軽にログ出力していたら、コードを消し忘れて release ビルドに残ってしまったり。

もしくは独自のログ用クラスを作る、となるのですが、Timber で debug ビルド時のみに `Tree` の設定をするという風にすると（release ビルド時は `Tree` の設定を何もしない）、

```java:例えばApplicationクラス等
if (BuildConfig.DEBUG) {
    Timber.plant(new Timber.DebugTree());
}
```

例え `Timber.tag("hoge").i("piyo=%s", "fuga");` というメソッドが release ビルド時に残っていても、ログ出力されない、という状態が実現できます。エラーにもなりません。

以上、簡単ですが共有でした^^;
Stash(Bitbucket Server)でハゲのおっさんを召喚する

# Stashとは
Atlassian社製のGitリポジトリ管理ツール。
オンラインで利用出来るBitbucket Cloudがあるが、それのオンプレミス版がStash（現在ではBitbucket Server）で、プルリクエストやら細かい権限管理が可能になる。
JIRAなど他のAtlassian製品を利用している場合はなかなか便利。

# ハゲのおっさん
どどーーーん！！
![branch_permit_error.png](https://qiita-image-store.s3.amazonaws.com/0/16603/9a3f66a1-d113-204c-61d9-630a1df91462.png)


# ハゲのおっさんの召喚方法
Stashではブランチ毎に細かいパーミッション設定が可能だ。

![branch_permit.png](https://qiita-image-store.s3.amazonaws.com/0/16603/85addfa1-52ab-9246-d003-acc7311f1f59.png)
ここで「プル要求なしの変更」という怪しい日本語の項目にチェックしたうえでpushを試みるだけ。

私が働く現場ではプルリクしか受け付けないようなブランチにおいて上記設定を施している。
これによりラフプレーを防ぐだけでなく、マナー違反者に**愧死**したくなるような体験を与えている。

>愧死とは、死ぬほど恥ずかしい思いをすること。また、恥ずかしさのあまりターミナルを隠したくなるさま。

# ハゲのおっさんの正体
不明。誰かおしえてほしい。気になって眠れない、、
（目をつむると、ぼーっと浮かび上がる）
初めてのfullcalendar

この前fullcalendar触ったので、その時のロジックをメモ。

Gemfileに追加

```ruby:Gemfile.rb
 gem 'fullcalendar-rails'
 gem 'momentjs-rails'
```

jsに追記

```ruby:app/assets/javascripts/application.js
 //= require moment
 //= require fullcalendar
 $(document).ready(function() {
    $('#calendar').fullCalendar({
       events:window.hoge_datas
    })
});
```
コントローラでデータ取得＆成形

```ruby:app/controllers/hoge_controller.rb
def index
    #表示内容取得
    hoge_datas = Hoge.find_by_sql([
      'select * from hoge where hoge_id = ?',params[:hoge]
      ])
    #表示用データ成形
    @datas = [];
    hoge_datas.each do |data|
      @datas += [
        'title' => data['title'],     #"クリスマス!"
        'start' => data['start_time'],#"2015-12-24 00:00:00"
        'end'   => data['end_time'],  #"2015-12-25 24:00:00"
        'detail'=> data['detail'],    #"detail"
        'color' => 'red'
        ]
    end
```
ビューからjsにjson形式で値を渡し、呼び出す

```ruby:app/views/hoge/hoge.html.erb
 <%= javascript_tag do %>
   window.hoge_datas = <%= raw @datas.to_json %>;
 <% end %>

 <div id="calendar"></div>
```

動くとこんな感じになる。(12aはAM:12の意味らしい）
![fullcalendar.jpg](https://qiita-image-store.s3.amazonaws.com/0/95357/eb91b8c4-8591-05b9-b918-54dfc2d0eb5c.jpeg)


おわり
AWS API GatewayにおけるThrottling問題

**2015/11/27: 本件はAWSに報告済みの既知の問題です。**
**2015/12/24: AWSより回答がありました。問題改修までの間は、`Clone from API`を使わない方が良いようです。本ドキュメントでは、Clone API利用時の回避策を記載しています。**

# 概要

API Gatewayの`Throttling Settings`に関する不具合を共有します。
新規にAPIを作成する際はコピー元となるAPIを指定する機能があるのですが、ここに罠があります。

<img width="1142" alt="スクリーンショット 2015-12-22 22.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/5e58ca88-208e-56b6-143e-b45c89927b8c.png">

`Clone from API`を選択してAPIを作成すると、`Throttling Settings`の挙動がコピー元にエイリアスされてしまうのです。
つまり、`オリジンAPI`から`クローンAPI`を作成し、`クローンAPI`の接続数を`100`から`1`に変更すると、`オリジンAPI`も接続数が`1`に書き換わってしまいます。
API Gatewayにおいて、開発用エンドポイントから本番用エンドポイントをクローンして運用する場合は注意が必要です。

# 再現手順

以下にAWSコンソールから問題を再現する手順を記載します。

1. API Gatewayのダッシュボードから新規API`Origin` (API name) を作成。下図は`Integration type`を`HTTP Proxy`に指定したもの。恐らく`Integration type`は何でも構わない
  <img width="895" alt="スクリーンショット 2015-12-22 22.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/03f4c64e-c3db-a9b9-92da-5f0888ba7e58.png">

2. 新規にStageを作成し、`Throttling Settings`の`Burst Limit`、`Rate`をそれぞれ`100`に指定 
  <img width="881" alt="スクリーンショット 2015-12-22 22.46.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/44d69cc9-5946-38d9-3718-2f603eb60687.png">

3. API Gatewayのダッシュボードから新規API`Clone` (API name) を作成。API作成時のオプションで、`API Clone from API`から`Origin`を選択。`Integration type`は `Origin`と同じものを指定
  <img width="431" alt="スクリーンショット 2015-12-22 23.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/e7cdc179-60da-c75f-d41c-d86dbea3c58f.png">

4. 新規にStageを作成し、`Throttling Settings` の `Burst Limit`、`Rate` をそれぞれ `1`に指定 

`Origin`に対し20回の連続アクセスを試みたところ、半数のレスポンスでHTTPステータス`429`が返されました。 `429` は API Gatewayから返される、 `Limit Exceeded Exception` というエラーです。

[Handling Errors in Amazon API Gateway - Error Codes (Client and Server Errors)](http://docs.aws.amazon.com/apigateway/api-reference/handling-errors/#api-error-codes)

<img width="734" alt="スクリーンショット 2015-12-22 23.22.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/bbb18b75-904c-320d-2883-da93d8029849.png">

つまり、`Clone`に設定したはずのthrottleが `Origin`にも適用されてしまっているということです。うーむ。。

# 回避策

Clone APIを作成した場合は、Stageから対象エンドポイントを開き、`Settings` のタイプを ` Override for this method` に指定。ここで新たに `Throttling Settings` を指定することで問題を回避できました。

<img width="878" alt="スクリーンショット 2015-12-22 22.58.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/6c9e36ef-2109-d015-a9ec-a24ca0ff2d10.png">

問題が解消されるまでは、面倒ですがエンドポイント単位で `Throttling Settings` は設定したほうが安全なようです。