OmniAICreator/Qiita-1.07M huggingface dataset:
Grailsを触ってみる

# 今日の目標
Grailsを触ってみる

# 使うもの
* [GGTS 3.6.4.RELEASE](http://spring.io/tools/ggts)
* grails-2.4.4
* Windows 8.1

# 参考
* [初心者のためのGroovy/Grails入門](http://libro.tuyano.com/index2?id=1291003)

# Grailsとは
> Grails （グレイルズ）は、プログラミング言語 Groovy を使用するオープンソースのWebアプリケーションフレームワーク。Grails や Groovy はJavaプラットフォーム上で動作する。「設定より規約 (convention over configuration)」というパラダイムにより高い生産性を実現し、スタンドアロンの開発環境を提供しつつ、開発者からはその設定の詳細を隠蔽している。

新しい言語だと思ってました。フレームワークなんですね、初めて知った。設定より規約というのはRubyでも聞いたような。

# ではスタート

## 準備
せっかくなので統合IDEをインストールして使おうと思います。
しかし、なんでSpringのサイトなんだろう？（家のネットワーク環境が悪すぎてGGTSインストールに3時間かかったという…フレッ●光とは）
![grails1.png](https://qiita-image-store.s3.amazonaws.com/0/97937/def5b922-7ad4-a873-dd26-5f5a4d954c04.png)

ダウンロードしたら任意の場所に展開します。そして、内包されている`ggts-bundle\ggts-3.6.4.RELEASE\GGTS.exe`を実行！（GGTSはEclipseチックとのことですが、フォルダの構成見ると、確かにEclipseのフォルダ構成と似てる気がします）
起動後はこんな感じ。Eclipseだ！
![grails2.png](https://qiita-image-store.s3.amazonaws.com/0/97937/2ecfc7e3-013a-27cb-b231-e0609a1e0f74.png)

とりあえず真っ先に文字コードをUTF-8にして、JREを確認しました。Eclipseと設定の仕方が同じなのでなじみやすいです。

## Grailsプロジェクトを作ってみる
まずはプロジェクト作んなきゃね！ということで、新規作成で`Grails Project`を選びます。
![grails3.png](https://qiita-image-store.s3.amazonaws.com/0/97937/ba12bfd5-e787-c0e0-bdef-8d01c2552205.png)

プロジェクト名を付けて`Finish`すると、勝手にMavenが動いてくれるみたいです（compile --non-interactive --refresh-dependencies）。実行環境のモジュール（Tomcatとか）も落としてくれるみたいなので、実行が楽そうです。

`Grails Project`は`grails create-app 【アプリケーション名】`を実行したのと同じ見たいです。必要なものはすでに用意してくれてます。
![grails5.png](https://qiita-image-store.s3.amazonaws.com/0/97937/16c6dceb-900a-1068-027f-11248ed55a5a.png)

各フォルダの意味は参考サイトに上げさせていただいた`初心者のためのGroovy/Grails入門`の[Grailsアプリケーションの構成を理解する](http://libro.tuyano.com/index3?id=1306003)を見てみてください。

## Controllerを作る
次はControllerを作ります。MVCのCさんですね。`New->Controller`で作成。
![grails6.png](https://qiita-image-store.s3.amazonaws.com/0/97937/45adbd80-9445-42f1-3bfd-803a4604ca28.png)

`Finish`すると2つのクラスができます。何だろうと思ったら、HelloCotrollerSpec.groovyのほうはテストクラスなんですね。よくよく見れば、確かにtest/unitの下にありました。

* HelloController.groovy
* HelloControllerSpec.groovy

試しにHelloController.groovyのほうにHelloを書く。

```HelloController.groovy
package hellograils

class HelloController {

    def index() {
		def name = "torinist"
		render "<html><body><h1>Hello, " + name + "</h1><p>Welcome to Grails!</p></body></html>";
	}
}
```

## 実行
作ったので実行します。renderは引数で渡したものをレスポンスとして返すみたいです。レスポンスとして渡す形式は変えられるみたいですね。指定した形式に変換してくれる、ってことかな。今回は単純な文字列として返してますが、文字列は文字列でもHTMLが入っているのでブラウザでレンダリングして表示されるはず。（[grails->render](https://grails.github.io/grails-doc/3.0.x/ref/Controllers/render.html)）

ということで実行します。
Window->Show View->Serversを選ぶと、すでに一つサーバが見えます（Pivotal tc Serverうんたらかんたら）。こいつにプロジェクトを実行してもらいましょう。
サーバを右クリックして、`Add and Remove`で作ったプロジェクトを右側に移動させて、`OK`。また右クリックして`Start`を選択。ステータスが`Started`になったら動作したので、ブラウザで閲覧。
アクセスは以下の通りにします。
【サーバ名】:【ポート】/【プロジェクト名】/【Controller名】/【メソッド名】

例：

* サーバ名：localhost
* ポート：8080（もともと入っているのはTomcatみたいなので8080でアクセスできます）
* プロジェクト名：そのまま
* Controller名：先頭を小文字にして、`Controller`を省いた文字列になります
* メソッド名：index


![grails9.png](https://qiita-image-store.s3.amazonaws.com/0/97937/139c5a5c-285d-0a48-4149-7da0509354a6.png)

Grails面白い。
AngularJSで、ブラウザのJavascriptエラーをサーバーに送る

### クライアントのエラーをキャッチする

この記事を読みました。

[ WEBブラウザで起きた JavaScript のエラーをサーバに送りたい](http://bps-tomoya.hateblo.jp/entry/2015/12/04/133423)

素晴らしいアイデアですが、AngularJSでは、`window.onerror`が発火しないため、通常のやり方が通用しません、とのこと。
そのため、`$exceptionHandler`という、例外を集約しているサービスをオーバーライドする必要があります。

以下のように書けば問題ないかと思われます。

```js:app.js

angular.module('myApp')
.factory('$exceptionHandler', function($injector) {
  return function errorCatcherHandler(exception) {
    // オーバーライドしたためブラウザにエラー出力しないので、ここからブラウザにエラー出力する
    console.error(exception.stack);

    // Circular dependencyを防ぐため、ここで使用サービス(Restangular)をインジェクトする
    var Restangular = $injector.get('Restangular');

    // 送信するメッセージ
    var errorMessage = {
      browserType: navigator.userAgent,
      error: exception.stack
    };
    // 送信先を指定
    var sendMessage = Restangular.all('where/to/go');

    // 送信
    sendMessage.post(errorMessage);
  };
})

...

```

コメントにも既に書いてありますが、ポイントとしては2点あります。

#### 1.console.error()を必ずサービス内に入れること
書かないと、ブラウザでエラーが発生しても、ブラウザのコンソールに何も吐かなくなります。

#### 2.$injectorで使用するサービスをインジェクトすること
通常であれば、
`.factory('$exceptionHandler', function($injector, Restangular) {...`
みたいな書き方で注入すると思いますが、これだと一部のサービスでCircular dependency(循環依存関係)としてエラーになってしまいます。
`$exceptionHandler`に`$rootScope`を注入しようとしてるんだけど、`$rootScope`自体が`$exceptionHandler`を注入してて、ぐるぐる回ってなんじゃらほい、ということですね。
そのため、`$injector`を使用して、サービスが呼び出された際に、使用するサービスをインジェクトするのがよろしいかと。


サーバーに送ったエラーは、Slackに送るなり、担当者を叱るのに使ったり、ご自由に...
メールの絡む開発にはmailtrapがおすすめ

テスト開発をしている中でテストしにくいものの中にメール送信があります。

テストデータの中に間違って本番ユーザのメールアドレスがあった場合には、取り返しのつかない事故が発生してしまう可能性もあります。

そんな危険を回避しつつテストしやすくしてくれるのがmailtrapというWebサービスです。

https://mailtrap.io

実際にどんなことができるかというとSMTPでメールを送信しても実際の宛先には飛ばさず、WebサイトやAPIから確認することができるというサービスです。
Laravelの初期.env.localにも記載されているのでLaravelユーザにはお馴染みなのかもしれませんね。

それでは使ってみましょう。

## ユーザ登録

  Webサービスですのでまずはユーザ登録です。

![サインイン](https://qiita-image-store.s3.amazonaws.com/0/32386/7b2eee0c-02ed-d178-bde2-1ae29e266755.png)

メールアドレスとパスワードだけという必要最低限の情報ですので安心ですね。

サインインが終わると確認用のメールが飛んできますのでリンクをクリックしたら登録完了です。

## 設定

ログインすると以下のような画面になります。

![エントランス画面](https://qiita-image-store.s3.amazonaws.com/0/32386/c82a2d1b-c55e-9dd4-ad88-10eadb43050a.png)

Inboxes一覧が表示されますが無料プラン場合、Inboxesの上限は1つになります。
個人の開発テスト用ぐらいなら受信して確認後、すぐに破棄すると思いますので特に問題にならないと思います。（僕はなっていません）

## プログラム側の準備

Inboxesのなかから既に作成されているDemo InboxをクリックするとInboxの詳細が表示されます。

![inbox.png](https://qiita-image-store.s3.amazonaws.com/0/32386/b8e2b02a-325c-3cc6-1d0e-529487c3f4e9.png)

SMTPのHOSTやAUTHのログインID、パスワードなどの情報が表示されますのでプログラム側でconfig等に記述しましょう。

各言語のフレームワークを使っている場合は、Integrationsのプルダウンから使用しているフレームワークを選択するとconfigの記述が表示されます。
ラインナップは充実しているのでよほどニッチなものじゃなければ存在すると思います。

選択後、configにコピペしてください。

## 送信された内容の確認

設定が完了したら送信してみましょう。

送信先アドレスには送信されず、mailtrap上で内容が確認できます。

![mail.png](https://qiita-image-store.s3.amazonaws.com/0/32386/8b610dd6-e4db-a555-df16-10bec2e304c2.png)

添付ファイルやhtmlメールも確認できるのでとても便利です。

## 終わりに

Webサービスの使用が禁止されているなどmailtrapが使えない場合にはmailcatcherというものがあります。
こちらもお勧めです。

http://mailcatcher.me/

メールはユーザ登録完了や購入完了など上手く作らないとテストがしにくいのに、クリティカルな部分に含まれるケースが多くあります。
配信事故なども防げますしぜひ活用してみてください。
Pythonのitertoolsは知ってるとちょっと便利

Pythonにはitertoolsというモジュールがあります。その名の通り、イテレータのユーティリティで、知ってるとちょっと便利な時があります。
そこで適当に使えそうなものを個人的なコード例とともにメモしておきます。Pythonは2.7です。
大体内包表記で等価な書き方ができるので、コードが簡潔になりそうなものだけまとめてみました。
（もっと簡潔に書けるものもあるかもしれません。もしあったらこっそり教えて下さい。）

# 複数のイテレータをまとめる

（実は今回chainを使ってみてちょっと便利だったのでこのメモを作りました）

```py
from itertools import chain

# 例: a, bの各要素のfugaプロパティの和を取りたい

# itertools不使用
hoge = sum(x.fuga for y in (a, b) for x in y)

# 使用
hoge = sum(x.fuga for x in chain(a, b))
```

# ありうる組み合わせを網羅

```py
from itertools import combinations

# 例: 配列aの中の異なる2要素をほげほげしたい
# 同様に、異なるn要素をほげほげしたい時にも使える。

# 不使用
for i in xrange(len(a)):
    for j in xrange(i + 1, len(a)):
        hoge(a[i], a[j])

# 使用（i < jは保証されている）
for i, j in combinations(xrange(len(a)), 2):
    hoge(a[i], a[j])

# あるいは
for a1, a2 in combinations(a, 2):
    hoge(a1, a2)
``` 

itertoolsを使うのがよいかネストさせるのがよいかは迷うところです。
個人的にはネストが3重以上になりそうなら確実にitertoolsを使うと思います。

別の種類の添字を組み合わせたいなら`product`が使えます。例えば`hoge(a[i], b[j])`したければ

```py
for i, j in product(xrange(len(a)), xrange(len(b))):
    hoge(a[i], b[j])

# もしくは
for ea, eb in product(a, b):
    hoge(ea, eb)
```

とします。
`hoge(i, j)`と`hoge(j, i)`を区別するなら`permutations`で。
`hoge(i, i)`もカウントするなら`product(xrange(len(a)), repeat=2)`もしくは`product(a, repeat=2)`でよいみたいです。


個人的にこういう複数のリストを舐めるコードを書かなきゃいけない時が多いので役に立ちそうです。

# 同じクラスをひとまとめ

```py
from itertools import groupby

# 例: 同じ値を持つdict aのキーを表示

# 不使用
tmp = {}
for k, v in a.items():
    if v in tmp:
        tmp[v].append(k)
    else:
        tmp[v] = [k]

for k, v in tmp.items():
    print "[%s] has value %s" % (' ,'.join(v), k)

# 使用
f = lambda k:a[k]
keys = sorted(a.keys(), key=f)
for k, v in groupby(keys, f):
    print "[%s] has value %s" % (' ,'.join(v), k)
```

一旦sortしないといけません。
あと`list(groupby(hoge))`は無理です。

# その他

## あるイテレータを無限に繰り返し

`repeat`です。`zip`とかと組み合わせるとうれしいかも。
【iOS】色を気にしたい初心者のためのUIColor大攻略法


#ターゲット
1. UIColorで定義済みの色って~~ダサい~~使いづらいと思っている初心者
2. UIColorのRGB値を指定するのが面倒orどうしていいかわからない初心者
3. 「カラーコードでUIColorのRGB値を指定できたらいいのに」と思っていた初心者

……というわけで、初心者の初心者による初心者のためのUIColor攻略を始めます。

#1. UIColorを**マウス**でラクラク指定しよう！
手っ取り早く指定したいならこれです。
面倒くさがりな人にはコレだ！

##用意するもの
- Xcode
- Xcode用プラグイン「[ColorSense](https://github.com/omz/ColorSense-for-Xcode)」
※こちらはObjective-Cでしかプラグインが動きません。

##使ってみる
（１） プラグインはインストールしてください。

「ColorSense」は、UIColorのRGB値をMacでよく見る↓で指定できるようにする素晴らしいプラグインです。
![cap01new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/ac41c2a5-7305-85d6-b5e1-ea95a17f1cda.png)


（２） とりあえず適当にUIColorのredColorとでも書きましょう。
![cap02new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/28f9b4f5-89ad-0340-3da0-34906eb6b9d1.png)

（３） もしかすると、書いている最中に見えたかもしれませんが、「ColorSense」がインストールされると、
![cap03new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/4b10e428-7963-5233-adb6-52bbc28327d6.png)

タブでUIColorで指定した色をプレビューしてくれます。

（４） さらにタブをクリックすると、

![cap04new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/0971538a-5f2d-ebb8-f956-ae132b36abd8.png)

(5)あとはマウスで好きな色を指定しましょう。
![cap05new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/c3d273e4-1242-da16-4c4d-82b2d81af59e.png)






#2. UIColorを**カラーコード**でラクラク指定しよう！
「カラーコードで色を指定するなんて造作もない」という人はこちら。
カラーコードというのは、`#ff0000`みたいなRGB値をそれぞれ16進数で表したものです。

##用意するもの
- Xcode
- Xcode用プラグイン「[IntelliPaste](https://github.com/RobertGummesson/IntelliPaste-for-XCode)」
※このプラグインはObjective-CでもSwiftでも動きます。


##使ってみる
（１） プラグインをインストールします。

「IntelliPaste」は、ペースト機能をいい感じにしてくれるプラグインです。
その中に、コピーしたカラーコードをUIColorメソッドに変換してペーストしてくれる機能があります。
GitHubの「IntelliPaste」のページにデモのgifアニメがあるので、そちらを見ていただければ、どんな感じなのかわかると思います。


（２） カラーコードと変数宣言を書きましょう。今回は`#00ada9`とでもしましょう。
![cap06new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/f4675abb-860f-7390-18cb-c66440d1a1ae.png)

（３） カラーコードをコピーします。
![cap07new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/94fb650d-08ea-b316-9cd5-ed49d73c867f.png)

（４） ペーストしたい場所へ`Command` + `Shift` + `V`でペーストすると、
![cap08new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/85c16b97-d3ce-ee4f-89bc-d04e66ab95ef.png)


Objective-Cで、かつ前項で紹介した「ColorSense」がインストール済みなら、ペーストした途端に「ColorSense」のプレビュー機能が働きますので、思った通りの色だったかどうか、すぐに確認できます。
![cap09new.png](https://qiita-image-store.s3.amazonaws.com/0/102673/d224255a-521a-01a1-0c1f-ed0a4fbfd724.png)



HTMLやCSSが書けて、カラーコードに見慣れている人は、「オレンジなら`#ff9900`かな★」と瞬時に思いつくことができると思うので、これもまぁまぁ便利かと思います。
自分はお気に入りの色のカラーコードを覚えているため、このプラグイン凄く重宝します。


#あとがき
定義済みの色だけでは物足りなかった自分の備忘録を兼ねた記事で恐縮ですが、誰かの役に立つでしょうか。
「大攻略法」とか大きく打って出ましたが、たいしたこと書けなくてすみません。
ご指摘など大募集中です。

#参考
[Xcode の便利プラグインまとめ](http://qiita.com/usagimaru/items/59745e26584a00ddfba3)
[原色大辞典](http://www.colordic.org/)
immutable-js の Seq は本当に lazy か

# TL;DR
* ドキュメント上、 immutable-js の Seq は lazy とされているけれど、それってミスリーディングなのではなかろうか？
    * https://facebook.github.io/immutable-js/docs/#/Seq
* lazy という表現から期待すること
    1. 変数の値や関数の結果が、実際にアクセスされるまで評価されない
    2. 一度アクセスされた後は評価値がキャッシュされ、二回目以降のアクセスでは再評価が発生しない
* immutable-js の Seq は上記の 1 しか満たしていない
    * それって lazy というより単に都度計算しているだけでは？
    * とはいえ、評価値のキャッシュすると、多くの場合パフォーマンスはむしろ低下しそうなので、挙動として悪いわけではないと思う
    * 毎回評価しなおしちゃうよ、ということを分かりやすいところに書いておいて欲しい

# Seq の挙動の確認
1. ブラウザの開発者ツールを開き、コンソールに [immutable-js のコード](https://raw.githubusercontent.com/facebook/immutable-js/master/dist/immutable.min.js) を張り付ける
2. コンソールで下記を実行して出力を確認する

```js
var mappedSeq = Immutable.Seq([0,1,2]).map(function(num){console.log('map called'); return num * 2;});
mappedSeq.get(0); // logs 'map called'
mappedSeq.get(0); // logs 'map called' again!
```

# Seq の挙動の評価
実は以前、上に記載した lazy から期待する 2 つの仕様を満たした配列を、 JavaScript で実装するというのを試したことがあります。

* http://qiita.com/kimamula/items/393ce924acd5f0839876
  * 配列を lazy にすることのメリットもこの記事で触れているので、興味のある方は読んでいただければ。

このとき、パフォーマンスの計測もしたのですが、結果としては、ほとんどのケースでは他の実装 (native な Array を含め) と比較したパフォーマンス上のメリットはなさそう、というものでした。
これは、評価値をキャッシュするために余計なオブジェクト、関数を生成する必要があるため、 map や filter といった処理を大量に実行したり、値へのアクセスを何度も繰り返すようなことをしない限り、コストに見合うメリットを得られないためと考えられます。
(もちろん、単に私の実装がイケてないだけな可能性もありますが。。。)

上記の経験から、 immutable-js の Seq が評価値をキャッシュしない挙動になっていることは、正しい決断だと思っています。
ただ、この挙動で lazy と言ってしまうのはミスリーディングだと思うので、分かりやすいところに説明が欲しいです。
([一応ある](https://facebook.github.io/immutable-js/docs/#/Seq/cacheResult)けどそんなに目立たない)
実際、再評価なんてされないと思い込んでいた人いませんか？いますよね？きっといるはず。

# なお、評価値をキャッシュする実装も検討されている模様

issue に上がっています。

* https://github.com/facebook/immutable-js/issues/263
十周くらい遅い、進捗どうですか。



```perl:test.pl
use strict;
use warnings;
use utf8 ;
binmode(STDOUT, ":utf8");
local $" = '' ;

my @words = qw( 進捗 どう です か ) ;
my @cache = ('')x4;
while ( 1 ){
    print my $str = $words[ int rand @words ]  ;
    push @cache, $str ;
    last if "@words" eq "@cache[-4,-3,-2,-1]"  ;
}
printf "???\n%d文字で煽られました\n", length "@cache" ;
```


```
進捗かかです進捗どうかですかかですかどうどうかですどう進捗ですかです進捗ですです進捗かかかどうですですですどうです進捗進捗どうですか???
66文字で煽られました
```

##### 独り言

編集リクエストへの感謝の表明とかって、どーすればいいんでしょう、、、
言わば私信だから、コメント欄に`@ID`で書くのも変だし、、、
Zabbix イベント履歴情報の一括エクスポート

この記事は Zabbix Advent Calendar 2015 の18日目の記事です。
今回は小技的なものを紹介したいと思います。

***
Zabbixで発生したイベント履歴情報は、GUIからCSV形式でエクスポートできますが、件数が多いと複数ページに分かれてしまい何回もクリックするはめになり面倒なものです。またバッチ的に定期的に自動出力したいと思いスクリプトを作成しました。

※MySQL用です

```bash
#!/bin/bash
#################
USER='zabbix'
PASS='your_password'
DBNAME='zabbix'
STIME=`date +%s -d '30 days ago'`
ETIME=`date +%s`
#################

BASEPATH=$(cd $(dirname $0); pwd)
MY_COMM="mysql --user ${USER} --password=${PASS} ${DBNAME}"
TARGET_FILE="${BASEPATH}/zabbix_events_`date +%Y%m%d_%H-%M-%S`.csv"
TABLE_FILE="/tmp/zabbix_events.$$"

echo "\"時間\",\"ホスト\",\"説明\",\"ステータス\",\"深刻度\"" > ${TARGET_FILE}

${MY_COMM}<< EOF 
SELECT
  from_unixtime(e.clock, "%Y/%m/%d %H:%i:%s"),
  h.host,
  t.description,
  CASE
    WHEN e.value = '0' THEN '正常'
    WHEN e.value = '1' THEN '障害'
  END "status",
  CASE 
    WHEN t.priority LIKE '0' THEN '未分類'
    WHEN t.priority LIKE '1' THEN '情報'
    WHEN t.priority LIKE '2' THEN '警告'
    WHEN t.priority LIKE '3' THEN '軽度の障害'
    WHEN t.priority LIKE '4' THEN '重度の障害'
    WHEN t.priority LIKE '5' THEN '致命的な障害'
  END "priority"
FROM events e
  inner join triggers t
  inner join functions f
  inner join items i
  inner join hosts h
  ON e.objectid=t.triggerid AND t.triggerid=f.triggerid AND f.itemid=i.itemid AND i.hostid=h.hostid
WHERE e.source='0' AND e.clock BETWEEN "${STIME}" AND "${ETIME}"
ORDER BY e.clock ASC
into outfile "${TABLE_FILE}" 
character set utf8 
fields terminated by ','
OPTIONALLY ENCLOSED BY '"'; 
exit
EOF

cat "${TABLE_FILE}" >> ${TARGET_FILE}
rm -f ${TABLE_FILE}
exit

````
尚、トリガー名に含まれるマクロの展開はしていません。

***
次はqryuuさんです。
よろしくお願いします。
cssで縦書き、横書きの要素内中央寄せ

#縦書きの文字を画面中央寄せ

##まず横書きの文字を画面の中央寄せにするパターン

###共通html,css
```html:html
<div class="outer">
  <div class="inner">
    hogehoge<br>fugafuga
  </div>
</div>
```

```css:css
.outer{
  position:relative;
  width:100%;
  height:100%;
}
```

###パターン1（innerの高さが決まっている場合）
```css:css1
.inner{
  width:300px;
  height:300px;
  position:absolute;
  top:50%;
  left:50%;
  margin-left:150px;
  margin-top:-150px;
  /* margin-left:-50%;としたいけど、marginが%を参照するときは包含ブロック（自分を囲っている要素の横幅を基準に計算する） */
  /* 仮にouterのwidth:100%;が1000pxの値だとすると.innerのmargin-left:-50%;は-500pxになってしまう */
}
```
<br>

```css:css2
.inner{
  width:300px;
  height:300px;
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  left:0;
  margin:auto;
}
```
これは解説が面倒（よくわかってない）ので[position: absolute; の指定で要素が上下左右中央配置になる理由](https://hyper-text.org/archives/2014/08/position_absolute_center_layout.shtml)を見て下さい。
よしこさんのスライドもわかりやすいです。[スライド抜粋](http://yoshiko-pg.github.io/slides/20151215-scripty/#24)


###パターン2（innerが可変する場合）
```css:css1
.inner{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%, -50%);
  /* marginで%を指定すると包含ブロックを基準に考えるがtranslateは自分自身を基準に考えてくれるので-50%でも問題ない */
}
```

ちなみにdivタグをもう一つ増やして、tableとtable-cellを使ってvertical-align:middle;を使用する方法もありますが割愛しました。


##やっとこさ縦書きの中央寄せに
ちなみに縦書きにするときは

```css:css
.inner{
  writing-mode: vertical-rl;
}
```
を指定しましょう。

さて縦書きの中央寄せなのですが、上記のパターンの１つを使うと可能です。

```css:css1
.inner{
  position:absolute;
  top:50%;
  left:50%;
  display:inline;
  transform:translate(-50%, -50%);
  /* marginで%を指定すると包含ブロックを基準に考えるがtranslateは自分自身を基準に考えてくれるので-50%でも問題ない */
}
```

transformを利用した中央寄せにdisplay:inline;を指定しました。
こうすることで中のdiv.innerは可変長になり、その大きさを基準に中央に配置されます。
つまり縦書きでも中央寄せできるというわけです。
結構無理矢理感ありますが、jsのライブラリを使ったりするよりもいいと思ってます。

ちなみにdiv.innerがdisplay:block;だと縦書きにした瞬間に右寄せしかできなくなります。


誰かの助けになれば！
MVVMっぽい構成のデモアプリを公開してみる

こんなエセMVVMになるつもりじゃなかったんです・・

# 作ったデモアプリと概要

[SwiftQiitaClient](https://github.com/hachinobu/SwiftQiitaClient)

![Simulator Screen Shot 2015.12.17 22.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/27785/aaf9ced3-1677-df38-28e1-c9c2bbec91b1.png)


簡単なQiitaクライアントです。
APIから最新の投稿100件を取得しリストに表示して、投稿をタップすることで詳細が見れてストックの付与・削除ができる簡単なアプリをMVVM構成で書きたかったのですが何だか微妙な感じになってしまいました。

# 動かし方
```
git clone https://github.com/hachinobu/SwiftQiitaClient.git
```

cloneしてきたSwiftQiitaClientに移動して

```
pod install
```

また、Qiita APIを使用しているのでアクセストークンが必要です。
[ここ](https://qiita.com/settings/applications) から個人用アクセストークンを取得してください。
取得したらSwiftQiitaClientフォルダ配下にSecrets.plistという名前のplistファイルを作成して
Dictionary TypeでAccessToken: 'アクセストークン' となるようにしてください。※下記参照

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/27785/9bec2f1a-e0ab-02f6-6dc3-9b3482ca652b.png)

# 使ったライブラリ
使い慣れているものや使ってみたかったものを選定して下記にしました
* [Alamofire](https://github.com/Alamofire/Alamofire) ネットワーク通信
* [ObjectMapper](https://github.com/Hearst-DD/ObjectMapper) JSONとオブジェクトのマッピング
* [Kingfisher](https://github.com/onevcat/Kingfisher) 画像のダウンロードとキャッシュ
* [SwiftTask](https://github.com/ReactKit/SwiftTask) Promise拡張
* [Bond](https://github.com/SwiftBond/Bond) ViewとViewModelのBinding
* [Timepiece](https://github.com/naoty/Timepiece) NSDate拡張
* [R](https://github.com/mac-cain13/R.swift) Storyboardなどのリソースをインスタンス化する際のTypo対策

# 作った背景や作りながらの私の心情
iOS開発を始めてからこれまで肥大になりがちなViewControllerを如何に軽量化するか、どうやってレイヤーごとに責務を分けるかといった問題を解決するために試行錯誤の連続でした。

先日、 @susieyyさん が投稿されていた [MVVMをベースに複雑な振る舞いをしっかり把握できるアプリ開発](http://qiita.com/susieyy/items/2af5321b287b8d2f49f6) の記事を見てMVVMに興味を持ち、今回、簡単なデモアプリを作ってみようと思いました。

なんとなく、こんな感じかなと書き始めたもののレイヤーごとに責務をしっかり分けたいのだが、明確な境界線をどこに引けば良いのか。
ViewModelが色々やりすぎだろうか？とか様々な疑問が生まれ戸惑いました。

そして、最終的には、
**あれ？私のアプリ、MVVM構成って言えるレベルじゃなくなってる！？という感じにまでなりました**

# 本アプリのエセMVVM構成の流れ
1. ViewControllerが画面全体を構成すべくデータをAPI通信クラスに要求する
2. APIのレスポンスJSONをModelにマッピングしてModelオブジェクトが生成される
3. Modelオブジェクトの値を基にViewBinding用の値やViewの状態を持つViewModelを生成する
4. ViewControllerは生成されたViewModelとViewのBindingをする
5. ViewはViewModelの値の更新に応じて動的に更新される

# このアプリのレイヤーごとの責務
**Modelレイヤー**

* API通信
* APIからのレスポンスデータを持つ

**Viewレイヤー(View/ViewController)**

* ViewControllerは画面を構成すべく必要なデータをAPI通信クラスを通して要求する
* ViewControllerはViewModelとViewのBindingをする架け橋となる
* ViewはViewModelで生成した値をレンダリングする

**ViewModelレイヤー**

* Modelオブジェクトのデータを基にViewに食わせる値を生成するロジックやViewの状態を持つ
* 単体のViewで必要となる画像やタップイベントの処理として通信要求やデータの更新を行う

# やってみての感想や疑問

ViewModelが通信クラスを介してデータを受け取ってViewとBindingしている自身の値を更新することでViewが動的に変わるようになっているけど、これだとModelとの差異が生まれてしまう

Viewの状態以外でModelに存在しないような変数をViewModelに生やしてしまっていいのだろうか

このデモアプリの場合、Modelオブジェクトの変更を基にViewModelのデータも変化してViewが更新されるというModelオブジェクトが基点となる流れが正解なのだろうか

今回、画像のダウンロードをKingfisherでやっているけれど、元来KingfisherはImageViewを拡張しているので、ImageViewから画像をダウンロードして更新。とViewだけで処理が完結できるのだけれど、わざわざその処理までViewModelでやっているので、これは無駄な気がした

いっそViewModelなしでModelオブジェクトだけで良いのでは？とも思ったが、1つの画面を構成するModelオブジェクトがあるとして、画面のViewごとに、そのModelを引数にしたViewModelを生成することでViewに食わせるデータのロジックなどを各ViewModelに分散できるのは利点だと思った

そして何よりBondが便利すぎる!!
RT1310AでGPIO使えるようになりました。

[FreeBSDのアドバンスカレンダーの3日目](http://qiita.com/s_mitu/items/c60c8787ffa38729e95c)にGPIOの話題があったので[RT1310A](https://qiita.com/yamori813/items/0d2945f2cb771cd2fba9)でも使えるようにしてみました。

クリスマスも近いのでLEDをチカチカしてみたいなと思ったのがちょっとした動機だったりします。

![写真（2015-12-17 08.58）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/6f616b4d-d47c-f6dd-8a35-80ec550eb68b.jpeg)

まずはRT1310Aのプロダクトブリーフをみて、GPIOが12本であることを確認。

次にRT1310Aはデータシートが手に入らないので、GPLなコードでIOアドレスを覚えます。APBの0xa0000で0x00がPORTAのデータレジスタ、0x04がPORTAのディクリプションレジスタ。同じように0x08,0x0cがPORTBになります。

これだけ覚えたらGPLを忘れるために「中西悟堂」になったつもりで公園を一周してきます。

BSDな気持ちでコーディングに入ります。

FDTのstdファイルに[gpioのエントリ](https://github.com/yamori813/freebsd/blob/bf31f06e2d7f3e611fe1c56a9e3d02b4e76c9e64/sys/boot/fdt/dts/arm/wzr2-g300n.dts#L125)を追加します。

とりあえずsys/arm/lpc_gpio.cをrt1310_gpio.cとしてコピーします。

lpcはGPIOのピン数も多く複雑なので、基本的にはコードを削っていく事になります。

GPIOのドライバは大まかに各ポートがINかOUTの設定と読み込み、INの場合は読み込みとOUTの場合は書き込みができれば完了です。

とりあえず変数名や関数名などをlpcからrt1310に代えます。

```
:%s/lpc_/rt1310_/g
```
機能は実装せずコンパイルしてみます。タイポなどないのですが、デバイスドライバの登録付近でエラーがでます。とりえずsimplebusへの登録のみ残してコンパイルしたら通りました。おそらく現在のlpc_gpio.cは同じようにコンパイル通らないと思います。

ごにょごにょしてとりあえず認識されるようになりました。

```
gpio0: <RT1310 GPIO> mem 0xa0000-0xbffff irq 8 on simplebus2
gpiobus0: <GPIO bus> on gpio0
random: harvesting attach, 8 bytes (4 bits) from gpiobus0
gpioc0: <GPIO controller> on gpio0
random: harvesting attach, 8 bytes (4 bits) from gpioc0
random: harvesting attach, 8 bytes (4 bits) from gpio0
```

gpioctlはlibgpio.soが必要なので、rootfsに入れておきます。

で試すとこんな感じです。

```
# ./gpioctl -l
pin 00: 0       GPIO_00<OUT>
pin 01: 0       GPIO_01<OUT>
pin 02: 1       GPIO_02<IN>
pin 03: 0       GPIO_03<OUT>
pin 04: 0       GPIO_04<OUT>
pin 05: 0       GPIO_05<OUT>
pin 06: 0       GPIO_06<OUT>
pin 07: 0       GPIO_07<IN>
pin 08: 0       GPIO_08<OUT>
pin 09: 1       GPIO_09<IN>
pin 10: 0       GPIO_10<OUT>
pin 11: 0       GPIO_11<OUT>
```

三つINになっているのはU-Bootで初期化されている、ボタンの入力となります。ボタンとLEDの対応をコツコツ調べたところこんな感じでした。上の写真の赤いLEDが00になります。

![WZR2GPIO.png](https://qiita-image-store.s3.amazonaws.com/0/104066/ba53db53-b2be-b6c0-3a44-9f67501f90e8.png)


https://github.com/yamori813/freebsd/blob/zrouter/sys/arm/ralink/rt1310_gpio.c

lpcのコードと同じようにrt1310_gpio_pin_toggleでpanicするのですが、使われていないのかもしれません。^ ^;

~~RT1310AのGPIOは割り込みも使えるようです~~と思ったのですが、GPLなコードには見つからなかったの、ひょっとすると無いかもしれません。FreeBSDでGPIOの割り込みってどのように使うか分からなかったので実装していません。

# 後日追記

dtsにgpioledを追加してみたのですが、なかなか動くようにならなくてかなりはまりました。

まず、gpioのエントリーにgpio-controllerと#gpio-cells = <2>が必要でした。

これだけではダメでgpioのドライバにfdt用のDEVMETHODを追加する必要がありました。

gpioledが登録されると/dev/led/statusなどができます。これに0,1をcatすると点灯したり消灯したりします。またf1やf9をcatすると点滅するようになります。

RT1310ではGPIOでの割り込みはできなさそうですが、INTRNGでGPIOの割り込みも他のデバイスから使えるようになったようです。
Dancing D men

@__pandaman64__がquineでpolyglotなジェネレータ書いてくれるって
→書いてくれなかったので書きました．[そーす](https://gist.github.com/amamama/5cc64371817b18c8b3f4#file-quine-d)
[dancing D-men generator](http://bl.ocks.org/amamama/raw/1ca18244e4e298ace6ff/)も作りました．

これは，D言語としてもepsとしても有効なコードになっていて，`gs quine.d` とすると[踊る人形](https://ja.wikipedia.org/wiki/%E8%B8%8A%E3%82%8B%E4%BA%BA%E5%BD%A2)のD言語くんバージョンが画面に現れ，標準出力に元のコードが出るはずです．デフォルトでは画面に

```
abcdefghijklmn
opqrstuvwxyz
```

![ddm8.jpg](https://qiita-image-store.s3.amazonaws.com/0/105410/d9bac72b-4883-9a8d-8b18-a15a48a6a28a.jpeg)

と出ます．
また，`dmd quine.d`としてできた実行ファイルももちろんquineなので，引数なしで実行すると元のコードが標準出力に出ます．
また，できた実行ファイルに引数を渡すと，その引数を画面に出すepsかつD言語なコードが出ます．もちろんこれもquineです．

epsを変換したい場合，ImageMagickのコマンドである，convertを使うといいでしょう．convertは拡張子でフォーマットを判断するので，.epsにすれば正常に変換できると思います．
例えば，`convert quine.eps quine.jpg`とすれば，helloを踊っているD言語くんのjpgファイルができるはずです．

真面目にこのコードの解説をすると，まず `/D-print` で描画ルーチンを定義し， `\printlimb` で四肢の形を定義し， `\printalpha` でアルファベットと画像の対応をさせています．
その後`(文字列)`に対してforallを読んで1文字ごとにprintalphaを呼び出しているだけです．

quine部分は[あなたの知らない超絶技巧プログラミングの世界](http://gihyo.jp/book/2015/978-4-7741-7643-7)を参考にしました．皆さん買いましょう(ダイマ)．
epsは `(dup == =) dup == =` ，D言語の部分は`main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);}` の応用です．かなり簡単だと思います．

polyglotもD言語の `q{}` という素晴らしい文字列リテラルと，epsの`()` という文字列リテラル記法のおかげで簡単に欠落させることができました．

今後の目標はこれをAAにすることです．

動いてるかわかりませんが[http://www.dancingdmen.me:8080/](http://www.dancingdmen.me:8080/)という画像をダウンロードできるジェネレータがあります．@__pandaman64__ が作ってくれました．

残念ながら元ネタの踊る人形にはD言語くんのデフォルトのポーズはありませんが，epsの知識のある人なら，ソースをいじってprintalphaのところに`0 0 0 0 false` とすればデフォルトのポーズを出せます．

18日時点では[これ](https://gist.github.com/amamama/5cc64371817b18c8b3f4#file-dancing_d-man-eps)をgsで出力したものを乗っけていました．
*dancing D men* とこのポーズでシャーロック・ホームズの踊る人形を意味したつもりでした．
画像の文章は
 do you know dancing man of sherlock holmes
 i wrote eps script that presents dancing d men
 each man means an character of alphabet
 of cource the gesuture is same as his dancing man
 the script is divided by three parts
 first is data of alphabet
 second is print d man
 third is decode string

 unfortunately i have not finish draw a flag that represents capital letter
 it shows string as small letter
 i am against some obstacle for writing eps script
 now i almost finished

 full script will be coming soon
 have fun

でしたが読めた人はいなかったようです．

このepsに入っているD言語くんのポーズは3次ベジエで出力しており，もとのsvgファイルより制御点が大幅に少なくなっています．実際大変でした．
D言語くん自体は32x64のサイズに収まるように作られていて，非常に小型なのも特徴です．

もし秘密のメッセージを送りたかったら，これを使えば安全にメッセージを送れます．活用しましょう．
業務系エンジニアがiPhoneアプリ開発エンジニア（iOSエンジニア）になる方法（Part２）

# はじめに
 この記事を読んでためになりそうな方

- 業務系エンジニアからiPhoneアプリ開発者になりたい人
- WEBエンジニアからiPhoneアプリ開発者になりたい人
- iPhoneアプリ開発に興味がある人
 
# 著者の経歴（過去）
- 業務系システムエンジニア
- JAVAエンジニア
- Oracle使い

# 著者の経歴（現在）
- iOSエンジニア

　ざっくり言うと業務系システム開発に１０年以上関わってきました。
　iPhoneが大好きでしたが、当時は業務系システムに携わっていて、iPhoneのアプリを開発したいな〜〜〜でも若くないしiOSエンジニアに転身できるかな？と思っていました。そんな業務系システムエンジニアの著者がどのようにしてiOSエンジニアに転身したかを何回かに分けて書きたいと思います。今回はPart2です。

[Part1はこちら](http://qiita.com/NemotoTaka/items/c21040d082464b6f33b7)

# イントロダクション

前回のPart1では、Macを購入しオススメの参考書を買うまでの事前準備について書きました。
今回は、iPhoneアプリ開発者（iOSエンジニア）になれない人・なれる人の特徴について書きたいと思います。

# iOSエンジニアになれない人の特徴

私は、沢山のiOSエンジニア研修を通して、iOSエンジニアになれない人・なれる人には、それぞれ共通の特徴があることに気づきました。

まず、iOSエンジニアになれない人の特徴は、以下の通りです。

- オライリーなどいきなり難しい本に手をだす
- いきなり画面に動きがあるアプリの開発をしようとする
- Objective-c または、Swiftの基本的な文法を学ばない
- ネットに落ちているサンプルコードをコピーして何も考えずに使おうとする
- ネットの無料情報のみでプログラミングしようとする
- 勉強会に参加はするが、参加のみで満足して自分でソースを書くことが少ない
- 新しいもの好きで、新しいものが発表されるとすぐに飛びつき、基礎的なことを学ばない
- 英語にアレルギーがある
- 一足飛びに成功を求める

上記の項目が３つ以上YESだった方をお気をつけくださいね。
ざっくり言うと、自分の頭で考えず、基礎的なことをしっかり学ばない。という特徴があるようです。

でも、安心してください！履いてますよ！
じゃなくて、書いてますよ。
iOSエンジニアになれる人のパターンも。

# iOSエンジニアになれる人の特徴

- 基礎的な本からはじめられる
- 基礎的な文法をしっかり学ぶ
- 最初はiPhoneらしい画面の動きを忘れられる
- ネットに落ちているサンプルコードを使う時は、自分の頭で考え理解しようとする
- 新しい技術を学び続けられる
- 今までの経験にこだわらない（変化に柔軟）
- 英語を読もうとする意欲がある（英語力がなくても意欲があれば大丈夫）

このようなことを心がければ、きっとあなたもiOSエンジニアになれることでしょう。

私は業務系エンジニアでしたが、iOSエンジニアに転身して本当によかったと思うのは、同じ開発でもワクワク感が違うということです。また、自分が開発したアプリがAppStoreで配信され沢山の方に使われることも嬉しいですね。

# 最後に
Part２では、iOSエンジニアになれない人・なれる人について書かせていただきました。次回以降は、より具体的な内容を書いていきたいと思いますが、リクエストなどあればコメントに書いていただければ参考にしたいと思います。

（株）スマートデバイス・テクノロジーでは、iOSエンジニアの仲間を募集しています。
iOSエンジニアに育成する研修制度があります。
興味がある方は、こちらをご覧ください。
https://www.wantedly.com/companies/smartdt
http://recruit.smartdt.jp/
Ruby / Rails における E164な国際電話番号の扱い方

大げさなタイトルですが、大したことは書いてません。
そして、どれくらい需要があるか謎です（笑）

## E164 とは？

> ITU-T(国際電気通信連合 電気通信標準化セクター) E.164勧告で規定されている国際公衆電気通信番号。E.164勧告は国際的に一意な電話番号体系として規定されています。この番号は国番号を含む最大15桁の10進数字列です。たとえば03-5297-2311(JPNICの代表電話番号)をE.164番号にすると、日本の国番は81、市外局番03の0をとって3とし「+81-3-5297-2311」となります。

https://www.nic.ad.jp/ja/basics/terms/E164.html


## phony

[phony](https://github.com/floere/phony) は E164な国際電話番号を扱うための gem です。Rails で使うなら [phony_rails](https://github.com/joost/phony_rails) というラッパーがあります。


03-1234-5678 を normalize すると...

```rb
[5] pry(main)> PhonyRails.normalize_number '03-1234-5678', country_code: 'JP'
=> "+81312345678"
```


090-1234-5678 を normalize すると...

```rb
[7] pry(main)> PhonyRails.normalize_number '090-1234-5678', country_code: 'JP'
=> "+819012345678"
```

となります。桁数に関わらず、正規化してくれるので便利です。

では、日本国内の番号としてありえないものを指定するとどうなるか？

```rb
[8] pry(main)> PhonyRails.normalize_number '1234-5678', country_code: 'JP'
=> "+8112345678"
```

一応出力はされます。E164 として valid かを検証するには Phony の plausible? メソッドを使います。

```rb
[9] pry(main)> Phony.plausible? "+8112345678"
=> false
```

期待通り、false になります。

ここでは簡単な使い方だけご紹介しましたが、他にも多くのメソッドがあるので https://github.com/joost/phony_rails を見てみるとよいかもしれません。

## 使いどころ
Twilio を利用して SMS を送信する時には、国際電話番号を扱う必要が出てくるので便利な gem だと思います。
KiCad GUI の日本語

17日目の [nosu_Z さん](http://tech.nosuz.jp/2015/12/kicad-info/) に続く、[KiCad Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kicad) の18日目です♪　

もう４回目で恐縮ですが、来週は来客もあって時間が取れそうにないので、たぶん最後のアドベントカレンダー投稿です。よろしくお付き合いください。 

# はじめに
細かいことが気になる相棒の右京さん :point_up: でなくても、KiCad を使っていて GUI の日本語が気になる方も多いかと思います。
今回のリリース向けに翻訳作業のお手伝いをさせて頂きましたが、ここ最近で追加になった部分はほぼ私のせいです。申し訳ありません。 :disappointed_relieved: 
そんな方のために今使っている KiCad をカスタマイズする方法を書こうと思います。

# 本文
プログラム開発で国際化対応というと、リソースファイルを使うのが一般的かと思います。
Windows なら "～.resx" とか "～.resources"、あるいは "リソース DLL" の利用ですね。
しかしながら、KiCad はマルチプラットホームだけあって gettext を使っているようです。
私は不勉強で使ったことがなく、poファイルの編集というのも今回が初めてでした。

簡単に書くと、先ず KiCad の GUI リソースファイルですが、Windows では "C:\Program Files\KiCad\share\kicad\internat" にあります。
日本語のものはその下にある "\ja" 内の "kicad.mo" です。
これを入れ替えることでお好みの日本語 GUI にできるという仕掛けですね。

この MO (Machine Object) ファイルというのはバイナリ形式のファイルで、PO (Portable Object) ファイルを変換して作ります。
PO (Portable Object) ファイルというのが、実際に翻訳で使うファイルです。 
POT (Potable Object Template) ファイルという、ソースに記述したメッセージID に対応させた翻訳のためのテンプレートファイルから派生させます。

また、この翻訳作業とバイナリ形式への変換には、[poedit](http://poedit.net/) というツールが使えます。
Unix/Linux, Windows, Mac OS Xで動作し、有り難いことに無料です。（有償の Pro版もあります）

基礎知識はこれくらいにして、以下に実際の作業方法をまとめます。

１．POファイルの入手
[本家サイトの Docs Team](http://kicad-pcb.org/contribute/docs-team/) からリンクされている、GitHub 上の Official Documentation から辿れます。
左上の "KiCad" をクリックし、kicad-i18n を探してクリックします。 
[KiCad/kicad-i18n](https://github.com/KiCad/kicad-i18n) がそのリポジトリです。
このページの "ja" をクリックすると "kicad.po" がありますが、Windows のブラウザIE で開くととても重いです。
また、Windows10 の Edge では挙動が怪しくなり、うまくテキストファイルへ落とせませんでした。
お勧めの方法は、リポジトリにある "Download ZIP" をクリックして全部のアーカイブをダウンロードしてしまうことです。（12/16 現在、約2.18MB です）
この ZIPファイルを展開してできる "kicad-i18n-master" の "ja" に、目的の "kicad.po" ファイルがあります。

２．POファイルの編集
[poedit](http://poedit.net/) を入手してインストールしておきます。
入手した "kicad.po" ファイルをダブルクリックすると、poedit が起動するはずです。
後は "編集" メニューの "検索" で手直ししたい日本語を探して、最下部の "翻訳" の下にあるテキストボックスで編集するだけです。
ここで一つご注意です。
同じ単語が複数個所に存在することがあるので、どれが変更したい単語かは MOファイルを作って実際に試さないと分かりません。（ソースを読む根性がある人は別ですよ！）
運が悪ければ再度修正することになるでしょう。

３．MOファイルの作成と KiCad での確認
編集できたら、もう勝ったも同然です :tada: 
"ファイル" メニューの "MOにコンパイル" でお好みの名前で保存できますが、単に "保存" アイコンをクリックするだけでも同名の MOファイルが同じディレクトリに作成されます。
これを上に記した KiCad の GUI リソースファイルと入れ替えます。
後は普通に KiCad を立ち上げて見て下さい。編集した文字列に入れ替わっていることが確認できるでしょう。
もし、代わっていなければ違う文字列を編集してしまったということです。
２へ戻って、文字列検索＆修正を地道に繰り返しましょう。

# おわりに
下は "～開きました" を "～の開始" にしたものです。
![KiCad_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/bfaf6387-ac80-c3f9-b90c-783e10460107.jpeg)
同じ文字数で並んでいてちょっとした自己満足が得られました。:blush:
このように KiCad の GUI は簡単に日本語をカスタマイズできます。
細かいことが気になる方、ぜひお試しください。
また致命的な間違いを見つけて修正されたら、コミュニティへの貢献も宜しくお願いします。

明日は [tds_radio さん](http://qiita.com/tds_radio) の KiCadの小技 です。どんな小技をご紹介いただけるのか楽しみですね♪

[KiCad Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kicad)
【FileMaker】仕様書はここにも書ける　その２

FileMaker Advent Calendar 2015 18日目です。

今回のAdvent Calendarネタでも「[仕様書はここにも書ける](http://qiita.com/tyuma/items/978983f24805eb84e0f7)」と書きましたが、今回は別のところにも残しておこう、ということです。

ここです。
![スクリーンショット 2015-12-16 15.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/60538/71c3836a-f7a6-5280-a472-5ade925042fc.png)
テーブルのフィルド定義にある、オプション／コメント欄です。

意外と知らない方がいらっしゃるのですが、この「オプション／コメント欄」の文字列の部分をクリックすると、コメントが現れます。
![スクリーンショット 2015-12-16 15.18.31.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ea1b66bb-99a1-c1dd-4d54-2584dbf465bd.png)

運用後、追加の開発でフィールドが増えた際には、「2015/12/18 追加 ○○機能のため」のように履歴を残しておくこともできますよね。

書く場所は、フィールド定義をするところにある「コメント」です。
![スクリーンショット 2015-12-17 0.38.34.png](https://qiita-image-store.s3.amazonaws.com/0/60538/77a9829f-8cdc-befd-7b94-03b811bba592.png)
複数のコメントは残せませんが、ここにも仕様を残せるので、ぜひとも活用してみてください。
勇者のメモを残そう

この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の18日目の記事です。

今日は、翻訳の量をこなす事は難しい事に付いて書きたいと思います。

漫画とイラストは違います。アニメーションとイラストも違います。
イラストは描けても、漫画を描くのは難しいんです。何が違うのかというと量が違います。
1枚絵はより完璧な絵を描く事が出来ます。でもですよ、、、例えばモナリザのクォリティで漫画やアニメを作る事を考えてみてください。

そりゃ無理ってもんが有りますよね。。。

長い文章を理解するにあたってすべてを逐一正確に翻訳するのは大変です。

自分はよく、適当に翻訳した文章を置いておいたりします。そういう文章をくその山と呼ぶ人もいます。でもそのくその山も作るのは大変なのです。そして、くその山を読むだけでも何となく把握出来る物が有るのも事実です。google翻訳や様々な機械翻訳はまさにそういうくその山生成装置と言えなくもありません。でも多くの人が利用していますよね。完全じゃない、翻訳記事も無いよりは有ったほうがありがたいものです。

かつて、D言語の適当な翻訳をやっている人がいました。それを参考によりよい翻訳する人がいました。自分はどちらも良い仕事をしていたと思います。

とりあえず、やってみる。それを踏み台にさらに良い翻訳をする。それは悪い事ではありません。未完成の物を見てより完成に近付けるのは楽しい事です。

完全ではない翻訳は、宝までたどり着けなかった勇者のメモ帳だと思ったほうが精神衛生上良いと思います。

完全ではない翻訳を書く人はいわば宝にたどり着けなかった勇者なのです。

勇者のメモをヒントに宝にたどり着き、より正確な地図や情報にするのです。

恐れる事はありません。勇者のメモを残しましょう。
誰がネットワークを使い切ってるのか

# Argusを使ってネットワークの使用状況を調べる

なぜか帯域が使い切られてしまってネットワークが重くなることってありますよね。

で、ルータの情報でも見れば帯域が使い切られているところまではわかりますが、そっから誰が使っているのか調べる方法として`Argus`があります。

簡単にまとめると`wireshark`などと同じようにパケット収集をした上で、情報をまとめ上げて解析してくれるツールです。

# Argus

http://qosient.com/argus/

インストールは簡単なので省略。割とOSごとのメジャーなパッケージシステムで配布されています。

# 使い方

```
argus -w /tmp/argus.20151204
```
でパケットを収集して、
```
ra /tmp/argus.20151204
```
で表示するだけです。この表示するときにいろいろ指定してあげることで問題となっている通信を行っている相手を見つける手助けになります。
ちなみに、tcpdumpで取得したpcap形式のものでも大丈夫です。argusで収集するばあいにはpcapほどの情報量を取らないのでサイズが小さくなります。

当然ながら、収集するパケットは実行したマシンのポートのネットワークに流れているものになるので、ポートミラーリングしてそこから収集するのがいいでしょう。

# 使用例

そのまま表示するわけにもいかないので結果はいろいろ加工しています。変なとこがあったらその所為です。

```
# ソースアドレスでまとめてから最も通信量の多い順にまとめる
$ racluster -r /tmp/argus.20151204 -m saddr -w - | rasort -m bytes -s saddr bytes pkts
           SrcAddr   TotBytes  TotPkts
        10.0.5.245    4621639     8565
       192.168.1.1     319649      871
```
```
# ソースアドレスでまとめてから最も通信量の多い順にならべる
$ racluster -r /tmp/argus.20151204 -m daddr -w - | rasort -m bytes -s saddr daddr pkts bytes
           SrcAddr            DstAddr  TotPkts   TotBytes
        10.0.5.245        xx.xx.xx.xx     2035    1403435
       192.168.1.1        xx.xx.xx.xx     1322     944262
           0.0.0.0         10.0.5.245     1404
```
```
# 特定の接続元を、接続元でまとめてから最も通信数の多い順にならべる
$ ra -r /tmp/argus.20151204 -w - - src net 10.0.0.0/20 | racluster -m saddr  -w -  | rasort -m pkts -s saddr pkts bytes
           SrcAddr  TotPkts   TotBytes
        10.0.5.245     8565    4621639
        10.0.5.245        6        294
```
```
# 特定時間、特定の宛先で、接続先でまとめて最も通信数の多い順にならべる
$ ra -r /tmp/argus.20151204 -t 11-12 -w - - dst net xx.xx.xx.xx | racluster -m saddr  -w -  | rasort -m pkts -s pkts bytes saddr
 TotPkts   TotBytes            SrcAddr
    2035    1403435         10.0.5.245
      25      14674        192.168.1.1
```

他にもかなりのオプションがありますが、上記例のとおり接続先や接続元でまとめて異様に接続数の多いやつさえ見つけられれば原因を調べることができるかと思います。

少なくとも接続元や接続先をフィルタするオプションはtcpdumpと共通なので操作しやすいでしょう。
React Native - Facebook SDK(iOS)

今日はFacebook SDKを導入する方法を説明します。Facebook SDKを利用することで容易にFacebook Loginを設置したり、Graph APIにアクセスできたりします。Facebook オフィシャルのReact Native用のモジュールは現時点でiOSだけに対応しています。

## Installation

https://github.com/facebook/react-native-fbsdk 

上記のモジュールをインストールします。READMEにインストール方法が書いてあります。具体的には、下記のステップを踏みます。

### 1. 必要なモジュールのインストール

```
$ npm install --save react-native-fbsdkcore # for graph API
$ npm install --save react-native-fbsdkshare 
$ npm install --save react-native-fbsdklogin 
```

### 2. Facebook SDKのインストール

 1. [オフィルサイト](https://developers.facebook.com/docs/ios?locale=ja_JP)からダウンロード
 2. [Getting Started](https://developers.facebook.com/docs/ios/getting-started/)を参考にXcode上で設定する。
 3. Facebook SDKモジュールをリンクさせる。[ここ](http://facebook.github.io/react-native/docs/linking-libraries-ios.html)を参照してドラッグアンドドロップとLink binary with librariesの登録を行う。

###3. コンポーネントに追加

下記はFacebookログインの処理です。モジュールにログインボタンが用意されているので、それを設置。そのpropertyにログイン後に発動するイベントを追加。そして、そのイベントが起きた時に、Graph APIでユーザ情報を叩くフローになります。そして、適宜処理をします。

```
import { FBSDKLoginButton } from 'react-native-fbsdklogin';
import { FBSDKGraphRequest, FBSDKGraphRequestManager } from 'react-native-fbsdkcore';
...

  onLoginFinished(error,result){
    this.setState({loading: false});
    if (error) {
      alert('Error logging in.');
    } else {
      if (result.isCanceled) {
        alert('Login cancelled.');
      } else {
        this.getUserFromFB();
      }
    }
  },

  getUserFromFB(){
    var fetchRequest = new FBSDKGraphRequest((error, res) => {
      if (error) {
        alert('Error making request.');
      } else {
        // Data from request is in result
        console.log(res);
        userActions.facebookSignIn(res);
        this.setState({loading: true});
      }
    }, '/me?fields=id,name,first_name,last_name,email,gender,picture.width(350).height(350)');
    // Start the graph request.
    FBSDKGraphRequestManager.batchRequests([fetchRequest], function() {}, 60);
  },

  onLogoutFinished(){
    userActions.parseLogOut();
  },
..

  render(){
    <FBSDKLoginButton
      onLoginFinished={this.onLoginFinished}
      onLogoutFinished={this.onLogoutFinished}
      readPermissions={['email','public_profile', 'user_friends', 'user_photos']}
     publishPermissions={[]}
    />
  }
```

## Summary

このようにFacebookが主導しているReact Nativeなので、Facebook SDKが準備されておりFacebook SDKのJavascriptライブラリを使う感覚でReact Nativeのアプリでコーディングできます。非常に簡単に設置できます。現時点でAndroidのSDKがないのが残念ですね。
Siv3Dでプリコンパイル済みヘッダーを使用してビルド時間を半分に短縮する

[Siv3D Advent Calendar 2015](https://qiita.com/advent-calendar/2015/siv3d)の18日目の記事です。

Siv3D、便利ですがビルドが大変です。SSDだと数秒ですがUSBに入れているプロジェクトでは数十秒かかります。そこでプリコンパイル済みヘッダーを使用してビルド時間を短縮しよう、ということです。
[Play Siv3D!のFAQ](http://play-siv3d.hateblo.jp/entry/faq)には

>**コンパイル時間を短くする方法はある？**
>プリコンパイル済みヘッダを作成・使用することで、ビルド時間を半分以下に短縮できます。

とありますが、詳しい説明がなかったので手順を記しておきます。
この記事ではVisual Studio 2013 Community update 5およびSiv3D June v2を使用します。
# プロジェクトを作成する
いつも通りにSiv3Dのプロジェクトを作成します。すでに作成している場合は次へ進んでください。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/001.png)

# ヘッダー ファイルを作成する
1. [表示(V)] -> [ソリューション エクスプローラ(P)] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/002.png)

1. [ヘッダー ファイル]を右クリックし、[追加(D)] -> [新しい項目(W)...] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/003.png)

1. [ヘッダーファイル (.h)] をクリックし、[名前(N)] に `stdafx.h` と入力して [追加(A)]をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/004.png)

1. `stdafx.h`が開いているはずなので、以下のように入力して保存します。

```cpp:stdafx.h
#pragma once
#include <Siv3D.hpp>
```

# C++ ファイルを作成する
1. [表示(V)] -> [ソリューション エクスプローラ(P)] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/005.png)

1. [ソース ファイル]を右クリックし、[追加(D)] -> [新しい項目(W)...] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/006.png)

1. [C++ ファイル (.cpp)] をクリックし、[名前(N)] に `stdafx.cpp` と入力して [追加(A)]をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/007.png)

1. `stdafx.cpp`が開いているはずですが、何も入力しません。

# プロジェクトのプロパティを変更する
1. [プロジェクト(P)] -> [(プロジェクト名) のプロパティ(P)...] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/008.png)

1. 左のツリーの [構成プロパティ] -> [C/C++] -> [プリコンパイル済みヘッダー] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/009.png)

1. [構成(C)] が [すべての構成]になっていることを確認し、[プリコンパイル済みヘッダー] を [使用 (/Yu)] に変更します。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/010.png)

1. 左のツリーの [詳細設定]をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/011.png)

1. [必ず使用されるインクルード ファイル] に `stdafx.h` と入力し、 [OK]をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/012.png)

# stdafx.cppのプロパティを変更する
1. [表示(V)] -> [ソリューション エクスプローラ(P)] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/005.png)

1. `stdafx.cpp` を右クリックし、プロパティ(R)をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/013.png)

1. 左のツリーの [構成プロパティ] -> [C/C++] -> [プリコンパイル済みヘッダー] をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/014.png)

1. [構成(C)] が [すべての構成]になっていることを確認し、[プリコンパイル済みヘッダー] を [作成 (/Yc)] に変更して、 [OK]をクリックします。
![](//i0.wp.com/prince.webcrow.jp/wp/wp-content/uploads/2015/11/015.png)

# ビルドする
1. いつも通りビルドしてみます。1回目なのでビルド時間は通常と変わらないはずです。
1. `Main.cpp`の一部を変えてもう一度ビルドしてみましょう。ビルドログを確認すると`stdafx.cpp`がビルドされなくなくなっており短い時間で起動したはずです。

# 補足・蛇足
- クリーンしたあと1回目のビルド時間は通常と変わりません。
- ソースファイル(`Main.cpp`等)には`#include <Siv3D.hpp>`を書かなくても動きます。
- 手順が多いのでSiv3Dのテンプレートに入れて欲しいです(要望)

明日は[@Mitsugoro32](https://qiita.com/Mitsugoro32)さんです。
Unityで「装備品によって見た目が変わる」を実現する（あるいはコスチューム変更）

# はじめに
この記事は、MMORPGなどでよくある「装備品によって見た目が変わる」をUnityで実現する方法と、実現するにあたり遭遇したいくつかの注意点の共有を目的としています。

# 概要

方法をざっくりとまとめると以下の流れになります。

1. Blenderで3Dモデルを作成し、体の部位ごとにメッシュとボーンをFBXで書き出す。<br>部位は、頭(髪)、顔、胴体、脚の4種類に分割。<br>
**※注意点：ボーンだけ書き出した所、向きがおかしくてうまく結合できなかったので、顔を共通ボーンとして書きだした。Blenderならではの問題かもしれない。**
1. Unityにインポートする。<br>RigはHumanoidに設定。
1. スクリプトで各部位メッシュの頂点を共通ボーンに割り当てる。
1. **[Mesh.CombineMeshes](http://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html)** で複数のメッシュを一つのメッシュにまとめる。
1. Materialは１つにまとめると質感が変わってしまうので今回は敢えてまとめない。

ちなみに開発環境は、以下のとおりです。
- Unity 5.2.3f1
- Blender 2.76b

# サンプルプロジェクト

前述の方法を実装したサンプルプロジェクトをgithubにて公開しています。

https://github.com/kaiware007/SkinnedMeshCombiner

公開するにあたり、著作権が絡む3Dモデルなどは使えないため、Blenderで一からモデルを作り直しました（コレが一番苦労した）
仕組み自体はUnityで元々用意されているクラスを利用しているだけなので、ライセンス等はありません。

# 以下、詳細
実際何をやっているかはサンプルプロジェクトを見ればわかると思いますので、実現するまでの苦労した点等を書きます。

## Blenderで3Dモデルを作成してエクスポート
初めて人体モデルを作ったので出来がひどいのは置いておくとして、Unityに正常にインポートできるようにするまで苦労しました。
まず、エクスポートする手順です。

1. 書き出したい部位とアーマチュア以外を一旦削除する。
1. 「エクスポート」→「FBX」を選択。
1. エクスポート設定で、書き出すデータは「アーマチュア」と「メッシュ」を選択。
![human014.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/e4780c6e-f87a-0cd0-393b-98c0e8a1e584.png)

Blenderから書きだしたFBXのUnityへのインポート事例は色々見つかるのですが、Blenderのバージョン違いのせいでうまくいきませんでした。
よく見る事例では、アーマチュアからRigを生成しているのですが、この方法だとUnityにインポートした時に何故か末端のボーンが削除されてしまい、うまくアニメーションできません。
試しにアーマチュアのままFBXを書き出したところ、ボーンが削除される問題は発生しませんでした。
この方法が正しいのかはわかりません、もっといい方法があれば教えて頂けると幸いです。

また、1メッシュに複数のマテリアルを割り当てていると、Unityでメッシュ結合した時にどちらかのマテリアルを割り当てているポリゴンが消えてしまう問題が発生しました。
仕方がないのでマテリアルごとにメッシュを分けて、１つのFBXで書き出すようにしました。

今回作成したモデルは下記の2種類です。

![野球少年](https://qiita-image-store.s3.amazonaws.com/0/22909/09d95b27-f685-3c41-54ac-08608c70b7ac.png) ![スパルタン](https://qiita-image-store.s3.amazonaws.com/0/22909/08e7f993-3649-71b6-0894-6714b16a2086.png)

*今回エンジニアの私が個人的にモデリングしているため、無料で使えるBlenderを使用していますが、本来ならMayaや3D Studio Maxなどのプロ用の高機能3Dモデリングソフト等を利用すれば、上記のような余計な苦労は避けられるかもしれません…。*

## Unityにインポート
Import SettingsのRigはHumanoidを選択します。
一部のモデルをHumanoidにした所、関節のマッピングが外れていた事がありました。
ボーン自体は残っているのでConfigureで設定し直しました。
![human016.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/f51a61c0-5d3a-13dd-a379-96e1babc90ef.png)

## メッシュ結合
1. 空のGameObjectを作成（以下、Root）
1. Rootの下に、素体となるボーンのモデルを生成。
1. Rootの下に、各部位のモデルを生成する。<br>各部位のモデルは、それぞれボーンを持っているが、元々一つのモデルから書き出されているため、共通のボーン構造になっている。
1. 各部位の頂点のボーンの参照先を、素体となるボーンに割り当て直す。<br>これで、1つのボーンに複数のメッシュが紐づいたことになる。
1. 最後に部位のメッシュを全て１つのメッシュに結合し、元々あった各部位のボーンオブジェクトを削除して完成。

![human010.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/f7bb224a-6bdc-9661-ae5b-c09728a3f04b.png) ![human011.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/2c0ff6dd-3d15-fb87-ffd5-2c2a0636b9a9.png)

![human012.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/a53b08a5-3fe5-23b5-8e96-a5a26cdd3a3c.png) ![human013.PNG](https://qiita-image-store.s3.amazonaws.com/0/22909/47656d2e-6ed4-0625-32b8-9762548fabe3.png)
表示速度監視のおはなし

この記事は クラウドワークス[Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crowdworks) 18日目の記事になります。

# ことのはじまり
私がクラウドワークスにジョインしたのは2014年11月になりますが、入社直後に始めたお仕事が表示速度改善になります。数ヶ月の改善作業の末に目標値を超えたもののひとつの課題が残っていました。「多くの開発者が関わるサービスでその表示速度をどのように保っていくか」です。

# 理想を考える
表示速度も障害監視と同じく毎回人がチェックするようなものではないことは明らかです。抜け漏れはもちろん、優先度が低くなりがちでそのうち忘れられるでしょう。
問題があれば通知が来てそれに対してアクションする。というのが理想だと考えられます。

## 理想に近づくには何が必要か
まず考えるのは外部の表示速度監視サービスの利用です。いくつかあるものの数が少なく、また監視対象のページを増やすと料金も増える傾向があります。そして、そもそもクラウドワークスは表示速度改善の指標に domContentLoaded と [Speed Index](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index) を用いてます。2015年1月時点でこの Speed Index の計測をサポートしているのは [WebPagetest](http://www.webpagetest.org/) のみだったことがあり、自ずと選択肢は大分限られたものとなりました。
WebPagetest を利用した監視方法でお手軽なのは、本家 [WebPagetest.org の API](https://sites.google.com/a/webpagetest.org/docs/advanced-features/webpagetest-restful-apis) 経由での利用になります。この方法は後ほど述べる理由によりクラウドワークスでは採用できませんでしたので [WebPagetest.org の提供している AWS EC2 の AMI](https://sites.google.com/a/webpagetest.org/docs/private-instances) を利用することにしました。

## 通知方法を考える
クラウドワークスでは Slack が広く使われており、エンジニアに通知するには最適です。しかし残念ながら WebPagetest は計測するだけの機能しか用意されていません。

## ツールを組み合わせる
ここで他のツールの出番になります。 [Datadog](https://www.datadoghq.com/)  では WebPagetest に不足している 充実したロギングの機能と Slack へのアラートがサポートされており、ここではまさに最適なツールです。ここまでできればあとは構築するのみです！

# 構築する
以下のような構成になります。

![Job Observer Pattern (1).png](https://qiita-image-store.s3.amazonaws.com/0/9948/4b877f18-954b-5aba-41fb-bb4fc4bdcb68.png)

## プライベートな WebPagetest を用意する
[こちらの記事](http://calendar.perfplanet.com/2014/webpagetest-private-instances-in-five-minutes/)を参考に構築を行います。AWS の VPC の設定などひっかかりポイントがいくつかありましたが、最低でも共有しておきたいのは以下になります。

### ポイント1. WebPagetest に必要なインスタンスは2つ以上
インスタンスの1つは司令塔的な Web Server になり、基本常時立ち上げておきます。インスタンスタイプは micro で十分です。もう一方は計測を行う Test Agent になります。こちらは計測時にのみ起動し、表示速度の計測が終わると落ちます。

### ポイント2. 計測のために安定した回線が必要
AWS EC2 はインスタンスタイプによって回線速度が異なるので  Test Agent は安定した表示速度監視を実施できるインスタンスタイプを選ぶ必要があります。[こちらの記事](http://hostbenchmarker.com/blog/ec2-instance-type-used-webpagetest-agents/)が参考になるかと思います。

## 監視スクリプトを書く
本家と同じくプライベートな Webpagetest でも [API](https://sites.google.com/a/webpagetest.org/docs/advanced-features/webpagetest-restful-apis) を利用することができます。また Datadog からも API を利用するための [Gem](https://github.com/DataDog/dogapi-rb) が提供されているのそれを利用してスクリプトを書き、cron で定期実行するようにします。

## Datadog で閾値とアラートの設定する
本家 Webpagetest を利用できないことが判明したのはここです。 1日1回の測定では Datadog のアラートがワークしない状況でした。最低でも1日2回測定する必要があったのです。

# おわりに
これで表示速度を監視できる用意はできました。実際遅くなるとこのように Slack に通知がきます！
![datadog.png](https://qiita-image-store.s3.amazonaws.com/0/9948/99eb9e41-9e11-7feb-bf9c-cd636a17dade.png)

まだ弊社でも試験運用の段階ですのでフィードバックいただけるとうれしいです。
またこの記事が速度監視で困っている誰かの参考になれば幸いです。
【vte.cx応用】17. Index、暗号化、項目ACLについて

今日はIndex、暗号化、項目ACLについて説明します。
この[ドキュメント](http://reflexworks.jp/documentation.html#taggingservice.html#T4
)の補足説明になります。

Indexや暗号化、項目ACLはテンプレートを使って実現しています。
つまり、/_settings/template に設定情報を記述して保存すると動的に処理します。

## Indexについて

Index(索引)はデータストアに格納されているデータを高速に取り出すための仕組みです。
テーブル設計でお馴染みかと思いますが、vte.cxでもIndexを作成することができます。

設定は簡単で、スキーマテンプレートと同じ/_settings/templateエントリーの`<rights>`タグにルールを記述するだけです。

項目名に続けて:(コロン)の後に正規表現を記述すると、データ登録の際にURIのうち正規表現にマッチするものがIndexとして登録されるようになります。URIにはEntryの実体(self)や別名(alias)などを指定できます。

データ量が多くなるものは必ずIndexを設定するようにしてください。

## ソートについて

vte.cxはソートが苦手です。多くのNoSQLと同様、標準でソート機能があるわけではありません。
これはvte.cxの最大の欠点といってもいいかもしれません。

しかし、インデックス検索で値が昇順になることを利用すれば代用が可能です。

また、降順にソートを行いたい場合、項目とは別に降順用の項目(desc型)を追加することで実現できます。desc型は以下のようにLongの最大値から引いた値が自動でセットされます。

Long.MAX_VALUE - 降順ソートしたい項目の値

詳しくは、ドキュメントの[ソート](http://reflexworks.jp/documentation.html#taggingservice.html#G5)を参照してください。

## 暗号化について

テンプレートに記述する項目名に続けて#を付けると暗号化項目となります。Index項目と暗号化項目はどちらか一つだけを指定できます。暗号化を指定するとIndex検索ができませんのでご注意ください。

暗号化は、内部に持っている秘密Key(usersecret)とidと組み合せてハッシュ化したものが実際の暗号Keyとして使われます。(※ ソースコードに秘密Keyを持っているので厳密には暗号化ではなくハッシュ化になります。）

## 項目ACLについて

フォルダに設定するACLではEntry単位でのアクセス制御ができましたが、項目ACLを使うと項目単位でのアクセス制御ができるようになります。

項目名に続けて=の後に項目ACLを指定できます。ACLは{uid|group}+{RW}の形式でユーザおよびグループの読込(R)書込(W)権限を指定することができます。,(カンマ)で複数件指定できます。

例えば、Contributorタグはサービス管理者(/_group/$admin)のRW権限がデフォルトで付いているため、フォルダACLのアクセス制御はサービス管理者しか操作できません。

## 運用中のテンプレートの更新について

テンプレートはサービス実行中でも更新することができますが、スキーマは項目の追加と項目名の変更のみが可能です。削除したい場合は管理画面でデータをリセットする必要があります。

開発中はデータリセットが可能でしょうが、運用開始後は追加もしくは名前変更で対応するようにしてください。

項目ACLは運用中でも更新可能ですが、Indexと暗号化の指定変更は期待通りに動作しない可能性がありますのでご注意ください。

これで本日はおしまいです。
明日はユーザ管理について説明します。
それでは。