OmniAICreator/Qiita-1.07M huggingface dataset:
【メモ】初級Gitコマンド/Github


## SSH公開鍵設定
[Git初心者でも大丈夫！完全無料でGithub PagesにWebページを公開する方法](http://liginc.co.jp/web/html-css/html/96453)

※複数アカウントでSSH KEYを使用している場合、別々のSSH KEYを用意する必要がある。
SSHでcloneするとき`github.com`を`github-sub(自分でつけたHOST名)`に変更する
ex) `git clone git@github${ここ変更}:example/repo-a.git`

- `https://github.com-` -> パスワード認証
- `git@github.com-` -> SSH認証

[同じサーバで、複数のGitHubリポジトリにDeploy keysを登録する](http://qiita.com/zaru/items/c0e6799d8e6417fa8617)


※会社やチームで作業している場合、公開鍵を上書きしてしまうと再設定が必要になるので注意。



## branch

ブランチを作成し、即時にチェックアウト
`git checkout -b ${new-branch}`

リモートのブランチをそのままローカルに持っていきたい場合は、pullではなくcheckout
ex) `git checkout -b develop remotes/origin/develop`
この時、ローカルとリモートの名前を一致させないと以下の注意がでる

```
The upstream branch of your current branch does not match
the name of your current branch
```

リモートも含めたブランチ表示
`git branch -a`

ローカルのブランチをリモートに反映
`git push origin ${new-branch}`
[gitのローカルbranchを作成し、リモートにpushする](http://sessan.hatenablog.com/entry/2012/06/20/205036)

## merge

feature-Aブランチをmasterブランチにマージする
`git checkout master`

`git merge --no-ff feature-A`


## fetch

**pull** : リモートの変更を取り入れ、ローカルに反映。
**fetch** : リモートの変更を取り入れるが、ローカルに反映はしない。

ex) マージせずに、リモートリポジトリの状態だけを知りたい

## pull

**pull = fetch + merge**

`git pull --rebase`

commit -> pull -> push

auto merge -> merge commit

**git rebase**
=私の変更作業は皆が変更を完了したものをベースとして行いたい
過去のコミットを新たなコミットに置き換えるもの


## conflict

ファイル修正 add commit
改めて pull push


## diff

`git diff ${ID番号} --name-only`

source treeの'SHA-1'をコピーでIDを取得

## stash

割り込み作業のための一時退避

## blame

誰が変更を加えたかを割り出す。犯人探し

`git blame ファイル名`

## 過去の作業に戻る

### checkout

HEAD（CDの再生位置のイメージ）を戻す

ex) 先月末の状態を元に、新たなブランチを切りたい

### rebase

`git rebase -i HEAD~2`
最新2つを対象

fixup（なかったことにしたい歴史）をpickに含める

```
pick = use commit
fixup = discard
```

ex) typoした歴史をなしにする


### reset

戻せるのはローカルリポジトリのブランチのみ
（pullすればもとに戻る）
コミットを消失させる機能ではなく、
ブランチの指すコミットを変更しているだけ

ex) 他のブランチにコミットするはずが、masterブランチにコミットしてしまった。masterブランチの状態は元に戻したい。

### revert

過去作業を訂正する

ex) 数週間前のある作業だけをキャンセルしたい


## Github Flow

バグや機能追加など、新しく作業する際には常にブランチを切る
masterは常にデプロイできる状態
masterにマージしてもらうためにp-r

## 便利な記法

- githubのissueで以下の書き方をすると、編集画面を出さずにtodoのチェックを着け外しできる。

```
- [ ] todo1
- [ ] todo2
```

- issueで引用したい部分を選択して 'r'で引用コメントがつくれる

## プルリクエスト

### リポジトリへの書き込み権限なし

-> forkしてブランチを切ってp-r（一般的）

http://blog.mogmet.com/github-abecedarian-send-pull-request/

### リポジトリへの書き込み権限あり

-> ブランチを各人が作成して、masterにp-r


## .gitignore

作業の途中から変更したい場合
`git rm -r --cached .`



