OmniAICreator/Qiita-1.07M huggingface dataset:
rbenvでローカル及びHerokuのRubyバージョンを合わせたい

（2015-03-24:）一部記事修正


## 何がしたい？

HerokuのRubyバージョンとローカル環境のRubyバージョンが異なるためwarning出る。
合わせたい。
ただし、普段は新しいバージョン使いたいから、本プロジェクトのみ適用したい。


## 前提条件
- ローカルでRailsプロジェクトが動く
- HerokuにRailsプロジェクトをアップできる
- rbenvインストール済


## rbenv

<del>Herokuの現在の最新rubyバージョンは2.0.0 (2015/01/18現在)。</del>

今回はruby 2.0.0を入れてみる。

インストール：

```shell:
$ rbenv install --list
$ rbenv install -v 2.0.0-p598
```

このプロジェクトに限り2.0.0を適用したい。

プロジェクト直下に.ruby-versionを作成：

```shell:
cd {project path}
vi .ruby-version
```

インストールバージョンを記述：

```ruby:.ruby-version
2.0.0-p598
```

確認：

```shell:
$ rbenv global
2.1.5
$ ruby -v
ruby 2.0.0p598 (2014-11-13 revision 48408) [x86_64-darwin13.4.0]
```

通常使用時と異なり本プロジェクトのみ2.0.0p598が適用されている、OK

晴れてGemを入れる：

```shell:
$ bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.1.5
```

エラーでた。<del>どうやらbundlerもダウングレードが必要そう</del>

rbenvで追加したrubyに対し、bundlerがインストールされていないため。

インストールする。

## bundler

