OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】JSON Schemaからmock作るやつ作った

# JSON Schemaからmockつくるやつ
人生初のnpmです: [**json-schema-mockifier**][js-mockifier]

## Usage

`npm install`します．

```shell-session
$ npm install json-schema-mockifier
```

`require`します．

```javascript
var mockifier = require("json-schema-mockifier");
```

JSON Schemaファイルを読み込みます．

```javascript
var schema = require("./spec/fixtures/schema.json");
```

JSON Schemaからmockを作ります．

```javascript
var mocks = mockifier.mockify(schema);
```

[こんなかんじのJSON Schema][fixture]を読んだとき，たとえば`mocks.post`の内容は以下のようになります．

```javascript
{
  created_at: '2012-01-01T12:00:00Z',
  id: '01234567-89ab-cdef-0123-456789abcdef',
  body: 'Ah^~ My heart will be hopping^~',
  updated_at: '2012-01-01T12:00:00Z',
  user: {
    id: '01234567-89ab-cdef-0123-456789abcdef',
    name: 'Syaro'
  },
  comments: [
    {
      created_at: '2012-01-01T12:00:00Z',
      id: '01234567-89ab-cdef-0123-456789abcdef',
      body: 'Is the order a rabbit?',
      updated_at: '2012-01-01T12:00:00Z',
      user: {
        id: '01234567-89ab-cdef-0123-456789abcdef',
        name: 'Syaro'
      }
    }
  ]
}
```

例えばAngularJSなアプリのテストコードで以下のようにするとかしたら幸せになれそうですね．

```javascript
$httpBackend.whenGET("/api/posts").respond([mocks.post])
```

## なにやってんの
1. [json-schema-parser][js-parser]でschema中の`$ref`を全部展開する
1. ルート直下の`properties`ごとにmockを作っていく
  1. [例示したschema][fixture]だと`user`，`post`，`comment`
  1. 例えば`post`の場合，`properties/post/properties`を見る
  1. 各propertyのexampleを引っこ抜いてくる
1. しあわせ


## [json-schema-parser][js-parser]って？
[HerokuのJSON Schema][heroku]にあるような`$ref`を全部展開するためのmodule．
npmのライブラリでいい感じにこれをやってくれるやつが無いので自作した（他のやつはValidatorに内包されてるとかそもそも展開できないとかそんなん）．

JSON Schemaでは色んな所で利用するpropertyが出てきたりするが，それを毎回書くのはアホらしいので再利用できるように`definition`以下にpropertyの定義とか書いて色んな所から参照（`$ref`）している．
ただこの記法はクソややこしいのでこれが正しいとも限らない（ちゃんと展開できないライブラリとかも多い）．そこで，たとえば[QiitaのJSON Schema][qiita]はおそらく[JsonWorld][json_world]のDSLでSchemaを記述しており，`$ref`や`definition`は出てこない．こんな感じのDSLで書くとクラス参照することで`$ref`の代わりになるしわかりやすくていい感じかもしれない．

## References

* [**izumin5210/json-schema-mockifier**][js-mockifier]
  * PRやIssueお待ちしております:D
* [izumin5210/json-schema-parser][js-parser]
  * こちらもPRやIssueをぜひぜひ
* [Heroku | JSON Schema for the Heroku Platform API][heroku]
* [Qiita API v2のJSON Schemaを公開しました - Qiita Blog][qiita]
* [r7kamura/json_world][json_world]

[js-mockifier]: https://github.com/izumin5210/json-schema-mockifier
[fixture]: https://github.com/izumin5210/json-schema-mockifier/blob/master/spec/fixtures/schema.json
[js-parser]: https://github.com/izumin5210/json-schema-parser
[heroku]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api
[qiita]: http://blog.qiita.com/post/120746062029/json-schema-for-qiita-api-v2
[json_world]: https://github.com/r7kamura/json_world
S3fs インストール＆設定手順 (IAMRole利用）

### S3fs インストール＆設定手順 (IAMRole利用）

#### １．IAMRole作成

bucket名：mybucket
ディレクトリ名：mypath

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions"
            ],
            "Resource": "arn:aws:s3:::mybucket",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "mypath/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket/mypath/*"
            ]
        }
    ]
}
```

#### ２．EC2ローンチ
上記IAMRoleを指定

#### ３．S3fsのインストール

```
yum -y install git automake gcc-c++ fuse fuse-devel libcurl-devel libxml2-devel openssl-devel
cd /usr/local/src/
wget https://github.com/s3fs-fuse/s3fs-fuse/archive/v1.78.tar.gz
tar xzvf v1.78.tar.gz
ls -l
cd s3fs-fuse-1.78/
./autogen.sh
./configure prefix=/usr
make
make install
```

#### ４．マウント設定
rc.local
```
IAMROLE=`curl --silent  http://169.254.169.254/latest/meta-data/iam/security-credentials/`
/usr/bin/s3fs mybucket:/mypath /mnt -o iam_role=${IAMROLE},rw,allow_other
```

※/etc/fstabでマウントすると、IAMRole取得のタイミングで失敗の可能性がある。
VisualStudio ショートカット（基本）

まずは、マウスの使用頻度を減らそう


<h1>テキストの操作

|ショートカットキー|説明|
---|---|
| **Ctrl+矢印** |テキストをスクロール|
| **Ctrl+c→Ctrl+v** |選択行の1行下にコピーを作成する|
| **Ctrl+k+Ctrl+c** |コメントアウト|
| **Ctrl+k+Ctrl+u** |コメントアウト解除|
| **Ctrl+Shift+L** |選択した行を削除する|
| **Ctrl+Shift+Enter** |カーソルの下に空白行を挿入します|
| **Ctrl+Shift+U** |選択したテキストを大文字に変換します|
| **Ctrl+K→Ctrl+K** |ブックマークを付ける/消す|
| **Ctrl+K→Ctrl+P** |ブックマークに移動する|
|Ctrl+U|選択したテキストを小文字に変換します|
|Ctrl+End |カーソルをドキュメントの最後に移動させる|
|Ctrl+Home|カーソルをドキュメントの最初に移動させる|
|Ctrl+G|指定した行にカーソルを移動させる|
|Ctrl+M→Ctrl+L|全ての領域の折り畳み状態を切り替える|
|Ctrl+M→Ctrl+M|選択されている領域の折り畳み状態を切り替える|
|Ctrl+Shift+↓|ページ内で使われている選択中の単語に飛ぶ|
|Alt+上下キー|1行を上下に移動|

<h1>ファイル・タブの操作

|ショートカットキー|説明|
---|---|
| **Ctrl+Alt+PageDown** |右側のタブに移動|
| **Ctrl+Alt+PageUp** |左側のタブに移動|
| **Ctrl+F4** |現在開いているタブを閉じる|
| **Ctrl+Alt+L** |ソリューションエクスプローラーを開く|


<h1>デバック

|ショートカットキー|説明|
---|---|
| **Shift+F9(Shift+Alt+Q)** |[クイックウォッチ]ダイアログボックスに、選択した式の現在の値を表示|
Eloquent単体で簡単に導入するライブラリを作った

Laravelは使えないけど、Eloquentは使いたいという人向けに、とりあえず、簡単に入れられるやつを作った。

どういうものか試してみる時にも便利なはず。



https://github.com/mapyo/eloqunet-only



## 使い方
READMEに全て書いてありますw

がもう一度書きます。

#### install
```
composer require mapyo/eloquent-only
```

#### Usage
```php
<?php
use Mapyo\EloquentOnly\Eloquent;
$loader = require('./vendor/autoload.php');

Eloquent::init(
    array(
        'driver'   => 'mysql',
        'host'     => '127.0.0.1',
        'database' => 'database',
        'username' => 'user',
        'password' => 'password',
        'port'     => 3306,
        'collation' => 'utf8_unicode_ci',
        'charset'  => 'utf8',
    )
);

class User extends Illuminate\Database\Eloquent\Model
{
    protected $table = 'users';
}

$user = User::find(1);
var_dump($user->name);

