OmniAICreator/Qiita-1.07M huggingface dataset:
NetBeansからMSYS2のgccを使う

NetBeansからMSYS2のgccを使うといくつか問題が起きます。

* NetBeansがMSYS2を自動認識しない
* パスが通らない
* 文字化けする

パスと環境変数を設定するラッパーを用意することで解決を試みました。

※ 公式な手段があるのかもしれませんが、不明なので力技です。

# ラッパー

次のようなファイルを作成します。

※ MSYS2のインストール先が異なる場合は`USR`を適宜修正してください。

```make-wrap.cpp
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <vector>

#define USR "C:\\msys64\\usr"

std::string lower(const std::string &s) {
	std::string ret;
	for (int i = 0; i < s.size(); i++) {
		char ch = s[i];
		if ('A' <= ch && ch <= 'Z') ch += 32;
		ret += ch;
	}
	return ret;
}

int main(int argc, const char *argv[], const char *envp[]) {
	const char *make = USR"\\bin\\make.exe";
	argv[0] = make;
	std::vector<const char *> envs;
	std::string path;
	for (int i = 0; envp[i]; i++) {
		std::string e = envp[i];
		std::string e5 = lower(e.substr(0, 5));
		if (e5 == "path=") {
			path = "PATH="USR"\\bin;"USR"\\local\\bin;" + e.substr(5);
			envs.push_back(path.c_str());
		} else if (e5 != "lang=") {
			envs.push_back(envp[i]);
		}
	}
	envs.push_back("LANG=C");
	envs.push_back(NULL);
	return execve(make, const_cast<char **>(argv), const_cast<char **>(&envs[0]));
}
```

コンパイルしてMSYS2のルートに置きます。DLLに依存しないよう、Win32ネイティブでスタティックリンクします。

```text
$ x86_64-w64-mingw32-g++ -static -s -o /make-wrap make-wrap.cpp
```

※ 要 `pacman -S mingw-w64-cross-gcc`

# NetBeansの設定

NetBeansで環境を設定します。

## プラグインの確認

C/C++プラグインがインストールされているか確認します。

ツール → プラグイン

