OmniAICreator/Qiita-1.07M huggingface dataset:
node.js + mysql

---
###メモ
基本的なメモ。

###モジュールのインストール

```
sudo npm install -g mysql
```
別に-gはあってもなくても。

###簡単なサンプル

```db.js
var mysql = require("/usr/local/lib/node_modules/mysql");
var connection = mysql.createConnection({
	host:"localhost",
	database:"testdb",
	user:"dbuser",
	password:"dbpassword"
});

//select
var query = connection.query("select * from members",function(err,results){

	//display error
	if(err){
		console.log(err);
		return;
	}

	//get rows
	for(var i in results){
		console.log(results[i].name + " " + results[i].email);
	}
});

//insert
var query2 = connection.query("insert into members(name,email) values('test','test@test.com')");

connection.end();
```
webdriverjs + jasmine-nodeでWebテストをする。（各種input制御）

---

###やりたいこと

webdriverjsでの各種入力項目の制御方法が知りたい。

###まとめ

自分で書いたHTMLならidとかclassをきちんと入れられるので問題なさそう。
基本、sendKeys()とclick()でなんとなりそう。

###テストを書く

```input.spec.js
var webdriver = require("/usr/local/lib/node_modules/selenium-webdriver");

var driver = new webdriver.Builder()
    .withCapabilities(webdriver.Capabilities.chrome())
    .build();

describe('input test',function(){

	it('input',function(done){

		driver.get("http://localhost/input.html");

		//各要素を選択

		//text
		var name = driver.findElement(webdriver.By.id("name"));
		name.sendKeys("hoge");

		//radio
		var man = driver.findElement(webdriver.By.id("man"));
		man.click();

		//checkbox
		var check_a = driver.findElement(webdriver.By.id("check_a"));
		check_a.click();

		//select
		var area = driver.findElement(webdriver.By.id("area"));
		area.sendKeys("osaka");

		//submit
		var btn_submit = driver.findElement(webdriver.By.id("btn_submit"));
		btn_submit.click();

		//終わり
		driver.quit().then(function(){
			done();
		});
	});
});
```

###テスト（制御）対象のHTML

```input.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
</head>
<body>
<form action="res.php" method="post">
name:<input type="text" id="name" name="name"><br>
man:<input type="radio" id="man" name="gender" value="man">woman:<input type="radio" id="woman" name="gender" value="woman"><br>
a:<input type="checkbox" id="check_a" value="a" name="check_a">b:<input type="checkbox" id="check_b" value="b" name="check_b"><br>
<select id="area" name="area">
	<option value="tokyo">TOKYO</option>
	<option value="osaka">OSAKA</option>
</select><br>
<input type="submit" value="send" id="btn_submit">
</form>
</body>
</html>
```
webdriverjs + jasmine-nodeでWebテストをする。（alert,confirm処理）

---

###やりたいこと
webdriverjsでalertやconfirmのあるUIを制御する方法。
ajaxでUI作った場合は必須。

###テストを書く
alertもconfirmもdriver.switchTo()で取得する。そしてaccept(),dismiss()で対応。

```ajax.spec.js
var webdriver = require("/usr/local/lib/node_modules/selenium-webdriver");

var driver = new webdriver.Builder()
	.withCapabilities(webdriver.Capabilities.chrome())
	.build();

describe('ajax test',function(){

	it('alert',function(done){

		//ページにアクセス
		driver.get("http://localhost/js.php");

		//ボタンを取得
		var btn = driver.findElement(webdriver.By.id("btn"));
		btn.click();

		//とりあえずボタンクリック（空入力のまま）
		var alert = driver.switchTo().alert();
		alert.getText().then(function(text){

			//console.log(text);
			expect(text).toBe("何か入れて下さい。");
			alert.accept();

		});

		//名前入力欄を取得
		var name = driver.findElement(webdriver.By.id("name"));
		//入力
		name.sendKeys("hoge");

		//再度クリック
		btn.click();

		//確認画面
		var alert2 = driver.switchTo().alert();
		alert2.getText().then(function(text){
			//console.log(text);
			expect(text).toBe("登録しますか？");
			//OK
			alert2.accept();
			//cancel
			//alert2.dismiss();
		});

		var alert3 = driver.switchTo().alert();
		alert3.getText().then(function(text){
			//console.log(text);
			expect(text).toBe("登録しました。");
		});
		

		driver.quit().then(function(){
			done();
		});

	});

});
```

###テスト対象
いちおう。

```js.php
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script>
$(function(){
	$("#btn").click(function(){

		var name = $("#name").val();

		if(name == ""){
			alert("何か入れて下さい。");

			return false;

		}else{
			
			if(confirm('登録しますか？')){

				alert("登録しました。");

			}else{

				alert("処理はキャンセルされました。");

			}
		}
	});
});
</script>
</head>
<body>
<input type="text" id="name">
<input type="button" id="btn" value="send">
</body>
</html>
```
[Swift]AnyObjectではなくIntで現在時刻を取得する

#現在時刻を取得する
```swift
let now = NSDate() // 現在日時の取得
let dateFormatter = NSDateFormatter()

dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") // ロケールの設定

dateFormatter.timeStyle = .MediumStyle
dateFormatter.dateStyle = .MediumStyle
println(dateFormatter.stringFromDate(now)) // -> "2014/11/02 10:32:22"
```

#日付を取って、時刻だけ残す
```swift
var strArray:NSArray = dateFormatter.stringFromDate(now).componentsSeparatedByString("/")[2].componentsSeparatedByString(" ")[1].componentsSeparatedByString(":")
// ->　["10", "32", "22"]
```
時間、分、秒の値をそれぞれ配列に入れることができた。

#一桁だったら頭に0をつけたい
時間(hour)が一桁の場合(ex.8時)、「8」だけになる。これを「08」と表示したいと思った。

**数値比較を試みる**
数値を比較して条件を分けて、先頭に「0」足すことを考える。

```swift
strArray[0] < 10
```
「Cannot invoke '<' with an argument list of type '(AnyObject,IntegerLiteralConvertible」とエラーが出る。時間が入っている「strArray[0]」はAnyObjectみたいなので、型変換が必要だ。

**AnyObjectをIntに変換したいが・・・**
```swift
strArray[0] as? Int // -> nil
strArray[0] as? NSInteger // -> nil
```

しかしなぜかnilになってしまい、if文で判定することができなかった。

#NSCalendarを使う

```swift
let date = NSDate() // -> "Nov 2, 2014, 10:32 AM"
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute | .CalendarUnitSecond, fromDate: date)
let hour = components.hour // -> 10
let minutes = components.minute // -> 32
let second = components.second // -> 22
```
hour,minutes,secondはIntなので、大小比較ができた。これを使えば、先頭に「0」をつけることができました。