$log = Eloquent::getConnection()->getQueryLog();
var_dump($log);
```

#### 所管
composerをすでに使っているプロジェクトであれば、簡単に使えるはず。
今回、初めてPackagistに公開してみたけど、意外と簡単だったー。
もっといろんなツールやらライブラリやらを作って公開していきたい。

もしツッコミどころがあれば、いろいろいただけるとありがたいです。


## thanks
- [ComposerとPackagistでPHPライブラリを開発、テスト、公開する(2/2)](http://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-2/)
goでwindowsでキースキャン

## windowsのキースキャンが無いようなので、作った。

## インストール
   go get github.com/ohisama/key

## サンプルコード
```
package main
import (
	"github.com/ohisama/key"
	"time"
)
func main() {
	var c byte;
	for {
		time.Sleep(200 * time.Millisecond)
		c = key.Scan()
		if c > 0 {
			print(string(c))
		}
	}
}
```
【デザインパターン】 Singletonパターン

##概要
クラスのインスタンスがひとつしか生成されないことを保証し、クラスへのグローバルなアクセス方法を提供するパターン

以下の1種類のクラスからなる
1. Singletonクラス(クライアントがアクセスできる唯一のインスタンスである、Instanceオペレーションを定義)

##具体例と実装
施設の鍵を例にすると

上記には
1. マスターキークラス

が対応する。
コードの詳細は以下(比較、理解のためマスターキークラスとと通常の鍵クラスを記述)

```rb:master_key.rb
class MasterKey
include Singleton
  def open(room)
    # 必ず鍵を開ける
  end
end
```

```rb:room_key.rb
class RoomKey
  def initialize(room)
    @room = room
  end

  def open(room)
    if room == @room
      # 鍵を開ける
    else
      # 鍵が開かない
    end
  end
end
```

##メリット
* クライアントがアクセスするインスタンスをただひとつにすることで、オブジェクトの生成を制御出来る
* グローバル変数を宣言する必要がなくなり、名前空間を減らせる
* 特にポリモーフィズムが絡み、状態をもたないクラス(上記の例では、たとえば、鍵クラスが多態性をもち、様々な部屋に対応した鍵と、必ずどんな部屋でも開けられるマスターキーを定義したいときに、状態を持たないマスターキーをSingletonパターンを使って実装している)を明示的に示す場合に用いると効果的

##まとめ
クラスの生成するインスタンスをただひとつに制限するパターン
あるクラスから生成されるインスタンスを共通で使い回したい場合、クラスが状態を持たない場合を明示したい場合に用いる
【デザインパターン】 Visitorパターン

##概要
構造と振る舞いを分離するためのパターン


以下の5種類のクラスからなる
1. Visitorクラス(3.に対するVisitオペレーションを宣言する)
2. ConcreteVisitorクラス(1.で宣言されたVisitオペレーションを実装する)
3. Elementクラス(要素の抽象クラス、visitorを受け取るAcceptオペレーションを宣言する)
4. ConcreteElementクラス(要素の具象クラス、3.で宣言されたAcceptオペレーションを実装する)
5. ObjectStructureクラス(要素を列挙し、それらに対するオペレーションをvisitorに任せるためのインターフェイスを提供する)

##具体例と実装
訪問販売を例にすると

上記1~5はそれぞれ
1. 訪問販売クラス(DoorToDoorSalesmanクラス、訪問のインターフェイスを定義)
2. 生命保険販売クラス、健康食品販売クラス(LifeInsuranceDoorToDoorSalesmanクラス、HealthyFoodDoorToDoorSalesmanクラス。訪問販売で各家庭を訪れる)
3. 世帯クラス(Householdクラス、訪問販売員を受け入れるインターフェイスを定義)
4. 単身世帯クラス、家族世帯クラス(SingleHouseholdクラス、FamilyHouseholdクラス各訪問販売員を受け入れる)
5. 販売員派遣元クラス

が対応する。
コードの詳細は以下

```rb:door_to_door_salesman.rb
class DoorToDoorSalesman
  def visit(household)
  end
end
```

```rb:life_insurance_door_to_door_salesman.rb
class LifeInsuranceDoorToDoorSalesman < DoorToDoorSalesman
  def visit(household)
    household.greet
    # 家を訪問
  end
end
```

```rb:healthy_food_door_to_door_salesman.rb
class HealthyFoodDoorToDoorSalesman < DoorToDoorSalesman
  def visit(household)
    household.greet
    # 家を訪問
  end
end
```

```rb:household.rb
class Household
  def accept(door_to_door_salesman)
  end
end
```

```rb:single_household.rb
class SingleHousehold < HouseHold
  def initialize
  end

  def accept(door_to_door_salesman)
    door_to_door_salesman.visit(self)
  end

  def greet
    puts 'こんにちは'
  end
end
```

```rb:family_household.rb
class FamilyHousehold < HouseHold
  def initialize
  end

  def accept(door_to_door_salesman)
    door_to_door_salesman.visit(self)
  end

  def greet
    puts 'こんにちは、誰に御用でしょうか？？'
  end
end
```

```rb:door_to_door_salesman_agency.rb
class DoorToDoorSalesmanAgency
  attr_accessor :household_list

  def initialize
    # 訪問先顧客情報
    @household_list = Array.new
  end

  def add(household)
    @household_list << household
  end

  def remove(household)
    @household_list.delete(household)
  end
end
```

```rb:client.rb
agency = DoorToDoorSalesmanAgency.new
agency.add(SingleHouseHold.new)
agency.add(FamilyHouseHold.new)

life_insurance_salesman = LifeInsuranceDoorToDoorSalesman.new
healthy_food_salesman = HealthyFoodDoorToDoorSalesman.new

agency.household_list.each do |household|
  household.accept(life_insurance_salesman)   
  household.accept(healthy_food_salesman)
end
```

##メリット
* 構造とオペレーションが分離されていることによりOCPなコードになり、要素への新しいオペレーションの追加が容易
* オペレーションを実行する要素の型がわからなくとも共通のクラスからオペレーションを呼び出せる

##まとめ
オペレーションを加えるオブジェクトのクラスに変更を加えずに新しいオペレーションを定義することが出来るパターン
【デザインパターン】 Compositeパターン

##概要
木構造の再帰的なデータを表現するためのパターン

以下の4種類のクラスからなる
1. Componentクラス(枝と葉に共通するインターフェイス、親、子へのアクセスを宣言し、適宜実装する)
2. Leafクラス(階層構造の末端の葉オブジェクトを表し、振る舞いを定義する)
3. Compositeクラス(枝オブジェクトの振る舞いを定義し、1.で宣言された子オブジェクトに関するオペレーションを実装する)
4. Clientクラス(1.のインターフェイスを通して、枝や葉オブジェクトを操作する)

##具体例と実装
ファイルとディレクトリからなる木構造を例にすると

上記1~4はそれぞれ
1. ディレクトリエントリークラス
2. ファイルクラス
3. ディレクトリクラス
4. クライアントクラス

が対応する。
コードの詳細は以下

```rb:directory_entry.rb
class DirectoryEntry
  def get_name
  end

  def remove
  end
end
```

```rb:file.rb
class File < DirectoryEntry
  def initialize(name)
    @name = name
  end
 
  def get_name
    @name
  end

  def remove
    # ファイルを削除
  end
end
```

```rb:directory.rb
class Directory < DirectoryEntry
  def initialize(name)
    @name = name
    @children = []
  end

  def get_name
    @name
  end

  def remove
    @children.each do |item|
      item.remove
    end
    # ディレクトリ自身を削除
  end

  def add(item)
    @children << item
  end
end
```

##メリット
* クライアントは、木構造内のすべてのオブジェクトを一様に扱うことが出来る
* 新しく定義されたCompositeクラス、Leafクラスは既存の構造に自動的に取り込むことができる

##まとめ
木構造を構成するオブジェクトを透過的に扱えるパターン。
循環のない再帰的な構造を表現する際に用いる。
gojiのレスポンス結果をテストする

[revel](http://revel.github.io)には,e2eテストのような[test機能](http://revel.github.io/manual/testing.html)があるのだが、
これを[goji](https://github.com/zenazn/goji)でも同じようなことをやりたいとき。

```go:main.go
package main

import (
  "fmt"
  "net/http"

  "github.com/zenazn/goji"
  "github.com/zenazn/goji/web"
)

func main() {
  serve()
}

func serve() {
  goji.Get("/", func(c web.C, w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, `{"foo":"bar"}`)
  })
  goji.Serve()
}
```

上みたいな場合、テストの前に`goji.Serve()`をgoroutineで起動してからテストを実行する。

```go:main_test.go
package main

import (
  "encoding/json"
  "flag"
  "net"
  "net/http"
  "os"
  "testing"
  "time"
)

const bind = ":11251"

// テストを走らせる前に、goji.Serve()を起動する
func TestMain(m *testing.M) {
  flag.Set("bind", bind)
  go func() {
    serve()
  }()

  ready()
  os.Exit(m.Run())
}

// サーバー側のport確認
func ready() {
  timeout := make(chan struct{}, 1)
  go func() {
    time.Sleep(10 * time.Second)
    timeout <- struct{}{}
  }()

  for {
    select {
    case <-time.After(100 * time.Millisecond):
      if _, err := net.Dial("tcp", "127.0.0.1"+bind); err == nil {
        return
      }
    case <-timeout:
      panic("timeout")
    }
  }
}

