OmniAICreator/Qiita-1.07M huggingface dataset:
GAEでメールを受信する

[Google Cloud Platform(2) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gcp2)の18日目の記事です。

使っていて便利だと思っているGAEのメール受信機能を紹介します。

# Receiving Email

https://cloud.google.com/appengine/docs/python/mail/receiving-mail-with-mail-api

この機能は、[任意の文字列]@*appid*.appspotmail.comにメールを送ることで、HTTPリクエストとしてメールをGAEで受けることができます

これでクレジットカード会社からの請求メールを受信して請求額などをDatastoreやBigQueryに入れたり、広告メールの中に自分が必要なキーワードがあれば通知するようにしています

# 使い方

GAE/Pyです

## メール受信を有効化

設定を`app.yaml`に追加します

```app.yaml
inbound_services:
- mail
```

## ルーティングの設定

通常のルーティングの設定と同じですが、`url`の部分が多少異なります

```app.yaml
- url: /_ah/mail/.+
  script: receive_email.app
  login: admin
```

この場合メールを全て`receive_email.py`で処理します

送信先ごとに処理内容を変える場合

```
- url: /_ah/mail/owner@.*your_app_id\.appspotmail\.com
  script: handle_owner.app
  login: admin
- url: /_ah/mail/support@.*your_app_id\.appspotmail\.com
  script: handle_support.app
  login: admin
- url: /_ah/mail/.+
  script: handle_catchall.app
  login: admin
```

## メールの受信処理

`InboundMailHandler`クラスを継承して`receive`メソッドをオーバーライドします

```python
# coding: utf-8

import logging

from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
import webapp2


class MailReceiveHandler(InboundMailHandler):
    def receive(self, mail_message):
        text_body = mail_message.bodies('text/plain')
        # text_body = mail_message.bodies('text/html') #HTMLメール

        for content_type, body in text_body:
            logging.info(body.decode())

        logging.info(mail_message.sender)

app = webapp2.WSGIApplication([
    MailReceiveHandler.mapping()
], debug=True)
```

その他以下のようなものが取得できます

- subject
- sender
- to
- cc
- date
- attachments
- original

# デバッグ

admin serverからメールを送信してローカルでデバッグすることができます

http://localhost:8000/mail

