OmniAICreator/Qiita-1.07M huggingface dataset:
200万件のCSVをparseしつつMongoDBに素早く突っ込むにはBulk()を使う（Nodeでやってみた）

# はじめに
* 大量のデータを操作するときは [`Bulk()`](http://docs.mongodb.org/manual/reference/method/Bulk/) を使おうという当たり前の話
* 言語は別になんでもいいけどなんとなくNode
* 英辞郎のCSVデータ（約 **200万件** ）をmongoに突っ込んだ時のコードとか。


```
# コマンド例
node good.js eijiro_dic_utf8.csv
```

# Bulk を使わない場合
```js:bad.js
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var CSV = require('comma-separated-values');

var NAME_MONGO_DB = 'eijiro';
var NAME_MONGO_COLLECTION = 'words';
var url = 'mongodb://localhost:27017/' + NAME_MONGO_DB;

var inputCsv = process.argv[2];
var text = fs.readFileSync(inputCsv, 'utf-8');

// data: example [ {a : 1}, {a : 2}, {a : 3} ]
var insertDocuments = function(db, data, callback) {
	// Get the documents collection
	var collection = db.collection(NAME_MONGO_COLLECTION);
	// Insert some documents
	collection.insert(data, function(err, result) {
		if (err) return console.error(err);
		callback(result);
	});
};

MongoClient.connect(url, function(err, db) {
	if (err) return console.error(err);

	var rows = new CSV(text, { header: true, cast: false }).parse();

	insertDocuments(db, rows, function(result) {
		db.close();
	});
});
```

* 大体40分くらいかかった気がする。

# Bulk を使う場合

```js:good.js
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var CSV = require('comma-separated-values');

var NAME_MONGO_DB = 'eijiro';
var NAME_MONGO_COLLECTION = 'words';
var url = 'mongodb://localhost:27017/' + NAME_MONGO_DB;

var inputCsv = process.argv[2];
var text = fs.readFileSync(inputCsv, 'utf-8');

MongoClient.connect(url, function(err, db) {
	if (err) return console.error(err);

	var col = db.collection(NAME_MONGO_COLLECTION);
	var batch = col.initializeUnorderedBulkOp();

	new CSV(text, { header: true, cast: false }).forEach(function(obj) {
		batch.insert(obj);
	});

	batch.execute(function(err, result) {
		db.close();
		if (err) console.err(err);
		process.exit();
	});
});

```

* 1分もあれば終わる。


### Bulkに関する補足
> Each group of operations can have at most 1000 operations. If a group exceeds this limit, MongoDB will divide the group into smaller groups of 1000 or less. For example, if the bulk operations list consists of 2000 insert operations, MongoDB creates 2 groups, each with 1000 operations.

# 雑感
*  `readFileSync()` を使わなければならないのが残念すぎる。
*  全部streamっぽく処理できれば良いなぁと思う。（ `comma-separated-values` の同期的な書き方が気持ち悪すぎる）
*  最初は、 [C2FO/fast-csv](https://github.com/C2FO/fast-csv) を使おうとしたが、parseの際に日本語文字を上手く解釈できずに落ちたので泣く泣く止めた。
* [github repository](https://github.com/varmil/eijiro-csv-parse)
VagrantでCentOS7をhttpd/mysql/php でとりあえず動かしてホストから繋ぐまで、と思ってたらrubyとか入れている（WIP）

# Vagrantのインストールや起動など

http://qiita.com/inouet/items/b36638adc2b5772db457
このあたりとかを感謝しつつ見てやると初期設定はできる。

今回addしたのは下記のCentOS7box

```terminal
vagrant box add mybox https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
```

vagrant up するところで何か書いてある。

```terminal
vagrant up
Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant
```

http://qiita.com/osamu1203/items/10e19c74c912d303ca0b
をありがたく見て、

```
vagrant ssh
sudo /etc/init.d/vboxadd setup
```

うまくいった様子だったら


```
vagrant reload
```

これでとりあえずミニマム起動


# yum install からサービス起動

とりあえず仮想環境にガサガサ入れる。大丈夫。php-mbstringとか必要なら入れて。

```
sudo yum install httpd php php-mysql wget
```

httpd入れたので接続したいがfirewallのせいで出来ないのでオフ。二度と起動させない。

```
sudo systemctl stop firewalld
sudo systemctl disable firewalld
```

そしてhttpdは必ず起動させておく

```
sudo systemctl start httpd
sudo systemctl enable firewalld
```

ホスト側、Vagrantfileを修正。下記のコメントを外す。
```
config.vm.network "private_network", ip: "192.168.33.10"
```

```
vagrant reload
```

多分これでホストからWEBを見ることが出来るようになった（はず）。なので下記にホストのプラウザからアクセスしてみる。うまくいけばデフォルトの表示がされるッ。

```
http://192.168.33.10
```

# MySQLのインストール

MariaDBはいらないので下記を見てMySQLを入れた。

http://vicsfactory.com/?p=52

```bash
sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
sudo yum -y install mysql mysql-devel mysql-server mysql-utilities
sudo service mysqld start
sudo systemctl enable mysqld
```

これでいつでも起動されるはず。


# ホストとゲストのファイル共有

Vagrantfileを修正。[ホストのティレクトリ]が`/vagrant`として公開される。

```rb
  config.vm.synced_folder "[ホストのディレクトリ]", "/vagrant"
```

大体以上。このVMをバックアップ取って、弄くり倒せる仮想マシンの完成。


# ゲストからホストのIPを得る

http://qiita.com/ms2sato/items/a53ce0f48f08cfb839b8
とかどうぞ。


# ruby のインストールとか

http://qiita.com/youcune/items/a5cc93313641b69b62f8
などを感謝しつつ利用する。

自分のところは rootの環境変数がうまく入らなかったので（本当はsudoでやりたいんだけど…）

```bash
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

を`/root/.bash_profile` の最後にも追加してある。
TravisCIのDockerベース場合のaptパッケージのインストール方法


[TravisCIのDocker対応を試してみました](http://qiita.com/blueplanet/items/e27bed2c23f02b82a8ff)

上記で書いてるように、TravisCIがDockerに対応してから実行が一段速くなりましたが、`apt`のパッケージがインストールできないのはたまたま不便で、その解決方法を見つかりました。

## addons.apt_packages機能
`.travis.yml`に下記のように定義できます。

```ruby
addons:
  apt_packages:
  - cmake
```

設定できるパッケージは、公式のリポジトリに管理されている
https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise


## 参考リンク
[TravisCI Doc : APT Package Installation](http://docs.travis-ci.com/user/apt-packages/#stq=&stp=0)
たまにはbrew cleanupを実行して空き容量を増やそう

Yosemite へのアップグレード失敗中に気付いたのだけど、Homebrew 周りを整理するときに `brew cleanup` を実行したところ（http://qiita.com/riocampos/items/a0f58b63b82844a24140 を参考にしました）、やけに時間がかかると思ったら、終わった後 20GB ほど空き容量が増えてちょっと驚いた。どれだけ無駄な容量を食っていたのかと改めて気付いた次第。

たまには`brew cleanup`を実行しておこう。

以上。
CentOS5でシリアル接続を有効にする

## シリアル接続でブート情報出力

```diff:/boot/grub/menu.lst
- kernel /boot/vmlinuz-2.6.18-398.el5PAE ro root=LABEL=/
+ kernel /boot/vmlinuz-2.6.18-398.el5PAE ro root=LABEL=/ quiet console=ttyS0,115200 console=tty0
```

* `console=tty0`はディスプレイ接続した時の出力先


```bash:sedで書き替える場合
sed -i.bak -e 's@root=LABEL=/@root=LABEL=/ quiet console=ttyS0,115200 console=tty0@' /boot/grub/menu.lst
```

## シリアル接続でログインプロンプト表示

```diff:/etc/inittab
+ co:12345:respawn:/sbin/agetty -h 115200 ttyS0
```

`115200`は`9600`でもよい。
Realmで動的にqueryを追加する方法

例えば、"qiita tomoima525"と検索したい場合、"qiita"と"tomoima525"を別クエリとして処理したいわけですが、その方法。

チェーンメソッドのorを使ってrealmのqueryに連結していくのがミソです。

```java
realm = Realm.getInstance(context);
realmQuery = realm.where(column.class);

String query = "Qiita tomoima525";

String[] queryArray = query.split("[\\s]+");  //半角スペースも全角スペースも許容
for(int i = 0, size = queryArray.length; i < size ; i++){
    if(i !=0){
        realmQuery = realmQuery.or();
    }
    realmQuery = realmQuery.contains("column1",queryArray[i]);
}

realmQuery.findAll();
```
【iOS：実録】特急審査、通しました。

※服薬管理ソフト「<a href="http://blueroyjp.wix.com/blueroy#!app2/c1m8j" target="_blank">のんでいるくすり</a>」！
　「お薬手帳」とかいうのでもなく、「単に飲んでいる薬のメモ」。
　しかも普段は「<b>ひみつ</b>」にしておける機能つき！
　ご興味あれば<a href="http://blueroyjp.wix.com/blueroy#!app2/c1m8j" target="_blank">ダウンロード</a>よろしくお願いいたします！(iOS無償版のみ）

＝
私は、薬剤師をやりながらプログラマをしている。
プログラミングについては本当に初心者で、どうなることやらと思っているんだが
「<b>やりたいことを思いついたら無理やりでもやる</b>」
その性格だけはどうも治らない。

＝
年明けて早々、薬剤師のほうの同業者の「いざというときのために薬のメモを持とう」という
プレゼンを読んだ…。
おっしゃるとおりだった。
細かいことは端折るが、3.11のときに、どれだけ患者が「薬メモ」を持っていてくれたら助かったかと。
もう、こんな天災が2度とないことを祈ってはいるが。

＝
というわけで、2月頭くらいにAppleにプログラムを提出したんだが
（10日くらい待たされて）
【一回目】
「nendのアイコン広告がAppleのソフトみたいに見える（って書いてあったと思う）ので
　この広告はやめてください。
→nendのアイコン広告の部分のコードをコメントアウトで殺す
（また10日位待たされて）
【二回目】
「nendのインタースティシャル広告がソフトの広告なのでやめてください」
→その部分もコメントアウトで殺す
（また10日くらい待たされて）
【三回目】
「あ。このサンプル画像…アイコンゲーム広告（パズドラみたいなのが写ってた）ですよね
　やめてください」
※註：コードは直っていて、ご指摘の「アイコンゲーム広告」だの
　「変なインタースティシャル広告」は出ない

あの…
三回目、絵を消し忘れただけだろ！？！？
もう、3月4日になってしまっている！

<b>ぶ　　ち　　き　　れ　　た　　！</b>

＝
![受信（840_件のメッセージ、未開封_1_件_-_接続ログを記録中）.jpg](https://qiita-image-store.s3.amazonaws.com/0/58253/8136f01f-8206-9238-c0c5-a36e8ba7005e.jpeg)

ここのResolution Centerというところにハナシをつけにいった。

拙い英語で書きましたよ
「<b>このソフトは、3.11のときに飲んでいる薬がわからない人たちが居たので作った
　だから3.11に間に合わせたい</b>
　私がやってしまったミスは『古い画面（パズドラ広告）の消し忘れ』だけであり
　どうぞそのへんの事情をわかっていただければ
　すぐに対応してください。よろしくおねがいいたします」

そして、「パズドラみたいな絵」が出ている画面を消して再提出。

＝
その後の反応は早かった。
何とか3.11までに市場にこのソフトを出すことができた。
Appleさん、ありがとう！
※決して頻用するものではないと思うが。
 plz check this out ASAPって久しぶりに書いた

<b>「普段のんでいるくすりがあるが。それをひとにいいたくない。
　けれど、いざというときにだけ、わかってほしい。」</b>

　本当に何らかの理由があって急ぐときは、Appleはんに思いの丈を伝えてみるのもいいかもしれない。
　ただ、おたがいせかされるとシンドイ。
　ほんとの、最終手段として、ね。


【Check This Out】
「<a href="http://blueroyjp.wix.com/blueroy#!app2/c1m8j" target="_blank">のんでいるくすり</a>」
AndroidOSのビルドを1.5倍高速化する方法


※タイトルは詐欺です。

# 方法
	PRODUCT_PREBUILT_WEBVIEWCHROMIUM = yes

としてビルドします。

make するとき以下のように渡してあげるか、
BoardConfig.mkあたりに記述するとよいでしょう。

```bash
$ make -j10 PRODUCT_PREBUILT_WEBVIEWCHROMIUM=yes
```

# 制限事項
/external/chromium_org/のビルドがスキップされるので、
webview.apkやlibwebviewchromium.so等がビルドされません。
なので、webviewがつかえません。
webviewが使いたかった人でタイトルにwktkした人ごめんなさい。

# 効果
- ccacheなしフルビルド90分の環境で55分程度でした。1.5倍。。。

- ビルド環境
CPU:i5-3570K
RAM:16GB
AOSPブランチ: android-5.1.0_r1.0

# つかいどころ
ccacheないしwebviewとかどうでもいいから、
なるはやで動くROMが欲しいわーってときに有効です。


# webviewの追加方法
- 差分ビルドするか、他から持ってくればokです。



`PRODUCT_PREBUILT_WEBVIEWCHROMIUM` をクリアして`$ make snod`するか、
他でビルドしたwebview.apkと以下のライブラリがあれば適所にコピーすれば動くと思います。
環境によっては動かないこともあります。

- libwebviewchromium.so
- libwebviewchromium_loader.so
- libwebviewchromium_plat_support
- webview.apk


ちなみに、上記のapkと3つのライブラリのみの差分ビルドは同じ環境で35分程度でした。
（ビルド時間の大部分はapkとlibwebviewchromium.soのために必要です。
loaderとplat_supportは小さいので数秒で終わります。）
バッチファイルからUAC昇格ダイアログを表示する

バッチファイルからのUAC昇格ダイアログ表示する方法は、インターネット上で公開されているものがいくつかあるが、一時ファイルを作成せず、かつ1ファイルのみで実現しているものがないため、作成した。[stackoverflow][1]と[TechNet Blogs][2]で公開されている方法を元にしている。純粋にバッチファイルのみで実現する方法はないため、[trash-area.com][3]で公開されている方法でWSHと組み合わせて実装した。

```elevate.bat
@set @temp=0/*
@echo off

:: Check for Mandatory Label\High Mandatory Level 
whoami /groups | find "S-1-16-12288" > nul
if "%errorlevel%"=="0" ( 
    echo Running as elevated user.  Continuing script. 
) else ( 
    echo Not running as elevated user. 
    echo Relaunching Elevated: "%~dpnx0" %*

    if '%1'=='ELEV' (
        shift
    ) else (
        cscript.exe //e:jscript //nologo "%~f0" "%~0"
        exit /B
    )
)

:: Continue script here

rem Write your own code here  ==>
rem Run shell as admin (example)
cmd /k
rem Write your own code here  <==

goto :EOF
*/
var UAC = new ActiveXObject("Shell.Application");
UAC.ShellExecute(WScript.Arguments(0), "ELEV", "", "runas", 1);
```

#参考文献

1. [windows - How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required? - Stack Overflow][1]
1. [Elevation PowerToys for Windows - Site Home - TechNet Blogs][2]
1. [WindowsXP標準機能だけでスリープ(コマンド)の実装 | trash-area.com][3]

[1]: http://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so-that-it-requests-from-uac-administrator
[2]: http://blogs.technet.com/b/elevationpowertoys/
[3]: http://trash-area.com/archives/219
「リソースは <ファイル名> の複製であるため、出力フォルダーにコピーされませんでした」というEclipse警告について

Eclipseのビルド警告に関する小ネタ

## リソースは src/main/resources/log4j2.xml の複製であるため、出力フォルダーにコピーされませんでした

ビルドして動作もするのに「リソースは src/main/resources/log4j2.xml の複製であるため、出力フォルダーにコピーされませんでした」というようなメッセージが出ている場合の対処方法について記載する。

ちなみに英語だと以下のメッセージで表示される。
「The resource is a duplicate of src/main/resources/log4j2.xml and was not copied to the output folder」

この警告に関する設定は「Java > コンパイラー > ビルド」にある、
出力フォルダーの重複リソースが該当する。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/b00513a7-0a9d-c7fd-0424-bfbd49113ff0.png)

この設定は「無視」にできないため、メッセージを消すためには正しく対応する必要がある。

#### 参考

http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fpreferences%2Fjava%2Fcompiler%2Fref-preferences-building.htm

>
Duplicated resources
"Indicate the severity of the problem reported when more than one occurrence of a resource is to be copied into the output location."


## 警告への対応

この警告は、ビルドの出力フォルダの同フォルダ上に同名のファイルをコピーしようとしている場合に発生する。

このlog4j2.xmlの場合は、すでにmain配下のファイルをコピーしているのに、test配下のファイルもコピーして上書きしようとしているため、コピーしなかったという情報を警告で表示していることになる。

解決させるためには、プロジェクトのプロパティを変更し、パッケージごとの出力先を変更する必要がある。


### プロパティ：Javaのビルド・パスの変更

出力先のデフォルトは、以下のようにソース・フォルダー全てで共通となっている。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/fe326d13-4ac4-9a68-4b9c-c04d58ae6d3b.png)

なので「ソース・フォルダーごとに出力フォルダーの指定を可能にする」のチェックを外し、mainとtestがそれぞれ別のフォルダに出力されるように変更していく。

#### 変更例

1. 「デフォルトの出力フォルダー」を reins/bin から reins/bin/main に変更する。（mainソースのパスにする）
2. src/mainフォルダ配下の全ソース・フォルダーの「出力先フォルダー」を bin/main に変更する。
![image](https://qiita-image-store.s3.amazonaws.com/0/38957/b258b28a-b84c-f68c-5f95-df7d10040203.png)
3. src/testフォルダ配下の全ソース・フォルダーの「出力先フォルダー」を bin/test に変更する。

全て設定すると以下のようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/24fa40b1-210c-0fcd-f8c7-0f057d890911.png)


プロパティーをOKボタンで閉じるとフルビルドが走り、当該警告が消えていることが確認できると思う。

放置しがちなビルド警告だが、testのクラスが本番資材に含まれている可能性もあるため、対応するようにした方が良い。
Python実行時にInsecurePlatformWarningが出る場合の対応方法

2016/01/12更新

- 'requests[security]'について追記。
- Software Collectionsについて追記。

#はじめに
Pythonを新規導入したりパッケージを更新した後に、Python実行時に以下のような警告が出るようになってしまって、あれれーって思うことはないでしょうか？（私はSoftLayerのPythonパッケージを更新して久しぶりにコマンドを実行しようとするとこのような警告が出てびっくりしてしまいました）。この記事では、このInsecurePlatformWarningという警告文が出ないようにする方法を紹介します。

```
# python test1.py
/usr/lib/python2.6/site-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
（以下略）

# sl vs list
/usr/lib/python2.6/site-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
（以下略）
```

# 解決方法1. requestsパッケージを2.5.3以前に戻す。
下記リンクから分かるとおり、requests-2.6.0以降ではこの警告文が出るように実装されています。よってシンプルな解決策としては、pipでrequestsをバージョン指定で2.5.3に戻すというのが考えられます。
http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html

```
# pip list | grep requests
requests (2.6.2)
# pip install requests==2.5.3
# pip list | grep requests
requests (2.5.3)
```

ちなみに、パッケージを新規に導入したりupgradeをしようとすると、せっかく据え置きしていたrequestsも同時に更新されてしまうことがあります（また後でdowngradeすればいいんですけどね。）もしrequests 2.5.3で据え置きにしたまま新規導入、パッケージ更新を一発で仕上げたい場合は、以下のように実施すればよいでしょう。

```text:SoftLayerのパッケージを新規に導入する際の例
# pip install SoftLayer requests==2.5.3
```

```text:SoftLayerのパッケージを更新する際の例
# pip install --upgrade SoftLayer requests==2.5.3
```

# 解決方法2. requests[security]を導入する。
http://stackoverflow.com/questions/29099404/ssl-insecureplatform-error-when-using-requests-package

```text:requests[security]の導入
# yum install -y openssl-devel python-devel libffi-devel
# pip install 'requests[security]'
```

# 解決方法3. Pythonのバージョンを2.7.9以降にする。
Pythonのバージョンを2.7.9以降にすれば、この警告は出なくなります。ただし、OSによってはシステムレベルでPythonが使われており、例えばCentOSやRHELのyumなどではPythonで実装されています。そのため、システムレベルでPythonのバージョンを変更することはあまり望ましくないと個人的には思います。

新しめのSoftware Packageと共存させるために、CentOSやRHEL系ではSoftware Collectionsというコンポーネントが提供されています。こちらを使ってPython 2.7やPython 3.3を導入してもよいでしょう。
http://qiita.com/murachi1208/items/202bff84964188619f57
http://www.idcf.jp/blog/cloud/software-collections-for-centos-6/

現実的には、利用者レベルで適宜バージョンを切り替えることができるpyenvやvirtualenvなどを利用するのが良い気がします。個人的には非常に重宝しています。Pythonを個別にインストール＋コンパイルするのは結構面倒ですし、色々なバージョンで試したいこともあるので。使い方は・・・Qiita含めてググればいくらでも資料があるようなので今回は省略。
https://github.com/yyuu/pyenv-virtualenv
http://qiita.com/yuta_h3/items/2988c4d0811bf8c344c0
http://qiita.com/search?page=2&q=pyenv&sort=rel&utf8=%E2%9C%93



# 参考リンク
https://urllib3.readthedocs.org/en/latest/security.html?highlight=insecureplatformwarning
http://stackoverflow.com/questions/29134512/insecureplatformwarning-a-true-sslcontext-object-is-not-available-this-prevent
Eclipseで問題ビューのエラー・警告を管理する

Elipseの小ネタ

# 問題ビューをカスタマイズする

デフォルト設定の問題ビューでは、ワーキングセットに存在する全プロジェクトのエラー・警告が表示される。
これでは作業中のプロジェクト以外の情報も含まれてしまい、直近で対応しなければいけない問題がわかり辛い。

また、表示される上限件数が100件であり、それ以上の項目は表示されている問題を解消しなければ表示されない。
エラーはコンパイルができないため、解消漏れは起こり辛いが、警告は出力されていてもコンパイルできてしまうため、要修正の警告を見逃してしまう可能性がある。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/dda361c8-39de-4a40-462b-0b24a4303f2b.png)

これらの問題を解決し、効率よく本来の問題を解決していこう。

## 表示されるエラー・警告を、作業中のプロジェクトに限定する

問題ビューの右上にあるビューメニューボタン（▽ボタン）を選択し、「内容の構成...」を実行する。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/388a7f2d-2632-dea5-14f4-52513062217e.png)

先頭のチェックボックス「Show all items」のチェックを外し、
構成の「プロジェクト上のエラー/警告」のみにチェックを付ける。

そして右側のスコープを「同一プロジェクトの任意の要素」にすることで、作業中のプロジェクトに関するエラー・警告が表示されるようになる。
（必要に応じて重要度の「情報」にチェックを付けてもよい、が、あまり出番はない）


## 表示されるエラー・警告の件数を増やす

同じく内容の構成から表示されるエラー・警告の件数を変更する。
方法は2通りある。

1. 左下に表示されている「Use item limits」のチェックを外すか
2. 「Use item limits」のチェックはつけたまま「Number of items visible per group」の値を変更する（100→500など）

表示され過ぎている状態もエラー・警告を探し辛くなるため、個人的には表示の上限件数を500くらいに増やすのが良いと思う。

変更後は以下のようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/c8a66d89-8824-df6f-2e63-95c27150eda8.png)


# 対応後の問題ビュー

以下のように、アクティブになっているエディタに対応したプロジェクトのエラー・警告のみが表示されるようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/38957/dc09b87d-9320-f594-d6b7-1de1f1ad71f9.png)


## エラーが多すぎる場合

それでもエラーが多すぎる場合、またはパッケージごとに作業者が違い、自分の作業パッケージの情報のみが欲しい場合は、スコープを「選択された要素およびその子」にすると、さらに表示情報を作業中のフォルダ配下に絞ることができるため、適宜設定を変更してみると良いと思う。
UICollectionViewControllerでheaderを表示する


ハマったのでメモ

# 環境

* iOS8
* Xcode 6.2


# 手順

* CollectionViewのAccessoriesのSection Headerにチェックをいれる
* StoryboardでCollection ViewにCollection Reusable Viewを追加する
* UICollectionViewContollerを継承したクラスに collectionView:viewForSupplementaryElementOfKind:atIndexPath: を追加する

```objective-c
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    UICollectionReusableView *reusableView = nil;
    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
        reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
    }
    return reusableView;
}
```

!!重要!! 
registerClass:forSupplementaryViewOfKind:withReuseIdentifier: は使わない、Storyboardを使う場合はこれを呼ぶと逆になにも表示されなくなる
iOSのリソース画像を各サイズ一括で生成する

特定のフォーマットのファイル名の画像を対象として、各サイズの画像を生成します。
(iPhone6 Plusにも対応しています)
※ MacOSXの標準コマンドを使用しています。

## 使い方
1. 各サイズ生成したい画像のファイル名をフォーマットに沿った形にする。
2. 1.の画像を src ディレクトリに配置する。
3. 当スクリプトを実行（ダブルクリック）
4. build ディレクトリに各サイズの画像が生成される。

#### ファイル名フォーマット  

> 画像名-@3xのサイズ-@2xのサイズ-@1xのサイズ.拡張子
> 例: button-128-64-32.png


```
// こんな感じに配置すると、画像が生成されます。
.
├── create_ios_all_size_images.command
│
├── src    // リサイズ元の画像を配置する
│   └── button-128-64-32.png
│
└── build　// リサイズ後の画像が生成される
    ├── button.png
    ├── button@2x.png
    └── button@3x.png
```

## コード
githubにも置いてます
[roana0229-create-ios-all-size-images-shellscript](https://github.com/roana0229/roana0229-create-ios-all-size-images-shellscript)

```create_ios_all_size_images.command
#!/bin/sh

# 実行した場所/src へ移動
cd `dirname $0`/src

# 出力ディレクトリの生成
outdir="../build"
mkdir -p $outdir

for file in *\.* ; do
	# jpg, png以外を除外する
	if [[ $file =~ .*\.[^(jpg|png)] ]] ; then
		continue
	fi

	# ここでファイルを生成する
	if [[ $file =~ (.+)-(.+)-(.+)-(.+)\.(jpg|png) ]] ; then

		echo "CREATE: ${BASH_REMATCH[1]}@3x.png, ${BASH_REMATCH[1]}@2.png, ${BASH_REMATCH[1]}.png"
		sips -Z ${BASH_REMATCH[2]} ${BASH_REMATCH[0]} --out "${outdir}/${BASH_REMATCH[1]}@3x.png" | >/dev/null 2>&1
		sips -Z ${BASH_REMATCH[3]} ${BASH_REMATCH[0]} --out "${outdir}/${BASH_REMATCH[1]}@2x.png" | >/dev/null 2>&1
		sips -Z ${BASH_REMATCH[4]} ${BASH_REMATCH[0]} --out "${outdir}/${BASH_REMATCH[1]}.png" | >/dev/null 2>&1

	else

		echo "ファイル名が対応していません: ${file}"
		echo "例：button-128-64-32.png (文字列-@3xのサイズ-@2xのサイズ-@1xのサイズ.拡張子)"

	fi

done

```

## リンク
アイコン生成用のものは、こちらの記事で書かれています。
[MacOSXのシェルスクリプトだけで、iOS, Android両アプリアイコンの全サイズを生成する](http://qiita.com/hibara/items/c25054f336a95d58f591)
install roo 1.2.5


guide: [Installation guide](http://docs.spring.io/spring-roo/docs/1.2.5.RELEASE/reference/html/intro.html#intro-installation)

## Before Install, system dependencies:
1. A Linux, Apple or Windows-based operating system:
	* Apple, Mac OS X (mine is Max OS X)


2. A Sun, JRocket or IBM Java 5 or Java 6 installation, with the $JAVA_HOME environment variable pointing to the installation:
	**But we install JAVA 7:** 
	guide:[easy way to install JAVA 7](http://qiita.com/shoma2da/items/aa5e4d1a67f3854bcffa)
	
	1. [download Java SE 7u75/76 -> JDK -> Mac OS X x64](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
	2. install .dmg file your Mac OS
	3. check installed Java version
	
		```sh
		# check java version
		$ java -version
		java version "1.7.0_75"
		Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
		Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)
		
		$ javac -version
		javac 1.7.0_75
		```
	4. set JAVA_HOME path
		write your shell startup file this code:
		
		```sh
		# i use zsh
		$ vi ~/.zshrc
			export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
		
		```
		guide: [change java versions](http://superuser.com/questions/490425/how-do-i-switch-between-java-7-and-java-6-on-os-x-10-8-2)
		
3. Apache Maven 2.0.9 or above installed and in the path
	
	```sh
	# search maven
	$ brew search maven
	maven	      maven-shell
	homebrew/versions/maven2		    homebrew/versions/maven31
	homebrew/versions/maven30		    homebrew/completions/maven-completion
	
	# install maven version 2
	$ brew install homebrew/versions/maven2
	==> Installing maven2 from homebrew/homebrew-versions
	==> Downloading http://archive.apache.org/dist/maven/binaries/apache-maven-2.2.1-bin.ta
	######################################################################## 100.0%
	==> Caveats
	WARNING: This older version will conflict with Maven if installed at the same time.
	==> Summary
	🍺  /usr/local/Cellar/maven2/2.2.1: 10 files, 3.1M, built in 2 seconds
	
	# check installed maven version
	$ mvn -v
	Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
	Java version: 1.7.0_75
	Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre
	Default locale: en_US, platform encoding: UTF-8
	OS name: "mac os x" version: "10.10.2" arch: "x86_64" Family: "mac"

	```
	guide: [change apache maven versions](http://qiita.com/tksmaru/items/c2342d9894bc30fae65a)

## Install Roo 1.2.5

### Download Spring-Roo

[Download](http://projects.spring.io/spring-roo/
) spring-roo version 1.2.5

### Install Spring-Roo

```sh
# unzip file (not sudo!!!!)
$ unzip spring-roo-1.2.5.RELEASE