// リクエストを投げて、結果のJSONが正しいかを確認する
func TestHome(t *testing.T) {
  resp, err := http.Get("http://127.0.0.1" + bind)
  if err != nil {
    t.Fatal(err)
  }
  defer resp.Body.Close()

  var ms map[string]interface{}
  if err := json.NewDecoder(resp.Body).Decode(&ms); err != nil {
    t.Fatal(err)
  }
  if ms["foo"] != "bar" {
    t.Errorf("foo: have %v; want bar", ms["foo"])
  }
}
```

これで`go test`でテスト実行できる。
FontAwesomeのアイコンをUnicodeスカラ値で指定できるボタンをつくる


あとでな

* http://stackoverflow.com/questions/3648411/objective-c-parse-hex-string-to-integer
* http://d.hatena.ne.jp/nakamura001/20080912/1221229442

```obj-c
//        NSString *hexString = @"f009";  //
NSString *hexString = @"30C6";   // テ
unsigned int result = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner setScanLocation:0];
[scanner scanHexInt:&result];
NSLog(@"%C", (unichar)result);
NSString *utf8CharString = [NSString stringWithFormat:@"%C", (unichar)result];
NSLog(@"%@", utf8CharString);
```
Aurelia docs update: 6/22


Aurelia日本語ドキュメントの更新について記載します。6/22現在、pull request中でまだ更新されていない内容も含まれるため、本エントリの内容については[fork先](https://github.com/bohnen/documentation/tree/update-japanese-docs)を確認してください。

## 進行中の翻訳 
まだマージされていませんが、フランス語、ドイツ語の翻訳が進行中です。これがマージされると、Aureliaのドキュメントは、中国語、ドイツ語、英語、フランス語、日本語、スペイン語 版ができることになります。developerの広がりを感じます。

## 起動時に読み込まれるプラグインの追加

起動時に[historyプラグイン](https://github.com/aurelia/history-browser)が追加されています。ただ、プラグイン自体は古くから存在するため、ドキュメントから抜け落ちていただけかもしれません。

## [refバインディングコマンドの修正](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#ref) (line: 373〜)

あるテキストボックスで入力した値から計算された結果を別の箇所で表示したい、使いたいというのはよくあることです。同じ画面中であればビューモデルが共通なので、これは簡単です。
ところが、入力がカスタムエレメントで行われる場合、カスタムエレメントは独自のビューモデルを持ちますから、画面上の他のコンポーネントから利用する場合は、カスタムエレメントのビューモデルへの参照が必要になります。

これを実現するのがrefです。これまでは、カスタムエレメントのビューモデル参照については`.view-model`というバインディングコマンドを使っていたのですが、`.ref`に統一されました。

`.ref`を使うことで、カスタムエレメントやカスタム属性のビューモデルにアクセスすることができます。

## [n回繰り返し文法](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#repeat) (line: 715〜)

コレクションに対しての繰り返しではなく、`for(int i=0;i<n;i++)` 式の、n回繰り返す場合の記載方法が追記されました。

```markup
<ul>
  <li repeat.for="i of rating">*</li>
</ul>
```

ここで`rating`は整数に評価される式です。

## [compose利用法の追記](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#compose)

画面内の特定の要素に独自のビューとビューモデルを指定できるようにするのが`compose`カスタムエレメントです。
今回特定のオブジェクトをビューモデルに指定する方法が追記されました。（ビューモデルは普通のオブジェクトなので、当たり前といえば当たり前なのですが）

これでカスタムエレメントを逐一作らなくても、アドホックにビューとビューモデルを組み合わせて使うことができ、応用範囲は広いと思います。

## [ルート定義 属性の追記](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#routing) (line: 795〜)

特定のルートへのリンクを作成できるように、ルート定義(JSON)に`name`属性が追加されました。

この箇所以外にも、ルート定義のサンプルそれぞれで`name`属性定義が追記されています。

ここで定義された`name`属性の利用法が、(line:1114〜) の、[ルートのURLを生成する](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#generating-route-urls)に記載されています。

## [複数ビューポートの描画](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese/docs.md#rendering-multiple-view-ports) (line: 1080〜)

画面が複数のビューポートから構成されていて、ルートごとに切り替えたい場合のルート定義方法が追記されました。

多分gmailみたいな複数ビューポートから構成された画面をイメージしていると思われます。（挙動は試していないため未確認です）

## その他

サンプルコードの細かいtypoの修正が多数行われました。
xhyve(coreos-xhyve)を試してみた

# xhyveを別の場所にインストールする

```
/opt/xhyve/bin
```

等好きな場所でパスを通すだけで動かせた。

# Macのdockerコマンドから動かす

coreosのdockerをMacのローカルのdockerコマンドから動かせそうだが、
そのままではダメだった。

```
unset DOCKER_TLS_VERIFY
docker -H 192.168.64.4:2375 run -it --rm busybox
```

というように、DOCKER_TLS_VERIFYを無効にしないと、
tlsの長さが違うみたいなエラーがでて動かない。

# 参考資料

- https://github.com/coreos/coreos-xhyve

# 関連記事

- [xhyveでdocker使ったほうが速いのか試した](http://abrakatabura.hatenablog.com/entry/2015/06/23/074600)
- [xhyveのdockerコンテナにiPhoneからアクセスできた](http://abrakatabura.hatenablog.com/entry/2015/06/25/074419)
技術英語 > Use Global Data only [as a last resort]

引用: Code Complete (No. 11374) > Use Global Data Only as a Last Resort

Global Dataは 最後の手段/最後の頼みの綱 として

<hr>
関連するものとして

    resort to ... (...に頼る)

https://github.com/KKBOX/CompassApp
> Compass.app helps designers compile stylesheets easily without <font color=red>resorting to</font> command line interface
SSHでPermission deniedが解決しないと思ったらauthorized_keysに"\n"が紛れ込んでいた


## 状況

```
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
```

新しいMacBookから、ConoHaのVPSへまだ接続していなかったので、 `ssh-keygen` から始まりごにょごにょやっていた。まあ、いつものかという感じで潰していくが、タイポもないし `authorized_keys` に登録したキーも間違っていない(というか、一回べつの公開鍵を登録していたりもしたけど)、権限もあってるし `/etc/ssh/sshd_config` も正しく設定してある。おかしい！
ちなみにここまですべて ConoHa コンソールで作業した。アホっぽいが古いPCを出すのも面倒だし。一瞬で終わるはずだった。


## 究明

重い腰を上げて 

```
$ sudo tail -f /var/log/auth.log
```

してみる

```
Jun 22 13:30:36 neoneobeam sshd[12056]: error: key_read: uudecode HOGEhoge neo@neo-mbp.local\n faild
```

なんだこの `\n` 改行コード

## 原因

```
$ cat ~/.ssh/id_rsa_neoneobeam_svr.pub| pbcopy
```

して

![ConoHaコントロールパネル 2015-06-22 04-30-11.png](https://qiita-image-store.s3.amazonaws.com/0/21888/d15b9b83-898d-2397-e907-94b9c9d669f1.png "ConoHaコントロールパネル 2015-06-22 04-30-11.png")

こんなことやっていたのが原因っぽい。
コピペは危険。


## 解決

公開鍵ファイルをDropboxに上げて

```
$ wget https://www.dropbox.com/hoge/id_rsa_neoneobeam_svr.pub?dl-1
$ cat id_rsa_neoneobeam_svr.pub?dl-1 >> ~/.ssh/authorized_keys
```
これで :ok_hand: 
なんらかの方法で変換するんでも良かったけど、そちらは調べていない。

最初から旧PCを引っ張り出して作業した方が早かった。


## 参考

* [PuTTYでkey-genしたときに error: key_read uudecode と出た件 - 憧れ駆動開発](http://atasatamatara.hatenablog.jp/entry/20101112/1289583896)
* [EC2のSSH接続でPermission denied(publickey)と出た時の対処法 - Qiita](http://qiita.com/katsukii/items/c3df0653ac07d41fe03f)
Bluemixの資格情報取得にはcfenvを使おう

IBM [Bluemix](https://console.ng.bluemix.net/)は[CloudFoundry](http://cloudfoundry.org/index.html)をベースとしたPaaSです。

CloudFoundryでのアプリケーション開発は、ruby、javascript (node.js)、javaなどの言語を使って、APIを通じてPaaSが提供してくれる個々のサービスを利用します。このようなAPIを利用する際に資格情報(接続先URL、ポート、ユーザID、パスワードなど)が必要となりますが、これらの情報はすべてプラットフォームからアプリケーションに`VCAP_SERVICES`という環境変数で与えられます。(参考: [CloudFoundry Documentation: Binding Credentials.](http://docs.cloudfoundry.org/services/binding-credentials.html))

#VCAP_SERVICESとは

Bluemixの場合にも、サービスを利用する場合にはこのVCAP_SERVICESを使った資格情報を使う必要があります。

たとえば、Bluemix上でredisを使う場合を考えましょう。

Bluemixでredisサービスを作成すると、ダッシュボードにアイコンが現れます。

![bm-redis-icon.png](https://qiita-image-store.s3.amazonaws.com/0/21963/bd00a21c-1d0c-a8d8-3003-3ea29d172767.png)

このアイコンの左下にある「資格情報の表示」をクリックすると、VCAP_SERVICESに埋め込まれる資格情報(json形式)が表示されます。

```json:Bluemixで提供される資格情報の例
{
  "redis-2.6": [
    {
      "name": "my-redis",
      "label": "redis-2.6",
      "plan": "100",
      "credentials": {
        "hostname": "xx.xx.xx.xx",
        "host": "xx.xx.xx.xx",
        "port": xxxx,
        "password": "xxxx-xxxx-xxxx-xxxx-xxxx",
        "name": "xxxx-xxxx-xxxx-xxxx-xxxx"
      }
    }
  ]
}
```

この情報を使用して、たとえばredisにデータを格納する場合は、以下のようなコードを書くことになります。なお、ここでは、VCAP_SERVICESがないということはローカルでのデバッグ実行を意味しており、その場合はローカルに立てたredisを使うようにしています。

```coffeescript:Bluemixでのredisへの書き込み
require 'redis'

