OmniAICreator/Qiita-1.07M huggingface dataset:
[Mac] sayコマンドライフハック


Macのsayコマンド楽しいですよね。

```
$ say -v kyoko こんにちは、世界
```

## sayコマンドであとで聞く

あとで読むって結構たまりますよね。
テキストをscript.txtに保存して下記コマンドを打てば音声ファイルに変換できます。

```
$ say -f script.txt -o say.m4a
```

あとはitunesに追加するなりDropboxに突っ込めばスマフォからでもいつでもあとで「聞く」できますね。
PDFやePubなんかもテキスト変換できるので音声にして持ち歩けばオーディオブックとして聞くことも可能です。

## sayコマンドで英語を聞く

sayコマンドはいろんなタイプの音声が集まってます。

```
$ say -v '?'
Agnes               en_US    # Isn't it nice to have a computer that will talk to you?
Albert              en_US    #  I have a frog in my throat. No, I mean a real frog!
Alex                en_US    # Most people recognize me by my voice.
Alice               it_IT    # Salve, mi chiamo Alice e sono una voce italiana.
Alva                sv_SE    # Hej, jag heter Alva. Jag är en svensk röst.
Amelie              fr_CA    # Bonjour, je m’appelle Amelie. Je suis une voix canadienne.
Anna                de_DE    # Hallo, ich heiße Anna und ich bin eine deutsche Stimme.
...
```

自分で作った英文をsayコマンドで喋らせて発音を確認したり、ネット上の英文を喋らせることで英語の勉強にも使えます。

## sayコマンドで速聴する

sayコマンドではビットレートも変更できます。
早く聞きたい場合はビットレートを上げて聞くと速聴にも使えるかも（iPhoneでも1.5倍速とか2倍速できますね）。

```
$ say -f script.txt -o say.m4a -r 400
```

## sayコマンドでネット上のコンテンツを聞く

