OmniAICreator/Qiita-1.07M huggingface dataset:
テスト自動化ツール Gaugeの紹介

ThoughtWorks社が開発しているテスト自動化ツール「Gauge」の紹介です。
http://getgauge.io/


##概要
- golangで書かれたオープンソースのテスト自動化ツール
- Markdownでテスト仕様を記述する。様々なフォーマットのドキュメントを生成
- データ駆動実行。テスト仕様の可読性を保ちながら、大きなデータセットを容易にテスト可能

2016年8月現在まだベータ版とのことですが、気になるので触ってみようと思います。

##使い方
公式のGET STARTEDに沿って進めてみます
http://getgauge.io/get-started/index.html

### Gaugeのインストール

MacなのでHomebrewからインストールします。
WindowsやLinuxではパッケージが用意されているのでそちらを利用して下さい。

```
$ brew update
$ brew install gauge
```

###プラグインの導入
`gauge --install プラグイン名`でプラグインをインストール出来ます。
テストを記述する開発言語に合わせたプラグインを導入してください。

```
$ gauge --install java
Gathering metadata for java

Plugin java 0.5.0 is already installed.
```

私の場合、javaプラグインは導入済みだったようです。
ついでにhtml-reportプラグインを導入しておきます。

```
$ gauge --install html-report
Gathering metadata for html-report

Downloading html-report-2.1.1-darwin.x86_64.zip
....
Installing plugin html-report 2.1.1
Successfully installed plugin 'html-report'.
```