redis_service_label = 'redis-2.6'

if process.env.VCAP_SERVICES?
  services = JSON.parse process.env.VCAP_SERVICES
  redis_creds = services?[redis_service_label]?[0]?.credentials
  redis_host = redis_creds?.host ? 'localhost'
  redis_port = redis_creds?.port ? '6379'
  redis_pass = redis_creds?.password ? null

client = redis.createClient redis_port, redis_host
if redis_pass?
  client.auth redis_pass

client.set key, val
```

'redis-2.6'はBluemix上で選択したサービスの種類ですので、同じサービスを複数使用した場合などは、配列の中から適当なものを見つけなければならないなど、jsonの構造を理解したうえで記述する必要があり、結構面倒です。

#cfenvの導入

もう少し手軽にVCAP_SERVICESを使えるようにしたnpmモジュールが[cfenv](https://www.npmjs.com/package/cfenv)です。

Bluemixでcfenvを利用するには、package.jsonの*dependencies*にモジュール名`"cfenv"`を追加します。

```json:package.json
{
  ...
  "dependencies": {
    "cfenv": "*",
    ...
  }
  ...
}
```

#cfenvの使い方

それでは、上記の例をcfenvで書き換えてみます。

```coffeescript:Bluemixでのredisへの書き込み(cfenv版)
require 'redis'
require 'cfenv'

redis_creds = cfenv.getAppEnv().getServiceCreds 'my-redis'
redis_host = redis_creds?.host ? 'localhost'
redis_port = redis_creds?.port ? '6379'
redis_pass = redis_creds?.password ? null

# 以下は同じ
client = redis.createClient redis_port, redis_host
if redis_pass?
  client.auth redis_pass

client.set key, val
```

`getServiceCreds`では、サービス名を使えます。サービスの種類は全般的に長く、また命名方法に一貫性が無いため、サービス名を使うことができると見通しが良くなります。同じ種類のサービスを複数利用するときなど、jsonの構造にそって要素を列挙する必要がなくサービス名で簡単にアクセスできることは非常に重要です。また、全般的にjsonの構造を比較的意識する必要がありません。

#まとめ

* BluemixはCloudFoundryですので、サービスの資格情報は`VCAP_SERVICES`環境変数に格納されています。
* 資格情報はjsonですので自力で解析することもできますが、cfenvモジュールを使えば、構造を意識する必要がなく、コードがシンプルになります。
CMake で条件分岐

http://www.cmake.org/cmake/help/v3.0/command/if.html

CMake では条件分岐する場合、大体次の条件を使うみたい。

- ある変数が定義されているかどうか
- ある変数の値が真かどうか

変数が定義されているかどうか
----------------------------

DEFINED という命令もあるんだけどなんか思ってたのと違うらしくここで使うものじゃないみたい。
単純に変数名を書けばよいらしい。

```CMake
if(variable-name)
    # commands
endif()
```

ある変数が定義されていないことを調べたい場合は NOT を使って反転させる

```CMake
if(NOT variable-name)
    # commands
endif()
```

ある変数の値が真かどうか
------------------------

ある変数の中身を ${} を使って展開して、それを評価する。偽であることを確かめたい場合は NOT を使う。

```CMake
if (${variable-name})
    # commands
endif()

if (NOT ${variable-name})
    # commands
endif()
```

変数を評価した際に、真と判定される値は次。
大文字小文字を区別しない。

- 0 以外の数
- ON
- TRUE
- Y
- YES

上記以外の値は偽と判定される。

使いどころ
----------

条件分岐を定義しておくとコマンドラインから動作を指定できるようになる。
次のようなスクリプトを組んでおく。

```CMake
# snip

if(debug)
    message("debug on")
endif()
```

で、次のように cmake コマンドを打つ際に -D で変数を定義するとフローを変更できる。
この場合 <kbd>on</kbd> はいらないんだけど何かしら指定しないとダメなので。別に <kbd>a</kbd> でもいい。

```sh
cmake -Ddebug=on .
```
CMake で pkg-config を使う

http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html

標準で提供されている pkg-config 用のモジュールを使う。

1. find_package() で PkgConfig を指定する
    - 実体は cmake 標準の FindPkgConfig.cmake モジュール
2. pkg_check_modules() で探したいライブラリーを指定する
    - ここで検索結果に名前をつけることであとで参照できる
3. 2 でつけた名前を使って -I オプションや -l オプションの指定をひっぱりだす

サンプル見たほうが早い。

```CMake:CMakeLists.txt
# load the module to use pkg-config
find_package(PkgConfig)

# search library with pkg-config and name its results "LIBSAMPLE"
pkg_check_modules(LIBSAMPLE REQUIRED libsample)

# use the variable <RESULTNAME>_INCLUDE_DIRS to get include paths
include_directories(${LIBSAMPLE_INCLUDE_DIRS})

add_executable(sample
    main.cpp
    )

# use the variable <RESULTNAME>_LIBRARIES to get library paths
target_link_libraries(sample
    ${LIBSAMPLE_LIBRARIES}
    )
```
VS2015しかインストールしていない状態でnpm installが失敗する

Visual Studio 2015しかインストールしていない状況でnpm installが失敗することがある。
自分の場合の原因はnpmのバージョンが低いからだった。
よって以下のコマンドでnpmを最新にすることでうまくいくようになる。

```
npm install -g npm
```

ただし、上記のコマンドを実行したときにインストールされるフォルダは`C:\Users\hoge\AppData\Roaming\npm\node_modules\npm`で、デフォルトのnpmのフォルダは`C:\Program Files\nodejs`である。
このままでは古いnpmが使用されてしまうため環境変数を書き換えるか`C:\Program Files\nodejs`のnpmを削除しましょう。

## 参考
[Troubleshooting#upgrading-on-windows](https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows)
Laravel 配列で渡されたリクエストデータにバリデーションをかける


リクエストデータを配列で渡せることを知って、「DBと対応していないフィールドを作る必要がなくなる！！」と思った矢先に「配列のデータに対するvalidationのかけ方が分からない！！」という問題にぶつかりました。

なかなか有益な情報が得られず困っていましたが、英語で検索してみるとすぐに見つかりました。
やはり日本語に固執しすぎるのは良くありませんね。

##リクエストデータを配列で渡す
まずは、配列で渡したいフィールドを配列の形で書きます。
（この時 "user_name['last']"のように記述するとvalidationが効かなくなります。）


```php:form.blade.php

<div class="form-group row">
    {!! Form::label('user_name[last]', '氏名（性）:', ['class' => 'control-label']) !!}
    {!! Form::text('user_name[last]', null, ['class' => 'form-control', 'placeholder' => 'Last Name']) !!}
</div>

<div class="form-group row">
    {!! Form::label('user_name[first]', '氏名（名）:', ['class' => 'control-label']) !!}
    {!! Form::text('user_name[first]', null, ['class' => 'form-control', 'placeholder' => 'First Name']) !!}
</div>


```


##配列のバリデーション

配列名.キー名を指定するだけで配列のバリューにバリデーションをかけることができます。

```php:CreateUserRequest.php


class CreateUserRequest extends Request {

    public function authorize()
    {
        return true;
    }
    