> 参考
[Gitチュートリアル](https://www.atlassian.com/ja/git/tutorial/)
SeleniumBuilderで作ったファイルをサーバーで動かしたい！

# はじめに
SeleniumBuilderで作ったJsonファイルを使うのではなく、**JavaなりRubyなりお好みの言語にエクスポートして使ったほうがなんぼかマシ**です。
ということで、実際にSeleniumBuilderでファイルを作ってServerに渡します。

# 前提条件
SeleniumBuilderの操作が出来る、分かる人
[参考先](http://qiita.com/nomurasan/items/39ebe76f0542bb2df00f)が分かれば大丈夫です。


# サーバーで動かす理由
プログラマーならコード書いて動かしたいよね！
というところから始まります。
他にも、ヘッドレスで実行できるのでテスト作業がとてもスムーズになります。

# 環境ありますか？
[さっき作ったのでどうぞ](http://qiita.com/nomurasan/items/0e8c342576c90ce2a4cf)
ここで作る環境はあくまでブラウザから実行する場合の話なので、この後で動かすサーバーとはちょっと分けて考えてほしいです。
[追記]もしかしたらSeleniumBuilder3.x系じゃないとダメかも知れません。

# 更に環境を作ります。
SeleniumServerのStandaloneが必要です。
が、[いつものところ](http://docs.seleniumhq.org/)では最新版しか取得できないので、ちょっと回り道します。

[Use Selenium WebDriver 2.53.1 with Firefox 47.0.1](http://seleniumsimplified.com/2016/06/use_selenium_webdriver_jar_locally/)
ここに環境の内訳が全部書いてます。
あとはJavaを入れてターミナル（プロンプト）からダウンロードしたSeleniumServerを実行するとできます。パスが通っているならjava -jar (selenium...jar)で起動したら、SeleniumBuilderの画面から実行->サーバーで動く（ターミナルがなんか反応する）と思います。
もしここで動きが見られないならブラウザを再起動してみてください。

## Javaの入れ方
探せばいっぱいあります。お使いの環境によっては共存させる必要があるかも知れません。

## パスの通し方
[windowsならこの辺](http://realize.jounin.jp/path.html)とかを参考に。
他にもいいサイトはあります。

# 動かしてみよう
SeleniumBuilderで作った操作ファイルはjsonと各環境に合わせて２つ用意しましょう。
SeleniumBuilderはJavaとかRubyとかPython、JavaScriptとC#は読めませんがエクスポートは出来る。一方通行です。
操作部分で修正とかがあるとjsonを変更する方が将来的に楽です。

エクスポートした後は、webdriverにmarionetteの設定を忘れずに。

# エラーになる場合
webdriver側の問題であることが多いです。
Firefox46.0.1だとmarionetteなくても動くはずですが、それより新しいバージョンだとエラーログから推測していくのが良いと思います。
おすすめのサイトはteratailではなく[stackoverflow(リンクは日本語にしておきました)](http://ja.stackoverflow.com/)です。

# コツ
英語ばかりのサイトを開いて即行閉じないのがコツです。
難しいことは書いていません。

## 疑問
[seleniumhq](http://docs.seleniumhq.org/)でメジャーバージョンアップとはいえベータ版である3.0.0beta2を押しているのか、よく分かりません…

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
【メモ】初心者Unixコマンド


## 基本操作

| コマンド | 機能 |
| ----- | ----- |
| Ctrl + a | 行頭移動 |
| Ctrl + e | 行末移動 |
| Ctrl + u | カーソル位置から行頭まで削除 |
| Ctrl + y | 最後に削除した内容の挿入 |
| Ctrl + l | 画面消去 |
| Ctrl + r | 履歴検索 |
| ----- | ----- |
| ls -l | 一覧表示（詳細込み） |
| ls -a | 一覧表示（隠しファイル込み） |
| ls -F | 一覧表示（ファイルの種類） |
| ls dir名/ | ディレクトリの中身を表示 |

## よく忘れるやつ

#### 深いディレクトリを一気に作成

```
mkdir -p report/2016/02
```


#### ファイルの内容を表示（-n:行番号付き）

```
cat -n index.html
```  

#### 長いファイルの内容を表示  

```
less /etc/bashrc
```  

| コマンド | 機能 |
| --- | --- |
| q | 抜ける|
| / | ファイル内検索 |
| n | 次へ |

#### 複数ファイルを指定ディレクトリにコピー  
（上書きされる場合、確認あり）

```bash
cp -i *.txt backupdir
```

ディレクトリのコピーには`-r`

#### 複数ファイルを指定ディレクトリへ移動  
（上書きされる場合、確認あり）   

```bash
mv -i index.html about.html dir1
```

#### カレントディレクトリ（.）から大文字小文字の区別なく（-iname）通常ファイル（-type f）を検索  
-i ignore  

```bash
find . -iname '*.txt' -type f -print
```

#### 頻繁にアクセスする深いディレクトリを使いやすくする

シンボリックリンクを設定する

```bash
ln -s config/production/databases/ dbconfig
```

以降`dbconfig `でアクセスできる

リンク削除は`unlink dbconfig`

#### パーミッション

ex. `chmod 764 sample`

|user|group|other|
|---|---|---|
|rwx |rw- |r--|
|421 |420 |400|
|7   |6   |4  |

r: read（読み）
w: write（書き）
x: execute（実行）

ユーザー(user)に実行権限(execute)を与える
-> `chmod u+x sample`


## TIPS

#### エラー出力

標準エラー出力を`/dev/null`という特殊なファイル（ブラックホール）にリダイレクトして破棄する

```bash
find / -mtime -1 > newfiles.txt 2>/dev/null
```

http://dqn.sakusakutto.jp/2012/06/shell_dev_null_2_1_crontab.html


> 参考
[UNIXコマンド入門 [一般ユーザー編]](http://dotinstall.com/lessons/basic_unix_v2)
WPBrowserのAcceptacneテスト実行前に自作プラグインを有効化する。


WPBrowserでAcceptacneテストをする際に、自作プラグインを有効化に手間取ったので、対処法をメモ

## WPWebDriverでの有効化手順 ##
[こちら](http://codeception.com/for/wordpress "こちら")のドキュメント通り実施すると、

```php
$I->loginAsAdmin();
$I->amOnPluginsPage();
$I->activatePlugin('my-plugin');
```

有効化されるが、WPBrowserではこの通りにやっても有効化されない。

## WPBrowserでの有効化手順 ##
以下の手順で有効化できた。（WordPress 4.6で確認）

```php
$I->loginAsAdmin();
$I->amOnPluginsPage();
$I->checkOption('//*[@data-slug="my-plugin"]/th/input');
$I->selectOption('action', "activate-selected");
$I->click("doaction");

```
c++ builder / TMemo / TRichEdit > セパレータ(+や-など)で改行が入る

```txt:動作確認
C++ Builder XE4
```

TMemoとTRichEditにおいて、長い文字列を入力時にセパレータ(+や-など)で勝手に改行が入る。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/90eda64e-1133-70a2-3522-19816f87f6aa.png)

- TRichEdit (画面上)
  - マイナスの後で改行
- TMemo (画面下)
  - マイナスの後で改行
  - プラスの前で改行

関連 http://stackoverflow.com/questions/6558608/word-wrap-in-tmemo-at-a-plus-char

対策方法は不明。
js-cookieのexpires（有効期限）を細かい単位で設定する

Dateで計算する方法でもいけますが、
切りが良いタイミングで設定したい場合は日を単位にした数値でもOK👍

```js
// 7日
Cookies.set('name', 'value', { expires: 7 });

// 半日
Cookies.set('name', 'value', { expires: 0.5 });
Cookies.set('name', 'value', { expires: 1/2 });

// 5分
Cookies.set('name', 'value', { expires: 5/1440 });

//10秒
Cookies.set('name', 'value', { expires: 10/86164});
```

公式wikiがあります。

> [js-cookie](https://github.com/js-cookie/js-cookie/wiki/Frequently-Asked-Questions)
【質問です】sk-learnのランダムフォレスト回帰で、並列数を-1にするとエラーが出る件について

# 前提

csvファイルをpandasで読み込んで、sk-learnでランダムフォレスト回帰をしようとしています。参照元のサイトでは以下のコードのn_jobsが　**-1**だったため、そのままコピーしたところ以下のようなエラーが吐かれてしまいました。

```
sklearn.externals.joblib.my_exceptions.JoblibValueError: JoblibValueError
```

# 正常に動いているコードは以下のとおりです。



```
r_forest = RandomForestRegressor(
    n_estimators=100,
    criterion='mse',
    random_state=1,
    n_jobs=1,
)

r_forest.fit(X_train, Y_train) # ここでエラーが出る
y_traing_preq = r_forest.predict(X_train)
y_test_preq = r_forest.predict(X_test)
```



どなたかご教示頂けますと幸いです。
Azure WebSitesでClientCertificateを取得するためのコードと設定

Azure WebSitesでClientCertificateを取得するためにはいくつか設定が必要でネットで検索してもとても古いWebRoleの記事しか出てこないorポータルのSSLの設定の記事しか出てこなくて苦労したのでここにメモを残します。

AzureWebSitesでクライアントから送信された証明書ファイルを取得するコードは以下のようになります。
Controllerでは
```csharp
//System.Web.HttpRequestBaseオブジェクト
var cert = Request.ClientCertificate;
```
ApiControlerでは
```csharp
//System.Net.Http.HttpRequestMessageオブジェクト
var cert = Request.GetClientCertificate();
```
で取得できます。

しかしAzureへアップロードした環境ではクライアント証明書を有効にする設定が必要です。設定は以下の手順でやります。

https://resources.azure.com/を開きAzureポータルへログインします。

設定したいサイトのノードをクリックします。
subscriptions –> [your subscription] –> resouceGroups –> [your resource group] –> providers –> Microsoft.Web –> sites –> [my site]
と辿っていきます。
書き込み可能な状態になっていることを確認します。画面右上部のReadWriteが選択されていること）を確認します。
右のペインのEditをクリックして編集状態にします。
clientCertEnabledの値をtrueにします。
PUTをクリックして変更内容をサーバーへ送信します。

これでクライアント証明書が有効になりました。
cakephp Routes の定義


```php
<?php
/*ルートの中で独自の名前を持つパラメータを使うつもりならば、Router::connectNamed を用いて Router にそれを伝える必要があります。上述の例にあるルートに /cooks/someAction/type:chef のようなURLをマッチさせたい場合は、次のようにします。*/

Router::connectNamed(array('type'));
Router::connect(
    '/cooks/:action/*', array('controller' => 'users', 'action' => 'index')
);

```
Google SpreadSheetでCMSっぽく動的にページコンテンツを作る


##やりたいこと
htmlのみで作られたサイトにWhat's Newを動的に更新表示させる機能
ただし大規模改修でなく、最低限の開発でやる。

##Google Driveでhtmlファイルをホストする？

>**「2016 年 8 月 31 日以降はご利用いただけなくなります。」**
https://support.google.com/drive/answer/2881970

ちーん！

##[Google Sheets API](https://developers.google.com/sheets/)を利用して・・・
**理解するのだるっ！！**

##単純にSpreadsheetのウェブに公開機能を使う
Spreadsheetでこんな感じの表を作る。

| date | caption | link |
|:-:|:-:|:-:|
| YYYY/MM/DD | ○○を更新しました。  | http://www.example.com |
| YYYY/MM/DD | ○○を更新しました。  | http://www.example.com |
| YYYY/MM/DD | ○○を更新しました。  |   |

- date = 日付
- caption = 表示させる内容
- link = 詳細リンク

###ウェブに公開
![spreadsheet.png](https://qiita-image-store.s3.amazonaws.com/0/115255/db9e5bd9-111d-f47c-480b-ddf48ef45915.png)
なんかこれ、いろんな形式にできるみたいだけど、下の形式でJSONで吐き出せるみたい。

```html:URL
https://spreadsheets.google.com/feeds/cells/[key]/[worksheetId]/public/values?alt=json
```

[worksheetId]はSheet1であればod6が固定、それ以降は取得が必要

```js+php:whatsnew.html
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
var url = "https://spreadsheets.google.com/feeds/cells/[key]/od6/public/values?alt=json"
var cateArr = [];

//表示させる最大行数
var showMax = 15;

$(function(){
    $("table#whatsnew_tbl tbody").html("");

    //JSONで受け取って整形
    $.getJSON(url, function(data){
        $(data.feed.entry).each(function(){
            if (this.gs$cell.row == 1) {
                cateArr[this.gs$cell.col] = [];
            } else {
                if(cateArr[this.gs$cell.col]) cateArr[this.gs$cell.col][this.gs$cell.row] = this.gs$cell.$t;
            }
        })

        for(var i = 1; i <= showMax; i++) {
            //データなければ飛ばす
            if(!cateArr[1][i+1]) continue;
            
            //linkがあれば作る
            var alink = "";
            if (cateArr[3][i+1]) alink = '&nbsp;&nbsp;<a href="' + cateArr[3][i+1] + '">詳細</a>';

            //HTML作り変え
            $('<tr class="whatsnew_tr">'+
              '<th class="whatsnew_td_title">' + cateArr[1][i+1] + '</th>'+
              '<td class="whatsnew_td_contents">' + cateArr[2][i+1] + alink + '</td>'+
              '</tr>').appendTo('table#whatsnew_tbl tbody');
        }
    })
});
</script>


<table id="whatsnew_tbl">
<tbody>
<tr class="whatsnew_tr"><th class="whatsnew_td_title">データ取得中</th></tr>
</tbody>
</table>
```

あとはSpreadsheetを関係者で共有し、2行目に新着情報を挿入していくだけで簡易的に動的更新となる。

continueかかると15件表示じゃなくなるけど、以上！
Azure Functionsでの API Key認証まとめ

HTTPトリガー時のAPI Key認証について、ちょっとはまったのでメモを残しておきます。


|  | standard| webhook |鍵の指定方法|
|:----------:|:-----------:|:------------:|:------------:|
| Authorization level | function | - |URLクエリストリングのcodeに指定（Function Urlにアクセス）|
| Authorization level | anonymous | - |なし|
| Authorization level | admin | - |URLクエリストリングのcodeに指定（data\secrets\host.jsonのmasterKeyの値）|
| webhook type | - | GitHub |Github Secretの値をGitHubサイト側にも設定|
| webhook type | - | GenericJSON |URLクエリストリングのcodeに指定（Function Urlにアクセス）|
| webhook type | - | slack|slackサイトのIntegration SettingsのTokenの値でdata\secrets\＜Function App名＞.jsonを書き換える|

webhook typeのslackはstandard editorでは選択できないので、Advanced editrを使う必要があります。
RubyでのAws S3疎通テスト

# はじめに
railsを使用してS3への疎通テストを行う必要があったことと、awsのsdkがv２なって情報が古い記事等もあったため備忘録として
[https://github.com/aws/aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)

## Gemfile作成
```
bundle init
```
## gemを使ってawssdkインストール
```:Gemfile
gem 'aws-sdk', '~> 2'
```
envファイルも使いたいのでdotenvも追加

```:Gemfile
gem 'dotenv'
```
Gemfileに記載したらbundle install

```
bundle install
```

## env設定
```:.env
AWS_REGION=xxxxxxxxxxxxxxxx
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxx
```

## 接続確認
```:check.rb
require 'aws-sdk-core'
require 'dotenv'

Dotenv.load ".env"

Aws.config[:region] = ENV['AWS_REGION']
s3 = Aws::S3::Client.new
```

接続キーの```AWS_ACCESS_KEY_ID```と```AWS_SECRET_ACCESS_KEY```に関してはSDKが環境変数```ENV['AWS_ACCESS_KEY_ID']```と```ENV['AWS_SECRET_ACCESS_KEY']```を自動で拾ってくれる。

## ファイルアップロード
同一階層に```helloworld.txt```を作成中身はお決まりの文言

```:check.rb
s3.put_object(
    bucket: 'bucket_name',
    body: File.open("helloworld.txt"),
    key: "helloworld.txt"
)
```

## ファイル取得
```:check.rb
s3.get_object(bucket: 'bucket_name', key: 'helloworld.txt').body.read
```
結果は```"Hello world!\n"```

## ファイルの削除
```:check.rb
s3.delete_object(bucket: 'bucket_name', key: 'helloworld.txt')
```

# まとめ
とりあえず疎通だけなら最低限これでいいかな。
バケットの作成からとかファイルの作成からとかはAPIのリファレンスに乗ってるんで要確認。
ファイルの存在チェックとか削除が成功したかとか確認するのはどうするんだろうか。

# 参考
https://github.com/aws/aws-sdk-ruby
http://docs.aws.amazon.com/sdkforruby/api/index.html
https://github.com/bkeepers/dotenv
テスト用コード証明書を発行しサインする

#CA-1.ルート証明書作成 
> makecert -a sha512 -e 12/31/2099 -cy authority -r -n "CN=testRootCA,O=testRootCA,C=JP,E=foo@example.co.jp" -sv D:\test_rootca.pvk D:\test_rootca.cer

#CA-2.デジタル署名作成 
> makecert -a sha512 -e 12/31/2099 -cy end -n "CN=testInc,O=testInc,C=JP,E=hoge@example.co.jp" -ic D:\test_rootca.cer -iv D:\test_rootca.pvk -sv D:\test.pvk D:\test.cer

#DEV-1.ソフトウェア発行元証明書(.spc)作成 
> cert2spc D:\test.cer D:\test_rootca.cer D:\test.spc

#DEV-2.コードサイニング証明書(.pfx)作成 
> pvk2pfx -pvk D:\test.pvk -spc D:\test.spc -po testpass -pfx D:\test.pfx -f

#DEV-3.実行ファイルにコードサイニング証明書(.pfx)を書き込み
> signtool sign -f D:\test.pfx -p testpass "d:\your_application_signed.exe"

copy from:
https://vok.paburica.com/index.php?WindowsTips%2F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%83%86%E3%82%B9%E3%83%88%E7%9B%AE%E7%9A%84%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B5%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%9F%E3%81%84
/usr/bin/GET,/usr/bin/HEAD,/usr/bin/POST

HTTPの疎通テストでtelnetで80番ポートに繋いで実験しているときに気づいたのですが、いつの間にか`/usr/bin/GET`というコマンドがインストールされてました。
ディストリビューションはCentOS6.8。

調べるとperl-libwww-perlパッケージに同梱されているコマンドのようで、何かの依存関係でインストールされたのでしょうね。

`GET`コマンドの他に`HEAD`コマンドと`POST`コマンドが使えます。

## `/usr/bin/GET`
`GET`コマンドはWebサイトのコンテンツを拾ってくるコマンド。

```shell-session
# GET 'http://yahoo.co.jp'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
(以下略)
```

便利ですね。

## `/usr/bin/HEAD`
`HEAD`コマンドは、ヘッダ情報を取得します。

```shell-session
# HEAD 'http://yahoo.co.jp'
200 OK
Cache-Control: private, no-cache, no-store, must-revalidate
Connection: close
Date: Tue, 23 Aug 2016 05:16:27 GMT
Pragma: no-cache
Server: nginx
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Expires: -1
Client-Date: Tue, 23 Aug 2016 05:16:27 GMT
Client-Peer: 183.79.75.234:80
Client-Response-Num: 1
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Frame-Options: SAMEORIGIN
X-XRDS-Location: https://open.login.yahooapis.jp/openid20/www.yahoo.co.jp/xrds
X-XSS-Protection: 1; mode=block
```

curlやwgetよりもシンプルに使えるのでWeb開発でHEADのチェックで使えそうです。

## `/usr/bin/POST`
もう一つの`POST`コマンドは名前の通り、POSTメソッドを投げてくれるコマンドだと思いますが、手っ取り早くPOSTする環境がなかったので未検証です。ゆるくてすいません。

## ということで

`GET`、`HEAD`、`POST`コマンドは手軽にHTTPメソッドを試せるので色々便利になりそうです。

ところで。

```shell
$ GET /
<HTML>
<HEAD>
<TITLE>Directory /</TITLE>
<BASE HREF="file:/">
</HEAD>
<BODY>
<H1>Directory listing of /</H1>
<UL>
<LI><A HREF="./">./</A>
<LI><A HREF="../">../</A>
<LI><A HREF=".autofsck">.autofsck</A>
<LI><A HREF=".autorelabel">.autorelabel</A>
<LI><A HREF="bin/">bin/</A>
<LI><A HREF="boot/">boot/</A>
<LI><A HREF="cgroup/">cgroup/</A>
<LI><A HREF="dev/">dev/</A>
<LI><A HREF="etc/">etc/</A>
<LI><A HREF="home/">home/</A>
<LI><A HREF="lib/">lib/</A>
<LI><A HREF="lib64/">lib64/</A>
<LI><A HREF="lost%2Bfound/">lost+found/</A>
<LI><A HREF="media/">media/</A>
<LI><A HREF="mnt/">mnt/</A>
<LI><A HREF="opt/">opt/</A>
<LI><A HREF="proc/">proc/</A>
<LI><A HREF="root/">root/</A>
<LI><A HREF="sbin/">sbin/</A>
<LI><A HREF="selinux/">selinux/</A>
<LI><A HREF="srv/">srv/</A>
<LI><A HREF="sys/">sys/</A>
<LI><A HREF="tmp/">tmp/</A>
<LI><A HREF="usr/">usr/</A>
<LI><A HREF="vagrant/">vagrant/</A>
<LI><A HREF="var/">var/</A>
</UL>
</BODY>
</HTML>
```

おっ、ファイルシステムをHTMLフォーマットで返すのか…。しかし、パーミッションで見れないファイルは拾えないので安心かも。
c++ builder XE4, 10.2 Tokyo > TMemo | TEdit > TMemoとTEdit共通処理 > TCustomEditを使う

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TEditで実装してきたソフトをTMemoに変更している。
`if (dynamic_cast<TEdit *>(Sender) == NULL`のような処理は、当然TMemoではNULLとなる。

このような処理において、TMemoとTEdit両方で使う場合を考えてみた。

型の継承をヘルプで確認した。

- TMemo
  - TObject > TPersistent > TComponent > TControl > TWinControl > TCustomEdit > TCustomMemo > TMemo
- TEdit
  - TObject > TPersistent > TComponent > TControl > TWinControl > TCustomEdit > TEdit

上記より、TCustomEdit より親の型に設定すれば共通処理となることが分かる。
<font color=red>TCustomEdit を継承経路に持つ他の型も有効になる点は注意が必要</font>。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditMemoClick(TObject *Sender)
{
	if (dynamic_cast<TCustomEdit *>(Sender) == NULL) {
		return;
	}

	TCustomEdit *dstPtr = (TCustomEdit *)Sender;
	dstPtr->Hint = L"Hint text";
	dstPtr->ShowHint = true;
}
//---------------------------------------------------------------------------
```
[まとめ]今からすぐにSeleniumBuilderを使いたい人のための環境構築

# はじめに
**正直おすすめしません。**
大事なことなので、一番最初に書きました。
**正直おすすめしません。**

## まじめに
この記事は非エンジニアの方がSeleniumBuilderというツールを使ってブラウザテストをいい感じにやりたい！というケースを想定して書いていますので、エンジニアの方々には退屈かもしれません。

# 対象

- プログラマーになろうと思ってCとかJavaとか勉強して挫折した人
- JavaScriptで何を勉強したらいいか分からない人
- プログラムの何が面白いのか分からない人

# とても とても だいじなこと
そもそもSeleniumBuilder自体が非エンジニアに優しくないです。
**この記事はSeleniumBuilderの記事ですが、通常はSeleniumIDEを使うことをお勧めします。**
[SeleniumIDE(要Firefox)](https://addons.mozilla.org/ja/firefox/addon/selenium-ide/)

それでもSeleniumBuilderを選択する方は下を読み進めてもらっても大丈夫です。

# 環境構築
ここが一番難しいです。出来たらテンションあげていいです。

## Firefox46.0.1をインストール
まずFirefoxの古いバージョンをダウンロードします。
**最新版以前のFirefoxには、最新版で解消済みの脆弱性が解消されていない場合がありますので、今後Firefoxを使用する時は絶対に安全な環境でのみ使用してください。**
[firefox46.0.1](https://ftp.mozilla.org/pub/firefox/releases/46.0.1/)
たとえばwindowsユーザーならwin32,win64とあって、さらにEMEか無印かとありますので、それぞれ対応している環境のリンクを押しましょう。
[EMEについてはこちらが参考になります。(CNET)](http://japan.cnet.com/news/service/35047914/)

インストール時に色々聞かれるものは「はい」で進めて大丈夫です。

## SeleniumBuilder2.3.5を入れる
なお、SeleniumBuilderの最新版は3.0.9ですが、2.3.5と互換性はありません。
導入は以下をご覧ください。
[Selenium Builder がローカル実行出来なくて暫定対応](http://qiita.com/mihonak/items/28258ec5c242dfe5fe5e)

読んでてちょっと難度が高いかな？とは思ったんですが、ここは頑張って乗り切ってください。
ヒントは、英語のページを開いた時に即行で閉じないことです。英文を読まなくてもなんとなく雰囲気で分かる努力をしましょう。
ここが挫折ポイント１です。挫折したら[SeleniumIDE](https://addons.mozilla.org/ja/firefox/addon/selenium-ide/)にしましょう。

# 構築終わり
おめでとうございます！
これであなたもエンジニアの仲間入りを果たしました。
Firefoxが起動できたら、Ctrl+Alt+Bとかで起動して白枠左下の言語を日本語に変えて再起動をしたら何となくさわれると思います。
SeleniumBuilderの使い方については探すより自分で確かめた方がいいです。資料がないので。

## 対象がおかしくない？
SeleniumBuilderには、記録画面からコマンド->記録->スクリプトの保存というものがあって、この中に直接JavaScriptを書き込む事が出来ます。
JavaScriptの実行結果をreturnすることでSeleniumの変数に値を持たせる事も出来ますし、基本的に１行しか書けないのでエラーにすぐ気付けます。ついでにいうと、画面の状態が見えるので画面キャプチャをすればプログラマーに助けを求めるのが簡単になります。

そういったアプローチから、プログラミングに対する敷居を下げられればと思ってます。

# 最後に
大事な事なのでもう一度書きます。
Firefox46.0.1は最新版までに解決されている既知を含めた脆弱性に対応できません。
**つまり、大変危険です。**

上で書いたとおり、正直おすすめしてないのはそういう問題も含めています。
当たり前ですが、問題が生じたとしても自己責任です。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
webpack初见


`webpack`, **javascript module bundler. generates static assets representing those modules.** 现存的模块处理工具不满足大项目(大的单页面项目),为什么要重复造轮子最值得说的就是`代码分割`,项目的代码按照模块来开发处理, 同样最终的静态文件也是要能够无缝进行模块化.

###目的

- 能够把现有的依赖树整个切分按需加载
- 能够保证初始化加载的代码里很小, 很快
- 静态资源同样能够模块化
- 能够轻松地把第三份库作为模块加载
- 能够很容易自定义这个模块处理工具的每一个部分.
- 适合大项目.


webpack 有什么不同:

- 代码分割

> webpack 定义了2种不同的依赖树,同步的和异步的. 异步的依赖作为一个切割点, 然后单独存在, 共享这个块.

- 加载器

> webpack 只能处理 javascript, 但是通过 loader 可以处理各种资源转换为 javascript, 这样就能够处理任何形式的模块.

- 智能解析

> webpack 可以智能解析各种第三方的库, 它甚至可以允许用表达式来书写依赖. 如` require("./templates/" + name + ".jade"). 它支持常见的模块风格( CommonJS 或者 AMD)

-插件系统

> webpack 拥有丰富的插件系统. 大部分内部的功能都是基于这个插件系统的. 这个就允许你可以更加自由的自定义它本身已经各种第三方需求.


---

#webpack 产生的动机

现如今的网页有以下的发展趋势:

- 越来越多的使用 javascript
- 越来越多的使用现代浏览器
- 更少的重载整个页面->一个页面的代码越来越多.

结果就是客户端承载了很多的代码. 面对的问题就是如何组织这些代码, 模块化就应用而生了.

###模块化系统

有很多的标准用来定义依赖和声明变量

- 原始的`<script>`

> 这个是最原始的方法了, 并没有借助任何的工具,只是人为的给定义到不同的 js 文件里, 然后手动去管理加载的顺序来处理依赖和冲突. 时间久了就没有人知道什么是什么了.

- CommonJS

> 这个是通过同步的` require` 来完成单独的模块,然后以模块的形式暴露出去使用. 通常在 `nodejs` 中使用.
>	优点:
> - 这样定义的模块虽然内部是同步加载的但是它可以缓存重用.
> - 有很多现有的东西拿来就能用
> - 简单上手
>缺点:
> - 网络传输是异步的
> - 不能够并行加载模块

- AMD

> 相对于 CommonJS 的同步加载,它解决了异步加载的问题, 但是同样有很多问题
>优点:
>- 异步加载
>- 并行加载多模块
>
>缺点:
>- 难懂
>- 复杂等
 
- ES6 模块

> 想法很好,已经很为标准,但是浏览器落实需要时间 ...

- 更多..

- 中立的方法:

保留现有的风格, 然后添加自定义的模块风格进去.

###传输

模块总归还是要在客户端执行,就需要从服务器传输到浏览器.
有2个极端:

- 一个模块一个请求
- 所有模块一次请求拉下来

都可以,但是都不完美

####一个请求一个模块

- 优点:指搂需要的
- 缺点:请求多就意味着过载
- 缺点:慢,越来越慢

####所有请求一次来

- 优点:减少请求次数
- 不用的也要 down 下来

###块形式传输

来一个灵活的方式,折中的.

- 当我们在编译模块的时候,分割代码到块

减少每次请求的数据量, 按需加载模块. 工程师定义分割点. 
> 灵感来源于 google 的 GWT


###为什么只支持 javascript 呢?

为什么只支持 javascript 呢, web 有很多东西需要处理的

- css
- image
- webfonts
- html template
- etc

或者需要转换的

- coffeescript
- elm
- less stylesheets
- jade template
- etc

其他他们直接 require('..') 就可以了

###静态分析

当编译这些模块的时候,静态分析用来处理之间的依赖.


ref:

1. https://webpack.github.io/docs/motivation.html
2. https://webpack.github.io/docs/what-is-webpack.html
c++ builder XE4, 10.2 Tokyo > TMemo | TRichEdit > ダブルクリック時の動作が異なる

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

複数行を扱うコンポーネント

- TMemo
- TRichEdit

TRichEditはドラッグドロップがデフォルトで有効になっている。

2者を比べていて、ダブルクリック時の違いも見つかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c7614380-a761-6fc3-d242-7763996529b9.png)

上がTRichEdit, 下がTMemo。

テキストの`lastname@software.com`の`com`部分をダブルクリックした時に以下の違いがある。

### TRichEdit

comが選択される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7158a01a-908c-1a4d-bc71-c7c484ef1329.png)

### TMemo

テキスト全体が選択される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f6af98a5-0e25-4196-6cf2-f14ad070f3e2.png)

### 補足

TRichEditを使った場合、ソフト利用者にとってテキスト全体を選択して消す操作が分かりにくいと思う。

TRichEditでテキスト全体を選択するには「トリプルクリック」にて対応できるが。。

関連 [Mac / Windows | トリプルクリック使ってますか？ (テキスト行全体を選択する)](http://qiita.com/YumaInaura/items/d97f87e4df3986df011c)
Rails Appの3000番ポート外からアクセスできない

VPSにRails環境を構築して、外からアクセスしてみたら、拒否されました。

iptablesの設定何回も確認しましたが、やはりダメでした。

半日掛かって、ようやく原因究明。

Rails Serverの起動コマンドは仕様変更あるらしい。

$ rails s
で起動すると、外からアクセス不可で、下記のコマンドだったら、うまく行けました。
$ rails s -b 0.0.0.0

以上。
Atom  メモ　ショートカット等

<h1>Atom のショートカット等　学んだ事メモ</h1>

<title>１ショートカット</title>
・


<title>２学び</title>
・ツリービューを表示、非表示させたい場合は、
　「comand」 + 右上の「＼バックスラッシュ」を押す

・設定ファイルについて
　コマンドパレットを使うと使いたいコマンドを調べて表示してくれる
 コマンドパレットの呼び出し方は、、
　view ⇨　toggle command pallet もしくは、ショートカットキーの
　ctrl + shift + p　で開く

・初期設定で大事な部分
　・Show Invisibles はチェックしておくと良い。（全角の空白等を表示してくれる為、ミスが減る）

・言語毎にタブを２桁にするとか、４桁にするといったこともできる。

・スニペット　：ショートカット類、
例えば、aと押してから、tabキーを押すと、
aタグが出てくるので、あとはリンク先を記載すれば良いといったことが出来る。

・show indent guide （インデントガイドの表示）
・show invisible （タブ、半角スペース等表示
【Wordpress】WordpressでSSL対応、Basic認証などで.htaccessに記載するアレコレ覚書【.htaccess】

# SSL化（全ページ）

```lang:.httaccess
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>
```

## ただしさくらサーバの場合

```lang:.htaccess

# sakura ssl
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{ENV:HTTPS} !^on$
	RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

```

に加えて

```lang:wp-config.php
// さくらサーバでhttps対応する場合記述
if( isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) ) {
	$_SERVER['HTTPS'] = 'on';
	$_ENV['HTTPS'] = 'on';
	$_SERVER['HTTP_HOST'] = 'xxx.jp';
	$_SERVER['SERVER_NAME'] = 'xxx.jp';
	$_ENV['HTTP_HOST'] = 'xxx.jp';
	$_ENV['SERVER_NAME'] = 'xxx.jp';
}
```

を追記、これしないとセカンド以降がSSL化されへんなー。

# 管理画面にbasic認証

```lang:.htaccess
AuthUserFile /xxxx/xxxx/.htpasswd
AuthType Basic
AuthName "Web access"
Satisfy all
Order deny,allow

# 公開前で全体にかける場合は記述、本番公開時コメントアウト
require valid-user

<Files "wp-login.php">
# 本番公開時コメントアウト解除でログイン画面のみ
#require valid-user
</Files>

<FilesMatch "\/?wp-admin">
require valid-user
</FilesMatch>

# admin-ajax.phpだけ除外
<Files "wp-admin/admin-ajax.php">
Satisfy any
order allow,deny
allow from all
</Files>

```

# 他ブルートフォースアタック対応など

```lang:.htaccess
<Files "xmlrpc.php">
Order Deny,Allow
Deny from all
</Files>

<FilesMatch "^(wp-config\.php|wp-mail\.php|install\.php)">
Order Allow,Deny
Deny from all
</FilesMatch>
```
phpでphpをはさむ方法

```php

<?php if($a == $b){?>
<?php
if ($a % 2 == 1):
    echo "ほしい";
?>
<?php }?>


//It seems to me, that many people think that

<?php if ($a == 5): ?>
A ist gleich 5
<?php endif; ?>

//is only with alternate syntax possible, but 

<?php if ($a == 5){ ?>
A ist gleich 5
<?php }; ?>

//is also possible.

//alternate syntax makes the code only clearer and easyer to read


//If you wan't to use the alternative syntax for switch statements this won't work:

<div>
<?php switch($variable): ?>
<?php case 1: ?>
<div>
Newspage
</div>
<?php break;?>
<?php case 2: ?>
</div>
Forum
<div>
<?php break;?>
<?php endswitch;?>
</div>

//Instead you have to workaround like this:

<div>
<?php switch($variable): 
case 1: ?>
<div>
Newspage
</div>
<?php break;?>
<?php case 2: ?>
</div>
Forum
<div>
<?php break;?>
<?php endswitch;?>
</div>
```
Spring + JUnit で parameterized test

# 参考サイト

[http://stackoverflow.com/questions/28560734/how-to-run-junit-springjunit4classrunner-with-parametrized](http://stackoverflow.com/questions/28560734/how-to-run-junit-springjunit4classrunner-with-parametrized)
[https://github.com/junit-team/junit4/wiki/parameterized-tests](https://github.com/junit-team/junit4/wiki/parameterized-tests)

# 概要

- RunWithにSpringJUnit4ClassRunner.classではなくParameterized.classを指定する
- BeforeでTestContextManagerをsetupする
- ParametersとParameterを書く

以上。

# コード

```java
@RunWith(Parameterized.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SomeServiceTest {

    @Autowired
    SomeService service;

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                { "hoge_", "xxx" },
                { "~~", "xxx" },
                { "af%", "xxx" },
                { "toooooooooooooooooooooooooooooooooooooooooooooooooooooolong", "xxx" }
        });
    }

    // <= data[n][0]
    @Parameter
    String fString;

    // <= data[n][1]
    @Parameter
    String fExp;

    private TestContextManager testContextManager;

    @Before
    public void setupContext() throws Exception {
        testContextManager = new TestContextManager(getClass());
        testContextManager.prepareTestInstance(this);
    }

    @Test
    public void testSome() {
        assertThat(service.doSome(fString), is(fExp));
    }
}
```
CakePHP3で処理の実行時間を計測する簡単な方法

# CakePHP3で処理の実行時間を計測する簡単な方法

どこに時間がかかっているのか、各処理の実行時間を計測したい時、ありますよね？

そういうとき、いろいろな計測方法があると思いますが、CakePHP3で、手っ取り早く計測したいときは `\DebugKit\DebugTimer` を使うと楽です。

## 計測コードの設置

`\DebugKit\DebugTimer::start()` と `\DebugKit\DebugTimer::stop()` を差し込みます。第1引数がキーになっているので合わせてください。

```php
<?php
    -snip-
    public function edit($id = null)
    {
        \DebugKit\DebugTimer::start('post_get', 'データ取得'); // 計測スタート
        $post = $this->Posts->get($id, [
            'contain' => ['Tags']
        ]);
        \DebugKit\DebugTimer::stop('post_get'); // 計測終了
        if ($this->request->is(['patch', 'post', 'put'])) {
            $post = $this->Posts->patchEntity($post, $this->request->data);
            if ($this->Posts->save($post)) {
                $this->Flash->success(__('The post has been saved.'));
    - snip -
```

## 実行時間の確認

DebugKitのTimerパネルを確認してみてください。

<img width="1132" alt="ScrenCaptured 2016-08-23 10.36.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/808/a7f00205-5902-6cca-a0df-a6c19eacac30.png">

「データ取得」という行が増えていますね。
入れ子での計測も可能です。

楽ー。
Androidでフリックイベントを取得する

メモ：ScrollViewではGestureDetectorが動かずはまってしまった。LinearLayoutでは問題なく動作した。

Androidでフリックイベントを取得する

```kotlin

    // Y軸最低スワイプ距離
    private val SWIPE_MIN_DISTANCE = 50
    // Y軸最低スワイプスピード
    private val SWIPE_THRESHOLD_VELOCITY = 200
    // X軸の移動距離 これ以上なら縦移動を判定しない
    private val SWIPE_MAX_OFF_PATH = 200

    // タッチイベントを処理するためのインタフェース
    private var mGestureDetector: GestureDetector? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity)
        mGestureDetector = GestureDetector(this, mOnGestureListener) // => 忘れない
    }

    // タッチイベント
    override fun onTouchEvent(event: MotionEvent): Boolean {
        return mGestureDetector!!.onTouchEvent(event)
    }

    // タッチイベントのリスナー
    private val mOnGestureListener = object : GestureDetector.SimpleOnGestureListener() {
        // フリックイベント
        override fun onFling(event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
            try {
                // 移動距離・スピードを出力
                val distance_y = Math.abs(event1.y - event2.y)
                val velocity_y = Math.abs(velocityY)
                Log.d("onFling", "縦の移動距離:$distance_y 縦の移動スピード:$velocity_y" )

                // X軸の移動距離が大きすぎる場合
                if (Math.abs(event1.x - event2.x) > SWIPE_MAX_OFF_PATH) {
                    Log.d("onFling","横の移動距離が大きすぎます")

                // 開始位置から終了位置の移動距離が指定値より大きい
                // Y軸の移動速度が指定値より大きい
                } else if (event2.y - event1.y > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.d("onFling","上から下")

                // 終了位置から開始位置の移動距離が指定値より大きい
                // Y軸の移動速度が指定値より大きい
                } else if (event1.y - event2.y > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.d("onFling","下から上")
                }

            } catch (e: Exception) {
                // TODO
            }

            return false
        }
        // 長押し
        override fun onLongPress(e: MotionEvent?) {
            super.onLongPress(e)
        }
    }
```

参考
-----------

以下の記事を参考にさせて頂きました。

* [Android開発 フリックイベントを取得する] (http://takeshiyako.blogspot.jp/2015/08/android-flick-input-event.html)
【PostgreSQL】データをまるごと別環境のデータに入れ替える（ローカル開発環境向け）

既存のローカルデータをまるごとステージングのデータに入れ替えたい、といったケースを想定しています。

## 実施環境

* OS: OS X El Capitan (10.11.6)
* Vagrant: 1.8.5
* Virtualbox: 5.1.2 r108956
* PostgreSQL: 9.3.10

## 1. DBの再作成（DROP -> CREATE）

#### step1. ローカルのDBサーバに接続する
```
$ vagrant ssh <dbサーバ>
```

#### step2. 全テーブル（スキーマ）を削除する
**！全テーブルが同じスキーマにある必要があります**

```
$ sudo -u postgres psql -U postgres -d <DB>
<DB>=# DROP schema public cascade;
```

#### step3. スキーマを再作成する
```
<DB>=# CREATE schema public;
```

#### step4. 接続ユーザに権限を付与する
```
<DB>=# GRANT ALL ON schema public TO <user>;
```

## 2. レストア

#### step1. ローカルのDBサーバに接続する
```
$ vagrant ssh <dbサーバ>
```

#### step2. ステージング環境からデータをレストアする
```
# 直接挿入する場合
$ pg_dump -h <取得元> -d <DB> -n public -U <user> | psql [-h <挿入先>] -U <user> -d <DB>

# 一度ファイルに保存する場合
$ pg_dump -h <取得元> -d <DB> -n public -U <user> > <file>
$ psql [-h <挿入先>] -U <user> -d <DB> < <file>
```
## 参考
[Drop all tables in postgresql?](http://stackoverflow.com/questions/3327312/drop-all-tables-in-postgresql)
[Postgres INSERT ERROR: permission denied for schema public](http://serverfault.com/questions/488669/postgres-insert-error-permission-denied-for-schema-public)
StoryboardのSize ClassでiPadも縦横のレイアウトを切り替える

StoryboardのSize ClassでiPhoneの縦横のレイアウトを切り替えたい場合、Any/Anyで共通のレイアウト作って、Any/Compact横用にレイアウトを作ったりします。
が、これをiPadで動作させると、縦でも横でも共通レイアウトになってしまいます。
Size ClassではiPadの縦と横のレイアウトを分ける設定はないようです。
iPhoneとiPadで同じように縦横でレイアウトを分けたい場合、これではちょっと不都合です。

これを解決するには以下の手順を行うとうまくようです。
1. レイアウトを分けたいViewControllerを適当なViewControllerのChildViewControllerにします。
2. ParentViewControllerの方で`UIViewController#overrideTraitCollectionForChildViewController` をoverrideし、画面の向きに応じた `UITraitCollection` を返してあげます。

```
override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? { {
        let any = UITraitCollection(verticalSizeClass: .unspecified)
        let compact = UITraitCollection(verticalSizeClass: .compact)
        
        // landscape
        if self.view.frame.width > self.view.frame.height {
            return UITraitCollection(traitsFrom: [any, compact])
        }
        
        // portrait
        return UITraitCollection(traitsFrom: [any, any])
    }
```

今回、例として以下の様にピンクのビューを縦の時は左上、横の時は右下になるように配置してみました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/14751/ff43e7c5-2d25-ca30-9bc0-ea72559fb200.png" width="320">　　　<img src="https://qiita-image-store.s3.amazonaws.com/0/14751/ca7d4708-acb3-b6b6-8c20-4fde7f972153.png" width="320">

で、iPadで起動して縦横回転させてみると
![rotate.gif](https://qiita-image-store.s3.amazonaws.com/0/14751/fa4cc587-611b-0b4c-2d35-f9f392b0dda1.gif)
ちゃんと縦横で切り替わりました。

ただ、ChildViewControllerにしないとダメなのがちょっと微妙ですね。
アップル的にはiPadは縦と横でレイアウトを分けてほしくないんでしょうか？


## 参考
http://stackoverflow.com/questions/26633172/sizing-class-for-ipad-portrait-and-landscape-modes/28268200#28268200
コミット間で変更されたファイルを列挙する

# 要望: 前回のコミットで変更されたファイルを開きたい
下のコマンドで行ける形にする。`git diff --name-only HEAD HEAD^`を使う。

***vim \`diff-name\`***

# 設定方法: ワンラインで設定できる
以下のコマンドをコマンドラインに叩くか、rcファイルに記述する。
```
function diff-name(){if [ "$1" = "" ]; then commit=HEAD^;else commit=$1 fi;echo `git diff --name-only HEAD $commit | tr '\012' ' '`}
```
## 注意
ファイル名にスペースが入っていると期待した動作をしない。

# 使用例
## 前回のコミットから変更のあったファイルをバッファに入れてVimを起動。
```
vim `diff-name`
```
## `origin/master`との間で変更のあったファイル一覧をVimで開く
```
vim `diff-name origin/master`
```

# アレンジ
## `echo`ではなく、そもそも`vim`を起動する。
```
function open-vim-diff-name(){if [ "$1" = "" ]; then commit=HEAD^;else commit=$1 fi;vim `git diff --name-only HEAD $commit | tr '\012' ' '`}
```

# 参考リンク
http://qiita.com/mo_to_44/items/6d8b34f4419c604bb23e
SublimeGtagsで構造体のメンバ変数もジャンプ可能にする

# SublimeGtagsで構造体のメンバにもジャンプ
SublimeTextでGlobal GNUを使うPackage、SublimeGtagsを使わせて頂いているが、構造体のメンバ変数にジャンプできないのでできるようにしてみた

# 環境
SublimeText3 + SublimeGtags

# コード変更

```gtagsplugin.py
            symbol = view.substr(view.word(view.sel()[0]))
            matches = tags.match(symbol)
            if not matches:
-                status_message("'%s' is not found on tag." % symbol)
-                return
+                print("'%s' is not found on tag. Retry by using -s" % symbol)
+                matches = tags.match(symbol, local_symbol=True)
+                if not matches:
+                    status_message("'%s' is not found on tag." % symbol)
+                    return
```

```gtags.py

-    def match(self, pattern, reference=False):
-        return self._match(pattern, '-ax' + ('r' if reference else ''))

+    def match(self, pattern, reference=False, local_symbol=False):
+        return self._match(pattern, '--result cscope --encode-path " " -ax' + ('r' if reference else '') + ('s' if local_symbol else ''))

```

# 内容
まず普通にタグ検索して、見つからなければglobalの -s オプション付きで検索する。
-sオプションは、マニュアルには下記のように書いてある通りシンボル検索。

       -s, --symbol
              Print other symbol tags.  Other symbol means the reference to  a
              symbol which has no definition.


従って参照している箇所も結果に出てくるので、その中から定義を探さないといけないが、それでも割と楽にジャンプできるようになったのでコードを読むのもまた早くなった。
CommonJS 和 AMD



基本上可以这样说,对于 CommonJS 和 AMD 二者,能把他们发扬光大的不得不说 **nodejs** 和 **require.js** 了.

#CommonJS

`CommonJS`称之为一个 project, 目的是用来定义声明 Javascript 在浏览器之外的一个生态系统.(如服务器端或者桌面程序), 起源于2009年工作于 Mozilla 的工程师 **Kevin Dangoor**, 当时的名字叫做` ServerJs`. 然后在2009年8月改名为` CommonJS` 而且放出来了兼容的 APIs. 在2013年五月的时候, **Node的包管理工具** `npm`的作者 `Isaac Z. Schluter`说对于 Node.js, CommonJS 已经过时, Node.js 的核心开发工程师应该避免使用它.

从官网的描述来看,

>http://www.commonjs.org/

说 Javascript 是一个很牛的但是更多的面向浏览器的动态语言,但是呢其实 javascript 可以做更多的事情, 而在做`更多的事情`的时候就出现很多其他的需求, 这个时候我们就需要一个更加丰富的 APIs 来满足他们. 提供无线丰富的标准库正如 Python, Ruby还有 Java 那样. 初衷就是工程师可以使用 CommonJS 的 API 来写更多的跨平台的基于 Javascript运行时的宿主环境之上. 通过兼容 CommonJS 的系统你可以:

- 服务器端 js 应用
- 命令行工具
- 桌面 GUI 应用
- Hybird 混合


我 fuck, 到底我还是没有找到`什么是 CommonJS`, 很多地方就是说, 它是一个简单的声明定义,用来定义如何声明一个` module`, 然后如何让 module 和其他的 module 一起工作.

我们定义一个`CommonJS`规范下的 **module**, 它呢其实就是一块可复用的 js 代码, 如何`复用`? 就是在定义声明这个 module 的时候, 定义导出一些对象, 让他们可以被其他代码依赖使用. **不同于 AMD, 这里并没有什么函数定义来包裹模块.**

如何定义一个 **CommonJS** 的`module` 呢? 
它有2个主要部分组成:

- 一个就是自由的变量` exports`, 它就是将要暴露出来给其他模块的.
- 还有一个` require` 函数, 它用来让模块导入一个被` export` 的变量.

> http://wiki.commonjs.org/wiki/Modules/1.1

1. `require`, 定义函数
2. `exports` module 定义的对象
3. `module`, 一个对象

如:

```js
// 假如我们新建一个 math.js 的文件
//我们先定义一个函数

function add(){
 var sum = 0, i =0, args =argurments, 1 = args.length
 while(i<1){
   sum += args[i++];
 }
 return sum

}
exports.add = add

//以上我们就完成了一个 CommonJS 的 module

//然后我们尝试如何使用它
// 定义一个 increment.js
var add = require('math').add;
exports.increment = function(val){
 return add(val,1);
}


// 然后我们再定义一个

var inc = require('increment').increment;
var a =1;
inc(a); //2

module.id == 'program';

```


---





#AMD

[requirejs](http://requirejs.org/)

requirejs 如是说:

>RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code.

`Asynchronous module definition`, 一个 javascript 的定义. 定义了 API 用来定义和编写 module 已经处理他们的依赖. 如果需要可以异步加载他们.使用` AMD` 可以有以下的好处:

- 网站性能提升,AMD 可以让加载 js 的变得更小,只有需要的时候才去加载.
- 减少页面错误,AMD 会帮助开发人员解决依赖的问题

> https://en.wikipedia.org/wiki/Asynchronous_module_definition

除了上面的好处之外, 它还能够让工程师把代码封装到更小的, 更加具有逻辑性的工程中.部署的时候可以用它的 API 来处理 js 文件

[关于更多的 AMD 详细看这里](http://qiita.com/xiangzhuyuan/items/aca3922590c28b583047)
ChromeデベロッパーツールでWebページのスクリーンショットをとる。拡張機能なしでね

# 拡張機能でWebページのスクリーンショットをとると

今まではChromeの拡張機能を使ってWebページのスクリーンショットをとっていたのですが、ウィンドウ内を全てまるっとキャプチャーされたり、使い勝手が悪かったりと悩みの種でした。そんな中で見つけたデベロッパーツールのキャプチャー機能が個人的にしっくりきたので紹介します。

しっくりきたポイント

- 拡張機能をインストールしないでいい
- ウィンドウサイズを細かく設定できる

おしいポイント

- キャプチャーが1クリックでとれない

# WebページのスクリーンショットをとるCapture screenshot

スクリーンショットをとりたいWebページを開いてデベロッパーツールを起動します。

![デベロッパーツールを起動](https://qiita-image-store.s3.amazonaws.com/0/55103/039706c7-7464-6481-2d13-c0af4ba1c43c.png)

Webページのウィンドウサイズを細かく設定できるようにデバイスツールバーを表示します。デバイスツールバーはデベロッパーツール左上のアイコンをクリックすると表示されます。

![cap1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/eed4508b-5441-8589-3188-2c70d8a92aec.png)

Qiitaのマイページはこのようになります。上部にあるUIで自由にウィンドウサイズを変更できます。

![cap2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/f45939ff-ada5-3f0c-1213-69cfeb5412fb.png)

ウィンドウサイズが調整できたらいよいよスクリーンショットをとりましょう。デバイスツールバー右上の「・・・」の中にある「Capture screenshot」をクリックしてキャプチャーします。

![cap3.png](https://qiita-image-store.s3.amazonaws.com/0/55103/d366131c-b987-ca98-089f-098c9e010682.png)

とれました！ ファイル名もどのサイズでキャプチャーしたのかわかるように良しなにつけてくれます。次の画像のファイル名はqiita.com-umi_kappa(iPhone 6 Plus).png)で保存されました。

![qiita.com-umi_kappa(iPhone 6 Plus).png](https://qiita-image-store.s3.amazonaws.com/0/55103/880d069c-5192-1fb8-ac9e-fd68a86a139f.png)

# ぴったりサイズでとれるけど、、、

やっぱりメニュー開いて「Capture screenshot」をクリックしてキャプチャーは少々めんどくさいですね。。今後のUI改善に期待します！
MongoDB Resplica Set利用時のアンチパターン


##はじめに
これは絶対にやめよう！
備忘録的にまとめてみた。
気づいたら追加していこう。

## GridFsは、Replica SetメンバーDBでは使わない
ReplicaSetに新たにDBを追加してSyncが始まった時に、GridFsのデータが足枷になり辛い思いをしたことがある。もはやs3や他のストレージがあるこのご時世、Replica Set云々ではなくて、GridFsは無用だという話かもしれない。

## ログデータなど肥大するデータは、Replica SetメンバーDBに保存しない
手軽にコレクションが追加できてしまうので、やりがちかなと思う。

基本、生ログデータはどこかにバックアップを取って、集計して、閲覧可能な状態にして、更にバックアップを取っておく必要がある。

集計する過程でMongoDBを利用することはあっても、ログデータの保存にReplica SetメンバーDBを使う必要はない。

ちなみに、、集計したデータをエンドのアプリケーション側で使ったりする場合は、Replica SetメンバーDBに保存することがあっても良いと思う。

## Replica SetメンバーDBのプライマリ以外のメンバーDBはバックアップサーバーとして使わない
Replica Setは、DBのレスポンスのチューニングのための手段だと理解した方が良いと思っている。

ホットデータなど、動的変化し激しく利用されるデータのバックアップはとても難しい。なので、バックアップが必須な場合、その前提で設計をした方が良い。

例えば、クリティカルデータとディスポーサルデータなどデータを区分して、クリティカルデータのみバックアップしたり、バックアップポリシーを設定して運用すると良いのかなと思っている。


## まとめ
Replica Setのメンバー数にもよると思うが、同期が走るとDBが大きいとサーバーにそれなりの負荷が生じる。スケールアップとアウトのバランスは、データや帯域やトランズアクションの量を考慮しながら考える必要があり、結構難しく手探りな状態に陥りやすい。

ベストプラクティスがあれば、知りたい。

などなど、いろいろと考慮しながらReplica Setを上手く使いこなすと良いのかなと思う。

#### 関連記事

* [MongoDBのスキーマデザインする時の3つのポイント](http://qiita.com/kiyotaman/items/90123a58730f83670540)
長押ししてイベント発火させるボックスで、長押しのタイミングを分かるように改善してみた

# はじめに
以前取り上げた
[Pepperのセンサーを長押ししてイベント発火させるボックスを作成してみた](http://qiita.com/kakkey/private/6b48102379ab379321f2)
でさいごに書いた指摘について対応してみた。

最初は、ソースを直す方向で「指定のセンサーが押されている状態かマルチスレッド回して監視して、経過時間すぎたらイベント発火で～」と構想（妄想）していたけど、

・イベント目前だし
・マルチスレッドの方法（できる、できない含め）の調査する時間ないし
・動作テスト（CPUぶん回し、メモリオーバーしないよね）の時間ないし

の状態で、「__時間との戦いだ__」モードに突入していたので、作成したボックスを改変せずに、「今あるもの」で知恵を絞ることにした。


# フロー
で、作成したのが以下のフロー。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/129894/d39944bb-932d-09fe-6c43-b6e9cef6a202.png)


「長押ししてイベント発火させるボックス」のアウトプットは、前回の記事を参照してください。


1. アウトプットの状態ごとに「Switch Case」ボックスで分岐
2. アウトプット(0)の場合、
2.1. 「Eye LEDs YELLO」ボックスで「左目を黄色に光らせる」
2.2.「Delay」ボックスで指定の長押し時間まで待機
2.3. 「Delay」がアウトプットしたら（長押し時間が経過したら）「左目を青色に光らせる」
3. アウトプット(1,2)の場合
3.1 「Clear」ボックスで目の色をクリアにする
3.2 「Delay」を停止

ようするに、
指定時間以上長押ししたら、目が青色に光るので、そのタイミングで押されている状態を解除すれば、イベント発火が必ず起りますよ！
というボックス配置にすることで、問題を解決しました！

ちなみに、「Clear」ボックスは既存ボックスには含まれていないので、自作です。

# さいごに
このフローをダイアグラムボックスにして、各ボックスの設定を親からの継承にしておくと、色々と使い回しできると思います。
Pepperのセンサーを長押ししてイベント発火させるボックスを作成してみた

# はじめに
イベントなどで、Pepperをプレゼンターとしてブース前に設置することが増えてきました。
基本的には、来客した方が自由にPepperとコミュニケーションをとってもらい、来客者がトリガー(胸パネルを操作したり)となって製品の紹介をPepperがするのですが、
運営側のタイミングで「お客さんに気づかれない方法でPepperの挙動を制御したい」場合があったりします。

そこで、以下の要件を満たすための仕組みを考えてみました。
1. Pepper自体はお客さんに自由に触ってもらいたい（胸パネル、頭、手など）
2. お客さんが話しに食いついてきたときに、接客員が明示的にPepperのデモンストレーションを制御したい
3. 接客員が操作していると分からないような方法がうれしい
4. お客さんに自由に触ってもらっているときに、Pepperのデモンストレーションが起動しないようにしてほしい
5.  WiFiでつないでの外部機器からの操作は通信環境が悪い。安定した操作がしたい
6. 接客員に覚えられる方法で操作できるようにしてほしい（複雑な操作はできない）
7. Pepperのデモンストレーションのパターンは3つ

・・・言うは易し。。
いくつか考えた案の中から、今回は

「__Pepperの特定のセンサーを長押ししてイベント発火させるボックス__」

を作ることにしました。


# 環境
- Pepper for Biz (NAOqi OS 2.4.3.28)
- Choregrape  2.4.3.28 (windows7環境)

# pythonボックス
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/129894/d54c4b71-146d-d5ce-658a-5b0c55c8c9ec.png)


## 入力

|メソッド名|引数|説明|
|:---|:---|:---|
|onStart|ダイナミック|タッチイベントの戻り値|

## 出力
|メソッド名|引数|説明|
|:---|:---|:---|
|onStopped|ダイナミック|0：タッチセンサが押された<br>1：長押し状態が「Timeout (s)」に満たずにタッチセンサ押下状態が解除された<br>2：長押し状態が「Timeout (s)」を超えてタッチセンサ押下状態が解除された|

## パラメータ
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/129894/81e130ca-0bb2-3bda-31bf-bfa94bd1c7f3.png)

|変数|型|説明|
|:---|:---|:---|
|memkey_tatch_start|文字列|センサーをタッチしたときのタイムスタンプを保存するメモリキー|
|Timeout (s)|整数|長押しする時間（秒）|
|CallBackEventKey|文字列|長押し経過後に発火するイベントキー|

# フロー
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/129894/60cf5415-7003-815a-593d-8af4f4e9063e.png)


# pythonボックスのコード

```py:
def onInput_onStart(self, p):
    import datetime
    try:
        ret = 0
        date = datetime.datetime.now()
        #コールバックイベントキー
        callBackEventKey = self.getParameter("CallBackEventKey") 
        #トリガー時間
        waitTime = self.getParameter("Timeout (s)") 
        #メモリー保存用キー
        memoryKey = self.getParameter("memkey_tatch_start") 
        if( int(p) == 1):
            #タッチした日時をメモリーへ保存
            self.memory.insertData(memoryKey, date.strftime("%Y/%m/%d %H:%M:%S"))
            ret = 0
        else:
            memDate = datetime.datetime.strptime(self.memory.getData(memoryKey),"%Y/%m/%d %H:%M:%S")
            #日時の差を秒で取得
            diffSecond = (date - memDate).total_seconds()
            if( diffSecond >= waitTime):
                self.memory.raiseEvent(callBackEventKey,p)
                ret = 2
            else :
                ret = 1
        self.onStopped(ret)
    except Exception, e:
        self.logger.error( e )
```

ロジックはいたって単純。

1. 「イベント追加」でタッチセンサーのイベント発火を待ち受ける（今回は、左足バンパー「LeftBumperPressed」）
2. 左足バンパーが押された場合「1.0」が引数としてくるので、押された時のタイムスタンプをメモリキー（memkey_tatch_startに設定したメモリキー）に保存
3. 左足バンパーが押された状態から解除された場合「1.0」以外がくるので、解除されたときのタイムスタンプと、メモリキー（memkey_tatch_startに設定したメモリキー）に保存しているタイムスタンプの差を比較する
4. タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えている場合は、「CallBackEventKey」に設定したイベントキーを発火させる
5. タイムスタンプの差が「Timeout (s)」で設定した長押しする時間を超えていない場合は、なにもしない


# さいごに
長押しのときに、「Timeout (s)」を経過したかどうか、押された状態から解除されないと分からないので、
解除するタイミングを伝える手段が必要と指摘があった。
しかし、それはまた別の物語。。。ということで、また次回。
Scala 勉強用メモ 目次

# 文法

* 基本文法
    * package
    * 変数
* 構造化
    * if
    * for
    * match
    * 例外
    * [enum](http://qiita.com/inabe49/items/c4db33aa03228a6a78f4)
* オブジェクト指向
    * class
    * interface
    * trait
    * case class
    * object
    * ジェネリック
* 関数型プログラミング
    * Tuple
    * 関数オブジェクト
    * 部分関数 (PartialFunction)
* その他
    * implicit

# 標準ライブラリ
* コレクション
    * Seq
    * Set
    * Map
* モナド
    * Option
    * Either
    * Try
    * Future


# SBT


# Akka


# Slick


# Play Framework


# 参考資料

* [Scala School](http://twitter.github.io/scala_school/)
* [Effective Scala](http://twitter.github.io/effectivescala/index-ja.html)
* [Scalaメモ(Hishidama's Scala Memo)](http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html)

## API Document

* [Scala](http://www.scala-lang.org/api/current/#package)
* [Akka](http://doc.akka.io/api/akka/2.4/index.html#package)
* [Play Framework](https://www.playframework.com/documentation/2.5.x/api/scala/index.html#package)
LinuxでCPU負荷をさくっと掛ける

# 概要
たまにサーバーに負荷試験をしたくなるわけだが、さくっとやりたい。そんなメモ。


# yesコマンドを使う
`/dev/null`に対してyesと呟き続ける機械にさせる。


```shell-session
for i in `seq 1 1000`
do
yes > /dev/null &
done
```


# 負荷試験を終了するとき
```shell-session
kill $(pgrep -f 'yes')
```


おしまい。



# 参考文献
http://apc-sieg.hateblo.jp/entry/linux-cpu
rbenvで同一バージョンを複数管理

rubyistならrbenvは1度は使った事があると思います。
rubyの各バージョン環境を簡単に構築する事が出来る便利なツールです。
ただ「同一バージョン環境を複数構築」する事を想定されていないため、ローカル環境で色々なプロジェクトを同一バージョンで各プロジェクト毎に独立した環境を作りたい場合に困った事になってしまいます。


# rbenvのお作法
rbenvのお作法として「指定バージョンの環境を作ってもその環境を汚さないようにする」というものがあるようです。
gemでbundlerをinstallして　`bundle install --path vendor/bundle`　とする事で、bundler以外のモジュールは `--path` で指定したフォルダに配置するようにして、rbenvの環境を汚さないようにするようです。

ただ、せっかく.rbenvにpathを通して任意選択環境にinstallされているコマンドを利用出来るようにしたのにその恩恵を受けられないですし、　`bundle exec`　を使ってコマンドを使用しなくては行けないことや　`bundle exec rails new`　をする際に　`--skip-bundle`　をつけないとrbenvの環境に勝手にインストールされるから環境を汚してしまう等のややこしいルールが追加されたりと事前に必要な知識が多く発生してしまいます。

# 今回の目標
上記のようなちょっと残念な部分を理解した上で、「各rubyやrailsプロジェクトの独立環境を簡単・自由に作れるようにする」方法を記事として書いて行きたいと思います。


# ruby-buildでrbenv環境を作成する
今回の目標を実現するための方法をググってみるとすぐに出てきました。rbenvで環境を作らずにrbenv内で呼び出しているruby-buildを使うことで任意のバージョンを指定の環境名で作る事が出来るようです。

```
# 2.3.1バージョンの環境を作る（通常作成）
$ rbenv install 2.3.1

# 特定バージョンで任意の環境を作る（任意の環境作成）
$ ruby-build 2.3.1 ~/.rbenv/versions/2.3.1-rb_test

# globalの環境を2.3.1に
$ rbenv global 2.3.1
```

これで、rb_testの環境が作成されました。
`~/.rbenv/versions` フォルダの部分はrbenvをインストールした場所によって変わります。

また、ruby-buildはrbenvインストールしたフォルダ内の`plugins/ruby-build/bin`に設置するよう公式のドキュメントに書かれています。そのため、そのフォルダにPATHを通しておくのも忘れないようにしましょう。

```
$ rbenv versions
  system
* 2.3.1
  2.3.1-rb_test
```

これで、2.3.1-rb_testの環境を好きなように使う事が出来ます。


# まとめ
同一バージョンの環境を複数作る事は可能でした。

ただ、この方法はrbenvの当初の作成された目的がどのようなものなのかによっては、やっては行けない事をやっているのかもしれません。

というのも、もしrbenvの作成目的がもし「rubyの複数バージョンの環境を簡単に作る」だけの目的だった場合、今回の対応は「各rubyやrailsプロジェクトの独立環境を簡単・自由に作れるようにする」という目的と照らし合わせた際、似てはいるが、同一の目的ではないという事です。rbenvは決してrubyやrailsプロジェクトに独立環境を提供するツールではないと言われた場合この方法はただの裏技になってしまい、今後のrbenvの更新によっては使えなくなってしまう可能性もある訳です。

なので、ある意味では始めに書かせて頂いたbundlerを使った方法はrbenvの役割とbundlerの役割をうまく使って、ツール毎の目的にあわせて利用している、正しい例なのかもしれません。（bundlerの方法が正しい方法なのかどうかは調べていないので解りませんが）

なので、もしこの記事を見てこの方法を利用する場合は、そういった背景も理解した上で利用するようにして下さい。
後、もっとしっくり来る方法を知っている方がいらっしゃったら是非コメント頂けると助かります。