世の中には便利なapiや、ネット上のサービスをapiに変換してくれる[kimono](https://www.kimonolabs.com/)といったサービスもあります。これらからデータを引っ張ってきて音声ファイルとして流して流すスクリプトを組むことで毎日のニュースや天気予報、ウォッチしているサイトの情報を音声として聞くことができるようになりますね。

```
curl http://weather.livedoor.com/forecast/webservice/json/v1\?city\=130010 | jq -r '.description.text' | say
```

## 番外編

Macのsayコマンドには歌う人もいるんですねー

```
say -v good oooooooooooooooooooooooooooooooooooooooooooooooooooooo
```
[※Gitコマンド使いません] Githubのブラウザのみでブランチ切ってプルリクするまで


Github使って開発してると新しいブランチ切ってプルリクを投げるのにどうしてもコマンドを使わなきゃいけない雰囲気あって、特にエンジニアじゃない人たちには嫌われる傾向（ちょっと減ってきたのかな）あるけど、Github使ってればコマンド一切不要でプルリク投げれます。

特に「このお知らせの追加になったので更新しておいてー」とか、「ここタイポだから直しておいてー」とかいう依頼はエンジニアサイドに依頼を投げるよりプルリク投げてもらった方が効率いいですよね。

## 1. 新しいブランチを作成する

プロジェクトのトップページにbranchのボタンがあります。
そこをクリックしてbranch名を入力することで新しいブランチが作成できます。

![スクリーンショット_2014-12-03_14_29_52.png](https://qiita-image-store.s3.amazonaws.com/0/8463/626356a5-60ee-477a-60ac-9816ca1bea3b.png "スクリーンショット_2014-12-03_14_29_52.png")


## 2. 修正したい箇所を探す

Githubの画面の上部には検索フォームがついてます。
プロダクトの中で変更したい所があればこちらから検索するといいですね。

![スクリーンショット_2014-12-03_14_54_05.png](https://qiita-image-store.s3.amazonaws.com/0/8463/8979f019-3674-94d4-4bfa-9e2d90409b6d.png "スクリーンショット_2014-12-03_14_54_05.png")

## 3. コードの追加・編集

ディレクトリに移動すればファイルの新規作成ができます。
![スクリーンショット_2014-12-03_14_31_40.png](https://qiita-image-store.s3.amazonaws.com/0/8463/0bc862f5-95c1-3552-b23b-ed1ed738543b.png "スクリーンショット_2014-12-03_14_31_40.png")

ファイルに移動すればファイルの編集ができます。
![スクリーンショット_2014-12-03_14_31_55.png](https://qiita-image-store.s3.amazonaws.com/0/8463/aa199362-261c-ab04-130e-eb9d5edd6e02.png "スクリーンショット_2014-12-03_14_31_55.png")


## 4. プルリクエスト！

ひと通り編集が終わったらプルリクエストを投げましょう。
一番わかりやすいのはトップページに出てくるプルリクエストボタンですね。

![スクリーンショット_2014-12-03_14_34_18.png](https://qiita-image-store.s3.amazonaws.com/0/8463/b7642b32-3d4e-9d4d-1ab7-737c32d613c7.png "スクリーンショット_2014-12-03_14_34_18.png")


## まとめ

コマンド一切使わずにプルリクエスト投げれました。
もちろん出来ることに限界はありますし、エンジニアじゃない人がコードいじるのでルール決めておいたりとか、自動でテストする仕組みを導入しておいた方がいいかなと思います。

企画サイドでも依頼した内容がエンジニアの優先順位とかいうやつに縛られることなく修正リクエスト投げれますし、企画サイドとエンジニアサイドでのコミュニケーションミスやコストも減っていいかなと思います。
【Perl】簡易的にprintを標準出力に流さないようにする

#事始め
標準出力へログを出力するかしないかのメソッドを定義したのはいいけど、
内部で利用している別の人が作った関数が勝手に print するから完全にログの出力を制御できない。

printのリダイレクト先を変えれば良いわけだけどその場合の手っ取り早い方法について。

#実際のコード

tie を利用して一時的に print をリダイレクトします。

```perl:test.pl
#/usr/bin/perl

use strict;
use warnings;

# ここから標準出力停止.
my $stopOutput = 1; # フラグが１なら標準出力停止.
{
	# 標準出力を停止させる.
	my $stopOutput = ($stopOutput==1) ? tie local *STDOUT, 'StopOutput' : (0);
	print "aaa\n";
}
# ここまで標準出力停止.

print "bbb\n";

# 標準出力を停止させる為のクラスを定義.
package StopOutput;
sub TIEHANDLE { my $class = shift; my @lines; bless \@lines, $class; }
sub PRINT {}
```

結果

```perl:test.pl
$ perl test.pl
bbb
```
雪を降らせる。

いろいろみて、自分が一番良いなと思ったものをjQueryに書き換えたにほぼ近いです。
ま、何か動的であったり、特定の場所にだけ降らしたりしたかったのでー


このscriptは、画面全体で雪が降ります。

htmlはどこに書いても大丈夫です。
jsは別ファイルにしてbodyの閉じタグ直前に書くのが良いと思います。


```html
<div id="snowFalls"></div>
```

```js
$(function(){

snow();

function snow(){
	var w = $(window);
	var h = w.height();
	var u = w.scrollTop();
	var e = u+h+10;
	var z = 9999;
	var t = new Array();
	var l = new Array();
	var y = new Array();
	var s = new Array();
	var g = new Array();
	var c = new Array();
	w.scroll(function(){
		u = w.scrollTop();
		e = u+h+10;
	});

	for(var i=0;i<50;i++){
		var a = 'snow'+i;
		$('#snowFalls').append('<div id="'+a+'"></div>');
		var m = $('#'+a);
		t[i] = Math.random()*-h+Math.random()*(h/2)+u;
		l[i] = Math.random()*w.width();
		var p = Math.random()*8+6;
		m.css({
			'position':'absolute',
			'z-index':(z+i),
			'top':-t[i],
			'width':p,
			'height':p,
			'background':'rgba(255,255,255,0.8)',
			'border-radius':'8px',
			'box-shadow': '0 0 2px 2px rgba(255,255,225,0.3)',
			'left':l[i]
		});
		y[i] = Math.random()*25+0.1;
		s[i] = Math.random()*5+0.5;
		g[i] = $('#snow'+i);
		c[i] = 0;
	}
	setInterval(function(){
		for(var i=0;i<50;i++){
			if(e>t[i]){
				if(y[i]>=c[i]){
					l[i] = l[i]+0.5+Math.random()*0.5;
				}else{
					l[i] = l[i]-0.5-Math.random()*0.5;
				}
				if((y[i]*2)<=c[i]){
					c[i] = 0;
				}
			}else{
				t[i] = u-10;
				l[i] = Math.random()*w.innerWidth;
			}
			t[i] = t[i]+s[i];
			g[i].css({
				'top':t[i],
				'left':l[i]
			});
			c[i]++;
		}
	},45);
}

});
```
python で one liner webServer(with CGI)


# やりたいこと

簡易webServerをつくって自分のアプリの動作確認をしたい。
（DummyServer的なものが欲しい）

# HowTo

## 何をつかう？
やりかたはいろいろありそうでしたが、pythonが手っ取り早そうなのでpythonを採用
（手っ取り早い=>linuxに標準で入っている）

いろいろ　= ncコマンド とか、php,ruby,などなどでも可能。

## やってみる

### アクセス先を作成

```
(どこでもいいけどとりあえずtmpでやってみた)
cd /tmp 

(今回はcgiアクセスしたいので以下のdirを作成（デフォだとcgi-binかhtbinという名称じゃないとダメっぽい））
mkdir cgi-bin

（なんかスクリプトを配置してみる）

vi hoge.py

中身は↓↓↓

cat hoge.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

hoge="Welcome to one liner."

print """Content-Type: text/html

<html>
<body>
<h2>{0}</h2>
</body>
</html>
""".format(hoge)
```

### 実行権限を与えてあげる :fist: 

```
$ chmod 655 hoge.py
```


### webServerを起動

```
$ sudo python -m CGIHTTPServer 1234
Serving HTTP on 0.0.0.0 port 1234 ...
```


### アクセス！ :punch: 

```
$ curl localhost:1234/cgi-bin/hoge.py
<html>
<body>
<h2>Welcome to one liner.</h2>
</body>
</html>


アクセスログもでます 

$ sudo python -m CGIHTTPServer 1234
Serving HTTP on 0.0.0.0 port 1234 ...
localhost - - [03/Dec/2014 19:06:01] "GET / HTTP/1.1" 200 -
localhost - - [03/Dec/2014 19:06:06] "GET /cgi-bin/hoge.py HTTP/1.1" 200 -

```

## 

# まとめ :sparkles: 

ものすごく簡単じゃないですか！？
社内でファイルサーバー立てるのがめんどいとか、
冒頭で書きましたがDummyServer(stub)的な使い方とかとりあえず、なんか動かしたいときははかなり
簡単に利用できるんじゃないでしょうか！
RescueTimeで非対応ブラウザで利用する方法(Ironなど)

<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-OhPWat8JpKg/VH7WaCJN5II/AAAAAAAAAGA/TV2NK4POOHw/s1600/WS000003.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-OhPWat8JpKg/VH7WaCJN5II/AAAAAAAAAGA/TV2NK4POOHw/s1600/WS000003.JPG" /></a></div>
<h3>
RescueTimeとは</h3>
PCで使っているソフト、見ているWebページのログを取るサービス。
twitterのし過ぎや「昨日なにしてたっけか」というとき見返すことが出来て非常に便利です。
またページごとに仕事に関わるものかを自動で判別し、どれだけ頑張ったか評価してくれます。
単純に記録を取ってるという意識だけでケツにムチを打つことができます。

ただ自分の使っているSRWare Ironではどんなページを見たかを記録せず
「Ironを使った」という記録だけで取ってしまいます

<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-00arEjW3Rt4/VH7Xmmu9cKI/AAAAAAAAAGI/630LvYT6-PU/s1600/WS000002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-00arEjW3Rt4/VH7Xmmu9cKI/AAAAAAAAAGI/630LvYT6-PU/s1600/WS000002.JPG" height="303" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
一番上、ironを使ったとだけ出ても困る…</div>

<h3>
解決方法</h3>
ユーザーエージェント偽装（以下UA偽装）をつかいます。
UA偽装とは違うのブラウザ情報を送信することで処理してもらうことです。
本来、特定ブラウザでレイアウトが崩れるなどの症状に対応するものです。

例としてIronをChromeだと思わせることでページのログを取ってもらいます。
今回はIronのみ取り上げますが他のブラウザでも
それぞれの方法でUA偽装すれば多分大丈夫です。

<h3>
UA偽装方法</h3>
至って簡単です。メモ帳などで
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
とコピペしてUA.iniと保存。
Iron本体のあるフォルダにいれます。
(C:\Program Files (x86)\SRWare Iron　とか)

以上です。これだけでIronから仕事してるか動画みてサボってるか一目瞭然です。
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-aewsMlNO1mQ/VH7cqXYiP8I/AAAAAAAAAGY/Oj_0Z-MPk04/s1600/WS000004.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-aewsMlNO1mQ/VH7cqXYiP8I/AAAAAAAAAGY/Oj_0Z-MPk04/s1600/WS000004.JPG" height="169" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
休憩も大事…</div>

偽装するChromeバージョンを変えたい場合など下記リンクのChromeの欄を参考に
<a href="http://www.useragentstring.com/pages/useragentstring.php">http://www.useragentstring.com/pages/useragentstring.php</a><br/>

リンク<br/>
UA偽装参考：<a href="http://www48.atwiki.jp/srware/pages/16.html">http://www48.atwiki.jp/srware/pages/16.html</a><br/>
<br/>
<div class="separator" style="clear: both; text-align: center;">
<br/></div>
FreeBSDのWindows8.1マシンでのデュアルブートのやりかた

#はじめに
FreeBSD-users-jp MLに投下したものに加筆したものです。

GPT+UEFI環境では既存のboot0(F1 FreeBSD, F2 Winって出て来るアレ)が使えません。また、GPTパーティションへのクリーンインストールは対応しているようですが、デュアルブートの設定はどうも良くわからなかったので色々調べながら設定してみた記録です。

手動で、ブートローダの設定を行いました。

#手順

用意するものはどこのご家庭にもあるPXEブート環境(←)とソースツリー

あらかじめ、make buildworldして、PXEブート用のディレクトリに
インストールしておきます

PCでファームウェアセットアップ画面を出して、SecureBoot(これはFreeBSDがSecure Bootに対応していないため)を無効にしておきます。この時、BitLockerはあらかじめ解除する必要があります。
また、PXE環境の整備の時、PXEでロードするファイルはUEFI PXE経由の時はloader.efiを指定するようにDHCPの設定を行います。

Windowsでパーティションを縮小して、FreeBSDをインストールする場所を
作ります。

そして、PXEブートしたら、/usr/srcと/usr/objをNFSマウントして
installworld, installkernelします。
そして、EFIパーティションをmountして
loader.efiを
${EFIMOUNT}/EFI/FreeBSD/Boot/loader.efi
にコピーします
そして、Windowsでbcdedit /copy "{bootmgr}" /d "FreeBSD"
として、得られたUUIDをメモして

bcdedit /set "{得られたUUID}" path \EFI\FreeBSD\Boot\loader.efi
とします。

そのあと
bcdedit /set "{fwbootmgr}" displayorder "{得られたUUID}" /addlast
とします。
それで、リブートしてF12を押すとブートメニューにFreeBSDという
アイテムが出てきます。
これを選ぶとHDDのEFI上のboot1からFreeBSDがあがるはずです。

同様に、ここでFreeBSDのboot1の代わりにUEFIシェルをコピーすると
UEFIシェルが無いUEFIマシンでUEFIシェルをブートメニューから上げることが出来ます。

なお、mountvol.exe /S e:とすることで、Windows上でEFIパーティションを
e:\にマウントすることが出来ます
Unityメモ


* cocos2d-xとの違いも出来れば後で書きたい
* 習得中のため正確性は保証できない

## version
* 4.6 (2014/12/03現在)


## Inspector

### RigidBody
* 物理演算系。重力、摩擦、空気抵抗などが設定できる

### Collider
* 接触・衝突判定

### Physics Material
* 摩擦係数、反発力を設定する

## Script
* javascript は普通の javascriptではなく UnityScript

### 乱数
http://docs.unity3d.com/ScriptReference/Random.html

UnityEngine.Random.value
UnityEngine.Random.Range(x, y)
http://yiida.info/blog/?p=19

### 回転のリセット
```
obj.transform.rotation = Quaternion.identity;
```

### キャストしてGameObjectを取得する
```
ClassName classObj = GameObject.Find("ObjectName").GetComponent<ClassName>()
```

### よく使うイベント

#### Start
開始時に呼ばれる。コンストラクタとは別

#### Update
描画更新に利用。不定期に呼ばれる。

#### Fixed Update
物理演算などに利用。定期的に呼ばれる
処理落ちしても実行されるのでカクつくらしい

#### OnCollisionEnter2D(Collision2D)
接触時に、接触相手を引数に呼ばれる。(ただし重力計算時)
スクリプトで接触した時などはOnTriggerEnterを使う

### OnGUI
4.6からのuGUIでどうなるのか

## Mecanim

* Animatorコンポーネント
* Animation Controller
* Animation Clip


## 小ネタ

### 単位
* Scale 1.0 = 1Unit = 1m(メートル)
* Mass 1 = 1kg(キログラム)

### Animation
* 直接スプライトを入れてもダメで、先にAdd CurveからSpriteを追加してから追加する。(Unity 4.6)

## IDE
* unityと連動するエディタを指定して使う

### MonoDevelop(Unity同梱版)
* 通常版より古いことが多い
* 日本語が入力できない

### MonoDevelop(通常版)
* 同梱版より新しい
* 日本語がどうかは調べてない

### 痛MonoDevelop
* Unityちゃん表示できる
* 日本語OK
* Unityの中の人製

### Xamarin Studio
* MonoDevelop統合環境？

### 感想
* JetBrains系製品に甘やかされてきた身にはMonoDevelop系全般が辛い
  * 慣れの問題だとは思う
* ソリューション毎に設定が変わるの辛い
BackstopJSでCSSのリグレッションテスト

# 1. 概要

CSSのリグレッションテストを自動化してくれるツールBackstopJSの紹介です。

紹介記事（CSS Trick: http://css-tricks.com/automating-css-regression-testing/ ）を読んで動かそうとしたものの、少し手間取ったのでここにメモします。

# 2. 動かす

個人的な好みの問題で、GitHubから手動で持ってきたファイルを使う方法を示します。Readmeではbowerが推奨されています。

## 2.1 動作環境の準備

node.js、Gulp、PhantomJS、CasperJSが必要になります。

node.jsは「node.js　インストール」でぐぐってください。
そのほかは次のコマンドでインストールします。

```
$ sudo npm install -g gulp phantomjs casperjs
```

## 2.2 とりあえず動かす

どういうものかを最初に知っていた方が理解が早いです。

1) "Download Zip"からダウンロード
https://github.com/garris/BackstopJS

2) フォルダに移動してモジュールをインストール

```
$ cd [展開したフォルダ]
$ npm install
```

3) 基準となる画面のスクリーンショットを用意

```
$ gulp reference
```

→`bitmaps_reference`の中にスクリーンショットが保存されます

4) リグレッションテストを行う


※ 現在（2014年12月3日時点）、WindowsだとChromeが開けないので、gulpfile.js 243行目を下記のように修正する必要がありました。

```
(-) ,app: "Google Chrome"
(+) ,app: (process.platform === 'win32' ? "chrome" : "google-chrome")
```

次のコマンドでテストを実行します

```
$ gulp test
```

スクリーンショットの撮影が終わったらリポートページがGoogle Chromeに表示されます。ページを変更していないのですべてpassedになります。Failedのときにどうなるかは最初に貼った [CSS Trick](http://css-tricks.com/automating-css-regression-testing/) にあるので参考にしてください。

## 2.3 テストをつくって動かす

前節のテストは、`capture/config.default.json`をもとに動いていました。本節では設定ファイル`backstop.json`を作成してテストする方法を示します。

### `gulpfile.js`の編集

設定ファイルは`gulp genConfig`で作ることができますが、設定ファイルのできる場所がbowerの使用を前提としていて、`gulpfile.js`の2階層上に`backstop.js`が配置されます。必要があれば`gulpfile.js`の16行目を変更してください。

```js
(-) var backstopConfigFileName = path.join(__dirname, '../..', 'backstop.json')

// １つ上の階層の場合
(+) var backstopConfigFileName = path.join(__dirname, '..', 'backstop.json')

// 同じ階層の場合
(+) var backstopConfigFileName = path.join(__dirname, 'backstop.json')
```

### `backstop.json`の編集

`viewports`ではデバイスの大きさを定義します。ここはデフォルトを参考にすればわかるかと思います。

`grabConfigs`が具体的なテストケースになります。

* `url`: テストするページのURL
* `hideSelectors`: `display:hidden`にしたい要素をCSSセレクタで指定
* `removeSelectors`: `display:none`にしたい要素をCSSセレクタで指定
* `selectors`: キャプチャしたい要素をセレクタで指定（要素の数だけテストケースができる。全体を比較したい場合は`body`を指定）

### テストの準備・実行

リグレッションテストなので、変更前に `gulp reference` を実行しておきます。変更が終わったら、`gulp test`でテストを行います。

# 3. 所感

CSSをリファクタリングする際などに役立ちそうです。画像をバージョン管理しておくと、人に見せる場面で色々捗りそうな予感がします。

もっとも大きな利点は、（最初の準備さえすれば）Gulpを知らずともテストが書けるという点でしょう。

クリックしたらオープンするようなUIは未対応？今後に期待します。
helm-dirsetを使って「複数ディレクトリを分けたわかりやすいインターフェイス」でファイル検索

昨日は @tadsan さんの [.emacsの紹介](http://qiita.com/tadsan/items/3d3f5d8c6ec24c324963) でした。`.emacs`は定期的にメンテナンスをしたほうがいいですよね。最近自分もトレンドから遅れ気味です。

さて、唐突ですが、[ansible.el](https://github.com/k1LoW/emacs-ansible)の紹介をしたいと思います。

## ansible.el

![tty01.gif](https://qiita-image-store.s3.amazonaws.com/0/808/66fa1d1c-cdfb-a7f4-3e43-d7e826ea1993.gif)


ansible.elはAnsibleのPlaybookを書くためのスニペットセットです。

### インストール

    M-x package-install ansible

### 使い方

[YASnippet](https://github.com/capitaomorte/yasnippet)がインストールされていて、設定がされている前提で

    M-x ansible

で有効になります。

また以下のようなコードを.emacsに追加することで、YAMLモードにフックさせることも可能です。

```elisp
(add-hook 'yaml-mode-hook '(lambda () (ansible 1)))
```

### (余談) ansible.elのsnippetの作成方法

[自分のブログ](http://k1low.hatenablog.com/entry/2014/05/27/231132)でも紹介したのですが、実はAnsible Moduleを実装しているそれぞれのソースコードには、Moduleの使い方などがYAMLで書かれています。（おそらくこのコードからドキュメントも生成している？？）

YAMLで書かれているということはパースがしやすいということです。

これを[スクリプト](https://github.com/k1LoW/emacs-ansible/blob/master/lib/generate.rb)でパースして、YASnippet用のスニペットファイルを生成しています。現在はAnsible v1.8.1を対象に生成しています。

## 「Ansible Best Practicesで構成されたディレクトリを簡単に移動したい」

せっかく記述が簡単になってきたので欲しくなってくるのが、ファイル移動です。

「apacheロールのmain.ymlからphpロールのmain.ymlへ移動したい」ということもあるはずです。

この時気になるのが「同名ファイル」です。プロジェクトルートからファイル群を一気に検索してもいいのですが、視認性が悪いです。

そういった場合のファイル移動系のEmacs Lispはcake.elやcake2.elで作成経験がありました。

今回（というか半年前）ansible.elへ導入するために、そこを切り出してライブラリ化してみました（そして忙しさの中忘れ去っていました）。

[helm-dirset.el](https://github.com/k1LoW/helm-dirset)

### インストール

[絶賛MELPAへの登録申請中](https://github.com/milkypostman/melpa/pull/2235)です。

### 使い方

```
(require 'helm-dirset)
(defun some-mode::helm-directories ()
  (interactive)
  (helm-other-buffer
    (helm-dirset-sources '("/path/to/dir"
                           "/path/more/to/dir2"
                           "/Users/k1low")) nil))
```

こんな感じに設定することで、各ディレクトリのファイルがディレクトリごとに確認できます。

![tty02.gif](https://qiita-image-store.s3.amazonaws.com/0/808/769da286-72ae-07cc-4431-8de168fe30fb.gif)


基本的に何かしらのマイナーモードに組み込む想定で作っていますが、
よく参照するディレクトリがあるなら、自身で関数を作ってもいいかも知れません。

## というわけで

ちょっとしたHelmインターフェイスでした！

明日は @kaz-yos さんです！
VMを使ったIE8での動作確認方法


MicrosoftがIEのテスト仮想環境を用意してくれています。
使用期限がありますが、VMイメージを読み直せば使えるので、テストには十分です。
これで、IE8テストするのに実機を用意する必要がなく、非常に作業が効率化します。

1.VirtualBoxのインストール

https://www.virtualbox.org/wiki/Downloads

2.仮想イメージのダウンロード

以下から、Windows, Virtual Box(Windows上)を選択し、IE8-XPのファイルを全てダウンロード

http://modern.ie/ja-jp/virtualization-tools#downloads

3.ダウンロードしたexeファイルを実行する

4.作成されたovaファイルをダブルクリックする

5.VirtualBoxマネージャーの設定から以下を実施

共有フォルダー
->画面右上の追加アイコンをクリック
->任意のフォルダを追加（読み込み専用、自動マウントの両方にチェック）

6.フォントをコピー

C:¥Windows¥Fonts 配下のMSゴシック、MS明朝を共有したフォルダーにコピー

7.仮想環境を起動

8.仮想環境でフォントをコピー

共有したフォルダーのフォントをC:¥Windows¥Fonts配下にコピー

9.Lets's TEST!!!

OSは英語でもブラウザでは日本語がみれる！
タッチイベントを拾ってDraggableモドキ

jQuery UIのDraggableだとiPhoneだとかのタッチデバイスでドラッグできない。
しょぼーん…

いろいろ調べてみたら、`touchstart`, `touchmove`, `touchend`ってのでタッチイベントが拾えるらしい。

ということで書いてみた。

```html:touchtest.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>touch test</title>
	<style type="text/css">
	.touchable {
		position: absolute;
		cursor: move;
		width: 100px;
		height: 100px;
		background-color: blue;	}
	</style>
</head>
<body>
	<div class="touchable"></div>

	<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

	<script>
	'use strict';

	$('.touchable').bind({
		'touchstart mousedown': function (e) {
			e.preventDefault();

			var eventPos = {};
			if (e.type == 'touchstart') {
				eventPos = {
					x: e.originalEvent.changedTouches[0].pageX,
					y: e.originalEvent.changedTouches[0].pageY
				};
			} else {
				eventPos = { x: e.pageX, y: e.pageY };
			}

			this.initialTouchPos = eventPos;
			this.initialDocPos = $(this).position();
			this.touching = true;
		},
		'touchmove mousemove': function (e) {
			if (!this.touching) return;
			e.preventDefault();

			var eventPos;
			if (e.type == 'touchmove') {
				eventPos = {
					x: e.originalEvent.changedTouches[0].pageX,
					y: e.originalEvent.changedTouches[0].pageY
				};
			} else {
				eventPos = { x: e.pageX, y: e.pageY };
			}

			var left = this.initialDocPos.left
					+ (eventPos.x - this.initialTouchPos.x);
			var top = this.initialDocPos.top
					+ (eventPos.y - this.initialTouchPos.y);

			$(this).css({ left: left, top: top });
		},
		'touchend mouseup': function (e) {
			if (!this.touching) return;
			this.touching = false;
			delete this.touching;
			delete this.initialTouchPos;
			delete this.initialDocPos;
		}
	});
	</script>
</body>
</html>
```

`touchstart`時点の座標を覚えておいて、`touchmove`が発生毎に、開始時の座標との差分をターゲットドキュメントの座標に加えてあげるだけ。`this`に勝手なプロパティ追加したので最後に一応お掃除`delete`してみました。（しなくてもいいのかな？良くわかんない）

タッチイベント発生時の座標は、`e.originalEvent.changedTouches[0]`から引っ張ってこないといけないみたい。
QUnitでクリックイベントをテストする


QUnitで検索するとこういうテストケースしか出てこない。

```js
QUnit.test( "hello test", function( assert ) {
  assert.ok( 1 == "1", "Passed!" );
});
```

普通に普段JavaScriptで何を書いているか？
クリックしたら、開くとか、変わるとか、読み込む、とかそういう処理がほとんど。

ということでクリックイベントのテストを書いてみる。

まずは以下のようなHTMLを用意して、

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Click Run</title>
  <script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
  <script src="click.js"></script>
<body>
  <div id="ctrl_btn">Apple</div>
  <div id="result"></div>
</body>
</html>
```


Appleの文字（というか id="ctrl_btn" の div ）をクリックしたら、その下に文字が出るというような click.js を作る。
こんな感じ。

```js
$(function() {
  $('#ctrl_btn').on("click", function() {
    $('#result').text('Google');
  });
});
```


で、テスト用の index.html は以下のような感じで。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Click Test</title>
  <link rel="stylesheet" href="qunit.css">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <script src="qunit.js"></script>
  <script src="click.js"></script>
  <script src="testclick.js"></script>
<body>
  <!-- テスト結果表示領域 -->
  <div id="qunit"></div>
  <div id="qunit-fixture">
	<div id="ctrl_btn">Apple</div>
	<div id="result"></div>
  </div>
</body>
</html>
```

`qunit-fixture` の部分にテストに必要な要素をあらかじめ配置しておく。
これはテスト終了とともに消滅する。
ではテストを書くべし。

```js
QUnit.test("クリックして文字を出す", function( assert ) {
  var event = $.Event( "click" );
  $( "#ctrl_btn" ).trigger( event ); 
  assert.equal( $( "#result" ).text(), 'Google', 'クリックで文字が出ます');
});
```
Unreal Engine 4 (UE4) でOculusを使うための手順

UE4でOculus向けのコンテンツ制作をする前に、まずはセットアップやテスト方法からざっと紹介します。

#UE4でOculusを使うための手順

Runtimeのインストール時にドライバのインストール等を行うことと、その際にブルースクリーンが出たという情報があるので（というか自分も出た経験があります）、もしもの場合にそなえて、事前にGPUドライバの最新版のダウンロードと保存、インストールをお勧めします。さらにノートPCやメーカー製PCの場合は、メーカーのサイトに行って、ご利用のPC用の安定版のGPUドライバをダウンロードしておく事をお勧めします。

あと、ドライバの更新をする場合は復元ポイントを作成しておく事もお勧めです。
Windows 7：[復元ポイントを作成する](http://windows.microsoft.com/ja-jp/windows7/create-a-restore-point "復元ポイントを作成する")
Windows 8: [PCをリフレッシュ、初期状態に戻す、または復元する方法](http://windows.microsoft.com/ja-jp/windows-8/restore-refresh-reset-pc "PCをリフレッシュ、初期状態に戻す、または復元する方法")

では、始めましょう。

1. まずはUE4の導入ですが、ここでUE4の導入から説明していると長くなるので、[historiaさん](http://historia.co.jp/ "historia")のサイトでの[「UE4 サブスクリプション版の導入手順まとめ」](http://historia.co.jp/archives/222 "UE4 サブスクリプション版の導入手順まとめ")がお勧めです。（2014/12/4の時点でUE4の最新版はPreviewが取れて正式に4.6になっている予定）
2. UE4のインストールが終わってひと通り動作確認ができたら、[Oculus VR Developer Center](https://developer.oculus.com/ "Oculus VR Developer Center") に行ってDownloadsタブをクリックしてください。<br \>
![OculusRuntime.png](https://qiita-image-store.s3.amazonaws.com/0/58485/99502a1b-56c7-2e3c-a880-709b929cd73a.png)
3. ダウンロードできるファイルのリストが出てくるので、Oculus SDK 0.4.3 Beta という項目からWindowsの場合 Oculus Runtime for Windows、Macの場合 Oculus Runtime for Mac OSの、横にある「Download」ボタンをクリックしてダウンロードとインストールして下さい。（UE4の4.6以上では Oculus SDK 0.4.3 Betaが利用されていて、4.5以前ではSDK 0.4.2が使われていますが、UE4.6も4.5もRuntime 0.4.3とRuntime 0.4.2どちらの組み合わせでも動作することを確認してあります）
4. ノートPCでOptimus搭載のものの場合、Runtime 0.4.3インストール後にGPUを使った途端にブルー・スクリーンで落ちてしまう場合が確認されています。その場合は再起動後に慌てず最新のGPUドライバを再インストールしてみてください。GPUドライバ再インストールでもダメな場合は、Runtimeインストール前の復元ポイントに戻してみましょう。
5. インストールが完了したら、おもむろにUE4（Unreal Engineというアイコンがデスクトップにあると思います）を起動しましょう。
6. UE4が初めての場合は、マーケット（プレイス）からサンプルをダウンロードしてテストしたり、テンプレートからプロジェクトを作成してテストすることができます。<br \>
![UE4Launcher.png](https://qiita-image-store.s3.amazonaws.com/0/58485/2f6128be-2190-0a0a-2386-e6914762d0b6.png)<br \>
![UE4ProjectWiz.png](https://qiita-image-store.s3.amazonaws.com/0/58485/5862a68b-3f79-c1e9-70f6-ca6332d2d928.png)<br \>
新規プロジェクトで始めたい場合は、FirstPerson等がOculusの没入感をテストしやすいと思います。
7. プロジェクトを立ち上げたら、Oculusを起動するのは簡単です。
8. 「プレイ」ボタン右横の小さな下向きの三角をクリックして「スタンドアローンゲーム」を選択してください。<br \>
![UE4LaunchStandalone.png](https://qiita-image-store.s3.amazonaws.com/0/58485/2caeabdc-e398-783f-a82e-d34dd6b95c1f.png)
9. するとゲームが別のウインドウで立ち上がりますが、エディタとゲームの両方がリアルタイムで動いているとノートPC等では負荷が高いのでエディタは右上のボタン等から最小化しておきましょう。<br \>
![UE4LaunchedStandalone.png](https://qiita-image-store.s3.amazonaws.com/0/58485/f7055f45-dc66-41fc-dee2-368cb91f890b.png)
10. あとは「Alt+Enter」キーでOculus上で動きます。<br \>
![UE4LaunchedOculus.png](https://qiita-image-store.s3.amazonaws.com/0/58485/365ae5ee-639a-7f04-fbdc-633be635df28.png)

これだけ！
Enjoy!
make_is_somethingメタメタ関数をつくってみた。

急激に寒くなってきまして、キーボードを叩く手がかじかんでいます。
今日はis_xxxメタ関数を生成するメタ関数を作ってみました。

この場合はメタメタ関数ということになるんでしょうか。

この発想は、<type_traits>ヘッダをなんともなしに眺めていたところ、std::is_integralメタ関数の実装が

```
template < class >
struct is_integral : false_type {};
template <>
struct is_integral < char > : true_type {};
template <>
struct is_integral < short > : true_type {};
template <>
struct is_integral < int > : true_type {};
```

と並んでいたことにありました。
そこで、こういうものをサクっと作れるメタ関数を考えてみたのですが、案外サクッとできそうだぞと思ったので、実際にコードに起こしてみたのです。

早速コードを書いてみます。
ここにでてくる `meta_or` は[エイリアステンプレートいろいろ。](http://qiita.com/rinse_/items/1fb1ddcc14bf8d530625)で紹介させていただいたものと同様のものでして、`std::true_type`か`std::false_type`を引数に取ってその論理和を継承するというメタ関数です。`std::is_same`は受け取った型によって`std::true_type`か`std::false_type`を継承するので、この関数の引数足りえるということですね。

```
template < class... >
struct make_is_something
{ // Ty is empty
};
template < class Ty, class... Args >
struct make_is_something < Ty, Args... >
{
  template < class U >
  using type = meta_or < std::is_same < U, Ty >, typename make_is_something < Args... >::template type < U > >;
};
template < class Ty >
struct make_is_something < Ty >
{
  template < class U >
  using type = std::is_same < U, Ty >;
};
```

コメントもつけようがないほど簡単な実装になりました。
一番基本的なものは引数の数が0という場合です。この場合はほとんどの場合substitution faultを起こすことになると思います。

実際の用例としては、

```
template < class Ty >
using is_integral =
  typename make_is_something < 
    char, short, int, long, long long,
    unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long
  >::template type < remove_cv_t < remove_reference_t < Ty > > >;
```

不必要とも思いますが、`remove_cv_t` と `remove_reference_t` の実装は以下です。

```
// remove_cv
template < class T >
using remove_cv_t = typename std::remove_cv< T >::type;
// remove_reference
template < class T >
using remove_reference_t = typename std::remove_reference< T >::type;
```

これだけで `is_integral` が完成します。こっちの方がスマートでカッコイイと思います。もちろん、is_xxxメタ関数なら何でも作れるというわけではなく、単純作業を削減する程度の威力ですが、大切なこころがけであると思います。
それでは、みかんで真っ黄色になった指がかじかんでしょうがないので今日はこの辺で。
How to Japanize Validation of Zend Framework 2.3

エラーメッセージの翻訳を行うには、以下の様にします。
# ロケールを日本語とする
```php:module/Application/config/module.config.php
// 'locale' => 'en_US',
'locale' => 'ja_JP'
```
# 翻訳ファイルを設定する
```php:module/Application/Module.php
public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);

    // 以下を追加
    $sm = $e->getApplication()->getServiceManager();
    $translator = $sm->get('MvcTranslator');
    $translator->addTranslationFile(
        'phpArray',
        'vendor/zendframework/zendframework/resources/languages/ja/' .
        'Zend_Validate.php',
        'default',
        'ja_JP'
    );

    \Zend\Validator\AbstractValidator::setDefaultTranslator(
        new \Zend\Mvc\I18n\Translator($translator)
    );
}
```
# 実行結果
![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/28376/fa117b5f-d313-a55c-f24d-1902819f738b.png)

`Zend_Validate.php` の指定がダサいです。なんか `_DIR_` とか使って格好良くしたいんですけど、力不足ですすいません。

以下を参考にしました。
http://stackoverflow.com/questions/23151917/zf2-3-translate-validation-message
Android端末のCleansingに関する考察

#キッカケ
Android開発環境では、なるべくクリーンな状態で動作実験をしたいと思った。少なくとも、アプリケーションが作った設定ファイルや保存フォルダは削除したい。その方法とAndroidのCleansingについてまとめてみた。

#Cleansing一覧
デフォルトの場合、AndroidのCleasingの方法は以下の通りだと考えられる。

|番号|Creasing|効果|残留|弊害(Impact)|対策|
|:---------:|:---------:|:---------:|:---------:|:---------:|:---------:|
|1|アプリケーションのアンインストール|APKファイルの削除|設定ファイル,保存フォルダ等の残骸|失敗時のAPKファイルの残留||
|2|端末のリブート|プロセスの削除|APKファイル,マルウェアの再起動|再起動の時間||
|3|端末の初期化（工場出荷状態）|アカウント削除,APKファイルの削除,各設定のリセット,カスタムリカバリーファイル削除,|Root権限で導入したAPKファイルや設定,写真|工場出荷状態完了までの時間,Root権限の再取得||
|4|OSの再導入|設定のリセットやAPK、残留ファイル等の完全削除,Root権限の放棄|Bootloader unlock（再ロックの方法わからず）|Root化が解除される,初期設定||
|5|バックアップファイルからのリストア|今までに行なった設定リセットやインストールしたアプリケーションの放棄||手動操作（？）||
##アプリケーションのアンインストール
端末上から行うには、デバイスを接続して、`adb -s <device> uninstall <package名>`を行えばよい。しかし、adbによる端末の接続が切断されていた場合、これは機能しない。その場合、画面を操作する必要がある。

表にあるとおり、アプリケーションファイルを削除することはできるが、アプリケーションが行った操作、設定ファイルや保存フォルダ作成等は削除されない。

##端末のリブート
同じく`adb -s <device> reboot` により行うことができる。例外も前述のアンインストールの時と同じである。

これはTCPモードによる端末との接続が意図せず切断されたとこに行う操作である。Localhostと端末との間の通信をキャプチャしたところ、端末側からRSTフラッグが出ていたため、おそらく予期せぬ切断はadbdのエラーによるもと、と推察される。これを正すためにrebootを行う。

プロセス削除のため、もちろんマルウェアが起動時から動くものだと、マルウェアも起動されるため、汚染されたままプログラムを処理することになる。

##端末の初期化
`adb shell recovery --wipe_data`を実行する。例外も前述のアンインストールの時と同じである。

その後の解析方法
Mass storage mount
Logical analysis
Low level analysis


##OSの再導入

OSの再導入は、ファクトリーイメージがあれば用意に出来る。（特にNexus系は簡単！）
しかし、全てがリセットされてしまうため、Root権限の取得及び初期設定を行わなければならない。

以下の表はAndroidのパーティション一覧（もしかしたらもっとあるかも）

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/14916/f4c1fcd8-1e94-7598-1a13-e5fc2d0762e9.png)
[引用記事](http://chimtty.blogspot.jp/2013/11/nexus-androidjp_24.html)

OSの焼き直しに必要な領域は、boot領域,recovery領域,system領域,userdata領域,（cache領域）の5領域である。
おそらくこの中に初期設定を保存する領域があると考えられる。故に、その領域を保存し、初期設定が終わっている状態のものを焼けば初期設定をスキップできると考えられる。

Root化権限の取得については、`adb logcat`や`tcpdump`他を行うために必要である。
カスタムROMを利用すれば、Root権限を取得した状態のOSを再導入できる。
現在開発が進んでいるカスタムROMは、CyanogenMod、JROM等である（引用記事:[Android端末(Nexus)のroot化・カスタムROMの導入と更新](http://andmem.blogspot.jp/2014/02/customrominstall.html)）。


##バックアップファイルからのリストア
バックアップファイルを予め作成し、処理が終わるたびにバックアップファイルから状態をリストアする。いくつかの手順を省けるが、システム領域の復帰となると、手動操作が必要？かもしれない。

主はRoot化後、Clockworkmodをリカバリ領域に焼いているが、端末からの操作は受け付けないらしい。極力、タッチ操作を避けたいので、不便である。

##参考
・[Androidの初期化は「個人情報」がダダ漏れ？確実に削除する方法と、「おサイフケータイ」の注意点など](http://tonogata.hatenablog.com/entry/2014/08/03/104232)
・[How can i do factory reset using adb in android?](http://stackoverflow.com/questions/14685721/how-can-i-do-factory-reset-using-adb-in-android)
tmlib.jsでページスクロールを止めたい時のカンタンTips

# tmlib.js Advent Calendar ２日目

遅れてスイマセン...

# tmlib.jsでゲームを作った！公開だ！

tmlib.jsでゲームを作っていざ公開！

この時、公開するWebサイトの作りによってはキーボードの上下でページスクロールが発生してしまう場合があります。

http://static.dev7.jp:81/tmlibadvcal2014/ng/

![img1.png](https://qiita-image-store.s3.amazonaws.com/0/30568/48950dcd-1aba-ceb2-9cd7-f87cd2da132c.png)

これをキャンセルしたい時はこうするとよいです。

```js
var app = tm.display.CanvasApp("#app");

// ...

// カーソルキーとスペースキーが押された時はイベントの伝播を止める
app.keyboard.element.addEventListener("keydown", function(e) {
    if (37 <= e.keyCode && e.keyCode <= 40 || e.keyCode === 32) {
        e.preventDefault();
    }
});
```

http://static.dev7.jp:81/tmlibadvcal2014/ok/

![img2.png](https://qiita-image-store.s3.amazonaws.com/0/30568/dc30ada4-ce89-346d-c3b0-9a7346a14e94.png)

# 次回は...

次回は @h_mjlife さん、お願いしますー！
家庭を支える技術 in Livesense Advent Calendar 2014

## 概要
[家庭を支える技術 Advent Calendar 2014](http://www.adventar.org/calendars/595)の日程が全て埋まってしまっていたことと、会社のAdvent Calendarで記事を書く事になったことをうけての投稿です。

プライベートで便利に使っているソフトや技術について紹介します。

## 1. Excel
最近IT界隈でディスられがちなこのソフトですが、実家ではなくてはならないものになりました。

### 例 : 青色申告の書類作成
実家は専業農家なのですが、2年前までは父が青色申告の書類を手書きで作成していました。検算があわないと、間違っている箇所を見つけるための見直しに時間を要すこともあり、数週間かけて父が一人で作成していました。青色申告の書類作成にExcelを導入した昨年より、青色申告にかける父の工数はほぼゼロになりました。

現在は私と母が分担してExcelに入力しています。入力したその直後に検算が走るので即確認できるようになり、入力の誤りによる手戻りが無くなりました。また数値を入力し終わるとそのまま印刷可能なシートに値が反映されます。

Excelを使い始めた昨年は一挙に12ヶ月分入力したので大変でしたが、今年からは実家に帰るごとにその月までの値をExcelに入力しており、科目等も昨年のものが使い回せるので私と母の負担も昨年と比べて劇的に減る見込みです。

ITの力で親孝行できました。
もっと早くExcelを使っていれば良かったです。
地方ではExcelは最強のツールです。

## 2. Dropbox
Dropboxを使い始めてから家族間の情報共有が劇的に変わりました。
家族の写真や動画の共有、また先ほどの青色申告の書類など共有しています。
何か修正が必要なときはDropbox上のファイルを更新すればよく、電話でフォルダを開いて云々など説明する必要が無くなりました。

## 3. Viber
前職の関係もありコミュニケーションツールはL○N○ではなくViberを家族間で使っています。
実際チャットや無料通話などコミュニケーションツールとしてとても使いやすいです。

## 4. 自動車でのBluetooth曲再生
実家の車がBluetoothに対応しており、車で出かける際はiPhoneに保存してある数百の曲をエンドレスで聞きいています。注意点としては、一度接続すると次回以降自動でペアリングされ、曲が自動再生さるようになります。家族で一緒に車で出かける直前に不適切な曲を聞いていた場合、曲が勝手に流れ出して気まずい雰囲気になってしまう可能性があります。ご注意ください。

## 5. 書類電子化自炊セット
裁断機とスキャナを使って段ボール3箱分の書籍や書類を処理しました。

## 6. 外付けHDなど
電子化したデータはガジェット以外に外付けHDにバックアップしています。自炊データをクラウドで管理することについてはプライベート限定な利用でも現行法ではグレーとなってしまうようなので省略。

## 7. 電子書籍アプリ
KindleとかKoboとか。リサイクルショップで買って自炊するより電子書籍で買う方が手間もかからず、しかも割引キャンペーンで中古より安くなる事もあり、少なくとも漫画については今後購入するのは電子書籍版だけになりそうです。注意点として、夜の電車内では背後のガラスの映り込みに注意しましょう。周りに人が少ないと油断して適切ではない書籍を読んでいると、ガラスに映り込んで向かいの人に内容がバレてしまう可能性があります。ご注意ください。

## 8. Docker上のRedmineがクラウドを渡り歩く

最後に技術者っぽいトピック。

家族のプロジェクト(「保険を見直す」「子供の保育園入園準備」など)をローカルマシンの
DockerにインストールしたRedmineで管理しています。自分だけで使うときはローカルマシンで良いのですが、遠方の家族にもRedmineを共有する場合はクラウドサービスにデプロイできればWebブラウザで確認する事が可能です。

実際AWSには以下の手順でデプロイ可能です。
[Docker Hello World](http://www.slideshare.net/Ftakao2007/docker-hello-world)

以下の記事をみてDigitalOceanにREDMINEを移したくなる衝動にかられました。
[DigitalOcean＋CoreOS＋Docker：このフレッシュ･トリオが 大変革を引き起こす！](http://agilecatcloud.com/category/digital-ocean/)

こんなときも、Dockerを利用していれば簡単にサービスを移す事ができます。

以下概要図です。

![スクリーンショット 2014-12-03 10.05.12.png](https://qiita-image-store.s3.amazonaws.com/0/20474/e236c5f9-48ec-3201-ae81-f68644d781d8.png)

docker-REDMINEの固まりが、クラウドサービスをDockerHubをハブとして渡り歩きます。

実際簡単にDropletを作成してRedmineを移す事ができました。
(手順的なものはまた別の機会にまとめて公開します)

別のクラウドサービスやVPSにサービスを移したいなーとなったときに、DBとかその他設定とか
まったく気にせずガッツリ移せるのはとても気楽で良いですね。コンテナ仮想化技術は
エンタープライズのみでなく、個人利用でも大きな可能性を感じます。

4日目は @sion_cojp さんです。
宜しくお願いしますー。
ELB配下のhttpdのaccess_logに408が出る件


ELB配下のhttpdのaccess_logに、ステータス408が約50秒おきに出ていて気になったので調べてみた。

```access_log
- ELBのIP - - [03/Dec/2014:09:03:01 +0900] "-" 408 - "-" "-"
- ELBのIP - - [03/Dec/2014:09:03:04 +0900] "-" 408 - "-" "-"
- ELBのIP - - [03/Dec/2014:09:03:52 +0900] "-" 408 - "-" "-"
- ELBのIP - - [03/Dec/2014:09:03:55 +0900] "-" 408 - "-" "-"
```

ステータス408の詳細 -> [HTTP 408: Request Timeout](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-error-message.html#ts-elb-errorcodes-http408)

# 対策

ELBのIdle Timeout値を60秒から30秒に変更する。

対象のELBを選択して、ConnectionSettingsのEditを選択。
![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/332/38574/1dfe120d-1fce-cd00-a0f7-67a3d39935dd.png "EC2_Management_Console.png")

Idle Timeout値を60secondsから30secondsに変更し、Save
![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/332/38574/f30c4bdb-1cf1-86ae-8174-526b3d98f6f8.png "EC2_Management_Console.png")

これで、ステータス408のログが止まりました。

参考：[【AWS発表】Elastic Load Balancingのコネクションタイムアウト管理](http://aws.typepad.com/aws_japan/2014/07/elb-idle-timeout-control.html)
参考：[EC2のhttpd access_log で ELBからの接続応答コードが408になる件の対応](http://www.checksite.jp/elb-ec2-access_log-408/)
OculusRift + PhotonCloudでメタバース的なものを作ってお手軽未来体験！

**OculusRift + PhotonCloudでメタバース的なものを作ってお手軽未来体験！**

　というコンセプトの記事です。
　（動けばいいんだよ！の精神で作っていますのでツッコミ等頂けたら喜びます）

#１．PhotonCloudの使用準備

　1.PhotonCloudに登録してアプリを作成
![1.png](https://qiita-image-store.s3.amazonaws.com/0/46096/8f12727d-5b18-58b2-b7db-8ef79d8788b3.png)

　2.PhotonCloudのアセットをインポート
![2.png](https://qiita-image-store.s3.amazonaws.com/0/46096/b9a0535c-9f35-dbc3-feb6-eeb557e795f1.png)

　3.設定ウィザードで使用準備
![3.png](https://qiita-image-store.s3.amazonaws.com/0/46096/845392cf-aeeb-ce50-2a5d-89cff530f092.png)

　**これだけでもうPhotonCloudを使用できます。べんり！！！**

#２．PhotonCloudでルームを作成する

　Sceneのルートにスクリプト管理用のGameObject(以下、\_Scripts)を作成します。
　次にPhotonCloudを使う為のスクリプト（以下、NetworkManager）を[こんな感じ](https://gist.github.com/soyliquid/59ce4459481dab56f224#file-networkmanager)で作成します。
　PhotonViewスクリプトと今作ったNetworkManagerを_Scriptsに追加します。
　![4.png](https://qiita-image-store.s3.amazonaws.com/0/46096/0fca68d9-4624-9b3a-6070-9c26280de68a.png)

　これで起動時に自動でPhotonのロビー＆ルームへ接続出来ます。

#３．プレイヤーを作成する

　次はプレイヤーを作成します。
　プレイヤーのアバターとしてUnityちゃんにご登場願いました。

　![6.png](https://qiita-image-store.s3.amazonaws.com/0/46096/5ff84158-5eda-fb14-7181-37ceccc1b0e7.png)

　FPSっぽくWASDで移動、マウスで旋回するようにします。
　但し、そのままだと他プレイヤーまで一緒に移動したり回転したりしてしまいます。
　この現象を回避する為にはphotonView.isMineでプレイヤーが自分自身かどうかを判断して、不要な処理やスクリプトが動かないようにする必要があります。
　[こんな感じのスクリプト](https://gist.github.com/soyliquid/e6574c30650092e2b4f9)を使って制御すると便利だと思います。
　一通り作り終わったらプレイヤーをPrefab化しておきましょう。

#４．プレイヤーを同期する

　そのままだとプレイヤーの位置も動作も同期されません。なんとかしましょう。
　プレイヤーに同期処理用のスクリプトを仕込み、PhotonViewのObserve値で参照させます。
　同期処理用スクリプトは[こんな感じ](https://gist.github.com/soyliquid/9cba2c36f16b573e621c)で実装しました。
　SyncTargetsの要素に同期させたいGameObjectを仕込みます。
　Transformの位置と回転、Animatorのパラメータが同期されます。
　(多分この方法は通信負荷が高いので移動キーの入力をRPCで伝達して各自ローカルで移動処理をしつつ低頻度で誤差修正用の位置同期処理を走らせるのがいいんじゃないでしょうか。どうでしょうか)

#５．OVRCameraRigを仕込む

　Hierarcyのルート直下にOVRCameraRigを配置しておきます。
　これを自プレイヤー検出時にプレイヤーの視点の位置に持っていきます。
　基本的にこれだけでOKです。
　今回はアニメーション時もカメラの位置を追従させたいので、Character1_Headに位置を合わせるようにしました。

　![7.png](https://qiita-image-store.s3.amazonaws.com/0/46096/af6f1e48-d90c-4b5b-800b-9c8ecb55f06c.png)

#６．イベントを実装する

　普通に音を鳴らしたりしても自分にしか聞こえないので、RPCを使って他クライアントにイベントを伝達します。
　RPCAttributeを付与したメソッドを[こんな感じ](https://gist.github.com/soyliquid/9042fcebf4e7dce14153#file-footstepmanager)で呼んであげましょう。
　今回はRPCを使って足音を鳴らしています。　

#７．動かしてみる

　最終的にアニメーションやらHeadLookControllerやら移動方向を向くスクリプトやらを仕込んでこんな形になりました。

　![5.png](https://qiita-image-store.s3.amazonaws.com/0/46096/e30bcbf1-6574-c7ef-a12a-a9a0dafedccd.png)


　これをビルドして複数クライアントで動かしてみましょう。
　そこには元気に動き回るユニティちゃんズの姿が！！！！

![7.png](https://qiita-image-store.s3.amazonaws.com/0/46096/610d1113-015c-5ec7-71d2-556d5ceb255f.png)

　実行ファイルは[ここ](https://drive.google.com/file/d/0ByUpVh3J6kXjbkp1dWgySVFvMU0/view?usp=sharing)からダウンロードできます。

#８．お わ り

　やっていることは単にプレイヤーのアバターの目の位置にOVRCameraRigを仕込んだだけですが、それなりに雰囲気でていると思います。
　視界の中心に一番近いプレイヤーの顔に視線を向けるとかするともっとそれっぽくなりそうですね。

　次の担当はkurisaka_konabeさんのOculus Riftで小動物になる展示です。よろしくお願いします！

#９．ライセンス表記
　このコンテンツは[ユニティちゃんライセンス](http://unity-chan.com/download/license.html)で提供されています。
slf4j-simpleで、ログレベルをDEBUGやTRACEにする方法

slf4jの出力をコンソールにサクッと出したい！というときに、slf4j-simpleを使えばいいんじゃね？と思って使うと、ログレベルがINFOレベル以上でないとコンソールに出力されなくて愕然としたことのある諸兄も多いと思います。
そこで、slf4j-smpleでもログレベルを変更する方法をご紹介！
方法は簡単。システムプロパティをいじるだけでOKです！

サンプルコード

一括で変更

```java:Sample.java
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel","DEBUG")
// ただし、この設定はstatic constructorで読み込まれるので、なるべくなら起動オプションに渡したほうが無難です。
// java -Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG Main

```

一部のクラスだけ変更

```java:Sample.java
System.setProperty("org.slf4j.simpleLogger.log.MyClass","DEBUG")
Logger logger = LoggerFactory.getLogger("com.hoge.MyClass")

```

システムプロパティに`"org.slf4j.simpleLogger.log." + クラス名`のKeyでログレベルを設定してあげると個別にもログレベルを変更可能です。



また、sbtのtestだけで有効にしたい場合は、

```scala:build.sbt
fork in Test := true

javaOptions in Test += "-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG"
```
を設定しておくとOKです。

## さらに

実行時パラメータで渡したり、初期化のタイミングを考慮したり面倒くさい！という諸兄には、リフレクションを使った方法をご紹介

```scala:ModifyLogLevel.scala

import org.slf4j.impl._
import org.slf4j._
import org.slf4j.spi.LocationAwareLogger

val logger : Logger = LoggerFactory.getLogger("ClassName")
val logLevel = LocationAwareLogger.DEBUG_INT // DEBUGレベル
logger match{
  case l : org.slf4j.impl.SimpleLogger => {
    val field = l.getClass.getDeclaredField("currentLogLevel")
    field.setAccessible(true) //protectedなので、無理やりアクセスするためにAccessibilityを変える
    field.set(l,logLevel)
  }
  case _ => // Not slf4j-simple logger
}
```

正直ユニットテストに使う分には、これで対象のLoggerだけレベル変えるのが楽でした。
Ubuntuで固定IP運用

#目的
古いMacbook(Early2008)で無線LANと有線LANをブリッジさせて
Macbookをアクセスポイント化するための下準備.
調べたところ有線と無線を同時に使うためには
NetworkManagerは切る必要があり、ちょっとハマったので。
##環境
Macbook(Early2008)
OS:lubuntu14.04（LTS)
###ハマった点(以後注意する点）
NetworkManagerは`/etc/init.d/hogehoge`ではなく
`/etc/init/network-manager.conf`に自動起動の設定が書いてある。
###Network-Managerの停止
`/etc/init/network-manager.conf`のstart onの項目をコメントアウト
すると自動起動しなくなる

```
#start on (local-filesystems
#          and started dbus
#          and static-network-up)
```

その後、手動停止
`sudo stop network-manager`
###固定IP設定
`/etc/network/interfaces`に記述

```
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
gateway 192.168.1.1
```
等、自身の環境に合わせて適宜読み替える。
その後再読み込み
`sudo /etc/init.d/networking restart`
###DNS設定
ここまでの段階でかろうじてネットに繋がるけどapt-getで失敗した。
理由はDNS設定がNetworkManagerだとresolv.confに反映されないから。
しかしubuntuでは直接`/etc/resolv.conf`を編集してはダメなので
`/etc/resolvconf/resolv.conf.d/base`ファイルを編集する


`nameserer 8.8.8.8`等DNSを記述する


再読み込みは以下コマンド
`sudo resolvconf -u`

###IPv6無効化
ついでにIPv6も無効化しておく
`/etc/sysctl.conf`に以下記述
(lubuntuなので以下の記述は検索でヒットするubuntuとはほんのちょっと場所が違った)

```
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

再読み込み
`sudo sysctl -p`

####次はWifiを起動させてブリッジ接続
既に先人の知恵がありますね。
これで上手くいくかな？
[Ubuntu を無線 LAN ルータとして稼働させる](http://qiita.com/8mamo10/items/59adae2c9f286e041792)
Android Studioのgradleビルドを高速化する

EclipseからAndroid Studioに移行したんですが、ビルドが超遅くなりました。

見てみると、なんか毎回gradle syncしてたりJVMのメモリ足りない感じだったりするみたいなので、[こちらのStackOverFlow](http://stackoverflow.com/questions/16775197/building-and-running-app-via-gradle-and-android-studio-is-slower-than-via-eclips)の記事を参考に高速化してみました。

 

#1. gradle.propertiesファイルを変更 
プロジェクトルートにある`gradle.properties`を編集します。なかったら作ってください。
ここには、gradleビルドするときの引数を設定できます。以下のように設定します。

```gradle.properties
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings
# configured through the IDE.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
# TODO: disable daemon on CI, since builds should be clean and reliable on servers
org.gradle.daemon=true
 
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
 
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true
 
# Enables new incubating mode that makes Gradle selective when configuring projects.
# Only relevant projects are configured which results in faster builds for large multi-projects.
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true
``` 

以下簡単な説明。

* `org.gradle.daemon`は、デーモンプロセスを使うかどうかのパラメータです。
* `org.gradle.jvmargs`は、実行時のJVM引数です。メモリ足らなくなって遅くなるのを防ぎます。
* `org.gradle.parallel`は、gradleの並列ビルドモードを有効にするパラメータです。複数プロジェクトのビルド時に効果を発揮するらしいです。
* `org.gradle.configureondemand`に関しては詳しく理解できていないのですが、関連するプロジェクトがある場合に必要な部分だけビルドする設定みたいです。

これらのパラメータの情報は、[こちら](http://gradle.monochromeroad.com/docs/userguide/build_environment.html)で説明されています。

この設定は、体感的にちょっと速くなったかな、くらいの変化でした。まぁ効果はありそうです。


#2. gradleをオフラインモードに変更

これは超効果ありました。毎回gradleで最新バージョンをチェックしにいくのを省略してくれます。大規模なプロジェクトほど効果高いのではないでしょうか。

`Android Studio > Preferences > Gradle` の、Offline workにチェックをいれます。

![gradle_faster1.png](https://qiita-image-store.s3.amazonaws.com/0/15267/863c25c1-0816-90f9-7cb1-7193c0e725b3.png "gradle_faster1.png")

OKを押してビルドすると、gradle syncせずにビルドを始めます。Android Studio0.4.0からサポートされた機能みたいです。

新しいdependencyを追加した時はネットワーク接続が必要になるので、オフラインモードのままだとエラーが出るので注意です。まぁ日頃開発している中で何度もdependencyを追加することはないでしょうから、基本はオフラインモードにしておくのがいいんじゃないかなと思います。
Google Apps Admin SDK 始めないと!

# はじめに

[廃止予定の Google Apps 管理 API は 2015 年 4 月にサポート終了](http://googleappsupdates-ja.blogspot.jp/2014/10/google-apps-api-2015-4.html) ということで、[Provisioning API](https://developers.google.com/google-apps/provisioning/)から[Admin SDK](https://developers.google.com/admin-sdk/directory/) へ移行しないといけません。

というわけで、そのメモを書いていきます。

# 参考になりそうなとこ

- [Directory API: Getting Started](https://developers.google.com/admin-sdk/directory/v1/get-start/getting-started) を読むとなんか始まられそうです。まだ読んでませんが。
- [Google Apps AdminApi でユーザーを一括変更する](http://takuya-1st.hatenablog.jp/entry/2014/03/12/052848) すでに試している方がいますね。
- [google-api-ruby-client](https://github.com/google/google-api-ruby-client) これ使えそう。
metaio sdkで透過動画を表示するには


自分向けのメモです。

# 1. グレースケールで透過率を含む表現した動画を作成する。

「左半分に本来の動画、右半分にグレースケールで透明度のみの動画を配置した」3g2形式の動画ファイルを作成する。

例:
![スクリーンショット 2014-12-03 16.59.06.png](https://qiita-image-store.s3.amazonaws.com/0/37443/6b5bc2fe-5467-fc3f-6095-2948ce46ad8c.png "スクリーンショット 2014-12-03 16.59.06.png")

# 2. 動画ロード処理

```objective-c

// 第２パラメータをtrueにして透過動画であることを明示すること。
m_moviePlane =  m_metaioSDK->createGeometryFromMovie([moviePath UTF8String], true);
```


# flvから3g2に変換するには

```bash
FLV_NAME=test.flv
OUT_NAME=test.3g2
RESOLUTION=320x240
ffmpeg -i $FLV_NAME -vcodec mpeg4 -s $RESOLUTION -acodec libfaac $OUT_NAME
```

# 参考

tutorial
http://dev.metaio.com/sdk/tutorials/content-types/

movieについてのドキュメント
http://dev.metaio.com/content-creation/movie/
与えられたn個の数字から任意の2つの値の差が最小となる組み合わせを得る(VBS版)

今朝方投稿した奴のVBS版。
ArrayListとかいうの使わないとsort出来ないんですねVBSって

実行はcmdから cscript hoge.vbs

```
Dim arr,i
Dim tmpStr,tmpVal,minStr,minVal
Set arr = CreateObject("System.Collections.ArrayList")

arr.Add 1
arr.Add 2
arr.Add 111
arr.Add -2
arr.Add 3
arr.Add 5
arr.Add 12

arr.sort

minVal = arr(arr.count-1)-arr(0)

For i = 0 to arr.Count-2
	tmpVal = arr(i+1)-arr(i)
	tmpStr = arr(i+1) & "," & arr(i) & ":" & tmpVal
	
	if tmpVal = 0 then 
		WScript.echo tmpStr
		WScript.quit
	end if
	
	if minVal > tmpVal then 
		minVal = tmpVal
		minStr = tmpStr
	end if
Next

WScript.echo minStr
```


出力
2,1:1
Ruboty gem: ruboty-intercal_generator


初のRuboty Handlerです。

先日CodeIQのHubot問題で触ったこともありますので、言語ジェネレータ( https://github.com/cielavenir/codeiq_solutions/blob/master/codeiq2nd_intercal.rb )を題材にしてみました。

Intercalは変形xorを行って出力するので、そのやり方については↑の終端コメントを参照のこと。

## URL
http://rubygems.org/gems/ruboty-intercal_generator

## Base
ruboty-gen gem を使いました(`ruboty-gen gem intercal_generator`)。

## Handler
~~~rb
module Ruboty
  module Handlers
    class IntercalGenerator < Base
      on /intercal (?<text>.*)/, name: 'intercal', description: 'generate intercal code'

      def intercal(message)
        Ruboty::IntercalGenerator::Actions::Generate.new(message).call
      end
    end
  end
end
~~~

DSLの`name`とメソッド名を一致させる必要があるようです(未確認)。
`(?<text>.*?)`とかやると動きません。まあ、ミスる人は少ないとは思いますが。

## Action
~~~rb
require 'stringio'
module Ruboty
  module IntercalGenerator
    module Actions
      class Generate < Ruboty::Actions::Base
        def call
          ret=StringIO.new
          last=0
          siz=message[:text].bytes.to_a.size
          please=(siz+3)/4-2
          ret.puts "DO ,1 <- ##{siz}"
          message[:text].each_byte.with_index{|e,i|
            c = e
            c = (c & 0x55) << 1 | (c & 0xaa) >> 1
            c = (c & 0x33) << 2 | (c & 0xcc) >> 2
            c = (c & 0x0f) << 4 | (c & 0xf0) >> 4
            last2 = c
            c = (last-c)&0xff
            last = last2
            ret.print 'PLEASE ' if i<=please
            ret.puts "DO ,1 SUB ##{i+1} <- ##{c&0xff}"
          }
          ret.puts 'PLEASE READ OUT ,1'
          ret.print 'PLEASE GIVE UP'

          message.reply(ret.string)
        end
      end
    end
  end
end
~~~

この点について言及している入門サイトが少ない感じがしましたが、messageを呼ぶとHandlerのDSLに記述した正規表現から得られる連想配列(正確には[]でアクセスできるオブジェクト)が返ってくるようです。

## テスト
OSXの場合、Shell Adapterにマルチバイト文字列を貼り付けようとするとこけるので、rb-readline gemを導入した上で、`ruby -rrb-readline -S ruboty`と実行する必要がある。こういうところが地味にはまるんですよね…。

```
> ruboty intercal I ♥ CodeIQ.
DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #110
PLEASE DO ,1 SUB #2 <- #142
PLEASE DO ,1 SUB #3 <- #189
DO ,1 SUB #4 <- #174
DO ,1 SUB #5 <- #244
DO ,1 SUB #6 <- #161
DO ,1 SUB #7 <- #66
DO ,1 SUB #8 <- #204
DO ,1 SUB #9 <- #208
DO ,1 SUB #10 <- #128
DO ,1 SUB #11 <- #20
DO ,1 SUB #12 <- #8
DO ,1 SUB #13 <- #22
PLEASE READ OUT ,1
PLEASE GIVE UP
```

## 警告
```
WARN: Unresolved specs during Gem::Specification.reset:
      json (>= 1.7.7, ~> 1.7)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
```

こんな感じの警告が出る。しかもjson 1.7.7は標準ライブラリのようなので`gem cleanup`もできない。

`bundle exec ruboty`とすれば問題ない模様。ただし`bundle exec ruby -rrb-readline -S ruboty`は効かないので、OSXの標準Rubyを使う場合は諦めましょう。無視する分には大丈夫なようですので。

## 最後に
体験記みたくなってしまいましたが、多分問題ないかと>_<

## A言語/Brainf*ck
- http://rubygems.org/gems/ruboty-alang_generator
- http://rubygems.org/gems/ruboty-brainfuck_generator

Whitespaceは出力させてもあまり意味が無いことに気が付きました。
Jenkinsでスレーブとの接続ポートを固定化してみる



## どのポートを使うか決める

どこでもよさそうなので、ダイナミックポートから適当に選ぶ。
今回は 49600 を使用する。

### ウェルノウンポート 0-1023

* 決められているものが多々ある
* 使用しない

### 登録ポート 1024-49512

* 多くのソフトウェアで割り当てられる
* 使用可能なものもあるが、重複する可能性もある

### ダイナミック/プライベートポート 49513-65535

* 自由に使えるポート


## JNLPスレーブ用TCPポートを指定する

マスターにアクセスして以下を実施する。

1. [Jenkinsの管理] > [グローバルセキュリティの設定] を選択する
2. [セキュリティを有効化] をチェックする
3. JNLPスレーブ用TCPポート番号で [固定] を選択して任意のポートを設定する
4. [Enable Slave -> Master Access Control] をチェックする


## マスターのiptables設定変更

設定ファイルに追加する。

```:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 49600 -j ACCEPT
```

iptablesを再起動する。

```bash
$ sudo service iptables restart
```


## 参考

* [Jenkinsスレーブとの接続ポートを固定する方法](http://qiita.com/oh_rusty_nail/items/553314e3cc4fbc283641)