OmniAICreator/Qiita-1.07M huggingface dataset:
re:dash導入したらいろいろ捗った話

今年の11月頃になんとなく仕事で　`re:dash`　導入したらいろいろ捗ったので感謝の Advent Calendar です。
~~（こんなにガラガラだとは思っていませんでした。ブーム過ぎ...？:cry:）~~
~~(確認したら[去年](http://qiita.com/advent-calendar/2015/redash)もガラガラや:sob:)~~

# 発端
入れてみようと思ったきっかけは

- `re:dash` ちょいちょい耳にするなー
- いれてみたいなー
- ディレクターさんの1人がSQL勉強したいですという要望
- 実は他にもSQL使えば、仕事の性質上恩恵受けられるだろうなーと思っていた(たくさんのデータをExcelでやっててPCも人もウンウン唸っていた...)
- だったら1人にいろいろ設定して導入してもらうより `re:dash` 入れたほうが良さそう

だったので `re:dash` を導入しました。

# `re:dash` 導入前
今まで社内の他のプロダクトでもSQL叩くディレクターさんはいたのですが、みんな Windows 環境なので MySQL Workbench を使っており、SQL叩いたことない人にはその導入からしてもらわなきゃいけなくて、その手伝いからやっていたりしたので双方メンドクサーな状態
SQLの勉強自体も基本は独学で勉強してもらって、わからない query があったら聞いてもらってそれを Slack で返して貼り付けて...みたいな。
教えた query どうする？ 個人管理？ wiki？ みたいな。 ~~(やめてくれ)~~

# `re:dash` 導入後
- ユーザ追加をすれば、すぐ接続環境が整う
- ハードルがだいぶ低くなる
- いくつか私や他の人が追加した query を見て勉強できる
- query はもちろん re:dash 上に保存される
- Fork すればいくらでもいじれる
- きれいなダッシュボードを見て同じチームの人も見始める
- もしくは使っている人がダッシュボード見てほしいので見れるようにしてほしいとお願いされる
- プロダクト横断的にいろいろ見るプロジェクトだったので他のプロダクトのDBもつなぎこんでください、というお願いが来る
- 複数のDB接続も簡単
- つなぎこみも簡単(社内に立てていたので別途プロダクト側にお願いする必要がなかった)
- そのプロダクトの人も `re:dash` で数値見始める
- こんなのも見れないんですか？という潜在的な要望が顕在化してきた　<- 今ココ

という絵に描いたようないいサイクル

# 私が助かったこと
- より潜在的な要望が出てきた
- ちょうどある特定の数値になったら Slack に通知飛ばすみたいな機能が必要だね、という話をしていたところの導入だったので Alert 機能をそのまま使って実装せずに機能だけ提供できた

とはいえ、全部 `re:dash` だけで完結しそうにないのでその部分だけ開発が必要かも、と思っている所

# 困った所とその対処
## Alert 機能一覧が見づらい
設定している量が多くて、ディレクターさんとかに見てもらうにしても自分のアラートどれやねん + 私も管理しづらい...

## 対応
- re:dash の DB 自体参照できるようにしちゃう **(設定は慎重に)**

初期の `re:dash metadata` では alerts テーブルが参照できないようになっているのでユーザを変えて参照できるようにしました。
グループ管理機能を使って、アクセス権限周りよしなにしてください。
それに [filter](https://redash.io/help/queries/writing_queries.html#query_filters) とかの機能を使って見やすい感じの　widget　にして各プロダクトのダッシュボードに配置。

### 副産物
定期実行している query が増えてくるとどれがいつ実行されるか管理しづらくなってくるのでそれも query 作ってダッシュボードに追加しちゃう。
`re:dash` 自身も `re:dash` で管理（したくなる）
自己参照っょぃ

## Elasticsearch の複雑な query のグラフ化
今のプロダクトは Elasticsearch をメインに構成されているのでそこに複雑な query 投げたいという要望がきたけど、現状の `re:dash` だとできない場合がある
今回は 2重の aggregation を使った query をグラフ化したかったがうまくできない

## 対応
- Kibana の埋め込みタグを widget の TextBox にはっつけちゃう

唐突な Kibana
そもそも Elasticsearch には可視化ツールとして Kibana という本家本元があるのでそれを利用しました。
グラフ化も lucene query 書かずに GUI 的に生成できるので頼みやすい。
Kibana で見ればええやん、みたいなことも思いましたがやはり情報は一つにまとまっている方が見てくれると思います。
SQL勉強中の人に lucene query もってなると気が重いので...

### 追記
と思ったら、DataSource の Type に Kibana がありますね。
どうやって使うんだろう...

# まとめ
今まで私のプロダクト内ではSQLを使う人が少なく、布教するにしても若干ハードルが高かったのですが布教しやすい環境が整いうまく回り始めました。

実は `re:dash` 入れたい欲はだいぶ前からあって、ただ使うイメージができなかったので入れてなかったのですが、SQL勉強したいという人が出てきたことが後押ししてくれました。
もし、自分のプロダクトでもいるんだろうか...という人がいたら　dockerでかなり簡単にササッと入れられてしまうので入れてみましょう。
入れたら意外とうまく回り始めるかもしれません。
支払うコストは低いはずです。

今日も `re:dash` に感謝 :pray:
エラーを自動訂正するZFSの構成とZFS用パーティション作成時の注意点

[この話](http://qiita.com/belgianbeer/items/4f1d556625ac1ef3b5b2)の続きです。

ZFSの特徴の一つにチェックサムを保管しエラーを検出する機能があります。しかしエラーを検出できたとしても、[この例](http://qiita.com/belgianbeer/items/4f1d556625ac1ef3b5b2)のようにZFSが自動でエラーを修正してくれるためには単純なZFSプールではうまくいきません。壊れたデータを書き直すための正しいデータを持った部分が無いと復旧できないわけで、そのためにプールに冗長構成を持たせる必要があります。冗長構成になっていれば、ZFSはエラーが発生したブロックを破棄し、正常なブロックからデータを自動で復旧してくれます。

ご存知の通り、ストレージシステムに冗長構成を持たせるためにはRAID5, 6やミラー(RAID1)などがありますが、ZFSでの冗長構成のストレージシステムを構成する方法に付いて以下に順に記載します。

## RAIDZの作成

ディスクが3台以上ある場合は、RAIDZ (あるいはRAIDZ2、RAIDZ3)を構成するのが適正でしょう。[この例](http://qiita.com/belgianbeer/items/4f1d556625ac1ef3b5b2)では、3台のUSB HDDを使い、RAID構成にしています。

da0からda2までの3台のディスクがある場合のRAIDZのZFSプールを作るには次のように行います。

GPTでディスクを初期化。

```
$ gpart destroy -F da0 ; gpart create -s gpt da0
$ gpart destroy -F da1 ; gpart create -s gpt da1
$ gpart destroy -F da2 ; gpart create -s gpt da2
```

GPTでZFS用のパーティションを作成する。

```
$ gpart add -t freebsd-zfs -l usbdisk0 da0
$ gpart add -t freebsd-zfs -l usbdisk1 da1
$ gpart add -t freebsd-zfs -l usbdisk2 da2
```

USB HDDが3台初期化できたら、あとはRAIDZでZFSプールを作る。

```
$ zpool create -O atime=off -O compression=lz4 ztank raidz gpt/usbdisk0 gpt/usbdisk1 gpt/usbdisk2
```
ここでは -O で atimeをoffにし、圧縮アルゴリズムに lz4 を指定しています。

## ZFS用パーティション作成時の注意点

ZFS用パーティションを作る場合、**必ず -l オプションを指定し、それぞれのディスクに個別のラベルを作成しておくこと**がとても重要です。特にUSBディスクの場合起動時に0,1,2の順番がどうなるか保証されないため、ラベルが無いと1台のディスクが故障した場合に、故障したディスクを特定するのがとても困難となります。もちろんHDDユニットにもラベル名を物理的に記入しておくことが重要です。

実際にUSBのディスクを初期化するときは、ディスクの対応を確実にするために予めディスクを外した状態で、ディスクを1台づつ順に接続してZFS用パーティションを作成、つまりディスクを1台接続しては次の作業を3回繰り返すことになります。

```
$ gpart destroy -F daX ; gpart create -s gpt daX;  gpart add -t freebsd-zfs -l usbdiskX daX
```

USB HDDに限らず**SASのディスク等でも、ドライブの増減によってデバイス番号が変わる**ので、ラベル付けはとても重要と言えます。

## ZFSミラープールの作成

ディスクが2台の場合は、ミラー構成にするのが良いでしょう。

GPTでミラー用パーティションの作成

```
$ gpart destroy -F da0 ; gpart create -s gpt da0 ; gpart add -t freebsd-zfs -l usbdisk0 da0
$ gpart destroy -F da1 ; gpart create -s gpt da1 ; gpart add -t freebsd-zfs -l usbdisk1 da1
```

ZFSミラープールの作成

```
$ zpool create -O atime=off -O compression=lz4 ztank mirror gpt/usbdisk0 gpt/usbdisk1
```

## ディスク1台のZFSで冗長性を持たせる

RAIDやミラーにはディスクが複数台必要ですが、ZFSでは**ディスク1台でもデータに冗長性を持たせる仕組み**が用意されています。もちろんディスクが物理的に回転しなくってしまうような故障に対しては無力ですが、部分的なメディアエラーに対しては十分有効な方法と言えます。

これを有効にするにはZFSプロパティの copies を指定します。デフォルトは1でデータの冗長性は無い状態ですが、2 または 3 を指定することで、同じディスク内の別の場所に、指定した数に応じたデータの複製を用意してくれます。

ZFS作成時に copies を指定する

```
$ zfs create -o copies=2 -o compression=lz4 -o atime=off zroot/tank
```
copies に 2 や 3を指定すると、当然のことながら書き込みに2倍、3倍の時間が必要になり、実質の記憶容量もそれぞれ半分、3分の1となりますが、冗長構成の代償なのでそこは割り切りましょう。copies は、ディスクが1台しか内蔵できないノートPC等では極めて有効な手段と言えます。

また copies は ZFS のプロパティなので、既存のZFSに対して後から設定変更でますが、copiesを 1 から 2 に変更してもその後書き込まれる部分にのみ有効で、すでに書き込み済みの所には影響しないのでご注意ください。
自社開発でiOSアプリを作った話

この投稿は[作ったアプリ自慢！ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/application-jiman)の21日目の記事です。

### はじめに
iOS開発を主にしている[@kamui_project](https://twitter.com/kamui_project)と申します。
今回は先月リリースしました自社アプリについて書きたいと思います。
なお[儀式 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rite)の3日目にも投稿したのですが、謎の力が働いて記事が消えました。
**儀式KOEEEEEEEE**


### どんなアプリか
[こちら](https://itunes.apple.com/jp/app/ri-kemeta-for-san-ri-fang-zhu/id1172147993?mt=8&ign-mpt=uo%3D4)です。
![screen696x696.jpeg](https://qiita-image-store.s3.amazonaws.com/0/57541/d34c57bb-f24a-9123-3f2b-722180692821.jpeg)   ![screen696x696 (1).jpeg](https://qiita-image-store.s3.amazonaws.com/0/57541/fbe9331c-9fbe-c2a0-4a34-ac992e06af19.jpeg)

"日課の色んな数値を見える化する"ことを念頭に作りました。
また自社教育用アプリとして幾つかポイントがあります。
ちなみに現在はiOS版のみです。
細かい仕様については割愛しますが、先日[techjoさんに紹介して頂きました](http://www.techjo.jp/2016/11/516996/)。


### ここが自慢
##### 教育用に作成したシンプルな仕組み
List表示、ローカルDBで保存、アニメーション処理など、ツール系アプリで必要な仕組みを色々詰め込みました。
##### GUIアーキテクチャ
将来的にAndroid版も作成したいと思っており、MVVMを採用しています。
AndroidではMVVM(Data-Binding)で設計する予定です。
言語はKotlinを使いたいですね。Kotlinかわいい
##### Realm
スマホに特化したDBということで初めて使ってみましたが、とても良いです。
ほぼオブジェクトと同じ扱い方でテーブルをいじれます。[作った人たち] (https://realm.io/jp/)天才か


### 改善点(反省点)
##### 話題のOSS連携。しかしSwift製は…
Swift3.0に対応していないものがまだ幾つかあります(ver3.0.1でつまづいたり)
いっそのこと修正してプルリクを投げてという対応も手だったのですが、そこは弊社の教育項目に含みたくなったため、現行Swift2.3で動く形のままとしています。


### 今後の予定
##### 新機能追加(年内)
履歴機能、SNS共有機能、スクショ撮影機能などを取り入れる予定です。

##### クロスプラットフォーム対応
Androidの他、AppleWatch対応もしていく予定です。

##### Swfit3
早めに対応しないと**多分死ぬ(主に僕が)**

以上です。
New Relic Insights でドリルダウンできるダッシュボードを作る方法

New Relic アドベントカレンダー21日目は、New Relic Insights でドリルダウンできるダッシュボードを作る方法です。何を言っているか分からない方もとりあえず、以下を見てもらえればイメージはつくと思います。

![qiita_insights_filter1_1.gif](https://qiita-image-store.s3.amazonaws.com/0/46003/2c17bdef-46f3-8018-f988-e88d4217de72.gif)

New Relic Insights は、ダッシュボードサービスです。 New Relic APM など各製品が収集したデータを自由に使って、好きな条件、好きな見た目(表、円グラフ、棒グラフなど）でダッシュボードを作れるサービスです。それも、New Relic Insights の UI だけで作れます。

上図は、New Relic Browser の Page View のデータを元に様々なチャートのあるダッシュボードです。
このダッシュボードの右上の URL 別のページビュー数のリストと、ブラウザ別のページビュー数のパイチャートに、フィルターの設定をしています。

フィルターの設定をすると、そのチャートの項目を軸に他のチャートのデータを更新できます。

フィルター指定前:
![qiita_insight_filer_2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/21f38515-4f69-6855-9a9e-ef0527727a5a.png)

フィルター指定後:
![qiita_insight_filer_3_2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3728ab98-0df6-3cb1-2a1c-90fea05821e0.png)

上図をみると、最初に URL リストから一番上の URL を選択すると、それ以外のチャートの内容が変更されているのが、わかると思います。フィルターした項目は、タイトルの上に表示され、どの項目でフィルターしているのか分かります。

このラベル右上のばつをクリックすると、ファイルターが解除されます。

ドリルダウンできるダッシュボードがどういったものかイメージができたでしょうか？ では次にこういったダッシュボードをどうやって作るのか解説します。

## ドリルダウンできるダッシュボードの作り方

1. まず、基本となるダッシュボードを作っておきます。（作る時点である程度、どういった項目でフィルターをかけようか考えておくと、より効果的なダッシュボードが作れると思います。)
2. ダッシュボードができたら、右上の `Edit` を押します。
3. フィルターを設定したいチャートを選択し、![link_icon.png](https://qiita-image-store.s3.amazonaws.com/0/46003/4eb3bc93-7dba-f29e-f9c2-69a7300c97ba.png) アイコンをクリックします。
4. ![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/46003/a2acdfdf-bcfb-1f8c-8811-479c48fb7b6a.png) リンク先のダッシュボードを選択します。今回は、現在のダッシュボードが対象なので、"Current dashboard" を選択します。
5. "Link" を押します。

これで、設定したチャートの項目をクリックすると、フィルターできるようになりました。
以下は、地域別(By City)のチャートにフィルターを設定する場合の動画です。

![qiita_insight_filer_4.gif](https://qiita-image-store.s3.amazonaws.com/0/46003/07bf304f-05bf-e51f-0d61-8041bcc55c92.gif)

この方法は、[ドキュメント: ダッシュボードの絞り込み](https://newrelic.degica.com/docs/insights/new-relic-insights/managing-dashboards-data/filtering-dashboards)にも書いてありますので、そちらも参考にしてください。

## まとめ

以上、どうでしたでしょうか？ フィルター付きのダッシュボードを使うことで、データ分析をより効率的に行えるようになります。
[Qiita]タブキーでインデントしたい

たまに本文入力欄に直接コードを書いたり、貼り付けたコードのインデントを修正することがあるので、タブキーでインデントできるとうれしいです。
現状ではフォーカス移動になります（Windows版Chromeで確認。他は知らない）。

範囲選択してタブで選択行をインデント、Shift＋タブで逆インデントもできるとうれしい。

2タブか4タブか、タブかスペースか。その辺が難しいところでしょうけれど。

![image](https://qiita-image-store.s3.amazonaws.com/0/79394/476008aa-ffcb-6875-97a6-e2616ed24315.png)
LEGOをスマホでいごかすよ

また関西のちっちゃいおっさんが書くよ

暗なるん早いなと思ってたら今日冬至やん。
ほんでもうすぐクリスマスやね。
ちいさい子供さんいてはる人はプレゼントの用意した？

LEGOでこんなおもちゃ作るけど、どう？
![pokapon_nxt.jpg](https://qiita-image-store.s3.amazonaws.com/0/151562/100b276d-964a-86bf-4a1f-7c73ccc2c743.jpeg)

昔ポカポンゲームゆうのがあってんけど、それをLEGOで作ってスマホをリモコンがわりにして対戦して遊べるようにしたよ。
実際に遊んでるとこの動画見てみて。それぞれ１分くらいの短いやつやけど、雰囲気わかるんちゃう？
基本操作編
http://youtu.be/cp660OSULBQ
戦闘編
http://youtu.be/XEH791McoB8

えっ？LEGO思てたんと違う？
LEGOゆうたらあのポッチのついたブロックのイメージやったやろ？
でもこれもLEGOの製品でmindstorms NXTっていうねん。
液晶付きのマイコンが入ってるブロックがあって、入力と出力のポートがついてて
センサーやらモーターやら繋いで、プログラミングしていごかすことができるねん。
3年くらい前のSRAの新人研修でもこれ使ってたんやで。
今は最新バージョンのEV3っていうやつやけど、まあ似たようなもんやわ。

もちろんmindstormsだけでもプログラミングして自律的にいごかせるんやけど、
Bluetoothで通信することができるから、android端末とペアリングして
アプリからいごかせるようにするよ。

前回(12/2)の記事でapp inventor2の使い方はなんとなくわかったやろ？
アプリの画面はこんな感じ。
![pokapon_nxt_app.jpg](https://qiita-image-store.s3.amazonaws.com/0/151562/582baa72-cd02-2db3-260a-c15e17dc575f.jpeg)

ポイントはBluetoothの通信やねんけど、簡単やで。
app inventorのdesignerモードの画面で左側のリストにBluetoothClientってあるやん？
それをviewerのところにD&Dしてみて。
![view.png](https://qiita-image-store.s3.amazonaws.com/0/151562/c56c637c-5a2e-861d-9c4c-b7492f380297.png)

あとはmindstorms NXTを制御するための部品やな。
左側のリストからモーターやらセンサーやら選んでviewerにD&Dや。
部品選んだら右側のプロパティにBluetoothClient設定するとこあるから設定しといてや。
![view02.png](https://qiita-image-store.s3.amazonaws.com/0/151562/6bd87efd-8869-9337-6474-372044e73b15.png)

あ、ペアリングした後のmindstormsを選んで接続するとこもつくらんとあかんわ
画面右側のselectやらconnectやらのボタンね。
selectはListPickerっていうUIの部品つかってるよ。
あとはボタンね。
もうスクリーンショットつけへんけど。

これでBluetoothで通信してmindstormsを制御するための準備は終わったで。
あとはプログラミングやけど、blocksモードでこんな風にブロックをパチパチはめていくだけ。
１枚目の画面はBluetooth関連やな。ペアリングしたNXTを選んで接続するとこ。
２枚目はNXTのモーターの制御やで。方向ボタン押したときのやつな。
３枚目は攻撃と防御のアームのモーターの制御とタッチセンサーのイベントの処理。
こんだけやで。
![blocks01.png](https://qiita-image-store.s3.amazonaws.com/0/151562/2a52bd78-8cf9-14cc-6970-1298fa8a710c.png)
![blocks02.png](https://qiita-image-store.s3.amazonaws.com/0/151562/2ae1aaa5-36bc-1df0-b07f-dfc0281579f1.png)
![blocks03.png](https://qiita-image-store.s3.amazonaws.com/0/151562/55e93a1d-a4ba-a47c-3994-256e6a5a053b.png)

最後まで読んでくれてるってことはちょっとmindstormsに興味でてきたってこと？
それやったらおっちゃん嬉しいけど。

まだ時間あるんやったら動画も見ていって。
それぞれ１分くらいの短いやつやし。
Bluetoothでペアリングする手順は準備編の動画にあるよ。

組み立て編
http://youtu.be/yt9pO5Z9mlU
準備編
http://youtu.be/eKWrzrmryMs

ほなまたね～
いつかどこかで。
Rails5でSEOするためのgemを紹介

最近SEOが複雑化してきていますよね。AMP対応までSEOのために必須になってしまって、普通のウェブサイトを作るだけでも一苦労です。

この記事ではRailsで構築したウェブサイトをSEOをする上で使うと便利なgemを紹介します。

# metaタグの出力には meta-tags

https://github.com/kpumuk/meta-tags

railsでSEOを行う上で鉄板のgemです。headタグ内のmetaタグ出力を大幅に簡略化してくれます。

ソーシャル流入対策で必要な ogp / twitterカードもこのgemで対応します。

# サイトマップ生成には sitemap_generator 

https://github.com/kjvarga/sitemap_generator

sitemap.xmlの生成を手助けしてくれるgemです。cron等のスケジューラーで週に1回更新すると良いでしょう。

今の時代にsitemap.xmlが必要か？という問いに対しては「規模が大きくなれば必要」が回答です。sitemap.xmlで網羅されたページに対して、どのページがクロールされた結果indexされているか（indexされていないか）の情報は重要な意味を持ちます。

# パンくずナビゲーションには gretel

https://github.com/lassebunk/gretel

ビューの中でパンクズを生成するのが楽なgemです。コントローラーでパンクズを作りたい方には向かないです。

これも今の時代に必要か？という問いに対しては「SEOのランキング要素としてはそれほど重要ではないが、あると離脱率が下がる」が回答です、役に立つか微妙なラインです。PCブラウザの利用者にはパンクズ形式のナビゲーションに慣れている方も多いです。

もしパンクズを導入してランキングが上がったのであれば、それはGoogleのスパイダーがクロールし辛いサイトである、すなわち導線設計に失敗している証拠でしょう。

# 分かりやすいURL設計には friendly_id

https://github.com/norman/friendly_id

`リソース名/:id`形式のURLからモデルの属性を使ったユーザーフレンドリーなURLを設計するためのgemです。

ランキング要素に影響していなさそうな個所のため、導入するかは微妙です。検索結果に表示されるURLを見て押すか押さないか決める人は少数派と思われるので、それほど影響はないでしょう。

# URLの正規化には canonical-rails

https://github.com/jumph4x/canonical-rails

Canonical URLを生成するのが面倒な時があります。でもこのgemを使えば` <%= canonical_tag -%>`だけで済むので楽です。

SEO視点で言えば正規化されたURLは非常に重要です。そもそもURLは単一なリソースを指し示すものなので、正規化されていて当然と考える方も多いでしょう。全くもってその通りで正規化されたURLはGoogleが最近重要しているモバイル・スマホ対応、AMP対応の軸として機能しています。

# モバイル対応には browser or device_detector

レスポンシブなページがGoogle推奨ですが、PCブラウザとスマホで表示する画像を切り替えたり、一部メニューを入れ替えたりする事がありますよね。

そんな時に便利なgemがbrowserです。

https://github.com/fnando/browser

後はこのgemの活用方法として、どのページにGooglebot（クローラー）が到達したのかを知りたい場合があります。

厳密に判定する方法ではないですが`browser.bot?`でbot判定とbotの名称でgooglebotであるか判別が出来ます。

類似のgemにデバイス判定に特化した`device_detector`があります。`browser`と比べてこちらの方が実行速度に優れているようです。

https://github.com/podigee/device_detector

ページを更新しているのにgooglebotが来てくれないページ（差分を収集してくれないページ）はSEOに弱いと判断できます。また、googlebotが来てくれたページとその頻度を集計すれば、Googleがどのようにウェブサイトを見ているのか、ある程度ですが分かるようになります。

これを本気でやってくれるサービスに[Botify](https://www.botify.com/)があります。

# 検索キーワードの取得には google-api-ruby-client

https://github.com/google/google-api-ruby-client

Google analyticsでは検索エンジン経由で流入したユーザーがどのキーワードで検索したのかを取得できません。

google-api-ruby-client経由でSearch Console API を使うと検索キーワードの情報をキーワード単位・ページ単位で取得できます。ものすごく役に立ちます。

https://developers.google.com/webmaster-tools/

# まとめ

- Googleが提唱するユーザーフレンドリーな設計に沿ったウェブサイトを企画して
- Googleが定めた仕様に沿ってウェブサイトを実装して
- Googleがどのようにウェブサイトをインデックスしているのか状況確認して
- Googleが広告込みで提供している検索結果に表示し易いコンテンツを提供する。

こんなGoogleドリブンなウェブサイトがSEOに強いです。

検索エンジンってそういうものだったっけ？と本末転倒な状況を感じつつありますが、RailsでSEOを重視したウェブサイトを実装している方のお役に立てれば幸いです。
FP-Growth 1

Frequent Pattern-growthの略で、頻出アイテムセットを算出するアルゴリズムです。
アソシエーション分析で利用されます。

深さ優先型の探索で頻出アイテム集合を列挙、と言われていますが、
実感がわかないと思いますので、
終末に天国行きの人を選定するためにFP-Growthを使ったというケースで考えてみたいと思います。

## 場面1
選定人は下界のことがあまりわかっておらず、非常に多くの人を自分だけ判定することも難しいので、
天国行きの人を判定するにあたって、基準を設け、
天使達にその基準に見合う者を探してもらうこととしました。

選「どれだけ善い行いをしたのか、で判断する」

しかし、天国の選定人は下界のことがあまりわかっていませんでした。
彼らにわかるのは彼らが知っている数少ない善行に関しては
文句なしに、天国行きにしてもよいということだけでした。
ただ、その行いで判定すると天国行きの人はあまりにも少なくなってしまいます。

ということで
選「あきらかに天国行きと思える善行を行う人間は、他にもさまざま善行を行っているはずだ」

天使「善い行いを誰が行ったかのリストはございます。かなり雑多で大量のリスト数ではありますが」

選「ものにもよるが、善行は１回では意味がなく、ある程度の繰り返される必要がある」

天使「いかがしましょう」

選「まずは回数毎に調べて、回数の多い善行順のリストを作るのだ」

天使「行いの良し悪しや難易度などは考慮しなくてよろしいですね」

選「そうだ。そして次に、回数が多い善行同士の関連も形にしてもらう」

天使「はい。ある人間が善い行いをした場合に、他にどんな善い行いをするのか、ということですね」

選「人には時代や文化というものがあるので、いくつかのグループに分かれるだろう。そのグループ毎に善行を出していく」

## 場面2
天使が回数の多い善行順のリストを選定人にもってきました。

天使「上位3%ほどの善行順のリストをお持ちしました」

選「よし。そのリストにある善行は今後全て対象からはずすように」

天使「承知いたしました。善行の関連からもですね」

選「そうだ。回数が多いものは簡単にできる行いだった、という場合がほとんどだろうからな。もちろんそれ自体がマイナスということではないが」

天使「まことの善人であれば、他の善なる行いもやっていましょう」

選「下位20%も切り捨ててよい」

天使「得がたい奇跡もあるのではないでしょうか」

選「よいか。我々がやろうとしているのは、どんな行いが素晴らしいかのランクを付けることではない。ましてや素晴らしい行いをした人間に上から順位をつけていくことでもない。非常に多くの人間から天国行きにいける者、或いはそのグループを、効率的に選定することなのだ。得がたい奇跡を行った人間は残った善行もそれなりにやっているはずだ」

つづく(あと２回くらいで完結します)
フロントエンドエンジニアとデザイナーの理想的な分業体制

これは[フロントエンドエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/frontend-engineers) 21日目の記事です。

エンジニア・デザイナー間の協業の話は、2016年に盛り上がる話題のうちの１つだったと思いますが、フロントエンドエンジニアのAdventCalendarなのでそれに習って自分の考えをまとめてみました！

こんな分業体制でプロジェクトに臨めたら、開発は効率化されないかなぁ〜！という妄想が多分に含まれます。
ただ必要なスキルセットはきっと高めなので、実践できる環境は選ぶかも…？　いや、やりましょう・・・！

# フロントエンドエンジニア

## プロトタイプ構築

フロントエンドエンジニアの強みの一つは、とにかく「すぐに動かせること」。
これはプロトタイプ駆動においてはとても重要なことかと思います。

コードの品質なんてとりあえず後回しでいいから、とにかく動くものを今すぐつくろう！早さは武器だ！

## ビルド設計

綺麗なモジュール化がされていれば、後から手を加えるのは簡単です。
色んな方面・要素からの要望を聞き入れる必要がある、Webフロントエンドではここも重要な項目の１つです。
なるべくロジカルな解決法で設計しましょう。

## コンポーネント組み込み

デザイナーが作成したコンポーネントを実際のアプリケーションへ組み込みます。
このタイミングで、コンポーネントへいろいろなイベントを付加していきます。

ただし一度フロントエンドエンジニアが手を入れてしまったコンポーネントが、デザイナーが触れなくならないように気をつけること。
なるべく難しい処理は隠蔽したり、キチンと外部メソッド化することでコードの読みやすさの維持に努めましょう。フロントエンドエンジニアの腕の見せ所です。

## サーバサイド・インフラエンジニアとCIを構築

とにかくコミットしたコードを素早く提供する仕組みづくりに徹すること。
デプロイサーバなどの環境に依存する話もでてくるため、そちらのエンジニアと密な連携をとります。

少しでも必要な手順を減らすこと。
テストコードが走ることが、最低条件です。

# デザイナー

## プロトタイプ設計

「なにをプロトタイプとしてつくるのか」「一番最初に抑えるべきことはなにか」
デザイナーは、エンジニアに比べて抽象的な部分をみる必要があります。

また、このプロトタイプによって何を得て、何を次のプロトタイプへ活かすかも考えましょう。

## カラー設計

これは単純です。
サービスやアプリケーションに使う色を決めます。
当たり前の話ですが、どの色を使うかはすべて理論的に説明できること。そして、無闇に色を増やすことは無能なデザイナーであることです。

意見は必ずデザイナー以外にも求めましょう。
その意見を取り入れるかどうかは、デザイナーが判断しましょう。

## コンポーネント構築

これはコーディングを指します。

デザイナーがReactやVueの「コンポーネント」という概念を理解することは、アプリケーションの品質向上に大きく寄与します。
サービスの寿命を延ばし、デプロイサイクルを高め、デザイナーのやりたい事を実現させやすい環境になります。

怖がらなくていいです。あなたが作ったコンポーネントは、プロがケツを持ちます。

## レイアウト

つくったコンポーネントを、どういう風にレイアウトするかを決めます。
つまりコレを見越したコンポーネントをつくる必要があるということです。

「自分が考えたユーザーインターフェイスを、どういう文脈で使うか」というクエスチョンに対する答えを出します。

## マーケターと分析設計について構築

作成したものをより良くしていくために、判断するための材料を常に仕入れる必要があります。

リリースされる前は仮説でしか取り組めなかったことが、確かな数値結果をもとにできるなんて最高ですよね。
価値あるデザインを提供し続けるために、必要なものをプロと決めましょう。

# 協力すること

これはエンジニア・デザイナーだけに限った話ではありませんが、一つの「チーム」を形成する「メンバー」として、意識していきたいです。

## チーム文化の形成

チーム文化は良いプロダクトをつくる上で、最も重要なことです。
これは、特定のセクションだけが意識的に動いているだけでは実現しません。

## プロダクトマネージャーと綿密なステートメント構築

プロダクトマネージャーはメンバーを導くためのビジョンを形成します。
それは全員に納得感があるべきです。そのための労力は惜しみません。

## メンバー同士が100％理解しあうのは無理なので、90％理解しあうのを目指す

職種が違うのであれば過去の経験も違うことが大半です。
やはり人間ですし、完全なる相互理解は難しいです。

ですが、そこで諦めずに出来る限りお互いに歩み寄る意識が大切になります。

Googleの生産性向上に関する研究である「プロジェクト・アリストテレス」にあるように、心理的安全性を高めることが重要になります。
ネガティブサイクルから脱出し、気持ちの面から改善を目指しましょう。

[グーグルが突きとめた！社員の「生産性」を高める唯一の方法はこうだ](http://gendai.ismedia.jp/articles/-/48137)

# やってはいけないこと

## エンジニアはコードだけを書く。デザイナーは絵だけをつくる。

線引きする行為は一見キレイな分業に見えて効率的に思えますが、実際はいくつかの業務が宙に浮いてしまいます。
お互いに望まない業務を生んでしまう原因です。

自分の持つスキルで、チームにどんなメリットをもたらすことができるかを考えましょう。

## プロダクトマネージャーに頼りっきり

マネジメントをしてくれる人は、自分より偉いと思いがちです。
ですが良いプロダクトマネージャーは、メンバーと対等です。

最終的な判断を下すのは自分ではないかもしれませんが、物事を判断する土俵に持っていけるのはあなただけです。

事業の判断には、開発者の考えが介入されるべきです。

# まとめ

- 全員が楽しく開発ができるように、全員が手を取り合うこと
- 物事を良くするために、専門外の知識をつけるべきだということ
- すべては繋がっているということを強く認識すること

明日は @daiend さんです。
Dockerは速くない

この記事は[Dockerその2アドベントカレンダー](http://qiita.com/advent-calendar/2016/docker2)の21日目の記事です。

タイトルからあおり記事のようですが、説明が出回っていなかったので、Docker=速くなる、という誤解を解きたいと思います。少なくとも自分は長い間速くなるというのを信じてました。

この説明では、Production環境でDockerを導入するという前提で進めます。

# なぜDockerは速いと言われているのか

よくDocker(Container)についての説明で以下のような説明がされています。

> ![C66DB9A7-12A2-458D-BAA9-36AB54CCE990.png](https://qiita-image-store.s3.amazonaws.com/0/85808/c017ddf2-36c2-fb78-2bce-ca438c1a33fd.png)

出典：https://www.docker.com/what-docker

ラッパーが少ないから当然速いし、軽いよと。
私はこの図を見たときに、
なんて素晴らしい技術が開発されたんだ！
起動が遅くて、重いVMなんてもう必要なくなるんだ！
と狂喜しました。

# 実際はどうなの

ところが、Dockerを使い始める前に有識者に話を聞くと、実際には速くならないしむしろパフォーマンスが落ちるとの意見が。
完全にDocker社と意見が割れていて、どっちかが嘘を言っている？！　と疑心暗鬼ながらもTutorialをやって、どんどんDockerにのめり込んでいきました。

# 真実は

Dockerを使い始めて数ヶ月が立ち、Dockerの勉強に勤しんでいたある日、"Docker for the virtualization admin" というeBookで真実が分かりました。
"Physical or Virtual?" セクションを要約をすると、
> バーチャルマシンはDocker のhostサーバーとして素晴らしいものですが、企業ではよくベアメタルを使う方が良いと考えています。
> Dockerエキスパート：
>> 　ベアメタルかバーチャルマシンかは場合によるし、良い点と悪い点がある。
>> 　CapacityとDisaster Recoveryの面ではバーチャルマシンが良いし、Latencyはベアメタルの方が良い。
>> 　問題は自分の状況にはどちらがいいのかを選択することであり、Dockerを使っていれば後から移管するにしても、大きな問題にはならないし、
>> 　Dockerが目指しているのはどちらを使えばいいとかではなく、どちらを使ってもDockerが違いを吸収してくれるということだよ。

eBook: https://goto.docker.com/docker-for-the-virtualization-admin.html

つまり、単純に速くなるとかそういうことではないと。
これを踏まえて最近の環境を振り返ってみると、クラウドでバーチャルマシンを使うことがデファクト・スタンダードになっていて（それにはそれなりの理由があって）、Dockerを導入する場合はそのバーチャルマシンにDockerを追加する形になるため、当然オーバーヘッドが増えるのが真実というか事実なのかなという結論に至りました。

Dockerについての最初に説明をよく見直してみると、バーチャルマシンとコンテナの違いを説明しているだけで、盲目的に速くなるとは書いてありませんでしたね。。。　なぜか、私はそう理解しまったのですが、説明が紛らわしいのか、または他の紹介記事はそのように誤った説明だったのかはよく覚えてません。
この件に関して、皆さんはどう理解していたのか、コメントお待ちしてます。

# じゃあ、Production環境以外では

ここからはおまけとして、Dockerのいいところ盛りだくさんなところを別の側面から紹介したいと思います。

## 開発環境として

これは、バーチャルマシンに圧勝していると思います。バーチャルマシンでローカルとは切り離した環境を構築できますが、
OSイメージのダウンロードや起動の重さその他、構築作業が煩雑だったりして、面倒が多いと思います。
その反面、Dockerでは起動が速い、構築作業が自動化されていることでDockerなしの開発は考えられなくなりました。
もちろん、ボリュームを使って永続化する必要があったり、コンテナ間の通信などで最初はハマりましたが。。。

## IoT（Raspberry Pi）

最近、Docker communityで盛り上がっている Docker on Raspberry Piですが、こちらもかなりアツいと思っています。
ポイントは：

* Raspberry Pi でDockerネイティブで動作するので、バーチャルマシンより高速で、かつポータビリティが高い
ベアメタルということになるが、SDカードでOSを書き込むだけなので、こちらも再現性が高く復帰やレプリケーションが容易
* 複数繋げたRaspberry PiをSwarmモード（Dockerコンテナをいろいろな構成に展開してオーケストレーションしてくれる）で分散処理できる。

というところです。まだ試してはいませんが、地味に高負荷処理なものをAWS EC2とか使うと高額になってしまうので、Raspberry Piを１万円分くらいまとめ買いして、自宅サーバー構築してみたいと思ってます。

詳細：https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/

# おわり

初めてのAdvent Calendarで、自分では少し挑戦的な内容にしてみました。指摘やご意見お待ちしております。
来年も良いDocker yearにしたいですね！
自動で地面を生成してみた

#やること
地面を一つ一つ追加しているときりがないので自動で生成できるようにする。
備忘録兼初心者の方の少しでも役に立てたらと書いてます。

#Prefab化
自動生成するためにオブジェクトをPrefab化。
大きさなど同じ形で何回も使いたいオブジェクトがあった場合はHierarchyからProjectへドラッグ&ドロップすることでそのオブジェクトをPrefab化できます。
Prefab化したオブジェクトはHierarchyに青色で表示されます。

余談ですが。
この時Project内にPrefabファイルを作ってそこにドラッグ&ドロップすることでPrefab化したオブジェクトをまとめることができます。


#自動生成コードを書く
自動生成するためのコード

```C#:StageGenerator.cs
[SerializeField]
GameObject earthPrefab; //地面

[SerializeField]
float x = 0;

void Start()
{
   StartCoroutine("Generator");
}

IEnumerator Generator
{
   while (true)
   {
     Instantiate(earthPrefab, new Vector3(0.2f + x, -4.6f, 0), Quaternion.identity);
     yield return new WaitForSeconds(.1f);
     x = x + 4.6f;
   }
}
```
これで上手くいく！と思っていたけど、どうも少し被るところがある模様。
そして被った箇所は少し盛り上がってしまう。
もっと数値を細かく設定する必要がある。

#まとめ
キャラクターが走り去ったあとの地面が残り続けてしまうため、走り去ったあとは地面を消すことも今後していきたい。
このコードを応用すれば地面を上下に作ったり、少し離れて作ったりできそうなので色々試してみたい。
沙耶奇譚

沙耶を産み落としたのは私です。
今でこそ時空戦士としてチヤホヤされる沙耶ですが、その誕生は難産を極めました。

KUSANAGI開発チームに私がアサインされたのは、まだ寒さの残る20・・年4月のある夜のこと。
託されたのは、KUSANAGIのロゴ開発およびマスコットキャラクターの企画・制作。重責です。
WEBデザイナーでありつつ、グラフィックデザインも手がける私に白羽の矢が立った形でした。
私はこの栄誉ある任務に対して最善を尽くそうと心に誓いました。

（休み）

開発の最初期段階では、沙耶のプロフィールはもちろん「沙耶」という名前さえまだありませんでした。
分かっていたのは、

1.KUSANAGIのマスコットを製作すること
2.それはKUSANAGIを擬人化したような、サービスにふさわしいキャラクターであること
3.納期はあまり長くない

というようなことぐらいでした。

頭に最初に浮かんだのは、このキャラクターをサイボーグの設定にしようということでした。
また性別も特定せず、ユニセックスな感じであればよいなと思いました。
（後者のアイデアは早々に立ち消えました）
しかしアイデアばかりが先行し、イメージを具現化する工程にひどく苦労しました。

（休み）

ある日、私はとある美術展に足を運びました。そしてそこで、私はとうとう沙耶に出会いました。
美術館では、次に催される展示の告知用のポスターが貼り出されていました。
そのポスターを見た途端、私の中で衝撃が走りました。

それは現代日本のアニメ界を展望するという興味深い内容でした。
ポスターには目を閉じて横たわる一人の少女が描かれていたのですが、そこに私は沙耶のイメージを見たのです。
とはいえその少女をコピーしたわけではぜんぜんありません。
インスピレーションが湧いたというだけのことです。念のため。

（休み）

マスコットを産む作業にやっと弾みがつきました。
すぐにアイデアをまとめて具現化し、清書は社外のイラストレーターに依頼しました。

名前については社内で公募があり「沙耶」というネーミングに決定しました。
これ以上は無いピッタリの名前です。たいそう喜びました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

いかがでしたか？
長い間封印されていたヒロインの過去。
運命のいたずらに、思わず身震いした方もおられるのでないでしょうか。
Fess kuromoji辞書への登録

Fess 10.3
kuromoji辞書に登録してみます。

管理>システム>辞書>kuromoji.txt

#### kuromoji辞書


- 登録するデータ

人名、映画などの作品名を登録してみます。

人名

```csv:csv
光宙,光宙,ピカチュウ,カスタム名詞
黄熊,黄熊,プウ,カスタム名詞
龍飛伊,龍飛伊,ルフィ,カスタム名詞
波波波,波波波,サンバ,カスタム名詞
```

作品名

```csv:csv
天国へのカウントダウン,天国へのカウントダウン,テンゴクヘノカウントダウン,カスタム名詞
ベイカー街の亡霊,ベイカー街の亡霊,ベイカーストリートノボウレイ,カスタム名詞
迷宮の十字路,迷宮の十字路,メイキュウノクロスロード,カスタム名詞
```

「トークン,分割トークン,分割トークンの読み,品詞」の内容で
CSVファイルを作成しておけばアップロードすることができます。

##### 分割トークン

「ベイカー街の亡霊」を「ベイカー街」や「亡霊」でも検索可能にしたい場合は
CSVファイルの分割トークンと読みをスペースで区切ります。

```csv:csv
天国へのカウントダウン,天国 への カウントダウン,テンゴク ヘノ カウントダウン,カスタム名詞
ベイカー街の亡霊,ベイカー街 の 亡霊,ベイカーストリート ノ ボウレイ,カスタム名詞
迷宮の十字路,迷宮 の 十字路,メイキュウ ノ クロスロード,カスタム名詞
```

分割させるのが手間な場合は
作品名だけでも登録しておけば作品名の検索時に
作品名が分割されて検索されるのを防ぐことができます。
RESTfm で Delete してみよう

# RESTfm で Delete する
Update の次は Delete になりますが……

実は内容や対象が Update とほぼ同じなのです。[公式ドキュメント](http://restfm.com/manual)を見るとわかりますが、Update（PUT メソッド）と Delete（DELETE メソッド）の現れている場所が一緒だと気づくはずです。「2.8」と「2.11」の項目ですね。

それじゃあ Update の記事内容をそのまま Delete と読み替えてもらえばいい……わけですが、記事単体として成立させておくことに意義はあると思うので、完全に繰り返しの内容になってしまいますが、以下、書いていきましょう。

# Delete できるのはレコードに対してだけ
[公式ドキュメント](http://restfm.com/manual)を見るとわかりますが、Delete をする対象はレコード以外にありません。レイアウトやデータベースを Delete する API があってもいいかもしれませんが、それをわざわざ API で行うメリットとデメリットを考えると、リスクの方が大きいということで妥当な実装だと思います。

# 基礎となる URI と使用するデータベースおよびレイアウト
説明を分かりやすくするために、RESTfm を以下の場所に配置したと仮定します。

**http\://hogehoge/RESTfm/**

また、説明に使うデータベース名は`Member`とし、同じくレイアウト名は`categories`とします。

# レコードを Delete する（レコードID を用いて URI を構成する）
それではレコードを Delete します。そのためには対象となるレコードのレコードIDを指定する必要があります。そのレコードIDをここでは仮に`123456789`とします。この条件のもと、URI を構成すると以下のようになります。

http\://hogehoge/RESTfm/Member/layout/categories/123456789

上記の URI がアクセスする URI です。

# レコードを Delete する（検索条件を用いて URI を構成する）
前述の方法では レコードID を指定して更新対象のレコードを特定していますが、さすがにこれだけでは不便だろうということで、レコードの検索を経由してのレコード指定をする方法も用意されています。

例えば`foo`というフィールドの値が`bar`であるレコードを Delete したい場合は以下の URI を叩きます。**記号類（「=」など）や日本語はエンコードする必要がありますがここでは見やすくするために省略していますので注意してください**。

http\://hogehoge/RESTfm/Member/layout/categories/foo===bar

注意点として、検索によりレコードが一意に定まる必要があります。複数のレコードが検索により引っかかる場合はエラーになります。

# レコードを Delete する（PHP の curl を用いる）
URI が定まったならばあとは DELETE メソッド PUT するだけです。PHP でのコード例を以下に示します。

```php
$uri = "http\://hogehoge/RESTfm/Member/layout/categories/foo%3D%3D%3Dbar";
$request = "DELETE";
$headers = array("Content-Type: application/json");

$options = array(
    CURLOPT_URL => $uri, 
    CURLOPT_CUSTOMREQUEST => $request,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true
);

$curl = curl_init();
curl_setopt_array($curl, $options);
$response = curl_exec($curl);
curl_close($curl);
```

# オプションパラメータ
Delete にはオプションとしてパラメータが用意されています。以下に一例を簡単に説明します。

- **RFMscript**
    - このパラメータを指定すると、Delete した後に指定のスクリプト（「=」でつないでスクリプト名を指定）を実行します
    - スクリプトに引数を用いる場合はさらに`RFMscriptParam`パラメータを付与します

# bulk も可能
GET や PUT の記事で記載した bulk での Delete も可能です。詳しくはやはり[公式ドキュメント](http://restfm.com/restfm-manual/web-api-reference-documentation/uri-restfmdatabasebulklayout-bulk-operations/delete)をどうぞ。

# Delete（DELETE メソッド）は慎重に
GET メソッドは単に情報を取得するだけですので誤った URI を叩いたりしてしまってもエラーが出るくらいですが、DELETE メソッドの場合はデータを削除してしまいます（当然ですが）。削除したデータを元に戻すためにはバックアップからの復活など、少なからず手間がかかります。

そう考えるとそもそも Delete を API で用いるのは最小限に限定した方がいいとは思います。もし利用する場合でもテストデータなどで十分に仕様を把握した上で実戦投入するといいでしょう。

エラーチェック（ログ出力）や削除前に削除データをいったんファイルに書き出すなどの処理を組み込めば不測の事態にも備えられます。そこらへんも意識してコードを書くようにしてみてください。
Vim 8.0 Advent Calendar 21 日目 新しい組み込み変数

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 21 日目の記事です。

今回は新しく追加された組み込み変数を紹介します。

## タイプを表す定数

`type()` 関数を使うと、変数のタイプを得ることができます。ここで得られる値は数値で、各タイプに数値が割り当てられています。
ある変数が特定のタイプであるかどうかを判定したい場合、今までは以下のようにしていました。

```vim
" 以下の例では変数 var が文字列かどうかを判定しています。

" 文字列の type の値は 1 なので、これと比較して判定します。
if type(var) == 1
endif

" マジックナンバーを避けるため、以下のようにすることが多いです。
if type(var) == type('')
endif
```

この方法には、以下のような問題がありました。

- 若干トリッキーで、慣れないと理解しづらいコードになります。
- `type()` 関数を余計に呼ぶため、オーバーヘッドがあります。
- 関数参照の場合は `type(function('type'))` のようになり、長い上に `function()` 関数に渡す関数名が人によってバラバラで統一感がありません。
- 新しく追加された `job` 型などの値は気軽に生成できません。

そこで、`type()` 関数の戻り値を表す定数が新たに追加されました。以下の表が定数の一覧です。

| 型           | 定数          | 定数の値 | 型の値の例         |
|:-------------|:--------------|:---------|:-------------------|
| 数値         | `v:t_number`  | 0        | `10`               |
| 文字列       | `v:t_string`  | 1        | `'foo'`            |
| 関数参照     | `v:t_func`    | 2        | `function('type')` |
| リスト       | `v:t_list`    | 3        | `[0, 1, 2]`        |
| 辞書         | `v:t_dict`    | 4        | `{'one': 1}`       |
| 浮動小数点数 | `v:t_float`   | 5        | `1.23`             |
| 真偽値       | `v:t_bool`    | 6        | `v:true` `v:false` |
| 特殊値       | `v:t_none`    | 7        | `v:null` `v:none`  |
| ジョブ       | `v:t_job`     | 8        | `job_start(cmd)`   |
| チャンネル   | `v:t_channel` | 9        | `ch_open(host)`    |

## `v:completed_item`

補完された対象を表す変数です。
以前までは、`CompleteDone` イベントにより補完の完了を知ることはできましたが、どの候補が選択されたかを知ることができませんでした。新しく追加されたこの変数を参照することで、どの候補が選択されたのかわかります。
選択された候補は辞書です。詳しい構造については `:help complete-items` で説明されています。補完に失敗した場合は空の辞書になります。

## `v:hlsearch`

検索による強調表示が行われているかを表す変数です。
検索のハイライトは `'hlsearch'` オプションをオンにして検索を行うことで行われますが、`:nohlsearch` Ex コマンドを使うことで、一時的にハイライトを無効にできます。このとき `'hlsearch'` オプションの値はそのままなので、ハイライトが行われているのか、`:nohlsearch` Ex コマンドで消されているのかが今まではわかりませんでした。
`v:hlsearch` 変数は、ハイライトが行われている時は 1、行われていない時は 0 になります。
また、値を書き換えることでハイライトの状態を変更できます。ただし、`'hlsearch'` オプションがオフの場合はハイライトを有効にできないため、1 を入れても値は 0 のままです。エラーも発生しません。
また、関数の呼び出しは、最後に使用された検索パターンを保存して呼び出し終了後にリストアします。つまり関数内でこの変数を書き換えても、関数の終了時に復元されてしまうので注意してください。

## `v:progpath`

Vim を起動した際のコマンドを示す文字列です。つまり、Vim コマンド自身のコマンドライン引数の 0 番目です。
システムに複数の Vim がある場合に、どの Vim で起動されたかのヒントになります。Vim 内から別の Vim を起動して処理を行いたい場合などに便利です。

```vim
echo exepath(v:progpath)
```

コマンドが相対パスでカレントディレクトリが移動した場合や、`$PATH` が変更された場合など、確実に起動した Vim が得られるわけではない点に注意してください。

## `v:vim_did_enter`

Vim が起動して、`VimEnter` イベントが発生する直前までは 0 です。`VimEnter` イベントが発生する直前に 1 になります。
似たような値に `has('vim_starting')` があります。こちらの値は逆で、起動中は 1、起動後は 0 になります。値が変わるタイミングは `v:vim_did_enter` と同じです。両者は完全に代替可能です。
ではなぜこの変数が追加されたのかと言うと、実はこれを追加した際、Bram さんは [`has('vim_starting')` の存在を完全に忘れていました](https://groups.google.com/d/msg/vim_use/2hTWaQSwWyU/z3d8eH84CwAJ)。あとで指摘された際、この変数の追加をリバートすることも検討したようです。
しかし、`has()` 関数は基本的に Vim のコンパイル時に組み込まれている機能を調べるためのもので、一部の例外を除き Vim 実行中に値が変化しないこと、そのような慣習のため、Vim が起動中かどうかを調べる方法が `has()` 関数にあることはユーザーにとってわかりづらいことなどを [Gary さんに指摘され](https://groups.google.com/d/msg/vim_use/2hTWaQSwWyU/aMaPf0Y3CwAJ)、残すことになったようです。
PHP で Excel データにアクセスする

PHP で Excel のデータを読み書きするのは一筋縄ではいきません。サードパーティーのライブラリを利用するのが一般的ですが、ここでは [CData ODBC Driver for Excel](http://www.cdata.com/jp/drivers/excel/download/odbc/) を利用して、ODBC 経由で Excel データにアクセスする方法を簡単に紹介します。

#DNSを構成
ODBCのデータソースを追加します。
CData ODBC Driver for Excel- DNS構成 を起動して、アクセスするExcelファイルのパスを設定します。

![fig5_01.png](https://qiita-image-store.s3.amazonaws.com/0/141193/97033463-bd70-0c27-402b-090821507c61.png)

読み込む Excel の内容は、以下のような表です。

![fig5_02.png](https://qiita-image-store.s3.amazonaws.com/0/141193/d9035870-795e-aa64-c959-ea47d44ec4e0.png)


#接続を確立
odbc_connect または odbc_pconnect 関数を使用して、Excelへの接続を確立します。確立した接続を閉じるには、odbc_close または odbc_close_all 関数を使用します。

```php
$conn = odbc_connect('CData Excel Source', '', '');
// ...何かの処理...
odbc_close($conn);
```

#プリペアドステートメントを作成
odbc_prepare 関数を使用して、プリコンパイル済みのSQL文オブジェクトを生成します。

```php
$pstmt = odbc_prepare($conn, 'SELECT * FROM Temp');
```
#クエリを実行
odbc_execute 関数を使用して、SQL文を実行します。

```php
$success = odbc_execute($pstmt);
```

#結果セットを取得
odbc_fetch_array 関数を使用して、SQL文の結果セットを取得します。

```php
while ($row = odbc_fetch_array($pstmt)) {
	print_r($row). "\n";
}
```

![fig5_03.png](https://qiita-image-store.s3.amazonaws.com/0/141193/d515db5a-624e-fff8-bdd7-fda0b94ce030.png)
![fig5_04.png](https://qiita-image-store.s3.amazonaws.com/0/141193/2b00782e-4a0b-c604-c6ab-d1b2d7725778.png)


結果は上図のようになります。
これはごくごく簡単な例ですが、このように、ODBC 経由で簡単に PHP から Excel データにアクセスすることができます。
ゲームのデバッグと単体テスト

## はじめに

今作っているゲームで実際にやっているデバッグと単体テストのやり方を紹介します
ただし、全て我流です！参考になるやらならないやら！
ちなみに、例やコードで書いてある内容は実際に作っているゲームの内容とは一切関係ありません。
RPGっぽい例を出していますが、実際に作っているのはRPGではありません。

## サクサクデバッグしたい！

ゲームのデバッグは、特定の条件下でデバッグをするのが困難な場合が多くあります
例えば、強力な敵キャラの動作テスト、特定のアイテムを持っている場合のテスト
などなど・・
そういう場合は、デバッグ値で無敵状態、最初からアイテムを持っている状態などを
作ってからデバッグします
敵からのダメージの値が正しいか、経験値が正しいかなど、ゲームバランスに関わるような処理などは
いちいち動作確認していられないので、単体テストが非常に有効です

## 実際にやってみる

デバッグ用のファイルを用意します
ここでは無敵状態などのフラグの制御だけではなく、
ゲームロード時に任意の値を呼び出せるようにしておくと便利です

```coffeescript:debug.coffee
class Debug extends Node
  constructor: () ->
    super
    @muteki = true; #無敵
    @test_load = { #セーブデータのロード時にこの値を強制的に呼び出す
      'level':99, #レベルカンスト
      'items':['oriharukon','misuriru'] #アイテムを最初から持ってる
    }
```

単体テスト用のコードを書くファイルです
ダメージ計算式など、複雑な条件が絡み合う計算などで重宝します

```coffeescript:test.coffee
class Test extends Node
  constructor:()->
    super
    @test_ext_flg = true #テスト実行フラグ、trueだとゲーム呼び出し時にテスト関数を走らせる
  textExe:()->
    game.damageCalc() #ダメージ計算式を実行
```

ゲームのメインで使うシーン以外に、
テスト用のシーンを用意しておきます

```coffeescript:test_scene.coffee
class testScene extends Scene
    constructor: () ->
        super
```

ゲームクラス内で実行します

```coffeescript:my_game.coffee
class MyGame extends Game
  constructor:()->
    super
    @debug = new Debug()
    @test = new Test()
  onload:()-> #ゲーム呼び出し時に実行する
    if @test.test_exe_flg is true
      @test_scene = new testScene() #テストフラグが立っていたらテスト用のシーンを実行
      @pushScene(@test_scene)
      @test.testExe()
    else
      @main_scene = new mainScene() #通常はゲームを開始する
      @pushScene(@main_scene)
```

enchant.jsでのシーンの概念について、興味のある方はこちらを参考にしてみてください。
http://www.atmarkit.co.jp/ait/articles/1304/01/news034_4.html

## さいごに

メモリ内変数が複雑に変化し、絡み合うゲーム開発では
デバッグとテストのやり方を効率的にすることで、開発はより快適になります
このデバッグとテストのクラスを丁寧に整備していけば、
再現条件が難しいバグを発見したときでも、サクサクデバッグができるようになります。

## 次回

次回はenchant.jsでHTMLタグとCSSを使う方法をやろうと思います。
基本的にenchant.js内で使われるタグはcanvasタグ（Spriteクラス）ですが
任意のHTMLタグを使用することも出来ます。
メニューボタンなどを作る時にsurfaceでボタンを描画してlabelで文字を書くのは面倒ですし、
画像を使わず容量節約もしたいです。
これでサクサクとリッチなボタンを作ります。
LINQPadで別DBサーバのテーブルを扱ったお話

# gloops Advent Calendar 21日目:sunny:

[gloops Advent Calendar2016](http://qiita.com/advent-calendar/2016/gloops)も21日目に突入しました！
毎日エンジニアが頑張って投稿してくれているので無事に完走できそうです:thumbsup:

21日目は本日で誕生日を迎え40代に一歩近付いたy_nakaiが担当致します
普段はマネジメント業務をやっていてめっきりコードに触れることが減っているので小ネタになります
C#エンジニアなら一度は触れるであろう【LINQPad】についてです

# 背景

[gloops Advent Calendar1日目](http://qiita.com/m_ono_desuyo/items/09862d5d9ca7cc25f2b0)にて紹介されたデータチェック方法について、
【LINQPad】を使用してデータ参照してメールで通知という方法も採用しております
今回は複数のDBサーバを跨って参照する際に行ったことを記します

# LINQPadデフォルトだとスキーマ1個しか参照できない問題

LINQPadで参照できるスキーマってデフォルトだと1個だけで、
現在参照しているスキーマとは別スキーマからテーブルをD&Dするとスキーマ情報が変更されてしまいますよね
![movie1.gif](https://qiita-image-store.s3.amazonaws.com/0/51652/6498d707-23e4-a0b5-e543-6cd460d55cad.gif)



そんな時、簡単に別スキーマ情報を追加することができるんです！

**方法：左側のスキーマビューから、追加したいスキーマをCtrlを押しながらコード書いてるところにD&D**

あら、簡単！
するとスキーマビューに新たな接続が追加されるので、参照したいテーブルをD&DすればOKです
![movie2.gif](https://qiita-image-store.s3.amazonaws.com/0/51652/31128378-e4e5-abc5-4d64-8954ac734a90.gif)


もちろん3つ以上スキーマを追加することが可能です！


# だがしかし！これだと別サーバのDB参照できない問題

Ctrl押しながら追加できるなんて簡単やん
って試しに別サーバのテーブルをD&Dしたらエラーが発生しました
![pic003.PNG](https://qiita-image-store.s3.amazonaws.com/0/51652/05125998-5da8-e29b-de23-4c8b4d17aefd.png)



別サーバの場合は「linked servers」設定を入れなくてはいけないとのこと

リンクサーバーの作成方法はこちら
https://technet.microsoft.com/ja-jp/library/ff772782(v=sql.105).aspx

う～ん、インフラに相談が必要ですね・・・

# Dapper使えば解決！

結局、自作しちゃったほうが早そうですね
Dapperを使ってみます

まずNuGet Package Manager（Ctrl＋Shift＋Pで起動）から「Dapper dot net」をAddして下さい
※注：Nuget integrationはDeveloper以上のライセンスが必要です
https://www.linqpad.net/Purchase.aspx

あとはDapperを使ったコードを書くだけです
簡単なサンプルを載せておきます

```csharp:sample.cs

private const string ConnectionString = "xxx";

void Main()
{
    GetDataById(5).Dump();
}

public IEnumerable<User> GetDataById(int id)
{
    IEnumerable<User> resultList;

    using (var conn = new SqlConnection(ConnectionString))
    {
        const string sql = @"SELECT [Id], [UserName], [GroupNo] FROM User WHERE [Id] = @Id";

        conn.Open();
        resultList = conn.Query<User>(sql, new { Id = id });
        conn.Close();
    }

    return resultList;
}

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public int GroupNo { get; set; }
}
```

簡単にアクセスできました
同様に別DBについての記述をすればサーバを跨いだチェックが可能となります


こんな感じで、
[gloops Advent Calendar1日目](http://qiita.com/m_ono_desuyo/items/09862d5d9ca7cc25f2b0)の投稿と同様に、必要なデータチェックをしてメール配信するようにしています
ぼっちでXmasを迎えないための環境構築

この投稿は [カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/no-girlfriend) の21日目の記事です。

もしかしたら何かがどうにかなって、12月中旬にはカノジョができているかもしれない。
そんな期待を胸に迎えた12月。
ギリギリまでねばって（？）このアドベントカレンダーから目を背けていましたが、
ついに現実を見なければならない時がやってきました。

しかしまだ時間はある。
あと2日。
あと2日あるんだ。
あきらめたらそこでXmas終了ですよ…？と眼鏡のサンタが囁く。
~~いや全然おっけー。Xmas終了していいんじゃないですかね？~~

さあ。この記事では、Xmasをぼっちで迎えないために役立つ（かもしれない）Tipsを
徒然なるままに書いていくよ。

## 開発環境構築/運用の手間を減らそう

メインのタスクは開発であるはずなのに、環境の構築や維持に手間がかかってしまうから
余計に時間を削られ、カノジョを作る暇が無いーーー

今更？いや、きっとまだ誰かに届くはずだ。
そんな気持ちを胸に言わせてください。

開発環境を構築するなら **Vagrant** や **Docker** を使いましょう。
ローカル開発環境の扱いがかなり楽になるので。
もしカノジョが今日から同じプロジェクトにジョインしたいとか言い出しても
自分のローカル環境のデータをコマンド1つでエクスポートしてそのままカノジョに渡せば、
それを起動するだけで全く同じ環境がカノジョのローカルにも構築されるのです。
もしカノジョが以前の状態に戻りたいとか言い出しても
バックアップの取得も切り戻しも、コマンド1つで済むのです。

これで僕はだいぶ幸せになれました。
開発するにしてもテストを行うにしても、起動・破棄・複製が容易な環境というのは非常に便利。

ちなみに、Vagrant使う場合は十中八九入れておいたほうがいいプラグイン（ vagrant-vbguest とか）が
あったりするので、このあたりは先達諸氏の記事をご参照ください。

## 環境にアクセスする手間を減らそう（Macから認証アリproxy経由してsshする）

特定の環境へのアクセスに関しては
「コマンドを打つのすら面倒」
「そもそもどの環境がどんなネーミングで存在していたかなんて覚えていない」
という理由達が相俟って、いつもは [Shuttle](http://fitztrev.github.io/shuttle/) から各環境にサクッとアクセスしてるんですが
あれ…proxy経由してsshするのってどうすれば？？？と最近困ったことがあったので
ついでに載せておきます。

### httpに限定しないなら

#### 全部コマンド内に書いてしまうパターン

`ProxyCommand` 内でproxy接続情報を指定していきます。
例1
  
```
$ ssh [ユーザー名]@[サーバ] -o 'ProxyCommand ssh -p [proxyポート] [proxyユーザー名]@[proxyサーバ] nc %h %p'
```

例2（proxyのタイプ指定したい場合）  

```
$ ssh -o ProxyCommand='nc -X [proxyのタイプ] -x [proxyサーバ]:[proxyポート] %h %p' [ユーザー名]@[サーバ]
```

#### ~/.ssh/config に書くパターン

```
# hogehoge環境にproxy経由で接続
Host hogehoge
  HostName [サーバ]
  Port [サーバポート]
  User [ユーザー名]
  ProxyCommand ssh -p [proxyポート] [proxyユーザー名]@[proxyサーバ] nc %h %p
```

…と書いたなら、 `$ ssh hogehoge` とコマンド打つだけで済む。

### 認証アリhttpの場合

①Macに corkscrew を（Homebrewで）インストール

```
$ brew install corkscrew
```

②proxyサーバの認証情報を記載したファイルを作成
中身は `[username]:[password]` 。

```
$ cat ~/.ssh/hogehoge_proxy_login.ini
my_name:XXXXXXXX
```

このようなファイルを作っておいて、

③ProxyCommand 内のコマンドを corkscrew に変更
ProxyCommand 部分だけだと以下のような形になるので

```
ProxyCommand corkscrew [proxyサーバ] [port番号] %h %p [認証情報ファイル名]
```

1コマンド内に収めようとすると

```
ssh [ユーザー名]@[サーバ] -o 'ProxyCommand corkscrew [proxyサーバ] [proxyポート] %h %p ~/.ssh/hogehoge_proxy_login.ini'
```

うわぁ…長い…
まぁ設定ファイルに記述する内容なので毎回これを打つわけじゃないのですが。


## タスクの優先順位付けを見誤らないようにしよう

突然話が変わりますが、忙しいからと言って優先順位を見誤ったタスクの先延ばしは
~~しばらく放置してたら予期せずブロック~~ 大きな問題を引き起こすのだと
最近痛感したので書いておきます。

ええ、10日目の記事 [究極の24/365運用を目指して](http://mkkn.hatenablog.jp/entry/2016/12/09/235742) を見て目から汗が止まっていないのは僕ですよ…
あまりにもかっこよかったので上記記事から一文を引用。

> 「会いたい」って要求に対して 24/365 で答えられないのであれば、ping の通らないサーバと同じ。

誰かこの台詞を半月前の僕に言ってやってください。


## memo

```
忙しい時こそ、大切な誰かとの時間を確保しよう。
敢えてそういう時間を作ることで、逆に自分に余裕が生まれる。
```

…のだと、最近になってようやく学びました。
~~その「大切な誰か」がいないことが最も大きな問題ですね。泣いてませんよ。~~
皆様、素敵な休暇をお過ごしください。
Microsoft Translate API を用いた Slack ニューラルネット翻訳コマンドの実装

以前、[Microsoft Translate API を用いた Slack 翻訳コマンドの実装](http://qiita.com/sosuke/items/ece4aee023fade0c2d23)という記事を書いたのですが
[自動要約＆ニューラルネット翻訳で海外の記事を読みやすくするSlackBot](http://qiita.com/riverwell/items/7413496b0f5fb0081836#_reference-2ec8bd39e55b2b7df2de)という記事からリンク貼っていただき気づきました。

> `CATEGORY`に`generalnn`を設定するとニューラルネット翻訳。

なるほどです。。。

以下修正しました。

```diff
-   var translate_url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=" + from + "&to=" + to + "&text=" + encodeURIComponent(text);
+   var translate_url = "http://api.microsofttranslator.com/v2/Http.svc/Translate?from=" + from + "&to=" + to + "&category=generalnn&text=" + encodeURIComponent(text);
```

修正前

<img width="390" alt="Screen Shot 2016-12-06 at 20.48.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/77c75116-1e37-a95e-7813-dcce3a9e35a3.png">

修正後

<img width="397" alt="Screen Shot 2016-12-19 at 19.11.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/9a405da3-852d-f44c-100e-30b38f6cfe6f.png">

おお :tada: 

（追記でよかったのですが。。。）
アイデアソンのながれ(体験会２)

こんにちは。

前回の続き[アイデアソンのながれ（体験会１）](http://qiita.com/houren/items/3b51f03df4bc2931ed41)でマンダラートより後のおはなし。


## ペアブレスト

自身がやったペアブレストは、５分１組を３セット行いました。

・自己紹介（１分）
・アイデア出し合い（３分）
・メモ取る（１分）
　　
純粋に、いろんな職種、業種の参加者さんと話すのが楽しかったです。
ここで、話していくうちに、自分のアイデアをまとめていきます。

## アイデアスケッチ
A3の紙に、自身のテレビに関するアイデアを絵付きでアピールします。

たとえばこんなかんじ。
<img width="471" alt="アイデアスケッチ.png" src="https://qiita-image-store.s3.amazonaws.com/0/150624/1fa8229a-3416-8c03-02ca-7a91d89102ab.png">


## ハイライト法
良いと思ったアイデアスケッチに、〇をつけます。紙の端に。
休憩時間の間、15分くらいでみんなのアイデアスケッチを見て回り◯をつけました。
<img width="471" alt="ハイライト法.png" src="https://qiita-image-store.s3.amazonaws.com/0/150624/5ee4026e-d532-8f60-e4f4-12d1a491b3c4.png">

## アイデアレビュー
投票数の多い人が対象です。つまり◯の多い人。
多い人は１０こくらいついていたような。
（私は１つ・・（涙

選ばれた人は発表者となり、
アイデアの説明をおこないます。

体験会はここまででした。

ハッカソンへとつづく場合、
ここから、チームビルディングが行われ、好きなアイデアに集まり、開発が行われます。

１日または２、３日かけて開催され、
それぞれのチームが発表、優勝者が決まり、そこからは楽しい懇親会が始まるようです。


自身には中々刺激的なアイデアソン体験会でした。
こころはちょっぴり折れましたが（◯１つだったし）
また参加してみたいなと思いました。
　　
アウトプットして、ちしき固めていくぞ〜。
Amazon Athenaのクエリ結果をLambdaを使って自動でgzip圧縮する

これは[マイネット Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mynet) 21日目の記事です。

## 対象読者

以下のいずれかに当てはまる人

- Amazon Athenaを利用している。
- AWS Lambdaを試してみたい。

## やりたいこと
Athenaのクエリ結果はCSVでS3に保存される。
クエリによる集計済みのデータとは言え、生のCSVだと数百MB～数GBになることもある。
gzip圧縮することで、ダウンロード時の帯域と転送料金を節約したい。

## 手順
AWSコンソールからLambdaの新規作成を選択したところから、画面キャプチャ付きで解説

### Lambda Functionのテンプレートを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/b3a2de91-bf1e-9dd1-bbd2-655fd83ed776.png)

### トリガーの設定
S3を選択し、CSVファイルの作成時にLambdaが起動するように設定する。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/d75f7b39-ff6b-d61e-f22b-6204f3d0497b.png)

### Lambda Functionの設定
Lambda Functionの設定画面になるので、適切に設定する。
gzip圧縮するタスクの場合、検証の結果Node.jsが高速だったので、ここではNode.jsを使用する
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/414b7fcd-2d51-e904-9005-1216e3e2e09c.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/3c89d22d-5551-9464-63b8-5942d7ad729b.png)

### Roleの作成
上記画面で、Create New Roleを選択すると、Role作成画面へ移動するので、Roleの作成を行う。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/79d2f7f0-6764-a652-b8e7-9a7817254c64.png)

### コードを書く
設定を完了し、Lambda Functionを作成すると、コードの編集＆テスト画面へ移る。
書き込まれたCSVをgzip圧縮をしてS3へ保存するコードを書く。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/b1c7ab5e-0f76-80c9-0644-3279d317b381.png)

コードは「[AWS LambdaでS3に配置されたファイルをgzipする](http://qiita.com/sfujiwara/items/9dabed1cef5b0a974f34)」をほぼそのまま利用した。

```js
var aws = require('aws-sdk');
var zlib = require('zlib');

exports.handler = function(event, context) {
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    
    console.log('starting gzip ' + bucket + '/' + key);
    var s3 = new aws.S3();
    var gzStream = s3.getObject({ Bucket: bucket, Key: key }).
        createReadStream().pipe(zlib.createGzip());

    var s3obj = new aws.S3({ params: { Bucket: bucket, Key: key + '.gz' }});
    s3obj.upload({Body: gzStream}).
        send(function(err, data) {
            context.done(err, data);
        });
};
```

### テストイベントを設定する
コードが期待通りに動作するかテストをする。
Lambdaでは、テストイベントを設定してコードを起動できる。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/ec431839-7bb2-d727-e544-b40cc977bb61.png)

今回は、バケット名とパスのみ参照するため、テスト用のパスに書き換える。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/f60325d8-ab32-eb50-d9b5-e9cfe5129466.png)

### テストを実行する
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/82e219db-cc5e-e43a-33cb-6562fe3c4238.png)

### 結果を確認する
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/a5ae0588-4090-5dc4-f7db-c7d370aaf004.png)

### トリガーを有効化する
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/d1021afe-20e6-6df7-2223-8e9f26b22988.png)

## 実際にAthenaでクエリを発行してみる。
サンプルテーブルに対して適当にクエリを発行してみる。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/3df270c5-a70e-f3cd-1963-f0b692ad7d27.png)

S3を見に行くと、CSVファイルと一緒にgzip圧縮されたファイルも作成されていることが確認できた。
![image](https://qiita-image-store.s3.amazonaws.com/0/132475/70e8bc8f-b710-462f-d3b3-c58c2fc08caa.png)

## 結果
Athenaでクエリを発行するだけで、自動でgzipファイルが作成されるようになった。
Travis CIっぽいマトリクステストをする「Jenkins Yaml Axis Plugin」

# Jenkins Yaml Axis Pluginとは?
Travis CIみたいにyamlファイルからマトリックステストの軸を作成するためのプラグインです

* https://github.com/jenkinsci/yaml-axis-plugin
* https://wiki.jenkins-ci.org/display/JENKINS/Yaml+Axis+Plugin

# 使い方
## 1. リポジトリにyamlファイルをコミット
```yaml:axis.yml
RUBY_VERSION:
  - 2.1.8
  - 2.2.4
  - 2.3.0

DATABASE:
  - mysql
  - postgres
  - oracle
```

## 2. 「マルチ構成プロジェクトのビルド」を作成
![image](https://qiita-image-store.s3.amazonaws.com/0/8059/d9f6c619-95c6-3a1b-8fdd-32e2d01bd472.png)


## 2. 「軸の設定」でYaml Axisを選択し、軸を設定
![image](https://qiita-image-store.s3.amazonaws.com/0/8059/ac52f393-b9aa-d707-4278-ca20eeae3278.png)

## 3. 実際にビルドするとyamlの値で軸が作られる
![20160108011202.png](https://qiita-image-store.s3.amazonaws.com/0/8059/6111ce53-9a09-20b0-7c4b-d20b54f79f5f.png)

## 4. 特定の組み合わせのみ除外したい
Yaml matrix execution strategyを選択するとYamlで除外設定ができます

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/702d3b93-8018-1cbe-a8c7-25752690ca7c.png)

```yaml:axis.yml
exclude:
  - RUBY_VERSION: 2.1.8
  - RUBY_VERSION: 2.3.0
    DATABASE: oracle
```

この例だと `RUBY_VERSION == "2.1.8" OR RUBY_VERSION == "2.3.0" && DATABASE == "oracle"` のような条件で除外されます。

# メリット
* 軸の設定をリポジトリに含めることができる
* 1つのジョブでブランチごとにビルドする内容を変える事ができる
  * 例えば、Rails 5対応ブランチのみRails 5でビルドというパターン
* 除外設定はワンライナー [^oneliner] に比べて柔軟に設定できる
  * 単純な設定ならいいけど条件が2つ以上になったら厳しい

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/aac7ff4d-7bd5-5ec0-ecf7-65447030563d.png)

[^oneliner]: Groovy式を入力してtrueになった時に実行される

# 詳しいこと
[Jenkinsを使った最高のマトリックステスト（2016年版） - くりにっき](http://sue445.hatenablog.com/entry/2016/02/03/120148)
Laravelを使ってみて

# Laravelを使ってみて

## はじめに

[mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba) の21日目担当 @tetaketa です。

私のチームではyii2を使っていたのですが、新規開発のタイミングで、別のフレームワークもと思って色々検討した結果、Laravelを使ってみることになりました。

Laravelを使い始めて困ったことや調べたことをtipsとして紹介します。
Laravelのバージョンは5.2です。

## ルーティングに名前をつける

viewでURLを埋め込むときやリダイレクトするときに、URLをべた書きしたくない。
そんなときは、`routes.php`の設定で名前をつけると、`route()`で呼び出せます。

```
Route::group(['as' => 'campaign::'], function () {
    Route::get('campaign', 'CampaignController@index')->name('index');
    Route::get('campaign/create', 'CampaignController@create')->name('create');
});
```

`route('campaign::create')`で呼び出せます。


## 引数に値の入ったクラスをDI

Laravelのサービスコンテナ(DIコンテナ)だと、コンストラクタにタイプヒントで指定すれば、勝手にbindしてくれます。
引数を持ったクラスの場合、例えばS3のclientとかの場合だとどうすれば良いのかと思って調べてみました。

デフォルトで存在する`AppServiceProvider.php`を利用します。
`register()`の中に`bind`を書くだけ。
これで、`Aws\S3\S3Client`をタイプヒントすると勝手にbindしてくれます。

```
public function register()
{
    $this->app->bind('Aws\S3\S3Client', function ($app) {
        return new S3Client(config('services.s3'));
    });
}
```

## Collectionについて

LaravelのEloquent ORMを使ってDBから複数の値を取得すると、LaravelのCollectionクラスとして返ってきます。

その中の [keyBy](https://laravel.com/docs/5.2/collections#method-keyby) と [pluck](https://laravel.com/docs/5.2/collections#method-pluck) が便利でした。


`keyBy`は、指定したキーをキーにしたコレクションを返してくれます。
`id`をキーにしたいときとかに使っています。

`pluck`は、コレクションから指定した値だけを取得できます。

## まとめ

Laravelはドキュメントがしっかりしていて開発しやすいです。

なるべく早く5.3にアップデートしたいと思います。
文字のアウトライン化［Illustrator］

弊社システムでは画面や帳票の下地にPDFを利用しておりますが
編集や書き出しをする際、フォントの扱い等に困ることがあります

印刷業界などでは文字のアウトライン化は常識のようですが
昔知らずに苦労したので( ..)φメモ:pencil2:

##Illustratorで編集しようとすると『フォントが見つかりません』

自分のPCにそのフォントがインストールされているとは限りません
勝手に代替フォントに変換され表示されてしまいます:sweat_drops:

<img width="672" alt="Qiiita1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132485/55c5def1-ff46-6c52-e2d7-d65354c6e8d4.png">

左がPDF　右はIllustratorでPDFをそのまま読み込んだもの
なんかイロイロ違う・・・:sob:

#読み込む際に文字をアウトライン化

ベクターデータ、パスデータ化することで文字情報を保存します

##やり方

Illustrator CS6

・[ファイル]-[配置]で読み込みたいPDFを選択します
その際『リンク』を必ずチェック

<img width="613" alt="Qiiita2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132485/59fb6863-0e66-641f-1c5f-9a39d50c2885.png">

・［オブジェクト］-［透明部分を分割・統合］
その際『すべてのテキストをアウトラインに変換』にチェック

<img width="766" alt="Qiiita(透明部分を分割統合).PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132485/543ff6f5-d4d1-7995-c4ea-8664c155d4c4.png">

すると

同じ！！！:sparkles:

<img width="1263" alt="Qiiita(完成).PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132485/118d98b2-a934-c253-e821-45e829e73e8e.png">

これで安心して利用できます

#おわりに

文字をいったんアウトライン化してしまうと、文字の編集はできなくなってしまうため
元データの保存をおススメします

アウトライン化は結構便利で、あるフォントの文字をちょっと変形させて
オリジナルロゴなども作れちゃったりしますが
ライセンスなどにはご注意を
UE4で1日ゲームジャムたかし君

この記事はUnreal Engine 4 (UE4) Advent Calendar 2016
http://qiita.com/advent-calendar/2016/ue4
の21日目です。

本日は、1日のゲームジャムに参加するストーリーで、
1コントローラ2人プレイの簡単なゲームを1本作ってみる記事を書きました。

この2記事でたかし君と一緒に実装すれば、「たかし007」を作成できます。

http://wakanya.hatenablog.com/entry/Takashi007_1

http://wakanya.hatenablog.com/entry/Takashi007_2


(容量の関係ではてな記事です)

「たかし007」14:00バージョンのアプリケーションはこちらでダウンロードできます。(Win64bit版)
https://www.amazon.co.jp/clouddrive/share/CeyAsFQekvF1JkrMT7TEf5zKPPbZ2GJI8rTElwMJo30?ref_=cd_ph_share_link_copy

17:00バージョンの記事と成果物の予定は未定です！ごめんなさい！
よろしくおねがいいたします。

明日はyk3さんの
「シーケンサあたりで何か。」です。