    public function rules()
    {
        return [
            'email'           => 'required|email',
            'user_name.last'  => 'required|max:32',
            'user_name.first' => 'required|max:32',
            'gender'          => 'required',
            'password'        => 'required|between:6,12|confirmed'
        ];
    }
    
}    

```

##まとめ
前回の投稿にも書きましたが、ユーザ名の性と名や、範囲の始点と終点など、複数のフィールドが必要だけど、実際にDBに登録するのはひとつのカラムで十分と言った場合、配列を使った方がデータを処理しやすくなります。

配列へのバリデーションは、公式ドキュメントには載っていなく？あまり日本語のドキュメントでヒットしない内容ですが、フィールドを配列で記述することで、扱いやすいデータもあると思います。そんな時にバリーデーションは必ず、使用するので知っていてそんはない知識だと思います。



##謝辞
最後まで読んでいただき、まことにありがとうございます。
次の投稿では他フィールドの値をあるフィールドのバリデーションで使用することについて投稿したいと思います。
rails install 時の nokogiri エラー

```zsh
gem install rails
```
で rails を install する際に以下のエラーが出る場合

```zsh
Fetching: activesupport-4.2.2.gem (100%)
Successfully installed activesupport-4.2.2
Fetching: rails-deprecated_sanitizer-1.0.3.gem (100%)
Successfully installed rails-deprecated_sanitizer-1.0.3
Fetching: mini_portile-0.6.2.gem (100%)
Successfully installed mini_portile-0.6.2
Fetching: nokogiri-1.6.6.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.2 -r ./siteconf20150621-3840-1ya54gj.rb extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... no
zlib is missing; necessary for building libxml2
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/bin/$(RUBY_BASE_NAME)2.2
	--help
	--clean
	--use-system-libraries
	--enable-static
	--disable-static
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--enable-cross-build
	--disable-cross-build

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.2.0/gems/nokogiri-1.6.6.2 for inspection.
Results logged to /var/lib/gems/2.2.0/extensions/x86_64-linux/2.2.0/nokogiri-1.6.6.2/gem_make.out
```

対処として

`apt-get install -y libxslt-dev libxml2-dev`

を実行して

`gem install nokogiri`

を実行。成功すれば、

`gem install rails --no-document`

で、rails が install できるはず。

# 上記の対応でも nokogiri が install できない場合


`apt-get install -y zlib1g-dev`

を実行してもう一度

`gem install nokogiri`

を実行するといけるはず。最後に

`gem install rails --no-document`

すれば、rails が install できる

参考 : [Installing Nokogiri](http://www.nokogiri.org/tutorials/installing_nokogiri.html#ubuntu___debian)
tmuxのウィンドウ名をvimの編集中のファイル名に設定する


**参考:**

* [tmux tabs with name of file open in vim - Stack Overflow](http://stackoverflow.com/questions/15123477/tmux-tabs-with-name-of-file-open-in-vim)

あまり気にしている人がいないのか、日本語での情報を見ないので、上げておきます。

表題の通り、vimでファイルを編集しているときに、そのファイル名をtmuxのウィンドウ名に設定しておきたいことがあるかと思います。これを実現する方法は簡単で、上のリンクを見てもらえれば分かるとおり、autocmdの設定でそのBufferに入ったときに、`tmux rename-window`でファイル名(`expand("%:t")`)を渡してやればいいだけです。

つまり、`~/.vimrc`に以下を追記

```vim
augroup titlesettings
  autocmd!
  autocmd BufEnter * call system("tmux rename-window " . "'[vim] " . expand("%:t") . "'")
  autocmd VimLeave * call system("tmux rename-window zsh")
  autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
augroup END
```

1、2行目はtmuxのウィンドウ名に関係するものであり、3行目は普通のターミナルのタイトルを変えるものです。

これで、Vimタブ間の移動、Vim分割ウィンドウ間の移動などをするたびにそのファイル名がtmuxのウィンドウ名に設定されます。

---

**追記(2015/06/25)**

但し、上の例ではtmux環境以外でVimを起動したときに、最後にアクティブだったウィンドウの名前が変更されてしまうので、tmux環境内で起動したときだけリネームが実行される必要がありました。

したがって、

```vim
if $TMUX != ""
  augroup titlesettings
    autocmd!
    autocmd BufEnter * call system("tmux rename-window " . "'[vim] " . expand("%:t") . "'")
    autocmd VimLeave * call system("tmux rename-window zsh")
    autocmd BufEnter * let &titlestring = ' ' . expand("%:t")
  augroup END
endif
```

のようにします。

**(追記ここまで)**

---

以下に自分の環境でどのように表示されるか、スクリーンショット載せておきます。

![screen_013.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/a16fcc01-ea62-efe2-944d-50c84d9e6e54.jpeg)

ご参考になれば幸いです。
maildev (SMTP mock server) を使ってハイパーメール開発

メールに絡む開発するときって結構困りますよね。
実際にテストメール飛ばしちゃ困るとかもあるし、向き先全部自分とかにしたらメールボックスいみわからないことになるし、まぁなんかしらのブラックホールが欲しくなります。

`mocksmtpd` を使うことも過去にはあったのですが、`UTF-8` のメール見られないとか設定面倒くさいとかありまして。

で、こいういうのって多分 node.js で何かしらあるだろう、と思って探したら、ありました。
あまり日本で紹介している人もいなかったのでお宝発見的な気持ちになったので、紹介しておこうと思います。

* **http://djfarrelly.github.io/MailDev/**
    * GitHub: https://github.com/djfarrelly/MailDev
    * npm: https://www.npmjs.com/package/maildev

## 何をやってくれるアプリケーション？

* 指定 port を listen してメール全部吸収してくれます
* ウェブインターフェイスを用意していて、その画面でメールにアクセスできます
* ウェブインターフェイスの機能が結構充実してます:
    * Text/HTML の切り替えや
    * ViewPort の切り替え
    * ソース見たりヘッダー見たり
    * もちろん添付ファイルを見たり
    * `.eml` 形式でダウンロードしたりもできます
* 必要があれば更に外のSMTPサーバーに Relay してくれます


## インストールと立ち上げ

```
$ npm install -g maildev
```

基本的に設定不要で、これだけで動きます。

おもむろに maildev って打つだけ

```
$ maildev
Temporary directory created at /tmp/maildev/6791
MailDev app running at 0.0.0.0:1080
MailDev SMTP Server running at 0.0.0.0:1025
```

デフォルトで、SMTP は 1025、Webは 1080 で待ち受けるので、変えたい場合は `-s` `-w` オプションで変更を。

Web画面 (port 1080) アクセスすると、こんなかんじ。

![image](https://qiita-image-store.s3.amazonaws.com/0/59/88af97d6-97c4-eb95-57b5-acafa8546685.png)


## SMTPを喋ってみる

とりあえずテキストプロトコルでしゃべってみる

```
% telnet localhost 1025
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 aoi ESMTP node.js simplesmtp
HELO stkr.jp
250 aoi at your service, [127.0.0.1]
MAIL FROM:<sotarok@strk.jp>
250 2.1.0 Ok
RCPT TO:<sotaro.k@gmail.com>
250 2.1.0 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Hello Sotaro!?

Hi, sotaro

This is a test mail.
Can you see me?

.
250 2.0.0 Ok: queued as ABC
```

そうすると、

![image](https://qiita-image-store.s3.amazonaws.com/0/59/0074ff39-c026-12c3-06e4-682660effdcd.png)

メールきてる。ひらくと、

![image](https://qiita-image-store.s3.amazonaws.com/0/59/fa3b208a-7ebc-c6d3-4c59-b6f319cc0eb3.png)


## こんなときに便利そう

* 開発環境で、実際にはメール飛んでほしくない場合
* 大量メール送信のテストをしたいとき (一応2万通とか送ってみたけど maildev でうけとれた。)
* その他 ...


## 実際にメールをうけとった側のメーラーでの見た目も確認したい

で、大量送信や開発時にこいつを使うと便利なのはわかったとしして、実際にそのメールが Gmail ではどう見えるとか、Outlook ではどう見える、とかはやっぱり実際に送らないと見え方わからないですよね、というときに、

```
$ maildev --outgoing-host smtp.gmail.com --outgoing-secure --outgoing-user 'you@gmail.com' --outgoing-pass '<pass>'
```

で起動しておけば、Relayボタンを押すだけ。

![Screenshot 2015-06-21 21.42.06.png](https://qiita-image-store.s3.amazonaws.com/0/59/4eac6c37-82a6-e4cb-c74b-fedc1cc2292d.png)


で、Gmailに同じメールを送信してくれます。BENRI!

## maildev ではできないこと

* 実際に使う SMTP サーバーとの動作確認 (ま、これは結合テストなんですが)
* ISO-2022-JP メール (nodemailer が対応してない、もっというと nodemailer が依存してる liblime が依存してる iconv-lite が対応してない)

## てことで

Enjoy it!
EC2 のインスタンスに Ansible をインストールする

「Amazon Linux AMI 2015.03 (HVM), SSD Volume Type - ami-cbf90ecb」に

```
$ sudo yum install --enablerepo=epel ansible
```

でインストールすると以下のように表示されてダメでした。

```
$ ansible --version
Traceback (most recent call last):
  File "/usr/bin/ansible", line 36, in <module>
    from ansible.runner import Runner