**参考**
[How to get the current time(and hour) as datetime - Swift](http://stackoverflow.com/questions/24070450/how-to-get-the-current-timeand-hour-as-datetime-swift)
[[Swift]NSDateComponentで日付の各要素を取得](http://qiita.com/ktanaka117/items/3da52c606f9362feda25)
日本語入力モードをオフにするのはGoogle IMEにやらせればいい

変換前入力中と、変換中に`Ctrl c`をしたら日本語入力モードをオフにする。
もちろん`ESC`も`Ctrl [`を追加してもいいと思います。

前からやってたんですが、新しいMac買ってしばらく設定忘れていてストレスだったのでメモ。

![googleime](http://gifzo.net/km03C1PJuG.gif)
OverloadedStrings


https://www.haskell.org/ghc/docs/7.6.1/html/users_guide/type-class-extensions.html#overloaded-strings

Haskell初心者メモ

`OverloadedStrings` をつけると文字列リテラルを書いた時に `String` 型ではなく `(IsString a) => a` 型になる。整数リテラルを書いた時に `Int` 型ではなく `(Num a) => a` 型になるのと似ている。

オプションなしでこういう挙動でない理由を推測するに、文字列に多様な型表現があることが整数リテラルほど自明ではなかったからだろうか。整数リテラルでは32ビット整数、64ビット整数、多倍長整数などがありそうだということがCプログラマにも直感的にわかる。

Haskell 2010 の [2.6 Character and String Literals](https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-200002.6) では

> String literals are actually abbreviations for lists of characters

と書かれているので、仕様としては `[Char]`。それ以上のことは書かれていない（だから拡張してるのだろうけど）。

`IsString` の instance さえあれば、自分で定義した型でも文字列リテラルとして表現できるのは便利、、かな？
Text, ByteString を扱うときにはとても便利そう。
AndroidStudioでMessagePack

AndroidStudioで[MessagePack](http://msgpack.org/)を使いたいなあと思って調べてたんですがMavenでの方法しかヒットしなかったので。

結局build.gradleに
`compile 'org.msgpack:msgpack:0.6.9'`
追加するだけであっさりいけました・・・
Java入門：第1回 クラスの定義とメインメソッド

## クラスの定義とメインメソッド

Javaのプログラム作成から実行までの流れを見ていきましょう。

```java
public class HelloWorld {
     public static void main(String [] args) {
          System.out.println("Hello World");
     }
}
```

これは実行可能なJavaの一番短いプログラムです。このように記述したプログラムのことをソースコードといます。記述されている単語にはそれぞれ意味がありますが、このプログラムはコンソールと呼ばれる場所に、Hello Worldをと出力するだけのものになります。

これらの意味をすべて理解するのは難しいのでまずは次のように理解し、ポイントを抑えましょう。

* Javaではclassという定義を行うと、HelloWorldという名前のプログラムであるという意味になる
* mainという部分の中に書いた命令が実行される
* Javaでは{}(中括弧)がなんらかの範囲を示し、;(セミコロン)が命令の終わりを示す

Eclipse上でエラーになっていないかよく確認しましょう。エラーになっている場合は次の点に注意しましょう。

* Javaは大文字小文字の区別する
* 全角半角の区別を行い、基本的に半角でプログラムを記述するようにしましょう
* 左余白(左インデント)を常に意識するようにしましょう
* 紛らわしい文字に注意しましょう（printlnとprintInなど）
Java入門：第2回 演算

## 演算
今回はJavaを利用した演算について確認していきます。前回、次の用のコードを記述しました。

```java
public class HelloWorld {
     public static void main(String [] args) {
          System.out.println("Hello World");
     }
}
```

の`System.out.println()`を次のように書き換え足し算を行ってみましょう。

```java
          System.out.println(3+5);
```

実行すると8と出力されます。次に引き算はマイナスで、次のように記述します。

```java
          System.out.println(3-5);
```

それでは掛け算とわり算はどのように記述すればいいでしょうか。掛け算は*(アスタリスク)を利用し、割り算は/(スラッシュ)を利用して計算を行うことができます。

```java
          System.out.println(3*5);
          System.out.println(3/5);
```

足し算から割り算までを実際に実行すると次のように表示されます。

```java
8
-2
15
0
```

割り算の実行結果が0になっていて正しい値ではありません。

```java
          System.out.println(3.0/5.0);

```

とすることで

```java
0.6
```

と正しい値が表示されるようになりました。これらの違いについては型という概念が出てきたところで再度説明します。
次にHello Worldと表示した時のよう""(ダブルコーテーション)囲むとどうなるか確認してみましょう。

```java
          System.out.println("3+5");
```

3+5と表示されました。このように数字ではなくて文字の集まり（文字列）を表示させるには""(ダブルコーテーション)で囲むようにします。

例えば、文字列が複数あった場合、

```java
          System.out.println("Hello" "World");
```

と記述するとコンパイルエラーになってしまいます。同時に表示するにはどうすればよいか。

```java
          System.out.println("Hello");
          System.out.println("World");
```

と記述すると改行されてしまいます。文字列をくっつけて出力するにはどうすればいいでしょうか。文字列をくっつけることを連結といいます。文字列の連結にはJavaでは+記号を利用する決まりになっています。

```java
          System.out.println("Hello"+"World");
```

これでHelloWorldと出力されるようになりました。文字列の連結の+と足し算の+を同時に利用するとどのようになるでしょうか。

```java
          System.out.println("Hello"+"World"+3+5);
          System.out.println(3+5+"Hello"+"World");
```

といったコードがあったときに、出力は次のようになります。

```java
HelloWorld35
8HelloWorld
```

はじめに文字列の連結があると、以降すべて文字列の連結として扱われてしまい、3+5の演算は実行されず、35と出力されてしまいます。3+5と出力する場合は、()で囲むことで演算の優先順位を上げることができます。

```java
          System.out.println("Hello"+"World"+(3+5));
```
Java入門：第3回 変数と型

### 変数と型

次のような引き算を行い、その結果を出力するような命令についてといった命令があった時に3,5のことを値といいます。

```java
          System.out.println(3-5);
```

専門用語で値そのもののことをリテラルといいます。Javaでは3などの値を整数リテラルといい、3.2などの浮動小数点を含む値のことを浮動小数点リテラルといいます。各リテラルには別の名前を付けて管理することができます。このリテラルに名前を付けたものを変数と言います。

リテラルに名前をつけるには=という演算子を利用します。=は代入演算子といって右辺と左辺を結びつける役割を持ちます（ホントはここで図を書いて説明する）。

つまり次のように記述できるわけです。

![2014-11-02 09_06_32-.png](https://qiita-image-store.s3.amazonaws.com/0/22658/9b01a7de-1b81-6621-8748-d3fdf52da69a.png)

```java
x = 3;
y = 3.2;
```

ただし上記はコンパイルエラーとなります、この時、Javaは3を整数リテラル、3.2を浮動小数点リテラルと自動で認識しています。Javaは整数リテラルをint（整数）のグループと認識し、浮動小数点リテラルはdobuleというグループと認識します。これらリテラルの種類のことを型と呼びます。Javaでは値を別名で管理する場合に、右辺と左辺の型を合さなければいけないというルールが有り、3がint（整数）であるのに対し、xがどのような型か何かわからないのでコンパイルエラーとなるのです。

そこでこのxが整数であることを示すために、

![2014-11-02 09_08_15-.png](https://qiita-image-store.s3.amazonaws.com/0/22658/a06bd756-0ae4-a349-b904-caf1684e0338.png)

```java
int x = 3;
```

のように記述するとコンパイルができるようになります。同様に3.2などの浮動小数点を含む数値の場合は、

```java
double y = 3.2;
```

と記述し、右辺と左辺の型を合わせます。

このように値（リテラル）のみ保持するJavaの型を基本型（プリミティブ型）と呼びます。基本型は次のようなものがあります。

【整数値】

| 名称  | 大きさ   |
|:------|------:  |
| byte  | 1バイト |
| short | 2バイト |
| int　 | 4バイト | 
| long　| 8バイト | 
| char  | 16バイト|

【浮動小数点値】

| 名称    | 大きさ   |
|:------ |------:  |
| float  | 4バイト |
| double | 8バイト |

【真偽値】

| 名称    | 大きさ   |
|:------ |------:  |
| boolean　| true/flase |

整数と浮動小数点値の他にbooleanという型があります。この型は正しい（真）、正しくない（偽）のみを格納する型で、正しいをtrue、正しくないをflaseという値で表現します。よく使うので覚えておきましょう。
データコンテナの使い方

# 他のコンテナと共有できるようにVOLUME設定

```bash:Dockerfile
FROM busybox
VOLUME /var/log/rsyslog
ENTRYPOINT tail -f /dev/null
```

```bash:
docker build -t private/data:rsyslog .
```

## 他のコンテナから利用してみる

```bash:
docker run -d --name data_rsyslog private/data:rsyslog

docker run --privileged -it -d \
  --name rsyslog \
  --volumes-from data_rsyslog \
  -p 514:514/udp -p 514:514/tcp -p 8080:80 \
  tukiyo3/centos7-rsyslog
```

```bash:データが書き込まれていることを確認
docker exec -it data_rsyslog find /var/log/rsyslog/ -type f
```

## データコンテナに入る方法

```bash:データが書き込まれていることを確認
docker exec -it data_rsyslog sh
```
Java入門：第4回 型変換

### 型変換
　前回、3や3.5などの値そのものをリテラルと呼び、3などの整数値はint型であり、3.5などの浮動小数点値はdouble型であると述べました。Javaでは整数を示す型はbyte, short, int, longと４つの型があり、浮動小数点値を示す型はdoubleとfloatの2つの型があると述べました。

また変数を定義する際は左辺と右辺の型を合わせる必要があると述べました。

するとここで次のような疑問が出てくると思います。

```java
int i = 3;
```
はOKとして、

```java
byte b = 3;
short s = 3;
long l = 3;
```

は3がint型であるならば、左辺と右辺の型が異なるため、代入が出来ないのではないか？

実際に確認すると、これらは代入可能です。自動的にbyteリテラルやshortリテラルに変換されます。ただし、例えばbyteは8ビット整数なので最大値が127になります。

```java
byte b = 127;
```
は大丈夫ですが、

```java
byte b = 128;
```
はコンパイルエラーになります。

また、

```java
int i = 127;
byte b = i;
```

はコンパイルエラーになります。あくまで自動解釈されるのはリテラルに対してなので、int型の変数をbyte型の変数に代入する場合は、精度が落ちる可能性があり代入できません。

プログラマーの意思で強制的に代入する場合は、

```java
byte b = (byte)i;
```

と記述します。この時、(byte)のように、(型)という記述をキャスト（強制型変換）と言います。キャストを行った場合は、次のように思った値にならない場合があるので注意が必要です。

```java
int i = 128;
byte b = (byte)i;
System.out.println(b);
```

次に浮動小数点値はどのようになるか確認してみましょう？

```java
double d = 3.5;
float f = 3.5;
```

float f = 3.5;でエラーとなりました。エラーメッセージを確認すると「double型をfloat型に代入できません」と表示されます。
浮動小数点値の場合はdoubleの3.5をfloatに代入する場合は、精度が落ちる可能性があるのでそのままでは代入できません。

```java
float f = (float) 3.5;
```

のようにキャストを行うか、3.5をfloat型のリテラルとするために、3.5の後にfまたはFを付けます。

```java
float f = 3.5f;
float f = 3.5F
```

fまたはFでここでは大文字小文字区別しません。同様のものに

```java
long l = 12345678901;
```

などがあります。この場合、12345678901がint型のリテラルと解釈しようとするのですが、intの最大値を超えるのでエラーとなります。この場合、12345678901がlongのリテラルであることを明示するために、

```java
long l = 12345678901L;
```

とします。

```java
long l = 12345678901l;
```

と小文字のエルでも問題ありませんが、I（大文字アイ）、1（イチ）、l(小文字のエル）で間違いやすいのでL（大文字エル）を使うとよいでしょう。

また、資格試験によく出るのですが、

```java
float f = 3.5;
```

はコンパイルエラーになるのですが、

```java
float f = 1;
```

はコンパイルエラーにはなりません。1が1.0というfloat型と拡大解釈されて代入することができます。こういった精度が落ちない変換を拡大変換といいます。

一方

```java
int i = 3.5;
```

は3.5が3になった場合、0.5値を失うことになるので、拡大変換は行われず代入をすることができません。このような場合は、キャストなどを使って強制的に型変換を行います。これらを縮小変換といいます。

### まとめ

* 整数値はint型のリテラルであり、浮動小数点値はdouble型のリテラルである
* リテラルを基本型に代入する場合、精度が落ちない場合自動変換される（拡大変換）
* 精度が落ちる場合は、キャストを行い強制的に型変換を行う必要がある（縮小変換）
* int型のリテラルをlong型のリテラルに変える場合は、lまたはLをつける、double型のリテラルをfloat型のリテラルに変える場合はfまたはFをつける
[Swift]多次元配列の宣言の仕方

#多次元配列の宣言の仕方

**誤った宣言**

```swift
let matrix:String[][] = [["hoge","fuga"] ,["ohayo","hello"]]
```
「Array types are now written with the brackets around the element type」というエラーが出ます。

**正しい宣言**

```swift
let matrix:[[String]] = [["hoge","fuga"] ,["ohayo","hello"]]

println(matrix[0][1])//"fuga"
```
二重括弧の中に型名を入れると動くようです。
Java入門：第5回 処理の制御（while文とfor文）

## はじめに
今回は処理の繰返しであるwhile文とfor文について学びます。その前に、処理の流れを確認しましょう。

```java
public class HelloWorld {
　　static public  void main(String [] args) {
　　　　//処理
    }
}
```

Javaではmainメソッドの中に記述した処理（命令：ステートメント）が上から順番に実行されていきます。これらの処理の流れを制御することをフロー制御と言います。フロー制御には繰り返し処理と条件分岐処理の2つがあります。繰り返し処理にはwhile文とfor文の2つがあります。まずwhile文から確認してきましょう。ちなみにwhileは「時間を経過させる」といった意味になります。

## 1. while文

```java
while(条件) {
    //処理
}
```

と記述すると()内に記述した「条件」が正しい間、処理を繰返します。例えば次のように記述すると

```java
int x = 0;
while (x<20) {
    System.out.println("x=" + x);
    x = x + 3;
}
```

と記述すると、「xの値が20より小さい」ということが正しい間、処理を繰返します。

実行すると次のように表示されます。

```java
x=0
x=3
x=6
x=9
x=12
x=15
x=18
```

###【注意】

次のように記述するとうまく行きませんので注意が必要です。

```java
int x = 0;
while(x < 20); {
     System.out.println("x=" + x);
     x = x + 3;
}
```
このコードはどこに誤りがあるでしょうか、実はこのコード次の次のような処理になっています。

```java
int x = 0;
while(x < 20)　//処理A;
{
     System.out.println("x=" + x);
     x = x + 3;
}
```

while(条件)の後に{}が無い場合は、直後の「処理A」が実行されます。;のみの記述であれば、何も実行しないので、xが0のままなので、処理Aがずっと実行される状況（無限ループ）になります。

## 2. for文

while文で繰り返し処理を記述した場合は、終了の条件はわかりやすいのですが、処理を何回繰り返したかはわかりにくいです。処理の回数を指定したい場合は、for文という繰返し処理を利用します。for文は次のように記述します。

```java
int x = 0;
for (int i = 0; i < 5; i++) {
     System.out.println(i + "回目の繰返し:x=" + x);
     x = x + 3;
}
```

実行すると次のように表示されます。

```java
0回目の繰返し:x=0
1回目の繰返し:x=3
2回目の繰返し:x=6
3回目の繰返し:x=9
4回目の繰返し:x=12
```

for文の()の中の意味は、for(初期値; 終了条件; 継続処理)となりますが、初めはfor(int i = 0; i < 繰返したい回数; i++)と記述し、繰り返す回数を意識するようにしてみましょう。

###【補足1：代入演算子】

```java
x = x + 3;
```

は現在のxに3を足して、xに再度代入するという意味です。次のように記述することも出来ます。

```java
x += 3;
```

+=の他には、-=や*=、/=などあり代入演算子と呼ばれます。

###【補足2：変数の適用範囲】
変数には利用できる範囲が存在します。この範囲のことを変数のスコープといいます。スコープを理解しないと、コンパイルエラーになるので注意しましょう。基本的に変数は定義した{}のブロック内で有効になります。

```java
for (int i = 0; i < 5; i++) {
     System.out.println(i + "回目の繰返し:x=" + x);
     x = x + 3;
}
```

この場合、変数は、for文の{}内のみで有効なので次のように記述するとコンパイルエラーになります。

●有効範囲外で利用した場合

```java
for (int i = 0; i < 5; i++) {
     System.out.println(i + "回目の繰返し:x=" + x);
     x = x + 3;
}
System.out.println(i);
```

変数iをfor文の外で利用したい場合は次のように記述します。

```java
int i;
for (i = 0; i < 5; i++) {
     System.out.println(i + "回目の繰返し:x=" + x);
     x = x + 3;
}
System.out.println(i);
```

●有効範囲内で重複定義した場合

```java
for (int i = 0; i < 5; i++) {
　　int i = 10;
     System.out.println(i + "回目の繰返し:x=" + x);
     x = x + 3;
}
```
RVMによるrubyのインストール、vagrantのCentOS環境で。


最初に、

```bash
curl -L https://get.rvm.io | bash -s
```

を実行すると途中で以下のようなメッセージが出るので、

```
  * To start using RVM you need to run `source /home/vagrant/.rvm/scripts/rvm`
    in all your open shell windows, in rare cases you need to reopen all shell windows.
```

実行する。

```bash
source /home/vagrant/.rvm/scripts/rvm
```

次に以下を実行。

```bash
rvm get stable
```

以下のようなエラーが出るので、

```
gpg: 署名を検査できません: No public key
Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found.
Assuming you trust Michal Papis import the mpapis public key (downloading the signatures).

GPG signature verification failed for '/home/vagrant/.rvm/archives/rvm-installer' - 'https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer.asc'!
try downloading the signatures:

    gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
```

以下を実行する。

```bash
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
```

もう一回。

```bash
rvm get stable
```

次に以下を実行。

```bash
rvm requirements
```

以下の様なエラーが出るので、

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```

以下のファイルを編集する。

```bash
sudo vim /etc/yum.repos.d/epel.repo
```

コメントアウトされてる部分を取り替える。

```bash
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
```

```bash
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
```


もう一回。

```bash
rvm requirements
```

最後にrubyのインストール。

```bash
rvm install 2.0.0 --with-openssl-dir=$HOME/.rvm/usr
```

成功した。

```
ruby -v
ruby 2.0.0p594 (2014-10-27 revision 48167) [x86_64-linux]
```
rsyslogイメージ作った

## 参考

* [シスログの管理 rsyslog.conf の設定 〜 CentOS6 | EasyRamble](http://easyramble.com/configure-rsyslog.html)

# 使い方

* [DockerHub - データコンテナの使い方 - Qiita](http://qiita.com/tukiyo3/items/d123e1f9703154fd79b1)参照。

# rsyslogサーバに情報を送るには以下設定。

```bash:/etc/rsyslog.conf
*.* @@(z9)192.168.100.4:514
# 名前解決出来る場合は
*.* @@(z9)rsyslog:514
```

```bash:
systemctl restart rsyslog
```

* http://docker-ip:8080/ にアクセスすると、/var/log/rsyslog/ を閲覧できる。

# 以下セットアップメモ

## インストール

```bash:インストール
yum install -y rsyslog
systemctl start rsyslog
```

## 設定

```bash:/etc/rsyslog.d/custom.conf
# UDPで受信
$ModLoad imudp
$UDPServerRun 514

# TCPで受信
$ModLoad imtcp
$InputTCPServerRun 514

# /var/log/rsyslog/出力元ホスト名/出力元プログラム名/YYYY-MM-DD.log という書式
$template DynamicFile,"/var/log/rsyslog/%hostname%/%programname%/%timegenerated:1:10:date-rfc3339%.log"
# ファシリティ.プライオリティとログ出力先を指定
*.*  -?DynamicFile
```

フォルダは自動生成されるので、/var/log/rsyslog/ フォルダを手で作る必要はない。

# ログ転送元にて設定

```bash:
*.* @@(z9)192.168.100.4:514
```

* *.* 全てを送信
* @@ TCPで送信
* (z9) 圧縮レベル9で送信
* 192.168.100.4 送信先のIP
* :514 送信先ポート番号
* [第20章 ログファイルの表示と管理](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-Viewing_and_Managing_Log_Files.html)

# 過去ログを圧縮

以下cronに登録

```bash:本日以外のログを圧縮
10 0 * * * gzip $(find /var/log/rsyslog -type f -name "*.log" | grep -v $(date -I))
```

```bash:こっちでもいい
10 0 * * * gzip $(find /var/log/rsyslog -type f -name "*.log" -mtime +0)
```

# phpからsyslogを送る

[PHP: syslog - Manual](http://php.net/manual/ja/function.syslog.php)を使う。

```php:
<?php
openlog("myprogram", 0, LOG_LOCAL0);
syslog(LOG_DEBUG, "My syslog message");
```
scalaのFutureの並列に実行されない書き方とされる書き方

# 並列に実行されない書き方

```scala
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val start = System.currentTimeMillis
for{
  _ <- Future(Thread.sleep(3000))
  _ <- Future(Thread.sleep(3000))
} yield println("the process time is " + (System.currentTimeMillis - start) + " msec.")
// the process time is 6141 msec.
```

# 並列に実行される書き方

```scala
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val start = System.currentTimeMillis
val a = Future(Thread.sleep(3000))
for{
  _ <- Future(Thread.sleep(3000))
  _ <- a
} yield println("the process time is " + (System.currentTimeMillis - start) + " msec.")
// the process time is 3195 msec.
```

# 解説
for式の中では、Futureを使っていても前から順番に、前の処理が終わってから次の行に進む。**前の処理結果を次の行で使うかもしれないから**。なので「並列に実行されない書き方」がそうなるのは、そりゃそうだ。

「並列に実行される書き方」は、 `val a = Future(Thread.sleep(3000))` の行に来た時点でFutureの中の処理が始まり、Futureなので中の処理終了を待たずに次の行に進む。それからfor式の中では最初の`_ <- Future(Thread.sleep(3000))`が終わってから`_ <- a`に来るわけだけれど、`a`に代入した時点で処理はスタートしてるので`_ <- a`では処理結果を取り出すだけ、という感じになる。

# あとがき
書いてみると簡単な話だけど、最近までここらへんの理解が曖昧だった。あんまりこういうこと書いてくれてる資料ってなかったんですよね、あったら教えて下さい。
Windows 7 で外付け英語USBキーボードの設定をする



## Caps <-> Ctrl key

* Microsoft の Ctrl2Cap を使う


## 外付けキーボードを英語配列にする

外付けUSBキーボードの場合は、以下で成功した。
結局、USBのポートを指定したレジストリの変更しかないのかな…

[ＵＳＢ英語キーボード付けた。（英語、日本語キーボードの共存、KeyboardTypeOverride） 202122](http://202122.iku4.com/%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/%EF%BD%95%EF%BD%93%EF%BD%82%E8%8B%B1%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E4%BB%98%E3%81%91%E3%81%9F%E3%80%82%EF%BC%88%E8%8B%B1%E8%AA%9E%E3%80%81%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89 "ＵＳＢ英語キーボード付けた。（英語、日本語キーボードの共存、KeyboardTypeOverride） 202122")


### 英語キーボード

以下、効果なかった。外付けキーボードだから?

[キーボード レイアウトを変更する - Microsoft Windows ヘルプ](http://windows.microsoft.com/ja-jp/windows/change-keyboard-layout#1TC=windows-7 "キーボード レイアウトを変更する - Microsoft Windows ヘルプ")

下記ソフトは、効果なかった。理由は不明。
[キーボード切り替えツール2の詳細情報 : Vector ソフトを探す！](http://www.vector.co.jp/soft/winnt/util/se505248.html "キーボード切り替えツール2の詳細情報 : Vector ソフトを探す！")

結局レジストリをいじる

[Windows 7 のキーボードを英語キーボードに変更 | へーいち の うぇぶろぐ](http://blog.heiichi.com/?eid=792239 "Windows 7 のキーボードを英語キーボードに変更 | へーいち の うぇぶろぐ")

## Google IME ON, OFF

英語キーボードだと、非常に面倒なことになる

* [The New World Industrial - WindowsのUSキーボードでIME OFF/ONを左/右Winキーにバインドする](http://imdev.tumblr.com/post/47432698183/windows-us-ime-off-on-win "The New World Industrial - WindowsのUSキーボードでIME OFF/ONを左/右Winキーにバインドする")

* [US配列キーボード使用時に右altでIME ON/OFF : 金魚とレーザー光線](http://blog.livedoor.jp/goldfish_and_laser/archives/3529414.html "US配列キーボード使用時に右altでIME ON/OFF : 金魚とレーザー光線")



## 立ち上げると、Num Lock問題
Raspberry Piで音を出すまで

#はじめに
Sonic piを試したかったのですが、音を出すのに少し手間取りました。
手順をシェアしておきます。

HW: Raspberry pi model B+
OS: raspbian (version: September 2014 release date: 2014-09-09)

モニターはSAMSONGのプラズマディスプレイです。HDMI接続しています。

以下のページが参考になります。
http://elinux.org/R-Pi_Troubleshooting#Sound
このページですでに色々試している方は、amixerのオートは使わないで、もう一度やってみて下さい。
この記事のポイントはそれだけです、、、。

#準備
まずはテスト用のhello_audio.binを作成します。
```
cd /opt/vc/src/hello_pi/
./rebuild.sh
```
音声出力はアナログ（=ヘッドフォンジャック）とHDMIがあります。
始めはヘッドフォンでチェックした方が簡単です。

#アナログ（ヘッドフォン）
ヘッドフォンを接続して次のコマンドを実行して下さい。
```
/opt/vc/src/hello_pi/hello_audio/hello_audio.bin
```
これで音がなるはずです。次にspeaker-testで音が鳴るか試して下さい。

```
#出力をアナログ（=ヘッドフォンジャック）に固定
amixer cset numid=3 1
#テスト
speaker-test -t sine -f 600
```
僕が試した時は、出力をアナログに固定しないと、音が出ませんでした。
デフォルトはオート（アナログ出力とHDMI出力兼用）なのですが、これに問題があるのかもしれません。

次にwavファイルの再生を試してみます。
```
aplay /usr/share/sounds/alsa/Rear_Center.wav
```

これで音がなればアナログはOKです。
なお、piユーザーがaudioグループに入っていないと、aplayコマンドでwav再生は出来ないそうです。
僕の環境ではデフォルトで設定されていました。

#HDMI

HDMIで音を出す前に、/boot/config.txtを変更する必要があります。
次の一行をコメントアウトして下さい。これをしないと一部のモニターではHDMIで音が出ないそうです。
```
hdmi_drive=2
```
変更したらリブートして下さい。音が出るかのテストはアナログとほぼ同じです。

```
#出力をHDMIに固定
amixer cset numid=3 2
#音が鳴るか確認
/opt/vc/src/hello_pi/hello_audio/hello_audio.bin
#スピーカーテスト
speaker-test -t sine -f 600
#wavテスト
aplay /usr/share/sounds/alsa/Rear_Center.wav
```
gitのマージ時に、優先したいブランチを決める方法

##優先するブランチを決めたい

```
   % git checkout --ours **
```
--oursはマージ先

```
   % git checkout --theirs **

```

--theirsはマージ対象

##マージを取り消したい

そもそもマージを取り消したい時は

```
   % git merge --abort
```
Xdebugのログを消したらローカルマシンの容量が40GB増えた話

最近Macの容量が逼迫してきたな…と思い、/var/tmp以下を調べてみることに.
何かのファイルが大部分を占めている.

```bash
$ ls /private/var/tmp
cachegrind.out.11172    <-これ
cachegrind.out.285              
cachegrind.out.47230            
cachegrind.out.67972            
cachegrind.out.91700
cachegrind.out.11349            
cachegrind.out.28535
...
``` 

Xdebugが有効になっていると吐くログらしい.
特に必要がないため消す.

削除
$ sudo rm /private/var/tmp/cachegrind.out.*

再度容量を確認したところ,40GB程減っていることを確認.
Oh...

参考:http://www.alcoholical.com/tag/cachegrind-out/
ST3でstylusを使うと日本語が入力できない


![stylus.gif](https://qiita-image-store.s3.amazonaws.com/0/39134/68efc509-1ba5-5934-0f6b-fe7486302907.gif "stylus.gif")

## 対処方法

Stylusのアンインストール（Remove Packages）


ライブラリ/Application Support/Sublime Text 3/Packages

に移動して、

```
git clone https://github.com/billymoon/Stylus/
```

その中にある

Default.sublime-keymapを編集する。
8~11行目をコメントアウト。

```
        // "key": "setting.auto_indent",
        // "operator": "equal",
        // "operand": true,
        // "match_all": true

```

これで日本語が動くと同時にオートインデントがきれます。

## おわりに
オートインデントのほうが便利なので、日本語は入力しない方向で僕は作業を進めることにしました。

<a href="https://github.com/billymoon/Stylus/issues/45" target="_blank">Japanese can not be input</a>

作成者のbillymoonさんありがとうございました。
Using Jest testing from Gulp


I didn't find any good solutions searching around for "gulp jest testing", so I'm going to write up what I did.


## Solution

```js
var gulp = require('gulp');
var gutil = require('gulp-util');
var jest = require('jest-cli');
var chalk = require('chalk');

gulp.task('test:jest', function (callback) {
  var onComplete = function (result) {
    if (result) {
    } else {
      console.log(chalk.bgRed('!!! Jest tests failed! You should fix them soon. !!!'));
    }
    callback();
  }
  jest.runCLI({}, __dirname, onComplete);
});
```


## Call for critique

Is there even a need to use jest-cli? Is there a simpler way I should do this? I only figured this out from reading jest-cli source code, since there's basically no documentation I found on the actual Jest docs site (or the README on Github).


## Reference

I have a silly project on GitHub for basic React stuff that I continually slowly update. Check it out if you please: https://github.com/kimagure/ShowTrackerReact
Wordpressのパスワード再発行時に文字数制限を掛ける

wordpressのユーザ登録権限を一般開放する際、
(たとえば会員制サイトを制作する時など)
パスワード再発行時に使用するフォームにて、
入力可能な文字数に制限を掛けるスクリプトを作った。

wordpressの仕様では、ユーザが設定できるパスワードについて
「7文字以上でご入力ください」とヒント欄にて触れているものの、
実際には制限が掛かってない。自由。
だが許されざる自由も、まれにある。

Login Security Solutionプラグインを導入する手もあるが、
各々に影響の出るシステムを導入するよりは、
登録画面のみにjQueryを走らせた方が楽かなと。

という訳で以下をfunctions.phpに記述。

```
function edit_resetpass_login(){
  $input_act = filter_input(INPUT_GET, 'action');
  if($input_act === 'rp' || $input_act === 'resetpass'){
?>
<script type="text/javascript">
jQuery(function(){
  var btSub = jQuery('#wp-submit');
  jQuery('#pass2').keyup(function() {
    if(jQuery(this).val().length > 6){
      btSub.removeAttr('disabled').val('パスワードを再設定');
    }else{
      btSub.attr('disabled', 'disabled').val('７文字以上ご入力ください');
    }
  }).keyup();
});
</script>
<?php
  }
}
add_action('login_head', 'edit_resetpass_login');
```

###注意
プロフィール更新などを一般公開している環境では、そこにも上記スクリプトを読ませなければならない。
下記の対策が必要。

- php部の分岐とadd_actionを用いて、プロフィール更新画面のみに適用されるよう修正
- JS部のjQuery('#wp-submit')をjQuery('#submit')に変更し、0文字でもボタンが押せるように修正
Android Gradle Plugin 0.13 → 0.14の変更点


2014/10/31にAndroid Gradle Plugin 0.14.0がリリースされていましたので、変更点を確認してみました。
http://tools.android.com/tech-docs/new-build-system

(ただ訳しただけのものもありますが)

※(2014/11/4追記) 早速、0.14.1がリリースされています。(詳細未確認)

# 0.14.0の変更点

## Android Studio 0.9が必要

そのままですが、現在β版として下記ページからダウンロードできるのは、
つい先日までCanary Channelでリリースされていた0.8.14です。
https://developer.android.com/sdk/installing/studio.html

Android Studio 0.9はCanary Channelでリリースされています。
http://tools.android.com/download/studio/canary/latest

## ProGuardとコードカバレッジ計測が連携可能

ProGuardを有効にしていてもカバレッジ計測できるようです。
おそらく以下の問題だと思われます。
https://code.google.com/p/android/issues/detail?id=76609

## Android 5.0の端末からでもカバレッジデータをpull可能

これはAndroid L Previewを使っていて困っていたことですが
カバレッジ計測を有効にした場合テストが失敗する問題がありました。
今回のアップデートでカバレッジデータを取れるようになったようです。

自作のライブラリのテストで試したところ、確かにpullは成功し下記のようなエラーは出なくなりました。

```
Error during Sync: Remote object doesn't exist!
null
java.io.IOException: Failed to pull /data/data/com.simplealertdialog.test/coverage.ec from device
```

…ですが、肝心のカバレッジが全くとれなくなっていました。
（テストは実行できているのにカバレッジ0％。`coverage.ec`ファイルが空でした）

テストカバレッジを計測しているプロジェクトでは、このバージョンを適用する前に
正しく計測できているか確認した方が良さそうです。

※類似の問題が見当たらなかったので、バグレポートしました。
https://code.google.com/p/android/issues/detail?id=78556

※(2014/11/4追記) 0.14.1がリリースされ、この問題は修正されたようです。

## 環境変数ANDROID_SERIALで端末を制限

環境変数ANDROID_SERIALが定義されている場合は、そのシリアルナンバーの機種にインストール、テスト実行を制限することができるようです。

実際、以下のように実行してみると指定の端末のみでテストが実行されました。

```sh
$ ANDROID_SERIAL=xxxxxxx ./gradlew connectedCheck
```

## MultiDexサポート

メソッド数が65Kを超えるとビルドが失敗する問題へのサポートです。

* `multiDexEnabled = true`でサポートされる
* 有効にするにはBuild-Tools 21.1.0とSupport Repository rev8が必要
* defaultConfig, ProductFlavor, BuildTypeに記述可能
* `minSdkVersion 21+`はネイティブでサポートされ、21未満は`com.android.support:multidex:1.0.0`のdependencyが自動的に追加される

こちらに詳しく説明がありました。
[Building Apps with Over 65K Methods](http://developer.android.com/tools/building/multidex.html)

## 未使用のリソースを自動的に削除

未使用のリソースを削除する機能が追加されたようです。
(デフォルトではOFF)

以下のようにすれば有効になります。

```groovy
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
    }
}
```

試しに、あるアプリで試してみると以下のように出力されました。
もちろん内容によるのでしょうが、以下の場合では20%ほど小さくなりました。

```
:app:shrinkProdReleaseResources
Removed unused resources: Binary resource data reduced from 1426KB to 1141KB: Removed 19%
Note: If necessary, you can disable resource shrinking by adding
android {
    buildTypes {
        release {
            shrinkResources false
        }
    }
}
```

# DSL/APIの変更

## プロパティのリネーム

* BuildType.runProguard                 ->  minifyEnabled
* BuildType.zipAlign                    -> zipAlignEnabled
* BuildType.jniDebugBuild               -> jniDebuggable
* BuildType.renderscriptDebug           -> renderscriptDebuggable
* ProductFlavor.renderscriptSupportMode -> renderscriptSupportModeEnabled
* ProductFlavor.renderscriptNdkMode     -> renderscriptNdkModeEnabled

## variant/variantFilter APIで取得できるBuildType/ProductFlavor/SigningConfigは読取専用に

* これらのオブジェクトはグローバルだったため、変更すると他のVariantに副作用が生じる
* Merged flavorはVariantごとの値であり変更可能

## Variant/VariantOutput APIの変更

DensityやABIを以下のAPIで取得できるようです。

* `output.getFilter(com.android.build.OutputFile.DENSITY)`
* `output.getFilter(com.android.build.OutputFile.ABI)`

以上
ATOMをコマンドから起動できるようにした


**ATOMとは・・・**
Githubがオープンソースで開発しているテキストエディタ
[ATOM公式サイト](https://atom.io)
SublimeTextを使用している人は案外同じノリで使えるとおもいます。



とりあえず以下のコマンドを実行

```
sudo ln -s "/Applications/Atom.app/Contents/MacOS/Atom" /usr/bin/atom
```

これで

```
atom .
```

で現在の階層のフォルダをATOMで開けます。
cgroups でプロセスの CPU 利用率を制御する.


漢ならアプリに CPU 優先度を付けて実行したいですよね! でも nice だとうまくいかない… 悲しくて涙で枕を濡らす日々が続いていました…

そこで昨今の Linux に搭載されている cgroups による CPU リソース制御を使ってみます.

当然ベンチマークアプリは aobench http://code.google.com/p/aobench/ ですね.
OpenMP 化してマルチスレッド実行するようにしておきましょう.

## 設定

cgroups の機能を有効にしておきます.

```
$ sudo chkconfig cgconfig on
$ sudo service cgconfig start
```

aobench 用のグループを作ります.

```
$ sudo cgcreate -g cpu:/aobench-group
```

ディレクトリが出来ているのを確認します.

```
$ ls /cgroup/cpu/aobench-group
```

CPU 利用率を 50% に設定します.

```
$ sudo sh -c "echo 50000 > /cgroup/cpu/aobench-group/cpu.cfs_quota_us"
```

## 実行

まずは普通に aobench 実行します.

```
$ ./ao
```

```
$ top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
15813 syoyo     20   0  114m  26m  932 R 794.9  0.1   2:13.43 ao
```

4 core(8 HT cores) なので理論上 800% のうち 750% ~ 795% くらい出ています. 期待通りですね.

cgroup の設定を使って 50% の利用率になるように実行してみます.

```
$ sudo cgexec -g cpu:aobench-group ./ao
```

```
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
16300 root      20   0  114m  26m  940 R 49.9  0.1   0:21.94 ao
```

50% にはなりましたが, 物理 1 コアの半分での 50% になってしまいました… 400% が期待される結果なのですが, マルチコアでの設定はなにかやりかたが違うのでしょうかね.

## TODO

* Docker で使いたい
* マルチコア環境での設定方法

## References

* [Linux][cgroup]cgroupを使ってCPUとメモリの割り当てを制限する http://d.hatena.ne.jp/nullpobug/20140619/1403185834
Node.js + expressで簡易HTTPサーバを作る

# 目的
コンテンツを置くだけの簡単なHTTPサーバを開発環境上で作る

### 要件
* ローカルの開発環境で動作確認にすぐ使える
* リクエストの時刻をコンソールに出力する(log4jsでできる)
* HTTP GET, POSTのクエリストリングは処理しない
* パッケージ化はしない

### 使ったパッケージ
* log4js
* express
* morgan

### 構成
`/to/app/path
+ SimpleHttpServer.js 実行ファイル
+ public/ コンテンツを格納するフォルダ`

### パッケージのインストール
`$cd /to/app/path`
`$npm install log4js express morgan`
→express4からロギングはmorganとして分離

### express
responseはexpressにお任せ．

```javascript:SimpleHttpServer.js

var PORT=3000,
        ROOTDIR='public';

try {
    var log = require('log4js');
    logger = log.getLogger();
    var morgan = require('morgan');
    logger.info('logger loaded');

    var express = require('express');
    var app = express();

} catch (e) {
    logger.error(e);
} 

app.use(morgan('dev', { format:'dev', immediate: true}));
app.use(express.static(ROOTDIR));

app.use(function(req, res, next) {
     logger.info('request to: ' + req.path);
     next();
});

app.listen(PORT);

```

`app.use(function(){...})`でmiddlewareに関数を追加している．
morganは`dev`レベルでロギングを設定した．

`function(){...}`の前でパスを省略することで，どのパスでも関数が呼ばれる．
参考:[app.use([path], [function...], function)](http://expressjs.com/api.html#app.use)

### 実行
public/にコンテンツを置いて実行する．

`$node SimplerHttpServer.js`
`[2014-11-22 18:06:46.626] [INFO] [default] - logger loaded`
`GET /hoge - - ms - -`
`GET /hogea - - ms - -`
`GET /hogeb - - ms - -`
`GET /favicon.ico - - ms - -`
`[2014-11-22 18:06:52.012] [INFO] [default] - request to: /favicon.ico`

---

## (解決済み)追記
コンテンツが存在するURLを指定すると私の環境では表示されません．
存在しないURLだと"request to: ..."が表示されます．

別途，調べてみます．

### 404などクライアント向けのエラーハンドラだった
`app.use(function()...)`は404などのエラーの場合のみ実行される．
存在しないURLを指定する場合のみ，"request to: ..."が表示されていたので納得した．

[How do you handle 404s?](http://expressjs.com/starter/faq.html)
>
How do you handle 404s?
In Express, 404s are not the result of an error. Therefore, the error-handler middleware will not capture 404s. This is because a 404 is simply the absence of additional work to do; in other words, Express has executed all middleware / routes, and found that none of them responded. All you need to do is add a middleware at the very bottom (below all others) to handle a 404:

>app.use(function(req, res, next){
  res.send(404, 'Sorry cant find that!');
});

以上．
vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう


## tl;dr

* より新しいkernelが公開されているタイミングでGuestAdditions(以下GA)の再ビルドをすると、インストール済みGAが無効になる(削除されてから再ビルドに失敗する)
* kernelのアップデートをすれば復旧は可能
* vbguestプラグインを使うなら[Global Configuration](https://github.com/dotless-de/vagrant-vbguest#global-configuration)で`auto_update = false`としておきたい

## 発生を確認した状況

* VirtualBox 4.3.18(Mac)
* Vagrant 1.6.5
* vagrant-vbguest 0.10.0
* CentOS6の最新kernel: 2.6.32-504.el6
* 使ったBox: [chef/centos-6.5](https://vagrantcloud.com/chef/boxes/centos-6.5)
	* インストール済みGAのバージョン: 4.3.8 (VirtualBoxのバージョンと不一致)
	* kernelのバージョン: 2.6.32-431.el6 (最新のバージョンと不一致)

## 発生する問題と原因

### 再現手順

```
$ vagrant plugin install vagrant-vbguest
$ vagrant init chef/centos-6.5
$ vagrant up
```

### 発生する問題

[Synced Folders](https://docs.vagrantup.com/v2/synced-folders/)のマウントに失敗する。(GAが無効になる)

```
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
```

### 原因

* VirtualBoxのバージョンとGAのバージョンが異なるためvbguestプラグインがGAの再ビルドを始める
* インストール済みGAが削除される
* アクティブなkernelと同じバージョンのkernel-develをインストールしようとするが、より新しいkernelが公開されているのでみつからない
* GAのビルドが失敗し、GAが動作しない状態に

以下のIssueで指摘されている。

* [CentOS Kernel-Devel issue · Issue #141 · dotless-de/vagrant-vbguest](https://github.com/dotless-de/vagrant-vbguest/issues/141)

(どちらかといえばVirtualBox側の問題か)

## 対策

* 予防策: 冒頭に書いたGlobal Configuration設定で不意の再ビルドを避ける
* 復旧策: kernelのバージョンを上げて仮想マシンを再起動させる
	* アップデートしたkernelで起動される
	* vbguestプラグインがGAのビルドを始める
	* 今度はkernel-develのインストールに成功するので、GAのビルドが成功する

```
$ vagrant ssh -c 'sudo yum update -y kernel'
$ vagrant reload
$ vagrant vbguest --status
GuestAdditions 4.3.18 running --- OK.
```
仮想拡張デスクトップ

win32 apiで仮想デスクトップを作ろうと思っています。
作りたいのはデュアルディスプレイみたいにデスクトップを拡張させることですがほとんどの仮想デスクトップのソフトは個々の干渉しないデスクトップになってしまいます。干渉する仮想デスクトップつまりウィンドウの移動ができる仮想デスクトップを作るにはどうしたらいいでしょうか。
http://kkayataka.hatenablog.com/entry/2014/10/11/145913
一応このページを見たんですけどよくわかりませんでした。
私がCentOS 7を入れたら最初にやること

ひどく個人的なノウハウですが、私がCentOS 7 を入れたら最初にやることです。

DVDのisoからブート。最小構成で入れて、NICの設定はインストラーでGUIで設定する。

#### SELinuxを切る

変更

```
setenforce 0
getenforce
#-> Permissiveを確認
```

永続化
`/etc/selinux/config`に対して

```
SELINUX=disabled
```

#### FWを切る

```
#変更
systemctl stop firewalld
#永続化
systemctl disable firewalld
````

#### IPアドレス付与

CentOS7から設定ファイルは直接弄ってはいけないという思想になったため、コマンドラインツールで設定する。

```
#設定
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.1.20/24 ipv4.gateway 192.168.1.1

#設定反映
nmcli connection down eth0
nmcli connection up eth0

#確認
nmcli device show eth0
```

#### ホスト名変更

```
hostnamectl set-hostname my_host_name
```

#### ネット関係のコマンド(ifconfig,nslookupなど)を入れる

```
yum install -y net-tools bind-utils
```

#### killallがないので入れる

```
yum install -y psmisc
```

#### NTPクライアントを入れる

```
yum install chrony
systemctl start chronyd
systemctl enable chronyd
```


#### NFSのNASをマウントする
```
#NFSクライアントインストール
yum -y install nfs-utils
#設定
echo /etc/fstab >> "server:/hoge /mnt/hoge nfs defaults 0 0
#マウント
mount -a
```

#### LDAPでOSユーザ認証できるようにする

```
#インストール
yum install -y pam_ldap nscd nss-pam-ldapd
#設定
authconfig-tui
#[Use LDAP] にチェックを入れる。
#[Use LDAP Authentication] にチェックを入れる。
# base dc=hoge,dc=var
# uri ldap://ldapserver/
```

### systemctlでbashの補完をきかせる

```
yum install bash-completion
wget https://github.com/terralinux/systemd/raw/master/src/systemctl-bash-completion.sh -O /etc/bash_completion.d/systemctl-bash-completion.sh
```
これでsystemctlと打ってでtabを押すと以下のようにコマンドを補完してくれるようになる。

```
[root@localhost]# systemctl [TAB]
cancel                 dot                    is-active              load                   reset-failed           status
condrestart            dump                   is-enabled             poweroff               restart                stop
daemon-reexec          emergency              isolate                reboot                 set-environment        try-restart
daemon-reload          enable                 kexec                  reload                 show                   unset-environment
default                exit                   kill                   reload-or-restart      show-environment
delete                 force-reload           list-jobs              reload-or-try-restart  snapshot
disable                halt                   list-units             rescue                 start
```

### OS起動時にプログレッシブバーではなく詳細ログが出るようにする

GRUB2設定元ネタファイル`/etc/default/grub`の`GRUB_CMDLINE_LINUX`から`rhgb`と`quiet`のオプションを抜く

```
GRUB_TIMEOUT=5
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 rd.
lvm.lv=centos/root crashkernel=auto "  #ここからrhgbとquietを抜く 
GRUB_DISABLE_RECOVERY="true"
```

GRUB2の設定ファイルを生成する

```
# grub2-mkconfig -o /boot/grub2/grub.cfg
```
DashでMan PagesがEmpty docsetになった時の対応

## 現象

DashからMan pagesを見たいときに empty docset と表示されて、検索できないことがあった

## 対応方法

メールで開発者にコンタクトしたら回答が返ってきた

zshにしてるのが原因。
一度bashに戻すとちゃんと見れる
ghnとpecoでgithubのnotificationsをまとめて開く


# いくつか選択してまとめて開きたい

http://hiroki.jp/percol-ghn
こちらを参考にpecoとghnをインストールして試してみました。
非常に便利なのですが、複数選択して一括で開くことはできない…

できればプロジェクト名等で絞りこんでまとめて開きたい！
というわけで、書いてみました。

```
ghn list | peco | awk '{print $1}' | xargs open
```

pecoはctrl+spaceで複数選択できるんですね。
非常に便利なのでこれから色々試してみようと思います。
C#+WPFで作る日めくり式カレンダー(仮)

概要
---
3連休で1日1本以上何かアウトプット、報告をしてみよー企画第一弾

C#+WPFの勉強よして
@ITのWPF記事 [連載：WPF入門](http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/introwpf_index.html)
で学んだ成果物として何か作ってみるのが目的。
主にコントロールの試用、イベントとコマンド関係を使ってみる。

手っ取り早く実行できそうなものとして、日めくり式のカレンダーを作ることにしました。

今の状態
---

![20141101.png](https://qiita-image-store.s3.amazonaws.com/0/42607/484ff477-5b5a-dd88-edae-b1863d7b2c1d.png)

・-,+で日付の変更ができる
・土日になるとメッセージ表示

コード

```csharp:MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfCallender
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DateTime date = DateTime.Today;
            HolidayJudge(date);
            Today.Text = date.ToString("yyyy/MM/dd");

            BeforeDay.Click += (s, e) =>
            {
                date = date.AddDays(-1);
                Today.Text = date.ToString("yyyy/MM/dd");
                HolidayJudge(date);
            };

            NextDay.Click += (s, e) =>
            {
                date = date.AddDays(1);
                Today.Text = date.ToString("yyyy/MM/dd");
                HolidayJudge(date);
            };
        }

        public void HolidayJudge(DateTime today)
        {
            if (today.DayOfWeek == DayOfWeek.Saturday || today.DayOfWeek == DayOfWeek.Sunday)
            {
                MessageBox.Show("今日は休みです!! やったね!!!");
            }
        }
    }
}
```
TextBlockの配置だけなのでxamlは省略
csの方ではまだ土日判定のロジック程度です。

今後の目標
---
　日めくり式だと単調で面白くないので通常のカレンダーにも切り替えられるようにしたいと
考えています。
なので目標としては
・日めくり式にもうちょっと機能拡張をする
・通常カレンダーの切り替え
の2点で行きます。
[日めくり、通常で共通]
・休日を祝う機能(メッセージの表示)
・コントロールなどUI系をおしゃれにしたい
・今日の日付情報がわかる

[日めくり式カレンダーについて]
・祝日の判定ができるようにする
・曜日により背景色を変える

[通常のカレンダー]
・土日祝日に色を付ける

他思いついたらどんどん増やしていく
休み中に拡張して記事を追加していきます!
nyagosで`echo $PATH`とかしたい

nyaos3000と違い、**nyagos**では環境変数を展開するには`%PATH%`としなければなりません。
\*nixやnyaos3000に慣れた人は`$PATH`としたいところですよね。
nyagosでも**filter**の機能を使って置換すれば可能です。

```lua:.nyagos
local _filter = nyagos.filter
nyagos.filter = function(cmdline)
  local post = cmdline:gsub('${([%w_()]+)}', '%%%1%%')
  post = post:gsub('$([%w_()]+)', '%%%1%%')
  return _filter(post)
end
```
`$PATH`と`${PATH}`に対応してみたのですが、こんな感じで大丈夫かな？
PHPでGoogle BigQueryにデータを登録する

#はじめに
## BigQueryとは？
Googleのサービスの１つ。ビッグデータをGoogleの力で処理できる。

## BigQueryのメリット
* 文章内のテキスト検索も気軽にできるため、とりあえずデータ登録してあとで検索・分析することを考えた。

## BigQueryのデメリット
* 有料。とは言っても、自分でMySQLなどのDBサーバを構築してチューニングして～という手間と管理が省ける分 お値段以上の魅力を感じる。
* 遅い RDBで主キーがわかっている状態の検索に比べて遅く感じる。1レコードしか登録がない状態でも検索に最低3秒くらいかかる。
* 重複レコードが発生する　主キーの設定ができないため、普通にInsertすると重複するレコードが登録できてしまう。

#PHPでGoogle BigQueryにデータを登録する
## 前準備
* [Google BigQuery API client libraries](https://cloud.google.com/bigquery/client-libraries)から、Google APIs Client Library for PHP (beta)をダウンロードしてセットアップ。
* Google Developers Consoleから認証情報にて、OAuthを登録・作成する。

## BigQueryのクライアントを作る。

```php:1st
    require_once './Google/Client.php';
    require_once './Google/Service/Bigquery.php';

    define('CLIENT_ID', 'xxxx-xxxx.apps.googleusercontent.com');
    define('SERVICE_ACCOUNT_NAME', 'xxxx-xxxx@developer.gserviceaccount.com');
    define('KEY_FILE', './xxxx.p12');

    $client = new Google_Client();
    $client->setApplicationName('Insert BigQuery from php');

    $key = file_get_contents(KEY_FILE);

    $client->setAssertionCredentials(
            new Google_Auth_AssertionCredentials( SERVICE_ACCOUNT_NAME, 
                array('https://www.googleapis.com/auth/bigquery'), 
                $key )
    );
    $client->setClientId(CLIENT_ID);

    $service = new Google_Service_Bigquery($client);
```

## BigQueryへデータ登録
```php:2nd

    define('PROJECT_ID', 'project-name');
    define('DATASET_ID', 'dataset-name');
    define('TABLE_ID', 'table-name');

    $data = array( 'a' => '1', 'b' => '2' );

    try {
        $rows = array();
        $row = new Google_Service_Bigquery_TableDataInsertAllRequestRows();
        $row->setJson( $data );  // $dataはjson_encodeしないで配列のまま
        $row->setInsertId( date('YmdHis') );
        $rows[0] = $row;
        
        $request = new Google_Service_Bigquery_TableDataInsertAllRequest();
        $request->setKind('bigquery#tableDataInsertAllRequest');
        $request->setRows($rows);
        
        $this->gbqService->tabledata->insertAll(PROJECT_ID, DATASET_ID , TABLE_ID, $request);
    } catch (Exception $ex) {
        echo $ex->getMessage();
    }
}
```

`$row->setInsertId( date('YmdHis') );` の部分が主キー相当となるため、重複するレコードを作りたくない場合、主キーとして連結した文字列に設定する。今回`date('YmdHis')`を指定しているので、重複を気にせずガンガン登録している。
Multi-AZ配置されたAWS Managed ServiceとSecurity Group

# 前提
AWSのManaged ServiceでMulti-AZ配置出来るものは幾つか(RDS / ElastiCache)ありますが、Security Groupの設定で少し注意が必要です。
先日、http://aws.amazon.com/blogs/aws/elasticache-redis-multi-az/ で ElastiCache for RedisのMulti-AZ配置とAuto Failoverが発表されました。
今まで、Multi-AZやAuto Failoverを考慮していないSecurity Groupの設定をそのまま使い続けると、知っていれば物凄く単純ですが少しハマりポイントがあるので簡単にまとめます。
これは、自前でMulti-AZでHA構成をとっている場合にも適用出来ると思います。(例えば、NATインスタンスや自前でMulti-AZで配置しているDBサーバやCacheサーバなどなど)

# 注意点
## 構成
今回は以下のVPCを使用します。今回はCacheを例に使用していますが、RDSや自前で構築したDB / Cache / NATインスタンスなどでも同様です。
また、問題が発生するタイミングは初回構築時だとテストで気づきやすいのですが、Failoverテスト時や実際にFailoverが発生したタイミングで問題が顕著化する可能性もあります。
![az sample](https://qiita-image-store.s3.amazonaws.com/0/4769/d934bc24-e9b3-0ec7-97a4-be11f097229b.png)

## Security Group
今回の様な構成で、今まで、Availability Zone AにのCacheサーバ(Redis)があり、今回Availability Zone BにReplication Groupを作成したとします。
ElastiCacheの構成は以下の様な状態とします。
![elasticache nodes](https://qiita-image-store.s3.amazonaws.com/0/4769/1a8f06ee-e488-2680-ddd4-89121eb16ee7.png)
test-002, 003が新規追加分のMulti-AZノードだとすると、今回はAZ-AとAZ-Cに1ノードずつ所属していることになります。

この状態で、以下の様なSecueity GroupがCacheノードに設定されていたとします(AZ-Aに今までノードが存在していたという前提で)

![sg](https://qiita-image-store.s3.amazonaws.com/0/4769/888462df-ae82-bb0b-7b64-bba846583813.png)
ElastiCache for RedisのReplication Groupではnode毎にSecurity Groupを設定するのではなくGroupで共通で設定されます。そのため今回の設定ではAZ-Bのノードにアクセスすることが出来ません。
もちろん
![sg subnet](https://qiita-image-store.s3.amazonaws.com/0/4769/2d975f46-3425-268f-67e2-4c352b513c3b.png)
の様にすることでアクセスすることが出来ますが、先ほどの設定もこちらの設定も、このサブネットやVPCに所属するインスタンス全てからアクセス出来てしまいます。

Secueity GroupはSourceにSecueity Groupを指定出来るため、Cacheノードにアクセスを許可するインスタンスのみに絞ってアクセス許可を与える事ができますし、こちらがセキュリティの観点からもお勧めです。
以下の例では、アプリケーションサーバ用とCacheノード用のSecurity Groupを作成して、cacheノードに対して、アプリケーション用Security Groupからのみアクセスを許可しています。

- アプリケーション・サーバ用 (例: survey)
 - _SSHを全ての接続元から許可していますが、これはテスト用なので、必ず接続元は絞るようにして下さい_

![sg app](https://qiita-image-store.s3.amazonaws.com/0/4769/4df57aa1-d917-a1a2-d175-820701be5f71.png)

- cacheノード用

![sg cache](https://qiita-image-store.s3.amazonaws.com/0/4769/4e6f0db2-bc5f-70b1-3541-a147f2ab5b92.png)

このようにSecurity GroupをSourceてして指定することで、VPCやSubnetに依存することなくPrivate subnetやManaged Subnetなどのインターネットからアクセスする必要がない(接続元が可変)場合Secueity Groupを再利用可能しやすくなると思います。


# おまけ
Security Groupをうまく使うことで、Single Subnetで複数階層構造を作成することが可能です。Public / Private Subnetを作成してNATインスタンスなどを経由してなどという設計も1つのVPCのNW設計ではあるのですが、以下の図の様に1つのSubnetでSecurity Groupをうまく用途ごとに使用してNWを設計することも可能です。
もちろん、Security Groupが増える可能性や管理の問題・パフォーマンスの問題があるのであくまで1つの考えでこのようなものがあるということで、VPCのやSubnetの設計をする際は慎重に。

![vpc sg only](https://qiita-image-store.s3.amazonaws.com/0/4769/e408c663-604f-970f-aa10-47f00b32b28e.png)


こちらは個人の意見で会社とは関係ありません。お約束です。