# edit .zshrc
$ vi ~/.zshrc
	# Roo
	export ROO_HOME=$HOME/spring-roo-1.2.5.RELEASE
	export PATH=${PATH}:$ROO_HOME/bin

# create a symbolic link
$ sudo ln -s $ROO_HOME/bin/roo.sh /usr/bin/roo 
```

### Verify Roo has been installed correctly

```sh
$ mkdir roo-test
$ cd roo-test
$ roo quit
   ____  ____  ____
   / __ \/ __ \/ __ \
  / /_/ / / / / / / /
 / _, _/ /_/ / /_/ /
/_/ |_|\____/\____/    1.2.5.RELEASE [rev 8341dc2]


Welcome to Spring Roo. For assistance press TAB or type "hint" then hit ENTER.


```
Change Apache Maven Versions


### Show current maven version

```sh
$ mvn -v
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.7.0_75
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x" version: "10.10.2" arch: "x86_64" Family: "mac"
```

### Deactive current version, and install new version 3

```sh
# unlink current version maven2
$ brew unlink maven2
Unlinking /usr/local/Cellar/maven2/2.2.1... 3 symlinks removed

# install maven31
$ brew install maven31
==> Installing maven31 from homebrew/homebrew-versions
==> Downloading http://www.apache.org/dyn/closer.cgi?path=maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.ta
Already downloaded: /Library/Caches/Homebrew/maven31-3.1.1.tar.gz
==> Caveats
WARNING: This older version will conflict with Maven if installed at the
same time.
==> Summary
🍺  /usr/local/Cellar/maven31/3.1.1: 61 files, 6.3M, built in 2 seconds