ImportError: No module named ansible.runner
```

pip で ansible を入れる方法もあるようですが、それでも一筋縄ではいかないようです。

というわけで、Ubuntu の AMI「Ubuntu Server 14.04 LTS (HVM), SSD Volume Type - ami-936d9d93」を使うことにました。

Ubuntu であれば、以下でインストールできることを確認しました。

```
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
$ ansible --version
ansible 1.9.1
  configured module search path = None
```

Windows の場合、このインスタンスに ssh 接続して ansible を実行しようと思います。
Homebrew-bundleとBrewfile

`brew bundle`コマンドが消えたときに

> [Brewfileで管理するのはもうオワコン](http://unasuke.com/info/2014/brewfile-is-outdated/)

と言われたり、いやいや別のモジュールに分離されただけだよってことで

> [Brewfileはオワコンではない](http://rcmdnk.github.io/blog/2015/03/24/computer-mac/)

てなことがあったみたいですが、後者で紹介されてた `Brewdler` ってモジュールがいつの間にか改名されて`Homebrew-bundle`になってた。

[Homebrew/Homebrew-bundle](https://github.com/Homebrew/homebrew-bundle)

コマンドも `brew bundle` に元通り。`bundle`が使いたい人はこれでいいんじゃないでしょうか。
コミットログを見る限り2015/4/18に大規模に変更されてますね。
KVMのスナップショットによるゲストOSの状態管理

# KVM スナップショット概要 
KVM スナップショットはKVM のとある時点の状態を保持する機能です。
スナップショットは普通のバックアップのように全データを保持しておくのとは異なり、ゲストOS 上への変更が発生した時に差分のみを保持することで、スナップショットを作成した時点の状態を保持します。
また、ゲストOS の全データをコピーするわけではないのでスナップショットの作成処理は高速です。
スナップショットは、ゲストOS 本体もしくはスナップショットファイルのいずれかが破損してしまうと、元の状態に戻すことはできなくなるので、バックアップの代わりとして利用する場合は注意してください。
スナップショットの作成手順としては、external 親スナップショットを作成し、それから派生する子スナップショットを作成していくイメージです。


# スナップショット(external)の取得 
`virsh snapshot-create-as` コマンドを使用することで、ゲストOS のexternal スナップショットを取得することができます。
スナップショットの取得は、ゲストOS が起動中でも可能です。


```text:書式
# virsh snapshot-create-as <KVMドメイン名> <スナップショット名> "<コメント>" --disk-only --atomic
Domain snapshot sn01_kvm_centos7 created
```



```text:コマンド例
# virsh snapshot-create-as kvm_centos7 sn01_kvm_centos7 "test snap shot" --disk-only --atomic
Domain snapshot sn01_kvm_centos7 created
```



## スナップショット(external)の復元について 
external スナップショットの復元は2015年06月現在、対応していない様子。

```text
$ virsh snapshot-revert kvm_centos7 sn01_kvm_centos7
error: unsupported configuration: revert to external snapshot not supported yet
```
スナップショット復元については、internal スナップショットを取得してから行ってください。

# スナップショットの確認 


```text:コマンド書式
# virsh snapshot-list <KVMドメイン名>
```



```text:コマンド例
# virsh snapshot-list kvm_centos7
 Name                 Creation Time             State
------------------------------------------------------------
 sn01_kvm_centos7     2015-01-18 18:04:44 +0900 shutoff
```



# スナップショット(internal)の取得 
外部スナップショットを取得した状態で、次のようにコマンドを実行すると、スナップショットを取得することができます。
なお、スナップショットの名前は外部スナップショットや他の内部スナップショットと被らないようにしてください。


```text:書式
# virsh snapshot-create-as <KVMドメイン名> <スナップショット名> "<コメント>"
```



```text:コマンド例
# virsh snapshot-create-as kvm_centos7 sn02_kvm_centos7 "comment"
```



# スナップショットをtree 表示する 
スナップショットの派生関係を確認したい場合、`--tree` オプションを付けることで確認することができます。

```text
# virsh snapshot-list kvm_centos7 --tree
sn01_kvm_centos7
  |
  +- sn02_kvm_centos7
      |
      +- mariadb_kvm_centos7
      +- postgresql_kvm_centos7
```



# 現在の状態が、どのスナップショットからの派生かを調べる 
`virsh snapshot-list` コマンドに`--tree`, `--current` オプションを使用することで確認することができます。

```text
# virsh snapshot-list kvm_centos7 --tree --current
mariadb_kvm_centos7
```



# 特定のスナップショット状態に戻す 
特定のスナップショットのポイントに戻すには`virsh snapshot-revert` コマンドを使用します。
指定するスナップショットは内部スナップショットを指定するようにしてください。


```text:書式
# virsh snapshot-revert <KVMドメイン名> <スナップショット名>
```



```text:コマンド例
# virsh snapshot-revert kvm_centos7 sn02_kvm_centos7
```



# スナップショット(internal)の削除 
`virsh snapshot-delete` コマンドを実行することで、スナップショットを削除することができます。


```text:書式
# virsh snapshot-delete <KVMドメイン名> <スナップショット名>
```



```text:コマンド例
# virsh snapshot-delete kvm_centos7 sn03_kvm_centos7
```



# スナップショット(external)の削除 
external snapshot を削除する場合は`--metadata` オプションをつけることで削除できます。


```text:書式
# virsh snapshot-delete <KVMドメイン名> <スナップショット名> --metadata
```



```text:コマンド例
# virsh snapshot-delete kvm_centos7 sn01_kvm_centos7 --metadata
```
年月を計算するmonth gem

月単位で計算したいときに、`each`で回すのも微妙に面倒くさいものです。そんなちょっとしたことでも、Rubyでは誰かがgemを作っていることが多いです。

# gemの機能
`month`というgem（[GitHub](https://github.com/timcraft/month)）がありまして、年月だけを扱うようなクラスとして動作します。

## 生成
直接`Month`を生成するだけでなく、他の型のオブジェクトから変換することもできます。

```rb:month_generation.rb
# 直接new
Month.new(2014, 1)  # 2014年1月

# 他のオブジェクトから変換
Month(Time.now) #今月

#YYYY-MM型の文字列から生成
Month.parse('2014-01') # 2014年1月
```

## 属性
もちろん、属性もいろいろあります。

```rb:month_attributes.rb
m = Month.new(2015, 1)
m.year # 年（2015）
m.number # 月（1）
m.name #英語の月名（January）
m.april? #12ヶ月分チェックメソッドがあります（false）
m.to_s #YYYY-MM形式（2015-01）
```

## 集合操作・演算
月単位で`each`を回したり、いろんな操作が可能です。

```rb:month_manipulation.rb
m = Month.new(2015, 1)

# 加減算
m + 1 # 月単位の足し算（2015年2月）
m - 1 # 月単位の引き算（2014年12月）
m - Month.new(2014, 1) # 月の差分（12）

# 指定の月まで回す
m.step(Month.new(2016, 1)){|month| ... } 

# 月と日付の関係
## 日が入るかのチェック
m.include?(Date.new(2015, 1, 31))  # true

## 日付の範囲
m.dates # 2015-01-01..2015-01-31

## 日数
m.length # 31
```

なお、`upto`や`downto`、そして`step`への間隔指定の機能がなくて不便なので、プルリクエストを投げてみました。

## DSL
日本語圏では役に立つのかわかりませんが、英語の日付をそのままRubyコードとして実行できる機能があります。

```rb:month_dsl.rb
include Month::Methods

month = January 2014

