OmniAICreator/Qiita-1.07M huggingface dataset:
[1day1lang AdventCalender] day4 Python

# 環境構築

## インストール確認
```bash
$ python --version
Python 2.7.12
```

すでにインストールされている模様

## コマンドラインで Hello World
```bash
$ python
>>> print("Hello World!")
Hello World!
>>> exit()
```
## ファイルから Hello World
```py:helloworld.py
print("Hello World!")
```

```bash
$ python helloworld.py
Hello World!
```

#ツリー描画プログラミング

…時間が足りないのでまた明日追記
PostgreSQLとMySQLとMariaDBのNoSQL実装状況

:birthday: :tada: :birthday: Happy Birthday to me!! :birthday: :tada: :birthday:

この記事は[ラクス Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rakus)の6日目です。

昨日は@morihirokさんの「[rmの-fオプションで泣かないために](http://qiita.com/morihirok/items/48651c4c7b14cd7d5689)」でした。

OSS RDBに実装されたNoSQL実装状況まとめ
===

いつの間にやら主要なOSSなRDBであるPostgreSQLとMySQL/MariaDBにNoSQL機能（というよりもドキュメントDB機能）が付いていたので仕事にも使えそうなのでまとめ。

各種都合によりPostgreSQL優遇気味で。しかし "PostgreSQL contains NoSQL." の「お前は何を言っているんだ」感がすごいですね……。

各DBMSごとのNoSQL機能実装バージョン
---

### PostgreSQL

* PostgreSQL 9.4でjsonb型がサポート
    * 9.2でサポートされたjson型（テキスト）から発展し、jsonb型はバイナリで扱われる
    * jsonb型にもGINインデックスがはれる
* PostgreSQL 9.5でjsonb型結合演算子`||`や、jsonb関連の関数多数（[`jsonb_strip_nulls()`](https://www.postgresql.org/docs/9.5/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE)とか便利そう）が追加
* PostgreSQL 9.6で[`jsonb_insert()`](https://www.postgresql.org/docs/9.6/static/functions-json.html#FUNCTIONS-JSON-PROCESSING-TABLE)関数が追加

jsonb型を本格的に使うなら9.5以降という印象。なおCentOS7で9.5系を入れるためには[PostgreSQL公式yumレポジトリを追加](https://www.postgresql.org/download/linux/redhat/#yum)する。

参考：[PostgreSQL 9.4 の JSON サポートについて](http://qiita.com/kumazo/items/9010f9dad134b9d9d16d)

#### 公式ドキュメント

* 9.4
    * [JSON型](https://www.postgresql.org/docs/9.4/static/datatype-json.html)
    * [JSON関数と演算子](https://www.postgresql.org/docs/9.4/static/functions-json.html)
* 9.5
    * [JSON型](https://www.postgresql.org/docs/9.5/static/datatype-json.html)
    * [JSON関数と演算子](https://www.postgresql.org/docs/9.5/static/functions-json.html)
* 9.6
    * [JSON型](https://www.postgresql.org/docs/9.6/static/datatype-json.html)
    * [JSON関数と演算子](https://www.postgresql.org/docs/9.6/static/functions-json.html)

### MySQL

* [MySQL 5.7.8](http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-8.html#mysqld-5-7-8-json)にてJSON型をサポート
    * [JSON型](http://dev.mysql.com/doc/refman/5.7/en/json.html)
    * [JSON関数](http://dev.mysql.com/doc/refman/5.7/en/json-functions.html)
    * [MySQL 5.7.9](http://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-9.html#mysqld-5-7-9-feature)から[JSON内の項目にインデックスがはれるようになった](http://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html#json-column-indirect-index)
    * [MySQL 8.0.1](http://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html)ではJSONのアグリゲーションにも対応するようです

### MariaDB

* [MariaDB 5.3](https://mariadb.com/kb/en/mariadb/what-is-mariadb-53/#nosql-style-interfaces)にて[Dynamic Columns](https://mariadb.com/kb/en/mariadb/dynamic-columns/)として実装
    * ちなみにMariaDBは5.1→5.2→5.3→5.5→10.0→10.1→10.2(current)と変則的にバージョンを重ねている
    * 5.3ではリストとして扱われているようなのでネストとか出来ない様子
* MariaDB 10.0にて[`COLUMN_JSON()`が実装されてJSONとして扱えるようになる（ネストも可能になる）](https://mariadb.com/kb/en/mariadb/dynamic-columns-in-mariadb-10/)


あとがき
---

ほんとはPostgreSQL9.5で[CBCC :cookie: :tiger: :chocolate_bar: :cookie:](http://infinity.ta2ya.com/?v=DMjdkEA9jM8&start=0&end=44)で性能比較とかやろうかと思ったけれど、例年の誕生日近辺で不調に陥る病にかかったので断念。気が向いたら続編でも書きます。


明日は @kumakichi_kun さんの「[PostgreSQLのreplication_slotについて](http://qiita.com/kumakichi_kun/items/b6ec868ec091e776ef22)」です。


クッキーバターチョコクッキー！！
Dockerのコマンドとかについてちょっとだけ解説

Dockerで使うコマンドとかを備忘録的にまとめます

##Dockerfileで使う命令

* CMD
 * コンテナが起動するときに実行されるコマンドなど
 * shell形式(/bin/sh -c に渡される)とexec形式(JSONの配列)で記述できる
* COPY
 * ファイルやディレクトリをコピーする
* ENTRYPOINT
 * コンテナが起動するときに実行される実行ファイルを設定できる。
* ENV
 * 環境変数を設定できる
* EXPOSE
 * ポートを指定する(例 EXPOSE 80など)
 * 実際に使うときは```docker run -d -p 8000:80 {dockerイメージ名}```など
* FROM
 * ベースとなるイメージを選択する
 * Docker Hubにあるものや自作イメージなど
* MAINTAINER
 * イメージの作成者などの情報を設定
* ONBUILD
 * 本イメージが他のイメージのベースとして使われるときに、実行される命令などを指定する
* RUN
 * buildをした時に実行するコマンドを設定
 * 例 ```RUN apt-get update```など
* USER
 * ログインユーザを設定する
 * 事前にユーザを作成する必要がある
* VOLUME
 * ファイルやディレクトリをボリュームとして設定する
* WORKDIR
 * 作業ディレクトリを設定する

##docker runのオプション

|オプション    |役割|
|:----:|:--------------------------:|
|-d|デタッチ(バックグラウンドで実行する)|
|-i|インタラクティブにコンテナとやり取りを行う|
|-t|TTYを割り当てる|
|--rm|dockerのプロセスが終了したときにコンテナも自動で削除する|
|-e|環境変数を設定する|
|-h|コンテナのホスト名を指定する|
|--name|{名前}をコンテナに割り当てる|
|-P|ホストのポートとコンテナのポートを自動的にマッピングする|

-Pオプションの実行例

```
$: docker run -d -P test
09e0c70c761b906e4ef2f3a12bcbcd0c93dc75a26545c4780196cccb329ff216

$: ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
09e0c70c761b        test          "uwsgi --http 0.0.0.0"   2 hours ago         Up 6 seconds        0.0.0.0:32773->9090/tcp, 0.0.0.0:32772->9191/tcp   infallible_volhard
```
コンテナで指定した9090番ポートと9191番ポートをホストの32773番ポートと32772番ポートへ自動的にマッピングする。
そのため、1つのホスト上で複数のコンテナを使うときには便利


##その他のコマンド
```docker create``` コンテナを作成するが、起動はしない
```docker cp``` ファイルやディレクトリをホストとコンテナでやり取りする
```docker kill```コンテナを終了させる
```docker pause```コンテナをサスペンドする
```docker restart```コンテナを再起動する
```docker rm```コンテナを削除する
```docker start```コンテナを起動させる
```docker stop```コンテナを停止させる。削除はしない
```docker port```指定したポートのマッピングリストを表示する
```docker ps```起動しているコンテナを表示する(-a オプションで停止したコンテナも表示)
```docker images```ローカルに取得しているイメージを表示する
```docker rmi```イメージを削除する
```docker build```Dockerfileに基いてイメージを作成する
```docker pull```イメージをDocker Hubなどからダウンロードする
東大女子ハッカソンに参加してみて思ったプログラミングの初め方

FiNCでエンジニアインターンしているnathanと申します。([@OTA57](https://twitter.com/OTA57?lang=ja))

この度、東大女子ハッカソンに学生メンターとして参加してきたのでざっくりまとめてみます。

# 東大女子ハッカソンとは
*東大女子限定のハッカソン*です。（そのまんまですね）
昨年までは一個だったのですが今年から２個になりました。（そろそろ男子限定もほしいところ）

- TeaTimeHackathon(TTH)
- TokyoGirlsHackathon(TGH)

の二つです。（なんともまぎらわしい）
両方共メンターとして参加してきました。（がめつい）
それぞれについて詳細を紹介します。
どちらにも共通するのは

- 運営も東大女子（サポートの先生や男子はいる）
- 学生メンターは男子（重要）
- 複数の企業が協賛（まあ当たり前）
- チームエントリーは認められていない
- 事前講習会やアイデアソンもある

ってあたりです。

## TeaTimeHackathon(TTH)
- 3年連続３度目の開催
- 会場はDMM.make AKIBA
- [GCL](http://www.gcl.i.u-tokyo.ac.jp/courses/overview/)主催
- 今年度のテーマは「日常に感動を」
- 電子工作をテーマに全班に[Arduino](https://www.arduino.cc/)が貸し出され、それを用いて何か作るというものでした。
- スポンサー企業
  - DMM.make AKIBA
  - インテル株式会社
  - 株式会社キョウデン
  - ソニーモバイルコミュニケーションズ株式会社
  - ソフトバンク株式会社
  - 日本マイクロソフト株式会社
  - 株式会社メルカリ

電子工作。いかにもって感じのスポンサー企業ですね。

## TokyoGirlsHackathon(TGH)
- 今年初の開催
- 会場はJBS(日本ビジネスシステムズ)
- [東京大学新聞社](https://utnp.stores.jp/)主催
- テーマは「心と体」
- androidアプリを主題に全班に[Polar Loop2](https://www.polar.com/ja/products/get_active/fitness_crosstraining/polar_loop_2)が貸し出され、それやそれのAPIを用いてもよいというものでした。
- スポンサー企業
  - 株式会社いい生活
  - 株式会社ぐるなび
  - サイボウズ株式会社
  - 新日鉄住金ソリューションズ株式会社
  - ソーシャルテクノロジー株式会社
  - 株式会社DMM.comラボ
  - 日本ビジネスシステムズ株式会社
  - 富士ゼロックス株式会社
  - 富士フイルム株式会社
  - ヤフー株式会社

これまたアプリって感じのIT企業がずらっと並びましたね。

まあそんなこんなでテーマから真反対（ハードとソフト）なわけなんですが、運営方法？とかも結構違ってて一長一短って感じだったんで紹介します。

## アイデアソン
### TeaTimeHackathon(TTH)
- 東大工学部4年生（ハッカソン経験多め）によるアイデアソン講義

#### いいところ
学生目線だし、実際にハッカソンで使ったアイデア発想法なので今回のイベントには非常にマッチしている。

#### よくないかもしれないところ
一方で学生の考えなので、実際に社会で通用するかはわからないかもしれない。（いうて東大生ならあんまり関係なさそう）

### TokyoGirlsHackathon(TGH)
- サイボウズ様によるアイデアソン講義

#### いいところ
実際のサービス作りにも活かされているアイデア発想法なのでしっかりしている。

#### よくないかもしれないところ
一方で実際の会社だとアイデア出しが仕事の一部な人もいたりするわけで、要するにプロ向けの発想法である。
が故に、初心者にはわかりにくい部分もあるかもしれない。（東大生ならあんまり関係なさそう）

## 事前講習会（というかテーマについて）
### TeaTimeHackathon(TTH)
- 電子工作・東大工学系大学院修士2年（電子電気系の研究室）による講習会

#### いいところ
上と一緒で参加者と同じ学生なので目線が似ている、であったり、質問がしやすい等があげられる。
また回路に関しては義務教育である程度は習うので、説明書や資料通りに繋いでみるだけでもある程度は挙動が理解できたりする。
また実際に作ったものが目に見えているので子供心じゃないけど楽しい。

#### よくないかもしれないところ
（筆者のただのイメージですが）電子工作はちゃんとした知識がないとしっかりしたものは作れないし（電圧の目安とかは初心者には難しい。）、ネットにそんなに正しい情報が落ちているわけでもない。
故にメンター主導になってしまいうるかもしれない。

### TokyoGirlsHackathon(TGH)
- androidアプリ・JBSによる講習会

#### いいところ
こっちのほうがいわゆるプログラミング感はある。（ハッカソンというとって言う感じ？）
実際TTHでもっとガリガリ言語書くのイメージしてましたっていう意見も聞いたりした。（まあでも世界観の広がりという意味ではいいかも）

#### 悪いところ
セットアップ等に時間がかかる。
サンプルコードをコピペして動かしても何が起きてるか全くわからないことも多い。
１日でandroid教えるのは至難の業。


結論的にはもはや好みだと思っているんですが笑
ハードの初心者向けハッカソンもソフトの初心者向けハッカソンも
無料で参加できて景品も豪華（どちらも優勝は◯万円相当でした）！
これはもう参加するしかないですね。

気が向いたら実際のプロダクト等追記します。
OpenTypeの仕様入門 (中編)

# コードポイントからグリフIDを取得するまで
今回は、前回触れたOpenTypeフォントに含まれる代表的なテーブル、`cmap`についてお話しします。
こちらはすべてのOpenTypeフォントに含まれる必須の情報です。

## `cmap`: Character to glyph mapping

`cmap`は文字コードのコードポイントをグリフID (GID) に変換するものです。
グリフというのはフォントの中に入ってる描画要素≒文字のことでした。

見つかったGIDに対応するグリフを描画することで、我々のディスプレイには正しい文字が表示されるのです。
もしここでコードポイントが見つからなければ、GIDが0のグリフが使用されます（`.notdef`と呼ばれることもあります）。
これはNotoフォントの名前の由来にもなった豆腐というやつですね。

### `cmap`には複数の変換表が存在する
`cmap`には複数のマップ: 文字コード↦GIDが存在し得ます。
これは例えば、Shift_JIS↦GIDとUnicode↦GIDがある場合であったり、UnicodeだけだとしてもUCS-2↦GIDとUSC-4↦GIDが存在する場合であったりします。
ここで、

- GID = [0,グリフ総数) ⊆ {0,1,...,65535},
- UCS-2 ⊂ UTF-16 ⊂ UCS-4 = UTF32.

複数の変換表があるため、`cmap`の先頭には自身がいくつの変換表を持っているかという情報を持ちます。
そして、それぞれの変換表は`platformID`と`platformSpecificID/encodingID`を持ちます。

- `platformID`
    - Macintosh, Microsoft, Unicodeのどれか（すごいね）
- `platformSpecificID/encodingID`
    - Unicodeのバージョンや符号化方式、文字コード

これの情報から自分の求める変換表を見つけ出し、その表に従ってコードポイントからGIDを取得します。
ここは仕様に唯々諾々と従うのみです。
今のフォントには多くの場合、Unicodeからの変換表があるので安心して大丈夫です。

`cmap`の変換表は基本的にはひとつのコードポイントからひとつのGIDへの変換になっています。
ただし、2つほど例外があります。

#### Format 13
これはひとつのコードポイント**範囲**からひとつのGIDへの変換になっています。
この変換表の主な用途はフォールバックフォントです。
つまり、他にそのコードポイントのグリフがない場合に、Unicodeの範囲ごとに異なるグリフを返すことができるようになります。
（どの言語のグリフなのかという程度の情報を人間に授けることができます）

#### Format 14
これはUnicode Variation Sequences (UVS) と呼ばれるもので、日本では異体字セレクタなどと呼ばれています。
これは漢字の後ろに異体字セレクタと呼ばれるUnicodeのコードポイントを置くことで、

- 東京都葛󠄁飾区の葛󠄁
- 奈良県葛󠄀城市の葛󠄀

といった字体の違いを表現することができます。
ここでは

- 葛󠄁: 葛の後ろにU+E0101が続く
- 葛󠄀: 葛の後ろにU+E0100が続く

というように1文字が**漢字＋異体字セレクタ**で構成されています。
あれ？　ということはつまり、コードポイント2つが`cmap`で1つのグリフに変換されていますね。
（リガチャなどの合字とは違って`cmap`のレベルで変換されているのが面白ポイントです。そしてリガチャの話は`GSUB`テーブルのところで説明します）

## `cmap`のつらい制約
グリフIDの最大値は65535 ( = 2^16 - 1) です。
一方Unicodeのコードポイントの数は（定義されているかどうかは別にして）100万以上あります。
素晴らしいですね。
（はやく最大グリフ数が増える仕様が策定されないかなあ）

# おわりに
フォントのグリフ数が65535個（`.notdef`を除く）という制約は思いの外厳しく、Source Hans Sansなどはそれをフルに埋めたことで話題になりました。

さて明日、明日こそOpenTypeの仕様入門を完結させます。
内容は、

1. `GSUB`テーブル
    - 文字列から`cmap`で変換されたGID列をさらに別のGID列に変換する
2. `GPOS`テーブル
    - グリフとグリフの位置関係をGIDベースで調整する

です。
Twilio の抑えておきたい障害時のアラート


Twilio を利用するということは、コミュニケーションというインフラを支えるサービスを開発する責務を負うことになります。人々にとって「動いていて当たり前」なサービスを実現するために、すぐにでも障害が検知できるような仕組みを整えましょう。

本記事では私が日頃からキャッチアップしている情報元をご紹介します。

## [Twilio Status](https://status.twilio.com/)
全国の Twilio の運営ステータスを共有するハブです。RSS なり Twitter なりでフォローしておくと良いでしょう。私は RSS を Slack で連携させていつでもキャッチできるようにしています。

ただ実際はほとんどが日本国外の障害通知であり、グローバルに Twilio サービスを展開していない限りはほとんど役になることはありません(それはそれで安定していいことです)。 Twilio Video や Chatといったサービスは、グローバルな情報となるので、基本的に電話以外をやっている場合はしっかりフォローしておいたほうが良いでしょう。

私たちの場合は Twilio Chat でこのアラートが役に立ったことがあります。

## [KDDI ウェブコミュニケーションズ社の障害報告](http://twilio.kddi-web.com/news/mainte/)
こちらが日本での障害通知を出していただいているページです。こちらも RSS で提供してくれているので、キャッチアップしておきましょう。

今年の 6,7月あたりは色々と工事があって大変だったみたいですが、最近は落ち着いています。いつもありがとうございます。

## Twilio と接続するサーバーのエラー検知

不正な TwiML や、Webサーバ側のエラーで正しく電話ができない、という場合も当然あることでしょう。その場合は Twilio が原因ではなく、 Web サーバ側の問題です。この住み分けは簡単にできます。 Twilio では豊富なデバッグツールや検知の仕組みを用意してくれているためです。

特に大事なのがフォールバックURL です。これは最初の Twilio からの電話リクエストに失敗した時に限り、リクエストを送るセカンダリのような役割を果たします。TwiML を返すサーバーがそのものが落ちていたりする場合にフォールバックURLすらも動かなくなってしまうので、フォールバックURL先は別のサーバーを指定したいところです。

そんな時は是非 巷で話題のサーバーレスアーキテクチャを使いましょう。以前、私がハンズオンという形で紹介した [Qiita の記事](http://qiita.com/kimihom/items/941b5c7ee87371db9dbf)をシェアします。

## そもそもの根幹をキャッチするには
Twilio から発せられる障害通知は、ユーザーからもしくは Twilio サーバ側でアラートを受け取って、運営元が確認が取れ次第出てくる情報のため、どうしてもタイムラグが発生します。まず気づかなければならないのは Twilio でサービスを提供している私たちです。

ほとんどの場合、問題の原因となっているのはアプリケーション開発者側の問題です。先ほどの説明の通り、 Twilio から受け取るリクエストを正しく返せていなかったり、Webサーバー自体が落ちていたりするような場合です。色々な原因を探った上で、明らかに Twilio で問題が起きている、とわかった時点で私は[問い合わせる](https://twilio.kddi-web.com/form/inquery_support.html)ようにしています。

ここで私が行っているのは、問い合わせる前に、「今 Twilio 調子悪くないですか？」と言い合えるような他のTwilioユーザーさんと繋がっています。Twilio をかなり使い込んでいる会社さんと情報共有を密に取り、何かあればお互いがすぐに連絡を取り合って確認しあえるあような状態を作っています。このような関係をは Twilio ユーザー同士で作ることができると思いますので、共有できる間柄を増やしたいと思っています。もし興味あればご連絡いただければ幸いです。
Dropbox で dokuwiki を動かす on macOS

dokuwiki を Dropbox に置いて動かすことができたので、自分のメモも兼ねて設定を書いておく。

dokuwiki の良さについては [Wikiの中でDokuWikiをオススメする理由 \[DokuWikiで研究生活\]](http://dokuwiki.oreda.net/dokuwiki.html) などが詳しい。

## モチベーション
自分はラボ用の mac book と個人用の mac book を使っているが、dokuwiki は個人用の方にしか入っていなかったので、どうにかしてラボ用 mac でもwiki を使えるようにする必要があった。
そのための選択肢としては、

+ VPS を借りて動かす
+ Azure・AWS などで動かす

などがあったが、どっちもお金がかかる上にセキュリティの設定とか色々めんどくさい。
そこで、 Dropbox や Google Drive のように、mac では自動で同期してくれるフォルダに置けば楽だしタダだし最高なんじゃないかと気づいた。

## インストール
まずは普通にローカルの ~/Sites/dokuwiki で動かす。

基本的なことは公式 wiki に書いてあるのでそちらを参照のこと。
https://www.dokuwiki.org/install:macosx

このページの 1 から 4 をとりあえずやる。
ただし、 El Capitan 以降ではセキュリティが厳しくなったのかこのままだと動かない。
そこで、
https://coolestguidesontheplanet.com/get-apache-mysql-php-and-phpmyadmin-working-on-osx-10-11-el-capitan/
に従って諸々設定する。

dokuwiki の場合は MySQL を使う必要はないので、[PHP の節](https://coolestguidesontheplanet.com/get-apache-mysql-php-and-phpmyadmin-working-on-osx-10-11-el-capitan/#ssu) までやれば良い。

一旦ここまでで `http://localhost/~username/dokuwiki` で動いているか確認。

## dropbox への移動
~/Sites で動かすことができたら、Dropbox に移行する。
といっても大して難しいことはなく、 Dropbox に mv して ln -s して権限修正するだけ。

まず、Dropbox フォルダに wiki を移動する。

```
cd ~/Sites
mv dokuwiki ~/Dropbox
```

つぎに、移動先にシンボリックリンクを貼る

```:~/Sites
ln -s ~/Dropbox/dokuwiki dokuwiki 
```

この状態で `http://localhost/~username/dokuwiki` にアクセスしても、おそらく wiki にはアクセスできない。
これは、 ~/Dropbox にアクセスする権限がないためであるので、

```
chmod 707 ~/Dropbox
```

とすれば、 `http://localhost/~username/dokuwiki` にアクセス可能になるはず。

## 動かないとき
多分どこかしらの権限か Apache の設定を間違えている。
落ち着いて /var/log/apache2/error_log を見れば解決するはず。

ありがちなのは、

+ [ ] dokuwikiフォルダで`sudo chown -R www data conf lib/plugins`をしたか？
+ [ ] /etc/apach2/uses/${username}.conf の Options に FollowSymLinks は設定しているか？
+ [ ] Dropbox フォルダの権限を修正したか？

などだろうか。

## 動かしてみて
wiki を触ると Dropbox のファイル変更通知がとめとなく来るようになってうるさい。（もちろん通知を切った。）

記事を書いて思ったが、mac の複数台持ちというのはかなりユーザーが限られてそうだし、同じようなことが Linux や Windows でもできるのか誰か確認してほしい。
iCloud に iPhone のバックアップをとらない設定

# iCloud の無料プランはストレージ容量が 5G しかない

iCloud は標準で 5G の無料プランが使えますが、 iPhone のバックアップがこの範囲に収まることはまず無いと思います。

しかし、 iPhone は標準で iCloud にバックアップを作る設定になっているので、ストレージ容量不足でバックアップできない旨のダイアログが定期的に出てきて鬱陶しいです。

ということで iCloud へのバックアップの試み自体無駄なので解除します。

# 設定変更方法

* 設定
 * iCloud
 * バックアップ
 * iCloudバックアップ を OFF

以上です。

# バックアップは大切

5G では元々バックアップが取れないケースの方が多いと思いますが、いずれにしろ iCloud でバックアップをとらない以上、必要であれば iTunes で PC にバックアップを取るようにしましょう。
Windowsでmecab-ipadic-NEologdの導入

#はじめに
基本的にWindows環境での導入は想定されていないMeCabのカスタムシステム辞書mecab-ipadic-NEologdの導入をWindows上でやってやろうじゃないか、という記事です。
Windows10のAnniversary Updateで更新された`Bash on Ubuntu on Windows`を利用しての導入となるので、Windows10上でしかできません。あしからず。

#MeCabとは？
オープンソース形態素解析エンジンのこと。文章を動詞、名詞などの品詞に分解して色々な処理ができます。検索すれば詳しい導入解説サイトがあるので、ここでは公式サイトを共有しておこうと思います。最新バージョンは0.996で.exeインストーラをダウンロードするのがおすすめです。

参考：http://taku910.github.io/mecab/

#mecab-ipadic-NEologdの導入

##mecab-ipadic-NEologdとは？
”mecab-ipadic-NEologdは、多数のWeb上の言語資源から得た新語を追加することでカスタマイズしたMeCab用のシステム辞書です。”―――公式サイトより
　
簡単に言えば既存の辞書に流行語や新語を含んだMeCab用の辞書なのです。
例えば「進撃の巨人」というフレーズが「進撃　の　巨人」と分解されずに「進撃の巨人」の1単語として取れるといった感じです。ありがたい。

参考：https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

この辞書の製作者さんが定期的に辞書の更新を行ってくれるので、様々な流行語や新語に対応できます。このシステム辞書を導入しないと、Twitterで流行している言葉はおろか、漫画アニメ書籍のタイトルなどがそれはもう無残なまでにバラバラにされてしまいます。Tweetデータの解析をする上ではmacab-ipadic-NEologdの導入は必須でしょう。

##導入方法
###Bash on Ubuntu on Windowsの導入
Linuxコマンドを使ってmecab-ipadic-neologdをインストールする方法をとりますので、まずはコマンドプロンプト上でLinuxコマンドを叩けるようにしましょう。
以下のサイトを参考にしましょう。

参考：http://qiita.com/Aruneko/items/c79810b0b015bebf30bb


###mecab-ipadic-NEologdのインストール
インストールの手順は製作者の公式サイトを参考に導入しましょう。

参考：https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

これを参考にインストールの手順まで行くと、Step.2を実行している途中でインストールが完全に完了することなく止まってしまいます。

具体的には、
>$ cd mecab-ipadic-neologd
>$ ./bin -install-mecab-ipadic-neologd -n

この後インストールは正常に進行しているように見えますが、いざインストールだ！と"yes"と打ってもエラーを吐いてインストールが正常に完了しない。

どうやらmecab-configに記述されているフォルダパスの問題でBash on Ubuntu on Windowsを使っては正常に動作しない模様。mecab-configを書き直せばできるのだろうか・・・困ったものです・・・。

しかし、辞書本体は正常に解凍されているので、`C:\mecab-ipadic-neologd\build`(mecab-ipadic-neologdのインストールフォルダ)以下に、

`mecab-ipadic-2.7.0-20070801-neologd-2016[更新日時]`

というようなフォルダ名で存在している。辞書よ、こんなところにいたのか。

`C:\MeCab\dic`(MeCab本体のインストールフォルダ)内の`ipadic`に元々のシステム辞書が入っているため、`mecab-ipadic-2.7.0-20070801-neologd-2016[更新日時]`を`ipadic`にリネームして置き換える。

これで完了です。

最新版を1コマンドで取得するなんてことはできませんが、以上の同様の手順をとることでシステム辞書を手動更新することが可能です。

#最後に

以上、Windows端末でMeCabを使いたいけれど辞書が古くて目的の単語が取れないよ！という人のための記事でした。特にTweetの解析がしたい方は参考になるかと思います。

Windows端末がちょっと不便だなと感じた瞬間でした。
Swift愛好会合宿 2日目 レポート


2日目のレポートです。
正直合宿のダメージでその日のうちに作業するのは無理でした。

##7:30 起床
Swift愛好会の朝は早い
![01_0730.png](https://qiita-image-store.s3.amazonaws.com/0/11776/d54cc4e3-3391-1d0a-56ca-f747174ab3c2.png "01_0730.png")

##8:30 宴会場「撫子」 朝食
ご飯と味噌汁、そして湯豆腐が堪らなく体に沁みました。
![02_0830.png](https://qiita-image-store.s3.amazonaws.com/0/11776/e8cb0675-09c3-7bbc-6a3f-dfe4fd47d067.png "02_0830.png")


##9:30 朝活
私の日課のビルド作業、つまり継続的肉体開発ですね。
何人か一緒にやってくれましたが慣れない運動の成果その後の作業に影響が出る人もちらほら。
![03_0930.png](https://qiita-image-store.s3.amazonaws.com/0/11776/a1bfe9ab-1f01-1960-dee3-a2f0f8f5993b.png "03_0930.png")


##10:20 メタモン捕獲
合宿に参加してよかった。
![04_1020.png](https://qiita-image-store.s3.amazonaws.com/0/11776/ec26e01e-2590-b16e-bc7c-ab1ec872cf10.png "04_1020.png")


##12:00 乾杯
Swift愛好会はとにかくこれが無いと始まりません。
![06_1200.png](https://qiita-image-store.s3.amazonaws.com/0/11776/51901ec5-b9aa-0039-aea7-7bc487b46440.png "06_1200.png")


##13:00 談義
各自成果報告などを。私は会長にニンジャスレイヤー見せたいというだけでHomeKit Hackの話をしました。
あと「ガジェット軍曹」を襲名しました。
![05_1300.png](https://qiita-image-store.s3.amazonaws.com/0/11776/684a5bd0-ade7-52bf-c711-f340791539de.png "05_1300.png")

発表資料
https://speakerdeck.com/tamaki/homekit-hack

ゆるい雰囲気で談義が続く、これでも真面目にクリーンアーキテクチャの話聞いてるとこなんですよ？
![07_0000.png](https://qiita-image-store.s3.amazonaws.com/0/11776/479e8383-711a-f5a7-2ce8-5b8e8a18a438.png "07_0000.png")


##15:30 撤収
長かった合宿も終わりです。ツワモノどもがなんとやらです。
![08_1500.png](https://qiita-image-store.s3.amazonaws.com/0/11776/67bac981-1cf8-3dc1-052a-1801d1cef171.png "08_1500.png")


##16:00 成田駅と乾杯
ここで帰る方は帰り、打ち上げに行く人は打ち上げに。
そうです、この会まだ飲むんです。
![out.png](https://qiita-image-store.s3.amazonaws.com/0/11776/037e269d-4198-3aad-90ed-503baac24aac.png "out.png")


##21:00 会長権争奪腕相撲大会
もう酔っ払い達は止まりません、本当に会長変わりました。
![10_2000.png](https://qiita-image-store.s3.amazonaws.com/0/11776/eae9a04e-5f64-7156-106f-9d8793580f76.png "10_2000.png")


##21:30 解散
疲労困憊です、電車寝過ごしそうで怖かった。

##2日目のタイムラプス
[![タイムラプス](http://img.youtube.com/vi/3Zsh1YZ01ko/0.jpg)](https://www.youtube.com/watch?v=3Zsh1YZ01ko)

#まとめ
高校生の修学旅行並みにみんなテンション上がってましたね。非常に楽しい時を過ごせました。
偶然取れたいい感じの写真を話題の「Everfilter」に突っ込んで出来た奇跡の成果物
![IMG_1443.PNG](https://qiita-image-store.s3.amazonaws.com/0/11776/0a02103f-05a6-ec67-7864-d14e6d7fd333.png "IMG_1443.PNG")

一応自分がもくもく時間でやりたかったAppiumについてももそれなりに調査進みました😀
その内容は後日まとめます。


#おまけ
あまりにもリクルートっぽい絵が合ったのでそれっぽい画像にして遊んでました。
**うぃーあーはいやーど!**
![出発ー_2267.jpg](https://qiita-image-store.s3.amazonaws.com/0/11776/37234617-0767-c699-2f2a-9959bc1bd853.jpeg "出発ー_2267.jpg")
(ネタ画像なので弊社エンジニアは写ってませんし、公式な画像ではありません)
非開発な現場での JIRA の活用方法

> 昨日は、 [akiko-pusu](http://qiita.com/akiko-pusu) さんによる [「SourceTreeでもいいですよね... & 今年もSnippetsで参加します！」](https://bitbucket.org/snippets/akiko_pusu/ooR49) が公開されました！

#この記事について
皆さん、こんにちは！

アトラシアンの犬山です。普段は コミュニティの担当をしていて、主に [Atlassian User Group](http://aug.atlassian.com/cities/tokyo) のサポートやイベントのブースでデモをお見せしたり、皆さんのご相談や質問にコミュニティレベルでユーザー目線から回答したりしています。とはいえ、実はオフィスではオフィスマネージャーとしてあらゆるバックオフィスのサポートもしています。この記事では、アトラシアンの社内でどのように Confluence や JIRA Service Desk が活用されているのかを共有したいと思います。

#どういう現場で使われているのか
例えば下記のようなリクエストを行うときに、JIRA を使っています。

- 契約書のリビューのリクエスト
- オフィス備品の購入リクエスト
- 支払処理
- 新入社員のアカウント設定リクエスト
- ブログ記事等のリビューリクエスト

# JIRA Service Desk のいいところ
####**簡単に承認プロセスが作れる**
バックオフィス関係のタスクで、非常に大切なプロセスが「承認」のプロセスです。JIRA Service Desk を使うと簡単に承認ワークフローを作成することができます。

1. 「基本的なサービスデスク」とのテンプレートを利用してプロジェクトを作成する。
![Screen Shot 2016-12-06 at 22.40.31.png](https://qiita-image-store.s3.amazonaws.com/0/70226/b6fdf840-60fd-1c34-924d-c3ac8c617344.png)
2. プロジェクトが作成できたら、「Purchase」ワークフローの編集画面に移動する。
3. 「Awaiting Approval」のステータスをクリックし、「承認を追加」のチェックボックスをマークする。
![編集_—_JIRA_Service_Desk_Purchase_Workflow_generated_for_Project_ISD_-_JIRA.png](https://qiita-image-store.s3.amazonaws.com/0/70226/66531bf5-ff4d-525b-1e1e-17a4e40784f3.png)

4. 「環境設定」のリンクから、個人の承認を得るワークフローにするのか、チームメンバーのうちの何人かまたは全員の承認を得るためのワークフローにするのか、また承認もしくは拒否された後のワーフフローの遷移もここで指定することができます。
![Screen Shot 2016-12-06 at 22.57.34.png](https://qiita-image-store.s3.amazonaws.com/0/70226/e3fd3f5d-23d4-3899-13ed-311ececdc7c2.png)

5. これで承認プロセスが完成しました！これで、リクエストフォームに Approver (承認者) のフィールドが自動作成され、課題画面に Approvers が表示されます。

![Screen Shot 2016-12-06 at 22.32.58.png](https://qiita-image-store.s3.amazonaws.com/0/70226/f07a47ea-e9d8-61fe-a09e-7ec051a04307.png)
![Screen Shot 2016-12-06 at 23.00.23.png](https://qiita-image-store.s3.amazonaws.com/0/70226/bf6a71ab-e3e0-ecfc-ad59-aa79266c93dc.png)

承認者は、リクエストが作成されると、JIRA 画面に「Approve」と「Decline」のボタンが表示されるようになります。
![Screen Shot 2016-12-06 at 23.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/70226/a26f4232-a12d-b5b6-cd0e-d8f1e46a5d49.png)

####**チャットで話しても JIRA で履歴がわかる**
JIRA の課題画面を見ると、「Hipchatディスカッション」というセクションがあります。そこから、「ルームを作成」のボタンをクリックすると課題番号がルーム名になり、関係している人をルームに招待し、Hipchat で問題を簡単に解決することができます。
![Screen Shot 2016-12-06 at 23.17.31.png](https://qiita-image-store.s3.amazonaws.com/0/70226/1daa5866-b067-2887-41e4-98b663d306e6.png)

また、課題のリンクが Hipchat 上で共有されると JIRA の課題に更新されます。またどのルームでいつ誰が話されたのかもわかります。
![Screen Shot 2016-12-06 at 23.17.44.png](https://qiita-image-store.s3.amazonaws.com/0/70226/26376f69-f666-a2aa-f240-fe89cc286ac0.png)

ちょっとこれはストーカーぽくって正直怖いですが笑、アトラシアンの経理はマニラにあるので、彼女たちのオフィスが閉まる前に早く物事を決めたいときなどは本当にチャット + こういった履歴機能があると非常に便利です。
 
他にもいいところはいっぱいあるのですが、長くなってきたので今回はこの２つだけの紹介にします。
#今後試してみたいこと
「他のサービスのAPIと連携」です。例えば、Amazonやアスクル で欲しいもののリンクを JIRA 上のフィールドに入れていると、予算の承認後自動的にオーダーしてくれるとか、財務ツールをとかと連携させてサービスデスクと処理を同期させたり、、、来年は、そういったことに挑戦してみたいと思います。

> では、明日は [14kw](http://qiita.com/14kw)さんによる **wiki移行** についてのお話です！お楽しみに〜🌟
dart 1.21.0 CHANGELOGを勝手なことをつぶやきながら訳してみた

## 1.21.0

まだDart 1.21.0はリリースされていませんが、リリース予定日を6日過ぎ、オープンイシューがなくなったので、[sdk/CHANGELOG.md at master · dart-lang/sdk](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md "sdk/CHANGELOG.md at master · dart-lang/sdk")を訳しました。

### Language

* ジェネルックメソッドの文法だけサポートしたよ。 型引数は実行時には使えないよ。詳しくは[未(?)公式仕様](https://gist.github.com/eernstg/4353d7b4f669745bed3a5423e04a453c)を参照してね。<br>
_ということですので、あくまでも文法(訳注:とコンパイル時エラーの意味論)だけです。周辺ツールを含めて影響範囲が色々広いから、まずは肩慣らしということだと思います。_
* 初期化型仮引数(initializing formals)への(訳注:初期化リスト内での)アクセスをサポートしたよ。 例:こんな感じで`x`が`y`の初期化で使えるよ`class C { var x, y; C(this.x): y = x; }`。
 詳しくは[未(?)公式仕様](https://gist.github.com/eernstg/cff159be9e34d5ea295d8c24b1a3e594)
 を参照してね。<br>
_いままで``--initializing-formal-access``で利用可能だった機能ですね。_
* switchのcaseが`rethrow`で終わる場合は、case通り抜けを警告しないようにしたよ。<br>
_って、`rethrow`は通り抜けないし、元から。_
* switchのcase全体が`break`、`continue`、`rethrow`、`return`、`throw`で終わるブロックだった場合もcase通り抜けを警告しないようにしたよ。<br>
_構文解析が賢くなったってことですね。今回はrethrowを忘れていない。_
* 名前付き引数のデフォルト値区切りに`:`に加えて`=`を許すようにしました。<br>
_これ、言うほど重要なのか? きっとあれだ、[`:`で右から型修飾](https://github.com/dart-lang/dart_enhancement_proposals/issues/42 "Right Hand Types · Issue #42 · dart-lang/dart_enhancement_proposals")するための布石。_

### Core library changes

* `dart:core`の`Set.difference`は引数として`Set<Object>`を取るようにしたよ。<br>
_`Set.union`が `Set<T>`を取るのは兎も角、`Set.intersection`は元から`Set<Object>`を取るから、`Set.difference`でうっかり`Set<t>`ってしちゃったのを直したって感じかな?_
* `dart:developer`

  * `Service`クラスの追加。
      * Allows inspecting and controlling the VM service protocol HTTP server.<br>
_VM service protocol HTTP serverが分からな過ぎて訳せない(´・ω・｀)_
      * `Isolate`の識別子にアクセスするAPIを提供したよ。

### Tool changes

* Dart Dev Compiler

  * 遅延(ロード)ライブラリに対して`loadLibrary()`を呼べるようにしたよ。遅延(ロード)ライブラリはまだ積極的(最初)にロードされるよ。 (#27343)<br>
_これもまずは文法だけから。_
sway(i3のwayland版)のメモ

#sway
i3のwayland版のタイル型ウィンドウマネージャーだがまだバグが多いのでメモ程度に書き留めておこうかと。

#i3と比べての魅力
###タイル状態で指定された解像度でリサイズができる！
i3と比べてなんといっても最大のメリットとはタイル状態のウィンドウに直接解像度を指定できること。
ゲーム画面や動画画面をきっちり1280x720とかに設定したいときにとっても便利。キッチリが快感。
###swaygrabというスクリーンキャプチャがついてくる
i3と同様にprintscreenキーはさっぱり未設定なんだけどswaygrabという静画、動画キャプチャーツールがついてくる。
man swaygrabを見れば使い方は簡単にわかるんだけどソースを見たら-f をつけることで現在フォーカス中のウィンドウだけをキャプチャすることができるという隠し機能を発見！これは便利なのでぜひ~/sway/configで登録すべし。
###i3forkのgapsとかが使える。
i3-gapsのパッチを取り込んでいるので様々な追加機能がついてる。
###mod+左ドラッグでタイルの入れ替えを行える
タイトル通り

#良くない点
最新の更新でだいぶマシにはなったが一部のアプリケーションのメニューが時々バグる。
openglを使ったアプリケーションは一時停止時でもswayに謎の負荷がかかってる(仕様かも？)
nvidia使えない。nouveauでもなんかカーソル以外起動しない(おま環かも？)。KMS有効以外にも条件がありそう。
mod+fでフルスクリーンにするのとアプリケーション側でフルスクリーンにするときと見え方が違う(わりとどうでもいい)

#sway特有の設定メモ
###起動はsway
gdmからの起動だとなんか変。
単純にswayというコマンドから起動したほうがよい。
###せっかくwaylandのlibinputなんだからaccel_profile flatだよね
waylandだからinputの設定もswayconfig内で変更する。
ゲーミングマウス使ってるからマウスの動きと画面を1:1で動かしたいのでarchの解説ページより

```bash
swaymsg -t get_inputs
```
でデバイス情報をゲットして

```~/.config/sway/config
input "なんちゃら" {
  accel_profile flat
}
```
を追記。

#まとめ
swayは(intelまたはradeonのGPUかつswayがバグらないアプリケーションを使う人には)十分使える。かも？
BigqueryのAVROフォーマットエクスポートをembulk-parser-avroで活用する

Bigqueryはしばらく前から、AVROフォーマットでデータをエクスポートできるようになっています。
AVROフォーマットは、Apacheプロジェクトの一つとして開発されているシリアライズフォーマットで、以下の様な特徴を持ちます。

- バイナリフォーマットでとてもコンパクト
- 型情報を持ったスキーマがある、スキーマはJSONで定義する
- JSONの様に入れ子が可能
- null可かどうかをスキーマで表現可能
- シリアライズして出力した後でも別のスキーマに変更できる

恐らく一番大きな特徴は型付きでバイナリにシリアライズしているのに、後からカラムを追加したり削除して読み出すことができる点です。
スキーマ情報はファイル内に埋め込まれていますが、別途定義したものと組み合わせて読み出すことができ、後からデフォルト値を追加したりできるようになっています。
また、Hadoopから直接データを読み出せるライブラリが揃っていて、Hadoopエコシステムと相性が良いという性質もあります。
JSONと比べた時の利点は、型がよりかっちり決まっている点と、バイナリフォーマットで末尾まで読まなくても随時パースしながらストリームで処理できる点です。
まあ、Bigqueryの場合はエクスポートの出力がlined JSONなので、その辺りはあんまり変わらないですが、パースの負荷は軽くて済みます。

さて、AVROはBigqueryのデータエクスポートには、JSONとAVROで大きな違いがあります。
BigqueryはJSONでエクスポートすると~~何でもかんでも文字列になって出力されます~~ intとtimestampが文字列になって出力されます。
JSONだとこれが割と面倒で、そこそこのデータ量を取得して別の用途に利用しようとすると、無駄な型変換が必要になって処理負荷がかかります。
特に面倒なのが、ARRAY型をエクスポートした時で配列内部にあるデータも文字列になっているので、数値の配列が欲しい場合は一回全データを走査して数値に変換する必要があります。

AVROだとその辺りは、大体一致した型で出力されます。(時刻はlong型になります)
配列内部のデータもちゃんとイメージ通りの型で出力してくれるので、余計な変換をする手間が省けます。

私はBigqueryから出力したデータはembulkを利用して取得・加工を行うことが多いので、embulkからAVROフォーマットを扱えるようにembulk-parser-avroを作りました

https://github.com/joker1007/embulk-parser-avro

```yaml
in:
 type: file
 path_prefix: "items"
 parser:
   type: avro
   avsc : "./item.avsc"
   columns:
     - {name: "id", type: "long"}
     - {name: "code", type: "string"}
     - {name: "name", type: "string"}
     - {name: "description", type: "string"}
     - {name: "flag", type: "boolean"}
     - {name: "price", type: "long"}
     - {name: "item_type", type: "string"}
     - {name: "tags", type: "json"}
     - {name: "options", type: "json"}
     - {name: "spec", type: "json"}
     - {name: "created_at", type: "timestamp", format: "%Y-%m-%dT%H:%M:%S%:z"}
     - {name: "created_at_utc", type: "timestamp"}

out:
 type: stdout
```

```json
// item.avsc

{
 "type" : "record",
 "name" : "Item",
 "namespace" : "example.avro",
 "fields" : [
   {"name": "id", "type": "int"},
   {"name": "code", "type": "long"},
   {"name": "name", "type": "string"},
   {"name": "description", "type": ["string", "null"]},
   {"name": "flag", "type": "boolean"},
   {"name": "created_at", "type": "string"},
   {"name": "created_at_utc", "type": "float"},
   {"name": "price", "type": ["double", "null"]},
   {"name": "spec", "type": {
     "type": "record",
     "name": "item_spec",
     "fields" : [
       {"name" : "key", "type" : "string"},
       {"name" : "value", "type" : ["string", "null"]}
     ]}
   },
   {"name": "tags", "type": [{"type": "array", "items": "string"}, "null"]},
   {"name": "options", "type": {"type": "map", "values": ["string", "null"]}},
   {"name": "item_type", "type": {"name": "item_type_enum", "type": "enum", "symbols": ["D", "M"]}},
   {"name": "dummy", "type": "null"}
 ]
}
```

こんな感じで利用できます。
Bigqueryからデータを出力した後で、それを加工する際の型変換が無駄だなーと思ってる方が居たら、使ってみてはどうでしょうか。
~
MacターミナルのTouch Barカスタマイズ項目

個人的に今まであまり使っていなかったターミナルのブックマークや移動ですが、Touch Bar対応というだけで無駄に活用したくなります。

![スクリーンショット 2016-12-06 22.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/73534/56a8eaea-5263-571d-38fa-380f05400750.png)
Autoprefixerの仕組み

昨日はAutoprefixerがどういうツールかということと、その使い方について書きました。今日は、その仕組と実装について書きます。

## ベンダープリフィックスを付与する仕組み

[Can I Use](http://caniuse.com/)という、CSSやJavaScriptの構文、WebのAPIなどのブラウザの対応状況をまとめたサイトです。

<img width="1680" alt="Screen Shot 2016-12-06 at 22.44.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/6598/0ed7e7df-331d-c49a-fbbf-4c40d3e1ba2d.png">

AutoprefixerはこのCan I Useのデータをまとめている、[caniuser-db](https://github.com/Fyrd/caniuse)というnpmパッケージを利用することで、CSSのプロパティや値、`@`ルールに必要なベンダープリフィックスを参照することができます。


## browserslist


また、サポートブラウザを `'last 2 versions'` のような文字列で指定できるようにするために、browserslistというパッケージを使っています。

https://github.com/ai/browserslist

browserslistは上記の自然言語のように書かれた文字列を受け取り、そのブラウザバージョンのリストを配列で返します。

```js
const browserslist = require('browserslist');

browserslist('last 2 versions');
/*
[ 'chrome 55',
  'chrome 54',
  'edge 14',
  'edge 13',
  'firefox 50',
  'firefox 49',
  'ie 11',
  'ie 10',
  'ie_mob 11',
  'ie_mob 10',
  'ios_saf 9.3',
  'ios_saf 10-10.1',
  'opera 41',
  'opera 40',
  'safari 10',
  'safari 9.1' ]
*/
```

---

今日はAutoprefixerがオプションで指定したサポートブラウザから、どのようにしてベンダープリフィックスを付与しているのかの仕組みについて述べました。

明日はPostCSS製のCSSリンターであるstylelintについて書きます。
Twilio の Dial のちょっとした豆知識

## TwiML の Dial

TwiML の [Dial](https://jp.twilio.com/docs/api/twiml/dial) といえば、 Twilio の根幹をなす最も重要な TwiML 動詞です。ズバリ、対象の相手先に電話をかけてくれます。

さて、この Dial は色々なクセもありますので、よく陥りがちな点についてご紹介します。

## 電話番号に関して

Twilio の Dial でよく起きる問題として、発信できたはいいものの番号が非通知になってしまうということが起きます。これは主に２つの理由が考えられます。

- 本家 US の Twilio を利用している
- CallerID の指定が間違えている

以下、詳細の説明と共に電話番号についての Tips をご紹介します。

### 03 番号などの住所に紐づく番号
本家 US の Twilio 番号は 03 番号があって大変魅力的ですが、この番号を購入して Dial し、外線にかけると相手には全て非通知と表示されてしまいます。せっかくの 03 番号もそれでは台無しですね。

というのも 03 番号などは住所と紐づく番号になっており、IP電話では基本的に対応していない番号なのです。そのため日本で正式に Twilio を提供している KDDI ウェブコミュニケーションズさんはしっかりとその決まりに則って 050, 0120, 0800 の3種類のみを提供しています。

03番号をどうしても Twilio で扱えるようにしたい！という場合には、ボイスワープなどの機能を利用して 03 番号から 050 へ転送する、という形をとることができます。この場合は当然 03 番号の転送料金などが追加でかかりますので、どうしてもそうしたい場合以外はお勧めできません。

### 0120 番号の移設
ちなみに 0120 番号は、他で購入したものを KDDI へ移し、さらに Twilio へ移すことでナンバーポータビリティも可能です。ただし完全移行には 2,3 ヶ月くらいかかるので、その時間の余裕が必要です。私たちの検証によると、一部の NTT の 0120 番号はベンダーロックイン的な形で移すことができなかったりするパターンがあるそうです。そこも要確認です。


### CallerID の特殊な指定

さて話をもどして、050番号を購入し、CallerID を適当な番号にすればいけるんじゃないか、と思われるかもしれませんが当然そんなことはできません。Twilio で購入した番号の CallerID でしか発信通知表示を行ってくれません。

しかし実は CallerID には電話番号以外を指定することができます。`client:` から始まるアルファベットの識別子です。これは、Twilio Client に Dial するときだけ有効な識別子となります。
Twilio Client で着信時に渡ってくる [parameters](https://jp.twilio.com/docs/api/client/connection#parameters) の From に、この文字が入ってきます。

Twilio Client だけを使って電話の着信を実装している場合にはこれはかなり役立ちます。しかしながら、Twilio Client にも発信するし、普通の固定番号にも同時に Dial したい場合には、この方法は役に立ちません。あくまで Twilio Client だけに発信する場合にだけ活用を検討ください。

## Dial の制限

TwiML のドキュメントを読むと、

> <Dial> 動詞で最大 10 件の <Number> 名詞を使用して、全宛先に同時に電話をかけることができます

という文章を見かけます。さて、ここで気になるのは10件以上指定してしまった場合、ですよね。実際に試してみました。

すると、少なくとも Client で 10個以上指定してたとしても、全員オンラインになっているような状態でなければその一部の人たちにはちゃんと着信が鳴るようです。ただし、10個以上のClient + Number の組み合わせだと、たまに Number が鳴らないという問い合わせを受けた経験があります。

結論としては"10個以上指定しても全部鳴らなくなるわけではなく、一部が鳴らない時がある"くらいに思っていただければいいかと思います。

この10個という制限はたまにネックになることもあるかもしれません。しかしそもそも 10個以上同時に鳴らすってケース自体あまりないような気もしますし、その場合はいきなりキューに突っ込んでオペレーター側から順次接続する設計にした方が明らかに良いでしょう。通話の保留などを使えば最初に出る人だけの Client を鳴らし、取次やスーパーバイザー的な方は最初に電話を鳴らさないClient として待機するなどの工夫も可能です。

実際の運用方法によって異なってくると思いますので、その時々で最適な Dial の設計を検討しましょう。

##　海外での電話について

IP 電話といえば、距離にかかわらず一定の値段で発信できることがメリットですよね。日本国内であれば[全国一律の料金](http://twilio.kddi-web.com/price/)で電話の受発信ができます。ただ、固定番号の場合は03番号は東京都内に近ければ近いほど料金が安くなったりする場合があり、都内だけの電話であれば固定電話の方が圧倒的に安かったりもします。これは一長一短ですね。

だとしたらもっと大きなところに目を向けましょう。海外発信は圧倒的に IP 電話の方が安くなるはずです。先ほどの[料金ページ](http://twilio.kddi-web.com/price/)を見てみると、下の方に海外番号について書かれています。実際、Twilio で簡単に海外へも発信ができます。ちなみに海外番号の受発信のテストも、Twilio で海外の電話番号を購入し、TwiML の Dial で携帯番号に転送するような形にすれば海外番号のテストも簡単です。

反対に、国内で取得した050番号を、海外で運用できるのかというとケースバイケースです。050当てに発信した番号を海外でログインした Twilio Client で受信することは当然可能です。しかし、発信に関してたまに正しく CallerID を指定しても非通知になってしまうという問題が報告されており、この点は私たちも調査中です。(もしうまくいった方法あれば教えてください!)あと、当然海外の インターネット回線を使っての通話となるので、遠ければ遠いほど音質も気になってしまうことでしょう。


## 終わりに
Twilio の Dial は奥が深いです。まだまだ共有したいことはありますが、長くなるので今回はこの辺りで終わりにします。このような使ってみないと分からない情報というのが日本の Twilio ユーザー間でシェアできるようなコミュニティになっていけばいいなと願っています。
re:Invent 2016 Workshop (SRV309: Wild Rydes Takes Off - The Dawn of a New Unicorn

[AWS re:Invent](https://reinvent.awsevents.com/) 2016でサーバレスのワークショップ「**SRV309: Wild Rydes Takes Off - The Dawn of a New Unicorn**」をやって来たので、その内容の紹介と解説を。

# 内容
SPAっぽいウェブアプリをAWSの各サービスを使って段階的に実装をしていくというもの。

![Screenshot 2016-12-01 13.42.42.png](https://qiita-image-store.s3.amazonaws.com/0/27157/6541a772-e9ab-366c-b1d3-9d7507db6f9a.png)
こんな。

# 前提
### 使うサービス群

- S3
- Lambda
- API Gateway
- DynamoDB
- Cognito
- SES
- CloudFront
- IAM

### 必要なツール

- [AWSアカウント](https://aws.amazon.com/free/)
- [AWS Command Line Interface (CLI)](https://aws.amazon.com/cli/)
- [Chrome](https://www.google.com/chrome/)
- [git](https://git-scm.com/)
- テキストエディタ

Chromeじゃないとうまく動かない。

### 対応リージョン

- US East (N. Virginia)
- US West (Oregon)
- EU (Ireland)

ワークショップで使うサービス群が対応しているリージョンが限られてる為（SES等）、上記3つから選択。各サービスのリージョン対応は[リージョンテーブル](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)が参考になる

*（※）実際にはリージョンを跨いでサービスは呼べるが対応リージョンに絞ったほうがよりシンプル*

# 作業
## lab1 - static web site hosting

### やる内容
静的なウェブサイトをホストする為にS3 bucketを作成・設定。グローバル展開をする為にCloudFrontの設定・配信する。CloudFrontのURLからサイトが表示される事を確認。
### 構成図
![Screenshot 2016-12-06 23.02.36.png](https://qiita-image-store.s3.amazonaws.com/0/27157/34de8e4d-dd03-682c-2db9-087382032fdf.png)
### 注意点
CloudFrontの作成が遅い。設定ミスを修正すると数十分待たされるので、次のlabにスキップしても問題ない

## lab2 - beta sign-up mailing list
### やる内容
ベータサービスにユーザがサインアップするメーリングリストを作成。認証のいらないユーザなので、Cognito identity poolとIAM policyを使って、DynamoDBにメールアドレスが書き込まれ、DyanmoDB StreamsからのLambda連携で確認メールをSESを使って配信する。一般ユーザがサインアップ後、確認メールが自身のメールアドレスに届く事を確認する。
### 構成図
![Screenshot 2016-12-06 23.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/27157/e9f79117-be71-16e0-ceca-115991ba3244.png)

## lab3 - administrative interface
### やる内容
管理インターフェイスの作成。Cognito user poolを使って管理者を定義し、DynamoDBに記録されている登録ユーザ一覧を取得するLambdaとIAM roleを作成し、API Gateway（GET resource）でLambda Proxy連携とCognito user pool認証を設定してウェブアプリから呼び出せるAPI endpointを作成してウェブアプリ側に埋め込む。ウェブアプリで管理者としてログイン後、登録ユーザ一覧が表示される事を確認。
### 構成図
![Screenshot 2016-12-06 23.05.26.png](https://qiita-image-store.s3.amazonaws.com/0/27157/b4c535cd-4283-78f9-cdd0-d00527ed16fd.png)


## lab4 - product update blog
### やる内容
管理者がアップデートできるブログ機能の構築。ブログ記事を保存するテーブルをDynamoDBで作成し、記事一覧を取得するLambdaと記事をポストをするLambdaとIAM roleを作成し、API Gateway（GET/POST resource）でLambda Proxy連携とCognito user pool認証を設定してウェブアプリから呼び出せるAPI endpointを作成してウェブアプリ側に埋め込む。ウェブアプリで管理者としてログイン後、記事のポストと最新記事一覧が表示される事を確認。
### 構成図
![Screenshot 2016-12-06 23.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/27157/e2bfdd7d-6af0-487f-ced9-b5b962f6ae31.png)

# その他
- ワークショップはコンソールでのポチポチ作業とコピペ作業なので（s3アップロードだけcli）1時間もあれば完了する。
- 新規AWSアカウントならFree tierの範囲内で無料でできる。ワークショップでは**$1**のクーポンを配ってた。

# ソースコードはこちらから
https://github.com/awslabs/aws-serverless-website-workshop
enebular INFOMOTIONとMilkcocoaで保存した過去データを表示する

## 概要

enebular INFOMOTIONのDatasourceとしてMIlkcocoaを使った場合に、送信したデータを保存して後から蓄積したデータを時系列で確認する方法と、永続化しないでPub/Subのみ利用する方法があります。

## 初歩デモ準備

[enebular Advent Calendar 2016](http://qiita.com/advent-calendar/2016/enebular)初日の@satton_maroyakaのエントリ、[enebularをつかいはじめる](http://deferloader.blog.uhuru.co.jp/?p=6433)にある[スライド](http://www.slideshare.net/SatoruIshikawa1/enebular-infomotion)を見て準備すると以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/445a645f-6c80-b36f-510d-3a7b8a095a0e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/a2aa2068-245e-9e05-cfc6-b457cc0f28aa.png)

## Milkcocoaでデータ保存するように変更する

Milkcocoaノードの設定画面を開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/77ada4d2-05ec-6e2d-e272-79fcd8f836df.png)

設定画面のOperationを"Send"から"Push"に変更してOKをクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/0bdbe0e1-4dcd-f2b6-e2ee-293e90fcb529.png)

Deployボタンが赤くなりますのでクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/831f3cd3-3c3c-7449-0b7d-e6dc2cc6b748.png)

Debugに表示されるMilkcocoaのレスポンスがID付きになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/7a6e0587-39e1-75f8-1ed3-577c6b93ced1.png)

## 保存されているか確認

Milkcocoaの管理画面でもデータが保存されているのが確認できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/450cc2b2-994a-ff53-ac59-2ad1e6b5b169.png)

INFOMOTIONを開くと保存されているデータが最初に表示されるようになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/21109/f62cc8a7-89a2-053c-dc97-e141b9352619.png)

## まとめ

再度、MilkcocoaノードのOperation設定を"Send"に戻してINFOMOTIONのLIVEボタンをクリックするとリアルタイム表示に切り替わります。

![infomotion.GIF](https://qiita-image-store.s3.amazonaws.com/0/21109/05aa6d1c-5815-4825-a108-a9521e6a43f4.gif)

このようにMilkcocoaならPub/Sub的な動きと永続的なデータの動きを同じサービス上でシームレスに扱うことができます。
UWPイメージアセットからいくつかファイルを除外してみた。

##UWPイメージアセットからいくつかファイルを除外してみた。
これでやっと配置できた。
####Assets のディレクトリに残したファイル。

2016/11/20  09:01             5,722 LockScreenLogo.scale-200.png
2016/12/06  00:01             7,164 NewStoreLogo.scale-100.png
2016/12/05  23:54            10,843 NewStoreLogo.scale-125.png
2016/12/05  23:52            14,846 NewStoreLogo.scale-150.png
2016/12/05  23:41            24,861 NewStoreLogo.scale-200.png
2016/12/05  23:41            92,546 NewStoreLogo.scale-400.png
2016/11/20  08:37           978,894 SplashScreen.scale-200.png //サイズは企画外だが、これがないとアプリケーションを配置できない。どういうことなんだ!?
2016/11/19  23:22           186,474 Square150x150Logo.scale-200.png
2016/12/05  23:50             5,879 Square44x44Logo.scale-100.png
2016/12/06  00:02             8,543 Square44x44Logo.scale-125.png
2016/12/05  23:53            11,887 Square44x44Logo.scale-150.png
2016/11/20  08:53            17,621 Square44x44Logo.scale-200.png
2016/12/06  00:04               982 Square44x44Logo.targetsize-16.png
2016/12/06  00:04               982 Square44x44Logo.targetsize-16_altform-unplated.png
2016/11/20  09:02             1,749 Square44x44Logo.targetsize-24.png
2016/11/20  09:02             1,749 Square44x44Logo.targetsize-24_altform-unplated.png
2016/12/05  23:41           146,658 Square44x44Logo.targetsize-256.png
2016/12/05  23:41           146,658 Square44x44Logo.targetsize-256_altform-unplated.png
2016/12/06  00:00             3,210 Square44x44Logo.targetsize-32.png
2016/12/06  00:00             3,210 Square44x44Logo.targetsize-32_altform-unplated.png
2016/11/20  09:01             5,722 Square44x44Logo.targetsize-48.png
2016/12/06  00:02             6,667 Square44x44Logo.targetsize-48_altform-unplated.png
2016/12/05  23:55            13,473 Square71x71Logo.scale-100.png
2016/11/20  09:00             7,013 StoreLogo.png
2016/12/06  00:06           113,393 Wide310x150Logo.scale-100.png
2016/12/05  23:59           168,286 Wide310x150Logo.scale-125.png
2016/12/05  23:58           235,377 Wide310x150Logo.scale-150.png

####除外したファイル
2016/12/05  23:41             7,331 Square150x150Logo.scale-100.png
2016/12/05  23:41            11,296 Square150x150Logo.scale-125.png
2016/12/05  23:41            15,817 Square150x150Logo.scale-150.png
2016/12/05  23:41           101,861 Square150x150Logo.scale-400.png
2016/12/05  23:41            29,042 Square310x310Logo.scale-100.png
2016/12/05  23:41            44,808 Square310x310Logo.scale-125.png
2016/12/05  23:41            61,866 Square310x310Logo.scale-150.png
2016/12/05  23:41           107,786 Square310x310Logo.scale-200.png
2016/12/05  23:41           391,854 Square310x310Logo.scale-400.png
2016/12/05  23:41            42,948 Square44x44Logo.scale-400.png
2016/12/05  23:41             5,727 Square71x71Logo.scale-125.png
2016/12/05  23:41             8,148 Square71x71Logo.scale-150.png
2016/12/05  23:41            13,911 Square71x71Logo.scale-200.png
2016/12/05  23:41            51,484 Square71x71Logo.scale-400.png
2016/12/04  18:24           380,906 Wide310x150Logo.scale-200(toobig).png
2016/11/20  08:37           978,894 Wide310x150Logo.scale-400(toobig).png
デザインが足りてないものと、解像度的に足りないものなど。いずれひとつずつ補充していく予定。
macOS SierraでNode.jsをインストール


# 環境

* MacBook Pro(Touch Bar搭載)
* macOS Sierra(10.12.1)

その前に[macOS SierraにHomebrewをインストール](/isamabe/items/40242c0aeb90c4e1a8b4)済。

# Nodebrewインストール

Node.jsはバージョン管理したいのでNodebrew導入。

```
$ brew install nodebrew
==> Using the sandbox
==> Downloading https://github.com/hokaccha/nodebrew/archive/v0.9.6.tar.gz
Already downloaded: /Users/xxxxxx/Library/Caches/Homebrew/nodebrew-0.9.6.tar.gz
==> /usr/local/Cellar/nodebrew/0.9.6/bin/nodebrew setup_dirs
==> Caveats
Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew's directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/usr/local/var/nodebrew

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/nodebrew/0.9.6: 8 files, 37.9K, built in 1 second
```

# Node.jsインストール

そのまま最新版Node.js導入。

```
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v7.2.0/node-v7.2.0-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /Users/xxxxxx/.nodebrew/src/v7.2.0/node-v7.2.0-darwin-x64.tar.gz: No 
Warning: such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 941)
download failed: https://nodejs.org/dist/v7.2.0/node-v7.2.0-darwin-x64.tar.gz
```

おっと、失敗（汗
これが必要でしたか。

```
$ nodebrew setup
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

リトライ。

```
$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v7.2.0/node-v7.2.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```

上手くいきました。
JDBCについて



JDBC（Java  DataBase Connectivity）とは、Java から DB にアクセスするための標準API です。JDBC 自体はインターフェース（仕様）で、使用する際には DB 固有の JDBC 実装ライブラリです。

>JDBCは、一言でいってしまうなら「リレーショナル・データベース（および、ほとんどすべての表形式のデータ）にアクセスするための、標準Java API」です。JDBCは「Java Database Connectivity」の省略だといわれています（が、実はJDBC仕様には明記されていません）。

>　企業内のクリティカルなデータは、多くの場合リレーショナル・データベースに格納されています。そのため、JDBCは、Javaによるエンタープライズ・アプリケーションの基礎をなす、重要なAPIの1つとなっています。
 
 ![r5fig1.gif](https://qiita-image-store.s3.amazonaws.com/0/47909/3cf6c326-bc5e-5b82-e29c-8bd972149b1b.gif)
 
 <a href="http://www.atmarkit.co.jp/ait/articles/0106/26/news001.html" target="_blank">引用：Javaデータアクセスの基礎（1）：JDBCとは何か？ - ＠IT</a>

従って、基本的には DB 間の違いは JDBC が吸収してくれる仕様となっています
ORM（Object-Relational  Mapping）とは、DB のレコードと Java オブジェクトを自動的に紐づける O/R マッピング処理や DB への接続/切断、トランザクション処理など、DB関連の処理を自動化してくれるフレームワークです。

### DBに接続する時

「PreparedStatement」は「Statement」と同じくデータベースに対するSQL文を実行するために使われますが、「PreparedStatement」で使うSQLは事前にコンパイルが行われています。

PreparedStatement による検索 (Statementの強化版。Statemetは使わない。基本はPreparedStatement最初から結びついてるステートメント。

PreparedStatementクラスによる SQL文の発行の際は、プレースホルダを用いて、SQL 構文の動的に変化する箇所を「?」で記述することが出来ます。

プレースホルダに値をバインドする際は、PreparedStatement クラスの setString()メソッド等を利用します。第
1 引数には位置、第 2 引数には値を指定します。



※プレースホルダとは、実際の内容を後から挿入するために、とりあえず仮に確保した場所のこと。 また、そのことを示す標識などのこと。
<a href="https://www.google.co.jp/search?q=%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC&oq=%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC&aqs=chrome..69i57j0l5.4904j0j4&sourceid=chrome&ie=UTF-8" target="_blank">引用：プレースホルダー - Google 検索</a>


```java
String sql = "SELECT * FROM employee WHERE emp_id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,   "0001");
rs = ps. executeQuery();
```

「?」はプレースホルダー。
ps.setString(1,   "0001");の第一引数の1は、左から何番目の「?」
第二引数の2は、どんな値をいれるか。

### 接続を切断する

DB 接続の切断は、Connection.close()によって行います。接続の終了処理は必ず行う必要があるため、finally ブロックの中で close()メソッドを実行します。
切断処理をしていない場合、システムが停止するなど、致命的なトラブルに繋がる場合があるため、注意してください。

getConnection()
Connection.close()


### ResultSet クラス

SQLを発行したものが、ResultSetに入っています。
以下は、DBに接続するときの一覧の流れにです。

```
conn = DBManager.getConnection();
//DBに接続している情報に接続

st = conn.createStatement();
//SQL文を発行

String sql = "SELECT * FROM employee";
//SQL文を変数に格納

rs = st.executeQuery(sql);
//データベースに問い合わせを実行

(rs.next())
//次の行があるかないかチェックのために、boolean型で判定
```
Tagbarのキーマップを変更する方法



Vimプラグインの[Tagbar](https://github.com/majutsushi/tagbar)を使っています．

Tagbarウィンドウ内におけるキーマップは`F1`もしくは`?`で以下の画像のように確認でき，デフォルトではソートが`s`に割り当たっていますが，私は`s`をウィンドウ移動に使っているので`S`に変更してみました（画像は変更後のものです．）

[![tagbar_window thumb.png](https://qiita-image-store.s3.amazonaws.com/0/35592/88c523e3-8891-fa42-1ed5-ff9c61992033.png)](https://qiita-image-store.s3.amazonaws.com/0/35592/5880bb57-e902-5ecb-5c92-6eedf26e9a5d.png "tagbar_window.png")

Tagbarの[ソース](https://github.com/majutsushi/tagbar/blob/master/plugin/tagbar.vim)を見れば分かることではあるのですが，ソートの場合は次のようなグローバル変数を定義してあげればキーマップが変更できます．

``` vim:.vimrc
" Tagbarのソート用キーマップを変更
let g:tagbar_map_togglesort = 'S'
```

その他のキーマップは[keymaps](https://github.com/majutsushi/tagbar/blob/b99e10325846f054ebc5f6faef1e796c9b50f251/plugin/tagbar.vim#L97])のキー名を`g:tagbar_map_<キー名>`というグローバル変数で定義すれば変更が可能なようです．
SQL インジェクション


SQL Injectionとは、アプリケーションにおいてRDBで任意の値を検索条件、更新内容等に使用する場合に、任意のSQL文を実行させてしまう手法です。これは、Webアプリケーションに限らず、RDBを使用しているクライアント・サーバー型のアプリケーションでも発生する可能性があります。

この攻撃手法を悪用することで、ユーザーは開発者、運用管理者が予期しないようなSQL文を発行し、RDBを自由に操作することが出来るようになります。つまり、データの削除、追加、改ざん、取得といったことから、RDBMSによってはDBサーバーでOSコマンドすら実行できるようになってしまいます。

特に昨今のWebサービスでは背後にRDBがおかれ、個人情報など重要な情報がRDBに格納されていることが非常に多くなっています。このため、SQL Injectionに対策することは重要です。

### インジェクション対策

SQLインジェクションの対策として最も代表的なものが PreparedStatementクラスの利
用です。PreparedStatement を利用した場合、ユーザーからの入力値はバインド変数とな
るため、SQL 文の構文を確定させることが出来ます。
記号を打ったとしても、値でしか返さない。
改善サイクルを回す - PDCAとOODA -


# PDCAとOODAの概要

PDCAは皆さんご存知だと思いますが、

- Plan - 計画
- Do - 実行
- Check - チェック
- Action - 改善

この４つの頭文字からとられた行動で、
PDCAサイクルと呼ばれ、このサイクルを回してどんどん良くしていくことです。


OODAは聞いたことがあるでしょうか？

- Observe - 監視
- Orient - 情勢判断
- Decide - 意思決定
- Act - 行動

この４つの頭文字から取られたもので
OODAループと呼ばれ実行される活動のことです。


戦争の戦略の中から生まれ、司令軍と前線の小隊のやりとりをPDCAでやっていては計画を立てている間に小隊がやられてしまう。命令が下されるまで身動きが取れないということからスピードを重視し、最大限のスピードで能動的に動く活動を定義したものです。



# PDCAとOODAの使い方

OODAの本の煽りなどには、「これからはPDCAではなくOODAだ！」みたいに書いているものがありますが、実はそんなことはないと考えています。

使い分けが重要だと考えています。
PDCAは計画と改善に重点が置かれていると思います。
初めてやる作業や活動のときには、よく見て実行しても場当たり的な行動になりがちです。
それは判断するための十分な知識が不足しているからだと考えられます。


そこで必要なのは計画であり、計画する際には十分な情報収集を行い、どのように行動するべきかの実行計画を練ります。
どんなに素早く行動しても、次に活かせない行動はコストが高いです。
最初の段階では情報収集を十分にして、行動コストを抑えることに重点を置きます。


行動した結果、当然新しい知識を得るので、次の行動の情報として最大限また情報収集を行い計画をします。
正しく計画が行えていれば、しばらくすると、この計画と改善の観点がチームの全員に行き渡ります。

その知識を持って、各人が状況に応じて判断し、決断し、行動して行けるようになるのです。
そして行動した結果の情報は今までのPDCAサイクルで得た、改善活動がOODAに組み込まれていき、チーム全体が改善活動を自然のサイクルとして活動できるようになることが理想形だと考えています。


# アジャイルに活かす

アジャイルも沢山のサイクルがあります。

- スプリント計画 - スプリント - スプリントレビュー - レトロスペクティブ
- 毎日の開発サイクルでの デイリースクラム(朝会、夕会)
- チームが自由に振り返るKPT
- など

最初はしっかりと計画して、実行し、レビューを行い、振り返ります。
始めたばかりのときはぎこちなく、うまくいかない所をレビューでなんども改善しながら進めるでしょう。
しかし、チームがそのサイクルに慣れて、ごく自然に出来るようになったら、次のステップです。各人に作業するタイミングの判断を渡せるものがあるでしょう。
なれてきたチームであればスプリントのプランニングポーカーなどはGithubのestimateを各人が設定し、朝会、夕会で確認をお願いし、chatworkやslackなどのチャットツールで解決出来るようになるかもしれません。
どういう観点で、どういうものが何ポイントになるかはすでにチームの中でイメージ出来ています。細かなズレのみをチャットツールで解決することで、全員の大きな時間を使っていたものが半分にできるかもしれません。

スプリントレビューのデモなども、最初は毎回対面でやるべきです。
疑問点、どんな観点でアプリケーションを見るべきか、クライアントはどんな疑問を持っているか、それらはクライアントも開発チームも双方に対して無知だからです。
しかし、マネージャやクライアントが慣れてきたならば、オンラインでデプロイして、更新項目と動作フローのみwikiやqiita:teamで共有し、動かした結果のフィードバックもチャットでもらって打ち合わせる。と言う事が出来るかもしれません。

もちろん、これらの切替のタイミングは非常に気をつける必要がありますし、開発の関係のススメ方やメンバの能力によっては、適さない手法かもしれません。

ただ、常にPDCAをするのではなく、すでに仕組みに慣れた段階で、各人を信じ、OODAを実行出来る仕組みに切り替えることで開発スピードを上げ、また違うことを改善するための時間を使えるようになるでしょう。


チーム活動を進化させること。これこそアジャイルの真髄では無いでしょうか。


# 終わりに

ぜひPDCAとOODAを使いこなし、アジャイル開発に活かしてみてください。
Docker公式Apache HTTPイメージのOpenSSLバージョンを調べてみた

## この記事について

多くの方はご存知だと思いますが、OpenSSLの1.0.1系列のサポートが2016年12月31日で終了します。
外部公開Webサーバの構築に[Docker公式Apache HTTPイメージ](https://hub.docker.com/_/httpd/)を使っているので、Docker公式Apache HTTPイメージのOpenSSLのバージョンについて調べてみました。

## httpd:2.4(httpd:latest), httpd:2.2

[httpd:2.4のDockerfile](https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile)の内容を見てみると、ベースイメージにDebian  Jessieを指定しています。

```
FROM debian:jessie
```

[Debian Jessieのサイト](https://packages.debian.org/jessie/openssl)でOpenSSLのバージョンを確認してみると、1.0.1t-1+deb8u5と記載されているので、OpenSSL1.0.1系列が使用されるようです。
[httpd:2.2のDockerfile](https://github.com/docker-library/httpd/blob/master/2.2/Dockerfile)も同様にベースイメージにDebian Jessieを指定しているため、OpenSSL1.0.1系列が使用されます。

## httpd:2.4-alpine, httpd:2.2-alpine

[2.4-alpineのDockerfile](https://github.com/docker-library/httpd/blob/master/2.4/alpine/Dockerfile)では、ベースイメージにAlpine Linux  3.4を指定しています。

```
FROM alpine:3.4
```

[Alpine Linuxのサイト](https://pkgs.alpinelinux.org/package/v3.4/main/x86_64/openssl)でOpenSSLのバージョンを確認してみると、1.0.2j-r0と記載されているので、OpenSSL1.0.2系列が使用されるようです。[httpd:2.2-alpine](https://github.com/docker-library/httpd/blob/master/2.2/alpine/Dockerfile)の場合も同様です。

## まとめ

Alpine Linux系列の公式イメージはOpenSSL1.0.2系列、非Alpine Linux系列の公式イメージはOpenSSL1.0.1系列が使われるようです。**現時点のhttpd:latestがOpenSSL1.0.1系列である**点は要注意です。
OpenSSL1.0.1系列のサポート終了まであと1ヶ月もないので、Docker公式イメージを使用している方はAlpine Linux系列に切り替えた方が無難かも。