# show current maven version
$ mvn -v
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-18 00:22:22+0900)
Maven home: /usr/local/Cellar/maven31/3.1.1/libexec
Java version: 1.7.0_75, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac"

```

### Change Apache Maven Versions

```sh
# unlink current maven31
$ brew unlink maven31
Unlinking /usr/local/Cellar/maven31/3.1.1... 4 symlinks removed

# link maven2
$ brew link maven2
Linking /usr/local/Cellar/maven2/2.2.1... 3 symlinks created

# show current version
$ mvn -v
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.7.0_75
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x" version: "10.10.2" arch: "x86_64" Family: "mac"

```

### Guide

* [Maven2とMaven3の切り替](http://qiita.com/tksmaru/items/c2342d9894bc30fae65a)
Change Java Versions


### show existing java versions.

```sh
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    1.8.0_40, x86_64:	"Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
    1.7.0_75, x86_64:	"Java SE 7"	/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
```

### change java versions

```sh
# show current version
$ java -version
ava version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)

# To change java version 1.7 to 1.8
# set your JAVA_HOME in your shell startup . file
# mine is ~/.zshrc
$ vi ~/.zshrc
	# Change the following codes to your ~/.zshrc
	
	# inactive your java version 1.7
	# export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
	
	# active your java version 1.8
	export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
	
