OmniAICreator/Qiita-1.07M huggingface dataset:
シェルスクリプトでの == を認めているのはbashだけ？


件名が結論。
以下実験です。

まずはbashで以下を実行。

```shell
$ [ a = b ] && echo true || echo false
false
$ [ a == a ] && echo true || echo false
true
```

同じコマンドをdashで実行。

```shell
$ [ a = b ] && echo true || echo false
false
$ [ a == a ] && echo true || echo false
[: 4: a: unexpected operator
false
```

zshでもdashと同様の結果になりました。

おそらく、bashというシェルスクリプトの処理系が、if文やtest文の==を=とみなしてくれているだけなのでしょう。

求) シェルスクリプトの言語仕様の一次ソース
見つからないよー 

(追記)
コメントでのご指摘を受けたりさらに調べたりしたまとめ。

- シェルスクリプトの仕様については、POSIXの通り。
- == は独自拡張なので、bash, ksh, csh などでは使える。
- checkbashisms コマンドでチェックできて便利そう
	+ https://fumiyas.github.io/2013/12/19/portable.sh-advent-calendar.html 

また、
http://mywiki.wooledge.org/Bashism
に、bash->dashへの移植の際、よくある仕様の違いについて記述されている模様。
Windowsにおけるサービスとスタートアップの違い

# サービス
* ログインしなくても起動する（＝起動はブート時）
* 基本は管理者権限`System`で動作する
  * 他にも`Local Service`や`Network Service`で動作させることも可能
* システムで一つしか起動しない事（単一起動）が保証されている

# スタートアップ
* ログインしないと起動しない（＝起動はログイン時）
* ログインしたユーザ毎にプロセスが起動する（当然ながら実行ユーザはログインユーザ）
  * `All Users`のスタートアップに入れた場合は全ユーザ共通の項目となる
* 複数ユーザ間で単一起動しかできないようにする方法は`C#`ではフレームワークレベルで用意されている模様
  * ローカル・ミューテックスではなくグローバル・ミューテックスを使う
* `Ruby`ではロックファイルを用いて地味にやるしかない模様