date = January 15, 2014
```

# その他
ルビーが7月の誕生石なこともあって（これ自体がプログラミング言語のRubyの由来です）、「gem month」やそれに「Ruby」をくわえて検索しても、宝石の方ばかりが引っかかってきてしまって、このgemにたどり着けません。RubyGemsから「month」とすると、すぐに見つかります。
LWP::UserAgentのHTTPS接続の不安定さを解消

`LWP::UserAgent`を使いHTTPSで通信する際、正常にレスポンスが返ってこない場合があった。
正常に返ってくることもあるが、7〜8割の確率で失敗するという不安定さ。

以下の記事のようにモジュールをインストールしたり環境変数にいろいろと設定はすでにしていたがどうすればいいものかとハマっていた。

[LWP::UserAgentでHTTPSプロキシ越しに通信する](http://qiita.com/debug-ito/items/4b3fec645f15af9b4929)

ロードバランサがプロキシとして働き、そのせいもあるのかとドキュメントを漁ったり試行錯誤していたが結局`Crypt::SSLeay`のドキュメントを見直して解決。

[Crypt::SSLeay DO YOU NEED Crypt::SSLeay?](https://metacpan.org/pod/Crypt::SSLeay#DO-YOU-NEED-Crypt::SSLeay)

どうやら`Crypt::SSLeay`と`IO::Socket::SSL`がどちらもインストールされていて`Crypt::SSLeay`を使用したい場合、`LWP::UserAgent`をuseする前に`Net:SSL`をuseするか環境変数に設定してやる必要があったらしい。

以下のようにして失敗することはなくなった。

```peal
use Net::SSL;
use LWP::UserAgent;
```
not-used-fig.rb: LaTeX処理で実際には使わなかった画像ファイルの一覧を得るRubyスクリプト

## 背景

* LaTeX を使っている。
* その文書中に入れる図版用の画像ファイルは専用の画像ディレクトリにまとめている。
* 最初は使うと思っていた画像ファイルが、校正の途中で不要になることがよくある。
* その結果、画像ディレクトリに、使うファイルと使わないファイルが混在する。

## 問題

* 使っているのに存在しないならLaTeX処理中にエラーになってくれるが、使わない画像ファイルがあってもエラーにはならない。
* その結果、使わない画像ファイルを消したくても、それを見つけることが難しい。

## 解法

* LaTeX処理で出力されるログファイルを調べて、実際に使っている画像ファイルの一覧を得る。
* 一方、画像ディレクトリ中の画像ファイルの一覧を得る。
* 両者を比較することで、使わない画像ファイルの一覧を得ることができる。
* Rubyスクリプト <a href="https://gist.github.com/hyuki0000/fc1f2fd6fe72167c6b80">not-used-fig.rb</a> ではこの解法を実現している。
R言語で3Dグラフを作ってみる（rglパッケージ）

統計に強いプログラム言語「R」のグラフ機能拡張についてです。
#さくっとプロット
R言語を使うとちょっとしたグラフ化がさくっとできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/83530/f8c4e88d-8f21-647a-a27d-053b4cb3edd9.png)
ただ、データによっては3次元でグラフ化したい場合があります。
ということで3D表示できるR用パッケージ「[rgl](http://cran.r-project.org/web/packages/rgl/index.html)」
というのを使ってみたので紹介。

#導入
1. まずはリンク先からダウンロードします。[ [rgl](http://cran.r-project.org/web/packages/rgl/index.html) ]
1. Windows版のRGuiを使っている場合は、メニューの_[パッケージ→ローカルにあるzipファイルから…]_
を選んでダウンロードしたzipを読み込みます。 
1. `library(rgl)`で読み込みます。

#3Dプロットしてみる
適当サンプルデータです。
>84.4118361 67.02094633 53.30306495 1
>95.19853622 19.46755224 44.81424551 1
>76.99221056 21.19832946 6.679098233 2
>47.11851053 44.08072688 21.83290854 3
>28.17605163 70.81807808 3.038094815 3
>37.79006518 17.6206705 17.85126479 3
>52.70716655 3.157611848 54.80928113 2

１～３列目がデータ、４列目がカテゴリか何かのつもりです。

クリップボードから読み込む機能があるので便利です。

```r:sample.R
library(rgl)
data<-read.table("clipboard")
plot3d(data[,1:3],col=data[,4])
```
![image](https://qiita-image-store.s3.amazonaws.com/0/83530/30c41c34-d79c-5bfc-7de7-709080c2c30c.png)
やってみるとこんな感じ。
ドラッグでぐりぐり動かせます。これは楽しい。

#WebGLで表示できる
さらにすごいのがこの3Dグラフを保存できます。
HTML5関連技術としても注目されているWebGLを使ってブラウザ上で3Dグラフを描画できるようにできます。
`
writeWebGL(width=700, height=700)
`
保存もこれだけ。
WebGL用のhtml,js等が出力されます。
サーバーにUPすれば誰でも見れる3Dグラフの完成です。
[適当にUPしてみた](http://tsukemono.ohitashi.com/R/webGL/sample.html)
ぐりぐり動かせます。
Capistrano3


# 公式サイト

英語だし分かりにくいけど、ある程度 Capistrano3 に慣れてきたら参照しよう。
http://capistranorb.com/

# まずはインストールして使ってみよう

## Capistrano のインストール

Capistrano のインストールは簡単です。RubyGems がインストールされていれば、以下コマンドを実行するだけ。

```
$ gem install capistrano
```

これでインストールされます。私は MacBook Pro で試しましたが問題なくンストールできました。

## 設定ファイルのひな形の作成

Capistrano を使うためにまずはひな形ファイルを作成します。

```
$ cap install
```

これだけで以下のようなひな形ファイルが作成されます。

```
├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks
```

## 設定ファイルの編集

次は設定ファイルを編集します。git からソースを取得してアップロードするだけの設定ファイルを作ってみましょう。

### アプリケーション名と git リポジトリの指定

アプリケーション名と利用する git リポジトリを設定します。

```
$ vi config/deploy.rb
```

以下のように設定すると "/var/www/my_app_name" フォルダ以下に、repo_url の git から取得したソースがデプロイされます。

```
set :application, 'my_app_name'
set :repo_url, 'git@example.com:me/my_repo.git'
```

### デプロイサーバの指定

```
$ vi config/deploy/staging.rb
```

今回は vagrant を使ってみました。

```
server '192.168.33.10', user: 'vagrant'
```

## デプロイする

あとは以下コマンドを実行するだけで vagrant にアップロードされます。

```
$ cap staging deploy
```

デプロイ後 vagrant の "/var/www/my_app_name" ディレクトリ以下に、次の様なディレクトリが作成されます。current がシンボリックリンクになっていて、実際のソースは releases 以下に保存されています。

```
├── current -> /var/www/my_app_name/releases/20150120114500/
├── releases
│   ├── 20150080072500
│   ├── 20150090083000
│   ├── 20150100093500
│   ├── 20150110104000
│   └── 20150120114500
├── repo
│   └── <VCS related data>
├── revisions.log
└── shared
    └── <linked_files and linked_dirs>
```

単純なデプロイならこれだけで利用できます。
Laravel 配列でリクエストデータを渡す


苗字と名前や始点と終点のように、入力フォームでは２つの入力欄が欲しいけど実際にテーブルにはひとつのカラムで登録したいことがあると思います。
そんな時はリクエストデータは配列で渡すと綺麗に書くことができます


##リクエストデータを配列で渡す
formの'user_name'項目を配列で記述をするだけです。

```:form.blade.php

<div class="form-group row">
    {!! Form::label('last_name', '氏名（性）:', ['class' => 'col-md-4 control-label']) !!}
	{!! Form::text('user_name[0]', null, ['class' => 'form-control', 'placeholder' => 'Last Name']) !!}
</div>

<div class="form-group row">
    {!! Form::label('first_name', '氏名（名）:', ['class' => 'col-md-4 control-label']) !!}
	{!! Form::text('user_name[1]', null, ['class' => 'form-control', 'placeholder' => 'First Name']) !!}
</div>
```


##モデルにミューテータの記述
Eloquentはモデルの属性を設定したり取得したりする時に、内容を変更できる便利な方法を提供しています。
ここではミューテータという機能を使い、配列で渡される氏名(性）と氏名（名）を文字列にするしてDBに登録します。
そして、DBからデータを取得する際には配列に変換してモデルに渡しています。


```php:User.php

class User extends Model {

    protected $fillable = [
        'user_name',
    ];
    
    public function setUserNameAttribute($user_name)
    {
        $this->attributes['user_name'] = $user_name[0] . '::' . $user_name[1];
    }

    public function getUserNameAttribute($data)
    {
        return explode("::", $data);
    }

}
```

##モデルのデータをフォーム画面に表示する（編集画面等）
Formのtextメソッドの第２引数に値をDBから取ってきた値を入れます。
（他のフィールドは第２引数をnullにしても、フィールドのnameとモデルのプロパティ名を比較して自動で値を入れてくれるのですが、
配列だと上手くいきません。）

```:edit.blade.php

<div class="form-group row">
    {!! Form::label('last_name', '氏名（性）:', ['class' => 'col-md-4 control-label']) !!}
	{!! Form::text('user_name[0]', $user->user_name[0], ['class' => 'form-control', 'placeholder' => 'Last Name']) !!}