# run your ~/.zshrc file
$ source ~/.zshrc

# check current java version
$ java -version
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
```
Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available.を直す方法

vagrantでこういうエラーが出ました。

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

# 原因

`yum update`した
↓
カーネルがアップデートされた
↓
VitualBox GuestAdditionが壊れた
↓
vboxsfのマウント機能が動かなくなった。
↓
(ﾟдﾟ)ﾏｽﾞｰ

# 解決策

VitualBox GuestAdditionsを再ビルドする必要があります。

ゲストOSで、ビルドに必要なパッケーをインストール

```
$ sudo yum install kernel-devel
$ sudo yum install gcc make
```

ホストOSで再ビルド実行

```
$ vagrant vbguest
$ vagrant plugin install vagrant-vbguest
$ vagrant vbguest
GuestAdditions versions on your host (4.3.20) and guest (4.3.14) do not match.
The guest's platform is currently not supported, will try generic Linux method...
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
mount: /dev/loop2 is write-protected, mounting read-only
Installing Virtualbox Guest Additions 4.3.20 - guest version is 4.3.14
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.3.20 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 4.3.20 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module[  OK  ]
Building the shared folder support module[  OK  ]
Building the OpenGL support module[  OK  ]
Doing non-kernel setup of the Guest Additions[  OK  ]
Starting the VirtualBox Guest Additions [  OK  ]
Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
An error occurred during installation of VirtualBox Guest Additions 4.3.20. Some functionality may not work as intended.
In most cases it is OK that the "Window System drivers" installation failed.
```

確認して再起動

```
$ vagrant vbguest --status
GuestAdditions 4.3.20 running --- OK.
$ vagrant reload
```

これで直りました！


# (おまけ)kernelが更新されないようにする

そもそもの発端は、`yum update`を実行してkernelをアップデートしてしまったことです。

`yum update`するときに、kernelがアップデートされないように回避するには下記のようにします。

```
yum -y update --exclude=kernel*
```
Rails＋Rspec＋Capybaraでサブドメイン指定のE2Eテストをする


routes.rbに以下のような指定がある場合、サブドメインのURLでアクセスする必要があるが、E2Eテストはどうするのか？

```ruby
constraints subdomain: 'admin' do
  get 'path/to/article' => 'articles#index'