利用可能なプラグインの一覧は[GAUGE PLUGINS](http://getgauge.io/plugins/index.html)を参照。

###プロジェクトの作成
空のディレクトリを作った後、gaugeコマンドでプロジェクトの雛形を作成します。

```
$ mkdir hello_gauge
$ cd hello_gauge
$ gauge --init java
Downloading java.zip
...
Copying Gauge template java to current directory ...
Successfully initialized the project. Run specifications with "gauge specs/".
```

雛形は自動的にダウンロードされるようです。展開された雛形は以下のような構造になっています。

```
$ tree
.
├── env
│   └── default
│       ├── default.properties
│       └── java.properties
├── libs
├── manifest.json
├── specs
│   └── example.spec
└── src
    └── test
        └── java
            └── StepImplementation.java

7 directories, 5 files
```
example.specがテスト仕様、StepImplementation.javaがテスト実装でしょうか。

### テストの実行
テストを実行してみます。
specsディレクトリに配置されているexample.specの通りにテストが実行されるようです。

```
$ gauge specs
# Specification Heading
  ## Vowel counts in single word	 ✔ ✔
  ## Vowel counts in multiple word	 ✔ ✔

Successfully generated html-report to => hello_gauge/reports/html-report
Specifications:	1 executed	1 passed	0 failed	0 skipped
Scenarios:	2 executed	2 passed	0 failed	0 skipped

Total time taken: 93ms
```

### レポートの確認
出力されたHTMLレポートを確認してみます。
![report.png](https://qiita-image-store.s3.amazonaws.com/0/33550/712e450e-f4a1-6c52-f1eb-02875906b66a.png "report.png")


## まとめ

Gaugeの概要、利用方法についてまとめました。
今後は、実際のテスト仕様・実装の記述や日本語利用を試して行きます。
なぜ開発とテストの分離はダメなんですか。(コンサルの経験を中心に)

以前に韓国の大手電子会社から依頼するコンサルに参加したことがあります。厳密に言えばそちのDTV(Digital TV)のQチーム(そこでは品質管理チームをこうよんでいます)から依頼をもらったので依頼の主な内容は
「テスト・プロセスの効率化を通じてテストの業務量を減らす」
のです。

インタビューなどを通じて状況を見るとDTVの様々な新型モデルは大勢にQチームに押し寄せてますが10個以上の開発チームを１チームが担うのが大変なので日程遅延などがよく発生するそうです。

我が「コンサル・チーム」が出した解決案は「Early Testing(初期てすと)」でした。これのために開発チームのごとにQチームのメンバーが参加して設計段階から参加すべき。これが主な報告書の内容でした。

今考えるとそれは失敗のコンサルでした。報告書が採択されなかったからです。振り返るとその方法は次のリスクがありました。
１。開発チーム：品質チーム（Qチーム）の比率が多：１。
２。開発初期に参加できるような関連知識の低さ。
特に１番目は当時の結論にたいしてとっても大きいハドルでした。品質メンバーさんが数多いな開発ミーティングなどで参加する余裕が全然ありません。２番目は何とか教育で解決できそうと思います。

---


この解決案が「初期テスト」であれば品質チームが単独にできる役割が狭いので不可能です。開発サイクル中でこの「初期テスト」が進行されるべきですが組織仕組みの問題でそれができなければ開発メンバーがやるべきです。もし開発者がこんな活動が負担されたら別のテスト専門メンバーを雇ってそのメンバーが開発サイクルないでテストをすべきです。

もしこうすると品質チームの役割がなくなるかと思う人がいるかも知りません。今私の考えは品質チームの役割は「最終チェックリスト」の遂行と「開発チームのテスト結果の十分さのチェック」です。開発からもらうテスト結果の十分さを検討し、最終チェックリストをチェックしてリリースすれば改善ができるかな。そのため開発とテストは分離されるのではなくて一つのサイクルで運営しなければならないし最終チェックはそのならではの役割を再定義すべきです。


---

当時上のようなことを考え出せなかった理由は僕の能力レベルが低かったからかもです。上の話は如何に「仮説」ですので「こうしてください」などは言えません。
でもこの間スタートアップスとかIT企業を中心で今までの話に近い方法で運営する開発チーム長をよく見ています。開発メンバーが開発し、テストコードを下請けする場合もあったし（もちろんリリース前にチェックリストでリリーステストは行います）開発メンバー自分でテスト＋自動化をする場合もよく見てます。最初のDTVケースはHW中心なので適用するにはちょっと組織的な問題がありそうです。

結局テスト・プロセスの改善するためには何か組織的な変化がもたらさなければならないです。開発＋テストの方向で行くのが正しいと思います。
networkAccessAllowedの罠

※備忘録

# [networkAccessAllowed](https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageRequestOptions_Class/index.html#//apple_ref/occ/instp/PHImageRequestOptions/networkAccessAllowed)とは？
* [PHImageRequestOptions](https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageRequestOptions_Class/index.html)
のプロパティの一つ。
* `.networkAccessAllowed = YES;`としてやると、iCloudフォトライブラリにアップロードされた写真もアプリから取得出来るようになる。

## しかし、コイツはデフォルト値が`NO` :no_good: 
デフォルト値のままで`requestImageForAsset`または`requestImageDataForAsset`を使っていると、写真が取得出来ない(**=nilが返ってくる**)ことがある。※
_(※iCloudフォトライブラリを利用している場合)_
_(※※iCloudフォトライブラリにはオリジナルのデータがアップロードされ、端末には低解像度の写真が残る)_

### 何故か？
1. iCloudストレージと端末内ストレージの写真は、フォトライブラリからでは見分けがほとんど付かない。
2. アプリ利用者はiCloud上か端末内かなんて気にせず写真を選択してしまう。

## 一言
* nilを返すんじゃなくて、ログかなんかメッセージを出して欲しい。

## 追記
* 端末に保存される低解像度写真を取得出来ればいいけど、どうやるんだろう。要調査。

## 参考
* [PHAsset](https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAsset_Class/index.html)
* [PHImageManager](https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/index.html)
Composerやartisanを実行したときの出力を色付きにする


## 初期状態(単色の出力)

### Composer

コンソールからComposerを実行したときに、
![composer no ansi](https://qiita-image-store.s3.amazonaws.com/0/42089/2baaa30b-e6b8-998d-ea41-9b87ce0d8e2d.png)

とか

### artisan
コンソールからLaravelのartisanコマンドを実行したとき
![artisan no ansi](https://qiita-image-store.s3.amazonaws.com/0/42089/c824d3d4-de6a-ad8f-77c1-fcb7d21a27b9.png)

みたいな単色で見にくい画面になっていませんか？

### きっかけ
普段と違う環境で作業をしているとき、``composer outdated``を実行したら…
![outdated.png](https://qiita-image-store.s3.amazonaws.com/0/42089/9492b6d9-5b59-7581-e70d-9377f2d42abc.png)

なんか色がついてる！！ってなったのがきっかけでした。

## 方法1 "--ansi"を付与する

### オプションを確認
上のComposerやartisanを実行したときのオプションを見てみると、
```
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.2.0 2016-07-19 01:28:52

Usage:
  command [options] [arguments]

Options:
～中略～
      --ansi                     Force ANSI output
```

このansiのオプションを有効にしてあげると、色付きで出力されます。
ansiって何って方は、[こちらの記事](http://qiita.com/hidai@github/items/1704bf2926ab8b157a4f)が参考になるかもしれません。


### Composer
![composer ansi](https://qiita-image-store.s3.amazonaws.com/0/42089/141d398a-3f47-1f88-256d-638622146151.png)

### artisan
![artisan ansi](https://qiita-image-store.s3.amazonaws.com/0/42089/6e977936-918d-aef9-ef02-6baf5a00beb1.png)

## 方法2 posix_isatty関数を有効にする

### 謎は未解決のまま

"--ansi"オプションで色を付けることには成功しましたが、最初に色がついたときは、オプションなんて使っていません。
もちろんbashで``alias artisan='php artisan --ansi'``のようなエイリアスがついていた訳もありません。

Google先生に聞いてみたのですが、聞き方が悪いのか的確な回答を得られず…

### ソースを読んでみればいいじゃない！

というわけで、Laravelのソースを読み辿っていった結果、下記の部分にたどり着きました。

```php:vendor/symfony/console/Output/StreamOutput.php
protected function hasColorSupport()
{
    if (DIRECTORY_SEPARATOR === '\\') {
        return
            0 >= version_compare('10.0.10586', PHP_WINDOWS_VERSION_MAJOR.'.'.PHP_WINDOWS_VERSION_MINOR.'.'.PHP_WINDOWS_VERSION_BUILD)
            || false !== getenv('ANSICON')
            || 'ON' === getenv('ConEmuANSI')
            || 'xterm' === getenv('TERM');
    }

    return function_exists('posix_isatty') && @posix_isatty($this->stream);
}
```
<https://github.com/symfony/console/blob/master/Output/StreamOutput.php>

CentOSを使っているのでif文の中は関係なく、最後の1行に着目し調査したところ、posix_isatty関数がないことに気づきました。

### php-processのインストール

posix_isatty関数を有効にするにはyumでphp-processをインストールすれば良いとのこと
``sudo yum install -y --enablerepo=remi-php70 php-process``

``--enablerepo=remi-php70``の部分は自分の環境に置き換えてください
インストール後、再度composerとartisanを実行すると…

### Composer
![composer](https://qiita-image-store.s3.amazonaws.com/0/42089/3083445b-21e9-b7d5-e9e4-84add195aa78.png)

### artisan
![artisan](https://qiita-image-store.s3.amazonaws.com/0/42089/334939da-1f95-e48c-b366-108bc0af137d.png)

これで、"--ansi"オプションを付けずとも、色付きの表示になりました。
UnityでADX2 LE用のSoundManagerを作成してみた

ADX2 LEの音関係の管理はSoundManagerを作った方がやりやすいというものを見たため、作成してみた。

#環境
・Windows 10
・Unity 5.4.0f3

#SoundManager
```C#:SoundManager.cs
using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {
    private string SESheetName = "CueSheet_0"; //SE用キューシート
    private string BGMSheetName = "CueSheet_1"; //BGM用キューシート
    private CriAtomSource atomSourceSE;
    private CriAtomSource atomSourceBGM;

	void Start () { //初期化
        atomSourceSE = gameObject.AddComponent<CriAtomSource>();
        atomSourceBGM = gameObject.AddComponent<CriAtomSource>();
        atomSourceSE.cueSheet = SESheetName;
        atomSourceBGM.cueSheet = BGMSheetName;
	}

    public void PlaySE(string cueName) { //SEを再生(引数：SE名)
        atomSourceSE.androidUseLowLatencyVoicePool = true; //Android用遅延対策
        atomSourceSE.Play(cueName);
    }

    public void PlayBGM(string cueName) { //BGMを再生(引数：BGM名)
        atomSourceBGM.Play(cueName);
    }

    public void StopBGM() { //BGMを停止
        atomSourceBGM.Stop();
    }

    public void PauseBGM() { //BGMを一時停止（ポーズ）
        atomSourceBGM.Pause(true);
    }

    public void ResumeBGM() { //BGMを再開
        atomSourceBGM.Pause(false);
    }

    public long GetBGMTime() { //BGMの再生時間を取得
        return atomSourceBGM.time;
    }

}
```
とりあえず、今使うものだけを羅列。
キューシート名や、その役割は作る人によって異なる。

#使ってみる
音を使うオブジェクトに、SoundManager.csをアタッチ。
他のスクリプトから呼び出すときは、

```C#:hogehoge.cs
    private SoundManager sm;

    void Start() {
        sm = gameObject.GetComponent<SoundManager>();
        sm.PlayBGM("sample"); // カッコ内は曲名
    }
```
といった感じで使う。（ここでは、Start()内でBGMとしてsampleを流す）
GNU による拡張

こんにちは。
GNU の成果物は、独自な考えに基づいて、拡張されているものがあるようです。例えば下記があります。

1. ```sed``` コマンド（改行\nの出力が容易[^1]）

2. C コンパイラ（```-O1```以下では、strict aliasing rule を守らなくても良い）

--------
[^1]: 「[sed による置換で改行\nを出力する](http://qiita.com/kkdd/items/725e53572bc69e4b51b7)」
MacでのVirtualbox,Vagrantアンインストールメモ

MacでのVirtualboxとVagrantアンインストールメモです。
ディレクトリの削除において、権限が無いため削除できない場合があるので、
実行前に「sudo su」で管理者ユーザーにしておくことをお勧めします。
なお、誤って無関係なディレクトリを削除しないよう、注意してください。

#Virtualboxのアンインストール
・インストール時に使用したdmgファイルを使用する。
・dmgファイルを実行する。
・Virtualboxのメニューから「VirtualBox_Uninstall.tool」を右クリックし、メニューから「開く」を選択。
・「VirtualBox_Uninstall.tool」を開く際に、「開発元は未確認です。開いてもよろしいですか？」と問われるが、「開く」を選択する。
・アンインストールの実行について、「Yes/No」を問われるため、「Yes」を入力する。
・管理者ユーザーのパスワードを問われるため、入力する。

その他、Virtualboxに関連するディレクトリ
```/Users/ユーザー名/VirtualBox VMs```
```/Users/ユーザー名/Library/VirtualBox```

#Vagrantのアンインストール
以下のディレクトリを削除する
```root/Applications/Vagrant```
```/usr/bin/vagrant```
```/usr/local/bin/vagrant```
```/Users/ユーザ名/.vagrant.d```※隠しディレクトリ
```/opt/vagrant```


ディレクトリ削除時のコマンドは、「rm -r -d -f ディレクトリ名」で、配下のファイルも含め強制的に削除する。

#参考サイト
・Vagrant公式サイト（英語） アンインストール篇
https://www.vagrantup.com/docs/installation/uninstallation.html
・Vagrant日本語ドキュメント アンインストール篇
http://raqda.com/vagrant/installation/uninstallation.html




以上。
Wagby開発を通して学んだこと

#はじめに

仕事でWagby（ver7.7.2）を使った開発をしました。

そこで学んだことを下記に綴っていきます。

あくまで私が開発を通して経験したことなので、全然書いてることが使えなくても許して下さい（笑）


#Wagbyの基本

Wagbyのモデル情報でデータベースに保存する項目 ＝ テーブルのカラム

基本はこれさえ理解していれば設計できます！！

Wagbyのモデルの設定方法は、チュートリアルを見てください。

http://wagby.com/tutorial7/index.html

#Wagbyをスムーズに設計するコツ

**テーブル定義**をまず決めることです！！

テーブル定義でテーブルの関係とカラムの名称を正しく設定すれば、モデルの項目名をスムーズに決めれます。

そうすることでWagbyが得意とする高速開発がよりスムーズになります！！


#Wagbyで実現できないと困ったときの対処法

私は、開発で困った時にやっていたことをリストにしてみました。

・Wagbyのモデルが参照するテーブルを**Viwe**にすることという考え方

・サブモデルを駆使する

・javascriptでのカスタマイズ

#Wagbyであんまりおすすめしないこと

・カスタマイズをしすぎないこと


#開発を通して最後に伝えたいこと

Wagbyで初めて開発したときは、何が開発できて何が開発できないのかが判断できないので

無駄に時間が生じました。それによってかなり苦労しました。しかし、何が開発できるかできないかの

判断ができるようになれば本当に素晴らしい開発ツールだと今は思えます（笑）

なので、初めてお仕事でWagby開発をする場合は、外部のWagby開発有識者を要件定義から

呼ぶことをおすすめします！！

最後まで呼んでくださり、ありがとうございました！！！！
IntelliJ Pluginで特定のファイル名のPsiFileを取得する

プロジェクトの中の `values/strings.xml` や `values-ja/strings.xml` を取得したい時、リソースディレクトリの場所を探してstrings.xmlを見つけるのは大変です。

そんなとき、`FilenameIndex.getFilesByName(project, name, scope)` を使うと簡単に取得できます。

使い方は簡単で、Scopeをセットして呼び出すとPsiFileの配列が返ってきます。

```java
PsiFile[] files = FilenameIndex.getFilesByName(project, "strings.xml", GlobalSearchScope.projectScope(project));

// values/strings.xmlとvalues-ja/strings.xmlがある場合、filesには2つのPsiFileが格納される
```

Scopeには、どの範囲を探すかをセットします。
例えば、 `GlobalSearchScope.allScope(project)`をセットするとAndroidのフレームワークやLibraryの中にあるファイルも取得できます。
`GlobalSearchScope.projectScope(project)`をセットすると、プロジェクト内のファイルのみ取得できます。


参考) [How do I get a PSI file?](http://www.jetbrains.org/intellij/sdk/docs/basics/architectural_overview/psi_files.html)
ツクール大規模アップデート！！　1.3系でなにが変わったのか

祝！ツクールアップデート！！！

コアスクリプトにDiffかけてななめ読みしました！！
ツクラーさん向けとエンジニア向けに分けたいと思います。

#ツクラーさん向け
##描画が速くなりました
特にマップ描画が圧倒的に速くなりました。
モバイル時には変わってないですが、URLに``` ?webgl ```をつけると強制的にWebGLモードになります。お試しあれー。
ただし、TerraxLighting等、見た目を大幅に変えるプラグインを使ってる場合逆に遅くなることもあります。

##メモリブロートはほぼ解消です
ピクチャを多用したときに気になる、メモリブロート。一定時間使われないと、メモリから消える処理が追加されましたのでモバイル時にも安心です。

###注意：プリロード系はデメリットが大きくなります
プリロード系は、使われない画像がメモリから消えちゃうので、逆に重くなる可能性があります。

##内部構造がそこそこ変わってます
特にタイル描画実装がまるまるかわってるため、そこをいじってるプラグインは動作しない可能性が高いです。ご注意！

#エンジニア向け
##tilemap描画がGPUに最適化
やってくれたか！といった感じです。内部構造まったく変わってますが、恩恵は大きいです！！MVチームGJ！！！

##TTLベースのCacheシステムが搭載されました
長く使われないリソース類はリンクを切り、GCに任せます。
例のごとく長く握ってるせいでFullGCじゃないとなかなか解放されませんが、ないより圧倒的に良いです。

##コアメソッドが増加＆内部実装が変更されています
プラグイン作者の方はご注意！特にメソッド上書きして元メソッド呼んでないという、お行儀の悪いコード書いてたら動作しない……なんてこともあるあるです！！

#今後必要そうなプラグイン（誰か作って！！）
##WebGL対応ライティング
人気プラグイン、TerraxLightingはAndroidでは動作不能レベルで重くなります。
ヘビーにリライトした、内部実装をなるべく尊重したモバイル対応プラグインを作ってはいるのですが、それだけ頑張ってもFPSが2/3くらいになってしまいます。
shaderを使った、WebGL時代にふさわしいライティングプラグインがあったらうれしいですね！！

##IndexedDBを利用したプリロード
Cacheシステムが刷新されたことにより、オンメモリにすべて突っ込むことはできなくなります。
既存のプリロードは大体メモリにつっこんでるので、IndexedDBに画像データを保存して、取り出してデコードする方法をとるプリロードがあればよさそうです！

##Windowの実装のチューニング
WindowはCanvasをボコスカ作るので、かなりメモリにやさしくないです。特にテキスト描画はPIXI本体に存在しますし、このあたりチューニングしたらよい感じになりそうですね！！
gitignoreのテンプレート集

## gitignoreとは
- gitignoreとはリポジトリにおいて、意図的に追跡対象から外したいファイルを設定するためのファイル

## gitignoreについての詳しい使い方はこちらをどうぞ
- 詳しく書かれています  
http://qiita.com/anqooqie/items/110957797b3d5280c44f

## gitignore Templates
githubのリポジトリを見ていたら、こんな便利なものを見つけました。
java,javascript,php・・・様々な環境で使い分けることができるgitignoreのテンプレート集です。
言語だけではなくAppEngineやGitBookなどのgitignoreも存在しています。
https://github.com/github/gitignore
sqlite3コマンドを使ったデータ出力方法まとめ

SQLite3のデータ出力で使うコマンドをまとめました。

### 使用環境
- OSX 10.10.5
- sqlite3 version 3.8.5

### コマンド
---
#### 使用可能コマンド一覧を表示
コマンドの一覧が表示されます。

```
sqlite> .help
```

---

#### テーブルのデータ表示
テーブルのデータ表示コマンドです。指定されたフィールドのデータを表示します。フィールド名に*を入れるとテーブル全データを表示します。

```
sqlite> select フィールド名 from テーブル名;
```

例

```
sqlite> select * from tbl;
1     田中      30       北海道

sqlite> select name from tbl;
田中
```

---

#### ヘッダ表示、非表示
ヘッダにフィールド名を表示するコマンドです。

```
sqlite> .header on
sqlite> select * from tbl;
id          name        age         place
----------  ----------  ----------  ----------
1           田中         30          北海道
```

非表示にする時は以下のコマンドです。

```
sqlite> .header off
sqlite> select * from tbl;
1           田中         30          北海道
```

---

#### データの区切り文字を設定
区切り文字を設定できます。
```
sqlite> .separator 区切り文字
```

例

```
sqlite> .separator /
sqlite> select * from tbl;
1/田中/30/北海道
```

---

#### データの出力モードを変更
データの出力モードを設定するコマンドです。

```
sqlite> .mode 出力モード
```

例

```
sqlite> .mode csv
sqlite> select * from tbl;
1,"田中",30,"北海道"

sqlite> .mode column
sqlite> select * from tbl;
1           田中      30          北海道

sqlite> .mode line
sqlite> select * from tbl;
   id = 1
 name = 田中
  age = 30
place = 北海道

sqlite> .mode html
sqlite> select * from tbl;
<TR><TD>1</TD>
<TD>田中</TD>
<TD>30</TD>
<TD>北海道</TD>
</TR>
```

出力モードは以下のモードでもできます。  

|出力モード|形式|
|:---:|:---:|
|insert|insertコマンドで出力|
|list|リストで出力|
|tabs|タブ区切りで出力|
|tcl|tcl要素で出力|

---

#### 出力幅を設定
出力データの幅を各フィールドごとに設定できます。

```
sqlite> .width 幅
```

例

```
sqlite> .width 2 6 2 6
sqlite> select * from tbl;
1   田中  30  北海道

sqlite> .width 2 10 5 10
sqlite> select * from tbl;
1   田中      30     北海道
```

---

#### ファイルに出力
ファイルに出力する時は以下のコマンドです。

```
sqlite> .output 出力ファイル名
```

例

```
sqlite> .output sample.txt
```

---

##### 参考文献
西沢直木　「SQLite入門　すぐに使える軽快・軽量データベースエンジン　第2版」 株式会社 翔泳社
変数の中に改行ありの文字列を渡したい~特殊文字(\r\n)じゃうまくいかない場合~

## どんな問題が起きたか
社内のアプリの中に、トーストを表示するコードが用意してありました。
SampleToast('toast_message_text')みたいに使います。

ここに、改行を含めた文字列を渡したい。
よく「特殊文字を渡せば改行を入れられる」ってことが書いてあるのですが、うまくいかなかったです。
(例えば、<span>http://piyopiyocs.blog115.fc2.com/blog-entry-582.html</span>のように。)

```javascript
var toast_message = 'hello \r\n world';
SampleToast(toast_message)
```
みたいに渡すと、エラーが起きます。
コンソールで確認してみると、変数に格納される前に、改行がかかってしまうのです。

(イメージ)

``` javascript
var toast_message = 'hello
                     world'
```

## どうするか
``` javascript
var toast_message = 'hello<br>world'
```

HTMLタグである、`<br>`を使ってあげましょう。
これでうまくいきました。
vCenterでクラスタにホストを接続できない場合

#内容
vCenterでクラスタにホストを接続できなかったときの、解決までのメモ

#エラー
vCenterから「ホストの追加」->「接続設定」で「**一般的なシステムエラー**」となって進めない

#トライ1
調べてみると下記リンクを発見
[Adding a host to vCenter Server fails with general system error or vim.fault.NoPermission (3824568) | VMware KB : ](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=3824568)

とりあえず解決法をやってみる

```
#SSHでホストにログイン後、下記コマンドを実行

#get backup
mv /etc/vmware/hostd/authorization.xml /etc/vmware/hostd/authorization.xml.old

#restart management agent
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
esxcli network ip interface set -e false -i vmk0; esxcli network ip interface set -e true -i vmk0

#all services restart
services.sh restart
```
->しかし、解決せず。。。

#トライ2
結論、私の場合これ↓でした
[Reconnecting an ESX host fails with the error: A general system error occurred: Internal error (1031652) | VMware KB : ](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1031652)

とりあえず解決法をやってみたところ成功。

```
#SSHでホストにログイン後、下記コマンドを実行

#Backup the /etc/vmware/hostd/vmInventory.xml file.
mv /etc/vmware/hostd/vmInventory.xml /etc/vmware/hostd/vmInventory.xml.bak

#restart management agent
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
esxcli network ip interface set -e false -i vmk0; esxcli network ip interface set -e true -i vmk0

#all services restart
services.sh restart
```

以下のように書いてありました。
>If the ESX host connects successfully, then a corrupt virtual machine is preventing your ESX host from connecting to the vCenter Server inventory.

以前の仮想マシンのバックアップをovfとして、今回の環境にデプロイしたのですが、その際に、仮想マシンのインベントリ情報などが壊れてしまっていたようです。

以下のように進みます。
>To resolve this issue, open the vmInventory.xml file, and add one virtual machine entry from the vmInventory.xml.bak file at a time, then add the ESX host into inventory until you have determined the problematic virtual machine. 

「vmInventory.xml」を一つずつ追加/削除しながら、どの仮想マシンのインベントリ情報が壊れているかを特定します。

```
 <ConfigEntry id="0002">
    <objID>64</objID>
    <vmxCfgPath>/vmfs/volumes/4cb73eef-89346b13-8872-002219d2a8b2/Win 2003 Test/Win 2003 Test.vmx</vmxCfgPath>
  </ConfigEntry>
```

特定した後は、その仮想マシンのインベントリ情報を除いた状態で「ホストを追加」します。
その仮想マシンを「パワーオフ」後、「インベントリから除去」し、再登録します。

>When you have determined the problematic virtual machine, you remove the entry in the vmInventory.xml file, then add the ESX host into inventory. Power off the virtual machine, unregister, and add the virtual machine to the inventory.

#参考
[Restarting the Management agents in ESXi (1003490) | VMware KB : ](https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=1003490)
Oracleにおける、バインド変数を使用したSQLのパフォーマンス改善のお話【バインドピーク】


# 背景
PLSQL経由で実行される特定の検索SQLのパフォーマンスが遅く、改善する必要があった。
そのSQLの特徴は以下

* Oracle11g以降
* PLSQLで実装されている
* SELECT文は数百行、10以上のテーブル結合がある
* バインド変数を利用している

# 結果
色々と調査した結果、PLSQL内の実行SQLに**Hint句**を追加することで
パフォーマンスを改善することができた。

# 調査遷移

## 実際に実行されているSQLの確認
対象SQLはWebアプリケーションからPLSQLを経由して実行されており、
実際のSELECT文を取得することに少し手間がかかった。
最終的に以下の手順を用いて取得した。

```sql
--以下のSQLでSQL_IDと実行SQLの最初の数百バイトが取得できる
SELECT V$SQL.SQL_ID,V$SQL.SQL_TEXT,
V$SQL.LAST_ACTIVE_TIME
,USER_OBJECTS.OBJECT_NAME
,USER_OBJECTS.OBJECT_ID
,USER_OBJECTS.OBJECT_TYPE
FROM USER_OBJECTS 
JOIN V$SQL 
ON USER_OBJECTS.OBJECT_ID = V$SQL.PROGRAM_ID 
ORDER BY V$SQL.LAST_ACTIVE_TIME DESC
/

--上記SQL結果の中から、SQL全文を取得したいSQLのsql_idで以下を実行
SELECT sql_text
FROM v$sqltext
WHERE sql_id = '上記SQLで取得したID'
ORDER BY piece
/
--取得した全レコードを結合すればSQL全文のできあがり。
```

確認した結果、対象のSQLは実行時にバインド変数を使用していることが分かった。

## FUNCTION INDEXの追加
対象のSQLの検索条件には、**日付を文字列化したもの**が含まれていた。
これでは日付のINDEXが使用されない。SQLを編集して日付型の検索条件にすることも可能と思われたが、日付を文字列化して条件にしている背景が不明だったので触らないことにした。

その代わり、日付を文字列化したものに対して**FUNCTION INDEX**を追加した。
FUNCTION INDEXとは、特定のカラムに何らかの処理を行った結果、また複数のカラムを結合した結果などに対してINDEXを作成する機能。
ファンクション索引とか関数インデックスと呼ばれたりもする。

```sql
CREATE INDEX IDX_TABLENAME_FC
    ON TABLENAME (TO_CHAR("TARGET_DATE",'YYYYMMDD')) 
/
```

## バインドピーク機能の存在
前述のINDEXを作成し、対象のSQLを実行してみたが改善せず。
確認のため実行計画を確認したところ、作成したINDEXが使用されていなかった。
何が悪いのだろう、と色々試していると、**バインド変数部分を実値に置換したSQL**の場合はINDEXが使用されていることが分かった。
バインド変数を使用している場合の挙動を調査したところ、**バインドピーク**という機能を知った。
http://www.oracle.com/technetwork/jp/articles/chapter4-2-100886-ja.html#p01e

バインドピーク機能とは、簡単に言うとSQLの実行前にバインド変数の中身を確認した上で実行計画を作成してくれる機能。
本来ならこの機能によって、適切な実行計画になるはずが、なっていない。
そうなっている原因は結局不明のままだった。
(SQLがかなり複雑なためか、PLSQL内での書き方が原因かなと予想している)

## Hint句の使用
最終的な解決策としてHint句を使用した。
Hint句については以下を参照のこと
http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements006.htm#sthref482

バインドピーク機能で適したINDEXが使用されていない事が分かったので、
どうにかして使用して欲しいINDEXが使用されるようにできないかと調査した結果、Hint句を使用するに至った。

以下のようにSELECTの直後に`/*+ `から始まるコメントを挿入することで、
それがHint句として解析される。

```sql
SELECT /*+ INDEX(TABLENAME IDX_TABLENAME_FC) */
    ...
    FROM TABLENAME
    WHERE TO_CHAR("TARGET_DATE",'YYYYMMDD') >= :bind_variable
--以下略
```

上記のHint句を追加した結果、対象のSQLのパフォーマンスが改善した。

# 懸念事項
後々問題になるかもしれないなと感じたことと感想

## バインドピークによる挙動
対象のSQLが実行される際のバインド変数の値で実行計画が変わりうる。
バインドピーク機能について詳しく調べたわけではないので、
これがどう影響するかがよく分かっていない。

## Hint句による特定INDEX使用の強制
現時点では問題はないが、今後DBのデータが増えた結果、
指定INDEX以外のINDEXを使用した方がパフォーマンスが高くなる、という事が起こりえる。オプティマイザさんが仕事してくれるのが一番なのは間違いない。

## 複雑怪奇なSQL
数百行にも及ぶSQLだと、もはや何をやっているのかの把握すら難しい。
結合が多いと、どこがボトルネックになるかも判断がつかなくなってしまう。
仕様が許す限りシンプルなものがいいなと実感。

## 感想
Oracleにおけるバインド変数を使用したSQLの挙動と、バインドピーク機能について学んだ。
なにげにHint句を使用するのも初だった。
Hint句はなるべく使用を避けるべきだな、と考えている。
Camera Transitionsで素敵なカメラ切替演出

今回はトランジション〜。
他にもトランジション系持っているけれど、こういうペラってめくれるのに目がない私は即購入。
<a href="https://www.assetstore.unity3d.com/jp/#!/content/36055">Camera Transitions</a>
<a href="https://www.assetstore.unity3d.com/jp/#!/content/36055"><img width="500" alt="3091.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/36e620e4-f3ad-d210-4190-04c829dabb70.png"></a>

##こんなことができます
8fpsでとったgifなのでカクカクしてますけど。
![Transition.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/01295520-53cf-2e1e-a383-3e8bb3f6549c.gif)

##インポートしたところ
![スクリーンショット 2016-08-12 01.32.38.png](https://qiita-image-store.s3.amazonaws.com/0/46444/5b788872-1dd1-cfd4-64e7-a13a9c75d652.png)

##では早速
まずはカメラを3つ用意してみました。
<img width="548" alt="スクリーンショット 2016-08-12 13.40.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/45d3799b-3bc9-03cc-32d8-21d23b8fd83b.png">

そしてからのGameObjectにCameraTransitionをアタッチ
<img width="357" alt="スクリーンショット 2016-08-12 13.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/bcd1dcee-eb02-3bd9-f888-e180f07e2fa1.png">

続きましてC#のクラスを新規で作ります
ソースはとりあえずクリックでカメラ1 2 3と切り替わるようなのにしようかな

```csharp
using UnityEngine;
using System.Collections;
using CameraTransitions;

public class TestTransition : MonoBehaviour {

	public Camera[] cameraList;

	private CameraTransition cameraTransition;
	private int nowCameraNo;

	void Awake()
	{
		nowCameraNo = 0;
		cameraTransition = GameObject.FindObjectOfType<CameraTransition>();
		if (cameraTransition == null)
			Debug.LogWarning(@"CameraTransition not found.");
		
	}

	void Update () {
		if(Input.GetMouseButtonDown(0))
		{
			int nextCameraNo = nowCameraNo + 1;
			if(nextCameraNo >= cameraList.Length) nextCameraNo = 0;
			cameraTransition.DoTransition(CameraTransitionEffects.FadeToColor, cameraList[nowCameraNo], cameraList[nextCameraNo], 1.0f);
			nowCameraNo = nextCameraNo;
		}
	}
}

```

あとはカメラをドラッグしてcameraListのところに全部セットして完了。
こんな感じで切り替わります。
![CameraTransition2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/a5344a5a-6a4a-b175-1f90-d84123878116.gif)

ちなみに、カメラは最初に移しているやつ以外はactive false状態で大丈夫です。
CameraTransitionEffectsをこれに変えてあげれば・・・・
CameraTransitionEffects.PageCurlAdvanced
あ〜かわいい！くるくるするの可愛い！となります
![CameraTransition3.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/481950f3-fc3a-cdeb-5e92-2214462fc481.gif)

ちなみに、DoTransitionの第五引数にはトランジションごとのパラメータを渡せます。
でも、種類ごとにパラメータ違うから設定めんどくさい！
っていう人のためにCameraTransitionAssistantというコンポーネントがありまして。
これを使うと細かい設定をいじいじするだけでできます。
<img width="343" alt="スクリーンショット 2016-08-12 14.04.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/5b5def7b-5ecc-c199-b56b-385228bea98f.png">

イージングのタイプや、サイズ、角度などいろいろオプションがあります
scriptから制御するにはこんな感じでいけます。

```csharp
using UnityEngine;
using System.Collections;
using CameraTransitions;

public class TestTransition2 : MonoBehaviour {

	private CameraTransitionsAssistant assistant;

	void Awake()
	{
		assistant = gameObject.GetComponent<CameraTransitionsAssistant>();
	}

	void Update () {
		if(Input.GetMouseButtonDown(0))
		{
			assistant.ExecuteTransition();
		}
	}
}

```

![CameraTransition3.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/963fd23a-8e9c-b3f3-7563-55e6e977a8c9.gif)

うん、簡単に使える。
今回はここまで。
画像等のバイナリファイルをローカルにダウンロードする

```go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)


func main() {
	url := "https://golang.org/doc/gopher/frontpage.png"
	// create output file
	out, err := os.Create("gopher.png")
	if err != nil {
		fmt.Println("file already exists")
		return
	}
	defer out.Close()
	// request
	response, err := http.Get(url)
	if err != nil {
		return
	}
	defer response.Body.Close()
	// write response to output file
	if response.StatusCode == 200 {
		_, err = io.Copy(out, response.Body)
		if err != nil {
			return
		}
	}
}

```
Goでtemplateをつかう

> Go: go version go1.6.3 darwin/amd64
> Ref: https://golang.org/pkg/text/template/#pkg-examples

ご覧のとおりめちゃくちゃはしょっていますが脳内補完してください.

```personal_data.tmpl
Name: {{ .Name }}
Mail: {{ .Mail }}
```

```main.go
package main

import (
	"bytes"
	"fmt"
	"html/template"
)

func main() {
	type PersonalData struct {
		Name string
		Mail string
	}

	p := PersonalData{"おれです", "ore@example.com"}

	var b bytes.Buffer

    tpl, _ := template.ParseFiles("personal_data.tmpl")
	tpl.Execute(&b, p)

	fmt.Println(b.String())
	// Name: おれです
	// Mail: ore@example.com
}
```
【Vue.js】autosizeなtextarea

#概要
ユーザーの改行にあわせて自動的に伸びるテキストエリアをVue.jsで

#デモ
https://jsfiddle.net/u1zpydw0/

#コード

~~~html
<textarea v-model="value" :rows="rows"></textarea>
~~~

~~~javascript
  computed:{
  	rows:function(){
    	var num = this.value.split("\n").length;
        return (num > 4) ? num : 4;
    }
  }
~~~

textareaのrows属性に\nの数をぶち込んでるだけ。

#おわりに
- Vue.jsはシンプルなコードで色々できて便利。強さを感じる。
- 思い至るまで、伸びるテキストエリアのためだけにVueにjQueryとjQuery-autosizeを併用して依存増やしてた。
- もっと日本語で検索可能なところに、Vueの小ネタ的記述増えてくれ。
RubyMineでremoteのrbenvで使っているgemを読みこませる


RubyMineではインストールしているgemのキャッシュを持っていて、それを使ってごにょごにょしているので、RubyMine側に「これ使ってねぇーーー」ってのを設定してあげる必要があります。

`vagrant`などで環境を作っている場合、基本的にコマンド類は`vagrant`内で叩くことになると思うので実害はありませんが、RubyMineで毎回アラートが吐かれるのも気持ち悪い。

ということで、今回はremote(`vagrant`)側でインストールしたgemをRubyMine側に読み込ませる設定を行います。

## 環境
- OS X
- vagrant
- rbenv

※`vagrant`を使っているならwindowsでも同じハズ

## 設定箇所
`Preferences` > `Languages & Frameworks` > `Ruby SDK and Gems`

からの

`+` > `new remote`

で、以下の画面が出てきます。

![スクリーンショット_2016-08-12_19_35_36.png](https://qiita-image-store.s3.amazonaws.com/0/44007/dc083e2e-a918-5d46-4799-f49fb4059329.png "スクリーンショット_2016-08-12_19_35_36.png")

`Vagrant`を選び、`Vagrant Instance Folder`に`Vagrantfile`のあるフォルダを指定（だいたいプロジェクトルートかな？）、で、問題は`Ruby interpreter path`です。

ここにはremote側で使ってるパスを設定してあげればいいです。`rbenv`を使用している場合、おそらく以下のパスになっているかと。

```bash
$ which ruby
~/.rbenv/shims/ruby
```

が！

__これではうまく読み込んでくれません！！__

理由としては、`shims`が実体ではないから（だと思う）。

つまり、、、

## `Ruby interpreter path`に設定する値
誤
`/home/vagrant/.rbenv/shims/ruby`
`~/.rbenv/shims/ruby`

正
`/home/vagrant/.rbenv/versions/2.2.5/bin/ruby`

ということですね。

※使用しているversionは各自のversionに合わせてください。

これで無事RubyMineに読み込まれるようになりました。めでたしめでたし。
「プライム・ホッパー」を解きました

# 問題

数学の問題をプログラミングで解こう！「プライム・ホッパー」問題解説
https://codeiq.jp/magazine/2016/08/43816/

問題は上記リンクから。

# 解き方

startとgoalへと遷移可能な素数の木構造を作り、どれくらいの深さでgoalにたどり着くかを探索する。
今回のケースではダイクストラアルゴリズムで探索するのがスマートなやり方だと思うが、幅優先探索で対応した。

基本的な考えは幅優先探索で、遷移済み素数を遷移可能な素数列から除外していってあげることで、無駄なループに陥らないようにしている。
最大の深さはあらかじめ用意した素数列の長さに等しくなる――ようするにすべての素数を１回ずつ遷移しgoalにたどりつくケース。
これを遷移可能な最大な深さとして、これ以上になったら遷移不可能と判断する。
また、遷移可能な素数列がカラになった場合も遷移不可能と判断する。

# コード

Rubyで実装しました。

```rb
# array.present? が欲しかっただけ
class Array
  def present?
    !empty?
  end
end

# 例えば"107" -> "07" と変換させてintに変換させたとき、nilを返す
# 賢く 7 を返さないから bad_to_i とした
class String
  def bad_to_i
    self[0]=="0" ? nil : self.to_i
  end
end

# エラトステネスの篩
# max以下の素数を返す
def prime_sieve(max)
  table = Array.new(max + 1, true)
  primes = []
  limen = (max**0.5).floor

  (2..max).each do |n|
    if table[n]
      primes.push n
      k = n**2
      while k <= max
        table[k] = false
        k += n
      end
    end
  end
  return primes
end

# 整数を入力し、そこから変換可能な整数のすべてを返す
def transfer n
  n = n.to_s
  list = [*1..9].map{|i| (i.to_s + n)}
  list << [1,3,5,7,9].map{|i| (n + i.to_s)}
  list << n.slice(1..-1).bad_to_i
  list << n.slice(0..-2).bad_to_i
  list.flatten.map(&:to_i).sort.uniq
end

# 次の代の素数候補を返す
def candidates primes
  primes.map{|prime| transfer(prime)}.flatten.sort.uniq
end

def prime_hopper s, e
  depth = 1
  # goal以下の素数列を生成
  # 開始の素数にループするケースを除外するため、startの素数は粗数列からはあらかじめ除外しておく
  prime_list = prime_sieve(e) - [s]
  # 現在の深さの素数列を保持する
  current_primes = [s]
  # 素数列をすべて利用してgoalにたどり着いた場合、もっとも深くなる
  # これを探索の上限とする
  limit_depth = prime_list.length

  ans = while true
    current_primes = (candidates(current_primes) & prime_list)
    prime_list -= current_primes

    # goalの素数を発見したらケース
    break depth if (current_primes & [e]).present?
    # 遷移可能な素数列がなくなったケース
    break -1    if prime_list.empty?
    # 探索上限を超えたケース
    break -1    if depth >= limit_depth
    depth += 1
  end
end

puts prime_hopper(5, 67)
```
Docker swarm modeについて整理(適宜追記)


ちょっと今後Dockerのswarm modeについて整理するので
概念やら用語やらを少し整理。

ちょくちょく追記していく予定。

# 目的
Docker Engine 1.12でswarmがEngineに組み込まれたので、
改めて概念や用語について整理する。

```
あくまでも私としての認識なのでその点ご注意。
公式のドキュメントなどとは多少ずれてるやもしれない。
```


# swarm modeの構成

## 全体イメージ

![swamクラスタ.png](https://qiita-image-store.s3.amazonaws.com/0/40692/607280af-2124-a4e7-f5aa-1ce57a215fec.png "swamクラスタ.png")

覚えておかないとしんどいのは以下の４つの概念。

|用語|内容|
|---|---|
|Swarm|Dockerで構成されたクラスタのこと|
|ノード|単一Dockerホスト|
|サービス|同一タスク(コンテナ)の集合|
|タスク|単一コンテナ(厳密にはその中で実行されている処理)|

# 個別の概念

## Swarm

単一のDockerホスト(ノード)のクラスタのこと。
複数のノードが強調して動くことであたかも単一の
大きなリソースプールを持っているかのように見せかける。


## ノード

ノードは単一のDockerデーモンが動作している
VMまたは物理ホストのこと

### ノードの種別

|ノードの種別|内容|
|---|---|
|マネージャ|クラスタの状態管理可能なノード|
|ワーカ|コンテナを立ち上げることが可能なノード|

なお、マネージャノードはワーカノードを兼ねる。
マネージャ/ワーカの切り替えも可能。

### マネージャノードの役割
swarm全体の状態を管理する。
swarmが管理者が望む(desired)状態になっているかなどを監視し、それに近づけられるよう集約する。

単一のswarmないに複数のマネージャノードが存在する場合は
そのうちの一つがリーダとして振舞う。

##### マネージャノードを複数確保することの利点
単純にマネージャノードが複数あることで、
マネージャノードが死んでもswarm全体としては
正常に動作しつづけることができる。

厳密には、マネージャノードの台数に対して
何台までのマネージャノードの停止にswarmが耐えられるかは以下の数式に従う。

```math
\frac{n-1}{2}
```
n: swarm内のマネージャノード数

### ワーカノードの役割
マネージャノードからの指示を受けてタスク(コンテナ)の起動・停止を行っている。

```
単一のノードに収まりきれないようなタスクの起動はできない。
(ノードをまたがることはできない。まあ、コンテナだし)
```

## サービス

サービスとは、同一の複数タスクから構成される。
どのノードで個別のタスクを実行するかは、マネージャノード
(のリーダ)が決定する。

# サービス間の通信
swarmではサービス間で通信を行うことでコンテナ間の通信を実現する。
サービス間の通信は **サービス名** を用いて行う。

**swarm内ではDNSが動作しており、タスク名および、
サービス名での通信が可能**

サービス名で通信を行う場合は同一サービスに含まれるタスク(コンテナ)に対して自動的に負荷分散される。
**つまり、暗黙的に内部ロードバランサが存在する**

# swarm外からのアクセス

サービスにおいてswarm外からアクセスできるように設定した場合は、コンテナが1つしかない場合でも全てのノードから単一のノードに対してのアクセスが可能。


# まとめ

ざっくりと Apache-Tomcat-DBから構成される
webアプリケーションを構成すると以下のような形になる。
**あくまでもイメージなのでご注意。この構成で
正しくアプリが動くことも保証しない(てか動かんな)**

サービス間の通信サービス名で行うので
WebレイヤサービスからAPレイヤサービスを呼び出すときは
WebレイヤサービスにはAPレイヤサービスのサービス名を記述すれば良い。APレイヤサービスからDBレイヤサービスを呼び出す際も同様。

![swarmのイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/40692/047ad1b4-4b88-d268-c8a0-396109f9fe82.png "swarmのイメージ.png")
~/private/configを使ってsshしようとしたらProxyCommandのssh繋がらない！？→解決した

~/.ssh/config ではなく ~/private/config を指定しているが、

* sshのconfigは -F で指定ができるが、ProxyCommand内でも`-F ~/private/config`指定が必要だった。

```diff:~/private/config
 Host dodai
    User owner1
    HostName 22.22.22.22
 Host internal1
    HostName 192.168.0.11
-    ProxyCommand ssh -W %h:%p dodai
+    ProxyCommand ssh -F ~/private/config -W %h:%p dodai

 Host *
    IdentityFile ~/private/id_rsa
```

もしくは以下でも確かできたがスマートではない。

```diff:
+    ProxyCommand ssh -i ~/private/id_rsa owner1@22.22.22.22 -W %h:%p dodai
```
サーモグラフィ風の色変化をシグモイド関数で再現する


# 1. サーモグラフィの色表現

温度センサなどで計測した気温をサーバに送り可視化する場合、サーモグラフィのように温度の高低を色で表現したいときがあります。
　また、サーモグラフィの表現は温度に限らず、数値の大小を色で表現する場合に有効です。
　直感的には任意の値を青色→緑色→赤色と並んだ色相に割り当て3色の値を取得するだけでいいのですが、
プログラムで表現しようとするとやりたいことに対して少し面倒です。
　変換したい値の範囲を0.0〜1.0の範囲かつRGB各色が0~255の値をとるとすると、サーモグラフィ風の色表現はおおよそ以下のような色変化を行います。

|変換したい値|R   |G   |B   | RGBで表現される色 |
|:---------:|:--:|:--:|:--:|:----------------:|
|0.0        |0   |0   |255 |   青             |
|0.25       |0   |200 |200 |   水色           |
|0.5        |0   |255 |0   |   緑             |
|0.75       |200 |200 |0   |   橙             |
|1.0        |255 |0   |0   |   赤             |


この色変化プログラムで再現する方法としてif文で細かく条件分けして記述する手法がとられている場合が多いようです。しかし、何らかの関数で近似することでよりきめ細かい色変化を再現できるのではと考えました。
すでに投稿されている内容としては下記の記事があります。こちらの記事では各所の色が変化する部分をCOS関数で近似させています。しかしこの場合も0に張り付いている部分や1に張り付いている部分は場合分けが必要になります。

[値の大きさをサーモグラフィのような色に変換する](http://qiita.com/krsak/items/94fad1d3fffa997cb651)

* 各色の色の変化は以下のような区間分けができます。
 1. 0に張り付いている区間
 2. 連続的に滑らかに値が変化する区間
 3. 1に張り付いている区間

このような変化を行う関数としてシグモイド関数を適用させることにしました。

# 3. シグモイド関数
シグモイド関数は生物の神経細胞が持つ性質をモデルとして作られた関数です。ある値を境に急激に変化を行うため、ニューラルネットワークの活性化関数に用いられています。

式は以下の通りです。

αはゲインとなり、この値を変えることで、変化の勾配を変えることができます。

```math
　　sigmoid(x) = \frac{\tanh(αx/2)+1}{2}
```
```math
    -1 <= x <= 1
```

また、上記の式は以下のグラフになります。

![sigmoid.png](https://qiita-image-store.s3.amazonaws.com/0/3264/24587b64-8e68-4fa3-f6b7-9c281d5c57f4.png)

# 4. 色相環へのシグモイド関数の適用

最終的に目指すべき関数の形は以下のグラフのようになります。
![gradation.png](https://qiita-image-store.s3.amazonaws.com/0/3264/45ad65c7-4972-4a68-1745-20225898b625.png)

赤色はシグモイド関数をそのまま利用します。青色は関数を反転させたものを利用します。緑については赤色と青色の関数を加算して実現しています。詳細は下記のコードを参照してください。

Pythonで実装すると以下のようになります。Jupyterで実行すると上掲のグラフを確認することができます。
ゲインとオフセットの値を変更することで、値のグラデーションの重なり具合を変更することができます。
sigmoidメソッドは上記のシグモイド関数の式をそのまま実装しました。colorBarRGBメソッドで上記で説明した各色の関数を作成しています。結果は各色0.0〜1.0で出力されるので、16bitの場合は各色1024をかけた結果が実際の値になります。

```py3

import numpy as np
from pandas import DataFrame as df
import matplotlib.pyplot as plt
%matplotlib inline

gain = 10
offset_x= 0.2
offset_green = 0.6

def sigmoid(x, gain=1, offset_x=0):
    return ((np.tanh(((x+offset_x)*gain)/2)+1)/2)

def colorBarRGB(x):
    x = (x * 2) - 1
    red = sigmoid(x, gain, -1*offset_x)
    blue = 1-sigmoid(x, gain, offset_x)
    green = sigmoid(x, gain, offset_green) + (1-sigmoid(x,gain,-1*offset_green))
    green = green - 1.0
    return (blue,green,red)

#入力値は0.0〜1.0の範囲
data = [colorBarRGB(x*0.001) for x in range(0,1000)]

color = df(data)
color.plot()
```

上記の結果を8bit(0〜255)の画像に変換した結果が以下になります。
![img2.jpg](https://qiita-image-store.s3.amazonaws.com/0/3264/4295870e-b8c0-5d67-5c9d-3ce4af3e896a.jpeg)

上記方法ですとかなり短いコードでサーモグラフィの表現を実現することができると思います。また、ゲインとオフセットを調整することで、グラデーションの重なり具合を変更し細かい調整がやりやすそうです。
Gitlab Mattermost 2.2.0 => 3.1.0, 3.2.0 へのアップデート (Gitlab omnibus を利用)


# 2.2.0 => 3.1.0 へのアップデート
[GitLab Documentation](http://docs.gitlab.com/omnibus/gitlab-mattermost/)

上記ページの 「Upgrading GitLab Mattermost from versions prior to 8.9」 を参照。

※以下の手順はあくまでも私の環境での確認のみしか行っていません。上記公式ページを参照のもと、自己責任で実行願います。

## 1. Confirm you are starting with version GitLab 8.8.

例として以下のような環境からアップデートを行います。

```console
$ dpkg -l gitlab-ce
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                    Architecture               Description
+++-===========================================-==========================-==========================-===========================================================================================
ii  gitlab-ce                                   8.8.5-ce.1                 amd64                      GitLab Community Edition and GitLab CI (including NGINX, Postgres, Redis)
```

## 2. Backup your Mattermost database.
失敗した時用にバックアップを作成します。

```bash
$ sudo -u gitlab-psql -- /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql mattermost_production | gzip > mattermost_dbdump_$(date --rfc-3339=date).sql.gz
```

```console:実行例
$ sudo -u gitlab-psql -- /opt/gitlab/embedded/bin/pg_dump -h /var/opt/gitlab/postgresql mattermost_production | gzip > mattermost_dbdump_$(date --rfc-3339=date).sql.gz
$ ls
mattermost_dbdump_2016-08-12.sql.gz
```

## 3. Configure two settings.

`gitlab.rb` を `3.1` に合わせて修正します。

```
$ sudo vi /etc/gitlab/gitlab.rb
```

以下を追加します。

```rb:/etc/gitlab/gitlab.rb
mattermost['db2_backup_created'] = true
mattermost['db2_team_name'] = "TEAMNAME"
```

TEAMNAMEは使用しているチーム名に合わせて変更して下さい。
`3.1` より、複数チームに対応しているため、メインのチーム名を指定する必要があるようです。
`If you use multiple teams, this should be the name of the team most commonly used.` とのことです。

## 4. Run your GitLab 8.9 upgrade as normal.

`8.9.0-ce.0` にアップデートします。

```console
$ sudo apt-get update
$ sudo apt-get install gitlab-ce=8.9.0-ce.0
$ sudo gitlab-ctl restart
```

これで成功すればバージョンが `3.1.0` になっているはずです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37721/d16e6e04-0837-892d-18e6-30d3b5ccd6c2.png)

# 3.1.0 => 3.2.0 へのアップデート

このまま `3.2.0` へのアップデートもできることを確認できました。

```
$ sudo apt-get update --fix-missing
$ sudo apt-get install gitlab-ce
$ sudo gitlab-ctl restart
$ dpkg -l gitlab-ce
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                        Version                    Architecture               Description
+++-===========================================-==========================-==========================-===========================================================================================
ii  gitlab-ce                                   8.10.5-ce.0                amd64                      GitLab Community Edition and GitLab CI (including NGINX, Postgres, Redis)
```
LXD 環境を構築する


# 構築手順
## ホストVMの作成
 
* Vagrant で Ubuntu 16.04 の VM を起動

```bash
$ mkdir LxdTest
$ cd LxdTest/
$ vagrant init ubuntu/xenial64
$ vagrant up
$ vagrant ssh
```

vagrant upの前にVagrantfileのprivate_networkのコメントを外しておくとよい。

```bash
config.vm.network "private_network", ip: "192.168.33.10"
```

* ホストVMにLXD向け、ZFS向けのパッケージをインストール

```bash
$ sudo apt install -y lxd lxd-client lxd-tools criu
$ sudo apt install -y zfsutils-linux
$ sudo modprobe zfs
```

* LXDを初期化

```bash
$ sudo lxd init
Name of the storage backend to use (dir or zfs): zfs
Create a new ZFS pool (yes/no)? yes
Name of the new ZFS pool: tank
Would you like to use an existing block device (yes/no)? no
Size in GB of the new loop device (1GB minimum): 20
Would you like LXD to be available over the network (yes/no)? yes
Address to bind LXD to (not including port): 0.0.0.0
Port to bind LXD to (8443 recommended): 8443
Trust password for new clients: 
Again: 
Do you want to configure the LXD bridge (yes/no)? yes
Warning: Stopping lxd.service, but it can still be activated by:
  lxd.socket
LXD has been successfully configured.
```

* CentOS のコンテナを作成

```bash
$ lxc launch images:centos/6/amd64 centos-1
Creating centos-1
Retrieving image: 100%
Starting centos-1
$ lxc list
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
|   NAME   |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
| centos-1 | RUNNING | 10.184.87.54 (eth0) | fd31:b7f3:efeb:ab84:216:3eff:feb4:3484 (eth0) | PERSISTENT | 0         |
+----------+---------+---------------------+-----------------------------------------------+------------+-----------+
```

* 作成したコンテナに接続し、SSHサーバを起動

```bash
$ lxc exec centos-1 bash
[root@centos-1 ~]# yum install openssh-server
[root@centos-1 ~]# chkconfig sshd on
[root@centos-1 ~]# service sshd start
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]
```

* ホストVMにコンテナへのポートフォワードを設定

```bash
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp --dst 192.168.33.10 --dport 10080 -j DNAT --to-destination 10.184.87.54:80
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp --dst 192.168.33.10 --dport 10022 -j DNAT --to-destination 10.184.87.54:22
```

* Ansibleで疎通確認

```Ini
[web]
centos-1 ansible_ssh_host=192.168.33.10 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass=****
```
```bash
$ ansible -i hosts all -m ping
centos-1 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```
RailsでSkype名のバリデーションを書く

はじめに
---

Railsで作成したウェブアプリケーションでSkype名(skype_name)を持つUserモデルがあったとした場合、
Skype名が適切な形式かを判定するバリデーションの書き方を紹介する。

Skype名に使える文字列
---

Skypeアカウントは以下のurlから作成できる。
https://login.skype.com/registration

公式に書かれているSkype Nameで使える文字列は以下の通り


> What is my skype name? your skype name is your unique username for Skype. It must be between 6-32 characters,start with a letter and contain ony letters and numbers(no spaces or special character)

- ユニークであること
- 文字数は6〜32であること 
- 文字列から始まること
- 文字列と数値で構成されること
- 空白不可・特殊記号不可

### 使える特殊記号に注意

特殊記号不可とあるが、調べたところ「,.-」は利用できる
またSkypeはFacebookアカウントやMicrosoftアカウントで登録した場合は、
Skype名は以下の通り「:」が含まれるのでバリデーションルールに考慮する

- Facebook   facebook:lee
- Microsoft  live:clementine

バリデーションを定義する
---

上記の条件を満たしたvalidationをUser modelに定義する。

``` ruby
class User < ActiveRecord::Base
  validates :skype_name,
            length: {
              in: 6..32,
            },
            format: {
              with: /\A[a-zA-Z\d][\w,.-]+\z/,
              message:  "は正しいSkype名形式で入力して下さい"
            }
end
```

modelのspecは以下

``` ruby
require 'rails_helper'

RSpec.describe User, type: :model do
  describe "validates" do
    describe "skype_name" do
      context "with valid text" do
        subject{ User.new(skype_name: "live:umeyuki_,.-") }
        it { is_expected.to be_valid}
      end

      context "with less than 6 characters" do
        subject{ User.new(skype_name: "umeo") }
        it { is_expected.not_to be_valid}
      end

      context "with less than 32 characters" do
        subject{ User.new(skype_name: "ume" * 11 ) }
        it { is_expected.not_to be_valid }
      end

      context "with email format" do
        subject{ User.new(skype_name: "umeyuki1111@gmail.com" ) }
        it { is_expected.not_to be_valid }
      end

      context "with space" do
        subject{ User.new(skype_name: "ume yuki" ) }
        it { is_expected.not_to be_valid }
      end

      context "with a double byte character" do
        subject{ User.new(skype_name: "梅雪" ) }
        it { is_expected.not_to be_valid }
      end

      context "start with a sign" do
        subject{ User.new(skype_name: ".umeyuki" ) }
        it { is_expected.not_to be_valid }
      end
    end

  end
end

```

デモアプリ
---

https://github.com/umeyuki/demo-rails-skype-validation
RubyとRailsのto_jsonの違い

## 概要
出力される JSON に含まれる文字の一部が、JavaScript の [Unicode エスケープシーケンス](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#String_literals) に変換されているかされていないかが異なる。

Rails 側は、どういう仕様なんだろう？と思いました。

```bash
ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
irb
irb(main):001:0> require 'json'
=> true
irb(main):002:0> "<".to_json
=> "\"<\""
irb(main):003:0> { "<" => "<" }.to_json
=> "{\"<\":\"<\"}"
```

```bash
bundle exec rails --version
Rails 4.2.7
bundle exec rails console  
[1] pry(main)> "<".to_json
=> "\"\\u003c\""
[2] pry(main)> { "<" => "<" }.to_json
=> "{\"\\u003c\":\"\\u003c\"}"
```


## 結論
仕様だった。

```
          # Rails does more escaping than the JSON gem natively does (we
          # escape \u2028 and \u2029 and optionally >, <, & to work around
          # certain browser problems).
          ESCAPED_CHARS = {
            "\u2028" => '\u2028',
            "\u2029" => '\u2029',
            '>'      => '\u003e',
            '<'      => '\u003c',
            '&'      => '\u0026',
            }
```

コピペ元) https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/json/encoding.rb#L39-L41

なお、[引数で処理を変えれる](https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/core_ext/object/json.rb#L31-L41) よう。


## 補足） 何故調べたのか
[HTML 内にある script タグに `</script>` が書かれると JS が壊れる](https://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements) 問題がふと気になって、Rails でテンプレート上で `to_json` した場合に大丈夫なのかな？というのを調べたからです。

ちゃんとしていました。
「オフラインリアルタイムどう書く第3回(Y字路巡り)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[Y字路巡り](http://nabetani.sakura.ne.jp/hena/ord3ynode/)を解いてみた。
回答にかかった時間は55分ぐらいとかなりギリギリ。

進む方向の法則性がうまく読めず、`@map`に入れる順序を工夫してうまいところ出すように実装するべきかしばらく悩んだ。
実装に使った時間よりも悩んだ時間のほうが長いあたり、自身の思考力が低いことを実感させられる。

```ruby
class Route
  def initialize
    @history = [:B, :A]
    @all = (:A..:F).to_a
    @map = {
      A: [:B, :C, :D],
      B: [:A, :C, :E],
      C: [:A, :B, :F],
      D: [:A, :E, :F],
      E: [:B, :D, :F],
      F: [:C, :D, :E]
    }
    @pattern = [
      [2, 1],
      [0, 2],
      [1, 0]
    ]
  end

  def choose input
    current = @history[-1]
    prev    = @history[-2]
    index = @map[current].index prev
    type = @all.index(current) % 2
    case input
    when "b"
      @history.push prev
    when "l"
      @history.push @map[current][@pattern[index][type]]
    when "r"
      @history.push @map[current][@pattern[index][type == 0 ? 1 : 0]]
    end
  end

  def route
    @history[1..(@history.size - 1)].join
  end
end

test = <<_TEST
/*0*/ {"b", "AB" },
/*1*/ {"l", "AD" },
/*2*/ {"r", "AC" },
/*3*/ {"bbb", "ABAB" },
/*4*/ {"rrr", "ACBA" },
/*5*/ {"blll", "ABCAB" },
/*6*/ {"llll", "ADEBA" },
/*7*/ {"rbrl", "ACADE" },
/*8*/ {"brrrr", "ABEDAB" },
/*9*/ {"llrrr", "ADEFDE" },
/*10*/ {"lrlll", "ADFEDF" },
/*11*/ {"lrrrr", "ADFCAD" },
/*12*/ {"rllll", "ACFDAC" },
/*13*/ {"blrrrr", "ABCFEBC" },
/*14*/ {"brllll", "ABEFCBE" },
/*15*/ {"bbrllrrr", "ABACFDEFD" },
/*16*/ {"rrrrblll", "ACBACABCA" },
/*17*/ {"llrlrrbrb", "ADEFCADABA" },
/*18*/ {"rrrbrllrr", "ACBABEFCAD" },
/*19*/ {"llrllblrll", "ADEFCBCADEB" },
/*20*/ {"lrrlllrbrl", "ADFCBEFDFCB" },
/*21*/ {"lllrbrrlbrl", "ADEBCBACFCAB" },
/*22*/ {"rrrrrrlrbrl", "ACBACBADFDEB" },
/*23*/ {"lbrbbrbrbbrr", "ADABABEBCBCFE" },
/*24*/ {"rrrrlbrblllr", "ACBACFCACFDAB" },
/*25*/ {"lbbrblrlrlbll", "ADADFDABCFDFED" },
/*26*/ {"rrbbrlrlrblrl", "ACBCBADFEBEFDA" },
/*27*/ {"blrllblbrrrrll", "ABCFDADEDABEDFE" },
/*28*/ {"blrllrlbllrrbr", "ABCFDABCBEFDEDA" },
/*29*/ {"lbrbbrllllrblrr", "ADABABEFCBEDEBCF" },
/*30*/ {"rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" },
_TEST

require 'minitest/autorun'

describe 'Y Road' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s{"([^"]+)",\s"([^"]+)"\s},$/).to_a
    route = Route.new
    input.split(//).each do |i|
      route.choose i
    end
    it input do
      assert_equal route.route, expect
    end
  end
end
```
MacでHHKB風矢印キーを再現する

# はじめに
かなりニッチな記事ですが、Karabinerを利用すると簡単にHHKB風矢印キーバインドを再現することができました。

* HHKBが欲しいけど、矢印キーなしが使いこなせるか不安なので試してみたい
* 家ではHHKB使ってるけど、職場の事情でキーボード持ち込み禁止
* MacBookでもHHKB風矢印キーバインドで操作したい

みたいな人にオススメです。

# HHKB?
"Happy Hacking Keyboard"という名前のキーボードで、必要最低限のキーのみで構成されているのが特徴です。
Professionalモデルは矢印キーすらなく、代わりにFnキー＋[ ' / ; で操作します。
![pro2_keytop_a_l.jpg](http://www.pfu.fujitsu.com/hhkeyboard/leaflet/images/pro2_keytop_a_l.jpg)
万人向けではないですが、熱狂的ファンも多い高級キーボードです。
余談ですが[HHKBの公式Twitterアカウント](https://twitter.com/pfu_hhkb?lang=ja)も存在します。

# 手順
## 1.Karabinerインストール
MacOS用のキーバインドカスタマイズツールです。US配列キーボード派には馴染み深いかもしれません。
https://pqrs.org/osx/karabiner/index.html.ja

## 2.右シフトキーをFnに変更
私の場合は右シフトキーを使用しないので、Fnキーに変更します。
設定画面より、以下のようにチェックを入れます。
![Karabiner_Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/41569/d9c95bd1-e8bd-c501-9b65-ba237414e5fc.png)

## 3.HHKB風矢印キーバインドを有効化
なんとHHKB風矢印キーバインドにするチェックボックスが存在しました。
設定画面より、以下のようにチェックを入れます。
![Karabiner_Preferences_HHKB.png](https://qiita-image-store.s3.amazonaws.com/0/41569/be89bdef-e8a5-f2b1-1d27-2baa68171b55.png)