</div>

<div class="form-group row">
    {!! Form::label('first_name', '氏名（名）:', ['class' => 'col-md-4 control-label']) !!}
	{!! Form::text('user_name[1]', $user->user_name[1], ['class' => 'form-control', 'placeholder' => 'First Name']) !!}
</div>

```

##まとめ

###複数のデータとして扱う場合
DBに登録する際には以下の処理が必要となります。

1. 複数のリクエストデータを取得する処理
2. それらのデータを加工する処理
3. モデル作成時に必要とされる配列に、キーとバリューをを指定してデータを追加する

また、DBに登録した情報をフォームに表示させる際には、以下の処理が必要となります。
4. DBから取得したデータを加工する処理
5. 加工したデータを分割する処理
6. モデルにプロパティを追加し、分割されたデータを追加する処理(__setメソッド)


###配列データとして扱う場合
1,2と4,5に関してはミューテータとアクセサーを使って記述することができ、
3.に関しては、リクエストデータのキーは'user_name'で送られ、DBのカラムと同一にできるので、記述の必要ありません。
6.に関しては、直接Formタグに記述する処理をしています($user->user->name[0]の箇所)。

###結論

これらを踏まえると、配列を使った場合はモデルでデータを処理しやすくなるので、Controllerが肥大化せず、またコードも綺麗にかけるのではないかと思います。

##謝辞
最後まで読んでいただき、まことにありがとうございます。
次の投稿ではLaravelで、配列で渡されたリクエストデータのバリデーションの方法を投稿いたします。
ローカル通信以外を https に転送する

概要
====
単なる備忘録．Apache への通信を https 強制にしたい．その一方で，サーバ内の通信はわざわざ https にする必要がないため http を使いたい．そこで，mod_rewrite を使ってアクセス元を見て https に転送するか決定する．

設定ファイル
===========

```apache
<VirtualHost *:80>
    ServerName http://sample.com

    RewriteEngine On
    RewriteCond %{REMOTE_ADDR} !=127.0.0.1
    RewriteCond %{REMOTE_ADDR} !=%{SERVER_ADDR}
    # Docker コンテナからのアクセス
    RewriteCond %{REMOTE_ADDR} !^172\.17\.
    RewriteRule ^/?(.*)$ https://sample.com/$1
</VirtualHost>
```

参考
=====

- [Apache mod_rewrite Introduction - Apache HTTP Server Version 2.4](http://httpd.apache.org/docs/current/rewrite/intro.html)
Zabbixの日本語化が出来ない時メモ

ZabbixのWebインタフェースで「プロフィール」→「言語」で日本語を選べばいいのだが、日本語が選択自体出来ない時は以下を実行

```
# localedef -f UTF-8 -i ja_JP ja_JP
# service zabbix-server restart
# service apache2 reload
```

### 参考
ZabbixでWebインターフェースを日本語表示する - kakakakakku blog http://kakakakakku.hatenablog.com/entry/2013/12/05/165339
OpenVPNを使ってVPNサーバを構築する

# 背景
最近、スタバなどの公衆無線LANを利用することが増えた。
公衆無線LANは大変便利なのだが、httpsでないサイトへのログインなど、暗号化されていない通信をするのはちと怖い。
そこで全てのパケットを暗号化して、自宅のVPNサーバ経由で通信することで、安心してノマドごっこをできるようにする。

# 環境
![network.png](https://qiita-image-store.s3.amazonaws.com/0/61641/f8c21290-5368-4274-6cf6-2f91252dd2b8.png)

自宅はNAPTを使ったネットワークになっている。

# 構築手順

## サーバ側の環境構築
[http://centossrv.com/openvpn.shtml](http://centossrv.com/openvpn.shtml)のとおりに構築する。OpenVPN 2.3.6 を使用。
`/etc/openvpn/server.conf` は以下の通り。

```
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.11.1"  # 自宅のDNSサーバのIP
keepalive 10 120
tls-auth ta.key 0
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
management localhost 7505
crl-verify crl.pem
```

VPNネットワークは `10.8.0.0/24` とした。
`push "redirect-gateway def1"` とすることで、クライアントからの全ての通信をVPNサーバ経由で行うようにする。

## クライアント側の環境構築
下記の通り `client.conf` を作成する。

```
client
remote hogehoge.co.jp
ca ca.crt
cert client.crt
key client.key
tun-mtu  1350
dev tun
proto udp
remote-cert-tls server
tls-auth ta.key 1
nobind
auth-nocache
script-security 2
persist-key
persist-tun
user nobody
group nogroup
```

`tun-mtu` の値を `1350` にするのがポイント。
MTUの値を大きくすると途中の経路でパケット分割が起きるからか、上手く動作しなくなる（この辺よくわかっていない…）

クライアント側では `network-manager-openvpn-gnome` を使う。必要なパッケージをインストール。

```
$ sudo apt-get install network-manager-openvpn network-manager-openvpn-gnome 
```

ネットワークアイコンから `VPN接続 -> VPNを設定 -> 追加 -> 保存したVPN設定をインポートする` を選び `client.conf` を選択。
これでクライアント側の設定は完了。

## ネットワークの設定
ルータに以下の設定をする。

- 外部から来る `hogehoge.co.jp:1194` 宛のパケットを `192.168.11.10:1194` へ転送する（NAPT）。
-  `10.8.0.0/24` 宛のパケットを `192.168.11.10` へ転送する。

# 動作確認
公衆無線LANに接続する。
その後、ネットワークアイコンから `VPN接続 -> (クライアントのVPN設定の名前)` を選択し、VPNに接続する。

外部への通信が自宅経由で行われていることを確認する。

```
$ traceroute www.google.co.jp
 1  10.8.0.1 (10.8.0.1)  48.214 ms  48.138 ms  48.148 ms
 2  xxxxxxxx (192.168.11.1)  50.558 ms  50.846 ms  50.707 ms
（以下略）
```
vcs_infoを拡張してzshのプロンプトに常に現在のgitアカウントを表示しておく

会社のgitリポジトリにgithub.comの個人アカウントでcommitしてしまったことのあるエンジニアのみなさん、zshのプロンプトにgitの現在のユーザーアカウントを表示して再発を防止しませんか？

vcs_infoを使ってzshのプロンプトにgit(を始めとするVCS)の情報を表示している方は多いと思います。

こんなの
![prompt1.png](https://qiita-image-store.s3.amazonaws.com/0/5235/624332f5-d309-6646-50b6-e24b5e07ec4c.png)

人によって多少違っても、.zshrcはだいたいこんな感じになってるかと思います。

```zsh
# ブランチ名をRPROMPTで表示
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
setopt PROMPT_SUBST    # プロンプト表示ごとに変数を展開する

zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
_vcs_precmd () { vcs_info }  # vcs_info関数を呼び出す。vcs情報はformatsで整形され vcs_info_msg_0_ に挿入される
add-zsh-hook precmd _vcs_precmd # 上の関数をプロンプト表示前に実行させる
RPROMPT='%F{green}${vcs_info_msg_0_}%f'
```

このvcs_infoにはフック機能があり(zsh version>=4.3.11)、任意のユーザー定義関数を実行させることができます。この機能を使って、プロンプトに `git config user.email` の結果を追加することがきます。

![prompt2.png](https://qiita-image-store.s3.amazonaws.com/0/5235/4ea78a33-f65a-65b1-02d3-cc4db8ec080c.png)

```zsh
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
setopt PROMPT_SUBST
zstyle ':vcs_info:*' formats '(%s)-[%b] %m'  # hook_com[misc]を出力するため%mを追加
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a] %m'
_vcs_precmd () { vcs_info }
add-zsh-hook precmd _vcs_precmd
RPROMPT='%F{green}${vcs_info_msg_0_}%f'

# gitリポジトリにいる場合、set-messageフックでgit-config-user関数が呼び出されるように登録
zstyle ':vcs_info:git+set-message:*' hooks git-config-user

# "+vi-<フック名>"関数で、hook_com[misc]にgit config user.emailの結果を代入する
function +vi-git-config-user(){
  hook_com[misc]+=`git config user.email`
}
```

多少字幅はとりますが、このフックの仕組みを使えば、「gitレポジトリとアカウントの組み合わせが違う時だけプロンプトに出す」など、いろいろと作り込んでいけますね。

## 参考文献

[zsh: 26. User Contributions](http://zsh.sourceforge.net/Doc/Release/User-Contributions.html)
[zsh の vcs_info に独自の処理を追加して stash 数とか push していない件数とか何でも表示する - Qiita](http://qiita.com/mollifier/items/8d5a627d773758dd8078)
[Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法 - mollifier delta blog](http://mollifier.hatenablog.com/entry/20090814/p1)