OmniAICreator/Qiita-1.07M huggingface dataset:
AfterEffectsプラグインTrapcede Form x 3D-Coatワークフロー

# 実は相性がいい!! Trapcode Formと3D-Coat
本記事は[3d-coat Advent Calendar 2015](http://qiita.com/advent-calendar/2015/3d-coat)の14日目の記事です。

スカルプトとリトポの話題で取り上げられることが多い3D-Coatですが、Trapcode Form(以降Formと略)と相性がよく、ワークフローに取り入れてはいかが？という記事になります。

## ざっくりとFormの仕組みを解説
Formは簡単に言うとパーティクルプラグインです。ただし、同じ制作元から販売されている有名プラグイン、Trapcode Particularと大きく異なる点があります。それは

- 粒子の総量は常に一定
- **3Dオブジェクトをインポートした際は頂点に粒子が生成される（間引くことは可能)**

この2点です。

一般的にパーティクルシステムはライフスパンを持った粒子が次々と生成されることで様々な表現をしますが、Formでは最初に一定数の粒子を準備しておいて、それを動かすところが特徴と言えます。

## まずは3D統合制作ソフトでモデル(OBJ)を作ってみよう

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/4da53724-78a7-8b6d-c9e3-04b617be3375.jpeg)

今回は炎の表現を作ってみたいので、上記画像のような簡単な形状を作ってみます。ここではCINEMA 4Dで作成してみました。

## AfterEffectsにOBJをインポートしてみよう
1. プロジェクトパネルにOBJファイルをドラッグ・アンド・ドロップするか、ファイルのインポートで読み込みます
2. OBJをコンポに配置し、非表示にします
3. 新規平面を作成し、Formを適用します
4. Base FormパラメータをOBJ Modelに、OBJ Settingsの3D Modelに先ほど非表示にしたOBJレイヤーを指定します

上記手順でFormに3Dモデルが読み込まれましたが、よく見ると困ったところがあります。

Formのパーティクル数は読み込んだモデルの頂点数に依存します。今回のモデルでは頂点の密度にばらつきがあり、スカスカの部分ではうまくパーティクルアニメーションができません。

![02_nouser.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/8e323a81-0965-92e0-1f92-2416bf61ff93.jpeg)

頂点密度が低い場所を選択し、手動で再分割してバランスをとる方法もありますが、モデル全体を通して緊密なトポロジーを作成するのは手間と時間がかかる作業です。

**ここで3D-Coatの出番です**

## 3D-Coatを使用するメリット
今回使用しているブラシは「移動ブラシ」と「スムーズブラシ」のみなのですが、移動ブラシの**移動後に自動的にリメッシュを行う**性質が非常にForm向きなのです。[^1]

画像を見ながら説明しましょう。

※ わかりやすいように[操作動画](https://v.usetapes.com/K41wIkYL9h)も用意しました。こちらも参考にしてください。

### 移動ブラシでメッシュをドラッグ

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/76408686-a18e-1585-d052-76c0f0cc8e91.jpeg)

### ドラッグアウトしたタイミングでリメッシュ！

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/f371959e-bafe-29f0-7581-d5ce5940a0f7.jpeg)

### 作成したモデルはこちら

![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/67b4c048-45a8-117d-160d-00b5ed4ddbe5.jpeg)

均一な頂点密度を持っているため、Formで使用する際に非常に使い勝手がよいモデルになりました。（3D-Coat内で球体のプリミティブから作成しています）

また3D-CoatはOBJ書き出しの際、頂点数の削減も行えるので頂点数が多すぎてFormでの挙動が重いと言った問題にも対応しやすいです。

しかしあまりOBJの段階で頂点数を削減し過ぎると細部の表現が甘くなるので、余裕を持った頂点数で書き出しを行い、FormのSkip Vertexオプションで頂点の間引きを行うと良いでしょう。

## Formに読み込んでみる

![06_nouser.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/5f64e0e3-b0d1-5587-89a3-74080f887f5f.jpeg)

読み込んだ状態で、アニメーションしやすい緊密な頂点数を持っていることがわかると思います。

今回、炎の部分はオリジナルの頂点数のままで、火の粉の部分はSkip Vertexで頂点数をかなり間引いて表現しています。