# 参考資料
* [Windowsのユーザ切り替えを行った際の二重起動禁止 – GlobalMutex | C# | C# カフェ ～プログラマー達の憩い場](http://csharp-cafe.info/c/windows%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%92%E8%A1%8C%E3%81%A3%E3%81%9F%E9%9A%9B%E3%81%AE%E4%BA%8C%E9%87%8D%E8%B5%B7%E5%8B%95%E7%A6%81%E6%AD%A2-globalmutex.html)
* [＠IT：.NET TIPS Windowsアプリケーションの多重起動を禁止するには？ - C# VB.NET Windowsフォーム](http://www.atmarkit.co.jp/fdotnet/dotnettips/145winmutex/winmutex.html)
Linux - 保護機能


Linux kernel における保護機能について基礎的な内容を整理する。

## 特権レベル

特権レベルに関する用語を次にまとめる。

- CPL: Current Priviledge Level
	- Linux においてはコードセグメントの DPL と同じ
	- CS/SS の下位 2bit から確認できる
- DPL: Descriptor Priviledge Level
	- セグメントデスクリプタに記載
	- そのセグメントへのアクセスに必要とされる特権レベル
- RPL: Requested Priviledge Level
	- 特権レベルを下げるために利用する

特権レベルはコードセグメントに対して割り当てられる。
基本的にプロセスはそのセグメントの DPL に応じた特権レベルを持つ。

- Lv. 3 ... User Space
- Lv. 2 ... VM
- Lv. 1 ... VM
- Lv. 0 ... Kernel Space

CPU が実行しているプロセスの特権レベルは CPL と呼ぶ。
これは CS セグメントレジスタの下位 2bit から参照することができる。
この値をプロセスから切り替えることはできない。
ユーザプロセスが CPL を変更してシステムコールを呼び出すための仕掛けとしてはゲートが用意される。
また CPU にはその動作を制御する命令（特権命令）があるが、CPL 1-3 のプロセスがこれを実行しようとした場合は一般保護例外（Global Protection Fault）が発生する。


## セグメント保護

### リミットチェック

- セグメント範囲を超えた領域にアクセスしないようにする
- Linux では基本フラットモデルを採用しているためこの保護違反は発生しない

### タイプチェック

- セグメントレジスタに謝ったタイプのセグメントセレクタを読み込まないようにする
- セレクタがロードされたあとは、そのセグメントに対して謝った操作がなされないようにする
	- たとえば読み込みオンリーのセグメントに書き込もうとした場合など
- チェック項目
	- CS
		- コードセグメントセレクタのみロード可能（4-7）
		- セグメント無効化セレクタ（0）はロードできない
	- DS/ES/FS/GS
		- データセグメントセレクタのみロード可能（0-3）
	- SS
		- 書き込み可能なセレクタのみロード可能
		- セグメント無効化セレクタ（0）はロードできない

### 特権レベルチェック

#### DS/ES/FS/GS/SS セグメントレジスタ更新保護

プログラムはメモリから読み書きするときに DS/ES/FS/GS/SS を利用する。
これのためにセグメントレジスタを更新してセレクタをロードしておく必要が有る。
このロードにおいて誤った特権レベル関係にならないようにするのがこの保護機能。
たとえば CS の DPL=3 のプログラムのために DPL=0 のセグメントをロードすることはできない。
セレクタの RPL には通常は CPL と同じ値を入れる。
たとえば DPL=3 のセグメントに対して CPL3 のプログラムがアクセスしたい場合は RPL=3 としてセレクタをレジスタにロードする。
これは DPL=CPL=RPL となるので OK。
RPL の役割は Linux ではあまり重要ではない。

#### CS セグメントレジスタ更新保護

CS セグメントレジスタの更新は CPL が変更される可能性を伴う（特権レベルの移行）
移行先セグメントの DPL が CPL と同じ場合のみ更新可能となる。
この規則だけだと特権レベルの移行が不可能になるが、これに対しては CPU の用意するゲートを用いて実現する。
トラップゲートと割り込みゲートについては別稿で述べる。
64bit mode は syscall 命令で移行する。

## ページ保護

ページング機能が有効な状態ではページテーブルの内容に基づいてアクセス保護が行われる。
保護フラグはページディレクトリなどの上位にも適用される。
ディレクトリとテーブルで内容が異なる場合はリーフに近いほう（この場合はテーブル）が優先される。
つまり IA-32 の場合は、メモリにアクセスするために最大で3回の保護チェックをパスしないといけない（PSE が有効な場合は2回）
ページ保護に使われるのは U/S と R/W の2つのフラグになる。

### U/S フラグ保護

U/S の単語それぞれは User/Supervisor の頭文字をとっており、つまりページフレームにアクセス可能な特権レベルを指す。
User は CPL=3 であり、Supervisor は CPL=0-2 である。
Supervisor は全てのページフレームにアクセスできるが、User は U/S フラグがセットされているページフレームでなければアクセスできない。
たとえばカーネルメモリなどは U/S フラグがリセットされていて User からアクセスすることはできない。


### R/W フラグ保護

ページフレームの読み出しと書き込みの権限を保護する。
R/W フラグがリセットされているページフレームに対しては書き込みを行うことができない。
ただし CR0 レジスタの WP フラグがリセットされている場合は、Supervisor のみ、この保護が無効化されて R/W がセットされている User のページフレームにも書き込むことができる。
R/W フラグ保護機能は Copy on Write 機能を実現するために用いられる。
2つ以上のプロセスに共有されているページフレームに共有のマーキングとして R/W フラグをセットしておくことで書き込み発生時に例外を起こせるため。
Linux - ページング


Linux kernel におけるページングについて基礎的な内容を整理する。

## 動作原理

### 32bit

#### 基本

2段階の変換テーブルでページングを行う。

1段階目を Page Directory と呼ぶ。
4KB の大きさで 4byte の Page Directory Entry (PDE) を 1024 個含む。
Page Directory の物理アドレスは CR3 レジスタに格納される。

リニアアドレス上位 10bit が Page Directory のインデックスとして利用されて2段階目の変換テーブルである Page Table の物理アドレスが引き当てられる。
なお、ページフレームは 4KB 境界に合わせられるので、下位 12bit は 0 となる（4KB = 0x1000）
つまり Page Table を引き当てるには 20bit あればいい。
そうなると PDE 4byte = 32bit のうち 12bit は余るわけだが、そこには存在フラグや Dirty フラグなどが割り当てられている。

引き当てられた Page Table も Page Directory と同様に 4byte の Page Table Entry (PTE) を 1024 個含む（大きさは 4KB）
PTE を引き当てるためには PDE を引き当てるために使われた 10bit に続く 10bit がインデックスとして利用され、その結果ページに対応するフレームの物理アドレスが解決される。
こちらも PDE と同じ道理で 20bit しかつかわないので残りの 12bit で同じくフラグを制御している。

#### 拡張

Page Directory のみを用いる。
CR4 レジスタのビットをセットすることでこの動作が可能となる。
このレジスタをセットすると Page Size Extention (PSE) が有効になる。
PSE では 4KB, 4MB のフレームが混在しても構わないが、CR4 だけだと PDE の指す物理アドレスが Page Table なのか 4MB のページフレームなのかがわからない。
そこで PDE の 7bit 目を利用して、これを判別するようにしている。

PSE で 4MB フレームを使うメリットは TLB のキャッシュヒット率が上がることにある。
CPU は 4KB, 4MB フレームで別々の TLB を設定しているため、効率良く動作することが期待できる。
頻繁に参照されるカーネルは 4MB フレームを利用して動作効率を引き上げている。
ただし一方で小さなプログラムにおいては、たとえば 2KB のサイズなのに 4MB のフレームを占拠しているといったことが起こり得る。

### 64bit

#### 基本

64bit mode においては仮想メモリ空間が 48bit もあるので、2段階のテーブルでは非効率になってしまう。
そこで新たに2つの上位層を導入してアドレス解決を行っている。

テーブルのサイズは変わらず 4KB のままで、Page Map Level4 (PML4), Page Directory Pointer (PDP) の2つが使われる。
それぞれエントリの呼称は PML4E, PDPE となる。

32bit のときはエントリのサイズが 4byte だったが、64bit では扱うアドレスサイズも増えたので 8byte に拡張されている。
その代わりにエントリ数は半分になっている。
また、32bit では 10bit x 2 + 12bit = 32bit で引き当てていたが、64bit では 9bit x 4 + 12bit = 48bit で引き当てている。
8byte = 64bit なので 32bit と同様のフラグで使っても余る領域があるが、これは将来の CPU 進化にむけた予約領域として取られている。
32bit 時と違うものとして 63bit 目に XD フラグの領域がある。
これはバッファオーバフロー攻撃を防ぐためのもので、これが設定されているフレームではプログラムの実行ができなくなる。
AMD CPU では NX と呼ばれる。

#### 拡張

32bit 時と同じく PDE の 7bit 目をセットすれば PSE を利用することができる。
ただし引き当てに使われるアドレスが 1bit 減って 9bit になっている都合上、4MB ではなく 2MB ページフレームとなる。
さらに一部の CPU では PDPE の 7bit 目をセットすると 1GB ページフレームが利用できる。

## TLB

Page Directory や Page Table は全てメモリ上にあるデータ。
リニアアドレスを物理アドレスに解決するために毎回 PDE, PTE にアクセスしにいくのは非効率的。
よって CPU には直近でアクセスした PDE, PTE をキャッシュするための機構があり、これが Translation Lookaside Buffer。
TLB が満タンになったときは CPU が頻度の低いキャッシュを選んで捨てている。
ほとんどのプログラムでは参照局所性が見られるため、この機能がある。
【Ruby】中間の日付，時間を取得する

# 中間の日付（`Time`, `Date`, `DateTime`）の取得

日付A〜日付Bのちょうど真ん中の日付が必要な時に．

## コード例

```ruby
started_on = Date.new(2015, 4, 1)
ended_on = Date.new(2015, 7, 31)

[*started_on..ended_on].tap { |r| break r[r.size / 2] }
# => Mon, 01 Jun 2015
```

例では`Date`を用いているが，`DateTime`や`Time`でもつかえる…はず．

~~いつ使うんだこんなの．~~

## 解説

* `[*started_on..ended_on]`: 2つの日付を`Range`化し，配列に変換
* `range.tap { |r| break r[r.size / 2] }` `tap`内`break`で値が返ることを利用し，rangeの中間を得る
【jQuery】background-sizeプロパティをIE8以下に適用させる


CSS3の background-size: coverは要素いっぱいに背景画像をフィットさせてくれるので、
特にレスポンシブデザインをするときなんかには便利ですね。

ただし、IE9以上からの対応となります。
IE8以下でbackground-sizeを使用可能にするにはjQueryプラグインを使用します。

#Usage

①　まずは下記ページからファイルをdownloadします。

[github backgroundSize.js](http://louisremi.github.io/jquery.backgroundSize.js/demo/)

②　jqueryとbackgroundSize.jsを読み込みます。

③　background-sizeを適用させたい要素に対して下記記述をすれば適用されます。

```js:script.js
$(function () {

  //background-sizeを適用させたい要素
  $('element').css('background-size', 'cover/contain/幅*高さ');
  
});
```


もちろんIE9以上用に、CSSにもbackground-sizeを指定します。

それと、このプラグインを適用させてもCSSのbackground-sizeとは少し差異が発生するようです。
（background-positionやらheight周りをいじくる必要がありそうです。）

なので、ブラウザチェックは入念にしましょう。


## ※2015.04.06追記

 こういったやり方もある模様
http://norm-nois.com/blog/archives/1414
DataTables事始め

Table(表)に色々な表現を付ける事が可能な、[jquery pluginであるDataTables](https://datatables.net/)を使い始めたので、Tipsをチラ裏します。主に、膨大にある拡張機能でビビッと来た機能を紹介します。


* [表示する列を個別に設定できる：その１](https://datatables.net/extensions/colvis/)
* [表示する列を個別に設定できる：その２](https://datatables.net/examples/api/show_hide.html)
* [Fixed Header、スクロール時にHeaderが上部に固定表示される](https://datatables.net/extensions/fixedheader/)
* [幅に応じて動的に表示列数を増減させる](https://datatables.net/extensions/responsive/examples/display-control/auto.html)
* [Responsible design](https://datatables.net/extensions/responsive/)
* [条件に合うCellをHighlight表示](https://datatables.net/examples/advanced_init/row_callback.html)
* [PageやOrderingの設定を覚えておく(HTML5のLocalstorageを使用)](http://datatables.net/examples/basic_init/state_save.html)
* [検索Box (Keydownで検索を発火してくれる](https://datatables.net/examples/api/multi_filter.html)
* [行の省略表記(Collapse/Expand)](http://legacy.datatables.net/ref#sWidth)
* [PagnationをOffして行を全て表示](https://datatables.net/reference/option/paging)
マテリアルデザインについてのざっくりまとめ ～Components編その4～

[Material design](http://www.google.com/design/spec/material-design)のガイドをざっくり読んだのでざっくりまとめます。

[マテリアルデザインについてのざっくりまとめ ～Components編その1～](http://qiita.com/hishida/items/67973d800e5453c32f84)
[マテリアルデザインについてのざっくりまとめ ～Components編その2～](http://qiita.com/hishida/items/ca67dd190c20c0d9cb2d)
[マテリアルデザインについてのざっくりまとめ ～Components編その3～](http://qiita.com/hishida/items/7427de0f33bca2219078)

この記事では[Components](http://www.google.com/design/spec/components)の Switches ～ Tooltips についてまとめます。

# Switches
* 項目の選択などに使用する。
* Checkbox
    * 複数の項目のON/OFFを選択する場合に使用する。単一項目のON/OFFのみの場合はSwitchを使用すべき。
* Radio button
    * 複数項目から1つを選択する場合に使用する。
    * 選択肢が一度に見られるようにしたい場合はRadio buttonが有効。スペースを節約したい場合はプルダウンメニューも使用可能。
* Switch
    * 単一項目のON/OFFを設定する場合に使用する。
    * 「ON」「OFF」などの文字列が表記されているのは推奨されない。
* モバイル端末でタッチしたときに放射状にUIを変化させると、指で塞がれて見えない場合にもわかりやすくすることができる。

# Tabs
* グルーピングされたコンテンツの表示に使用する。
* 固定位置に一列で表示し、ネストしない。
* 選択されているタブはハイライトする。
* 見出しの文字列を省略・リサイズ・複数行表示しない。（この場合はスクロール可能なタブを利用する）
* 見出しはアイコンと文字列を混在させない。

# Text fields
* テキスト入力に使用する。
* Single-line text field: 単一行の入力。カーソルが右端に達したら入力時左にスクロールする。
* Floating labels: テキストフィールド内のラベル（ヒント）が、入力を始めるとテキストフィールド上部に浮き上がる。
* Multi-line text field: 複数行の入力。カーソルが下端に達したら入力時縦スクロールする。
* Full-width text field: 画面幅いっぱいの入力。単一行・複数行ともに適用可能。
* Character counter: 文字数制限の表記。「現在の文字数 / 最大文字数」の形式で、制限オーバーの際はわかるように表記する。
* Auto-complete text field: ドロップダウンまたはインラインで入力候補を表示する。
* Search filter: アプリバーへの入力により、フィルター＆ソートされたコンテンツが下に表示される。

# Tooltips
* フォーカス時に表示されるツールチップ。マウスオーバー、タブキーでの移動、タッチなどでフォーカスする。
* アイコンなどのグラフィカルな要素に対して表示する。文字列要素に対しては表示しない。
* 多くの情報（画像やフォーマットされた文字列など）を表示しない。
* 吹き出しのように方向を表示しない。代わりに、対象の要素から発生するような動作で表現する。
古いUbuntuにCryptominisat4をインストールする方法

[Cryptominisat4](http://www.msoos.org/cryptominisat4/)をインストールするのに、g++-4.8以降が必要だったので、[How to Install GCC 4.8 via PPA in Ubuntu 12.04, 13.04, 10.04](http://ubuntuhandbook.org/index.php/2013/08/install-gcc-4-8-via-ppa-in-ubuntu-12-04-13-04/) にあるように、

```
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install gcc-4.8 g++-4.8
```

とした上で、[CMakeでデフォルトのコンパイラを書き換える微妙な方法](http://d.hatena.ne.jp/mi_mutsuki/20130112/1357959248)を参考に、

```
$ mkdir build
$ cd build
$ cmake -DCMAKE_CXX_COMPILER=g++-4.8 ..
$ make -j4
```

とした。
IEのみやIEの特定バージョンのみにファイルを読み込ませる方法



IEはなにかとやっかいだからかこういった救済措置（？）的なものが存在します。

コンディショナルコメントというそうです。
コメントというだけに、特殊なコメントアウト方法を使用してIEさん達にだけ読み込ませたいファイルやスタイルを読み込ませることができます。

```html:index.html

<!--IE8以下では"style-ie8.css"を読み込む-->

<!--[if lte IE8]>
<link rel="stylesheet" href="style-ie8.css">
<![endif]-->

```
MySQLのBULK INSERTでデッドロックを回避する


:::note info
この記事は[haracane.github.io](https://haracane.github.io/)の「[MySQLのBULK INSERTでデッドロックを回避する](https://haracane.github.io/2015/04/05/mysql-deadlock/)」のTL;DRです。
:::

## TL;DR


> ActiveRecord::StatementInvalid: Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: INSERT INTO `books` (`id`,`name`) VALUES ...


というエラーが出たので、ソートしてからBULK INSERTするようにしてギャップロックのデッドロックを解消しました。

詳しい原因や対応などについては、以下のブログ記事をご覧ください。

https://haracane.github.io/2015/04/05/mysql-deadlock/
React.js使ってQiitaトレンド作ってみた

***
**2017/03/01**
WebサービスとしてリニューアルしてHerokuで公開しました。
[QiiTrend](https://qiitrend.herokuapp.com)
[QiitaトレンドをリニューアルしてQiiTrendを作った - Qiita](http://qiita.com/tag1216/items/e65496b932ca6790268b)

- データ取得方法を変更したので、長期間のデータが高速に取得できるようになりました。
- サーバーサイドでデータをキャッシュしているので、一度表示したデータは次回から高速に表示できるようになりました。
- Qiitaの検索オプションがそのまま使えるようになり、タグ以外の検索もできるようになりました。

***
**以下、2015/04/06の内容**

最近話題になってるReact.jsを使ってクライアントサイドだけで動く簡単なアプリを作ってみた。

ソース
https://gist.github.com/tag1216/819ded0722cedf75996f
デモ
http://bl.ocks.org/tag1216/raw/819ded0722cedf75996f/

![スクリーンショット 2015-04-05 10.34.58.png](https://qiita-image-store.s3.amazonaws.com/0/35192/10e8237b-6a0d-c185-7153-dc16383603c4.png)

# これは何？

- GoogleトレンドのQiita版。
- 指定のタグがついた投稿の件数を時系列グラフで表示する。
- データはQiitaAPIで取得している。

# 使い方

- テキストボックスにタグ名を入力してENTERを押すと、指定タグの最新100件の投稿を取得してグラフに表示する。  
  ※大文字小文字の区別はないがそれ以外はタグ名を正確に入力する必要がある。
- タグ名の横の<i class="fa fa-plus"></i>を押すと、次の100件を取得してグラフに追加する。
- <i class="fa fa-times"></i>を押すと、タグがグラフから削除される。

# JavaScript系タグを比較してみた

JavaScriptの代表的(?)なフレームワーク／ライブラリを比較してみた。

- reactjs
- AngularJS
- Backbone.js
- jQuery

![スクリーンショット 2015-04-05 12.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/35192/0cddf755-30e8-9b36-2548-82100ce2cbe8.png)

- reactjsは昨年後半から徐々に増えてきている。
- 自分の中ではBackbone.jsはAngularJSと同じくらい人気があると思っていたけど、実際はかなり少なかった。
- jQueryもまだまだ現役っぽい。
- 先月(2015年3月)はjQuery,AngularJS,React.jsの投稿数は同じくらい。React.jsの今後の伸びが気になる。

# 使ってるもの

React.js以外は目新しいものはないけど一応紹介しておく。

- [GitHub Gist](https://gist.github.com/)  
  GitHubが提供しているソースの断片を共有するサービス。
  ソースファイル(HTMLとJavaScript)の置き場所として使用。  
- [bl.ocks.org](http://bl.ocks.org/)  
  Gistに置いたHTMLをWebページとして表示できるサービス。 
  JavaScriptも実行できる。
- [React.js](http://facebook.github.io/react/)  
  Facebookが作ったUIを構築するためのライブラリ。
- [NVD3](http://nvd3.org/NVD3)  
  D3.jsを使ったグラフライブラリ。
- [D3.js](http://d3js.org/D3.js)  
  DOMにデータをバインドして動的コンテンツを表示するためのライブラリ。  
  d3.js自体はグラフ描画ライブラリではないので、グラフを表示するためにはNVD3のようなライブラリを使用するか、自分で描画処理を全て作る必要がある。
- [Qiita API v1](http://qiita.com/api/v1/docs)  
  以下の理由でv2ではなくv1を使用した。
    - v1の特定タグ投稿一覧取得は投稿日時や編集日時でソートされていない。[^1]
    - 認証なしでのリクエスト回数制限がv1のほうが多い。(v1は150、v2は60)
- [Font Awesome](http://fortawesome.github.io/Font-Awesome/FontAwesome)  
  Webフォントアイコン。

[^1]: 最初は投稿日時か編集日時の降順だと思って使っていたら部分的に古い投稿が混ざっていて、おかしいな〜何でだろうな〜と思って問い合わせてみたら、**そのタグが付けられた日時の降順**という回答を頂き、ドキュメントにも追記して頂きました。

# React.jsを使ってみて気づいたところ

## 小さいコンポーネントは可読性が良い

React.jsではJSXを使ってJavaScriptのコード内にHTMLを書くので、UIとそれに関連する処理が１ファイルにまとまる。
このため40行程度で1画面に収まるような小さいコンポーネントのソースは可読性が高い。

## 入れ子になったコンポーネントのイベント処理は面倒

A->B->Cというような入れ子になったコンポーネントで、Cで発生したイベントをAで処理したい場合、Bにもイベントを移譲するコードを書く必要なあるので少々冗長になる。

```js:
var A = React.createClass({
  onClick: function() {
    alert('onClick');
  },
  render: function() {
    return <B onClick={this.onClick} />;
  }
});
var B = React.createClass({
  render: function() {
    return <C onClick={this.props.onClick} />;
  }
});
var C = React.createClass({
  render: function() {
    return <div onClick={this.props.onClick}>Click me!</div>;
  }
});
```


---
SELinuxが有効な環境で他のユーザーのSSH公開鍵を配置する

SELinuxが有効な環境で他のユーザーのSSH公開鍵を配置するときは、ファイルのラベルに注意する必要がある。

例えば、rootのホームディレクトリーに最初にファイルを作成した場合はこんな感じになっているはず。（rootで作業する是非は別途検討すべき）

```shell-session
# ls -Z foo-id_rsa.pub
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 foo-id_rsa.pub
#
```

これをsshdが読めるラベルに設定しなおす必要がでてくる。

## CentOS 6.x

CentOS 6.xのデフォルトでは「ssh_home_t」に変更してやればよい。

```shell-session
# ls -Z foo-id_rsa.pub
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 foo-id_rsa.pub
# mkdir /home/foo/.ssh
# mv foo-id_rsa.pub /home/foo/.ssh/authorized_keys
# chcon -t ssh_home_t /home/foo/.ssh/authorized_keys
# chmod 700 /home/foo/.ssh
# chmod 600 /home/foo/.ssh/authorized_keys
# chown -R foo:foo /home/foo/.ssh
#
```

chcon(1)ではなくrestorecon(8)を使う手もある。

```shell-session

# restorecon -R /home/foo/.ssh
# 
```
ボルツマン選択の実装

#はじめに
ブロック崩しを攻略する人工知能を作成しています（[前回の記事](http://qiita.com/simanezumi1989/items/f3990283163a062298cc)）。

前回のコードでは，バーがの動きがランダムに選択されるか，Q値が大きいものが選択されていました。この選択の欠点はQ値があまり変わらなくても，一番大きなQ値が採用される点です。具体的には，Q(s,0)=0.3800とQ(s,1)=0.3799であれば必ずQ(s,0)が採用されるということです。
この問題を解決するために，確率的に選択をするボルツマン選択を使ってみようと思います。
※独学で作ったので適切なコードでない可能性もある

#ボルツマン選択
$A$:行動を要素とする集合
$T$:時間とともに０に収束する関数
状態$s$のときに行動$a$を行う確率$\pi(s,a)$を

```math

\pi(s,a)=\frac{exp{(\frac{Q(s,a)}{T})}}{\displaystyle \sum_{b\in A}\exp{(\frac{Q(s,b)}{T})}}\\
```
と定める。
補足：$T$は温度をイメージした関数で，時間とともに0に収束するものを選ぶ。具体的には

```math
T=\frac{1}{\log(t+1.1)}
```
など。

##今回のコードに合わせたボルツマン選択
例えば状態sの時に0を選択する確率は，Q値がQ(s,0),Q(s,1),Q(s,2)の３パターンであることから

```math
\pi(s,0)=\frac{exp{(\frac{Q(s,0)}{T})}}{\exp{(\frac{Q(s,0)}{T})}+\exp{(\frac{Q(s,1)}{T})}+\exp{(\frac{Q(s,2)}{T})}}\\
```
となる。

##ボルツマン選択の性質
今回のコードに合わせて性質を見ていく。
$T$が十分大きいとき，すべての確率は均等に近くなる。
例えば$T\to \infty$のとき$\exp{(\frac{1}{T})}\to 1$ より

```math
\pi(s,0)\to\frac{1}{1+1+1}=\frac{1}{3}
```

$T$が十分0に近いとき，Q値の大きい行動の確率が1に近くなり，他の確率は0に近くなる。
例えば $Q(s,0)=\frac{1}{2},Q(s,1)=\frac{1}{6},Q(s,2)=\frac{1}{3}$　のもとで, $T\to 0$のとき$exp(\frac{Q(s,a)}{T})$の増加するスピードがもっとも速いのは$Q(s,0)$なので

```math
\pi(s,0)\to 1\\
\pi(s,1)\to 0\\
\pi(s,2)\to 0
```
となる。

#javascriptコード

```js
//ボルツマン選択
function Boltzmann(x,y,z,T){
	var myQ = [Q(x,y,z,0),Q(x,y,z,1),Q(x,y,z,2)];
	var prob = new Array(3);
	for(var i=0;i<3;i++){
		prob[i] = Math.exp(myQ[i]/T)/(Math.exp(myQ[0]/T) + Math.exp(myQ[1]/T) + Math.exp(myQ[2]/T));
	};
	var r = Math.random();

	if(r < prob[0]){
		return 0;
	}else if(r < prob[0]+prob[1]){
		return 1;
	}else{
		return 2;
	};
};
```

##コードの説明
ボルツマン選択よりも，確率の実装がややこしかったので，確率の実装

```js

	var r = Math.random();

	if(r < prob[0]){
		return 0;
	}else if(r < prob[0]+prob[1]){
		return 1;
	}else{
		return 2;
	};

```
について説明します。
例えばボルツマン選択によって定められた確率がそれぞれ

```js

prob = [1/2,1/6,1/3]
```
なら

```js

	var r = Math.random();

	if(r < 1/2){
		return 0;
	}else if(r< 4/6 ){
		return 1;
	}else{
		return 2;
	};

```
となります。このとき0から1までを，1/2 : 1/6 : 1/3 に分けて，ランダムに選択した0≤r≤1がどこに入るかで確率を実装しています。

#結果
うまくいかない。
２回ほどボールを拾うのみです。

#課題
なかなか学習しない。
##原因
Q値が変化しにくいからだと思います。Q-learningの性質上，同じような状況でボールを何回も拾えば，拾う数回前の行動のQ値まで評価されていきます。一方，今回のように同じような状況でボールを拾える回数が少ない場合は，ボールを拾ったその行動のQ値のみ大きく評価され，他のQ値はあまり変わりません（推測）。
##解決策
Q値の評価を過去にも反映させる方法を実装してみようと思います。具体的な話は実装してから書きます。

#参考資料
[Q学習wiki](http://ja.wikipedia.org/wiki/Q学習)
#最後に
実装方法は手探りなので，根本から間違っているかもしれません。
アイデアやアドバイスがある人は教えて下さい。
新社会人に捧げるコミュニケーションTips: モノゴトの説明の仕方

新社会人に捧げるコミュニケーションTips: モノゴトの説明の仕方

# 新社会人あるある
	先輩: 君の書いた報告書に書いてある，この〇〇って何？
	緊張気味の私: えっと，〇〇とはああでこうでああで．．．
	先輩: ...よくわかんないんだけど
	私: 「」
新社会人になったとき最初に思ったのは，「緊張しているにせよ，モノゴトを説明するのがこんなに難しかったなんて！」ということだった．
よくよく考えてみると，モノゴトにはたくさんの側面があって，伝えるべき候補はたくさんある．
一体何を説明してあげたらいいの？同じ悩みを抱えることになるであろう後輩たちのために考えてみた．

# なにが原因か
極端だけど，下手くそな説明は大体こんなことになってることが多い．

	先輩: 「ドア」ってなに？
	私: 部屋の入り口につけて部屋と廊下を遮断するためのやつです．

もしくはこんな感じ．

	先輩: 「ドア」ってなに？
	私: 大きな板で，真ん中に取っ手が付いてて，それをひねると．．．．

前者だったら先輩は「ドア」が何なのか具体的なイメージがつかないし，
後者だったら先輩は「ドア」なるものが一体何のためにあるのか，理解できない．

# 解決策

人間は欲張りな生き物で，「これはなに？」と聞いた瞬間に __役割__と__実体__の２つを同時に問うている事が多いようだ．
だからそんな疑問に応えるためには，そのモノゴトの__役割__と__実体__を両方を伝えてあげればいい．

	先輩: 「ドア」ってなに？
	私: 部屋の入り口につけて外と遮断するための（役割），取っ手のついた大きな板（実体）です．
	先輩: なるほど！

もし先輩が意を得ないようだったら，それは__役割__と__実体__のどちらかの説明が悪かっただけ．
冷静に問題を切り分けて相手が求めている方を丹念に応えてあげよう．

	先輩: 外と遮断する？
	私: 外から部屋の中が丸見えだと嫌じゃないですか．それを隠してくれるんですよ．
とか．

	先輩: 取っ手？
	私: 取っ手を持ってドアを開けたり締めたりできるんですよ．

# 結論
とりあえず，モノゴトを説明するときは

* そのモノゴトの役割
* そのモノゴトの実体

の二点を必ず説明にいれるようにしよう．そうすればだいたいはなんとかなる．

# Appendix: ケーススタディ

## Qiita
Qiitaを参考にしてみよう．
[Qiitaとは](http://qiita.com/about) のページには

> "Qiitaは「プログラミングに関する知識を記録、共有する最適なサービス」です."

とある．この一文でQiitaの__役割__が「プログラミングに関する知識を記録、共有する」ことだということは分かる．
でも__実体__はこの一文からはよくわからない．．．何「最適なサービス」って．

と思ったけど，この場合__実体__はその下の画像によく現れている.
![image](https://qiita-image-store.s3.amazonaws.com/0/51256/b2081456-19f0-7b4e-8c40-504036aa4f35.png)
この画像を見れば

* Tipsやcodeをpostする先であること
* Webサービスであること
* 画面イメージ

などが雄弁に語られている．
そして更にその下には，「Qiitaの特徴」と題してQiitaの__実体__の記述が続く形となっている．
ansibleで特定のtaskを特定のhostに実行する

playbookの開発中は動作確認しながら開発していくと思いますが、そんな時は特定のtaskを特定のhostに実行すると動作確認が楽です

以下のように実行します

```bash
ansible-playbook -i test-inventory -l test-server --start-at='target task name' --step test.yml
```

オプションの内容は以下になります

|オプション|内容|
|:--|:--|
|-i|inventoryを指定|
|-l|実行対象の[host-pattern](http://docs.ansible.com/intro_patterns.html)を指定|
|--start-at|実行したいtaskのnameを指定する。<br />指定したnameのtask以降は全部実行されてしまうので、<br />対象のtaskのみ実行したい場合は--stepをつける|
|--step|taskごとに実行するかしないかを確認する|
Raspberry PiをWiringPiとJohnny-FiveのRaspi-ioを使ってLチカする

[Johnny-Five](https://github.com/rwaldron/johnny-five)にはArdiono以外でもFirmata互換のインタフェースを使えるようにする[IO Plugins](https://github.com/rwaldron/johnny-five/wiki/IO-Plugins)があります。Raspberry Pi用の[Raspi-io](https://www.npmjs.com/package/raspi-io)を使ってLチカをしてみます。GPIOピンアサインが正しいことを[WiringPi](http://wiringpi.com/)を使って確認します。


## ブレッドボード配線

Raspberry PiにLEDを配線します。アノードはGPIO17(P1-11)と接続します。抵抗器は1.0K ohmを使いました。

![raspi-led2.png](https://qiita-image-store.s3.amazonaws.com/0/43745/6cc6ba21-d803-845e-e061-2beb39951649.png)

## WiringPi

[WiringPi](http://wiringpi.com/)をインストールします。WiringPiを使うと`gpio`コマンドでRaspberry PiのGPIOを簡単に制御することができます。

WiringPiをビルドしてインストールします。

``` bash
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
```

バージョンを確認します。

``` bash
$ gpio -v
gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
  Type: Model B, Revision: 2, Memory: 512MB, Maker: Egoman
```

### 使い方


GPIO17 を点灯します。

``` bash
$ gpio -g write 17 1
```

GPIO17 を消灯します。

``` bash
$ gpio -g write 17 1
```

## Raspi-io

プロジェクトを作成します。

``` bash
$ mkdir -p ~/node_apps/raspi-io-led
$ cd !$
```



package.jsonに必要なパッケージを記述します。

``` json:~/node_apps/raspi-io-led/package.json
{
    "name": "raspi-io-led",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "johnny-five":"0.8.50",
        "raspi-io": "3.1.0"
    },
    "scripts": {"start": "node app.js"}
}
```

`npm install`します。

``` bash
$ npm install
...
raspi-io@3.1.0 node_modules/raspi-io
├── raspi-board@2.1.1
├── raspi-gpio@1.2.1 (raspi-peripheral@1.1.1, nan@1.6.2)
├── raspi-pwm@1.3.1 (raspi-peripheral@1.1.1, nan@1.6.2)
├── raspi@1.3.0 (nan@1.6.2, raspi-wiringpi@1.0.4)
└── raspi-i2c@1.0.0 (ini-builder@1.0.3, raspi-peripheral@1.1.1, execSync@1.0.2, i2c-bus@0.11.1)
```

app.jsを書きます。P1-11(GPIO17)をLチカします。

```js:~/node_apps/raspi-io-led/app.js
var raspi = require('raspi-io');
var five = require('johnny-five');
var board = new five.Board({
  io: new raspi()
});

board.on('ready', function() {
  (new five.Led('P1-11')).strobe();
});
```

LEDを操作する場合`sudo`が必要です。プログラムを実行するとLチカが始まります。

``` bash
$ sudo npm start

> raspi-io-led@0.0.1 start /home/pi/node_apps/raspi-io-led
> node app.js

1428244040441 Device(s) undefined
1428244040574 Connected RaspberryPi-IO
1428244040653 Repl Initialized
>>
```
PHPUnitのログ(XML)をマージする方法

自分への備忘録を兼ねて。


# はじめに

プロジェクトで [Phing](https://www.phing.info/) を利用してPHPUnitを実行していくと、テストケースの数が多くなってきて実行時間が問題になるというのはよくあることだと思います。
[こちら](http://blog.tojiru.net/article/253157654.html) にもあるように [@groupアノテーション](https://phpunit.de/manual/current/ja/appendixes.annotations.html#appendixes.annotations.group) を使って必要なケースのみを実行するというのも考えたのですが、テストの実行数を減らさずに解決する方法がないか考えた結果、テストを並列で実行した上で、テスト結果のログをマージする方法を考えてみました。
コードカバレッジのマージについては [こちらの投稿](http://qiita.com/ngyuki/items/2f0defdee91a2cb8040f) があったので、JUnit XML形式で出力されたログをマージする方法を書いておきます。


# 必要なこと

[merge-phpunit-xml.php](https://gist.github.com/sebastianbergmann/4405658#file-merge-phpunit-xml-php) を導入する。
以上。

## 補足というか言い訳

「phpunit log xml merge」でググったところ、PHPUnitの開発者であるSebastian Bergmann氏自身が投稿したGistを見つけたため、大きな工夫をする必要も無く実現出来てしまいました:D


# その他

ということで、ログのマージができるようになったので、テストの並列実行が実現出来るようになったら、こちらについても書いてみたいと思います。


# 参考

* [規模別PHPUnitでのテストの書き方いろいろ](http://blog.tojiru.net/article/253157654.html)
* [複数回に分けて実行した PHPUnit のコードガバレッジを phpcov でマージする](http://qiita.com/ngyuki/items/2f0defdee91a2cb8040f)
TwitterのTLをMongoDBに収める．

```
sudo apt-get -y install npm
```

npm: node package manager, Node向けパッケージ管理ツール
http://gihyo.jp/dev/serial/01/nodejs/0002

```
$ npm install twitter
```

bot.js作成
http://tips.hecomi.com/entry/20120721/1342876520

(Debian/UbuntuでNode.jsをインストールする(nvm))[http://qiita.com/tamurashingo@github/items/6348863668e1e3fd70c9]


参考：(Node.js、Socket.IO、MongoDBでリアルタイムWeb (1/2))[http://www.atmarkit.co.jp/ait/articles/1210/10/news115.html]

[20 行で作る node.js による Twitter bot 作成講座](http://tips.hecomi.com/entry/20120721/1342876520)
※少し古い

[Twitter API client library for node.js]
(https://www.npmjs.com/package/twitter)
※新しい

[jdub/node-twitter]
(https://github.com/jdub/node-twitter)
※公式

### Get

```js:get.js
var util = require('util'),
    twitter = require('twitter');

var bot = new twitter({
        consumer_key        : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        consumer_secret     : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        access_token_key    : 'xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        access_token_secret : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
});


bot.get('statuses/user_timeline', {screen_name: 'taikishimba'}, function(error, tweets, response) {
    console.log(util.inspect(tweets));
});
```

```
$ node get
```

### Hello Worldとポストする

```js:post.js
var util = require('util'),
    twitter = require('twitter');

var bot = new twitter({
        consumer_key        : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        consumer_secret     : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        access_token_key    : 'xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        access_token_secret : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
});


bot.post('statuses/update', {status: 'Hello Worlds'}, function(error, tweet, response) {
    console.log(util.inspect(tweet));
    console.log(util.inspect(response));
});
```

```
$ node post
```

# Install MongoDB
MongoDBの薄い本内，はじめよう

```
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1404-3.0.1.tgz
$ tar xzvf mongodb-linux-x86_64-ubuntu1404-3.0.1.tgz
```

名前が長いので，，

```
$ mv mongodb-linux-x86_64-ubuntu1404-3.0.1 mongodb
```

```
$ cd mongodb/bin
$ touch mongodb.config
$ vim mongodb.config
```

```:mongodb.config
dbpath=/var/lib/mongodb/data
```

```
$ sudo mkdir /var/lib/mongodb
$ sudo mkdir /var/lib/mongodb/data
```

```
$ export PATH=$PATH:/home/vagrant/mongodb/bin
$ mongod --config mongodb.config &
```

### エラーが出たら
[Failed global initialization]
(http://stackoverflow.com/questions/27375137/failed-global-initialization-badvalue-invalid-or-no-user-locale-set-please-ens)

```
$ export LC_ALL=C
$ sudo mongod --config ./mongodb.config
```

とりあえずctrl+Cで終了

```
$ cd ~
$ mkdir tw2db
$ cd tw2db
$ npm install mongoose
```

以下参考サイト通りで実行可能
http://tips.hecomi.com/entry/20120908/1347094725

# References
MongoDBの薄い本
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf
Redisの薄い本
http://openmymind.net/redis.pdf
ログローテション(rotatelogs)とcronによるログファイルの削除

Apacheのログファイルをローテションさせるrotatelogs設定方法の備忘録です。

##logrotate/rotatelogsの違いについて
logrotateのApacheの設定ファイル（/etc/logrotate.d/httpd）を見てみると・・・

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[service httpd reload]とあり、ローテートのタイミングでapacheの設定ファイルの再読み込みがかかります(詳細は/etc/init.d/httpdを確認すること)。実行中のリクエストの処理を中止してしまいます。
rotatelogsはログの削除設定ができないので、apcheのログファイルは膨れ上がる恐れがあります。環境に応じて、rotatelogsかlogrotateを使い分ける必要があります。今回、設定変更のreloadをさせたくない環境を構築する機会がありましたので、rotatelogsについての設定を書きます。

##環境
centOS 6.6
Apache 2.2.15

## logrotate設定を削除
httpdをインストールすると自動的に/etc/logrotate.d/httpdができるので、このファイルを削除する。
$ rm /etc/logrotate.d/httpd
# rotatelogsの設定
/etc/httpd/conf/httpd.confを下記のように書き換えます。
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#以下をコメントアウト
#ErrorLog logs/error_log
#以下を追記
ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y-%m-%d 86400 540"

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

# 以下をコメントアウト
#CustomLog logs/access_log combined
# 以下を追記
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y%m%d 86400 540" combined
#
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


## ローテートされているかの確認
下記のようなファイル名でaccessログとerrorログが1日周期でローテートされます。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ ls /var/log/httpd/
access_log.2015-04-04 
access_log
error_log.2015-04-04
error_log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


# cronによるログ削除設定
Apacheの毎日ローテートさせたログファイルを30日分まで残し、30日超えたファイルは削除する。
ファイルの更新時間が30日経過したファイルを削除する設定にします。

### シェルスクリプトの作成

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ vi rm_rotatelogs_accesslog.sh
#シェルスクリプトがあるパスまで移動
cd /opt/backlog/httpd/logs
#更新時間が30日経過したaccess_log.を抽出して削除
find ./ -name 'access_log.*' -mtime +30 -exec rm -f {} \;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ vi rm_rotatelogs_errorlog.sh
#シェルスクリプトがあるパスまで移動
cd /opt/backlog/httpd/logs
#更新時間が30日経過したerror_log.を抽出して削除
find ./ -name 'error_log.*' -mtime +30 -exec rm -f {} \;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### スクリプトに実行権限をあたえます。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ chmod +x rm_rotatelogs_errorlog.sh
$ chmod +x rm_rotatelogs_accesslog.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
### cronの設定
$ crontab -e

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#毎日0時5分にシェルスクリプトを実行
5 0 * * * /var/log/httpd/rm_rotatelogs_accesslog.sh
5 0 * * * /var/log/httpd/logs/rm_rotatelogs_errorlog.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

これで設定は終わり。

##更新から30日経過されたファイルが削除されていることの確認
###検証方法
1.一ヶ月間に更新されたファイルを作成

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ touch -t 201503041200 /var/log/httpd/access_log.2015-03-04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.cronの時間を設定して、ファイルが削除されることを確認

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ crontab -e 
#例えば以下のように設定すれば、毎時5分にローテートされる。
5 * * * * /var/log/httpd/rm_rotatelogs_accesslog.sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rails インストール時に nokogiri 云々でコケる件

## 環境
* OS X Yosemite 10.10.1
* Homebrew 0.9.5
* gem 2.4.6

## 前提
* [Homebrew](http://brew.sh/index_ja.html)をインストールしている
* [Gem](https://rubygems.org/)をインストールしている

## 必要なファイルをインストールする
```
$ brew tap homebrew/dupes
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2
$ brew link --force libxslt
$ brew link --force libiconv
```
一応 ターミナルを再起動してくんさい


## nokogiri をインストール
```
gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
```

僕はこれで無事 rails をインストールできましたとさ！
eclipse 4.4とRedmine 2.6をMylynでつなげてみました

Eclipseをインストールする度にMylynってなんだろうと思っていたのですが、Redmine等のITSとチケットをシームレスに扱えるモノだと知りませんでした。Redmineもeclipseもよく使う場合、統合すると楽になるかもしれません。

#環境

* Windows 7（ホストOS）
* eclipse 4.4（ホストOS）
* CentOS 6.6（ゲストOS）
* Redmine 2.6.3（ゲストOS）
* Mylyn Connector: Redmine 0.4.0（eclipseプラグイン）

#セットアップ

##Redmineのセットアップ

[こだわらないならBitNami Redmineが簡単だと感じました](http://qiita.com/tacchang001/items/ced3c5f892b406b50754)に記したようにサーバ側をセットアップする。

##Redmine側のMylynコネクタをインストールする（ゲストOS/サーバ）

```bash:Mylynコネクタをインストール
$ cd $BITNAMI_ROOT
$ sudo ./use_redmine
＃ cd $REDMINE_ROOT/plugins
＃ sudo git clone git://github.com/danmunn/redmine_mylyn_connector.git
＃ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

##eclipseにRedmine 1.X用Mylynコネクタをインストールしてすぐ削除する（ホストOS/クライアント）

次のステップでインストールするプラグインはZIPファイルなので、関連するファイルがインストールされない（ようだ）。そのため、一旦Redmine 1.Xをインストールして、関連するファイルをインストールする。

サーバ側はRedmine 2.X系だが、Eclipse Marketplaceに挙げられているプラグインは使えない。よって、インストールされたことが確認できたら、すぐにアンインストールする。

##eclipseにMylynコネクタをインストールする（ホストOS/クライアント）

[GitHubのljader/redmine-mylyn-plugin](https://github.com/ljader/redmine-mylyn-plugin)のInstallation項内にリンクされている[ZIP with built plugin as P2 repo](https://buildhive.cloudbees.com/job/ljader/job/redmine-mylyn-plugin/lastStableBuild/net.sf.redmine_mylyn%24net.sf.redmine_mylyn.p2repository/artifact/net.sf.redmine_mylyn/net.sf.redmine_mylyn.p2repository/0.4.0-SNAPSHOT/net.sf.redmine_mylyn.p2repository-0.4.0-SNAPSHOT.zip)からRedmine 2用のプラグインをダウンロードする。

eclipseのInstall New Software...からそのZIPファイルを選択してインストールする。

##Mylynの使い方は省略

これでRedmineとeclipseで相互にチケットのやり取りができるようになっているはずである。

#参考

* [Redmine 2.12 と Eclipse 4.2 Junoの連携　（Apache+Subversion）](http://usysd.cocolog-pikara.com/qdx/2012/10/redmine-212-ecl.html)
* [Redmine2.x用のEclipse用のプラグイン「redmine-mylyn-plugin」](http://d.hatena.ne.jp/tatsu-no-toshigo/20150115/1421355056)
Mac OS X : rbenv で 最新の ruby をインストール 

## 環境
* OS X Yosemite 10.10.1
* Homebrew 0.9.5

## 前提
* [Homebrew](http://brew.sh/index_ja.html)をインストールしている
* [openssl](http://qiita.com/Chrowa3/items/b04e772be959cdda9ac3) をインストールしている
* readline をインストールしている

## rbenv をインストール
```
$ brew install rbenv ruby-build
```

## path を通す
.bash_profile に以下を追加

```
eval "$(rbenv init -)"
```
ターミナルを再起動し PATH を確認

```
$ echo $PATH
/User/your-name/.rbenv/shims
```

## Ruby をインストール
2015.4.5 の時点での安定版は 2.2.1 ってことでそれをインストールする

```
$ rbenv install -l
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.2.1
```

## 現在の Ruby の確認と最新への切り替え
```
$ ruby -v
ruby 2.0.0...

$ rbenv global 2.2.1
$ rbenv rehash

$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]

```

## Bundler インストール
```
$ rbenv exec gem install bundler
$ rbenv rehash

$ brew install rbenv-default-gems
```

## 設定ファイルを用意
```
$ ~/.rbenv
$ vim
```
以下の様に記述

```
bundler
rails
rbenv-rehash
```
書き終わったら default-gems として保存。これで revenv install 2.3.0とか新しい ruby を入れた時に自動で gem もインストールしてくれるようになる
Windows Form のボタン背景色変更とEnabled=falseの振る舞い


ツマラナイことで時間がかかったので、まとめておこうとおもいました。
今後 WinForm 使うことも少なくなるとは思うのではありますけれども。

# やりたかったこと
・Buttonに背景色をつける
・Buttonは状況に応じて有効(Enabled=true)、無効(Enabled=false)の状態がある
・Buttonの表示文字はボタンの有効/無効に合わせて表示色が変化する

# 困ったこと
・Enabled=false にしても、Buttonに表示している文字色が「黒」のまま
　Buttun自体は期待通り、無効表示になっている

# 解決方法
・Enabled=false にする際、一緒に Butotn.BackColor = System.Drawing.SystemColors.Control にすること。これでButtonに表示している文字色が期待通りに変化する。

# code
```csharp:code.cs

// 背景色を変更します
button1.BackColor = Color.BurlyWood;

// ボタンを無効にします
button1.Enabled = false;
// ボタンの背景色をシステム指定に戻します
button1.BackColor = System.Drawing.SystemColors.Control;

```
重いクエリを調べる

#調査用クエリ

[動的管理ビューを使用した SQL Azure の監視](https://technet.microsoft.com/ja-jp/library/gg457940.aspx)
「クエリ パフォーマンスの監視」を参照のこと。


```sql:調査用クエリ
SELECT TOP 5 query_stats.query_hash AS "Query Hash", 
    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
    MIN(query_stats.statement_text) AS "Statement Text"
FROM 
    (SELECT QS.*, 
    SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE QS.statement_end_offset END 
            - QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
```

#以下蛇足
検証で使った材料です。
まずはテーブル。

```sql:テーブル
create table test01(
    ymd int not null,
    h int not null,
    m int not null,
    s int not null,
    primary key (ymd,h,m,s)
)
```

以下のSQLを実行すると60レコードが挿入されます。
（調査用クエリはCPU Timeで調査を行っているため、実データは少量で重いSQLを実行したい）

```sql:データ生成
declare @d as datetime
set @d = sysdatetime()
set @d = '2015-1-1'

begin transaction
while @d < '2015-1-1 0:01:00' 
begin
    insert into test02 values(year(@d) * 10000 + month(@d) * 100 + day(@d),
        datepart(hour,@d),datepart(minute,@d),datepart(second,@d));
    set @d = dateadd(second,1,@d)
end
commit transaction
```

そしてCPU Timeが大きくなるようなSQLです。

```sql:計測対象のSQL
select 2,count(*) from test02 a
 inner join test02 b on a.ymd=b.ymd
 inner join test02 c on a.ymd=c.ymd
 inner join test02 d on a.ymd=d.ymd
 inner join test02 e on a.ymd=e.ymd
```

実行時間が33秒。
なお、実行環境はWindows Azure、SQL DatabaseのBASICを使用しています。

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/70056/d01da029-451b-4c33-c8b0-60bd8604ed52.png)

Avg CPU Timeが1708400と出ています。

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/70056/f5753f5d-0bdc-d0cb-8fa1-6463f0f7a637.png)

Azureポータルから確認するとDATA IOが0%でCPUがいっぱい回ってることが分かります。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/70056/bac382d0-84f6-421a-35ab-cfd5df0bac5c.png)
WEBサイトのアニメーションはどうやってつけるの？

WEBサイトでアニメーションをつけるにはどうすればいいのでしょうか？

・ページ起動直後に、いくつかの画像が動く
・マウスの位置によって画像が動く

などのアニメーションをつけたいと思っています。

マウスなどの動きに影響しないものであれば、gif画像などを使用すればいいかと思いますが、
上記2つはどうすれば実現できるのでしょうか・・・？

HTMLやCSS、Javascrpitの入門書を勉強したのですが、
そこがわかりませんでした。

各画像をJqueryのanimateを使用して、動かすしか方法がないのでしょうか？

参考にすべきサイト、本などでも良いので、
どなたかご教授ください・・・。
SimpleCV 1.3.0をOpenCV 2.4.10の上で

知っている人は知っている、O'Reilly本「Practical Computer Vision with SimpleCV」のタイトルにもなっている [**SimpleCV**](https://github.com/sightmachine/SimpleCV) ですが、標準のディストリビューションでは **OpenCV ver2.3.1**(2011年8月リリース)と組み合わせることになっています。流石にこれは古すぎるので、直近の **OpenCV ver2.4.10**(2014年10月リリース)と組み合わせて正常に動くか試してみました。

##置き換え作業 [Windows7の場合]
私のPCには既に *SimpleCV* をインストール済みだったので、これを元に必要なパッケージだけを更新しました。とは言え、せっかくの機会なので *SimpleCV* もGitHubの最新のスナップショット(2015年3月現在)に入れ替えました。

作業は至って簡単。

1.SimpleCVの"requirements"に追加された *svgwrite* を pipを使ってインストールする
> pip install svgwrite

2.SimpleCVのスナップショットを付属の setup.py でインストールする
> python setup.py intall

3.OpenCV ver2.3.1を削除し、新たにOpenCV ver2.4.10をインストールして、ディレクトリ "OpenCV2.4.10\build\x86\vc10\bin" 辺りをPATHに通す(Pythonのビルド条件に合ったものを選択ね♫)

4.OpenCVに付属の cv2.pyd ("OpenCV2.4.10\build\python\2.7\x86"にある)を Pythonのライブラリ・ディレクトリ"Python\Lib\site-packages"に上書きコピーする。

たったこれだけでした:sweat_smile: 簡単過ぎ

##動作テスト
SimpleCV付属のユニット・テスト一式と「Practical Computer Vision with SimpleCV」のサンプル・コードで動作確認を行いました。

1.ユニット・テストの結果
・OpenCV付属の cv2.pyd(Pythonインターフェイス)がBUGっているようで、FREAK特徴量関連のテストでPythonが御臨終あそばします。
・SimpleCVにも2～3個BUGがありましたが、こちらは只今PULLリクエスト中。

2.サンプル・コードの結果
・丸いもの検出が下写真の通り正しく出来ました。

![simplecv2.jpg](https://qiita-image-store.s3.amazonaws.com/0/14158/891edb77-0378-e05e-b407-d7674f743948.jpeg)

##あとがき
と言うことで、OpenCV ver2.4.10の下でもSimpleCVで遊べそうです。
尤も、ver2.3.1⇒ver2.4.10のバージョンアップで追加になった機能は自助努力でインプリメントですが…
jenv使ってJDKのバージョン管理

最近はJava8の記事がよくでてきてますよね。

私も「まずはためしに使ってみよう！」って始めようとした時、

* あれ、今入っているJava7はどうなるんだろ？
* Java8入れるとシステムデフォもJava8になるのかも
* シンボリックリンクとかゴニョゴニョとか？うーん、めんどうそう...

となりました。

ただ、GVMとかpyenvとかすでに使ってたので、もしかしてJavaにもxxenvがあるのかも？
と探したらありました。

jEnv - http://www.jenv.be/

これを使うと、システムのデフォルトはJava7、このプロジェクトフォルダはJava8とか
できて、JAVA_HOMEやらシンボリックリンクやら頑張らなくてもよくなります。

# インストール
http://www.jenv.be/ にとても簡単にまとまってます。
私はOSX使っているので、Homebrewでいれました。

```
$ brew install jenv
```

その後、jenvへのパスを通すようにします。
.bashrcとか.bash_profileらへんに以下のような追記を。

```bash
if which jenv > /dev/null; then
  # JENV_ROOTがemptyの場合、'${HOME}/.jenv'がrootと設定される
  export JENV_ROOT=/usr/local/var/jenv
  eval "$(jenv init -)"
fi
```

で、`source ~/.bashrc`して反映

次にjenvへ管理したいJDKを登録します。
私のOSXだと、こんな感じ。面倒だったので6から8まで入れました。

    $ jenv add /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    $ jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home
    $ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home

`jenv versions`と叩くと、管理対象になったバージョンがリストアップされます
リストアップ内容はインストール環境によって異なるかも。

```
$ jenv versions
  system
  1.6
  1.6.0.65
  1.7
  1.7.0.60
  1.8
  1.8.0.25
  oracle64-1.6.0.65
* oracle64-1.7.0.60 (set by /usr/local/opt/jenv/version)
  oracle64-1.8.0.25
```
# 使い方の例
システムデフォルトはjava7にして、特定のフォルダのみjava8使う

## システムデフォルトをJava7に
`jenv global {version}` でシステムデフォルトのJDKを設定

```
$ jenv global oracle64-1.7.0.60
$ java -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
```
## java8-hogeフォルダはJava8に
`jenv local {version}`で指定ディレクトリでのJDKを設定

```
$ mkdir java8-hoge && cd java8-hoge
$ jenv local oracle64-1.8.0.25
$ java -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
```

java8-hogeのディレクトリをみると、`.java-version`ファイルができてます。

```
$ ls -la
total 8
drwxr-xr-x  3 jyotti  staff  102  4  5 18:14 .
drwxr-xr-x  4 jyotti  staff  136  4  4 20:33 ..
-rw-r--r--  1 jyotti  staff   18  4  5 18:15 .java-version
$ cat .java-version
oracle64-1.8.0.25
```

# javaコマンドはどうなってんの？

```
$ type java
java はハッシュされています (/usr/local/opt/jenv/shims/java)
```

pyenvとかと一緒ですね。

# 参考ページ
* http://www.jenv.be/
BuildTargetを指定してUnityを開く

gitなどで共同作業していると、iPhone環境で開発していたのにいつの間にかBuildTargetがAndroidになっていて、予期せぬReImportに時間を取られてDeadEndということがたまによくあります。

gitignore的な物で何とかなりそうな気もしますがコマンドライン実行で
```
/Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath $PWD -buildTarget iPhone
```
上記のように-buildTargetに環境を指定してあげればその通り開きます。
ただこの場合terminalのプロセスとしてUnityが開いてしまうので
```
/Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath $PWD -buildTarget iPhone -quit
```
quitオプションを付けて、再度自分で開くのもありかもしれません。
TravisCIなどでEC2のSSH元IPを動的に指定する方法


## やりたいこと
github への push をトリガーにEC2環境へファイルを rsync する。

### アイデア1
 - EC2環境に git をインストールして、Httpでアクセスされると git pull をするようなスクリプトを仕込み、github の Webhook で叩くようにする

### アイデア2
* TravisCI などCI環境を使い、rsync で配布する

今回は、アイデア2を採用することにした。
TravisCIを別件で使っていたのと、今後、ansibleで環境構築などを考えていたので、動的にSSHのアクセス権を設定するテストケースにした。

ちなみに、このEC2環境は一時的なテスト環境なので、永続的な本番環境ではない。

## 環境

* TravisCI 有料版
* EC2
	* ElasticIP で固定IP割り当て済み

## やったこと

### 方針を決める

* TravisCIの環境から SSH over rsync が出来るようにIPを動的に通すようにする。
* IPは securty group を実行時に変更する
	* IAMで必要な権限を付与した

### 1.EC2に Securty Group を設定する
設定した Securty Group の Group ID をメモ。
例: GroupID sg-aabbccdd

### 2.IAM Policy を作る

こちらの記事を参考に Security Group の設定変更が出来る Policy を作る。

[IAMで特定セキュリティグループの設定の追加削除が出来るようにする設定](http://qiita.com/kawaz/items/a86370c9908367bcb509)

### 3.IAM User を作る
IAM で User を作る
2で着くた Policy のみを割り当てておく。

Access Key、Secret KEY をメモ。

### 4.TravisCI の設定ファイルを作る

git のプロジェクトルートで下記コマンドを実行して必要な値を暗号化する
SSHでアクセスするために、EC2に登録した公開鍵をエンコードして含めるようにする

```
travis encrypt AWS_ACCESS_KEY_ID=AAAA
travis encrypt AWS_SECRET_ACCESS_KEY=BBBB
travis encrypt-file --pro /path/to/key.pem
```

key.pem.enc というファイルが出来るのでそれを Git管理に含める
上記の暗号化した文字列を入れつつ下記ファイルを作る

```.travis.yml
language: python
python:
  - "2.7"
branches:
  only:
    - master
addons:
  ssh_known_hosts:
    - 10.0.0.1 #EC2 IP
env:
  global:
    - AWS_DEFAULT_REGION=ap-northeast-1
    - SECURITYGROUP=sg-aabbccdd
    - EC2_IP=10.0.0.1 #EC2 IP
    - secure: "XXXX" #AWS_ACCESS_KEY_ID
    - secure: "XXXX" #AWS_SECRET_ACCESS_KEY
before_install:
  - eval `ssh-agent -s`
  - chmod 600 ~/.ssh/config
  - openssl aes-256-cbc -K $encrypted_XXXX_key -iv $encrypted_XXXX_iv -in key.pem.enc -out key.pem -d
  - mv key.pem ~/.ssh/
  - chmod 600 ~/.ssh/key.pem
  - ssh-add ~/.ssh/key.pem
install:
  - "pip install awscli"
before_script:
  - export TRAVIS_IP=`curl -s ifconfig.me` && echo $TRAVIS_IP
  - aws ec2 authorize-security-group-ingress --group-id $SECURITYGROUP --protocol tcp --port 22 --cidr $TRAVIS_IP/32
script:
  - rsync -arvce "ssh -o StrictHostKeyChecking=no" --exclude='.*' --exclude='key.pem.enc' ./ USER@$EC2_IP:~/path/to/
after_script:
  - aws ec2 revoke-security-group-ingress --group-id $SECURITYGROUP --protocol tcp --port 22 --cidr $TRAVIS_IP/32
```

* ec2コマンドを使うために python 環境にする
* masterブランチだけで動くようにしてある
* エンコードした key.pemファイルをデコードして Travisの実行環境の .ssh以下に移動し、ssh-addコマンドで追加する
* [ifconfig.me](http://ifconfig.me) という外部サービスを使って自分自身のIPアドレスを調べる
* awsコマンドを使って自分自身のIPを Security Group に追加する
* rsync後に追加した Security Group 設定を削除する


## 最後に

[AWS で不正アクセスされて凄い額の請求が来ていた件](http://d.hatena.ne.jp/yoya/20150404/aws)
こーいうことがあるから、IAMとか権限とかちゃんとしましょう。

## 参考リンク

* [【TravisCI】travis.ymlに書くあれこれ](http://qiita.com/oh_rusty_nail/items/157241b6cb5a304462fe)
* [TravisCIでファイルを(簡単に)暗号化して使用する](http://qiita.com/kmats@github/items/d22fd856883e6c16d7ea)
* [[AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する](http://dev.classmethod.jp/etc/ssh_with_adding_ingress_rule/)
xcodeプロジェクトとフォルダー構成を同期する

XcodeではしっかりMVCでフォルダー分けをしているのにnew fileする時にルートに作りまくって実際のフォルダー構成は…
って事、よくありますよね。

Xcodeプロジェクト>>フォルダー構成
の同期をするにはsynxを利用するといい感じです。

https://github.com/venmo/synx

`gem install synx`
gemでインストールしたらxcodeprojのある階層で

`synx project.xcodeproj`
するだけ。

![スクリーンショット 2015-04-05 19.57.24.png](https://qiita-image-store.s3.amazonaws.com/0/24979/17e55378-0c14-2518-7176-fc13d70f4521.png)
![スクリーンショット 2015-04-05 19.57.32.png](https://qiita-image-store.s3.amazonaws.com/0/24979/dd604fbd-f8e6-cf54-4df5-55983bbe1ebf.png)

このように構成を同期してくれます！

http://raimon49.github.io/2015/03/21/review-nytimes-objective-c-style-guide.html
NewYorkTimesのコーディング規約ではこの構成の同期を推奨しているので、プッシュ前にやっておくといいですね！
node.jsの中身を読む話と、debuggerが便利な話


## ことの発端

- 自作のgrunt pluginをgulpに移植しよーと頑張っていたら、突然requireで失敗するようになった。
- (´・ω・｀)
- nodeのrequire実装を覗いてみないと、なにが起きてるのかわからなかった
- ってわけで、調べよう

## 標準モジュールを読んでみる

- エラーログで、nodeの中の`module.js`というでエラーが出ている旨が書いてあるのだけれど、その実ファイルはどこにあるのか。
- → このへんはコンパイル済なので、実行している実ファイルは追えない模様

### でも、ソースコードは読めるよ！

#### 1. githubで読む
- https://github.com/joyent/node
- tagから見たいバージョンを選んできて、`lib`以下あたりを見るといろいろある

#### 2. ローカルで読む
- nodebrew使ってる場合、`.nodebrew/src/{バージョン}/node-{バージョン}/lib/`というところにsrcも残っていた
- おそらくビルド前のコードが残っているということかと
- ここを編集しても、実際の実行に反映されたりはしない

#### 3. もっと深く読む

- Cの層まで本格的に読むのであればこのあたり参考。gkbr。
  - http://blog.otakumode.com/2014/08/14/nodejs-code-reading-startup-script/

## debuggerをちゃんと使おう

ざんねんながら、上記手段では原因がよくわからなかったので、ちゃんと実行時の処理を追いながら調べることに。

`node debug {スクリプト名}`
とやると、スクリプトを逐次実行できる。
その後は、ちまちまコマンドを入力していくと、ハイライトする部分を変えたりしながら進められる。

- `n`, `next`: 次の行へ
- `s`, `step`: 現在の行の関数の中へ (step in)
- `c`, `cont`: 実行再開（ブレークポイントまで一気に）

## しかしめんどくさい → node-inspector

Chrome Developer ToolだのEclipseだのAndroid Studioだのに慣れている身としては、さすがにみづらい。
というわけで`node-inspector`!!

#### 1. インストールする
- `npm install -g node-inspector`

#### 2. デバッグしたいスクリプトを`--debug-brk`付きで実行
- これで、node debugの時のように、いったん実行はストップ
- サーバーが起動して、そこからstep inとかもろもろを撃ち込めるようになるっぽい
- (そこはnode debugではないのか！)

#### 3. `node-inspector`を実行
- `node-inspector`
- 表示されるローカルホストのURLを覚えておく
- 場合によっては`--web-port={port}`のオプションをつける (8080ポートが埋まっている場合など)

#### 4. ブラウザでURLをひらく
- そこには、Chrome Developer Toolにそっくりなデバッグ画面が！


## 顛末
- node-inspectorで追ったら患部が分かった
- requireができなかったのは、もともとのgrunt-pluginの`package.json`に、`main`プロパティが指定されていなかったからでした
- ちなみに`main`がなくても、`index.js`が置いてあれば大丈夫だった模様
- このへんで判明 → https://github.com/joyent/node/blob/v0.10.26/lib/module.js#L113 
- ていうかglunt pluginって、`grunt.loadNpmTask`を使うから、`require`は使わないのか…

## できたよ
- https://github.com/fnobi/varline
- いい具合なのでそのうち宣伝したい

## 参考資料

- [requireの仕組み - ぶれすとつーる](http://nazomikan.hateblo.jp/entry/2014/12/23/212741)

- [はじめてのNode.js：Node.jsアプリケーションのデバッグ | SourceForge.JP Magazine](http://sourceforge.jp/magazine/13/04/16/080000)
初音ミクはじめました


初音ミク V3（HATSUNE MIKU V3）買いました！来ました！
Logic Pro Xを持ってるので、早速AUプラグインを使って作曲してみました。

## 購入
Amazonで購入。
[Amazon.co.jp: 初音ミク V3: クリプトン・フューチャー・メディア: ソフトウェア](http://www.amazon.co.jp/dp/B00EEWF9YW)

￥13,999でした。
[オフィシャル](http://www.crypton.co.jp/mp/pages/prod/vocaloid/mikuv3.jsp)では￥17,280だったので、こちらより割り引きされてました。

ついでに[こちら](http://www.amazon.co.jp/dp/B0098S79FO)も同時購入しました。
![初音ミク CHAN×CO ver. プチョヘンザTシャツ ホワイト サイズ:S](http://ecx.images-amazon.com/images/I/419e26oTrnL.jpg)

## インストール
初音ミク V3にはWindows版とMac版の両方のインストールDVDが含まれているので安心です。
今回はMac版を入れます。

インストールには1時間ほどかかりました。
オリジナルの他に、Sweet, Dark, Soft, Solidと、5つの人格があるみたいなので、最初にそれらをインストールするのに一番時間がかかります。

## アップデータ

スタートアップの資料の中に

> Audio Units (AU)プラグインに対応したDAWソフトをお使いの方は「Piapro Studio」を最新バージョンにアップデートして下さいますようにお願い致します。

とあるので、
[クリプトン | Macで『初音ミク V3』をお使いの方へ](http://www.crypton.co.jp/PiaproStudioMac)

からリンクをたどって

[クリプトン | PIAPRO STUDIO製品サポート](http://www.crypton.co.jp/mp/do/support/vi_engine?id=26)

の
Piapro Studio VSTi / AU v2.0.0.4 (Mac) アップデータ

からアップデート（アップデータ？）しました。
うまくアップデートできなかったので2回実行して、再起動してもう1回実行したら、アップデータされてる、と言われました。

## Logicで使う

[初音ミクV3をLogic Pro Xと連携させてみました | nekonomemo.net](http://nekonomemo.net/miku-logic-pro-x/)

こちらを参考にしました。
[環境設定]→[プラグインマネージャ]
にPiapro Studio AUがあればOK。

![kobito.1428229693.607183.png](https://qiita-image-store.s3.amazonaws.com/0/6117/608bc71e-5dba-aca8-f3fd-26af152fb8e3.png "kobito.1428229693.607183.png")

既にメロディーは作曲済みだったので、一旦MIDIファイルに書き出してからPiapro Studio上で読み込み。

![kobito.1428230521.154113.png](https://qiita-image-store.s3.amazonaws.com/0/6117/67b2b775-2258-d2e7-1d7f-1a6f9d711d1e.png "kobito.1428230521.154113.png")

ハモりもあったので、2トラック作りました。
（同じ声だったら1トラックでもいけるのだろうか？）

1音符の歌詞入力に長い歌詞を入れたら自動的に複数音符に適用されたので便利です。

![kobito.1428230622.909398.png](https://qiita-image-store.s3.amazonaws.com/0/6117/fa5b6fc8-9989-05e9-543c-8ba04e48e13e.png "kobito.1428230622.909398.png")

再生に独特のラグがあるので若干確認しづらいです。

今日はそんなところで。