![receive_email.jpg](https://qiita-image-store.s3.amazonaws.com/0/9912/46408a67-b16f-85aa-ae20-ad8c5a719b16.jpeg)


以上、こんな感じに使って、こんなことをしているという紹介でした
テクスチャは .x と同じフォルダに置く(BVE5.6)

# 結論
BVE5.6 では .xファイルと**同じフォルダのテクスチャしか使えない**。（いずれ配るつもりの場合）

# どういうことか
たとえば次のようなファイル構成の場合
:open_file_folder: model
┣:frame_photo: ground1.png
┗:open_file_folder: \_box
　┣:page_facing_up: ground.x
　┣:frame_photo: ground2.png
　┗:open_file_folder: pic
　　┗:frame_photo: ground3.png
地面ストラクチャ ground.x のテクスチャとして ground1.png や ground3.png を指定すると、他のPCで真っ白になります。

|   |よい|ダメ|ダメ|ダメ|
|:-:|:-:|:-:|:-:|:-:|
|   |.mqoと同フォルダのpngを使う|.mqoと別のフォルダのpngを使う|.mqoからの相対パスに書き換える|BveTs.exeからの相対パスに書き換える|
|材質設定|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/20eae5b2-42c1-0b60-f4a8-835f7bab7c22.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/83720caa-796a-4629-a076-424888ad4867.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/589b0fa7-a1b2-2b5f-4217-2a72dd5e1fa5.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/267eb608-e394-a577-c762-fec8cb07acc5.png)|
|メタセコ|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/8f78d891-94b8-ad67-5396-43150d33c018.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/8f78d891-94b8-ad67-5396-43150d33c018.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/8f78d891-94b8-ad67-5396-43150d33c018.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/63dc05ad-fbdb-730b-e338-de54af4dce07.png)|
|.x|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/4bd99a5b-ab79-768a-4ead-0b4aa80e837f.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/3880482d-e560-a23a-6eb7-2fa7eafc7bb4.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/505f6b78-a562-1c96-dbe4-17adb2f5ea8b.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/f78271e5-1f6d-667a-d2f3-a06784b4d916.png)|
|自分のBVE|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/a7505a81-526f-ddea-6c8f-58f1f7384d3f.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/a7505a81-526f-ddea-6c8f-58f1f7384d3f.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/2e51a754-5d4c-d308-4154-8d413ee4afeb.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/a7505a81-526f-ddea-6c8f-58f1f7384d3f.png)|
|他人のBVE|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/a7505a81-526f-ddea-6c8f-58f1f7384d3f.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/2e51a754-5d4c-d308-4154-8d413ee4afeb.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/2e51a754-5d4c-d308-4154-8d413ee4afeb.png)|![image](https://qiita-image-store.s3.amazonaws.com/0/115416/2e51a754-5d4c-d308-4154-8d413ee4afeb.png)|

# 注意すべきは
メタセコイアの場合、最終的に書き出した .x と .png が同じフォルダに置かれようとも、**.mqo と .png が別フォルダ**であったり、**そもそも .mqo として一度も保存せずに作業**していたりすると、材質設定の「模様」が単なる `ファイル名.png` の形にならず、自分のBVEで白く表示されたり、他人のBVEでだけ白くなったりする誤動作の原因となります。

つまり必ず .mqo と .png と .x が同じフォルダになるよう作業し、材質設定に触る前に .mqo で保存していれば問題ありません。

***
この記事は BVE5.6 時点の情報です。
コメントは Qiita にログインするか https://twitter.com/p4ken へお願いします。
名古屋版IoTLTで思うこと…


名古屋のIoTLTの主催させていただいているわみと申します。

今回は、名古屋でのIoTLTを開催して思ったことをつらつら書いていこうとおもいます。
21日の広島の方のIoTLTを主催されている@m_ando_japanさんとネタかぶりしてますが、気にせず名古屋で気がついたことを書いていこうと思います。


# 会場選び

名古屋はなによりフリーで使える会場が少ないです。
東京と比べものにならないくらい本当にないですね。

名古屋版IoTLTでは、初回と二回目はcre8さんの会場を貸していただきました。（会場費一人当たり500円）40人キャパ
3回目4回目はshakeという大学のフリースペースを使い開催させていただきました。（会場費なし）50人程度キャパ
5回目はmisocaさんのオフィスでの開催となりました。（会場費なし）30人キャパ

今でこそ、misocaさんやshakeなどの会場費なしでやれるスペースが増えたものの初回のタイミングでは無く、私のような学生でつてが少ない人にはなかなかやりにくかったです。

勉強会としては、会場が有料であると一気に難易度が跳ね上がるような気がしているので…

# 登壇者が集まらない問題
名古屋でイベントを回していて、他のイベントを開催されている方と飲む機会があって話していたのですが、名古屋は特に登壇者が集まりません。

なので個人的にはやりたくないのですが、運営側から何名かに発表をお願いしたりしています。

勝手な私の思いなのですが、このIoTLTでは、様々なものごとを聞ける会にしていたいので、複数の登壇者の話が聞けるようにしたいと思っています。

というのも名古屋版IoTLT3回目の際に登壇者が普段7名程度なのが3名しか集まらず少々物足りない会となってしまった反省からでもあります。（3回目も盛り上がったので良かったのですが、様々なものごとが聞けるとより良かったなと…

# 懇親会の費用について

名古屋版のIoTLTではスポンサーなどサポートを受けていません。（気楽に回せますけどね

そのため懇親会の費用についてはどこからか捻出しないといけません。

そもそも懇親会が必要だと思うところですが、ワークショップのような会であれば適宜質問することが可能ですが、IoTLTでは質問は懇親会の際にという流れにしているためと、せっかく同じようなものごとに興味を持っているため相互交流のためにそういう場を持っています。

名古屋版IoTLTの懇親会はソフトドリンクとお菓子を提供しています。
以前アンケートを取った際にアルコールも飲みたいと言う声も頂いたのですが、必要な値段が上がる事と未成年の飲酒など問題が起こることを考えていまの形に落ち着いています。

ソフトドリンクとお菓子の費用については、懇親会のタイミングに一人当たり100円程度の募金という形で成り立っています。

それで回せているので、いつも募金していただいている方には感謝です。

#参加者について

名古屋のIoTLTですが、最近の会では30名程度の規模で開催しています。

名古屋で30人はそこそこの規模な気がしています。

嬉しい限りで、なんども参加されている方もいるのが嬉しい限りです。
会場の場所や開催日が平日や休日など別々であるため、新規参加者が10名程度毎回いらっしゃるので新しい風が入ってきていてすごく良い雰囲気が保てていると思います。

これも名古屋のIoTLTの特徴だと思うのですが、学生の参加者が半数程度いるので、新しい技術を試してみたなどの入門話などがきけるのが良いところだと思います。

#今後について

今のところ3か月に1度のペースにペースダウンしていますが、持続させていきたいと思っています。

これからを考えると名古屋の別の勉強会とのつながりをもっていこうと思っています。

#まとめ

名古屋の現状についていろいろ書いてみました。
とりとめのない感じになっていますが、興味を持って名古屋のIoTLTや他のIoTLTなどにぜひ参加してみてください！

もしよければ、名古屋で登壇してもらえたらうれしいですね！

[地方でLT主体の勉強会を数回やってみた所感と今後の取り組み](http://qiita.com/m_ando_japan/items/948fc32e53b37b3bd8cb)で話に出てきたこちら
>方法としては簡単で、複数拠点で同日・同時間帯で開催しお互いにリモートで接続します。その上でLTは両会場に中継する形とします。そうする事で、2拠点であれば2倍、3拠点であれば3倍のLT登壇者を確保する事が可能となります！！

これについては実現させてみたいものです！
AWS上のZabbixを、耐障害性を考慮した冗長構成としてどう組むか考えてみた

[Stylez Advent Calendar 2016](http://qiita.com/advent-calendar/2016/stylez)の23日目です。

以前、取引先の方と「Zabbix自体には冗長化の機能って無いよね。AWS上でZabbix構築する際、耐障害性を考慮した冗長構成のベストって何？」って話になり、色々議論したことがあったので、その内容をまとめました。

## __前提__

* AWS上で構築
* 負荷分散的な要素は考慮しない
* 監視サービスの継続性を重視


## __案１. クラスタウェア__

![zabbixha_clusterware.png](https://qiita-image-store.s3.amazonaws.com/0/87961/14f55aed-ee0f-1f0f-9513-ba94ef5c2923.png)

絵が雑ですいません。。。

ネットで探すと良く出てくるパターンでしょうか。
PacemakerとかDRBDでWebやDBのプロセス・データをサーバ間で監視・同期させて、障害が起きたら自動的に切り替える構成です。

オンプレ時代からの枯れた構成ですし、実績は今回紹介するパターンでは最も多そうな気がしますが、クラスタウェアの管理が運用上負担になりそうです。（個人的にトラウマ）

参考：[AWS上のZabbixをPacemaker（HeartbeatV2）で冗長化](https://www.infoscoop.org/blogjp/2014/10/03/aws%E4%B8%8A%E3%81%AEzabbix%E3%82%92pacemaker%EF%BC%88heartbeatv2%EF%BC%89%E3%81%A7%E5%86%97%E9%95%B7%E5%8C%96/)

## __案２. AutoScaling + RDS__

![zabbixha_autoscaling.png](https://qiita-image-store.s3.amazonaws.com/0/87961/afc3a074-d347-8b77-1239-801a95df24b0.png)

WebとDBを分離し、DBはRDSを利用。
WebはAutoScaling（上限下限：１）にして、インスタンスが死んだら自動的に再構築されるという構成です。
クラスタウェア構成と比較して、冗長部分はAWSにお任せするパターンです。

この構成は少しクセがあり、AutoScalingなのでインスタンス起動の度にIPアドレスが変わります。
従って、管理画面アクセス用と監視対象サーバからの通信（アクティブチェック）用の内部ELBを入れる必要があります。
また、Zabbixエージェント側の設定も工夫が必要で、ホスト自動登録設定を仕込んだ際に、内部ELBのIPアドレスでホスト登録されてしまうので、実サーバのIPを通知できるようにエージェント設定を変更する必要があります。

ここまでAutoScalingのクセに悩むのであれば、AutoRecoveryでも良いじゃんって話もありますが、AutoRecoveryだとAZをまたいで起動しないので、AZ障害を鑑みてAutoScalingを選んでいます。

クセをつかむまでは大変ですが、一度設定してしまえば、冗長部分の運用負荷は大きくないので、おすすめです。

## __案３. Zabbix製バックアップツール__

![zabbixha_buckuptool.png](https://qiita-image-store.s3.amazonaws.com/0/87961/98f51446-a792-fe4b-b9f4-f329bb9fba0c.png)

Zabbix公式で出ている __Zabbix設定バックアップ同期ツール__（以下、バックアップツール）というものがあります。
通常、エクスポート/インポート出来る設定項目は限られていて、アクションやユーザとか一部の項目はエクスポートできません。
もちろん、DBダンプすれば可能ですが、まるっとダンプすると監視データごとぶっこぬいてしまうので、監視設定のバックアップという意味合いでは難があります。
このツールを使えば、通常エクスポート出来ない部分含めた設定をファイルとして出したり入れたりすることが出来ます。

従って、このツールを双方のシングルZabbixに入れて、マスターからバックアップしたファイルをスレーブのZabbixに適用し続ければ、設定を同期することが可能になります。

この構成は文字通り設定だけ同期する事になるので、Active/Active構成で動くZabbixが出来上がります。
しかも、スレーブにバックアップ設定を適用する際、障害通知を無効にするオプションが指定できるので、双方のZabbixからアラートが飛ぶという事も回避できます。

問題点として、クラスタ構成と違ってマスター障害時はスレーブ側の障害通知を手動で有効にし、管理画面はスレーブ側を参照する必要があります。
あと、バックアップファイルをスレーブに転送する処理は、自分で作る必要があります。（rsyncするとか、共有ディレクトリに置くとか）
また、Active/Active故に、双方の監視データは異なる値が取れている可能性があります。運用する上ではこのあたり意識する必要がありそうです。

最後に、一番の問題は、このツール自体が、Zabbix社の技術サポート契約に加入する必要があるという事です。
という事で、お金かかります。

## __総括__

個人的にはクラスタの管理はしたくないので、案2か案3。構成のシンプルさを見れば、案3を推したいです。
最近では、Dockerとか今までの常識を覆すようなインフラも出てきて、こういった専用サーバがある前提でという考えも無くなってくるのかもしれません。
他にも良い案知ってる方がいれば教えてください。
How to bake a cake ?

こんにちは、Perl 6 Advent Calendar 2016の23日目の投稿になります。
今回は、`Inline::Perl5`でPerl 5の[`Acme::Cake`](http://search.cpan.org/dist/Acme-Cake/lib/Acme/Cake.pm)を呼び出してケーキを焼きたいと思います。

# イントロダクション

+ Perl 6に入る前に、そもそもPerl 5でケーキを焼きたかったらどうすれば良かったでしょうか。ちょっとケーキを焼いてみましょう

```pl:cake.pl
use Acme::Cake;

print Acme::Cake->bake();
```

```bash:ケーキを焼く
$ perl cake.pl > cake.jpg
```

+ はい、これで焼けました。`cake.jpg`の中身を確認してみましょう。（※ここでは画像は掲載しません）

+ では、Perl 6で同じようなスクリプトを書いてみましょう

```pl:cake.p6
use Acme::Cake:from<Perl5>;

print Acme::Cake.bake;
```

+ ケーキを焼いてみましょう

```bash:ケーキを焼く？
$ perl6 cake.p6 > cake.jpg
Cannot use a Buf as a string, but you called the Str method on it
  in block <unit> at cake.p6 line 3
```

+ あれ、うまく焼けませんね。では、どうやったらうまくケーキを焼けるでしょうか。

# ケーキの焼き方

+ 先に正解を言うと、`$*OUT.write`を使うとうまくケーキを焼くことができます

```pl:cake.p6
use Acme::Cake:from<Perl5>;

my $cake = Acme::Cake.bake;
$*OUT.write($cake);
```

```bash:ケーキを焼く
$ perl6 cake.p6 > cake.jpg
```

+ うまく焼けましたね。`cake.jpg`の中身を確認してみましょう。（※ここでは画像は掲載しません）

+ なぜうまく焼けたのでしょう。それを考えるために、下記のように`cake.p6`を書き換えて`$cake`の型を確認してみましょう。

```pl:cake.p6
use Acme::Cake:from<Perl5>;

my $cake = Acme::Cake.bake;
$cake.WHAT.say;
```

```bash:確認
$ perl6 cake.p6
(Buf)
```

+ これで`$cake`は`Buf`だと判明しました。(※1)
+ ここで、「`Buf` does `Blob`」ということで、`Buf`は`Blob`roleをミックスインしています。「`Blob`は`Binary Large OBject`」の略です。
+ つまり`$cake`というバイナリを書き込みたかったら、`Blob`を引数にとる`write`メソッドを使えばよいということがこれでわかるようになります。`print`は文字列を引数にとる(※2)のでこの場合不適です。

(※1) 気づいた方もいるかもしれませんが、実はイントロダクション内のエラーメッセージでも`Buf`だと書いてあります
(※2) "文字列"という表現はいくらか不正確なので、きちんと知りたい方はドキュメントを読むのをすすめます。

# 参考

+ https://docs.perl6.org/routine/write
+ https://docs.perl6.org/type/Blob
+ https://docs.perl6.org/type/Buf
+ https://docs.perl6.org/routine/print

以上、Perl 6 Advent Calendar 2016の23日目の投稿でした。
C言語のinlineにまつわる未規定動作で遊ぶ

# C言語のinlineにまつわる未規定動作で遊ぶ
環境

- gcc バージョン 6.2.1 20160830 (GCC) 
- clang version 3.9.0 (tags/RELEASE_390/final)

## n1570の6.7.4を精読すれば終わる話
パラグラフ7にこんなことが書いてある.

> Any function with internal linkage can be an inline function. For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition.

超訳すると,

- staticがついてる関数でinlineがついてるものはインライン関数
- staticがついてない関数で関数宣言にinlineがついてたら,同じファイルに定義がないといけない
- staticがついてない関数で関数宣言にinlineがついてて,externがなかったら,関数定義はインライン定義←重要
- インライン定義と外部定義は共存できる←超重要
- どっちを呼ぶかは未規定←これを試したい

***言っときますが,これは雰囲気をつかむためのもので,この和訳は正確ではありません.***

## 本題
皆さん,C言語を覚えたての頃にWikipediaでC言語を調べて,こんな記述に出会ったことがあるのではないでしょうか.

> ### C99
> 主な追加機能：
> - インライン関数（inline キーワード）

で,gccやclangでこんなコードを書いて試すんですね.

```c:main.c
#include <stdio.h>

inline int f(void) {return 42;}

int main(void) {printf("%d", f());
}
```

で,`gcc main.c`なんて書いてコンパイルすると,こんなエラーが出るわけです.

```
/tmp/cc341wl7.o: 関数 `main' 内:
main.c:(.text+0x5): `f' に対する定義されていない参照です
collect2: エラー: ld はステータス 1 で終了しました
```

頭脳は大人の小学生「あれれ～おかしいぞ～. fはmain.c中にちゃんと定義されてるよ～」
おっちゃん「フン,どうせ最適化がかかってないんだろ.ほらよ」

`gcc -O main.c`.無事コンパイルできました.
`./a.out`とやると無事42が出力されています.

オブジェクトファイル中にfに定義されてないということが問題なので,例えば,

```c:f.c
int f(void){return 0;}
```

と書いて,`gcc main.c f.c`としてコンパイルしましょう.
コンパイルが通ってa.outが出来ますが,これを実行すると0が出力されます.

これが,**どっちを呼ぶかは未規定**ということなんですね.
なので,あえてstatic宣言を付けずにインライン定義として関数を定義し,関数を呼び出すときは外部定義の関数を呼び出す,なんてことができるわけです.
まあ,あくまで未規定動作なので,用法,容量を守って正しく使いましょう.

因みに,こんな動作に惑わされたくない人は,関数定義にexternかstaticを明示しましょう.
externとして定義する場合は,外部に公開されるのを忘れずに.
Faker で猫いっぱいのデモサイトを作ろう

[EC-CUBE3 でテスト用のデータを生成する](http://qiita.com/nanasess/items/0cf09c668ba4e66dc421) というエントリを書きましたが、 EC-CUBE 3.0.13 より、画像のデータ生成にも対応しました。

### 下準備

EC-CUBE3 をインストールし、 `composer install` を実行してください.
([Composer](https://getcomposer.org/) がインストールされてない方はインストールしておいてください)

```
cd path/to/ec-cube
composer install
```

パッケージ版の場合は、 PHPUnit など必要なライブラリが含まれてないためで、 github から clone してきた場合は不要です。

### 使用方法

ファイルをダウンロードします

```
curl -Ss https://raw.githubusercontent.com/nanasess/ec-cube/fixture-generator/tests/Eccube/Tests/Fixture/GeneratorTest.php -o tests/Eccube/Tests/Fixture/GeneratorTest.php
```

PHPUnit を実行します

```
./vendor/bin/phpunit tests/Eccube/Tests/Fixture/GeneratorTest.php
```

こうすることで、こんな猫いっぱいのデモサイトができあがります。

<img width="1009" alt="screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/40662/289da10a-a833-4dd5-aaf6-6eb20b20a3b0.png">

猫がお嫌いな方は、 `tests/Eccube/Tests/Fixture/GeneratorTest.php` の 96行目付近、以下のコードを修正してください。

```php
// 第3引数の cats を他の単語に変更することで、別の画像を指定可能
// abstract, animals, business, cats, city, food, night, life, fashion, people, nature, sports, technics, transport が使えます。
$this->Products[] = $this->app['eccube.fixture.generator']->createProduct(null, 3, 'cats');
```

## fzaninotto/Faker について

このデータ生成には、 [fzaninotto/Faker](https://github.com/fzaninotto/Faker) というライブラリを使用しています。

会員のダミーデータを生成する場合などにも使用しており、人名や、住所は日本語にも対応しています。

```php
use Faker\Factory as Faker;

$faker = Faker\Factory::create('ja_JP'); // ロケールに日本語を指定

echo $faker->name;
// => '石田 和也';

echo $faker->kanaName;
// => 'イシダ カズヤ'

echo $faker->firstKanaNameMale;
// => "ヒデキ"

// html/upload/save_image 以下に 縦横480〜640px の猫の画像をランダムファイル名で生成
// 画像生成は http://lorempixel.com というサービスを使用しています。
$image = $faker->image(
    __DIR__.'/../../../../html/upload/save_image',
    $faker->numberBetween(480, 640),
    $faker->numberBetween(480, 640),
    $image_type, false);

// composer require fzaninotto/Faker dev-master とすれば、Faker::realText() で日本語の長文も扱えます。
echo $faker->realText($faker->numberBetween(20, 100));
// => カムパネルラが手をあげました。それから四、五人手をあげました。ジョバンニも手をあげようとして、急
// XXX 実際は単語が無作為に組み合わされるので、こんな綺麗な文章にはなりません...
```

詳しくは [fzaninotto/Faker の README](https://github.com/fzaninotto/Faker/#faker) をご覧ください。
Faker 自体は、 PHP5.3.3 以降で使用可能ですので、 EC-CUBE2系や、他のプロダクトにも使えます。
Processing.jsを使ってみる

大学のサークルで Processing の講習をやった後「部内で Processing の作品を見せあえるような場があればいいな・・・」と思ったのですが、そういったサイトは海外のサイトばかりというのが現状でして、ちょっとなぁ・・・と感じWEB上でProcessingを実行させることってできるのかと調べてみたところ、なんとまさに目的のものが見つかりました。

その名もprocessing.jsというjavascriptのライブラリです。 
ですが残念なことにどうやらprocessingのコードをcanvasに変えて出力するものみたいでcanvasにできないことはprocessing.jsを使ってもできないようです。

processing.jsはProcessing公式サイトよりダウンロードできます。
http://processingjs.org/download/


以下、jsファイルを読み込んでprocessingを実行するサンプルhtmlです。

```html:sample.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <script src="processing.min.js"></script>
    <script>
      var Pjs = new Array(1); // 拡張させて同一ページでの複数起動が可能なようにあえて配列にしました。
      function stop(num){ // 動作を止めるメソッド
        if (Pjs[num]) Pjs[num].exit();
      }
      function run(num){ // processingを動作させるメソッド
        stop(num);
        var canvas = document.getElementById('canvas'+String(num));
        var code = document.getElementsByName('source_code')[0].value;
        try{
          Pjs[num] = new Processing(canvas, code);
        }catch(e){
          alert(e);
        }
      }
    </script>
  </head>

  <body>
    <canvas id="canvas0" width="320px" height="320px"></canvas>
<textarea id="editor" rows=25 cols=80 name="source_code">
// ここにProcessingのソースコードを書く
void setup(){
  size(500,500);
  background(#ff00bb);
  frameRate(10);
}

void draw(){
  int l= random(10,100);
  int x=random(0,500);
  int y=random(0,500);
  int r=random(0,255);
  int g=random(0,255);
  int b=random(0,255);
  fill(r,g,b);
  stroke(r,g,b);
  ellipse(x,y,l,l);
}
</textarea><br>
    <button onclick="run(0)">Run</button>
    <button onclick="stop(0)">Stop</button>
  </body>
</html>
```

![processing_js.png](https://qiita-image-store.s3.amazonaws.com/0/155105/d8714cc1-02af-f49c-8535-4e235fbd2bcd.png)

これを使い、Processingの作品を投稿できる掲示板「Processing content」を作ってみました。もう普通の掲示板とまったく同じ要領で作れてしまいますね。
以下が Processing Contest の URL になります。
https://mighty-waters-75922.herokuapp.com/

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/155105/fc02aefe-cf04-7cc6-228a-f7f1494a0c36.png)

またこのサイトの改善点としては
1. 現在RDBMSにProcessingの長いコードをそのまま入れているという状態なので近いうちに改善させたいなぁと考えております。
2. いっぺんに Processing のプログラムを動かすと動作が重くなるので javascript 側で動かせる作品の個数を制限する。(これすぐできそうな感じが・・・)

やはり実力が足らないせいかいろいろなところでガバガバだなぁと感じますね・・・ 
これからも様々な技術を身に着けるなどして日々精進していきたいです。
TensorFlowを使って簡単な機械学習をしてみた話

チョと言います。
普段は主にCakePHP3を使ったWebアプリケーションの開発を行っています。

最近Pythonに興味があって個人的に触っています。

今回はTensorFlowを使って簡単な機械学習を作ってみた話を書きたいと思います。

## 対象者
・TensorFlowの初心者

## 環境
・macでdocker利用して開発を行います。

## TensorFlowの特徴
・データフローグラフを利用した表現力
・コード修正なしでCPU/GPUモードで動く
・アイデアテストからサービスまで利用できる
・ **Python** /C++を支援する

## 設置
### dockerのimageをとってcontainerを実行する
1. まず、dockerの環境から設置しましょう。
下記のURlを参考しながら、環境設定してください。
https://docs.docker.com/engine/installation/mac/#/docker-for-mac

2. 下記のコマンドを叩いてdocker imageからcontainer実行する
`docker run -it b.gcr.io/tensorflow/tensorflow-full`

3. 動作確認する

```
$ python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>>

```

ここまでするともう開発の環境設定ができました。

## 用語
環境設定ができたので、
TensorFlowで使う用語について覚えましょう。
### Operation
グラフ上のノードはOperation（op）と呼ばれます。
Operationは1つ以上のTensorを受け取れます。
Operationは計算を実行した結果を１つ以上のTensorとしてreturnします。

### Tensor
内部的にすべてのデータはTensorを通じて表現します。
Tensorは多次元配列のようなもので、グラフ内のOperationの間でTensorのみでやりとりします。

### Session
グラフを実行するためにはSession objectが必要です。
SessionはOperationの実行環境をカプセル化したものです。

### Variables
Variablesはグラフの実行したら、パラメーターを保存して更新するときに使います。
メモリ上でTensorを保存するbufferの役割です。

では、本客的にTensorFlowを使ってみましょう。

### 最急降下法で因子を探してみる
最急降下法の詳細は下記のURLを参考してください。
https://ja.wikipedia.org/wiki/%E6%9C%80%E6%80%A5%E9%99%8D%E4%B8%8B%E6%B3%95

加重値行列`W`とバイアス`b`

```
import tensorflow as tf
import numpy as np

# Numpy randomで 100個のデータを入れる.
x_data = np.float32(np.random.rand(2, 100))
# 学習目標は下記の計算式で算出. (W = [0.1, 0.2], b = 0.3)
y_data = np.dot([0.100, 0.200], x_data) + 0.300
```

入力したデータとW,bを利用してモデルを定義する

```
# bは 0,
b = tf.Variable(tf.zeros([1]))
# Wは 1x2 形のウエート変数 (均等random値で初期化)
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

# 損失関数定義
loss = tf.reduce_mean(tf.square(y - y_data))
# 最急降下法で損失関数を初期化(0.5は学習比率)
optimizer = tf.train.GradientDescentOptimizer(0.5)
# 学習Operation定義
train = optimizer.minimize(loss)
```

学習Session start

```
# すべての変数を初期化.
init = tf.initialize_all_variables()

# Session start
sess = tf.Session()
sess.run(init)

# 200回学習.
for step in xrange(0, 201):
    sess.run(train)
    if step % 20 == 0:
        print step, sess.run(W), sess.run(b)
```

結果

```
0 [[ 0.8228116   0.25179306]] [-0.21591029]
20 [[ 0.31065419  0.22789511]] [ 0.17903577]
40 [[ 0.15808699  0.20829338]] [ 0.26633102]
60 [[ 0.11601268  0.20247138]] [ 0.29062203]
80 [[ 0.10441278  0.20073807]] [ 0.2973859]
100 [[ 0.10121564  0.20022091]] [ 0.29927069]
120 [[ 0.10033476  0.20006624]] [ 0.29979634]
140 [[ 0.10009213  0.20001991]] [ 0.29994306]
160 [[ 0.10002533  0.20000601]] [ 0.29998407]
180 [[ 0.10000696  0.20000178]] [ 0.29999554]
200 [[ 0.10000192  0.20000054]] [ 0.29999873]    
```

## 感じたこと
・とりあえず、Pythonすげ、TensorFlowすげ。
・今回はExample課題としてあげていた問題を解けて見る中で数学をもっと勉強しないといけないと感じました。
・今回はPythonで機械学習を少し触ってみたので、他のところも触ってみたいと思います。
文系出身の2年目エンジニアが『情熱プログラマー』を読んで新人に伝えたいこと

# 始めに
現在、私は新卒2年目のエンジニアとして、IT系企業に勤めています。
先日、『情熱プログラマー』という有名な本を読んだのですが、技術の道で生きていこうという私にとって、
非常に参考になったのでまとめました。
(また、私と同じような新人エンジニアの方の役に少しでも立てれば、と思っています。)

![image](https://qiita-image-store.s3.amazonaws.com/0/105636/ebb0b60d-f226-d8e2-872b-e38cd586308b.png)

# 自己紹介
・某独立系IT企業の新卒2年目ITコンサルタント
・文系出身で学生時代のプログラミング経験なし
・仕事で使っている言語はRubyがメイン

#『情熱プログラマー』の内容
2010年に改訂版が出版された『情熱プログラマー』はプログラマー1人1人のキャリアの歩み方の指針となり、
どんなプログラマー人生を送ると充実感や幸福感を得ることが出来るかについて述べられています。
そのため、この本を読んでもコーディングスキルをはじめとする技術的な知識は殆ど身に付きません。
副題の通り、「ソフトウェア開発者の幸せな生き方」を示してくれる本となっています。
また、1つ1つの見出しが2~3ページなので、非常に読みやすいです。

# 心に残った点
## ①一に練習、二に練習
>これからも品質という基準で戦うつもりなら、実務で練習するという考え方は捨てなければならない。
自分の技術に対して時間を投資しなければ。

エンジニアの仕事は、特に新人の頃は、常に自分の未経験のことばかりだと思います。
実際、私もそうでした。
そのため、知識は仕事の中で学習していくものと思っていました。

しかし、本書では学習について上記のように述べられています。
初めて読んだ時の自分の技術への姿勢の甘さを痛感しました。
実務は常に本番であって、練習ではない。
仕事で「これは練習だから失敗して良い」なんてものは1つもない。
そんな当たり前の事を改めて認識させられました。
現在は業務の中で練習しようという発想を捨て、どのような練習が自分に必要なのかを見極め、
練習の時間を作るようにしています。

## ②できないことは「できない」とはっきり言う
>「できません」の乱発はいけない。
必ずしも出来るという確信はなくても、試しにやってみたいという意欲がある時は、その希望をそのまま伝えよう。
「簡単にはいかないと思いますが、とにかくやってみようと思います」というのも素晴らしい返事の1つだ。

社内には様々な仕事があり、新人と言えども色々な仕事が舞い込んできます。
勿論、自分の本来の業務が非常に忙しい時は、しっかり「出来ません」と伝えるべきです。
しかし、自分が経験したことがないことだから「出来ません」やスキルがないから「出来ません」は非常に勿体無いです。
特に新人の頃は出来ない事ばかりなので、このような「出来ません」連呼になってしまいがちです。

しかし、自分が興味あることならば、思い切って本書で述べられている上記の回答をすることを私もオススメします。
そうすることで例え、失敗しても何らかの新しいスキルが身に付きます。
自分のスキルセットが増えることは将来の自分の仕事の幅に繋がります。
私自身の話では、普段はRubyエンジニアですが、先輩の縁から社内のシステムロゴ作成の仕事を何件か請け負う中で、
Inkscapeというデザインソフトの基本的な使い方を習得しました。

## ③今の職務を全力で
>成功したいという日々の衝動を抑えるなんて、禁欲的で無理な目標だと思うかもしれない。
けれども、現実に焦点を合わせていれば、日々の仕事の小さな勝利・仕事がうまく出来たという実感・ビジネスの問題にエキスパートとして関与している実感を楽しむことが出来る。
逆説的だけど、成功への執着心を捨て去ることで成功する能力が強化されるんだ。

私は現場に慣れてくると、「この高難度の仕事を完了させれば、次のランクアップ評価への足しになる。」「この低難度の仕事は評価に繋がらない」といったことを考えるようになりました。
しかし、そんな雑念がある状態で仕事をしても良い仕事が出来るはずなく、成果物にムラが出来てしまいました。
そのため、本書にある「目の前の仕事に集中する」という当たり前のことを再認識し、実践するようになりました。
その結果、仕事を楽しんでいる実感がわき、また、「○○がランクアップしたらしい」といった周りの噂話に気を惑わされることなく仕事に集中することが出来るなど非常に良い方向に働きました。

評価を気にするなというのは(特に新人のうちは)社会人として難しい事かもしれません。
しかし、まず「目の前の仕事に全力を持って臨む」ということを心掛けてみることを新人の方々には伝えたいです。

# 最後に
本書の最後に書かれていることがエンジニア生活の全てを表しているのではないか、と2年目の若輩者ながら思っています。
(もし間違っている場合は、教えてください。)
>ソフトフェア開発はやりがいがあって、しかも報われる仕事だ。
芸術活動のようにクリエイティブでありながら、芸術とは違って、具体的で数量化出来る価値を生み出せる。
ソフトウェア開発は楽しい!
わたしとMilkcocoa

この記事は[Milkcocoa Advent Calendar 2016](http://qiita.com/advent-calendar/2016/milkcocoa)23日目の記事です。

24日に登録していますが、空いていたのでわたしとMilkcocoaについて書いてみます！
箸休め程度にお楽しみください＼(^o^)／

## Milkcocoaとの出会い
![スクリーンショット 2016-12-08 20.46.32.png](https://qiita-image-store.s3.amazonaws.com/0/119003/971eff1b-6508-5e90-4561-7d278f5a59dd.png "スクリーンショット 2016-12-08 20.46.32.png")
「よくわからないけど便利そうで名前がなんかかわいいイベント」に参加したことが出会いでした。
おじさん（男性登壇者限定）回だけあって、女性の参加者はなんと2人・・！

イベントにもあまり参加したことがない頃だったので、よく行ったなと今でも思います:joy::joy:
niconicocoaとか、オセロ2とか、面白いのに凄すぎワロタLTが多かった贅沢な会でした。

## 初めてのMilkcocoa
その後の打ち上げに参加したら、たまたま隣に座っていた主催の@n0bisukeさんから「LTやってよ！」と無茶振りされ、Milkcocoaで初めてのLTをすることになりました。

[Milkcocoa Girls ! Milkcocoa Meetup vol10](https://mlkcca.connpass.com/event/29628/)

ちなみに当時のスペックは

* プログラミング歴1年弱（PHPのみ）
* JavaScriptとJQueryって違うの？
* リアルタイム通信とは？

って感じでした。

## 作（りか）ったもの
「お誕生日に参加型で盛り上げられるもの」を作りたかったのです、当時の私は。
スマホのアクションを取得してリアルタイムでPC側で開いてるブラウザにイベントを起こせたら素敵やん・・！？と画策していました。

できたものがこちら。
![スクリーンショット 2016-12-20 22.01.52.png](https://qiita-image-store.s3.amazonaws.com/0/119003/b2adb585-906d-0c27-aacc-b35a200da1e4.png "スクリーンショット 2016-12-20 22.01.52.png")

スマホの座標を取るJavaScriptを仕込んだページをスマホで開いてシェイクすると、PCで開いているブラウザに紙吹雪が降ります。（真剣）

本当はスマホで参加している人とか取得して表示したかったし、固定イラストじゃなくて動的に写真を埋め込みたかったし、アイコンタップで顔面にケーキとか飛ばしたかったし、そもそもなんか座標ずれているし。
技術力と計画性のなさを発揮して、当時の私にはこれが限界でした(´；ω；｀)

JavaScriptにMilkcocoaの連携を仕込むのはめっちゃくっちゃ簡単だったのですが、無駄にCreateJSとかHTML5のcanvasとか使っちゃってそれはもうわけがわからず・・。
めちゃくちゃ苦しんだのも懐かしい思い出です。

ちなみに、のちにNode.jsの勉強会で全く同じものをNode.js+Socket.ioで作ろうとした時、更に難しくて泣きました。
BaaS偉大なり・・・。

## そして運営の道へ
そしてひょんなことから、Girlsなどのイベント運営を引き受けることになりました。

* [Milkcocoa Girls! Milkcocoa Meetup vol.11](https://mlkcca.connpass.com/event/31302/)
* [紅白Milkcocoa合戦！ Milkcocoa Meetup vol.12](https://mlkcca.connpass.com/event/34936/)
* [IoT初心者向けハンズオン！ Milkcocoa Meetup vol.13](https://mlkcca.connpass.com/event/40292/)

運営とは言ってもちょっとお手伝いしただけなのですが、MilkcocoaのヘビーユーザやSDK開発者、中の人などたくさんの人と繋がることができました。

登壇当日に「デモが動かん！」とか言ってたら周りの人たちが助けてくれたり。サービスの使い方がわからんと言ったら中の人から爆速でリプライが返ってきたり。（目撃談）
イベントも活発だし、飲み会も活発です。（笑）

Milkcocoa界隈の面々はとても暖かく、ユーザグループとして理想的な形なのではと思っています・・！

## 伝えたいこと
* サービスとしてよい
* サポートがやる気
* ユーザグループが最高

最初のハードルはめっちゃ低いのに、有用性が高くて今でもよく使います。導入のスピード感がすごい。
そしてサポートやユーザグループが活発なので、困ったことをつぶやいたりするとすぐに誰かが助けてくれます。

あと仲良くて楽しい。開発者や仲の人と近い。

**Milkcocoaはいいぞ。**
暇なCOBOLerは少しでも一般的なプログラミング言語に慣れるためにVBAを書こう！

世の中には暇なCOBOLerも存在するわけで、会社からはそこにいるだけでお金が入るからと、特に忙しくもなんともない現場に派遣され人生を飼い殺しにされることもあるでしょう。

派遣先としては予算を使い切らなければならないという事情があり、特に仕事がなくても人を買っておく必要があります。

しかし、派遣先部署の予算が減らされたりすると良いコミュニケーション関係を作れていなかったり、派遣先で所属したチームの派閥があまり強くなかったりである日突然「もうこなくていいよ」[^1]と肩たたきされることも珍しくありません。

仕事が無いので、その場にいるだけでバリバリ働いている人間と大きく差をつけられた状態になってしまったりするわけですが[^2]、そうなると、ある日突然肩たたきされたときに買い手が減ってしまい大変困った状況に陥ってしまいます。

そんな危険なシチュエーションを打破することが出来る（可能性を秘めた）VBAのお話です。

---

客先に常駐していると徹底したセキュリティ管理の名のもとに、インターネットもままならず、ソフトウェアのインストールには何重もの許可を得た上でやっとインストールが出来ますので、派遣されているエンジニアにはまずまっとうなプログラミング環境が無いのです。
（かろうじて、さくらエディタぐらいは使えるかもしれません。）

そんな厳しい環境の中でもグローバルスタンダードで大変に素晴らしいソフトウェア「Excel」というものがあるのですが、これはどんな端末にも標準でインストールされているのです。

__Excelバンザイ！__

Excelの何が素晴らしいかというと、標準で「VisualBasicForApplications」（略してVBA）というプログラミング言語とその開発環境が搭載されていることです。[^3]

> 単にプログラミング言語だけならば、インターネットに接続出来ないInternetExplorerでjavascriptを書くというのも有りなのですが、何分まともなエディタが存在しない環境ですのでオススメは出来ません。

VBAには丁寧に書かれたマニュアルも付属しているため、インターネットが無くても調べ物が出来るところも素敵です。

> COBOL（というかそれが動く汎用機）なんて、マニュアルを貸出希望して厳重な手続きを踏んでようやく借りることが出来たマニュアルに知りたいことが何も書いてないとかザラですからね。

COBOLでのプログラミングは、それはもう最近のプログラミング言語からはかけ離れたもので、いくら勉強しても何の役にも立ちません。[^4]

VBAならば、それなりに最近のプログラミング言語の体を成しているので、（DATA DIVISIONとか無いし、コードをコピペしたら行番号が全部崩れて発狂するようなことも無いよ、一行に80文字しか入らないなんて事もない！）脱COBOLERを目指すための一助になりやすい（かもしれない）です。

また、COBOLerならプログラムの出力結果を目視確認するという発狂しそうな手法でテストを行うわけですが、Excelでプログラムの出力結果のドキュメントを書いて（前例として、そういう慣習がないといけないのですが）、VBAにデータを渡して結果をチェックするようなテストツールも作れるわけです。

現場の人間がこういったツールを承認してくれそうな雰囲気なら、手がちょっと空いたので（明らかに暇なんですけど；）テストツール作りましたといって、殺伐として現場を和やかにできるかもしれませんし、そんな雰囲気がなくても自分でこっそり作って使って目視確認は大分適当にやってしまうなんていうことも出来るのです。

> 目視確認より、プログラムによるチェックのほうが間違いが起こらないのは言うまでもありませんよね？ね？？

VSAMデータセットからダンプされた文字列を眺めるだけの苦痛で発狂しそうな作業を、どれだけVBAに助けられたか分かりません。

VBAスキルが向上してくると、フローチャートもVBAで作っちゃうみたいなことも出来るようになるので（もちろんフローチャートをExcelで作る文化がある前提ですが）自動化楽しい！などとプログラミングの楽しみに触れつつ、こっそりスキルアップも出来てしまうのです。

素敵ですよね、もう一度言います。

__Excelバンザイ！__

そもそもCOBOLerがQiitaなんて読んでいるんだろうか？という疑問もありますが、VBAはあなたの成長に少なからず貢献できる素敵なツールです。

もし、転職を考えだした時に__なにもすることが無い中で、現状を改善していこうともがいていた姿勢__というのは大変に好印象となるものです。

VBA、是非使いこなしてやりましょう。

---

[^1]: 実際には、こういった話は営業などを通して行われます 
[^2]: こうなってしまうと業務知識すら身につきません、まさに人生の浪費です
[^3]: ExcelだけでなくAccessやWordでもVBAが使えたはずですが、私は使ったことがないのでExcelだけにとどめておきます
[^4]: 流石に何の役にも立たないは言い過ぎですけど、学習するコストに見合うものは無いですよ、ほんとに
何故 私がZabbixを使いだしたか

今回は技術的な事を抜きにして自称:一般事務職が
Zabbixを使いだした事をつらつらを書いてみたいと思います。

##いつ知ったのか
Zabbixを知ったのは4年前の [自宅ラック勉強会3 Zabbixで監視](http://togetter.com/li/287707) この時だったかと思います。
この時にOSSの監視ソフトが有る事を知った訳です。
話の内容からエンタープライズ向けと言う事でしたが
当時からお世話になってるフォロワーの皆さんが当たり前のように語っているので
自分も躊躇する事は有りませんでした。
（間違いなく、昔からネジが抜けた脳みそしてますね）


当時、自分が管理する環境はWindows Server 3台と3カ所の拠点と10台強のプリンタが有った訳ですが
Serverやルーター等の監視はpingの応答を自動で行うソフトを導入してその結果を目視で監視をする事が精いっぱいで
商用の監視ソフトも有る事を知っていましたが
イニシャルコストが自社で動く物理Server並の金額成る為、稟議を上げたりもしてましたが
承認が下りる事は有りませんでした。

又pingの応答だけで判る事は、機器の生死判定のみなので
実際には何が起きているのかサッパリ判らない状況の上
止まった機器が出て来てもアラートメールは送られて来ない為
**冬場の月曜日朝いちばんに「Serverが電源が入ったまま止まっいるので今すぐ来い（AM7:00に呼び出し）」とか**
**夏場の夜に「帰宅してる所を済まない、インターネットに繋がらなくて仕事が終わらないから来てくれ（PM9:30に呼び出し）」など**
と、何時呼び出しが掛るのか判らない気の休まらない時期が続いていました。

##Zabbixの事を知ってどう思ったか
「OSSなら自宅で入れて動くかどうか気兼ねなしに試せるよね。
　先ずは自宅環境に突っ込んでみて、合わなければ辞めたらいいや。」
こんな感じでした。

仮想環境やServerを構築したことが有ると言っても基本MS関係ばかりで
Linuxに関しては古いubuntuのデスクトップ版をインストールしたり、KNOPPIXをCDBootして喜ぶ程度で全く知識が有りませんでした。
（今もコマンドラインでマトモな作業は出来ないですけど・・・・）
そんな中、手探りで構築を始めだしました。

気軽に「やろう」と言っても、Hyper-V上の仮想環境に入れる訳ですから簡単にインストールが出来る訳もなく
（ 当時はCentOS6.3を使おうとした為Hyper-V用の仮想ドライバーがmergeしてない頃でNetwork周りが特に遅くて泣いたり、Hyper-V上のCent OSに統合ツール(Linux Integration Services)をインストールをしようとして、レガシーネットワークアダプタの設定を壊したり )
CentOSを無事インストール出来た後もZabbix2.0を入れるのに・・・
「my.cnf が間違ってDBがうごかない Zabbix Server が動かない（PHP が入っていなかった）」という感じで四苦八苦ばかりで
実際にZabbix（ServerとDBが自分自身を監視するまで）が動き出すように成るまで4か月掛りました。
そして「自宅全体の機器を監視する」と言う目標に辿り着くのは
[これを](http://www.slideshare.net/qryuu/22-zabbix) 何度も読んでもう一度、再構築してからでした。

自宅全体の機器を監視して、Zabbixが安定稼働する様になったかなと思った頃に
会社にもVHDを持ち込んで念願のZabbixによる社内監視を始める事が出来るよう成りました。
これが2013年の秋だったと覚えています。

当時は期限が有った訳でなし、是が比でも必要であるというプレッシャーが有った訳でも無いので
作っては失敗、動かしては失敗、飽きたら一休みと
悠長に動きだすまで、何度でも繰り返していました。
その間も「止めた、もう勘弁だ。」と言うのは不思議と思わなかったです。

##実際に使ってみると
**ヤヤコシイけど、かゆい所にまで手が届くようになった。**
ですね。

兎に角欲しかったNetworkとServerの情報が可視化されましたし
設定が拙くて多数のメールが飛び込んで来るにしても
問題があれば（会社から電話での連絡が来る前に）アラートメールが自分の手元に飛び込んで来るので
メールが届いた時点で状況の判断と対処を済ませ、連絡の電話が来た時点では事後の説明をして終わる様になりました。
又、1年経ち2年経ちして情報が蓄積されて来たら省力化の為の自動化も出来る様になりましたし
自動化が無理であっても計画的な予防措置が打てるようになりました。

社内的には矢面に出てアピールする物では無いですし理解され難い物ですが
これが無ければ自宅も会社も今や管理が出来ない手放せない物となりました。

##最後に
一般事務職がzabbixを使うに至った話を長々と書いてきましたが
使う様になったのも
・単なる生死監視では納得できなかった
・他の製品を知らなかった（手が出せなかった）
・時間の制限がなかった
からだと思います。

ここまでたどり着いた事、そして外部にZabbixの事を言える様に成ったもの、ひとえにコミュニティと様々な人の援助が有っての事でもあり、改めて「ありがとうございました」と言いたいです。

そして非技術の事ばかり書いてしまい、済みませんでした。

明日は24日目、九龍さんによる **ゼロから覚えるZabbix基礎** です。
宜しくお願いします。
Fessの検索ログをKibanaで可視化する

この記事は[Fess Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fess)の23日目の記事になります。
[←前の記事](http://qiita.com/chocomaro/private/d207e1127687fa0b1bda) [次の記事→](http://qiita.com/cookienote/items/03c7502e5dc553289614)

# 環境
Ubuntu 16.10
java version "1.8.0_111"
Fess 10.2.3
Elasticsearch 2.3.5
Kibana 4.5.4
Docker version 1.12.3, build 6b644ec

# 手順
楽なので、Docker Composeでの導入を行います。
まず、[以前に書いた記事](http://qiita.com/cookienote/items/c08205bf38629afd9cb8)を参考にして、Fessの公式リポジトリで公開されているCompose ファイルと設定ファイルをcloneしてきます。

```
$ git clone  --depth 1 git@github.com:codelibs/docker-fess.git
$ cd ./docker-fess/compose
$ ls
docker-compose.yml  elasticsearch  fess
```

次に、 `docker-compose.yml` を編集することで、同時にKibanaのコンテナを起動してElasticsearchと連携する設定を加えてみます。

```docker-compose.yml
version: '2'
services:
  fess:
    build: ./fess
    ports:
      - "8080:8080"
    depends_on:
      - elasticsearch
    environment:
      - ES_HTTP_URL=http://compose_elasticsearch_1:9200
      - ES_TRANSPORT_URL=compose_elasticsearch_1:9300
      - FESS_DICTIONARY_PATH=/usr/share/elasticsearch/config/
  elasticsearch:
    build: ./elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
  kibana:
    image: kibana:4.5.4
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_URL=http://compose_elasticsearch_1:9200
```

これで準備はできました。あとは起動して、[http://localhost:5601/](http://localhost:5601/)にアクセスしてみましょう。

```
$ docker-compose up -d
```

![Screenshot from 2016-12-02 18-43-34.png](https://qiita-image-store.s3.amazonaws.com/0/43662/ab72b04f-dfbf-fe25-6131-0383815f1af9.png)

無事起動できました！！Dockerによる環境構築は非常に簡単です。
また、Fessの検索ログをKibanaで可視化する上でExampleとして設定が公開されています。
[https://github.com/codelibs/fess/tree/master/src/main/assemblies/extension/kibana](https://github.com/codelibs/fess/tree/master/src/main/assemblies/extension/kibana)
READMEに沿って導入すると、以下のようにログの可視化が行えます。
![Screenshot from 2016-11-30 16-50-44.png](https://qiita-image-store.s3.amazonaws.com/0/43662/9c84b677-c9c5-5ea0-af75-b049d76c0294.png)
Jupyterでembulk configを作成して実行

多くのembulkの設定ファイル(以後embulk config)を動的に生成して、
かつそれを実行していきたいというケースがたまにあると思います。

embulkについては下記のページを参照いただければさいわいです。
http://qiita.com/hiroysato/items/397f36c4838a0a93e352
http://qiita.com/hiroysato/items/da45e52fb79c39547f69

Jupyterでembulk configファイルの生成と実行ができると
試行錯誤しながら進められて便利ですし、
embulk configの作成効率もあがると思います。

## embulk config作成
```py
    f=open('[file name]','w')
    setting = '''in:\n\
  type: gcs\n\
  bucket: xxxx\n\
  path_prefix: aaa/bbb/ccc_\n\
  auth_method: private_key\n\
  service_account_email: {{ env.SERVICE_ACCOUNT_EMAIL }}\n\
  p12_keyfile: ../key/{{ env.P12_FILENAME }}\n\
  application_name: zzz\n\
  tasks: 1\n\
  parser:\n\
    charset: UTF-8\n\
    newline: LF\n\
    header_line: true\n\
    type: csv \n\
    delimiter: \',\' \n\
    quote: \'\"\' \n\
    columns: \n\
    - {name: name, type: string}\n\
    - {name: title, type: string}\n\
    - {name: words, type: string}\n\
\n
out: \n\
  type: file \n\
  path_prefix: tmp \n\
  file_ext: txt \n\
  formatter: \n\
    type: csv \n\
    charset: UTF-8 \n\
    delimiter: \'\\\' \n\
    header_line: false \n\
    newline: LF'''

    f.write(setting)
    f.close()
```

特に変わったところがなくてすみませんが、
ファイルにembulk configの内容を書き込むだけです。
改行は「\n\」をくっつけていくと出力されたembulk configが見やすくなると思います。

## embulk実行
```py
  os.system('embulk run [file name]')
```
パスに気をつけながら、実行します。

## 利用ケース
移行したいテーブルが多い場合やデータの種類ごとにファイルを出し分けたい場合などに、
使っていくと便利です。
for文などを使って動的に多くのembulk configを作っていけるようになってくると
手動で１つ１つembulk configを作っていくのが面倒になってくるぐらいです。

### 例
1〜5のカテゴリの掛け合わせに応じて、ファイルを生成して実行

```py
for a in [1, 2, 3, 4, 5]:
  for b in [1, 2, 3, 4, 5]:
    filename = a + '-' + b '_xxx.yml.liquid'
    f.open(filename,'w')
    setting = '''in:\n\
      [embulk setting]
    '''
    f.write(setting)
    f.close()
    os.system('embulk run ' + filename)
```

## 最後に
embulkのin,out,filterなどを別途文字列で持っておき、
それを組み合わせる形でembulk configを生成していくともっと便利になっていきます。

Jupyterのファイルは
[runipy](https://github.com/paulgb/runipy)
を使ってバッチ実行もできますので、
試行錯誤の末に完成した処理を定期実行させるのも容易でした。

今回記載した内容はJupyterでなくてもできるばかりだと思いますが、
直近Jupyterからembulk configを生成と実行し、
関連する他の処理もJupyterで操作したら、楽でしたので
ここに挙げさせていただきました。
Vim 8.0 Advent Calendar 23 日目 雑多な変更

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

今回は、今までの変更に収まらなかった細かい変更点について見ていきます。

## GTK+ 3

GUI として、GTK+ 3 に対応しました。GTK+ 2 と同じように使えます。

## +num64

Vim script の整数の型が 64 bit になりました。
利用可能な環境であれば 64 bit になることになっていますが、基本的には一般的なほぼ全ての環境では利用可能かと思います。
`has('num64')` を使うことで、64 bit が有効かどうかを判定できます。

```vim
if has('num64')
  echo 1000000000000000000
  " => 1000000000000000000
endif
```

これにより、32 bit による桁溢れなどを利用している一部のプラグインがうまく動作しなくなる可能性があります。

## ユーザー定義コマンドでの新しい置き換えテキスト `<mods>`

Vim の Ex コマンドの中には、他の Ex コマンドに前置することで他のコマンドを修飾するものがあります。`:aboveleft` や `:hide` などがそうで、これらはコマンド修飾子と呼ばれます。
これまでは、ユーザー定義コマンドに対してコマンド修飾子が指定されても、その存在を知ることはできませんでした。そこで追加されたのが `<mods>` です。

以下のように `<mods>` を使うことで、指定された修飾コマンドの存在を知ることができます。

```vim
command! ShowMods echo split(<q-mods>)

ShowMods
" => []
aboveleft ShowMods
" => ['aboveleft']
hide leftabove ShowMods
" => ['aboveleft', 'hide']
```

指定された順序に関係なく、決められた順序で `<mods>` に入ります。対応しているコマンド修飾子は以下です。

- `:aboveleft` `:leftabove`
  - どちらも同じ意味のコマンドで、どちらが指定されても `aboveleft` が得られます。
- `:belowright` `:rightbelow`
  - どちらも同じ意味のコマンドで、どちらが指定されても `belowright` が得られます。
- `:botright`
- `:browse`
- `:confirm`
- `:hide`
- `:keepalt`
- `:keepjumps`
- `:keepmarks`
- `:keeppatterns`
- `:lockmarks`
- `:noswapfile`
- `:silent`
- `:tab`
- `:topleft`
- `:verbose`
- `:vertical`

また、以下のコマンド修飾子には対応していません。

## 型チェックの廃止

以前のバージョンの Vim では、変数に対して、元から入っている値の型に暗黙に変換不可能な型の値を代入しようとすると、エラーになっていました。

```vim
" Vim 7.4.1546 より前
let var = 10
let var = []
" => E706: 変数の型が一致しません: var
```

これは元々意図的にチェックが行われエラーになっていたのですが、静的型付き言語ならともかく、動的型付き言語である Vim script でこれを行ってもわずらわしいだけであったため、このチェックはなくなりました。

```vim
" Vim 7.4.1546 以降
let var = 10
let var = []
" => エラーなし
```

## `printf('%s')` が全ての型を受け入れる

`printf()` 関数のフォーマット文字列である `%s` は、文字列を表示します。以前のバージョンの Vim では、文字列に暗黙に変換できない値を渡すとエラーになっていました。

```vim
" Vim 7.4.2220 より前
echo printf('%s', [1, 2, 3])
" => E730: リスト型を文字列として扱っています
```

しかしこれはあまり便利ではないため、文字列型でない場合は `string()` 関数を適用した結果が使用されるように変更されました。

```vim
" Vim 7.4.2220 以降
echo printf('%s', [1, 2, 3])
" => [1, 2, 3]
```

## 辞書のキーに空文字列を使える

以前のバージョンの Vim では、辞書のキーに空文字列が使えませんでした。

```vim
" Vim 7.4.1707 より前
echo {'': 10}
" => E713: 辞書型に空のキーを使うことはできません
```

しかし、空文字列を許可しない積極的な理由はなく、空文字列が使えた方が便利であるため、キーに空文字列が使えるようになりました。

```vim
" Vim 7.4.1707 以降
echo {'': 10}
" => {'': 10}
```

## 正規表現 `\%C`

新しく追加された正規表現のアトム `\%C` を使うと、合成文字をスキップすることができます。

```vim
let s = 'e' . nr2char(0x301)
echo s
" => é
echo s =~# 'e'
" => 0
echo s =~# 'e\%C'
" => 1
```

## ハイライトグループ `EndOfBuffer`

新しく追加されたハイライトグループ `EndOfBuffer` は、ファイルの末尾以降に表示される `~` の文字がある行の部分のハイライトになります。標準では `NonText` と同じようにハイライトされます。
例えば以下のように背景色と前景色を同じにすることで、ファイル末尾以降を塗り潰す、といったことができます。

```vim
highlight EndOfBuffer ctermfg=DarkGray ctermbg=DarkGray guifg=DarkGray guibg=DarkGray
```

## サポートが終了した環境

以下の環境や機能は、使っている人がほぼいない、大きくなった Vim が動作するのにそぐわないなどの理由により、Vim のコードを綺麗に保つためにサポートが終了しました。

- MS-DOS
- Windows 95 とそれ以前の Windows (16bit の Windows を含む)
- OS/2
- SNiFF+

これらの環境や機能で Vim が使いたい場合は、古い Vim を使う必要があります。
非デザイナーが教える、それっぽくデザインするためのコツ

おはよう、こんにちは、こんばんは。
いつ見てるかわからないから、挨拶全部。

というわけでございまして、アドベントカレンダー何日目？
まぁいいか。

今回はデザインのお話。
エンジニアの方が自分だけで何かを作るときに一番つまづくのはデザインじゃない？
そこで、非デザイナーのぼくが**「それっぽい」**デザインにするために実践している事を伝授してみる。

#コンセプトをシンプルに決める
コンセプトメイキング、これ大事。
**ここさえ決まればそれっぽいデザインが80%できたと言っても良い。**
いや、それは言い過ぎか。

コンセプトメイキングと言っても単純で、**どんなものにするかのイメージを固めるだけ。**
そう言われると簡単そう、日本語ってすごい。

#優秀なツールを駆使する
デザイナーの人たちもやっていることだけど、ツールに頼ることもすごく大事。
デザイナーさんはPhotoshopとIllustlatorを使っている人が多いと思うけど、非デザイナーが使うべきツールはこれ一択だと思うのがこちら。

##Sketch
<img width="901" alt="スクリーンショット 2016-12-21 17.00.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/51623/9e17a697-a572-79e0-72a2-07a659f165d3.png">
[Sketch](https://www.sketchapp.com/)
この神ツールは最強にして最高、**Mac限定だけど。**
よくぞここに気を使ってくれました…！っていう気分になること間違いなしで、初期からテンプレートも充実している。
そして書き出し機能なんかも超親切、まぁ詳しくは語らないけど。
💲99だけどマジでお値段以上。
迷うくらいなら買っとけ泥棒！

ちょうど良いところにこんな記事があったので貼っちゃう、もう貼っちゃう。
[初心者向け：これからSketchを使いたい人や既に使っている人のおさらいに！ Sketchの使い方のまとめ | Sketch Advent Calendar 2016](http://tipsbear.com/sketch/)

#テンプレートに頼る
これはちょっとチートじみてるけど、有用な方法の一つ。
そのまま使いすぎちゃうとどこかで見た事あるアプリになりがち、だけどコンセプトなんかを決めておけば、多少似ているかもしれないけどちょっと個性の入ったものを作れるはず！

##Sketchテンプレートならここ！
そんなテンプレートはフリーで結構転がってるけど、**Sketchのテンプレートを探すなら**ここのサイトがオススメ！
[SketchAppSoures](https://www.sketchappsources.com/)
センスの良い海外デザイナーがアップしてくれているぞ！

#オマージュする
パクリじゃないよ、オマージュだよ？
最後になったけど、最終的にここが一番重要かもしれない。
やはり**流行ったものがユーザーにとって一番見慣れている**わけで、そこはオマージュしたほうが賢い。
寄せすぎるとただのパクリなので、自分の気に入った部分などを取り入れていっちゃいまっしょい！

#デザインって大変だよね。
本当、一人でアプリデザインしてみてわかりました。
デザイナーの皆様、いつもお疲れ様です。
こういう他業種の経験って一度しとくと結構良い経験なので、特に興味がなくてもやってみると良いと思う。

敬具

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 山下 房之介
Googleカレンダーから祝日を取得する「google_holiday_calendar」

祝日ということでGoogleの祝日カレンダーにアクセスするためのgemです

* https://github.com/sue445/google_holiday_calendar
* https://rubygems.org/gems/google_holiday_calendar

# 準備
API実行のためのトークンが必要なので下記を参考に取得

[Google Calendar API を使って祝日を取る PHP編 - Qiita](http://qiita.com/Chrowa3/items/93c55d83b972d0ddfa10)

```
gem install google_holiday_calendar
```

# 使い方
```ruby
require "google_holiday_calendar"

japan_calendar = GoogleHolidayCalendar::Calendar.new(country: "japanese", lang: "ja", api_key: "XXXXXXXXXXXXXXXXXXX")

# holidaysで任意の期間の祝日を取得
japan_calendar.holidays(start_date: "2017-01-01", end_date: "2017-03-01", limit: 5)
#=> {Sun, 01 Jan 2017=>"元日", Mon, 02 Jan 2017=>"元日 振替休日", Mon, 09 Jan 2017=>"成人の日", Sat, 11 Feb 2017=>"建国記念の日"}

# holiday?で祝日かどうか判定
japan_calendar.holiday?("2017-01-01")
#=> true
japan_calendar.holiday?("2017-02-01")
#=> false
```

# 仕様
* Google Calendarの仕様上、古すぎる日付やあまりにも未来の日付は取得できません
* APIのトークン取得が面倒な場合は https://github.com/holiday-jp/holiday_jp-ruby を使うのが一番お手軽だと思います :sweat_smile:
String文字列の検索条件の正規表現の＊に改行が含まれるケースの置換

データをXMLで持っている時にDOMなどのXML Objectに読ませないでデータを消したい場合によくStringでの置換が使われていた。
その時の話である。

消したいタグを以下のように置換していた。

```java:
	String xmlStringData = getXMLfile();
	xmlStringData = xmlStringData.replaceAll("<ABB000001.*?</ABB00001>", "");
```

消えないということがあった。調査を進めるうちにタグ間のデータが文字列であり正規表現の"*"に想定する箇所に改行データが入る場合があったからだ。

この場合PatternのDOTALLモードを使っって処理をした。

```java:
import java.util.regex.Pattern;

	String xmlStringData = getXMLfile();
	xmlStringData = Pattern.compile("<ABB000001.*?</ABB00001>", Pattern.DOTALL).matcher(xmlStringData).replaceAll("");
```

無事置換できタグを削除できた。
SpineのIKを使ってプロ生ちゃんに動いてもらう

#はじめに
このエントリーは プロ生ちゃん Advent Calendar 2016 の第23日目の記事です。
http://qiita.com/advent-calendar/2016/pronama-chan

参加を始めて早くも3年が経過してしまいました…。早すぎ(;´∀｀)
今年もめげずにSpine関連です。

#今回したいこと
IK(インバースキネマティクス)とやらを使ってプロ生ちゃんに動いてもらおうと思います。
これを使えば接地面に対してのアニメーション作成が楽になる、はずですｗ
画像多用で説明少々なところはご了承下さい=3

#下準備
今回はこちらの絵を使用させて頂きます。
![000.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/62de4b1a-0edb-2a28-1430-25f993e17d93.png)

これをSpineで読み込んでボーン作成して…まではいつもの通り。
Spineでは1つのIKに対して2つのボーンまで設定できますので、脚はふとももとスネのボーンを対象にします。
画像スロットでMeshを作成して2つのボーンをバインドしておきます。
![0035.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/d5c80fe4-6030-fae5-1bd4-5c3157717802.png)

#IKを設定してみる
ふとももとスネのボーンを選択した状態で新規→IKコンストレイントを選択します。
![0055.png](https://qiita-image-store.s3.amazonaws.com/0/56177/2ff8aa3f-6d48-72f8-1e44-9b81a0051fe2.png)

すると、どこにIKを設定するか問われますので、かかとあたりに設定します。
![00555.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/52c446ce-eee0-3b9e-df01-35de20945a76.png)

これでIKを設定できたので、いざこの赤い丸を上に動かしてみます。。。
すると…
![0055555.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/fd67e0d8-b147-8943-e0b7-eefc80e561d9.png)

曲がる方向が違う！！(;´∀｀)
この曲がる方向の設定は作成したIKを選択した時に表示される「曲げ」の部分で設定できます。
こちらにチェックを入れると、
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/6e90aab2-28c8-da6a-54e9-38ac6944c4f5.png)

期待する方向に曲がってくれました。ホッ(＊´∀｀)=3
![00555552.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/3cdfa9fb-0100-2e75-0d56-7ac8c9685da4.png)

以上で無事IKを設定することができました！
これまではアニメーション作成時、ボーン一つ一つを微調整しながら動かしてましたので、
複数ボーンが連動して動いてくれるのは非常に助かります。

#おまけ①
靴のボーンに下記のようにIKを設定すると、身体を上に持ち上げた時につま先をだらーんと(？)動かす事ができます。
使いどころは…背中にロケット積んで浮かぶ時とかロボットがジャンプする時とか…かな？ｗ
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/1041bfac-0be3-bca8-34ef-612f281d9bc5.png)
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/d3180fe3-a02f-fcbb-4afb-1bd554e03a1e.png)

#おまけ②
足首あたりのウエイトを調整する事で自然な動きを表現することができます。
向かって左が調整済み。右が未調整。
<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">IKで画像を動かす際に足首周辺のウエイトを調整する事で自然な足首の曲がりを表現できる。向かって左が調整済み。右が未調整。 <a href="https://t.co/1Amv5MkJ6Y">pic.twitter.com/1Amv5MkJ6Y</a></p>&mdash; まぼろしのおに (@Mavoroshi_Oni) <a href="https://twitter.com/Mavoroshi_Oni/status/810897285303377922">2016年12月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#おわりに
本当はUnityに取り込んで段差でちゃんとIKが働くところまで確認したかったのですが、
力及ばずで確認できていません。※誰か教えて下さい…

Spine Runtimeの「5 Basic Platformer」を参考に今後も精進致します。

↓立ち絵
![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/093b97f9-ff97-766b-e747-995473b1d983.png)

↓段差あり
![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/56177/072f81b3-01d8-3bd2-40ba-f609762af9b9.png)

最後まで読んでいただき、ありがとうございました！
違うRailsアプリに同じふるまいを導入できるRails Engineのご紹介

# これ何?
rails engineって言う仕組みの紹介と、それが便利に働くだろう場面、導入に際して私がハマったRails Engineの拡張方法について記載します。
※Rails Engineの作り方などは[Rails GuideのRails エンジン入門](http://railsguides.jp/engines.html)の方が詳しいので、そちらをどうぞ。
ただ、今回は私が使ったのがmountable engineであるためとくにmountable engineについて記載します。

# Rails Engineのご紹介
Rails Engineは[Rails GuideのRails エンジン入門](http://railsguides.jp/engines.html)にも書いてあるように
機能的にはRaileアプリケーションとほぼ同等のものです。

modelも定義できますし、controller, helper, viewも通常のRailsアプリケーションでできることは一通りできると思って
問題ないです。
細かい機能はあまり、追っていないのですが、私が使ってきた場面では少なくとも通所のRailsアプリケーションと同様のことができてきました。

ただ、1点違うのがRails Engineは他のRailsアプリケーションにimport(Rails engine的な言葉を使うとmount)して使うことができるのです。
有名所としては[Active admin](https://github.com/activeadmin/activeadmin)ではないでしょうか？


# Rails Engineが便利に働く場面
Rails Engineが便利に働く場面は結構限定されています。が、ピッタリハマれば結構生産性高く使うことができると思います。
私が思うRails Engineが便利に働くのは以下の2点が満たされたときだと思います。

- 同じふるまいを複数のサービスで実装する必要がある
- 複数のサービスはどれもRailsで記述されている

(ちなみに私は逆に上記の2点をうまく満たすために使えそうな手段はなんだろなとか、検討した際にちょうどピッタリ現れたので使ってみました。)


# Rails Engineをうまく拡張するには?
Raile Engineを使って機能を作成したとしても、各アプリケーションで違うところがどうしても出てきてしまいます。
そういうときは、 `engine.rb` に以下のような記載をしておくと、`app/decorator`にdecoratorを定義するとそちらを読み取って、拡張してくすることが可能です。
私が使ったのはcontrollerでの拡張だったので、controllerの拡張方法を書いていきます。

## Raile Engine側での設定例


```rb
module YourEngine
  class Engine < ::Rails::Engine
    isolate_namespace YourEngine

    config.to_prepare do
	  # この部分が大事。この部分を書くことで *_decorator*.rb というファイル形式のファイルが
	  # mount先のRailsアプリケーションに有った場合は、そのファイルに記載してある内容で、
	  # rails engineを拡張できる
      Dir.glob(Rails.root + "app/decorators/**/*_decorator*.rb").each do |c|
        require_dependency(c)
      end
    end

  end
end
```

## Rails Engine側でのクラス定義例

```rb
module YourEngine
  class YourController < ApplicationController

    private

    def hoge_method
      raise 'hoge_methodを実装してね' # ここでmount先のappliction独自の処理を書かないと行けない箇所を吸収する
    end

  end
end
```

## mount 先のRails Engineの拡張方法

拡張する際には通常のclass拡張で拡張していきます。
例えば、以下のような形です。

```rb
YourEngine::YourController.class_eval do
  include  YourEngineConcern # 例えばこんな形でConcernを使うこともできます。

  private

  def hoge_method
    hoge
  end

end
```


# その他雑感
Raile Engineの情報を集めるに当たって、以下のサイトを良く見ていました。

- [Rails GuideのRails エンジン入門](http://railsguides.jp/engines.html)
- [Mountable Engine だらけの Rails アプリ開発](http://blog.onk.ninja/2014/12/02/mountable_engine)

ただ、単純な導入方法や使い方などは書いてあったのですが、それらを拡張する方法などはあまり、日本語のサイトには見当たらなかったです。
一方で、英語のサイトにはその辺りの情報がstack overflowに記載されてあり、とても参考になりました。
英語大事っすね。

# 終わりに
さて、どうでしたでしょうか。
私もこの3ヶ月くらいではじめてガッツリRails Engine触ったのですが結構良いなという印象です。また、Railsは拡張性高くて、優秀だわと思う日々です。また、価値あるプロダクトを最速で開発するためには、色々な新しいことを試し続けていく必要があるんだなと思った最近でもあります。
この記事を元に、おんなじ振る舞いを違うRailsアプリに導入したいんだけど、どうしたらいいんだーと言う人の一助になれば幸いです。

freeeではこのように新しいことを試す必要がある開発で溢れています。[いろんな課題をEngineer力で解決したい腕力系のエンジニアを大募集](https://jobs.freee.co.jp/)しています。

次はfreeeには社会的に生きるために入社したと言っている『30歳 無職 エンジニア』で検索1位の @hiraguri です。
人間の根源的な欲求を満たすためにエンジニアなった @hiraguri さんの記事、楽しみです。
CouchbaseServerを導入して1年の経過

本記事は[アイスタイルAdvent Calendar 2016](http://qiita.com/advent-calendar/2016/istyle)の23日目の記事です。
去年もCouchbaseネタを書いたインフラエンジニアが1年ぶりに経過を書こうと思います。


去年のネタはこちら

* [Couchbaseの導入検討（前編）](http://qiita.com/imaiy/items/8e01f380c53ce2eda1da)
* [Couchbaseの導入検討（後編）](http://qiita.com/imaiy/items/991bed93573cb0993ec3)

# 昨年からの推移

もともとデータのキャッシュに対するリテラシーは低かったので、
まずは利用しよう！というフェーズからのスタートです。

予想通り、まずは取っ付き易いMemcachedバケットが多く利用されました。

* WebサーバにMemcachedが載っている状況は新たに作り出したくない。
* ある程度はノウハウがあって手っ取り早くMemcachedバケット使った。

完全にオンプレ環境なのでいちからサーバ構築することもなく、2分でMemcached環境作れるのは手軽。。。！
新たに開発されるWebサービスがたまたま多かったというのも追い風でした。
その中で一部Couchbaseバケット及びNiQLの利用案件が出たことは喜ばしいですね。

# 現在のCouchbaseクラスタ

ざっくりと現在のCouchbaseの状況を晒しておきましょう。


| 項目 | 現状 |
|:----------------:|:----------:|
| Couchbaseバケット | 10バケット |
| Memcachedバケット | 15バケット |
| 総Item数          | 70万Item  |
| ピーク時処理量 | 5000 Ops/sec  |
| メモリ利用状況 | Used 2GB / Allocate 16.5GB / Total 120GB |
| ディスク利用状況 | Used 1.3GB / Free 2.5TB |
| Index総数 | 10 |

導入してくれるサービスが増えることで、徐々にコネクション数も増えてきました。
どこまで耐えられるのかなぁ～。。。

![Couch_Connections.png](https://qiita-image-store.s3.amazonaws.com/0/100270/44972474-c9a5-2483-04c9-54c6f45f9681.png)


新たにリリースしたサービスが主な利用ドコロですが、
割とコアなところにも使って頂けたりしていて、思ったより秒間の処理数は多い印象でした。
NiQLのQuery/secはまだ少ないですがこれから増えていってくれるといいなーと思います
が、CPU食い過ぎるクエリにならないことを切に祈ります。
（DBもCPUがボトルネックでいっぱいいっぱいなのに。。。汗

# Couchbaseを導入してみて

## 良かったこと

1. データキャッシュ環境を気軽に利用できるようになった。
1. キャッシュ利用しよう！という意識が徐々に芽生えてきた。
1. とりあえずDBに問い合わせる、
1. NoSQLの先駆け！（世間的には結構今更感あるけど。。。

## 今後の課題

1. セッション情報など気軽に載せられる物がメインで、処理軽減などを目的とした利用意識がまだ薄い。
1. 全く問題起きなくてインフラ的なノウハウがあんまり溜まっていない。
1. GUI便利だけどCLI側の知識詰めるようにちょっと勉強しないといけない。
1. 監視どこまでやろうか悩む。。。

## 発生した問題

1. Memcachedバケットの挙動が、本家Memcachedと異なる点がちょくちょくある。  
STATSの情報や、TELNETしてGET/SET出来なかったり。。。
1. クライアントライブラリのバージョンが上がって、突如挙動が変わるという事件が発生。
1. 用途ごとにバケットが量産されていく。そしてMAX Bucketをあっさり突破する。
    * 用途別にキーを切り分けるとかでも良かったのでは。。。？でも検索速度に影響もしそう。

# 総評

* クラスタ自体は思った以上に安定して動作している。
  * 逆に何もなくて怖い。ノウハウたまらない。
* Memcachedバケットは「ある程度」互換性がある。
  * 弊社では本家Memcachedでできることを再現するためにツール作ってくれているらしい。。。
* 来年はもうちょっとNoSQLとかデータのキャッシュとか進められたらいいなー。
* 応答速度の改善引き続き頑張っていきたい。