![07_nouser.jpg](https://qiita-image-store.s3.amazonaws.com/0/102012/c80c6b0f-43ce-422d-4e20-5e246fbf6ab1.jpeg)

## 最終的なアニメーション

![fire_v04.gif](https://qiita-image-store.s3.amazonaws.com/0/102012/6aaf95d4-cd63-d1b4-2090-0fec1a667b16.gif)

※ 画像のアップロードの関係でファイルサイズを下げる必要があり、かなり画像が荒いですがイメージは伝わるかと思います。

## まとめ

After Effectsで3Dモデルを使ったパーティクルアニメーションの選択肢のひとつとして有力なFormですが、3D-Coatと併用することで直感的な造形とFormに適切なトポロジーの両方を手にすることができます。

ぜひモーショングラフィックスワークフローに3D-Coatを取り入れてはいかがでしょうか。


***
[^1]: リメッシュとはメッシュのトポロジーを再構築することで、破壊的なメッシュ編集（極端に伸ばすなど）のあともスカルプトを続けやすくする機能です。ZBrushにはDynaMeshという名称で実装されています。
iverilog と verilisp を使う

Icarus Verilog(iverilog) を簡単に cygwin で使えると聞いたので試しに使ってみることにしました。ついでに verilisp も使ってみます。

#まずは cygwin(64bit) 上でコンパイル
[Icarus Verilog](http://iverilog.icarus.com/) のソースを github から clone します。

> $ git clone git://github.com/steveicarus/iverilog.git

しかし、configure がありません。autoconf から実行しないといけないようです。ということで、cygwin でコンパイルするには次のものが必要でした。

- autoconf
- gperf
- flex
- bison

ついでに clisp もインストールしておきます(あとで verilisp で使うから)。autoconf は２種類あったのですが autoconf-2.69 なるものをつかってみました。違いは把握していません。

> $ cd iverilog 
> $ autoconf-2.69
> $ ls configure
> configure
> $ which iverilog
> /usr/local/bin/iverilog

autoconf が必要だったものの意外と簡単にインストールできました。

# ivtest でテスト
テストベンチも clone します。
> $ cd ..
> $ git clone git://github.com/steveicarus/ivtest.git
> $ mkdir test
> $ cd test

Hello World があったのでコンパイルして動作させてみます。 

> $ iverilog -o hello  ../ivtest/ivltests/hello1.v
> $ ls hello
> hello
> $ ./hello
> $ ./hello
> Hello, World.
> PASSED

これも簡単にできました。順調です。

# verilisp をもってくる。
ここからだんだん怪しい世界に入っていきます。
[verilisp](https://code.google.com/p/benjhayden/source/browse/trunk/old/verilisp?r=625) 
以前はちゃんとしたホームページがあったのですが、今や残骸として code.google.com に残っているのみです。
そこで、ちょっと使えるように修正し始めました(2021年)
[githbu 上の verilisp](https://github.com/ryos36/verilisp)

verilisp は Common Lisp で動作する Verilog HDL の補助ツールです。S 式で書いたプログラムを Verilog HDL に落とすことが出来ます。

verilisp は一度 python で文字列変換した後に clisp を呼ぶようになっています。ここでは tests にある multiplier をコンパイルしてみます。拡張子がないので適当に vl という拡張子をつけます。lib も必要なのでコピーします。

> $ cp ~/verilisp/tests/multiplier multiplier.vl
> $ cp -rp ~/verilisp/lib .
> $ ls
> lib multiplier.vl
> $ verilisp.py multiplier.vl
> *** - read from #\<input unbuffered file-stream character > #P"/dev/fd/0" @157\>:
      After #\# is #\; an undefined dispatch macro character

コンパイルエラーです。S 式以外に検証用の verilog コードもくっついているのでエラーになります。66行以下を削除してもう一度コンパイル。

> $ ls
> lib multiplier.v multiplier.vl

見事に multiplier.v ができました。といいたいところですが、iverilog を通りません。

> $ iverilog -o multiplier multiplier.v
> multiplier.v:109: error: Wrong number of ports. Expecting 5, got 3.
> 1 error(s) during elaboration.

記述に間違いがあるようです。以下パッチ

```lisp:
--- multiplier.vl       2015-12-13 23:30:45.402498100 +0900
+++ multiplier-ok.vl       2015-12-13 22:46:00.471913900 +0900
@@ -34,7 +34,9 @@
         (module test_mul ()
             (reg (,WORDSIZE a b))
             (wire (,(l_* WORDSIZE 2) out))
-            (mul out a b)
+            (wire overflow)
+            (wire signed_)
+            (mul out overflow a b signed_)
             (dump "test.vcd")
             (initial
                 (delay 10000 nil)
```

ソースを修正して再度コンパイル。

> $ verilisp.py multiplier.vl
> $ iverilog -o multiplier multiplier.v
> $ ls
> lib  multiplier  multiplier.v  multiplier.vl

実行してみます。
> $ ./multiplier
VCD info: dumpfile test.vcd opened for output.
0011 0
good:  0 *  0 =   0 :: 0000 * 0000 = 00000000
good:  0 *  1 =   0 :: 0000 * 0001 = 00000000
good:  0 *  2 =   0 :: 0000 * 0010 = 00000000
結果中略
good: 14 * 14 = 196 :: 1110 * 1110 = 11000100
good: 14 * 15 = 210 :: 1110 * 1111 = 11010010
good: 15 * 15 = 225 :: 1111 * 1111 = 11100001

どうやらうまくいったようです。
これで cygwin 上で Verilog HDL のテスト環境だけでなく怪しい Common Lisp でのメタプログラミング(?)環境を手に入れることが出来ました。
プロダクトマネージャーが見るべきデータ　～パレートの法則をどう見るか編～

##自己紹介

こんにちは。井原真吾です。

普段はリクルートライフスタイルという会社でいろいろなプロダクトの主にToB系のデータ分析をしながら、プロダクトマネージャー的な人にデータを元に示唆を渡したり、データドリブンに動けるよう現場向けにツールの整備までしたり、「データマネジメントチーム」というチームを作っていろいろなデータ関係の仕事をやっています。
会社的に特にToBのデータ量は日本一ではないか？というほどに多種多様なデータを持っておりますので、非常に面白いですよ！（宣伝）

僕自身はプロダクトマネージャーではないですが、普段プロダクトマネージャーはどんなデータを見て、どんな打ち手を行えばいいか、悶々とすることが多くないでしょうか。
僕はいろんな事業に入って日々たくさんの種類のデータと向き合っているので、そんな立場からこの記事ではプロダクトマネージャーのみなさまに示唆を与えることができればと思います。

書いてみたいことはいろいろあるのですが、
例えば、どの事業でも見てみると面白いのが「パレートの法則」、いわゆる「2：8の法則」です。

##プロダクト内のパレートの法則を明らかにしてみる

詳細はWikipediaのパレートの法則の例など見ていただくとわかりやすいですが、

>現代でよくパレートの法則が用いられる事象
 >*ビジネスにおいて、売上の8割は全顧客の2割が生み出している。よって売上を伸ばすには顧客全員を対象としたサービスを行うよりも、2割の顧客に的を絞ったサービスを行う方が効率的である。
 >*商品の売上の8割は、全商品銘柄のうちの2割で生み出している。→ロングテール
 >*売上の8割は、全従業員のうちの2割で生み出している。
 >*仕事の成果の8割は、費やした時間全体のうちの2割の時間で生み出している。
 >*故障の8割は、全部品のうち2割に原因がある。
 >*所得税の8割は、課税対象者の2割が担っている。
 >*プログラムの処理にかかる時間の80%はコード全体の20%の部分が占める。
 >*全体の20%が優れた設計ならば実用上80%の状況で優れた能力を発揮する。

このように、いろんな例において「2：8」が当てはまることが多い、と言われています。
僕は複数の事業やプロダクトのデータ分析を行ったことがありますが、これはたしかに結構当てはまることが多いです。

「ふーん、じゃあ2割に力を注げばいいじゃん」と思われるかもしれませんが、
重要なのは**自分のプロダクトの中で「どこにおいて、パレートの法則が当てはまっているか」**を明らかにすることです。

##あなたのプロダクトの上位2割が占める8割はなんだ？

つまり、「●●のうち、上位2割が8割の■■を占める」の「●●」と「■■」が何かを明らかにすることが重要なんです。

例えば、
「顧客のうち、上位2割が8割の**売上**を占める」構造になっているのか、
「顧客のうち、上位2割が8割の**粗利**を占める」構造になっているのか
は、出てくる示唆がずいぶん違います。

また、
「**顧客**のうち、上位2割が8割の売上を占める」構造なのか
「**ログインユーザー**のうち、上位2割が8割の売上を占める」構造なのか
によって、また打ち手も大きく変わります。

僕の経験上、このパレートの法則が適用される場所はプロダクトごとによって全然違い、非常に示唆に富んでおり、現在のプロダクトの性質がよく表れます。

また、「偏り」がわかると、非常にその後の打ち手につながりやすいです。


##偏りはわかった。じゃあ打ち手はどう考える？

打ち手はいろいろ考えられますが、大別すると

1.上位20%をもっと獲得できないか？
2.上位20%にリソースを絞って、もっと磨けないか？
3.下位80％を上位20%に引き上げることができないか？

に収束するのではないでしょうか。

その際、重要なのは「その違いがもたらされているのは変動要素によるものなのか、固定要素によるものなのか」です。

例えば「上位20%の日付によって、80％の行動が起こっている」という場合、
上位20％の日付というのは、3連休だったり夏休みだったり、特定の事情がある日だったりします。
その場合「3連休を増やせないか？」などは固定要素で現実的ではないので、1の打ち手はありえません。
UXを考えて3ができないか？（3連休の時のような振る舞いをユーザーにしてもらうことはできないか？）などは多少ありえたりします。
現実的には2の打ち手で、その期間の効果を最大化するためにその前にプロモーションを打ったり、キャンペーンを行ったりして、上位20%での効果をもっと上げることに注力するのが費用対効果が良かったりします。

これらのように、打ち手を考える際は何が固定要素か変動要素かを考え、

1.上位20%をもっと獲得できないか？
2.上位20%にリソースを絞って、もっと磨けないか？
3.下位80％を上位20%に引き上げることができないか？

の軸で打ち手を考えると、結構スッキリします。

例えば「**営業マン**のうち、上位2割が8割の**売上**を占める」だったら何ができるか？
「**カテゴリ**のうち、上位2割が8割の**投稿数**を占める」だったら何ができるか？
「**執筆者**のうち、上位2割が8割の**PV**を占める」だったら何ができるか？

などなど、いろいろ考えてみるとバリエーションが多くて面白いかもしれません。

プロダクトマネージャーをやっているわけではないですが、気づきを提供できれば幸いです。
【FileMaker】プロジェクト管理ツールを導入しようよ

FileMaker Advent Calendar 2015 14日目です。

今年のFileMaker Conferenceでも講演していました([FileMaker ソリューション開発／運用の心得５カ条](https://www.youtube.com/watch?v=TCGKPVtj7SU)など)が、プロジェクト管理ツールを押していましたね。

大賛成です。

というか、他言語開発が長かったので、
・プロジェクト管理ツール
・履歴管理ツール
・自動テストツール
などは無料で使用出来ることは当たり前のことでした。

FileMakerの世界に来たら、20年さかのぼったのか！？と思うくらいそんなものは無く、履歴管理ツールっぽいものはとってもお高く、びっくりしました。

長年使っていた[Redmine](http://redmine.jp)。
これはFileMaker仕事でも使えますよね。

履歴管理ツール、バージョン管理ツールともいいますが、うーん。
[Git](http://www.backlog.jp/git-guide/)とか[CVS](http://www.hyuki.com/techinfo/cvsinit.html)とか[Subversion](http://tracpath.com/bootcamp/learning_subversion.html)とか、FileMaker界隈で使っている人を見かけたことがありません。
（リンクはあえて初心者向けの解説サイトにしています）

ましてや自動テストツール。
[Selenium](http://codezine.jp/article/detail/7427)とか[TestLink](http://gihyo.jp/dev/serial/01/testlink)とかを使っているFileMakerの現場に出会ったことがありません。
（まぁ、そもそもWeb系のテストではないですしね）

当たり前のようにネット越しに仕事をして何の不自由も無く仕事をしていたので、できればFileMakerのお仕事でもみなさん使っていって欲しいです。

FileMaker界隈の方々は、もしかして知らない！？
いやいやいや、まさかね。。。
[開発手法](http://www.atmarkit.co.jp/ait/articles/1412/05/news044.html)とか[UML](http://objectclub.jp/technicaldoc/uml/umlintro)とか知らないとかないですよね。

開発環境、フツーに仕事するには大事な要素ですので、FileMakerで仕事している人も導入を考えてみてください。
Swiftで行の分割を簡単に

## 改行コードを含んだ文字列を分割する場合
ファイルなどから読み込んだ文字列が改行コードを含む複数行だった場合に、これを改行コードを含まない単数行の`Array`にしたい…なんて場合があったとします。

```.txt
Foo
Bar
Baz
```
これをこんな感じに扱いたいわけです。

```.swift
["Foo", "Bar", "Baz"]

```
ある人はこう言います。「`componentsSeparatedByString()`」を使えば、綺麗に分割してくれるよ。」

````.swift
var string = "Foo\rBar\rBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]
````

しかし別の人はこう返します。「でも元のテキストの改行コードが"\n"の場合は、分割されないね。さらに"\r\n"の場合は、行頭に"\n"がついちゃう場合があるね？」

```.swift
var string = "Foo\r\nBar\r\nBuz"
let lines = string.componentsSeparatedByString("\r")
print(lines) // "["Foo", "Bar", "Buz"]
```

このように、改行コードによる行の分割は、意外と面倒な事がわかります。もちろん力業で文字列をパースして分割しても誰も文句は言いませんが、もう少しすっきりさせたいものです。そんな時は、`enumerateLines()`を使うと便利です。

```.swift
let string = "Foo\rBar\rBuz"
var lines = [String]()
string.enumerateLines { (line, stop) -> () in
	lines.append(line)
}
print(lines) // "["Foo", "Bar", "Buz"]
```

# extensionでさらに便利に
このコードをさらに extension にすれば…

```.swift
extension String {

	var lines: [String] {
		var lines = [String]()
		self.enumerateLines { (line, stop) -> () in
			lines.append(line)
		}
		return lines
	}

}
```

`.lines`をつければ、１行毎に分割してArrayにしてくれるので、for-in ループで回してもよし、`map`,`reduce`,`filter`などと組み合わせてもよし。さらに、改行コードはどちらでも、混ざっていても良いので便利です。

```.swift
"Foo\rBar\rBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\nBar\nBuz".lines // ["Foo", "Bar", "Buz"]
"Foo\r\nBar\r\nBuz".lines // ["Foo", "Bar", "Buz"]

```

`enumerateLines()`を知っていれば、どうって事ないのですが、知っていたのに忘れている場合もありますので、お役に立てれば幸いです。

では、 have a nice coding!
Google日本語入力 2（DvorakJPリマップ設定編）

Dvorak Advent Calendar 2015 14日目．

-----

## DvorakJP

通常のDvorak配列よりも，より日本語入力に特化した配列が **DvorakJP** 
使わない手はない．
Dvorak配列自体にまだ慣れていない場合は，Dvorak配列にある程度慣れてからDvorakJPに行く方が良いと思われる）

[DvorakJP - 日本語入力用拡張Dvorak](http://www7.plala.or.jp/dvorakjp/dvorakjp.htm)

## Google 日本語入力でDvorakJP

この日本語IMをGoogle日本語入力で使う場合は，ローマ字テーブルのリマップ設定が必要

[Google日本語入力用DvorakJPローマ字テーブル](https://github.com/shinespark/dvorakjp-romantable)

これで快適な日本語入力ができるようになる．
Vagrant Poderosa pluginを作ってみました

以前、[Vagrant Teraterm plugin](http://qiita.com/tiibun/items/b1f1d47040660892067d)というのを作りましたが、
これを流用してPoderosa( http://sourceforge.net/projects/poderosa/ )用のプラグインを作りました。

## はじめに
Windows では `vagrant ssh` するにはCygwinやMSYS、Git for WindowsのGit Bashなどを使う必要があります。（Git for WindowsのGit Bashが何かと便利なのでこれで事足りるのですが。）

ただ、sshクライアントとしてPoderosaを使いたい方もいますので、
```
vagrant poderosa
```
でPoderosaが立ち上がるプラグインを作ってみました。

## インストール

以下のコマンドを実行します。
```
vagrant plugin install vagrant-poderosa
```

## Vagrantfile

Poderosa.exe のあるフォルダがPATHに追加されていればそのまま実行できます。
PATHを通していない場合はVagrantfileに以下の記述をしてください。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  # exe_path にフルパスを設定
  config.poderosa.exe_path = "C:\\Poderosaのフォルダ\\Poderosa.exe"
  # ...
end
```

## 注意点

- 秘密鍵でのログインの場合、ログインダイアログは自動で閉じません。OKを押してください。
![poderosa-dialog.png](https://qiita-image-store.s3.amazonaws.com/0/15783/76c32191-2d71-2a0d-58af-9b56aef3f4a1.png)

- パスワードでログインしたい場合、こちらの記事([Poderosaで接続情報にパスワードを保存してSSHログインする方法 | サイブリッジラボブログ](http://labs.cybridge.jp/software/610.html))にあるように、以下の設定が必要です。
> 設定の変更 メニューのツール – 詳細プリファレンスエディタでorg.poderosa.protocols.readSerializedPassword の設定を true に変更

- まだまだバグ、仕様の取りこぼしがあると思いますのでご連絡いただけると幸いです。
- リポジトリは https://github.com/tiibun/vagrant-poderosa です。

## 参考

ソースはPuttyプラグイン([nickryand/vagrant-multi-putty](https://github.com/nickryand/vagrant-multi-putty))を参考にさせていただいています。
が、PuttyはOpenSSH形式の鍵を直接扱えないため、苦労されているようです(https://github.com/nickryand/vagrant-multi-putty/issues/15)。
WA* -- Weighted A* (Pohl 1970)

WA* は、A*をほんの少し変えることで「上限付きの」非最適解を返すことの出来るやり方です。

<sub>Pohl, Ira (1970). "First results on the effect of error in heuristic search". Machine Intelligence 5: 219–236.</sub>

# GBFSの欠点

前回紹介したGBFSの欠点は、解の **質** 、つまり探索経路の長さ/コストについての保証が全くないことです。最適解のコストがどれだけ小さいとしても、GBFSはいくらでも大きなコストの解を返す可能性があります。

例えば次のグラフを見てみましょう。このグラフでの最適コストは、上のノードXを通るコスト20の経路です。しかし、GBFSはノードYを通るコスト20000の経路を返します。これは、GBFSがヒューリスティクス $h$ を信頼しすぎるからです。

![gbfs-highcost.png](https://qiita-image-store.s3.amazonaws.com/0/6090/33142a4e-e0d7-96dd-5063-afe934873e20.png)

GBFSは、ヒューリスティクスの質が良ければよいほど素早く解を見つけるという点ではA*と変わりありません。しかし、この図の $h$ は admissible かつ consistent です。そのうえ、特に $X$ を通る方の経路では、 $f=f^＊$ であるパーフェクトなヒューリスティクスになっています。このことから、GBFSは **ヒューリスティクスの質がいくら良くても** 悪い解を見つける可能性があることがわかります。 

# 上限付きの非最適性

一方WA* , __Weighted A*__ は、GBFSとは異なり、ある程度の最適解の質の保証をもちます。

A*が $f=g+h$ を、 GBFSが $f=h$ を採用したのと同様に、 WA*は ある重み $w$ の元で $f=g+w\times h$ を用いてノードを展開します。これは、 __今までの距離 $g$ に対して $h$ を $w$ 倍信頼する__ と解釈することが出来ます。そして、WA*の返す解のコストは、 A*の返す最適解のコストの $w$ 倍以内であることが示されます。

| アルゴリズム | $f$ 値の定義 |
|:-----------:|:-----------:|
| A* |$g+h$|
| GBFS | $h$ |
| WA* | $g+w\times h$ |

A*がWA*の$w=1$ のケースであること、およびGBFSが WA* の $w \rightarrow \infty$ のケースであることがわかるでしょうか。これは、ちょっとした式変形をすればすぐわかることです。

WA* の探索空間を前回同様可視化すると以下のようになります。 $w$ が大きくなればなるほど、前回お見せしたGBFSの探索空間に近づいていくことがわかります。

![wastar.png](https://qiita-image-store.s3.amazonaws.com/0/6090/f09569b4-3d98-406e-567f-e119e73007c2.png)

![gbfs.png](https://qiita-image-store.s3.amazonaws.com/0/6090/42130c16-279b-3c76-6e12-1fe86d7c2907.png)


# 発展: WA* の問題点

WA* の問題点は、 __どんな$w$ なら十分役に立つのかを問題を解く前に知ることが出来ない点__ です。

小さすぎる$w$で探索を始めたら、探索空間が依然として大きすぎ、解を求めるのに要する時間がまだまだ長すぎるかもしれません。たしかに、必要な時間はA*よりは短いでしょう。しかし、例えば2500万年が[6年](https://youtu.be/Q4gTV4r0zRs?t=5m17s)になったとして、どれぐらい嬉しいでしょうか? せいぜい、[お姉さんがロボットにならなくてもよくなる](https://youtu.be/Q4gTV4r0zRs?t=6m21s)ぐらいの差しかないでしょう。

一方で $w$ を大きく取り過ぎてしまえば、解の質の保証という利点が失われてしまいます。例えば、 $w=1000$ として最適解の1000倍までの解を許すことにどれだけ意味があるでしょうか (もちろんこれは、グラフ探索を何のために使っているかという状況に応じて変わります)。

この問題を別の言葉でいいかえれば、 WA*には **パラメータチューニング** の問題がつきまとうということです。 ここで $w$ の最大値はGBFSに相当する $\infty$ です。このため、この古典的なアルゴリズムを基礎として、 Anytime Algorithm、すなわり$w$ の値を動的に変化させる適応的なアルゴリズムが複数考えられています。そのお話はまた今度。
開発ツールカタログ

今年も残すところあとわずかとなりました。
普段開発をしていく中で開発に使用するツールの情報が少しずつたまってきたので、意外とまとまっている記事が少ないのと、整理整頓も兼ねてAdvent Calendarの投稿のテーマに選んでみました。
よく知られているものも多いかとは思いますが、これからApp Cloud開発をする人の参考になればと思います。

## IDE編
#### Force.com IDE
Salesforce開発の記事でよく見かけるEclipseベースのIDE。
Force.comの設定画面からダウンロードできるものと既存のEclipseにプラグインとして追加するものがあり、Eclipseを使用した開発に慣れている人には馴染みやすいツールだと思います。
コード補完機能をもう少しパワーアップしたい場合は、[Apex Editor LS](https://marketplace.eclipse.org/content/apex-editor-ls)と[Rich Visualforce Editor](https://github.com/ajayhada/Rich-VisualForce-Editor/wiki/Rich-VisualForce-Editor-Plugin)を追加するといいと思います。

参考：[10分でできる！快適な Force.com 開発環境](http://www.terrasky.co.jp/blog/2013/131002_001309.php)


#### Mavensmate & Sublime Text/Atom

![Mavensmate_Atom.png](https://qiita-image-store.s3.amazonaws.com/0/34297/1130fb85-7937-9bac-1e92-81edff49baca.png)


Sublime TextとAtomで使用可能なエディタ。
プラグインのインストールと[Mavensmate-app](https://github.com/joeferraro/mavensmate-app/releases)をインストールすることで利用できます。
Mavensmateでは通常のApex・Visualforce開発だけではなく、Lightningコンポーネントの開発もできます。

#### Cloud9
クラウド上で利用する形式のIDE。有料で個人プランでも月額19ドル（約2000円）かかる。14日間の無料トライアルが可能なので、試してみてよいと感じたら使ってみるといいかもしれません。

![スクリーンショット 2015-12-13 21.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/34297/7142b8e3-327f-e84e-8bf4-2ca52e7f970a.png)

## Chrome Extension編
#### Force.com Logins
複数のSalesforceのアカウント情報（ユーザ名とパスワードで1セットとして）を管理しやすくする拡張機能。ただ単にまとめるだけではなく、対象のアカウントの左側の「tab/window」のどちらかのボタンをクリックするだけでログインができます。

![スクリーンショット 2015-12-13 21.15.18.png](https://qiita-image-store.s3.amazonaws.com/0/34297/d9b8ad49-d9de-a41d-adfd-fec369c675d2.png)

#### Salesforce.com Enhanced Formula Editor
Salesforceの開発で数式項目を作る場合もあります。その際、短い数式であれば問題はないですが、数式が長くなるとどこまでが括弧の範囲なのか、引数がどこまでなのか分かりにくくなります。その際にこれを入れておくと、シンタックスが付与されて括弧のハイライトをしてくれたりフォントを変更することができたりと、リッチテキストエディタっぽく使えます。
数式が長くなることはなるべく避けたいですが、長くなってしまいそうであれば試してみるといいかもしれません。
![スクリーンショット 2015-12-13 21.24.53.png](https://qiita-image-store.s3.amazonaws.com/0/34297/4c12a25c-e35c-8e56-dd15-b50d8eef5206.png)

#### Salesforce Navigator
Salesforceの各画面に遷移するLauncherみたいな拡張機能。キーバインドを指定しておいて、そこに文字を入力すると画面への繊維先が表示されます。
![スクリーンショット 2015-12-13 21.30.09.png](https://qiita-image-store.s3.amazonaws.com/0/34297/0060b5c5-482d-f5c1-d6d8-ad6e19837896.png)

#### Salesforce Searchbox
Salesforceの設定画面に検索ボックスが設置され、そこに条件を入力すると条件に合うものをフィルタリングしてくれる拡張機能。
ただ検索ができたりそうでなかったりするので、そこは注意点です。

#### Salesforce inspector
Lightningフレームワークの開発の責任者であるSkip Saulsさんが作成した、Chrome Dev Toolsの拡張機能。
Lightningの画面で起動すると、Lightningコンポーネントがどのように使われているかを表示してくれます。
![スクリーンショット 2015-12-13 21.47.08.png](https://qiita-image-store.s3.amazonaws.com/0/34297/221e938d-a95b-cc7e-c8c7-5a968d28f7d0.png)

#### Salesforce inspector
現在表示されているSalesforceの画面の定義情報にアクセスしやすくする拡張機能。
アクセスできるのはメタデータとデータの情報です。

今回はIDEとChrome Extensionの2つで書いてみましたが、Firefoxの方も書いて行く予定です。
EmacsでMicrosoft Translatorを作ってみた

![Screen Shot 2015-12-13 at 01.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/37724/2a1dd1dd-5560-9a38-1561-33b32de2a96f.png)


## はじめに
私は英語があまり得意ではないのですが
英文を書く機会がちょいちょいあり、Google翻訳で調べながらやっています。
Google翻訳は賢く文脈を読んでいい感じに翻訳してくれのですが
ただ期待の変換と間違う時も多く、別の翻訳ツールでの結果も見たくなるので
フリーの翻訳APIを利用して何か作ろうと思いました。
そこで月200万文字まで無料で使わせてくれるMicrosoft Translator APIを利用しました。

## Microsoft Translator API 利用にあたって

Microsoft Translator APIを利用するにはclient用のTokenを発行する必要があります。
以下の手順になります

1. Windows Azure Marketplaceアカウントを新規登録して、サインインします。
https://datamarket.azure.com/home/

2. 以下からMicrosoft Translatorを利用します
https://datamarket.azure.com/dataset/bing/microsofttranslator

3. 開発者のアプリケーションの登録を行います。
https://datamarket.azure.com/developer/applications

登録画面が出てきますので次の項目を入力して登録ボタンを押します。

|項目|説明|
|:----------------------:|:------------------------------------------|
|クライアントID|アプリケーションの識別子なる文字列でユニークにする必要があります|
|名前|ユーザーに表示するアプリケーション名です|
|顧客の秘密|アプリケーションのパスワード。トークンで利用します|
|リダイレクトURI|同意フローの最後にリダイレクトする URL。利用しませんで無効なURLを入力します|
|サブドメインアクセスを有効にする|この設定はオフのままにします。|
|説明|アプリケーションの説明(省略可能)。|

クライアントID(client-id)と顧客の秘密(client-secret)は、APIを利用するときTokenになります。

## Emacs 設定
以下から、microsoft-translator.elを落してelispのload-path先へ配置します
https://github.com/fujimisakari/microsoft-translator

```lisp
(require 'microsoft-translator)

(setq microsoft-translator-client-id "fujimisakari")
(setq microsoft-translator-client-secret "xxxxxxxxxxxxxxxxxxxxxxxx")
(setq microsoft-translator-use-language-by-auto-translate "Japanese")
```

## 使い方
M-x microsoft-translator-auto-translate で英文か日本語を入力すると翻訳結果が表示されます。
また、文字列をリジョン選択した状態で実行するとその文字列の翻訳結果になります。

## 感想
Microsoft Translator APIのレスポンスはGoogle Translateよりかなり遅いです。
Google Translateレスポンスは1秒かかりませんが、Microsoftは2秒ほどかかってしまいます。

ただ、Google翻訳は複雑な文を賢く翻訳するのですが、すごい単純な英文をよく失敗します。
たとえば、I will show to you Program that I made.を翻訳すると
(google)私は私が作ったあなたのプログラムに表示されます。
(microsoft)私が作成したプログラムを紹介します。

個人的には、読む時の翻訳にはgoogle、書く時のチェックはmicrosoft、
単語を調べるときは英辞郎という用途で利用する感じです。

google翻訳: [google-translate.el](https://github.com/atykhonov/google-translate)
英辞郎: [このサイトを参考にしました](http://aikotobaha.blogspot.jp/2011/10/emacs-sdic-sary.html)

明日は [sanryuu](http://qiita.com/sanryuu) さんです。
UGUIでアニメーションを使ってNoCodingで画面遷移を作る

　
#初めに
Unityの標準UIシステム、UGUIは実はとても高機能で、データ更新の必要ない内容の決まっている表示に関してはほぼこれだけ（スクリプトを書く必要なしに）使うことができます。

#タブ画面
タブ画面は単純に画面を切り替えるだけならとてもシンプルに作ることができます。
###必要コンポーネント
Toggle
ToggleGroup
###手順
Tabで表示したい画面GameObjectと、Toggleコンポーネントと、イメージコンポーネントを持ったGameObjectをタブの数だけそれぞれ用意します。
![img](https://dl.dropboxusercontent.com/s/bm5kkuquni0uzg2/TabHierarchy.jpg)

ToggleコンポーネントのOnValueChangedイベントに、対応する画面GameObjectのSetActive(DynamicBool)を紐付けます。
![img](https://dl.dropboxusercontent.com/s/xfjqfyu8vgxf6b9/TabEvent.jpg)

最初に表示したいタブ以外のGameObjectをDisableにして、タブボタンのToggleのisOnをTrueにします。

![img](https://dl.dropboxusercontent.com/s/1a4hgqnwung3tnk/Tab.gif)
完成です。
あとは各GameObjectの中身を作っていってください。

#画面遷移
Unityのインスペクターから行うイベントのバインドは基本的にはComponentのPublicな引数が一つ以下のメソッドならなんでも呼ぶことができます。
これを応用すると、AnimatorのSetTriggerをUIのボタンと紐づけることができます。(SetIntやSetFloatは引数が二つ必要なので呼ぶことができません。)
つまり、Triggerのみで画面遷移するUIアニメーションを作ると、スクリプトなしに画面遷移を行うことが可能になります。
###必要コンポーネント
Button(等のクリックイベントが取れるコンポーネント）
Animator
###手順
二つのPanelとそれぞれに遷移するためのボタンを用意します。
![img](https://dl.dropboxusercontent.com/s/g2g6na64lvzh5q3/AnimHierarchy.jpg)

切り替えのアニメーションを作成し、AnimationControllerでTrigger当の設定を行います。
アニメーションの作成は[UnityAdventCalendar2015 2 ５日目「uGUIのAnchorsでレスポンシブアニメーション」](http://www.soucolle.jp/responsive_animation_in_ugui_anchors)を参考にしてみてください。
![img](https://dl.dropboxusercontent.com/s/rrba6lmkn3bmlgq/AnimAnimator.jpg)

ボタンからそれぞれの画面に遷移するトリガーを呼び出します。
![img](https://dl.dropboxusercontent.com/s/fiy91t42li8zezi/AnimButton.jpg)


完成です。
![img](https://dl.dropboxusercontent.com/s/go7w31d8zt3ffeq/Anim.gif)


ちなみにProjectViewを見てみると
![img](https://dl.dropboxusercontent.com/s/g587esvn95fwm6s/project.jpg?dl=0)
見事にScriptファイルがありません。

その他、いろいろな機能を組み合わせれば面白いUIを作成できると思いますので、是非ともいろいろやってみてください。

明日は[ookumaneko_XD](http://qiita.com/ookumaneko_XD)さんの「何か書きます」です。
test.checkを触ってみる


# はじめに

test.checkはユニットテストのためのライブラリです。(以前はsimple-checkという名前でした)

ランダムに生成した値をテスト対象に入力して、簡単にその挙動をテストすることができます。

開発者が考えた具体的な入力値でテストを行うだけではどこかに抜け漏れが生じる可能性がありますが、
test.checkでは毎回違う値でテストを実行するので、このような抜け漏れを見つけやすく、プログラムの信頼性をより高めることができます。

また、test.checkはHaskellのQuickCheckを元にClojureへ向けに移植されたライブラリで、Clojure以外にもScala, Ruby, Pythonなど多くの言語に移植されているようです。

# さっそく触ってみる

## test.checkの導入

test.checkを使うにはprojec.cljの```:dependencies```にtest.checkを追加します

```project.clj
...

[org.clojure/test.check "0.9.0"]

...
```

## ランダムテスト

ここでは以下のproductコードに対してテストを行っていきます

```src/sample_testcheck/core.clj
(ns sample-testcheck.core)

(defn hello
  [x]
  (str "Hello, " x))

```

テストコードは以下のように書いてみました

```test/sample_testcheck/core_test.clj
(ns sample-testcheck.core-test
  (:require [clojure.test :refer :all]
            [sample-testcheck.core :refer :all]
            [clojure.test.check.generators :as gen]
            [clojure.test.check.properties :as prop]
            [clojure.test.check.clojure-test :refer [defspec]]))

(defspec  ; clojure.test integration
  hello-test  ; test名
  100 ; 試行回数
  (prop/for-all
    [x gen/string] ; ランダム値の生成
    (= (hello x) (str "Hello, " x)))) ; check
```

(本来ならプロダクトコードと同等のIn/Outになるロジックで確認するところですが、簡単のためproductコードの中身でそのもので確認しています)


実際にテストを走らせてみると以下のように出力されます。

```
$ lein test

lein test sample-testcheck.core-test
{:result true, :num-tests 100, :seed 1449985781679, :test-var "hello-test"}

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

```

これだけでランダムに生成した100パターンの入力値でテストすることができました。

### defspec

```defspec``` マクロを使うと、test.checkで書かれたテストをclojure.testのテストケースとして取り扱ってくれます

### generators

ランダム値はgeneratorsを使うことで簡単に生成することができます。

ここではstringを例にしていますが、int, list, mapなども生成可能です。

また、パターンの多くないことがわかっているケースでは、``` generators/element ```を使って特定の要素からランダム値を生成することも可能です。

generatorsはいろいろなランダム値を生成できるので、以下のcheat sheetに目を通しておくと良いかもしれません。
https://github.com/clojure/test.check/blob/master/doc/cheatsheet.md

# おわりに

test.checkを使うことで簡単にランダムテストを行うことができることがわかりました。

また、今回はClojureのテストを行いましたが、もちろんClojureScriptにも使用できます。

generatorsの種類は結構豊富ですが、他の点はとても単純なので非常に使いやすいライブラリかと思います。

より多くの入力値で確認しておきたいようなケース(parserや暗号化/複号化など)ではとても役立つかもしれませんね。

# 参考
[test.check](https://github.com/clojure/test.check)
[test.check APIドキュメント](http://clojure.github.io/test.check/clojure.test.check.html)
[はじめての test.check 0.7.0 - tnoda-clojure](http://tnoda-clojure.tumblr.com/post/119297629796/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE-testcheck-070)
[QuickCheck - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/QuickCheck)
Arduinoで小型液晶に文字を表示する

arduinoを使って液晶に文字を表示するサンプルです。

## 買ったもの
以下の２つのセットをamazonで買いました。
http://www.amazon.co.jp/gp/product/B008PQEWIW/
http://www.amazon.co.jp/dp/B008QUJALG/

## 必要なもの
上の買ったものの中に全て入っています。

* Arduino UNO
* ブレッドボード
* 小型LCD (SD1602 VBWB-XA)
* ジャンパーワイヤー × 13
* 半固定抵抗 10kΩ

## ブレッドボード
![lcd_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/47882/6b021fd2-dafb-9808-080c-7f5a0871ff92.jpeg)

半固定抵抗で明るさ調節できます。
液晶にピン差しているところはハンダ付けしました。
## コード

```
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#include "font.h"

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);	

void setup(){
  lcd.begin(16, 2);
  lcd.print("Kyomoichinichi");
  lcd.setCursor(0, 1);
  lcd.print("Ganbaruzoi!");
}

void loop(){

}
```

## 動いているところ
![IMG_1034.JPG](https://qiita-image-store.s3.amazonaws.com/0/47882/6a1fd368-1778-826a-1344-0f693aeedadc.jpeg)


テレビアニメ化決定おめでとうございます。
2年間Railsで社内ツール作った所感

2年位Railsでコールセンターアプリ的なものを作っていました。
大したことは書けませんが、この2年間で思ったことなんかを徒然と書いてみます。

# その前に

どんなチームか？

電話する人たち:数十名
その人達のリーダー:5-10名程度
開発者:1-3人

# デザイナがいないならWrapbootstrap

https://wrapbootstrap.com/
デザイナはいないので自分たちでどうにかする必要がありました。
のでwrapbootstrap。
18ドル払うだけで多機能で色んな画面用のテンプレが揃ってるって素晴らしいですね。

* 複数人で作っても同じようなデザインに落ち着くこと
* **使う人達もデザインが良いと喜んでくれること（別部署に羨ましいって言われた）**
* 大体社内ツールで使うようなデザインがそろってるので開発が早く進められること

当時は[Ace Admin](http://responsiweb.com/themes/preview/ace/1.3.5/)を使うことにしました。
カラフルで明るい印象の管理画面を作れます。
今なら無料の[Admin LTE](https://almsaeedstudio.com/preview)でもいいけど、機能の豊富さが半端ない[inspinia](http://webapplayers.com/inspinia_admin-v2.3/)おすすめ。
結構バグってたりしますが、頻繁にアップデートしてるので報告すると1日位でレスがきて、次回直ったりします。

# rubocop先生は正義

ruby初めてだったのでコーディング規約とかどうしようかとこの辺を参考にしてました。

http://shugo.net/ruby-codeconv/codeconv.html
https://github.com/miyamae/rails-style-guide
https://github.com/cookpad/styleguide/blob/master/ruby.ja.md

ruby初心者の2人で開発していたので悩むところが多かったです。かっこの省略とかどこまでOKなんだよ？　とか。
結果としては**初心者があれこれ悩むくらいなら[Rubocop](https://github.com/bbatsov/rubocop)先生に従おう**で落ち着きました。
やってるうちにrubocop先生厳しすぎだろってところも出てくるかもしれませんが、設定変えればいいだけですし。

# itamae先生素敵

chef難しい。むりぽ。
だった自分にitamae先生は手を差し伸べてくれました。

* 覚えることすくねぇ。**30分くらいググればわかる**
* rubyだし分岐とか自然に見えるし

# 守っていきたくなるプロダクト

「テストというものは、カバレッジが高ければ良いというわけではない」とか言われますが、でもやっぱり高いほうが良いと思います。

* 通ってるのだから流石にやべーtypoとかしてないだろうし
* 通ってるのだから到達可能だろうし
* 何より安心感あるし

95%くらいカバーできてたコードが一時期80%台中頃まで落ちる時期があって、
その時、**開発チーム内で「これやばいよね。テストしっかり書かないと」感が醸造された**のがとても良かったと思っています。

# アップデートは定期的に

gem updateしてますか？rake rails:updateしてますか？
暇を見つけて、ではなく**定期的に**やっておきましょう。
数ヶ月放置して「アップデートしたら動かなくなったけど何が原因かわからない」なんてザマになりかけたので。

# hipchat通知でチームを盛り上げろ

他のチームがやってたので真似したのですが、チームのKPIに関連するイベントが発生した時（売上上がったぞー的な）に「xxさん担当のooが売上上がりましたー」的な通知を流すと結構盛り上がります。
**嬉しい時に嬉しいって言い合える空気を作れる**っていいですよね

# デプロイコストは小さく保て

最初の頃デプロイボタン押してから完了までに10分くらいかかってました。
しかもたまに失敗する。
だからめちゃくちゃ怖い。もしバグってたらどうしようとか。
実際バグってたら「ごめんなさい。10分くらいで元に戻します」とか言ってたわけです。
で10分手が止まってしまう。ヘタすると戻すときに失敗して30分とか止まる。どうしても空気が悪くなる。デプロイしたくなくなる。

こんな状態が嫌だったので30秒くらいでデプロイできるようにしました。
そしたら怖さもグッと減りました。

早いからすぐ戻せる、だから怖くない、怖くないから小規模改修をカジュアルにどんどん入れられる。
**高速なデプロイが好循環を作ってくれました**。

# その他

* N+1はrails-footnotes入れて常に意識しとけ
* 論理削除gemはincludesした時に結構ハマる
* rails guidesは神だな
* global gretel meta-tags i18n辺りをきっちり使うとdryで見通しの良いコードに

# 終わり

書いてみたらRailsの話殆どありませんでした。
なんだかんだでミスっても許してくれたり、自動化だ高速化だ品質アップだで時間を取ることができたのは**開発者以外も含めたチームの理解があったから**だよね。
といい話な感じで今年を締めたいと思います。
年末は[Fallout4](http://bethsoft.com/ja/games/fallout_4)三昧の予定です。良いお年を！
gomobileで日本語フォントを扱ってみる

★[Go その2 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/go2)の14日目です。

先日のGoConでも扱われる数が増えてきてる感じがしているgomobile。個人的にとても嬉しい流れです。
今回はそのgomobile上でtruetypeフォントを扱って日本語を実機上で表示してみたという感じの記事です。
※英数字のみであればgolang.org/x/mobile/exp/fontでも大丈夫かと思いますがそっちは未確認
※gomobileパッケージ自体の更新がかなり早いので以降のバージョンによってはうまくいかない可能性もあります。ご了承ください。

# サンプル
https://github.com/bowzstandard/gmtsmpl
androidとiosとmac上で表示確認済み。
フォントは[M+フォント](https://mplus-fonts.osdn.jp/)を使用させていただきました。

# 必要なもの
* Go 1.5
* [gomobile](https://github.com/golang/mobile)
* [imageの追加パッケージ](https://github.com/golang/image)。主にこの中のfontを使用します。
* [freetype](https://github.com/golang/freetype)。主にtruetypeを使用します。ttfのパースをおこないます。

# やってること
ttfを読み込んで最終的にNodeのSubTexとして扱えるような形に持って行ってます。
以下手順

0. ttfをassetパッケージを使って読み込みます。
1. ioutil.ReadAllで[]byteを取ります。
2. truetype.Parseを使ってtruetype.Fontにパースします。
3. font.Drawerを使ってttfのデータから該当の*glutil.Imageへテキストを描画していきます。
4. 描画したものをEngine.LoadTextureでTexture化→SubTex化します。
5. 対象のNodeにSetSubTexでテクスチャとして乗っけられます。
6. その際にSetTransformで大きさを整えます。この辺は描画したテキストサイズに合わせて変更する感じで実装します。
7. これでArrangerでも扱える形でテキストを使用可能になります。

★キャプチャ（iosの）
![20151210080922.png](https://qiita-image-store.s3.amazonaws.com/0/35655/9e63b915-384a-a7ac-1458-6388440ea309.png)



# TODO
* インタラクティブな入力に対応
* 自動改行
* ワイプとかの演出処理

などなど

# その他
来年中にgomobileの安定版が出るという話もあったのでとても楽しみにしている感じですが、その間にもいろいろと試行錯誤しながらパッケージのコード解析しつつ試験段階のコードも楽しくいじり倒せたらなと思ってます。
New Relic Synthetics: 無料のPingモニターでサイトの稼働状況をらくらくチェック

今日は、New Relic Synthetics という製品について説明したいと思います。
この製品は、外部からサイトが正常に稼働しているかをチェックするツールになります。すごい簡単にいうと、Pingdom + α みたいなツール。

New Relic Synthetics が提供する主なサービスは以下の4つ。

- Ping
    - 設定した間隔で指定した URL に対して Ping を行う
- Simple Browser (Proプラン)
    - 上記と同じだが、実際のブラウザ(chrome)でアクセスする。よって、ページ読み込みに対して取れるデータが詳細。
- Scripted Browser (Proプラン)
    - Selenium ベースの機能。スクリプトを書くと、それを設定した間隔で実行してくれる。例えば、ログイン処理とか、カート遷移処理とかチェックに便利。
- API Test (Proプラン)
    - API のテストをスクリプトを書いて行える。

上記の4つの機能とも、実行地域、頻度と大体の設定は同じです。よって、Ping モニターの設定の仕方、実行結果の見え方をみれば、他の機能も大体イメージできると思いますので、Ping モニターの説明をします。

# 概要

ユーザーは、Ping モニターを無料で使えます。Ping モニターはサイトの稼働監視に使えます。

PING をとばす"地域"と"頻度"を設定すると、その頻度で各地域から Ping を飛ばして、稼働をチェックできます。また、これ専用の "Apdex T" も設定できます。

制限: New Relic は、1分/1アプリあたり 20 synthetic トランザクショントレースまで収集します。1分に 20 synthetic チェック以上する場合、トレースが含まれない結果も出てきます。

# モニターの一覧

作成済みのモニター一覧は、以下のとおりです。

![synthetics_02.png](https://qiita-image-store.s3.amazonaws.com/0/46003/769240fe-47bc-6501-2279-59a2f5ab02cf.png)


# モニターの作成方法

モニター一覧より、"Add monitor" を押して、モニターを作成します。

![synthetics_01.png](https://qiita-image-store.s3.amazonaws.com/0/46003/336a11d6-f41a-ca89-bfb9-20b8279f237c.png)

頻度と地域を指定するので、例えば、15分毎に3つの地域を選択していた場合、15分間隔で３つチェックする。つまり、１ヶ月で、(4*24*30*3=8640)回のチェックが発生します。


# 結果の閲覧

結果は、サブメニューから、"Results" を選択します。地域や時間帯でフィルターし、いくかの条件で並び替えが可能です。

![synthetics_05.png](https://qiita-image-store.s3.amazonaws.com/0/46003/0d57d2ac-c675-202d-171b-42d733256cea.png)

詳しい内容を見たい場合は、該当のチェック結果をクリックします。今回は、単純な Ping なので、結果もシンプルですが、Simple Browser になるとこの結果がもっと詳細なものになります。

![synthetics_03.png](https://qiita-image-store.s3.amazonaws.com/0/46003/ce6749cc-2531-5f5f-7ab6-6b3868916590.png)

上記の画面からは、さらに、Insights と APM のトランザクショントレースにもアクセスできます。
以下は、上記の Synthetics チェックに対する Synthetic トランザクショントレース。

![synthetics_apm.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3c44bbc5-08f4-f258-5521-98501983ede7.png)

以下は、上記の Synthetics チェックを Insights で表示した場合の結果。

![synthetics_insights.png](https://qiita-image-store.s3.amazonaws.com/0/46003/354a9960-b01b-a973-ef1b-a95f56926f76.png)

# おわりに

どうでしたでしょうか、New Relic Synthetics がなんとなくどんなものかイメージがわいたでしょうか。ここで紹介した内容は無料で使えますので是非試してみてください。後々、Pro 版の機能も紹介していきたいと思いますので、そちらもご覧いただければと思います。
OpsWorks Chef12に対応して色々便利になりました: Djangoのdeployも簡単!

# はじめに
2015年12月にリリースされたOpsWorksのChef12対応([OpsWorks Chef 12 for Linux](http://blogs.aws.amazon.com/application-management/post/Tx1T5HNA1TSU8NH/AWS-OpsWorks-Now-Supports-Chef-12-for-Linux))、とても便利になりました。chef.ioのblog記事にて紹介されていたDjangoのdeployを早速試してみました。

[Chef Community Cookbooks with AWS OpsWorks Chef 12](https://www.chef.io/blog/2015/12/07/chef-community-cookbooks-with-aws-opsworks-chef-12/)

# 便利になった点
まず、何が嬉しいのか、便利になった点をまとめます。
- OpsWorks内部で使用しているCookBookとの、Namespaceの衝突が発生しない
- Chef12以降でないと動作しないCommunity Cookbookが使えるようになった
- Chef searchを用いてAWSのリソース(Stack、Layer、インスタンス、ELB、RDSなど)を取得できるようになった

なお、従来から利用できるChef11 Stackではbuilt-in LayerとしてRails、Node.js、PHP、Java等やMySQL、HAProxy等が提供されていましたが、Chef12 for Linuxでは提供が無くなりました。そのかわりに、SupermarketなどのCommunity Cookbookを使う形で様々なアプリをDeployできるようになったので、Chefの一般的な使い方により近づいたと言えます。

今回は、Namespaceの衝突が発生しなくなった点を体感するべく、blog記事にある Django + dpaste のdeployを試してみます。

# Djangoのアプリをdeployしてみる

## sample wrapper Cookbook をSupermarketからダウンロードする
```
git clone git@github.com:chef-cookbooks/opsworks-linux-demo-cookbook-django.git
```

## Recipeの中身を確認
opsworks-linux-demo-cookbook-django.git の中身を確認すると、次のCookbookがCommunity Cookbook として依存(depend)していることが分かります。

- application_python
- build-essential
- poise-python

## 実際にOpsWorksを用いてdeployする
OpsWorksを用いたdeployはとても簡単にできますが、注意点としては、Community Cookbookを含んだ形のCookbookアーカイブを事前にberkshelfにて作成した上でCookbookのRepositoryにアップロードする必要があります。

1. berks package コマンドを実行します
2. ファイル(cookbooks-(timestamp).tar.gz)が生成されるので、S3またはgithubのCookbookのRepositoryにアップロードします
3. OpsWorksのStackをCustom Cookbookを有効にして作成します
4. Custom Layerを作成します
5. recipe(opsworks-linux-demo-cookbook-django)をSetupに追加します
6. appを作成します。ソースコードに、https://github.com/bartTC/dpaste.git を指定します
7. インスタンスを追加し、起動します
8. http://(Public IP of your instance)/ にアクセスし、dpaste が動作していることを確認します

application_pythonを使うことで、とても簡単にDjangoのアプリをインストールすることができました。
CentOSでRuby 2.2.1をインストールする際につまづいたこと


最近さくらVPSを個人で契約しました。
そのセットアップの際につまづいたことのメモです。

## 環境
・CentOS 6 x86_64
・rbenv 0.4.0-146-g7ad01b2
・ruby-build最新版
・Linuxbrew導入済み

## Ruby2.2.1をインストール
簡単にできるはずだったのが、つまづいた。

```
make[3]: ディレクトリ `/tmp/ruby-build.20150321134130.29283/ruby-2.2.1/ext/fiddle/libffi-3.2.1' から出ます
linking shared-object fiddle.so
/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
./libffi-3.2.1/.libs/libffi.a: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make[2]: *** [../../.ext/x86_64-linux/fiddle.so] エラー 1
make[2]: ディレクトリ `/tmp/ruby-build.20150321134130.29283/ruby-2.2.1/ext/fiddle' から出ます
make[1]: *** [ext/fiddle/all] エラー 2
make[1]: ディレクトリ `/tmp/ruby-build.20150321134130.29283/ruby-2.2.1' から出ます
make: *** [build-ext] エラー 2
```

logの中身を見てみると、

```
/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC
./libffi-3.2.1/.libs/libffi.a: could not read symbols: Bad value
```
libffiというパッケージがインストールされていないため
このようなエラーがでているみたい。

なので、libffiをインストール。

```
$ sudo yum install libffi-devel
```

Ruby2.2.1をインストールし直す。

```
$ rbenv install 2.2.1
```

できない！！
OpenSSL関係のエラーだったので、

```
$ brew install openssl
```

でopensslをインストール。
再度、

```
$ rbenv install 2.2.1
```



最後に

```
$ rbenv global 2.2.1
```

と指定すれば終了です。
おつかれさまでしした。
python向けに形態素分割を楽に扱えるライブラリつくった

# この記事の内容

* PythonでMecabを楽に扱えるライブラリつくったよ
* [git](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers)からもってきてインストールできるよ。

# このライブラリでできること

* 文を入力して単語に分割
* ストップワードと品詞でフィルタリング
* 辞書の追加(neologd辞書とcsvのユーザー辞書をサポート)
* python2xとpython3xの両方で使える（たぶん）
    * python3xではしっかりとテストしていないので、気が付いていないバグがあるかもしれません

# いんすとーる

## MecabとMecab-neologd

そもそもMeCabをインストールしないといけません。

でも、前処理職人のみなさんはすでに準備ができていると思うので、割愛します。

[Mecab-neologd辞書](https://github.com/neologd/mecab-ipadic-neologd)の呼び出しもサポートしているので、インストールしておくと良いです。

## 本体のインストール

`git clone git@github.com:Kensuke-Mitsuzawa/JapaneseTokenizers.git`をして、`python setup.py install`で使えるようになります。

または`pip install git+https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers`でも可能です。

# 使い方

同じ内容は[example](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers/blob/master/examples/examples.py)に書いてあるので、かいつまんで書いておきます。

## 形態素分割

入力文を用意します

`sentence = u'テヘラン（ペルシア語: تهران  ; Tehrān Tehran.ogg 発音[ヘルプ/ファイル]/teɦˈrɔːn/、英語:Tehran）は、西アジア、イランの首都でありかつテヘラン州の州都。人口12,223,598人。都市圏人口は13,413,348人に達する。'`

python2xは入力は`unicode`のみです。

python3xはどちらでも構いません。

osのタイプを指定します。
`centOS`以外なら`osType = "generic"`で良いです。
centOSだけは`osType = "centsos"`にしないといけません。
（centOSだけ、Mecabのシステムコマンドが違うためです。他にもそういうOSがあるかもしれません。。。UbuntuとMacでは動くことを確認しています。）

辞書のタイプを指定します。

* ipadicなら`dictType = ""` か `dictType = "ipadic"`
* neologdとipadicの併用なら`dictType = "neologd"`


インスタンスを初期化します
`mecab_wrapper = MecabWrapper(dictType=dictType, osType=osType)`

単語分割します。
`tokenized_obj = mecab_wrapper.tokenize(sentence=sentence)`

デフォルトだと、単語と品詞がタプルペアになった状態で返ってきます。

`tokenized_obj = mecab_wrapper.tokenize(sentence=sentence, return_list=False)`

にすると、[このクラスオブジェクト](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers/blob/master/JapaneseTokenizer/datamodels.py#L6)が返されるので、ほかの処理に使いたい場合は、このフラグを指定した方が良いです。


## フィルタリング

フィルタリングは

* ストップワードの指定して排除
* 獲得したい品詞だけ指定

ストップワードは

`stopwords = [u'テヘラン']`

のように、リストの中に文字列をおきます。(`str`でも`unicode`でもどちらも可です)

品詞で指定する場合は`[ (品詞タプル) ]`のように指定します。

品詞は３階層まで指定できるようになっています。例えば、[IPADICの品詞体系](http://www.unixuser.org/~euske/doc/postag/#chasen)で、`名詞-固有名詞-人名`が欲しい場合は `(u'名詞', u'固有名詞', u'人名')` と書きます。

`名詞-固有名詞`までで指定したいときは`(u'名詞', u'固有名詞)`です。

ここでも`str`と`unicode`の両方が入力可能です。

獲得したい品詞タプルをリストの中に置いておきます。 

`pos_condition = [(u'名詞', u'固有名詞'), (u'動詞', u'自立')]`


フィルタリングを実行します。

    filtered_obj = mecab_wrapper.filter(
        parsed_sentence=tokenized_obj,
        pos_condition=pos_condition
    )

戻り値は[このクラスオブジェクト](https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizers/blob/master/JapaneseTokenizer/datamodels.py#L61)です


# なんでそんなもん作ったんや？

簡単にまとめると

* 同じ処理をずっと書いていて無駄っぽいぞ・・・
* フィルタリングと辞書追加ができるパッケージはpythonにはないなぁ・・
* 世の前処理職人に少しでも貢献したい

というモチベーションです。

私は自然言語処理前処理係を長くやってきてまして・・・くる日も来る日も前処理、ときには他人の研究の前処理までやってあげる聖人ぶり。。。。

でも、ある時、ふと気がついたのが、__「形態素分割の部分って毎回のように同じ処理を書いてるんじゃね？」__

そこで、何度も同じことをやってきた中で、特によく使ってきた（使うであろう）処理だけをまとめてパッケージ化してしまったわけです。

Pythonで似たことができるパッケージに[natto](https://pypi.python.org/pypi/natto-py)があります。

ただ、nattoでもフィルタリングの処理をやっぱり書かないといけなかったり、辞書追加ができなかったりと、不便に感じてしまったので、新しく作ってしまいました。

これから前処理職人になる貴方も、すでに現役前処理職人の貴方にも！少しでも作業を軽減して、楽しくNLPができるようになることを祈っています。
underscoreコードリーディング（contains）

underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##containsとは


###[underscorejs.orgのcontains](http://underscorejs.org/#contains)

こんな説明。
>####_.contains(list, value, [fromIndex]) Alias: includes 
>Returns true if the value is present in the list.
>Uses indexOf internally, if list is an Array.
>Use fromIndex to start your search at a given index.

```javascript
_.contains([1, 2, 3], 3);
=> true
```

------------- 
_.includesにエイリアスが張られている

listの中に第二引数で指定したvalueが存在する場合trueを返す
listがArrayの場合は内部ではindexOfを利用します。
fromIndexを指定することによって開始位置を指定して検索することができます。


つまり


```javascript
'use strict';

var _ = require( "underscore" );

console.log( _.contains( [ 1, 2, 3, 4, 5 ], 2 ) ); 
//-> true
console.log( _.contains( [ 1, 2, 3, 4, 5 ], 2, 3 ) );
//-> false
```

となる


###[underscore.contains](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L263)

コード的にはこのあたり。

```javascript

  // Determine if the array or object contains a given item (using `===`).
  // Aliased as `includes` and `include`.
  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
    if (!isArrayLike(obj)) obj = _.values(obj);
    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    return _.indexOf(obj, item, fromIndex) >= 0;
  };
```


aliasはinclude/includes両方に張られている(説明とはズレが有る)


objがArrayじゃなかった場合、obj = _.valuesとなる
fromIndexがnumberじゃなかった場合、またはguardが存在する場合、fromIndexは0となる
_.indexOfが0以上の場合true/そうでない場合はfalseが返される
gitlabのはなし


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


## はじめに
私たちのチームは `GitLab ` というツールを使っています。
ソースコード管理サービスに、 `GitHub` がありますが
今日は普段使っている `GitLab` について紹介したいと思います。

[ Version ]
`git version 2.4.6`


## GitLabとは
GitHubのようなサービスを社内などのクローズドな環境に独自で構築できるように公開されたオープンソース
だそうです。

見た目はこんなかんじ

![スクリーンショット 2015-12-11 15.12.13.png](https://qiita-image-store.s3.amazonaws.com/0/85603/bfd6fe0c-ec04-04a6-d2e0-67b2e5ae0180.png "スクリーンショット 2015-12-11 15.12.13.png")


ちなみにこの怖いキャラクター

![imgres.jpg](https://qiita-image-store.s3.amazonaws.com/0/85603/ae1f55e6-4451-a160-af71-359d734379dd.jpeg "imgres.jpg")


**タヌキ** だそうです
知らなかった(＠ 'ェ' ＠)
`GitHub`のオクトキャットはかわいいのに〜
![imgres-1.png](https://qiita-image-store.s3.amazonaws.com/0/85603/4b15b90b-f30f-db95-e059-d7d89f7b04d4.png "imgres-1.png")


## GitLabできること
便利な機能がたくさんありますが、
普段開発で使っている機能を紹介させていただきたいと思います。


* リポジトリ管理機能

	コミット管理、ブランチの管理などがweb上から簡単にできます。

[コミット管理]
![スクリーンショット 2015-12-14 12.49.47.png](https://qiita-image-store.s3.amazonaws.com/0/85603/c15670da-63ce-d59d-06ce-5671e41c3854.png "スクリーンショット 2015-12-14 12.49.47.png")

[ブランチ管理]
いつ誰がコミットし、どのブランチから派生したのかがわかるので
とてもわかりやすいです

![スクリーンショット 2015-12-14 12.49.28.png](https://qiita-image-store.s3.amazonaws.com/0/85603/d10ef861-58ef-dd97-7d9f-0b29c070828c.png "スクリーンショット 2015-12-14 12.49.28.png")



* Issue管理

	Milestonesやカンバンを用いてIssueの進捗状況の管理ができます。

[カンバン]
今あるIssueが一目でわかります

![スクリーンショット 2015-12-14 12.50.33.png](https://qiita-image-store.s3.amazonaws.com/0/85603/24cb4b34-7f1b-ba1f-9e62-e37d9f283465.png "スクリーンショット 2015-12-14 12.50.33.png")

[Issue管理]
タグをつけることもできます

![スクリーンショット 2015-12-14 12.50.08.png](https://qiita-image-store.s3.amazonaws.com/0/85603/6f3e71a3-cba8-15ad-4a8f-0a50399d2456.png "スクリーンショット 2015-12-14 12.50.08.png")



* コードレビュー

	pushしたときに、
	IssueとMerge Requestの紐付けも簡単にできます。
	コードレビューの相手からのコメントも登録できます。
	
[コードレビュー]
差分が一目でわかります。
気になったコードに対してコメントもできます。

![スクリーンショット 2015-12-14 12.51.03.png](https://qiita-image-store.s3.amazonaws.com/0/85603/abaea2b2-0b6d-263c-916b-df410d5dda1a.png "スクリーンショット 2015-12-14 12.51.03.png")



## 使い方
普段使っているコマンドを、
開発スケジュールと合わせて紹介させていただきます。

1.`git` にあがっている既存リポジトリを自分のローカルにコピー

```
git clone [url]
```

2.変更内容をとりこむ
リモートリポジトリの内容が自分のローカルリポジトリのブランチに反映されます。

```
git pull [repository]
```

3.ブランチを切る

`-b`　をつけると新しい名前でブランチが切れます。

```
git checkout -b [new branch]
```

4.開発完了
5.差分がどのファイルか見る

```
git status
```

コードの差分を見たいときは

```
git diff
```

6.コードの差分をインデックスに登録
`add`の後の`.`は、差分ファイル全てを指します。

```
git add .
```

7.コミット
インデックスに追加されたファイルをコミットします。
`-m` オプションでメッセージを指定できます。

```
git commit -m 'Message'
```

8.プッシュ
リモートリポジトリにブランチを作成します。

```
git push [repository]
```
POH7 安藤杏ちゃんにCゴルフで（割と真面目に）水着を着せる

ネタバレを含んでいますよ．

ゴルフと水着ってどんな組み合わせなんでしょうね．おっさんの発想ですよねこれ．
何はともあれ安藤杏ちゃんに水着を着せます．

問題はN!の下位の桁にある0を全部取り除いた数字の下9桁を出力するものでした．桁がどうやっても足りないんですよね．なのでほとんどの解答では10で割りつつ下15桁くらいを取って計算していたようです．この解答もその方針でやっています．

```c:poh7_mizugi.c
long v=1,r=1e9;main(n){for(scanf("%d",&n);v=v%10?v%(5*r)*n--:v/10;n||printf("%d",v%r));}
```
(88 bytes)

普通に計算を回すだけだと上品なコードになってしまいますね……．
悪いコードを書きたかったのですが，私の技量ではここまでのようです．

階乗のループを逆に回すと計算結果の保持に必要な桁数が減るような気がします．10の倍数が発生した時にに上位の桁が不正確になりますが，すぐに大きい数字が掛かるので不正確な桁が追い出されるんだろうと思います，たぶん．
あと，通らないNはそれなりに存在するんじゃないかと思います．確認していませんが．

きっとそのうち問題を解かない解答が出てくるんでしょうね……．
GStreamer プラグイン開発のスタートアップ


アドベントカレンダー13日目です。

### はじめに

私がこれまでに書いてきたアドベントカレンダーの記事は主に、「ツールを使って簡単にマルチメディアアプリが書ける GStreamer」という内容でした。
ですが、12/6 ～ 12/12 の6日間は yashi さんが「ライブラリとしての GStreamer 」書いていただけました。
この流れに乗って、これからは「GStreamer のプラグインを作る」というのを書いていこうと思います。

GStreamer のプラグインを「使う側」だったのが「作る側」に回るわけです。

また、これから扱う内容は [Plugin writer's guide (pwg)](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html) を翻訳した内容、かみ砕いた内容になるかもしれません。。。(私が勉強中なので)

### 環境

- Windows 10 (64bit)
- Visual Studio 2015
- GStreamer 1.6.1 (64bit)

### ゴール

Boilerplate のコードをビルドする

Chapter 3. Constructing the Boilerplate: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-building-boiler.html
Boilerplate: https://en.wikipedia.org/wiki/Boilerplate_code

### 手順

1. Visual Studio プロジェクトの設定
   1. ターゲットを x64 にする
   1. プロパティシートの適用
   1. Randomized Base Address を No にする
   1. Configuration Type を dll にする
1. Boilerplate をダウンロード
1. Boilerplate のコードだけ取り込む
1. Boilerplate のコードを修正
1. ビルド

### 詳細

#### Visual Studio プロジェクトの設定

お察しの通り、プロジェクトの設定は [Day 12](http://qiita.com/shocrunch/items/9a9b0f7bccc227b70de8) から1つ増えただけです。

なので、まずは Day 12 の内容を参照しプロジェクトの設定を行ってください。
その後、"Configuration Type を dll にする" を行ってください。

##### Configuration Type を dll にする

これ↓だけです。でも、重要です。

![prp.png](https://qiita-image-store.s3.amazonaws.com/0/97187/1f170c01-350c-bddd-209e-26a709e2f46e.png)

#### Boilerplate のコードをダウンロード

MinGW でも、Windows Git でも、なんでもいいのでコードを落としてきます。

```shell-session
$ git clone git://anongit.freedesktop.org/gstreamer/gst-template.git
```

#### Boilerplate のコードだけ取り込む

コピーするのは2つだけです。

- gstplugin.c
- gstplugin.h

どちらも "Source Files" のフォルダに取り込みます。

![dad.png](https://qiita-image-store.s3.amazonaws.com/0/97187/11e1bdeb-797e-faee-343b-7c24fcbd3f69.png)

#### Boilerplate のコードを修正

「`VERSION` が見つかりません。」と怒られてしまうので、以下を`gstplugin.c`に追加しておきましょう。

```c
#ifndef VERSION
#define VERSION "1.6.1"
#endif
```

本来はここでべた書きする内容じゃなかったような...? (調べておきます)

#### ビルド

ビルドすると `{ソリューションのディレクトリ}/x64/Debug/{プロジェクト名}.dll` が作成されます。


`{ソリューションのディレクトリ}/x64/Debug/`に移動し`gst-inspect` を使ってビルドしたプラグインの情報を見てみましょう。

※コマンドプロンプトの場合

```shell-session
> set GST_PLUGIN_PATH=.& gst-inspect-1.0 | grep plug
plugin:  plugin: Plugin
debug:  testsink: Test plugin
Total count: 168 plugins, 1213 features
```

`GST_PLUGIN_PATH`を指定することで見つけてくれました。

```shell-session
> set GST_PLUGIN_PATH=.& gst-inspect-1.0 plugin
Factory Details:
  Rank                     none (0)
  Long-name                Plugin
  Klass                    FIXME:Generic
  Description              FIXME:Generic Template Element
  Author                   AUTHOR_NAME AUTHOR_EMAIL

Plugin Details:
  Name                     plugin
  Description              Template plugin
  Filename                 .\13_PluginsOnWindows.dll
  Version                  1.6.1
  License                  LGPL
  Source module            myfirstplugin
  Binary package           GStreamer
  Origin URL               http://gstreamer.net/

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
```

しっかりと自分でビルドしたプラグインであることが確認できます :)

これで、GStreamerのプラグイン開発の Hello world ができました!!
BEMについて本気出して考えてみた〜結論が出なかった〜

# はじめに
この記事は[Gizumoエンジニア Advent Calendar 2015](http://www.adventar.org/calendars/919)の13日目の記事です。

株式会社Gizumoのひよっこエンジニアの中村です！

html・cssを書く時のclass名ってすっご〜く悩みます。
わたくし悩んじゃいます！！！

メンテナンス性や拡張性なども考えて
誰が見てもわかりやすいマークアップを心がけたいものです！

ということで今回は命名規則である「BEM」について考えていきたいと思います！


# 「BEM」ってなあ〜に？？
・Block
・Element
・Modifier
の頭の文字を取っちゃったのが「BEM」です！

ど〜ん！！！

![ベム.jpeg](https://qiita-image-store.s3.amazonaws.com/0/105304/3906f2cd-b2ab-9861-c9ea-cb18f3bb17c0.jpeg)

それぞれのclassがどのような関係にあるのかを記述してあげることにより
誰が見てもわかりやすい！を実現しちゃう方法です。

詳しくはそれぞれの役割を見ていきましょう！


##『Block』と『Element』ちゃん
『Block』はその名のとおり1つの大きなかたまり（ブロック）を指し
『Element』はそのBlockを構成している部品を指します。
いわゆる親子関係ですね！

わかりやすい例でよく例えられているのが検索フォーム！
「検索フォーム」という『Block』の中にある
・検索ワードの入力欄
・検索ボタン
が『Element』ちゃんです。おぎゃ〜！


##『Modifier』
『Modifier』は「Block」または「Element」ちゃんがちょっぴり変化した要素です。

-以上-

あか〜ん！！！

![ベロ.jpg](https://qiita-image-store.s3.amazonaws.com/0/105304/047dca51-29e9-45bc-2edc-a63c51d3be3c.jpeg)


#「BEMの書き方」ってなあ〜に？
実際に見てみよう！
こちらが「BEM」の書き方の基本形！

```lang:
block
block__element
block__element--modifier
block--modifier
block--modifier__element
```

先ほどの検索フォームの例で言うとこんな感じ！

```lang:
<div class="search">                               <!--検索フォーム-->
    <input class="search__input" type="text">      <!--検索ワードの入力欄-->
    <input class="search__button" type="submit">   <!--検索ボタン-->
</div>
```

おお！確かにこれならパッと見ただけで
「searchさん家」の「inputくん」と「buttonちゃん」だ！ってことがわかりますね！


##『Element』ちゃんの子供
『Element』ちゃんの中にさらに子要素がある場合…
どうやって書くのが良いのでしょう！？

例えばこんな風に書くのはNG？

```lang:
Block__Element__Element
```

数が増えたらえらいこっちゃ〜！

キャメルケースで書けば良いの！？

マルチクラスを使えば良いの！？

それともここが『Modifier』の出番なの！？

んん〜！！！混乱してきたよおおお！！！

（結論が出ませんでした）


#さいごに
え！？もう終わりなの！？どうなの！？

色々と調べながら書いていたら時間が足りなくなってしまいました！
疑問系で終わるという新しい感じでごめんなさい…！！！

実際に「BEM」を使いつつ理解を深めながら今度続きを書こうと思います。
（『Modifier』もちゃんと書きます！）
間違っているところがあればビシバシ突っ込み入れてください！

「BEM」はもちろん「OOCSS」も「SASS」の「extend」も気になる…！
マークアッパーへの道のりは長いのであるううう！！！

ここまでお付合いいただきありがとうございました！
一流のエンジニアさんが見たら
「何言ってんじゃ〜！」的な記事になってしまったかと思いますが
温かい目で見守ってあげてください…！

明日は頼れる兄貴！ojimaさんの出番です！
楽しみ〜！！！