end
```

## hosts設定

E2Eテストのためにhosts設定しておく

#### vagrantのゲストOS側にhostsを設定
次のpluginを利用してVagrantfileにhosts設定を記述

[adrienthebo/vagrant-hosts](https://github.com/adrienthebo/vagrant-hosts)

```ruby
Vagrant.configure(2) do |config|

...

  config.vm.provision :hosts do |provisioner|
    provisioner.add_host '127.0.0.1', ['admin.example.com']
  end

...

end
```

#### CircleCI用hosts設定
CircleCI上でのE2Eテストのため、circle.ymlに以下のような設定を記述

```yaml
machine:
...
  hosts:
    admin.example.com: 127.0.0.1
```


## capybara設定

#### ホスト名とポート番号を指定

rspecのテストケース等の中で以下のように指定する

```ruby
# ホスト名にサブドメインを指定
# ポート番号が自動設定されるのでcurrent_sessionから取得
Capybara.app_host = "http://admin.example.com:#{Capybara.current_session.server.port}"
```

あとは普通にcapybaraでのE2Eテストを書けばよい
UE4でウィンドウの解像度を変更する方法のメモ

UE4では、ウィンドウの解像度を変えるためにはどこかにあるらしいコンフィグファイルを書き換えなければならないらしい。その方法を使った場合、おそらくゲームが起動している間に解像度を変更することができない。何かゲームの中から変更する方法はないかと調べたところ、Blueprintを使ってコンソールコマンドを叩くことで変更できるようだ。[リンク](http://ogimafu.blogspot.jp/2014/09/ue4.html)。 しかしプレイヤーにコンソールコマンドを叩いてもらうわけにもいかない。  
![スクリーンショット 2015-03-20 12.57.44.png](https://qiita-image-store.s3.amazonaws.com/0/34714/34644355-3948-bfd8-5b14-0932cdcc63f7.png)
こんな感じのUIを用意して解像度を選ばせるのが一般的だけど、今回は簡単にUMGを使ってHUD上に、「数字を入れてボタンを押すと解像度が変更されるBP」を作って置いてみた。UMGでHUDを作る部分については公式のチュートリアルを見ながら作成した。  
![スクリーンショット 2015-03-20 12.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/34714/6b5c6e2d-bb19-4942-3faf-7bf183ceb06b.png)  
![スクリーンショット 2015-03-20 12.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/34714/b4382461-8c13-5ed6-9ecf-69d498efd904.png)
ダ、ダサい。。。  

解像度を変更するコンソールコマンドを叩くには、そのコンソールコマンドを動的に生成する必要がある。コンソールコマンドは例えば以下の様な文字列だ。この数字部分は変えたい解像度の数字になってなくちゃいけない。  
`r.setRes 1920x1080`  
![スクリーンショット 2015-03-20 12.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/34714/8d1f9db7-e6f1-add9-2a15-4794de6117c7.png)  
2つの数字を取ってきて文字列に変換、連結するように繋ぐ。そして、ボタンが押されたら実行されるように繋ぐ。r.setResのあとにスペースを入れ忘れないように。
イメージとしては、`"r.setRes " + num1 +  "x" + num2` のような足し算をしている。  

そうすると、![スクリーンショット 2015-03-20 12.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/34714/d1b334f8-d0b0-2cb1-b733-2b6a42e672cf.png)
![スクリーンショット 2015-03-20 12.24.56.png](https://qiita-image-store.s3.amazonaws.com/0/34714/637e21fe-a0dd-4cac-d865-cc38867bc7b1.png)
![スクリーンショット 2015-03-20 12.31.14.png](https://qiita-image-store.s3.amazonaws.com/0/34714/cdd40859-8c1b-82f4-5459-d19fb866a83b.png)
好きな解像度に変更できる。数字が整数でなくて小数でもとりあえず落ちずに動く。  

これはAndroidでも有効だったが、スマートデバイスで解像度変更ってやる意味があまりなさそうだ。（Nexus9で試した）  
![1.png](https://qiita-image-store.s3.amazonaws.com/0/34714/8bb8a7c2-b7f1-8817-2472-85d23e2ea063.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/34714/d0ca2303-f83a-7d6c-5ce6-139aad7cf136.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/34714/3a14eba6-e11d-ab8f-26de-11278f4c037c.png)
（なぜか解像度変更の変の文字が表示されない。）
RspecでCSVファイルアップロードを行っているコントローラのテストを行いたい場合

CSVファイルのアップロードを行う機能のテストコードをrspecで行いたい場合、view側がこんなコードだとすると

```erb