![NetBeans1.png](https://qiita-image-store.s3.amazonaws.com/0/32057/7bd87582-0a2b-440b-5503-a6a3e95560a2.png)

インストールされていなければ、インストールしてください。

![NetBeans2.png](https://qiita-image-store.s3.amazonaws.com/0/32057/633d469c-a5f7-19b5-fcd3-95c7ba1678db.png)

## プラグインの設定

ツール → オプション → C/C++ → [追加]

![NetBeans3.png](https://qiita-image-store.s3.amazonaws.com/0/32057/446d89c8-7821-d441-a867-dad44fd460c5.png)

ベース・ディレクトリとツール・コレクション・ファミリを選択 → [OK]

![NetBeans4.png](https://qiita-image-store.s3.amazonaws.com/0/32057/2e88930a-fce5-09bc-d68f-37027655cff4.png)

※ CygwinやMinGWを選択するとうまく動かないためInterixを指定しています。

CコンパイラとC++コンパイラとmakeコマンド（先ほど作成したラッパー）を指定

![NetBeans5.png](https://qiita-image-store.s3.amazonaws.com/0/32057/a494e7b1-1462-dee9-5746-9cf713f4e3c8.png)

コード支援 → インクルード・ディレクトリで`...\usr\usr\include`を変更 → 重複する`\usr`を取り除く

![NetBeans6.png](https://qiita-image-store.s3.amazonaws.com/0/32057/b026ca01-5803-3a3d-52a0-b2fef8a154a1.png)

C++コンパイラについても同様に処置 → [OK]

![NetBeans7.png](https://qiita-image-store.s3.amazonaws.com/0/32057/f916a784-c20b-fbc6-f014-40bb256fd4ed.png)

以上で設定は完了です。
派生開発における変更指示をモデルで表現する（問題編）

セイコーエプソンの萩原さんと、モデルを使って派生開発の変更指示をうまく表現できない、という課題を議論しました。考えのメモです。

# 派生開発における「変更指示」

日本の組込み開発でよく使われる手法である清水さんの[「派生開発」(XDDP)](http://affordd.jp/about_xddp2.shtml)ですが、派生前の状態に対して[「変更指示」](http://www.exmotion.co.jp/solution/yokyu-2.html)を文書化します。

ソースコードレベルであれば問題は少ないのですが、構造に対しての修正は大域的になり、うまく表現しにくくなります。これをモデルで扱いたい、というのが問題です。

# Before/After の問題点

まず考えられるのは、Before と After を示す方法です。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/541e4813-a974-2a9c-b1c4-9bb9fde0f15d.png)

ここから実際の変更を行うのはとても観察力が必要！例えて言えば、間違い探しになってしまいます。
![image](https://qiita-image-store.s3.amazonaws.com/0/51055/54ea6ef5-45c1-4cb1-11e4-ddf4c3e22887.png)

例えば [astah などでは diff をとる機能もあります](http://astah.change-vision.com/ja/feature/compare-diagram.html)が、もっといい方法はないでしょうか？普通は「赤ペン」を入れたいところ。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/85f446e2-c876-8251-28e9-e7d47695ee38.png)

さらに言うと、せっかくなので、__「変更を表現するモデル」__があるとよいのに！変更を表現するのが目的のモデルとそれを使ったビュー。

# この表現の必要性をアーキテクチャの観点から言ってみる

「アーキテクチャ記述」という何か、という話で、2000 IEEE1471（[ISO/IEC42010](http://en.wikipedia.org/wiki/ISO/IEC_42010)）という標準モデルがあります。そこには、「ビュー」と「ビューポイント」が定義されていて（[『ソフトウェアシステムアーキテクチャ構築の原理(第2版)』読んだ](http://qiita.com/kenjihiranabe/items/0a41a0965808300bd450) 参照）

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/4a3f184a-1cca-e548-902b-b0b2dec1c607.png)

* __「ステークホルダー」__毎に__「関心事」__があり、
* __「ビューポイント」__は１つ以上の__「関心事」__をカバーする。

となっています。要は、モデルは誰かの関心事毎にビューポイントに従って記述される。派生開発にとって「変更」は明らかに関心事であるから、「変更を示すビュー」、そしてそのモデル表現は必要だといえる。

# 解決案

しかし、現在、この「変更を示すモデル」を真正面から扱ったものを、ぼくは知らない。。。。赤ペンで書くのもよいでしょう。そして、Before/After を示すのもよいでしょう。しかし、もうちょっとフォーマルに（UML程度のセミフォーマルに）扱えるとよいのに。__「変更を表現するモデル」__があるとよいのに。

というのが問題です。では、次に解の試案です。

*  [派生開発における変更指示をモデルで表現する（試案編）](http://qiita.com/kenjihiranabe/items/4c720a4cd6dc69fb5c48)

--------------

（補記1：クラス図を例にしましたが、状態遷移図やアクティビティ図、シーケンス図など、もっといろんな図で使えるとよいと思っています。また、派生開発の現場ではC言語が多く使われるかもしれません。ここでは例としてUMLクラスを使ったオブジェクト指向的表現となっていますが、クラスを「ファイル」、操作を「関数」、属性を「変数」と読み替えてC言語でも使えるものがよいと思っています。）

（補記2：[今年の派生開発カンファレンスに、基調講演という大役を頂きました](http://affordd.jp/conference2015_program.shtml#Keynote)。日本のアジャイルの話をしようと思います。）
natto-py を通して Python で MeCab 制約付き解析(部分解析)を使う

# 制約付き解析(部分解析)

MeCab の制約付き解析(部分解析)機能は、文の一部の形態素情報が既知である、あるいは境界が分かっている場合に使う機能です。Python と MeCab のバインディングの natto-py は、３つの制約付き解析方法を提供します。

1. `--partial` / `-p` オプション
2. boundary 制約の指定
3. feature 制約の指定 

# --partial オプションで部分解析

MeCab インスタンスを取得するときに `--partial` または `-p` オプションを指定します。
`parse` に渡す入力文は次のようなフォーマットで制約を記述します。

* 文断片: 
    * 文の断片。制約がないときと同じように通常の形態素解析が行われる。ただし文断片をまたぐような 形態素は出力されない。
    * 必ず `\n` （改行）を末尾に付け加える。

* 形態素断片
    * フォーマットは `表層\t素性パターン\n` 。
    
* 最後に、入力文の末尾に `\n` を付け加える。

```
from natto import MeCab

text = """にわ\tほげ
に
はにわ\tほげ
にわとり\tほげ
がいる。
"""

with MeCab("--partial") as nm:
    print(nm.parse(text))
 
にわ	ほげ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
はにわ	ほげ
にわとり	ほげ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
いる	動詞,自立,*,*,一段,基本形,いる,イル,イル
。	記号,句点,*,*,*,*,。,。,。
EOS
    
```

上記の例は解析結果を標準出力に送りますが、より細かい制約ならば、形態素境界制約指定 (boundary) または品詞制約指定 (feature) の機能を使ってください。

# 形態素境界制約の指定 (boundary constraints)

単語境界があらかじめ分かっているのであれば boundary_constraints キーワード引数でその境界をコンパイル済みの正規表現または文字列を指定することができます。指定された形態素境界にマッチするものは、一つの形態素として扱って解析するようになります。

```
text = "にわにはにわにわとりがいる。"

patt = "にわとり|はにわ|にわ"

with MeCab() as nm:
    # 形態素境界制約を指定して、各 MeCabNode 情報を取得する
    for n in nm.parse(text, boundary_constraints=patt, as_nodes=True):
        if not (n.is_bos() or n.is_eos()):
            print("{}:\t{}". format(n.surface, n.feature))

# BOS/EOS ノードは省略する
にわ:	名詞,一般,*,*,*,*,*
に:	助詞,格助詞,一般,*,*,*,に,ニ,ニ
はにわ:	名詞,一般,*,*,*,*,はにわ,ハニワ,ハニワ
にわとり:	名詞,一般,*,*,*,*,にわとり,ニワトリ,ニワトリ
が:	助詞,格助詞,一般,*,*,*,が,ガ,ガ
いる:	動詞,自立,*,*,一段,基本形,いる,イル,イル
。:	記号,句点,*,*,*,*,。,。,。  
```

詳しくは [6.2. re — 正規表現操作](http://docs.python.jp/3.4/library/re.html) と [re.finditer](http://docs.python.jp/3.3/library/re.html#re.finditer) を参照してください。


# 品詞制約の指定 (feature constraints)

feature_constraints キーワード引数により、特定の形態素ごとに品詞分類を指定することができます。形態素に対する品詞をペアとしてもつ[タプル (tuple)](http://docs.python.jp/3.3/library/stdtypes.html#tuple) を、それらの形態素・品詞マッピングを更にタプルに格納しておいて、次のように [parse メソッド](http://natto-py.readthedocs.org/en/master/code.html#natto.MeCab.parse)に渡します。

```
feat = (("にわとり","ほげ"), ("はにわ","ほげほげ"), ("にわ","更にほげ"))

with MeCab() as nm:
    # 一部の形態素に対して品詞制約を指定して、各 MeCabNode 情報を取得する
    for n in nm.parse(text, feature_constraints=feat, as_nodes=True):
        if not (n.is_bos() or n.is_eos()):
            print("{}:\t{}". format(n.surface, n.feature))

# BOS/EOS ノードは省略する
にわ:	更にほげ
に:	助詞,格助詞,一般,*,*,*,に,ニ,ニ
はにわ:	ほげほげ
にわとり:	ほげ
が:	助詞,格助詞,一般,*,*,*,が,ガ,ガ
いる:	動詞,自立,*,*,一段,基本形,いる,イル,イル
。:	記号,句点,*,*,*,*,。,。,。
```

以上

# 参照

* [制約付き解析(部分解析)](http://taku910.github.io/mecab/partial.html)
* [natto-py @ PyPI](https://pypi.python.org/pypi/natto-py/)
* [natto-py @ github](https://github.com/buruzaemon/natto-py)
slackboard-log〜cronlogライクなSlackboardクライアント〜

# slackboard-cli〜Slackboardクライアント〜

[Slackboard〜Slackプロキシサーバ in Go〜](http://qiita.com/cubicdaiya/items/1f9a8846f55b9d0bcb48)で書いたように[Slackboard](https://github.com/cubicdaiya/slackboard)にはSlackプロキシ(`slackboard`)のためのクライアントプログラムである`slackboard-cli`が付属している。

これを利用すると稼働中の`slackboard`(slackboard-host:29800)に対してメッセージを送信するだけでSlackに通知することができる。

```bash
$ echo message | slackboard-cli -t test -s slackboard-host:29800
```

ただ、時々何かの処理に失敗した時だけSlackに通知したいことがある。例えば一日一回圧縮済みのログファイルをGoogle Cloud Storageにアップロードしていて、このタスクが失敗した時だけSlackに通知するケースを考えてみる。

```bash
# copy log file to Google Cloud Storage
gsutil cp /data/${data_log}_20150505.log.gz gs://${bucket}/

result=`echo $?`
if [ $result -ne 0 ];
then
    echo "@channel: failed to copy log to Google Cloud Storage(${date_log})." | slackboard-cli -s slackboard-host:29800 -t error-gcs
    exit
fi
```

シェルでリターンコードを元に失敗判定を行うのは汎用的である一方結構面倒である。というか`if`の文法を毎回忘れてはググっている自分がいるのをどうにかしたい。

次にcrontabに書かれたスクリプトの実行が失敗した際にSlackに通知したいとする。

```croc
0 6 * * * some-command some-args
```

`some-command`をラップして`some-command`が失敗した際にSlackに通知するロジックを埋め込ることができれば便利だ。似たようなことをするツールに[cronlog](http://developer.cybozu.co.jp/archives/kazuho/2010/01/crontab-f131.html)がある。

```croc
0 6 * * * cronlog -- some-command some-args
```

上記のように[cronlog](http://developer.cybozu.co.jp/archives/kazuho/2010/01/crontab-f131.html)をはさむと`some-commnd`が失敗したとき(リターンコードが非ゼロ)にだけ実行結果を標準出力と標準エラー出力に吐くことができる。

で、先週社内のSlackで`cronlog`のSlack版みたいなのがほしいよね、という話になってその二日後社内リポジトリに`slacklog`というPerlスクリプトがコミット&マージされた。

# slackboard-log〜cronlogライクなSlackboardクライアント〜

`cronlog`や`slacklog`のアイデアは非常に良いものなので自分も[Slackboard](https://github.com/cubicdaiya/slackboard)向けにGoで[`slackboard-log`というクライアントプログラム](https://github.com/cubicdaiya/slackboard/blob/master/slackboard-log.go)を書いてみた。これを使うと特定のタスクが失敗した時だけSlackに通知するような処理を簡単にラッピングできる。

```croc
0 6 * * * slackboard-log -s slackboard-host:29800 -t error-some -- some-command some-args
```

Slackに通知するのとは別に実行結果をファイルに吐くこともできる(`-log`)。こっちはコマンド実行の成否にかかわらず行われる。

```
slackboard-log -s slackboard-host:29800 -t error-some -log /tmp/some.log -- some-command some-args
```
Xcode6.3ではbackground fetchのテストが実行出来ない。

https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html

ドキュメントにあるとおり

`The Xcode menu command Simulator Background Fetch does not work.
Use the menu command in iOS Simulator instead. (20145602)`

`Xcodeのメニューの「Simulator Background Fetch」は動かないよ。代わりにiOS Simulatorのメニューコマンドを使ってね。`

だそうです。

え、

>代わりにiOS Simulatorのメニューコマンドを使ってね。

実はこの項目は無いので出来ない。
brewで入れたOpenSSHでEd25519とECDSAを利用する。

Macの標準的な環境ではEd25519とECDSAは使用できません。なので、brewで入れたOpenSSHでEd25519とECDSAを利用します。

まずは*Update*と*Upgrade*

	brew update
	brew upgrade

*tap*してから*install*していきます。

	brew tap homebrew/dupes
	brew install openssh --with-brewed-openssl --with-keychain-support

*plist*を編集します。

	sudo  vi /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

`/usr/bin/ssh-agent` の箇所を `/usr/local/bin/ssh-agent`に書き換えます。

	<string>/usr/bin/ssh-agent</string> #変更前
	<string>/usr/local/bin/ssh-agent</string> #変更後

*unload*と*load*します。

	launchctl unload -w /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
	launchctl load -w -S Aqua /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

そして*vi*などで`~/.bash_profile`を編集します。
下記を足します。

	 eval $(ssh-agent)
	
	 function cleanup {
	   echo "Killing SSH-Agent"
	   kill -9 $SSH_AGENT_PID
	 }

ターミナル再起動させてバージョンを確認。

	# 2015-05-05現在
	OpenSSH_6.8p1, OpenSSL 1.0.2a 19 Mar 2015

これで利用する為の環境が整います。


## ed25519

	ssh-keygen -t ed25519
	# コメント付き
	ssh-keygen -t ed25519 -C "your_email@example.com"

## ecdsa

	ssh-keygen -t ecdsa -b 256
	ssh-keygen -t ecdsa -b 384
	ssh-keygen -t ecdsa -b 521
	# コメント付き
	ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"



## 公開鍵の登録

	ssh-copy-id -i .ssh/id_ecdsa.pub user@remote_host

`ssh-copy-id`は面倒な設定を自動でやってくれています。

	# ssh-copy-id 使えない場合
	cat ./.ssh/id_rsa.pub | ssh user@remote_host "cat >> ./.ssh/authorized_keys"


## 暗号強度のバージョン確認

	ssh-keygen -t ecdsa -b 521
	ssh-keygen -l -f $HOME/.ssh/id_ecdsa.pub

文字列が表示され、前の3文字が暗号強度。上記の場合`521`が表示される。

## 秘密鍵から公開鍵を生成

	ssh-keygen -y -f ~/.ssh/ed25519 > ~/.ssh/id_ed25519.pub
Anormで日付型カラム(datetime)を取得してJSON化したい

MySQLのdatetimeをAnormでSELECTしてJSONに変換するまでのコードがどうしてもヒットしなかったのでメモ

ポイントは以下

1. 変換する型はDate
2. importするDateはjava.sql.Dateでなくjava.util.Date 
3. JSONにはDatetime型なんてないのでtoStringしてStringとして定義

とくに[2]は型を間違うと以下のようなエラーが出る

```
could not find implicit value for parameter c: anorm.Column[java.sql.Timestamp]
```


```
import java.util.Date

// 途中のコードは略

      val bases_records = SQL("SELECT * FROM BASES WHERE COURS_ID IN ({IDS}) ORDER BY ID").on("IDS" -> seq_cours_infos_records)().map {
        row => (
          Map(
            "id" -> JsNumber(row[Int]("id")),
            "created_at" -> JsString(row[Date]("created_at").toString)
          )
          )
      }.toList

      Ok(Json.toJson(bases_records))
```

anormが定義している型は以下にリファレンスがある
https://www.playframework.com/documentation/2.3.1/api/scala/index.html#anorm.Column
Xcodeのテンプレートの場所

ここ

`/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates`

UITableViewControllerのテンプレートが地味に使いにくかったのでいじりました。
因みにこの位置にあるファイルはxcodeで直接編集出来ないので、コピーして編集して置換しましょう。
CentOS 7 で MongoDB 3.0 をインストール


`/etc/yum.repos.d/mongodb-org-3.0.repo`を以下の内容で作成

```
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
```

インストール

```
yum install mongodb-org
```

起動

```
systemctl start mongod
```

停止

```
systemctl stop mongod
```

自動起動

mongodはCentOS 7のネイティブデーモンではないため、従来通りchkconfigを使う

```
chkconfig mongod on
```
command lineの自分用メモ

# ターミナル上でのgithubの使い方(投稿、編集) 

## git init
フォルダ内に.gitを作る(git内で弄れる権限)

## hub create
リポジトリを作る(ただしgithubにないファイル上からhub createすると全部作ってくれる)

## git add 
git上に送るファイルを指定する

## git commit -m 'pushするコードの内容'
**コミットはこまめに！！**

## git push
git push --set-upstream origin master

# vim

## i
Insert mode

## /hogehoge
search hogehoge

ブランチファイルの作り方、移動、編集

## 確認
コマンドの意味検索 control + h
dockerはvaglantの上位互換で、敷居が高いのでパス
vagrantを使って、VirtualBoxを起動させ、centosのsshサーバーにつないで、centosを使う
zsh　bash？の上位互換　役割は、ソースコードをCPUが読み込める
C-x * とかを入力した時にfcitxをオフにする fcitx.elの導入

自分は、まだまだemacsの世界に触れてから日が浅いです。なのでEmacs は GUI起動で利用しています。emacs には日本語を入力するelispとして、mozc.el があります。しかし、GUIで利用するなら、日本語入力はfcitxから入力したいと思っていました。

#fcitx.el の導入

ということでfcitx.elを導入してみました。
https://github.com/cute-jumper/fcitx.el
fcitx.elはemacsでプレフィックスキー(C-x とか C-c とか）を入力した時に、一時的にGUIのfcitxをオフにしてくれる機能を提供するようです。

list-packages からfcitx.el をダウンロードしてください。melpaに登録されているはずです。

.emacs.d/init.el に以下を記述

```init.el
;; fcitx.el
(require 'fcitx)
(fcitx-aggressive-setup)
```
または

```init.el
;; fcitx.el
(require 'fcitx)
(fcitx-default-setup)
```

##fcitx-aggressive-setup と fcitx-default-setupの違い

fcitx-aggressive-setup と fcitx-default-setup の違いはミニバッファーの挙動の違いみたいです。
fcitx-aggressive-setup だと ミニバッファー（`C-x C-f` や `C-x b`を入力した時)でもfcitx がオフになります。
fcitx-default-setup だと、ミニバッファーにカーソルが移動した時にfcitx がオンのままになります。

ファイル名に英語を利用している人は fcitx-aggressive-setup を利用すればいいんじゃないかな。

ime に ibus を利用している人は多いようで、ibus.el という拡張の情報は多かったです。けど、fcitx.el について日本語で記事を書いている人が少なかったので投稿しておきます。
まだまだ未熟者ですので、おすすめの設定などがおれば教えていただければ嬉しいです。
Markdown記法のキホン


Markdown記法で押さえておくべき基本的なことをまとめました。

##見出し

見出しでは`#`を使います。

```
# 見出し (h1)
## 見出し (h2)
.
.
.
###### 見出し (h6)
```

##リスト

リストでは、`*`,`-`,`+`のいずれかの後にスペースかタブを入れます。

```
* 項目1
* 項目2
* 項目3
	* 入れ子も可能です
```

###実行結果
* 項目1
* 項目2
* 項目3
	* 入れ子も可能です

##数字リスト

数字リストでは、数字の後に半角ピリオドを入れ、スペースかタブを入れます。数字は連続していなくても可能です。

```
1. 項目1
1. 項目2
1. 項目3
```

###実行結果
1. 項目1
1. 項目2
3. 項目3

##リンク
リンクは次のように書きます。

```
[Qiita](http://qiita.com/)
```

###実行結果

[Qiita](http://qiita.com/)

##コード

コードを書くためには`` `バッククオート` ``で囲みます。

``　`ここがコードです。`　``


###実行結果

```
ここがコードです。
```

##最後に
簡単ですが以上です。
参考になれば幸いです。
monacaメモ


monaca所感。Cordova / PhoneGapを内包したフレームワークとして機能し、かなりカジュアルにiOS, Android, Windows Phoneのアプリを開発することが出来る。予期しない挙動が多くてかなりツンデレな印象です。

monaca 2015/05/05版
cordova 4.1

# メモ

## 初期化コールバック類

```javascript
$(document).ready();  // jQuery
ons.ready(function() {});  // Onsen UI初期化コールバック
document.addEventListener("deviceready", function(){}, false);  // PhoneGap / Cordova初期化コールバック
```

## MP3ファイルを再生する

`Media`プラグインを使用する。

* Config -> Manage Cordova Plugin -> Mediaを有効にする
* config.xmlに以下を書く

```xml
<feature name="Media">
  <param name="android-package" value="org.apache.cordova.AudioHandler"/>
</feature>
```

## プラグインが利用可能になるタイミング

PhoneGap devicereadyイベントの発火後。

```javascript
document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
  // このタイミングでプラグインが有効になる
}
```


# トラブルシュート

## deviceIdが取れない

理由は良く分からないけどjQueryのコールバックに埋めると取れることがある。

```javascript
$(function() {
  monaca.getDeviceId(function(id) {
    console.log(id);
  });
});
```

参考

* [monaca.getDeviceId() doesn't fire in builds](http://webcache.googleusercontent.com/search?q=cache:4wzs7yIl_oQJ:https://monaca.mobi/en/forum/q/53f66517fd17349d644659a7+&cd=1&hl=ja&ct=clnk)


## navigator.cameraオブジェクトがない

※iOSの話

チェック項目

* Config -> Manage Cordova Plugin -> Cameraを有効にする
* config.xmlに以下を書く

```xml
<feature name="Camera">
  <param name="android-package" value="org.apache.cordova.CameraLauncher"/>
  <param name="ios-package" value="CDVCamera"/>
</feature>
```

* monacaデバッガのコンパイル状態によっては `navigator.camera` オブジェクトがないので、デバッガをカスタムビルドしてインストールする
今さらDOSコマンドバッチ入門2015

DOSコマンドによるバッチファイルの使い方まとめ。普段は使わないけれど、いざという時に使えるとちょっと便利でもある。ただ、改めて文法を調べてみると、むしろ前衛的と言えるぐらいカオスでもあった…。

**追記**
結論として、DOSコマンドでのファイルの読み書きはオススメしません。文字コードが原則Shift_JISのみなのと、ファイル中に制御記号が含まれていると想定外の処理をすることがあるためです。WSH（VBScript、JScript）やPowerShellのほうが適しています。

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 基本１：set（変数に値をセット）

　・変数へ代入 `set NAME=太郎`
　・変数を参照 `echo.%NAME%`
　・数式を代入 `set /A NUM=1+2+3+4`
`/A`オプションにより、右辺が数式として評価されます。また`echo`は画面出力ですが、上の例で`%NAME%`が空文字だとエラーメッセージが出てしまいます。それを防ぐために`echo.`と、ドットを付けるようにしましょう。

```bat:test.bat
@echo off

set STR=Hello
set STR=%STR% World
set NUM=3
set /A NUM=%NUM%+5
set /A NUM+=2

echo.%STR%
echo.%NUM%
pause
```

```bat:実行結果
Hello World
10
```

もひとつ重要なことに、上記の変数はfor文の中などでは定数のように振る舞います。つまり、for文の実行前に`%変数%`が<font color="red">静的に展開</font>されます。実行中に値を変化させたい場合は、`setlocal enabledelayedexpansion` を宣言します。遅延環境変数と呼ばれてるようです。そして、変数を参照する時には`!変数!`のように、感嘆符で囲みます。

```bat:test.bat
@echo off
setlocal enabledelayedexpansion

set SUM=0
for /L %%i in (0, 1, 10) do (
	set CNT=%%i
	set /A SUM=!SUM!+!CNT!
)
echo.!SUM!
pause
```

```bat:実行結果
55
```

**追記**
ただし問題点として、遅延環境変数が有効の場合、文字変数中の感嘆符が制御記号扱いとなり感嘆符が消失してしまうので要注意です。

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 基本２：エスケープ

リダイレクト記号`<>`などの制御文字を通常の文字として扱うには、その直前にエスケープ記号`^`を置きます。ただし、`set`や`echo`処理ではその都度、エスケープ記号が消費される(？)ため、余分に記述しておく必要があるようです…。が、遅延環境変数ではその必要はないようです…。カオスな仕様やね…。

```bat:test.bat
@echo off
setlocal enabledelayedexpansion

::通常の環境変数の場合

set AAA=^^^<AAA^^^>
echo.%AAA%

set BBB=^^^<BBB^^^>
echo.%BBB%>>out.txt

::遅延環境変数の場合

set CCC=^<CCC^>
echo.!CCC!

set DDD=^<DDD^>
echo.!DDD!>>out.txt

pause
```

# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 実例１：テキストファイルを読み込んで、３行目だけ行頭に「AHO」を追記

```bat:test.bat
@echo off
setlocal enabledelayedexpansion

set FILENAME=test.txt
set CNT=0
for /f "delims=" %%S in (%FILENAME%) do (
	echo.CNT=!CNT!
	if !CNT!==0 (
		call>%FILENAME%
	)
	set /A CNT=!CNT!+1
	if !CNT!==3 (
		echo.AHO%%S>>%FILENAME%
	) else (
		echo.%%S>>%FILENAME%
	)
)
pause
```


# ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg) 実例２：テキストファイルを読み込んで、３の倍数の行だけ行頭に「AHO」を追記

```bat:test.bat
@echo off
setlocal enabledelayedexpansion

SET FILE_IN=test.txt
for /f "tokens=1* delims=: eol=" %%R in ('findstr /n "^" %FILE_IN%') do (
	echo.ROW=%%R
	if %%R==1 (
		call>%FILE_IN%
	)
	set /A AMARI=%%R%%3
	if !AMARI!==0 (
		echo.AHO%%S>>%FILE_IN%
	) else (
		echo.%%S>>%FILE_IN%
	)
)
pause
```
stylusの@keyframesはベンダープレフィックスが付与される

Chromeで動くアニメーションがSafariで動かなくて、はまったのでメモ

```css:rotate.styl
@-webkit-keyframes loading
  100%
    -webkit-transform: rotate(360deg)

@keyframes loading
  100%
    transform: rotate(360deg)
```

って書いていたら、どうも-webkit-keyframesが２つ生成されていて、キーフレーム名が重複してSafariで動かなくなっていたっぽい、

Chromeはなんでか動いた（上書きしてくれた方がCSS的っぽい気がする・・・）


> ドキュメント
> https://learnboost.github.io/stylus/docs/keyframes.html

元のstylusファイル

```css:rotate.styl
@keyframes loading
  100%
    -webkit-transform: rotate(360deg)
    transform: rotate(360deg)
```

CSSにコンパイルすると

```css:rotate.css
@-moz-keyframes foo {
  100% {
    -webkit-transform: rotate(360deg)
    transform: rotate(360deg)
  }
}
@-webkit-keyframes foo {
  100% {
    -webkit-transform: rotate(360deg)
    transform: rotate(360deg)
  }
}
@-o-keyframes foo {
  100% {
    -webkit-transform: rotate(360deg)
    transform: rotate(360deg)
  }
}
@keyframes loading {
  100% {
    -webkit-transform: rotate(360deg)
    transform: rotate(360deg)
  }
}
```

ってな感じなコードが出来上がる。
ページ中のcss/jsファイルを列挙するブックマークレット

デバッガが使えない・使いものにならないスマホ環境でリソースのリストが欲しかったのでブックマークレットにしてみた。
JSONでプロンプトに出して手動コピペする用。

[ブックマークレット](javascript:(function(){var i,e,s,q=document.querySelectorAll("link[href],script[src]"),l=[];for(i in q){e=q[i];s=e.src||e.href;if(s){l.push([e.tagName,s]);}}window.prompt("css/js",JSON.stringify(l));})())

```js
(function(){var i,e,s,q=document.querySelectorAll("link[href],script[src]"),l=[];for(i in q){e=q[i];s=e.src||e.href;if(s){l.push([e.tagName,s]);}}window.prompt("css/js",JSON.stringify(l));})()
```
OSXのアーカイバ「Keka」の日本語版においてフォルダ指定ができないバグの解消法

[Keka プロジェクトページ](http://www.kekaosx.com/ja/ "Keka プロジェクトページ")

OSXにおいて数少ないアーカイバであるKekaには、1.4.xバージョン以降において以下のようなバグが存在する。

## バグの詳細

1. 設定画面で解凍先フォルダを「指定のフォルダ」にしても、フォルダ選択ダイアログが表示されず、その状態だとファイルの解凍に失敗（エラーコード2）する。
2. 設定画面で圧縮先フォルダを「指定のフォルダ」にしても、フォルダ選択ダイアログが表示されず、その状態だとファイルの圧縮に失敗（エラーコード2）する。

## 解消方法

原因は日本語ローカライズにあるようで、以下の手順で日本語のローカライズファイルを削除することで解消できる。
※ UIは英語に戻ってしまうので注意

1. `/Applications/Keka.app`　を右クリックし「パッケージの内容を表示」
2. `/Applications/Keka.app/Contents/Resources/ja.lproj` を丸ごと削除

以上の手順を踏むことで、設定画面から解凍・圧縮先を「指定のフォルダ」とした場合にフォルダ選択のダイアログが表示されるようになり、正しくファイルが生成されるようになる。

## 注意

日本語で一度でも起動してしまうと設定ファイルに日本語が紛れてしまい、圧縮や解凍でエラーが起こる場合がある。

その場合は一度設定ファイルを削除すると、正しく動作する。

__設定ファイル__
`~/Library/Preferences/com.aone.keka.plist`
railsにjqueryでajax通信する

# 書き方
```js
$("#button").click(function(event){ 
    $.ajax({
        type: "POST",
        url: "/slot_allocations/" + slotallocation_id,
        dataType: "json",
        data: {"_method":"delete"},
        complete: function(){
            $( "#SlotAllocationForm" ).dialog( "close" );
            alert("Deleted successfully");
        }
    });
    event.preventDefault();
});
```

ポイントは、最後らへんにある　```event.preventDefault();``` の記述。
これがないと期待の動作をしてくれない。

# 参考文献
http://stackoverflow.com/questions/14924091/rails-ajax-jquery-delete-submits-a-post-request-after
realmで１対多のリレーションシップで追加する際に追加出来ないケースがある。

realmで１対多数のリレーションシッププロパティを設定すると

```objc
[bag.items addObject:item];
```

のように追加出来るが、追加するモデルのプライマリーキーが重複すると例外を吐いてしまう。
上記のようにBagモデルとitemモデルがある例では、Bag.itemsにitemを追加すると同時にItemモデルのデータベースにも追加しているからだ。
この場合

```objc
if ([Item objectsWhere:@"id_str = %@",item.id_str].count==0) {
            [bag.items addObject:item];
}
```
といったように、Itemモデルに既に存在しているかどうか確かめてから追加する必要がある。

~~あと気になったのは、addOrUpdateObjectがRLMArrayに対応していない事なのだけど上記の例はいいとして情報が更新されたモノをitemsに追加する場合はいちいちforで探してそのindexのオブジェクトとreplaceしないといけないのだろうか…？ベストプラクティスが知りたい。~~

コメントにて、addObjectの前にaddOrUpdateObjectを行えばよいと教えて頂きました。

```objc
if ([Item objectsWhere:@"id_str = %@",item.id_str].count==0) {
//存在していないなら追加・更新してbagに追加する
            [realm addOrUpdateObject:item];
            [bag.items addObject:item];
}else{
//存在しているなら更新するだけ
            [realm addOrUpdateObject:item];
}
```
DockerでPepperのクロスコンパイル環境構築

Pepperで動作するバイナリをビルドしたくなり、最新の2.3のクロスコンパイル環境を作ろうとしたのですが、インストールガイドの説明の順序関係が微妙なのとか、手順が最新版のqibuildに追従できていないっぽいとかで、ちょっとハマりました。

今回はとにかくお手軽に `qibuild configure; qibuild make` とだけすればモジュールがビルドできちゃうよみたいな環境を作りたかったので、Dockerを利用してあらかじめ実行環境をごっそりイメージ化することにしたのでそのメモ。

まだこの環境でビルドしたものを実機では確認できていないのですが、とりあえずゴールデンウィークの気分転換に。何か見つけたら編集リクエストやプルリクください。

#ビルド手順

**Cross Toolchainのダウンロードやドキュメントの参照には、Pepper実機(特にこの例の場合は2.3)と紐づけされたAldebaranアカウントが必要です。**

ビルドに使うDockerfileは https://github.com/yacchin1205/naoqi-sdk-docker 参照。Cross Toolchainは自分でダウンロードしてきて置いてください方式。

あらかじめDockerがインストールされている環境を用意しておいてください。自分はWindows上でboot2dockerを使用しています。(参考: [boot2dockerでIPython Notebook環境構築](http://qiita.com/yacchin1205/items/a422e4e130ef92457390))

1. Dockerfileをcloneしてくる

    ```
    $ git clone https://github.com/yacchin1205/naoqi-sdk-docker.git
    ```

2. https://community.aldebaran.com/ja/resources/software から、LinuxのCross Toolchain(自分が試したのは `ctc-linux64-atom-2.3.0.110.zip` )をダウンロードし、1.でcloneしたディレクトリ `naoqi-sdk-docker` にコピーする
3. ディレクトリ `naoqi-sdk-docker` に移動して、 `docker build` する

    ```
    $ docker build -t yacchin1205/pepper-buildenv .
    ```

    ※Cross Toolchainのファイル名が2.の例と異なる場合は、`Dockerfile`を適宜書き換えてください

これで、 `yacchin1205/pepper-buildenv` というイメージができ、PepperのCross Toolchainがqibuildから使用できる状態になる。qibuildのWork Treeを/rootに設定してあって、Cross Toolchainが設定してあるので、/root以下にプロジェクトのディレクトリをマウントすれば、そのプロジェクトで `qibuild configure` とか `qibuild make` できる。

#使用方法

たとえば、 `/vagrant/examples/audiovideocapture/` にあるプロジェクトをビルドする場合は以下のようにする。

```
$ docker run -v /vagrant/examples/audiovideocapture/:/root/examples/ -it yacchin1205/pepper-buildenv
root@(Container ID):~# cd /root/examples
root@(Container ID):~/examples# qibuild configure
Current build worktree: /root
Using toolchain: atom
* (1/1) Configuring audiovideocapture
-- Using qibuild 3.8
-- Binary: avcapture
-- Configuring done
-- Generating done
-- Build files have been written to: /root/examples/build-atom
root@(Container ID):~/examples# qibuild make
Current build worktree: /root
Using toolchain: atom
* (1/1) Building audiovideocapture
Scanning dependencies of target avcapture
[ 50%] Building CXX object CMakeFiles/avcapture.dir/main.cpp.o
[100%] Building CXX object CMakeFiles/avcapture.dir/avcaptureremote.cpp.o
Linking CXX executable sdk/bin/avcapture
[100%] Built target avcapture
```

こんな感じで、`/vagrant/examples/audiovideocapture/build-atom/sdk/bin/avcapture` にバイナリがビルドされる。

#参考

ハマったところのメモ。

- https://cloud.aldebaran-robotics.com/naoqidoc/2-3/dev/cpp/install_guide.html ... C - SDK Installation でqibuildを実行せいと言っているのだが、このqibuildは そのあとの項目 D - qiBuild Installation を読むとはじめてインストールできる。前のバージョン http://doc.aldebaran.com/2-1/dev/cpp/install_guide.html ではC - qiBuildとD - SDKで正しい順序になっているのだが・・・
- https://community.aldebaran.com/en/forum/c-sdk-and-cmake-error-3732 ...  ドキュメントの通りqitoolchainを実行しようとすると、 `qitoolchain create mytoolchain /path/to/SDKfolder/naoqi-sdk/toolchain.xml --default`で、--defaultオプションなんてないと怒られる。qibuild 3.8から`qibuild add-config` コマンドが必要になっているよう・・・(で、--defaultオプションはこのadd-configコマンドにある・・・)

こんな感じで。

環境構築時、手順書をいったん読んで試行錯誤するのは仕方がないことなのですが、一度ハマって解決したらそのことはすっかり忘れたいのですよね。そんな時にDockerfileで組み立てられるようにしておくと便利かなと。
pixi.js v3メモ スプライトシートの読み込み

pixi.js v3に関するメモです。

以前のバージョンではAssetLoaderクラスでスプライトシートの読み込みを行っていましたが、
v3以降では下記エラーが発生して、使えません。


    Uncaught ReferenceError: The loader system was overhauled in pixi v3, please     see the new PIXI.loaders.Loader class.

v3では**PIXI.loaders.Loader**クラスを使います

#Loaderクラスの使い方

````loadTest.js
        PIXI.loader.add('name1','./img/w0.json')
                .load(function(loader,resources){
        })
````

PIXI.loader.addメソッドで読み込むファイルを指定します。
第一引数が任意の名前、第二引数が読み込むファイルパスです。
loadメソッドにコールバック処理を記述し、読み込んだファイルを処理します。

コールバックに渡される*resources*の中身は下記のようになっています。(書くの面倒なので、Chromeコンソールの画像です)
![resource](https://qiita-image-store.s3.amazonaws.com/0/75209/f5b5b8c3-0a8b-0425-eec2-248a44352a65.png)


見てもらえばわかると思いますが、
texturesにスプライトシートから読み込んだ画像がテクスチャになって保持されています。
キー名はスプライトシートで指定した名前ですね。
テクスチャオブジェクトが保持されていますので、そのままSpriteに渡せば使えますね。
こんな感じで。
````new PIXI.Sprite(textures[hoge])````



また、dataの中身は、渡したスプライトシート(w0.json)の中身そのものです。

また、元画像については、コールバックに渡されている次の引数(上記例の場合、names_image)に保持されています。

また、読み込み途中の処理については、

````loadTest.js
        PIXI.loader.add('name1','./img/w0.json')
                .on('progress', onProgressCallback)
                .load(callback);
        })
````
このように````on('progress',callback)````で処理可能です。

さらに、ここではスプライトシートを指定していますが、単一の画像ファイルや、音声、動画についても、addメソッドで追加すれば読み込みできるようです。

````loadTest.js
        PIXI.loader
                .add('img1','./img/img1.png')
                .add('img2','./img/img2.png')
                .load(callback);
        })
````

こんな感じですかね。

以上です。
Packagistパッケージのベンダー名は誰でも自由につけられる

https://packagist.org パッケージは、"ベンダー名/プロジェクト名" (例：foo/bar) のような形式になっているのでですが、この左側の「ベンダー名」を取得するにはどうすればよいか？

# 答え：特別な手続きは必要ない。誰でも任意のベンダー名を使える

自作ライブラリのcomposer.jsonの中で、

```json:composer.json
{
  "name": "foo/bar"
}
```

とすれば、そのままpackagistに登録できます。
なんとフリーダムな！

# 試してみた

試しに`acme/null`というパッケージを登録してみました。

やったことは、下記のようなcomposer.jsonファイル1個があるだけのGithubレポジトリを作成して、

```json:composer.json
{
  "name": "acme/null"
}
```
packagistに登録してみたら、さくっと登録できてしまいましたw

https://packagist.org/packages/acme/null
https://github.com/DQNEO/php-acme-null

# どういうときに便利なのか？

例えば何かすごいWAF(Web Application Framework)を作ったとして、プロダクト名を"pochi"とします。

このとき、packagistに`pochi/pochi`というパッケージ名で登録しておけば、後で内部のクラス群を別コンポーネントとして切り出したくなったときに

* pochi/router
* pochi/mailer

みたいに"pochi"ベンダー名の下にまとめることができ、見た目がすっきりします。
Go言語: スライスから要素を削除する

Go言語で、スライスから任意の要素だけを取り除いた新しいスライスを作る方法です。

```go
package main

import (
	"fmt"
)

func remove(numbers []int, search int) []int {
	result := []int{}
	for _, num := range numbers {
		if num != search {
			result = append(result, num)
		}
	}
	return result
}

func main() {
	a := []int{1, 2, 2, 3, 3, 3, 4, 4, 4, 4}
	fmt.Printf("%#v\n", remove(a, 1))
	fmt.Printf("%#v\n", remove(a, 2))
	fmt.Printf("%#v\n", remove(a, 3))
	fmt.Printf("%#v\n", remove(a, 4))
}

```

実行結果

```
[]int{2, 2, 3, 3, 3, 4, 4, 4, 4}
[]int{1, 3, 3, 3, 4, 4, 4, 4}
[]int{1, 2, 2, 4, 4, 4, 4}
[]int{1, 2, 2, 3, 3, 3}
```

[このコードを実行してみる](http://play.golang.org/p/wfjnKUbd82)
隠し機能:ActionEventListener

# 隠し機能の1つ ActionEventListenerとは

ActionEventListenerとは、全てのActionクラスが実行される寸前と、例外が発生したときに実行する処理を記述するクラスです。現在のStruts2ではデフォルト実装はありません。

## 使い方

使うためには次の2つを行います。

* ActionEventListenerインタフェースを実装したクラスを作る。
* struts.xmlに作ったクラスを登録する。

## ActionEventListenerを実装

この例は、以下の機能を実装しています。

* Actionクラス実行前にログを出力する - prepare
* 例外を検出した場合 - handleException
    * 例外クラスのインスタンスを調べ、DataIntegrityViolationExceptionであれば専用のログを出力する。
    * result値は常にActionSupport.ERRORを返す

```java:SampleActionEventListener.java
public class SampleActionEventListener implements ActionEventListener {

	/**
	 * Action実行前に起動。
	 * @see com.opensymphony.xwork2.ActionEventListener#prepare(java.lang.Object, com.opensymphony.xwork2.util.ValueStack)
	 */
	@Override
	public Object prepare(Object action, ValueStack stack) {

		log.debug("prepare.");

		return action;
	}

	/**
	 * 例外発生時の制御。
	 * @see com.opensymphony.xwork2.ActionEventListener#handleException(java.lang.Throwable, com.opensymphony.xwork2.util.ValueStack)
	 */
	@Override
	public String handleException(Throwable t, ValueStack stack) {

		log.debug(" = handling exception =");

		if ( t instanceof DataIntegrityViolationException) {
			log.warn(" -- cause DataIntegrityViolationException:{}" , t);
		}

		return ActionSupport.ERROR;
	}
}
```

## struts.xmlに登録

ActionEventListenerを実装したクラスを設定ファイルであるstruts.xmlに追加します。

```xml:struts.xml
<struts>
	<!-- ActionEventListener -->
	<bean type="com.opensymphony.xwork2.ActionEventListener" class="sample.app.SampleActionEventListener"/>
</struts>
```

## 隠し機能となった経緯

このActionEventListenerを有効にすると全てのActionクラスに対して有効になります。Struts2と言えばAction回りの共通処理は全てインターセプタで提供されるものであり、事実このリスナークラスはActionクラスの動作を行うDefaultActionInvocationクラスからのみ制御されて動作しますので、Struts2のポリシーからは逸脱した制御です。

また、ActionEventListenerで実装するprepare()メソッドはPrepare Interceptorが存在し、このインターセプタによりActionごとに前処理を定義できます。例外ハンドリングもexceptionMappingがstruts.xmlやConventionプラグインのResultMappingsで個別に行えます。

同一の機能がStruts2によって提供されており、Actionクラスごとに制御できることもあって、ActionEventListenerは現在使いません。
もし全クラスに共通する制御を行いたい場合にのみActionEventListenerを使いましょう。
Chocolateyで使用するNuGetのバージョンが古くなった場合の対処法

Chocolateyを使ってパッケージをインストールしようとした際に、以下のようなエラーが出る場合があります。

```
The schema version of 'Microsoft.AspNet.Mvc' is incompatible with version
```

エラー自体はメッセージの通りNuGetのバージョンが古いだけなので、対処は以下の場所にあるNuGetをアップデートするだけです。

```
C:\cd C:\Chocolatey\chocolateyInstall 
C:\Chocolatey\chocolateyinstall>nuget.exe update -self
```
特にChocolateyのインストール先をいじっていなければここにあるはずです。


# 参考URL
http://tech.4pi.si/2014/04/chocolatey-is-incompatible-with-version.html
emacsにjedi(pythonの自動補完パッケージ)を導入した話


色々迷走(古いインストール方法を中途半端にやってしまったり)して、導入するのに半日以上かかってしまったが、とりあえずできた。

基本的に、以下のURLの __Quick start__ の所をやればOK。
http://tkf.github.io/emacs-jedi/latest/

MELPAでパッケージを導入したが、依存パッケージも全部勝手に入れてくれた。
※MELPAについては以下を参照のこと。
http://qiita.com/ongaeshi/items/e81fca7a9797fe203e9f

パッケージが入ったら、以下の記述をinit.elに追加

``` init.el
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
```

最後にemacsから以下のコマンドを実行

```
M-x jedi:install-server
```

これだけでいけた。


使用感はすごくいい感じ。満足。

![スクリーンショット 2015-05-04 18.39.32.png](https://qiita-image-store.s3.amazonaws.com/0/12603/eb4f68e0-5e8b-7ff2-b4fc-54992a1891d1.png "スクリーンショット 2015-05-04 18.39.32.png")

![スクリーンショット 2015-05-04 18.41.19.png](https://qiita-image-store.s3.amazonaws.com/0/12603/e7ebc329-35de-95b9-23a5-cf0dd3311fdf.png "スクリーンショット 2015-05-04 18.41.19.png")

![スクリーンショット 2015-05-04 18.52.16.png](https://qiita-image-store.s3.amazonaws.com/0/12603/252c9e88-46ea-e6bd-585c-32abaa1719da.png)
navi2ch の現行化関連情報メモ

しばらく放置していたらいろいろかわっていたので現行化．

- API対応がうんちゃらかんちゃら．

[navi2ch公式](http://navi2ch.sourceforge.net/)にあるように2015/03/13の2ch側仕様変更にともない回避策が必要．基本旧形式(.dat形式)に対応させるプロクシでの対処．[このへん](http://prokusi.wiki.fc2.com/にあるproxy)に実装いろいろ．スクレイピングとAPIハック(というかクラック？)の二方式がある模様．推奨は公式にもあるとおり`2chproxy.pl`．

で，これを設定したにもかかわらず，スレッド一覧が古いまま(PC等→UNIXとか辿っても現行スレが見えない)という現象が．`bbstable`を更新したりしても全然駄目．`http://peace.2ch.net/unix/` を w3m で叩くとなんか飛ばされてる？

- 某VPS使ってたらブラックリストに丸ごと載ってるっぽく……．

というわけで，w3m とかで `http://peace.2ch.net/unix/` とか叩いて「もうずっと人大杉」の画面が出る人は規制喰らってる可能性大．多分2ch.net vs. 2ch.sc とかの殴り合いでクローラーを止めるためのフィルターに引っかかってるんだと思われる．[バーボンハウス](http://bbon.geo.jp)とかに個別規制情報は見あたらないんので．

- ってことは http を proxy 経由にするしかないのか

なんかこれで以前あきらめた記憶が甦ってきた．以前は prixovy とか squid とか上げるの面倒なので挫折したのだが，今回ちょっとググって[tsocks による解法](https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/14/tsocks.html)を発見．

要は，`ssh -D`で簡易socks proxyをでっちあげ，そこに`tsocks`経由で立ち上げた`2chproxy.pl`を接続することで自宅のダイナミックIP経由で接続し，2ch側の規制を回避するという方法．ていうかこんな特殊環境のニーズってあるのか，とここまで書いて思いつつも，未来の自分のためにメモっておく．

```
vps # echo "server = 127.0.0.1\nserver_type = 5\nserver_port = 10080" > /etc/tsocks.conf
vps % ssh -D 10080 home_machine
vps % tsocks ./2chproxy.pl.v0.17.2
```
C++のコードをswigでgem化して利用するまでのコマンドまとめ

自分用メモ

参考にしたもの
https://github.com/mechamogera/MyTips/wiki/%E6%8B%A1%E5%BC%B5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92gem%E5%8C%96%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
https://www.gfd-dennou.org/arch/ruby/tutorial/swig/swig-cpp.html


```
bundle gem example # gemのひな形作成
mkdir example/ext # C++ライブラリ用のディレクトリ
```
extディレクトリにて
example.cppとその他ヘッダーファイルを入れる。
swig用にexample.iを作成。
extconf.rb作成

```
swig -ruby -c++ example.i # example_wrap.cxx作成
ruby extconf.rb # Makefile作成
make
```

exampleディレクトリにて

```
rake build
gem install pkg/example-0.0.1.gem
```

非公開のローカルのgemをrailsで利用する場合

Gemfileに以下を追加

```
gem 'example', :path=>[インストールしたgemへのパス]
```
Apache Sparkの実行状況を可視化する

## Sparkの可視化ツール
Sparkの実行情報を可視化する"trace-analysis"というツールがDatabricksのBlogの前書きにある[リンク先](https://kayousterhout.github.io/trace-analysis/)で紹介されていましたので使ってみました。
## 準備
trace-analysisを用意します。環境はWindows8.1を使っています。

```shell-session:
git clone https://github.com/kayousterhout/trace-analysis.git
```

可視化するSparkのイベントログは[Databricksが公開しているもの](http://eecs.berkeley.edu/~keo/traces/1.2.1/2015_03_01_bdb_sf5_48g_memory_event_log)を使うことにしました。（注意：そのままリンクをクリックすると約300MBのテキストが表示されてしまうので、右クリックで保存をお勧めします）
通常の環境ではspark.eventLog.enabledとspark.eventLog.dirが適切に設定されていれば指定ディレクトリの下に"EVENT_LOG_1"の名前で作成されます。

## pdfcairoを含むgnuplotのインストール
pdfcairoが含まれているgnuplotが必要のようです。
もしもなければ、trace-analysisが生成したgnuplotファイルを編集しなおす手間が必要になります。
面倒に思ったので私は今あるgnuplotをアンインストールしてから最新版をインストールしなおしました。

## ジョブ毎に可視化する

```shell-session:
$ python parse_logs.py 2015_03_01_bdb_sf5_48g_memory_event_log --waterfall-only
Traceback (most recent call last):
  File "parse_logs.py", line 4, in <module>
    import numpy
ImportError: No module named numpy
```

numpyがないと怒られましたので、numpyをインストールして再実行したところうまくいきました。

```
$ python parse_logs.py 2015_03_01_bdb_sf5_48g_memory_event_log --waterfall-only
...
Job 84  has stages:  [226, 227, 228]
['229: 2192 tasks', '230: 1 tasks']
Stages to combine:  set([])
Job 85  has stages:  [229, 230]
['232: 200 tasks', '233: 1 tasks', '231: 2192 tasks']
Stages to combine:  set([])
Job 86  has stages:  [232, 233, 231]
```


## pdfを作成する

gnuplotからpdfを作成します。

```
$ gnuplot　2015_03_01_bdb_sf5_48g_memory_event_log_0_waterfall.gp

(gnuplot.exe:5800): Pango-WARNING **: couldn't load font "Times Not-Rotated 220", falling back to "Sans Not-Rotated 220", expect ugly output.
```

エラーは出ましたが、一つ上のフォルダにpdfが作られました。
ただ、フォントが重なっていて見づらいです。

![フォントエラー.jpg](https://qiita-image-store.s3.amazonaws.com/0/59346/cc9a8a4a-ec3c-17ef-a063-882ab49e6974.jpeg)

そこで、gpファイルをいじってサイズを大きくするとずいぶんと見やすくなりました。
目的のgpファイルの一行目を以下のように変更しました。

```gnuplot:2015_03_01_bdb_sf5_48g_memory_event_log_0_waterfall
set terminal pdfcairo font 'Times,22' linewidth 4 rounded dashlength 2 size 5,5

#sizeを修正

set terminal pdfcairo font 'Times,22' linewidth 4 rounded dashlength 2 size 10,10

```

![フォントエラー修正版.jpg](https://qiita-image-store.s3.amazonaws.com/0/59346/74382180-5c01-feca-5f2c-9e39e91baa11.jpeg)




# 全体の実行を可視化する

parse_log.pyのオプションを--parse-as-single-jobに変えると全体の実行時間を一つのグラフに表示することができます。
ただ、サイズを100,100にしても小さすぎて判別できない上に、一回のpdf化に30分以上かかることもあって調整はあきらめました。
mount 時にエラーメッセージ " mount: unknown filesystem type 'LVM2_member' " が出た際の対処

[VMware から KVM へのコンバート(CentOS5)](http://qiita.com/bambiz/items/6c0851d6ce0cd2462555) を参考にしているうちに、
掲題エラーメッセージにて手が止まった。対応法が判明したので書く。

# 参考リンク
[mount: unknown filesystem type ‘LVM2_member’](http://pissedoffadmins.com/os/mount-unknown-filesystem-type-lvm2_member.html)
上記リンクを参考にしている。

# 前提(と経緯)
* KVM HostOS : CentOS6.5
* 以下はすべてKVM HostOS上でのできごと
* *.vmdk を *.imgとしてKVMにコンバートする、その際に「ゲストのCentOS5がカーネルパニックした」
* のでHostOSに直接マウントして直したい

## mount時のエラーメッセージ
```c:command&messages
mount /dev/mapper/loop0p2 /mnt/MNT_ROOT
mount: unknown filesystem type 'LVM2_member'
```

## すべきこと
* /dev/mapper/loop0p2 は LVM相当なのでLVMとしてHostOSに認識させる

## 対応方法(同名LVMがあった場合には、参考リンクを参照されたし)
```c:command
modprobe dm-mod
vgchange -ay
# 個体差があるやもしれぬが完了までの処理が重かった
mount /dev/VolGroup00/LogVol00 /mnt/MNT_ROOT
```

### ヒントになれば
#### HostOS側での lvscan 出力
```c:command
# lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [35.97 GiB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol02' [10.00 GiB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [3.91 GiB] inherit
  ACTIVE            '/dev/vg_kvm/LogVol01' [72.13 GiB] inherit    #これと
  ACTIVE            '/dev/vg_kvm/LogVol00' [390.62 GiB] inherit   #これはもともとある KVM HostOS のもの
```

#### ゲスト側OSでの df 出力(桁合わせ程度に出力を修正した)
```c:command
df
  Filesystem                      1K-ブロック          使用     使用可  使用%   マウント位置
  /dev/mapper/VolGroup00-LogVol00   36533824       6738736  27909292    20%      /
  /dev/mapper/VolGroup00-LogVol02   10157368        257944   9375136     3%      /var
  /dev/sda1                           101086         12960     82907    14%      /boot
  tmpfs                              1029412             0   1029412     0%      /dev/shm
```

#### ゲスト側OSでの lvscan出力
```c:command
lvscan
  ACTIVE            '/dev/VolGroup00/LogVol00' [35.97 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol02' [10.00 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [3.91 GB] inherit
```
ObjC to Swift : returning [NSMutableDictionary dictionary]


Objective-C

```Objective-C
- (NSMutableDictionary *) returnDictionary
{
	NSMutableDictionary * dictionary = [NSMutableDictionary dictionary];

	dictionary[@"Objective-C"] = @"NSMutableDictionary";
	dictionary[@"Swift"] = @"Dictionary";

	return dictionary;
}
```

Swift

```Swift
func returnDictionary() -> Dictionary< String, String >
{
	var dictionary = [ String : String ]()

	dictionary["Objective-C"] = "NSMutableDictionary"
	dictionary["Swift"] = "Dictionary"

	return dictionary
}
```
SVGをimgで表示した場合にIEだけサイズが変になる現象を直す

# IEだけSVGの表示がおかしい？
imgタグでsvgファイルを表示するとIEだけサイズが変になりました。具体的には他ブラウザより小さく表示されてしまいました。

例えばsvgをimgで表示するときは以下のように指定しますよね。

```html:index.html
<div class="image-box">
    <img src="img/logo.svg"/>
</div>
```

そんでもって親要素にサイズ指定し、昨今では当たり前のフルードイメージ用CSSを追加していれば大丈夫なはず。

```css:style.css
/* フルードイメージ用スタイル */
img {
    max-width: 100%;
    height: auto;
}

/* 親要素にサイズ指定 */
.image-box {
    width: 200px;
}
```

ですが、IEのみサイズが親要素にフィットしない。（ﾔﾊﾞｲ…、ﾓｳﾀﾞﾒ…）
どうやらインラインSVGの場合は**imgタグそのものにwidthを指定しなければいけない**ようです。

## 属性セレクタを使って解決

前置きが長くなってしまいましたが、上述の問題には**属性セレクタの後方一致バージョン**を使って解決させてみます。

```css
img[src$=".svg"] {
    width: 100%;
}
```

この指定をCSSに追加するだけで、imgタグのsrc属性で指定しているファイルの拡張子が「svg」の場合のみ`width: 100%;`が効くようになりました。

ただし、上記のCSSはサイズ指定されている親要素の中にSVGがあること前提なので、その点を注意しながら臨機応変に書き換える必要があります。（繰り返しになりますが、以下のように親要素にサイズ指定されている必要があります）

```html
<div class="image-box" style="width: 200px;">
    <img src="img/logo.svg"/>
</div>
```

SVGスプライトを使用した場合はどうなるか分かりませんが（まだ使ったことがない）、とりあえずこれで良いのではないでしょうか。


### **追記：**

どうしてIEのみインラインSVGの表示がおかしくなるか、この原因について解説している記事をTwitterにて本人に教えて頂いたので張っておきます。

[IEのインラインSVGの固有サイズ表示をSVG1.1仕様に修正する方法 | asamuzaK.jp : ♪Vector Vector, please. Oh, the mess I'm in (c) UFO](http://asamuzak.jp/html/483)

一部を引用します。

> IEの固有サイズ表示で高さが150pxに固定されるのは、「バグ」というわけではなく、**単にSVG1.1の仕様をIEがまだ実装していないだけであり、実は、IEはCSS2.1の仕様に沿ってフォールバックを適切に（？）働かせている**、ということになります。
IEもIEで、こちらの手抜き（指定の不備）を補って、よしなに表示してくれているわけですw

小さく表示されてしまうのは、CSS2.1の仕様に則って高さが150pxに固定されてしまうのが原因だったようです。
また、こちらのリンクにはJavascriptでの解決コードが載っていますので、一括で楽に解決するならこちらの方が良いかもしれません。
記事『VMware から KVM へのコンバート(CentOS5)』にある kpartx に関するつまづきと対処

[VMware から KVM へのコンバート(CentOS5)](http://qiita.com/bambiz/items/6c0851d6ce0cd2462555) を
以下のようなコンバートを行う際に参考にした。
```
VMware ESXi 5.x -- guest CentOS 5.7 --> KVM
```
その際に自分がつまづいたパターンとその対処の方法を書く。

# 前提
* KVM HostOS : CentOS6.5
* 以下はすべてKVM HostOS上でのできごと

## kpartx がない
```c:command
yum install kpartx
```

## kpartx -a /dev/loop0が失敗する
### kpartx -a /dev/loop0 が空実行しているように見える
これは自分が raw ファイルでなく qcow2 なファイルを対象に操作していたからだと理解し、
フォーマット指定を変更することで対応した。

```c:qemu-img
NG : qemu-img convert ${VM_IMG}.vmdk -O qcow2 ${KVM_IMG_DIR}/${KVM_NAME}.img
OK : qemu-img convert ${VM_IMG}.vmdk -O raw   ${KVM_IMG_DIR}/${KVM_NAME}.img
```

### kpartx -a /dev/loop0 でエラーメッセージが出る

```c:kpartxエラーメッセージ
# kpartx  -a /dev/loop0
kpartx: relocation error: kpartx: symbol dm_task_get_info_with_deferred_remove, version Base not
defined in file libdevmapper.so.1.02 with link time reference
```

という感じ。

```c:command
yum update device-mapper-libs
```

とすることで解決した。
GStreamerでRaspberry Piからストリーミング配信をする

Raspberry Piに接続したカメラの映像をWindowsでストリーミング再生できたのでやり方を書いておく。詳しく調べたわけではなくて、とりあえずできたレベルのもの。

ストリーミング配信と再生にはGStreamerを使った。

環境は次の通り。

* Raspberry Pi Model B
* [Raspberry Pi 専用カメラ](https://www.raspberrypi.org/products/camera-module/)
* [PC]Windows7（x64）

# Raspberry Pi側

まずはRaspberry Piにカメラを接続して起動する。
Raspberry Piでカメラを使える設定をしてなければ、次のドキュメントを見て設定する。

[Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/usage/camera/README.md)

次にGStreamerをインストールする。

    $ sudo apt-get install gstreamer1.0

あとは次のコマンドを実行して起動する。

    $ raspivid -n -w 1280 -h 720 -b 4500000 -fps 30 -vf -hf -t 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=[配信対象のIPアドレス] port=9000

"host"にはRaspberry PiのIPアドレス**ではなく**、クライアントのIPアドレスを指定する。またポート番号は任意のものでいい。
raspividの"-w"と"-h"が解像度なので好きな解像度を指定する。

上のコマンドはスクリプトにしておくと何度も起動する時に楽になる。

次のようなメッセージが出力されればOK。

    Setting pipeline to PAUSED ...
    Pipeline is PREROLLING ...
    ...(省略)
    Pipeline is PREROLLED ...
    Setting pipeline to PLAYING ...
    New clock: GstSystemClock

# PC側
まずはGStreamerのページからWindows用のインストーラをダウンロードする。
今回は「gstreamer-1.0-x86_64-1.4.5.msi」をダウンロードした。

[GStreamer: Download](http://gstreamer.freedesktop.org/download/)

ダウンロードしたらインストーラを実行する。（おそらく）H264のデコードのためにlibav wrapperのインストールが必要なので、ウィザードの途中で次のように操作する。

1. "Choose Setup Type"で"Custom"を選択する。
1. "Custom Setup"で"GStreamer 1.0 libav wrapper"をインストールするように変更する。

今回は「C:\gstreamer」にインストールした。

インストールが完了したらコマンドプロンプトを起動して次のコマンドを実行する。

    > cd C:\gstreamer\1.0\x86_64\bin
    > gst-launch-1.0.exe -v udpsrc port=9000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false

参考にしたサイトでは"caps"の値をシングルクォーテーションで囲ってたけど、ダブルクォーテーションじゃないと実行できなかった。

カメラの映像が写ったウィンドウが表示されれば成功。

# 参考サイト
* [Raspberry Pi Camera - MyLabWiki](http://wiki.oz9aec.net/index.php/Raspberry_Pi_Camera#Using_the_camera_with_Gstreamer)
MeshbluのRESTとMQTTのメッセージをWebブラウザで直接受信する

MeshbluにはWebブラウザで使う[Meshblu.js](http://meshblu.octoblu.com/js/meshblu.js)のJavaScriptライブラリがあります。ArduinoなどからMQTTでpublishしたセンシングデータを通常のWebブラウザ上で受信できるようになります。JavaScriptが使える環境は多いのでコネクテッドデバイス間のメッセージングの選択肢が広がります。

## デバイスの作成

Meshbluのデバイス情報の`protocol`キーに使用しているプロトコルが記述されています。同じデバイスを使ってWebSocketとMQTTのメッセージ送信をする場合はprotocolを書き換える必要があります。WebSocketとMQTTのテスト用にデバイスを２つ用意します。

WebSocket用のデバイスを作成します。

``` bash
$ curl -X POST \
  "http://localhost/devices" \
  -d "name=websocket-pubsub&uuid=websocket-pubsub&protocol=websocket&token=A9plQrTH"
```

MQTT用のデバイスを作成します。

``` bash
$ curl -X POST \
  "http://localhost/devices" \
  -d "name=mqtt-pub&uuid=mqtt-pub&protocol=mqtt&token=RdHBvvYZ"
```

## index.html

Meshbluのブローカーからメッセージを受信するJavaScriptを書きます。ローカルの適当な場所に配置するだけです。WebSocketでSubscribeするデバイスは`websocket-pubsub`をIDに持ちます。createConnectionの`server`はMeshbluが起動しているホスト名またはIPアドレスを指定します。

```html:~/Documents/meshblu/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Meshblu.js</title>
    <script src="http://meshblu.octoblu.com/js/meshblu.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script>
      var conn = meshblu.createConnection({
        "uuid": "websocket-pubsub",
        "token": "A9plQrTH",
        "server": "{MESHBLU_BROKER}}",
        "port": 80
      });
      conn.on('ready', function(data){
        console.log('UUID AUTHENTICATED!');
        console.log(data);
        conn.on('message', function (message) {
          console.log('message received', message);
          $(".activity").prepend(JSON.stringify(message) + '<br />');
        });
      });
    </script>
  </head>
  <body>
   <p>Subscribe Messages</p>
   <div class="activity"></div>
  </body>
</html>
```

## WebSocketとMQTTのテスト

日本語を含んだpayloadがWebブラウザで正常に表示されるかも試します。Chromeブラウザから先ほど作成したローカルのindex.htmlファイルを開きます。

最初にcurlコマンドからメッセージをHTTP POSTします。payloadに"川崎"という日本語を追加しました。

```
$ curl -X POST  \
  http://localhost/messages  \
  -d '{"devices": ["websocket-pubsub"], "payload": {"temperature":25,"city":"川崎"}}'  \
  --header "meshblu_auth_uuid: websocket-pubsub"  \
  --header "meshblu_auth_token: A9plQrTH"
```

次にMosquittoからメッセージをMQTT publishします。同様にpayloadには日本語を含んでいます。

``` bash
$ mosquitto_pub \
  -h localhost  \
  -p 1883 \
  -t message \
  -m '{"devices": "websocket-pubsub", "payload": {"temperature":26,"city":"横浜"}}' \
  -u mqtt-pub \
  -P RdHBvvYZ \
  -d
```

ブラウザに2つの日本語を含むメッセージが正常に表示されました。

![Meshblujs.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3107ee96-50e2-8e46-d9f8-319cdea46766.png)
SublimeTextで「Node.jsのパスが違う」エラーの解決法

SublimeText3のプラグイン "HTMLPrettfy" を使ったらエラーが出て怒られました。
環境はMacOSXです。

こんなエラー。
![スクリーンショット 2015-05-04 15.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/51303/6b77e3dc-4e41-955c-b73a-045767e87068.png)

要はNode.jsのパスが変わったからプラグイン動かせないよ、というわけですね。
心当たりはあって前日にnpmでよくわからないエラーが出て、Node.jsを一回アンインストしてついでにNodebrewで管理するようにしちゃおう、という作業をしていました。

修正は簡単な手順でしたがよく起こりそうなエラーな気もするので覚書にしておきます。

① プラグインのsublime-settingsファイルを開く。
　HTMLPrettfyは "HTMLPrettfy.sublime-settings"というファイルに設定が記述されています。
　ツールバーから、
　　Sublime Text - Preferences - HTML/CSS/JS Prettfy - Set 'Node' Path　
　で開きます。

② Node.jsのパスを調べる。
　ターミナルを立ち上げましょう。
　以下のコマンドを入力します。

    $ which node

　出力された文字列をコピっときましょう。

③ Node.jsのパスを編集する
　①で開いたファイルの ... のとこにコピった文字を貼り付けましょう。
```"node_path": {
    "windows": "...",
    "linux": "...",
    "osx": "..."
  }```

以上で完了です。

※(コードのインライン表記が上手くいかない。。。俺がアホなのか？)
Java環境のBoolean実装

## はじめに
Javaパフォーマンスの本を読んでいて、JavaのBoolean型は個々に実体を生成するのでHeapを余計に食う、と書いてあったので、どういう書き方をするのが良いのか調べてみた。ついでにScalaがどうなってるのかも調べた。

## Java
`System.identityHashCode`は参照の比較に使える。同じ値であれば「ほぼ」同じものを参照している(厳密には被る可能性がある)

```java:Main.java
public class Main
{
    public static void main(String[] arg) {
        Boolean a = Boolean.TRUE;
        Boolean b = Boolean.TRUE;
        Boolean c = true;
        Boolean d = true;
        Boolean e = new Boolean(true);
        Boolean f = new Boolean(true);
        System.out.println(System.identityHashCode(a));
        System.out.println(System.identityHashCode(b));
        System.out.println(System.identityHashCode(c));
        System.out.println(System.identityHashCode(d));
        System.out.println(System.identityHashCode(e));
        System.out.println(System.identityHashCode(f));
    }
}
```

Javaパフォーマンスで推奨されているのは、Boolean.TRUEで代入せよ、というものであるが、少なくともJava8では直接リテラルを代入しても同じ効果が得られる。newすると勿論別のinstanceが生成される(newでは必ず新しい実体を生成する必要がある)

## Scala
```scala:Main.scala
object Main extends App {
  val a = true
  val b = true
  // val c = new Boolean(true) // CompileError!
  println(System.identityHashCode(a))
  println(System.identityHashCode(b))
}
```

ScalaはそもそもBooleanはprimitiveだしnewできないようになっていて更にヒープを食いにくい構造。

## まとめ
* newは必要が無い場合でも新しい実体を生成してHeapを食うので極力避けよう
* Boolean.TRUEを敢えて使う必要性を感じない。使ってもいい。
* Scalaは何も考えずとも良きに計らってくれる。Scala使おう