OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】カスタム関数を作ろう

さて、FileMaker Advent Calendar 2015 6日目です。

[systemMasterからExcecuteSQLを使ってシステム値を取得するという回](http://qiita.com/tyuma/items/0da78e2b5ce417f9bd7e)を覚えてますか？
システムマスタからシステム値を取得するのはよくあることだと思うので、何度もExcecuteSQLを書かずにみんなが使えるようにカスタム関数という形にしていきます。

カスタム関数を作るときは、「ファイル＞管理＞カスタム関数...」にあります。
![スクリーンショット 2015-12-03 15.41.36.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6b48698f-581d-89cf-d4e0-2a8e4db75013.png)

指定する所は、
![スクリーンショット 2015-12-03 16.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/17c31250-2b77-d6db-30d3-74f0f261cff4.png)
カスタム関数名、引数、計算式です。

引数は、関数のカッコ内で指定するパラメータです。
複数追加できますが、大抵3個くらいがMaxでしょうかね。

ExecuteSQLで指定するSQL文の引数に指定できます。
この「?」の部分が引数の値が入ります。
SQL文で「?」に引数を当てるというやり方は、FileMakerの仕様ではなく、SQLの仕様なので、覚えておくと他の言語でも応用できます。
仕事の幅を広げるためにも、ぜひSQLの書き方を覚えてくださいねー。

ここでは単にカスタム関数を作ることに重点を置いているので、エラー処理は書いていませんが。引数が範囲外だったらなどのエラー処理も決めておくと、より実用的になります。

では、カスタム関数を使ってみましょう。
フィールドのグローバル指定でカスタム関数を使って値を保持する例です。
![スクリーンショット 2015-12-03 16.42.48.png](https://qiita-image-store.s3.amazonaws.com/0/60538/587cbc5d-0a3b-ef80-8795-bc210c00f328.png)
「カスタム」の中に、先ほど作ったカスタム関数「GetSystemValue」が出てきますね！

はい！
system2にGetSystemValueで取得した値が保持されて、表示できています！
![スクリーンショット 2015-12-03 16.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/69503e92-e188-1786-6d66-a98eba8baeb6.png)

いかがでしたか？
カスタム関数は敷居が高いなぁと思っている方、何度も同じ関数を書くよりは、こうしてカスタム関数を作って共有した方が便利なので、ぜひ活用してみてください。
スプレッドシート風JSONエディター

こんにちは＆初めまして。石末といいます。
ちょっとした小ネタですがお付合い頂けると幸いです。

いこーよでは毎月実施するアンケートがあります。
アンケートの項目は毎月変わりますし自由入力や選択項目や必須かどうかなどなかなか面倒なデータ構造が必要です。
こういう柔軟なデータを表現するにはS式やJSONなんかが向いているのですがアンケート項目を作るのは編集チームの人達なのでS式書いてきてくださいというのはなかなか難しい。

いまはテキストデータをもらってからプログラマーが変換しています。
なにかいい方法がないかと常々思っていたのですがつい先日こちらの[記事](http://qiita.com/shohei909/items/3780307cf8c5ae1d16cd)をみて[CastleDB](http://castledb.org/)を知りました。

CastleDBはゲーム向けらしいのですがエクセルのように表で入力できてJSONを出力できる。しかも入れ子のデータもあつかえるのでアンケートデータエディタとしても便利そう！

<img width="831" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/103776/a26e32d3-0bd4-cd9c-637d-f8be9e2d4f06.png">

入力してみると綺麗なJSONを出力してくれました！


```json:new.cdb
{
	"sheets": [
		{
			"name": "survey",
			"columns": [
				{
					"typeStr": "1",
					"name": "title"
				},
				{
					"typeStr": "1",
					"name": "body",
					"display": null
				},
				{
					"typeStr": "8",
					"name": "answer",
					"display": null
				}
			],
			"lines": [
				{
					"title": "Q1.",
					"body": "力欲しいか？",
					"answer": [
						{
							"A1": "YES",
							"A2": "NO",
							"Free": true
						}
					]
				},
				{
					"title": "Q2.",
					"body": "力が欲しければ",
					"answer": [
						{
							"A1": "くれてやる",
							"A2": "くれません",
							"Free": false
						}
					]
				}
			],
			"separators": [],
			"props": {}
		},
		{
			"name": "survey@answer",
			"props": {
				"hide": true
			},
			"separators": [],
			"lines": [],
			"columns": [
				{
					"typeStr": "1",
					"name": "A1",
					"display": null
				},
				{
					"typeStr": "1",
					"name": "A2"
				},
				{
					"typeStr": "2",
					"name": "Free",
					"opt": true,
					"display": null
				}
			]
		}
	],
	"customTypes": [],
	"compress": false
```

ちょっと操作に癖はあるもののプログラマーじゃない人でも使えそう。ためしてみたいとおもいます！
bundle 実行が遅い時などに rubygems.org のミラーを使う

bundle install 自体がネットワークエラーで失敗したり、あるいは経過が遅い時、本家のネットワーク応答が悪い時があるようです。こうなってしまうと、開発が停滞してしまう場合があるので、その場合の対処方法をまとめておきます。

# ミラーサイト例
- 標準では https://rubygems.org/
- SSL が遅い時時などは、http://rubygems.org/ を指定すると改善する場合があるようです
- ミラーサイトは他にもたくさんありますが、 http://production.cf.rubygems.org などが利用できます。
    - 私達の場合はこれで解決できました。

# 対応方法

下記のように Gem File を編集して、bundle install 実行します。

```
-  remote: https://rubygems.org/
+  remote: http://production.cf.rubygems.org/
```


※本投稿は http://d.hatena.ne.jp/mabots/20150918/1442540816 を Advent Calendar にむけて再編したものです。
fenv.h を使うときは、FENV_ACCESSも指定する

# 概要
fenv.h を使うときは、FENV_ACCESSの指定も忘れないようにしましょう。

# fenv.h
浮動小数演算の丸めモードには、4つあって、

 * -∞ 方向への丸め(FE_DOWNWARD)
 * +∞ 方向への丸め(FE_UPWARD)
 * 0 方向への丸め(FE_TOWARDZERO)
 * 近い値への丸め(FE_TONEAREST)

fesetround()で設定できます。

しかし、fesetroundだけでは、完全にこの挙動を指定できるわけではないです。

というのは、コンパイラは、コンパイル時に定数の演算を終わらせてしまう最適化をする可能性があるためです。

```cpp
#include <fenv.h>
#include <stdio.h>

double get1() {
    return 1.0;
}

double get3() {
    return 3.0;
}

double f(void) {
    return get1() / get3();
}
int main() {
    fesetround(FE_UPWARD);
    printf("%a\n", f());

    fesetround(FE_DOWNWARD);
    printf("%a\n", f());

    fesetround(FE_TOWARDZERO);
    printf("%a\n", f());

    fesetround(FE_TONEAREST);
    printf("%a\n", f());
}
```

というようなコードを考えると、f()関数中の、1/3 という演算は本来なら丸めモードを参照しないといけないわけですが、コンパイル時に、1/3 の演算を済ませてしまうと、丸めモードを指定した場合の結果と変わってしまいます。

上のプログラムだと、-O0 と -O2 で結果が変わるのが確認できると思います。

    $ clang -std=c11 -O0 fenv.c -Wall -lm  
    $ ./a.out 
    0x1.5555555555556p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    $ clang -std=c11 -O2 fenv.c -Wall -lm  
    $ ./a.out 
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    $ gcc -std=c11 -O0 fenv.c -Wall -lm
    $ ./a.out 
    0x1.5555555555556p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    $ gcc -std=c11 -O2 fenv.c -Wall -lm
    $ ./a.out 
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2
    0x1.5555555555555p-2

というわけで、fesetroundを使った丸めモード指定を正しく使うなら、コンパイラによる最適化を抑制する必要があります。これを指定するのが、

```cpp
#pragma STDC FENV_ACCESS ON
```

というプラグマです。

上のプログラムをこのFENV_ACCESSを使うように書きかえると、

```cpp
double f(void) {
#pragma STDC FENV_ACCESS ON
    return get1() / get3();
}
```

    $ gcc -std=c11 -O2 fenv.c -Wall -lm
    fenv.c: In function ‘f’:
    fenv.c:13:0: warning: ignoring #pragma STDC FENV_ACCESS [-Wunknown-pragmas]
    #pragma STDC FENV_ACCESS ON
    ^

    $ clang -std=c11 -O2 fenv.c -Wall -lm
    fenv.c:13:14: warning: pragma STDC FENV_ACCESS ON is not supported, ignoring pragma [-Wunknown-pragmas]
    #pragma STDC FENV_ACCESS ON
                 ^
    1 warning generated.

GCC, clangではまだサポートされていないことが確認できますね。(完)
Android Wear でNotificationを表示する

## 検証環境  
XperiaZ1 (Android 4.4.2)
Sony SmartWatch3 (Android Wear 1.3.0.2160025, Android OS 5.1.1)  

## Notificationを投げてみた
適当にNotificationを作成し投げる

```
Intent intent = new Intent(getActivity(), MainActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(getActivity())
         .setContentTitle("新着メッセージがあります")
         .setContentText("xxさんからメッセージが届いています")
         .setSmallIcon(R.mipmap.ic_launcher)
         .setContentIntent(pendingIntent)
         .addAction(R.mipmap.ic_launcher, "返信", pendingIntent)
         .addAction(R.mipmap.ic_launcher, "転送", pendingIntent)
         .build();

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getActivity());
notificationManager.notify(0, notification);
```

すると母艦のスマホでは以下のようになります。
![Screenshot_2015-12-03-13-39-08.png](https://qiita-image-store.s3.amazonaws.com/0/102066/68bb5f82-7db8-9cde-2251-340998275867.png)

ではAndroid Wearの方ではどうなっているかというと
![device-2015-12-03-133959.png](https://qiita-image-store.s3.amazonaws.com/0/102066/d5058750-018d-49b7-7099-d717078486a8.png)  
![device-2015-12-03-134036.png](https://qiita-image-store.s3.amazonaws.com/0/102066/a81cdd38-09a0-3638-2840-6c8af70b7b9f.png)  
![device-2015-12-03-134055.png](https://qiita-image-store.s3.amazonaws.com/0/102066/4f7bf0cd-bf3e-2284-5b51-721cb78067d2.png)  
![device-2015-12-03-134103.png](https://qiita-image-store.s3.amazonaws.com/0/102066/bcec10be-3443-2da2-715e-3ffa67d0bc1d.png)  
![device-2015-12-03-134118.png](https://qiita-image-store.s3.amazonaws.com/0/102066/898fdb04-867f-6c34-d033-8da4d259e17a.png)  

addActionで設定したものがそのまま表示されます。
当然といえば当然ですが、Notificationに関してはAndroid Wear向けに処理を追加する必要はないようです。
A*の理論サラニチョットデキル - 大域許容性


# Globally Admissible Heuristics - 大域許容的ヒューリスティクス

この言葉、まだ教科書にも日本語文献にも出てきていないので、訳語は独自です。元々アイディアはあったのですが、今まで述べた内容とは矛盾するようなタイトルの論文、 Karpas, Domshlak, **Optimal Search with Inadmissible Heuristics.** 2012. *ICAPS* でまとめられた考え方です。

Globally Admissible heuristics は、 **一部の最適解を枝刈りしてしまうが、最低1つの最適解を残す** ようなヒューリスティクスです。例えばどんなヒューリスティクスがそれに当てはまるか?

例えば、探索空間の対称性という1つのテーマがあります。このような、スタートとゴールに対して対称な複数の経路のうち、1つの経路を除いて枝刈りする手法のことを、 *対称性の破壊* (symmetry breaking) とよびます。

![symmetry.png](https://qiita-image-store.s3.amazonaws.com/0/6090/8b11e558-843e-0176-34b8-29aa8ceb3bf8.png)

この枝刈りは、一件A*の範疇では捉えられないような気がします。しかし、「特定の条件の時に無限大の値を返すヒューリスティクス」というのを考えれば、このような枝刈りをA*の枠組みの中で考えることが出来ます。そのようなヒューリスティクスは、(なにしろ無限大なので) ゴールまでの真の距離h*よりも高い値をノードに割り振る**非許容的**なヒューリスティクスです。しかし、それが最適解を最低1つ残すのならば、これは大域許容的ヒューリスティクスとして意味のあるヒューリスティクスになります。

上の図は二次元なので、最大でも1つしか対称性は存在しませんが、高次元空間ではより多くの対称性があります。例えば、(0,0,0)-(1,1,1)の単位立方体の辺上で、(0,0,0)から(1,1,1)への最短経路は6本あります。

![cube.png](https://qiita-image-store.s3.amazonaws.com/0/6090/ad697129-ff52-f0f0-533f-226bb67328f3.png)

<sub>こぼれ話。空間の対称性を検知するためには、 *グラフ自己同型写像 (Automorphism) のなす群の生成集合* とかいうものを求める必要があるのですが、これは先日準多項式時間で解けることが話題になったグラフ同型問題(GI)より難しいことがわかっている(Luks 1993)ので、対称性検知を伴うヒューリスティクスは、一度計算するたびに難しい問題を解く事になります。PSPACE完全なグラフ問題を解くときには、ループを回すたびにNP完全な問題を解くのは別に普通の選択肢です</sub>

また、似ているが似ていない枝刈り手法として、Partial Order Pruningというものがあります。これも、この枠組みでは大域許容的ヒューリスティクスとして考えられます。

ということで、このようなクラスのヒューリスティクスは、非許容的であっても最適解を返せます。二日前の、「ユークリッド距離よりも優れたヒューリスティクス」の例はこれです。下界関数はまだまだ奥が深い!

# まとめ

大域許容的ヒューリスティクスの解説を行いました。
次回以降は、同様にヒューリスティクスを用いる探索手法として、A*の変種や、A*以外の探索手法を紹介したいと思います。
C3.jsで入力がjsonのときのdonut chartの書き方

この記事はACCESS Advent Calendar 6日目の記事です。
こんにちは ACCESS開発本部IoT開発部の加藤 (@aKenjiKato ) です。

C3.js で JSON入力でドーナッツチャートを書きたい、でもExample[^1]にないから描けない（＞＜）なんてことありますよね。 **ありますよね** 。

[^1]: http://c3js.org/examples.html

こう書けばOKです。

```js
// データ
// [{"key": value, ...}]で書く
var data = [{"あーりん": 20, "あーりんロボ": 80}];

c3.generate({
  data: {
    json: data,
    keys: {
      // dataに含まれるObjectのentryのうち、描画の対象としたいentryのkeyを指定する
      value: ["あーりん", "あーりんロボ"]
    },
    type: "donut"
  }
});
```

![スクリーンショット 2015-12-05 20.29.23.png](https://qiita-image-store.s3.amazonaws.com/0/37442/409d30cb-6568-d208-f9de-bbff8ea60d0b.png)

以下でお試しください
http://jsfiddle.net/unhynfoj/3/

以下を参考にしました

https://github.com/masayuki0812/c3/issues/430
http://jsfiddle.net/hQSSn/3/

明日も @aKenjiKato です。
よろしくお願いいたします。
かなキーを半角/全角（IM）切替キーに

## かなキーを半角/全角（IM）切替キーに

Dvorak Advent Calendar 6日目．

JIS配列キーボードにある，かなキーを半角/全角（IM）切替キーに変更しましょう．
文字入力時に左小指を伸ばして切り替える必要がなくなります．

なるべく指の移動距離を短くするのが快適な入力への近道です．
Gitのブランチを移動するときの裏ワザ

Gitでは、簡単にブランチを切れるようになっていますが、その中身を知れば、より便利に移動できます。なお、この投稿は[1分で実現できる有用な技術 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/one-minute)の1記事として投稿しています。

# Gitツリーの構造
ちょうど[Gitのアドベントカレンダーの投稿が参考になりますので](http://qiita.com/treby/items/e63d0c54d28d93f9f080)ので、詳細についてはそこを参照させていただく形にします。

こちらで必要な程度に要約すれば、

* コミットは、**それ自体が**過去のコミットとの関連情報を持っている
* 「ブランチ」と呼ばれるものも、自律的につながったコミットの**ある1箇所を指すポインタ**に過ぎない

ということです。

# 微妙に面倒な切り替え→マージ
よくある場面で、「Aブランチの後にBブランチが続いている状況で、BブランチをAブランチに追いつかせた上でチェックアウトしたい」というときがあります。素直にやれば、

* `git checkout b`
* `git merge a`

のようになりますが、いったんワークエリアをBのものに変更して、それからまたAの状態まで戻すというのは、（そこまで速度を食う場面も多くはないでしょうが）なんとも富豪的ですっきりしないものです。

# ブランチの位置だけずらす
そこで、[`git update-ref`](https://git-scm.com/docs/git-update-ref)というコマンドがあります。これを使えば、チェックアウトしない状態でもブランチの位置だけずらしてしまうことができます。

`git update-ref refs/heads/b HEAD`とすることであらかじめBのブランチを先頭までずらしておいて、それからチェックアウトすればワークエリアはそのままにチェックアウトできます。
24時間チャレンジ！1から出来るとこまでセルシェード

[Unreal Engine 4 (UE4) 其の弐 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ue4second)の12月6日の記事です。

# はじめに - 開始前
24時間使ってUE4上でセルシェードを構築していきたいと思います。
一項目ごとにこのページに追記していこうかと思います。細かい経過は（多分）[twitter:com04](https://twitter.com/com04)に。
事前テストをほぼ無しなので、ぐだぐだになったらすみません。

## 環境
- Unreal Engine 4.10.0
- Blender 2.76b

## UE4上のセルシェードについて
[（参考：過去に私が試した記事）](http://com04.sakura.ne.jp/unreal/wiki/index.php?%A5%BB%A5%EB%A5%B7%A5%A7%A1%BC%A5%C9)
下記の3種類があると思います。


### UE4 Editorそのものを改造する
レンダリング部分を弄ってセルシェードを実装します。多分これが一番製作者の意図通りに作れます。
しかし初回のセットアップが若干手間、詳しくない人には少し厄介なのと、バージョンアップする度にパッチを当てる事になったりすると思います。

- [もんしょの巣穴blog - [UE4] エンジンを改造してLUTテクスチャを使ったトゥーンシェーダを実装する方法](http://monsho.blog63.fc2.com/blog-entry-161.html#more)

### ポストプロセスマテリアルで実装
ポストプロセスで解決します。基本的にモデルの数が増減しても処理負荷は安定するので見積もりやすいです。
しかしマテリアル毎にセルシェードの影色を設定したい等が出来ないかと思います。

- [UE4 Forum - アンリアルエンジン4でノンフォトリアル描画しよう！](https://forums.unrealengine.com/showthread.php?88581-%E3%82%A2%E3%83%B3%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B34%E3%81%A7%E3%83%8E%E3%83%B3%E3%83%95%E3%82%A9%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E6%8F%8F%E7%94%BB%E3%81%97%E3%82%88%E3%81%86%EF%BC%81)

### マテリアルをUnlitにしてカラーをEmissiveに入れる方法
**今回は此方の方法でやります。**
Unlitでライティング無しなマテリアルに。Emissiveに値を入れると、UE4のライティングに影響を受けないマテリアルを作れます。
しかし自前でライティング計算を書かないといけないのと、Indirect等UE4のリッチなレンダリング機能が使用出来ず、旨味が減ります。

- [開発日誌 - 【UE4】セルっぽいルックを頑張ってみる その１（概要）](http://ogimafu.blogspot.jp/2015/03/ue4.html)

*** 
# 実装

Qiitaの画像容量の制限喰らいましたので、自前のwikiに移動しました。
　→　[Unreal Engine 4 (UE4) 其の弐 Advent Calendar 2015](http://com04.sakura.ne.jp/unreal/wiki/index.php?Unreal%20Engine%204%20%28UE4%29%20%C2%B6%A4%CE%C6%F5%20Advent%20Calendar%202015)

# 結果
- Before
![model_04.png](https://qiita-image-store.s3.amazonaws.com/0/58518/41bf245d-864d-1119-bb83-a5fd7576ed1e.png)

- After
![scene_02.png](https://qiita-image-store.s3.amazonaws.com/0/58518/068961ab-e3d2-ba23-b63c-94569e611c35.png)
モーションまで入れようとしたものの、リターゲットが上手くいかず断念。。。

# Advent Calendar
明日はもんしょさん( @monsho1977 )による「拡張したGBufferを使って異方性スペキュラをやります」になります。
異方性スペキュラ楽しそう！
$A.runの廃止と$A.getCallbackの注意点、およびちょっとした改善

経験豊かなSalesforceの開発者のみなさんは、止むに止まれぬ理由によりLightningコンポーネントの開発をする羽目になったとしても、不自由フレームワークから巧みに逃れ、巷で定評のあるオープンなフレームワーク／ライブラリを使用して生産性をガンガンに上げていらっしゃることでしょう。

さて、なぜそのような自由が謳歌できていたのかというと、Lightningフレームワークにはフレームワークの管理コンテキストの外からでもLightningの機能（サーバ呼び出しやイベントなど）を呼び出すことができる機能があったからです。これは`$A.run`という関数なのですが、Winter'16 から[$A.runが廃止され代わりに`$A.getCallback`を使うように](http://releasenotes.docs.salesforce.com/ja-jp/winter16/release-notes/rn_lightning_get_callback.htm)なりました。

しかしながら、まだ`$A.getCallback`の使い方は[マニュアルにちょっとあるだけ](https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/js_cb_mod_ext_js.htm)なので、どのようにしたらよいかわからない方も多いでしょう。

`$A.getCallback`は、単に`$A.run`の置き換えというわけではありません。ちょっと奇妙な制約が設けられています。これはLightningフレームワークのAura Loopという
ひどい
独特な設計が所以なのですが、そのことが分かるまで開発者はかなり苦労することになるでしょう。

例えば、5秒タイマーの後にLightningコンポーネントの属性をセットしたいとき、`$A.run`を利用した場合はこんな感じにしていました。

```js
window.setTimeout(function() {
    $A.run(function() {
       cmp.set("v.visible", true);
    });
}, 5000);
```

Lightningフレームワークでは、すべてのコンポーネント操作はAura Loopと呼ばれるコンテキスト内で行われる必要があるという
傲慢な
斬新な制約があるので、このような事を行う必要があるのです。おそらく`$A.run`の動きとしては、引数で受け取った処理を実行キューに入れて、次のAura Loopが回ってきた時に実行するように指定する、といったイメージが近いかもしれません。

一方、`$A.getCallback`は、関数を引数として受け取り、新たな関数を返す関数になっています。下はマニュアルにもあるコード例です。

```js
window.setTimeout(
    $A.getCallback(function() {
        if (cmp.isValid()) {
            cmp.set("v.visible", true);
        }
    }),
    5000
);
```

コンポーネントへのアクセスを実行する前に`cmp.isValid()`を呼び出して状態チェックが追加されていますが、そこは本題ではないのでとりあえずおいておきます。

マニュアル等には明示的に書かれていないのですが、もっとも重要な点は、**`$A.getCallback`を呼び出すときは、必ずAura Loopにはいっている必要がある**ということです。`$A.run`はどのコンテキストから呼んでも大丈夫でしたが、`$A.getCallback`はそうはいきません。

つまり、単に`$A.run`を置き換えるような以下のコードでは駄目ということです。実際実行するとエラーが発生します。

```js
window.setTimeout(function() {
    // この処理が実行されている時点ですでにAura Loopの外側になっているため、$A.getCallbackは利用できない
    $A.getCallback(function() {
       if (cmp.isValid()) {
            cmp.set("v.visible", true);
       }
    })();
}, 5000);
```

もちろん、コンポーネントにアクセスするのですからコールバック関数を生成するときはすでにAuraのコンテキストに入っている場合がほとんどかと思いますが、多段の非同期呼び出しコールバックが介在しているときにはすべての段でコールバック関数をWrapしていかなければいけません。

```js
getFooAsync($A.getCallback(function(foo) {
  getBarAsync(foo, $A.getCallback(function(bar) {
    getBazAsync(bar, $A.getCallback(function(baz) {
       if (cmp.isValid()) {
          cmp.set("v.foo", foo);
          cmp.set("v.bar", bar);
          cmp.set("v.baz", baz);
       }
    }));
  }));
}));
```

これはちょっと大変ですし、もう少し複雑になってくるとちゃんとすべての関数コールバックがトラックできているのかどうか不安になってくるでしょう。

しかたがないので、自作で`$A.run`相当を作ってみます。以下の`myAuraRun`関数は、`$A.run`と同様に、関数を引数として受け取り、処理をAura Loop内で実行します。

```js
  // 最初の定義はAura Loop内であることが前提
  window.myAuraRun = $A.getCallback(function(fn) {
    // getCallbackでwrapされた処理はAura Loop内で実行されるため、fnの実行もAura Loop内になる
    if (cmp.isValid()) { fn(); }
  });
  
  // 以下、Aura Loopの外から必要になった時の呼び出し方
  setTimeout(function() {
    window.myAuraRun(function() {
      cmp.set("v.visible", true);
    });
  }, 5000);
```

上記`myAuraRun`の定義自体は最初にAura Loop内でやっておく必要はありますが、定義された`myAuraRun`はAura Loop以外のどこから呼び出しても大丈夫になりました。めでたしめでたし？

というか、たとえ`$A.getCallback`の仕組みが内部的に必要になったのだとしても、上記の方法でちゃんと代替できるのに、なんでわざわざ`$A.run`を廃止したんでしょうかねえ。
DRYなMarkdownを書こう

あったらいいなと思って作っているMarkdown絡みのツールについて書きます。

## 作ってるのは、Markdown方言

Markdownって簡単に書けるのが気楽でいいですよね！
ただその反面、プログラマブルではないですよね。
あと、どうしても「これ！」といったMarkdownエディタ(ビューア)に出会えないですよね。

じゃあincludeとか埋め込み文字列に対応した方言作って、それを使えるエディタつくろうぜ！



と思ったのが **昨日**です。

## ドキュメント管理という闇

そもそも、みなさんは開発者向けのドキュメント管理、どうしていますか？

私は今のPJで構成管理者をさせてもらっているのですが、ドキュメント類はなるべくGitbucketに乗っけさせてもらっています。

>ドキュメント:
- 環境構築手順
- ソースのバージョンが新しくなった時テスターさんに実施してもらう手順 
- 新規着任した構成管理者向けのリリース手順 
- etc...

当然ですがWebで見れて、Markdownで簡単に書けるのでそれ自体は悪くないです。

ただこういうドキュメントって、最初に書く時はその時の最新手順やスクリプトをサクッと誰かに伝えるために書くのですが、激しく変わっていく手順に追いつけずに結局すぐに管理できない古い情報が入り混じったボロボロの情報のカタマリになりませんか？
シェルスクリプト化し終わった部分がドキュメントとして残ってたり、重複してたり不要になった手順が混じったり…。

少なくとも私はなってます。

## 手順書的なドキュメントのつらさ

新規着任したエンジニアさんやテスターさんには、システム要件を学んでもらいながら仕事をしてもらったりします。
そういう時は「上から順にバーっと実行すればとりあえずうまくいくよ」という手順書をまとめておいてそれを渡します。

ただ、それをドキュメント化しようとするとちょっとしんどい問題に出くわします。
それは、「ちょっとずつ異なる手順を何度も繰り返す」みたいな指示が必要な時です。

たとえば

1. Aをする。URLはexample.com/A
2. Bをする
3. Cをする
4. 1~3を繰り返す。 **ただしURLは変わる。また、Cの時だけは追加でC'という手順も行う。**

みたいなことをお願いしなきゃいけない時、これをそのまま書くとドキュメントの読みやすさは非常に残念な感じになります。何度も上に戻らなきゃいけなくて無駄に脳内メモリを食う作業になります。

じゃあベタ書きで手順1~9を書くかと言われると、若干2年弱の私でさえ「それはプログラマの仕事ではない…」と胸の奥がざわめきます。

## プログラマブルなMarkdown

そこで作ってるのが [markinc](https://github.com/0x9n/markinc/tree/master) です。名前はもう決まってます。

### できたいこと

- 外部化したテンプレート用Markdownファイルの読み込み
- テンプレートへの文字列埋め込み
- Markdownエディタ化
- テンプレート、文字列埋め込みを解決したMarkdownを出力

今ポチポチ作ってます。
advent calendarで成果を発表できないのが残念ですが…続報をお待ちください！

## 明日からの[tis advent calendar](http://qiita.com/advent-calendar/2015/tis)をお楽しみに！

明日は[enterprise1024](http://qiita.com/enterprise1024)氏です。
「The first step to become Arch-Excelist」ってありますし、Excelネタっぽいですね！
いやあ、SIer感漂ってますね！

その後にも、人工知能やインフラのコード化、機械学習…アツいテーマが目白押しです。
お楽しみに。私も楽しみです。
【vte.cx入門】5.登録したデータを参照する：jQuery実践編


[データ登録](http://qiita.com/takeyama/private/80669a5ccd65e77761a2)を行ったら、今度はそのデータを参照してみましょう。

ここではjQueryを利用したデータ参照の方法を以下に記します。

# 1.ajaxで登録データを取得する（GETリクエスト）
上記データをjQueryのajax通信を使用し、GETリクエストを実行します。

```lang:javascript
$.ajax({
	url: '/d/{uid}?f',
	method: 'get'
}).done(function(res) {
	alert('取得成功');
}).fail(function( jqXHR, textStatus, errorThrown ) {
	alert('取得失敗');
});
```
## ■リクエスト
| param | 値 | 例 |
|:-----------|:------------|:------------|
|url|取得先URL?f|/d/{uid}?f|
|method|GET||

#### uidの取得方法
以下のURLを画面で開いてください。すると自分のuidが取得できます。
※uidを取得するにはログインが必要です。

```
https://{自分のサービス}/d/?_uid
```
レスポンス

```
{'feed': {'title': (uid)}}}
```

取得したuidをurlに使用してください。

### URLパラメータ
URLにパラメータを付与することで、様々な検索ができるようになります。
・パラメータ一覧

| param | 値 |  |
|:-----------|:------------|:------------|
|?f|一覧取得|url配下のデータ一覧を取得する。|
|?e|自身取得|urlのデータ1件を取得する。|
|?x|XML変換|データをXML形式で取得する。|

その他詳しいパラメータの説明はこちらをご覧ください。[条件検索について](http://reflexworks.jp/documentation.html#taggingservice.html#G3)

## ■レスポンス
### ステータス

| ステータス | メッセージ | レスポンス |
|:-----------|:------------|:------------|
|200|OK|feed形式のデータ一覧|
|204|No entry|（空）|

204 No entryの場合は、取得先の配下に何も登録されていない状態です。
/d/{uid}にデータを登録してみましょう。（[データ登録方法](http://qiita.com/takeyama/private/80669a5ccd65e77761a2)）

その他のエラーの場合、以下の仕様書の下部に細かく記載されています。
[HTTPステータス一覧](http://reflexworks.jp/documentation.html#taggingservice.html#H)

# 2.?fパラメータで取得したデータ内容を確認する
?fパラメータを使用しajaxで取得したデータは以下のような内容になっていると思います。

```
{
  feed: {
    entry: [
      {
        userinfo: {
          id: 12345,
          email: hoge@foo.com
        },
        favorite: {
          food: 'りんご',
          music: 'J-POP'
        },
        id: '/{uid}/1-1-23-23123, 1'
      },
      {
        userinfo: {
          id: 98765,
          email: bor@foo.com
        },
        favorite: {
          food: 'バナナ'
        }
        id: '/{uid}/1-1-23-098123, 1'
      }
    ]
  }
}
```
このように?fを指定すると**URLの配下にある複数のentryが取得できます。**


# 3.?eパラメータで取得したデータ内容を確認する
一方で、?eパラメータを使用しajaxで取得したデータは以下のような内容になっていると思います。

リクエスト

```lang:javascript
$.ajax({
	url: '/d/{uid}?e',
	method: 'get'
}).done(function(res) {
	alert('取得成功');
}).fail(function( jqXHR, textStatus, errorThrown ) {
	alert('取得失敗');
});
```

レスポンス

```
{
  feed: {
    entry: [
      {
        link: [{
          ___href: '/{uid}',
          ___rel: 'self'
        }],
        id: '/{uid},1'
      }
    ]
  }
}
```
?eパラメータを指定すると**URL自身のentryが取得できます。**

# 4. HTML(JavaScript)によるデータ参照
取得したデータは既存のJSON形式と同じです。
以下のように値を参照できます。

```lang:javascript
var name = feed.entry[0].favorite.food
console.log('food : ' + food);
```
```lang:コンソール
food : りんご
```

以上でデータの取得方法の説明を終わります。

次回はデータの更新方法について記述いたします。
CircleCIのREST APIを使って少し便利にCircleCIライフを送る

本当はシークレットファイルのことを書こうと思ってたんですが
ネタが被ってしまったのでどうしようかと悩んだ結果
CircleCI用にシェルスクリプトに定義した関数を晒そうと思います。

かなり適当に書いたものなので、その筋の人が見たらマサカリ投げられそう((((゜゜))))

# 環境

OSXのEl Capitanで
zshで動かしてます
jqとpecoを使ってます。

CircleCIのSettingに行きAPI Tokenを作成しておきましょう

# project一覧を取得してブラウザで開く

```zsh
#!/bin/sh

CIRCLE_TOKEN="..."
CIRCLE_HOST="https://circleci.com/api/v1"

_circle_token="&circle-token=$CIRCLE_TOKEN"
open=$(which open)

function circle_projects() {
    url="$CIRCLE_HOST/projects?${_circle_token}"
    curl -s -H "Accept: application/json" $url | jq '.[] | "\(.username)/\(.reponame)"' | perl -nle '/^"(.+)"$/ and print $1'
}

function circle_open_project() {
    path=$(circle_projects | peco | awk '{print $1}')
    url="https://circleci.com/gh/$path"
    echo "open: $url"
    $open $url
}
```

CIRCLE_TOKENに作成したTokenを入れてください。

`circle_open_project`を叩けばプロジェクト一覧が取得されそれをpecoを使って検索できます。

地味に便利で重宝してます。

# 環境変数の操作

```zsh
function circle_env() {
    project=$1
    name=$2
    value=$3
    if [ ! -n "$project" ]; then
        echo "not project" > /dev/stderr
        return 1
    fi
    
    url="$CIRCLE_HOST/project/$project/envvar?${_circle_token}"

    if [ -n "$value" ]; then
        body="{\"name\":\"$name\",\"value\":\"$value\"}"
        curl -s -H "Accept: application/json" -H "Content-Type: application/json" -d $body $url > /dev/null
        echo ok
        return 0
    fi

    if [ -n "$name" ]; then
        method="GET"
        if [ "${name:0:1}" = ":" ]; then
            method="DELETE"
            name=${name:1:${#name}}
        fi

        url="$CIRCLE_HOST/project/$project/envvar/$name?${_circle_token}"
        res=$(curl -X $method -s -H "Accept: application/json" $url)
        if [ $method = "DELETE" ]; then
            echo ok
        else
            echo $res | jq .value | perl -nle '/^"(.+)"$/ and print $1'
        fi
        return 0
    fi
    
    curl -s -H "Accept: application/json" $url | jq '.[] | "\(.name) \(.value)"' | perl -nle '/^"(.+)"$/ and print $1'
}

```

使い方は第一引数に`user/repo`の組み合わせを指定し

一覧を見るときは `circle_env user/repo`
値をセットするときは `circle_env user/repo FOO bar`
値を削除するときはKeyの先頭にコロンをつけて `circle_env user/repo :FOO`

という感じです。

隠したいファイルは
`circle_env k2wanko/gtoken SECRET_FILE $(base64 ./secret_file)`
で値をセットでき
circle.ymlに
`echo $SECRET_FILE | base64 -D > ./secret_file`
を追加すればデコードできます。

# まとめ

ファイル全体はgistに上げました
https://gist.github.com/k2wanko/a4ad5c3b903f68f194b1

まだ無料版しか試せてないのでこんなぐらいですが
CircleCIはプライベートリポジトリとか関係なく利用できるし
ハイスペックなマシンで実行されるしSSHも繋がるのでポートフォワーディングすれば
httpサーバーにもアクセスできるので最高のCIサービスだと思います。
外部APIを使うController用のTest Doubleライブラリを書いた 

Goで `net/http` を使ったControllerのテストには、 `net/http/httptest` モジュールを使うと擬似的にサーバをその場で立て、登録したハンドラにリクエストを送れます。
ただ、APIに使うアクションはたびたび、外部のAPIを叩くこともあります。
その際、テストを実行するときに外部APIを使えない状況(本番環境とは違う状況、例えば、production用のAPIの発行には金銭が発生するなど)に遭遇します。

## Test Double

そんなときに知られているテクニックとして、テスト時に外部APIへのリクエストをDouble(Stub)することです。
その外部APIが返却するであろう期待値を登録しておけば正常ケースを、エラー値を登録しておけばエラーケースをテストできます。
ここで例に挙げるStubする方法は、 `http.Client` をもとにHTTPリクエストすることを前提としています。

ではどうやってリクエストをStubすれば良いでしょうか?
`net/http` でのhttp clientでは、 `RoundTripper` というインタフェースを軸にHTTPコネクションを制御しています。
https://github.com/golang/go/blob/master/src/net/http/client.go#L41

そこで、このRoundTripperをテスト時にすげ替えてあげれば良いわけです。
RoundTripperは、 `*http.Request` を受け取り `*http.Response` を返す、RoundTrip関数を充足すれば良いことがインタフェースの定義からわかります。
https://github.com/golang/go/blob/master/src/net/http/client.go#L99

次のコードは `http://example.com/api/test` へのリクエストをStubするコードです。
レスポンスのbodyがJSONで、ステータスが200であることを想定しています。

```
type MyTransport struct {}

func (t *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
	if req.URL.String() == "http://example.com/api/test" {
		resp := &http.Response{
			Header:     make(http.Header),
			Body:       ioutil.NopCloser(strings.NewReader(`{"api":"test"}`)),
			StatusCode: http.StatusOK,
		}
		resp.Header.Set("Content-Type", "application/json")
		return resp, nil
	} else {
		return http.DefaultTransport.RoundTrip(req)
	}
}

func TestApi(t *testing.T) {
	http.DefaultClient.Transport = &MyTransport{}
	defer func() {
		http.DefaultClient.Transport = nil
	}()

	ts := httptest.NewServer(http.HandlerFunc(api))
	defer ts.Close()

	res, err := http.Get(ts.URL)
	if err != nil {
		t.Error("unexpected", err)
	}
	defer res.Body.Close()

        //...
}
```

ここで重要なのは、テスト対象のURLのみをstubしていることです。
それ以外のURLへのリクエストは、 デフォルトのRoundTrip関数が定義されている `DefaultTransport` を使います。
その理由として、テスト時に外部APIへのリクエストだけではなく、ローカルのテストサーバへのリクエストもstubされてしまうからです。
また、DefaultClientのTransportもテスト終了後nilで初期化しておかないと後続のテスト時にStubの設定が残ったままになることになるので注意するところです。

## ライブラリ化

毎回テスト時にこういったコードを書くのは煩雑になるので、簡単にラップしたものを作りました。

https://github.com/yoppi/gg

使い方は簡単です。先ほどのテストコードが次のようになります。

```
func TestApi(t *testing.T) {
	double := gg.Double(map[string]*gg.ResponseHandler{
		"http://example.com/api/test": &gg.ResponseHandler{
			HandleFunc:  apiResponseHandler,
			Status:      http.StatusOK,
			ContentType: "application/json",
		},
	})
	defer double.Close()

	ts := httptest.NewServer(http.HandlerFunc(api))
	defer ts.Close()

	res, err := http.Get(ts.URL)
	if err != nil {
		t.Error("unexpected", err)
	}
	defer res.Body.Close()

        // ...
}
```

URLに対して、処理させたいHandlerとHTTP Status、Content-Typeを登録しておくシンプルな作りです。
複数のURLも登録できるのでわりと汎用的に使えるインタフェースになっているかなと思います。

## まとめ

今回は、HTTPリクエストにおけるTest Doubleの一手法を紹介しました。
なんでも適用すると思わぬところでテストが機能しなくなることがありますが、有用な手段な場合もあると知っておくとユニットテストが書きやすくなります。
CentOS7.1 NFSサーバ、クライアントの設定

#概要
CentOS7.1を使用して、NFSサーバ・クライアントを構築します。

・NFSサーバ
　ホスト名：CentKun
　IPアドレス：192.168.184.3

・NFSクライアント
　ホスト名：CentChan
　IPアドレス：192.168.184.4

#NFSサーバの設定
NFSサービスのインストール

```
# yum -y install nfs-utils
```

エクスポートポイントの作成

```
# mkdir /mnt/nfsserv/
```

テストファイル作成

```
# vi /mnt/nfsserv/text.txt
```

エクスポートポイント(NFS用の共有)設定
とりあえずテスト環境なので、誰でも触れるようにしてみる

```
# vi /etc/exports
/mnt/nfsserv/ *(rw,async,no_root_squash)
```


サービスを起動して有効化します。

```
# systemctl start rpcbind
# systemctl start nfs-server
```

OS起動時に自動的に有効にするコマンド

```
# systemctl enable rpcbind
# systemctl enable nfs-server
```


memo

RedHatのマニュアルにRDMA(CPUを介さないでメモリ直接アクセス？)のインストールが載っています。
RDMAを有効にすると、NFSのアクセス性能の向上が期待できるみたいなので、いずれ調べます。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Storage_Administration_Guide/nfs-serverconfig.html

RDMA速度検証
http://blog.systemworks.co.jp/?p=1473


#NFSクライアントの設定
NFSサービスのインストール

```
# yum -y install nfs-utils
```

マウントポイントを作成

```
# mkdir /mnt/nfsclient/
```


サービスを起動して有効化します。

```
# systemctl start rpcbind
```

NFSv3でマウント
オプションを付けないとNFSv4でマウントします。

```
# mount -t nfs -o vers=3 192.168.184.3:/mnt/nfsserv/ /mnt/nfsclient/
```

失敗！ -v を付けると、詳細がわかる

```
# mount -v -t nfs -o vers=3 192.168.184.3:/mnt/nfsserv/ /mnt/nfsclient/
mount.nfs: timeout set for Mon Nov 23 10:26:14 2015
mount.nfs: trying text-based options 'vers=3,addr=192.168.184.3'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: portmap query failed: RPC: Remote system error - No route to host
mount.nfs: trying text-based options 'vers=3,addr=192.168.184.3'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: portmap query failed: RPC: Remote system error - No route to host
```


No route to host と出ているので、ファイアウォールが怪しい。

CentOS7.1ではデフォルトでfirewalldが起動している。
CentOS6ではiptablesを使用するのが一般的だったけど、
7以降ではfirewalldを使用するのがわかりやすいみたい？

参考
http://www.unix-power.net/centos7/firewalld.html

NFSサーバー側でも、NFSクライアント側でもfirewalldが起動中だったので、
停止して再チャレンジしてみる。

```
# systemctl stop firewalld
```

マウント再チャレンジ

```
# mount -v -t nfs -o vers=3 192.168.184.3:/mnt/nfsserv/ /mnt/nfsclient/
mount.nfs: timeout set for Mon Nov 23 10:26:38 2015
mount.nfs: trying text-based options 'vers=3,addr=192.168.184.3'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.184.3 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.184.3 prog 100005 vers 3 prot UDP port 20048
```

NFSサーバ側で作成したテストファイルが見れるか確認

```
# cd /mnt/
# cd nfsclient/
# ls -la
合計 4
drwxr-xr-x. 2 root root 21 11月 22 23:50 .
drwxr-xr-x. 3 root root 22 11月 23 09:40 ..
-rw-r--r--. 1 root root 15 11月 22 23:50 test.txt
#
#
# cat test.txt
test file desu
```

見れた！！
プラグインインストール/削除/更新/有効化/無効化時に呼ばれる関数に関して

私がEC-CUBE3をどのように勉強したか？
というのを書いていたのですが、本日中に間に合わなさそうなので、
別の記事を投稿します。
（当初の記事は完成次第また投稿します。）


で、、、
メインの話です！



ECCUBE3プラグインのインストール/削除/更新/有効化/無効化時に
呼ばれる関数に関してメモしておきたいと思います。

結論から言うと、
プラグインのインストール等の際に呼ばれる関数には、<b>「1対多」</b> などもあるようです。

■前提
まず、前提の話として、、
プラグインのインストールや更新などを行うとPluginManager.php内の関数install/disableなどが呼ばれます。
install等の関数内では特定の処理（主にDB操作、ファイル移動などの）

■本題
当初、アンインストール時はuninstallが呼ばれるのような形で、
操作に応じて呼ばれる関数が1対1だと思っていたのですが、
1対1 or 1対多のどちらのパターンもあるようです。
以下検証結果です。
プラグイン作成時、どのような動きがされるのか意識して作成したほうがよさそうです。
★の箇所が注目ポイントです。

----------------------------------------------------------------
■インストール実施
インストール
■（有効状態）削除　←★無効化が呼ばれるみたい
無効化→アンインストール
■（無効状態）削除　←★すでに無効状態でも、無効化が呼ばれるみたい
無効化→アンインストール
■無効→有効
有効化
■有効→無効
無効化
■（無効状態）更新　←★更新は更新だけみたい
更新
※configのversionをあげて更新を実施
■（有効状態）更新）
更新
※configのversionをあげて更新を実施

----------------------------------------------------------------
ソースを自体を読もうと思ったのですが、
深みに入っていきそうだったので、今回は動作検証しかやってません。


みなさんプラグイン作成時は、呼ばれる対象の関数・順序にご注意ください。


12/6は、 @Yangsin さんです！

よろしくお願いします！
[SoftLayer] イメージ・インポート機能によるサーバー移行（番外編）

このブログは、 SoftLayer Advent Calendar 2015に投稿してます。
http://qiita.com/advent-calendar/2015/softlayer

SoftLayerにはイメージ・インポート機能があります。
標準機能を利用しESXiで稼働する仮想サーバー（WindowsServer2008R2)を移行してみました。
**[前回](http://qiita.com/sasazawa/items/c62a8a039e4dad850a75)**ご紹介した方法とは別に **番外編** としてVMwareのOVFエクスポート機能とXenConvert2.1.1により移行しております。
今回の方法は移行元サーバーへツールを導入しないというメリットがあり、既存環境へ影響を最小限にすることができます。
SoftLayerイメージ仕様やObjectStorage準備は以前寄稿したリンク先をご参考にしてください。


**移行ステップ**
　1.vmwareエクスポート
　2.Xen ConvertでVHD変換
　3.VHDをObject Storageへアップロード
　4.イメージ・インポート
　5.デプロイ
　6.ドライバの更新

# １．vmwareエクスポート

vmware標準のOVFエクスポートでvmdkファイルを出力する。
![1-4.png](https://qiita-image-store.s3.amazonaws.com/0/59647/4f658951-a5be-94a3-4fa5-3ce9a3842182.png)


# ２．Xen ConvertでVHD変換
・今回のXen Convertバージョン2.11を利用しました。
・XenConvertのウィザードに従いVMDKをVHDへ変換します。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/59647/3eafb492-3483-6ff5-baa5-c3a3087184ba.png)

・Source：OVFエクスポートで出力したVMDKファイル、Destination：VHD出力先ディレクトリを指定します。
ご参考：VMDK（サイズ10,569MB）がVHD（サイズ20,976MB）になりました。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/59647/22d8f059-ad2b-b2b5-c841-de6d62baa1f7.png)



# 3．VHDをObject Storageへアップロード
・CloudBerry Explorerを利用してObject Storageへアップロードしました。
　詳細は**[【準備編】 3.VHDをObjectStorageへアップロードを参照](http://qiita.com/sasazawa/items/c62a8a039e4dad850a75)**下さい。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/59647/ae31ba27-b5e9-efc4-2155-cc04c302abd5.png)



# 4.イメージ・インポート
・ObjectStorageを指定しVHDファイルを指定します。
　詳細は**[【準備編】4.イメージ・インポートを参照](http://qiita.com/sasazawa/items/c62a8a039e4dad850a75)**下さい。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/59647/02de954e-58ee-23ef-0b71-74b1c77c5073.png)

# 5.デプロイ
・インポート・イメージより仮想サーバをオーダーする。
　詳細は**[【デプロイ編】5.デプロイを参照](http://qiita.com/sasazawa/items/b38c185863f642fcb710)**下さい。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/59647/4b599d5c-362a-479b-0989-89d45cf2438d.png)

![17.png](https://qiita-image-store.s3.amazonaws.com/0/59647/26430f42-d690-43f7-92f1-f616a2dce45b.png)

# 6.ドライバの更新
・初回起動時は、予期せずシャットダウンが表示されます。
　Xentoolsのインストールによりドライバーを更新してください。
　詳細は**[【デプロイ編】6.ドライバ更新を参照](http://qiita.com/sasazawa/items/b38c185863f642fcb710)**下さい。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/59647/b2e6bed5-b1d9-757d-5b64-80f1df7e1125.png)

# ご参考
　・KnowledgeLayer（Import an Image）
　　http://knowledgelayer.softlayer.com/jp/procedure/imezinoinpoto

　・Xen Convert2.1.1 Download 
　　http://downloadns.citrix.com.edgesuite.net/4812/XenConvert_Install_x64.exe

　・Xen Convert2.1.1 Guide
　　http://support.citrix.com/article/CTX121646
Zabbix NTP監視テンプレートのご紹介　～Zabbix Share への登録の仕方～

*Zabbix Advent Calendar 2015の5日目です。*
#Zabbix Shareとは
Zabbixのテンプレートや、ノウハウ、モジュールなどの共有を目的としたユーザーサイトです
*Zabbix SIAによるサポートサイトではありません*
https://share.zabbix.com
<img width="945" alt="2015-12-05_21h08_35.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/9218ec49-6c6f-851c-a6e6-d82f7957f896.png">

##ログインはSNS
Zabbix Share 自体にはユーザ情報が保存されません。
右上の[Log in] をクリックするとSNSとの連携ボタンが表示されます。
<img width="424" alt="2015-12-05_21h08_48.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/09757bde-f873-ab8e-51dd-ced6b9c54386.png">
ユーザ情報はSNSの情報が連携されるため、Zabbix Share自体には残りません。
別途必要な入力項目もありません。

##テンプレートの投稿
###検索
Zabbix Share ではすでに全世界からテンプレートが投稿されていますので、重複するテンプレートが無いか確認しましょう。
今回は自宅ラック勉強会で作成したNTPテンプレートを投稿したいと思いますので、NTPで検索します。
<img width="606" alt="2015-12-05_21h10_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/df2bf84a-b4af-b092-7c0b-be7a7d00be57.png">
3件のテンプレートが見つかりましたが、監視項目数や解説が自宅ラック勉強会の物に比べて少なく、単純なテンプレートのようですので、投稿することにします。
###投稿
左ペインから、登録したいカテゴリを選択します。
NTPテンプレートはApplicationsに登録したいと思います。
カテゴリを登録する場合は[Add Category]を
テンプレートを登録する場合は[Add New Listing]をクリックします。
なお、[Add Category]の場合は管理者による承認が必要です。

投稿するときは、
タイトル、概要、サポートする最小のZabbixバージョン、アイテムタイプ、テンプレートファイル、スクリーンショットなどが必要です。
投稿はバージョン管理されるため、テンプレートを修正した場合などは、新規投稿ではなく、既存の投稿を修正するようにしましょう。

#NTPテンプレート
今回は、英語版、日本語版のNTPテンプレートを投稿しました。
https://share.zabbix.com/owner/li_GGKiuT6LNj
<img width="629" alt="2015-12-05_23h52_36.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/4de35ecb-ac6a-2d1a-2e00-80a06c1f34da.png">

このテンプレートでは、NTPの精度情報、参照先NTPサーバなど
ntpqによって表示されるすべての情報を個別のアイテムとして収集することができます。

実際にうるう秒挿入の際には、50ms以上の時刻同期ズレとして
検知することができました。
ぜひご利用ください。
CentOS7.1 SSH接続許可(rootユーザ)

#概要
CentOS7.1のSSHログインを許可します。
通常はrootでのログインは許可しませんが、評価環境なので許可にします。

#手順
CentOS7.1では最小限のインストールでも、opensshがデフォルトでインストールされているため、
/etc/ssh/sshd_config を編集すればログイン可能になります。


```
#vi /etc/ssh/sshd_config
```
![SnapCrab_2015-11-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/104247/85dbb711-dfe7-5503-2122-36a18c9379f3.png)


行番号が分らないので表示させます。

```
:set number
```
![SnapCrab_2015-11-22_No-01.png](https://qiita-image-store.s3.amazonaws.com/0/104247/4110c23f-136b-373f-4135-c3d3d028dbb7.png)

表示されました
![SnapCrab_2015-11-22_No-02.png](https://qiita-image-store.s3.amazonaws.com/0/104247/c037f4c8-8760-8945-25ba-fc566de1b299.png)

49行目にあるコメントを解除します。
PermitRootLogin yes
![SnapCrab_2015-11-22_No-03.png](https://qiita-image-store.s3.amazonaws.com/0/104247/bcb72c48-106f-f613-737f-11407d25b8c0.png)

78行目付近を以下のものに変えます。
PermitEmptyPasswords no
PasswordAuthentication yes
![SnapCrab_2015-11-22_No-04.png](https://qiita-image-store.s3.amazonaws.com/0/104247/aa9d4d76-6ffa-065e-eb3d-41388361b0a9.png)

:wq で上書き保存
![SnapCrab_2015-11-22_No-05.png](https://qiita-image-store.s3.amazonaws.com/0/104247/48da9ec7-746a-9802-0be8-3fc9d7ca4dd6.png)

サービスの再起動をすると有効になります。
ステータスを表示し、active (runnning) となっていれば問題ありません。

```
# systemctl restart sshd
# systemctl status sshd
```
![SnapCrab_2015-11-22_No-06.png](https://qiita-image-store.s3.amazonaws.com/0/104247/e7a06a8d-72cb-7494-6814-0313ee55e338.png)
![SnapCrab_2015-11-22_No-07.png](https://qiita-image-store.s3.amazonaws.com/0/104247/d7bb7d7f-6c73-93c0-2df4-a5c3e515caf6.png)
![SnapCrab_2015-11-22_No-08.png](https://qiita-image-store.s3.amazonaws.com/0/104247/aee4061c-8e1a-8253-8f64-ca0cc7c7e580.png)

ログインできました！
![SnapCrab_2015-11-22_No-09.png](https://qiita-image-store.s3.amazonaws.com/0/104247/4721627b-5ad0-3fd0-7916-b83bd8aa2b16.png)
Mapbox GL JSでマーカーを色分けする方法の巻

結論から言いますとフィルタが使えます…！

![image](https://qiita-image-store.s3.amazonaws.com/0/32894/cd5ad004-1899-9328-b57d-cf9e9aab25cf.png)

という感じになります。

例によって、実際に動くデモは http://tottori.2574.jp で公開しています。またソースコードも https://github.com/mh61503891/2574 に公開しています:laughing: 

ここから詳細です。

Mapbox **GL JS**では無くて、Mapbox **JS**を使う場合は[Leaflet](http://leafletjs.com/)がJeoJSON内の`properties`にある`marker-color`を見てマーカーに色を自動的につけてくれる（[Load GeoJSON | Mapbox](https://www.mapbox.com/mapbox.js/example/v1.0.0/load-geojson/)）のですが、Mapbox **GL JS**の場合はそうはいかないみたいで、Mapbox GL JSの[Examples](ttps://www.mapbox.com/mapbox-gl-js/example/)にもそれっぽいやり方が無かったので、どうしようかなと思っていたのですが、[フィルタ](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)を使えばできるみたいです。

基本的には、`GeoJSONSource`で大元のデータソースのインスタンスを作って、作ったデータソースを参照するレイヤにフィルタを付けてデータを拾い出したやつに色をつけると良いようです。複数の色に分けたい場合は複数のレイヤを作るみたいです。他に良い方法あるのかな…。

ソースコードの要所をピックアップします。

例えば[data.geojson](https://raw.githubusercontent.com/mh61503891/2574/master/public/data.geojson)のようなGeoJSONのデータの場合、`filter: ['==', '事故内容', '軽傷事故']`とすれば、GeoJSONの`features.properties`の中の`事故内容`が`軽傷事故`のデータだけ選んで表示してくれます。他にも比較演算子がいろいろ使えるようです。詳しくは[Mapbox / Style Reference / Types / Filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter)を参照してください。

（※今回からCoffeeSriptに書き換えました:coffee:）

```coffeescript
map = new mapboxgl.Map {
  container: 'map'
  style: 'mapbox://styles/mapbox/streets-v8'
  center: [133.842941, 35.375086] # 鳥取県の中心らへん
  zoom: 8
}

# データソースのインスタンス
source = new mapboxgl.GeoJSONSource {data: 'data.geojson'}

map.on 'style.load', ->
  # ここからバッチ処理
  map.batch (batch) ->
    map.addSource('markers', source)
    map.addLayer {
      source: 'markers'
      id: 'markers-a'
      type: 'circle'
      paint: {
        'circle-radius': 8
        'circle-color': '#DBC300'
      }
      filter: ['==', '事故内容', '軽傷事故']
    }
    map.addLayer {
      source: 'markers'
      id: 'markers-b'
      type: 'circle'
      paint: {
        'circle-radius': 8
        'circle-color': '#FF9807'
      }
      filter: ['==', '事故内容', '重傷事故']
    }
    map.addLayer {
      source: 'markers'
      id: 'markers-c'
      type: 'circle'
      paint: {
        'circle-radius': 8
        'circle-color': '#FD3E00'
      }
      filter: ['==', '事故内容', '死亡事故']
    }
```

それで、このフィルタが使えるっぽいことが分かったきっかけは、[Mapbox Studio](https://www.mapbox.com/mapbox-studio/)を使ってみて、設計からしてそうなってそうだという推察ですね。雰囲気大事です。
grapeでapiのversion管理


# はじめに
ruby on railsでRESTfulなapiを作成するのにgrapeを使った際に
apiのversionを管理する方法について書きます。

# 要件
1. ディレクトリでversion毎のコードを分けたい。(写真参照)
2. モジュールの設定をなるべくわかりやすくしたい。
<img width="256" alt="スクリーンショット 2015-11-30 18.38.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/25918/72df966a-f85f-db1f-c91c-27c470ad8504.png">

# 実現方法概要
1. MyAPIモジュールというapiを管理するモジュール
2. MyApi::API(api.rb)というクラスをベースとして、v1やv2をマウントする。
3. MyApi::APIクラスにて共通の処理をヘルパーに入れる。
4. v1.rb or v2.rbでそれぞれのバージョンで利用するapiをマウントする。
5. /v1 or /v2にそれぞれのバージョンで使うapiのソースコードを置く

# ソース
```rb:config/routes.rb
Rails.application.routes.draw do
  mount MyApi::API => '/'
end
```

``` rb:app/api/my_api/v1(v2).rb
module MyApi
  class V1 < Grape::API
    prefix 'api'
    format :json
    default_format :json
    version 'v1', using: :path
    default_error_status :'500'

    mount Dummy
  end
end
```

``` rb:app/api/my_api/v1(v2)/dummy.rb
class MyApi::V1::Dummy < Grape::API
  #http://qiita.com/yimajo/items/d4f484deda7cb9f61a49
  format :json

  resource :versions do
    get do
      'version 1'
    end
  end
end
```

# 注意点
注意点というか、まだrails始めたばかりでモジュールとかよくわかってなくてハマったこと。
モジュール構造はディレクトリ構造と紐づけないと動かない。
例えば、上記においてmy_apiディレクトリを用意せずその他すべてを/app/api直下に置いた場合
```uninitialized constant MyApi (NameError)```
というエラーで```$rails s```がエラーになる。
[モジュールとかの参考ページ](http://qiita.com/blueplanet/items/522cc8364f6cf189ecad)
java.util.Arrays#asList の返り値は ArrayListだけど java.util.ArrayList ではない

# はじめに
java.util.Arrays#asList 便利ですよね。
でも、このメソッド落とし穴があるんです。

# 落とし穴
java.util.Arrays#asList の返り値のクラス名は ArrayList だけど
java.util.ArrayList ではないんです。

なのでArrayListのつもりで使うとびっくりするようなところでエラーになります。
要注意ですよ。。。
仮想マシンをクローン VMware Workstation Pro 12

#概要
VMware Workstation Pro 12を使用して、仮想マシンをクローンします。
仮想マシン：CentOS7.1

#仮想マシン複製とは
VMwareを使用した仮想マシンのクローンには2種類方法があります。
・リンククローン
・完全クローン

リンククローンは、コピー元である親仮想マシンと、仮想ディスクを共有する方式です。
完全クローンは、仮想ディスクを共有しない方式です。

完全クローンの方は仮想マシンのパフォーマンスが良いといわれておりますが、コピー時間がかかります。
リンククローンはコピー時間はそんなにかかりませんが、パフォーマンスが落ちるといわれております（親仮想マシンが壊れるとリンククローンの仮想マシンも壊れるデメリットもあり？）



今回は完全リンククローンで仮想マシンを複製する方法をまとめます。
コピー元とコピー先で、IPアドレスを固定していたら、重複してしまうので注意です。
DHCPならば問題ありません。


#手順
- 仮想マシンの完全クローン

VMware Workstation 上でコピーしたいマシンを選択して、
「管理」　→　「クローン」を選択します。
![SnapCrab_2015-11-21_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/104247/2fdf0446-abe1-f278-17f7-5acbb08547fd.png)

ウィザードが開きます。
![SnapCrab_2015-11-21_No-01.png](https://qiita-image-store.s3.amazonaws.com/0/104247/c45c888b-3a58-2a13-8759-c0f9c78a52a2.png)

スナップショットを作成していないので、現在の状態からクローンします。
![SnapCrab_2015-11-21_No-02.png](https://qiita-image-store.s3.amazonaws.com/0/104247/9c7d32eb-cb62-8807-7530-d28e46fcb09e.png)

今回は完全クローンで作成します。
![SnapCrab_2015-11-21_No-03.png](https://qiita-image-store.s3.amazonaws.com/0/104247/1a9e7073-8b45-70c3-71e2-593eb7095478.png)

CentKun から CentChan を作成します(｀'-'´)
![SnapCrab_2015-11-21_No-04.png](https://qiita-image-store.s3.amazonaws.com/0/104247/ae9f5df8-6625-d3c4-cef7-278728f30c7d.png)


![SnapCrab_2015-11-21_No-05.png](https://qiita-image-store.s3.amazonaws.com/0/104247/fdd8badd-88c8-14c8-73bd-f152f260d866.png)

完全クローンが完了しました。
![SnapCrab_2015-11-21_No-06.png](https://qiita-image-store.s3.amazonaws.com/0/104247/2558a323-f07b-7124-0c52-679519bbc1ea.png)

- 仮想NICを有効化

CentChanを起動すると、仮想NICgがdisconnected になっていました。
![SnapCrab_2015-11-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/104247/5d51304d-af69-0b6a-1860-8aab4286ddf8.png)

```linux:GUIを使用したネットワーク設定
#nmtui
```
nmtuiコマンドで接続を有効にします。
![SnapCrab_2015-11-22_No-03.png](https://qiita-image-store.s3.amazonaws.com/0/104247/6d0be826-e2dc-9f47-0f19-b292e748ff27.png)

コマンドを実行すると、青い画面になります。「Activate a connection」を選択します。
![SnapCrab_2015-11-22_No-04.png](https://qiita-image-store.s3.amazonaws.com/0/104247/d769c12d-da31-9f52-21a3-5c3345f35ca0.png)

「eno16777736」を選択して、「Activate」選択します。
![SnapCrab_2015-11-22_No-05.png](https://qiita-image-store.s3.amazonaws.com/0/104247/3047f882-d56c-d17d-c00d-b02c1a02ff48.png)

nmtuiから抜けると、接続されています。
![SnapCrab_2015-11-22_No-06.png](https://qiita-image-store.s3.amazonaws.com/0/104247/90875870-124c-d07a-72b2-4be8353ebafc.png)
sql-formatterでSQLを整形する

sql-formatterというPHP製のフォーマッターがあり、コマンドラインからも使える。

* [SqlFormatter](http://jdorn.github.io/sql-formatter/)

composerでインストールするためにまず、composerをインストールする[^1]。
例えば、`$HOME/bin`にインストールしたい場合は以下のとおり。

```
$ curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off -- --install-dir=$HOME/bin --filename=composer
```

次にcomposerでsql-formatterを`COMPOSER_HOME`（デフォルトでは`$HOME/.composer`）にインストールする[^2]。
最新のをインストールするためにdev-masterを指定する。

```
$ composer global require jdorn/sql-formatter:dev-master
```

PATHを設定する

```
$ export PATH="$HOME/.composer/vendor/bin:$PATH"
```

sql-formatterの引数または標準入力にSQL文を渡すとフォーマットされる。

```
$ sql-formatter "SELECT DATE_FORMAT(b.t_create, '%Y-%c-%d') dateID, b.title memo
    FROM (SELECT id FROM orc_scheme_detail d WHERE d.business=208
    AND d.type IN (29,30,31,321,33,34,3542,361,327,38,39,40,41,42,431,4422,415,4546,47,48,'a',
    29,30,31,321,33,34,3542,361,327,38,39,40,41,42,431,4422,415,4546,47,48,'a')
    AND d.title IS NOT NULL AND t_create >=
    DATE_FORMAT((DATE_SUB(NOW(),INTERVAL 1 DAY)),'%Y-%c-%d') AND t_create
    < DATE_FORMAT(NOW(), '%Y-%c-%d') ORDER BY d.id LIMIT 2,10) a,
    orc_scheme_detail b WHERE a.id = b.id"
SELECT
  DATE_FORMAT(b.t_create, '%Y-%c-%d') dateID,
  b.title memo
FROM
  (
    SELECT
      id
    FROM
      orc_scheme_detail d
    WHERE
      d.business = 208
      AND d.type IN (
        29, 30, 31, 321, 33, 34, 3542, 361, 327,
        38, 39, 40, 41, 42, 431, 4422, 415, 4546,
        47, 48, 'a', 29, 30, 31, 321, 33, 34, 3542,
        361, 327, 38, 39, 40, 41, 42, 431, 4422,
        415, 4546, 47, 48, 'a'
      )
      AND d.title IS NOT NULL
      AND t_create >= DATE_FORMAT(
        (
          DATE_SUB(NOW(), INTERVAL 1 DAY)
        ),
        '%Y-%c-%d'
      )
      AND t_create < DATE_FORMAT(NOW(), '%Y-%c-%d')
    ORDER BY
      d.id
    LIMIT
      2, 10
  ) a,
  orc_scheme_detail b
WHERE
  a.id = b.id
```

vim上でgqオペレータを使って整形をしたい場合は、`~/.vim/ftplugin/sql.vim`に

```vim:~/.vim/ftplugin/sql.vim
setlocal formatexpr=
setlocal formatprg=sql-formatter
```

と書いておいて、全体を整形したい場合は`gggqG`、ビジュアルモードで選択した部分だけ整形したい場合は該当箇所を選択して`gq`などしてやる。

[^1]: [Introduction - Composer](https://getcomposer.org/doc/00-intro.md)
[^2]: https://getcomposer.org/doc/03-cli.md#composer-home
現場一ヶ月の自分を振り返る。 アウトプットとかそこらへんについてとか!

こんにちは!!
始めましての方が多いと思いますが良かったら、少々付き合っていただけると嬉しいです!!

株式会社GiZUMOでお世話になりすぎている木村です!

さて、今回主題のような記事にしようと考えたきっかけとしては、_初めての現場_ということ、
そして現場で働かせて頂いてから、**ちょうど一か月**ということもあった為このようになっています!

「えっ!?前置きはいいからはじめろって？」
「てか、そもそも見てないって!?」
冷たいことは言わないでください...
お願いします(泣)

それでは、Gizumoエンジニア Advent Calendar 2015 5日目始まります!!!

#始まりから一周間

始まりから一週間までざっとツラツラ書こうと思います!
始まりは...そうですね・・
**「〇月〇日から現場だよっ!」**
ここから物語は始まりました。
その時、私の心情としては不安と期待のどちらも渦巻いていたように思います。
不安要素としては、現場の雰囲気とか現場そのものに対してだったかと・・
また、期待要素としてはその現場でどう成長できるか何を会得できるのかといった期待でしたね!
そんな気持ちのまま、現場へと赴きました!

そして、一日目突入!
何もかもが、はじめて。
現場の人たちそして現場もなんです!

最初のほうは準備で終わりましたね....はいw
二日目もある意味そうだったような気がします。

本格的に始まったのは三日目からでした。
その日から、実際に業務を行っていましたが、開始早々に内容が分からなかった場面に
出くわしたため、落ち着いて考えた後に周りの方にお聞きして一段落着きました。

4日目～7日目は、与えられたテストをひたすらにこなしていました。
テストケースでややこしいものであったり、分かりやすいものであったり極端であった為です。

##二週間～三週間
二週間経つと、実行以外にも新しい業務をおぼえられるようにもなりました!
気持ちに余裕ができたからなのでしょうか!!
この頃から効率を気にしつつ実行などを行っていたのではないかと考えます。
「どのように実行すれば早く終わるだろうか・・？」
「周りの人たちはどのように行っているのだろう？」と
周りの方にも助けていただきながら、二週間あっという間に終わってしまったのではないかと思います。


###三週間～四週間
さて、三週間が経つと大分、人や環境そしてシステムが把握できた頃ですね。
また、テスト業務には関係のない小技のようなものも教わったりと便利かつ
今後の為にも役立つようなことばかり会得できたりと思わず、
**「現場ってすごい・・」**
と小学生のような感想を抱いてしまいましたw
**「現場に出た人と現場に出ていない人」**
では全然違うと言われるのも実感が湧きました!

####四週間～一ヶ月
そろそろ一ヶ月、終盤に迫ってきました。
思えば、月日が経つのは早いことで一ヶ月などあっという間だったと今でも感じています。
席替えなどで少しばかり環境が変わったりなどもして、慣れるまでに少し時間がかかったりした時も
ありました!
そんな時は、周りの人たちと軽く話して人間観察から始めてますw


#####まとめ
効率については、まだまだ良いのか否か判断できかねる部分もあるため
今後の課題としてあげておこうかと!
そしてテスト実行やテスト作成など、まだまだできない部分もあります。
できる部分は、より一層早くできるように頑張ると考えていることと、
失敗した部分またできなかった部分に関しては、なぜそうなってしまったのか
原因を洗い出すこと。
そして、その失敗から何を学べたのかを整理していき、同じような場面に遭遇したとき
しっかりできる自分になると考えています。

ここまで、読んでくださってありがとうございます!
何だかグダグダになってしまった感が否めないのですが、
**「結局何が言いたいの？」**
といわれると、
今後の目標であったりとか、抱負とかになると思いますw
後は、現場初めての方には共感、これから入る人たちには少しでも感じ取って貰えればなと
思っています!

それでは、長文になりましたがここらで失礼します!!

**ありがとうございました!!**
Railsのモデル検索あれこれ


この記事は
<a href="http://qiita.com/advent-calendar/2015/firstserver">ファーストサーバのAdvent Calender</a>
の12/6担当記事です。


## はじめに
データベースからデータを検索する
便利なメソッドがたくさんあります！
その中でも、普段よく使っているものをまとめました。

Version
Ruby ` 2.1.5 `
Rails `4.2.3 `


## 使い方
` rails console `または` rails c `で
データベースの内容を見てみよう

↓のようなテーブルがあるとします

```
User
  id: integer
  name: string
  created_at: datetime
  updated_at: datetime
```  

## 検索あれこれ
# all
その名の通りモデルの中身全てを取得します。

```
# Userテーブルの全てのレコードを取得

User.all
=> SELECT `users`.* FROM `users`
```

# find
主キーで検索します。

```
 # Userテーブルのid=1のレコードを取得
 
User.find(1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
```

複数も可能

```
# Userテーブルのid=1,id=2,id=3のレコードを取得

User.find([1,2,3]) 
=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3)
```


# find_by
条件に合ったレコードを取得します。
※ 条件に合ったレコードの中から１件しかデータを取得しません。注意です！

* id 指定

```
# Userテーブルのid=1のレコードを取得

User.find_by(id: 1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
```

* name 指定

```
# Userテーブルのname="hoge"のレコードを取得

User.find_by(name: "hoge")
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' LIMIT 1
```


# where

条件にあったレコード全てを取得します。

```
# Userテーブルのname="hoge"のレコードを取得

User.where(name: "hoge")
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge'
```

* AND検索

```
# Userテーブルのname="hoge"、かつid=1のレコードを取得

User.where(name: "hoge").where(id: 1)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' AND `users`.`id` = 1
```

* OR検索

```
# Userテーブルのid=1またはid=2のレコードを取得

id1 = 1
id2 = 2
User.where("id IN (?) OR id IN (?) " , id1, id2)
=> SELECT `users`.* FROM `users` WHERE (id IN (1) OR id IN (2));
```
OR検索はもっといい書き方がありそう...

# count
レコード数を返します。

```
# Userテーブルのname="hoge"のレコード数を取得

User.where(name: "hoge").count
=> SELECT COUNT(*) FROM `users` WHERE `users`.`name` = 'hoge'
```


# order
並び順を指定します。

```
# Userテーブルの並び順をid順にする

User.order(:id)
=> SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC
```

* 昇順

```
# Userテーブルのcreate_atの昇順

User.where(name: "hoge").order(create_at: :asc)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' ORDER BY `users`.`create_at ` ASC
```

* 降順

```
# Userテーブルのcreate_atの降順

User.where(name: "hoge").order(create_at: :desc)
=> SELECT `users`.* FROM `users` WHERE `users`.`name` = 'hoge' ORDER BY `users`.`create_at ` DESC
```