普通にgem installでいいらしい（参考：[rbenvコマンドの備忘録](http://root7.jp/blog/ruby/rbenv%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%82%99%E5%BF%98%E9%8C%B2/)）：

```shell:
$ gem install bundle
$ bundle -v
Bundler version 1.7.12
```

ダウングレード完了。
念のため別窓で確認：

```shell:
$ cd /
$ bundle -v
Bundler version 1.7.7
```

本プロジェクトにのみ適用されていることが確認できた。

## 後
bundle install、git push heroku masterともにwarning出さず通った。
すっきり。
"翔べ!ガンダム"をrubyで書いてみた

ファーストガンダムのOP "翔べ!ガンダム" をruby化してみた。

## 翔べ!ガンダム

~~~ruby:fly_gundam.rb
require_relative 'mobile_suit/gumdam'

def fire_up(ms)
  3.times{ ms.fire_up }
  ms.instance_eval do |you|
    you.rush
    if you.fighting_spirit && you.fighting_spirit.burn?("怒り")
      enemy = you.search("巨大な敵")
      3.times { you.shoot_up(enemy) } if enemy
    end
  end
  ms.strike("正義の怒り")
end

def get_up(ms)
  3.times{ ms.get_up }
  ms.instance_eval do |you|
    you.shout
    if you.grief && you.grief.sink?("絶望")
      you.drive_off("恐怖")
      3.times { you.go_up }
    end
  end
  ms.burn("渦巻く血潮")
end

def renew(ms)
  3.times{ ms.renew }
  ms.instance_eval do |you|
    you.reach
    if you.heart && you.heart.trembling?("愛")
      you.desire("平和")
      3.times { you.fly }
    end
  end
  ms.fly("銀河")
end


gundam = Gundam.new

[:fire_up, :get_up, :renew].each do |action|
  send(action, gundam)
  puts "機動戦士 #{gundam.name} #{gundam.name}\n\n"
end
~~~


## mobile_suite/gundam.rb 実装例

~~~ruby:gundam.rb
class Property
  def initialize(parts)
    @parts = parts
  end

  def burn?(what)
    @parts == :fighting_spirit && what == "怒り"
  end

  def sink?(what)
    @parts == :grief && what == "絶望"
  end

  def trembling?(what)
    @parts == :heart && what == "愛"
  end
end

class Gundam
  attr_reader :fighting_spirit, :grief, :heart

  def initialize
    @fighting_spirit = Property.new(:fighting_spirit)
    @grief = Property.new(:grief)
    @heart = Property.new(:heart)
  end

  def name
    "ガンダム"
  end

  def fire_up
    puts "#{name}は燃え上がる"
  end

  def rush
    puts "#{name}は走る"
  end

  def search(target)
    target
  end

  def shoot_up(target)
    puts "#{name}は#{target}を撃つ"
  end

  def strike(property)
    puts "#{name}は#{property}をぶつける"
  end

  def get_up
    puts "#{name}は立ち上がる"
  end

  def shout
    puts "#{name}は叫ぶ"
  end

  def drive_off(what)
    puts "#{name}は#{what}を払う"
  end

  def go_up
    puts "#{name}は行く"
  end

  def burn(what)
    puts "#{name}は#{what}を燃やす"
  end


  def renew
    puts "#{name}はよみがえる"
  end

  def reach
    puts "#{name}は掴む"
  end

  def desire(what)
    puts "#{name}は#{what}を願う"
  end

  def fly(what = nil)
    puts name + (what ? "#{what}へ向かって" : "") + "翔ぶ"
  end

end
~~~


## 実行結果
~~~
ガンダムは燃え上がる
ガンダムは燃え上がる
ガンダムは燃え上がる
ガンダムは走る
ガンダムは巨大な敵を撃つ
ガンダムは巨大な敵を撃つ
ガンダムは巨大な敵を撃つ
ガンダムは正義の怒りをぶつける
機動戦士 ガンダム ガンダム

ガンダムは立ち上がる
ガンダムは立ち上がる
ガンダムは立ち上がる
ガンダムは叫ぶ
ガンダムは恐怖を払う
ガンダムは行く
ガンダムは行く
ガンダムは行く
ガンダムは渦巻く血潮を燃やす
機動戦士 ガンダム ガンダム

ガンダムはよみがえる
ガンダムはよみがえる
ガンダムはよみがえる
ガンダムは掴む
ガンダムは平和を願う
ガンダム翔ぶ
ガンダム翔ぶ
ガンダム翔ぶ
ガンダム銀河へ向かって翔ぶ
機動戦士 ガンダム ガンダム

~~~

## いいわけ

1. 解釈の違いについては適当に判断しましたのでご容赦願います。
2. gumdam.rb は、結果を得るための実装例です。たとえば、敵を探すのが面倒なのでごまかしましたのでご容赦願います。
3. 柔軟性に欠ける部分も多々ありますが、これはサンプルなのでご容赦願います。
4. そもそもこんな投稿をしたことを容赦願います。
MSBuildで.net2.0のプロジェクトをビルドする

メモ書き。

### 環境
* Microsoft Build Tools 2013

### やり方

パラメータでビルドに使う MSBuild Toolset のバージョンを指定してやればいい。

```
> msbuild /toolsversion:2.0
```

x86用のリリースビルドはこう。
/toolsversion の省略形が /tv。

```
> msbuild /p:configuration=release /p:platform=x86 /tv:2.0
```
Hamlでいい感じのidを生成する方法

## TL;DR

```haml
%div[user]
```

```html
<div class="user" id="user_1">
</div>
```

## 概要

[公式ドキュメント](http://haml.info/docs/yardoc/file.REFERENCE.html#object_reference_)より引用

```rb
# file: app/controllers/users_controller.rb

def show
  @user = CrazyUser.find(15)
end
```

```haml
-# file: app/views/users/show.haml

%div[@user, :greeting]
  %bar[290]/
  Hello!
```

これらが、

```html
<div class='greeting_crazy_user' id='greeting_crazy_user_15'>
  <bar class='fixnum' id='fixnum_581' />
  Hello!
</div>
```

こうなります。

## 一体何が起きているのか

コードを読めば単純明快でした。

https://github.com/haml/haml/blob/master/lib/haml/buffer.rb#L304-L329

やっていることは、
- オブジェクトのクラス名を取得し、
- `to_key`または`id`メソッドでidを取得し、
- それらを（もしprefixがあるならそれも含めて）ハッシュにして返す

ね、簡単でしょう？

## 残された謎

公式ドキュメントの例にある`Fixnum`は`to_key`も`id`も持ってないんだけど、なんで`581`が返ってるんだろう…？
RaspberryPi上でhubotが自動起動するように設定する

## 環境
Raspbian: ver December 2014
node.js: 0.10.35

## 手順

### 1.nodeをデーモン化
nodeをdaemonとして動かすためのモジュール`forever`をインストール。

```
$ npm install -g forever
```

hubotを動かすために叩いている`bin/hubot`を以下の用に書き換える(execの行をコメントアウト、foreverの行を追加)。Slackなどのサービスと連携させる人はここで環境変数の設定もしたほうがいいかも。

``` bin/hubot
#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

forever start -c coffee node_modules/.bin/hubot -a slack
# exec node_modules/.bin/hubot "$@"
```

ここまで上手く出来ていればhubot起動時にバックグラウンドで動くはず。

```
$ bin/hubot
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: node_modules/.bin/hubot
```

### 2.起動時に実行
init.dディレクトリに`hubot`ファイルを追加。bin/hubotを実行するようなスクリプトを書く。

``` /etc/init.d/hubot
#!/bin/sh
DIR="hubotのディレクトリパスを書く"
cd $DIR
sudo -u pi ./bin/hubot
```

実行権限を追加。これをやらない場合を試してないけどたぶん必要だよね..?

```
$ sudo chmod +x /etc/init.d/hubot
```

init.d以下に置くだけでは実行されないので以下のコマンドを実行。

```
$ sudo update-rc.d hubot defaults 99 1
```

うまくできていると、reboot後にサービスが自動起動しているはず。

```
$ sudo reboot

$ forever list
info:    Forever processes running
data:        uid  command script                           forever pid  id logfile                    uptime       
data:    [0] zytY coffee  node_modules/.bin/hubot -a slack 2301    2318    /home/pi/.forever/zytY.log 0:0:0:55.887 
```
vSphere分散スイッチの特長についてのメモ

vSS（vSphere Standard Switch）とvDS（vSphere Distributed Switch）の違いについて

* vSphere Enterprise plus エディションより提供

* vSSはESXi上に構成される、vDSは複数のESXiを跨がって構成される
* ESXi上に跨がって構成されることからvSSではそれぞれに構成していたものが一度構成すればよくなることも特長
* NIOC(Network I/O control)を提供
* VXLANを使用したネットワーク仮想化ができる

※VXLANとはVirtual eXtensible Local Area Networkのことで、レイヤ２を維持したまま物理インフラを跨いだ通信にIPが利用できる（オーバレイネットワーク）
C++でのNANの定義とNANチェック

```cpp
#include <limits>

//float n = 0 / 0.f; //バッドノウハウ。コンパイラー依存で、特にWinとかではビルドエラー
float n = numeric_limits<float>::quiet_NaN();

if(isnan(n)) {
  cout << "is NAN." << endl;
} else {
  cout << "is not NAN." << endl;
}
```

[参考URL]

NANの定義について
http://d.hatena.ne.jp/pyopyopyo/20100330/p1
BGMを再生する


まずは流したいBGMを入れるためのフォルダを作りましょう
フォルダの名前はrawにしておきましょう。
その中に流したいBGMをいれます。

BGMを再生するためのクラスをしましょう。

MyBgm
-
	public void MyBgm {

		private MediaPlayer mBgm;

		public MyBgm(Context context){
	
			//BGMファイルを読み込む
			this.mBgm = MediaPlayer.create(context, R.raw.「流したいBGMの名前」);
			this.mBgm.setLooping(true);
			this.mBgm.setVolume(1.0f, 1.0f);
		}

		//BGMを再生する
		public void start(){
			if (!mBgm.isPlaying()){
				mBgm.seekTo(0);
				mBgm.start();
			}
		}

		//BGMを停止する
		public void stop(){
			if (mBgm.isPlaying()) {
				mBgm.stop();
				mBgm.prepareAsync();
			}
		}
	}





そして、再生したいclassに




		private MyBgm mBgm;

		public void onCreate(Bundle saveInstanceState) {

    		・・・ 略 ・・・

			//イベントの追加
			this.mRetryButton.setOnclickListener(
				new Button.OnClickListener() {

			public void onClick(View v) {
				hideRetryButton();
				renderer.startNewGame();
			}
		});
		//MyBgmの生成
		this.mBgm = new MyBgm(this);
	}

最後にonPauseとonResumeに停止と再生の処理を記述して終わりです。

	public void onResume() {
					super.onResume();
	
		mBgm.start(); //BGM再生
	}

	public void onPause() {
		super.onPause();

		mBgm.stop(); //BGM停止

		・・・　略　・・・
	}

それではビルドして正しく実行できるか試しましょう。
dockerでCentOS 7上にnode.js環境を構築する

## 概要
CentOS 7 上でnode.jsのwebアプリの実行を動作させる環境の構築。
また、jenkinsからバッチを叩きたかったため、jenkinsをインストールしている。

## Dockerfile  

```Dockerfile:Dockerfile
FROM centos:7

# install from yum
RUN yum install -y wget tar make gcc gcc-c++ bzip2-devel
RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

# install python
RUN wget http://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz
RUN tar xvzf Python-2.6.9.tgz
RUN cd Python-2.6.9 && ./configure && make && make install

# install node.js
RUN wget http://nodejs.org/dist/v0.10.35/node-v0.10.35.tar.gz
RUN tar zxvf node-v0.10.35.tar.gz
ENV PYTHON /usr/local/bin/python2.6
RUN cd node-v0.10.35 && $PYTHON ./configure --dest-cpu=x64 --dest-os=linux && make && make install
EXPOSE 80

# install jenkins
RUN wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
RUN rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
RUN yum install -y jenkins
EXPOSE 8080

CMD systemctl start jenkins && /bin/bash
```
VisualStudio2013でopenFrameworksをビルドする

openFrameworksの公式サイトではVS2012を使えと書いてありますが、
別にVS2013でもビルドできないわけではありません。

[visual studio setup guide]
http://www.openframeworks.cc/setup/vs/


当方はVS2012とVS2013を両方インストールしていたので、始めはどちらを使ってもopenFrameworksの
emptyExampleをビルドできない状況に陥りました。
エラー内容は下記の様な感じ。

エラー    1    error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build using the v120 build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v120 to build using the v120 build tools.    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets    44    5    openframeworksLib


![________________1024-1.png](https://qiita-image-store.s3.amazonaws.com/0/21126/e54906e1-68a5-1a44-1887-cd50d05dc7af.png)







この件について、openFrameworks-jp.slackの中で @motoishmz から
「2013（v120）を既にインストールしてるから、2012（v110）でも選べるようになっちゃってる」
との指摘が。
どうもopenFrameworksはv110でしかビルド出来ないらしい。

@motoishmz「OF winはv110で走る奴なので、直せばきっと行けるはず」
@motoishmz「property --> platform toolset --> どこかのpulldownで vs2012（v110） って選べません？」

[openFrameworks-jp.slack]
https://openframeworks-jp.slack.com/
※openFrameworks-jp.slackとは紹介制の日本のoF使い同士の情報共有の場で
@motoishmzさんが管理人を勤めているコミュニティです。
日本のopenFrameworksコミュニティを盛り上げてくれる方・情報をどんどん共有したい方は https://twitter.com/motoishmz の@motoishmzさんまでご連絡ください。



下記のキャプチャを参考にプロジェクト名の箇所で
右クリック→プロパティ→プラットフォームツールセット→v110
を選んでください。

同様にopenFrameworksLibの箇所でも右クリック後に同様にv110を選択してください。


![ capture .png](https://qiita-image-store.s3.amazonaws.com/0/21126/09069391-e4e7-1e92-a37a-6b710e71a870.png)




![________________1024-3.png](https://qiita-image-store.s3.amazonaws.com/0/21126/a1a178c4-4d91-ce85-80a3-4c64941f0ca2.png)








これだけでビルド出来るはずです。
VS2012もVS2013も両方インストールしている方、VSのバージョンに関わらず
ここの設定さえ気をつければどちらでもopenFrameworksをビルド出来ます。



VS2013でemptyExampleをビルド成功した時のキャプチャ
![________________1024-5.png](https://qiita-image-store.s3.amazonaws.com/0/21126/7652b674-8557-482c-332c-e7586e1ac249.png)
Twitter for MacでTweetのJSONを手軽に確認する

本日はTwitter for Macを利用して手軽にTweetのJSONを確認する方法のご紹介です．

1. Twitter for Macのインストール  
   https://itunes.apple.com/jp/app/twitter/id409789998
2. 設定画面のDeveloperタブから
   - Show Developer Menuのチェックボックスを有効にする
   - https://apps.twitter.com からアプリを登録し（または既存のアプリの）OAuthトークンを入力する．（自分のアカウントのAccess TokenはKeys And Access Tokenタブの下部で生成できる）  
   ![Screen Shot 2015-01-25 at 15.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/30016/3eb819d7-3d4e-7c99-6084-3d9fcce1cd2c.png)
   - Verify Tokens ボタンをクリックして，ボタンの右にOKが出たら成功
3. 任意のTweetを右クリックし Show tweet JSON をクリック  
   ![show_tweet_json.gif](https://qiita-image-store.s3.amazonaws.com/0/30016/359ddce5-a4dc-f4a0-a8e3-4b9eeaca0238.gif)
4. Enjoy!!

ところで，このJSONを表示しているコンソールはDevelopメニューのコンソールからいつでも表示できます．このコンソールではHTTPメソッドやエンドポイント，POST/PUT/DELETEの場合はBODYを指定し，任意のリクエストを簡単に試せます．

Twitterとの連携機能を作っているとtweeetのJSONを手軽にチェックしたい時や，アカウントが不正に利用された場合の対応など，連携アプリの権限を無効にするだけで良いのか，パスワードの変更を含む包括的な対応を取る必要があるのか，といった判断をする際に，TweetのJSONをさっと確認できると超便利．

インターネットストーキング的にはどんなクライアントを使っているかで家なのか出先なのかを判断することも可能です[^1][^2]，ご活用下さい．

[^1]: ワシが若い頃は投稿に使ったクライアント名を表示するのが文化だったんじゃが2011年ごろに廃れたのじゃ
[^2]: 声優の使っている携帯電話を特定する場合にも使われるテクニックです
php cookbookでinstall_methodをsourceにするとCompile Errorになる

Chef公式の php cookbookというのがありまして、

https://supermarket.chef.io/cookbooks/php

`node['php']['install_method']`を"source"に設定すればPHPをソースからコンパイル・インストールできるという話なのですが、やってみたらエラーが出ました。


```
Compiling Cookbooks...

================================================================================
Recipe Compile Error
================================================================================

Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe client for cookbook mysql
```

## 原因
`php` cookbookが`mysql::client`というレシピを呼び出そうとしてるのに、`mysql` cookbookの中には`client`というレシピが存在しない。

## 対処法
このパッチをあてる
https://github.com/opscode-cookbooks/php/pull/110/files

## 感想

* 公式のmasterがバグっている
* PullRequestが来ているのに放置
* `mysql` cookbookも自社で開発しているのに、後方互換やバージョン整合性を考慮していない

どうしてこうなった...
Go by Example: Slices



(この記事は [Go by Example: Slices](https://gobyexample.com/slices) を翻訳したものです。)


SlicesはGoの中で重要なデータ構造です。arraysよりも連続したデータに対して強力なインターフェイスを提供します。


```go
package main

import "fmt"

func main() {

	// arraysとは違い、slicesは中に入っている要素の型のみで定義されます。（要素の数は含まれない）
	// 長さがゼロではないからのsliceを作るには、buildinのmakeを使用する。
	// これは、長さが3のstringのsliceを作る例です。（値はzero valueで初期化されている。）
    s := make([]string, 3)
    fmt.Println("emp:", s)

	// arraysのように値を代入、取得することができます。
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"
    fmt.Println("set:", s)
    fmt.Println("get:", s[2])

	// buildinのlenはslicesの長さを返します。
    fmt.Println("len:", len(s))

	// これらの基本的な動作以外に、sliceは複数のarraysよりも使いやすい機能をサポートしています。
	// ひとつは、新しい値を一つもしくは複数含んだsliceを返すbuildinのappendです。
	// 新しいsliceを得るためにappendからの戻り値を受けるとる必要があります。
    s = append(s, "d")
    s = append(s, "e", "f")
    fmt.Println("apd:", s)

	// sliceはコピーすることもできます。
	// ここでは、sと同じ長さのからのsliceのcを作りsからcにコピーします。
    c := make([]string, len(s))
    copy(c, s)
    fmt.Println("cpy:", c)

	// Slicesはsliceをslice[low:high]の文法でサポートしています。
	// たとえば、これは、sliceの要素のs[2],s[3],s[4]を取得します。
    l := s[2:5]
    fmt.Println("sl1:", l)

	// これはs[5]まで切り出します。（s[5]は含まれない。）
    l = s[:5]
    fmt.Println("sl2:", l)

	// これはs[2]から切り出します。(s[2:]は含まれる)
    l = s[2:]
    fmt.Println("sl3:", l)

	// ワンラインでsliceのために値を初期化し宣言することができます.
    t := []string{"g", "h", "i"}
    fmt.Println("dcl:", t)

	// Sliceは多次元構造を含むことができます。
	// 多次元のarraysとは違い、sliceの中の要素の長さは可変です。
    twoD := make([][]int, 3)
    for i := 0; i < 3; i++ {
        innerLen := i + 1
        twoD[i] = make([]int, innerLen)
        for j := 0; j < innerLen; j++ {
            twoD[i][j] = i + j
        }
    }
    fmt.Println("2d: ", twoD)
}


```


```
$ go run slices.go
emp: [  ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d:  [[0] [1 2] [2 3 4]]

```
Qiita内で圏論に言及するエントリのまとめ (3)

[前回](http://qiita.com/sct/items/c7fb5e66ba8fa4d27403)と同様の趣旨で、 [Qiita内の圏論エントリ](http://qiita.com/search?q=%E5%9C%8F+%E8%AB%96&sort=created&utf8=%E2%9C%93)を読んでいきます。前回まででだいたいの投稿はチェックしたと思いますので、今後は新着記事を読んでいきます。

## [【ハードルを下げつつ, 本質的なことから逃げない圏論の解説】に気になる記述を見かけたので](http://qiita.com/phasetr/items/fe6b194d05f3a179e729)

誤った記述は見受けられないエントリですが、互いに正しいことを主張していて論点が噛み合ってないという印象を受けましたので、読む際は気を付けるといいでしょう。

心構え的な内容が多く含まれていますが、それらについて真偽を判断するのは適切ではないため、真偽を判断できるセンテンスのみ取り上げます。なお、二重引用の部分は元の元の記事からの引用です。

> > 「集合の元」はタブー

圏論でも集合は使われますので、元を利用することはあります。ただ、Setsなどで議論を進める場合の初学者への注意喚起としての限定的な意味であれば、適切であると思います。

> > 整数（訳注: $\mathbb{Z}$）が対象であることから分かるかもしれないが, 対象は集合であることが多い. 

集合ではないことも多いことを強調する方が好みですが、前述と同様限定的なコンテキストであれば適切です。

> > その集合の中身には言及せずに射の性質を語るのが圏論のやり方だ. 今まで「集合の元」を使って説明していたことと同じ内容を, 対象と射だけで説明するのが圏論だ.

前述したとおり、Setsなどに限定した話であれば適切です。

> > 圏論では対象が集合かどうかにはお構い無しにただの抽象的な概念「対象」であるのだが,

正しい記述です。

> まず圏でなるべく集合の元を取ろうとしないのは
> そもそも対象が集合にならないことがあるためだ.

正しい記述です。

> 集合の元を直接取らずに射という
> 相互関係の取り扱いに着目する

正しい記述です。

> > 圏論は比較的新しい数学の分野であり, その手法も一風変わっている.

比較的新しいと言える分野かと思います。一風変わっているかは読者のそれまでの経験によりますので、ここでの判断は致しません。

> 関手が対象, 自然変換を射とした関手圏は
> 対象が関手なので当然対象が元を持たない.

正しい記述です。

> catamorphism を理解するために必要な知識を辿って行って, 芋づる式に「F-始代数」→「F-代数」→「直積, 直和」→「射, 対象」と遡った
> (cocoatomo 氏)

正しい発言です。

## 今回の訳注

元記事のMacLane氏の引用にもある通り、圏論の主役は関手と自然変換であることは意識しておくといいでしょう。
UbuntuのC++コンパイルの仕方

-
まずはTerminalでG++をインストールします。

sudo apt-get install G++

でインストールします。

完了したら作成したC++のディレクトリの保存場所に行きます。

Terminalで

cd (保存しているファイル場所)

移動したらTerminalで

g++ -o <保存名> <保存名.cpp>

とするとファイルの中に<保存名>ができます。

実行するにはTerminalで

./<保存名>

で実行することができます。
IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった

IQ1450で美少女JSの先輩「

## 存在しないローカル変数の参照について

Rubyでは存在しない変数名を参照しようとするとエラーになります。

```rb
p sugoi
#=> NameError: undefined local variable or method `sugoi' for main:Object (NameError)
```

```rb
kanari = totemo
#=> NameError: undefined local variable or method `totemo' for main:Object
```

この点について疑問に思う方は居ないかと思います。

それを前提に、今日はRubyで無から有を生み出す方法をお伝えしましょう。

以下の縛りを導入します。

- 一度宣言・初期化した変数は他の式・文で使用しない
- 演算子および演算子風のシンタックスシュガーが導入されたメソッド、及び代入、また括弧のみが使用できる

## `true`、`false`の生成

`true`、`false`を生成します。上記縛りを守ったままこれを達成することは可能でしょうか？

```rb
t = !t
p t #=> true

f = !!f
p f #=> false

```

可能です。

不思議ですね、一体何が起こったのでしょうか。

これは、変数に値を代入するようなコードをパーサが読んだ瞬間、その変数が`nil`で初期化されるという仕様を悪用したコードです。

`true`の生成の例で解説すると、代入の左辺をパーサが読んだ段階で変数`t`が`nil`で初期化されるため、右辺の`!t`を評価することは`!nil`を評価することと同義です。

`!nil`の評価結果は`true`となるので、変数`t`には`true`が代入されることとなります。

`false`の例も同じで、`!!nil`が`false`であることを利用しています。


## 整数の生成

次に整数を生成してみましょう。

```rb
zero = zero <=> zero
p zero #=> 0

one  = (one <=> one) ** (one <=> one)
p one #=> 1
```

いいですね。`nil.to_i`は`0`となりますが、メソッドを使用すると面白くないということで採用した縛りにより、メソッドについては演算子風のシンタックスシュガーが導入されたものしか使用することができません。そこで`<=>`メソッドを使用することで`0`を得ることにしました。

`0`を得ることができれば`1`も得られます。同じ要領で`0`を二つ生成し、`**`メソッドによって0の0乗を求めます。1です。

0と1があればあとは任意の整数が生成可能なので、そこは省略します。

## まとめ

というわけで、皆さんもRubyで無から有の生成をやってみてください。業務には一切役に立たないと思います。

- `Symbol`を生成する方法
- `Array`を生成する方法
- できるだけ無を用いてFizzBuzzをアレする方法

などは読者への課題とします。

」

ぼく「なるほど」
SublimeTextでjQueryのインクルードをちょっと楽する。

jQueryを使って開発するときに
jQueryの読み込みをさくっとしてしまいたい時の小ネタ。

```
Ctrl + Shift + P
```

で出てきた入力欄に

```
jquery
```

と入力。

そしたら
>Snippet:Google AJAX Libraries jQuery

と出てくるのでそれを選択する。だけ。で、

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
```

これが挿入される。

ちなみに挿入直後はバージョンの部分（ここで言うと「1.11.1」の部分）が選択状態になってるので
そのまま任意のバージョンに変更することもできるという。
Windows環境でパーティション操作やフォーマットを非対話で行う方法

# Windows環境でパーティション操作を非対話で行う方法 #

機会があったのでメモ、対話型コマンドのdiskpartのコマンドを上からそのまま並べて、それを適当なテキストファイルに記述しておく。

	select disk 2
	clean
	create partition primary size=1024
	select partition 1
	active
	create partition primary
	select partition 2
	format fs=ntfs quick
	active

あとは、このテキストファイルをコマンドプロンプトから、diskpartに食わせれば非対話でパーティションやフォーマットが行われる。

	diskpart /s partition.txt

実行結果はこんな感じ

![](http://quickpress.blob.core.windows.net/kzmx/2015/01/diskpart.png)
Ubuntu に"apt"コマンドがあったのを知らなかった

Ubuntuでパッケージをインストールしたり検索したりするとき、今まで何も考えずに「apt-get install」や「apt-cache search」を叩いてた。
「なんかコマンドながくね？」と思って、「apt」と叩いてみたら普通にあった。
（Ubuntuは14.04）

```
$ apt
使用法: apt [オプション] コマンド

apt 用コマンドラインインターフェイス
基本コマンド: 
 list   - パッケージ名を基にパッケージの一覧を表示
 search - パッケージの説明を検索
 show   - パッケージの詳細を表示

 update - 利用可能パッケージの一覧を更新

 install - パッケージをインストール
 remove  - パッケージを削除

 upgrade - パッケージをインストール/更新してシステムをアップグレード
 full-upgrade - パッケージを削除/インストール/更新してシステムをアップグレード

 edit-sources - ソース情報ファイルを編集
```

「apt-get」と「apt-cache」が使われている理由が、歴史的もしくは伝統的な理由だけならば、コマンドが短いしこっちを使おうと思う。

debianにもあるのかな？
確認したいが、いま手元にない…。

取り急ぎ、ご報告までに。
SublimeText EmmetでHTMLのlang="en"のとこを変更する。

SublimeTextでEmmetを入れているとHTMLの書き出しの部分をめっちゃ楽できる。

```
html:5
```

もしくは

```
!
```

で展開すると、こんな感じで

```
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
</body>
</html>
```

HTMLの基本構造が展開されてすげー便利なんだけど
初期設定だとlang="en"になってしまう。

わざわざ毎回それを手書きでlang="ja"とするのは面倒なので
今回は設定を書き換えてlang="ja"にする方法を。

Emmetの設定ファイルを開くには
メニュー>Preferences>Package Settings>Emmet>Settings - User
を選択して下記のコードをコピペして保存する。だけ。

```
{
	"snippets": {
		"variables": {
			"lang": "ja",
			"locale": "ja-JP",
			"charset": "UTF-8",
			"indentation": "\t",
			"newline": "\n"
		}
	}
}
```

これでhtmlファイルを新規作成して
いつもどおり「!」とかを展開するとlang="ja"になる。

## 参照

[Sublime Text 2 ： Emmet プラグインが出力する HTML の言語を修正する](http://128txt.blogspot.jp/2012/12/sublime-text-2-emmet-html.html "Sublime Text 2 ： Emmet プラグインが出力する HTML の言語を修正する")
「.hackやSAO好きは必見! OculusとLeapMotionで画面の中にダイブしてみよう!」に参加した

## 概要
* 2015.01.24 14:00~17:00 [.hackやSAO好きは必見! OculusとLeapMotionで画面の中にダイブしてみよう!](http://connpass.com/event/10856/)ってのイベントに参加した
* 1, Oculus Rift DK2(ヘッド・マウント・ディスプレイ) 2, Leap Motion((赤外線で手の動きをキャプチャするkinect的な入力デバイス) を使ったデモ体験会
* いろいろな体験デモを見て、Oculus+LeapMotionで、どうなことを実現できることがわかった

## 内容
### 人体標本を解剖できる
![写真 2015-01-24 14 30 03.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/c12573c9-941d-0638-7437-38fc1ecd679c.jpeg)
![写真 2015-01-24 14 30 20.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/f894298b-d491-9a99-71cd-d44b82cc9942.jpeg)

* がなり未来
型インターフェィスです。人体の構造をよく見えます。例えば、頭をタッチして、移動できます。
* そのほかのリンク
 * https://www.youtube.com/watch?v=9YiGAR0JDt0
 * http://itch.io/jam/leapmotion3djam/rate/14812

### 360度周りから来る敵にパンチ
![写真 2015-01-24 14 38 00.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/7539400e-ac3d-d6c8-55bf-232c9969cda8.jpeg)

* 以前のゲームは、対面からの敵のみを打つが、360度周りのゲームは、どうな感じですか？
* リンク
 * http://nobikko-nobinobi.hatenablog.com/entry/2014/12/02/031047


### 竜に乗って銃を打つ
![写真 2015-01-24 15 02 46.png](https://qiita-image-store.s3.amazonaws.com/0/13451/32956fb1-4cef-c676-ab4f-34f553bccf85.png)
* http://itch.io/jam/leapmotion3djam/rate/14857

### 指で魔法を描いて魔法発動
![写真 2015-01-24 14 59 10.png](https://qiita-image-store.s3.amazonaws.com/0/13451/127b4e0b-6259-f951-1bfb-1cf2ea51813b.png)


### 大きな雪だるまを倒せばクリア
![写真 2015-01-24 15 11 18.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/557dffc7-2803-c6d9-7e4e-7ef02c953426.jpeg)

### ユニティちゃんのライブステージが観れる
![写真 2015-01-24 15 36 38.jpg](https://qiita-image-store.s3.amazonaws.com/0/13451/99ce91f2-568a-5f0b-e49d-bcad8e2b8cf7.jpeg)
IntelliJ と rbenv の組み合わせで Bundler が使えない時

IntelliJ IDEA と rbenv の組み合わせで Ruby の開発をしていると、以下のように Bundler が無効になってしまいます。

![disabled-bundler-action-min.png](https://qiita-image-store.s3.amazonaws.com/0/11244/d0647e88-8786-e651-1737-da11db0b6ce4.png)

## Bundler のパスを追加

IntelliJ IDEA の検索パスに Bundler が見つからないため無効になっているようです。
Bundler のパスを手動で追加します。

File -> Project Structure -> SDKs と開きます。

![add-bundler-path-min.png](https://qiita-image-store.s3.amazonaws.com/0/11244/9ee99081-20fa-7cd2-aff5-093f8077d727.png)

`Classpath` に Bundler がインストールされているパスを追加します。

Bundler は事前に `gem install bundler` を実行してインストールしておきます。

## Bundler アクションが使える

Bundler アクションが有効になりました。

![enable-bundler-action-min.png](https://qiita-image-store.s3.amazonaws.com/0/11244/0f438f14-ed96-3e22-14ad-af5d494080a7.png)

Install を実行し、gem をインストールしてください。

## 環境

私の実行環境は次の通りです。

* OS: MacOSX
* IntelliJ IDEA: 14.0
* rbenv: 0.4.0
EP-805AをUbuntu 16.04 LTSで使えるようにする方法

Ubuntu 16.04 LTSで、EP-805A(EPSON製複合機)をネットワーク経由で使用するための方法についてまとめます(EPSON製の他の複合機でも同様の方法でできるのではないかと思われます)。

#必要ソフトウェア・ドライバのインストール
1. [EPSON Download Center](http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX)にアクセスし、型番を入力して必要ソフトウェア・ドライバを検索します。
2. 次のソフトウェア・ドライバをダウンロードします。
 * ESC/P Driver (full feature)
 * Epson Printer Utility
 * All-in-one package
3. ESC/P Driver (full feature)とEpson Printer UtilityのdebパッケージをUbuntu Softwareで開き、インストールします。
4. All-in-one packageの圧縮ファイルを適当なディレクトリに解凍します。
5. 端末を起動します。
6. カレントフォルダを解凍先のディレクトリに移動します。
7. `sudo ./install.sh`を実行し、インストールします。
4. 再起動します。

#プリンタ
##設定
1. [システム設定]ー[印刷]を開きます。
2. [追加]をクリックします。
3. [ネットワークプリンター]ー[ネットワークプリンターを検索]をクリックし、しばらく待ちます。
4. 接続したい複合機が検出されたら、その項目をクリックし、[進む]をクリックします。
5. 必要事項を入力し、[適用]をクリックします。

##Epson Printer UtilityのDashホームへの登録
1. 端末を開きます。
6. `sudo chmod 755 /opt/epson-printer-utility/resource/Images`を実行し、Epson Printer Utilityのアイコンのパーミッションを変更します。
6. `sudo nano /usr/share/applications/epson-printer-utility.desktop`を実行し、以下のように記述します。

```epson-printer-utility.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Categories=Application;Printing;

Name=Epson Printer Utility

Exec=epson-printer-utility
Terminal=false
Icon=/opt/epson-printer-utility/resource/Images/AppIcon.png
```

##メンテナンス方法
1. Dashホームで`epson`と検索すると、Epson Printer Utilityが出てくるので、それを実行します。

#スキャナ
##設定
1. 端末を開きます。
2. `sudo nano /etc/sane.d/epkowa.conf`を実行し、以下のように追記します。

```epkowa.confの追記箇所
#net 192.16.136.2 1865
#net 10.0.0.1
#net scanner.mydomain.com
net {複合機のIPアドレス} #この項目を追記する
```

##使用方法
###データを取り込むだけで良い場合
1. Dashホームで`scan`と検索すると、Simple ScanとImage Scan! for Linuxが表示されるので、どちらか好きな方を使ってデータを取り込んでください(前者の方が名前の通り、シンプルな作りになっています)。

###データを取り込んだ後、GIMPで編集する場合
1. GIMPを起動します。
2. [ファイル]ー[画像の生成]ー[Scanning(isnan)]をクリックします。
3. Image Scan! for Linuxが起動するので、データを取り込みます。
4. 取り込まれたデータがGIMPに反映されます。

#その他
今回ダウンロードしたdebパッケージはリポジトリに登録されているわけではないので、手動でアップデートしなければなりません。

#参考文献
* [第286回　UbuntuからEPSON複合機EP-805Aを使用する：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0286)
* [【ubuntu】 EP-802Aのスキャナ機能をネットワーク越しに使いたい！: 日々此精進](http://murakan.cocolog-nifty.com/blog/2011/02/ubuntu-ep-802a-.html)
* [Scanner - なんなんなん行く？](https://sites.google.com/site/teyasn001/ubuntu-12-10/sukyana)
* [printing - How to get "Epson Printer Utility" to start from Launcher in Ubuntu? - Ask Ubuntu](http://askubuntu.com/questions/752763/how-to-get-epson-printer-utility-to-start-from-launcher-in-ubuntu)

#関連記事
* [MG6230をUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/84269bfeeda538429feb)
* [MFC-9420CNをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/d051ea2c1146fd48740c)
* [HL-4570CDWをUbuntu 16.04 LTSで使えるようにする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/3fdb8343e1a74b3e9f55)
Ansible when 分岐　inventory_hostname

 インベントリファイル中身↓
<pre>
[testgroup1]
testhost1
testhost2

[testgroup2]
testhost3
testhost4

[testgroup]
testhost1
testhost2
testhost3
testhost4
</pre>

プレイブック自体は
host: testgroup
で実行したとして


test1だけコンフィグファイルを分けたいとかって時、
こういう書き方ができるんすねー

<pre>
## ホスト名がtesthost1だったら実行
- copy: src=usr/local/abc.conf dest=/usr/local/httpd.conf mode=644
when: inventory_hostname == 'testhost1'
</pre>
↓
これだとtesthost1だと実行される



グループで分ける需要が多そう

<pre>
## グループ名がtestgroup1のホストだったら実行
- copy: src=usr/local/abc.conf dest=/usr/local/httpd.conf mode=644
when: inventory_hostname in groups['testgroup1']
</pre>
↓
これだとtestgroup1のtesthost1,testhost2で実行される
windows 10 9926 (32bit)をインストールしてみた

2015/1/23に公開された最新プレビュー版

# MacのVirtualBoxにインストール。

## ダウンロード

![0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/73652795-6673-b017-731f-3a46e8346c0c.png)


* Windows10_TechnicalPreview_x32_JA-JP_9926.iso
* Windows10_TechnicalPreview_x64_JA-JP_9926.iso

## MSアカウント作成せずに、ローカルアカウントを作成する手順

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/498113e9-ad99-afb4-2d22-68058b1ab164.png)


![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/64b0567f-4fed-4cd6-3702-378233745286.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c9e6ee54-c70f-bb5c-d4cc-c86d959bcaea.png)

## 初回デスクトップ表示時の情報

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/18533935-4b85-41b8-7393-bcc79ee266b6.png)

## VirtualBox Guest Addition

![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5b4bcd93-9605-65af-9563-5e41e0157b01.png)

インストールできたが、効果なし。VirtualBoxのバージョンアップ待ち。

# IE11

* ![6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1c75f70c-6df1-c6fd-4783-175c294cf6d4.png)
* 互換表示をONにするとUserAgent一部が「IE11 Edge」から「IE8」に変わる。
* 互換表示ONは優秀。期待通りに動いている。

# 自動ログインさせると２人の顔？

![スクリーンショット 2015-01-25 11.29.17.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9a609867-4523-7450-1267-1d9d5f83e235.png)

# ソフトの動作確認

* TeamViewer ・・・ リモートからwindows10の操作できた。
Cloudera Manager ファイル記述子の監視しきい値 (小ネタ)

 「開かれているファイル記述子の数は 261 個です。 ファイル記述子の制限は 4,096 個です。 使用中の割合は 6.37% です。」

Cloudera Manager(CM)の4系を使っている人はこんなアラートに出会った人もいるのではないかな
上記はアラートの閾値を0%にして意図的にアラート出しました。


うちはCMは4.7.3


OS側で/etc/security/limits.conf設定したっても、
これはpam_limitsの設定ファイルな為、PAM認証通らないOS起動時やリブート時に
自動起動するようなデーモンは、ここで書いた制限が効かない

Hadoopはファイルたくさん扱うのでスレーブ側ではオープンファイル数の上限を増やしてあげるの必要があるですが、CMの場合はcm-agentの起動シェルに書いてあげましょう。
ここ↓

<pre>
[root@falcon*** ~]# cat /usr/sbin/cmf-agent
# Force umask to 022. You can't reasonably do everything the Agent
# does with a stricter value. We specifically control permissions
# for things like log directories.
umask 022
# Bump ulimit values here so that all processes can inherit them.
# Supervisord prevents values in limits.conf from being respected.
# Max number of open files
ulimit -n 32768
# Max number of child processes and threads
ulimit -u 65536
</pre>

CMとしてのデフォでOSのデフォより大きいいい感じの値になってますが、
使い方によってはFDが足りなくなることもあるでしょうから
デフォ値をコメントアウトするなりして書き込みしましょう。CMで変えられるようになればなぁ(と思ったら本文後半で)
※OSデフォは1024なのに冒頭のは4096だなぁ；


とりあえず動いちゃってるクラスタについては、このファイルのulimitはコメントアウトし適宜ulimit入れて、
ロール停止
cm-agentリスタート
ロール起動
で、OS側で設定したlimits.confが反映されます。


ちゃんちゃん



そして、CM5系だと以下のようにCM上から設定できるようになっていますね。
地味～ですが、うれしい^^
AWS AZ間 NW帯域調査



インスタンス、"t1.micro"で実施。
おそらくインスタンスに依存するので、ほかのインスタンスで実施すればもっといい値が出たと思われる。

AZ：末尾1aと末尾1c

負荷ツール：netperf

OS：Centos6.3


結論
90～160Mbps出た。

利用したEIPはすでにリリース済みです。

実施する度に値のブレは結構ありました。各所で帯域を共有してるからか、この辺もprovisione出来たらという要望も出てくるかもしれませんね。

何度も実施したいのと、いろんなインスタンスでやりたいのですが、いつも参考にさせていただいている

ブログを書かれている"雑多なインフラエンジニア"さんの方に詳細が書いてありますので是非参考にしてみてください。

http://xoxo-infra.hatenablog.com/entry/2013/05/20/132453

<pre>
[root@ip-xxx]# netperf -p 12865 -H 54.250.132.114
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 54.250.132.114 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 97.21


[root@ip-xxx ~]# netperf -p 12865 -H 54.250.132.114
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 54.250.132.114 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.03 124.30
</pre>

●1c->1a

<pre>
[root@ip-xxx]# netperf -p 12865 -H 54.250.132.116
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 54.250.132.116 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.09 146.44


[root@ip-xxx ~]# netperf -p 12865 -H 54.250.132.116
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 54.250.132.116 () port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 153.82
</pre>
zookeeper ポート監視 (&hive少々)

 zookeeper のポート監視で2181のポートをつついていると、zookeeperが正常なセッションクローズができずに、監視のポーリングのタイミングごとにログファイル(zookeeper.log)に以下ログが出力される。

<pre>
2012-xx-xx 14:27:38,270 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@202] - Accepted socket connection from /192.168.x.x:58158
2012-xx-xx 14:27:38,270 [myid:1] - WARN [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@349] - caught end of stream exception
EndOfStreamException: Unable to read additional data from client sessionid 0x0, likely client has closed socket
at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:220)
at org.apache.zookeeper.server.NIOServerCnxnFactory.run(NIOServerCnxnFactory.java:213)
at java.lang.Thread.run(Thread.java:662)
2012-xx-xx 14:27:38,270 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1000] - Closed socket connection for client /192.168.x.x.101:58158 (no session established for client)
</pre>

これが時が経つと容量も肥大化する。。


●zookeeperのお作法としては、ruokを使う。

<pre>
# echo ruok | nc localhost 2181
imok
</pre>

●異常時には値を何も返さないので、zabbixでは文字列での判断ができなかったので以下のようなキーを作り、カウント値が0なら異常のトリガーを作った。

<pre>
system.run[echo ruok | nc localhost 2181 | grep imok | wc -l]
</pre>

●これで無駄ログスッキリ。不要なログ、見もしないログは消さないと。

●hiveのポート監視でも同様に、無駄ログ大量にはかれることになる。
以下のようにbeelineコマンドを使った方法がお作法としては正しそうです。

<pre>
echo "show tables;" | beeline -u jdbc:hive2://hiveserver2:10000 -n username -p password --silent=true
</pre>
Yarn NodeManager decommission (デコミッション) 手順

 CDH4.1.2
CentOS5.8

●Yarnのデコミッション手順
①excludeファイルにデコミッション対象ノードを追記(yarn-site.xmlで指定されたファイル)
hosts.exclude
②yarnでのrefreshNodes
・対象ノード：ResourceManagerサーバ
・実行コマンド：

<pre>
yarn rmadmin -refreshNodes
</pre>
・ウェブUIでnm確認

<pre>
http://resoucemanager_server:8088/cluster/nodes
->"Decommissioned Nodes"のカウントが1になること
->上記カウント値をクリックし、"NodeAddress"に対象ノードが表示され、"NodeState"にDECOMMISSIONEDとなっていること
</pre>
CLIでyarnのノードを確認できそうなコマンドがあったので試しましたが、

<pre>
yarn node -list
</pre>
CDH4.1.2には実装されてなく、CDH4.2からの実装でした。


●結論
手順的にはこれでよかったが、refreshNodesしたタイミングでNodeManagerのプロセスがダウンした。
いきなりプロセスダウンと違いがあるのか？と思い調べてみた。
まず、Gracefulな停止方法は今のところないらしい。
※ちなみに4.2でも同様にgracefulに停止はしない。
https://issues.apache.org/jira/browse/YARN-41

●プロセスダウンとデコミッションの違い
では、実際デコミッションするのといきなりNodeManagerのプロセスダウンで違いあるか？については、

デコミッションを行った場合、デコミッション対象ノードにおいて実行されていたコンテナは kill される。
<pre>
2013-xx-xx 06:26:19,807 INFO org.apache.hadoop.yarn.server.resourcemanager.ResourceTrackerService: Disallowed NodeManager nodeId: ip-192-168-1-1:41600 hostname: ip-192-168-1-1:41600
2013-xx-xx 06:26:19,807 INFO org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl: Deactivating Node ip-192-168-1-1:41600 as it is now DECOMMISSIONED
2013-xx-xx 06:26:19,807 INFO org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl: ip-192-168-1-1:41600 Node Transitioned from RUNNING to DECOMMISSIONED
2013-xx-xx 06:26:19,807 INFO org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerImpl: container_13659999900_0001_02_000003 Container Transitioned from RUNNING to KILLED
</pre>

一方、もし通常のシャットダウンを行った場合、リソースマネージャはノードマネージャがダウンしたことに気づかない。
よって、投機的実行が行われるまでの若干の間、タスクの再アサインが遅れることになる。

と、若干の違いであるようだ。あまり気にしなくてよさそう。
zookeeper leader follower 確認　コマンド

 zookeeper は奇数単位でアンサンブルと呼ぶクラスタを組む。
3台のアンサンブルだろうが5台のアンサンブルだろうが、その中の1台が書き込みを調停・受理するリーダーとなる。他のサーバはフォロワーと呼ばれ、リーダーのリードオンリーレプリカとなる。

zookeeperの可用性は、アンサンブル中、過半数のサーバが生きていれば機能する。
ZAB(ZookeeperAtomicBroadcast)というプロトコルで実現してる。

つまりアンサンブル中にはリーダーとフォロワーがいる。
その確認コマンドが以下である。

<pre>
echo stat | nc localhost 2181
</pre>
※ほかにもstat,dump,enviなどがある

例：
●フォロワー

<pre>
[root@server2]# echo srvr | nc localhost 2181
Zookeeper version: 3.4.3-cdh4.1.1--1, built on 1/1/2012 17:34 GMT
Latency min/avg/max: 0/0/33
Received: 1867
Sent: 1878
Outstanding: 0
Zxid: 0x100000092
Mode: follower
Node count: 16
</pre>
●リーダー

<pre>
[root@server1]# echo srvr | nc localhost 2181
Zookeeper version: 3.4.3-cdh4.1.1--1, built on 1/1/2012 17:34 GMT
Latency min/avg/max: 0/0/15
Received: 8104
Sent: 8124
Outstanding: 0
Zxid: 0x100000092
Mode: leader
Node count: 16
</pre>

今が旬の分散システム、その調停役として、HBaseやSorlなどで大活躍だが影がうすい。。
かなり重要な役割を担ってるが影が薄い。。
バグった時だけ脚光を浴びるというインフラのような存在。。
zookeeperはロック、排他制御、同期、ウォッチャー(死活監視)等を行う。
srvadmin OMSA で A semaph ore set has to be creat

 srvadmin,OMSA,dataeng を起動し、omreportコマンド実行すると、syslogに以下メッセージが出力され、omreportの出力がエラーとなる。

syslog↓

<pre>
aaa Server Administrator (Shared Library): Data Engine EventID: 0 A semaph ore set has to be created but the system limit for the maximum number of semaphore sets has been exceeded
</pre>

文字通りセマフォ数の上限値に達してる。
調べるとapacheのセマフォ解放ができていないようで、ググると対処方がたくさんできた。
総じて、解放できないapacheのセマフォを消すという対処方。

●ipcs -sで現状のセマフォ確認。grep apache でapacheのセマフォ確認。

<pre>
# ipcs -s

—— セマフォ配列 ——–
キー semid 所有者 権限 nsems
0×00000000 0 root 600 1
0×00000000 32769 root 600 1
0×00000000 3145730 apache 600 1
0×00000000 3178499 apache 600 1
</pre>

●sysctl kernel.sem でセマフォ上限確認。以下デフォ。

<pre>
kernel.sem = 250 32000 32 128
</pre>

●apacheを停止し、apacheのセマフォ消す。

<pre>
for i in `ipcs -s |grep apache | awk '{print $2}'`; do ipcrm -s $i; done
</pre>

●原因
apacheが正常でない終了。突然落ちるとかした場合にセマフォ解放できないことがあるらしい。
Datanode decommission または DN プロセスダウン 時のトラフィック

Datanodeをdecommissionにより退避させる場合と、
Datanodeプロセスをいきなりダウンさせた場合で、
ブロックレプリケーションによるネットワークトラフィックの差はありません。

どちらの場合にしても、以下のパラメータの値が適用されます。
dfs.balance.bandwidthPerSec (CDH4ではdfs.datanode.balance.bandwidthPerSec)

※DN間のブロック複製時の帯域設定値
SecondaryNamenode image edits マージ失敗からのsaveNamespaceコマンドによる復旧

 saveNamespaceコマンドによる復旧

どうやら以下のバグにぶつかっていたようで、
http://www.cloudera.co.jp/blog/riskofhdfsmetadatacorruptionduetodfs-name-dirwithidenticaldirectoryend-component.html


NameNodeのMasterとセカンダリでメタデータの不整合が起きて、
それにより、SecondaryNamenodeでimageとeditsのマージに失敗する事象が起きました。

解決方法も上記のURLの通りで解決しました。
ただ、namenodeだけにビビリました。。
メタデータ不整合とか怖い・・(CDH4以上なら安心のようで)
あと、CDH4以上でもスキーマを日本語で作るとメタデータが落ちる？壊れるという噂も・・

おおざっぱな流れとしては、

1. セカンダリネームノードを停止します。
->セカンダリ止めます。
2. HDFS以外の全てのクラスタでの活動を停止します。
->HDFSでの作業になるので、その上で動いてるhbaseやmapreduceは止めて安全にやるってことですね。
3. すべてのdfs.name.dirディレクトリのバックアップを作成します。
->その時のメタとエディッツのバックアップです。
4. hdfsユーザでHDFSをセーフモードにします。
$ hadoop dfsadmin -safemode enter
->セーフモードにします。読み込みのみのモードになります。
5. saveNamespaceコマンドでNNのイメージを保存します。
$ hadoop dfsadmin -saveNamespace
->メモリ上のイメージファイルをファイルとして保存してくれます。これで現状のイメージファイルと整合性がとれるメタデータになります。
6. 全てのdfs.name.dirディレクトリを保存することによって、この新しいfsimage用の別のバックアップを作成します。
->バックアップ作成です。
7. ネームノードを停止します。
->下の設定適用のためとメタデータ読み直しのための停止
8. ユニークなパスのエンドコンポーネントを使うため、ローカルファイルシステムのdfs.name.dirディレクトリをリネームします。
->このバグのワークアラウンド処理です。
cumulus スイッチ　きたー

頂いたCumulusスイッチのライセンスが来たので発動させる。


同じネットワーク上にWebサーバー立ててドキュメントルートに以下のファイルをボンと置いとく
CumulusLinux-2.0.2-powerpc.bin

force10はcpuはpowerpcなのか！？

電源ON

セットアップが始まる
全自動


ライセンスをこのコマンドでぶっ込む

<pre>
sudo cl-license -i
</pre>




IP設定は/etc/network/interfaceの中をいじる

末尾のdhcpのとこコメントアウトしてスタティックアドレス入れる

<pre>
auto eth0

#iface eth0 inet dhcp

iface eth0 inet static

    address 192.168.1.2

    netmask 255.255.255.0

    gateway 192.168.1.1
</pre>




ifconfigでも

ip addr showでも

debian系のLinux操作でOKです。





/etc/init.d/network reload



これだと設定ファイル読み直さない！ちょっとはまった。なぜだ！？



/etc/init.d/network restart





無事ssh接続OK



cumumusユーザーがデフォ

パスワードはcumulusnetwork 社のquickstartに

sudoできるよ



あとはこんな感じ。時間ないのでまたゆっくり書きます～


<pre>
root@cumulus:~# uname -r

3.2.46-1+deb7u1+cl2+1

root@cumulus:~# df -h

Filesystem      Size  Used Avail Use% Mounted on

dev              10M     0   10M   0% /dev

/dev/sysroot1    80M   80M     0 100% /mnt/root-ro

/dev/mmcblk0p3  7.0G   90M  6.5G   2% /mnt/root-rw

overlayfs:root  7.0G   90M  6.5G   2% /

tmpfs            10M   88K   10M   1% /run

tmpfs            10M     0   10M   0% /run/lock

tmpfs           100M     0  100M   0% /tmp

tmpfs           100M     0  100M   0% /var/tmp

tmpfs           981M     0  981M   0% /run/shm

initramfs       981M  1.9M  979M   1% /mnt/initramfs

/dev/persist    124M   16K  118M   1% /mnt/persist
</pre>
Xcodeでプロジェクト名を変更したがまだ旧名が表示されている？

# はじめに
おそらく、それはSchemeです。

# Schemeも変更する

こちらの手順によりプロジェクト名を変更できます。
[Xcodeでプロジェクト名を変更する方法](http://qiita.com/284km/items/2cca044af2085ee8df6b)

その後、Schemeも変更します。

Product > Scheme > Manage Schemes...
から変更します。

# おわりに
この状態となった時に思い出して頂ければ幸いです。

# 余談
(Scheme)スキームとスキーマ(Schema)は間違えやすいですね。
この記事も途中まで「スキーマ」で書いていました。
Live+Max+oFでMIDIを扱う

## [01] はじめに＆セットアップ
こちらの記事の続きというか2回目。
http://qiita.com/hisahayashi/items/7f3d76709908a2e04308

今回は Ableton Live 9 で作ったMIDIデータを、Maxで読み取りOSCでoFに取り込んでみます。

### Ableton Live とは
Ableton Live はDTM用のシーケンスソフトですが、即興性の高いライブなどにも使われる素晴らしいツールです。EDMのDJから、ジャズピアニストまで様々なアーティストからも指示を得ているようです。
https://www.ableton.com/ja/pages/artists/artist_quotes/


### 制作環境

- Mac OSX 10.10.1 Yosemite
- XCode 6.1.1
- Max 7
- openFrameworks 0.8.4
- Ableton Live 9


### インストール

MaxとoFについては前記事で触れているので省略します。

Liveはこちらから体験版がDLできます。
通常のアプリケーションなので特に難なくインストール出来ると思います。（結構容量食うかもなのでそこだけ注意）
https://www.ableton.com/ja/trial/

## [02] LiveでMIDIデータを作成

まず元ネタとなるMIDIデータを作成します。
DTMの経験がある方は難なく作成できるかもしれませんが、難しい方はGitHubにLiveのデータを上げているので、よかったらお使いくださいー。
→ [GitHub: Live Max oF MIDI Receive](https://github.com/hisahayashi/Live-Max-oF-MIDI-Receive)

Liveの使い方をここで説明すると恐ろしく長くなりそうなので、ここではMaxにMIDIデータを送る要点だけ記載します。

こことかをご覧下さい。
http://www.h-resolution.com/ableton/Movie.html

### LiveでMIDIデータを送る時の要点

まず、環境設定から **MIDI Sync** を選び、**Output to Max 1** のトラックの欄を**オン**にします。
黄色くなってるところですね。
このトラック、同期、リモートというのがそれぞれどんな切り分けなのかイマイチわかっていないので、ここは追って調べてみます。
![001.png](https://qiita-image-store.s3.amazonaws.com/0/36929/818bb5ba-f724-8f26-bb8e-fce5ca8752d4.png)

次に送りたいトラックの **MIDI To** を **to Max 1** にします。
この時、環境設定でトラックをオンにしていない場合は **to Max 1** という表示が出ないのでご注意下さい。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/36929/53eb8962-fc33-2de5-fd48-f533977956dd.png)
このサンプルの場合は**MIDI From**で別のトラックを指定し、主な3つのトラックのMIDIデータをMaxへ送信するようにしています。
**to Max 1** の下にチャンネル設定があるのですが、これを**Ch.1, 2, 3...**と変えることで複数のMIDIデータを送信することが出来ます。
またこの際に、MIDIデータを送りたいトラックのアームボタン（録音可能にするボタン、赤くなってるところ）がオンになっていないと送信されないのでご注意を。
（ちょっと変な操作したりするとすぐオフるので、ここ固定とかに出来る方法があったら知りたい...）

ちなみにアレンジビューでの見え方はこんな感じです。
![003.png](https://qiita-image-store.s3.amazonaws.com/0/36929/323c0acd-f6e1-9f76-2279-881af77228a1.png)


## [03] MaxでMIDIデータを受け取る

まず出来上がった画面はこんな感じです。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/36929/9b178588-8798-3ae6-5e18-425ba5600e06.png)

`notein`でチャンネル毎にpitchとvelocityを取得しています。
左がpitchで、右がvelocityです。

その後、`sprintf`でOSC用のアドレスと結合して、`udpsend`でOSC送信を行っています。
`print`はデータのチェック用に置いてあるのでなくても大丈夫です。
ただ`print`よりももっと良いデバッグの出し方がある気がするけど..。

-`notein`: 
-`number`
- `sprintf`
- `print`

**▼ 参考ページ**
https://cycling74.com/docs/max5/vignettes/core/max_and_other_apps.html
https://www.ableton.com/ja/articles/synchronizing-live-midi/
https://www.ableton.com/ja/manual/routing-and-i-o/

## [04] oFでデータを受け取る
下記記事とコード自体はあまり変わってませんが、アドレス形式のOSCを`oFSplitString()`で切り取り、チャンネル毎とpitch or velocityに分けています。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/36929/1488c69b-e3f1-ead1-a3da-2fabecf3819a.png)

左からCh1,2,3、上の黒丸がpitchで、ここでは見えていませんがその下がvelocityの値を円の半径として使用しています。


## [05] GitHub
Max7用のパッチとoFのXcodeプロジェクト、それにAbleton Live9のプロジェクトデータをアップしました。
https://github.com/hisahayashi/Live-Max-oF-MIDI-Receive


以上

初稿: 2015.01.25
UISliderの指を離したタイミングをフックする方法

```
// タッチした
[slider addTarget:self action:@selector(beginSeek:) forControlEvents:UIControlEventTouchDown];
// 動かしている
[slider addTarget:self action:@selector(seekPositionChanged:) forControlEvents:UIControlEventValueChanged];
// 離した
[slider addTarget:self action:@selector(endSeek:) forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside | UIControlEventTouchCancel)];
```
PlayのAssetsのCache-Controlの全体設定

# 前提
AssetsのCache-Control命令、特定ファイルの設定方法は書いてあるけどそもそも全体的に設定するのはどうすんのよ、って思ってPlayのソースコード漁ってみたら設定方法見つけた話。

最低必要な知識として、

https://www.playframework.com/documentation/ja/2.3.x/Assets

にあるCache-Control命令の追加を読もう。

# 本題
https://github.com/playframework/playframework/blob/4ae9c92ea46aee61fea741c76ab207f09fd55a3c/framework/src/play/src/main/scala/play/api/controllers/Assets.scala#L88

application.confで、assets.defaultCacheにCache-Controlの値を書き込めば良い模様。あとちらほらaggressiveCacheの文字が見えるので、そゆ設定ができそうだが未確認。
PHPのクロージャ

PHPで関数を変数に代入することができると、最近知りました。
こんな感じで使えます。

```php
$func = function() {
	echo 'hello';
}; // 変数の右辺なので、「;」が必要っぽい

$func(); // hello
```

お、これはもしかして、JavaScriptにあるようなクロージャもできるのでは？と思ったのですが・・・。

```php
$func = function() {
	$x = 0;
	return function() use($x) {
		return ++$x;
	};
};

$func2 = $func();
echo $func2(); // 1
echo $func2(); // 2かと思いきや、1
echo $func2(); // 3かと思いきや、1
echo $func2(); // 4かと思いきや、1
```

あれー？(´・ω・`)
ちょっと調べたところ、マニュアルの[無名関数](http://php.net/manual/ja/functions.anonymous.php)のところに、

> 引き継がれた変数の値は、関数が定義された時点のものであり、
> 関数が呼ばれた時点のものではありません

~~とあったので、できないっぽいです。~~


**追記：**

@mpywさんのコメントにより、動かすことができました！ありがとうございます！！
動いたコードはこんな感じです。

```php
$func = function() {
	$x = 0;
	return function() use(&$x) {
		return ++$x;
	};
};

$func2 = $func();
echo $func2(); // 1
echo $func2(); // 2
echo $func2(); // 3
```

そうかー、ポインタ渡せば良かったのかー・・。
コメントにある@mpywさんのコードのほうがシンプルなので、そちらも参考にすると良いと思います。
日本の祝日データをEXCEL(VBA)で取得してみた


## 概要
Google は XML/ICAL/HTML の形式で日本の祝日データ (当年とその前後一年分) を提供しています。今回は XML のデータを取得して, 祝日名と日付情報を配列に格納してみます。

## コード
GitHub に置いておきますので, 必要な方は自由に使ってください。
[slangGetHoliday.cls](https://github.com/slangsoft/SlangBox "slangGetHoliday.cls")

## 使い方
1. 適当な Excel ファイルに [slangGetHoliday.cls] をインポートする。
2. 標準モジュールを新規追加し, その中に下記の様なサブルーチンを用意する。

下記サンプルでは, 取得した祝日データをイミディエイトウィンドウに表示します。ちなみにソートは行っていません。XML から取得した順番に表示されます。

~~~VBA
Public Sub main()

    Dim myGetHoliday As New slangGetHoliday
    Dim holidayData As Object
    Dim numHolidayData As Integer
    Dim i As Integer
    Dim holidayDataSet() As String
    Dim re As Object
    Dim reMatch As Object
    
    myGetHoliday.setTmpFilePath ("c:\")    '一時ファイル作成用ディレクトリ設定
    Set holidayData = myGetHoliday.getHolidayData()
    
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "[0-9]{4}/[0-9]{2}/[0-9]{2}"
    re.Global = True

    numHolidayData = holidayData.Length
    ReDim holidayDataSet(numHolidayData - 18, 1) As String
    
    For i = 0 To numHolidayData - 18
        Set reMatch = re.Execute(holidayData.Item(i + 17).childNodes.Item(5).nodeTypedValue)
        holidayDataSet(i, 0) = holidayData.Item(i + 17).childNodes.Item(4).nodeTypedValue
        If reMatch.Count > 0 Then
            holidayDataSet(i, 1) = reMatch(0).Value
        End If
    Next
    
    For i = 0 To numHolidayData - 18
        Debug.Print holidayDataSet(i, 1) & " " & holidayDataSet(i, 0)
    Next

End Sub
~~~

`holidayDataSet(i, 1)` に日付データ (yyyy/mm/dd形式), `holidayDataSet(i, 0)` に祝日名が入っています。

## 注意
これを作った後に気づいたのですが, XML 形式で提供されているデータは祝日情報を網羅できていないようです。私が動作確認を行った時点では, 明らかに ICAL/HTML よりも情報が少ない。

データが更新されることを期待して, この記事を残します・・・。

Add 2015/01/25 22:21
ICAL から取得する方法も記事にしました。
[日本の祝日データをEXCEL(VBA)で取得してみた - ICAL編](http://qiita.com/slangsoft/items/a4334d8575c66006d88c "日本の祝日データをEXCEL(VBA)で取得してみた - ICAL編")

## あとがき
やはり祝日データの需要は大きいみたいですね。個人的には民間企業とかじゃなくて, もっと公的な機関がデータを提供して欲しいと思っています。日本政府とかね。
AndroidStudioでいかにラクしてローカライズするかを考えた（しかも無償で）

# ローカライズをタダでラクしてやるには

* **Android Localizationer Plugin**
デフォルトのローカライズファイル（通常、母国語かEnglish語かですが）を作って、一気に多言語化したいときに便利なプラグインです。
これを使います。

* **Googleスプレッドシート（GOOGLETRANSLATE関数）**
プラスでこれも使います。
Android開発者であればGoogleアカウント持ってるので誰でもできますしね。

# 環境
* Max OSX (10.9.x)
* AndroidStudio 1.0.1

# Android Localizationer Pluginを使う

このプラグインはファイルの一括変換になるので、用途としては、新規でアプリ開発する時や、対応言語が増えた時などが思い浮かびます。

1. [Menu] > [Android Studio] > [Preferences] > [Plugins] > [Browse repositories...] 
3. "Android Localizationer" を選択しインストール後、Android Studioを再起動
4. デフォルトの `values/string.xml` を右クリック
5. [Convert to other launguage] をクリック
    ![スクリーンショット 2015-01-25 0.57.14.png](https://qiita-image-store.s3.amazonaws.com/0/42855/184653d6-91bb-9b37-835c-79075d40b17c.png)
6. 翻訳対象の言語を選択して [OK] をクリック
    ![スクリーンショット 2015-01-25 0.57.55.png](https://qiita-image-store.s3.amazonaws.com/0/42855/71ecde2f-a05e-0c8a-3139-fded9923e723.png)
7. `values/string.xml` 配下に各言語のstring.xmlが自動生成される
    ![スクリーンショット 2015-01-25 0.59.50.png](https://qiita-image-store.s3.amazonaws.com/0/42855/5c69c058-1e31-a375-539e-56dbf2dfe85f.png)


# Googleスプレッドシート+Translation Editor Toolを使う

[Googleスプレッドシート（GOOGLETRANSLATE関数）](https://support.google.com/docs/answer/3093331)で変換し、AndroidStudioのツールであるTranslation Editorを使って編集する。
キーを追加した時などはこの方法を使った方がよいかと思います。


1. デフォルトの `values/string.xml` を右クリック
2. "Open Translation Editor" をクリック
    ![スクリーンショット 2015-01-25 1.46.07.png](https://qiita-image-store.s3.amazonaws.com/0/42855/56b626b8-eac0-64ec-9a0b-5b33587abdfc.png)

3. Googleスプレッドシートで機械翻訳した結果を１つずつ貼り付ける


# 補足と注意点
* Android Localizationer Pluginは、GoogleとMicroSoftどちらかの翻訳を選択できます。
    ![スクリーンショット 2015-01-25 1.07.57.png](https://qiita-image-store.s3.amazonaws.com/0/42855/b609ae79-1290-942a-2168-0677e65b672d.png)
    * [Microsoft Translator API](http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx)（デフォルトはこっち）
        * 月20万文字までの翻訳利用であれば無料（現時点）
    * [Google Translate API](https://cloud.google.com/translate/v2/pricing)
        * 有償。1Mあたり20ドル。1日200万文字まで。1月5000万文字以上の翻訳には要問い合わせ。

* Translation Editor はまだPreview版なので改良される可能性があります。その場合は、もっといいやり方が見いだせるかもしれません。その時はまた考えたいと思います。
    * *Google Translate APIで翻訳したものが自動反映される仕組みになってしまうんでしょうか。。*