<%= form_tag(upload_import_file_path, {:multipart => true }) do %>
  <p>
  ファイル
  <br>
  <%= file_field_tag :csv_file %>
  </p>
  <br>
  <p><%= submit_tag "アップロード" %></p>
<% end %>
```

コントローラのテストは次の用なコードを書く。

```rb

describe "csvファイルのアップロード時" do
  let(:csv) { "upload_data.csv" }
  before(:each) do
    @bulk_params = {csv_file: fixture_file_upload(csv, "text/csv")}
    # file_field_tag に設定したシンボルと合わせる。ここではcsv_file
  end

  it "レコードの追加に成功する" do
    post :upload_import_file,  @bulk_params
    expect(InpData.count).to eq xxx
  end
end
```

spec/fixtures/の下にテストで使うcsvファイルを設置すればOK。
fixture_file_uploadに渡すファイルパスは、spec/fixtures/がルートとなる相対パスで。
ccpformatを使ってみる


## 概要

cocos2d-xでcppformatを使用してみる。


## 環境

- Mac OS X Yosemite 10.10.2
- cocos2d-x v3.4


## 準備

### ダウンロード

[こちら](https://github.com/cppformat/cppformat)から取得する。

```bash
$ git clone https://github.com/cppformat/cppformat
```

使用するファイルは以下。

```bash
cppformat
|- format.cc
`- format.h
```

### 配置

extenralにファイルを追加する。

```bash
cocos2d/external/cppformat/
|- Android.mk
|- format.cc
`- format.h
```

Android.mkは[こちら](https://gist.github.com/kiarina/b611bf306e6fd6ac84a4)。

### iOS設定

以下のファイルをプロジェクトに追加する。

```bash
cocos2d/external/cppformat/
|- format.cc
`- format.h
```

以下のようなエラーが出る場合がある。

```
ld: symbol(s) not found for architecture x86_64
```

追加したファイルの Target Membership に以下が含まれていなかったため発生。

- libcocos2d iOS

Xcodeに追加した２つのファイルの Target Membership を正しいか確認しよう。

![](https://www.evernote.com/shard/s138/sh/4305d3fe-c074-45d2-a770-250d38af75c1/aa888ed66a003632ad9073e26670e858/deep/0/format.h.png)

### Android設定

```bash
proj.android/jni/Android.mk
```

に以下を追加して、[こちら](https://gist.github.com/kiarina/ccc5a4cdfab2272d4998)のようにする。

```Android.mk
LOCAL_STATIC_LIBRARIES += cppformat_static
$(call import-module,cppformat)
```


## 使う

```cpp
#include "cppformat/format.h"
std::string s = fmt::format("{0}, {1}", 10, 20);
```

指定方法

```
format_spec ::=  [[fill]align][sign]["#"]["0"][width]["." precision][type]
fill        ::=  <a character other than '{' or '}'>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer | "{" arg_index "}"
type        ::=  int_type | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "p" | "s"
int_type    ::=  "b" | "B" | "d" | "o" | "x" | "X"
```
semantic-uiで<i>タグが使えない時の対処法

## 前提

[semantic ui](http://semantic-ui.com/)はbootstrapライクなjs/cssフレームワークです。
bootstrapと比べて見た目から意味がわかりやすくなることを目的としています。

## 症状

semantic uiでも[アイコン](http://semantic-ui.com/elements/icon.html)が使えるのですが、適当な使い方をしてると動かない時があります。

```html
<i icon='wifi-icon'></i> ←見えない！
```

そういう時はちゃんとフォントのアイコンの取得に成功しているか確認すると良いです。
![iconmissing.png](https://qiita-image-store.s3.amazonaws.com/0/1716/d1c1d193-2b70-f48d-b038-ddaa9aa560f4.png)

こんな風にファイルの獲得に失敗していたら、適切な場所に適切なフォントファイルを置いてそれをダウンロード可能にしていなかった可能性が高いです。
具体的にはcssファイルが置いてある所から相対パスで見て`/themes/default/assets/fonts`という場所にアイコンファイルを探しにいっています。

## 対策

要求される場所にディレクトリを掘ってアイコンファイルを置く事自体はたやすいですが、そのためだけに3階層もディレクトリ掘っていくのもあれだし、既存のフォント置き場との一貫性もどうにかしたいので、アイコンを探しに行く場所を書き換えましょう。
具体的には`semantic.css`とは別で読み出してる自分のcssファイルの中で以下の内容を書きます。

```mypage.css
@font-face {
  font-family: 'Icons';
  src: url("fonts/icons.woff2") format('woff');
}
```

そして`fonts`ディレクトリ以下にsemantic ui以下に置いてある`icons.woff2`を置けば動きます。
FakeEnv で環境変数のテストを書こう

全国100万人の環境変数ファンのみなさま、お待たせしました。

環境変数のテストのための gem 、 fake_env をリリースしました。

- [rubygems.org](https://rubygems.org/gems/fake_env)
- [github.com](https://github.com/rosylilly/fake_env)

# 使い方

`Gemfile` なり `bundle install` なりでインストールした後、

```rb
FakeEnv.activate!

ENV['PATH'] += ':/my/bin/dir'

FakeENV.deactivate!
```

のように使えます。簡単！

# 注意

テストしてないのでなんとも言えないんですが、 FakeEnv で設定した環境変数は子プロセスへ引き継がれないと思うので、そういう複雑な状態にある場合は注意してください。

# まとめ

みんなで環境変数を乱用してアクロバティックなコードを書こう！

![](http://i.imgur.com/u9B7TdK.gif)
私的メモ Ruby,postgresqlをubuntu14.04にインストール

# Rubyとpostgresqlのインストール

参考：
http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
http://www.d-wood.com/blog/2013/09/25_4699.html

## 環境前提
ubuntu 14.04 (virtualbox)

## 必要なパッケージ

以下のパッケージをインストール

```
sudo apt-get install build-essential git curl zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev sqlite3 libsqlite3-dev nodejs 
```

## postgresインストール
```
sudo apt-get install postgresql
```

## MySQLの場合
```
$ sudo apt-get -y install mysql-server-5.5 libmysqlclient-dev
```

## redisインストール
```
$ sudo apt-get install redis-server
```

## rbenvのインストールと設定

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo ~/.rbenv/plugins/ruby-build/install.sh
```

基本的にユーザーホームの直下にインストールする前提。

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

.profileでも可。
zshの場合は読み替え。

## rubyインストール

rubyは2.1.5を使用。（安定版）

```
$ rbenv install --list
```

で表示される一覧に2.1.5が含まれるか確認。含まれない場合は、ruby-buildを更新する。

```
$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
```


インストール。

```
$ rbenv install 2.1.5
```

インストール後に確認
```
$ rbenv versions
```
2.1.5が含まれていれば

```
$ rbenv global 2.1.5
```

で適用。

## ホストと「share」ディレクトリを共有する

- guest additionsを導入済み
- uid,gidが1000だとする
- ホスト側でshareを共有に設定
- ゲスト側の/home/develop/shareを対象(USERがdevelopの場合)

```
vim /etc/rc.local
mount -t vboxsf -o uid=1000,gid=1000,dmode=0755,fmode=0644 share /home/develop/share
```

sudoオプションがいるかも知れない。

必要ならsshで繋げるようにする。

```
sudo apt-get install openssh-server
```

Guest Additionsのインストールは
Virtualboxのメニューからデバイスをクリックし、「Guest Additionsのインストール」を選択

その後、ゲストOS(Linux)のCUIにて、

```
# mkdir /mnt/cdrom
# mount /dev/cdrom /mnt/cdrom
# cd /mnt/cdrom
# ./VBoxLinuxAdditions.run
```
Unity 5へ移行したときにRigidbody2Dが正常に動作しない

#現象

Unity 4からUnity 5へ移行するときに自動アップグレードをしてビルドすると、Rigidbody2D.Velocityにちゃんと値が入っているのに物体が動かない、なんてことがありました。

#原因（今回の）
AnimatorのApply Root Motionにチェックが入っていること
Apply Root Motionはアニメーションによって位置を決めるかどうかを表しているので、チェックを外さないとVelocityは無視されるようです。（Unity4ではなぜか無視されなかった）
Play2.xでHibernateの4.3.x系突っ込んだらjava.lang.NoSuchMethodErrorになる


題記の通り、[公式ドキュメント](https://www.playframework.com/documentation/2.3.0/JavaJPA)に書かれてるHibernateの3.6.9ではなく、4.3.x系を突っ込むとこんな感じのエラーが出ます。

```
Exception in thread "main" java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
	at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:973)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
```

詳しいことは上記エラーメッセージでぐぐってほしいんですが、play2さんのjavaJpaライブラリ指定の中に依存関係で入ってるhibernate-jpa-apiがJPA2.0系で、Hibernate最新版のJPA2.1系とあってないのが原因で怒られちゃう感じらしいです。（ちなみに一年前くらいからこんな感じ）

いつになったら治るのかはわかんないですけど、とりあえず

```build.sbt
  // javaJpa,
  javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"),
  "org.hibernate" % "hibernate-entitymanager" % "4.3.8.Final",
  "mysql" % "mysql-connector-java" % "5.1.34",
```

っていう感じにexclude指定してあげると、 hibernate-jpa-2.0-api-1.0.1.Final.jar になってたのがきちんと hibernate-jpa-2.1-api-1.0.0.Final.jar に差し替わって、無事動きます。

まあ、素直に公式ドキュメントで指定されてる3.6.9.Final使えってことなのかもしれないですが…

ご参考までに。
【Rails】初心者と中級者のコードの差６つ

できるエンジニアの先輩からコードレビューを受けがちなポイントを６つにまとめてみた。

## 1. DRYか
Don't Repeat Yourself. 言わずもがなのrailsの基本指針。自分でコードを書いていて、繰り返しがないかという観点は常に持つようにしましょう。
こちらは、helperを使ってviewをdryに書く方法。

-   http://qiita.com/shunsuke227ono/items/21f5968ca7ca0391b583

繰り返すのはいけてない！という考えを持って、重複したコードが出てきたときに、どうまとめられるか？という方向で頭働かせましょう。
## 2. n+1 Queryが発生していないか
n+1 queryとは、レコード数の回数だけQuery発行してるってこと。これが起きてしまうのは、アプリケーション側で、```SomeRecord.all```でとったものに対して、その子たちを全てアクセスするみたいなことをしてると発生する。下みたいにね。

```rb

children = [ ]
SomeRecord.all.each do |record|
 children << record.child
end
```



以下のように、初めからchildをincludeしてquery投げれば、一回のqueryで済む。
（さらに、`includes`メソッドがrelationを返すので`all`も不要になる）

```rb

children = [ ]
SomeRecord.includes(:child).all.each do |record|
 children << record.child
end
```

このへんも見る人が見ると、質の低いコードとみなされてしまうので、意識しましょう。
***
**追記**
jnchitoさん( http://qiita.com/jnchito )、ご指摘ありがとうございます！上のコードは、本当は以下のようにリファクタできますね。eachで回さずにmapで書くという。こちらの書き方でも読めるよという方はこちらも参考に。

n+1のコード

```rb
children = SomeRecord.all.map(&:child)
```
includeによる改善されたコード。

```rb
children = SomeRecord.includes(:child).map(&:child)
```
***

## 3. ロジックをmodelに書いてるか
controllerを書く際に、modelにかけるロジックをcontrollerに書いてcontrollerがくそ長くなるなんてことはないでしょうか。オブジェクト指向的に、メソッドはなるべくオブジェクトに持たせてしまいましょうということで、modelに書きましょう。
最初からmodelにロジックをかけるようになると、後でリファクタでmodelに書き直す時間も省けるし読みやすくなるし、効率的です。
## 4. 柔軟性があるか
柔軟性の有無は大事です。柔軟性のないってどういう状態かというと、例えば、一つの変更が生じたときに、その変更に応じて書き直さなきゃいけないコードが多数存在するみたいな状態。柔軟じゃない==変えにくいってこと。
変更はつきものなので、常に、柔軟性の高いコードを書きたいわけですが、そのために必要なのは、ベタ打ちを減らす、だったり、上でも紹介したようにDRYに、同じコードを繰り返さないこと。(helperで柔軟なviewをつくる: http://qiita.com/shunsuke227ono/items/21f5968ca7ca0391b583)
この意識があるかないかで、変更が生じたときにどれだけ素早く正確に対応できるかがだいぶ変わります。

## 5. sql更新処理はtransactionを必要としないか
sql更新処理で、一括に更新されないと困る！なんてときは、transactionを追加してやりましょう。実用的なアプリには必須です。(Transactionのポイントを三つ: http://qiita.com/shunsuke227ono/items/c9c38c24beee33db0a63)
意識せずにコードを書いていると忘れてしまう&別にデバッグでも気づかないので、最初から意識項目にいれて、書き忘れるなんてことがないようにしましょう。結構クリティカル。

## 6. コード変更による影響範囲はないか
仕様を変更した/partialを書き換えた/modelのインスタンスメソッド書き換えた...etc。基本的に変更がある場合、他の部位に影響があるか？という観点で考える癖をつけましょう。
変更があるか調べるのは割と簡単で、基本的には、変更したメソッド名で```grep```かけてやったり、フォルダない検索して一個ずつ潰すなんていう確実な方法もとれます。
なぜFacebookはRelayを作ってるんでしょう……


なぜわざわざ車輪の再発明に近い事をしているのか、その理由を考えてみます。つっこみコメント歓迎です！！

#なぜReactjsの考え方は素晴らしいのか
まず、なぜReactjsの考え方が素晴らしいのか、いろんな人からいろんな理由が挙げられてますね。

* Virtual DOMが効率的だから。
* FRPの実装で、FRPこそが次のパラダイムだから
* シンプルに書けるから

等々です。

ですが、私は、これらはすべてに通じる根っこがあるように感じます。
その根っことは、

* プログラミングの最も純粋な形に近いから

です。

…一気に抽象的になってわけがわからなくなりました！！
説明しますね。

##そもそも、プログラミングって？
プログラミングというのは、コンピュータへ与える命令を記述する作業の事ですね。
そして、コンピュータというのは、情報処理を行うために作られた道具です。

そうです、プログラミングとは、情報処理の手順書を書く事なのです。

当たり前？そうです、ですが当たり前で終わらせず、もう少しお付き合い下さい！

##情報とは？処理とは？
情報ってなんでしょう？コンピュータが扱うのは主にデジタル情報ですよね。0と1です。
ですが、0と1だけでは表現力不足です。なので8個でひとくくりにしてみましょう。

なんということでしょう！！byteが出来上がったではありませんか！！

……当たり前です。ですが流さないでください！！

01の並びに一定のルールを課したもの、これが情報なのです。プログラミング言語においては「型」として表現されますね。

そして、処理とは、情報を加工することを指します。
プログラミング言語においては、これは「関数」として扱われます。

さてさて、 **ここがとっても重要です！！** 情報処理を、プログラミング言語の文脈で解釈します。
そうすると……

* **型Aを、関数Fで、型Bに加工する**

です。これこそが、プログラミングの最も純粋な形です。

##変数の再代入がなぜダメなのか
コーディングする上で、できれば避けた方がいいコードがありますよね。
例えば、変数の再代入です。

```
1 int a = random(10);//a = 1~10
2 a = checkGT(a, 1);//a = 0 or 1
```

なんでダメなのか、なかなか上手く説明し辛いですよね。これを行ったせいで困った経験があれば簡単に実感できるんですが……
ですが、今なら上を使って説明できそうです。

* 1のaと2のaは違う型だから

です。同じintじゃないかって？そうなんですが、型の原点に立ち返ってみてください。
型とは、「01のならびに一定のルールを課したもの」ですよね。1のaと2のa、課せられるルールが違うのです。よって、本来ならば

```
1 int a = random(10);
2 bool result = checkGT(a, 1);
```

こうすべきなのです。ではこれはどうでしょうか。

```
1 int a = 3;
2 bool result = checkGT(a, 1);
3 result = checkLT(a, 1);
```

これもやっぱりダメなのです。冗長に書くと、2のresultはcheckGT(a,1)の結果を受け取ったbool型、3のresultはcheckLT(a, 1)の結果を受け取ったbool型なのです。課せられるルールが違います。ではこれは？

```
1 int a = 3;
2 bool result = withSideEffect(a, 1);
3 result = withSideEffect(a, 1);
```

同じ関数なので良さそうです。が、名前に注目してください！副作用を含んでいます！！言い換えると、2のwithSideEffectと3のwithSideEffectは違う関数なのです。よってこれもダメです。

だったら何だったらいいんだー、と言いたくなりますね…。うん、ええと、これなら大丈夫！！

```
1 int a = 3;
2 bool result = check(a, 1);
3 result = check(a, 1);
```

……無意味ですね。


さて、他のアンチパターンには触れませんが、 **純粋な形から外れるので、アンチパターンとなる場合が多いです。**　

純粋な形というのは、問題から解法に向かっての最短距離なのです。言うなれば単純です。
シンプル。いいですね。

そこに制約条件が加わって、どんどん複雑になってしまいます。複雑は悪です。ですが、エンジニアリングは、現実という制約から逃げられません。
制約を迂回するために、遠回りを強いられることは往々にしてあります。

そのホットな代表選手といえは…

 **コールバック、君だ！！！！**

##コールバック……なぜ必要なのか
純粋な形、つまり、あらゆる制約条件を無視した場合、情報処理を一番自然に記述できるのは、関数型プログラミングです。ここに時間、空間に厳しい制約が加わると、オブジェクト指向プログラミングが解になります。

コールバック、非同期プログラミングがもてはやされたきっかけを覚えていますか？
C10k問題です。それまでは同期でよかったわけです。フロントのJavaScriptも、シングルスレッドという厳しい制限を課せられています。そう、コールバックとは、 **制約を迂回するために複雑化したもの** なのです。

##で、Reactjsは……

Reactjsは、JavaScriptの性能が上がり、方法論が熟したいまだからこそ出現した、より純粋な形への回帰、と言えます。

#やっと、Relayなのです
さて、ようやくRelayの話です。もう一度、情報処理を引っ張ってきます。

* **型Aを、関数Fで、型Bに加工する**

型Aが膨大な情報を含んでいて、Bはその一部を処理したもの、という場合、A -> Bの変換にかかる計算資源は膨大になります。そういった巨大なデータを扱うFが、Relayです。

そしてそのFの引数を記述する言語が、GraphQLです。

つまりグラフ構造を上手く扱えるインメモリデーターベースを作ってるぜ！ということなのでしょう。

問題となるのが、サーバからRelayへデータを置く、そしてRelayからサーバへ置く方法ですが、SaaSのグラフデータベースを提供する予定とかあるのでしょうかね…

と本題が余談気味になったまま終わります！！Relayはどうでもよくて、コールバックますとだい！と書きたかったのが見え見えですね！！
redisのdump.rdbファイルからリストアする

redisのバックアップデータからの復旧手順（リストア）

CentOS6系の環境で、redisが既にインストールされている状況で説明します。

redisはインメモリでデータ高速管理しており、
データを永続化させるには、
　
```
redis-cli save　
```
（saveはロックが発生するのでサービスに支障がでる場合は、ロックの発生しないbgsaveとlastsaveでバックグラウンドで処理させる）

```
redis-cli bgsave
```

でデータの永続化。
dumpファイルが作られる。

/var/lib/redis/dump.rdb
※redis.conf変更できます。

このデータを定期的に、別ディレクトリにバックアップして、そのファイルのデータをredisに反映させる際、

```
service redis status
```
redisが稼働中に

※扱い注意！！
```
cp /data/backup/dump.rdb /var/lib/redis/dump.rdb
```

等とコピーをし、
```
service redis restart
```
等とすると、

```
cat /var/lib/redis/dump.rdb
```
redisを停止する際に、dump.rdbのファイルが元に戻ってしまいます。

バックアップデータのデータを復元する際は、
まず
```
service redis stop
```
をし、redisを停止した状態で、

```
cp /data/backup/dump.rdb /var/lib/redis/dump.rdb
```

コピーし、

```
service redis start
```

とする。


まとめ、
redisのバックアップデータからの復元は、
redisがストップした状態→ファイルコピー→redis start
CocosStudioのButton_TouchEventの処理 Cocos2d-x_3.4


# 環境

- Cocos2d-x 3.4
- CocosStudio for Mac 2.1.2Beta

# Sceneの読み込み

以下を参照。

[cocoStudioで作成したSceneをLoadする cocos2d-x-3.4 - Qiita](http://qiita.com/noir/items/a6d14e66f8f08b754069)

# ButtonへのアクセスとTouchEvent処理

1. Buttonへのアクセス
--

```c++:HelloWorld.m
/**
 * ScrollViewの中に配置されているButtonの例
 * CocosStudioで設定しているName: ScrollView_1, Button_1
 */
auto button = mainScene->getChildByName("ScrollView_1")->getChildByName<ui::Button*>("Button_1");
```

2. TouchEvent
--

```c++:HelloWorld.h
#include "cocos2d.h"
#include "ui/CocosGUI.h"

class HelloWorld : public cocos2d::Layer
{
	// 略
	/**
	 * callback method.
	 */
	void touchButton(cocos2d::Ref* pSender, cocos2d::ui::Widget::TouchEventType type);
}
```

```c++:HelloWorld.m
#include "ui/CocosGUI.h"
#include "cocostudio/CocoStudio.h"

USING_NS_CC;
using namespace cocostudio;
using namespace ui; // cocos2d::ui

bool HelloWorld::init()
{
	// 略
	
	/**
	 * macro callbackの場合
	 */
	button->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchButton, this));
	
	/**
	 * ラムダ式の場合
	 */
	button->addTouchEventListener([this](Ref* pSender, cocos2d::ui::Widget::TouchEventType type){
		if (type == cocos2d::ui::Widget::TouchEventType::ENDED) 		{
			// 処理
			CCLOG("touch ended.");
		}
	});
	return yes;
}

void HelloWorld::touchButton(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)
{
	// ui::Widget::TouchEventType::BEGAN;
	// ui::Widget::TouchEventType::MOVED;
	// ui::Widget::TouchEventType::CANCELED;
	// ui::Widget::TouchEventType::ENDED;
	if (type == cocos2d::ui::Widget::TouchEventType::ENDED) {
		// 処理
		CCLOG("touch ended.");
	}
}
```