OmniAICreator/Qiita-1.07M huggingface dataset:
Fuchsia の ネットワーク周りについて調べた。

Fuchsia のソースコードをちょっと眺めてみました。

FuchsiaはGoogleが2016年8月に公開したOSです。
Brilloと違ってLinux kernelではなく、独自のkernelを使っているのが特徴です。

自分が興味があるネットワーク関連の下回りの部分について調査しました。

# drivers/wifi
* mediatek rt5370 のwifiドライバが追加されてた。
 * https://fuchsia.googlesource.com/drivers/wifi/+/sandbox/tkilbourn/rt5370

# bluetooth
* bluetoothのHCI送受信部が追加されて。
 * https://fuchsia.googlesource.com/bluetooth/ 

# magenta
* kernel＋αです。
* マイクロカーネルなので、小さなカーネル+ユーザーモードライブラリ＋ユーザーモードドライバという組み合わせ。
* 独自のIPv6スタックがある。(現状TCPは未対応。)
 * https://fuchsia.googlesource.com/magenta/+/master/system/ulib/inet6/
* ネットワークAPIのサンプルがある
 * https://fuchsia.googlesource.com/magenta/+/master/system/uapp/netsvc/netsvc.c  
* Ethernetドライバがある。kernel/dev/netとsystem/udevにある。カーネルのドライバとユーザーモードドライバなのでしょうか？
 * https://fuchsia.googlesource.com/magenta/+/master/kernel/dev/net/pcnet
 * https://fuchsia.googlesource.com/magenta/+/master/kernel/dev/net/smc91c96 
 * https://fuchsia.googlesource.com/magenta/+/master/system/udev/intel-ethernet/
 * https://fuchsia.googlesource.com/magenta/+/master/system/udev/usb-ethernet/

* 現時点でのターゲットは3つ Acer Switch Alpha 12 と Intel NUC (Skylake and Broadwell) と Raspberry Pi 3
 * https://fuchsia.googlesource.com/magenta/+/master/docs/targets/acer12.md
 * https://fuchsia.googlesource.com/magenta/+/master/docs/targets/nuc.md
 * https://fuchsia.googlesource.com/magenta/+/master/docs/targets/rpi3.md
* Acer Switch Alpha 12で動作させた時のスクリーンショット (via HN)
 *  http://imgur.com/LqDRoyG
*  最初のコミットは2016-06-15
 * https://fuchsia.googlesource.com/magenta/+/53b9e1c8de8446a88409d17c4aed70be33349378  
 * 最初のコミットのdoc/index.mdには用途の記載がある。(https://fuchsia.googlesource.com/magenta/+/53b9e1c8de8446a88409d17c4aed70be33349378/docs/magenta/index.md)

```
Magenta is the OS kernel that powers FNL for Phones and Personal Computers.
```

# gigaboot20x6
* ブートローダ
* 要UEFI。
* UDPv6によるネットワークブートに対応 
* ネットワークブートのやり方 https://fuchsia.googlesource.com/magenta/+/master/docs/getting_started.md

# その他
* LwIPがある。 実際はmagentaのIPv6スタックはあまり使わないでLwIPを使うみたいですけど、どうでしょうか？
 * FuchsiaのコードはFuchsiaブランチのports/fuchsiaにある。
 * https://fuchsia.googlesource.com/third_party/lwip/+/fuchsia/ports/fuchsia 
 * ethernetドライバを使った送信は、/dev/class/ethernet/enをopen()して、ファイルディスクリプタにwrite()する。
 * ethernetドライバを使った受信は、ファイルディスクリプタをread()する。
* VapidSSL というBoringSSLをforkしたSSLがある。
 * https://fuchsia.googlesource.com/vapidssl/ 
* hostapがあるので、Wi-Fi対応するのかもしれない。
 * https://fuchsia.googlesource.com/third_party/hostap/
 * fuchsia用のwpa_supplicant のmain部分
 *  https://fuchsia.googlesource.com/third_party/hostap/+/fuchsia/wpa_supplicant/main_fuchsia.c
 * fuchsia用のeloop 、だけど、すぐrevertされてた。
 * https://fuchsia.googlesource.com/third_party/hostap/+/27398e96aa3b38817cb2a693d746ada42bb4e4a2

# リンク
* https://fuchsia.googlesource.com/
* https://github.com/fuchsia-mirror/
* [Google: IoT向け新OS「Fuchsia」を発表](http://business.newsln.jp/news/201608131022360000.html)
* https://news.ycombinator.com/item?id=12271354
* https://www.reddit.com/r/Android/comments/4xcwbm/google_working_on_new_fuchsia_operating_system/
Vimで文字コードを指定する

# 指定の文字コードでファイルを開き直す
## Shift JIS でファイルを開き直す
```vim
:edit ++encoding=sjis
```
```vim
:e ++enc=cp932
```
## UTF-8 でファイルを開き直す
```vim
:e ++enc=utf-8
```

# 指定の文字コードでファイルを保存する
## Shift JIS でファイルを保存
```vim
:set fileencoding=sjis
```
```vim
:se fenc=cp932
```

# 現在のエンコードを確認する
## Vim のエンコード
```vim
:se enc?
```
## ファイルのエンコード
```vim
:se fenc?
```

# シリーズ Vim
* [Vimで文字コードを指定する](http://qiita.com/bezeklik/items/2c9925f9c07762559471)
* [Vimで改行コードを変更する](http://qiita.com/bezeklik/items/aca37ffb127821311d6b)
* [Vimで検索した時のハイライトがウザい](http://qiita.com/bezeklik/items/33ba5b4ef9bd356cbec5)
fzfとghqとGNU globalでCのソースコードリーディングが捗った話

Javaとかのソースコード読むときは、IntelliJとかでいい感じにタグジャンプできるんだけど、rubyとかpostgresとかみたいなCのプロジェクトを読むときは何かいけてる方法ないかなあと思っていた。

この辺りを参考に、githubやらのソースコードを管理していたんだけど、それとGtags(htags)を組み合わせてソースコードリーディングが捗った話

* http://blog.kentarok.org/entry/2014/06/03/135300
* http://qiita.com/b4b4r07/items/9e1bbffb1be70b6ce033

# 下準備

### 必要なコマンドを用意

* ghq https://github.com/motemen/ghq
    * Githubなどのリポジトリのローカルクローンをいい感じに管理できる。
* fzf https://github.com/junegunn/fzf
    * percolみたいに、いい感じにcliで曖昧検索できる
* GNU global https://www.gnu.org/software/global/
    * ソースコードにタグ付けして、定義にジャンプしたりできる
    * `htags`を使っていい感じにソースコードにリンクが貼られたhtmlを吐いたりできる。

### いい感じのスクリプトを用意

下記のようなものを用意

```bash
# ghqのリポジトリのパスを曖昧検索で指定
SRC=$(ghq list | fzf)

# htagsのファイル郡を保存するディレクトリ。ghqのパスに準拠することで衝突を防ぐ。
TARGET=${HOME}/.docs/${SRC}

# なけれればhtagsのファイル郡を作成
if [ ! -d "${TARGET}" ]; then
  pushd ${HOME}/src/${SRC}
  mkdir -p ${TARGET}
  htags -ansv ${TARGET}
  popd
fi
open ${TARGET}/HTML/index.html
```

これをzshのfunctionにするとか、PATHに実行ファイルとして置くとかしてすぐ実行できるようにすると便利。

仮に`src`で上記が呼べるようにした。

# 使ってみる

rubyのソースコードをブラウザで読めるようにする。

### ソースコードのクローン

```bash
$ ghq get https://github.com/ruby/ruby.git
```

### いい感じに見る

用意したスクリプトを呼ぶ

```bash
$ src
```

リポジトリの曖昧検索が始まる

![image](https://qiita-image-store.s3.amazonaws.com/0/13731/bcc1dc2e-25a2-060a-f9a4-f22e48d39eac.png)

`ruby/ruby`を指定してhtagsのファイル郡が作成されるのを待つ

![image](https://qiita-image-store.s3.amazonaws.com/0/13731/6cf7bac1-5d1b-0700-0eb8-f19eeaf75feb.png)

ファイルが作成し終わったらブラウザで開く

![image](https://qiita-image-store.s3.amazonaws.com/0/13731/e27c78aa-d2ee-fdd7-8384-6e123112ff4f.png)

リンクからジャンプできて便利

![image](https://qiita-image-store.s3.amazonaws.com/0/13731/7592f7ea-a475-ac75-2a41-9ed057ac4e62.png)

一度タグファイルなどを作っておけば以降は`open`するだけなのですぐ開く。
Solrで'There exists no core with name "コア名"'と出た時の対処

Solrの辞書チューニングをしていたら以下のような状態になったことがありました。
<img width="1228" alt="スクリーンショット 2016-08-03 11.06.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/1e0d03d1-475e-127d-0f50-a00e09fb8506.png">
`Could not load conf for core [コア名]`とか`There exists no core with name "[コア名]"`と出ているものの確かにそのコア名は存在していました。単に「コアがないよ」とだけ言われてその原因がわかりにくかったので、ここではこんな時にチェックすべき項目を挙げておきます。今のところ見つけたのは4パターンですが、また何か見つけたら追記します。

ちなみにsolrのバージョンは5.5です。

# 1.書式ミスがないか

当たり前ですが書式ミスがあるとエラーになります。例えば以下の状態だとエラーになります。

```text:[NG例]synonym.txt
トマト=>
```
`=>`の後に単語を書くべきなのに書いていないという書式ミスです。

# 2.同じ単語を登録していないか

`userdict_ja.txt`に同じ単語を2回登録するとエラーになります。

```text:[NG例]userdict_ja.txt
緑茶パック,緑茶パック,リョクチャパック,カスタム名詞
緑茶パック,緑茶パック,リョクチャパック,カスタム名詞
```

ちなみにreadingの部分だけ変えてもエラーが出ました。

```text:[NG例]userdict_ja.txt
緑茶パック,緑茶パック,リョクチャパック,カスタム名詞
緑茶パック,緑茶パック,ミドリチャパック,カスタム名詞
```

# 3.改行の入れ忘れがないか

1つの語、シノニムを登録するときには1行+改行がセットになります。そのため、ファイル最終行は空行を入れないとエラーになります。

```text:[正解例]synonyms.txt
りんご,リンゴ,林檎[改行]
とまと,トマト[改行]
[空行]
```

# 4.分かち書きと読み半角スペースの数に相違がないか

`userdict_ja.txt`で半角スペースを入れることによって分かち書きを表現できるということは[こちら](http://qiita.com/kijtra/items/d391179e1ea0be65e3f5#3-2)にも書かれている通りなのですが、その際、分かち書きの部分と読みの部分で半角スペースの個数に差があるとエラーになります。

```text:[NG例]userdict_ja.txt
緑茶パック,緑茶 パック,リョクチャパック,カスタム名詞
```

なので揃えましょう。

```text:[NG例]userdict_ja.txt
緑茶パック,緑茶 パック,リョクチャ パック,カスタム名詞
```

# おまけ

まだサーバが立ち上がったばかりでも`There exists no core with name "[コア名]"`のポップアップが表示されていることがあります。ただ、その時は冒頭の画像のように赤で`SolrCore Initialization Failures`とは出ていないはずなのでもう少し待ってからリロードしてみてください。特に問題なく動くはずです。
Stream APIでファイル読み込みする時に知っておくと役立つ・・・・かもしれない


特定ディレクトリ配下にあるファイルを読み込んでフンタラする昔ながらにある処理を
java8で書いてる時に気づいた点です。


書き方によって例外が発生したりしなかったり
---
テストファイル一つだけで試してたので気づかなかったのですが
あちこちからかき集めた大量のファイルで試してみたらmalformedInputExceptionでコケたので
まとめてみました。

```java
public static void main(String[] args) throws IOException {

		// ① CharsetDecoderはデフォルトでCodingErrorAction.REPORT
		try (Stream<String> lines = Files.lines(Paths.get("test.txt"))) {
			lines.forEach(s -> {
				System.out.println(s);
			});
		} catch (Exception e) {
			System.out.println("例外発生");
		}

		// ② CharsetDecoderはデフォルトでCodingErrorAction.REPORT
		try (BufferedReader br = Files.newBufferedReader(Paths.get("test.txt"));
			Stream<String> lines = br.lines()){
			lines.forEach(s -> {
				System.out.println(s);
			});
		} catch (Exception e) {
			System.out.println("例外発生");
		}

		// ③ CharsetDecoderはデフォルトでCodingErrorAction.REPLACE
		try (BufferedReader br = new BufferedReader(new FileReader(new File("test.txt")));
			Stream<String> lines = br.lines();) {

			lines.forEach(s -> {
				System.out.println(s);
			});
			System.out.println("文字化けするが例外起きない");
		} catch (Exception e) {
			System.out.println("例外起きない");
		}

		// ④ CharsetDecoderはデフォルトでCodingErrorAction.REPLACE
		CharsetDecoder dec = StandardCharsets.UTF_8.newDecoder().onMalformedInput(CodingErrorAction.IGNORE);
		try (Reader r = Channels.newReader(FileChannel.open(Paths.get("test.txt")), dec, -1);
			BufferedReader br = new BufferedReader(r);
			Stream<String> lines = br.lines();) {
			lines.forEach(s -> {
				System.out.println(s);
			});
			System.out.println("文字化けするが例外起きない");
		} catch (Exception e) {
			System.out.println("例外起きない");
		}
	}
```

読み込むファイルのエンコードが確定している時は指定すれば良いと思うのですが、
いろいろ混じるときは特定する処理が必要ですね。
SphinxドキュメントからGitHubへリンクする

# 概要
[Sphinx](http://www.sphinx-doc.org/en/stable/) テンプレートの一つ [sphinx_rtd_theme](https://github.com/snide/sphinx_rtd_theme) では，
メタデータ `:github_url:` に URL を渡すことで，`Edit on GitHub` のリンクを生成してくれる．

ではそのメタデータはどこで定義するのか？という話．

# メタデータの定義
Sphinx におけるメタデータは二種類ある．一つは今回必要なテンプレートの処理に使うメタデータであり，
もう一つは HTML の meta タグを出力するためのものである．

前者は，`.rst` ファイルの先頭付近（A field list near the top of a file）に置く必要がある．
曖昧な表現だが，要するに他のマークアップより前に書いておけば良い．

```rst
:github_url: https://github.com/jkawamoto/roadie-gcp

.. ここから本文を始める
```

などとすれば良い．

ちなみに，後者の方は `.. meta::` で始まるセクションに記述する．

```rst
.. meta::
  :viewport: width=device-width
```

# メタデータの一括登録
上記の通り，各 `.rst` ファイルの先頭に `:github_url:`メタデータを追加すれば，
生成されたドキュメントには GitHub へのリンクが付く．
しかし，一々記述するのは手間なので，`rst_prolog` オプションを使って一括登録する．

`conf.py` に `rst_prolog` 変数を定義すると，その内容を各 `.rst` ファイルの先頭に追加してくれる．
よって，

```conf.py
rst_prolog = """
:github_url: https://github.com/jkawamoto/roadie-gcp

"""
```

を `conf.py` に追加すれば，生成されたドキュメントの全ページに GitHub へのリンクが付く．

ちなみに生成されたドキュメントは http://jkawamoto.github.io/roadie-gcp/ のようになる．
Microsoft Remote Desktopの接続先作成を自動化してみる

# 概要

Microsoft Remote Desktopの接続先が大量にある場合、IPアドレス入れて、ユーザ名入れて、パスワード入れて、、
なんてちまちま入力してられないので、自動化してみました。

# 環境

OS X 10.11 (OS X El Captain)
Microsoft Remote Desktop(RDP) 8.0.33
swift 2.2

# やりたいこと

- RDPのImport機能を使って接続先を一括でインポートしたい
- パスワードを一括で設定したい
- 接続先IPアドレスやユーザ名、パスワードがそれぞれ違う

# やってみた

こんなツールを作りました。
[wakinchan/RemoteDesktopTools](https://github.com/wakinchan/RemoteDesktopTools)

swift 2.2ベースで作成しているため、環境がswift 1.x等では動作しません。
Redirection file pathの指定してそこも一括設定がしたかった。
が、file pathによってASCIIコードがころころ変わって理解出来なかったため諦めました。
自分で設定ファイルを覗いて、ASCIIコードをちまちま変えてやると出来ます。

## format.txt

RDPのExportで出したファイルを中身です。(File -> Export)
自分の好みの設定をRDPからExportして、中身を書き換えます。
`full address`, `username`の設定は下記の用に設定します。

```
full address:s:${IPADDRESS}
username:s:${USERNAME}
```

## datasource.csv

`name,ip_address,username,password`
を順に設定してておきます。
カラムずれとかに気をつけて

<img width="266" alt="rpd7.png" src="https://qiita-image-store.s3.amazonaws.com/0/94722/935e3bfb-859b-b196-5bf9-8f6833f880bb.png">

## createRemoteDesktops.swift

```bash
$ ./createRemoteDesktops.swift
```

rdpファイルを生成します。
生成されたファイルを、RDPのImport機能を使って一括でインポートします。(File -> Import)

<img width="500" alt="rdp.png" src="https://qiita-image-store.s3.amazonaws.com/0/94722/1efbc56d-d1cd-435f-9903-3376a1e4cde2.png">

ここでインポートした時点では、接続先名やパスワードは表示されません。

<img width="500" alt="rdp.png" src="https://qiita-image-store.s3.amazonaws.com/0/94722/cd869040-b9bd-cee5-846e-03a3bec53472.png">

## setLabelsAndKeychains.swift

```bash
$ ./setLabelsAndKeychains.swift
```

インポートした接続先に対して、接続先名とパスワードを設定します。接続先名で昇順にソートします。
RDPアプリが開いている場合は再起動すると反映します。

<img width="500" alt="rdp3.png" src="https://qiita-image-store.s3.amazonaws.com/0/94722/82b9f0fc-bc67-7fc8-4d89-b310f10edead.png">

パスワードも保存されています。
詳細に表示される各種設定は `format.txt` である程度設定ができるかと思います。

<img width="430" alt="rdp4.png" src="https://qiita-image-store.s3.amazonaws.com/0/94722/f4ef90de-eb4c-85a9-a32b-ed0dff194f1e.png">
そのAnt→Gradle移行、もうちょい工数積んだ方がいいですよ

ビルドスクリプトがAntで書かれたレガシーなプロジェクトをGradle移行しようとして工数が見積もりより大幅に膨らんだ話。

* Ant 1.8.2
* Gradle 2.9


# GradleのAnt互換な作りは素晴らしい

[Gradle ドキュメント](http://gradle.monochromeroad.com/docs/userguide/ant.html)が詳しいが、GradleはAntとの親和性が非常に高い。

例えば既存のAntビルドスクリプトがこんな感じであったとき

```xml:build.xml
<project>
    <target name="compile">
      <javac srcdir="src" destdir="classes" includeantruntime="false"/>
    </target>
</project>
```

Gradleのビルドスクリプトにただ一行、

```groovy:build.gradle
ant.importBuild 'build.xml'
```

と書いてあげれば、GradleタスクとしてAntターゲットを取り込むことができる。
取り込んであげたタスクは、普通にGradleタスクとして実行が可能。

```sh:Shell
$ ant compile
Buildfile: /path/to/build.xml

compile:

BUILD SUCCESSFUL
Total time: 0 seconds

$ gradle compile
:compile

BUILD SUCCESSFUL
```

# 痒いところにも手が届く

もしもGradle側の既存タスクと名前が被ってしまう場合も心配無用。Antターゲットの名前を変更してインポートできます。

```groovy:build.gradle
ant.importBuild('build.xml') {
  antTaskName -> "ant.${antTaskName}".toString()
}
```

```sh:Shell
$ gradle ant.compile
:ant.compile

BUILD SUCCESSFUL
```

cf. <http://mrhaki.blogspot.jp/2014/12/gradle-goodness-rename-ant-task-names.html>

この辺でGradle大好き人間一丁あがり。

# これなら簡単に移行できるねーって言ってたら

スクリプトをGradleに書き換える作業は後でやるとして、ひとまずGradleからAntを呼び出す形なら簡単だねと言ってました。当初は。

`ant.importBuild`を駆使して実際にスクリプトを書いてみたところ、以下の問題が。

* basedirが無視される
* プロパティの継承で仕様が異なる

# basedirが無視される

GradleスクリプトをAntスクリプトと別の場所に置く要件があった場合、つまりAntの`basedir`と、Gradleの`projectDir`が異なる場合、
スクリプトが意図通りに動きません。

ありがちなんですが、既存プロジェクトは複数のAntスクリプトをバッチファイルやシェルスクリプトでこねくり回してビルドしてました。
はじめは単純だったんでしょうけど、時を経るごとにAnt同士やスクリプトどうしの依存関係がぐちゃぐちゃに。

そのためか`basedir`の指定が必須な作りになっており、そのままインポートできない、と。

[似たことで困っている人はいて](https://discuss.gradle.org/t/problems-using-ant-importbuild-with-ant-file-using-basedir/1194/2)、曰く[Unresolvedなバグ](https://issues.gradle.org/browse/GRADLE-2039)とのこと。

# プロパティの継承で仕様が異なる

仕方ないので`basedir`必須な既存のスクリプトを書き換えて、Gradleからでもインポートできるように変更しました。でもそこで章題の問題が顕在化。

Antは変数の上書きはせず、先勝ちことで知られています。
また、あるAntスクリプト内で`ant`タスクを使い、別のAntスクリプトを呼び出す場合、プロパティを引き継ぐか否かを`inheritAll`属性で制御できます。

既存のプロジェクトには、以下のケースが混在していました。

1. バッチファイルから、プロパティを`-D`指定してAntスクリプトを呼びだす
2. Antスクリプトから複数のAntスクリプトを呼びだす(`inheritAll="true"`)
3. Antスクリプトから複数のAntスクリプトを呼びだす(`inheritAll="false"`)

Gradleスクリプトで単純に`ant.importBuild`をすると、２.のケースになってしまいます。

結局この問題も、既存のAntスクリプトに手を加えずに解決することはできませんでした。

# そして

どうにか既存の資産を使おうと試行錯誤しましたが、全部Gradleスクリプトに書き換えた方がスッキリするという結論に。

既存のビルドスクリプトがぐちゃぐちゃしているなら、`ant.importBuild`を使わずに全部Gradleスクリプトで書き換える前提で見積もりましょう。
Elasticsearchを使って自分の周囲の位置情報を検索する

# 実行環境
elasticsearch version 2.3.3

# やりたいこと

- 特定の場所（自分とかユーザーとか＊＊＊駅とか）の周囲何キロメートルのお店を検索
- 検索結果では近い順にお店を返す
- 検索結果ではお店までの距離も返す


# まずデータを作る
## マッピング定義

shops.jsonを作成

`geo_point`のtypeを持つフィールドを用意する

```
{
  "mappings": {
    "shop": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "address": {
          "type": "string"
        }, 
        "phone_number": {
          "type": "string"
        }, 
        "latidude": {
          "type": "double"
        },
        "longitude": {
          "type": "double" 
        },
        "created": {
          "format": "dateOptionalTime", 
          "type": "date"
        },
        "updated": {
          "format": "dateOptionalTime", 
          "type": "date"
        },
        "geo_location": {
          "type": "geo_point"
        }
      }
    }
  }
}
```

## インデックスを作る

```
$ curl -XPOST localhost:9200/shops?pretty -d @shops.json
```

## データを投入

※geo_locationは[ 経度（longitude）, 緯度（latitude） ]

緯度経度はここで調べられる
http://www.geocoding.jp/

```
curl -XPUT localhost:9200/shops/shop/1?pretty -d '
{
  "id": "1",
  "name": "Curry Shop",
  "address": "東京都世田谷区経堂2丁目",
  "phone_number": "000-0000-0000",
  "latitude": 35.651045,
  "longitude": 139.636139,
  "created": "2015-09-01'T'05:26:07.062421",
  "updated": "2015-10-02'T'03:02:51.777291",
  "geo_location": [ 139.636139, 35.651045 ]
}
'
```

# 位置情報を検索する
## 検索クエリ

- `geo_location`には特定の場所（自分とかユーザーとか＊＊＊駅とか）の経度緯度を設定
- `distance`には特定の場所の周囲の距離（検索範囲）を設定

```
curl localhost:9200/shops/shop/_search?pretty -d '
{
  "query": {
    "match_all" : {}
  },
  "filter": {
    "and": [
      {
        "geo_distance": {
          "distance": "5km",
          "geo_location": [ 139.62464, 35.647656 ]
        }
      }
    ]
  },
  "sort": [
    {
      "_geo_distance": {
        "geo_location": {
          "lat": 35.647656,
          "lon": 139.62464
        },
        "order": "asc",
        "unit": "km", 
        "distance_type": "plane" 
      }
    }
  ]
}
'
```

## レスポンス

`sort`はお店までの距離

```
{
  "took" : 10,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : null,
    "hits" : [ {
      "_index" : "shops",
      "_type" : "shop",
      "_id" : "1",
      "_score" : null,
      "_source" : {
        "id" : "1",
        "name" : "Curry Shop",
        "address" : "東京都世田谷区経堂4丁目",
        "phone_number" : "000-0000-0000",
        "latitude" : 35.651045,
        "longitude" : 139.636139,
        "created" : "2015-09-01T05:26:07.062421",
        "updated" : "2015-10-02T03:02:51.777291",
        "geo_location" : [ 139.636139, 35.651045 ]
      },
      "sort" : [ 1.3344915446870738 ]
    } ]
  }
}
```

# 参考
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html
Ubuntuで最新のdockerインストール手順


#環境

Ubuntu 14.04 LTS

#手順


## 1. リポジトリの鍵を登録

```
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

## 2. リポジトリをパッケージリストに追加

```
sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main\
> /etc/apt/sources.list.d/docker.list"
```

## 3. 以前インストールされていたDockerを削除

```
sudo apt-get purge lxc-docker docker
```

## 4. 最新のDockerインストール

```
sudo apt-get update
sudo apt-get install docker-engine
```

## 5. Docker再起動

```
sudo service docker restart
```

## 6. バージョン確認

```
docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 22:00:36 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 22:00:36 2016
 OS/Arch:      linux/amd64
```

参考

http://christina04.hatenablog.com/entry/2015/12/25/105242
mruby でブロックと Proc オブジェクト両方 mrb_get_args() で拾えるようにする

mruby でメソッドにブロックと、 Proc.new とか lambda {} とかで取得したオブジェクト、どちらかを渡して処理したい時があります（あるかな？僕はありました）
しかしながら `mrb_get_args()` でブロックを拾うためのフォーマット文字 `&` では Proc オブジェクトの場合、オブジェクトを拾うためのフォーマット `o` ではブロックの場合にうまくいかなくなります。（`ArgumentError: wrong number of arguments` が出るはず）

```ruby
mrb_value block;
mrb_get_args(mrb, "&", &block); # Proc オブジェクトを渡した場合 ArgumentError
```

```ruby
mrb_value block;
mrb_get_args(mrb, "o", &block); # ブロックを渡した場合 ArgumentError
```

どちらも受け付けたい場合は、フォーマット文字列として `*&` を指定すると良いです。ブロックが渡された場合は `&` 指定にマッチし、 Proc オブジェクトが渡された場合は `*` にマッチさせることができます。

```ruby
mrb_int argc;
mrb_value *argv, block;
mrb_get_args(mrb, "*&", &argv, &argc, &block); # ブロックが渡った場合は block 変数に格納される
if (argc && mrb_nil_p(block)) {
  block = argv[0]; # Proc オブジェクトが渡った場合は agrv に格納されているのでそれを拾いにいく
}

if (!mrb_nil_p(block) && mrb_type(block) == MRB_TT_PROC) {
  # ブロックでも Proc オブジェクトでも `mrb_type()` の戻り値は `MRB_TT_PROC` に見える
  ...
}
```

### 補足

この記事は mruby 1.2.0 で動作確認した結果で執筆しています。
また何か別の良いやり方があればご指摘いただければ幸いです :D

### 以下、蛇足的ななにか

この挙動の詳細を確認したく、 mruby の `src/class.c` の `mrb_get_args()` の実装を追ったり、デバッガで動作を追ってみたりしました。
手元で確認した限り、以下のようになっているのかなと・・・。

* `mrb_get_args()` のローカル変数 `argc` は拾うべき引数の数？が格納される
* ブロックが渡った際は、ブロック分は `argc` に計上されない。 Proc オブジェクトが渡った際は計上される
* `mrb_get_args()` 内で取得できた引数の数 `i` と `argc` の比較をしている
  1. 新しい引数を取得する前に `argc <= i` だったら `ArgumentError` (まだ引数が残ってるのに `argc` に到達している)
  2. `mrb_get_args()` を抜ける際に `argc > i` だったら `ArgumentError` (`argc` に満たない数の引数しか取得できなかった)
* `mrb_get_args()` のフォーマット文字列に `&` を指定して Proc オブジェクトを渡した場合...
  - Proc オブジェクトが渡ったので `argc` はその分が計上される
  - ただし `&` が指定されているので引数の数には計上されない
  - 引数の取得数が `argc` に満たないので 2. のパターンにマッチして `ArgumentError`
* `mrb_get_args()` のフォーマット文字列に `o` を指定してブロックを渡した場合...
  - ブロックが渡ったので `argc` はその分は計上されない
  - ただし `o` が指定されているので引数の数には計上される
  - 引数の取得数が取得前に `argc` を超える状況が発生するので 1. のパターンにマッチして `ArgumentError`
* フォーマット文字列に `*` を渡すと、 `i` の数は実際に取得できた数になる
  - ブロックを渡した場合 `0`, Proc オブジェクトを渡した場合 `1` になる
  - ので前述の 1. , 2. の条件どちらも満たさず `mrb_get_args()` を抜ける

\# ブロックも Proc オブジェクトも同じ型 `MRB_TT_PROC` で扱われるし、直感的には同じ取得方法 `&` で取れると嬉しい気がするのですが・・・難しいのかな。軽く `src/vm.c` を読んで見たけど、実現方法とかそもそもその方針が妥当なのかもわからず・・・。
ブラウザアプリで、大量のデータをオフラインで持ちたい

どうも、社内SEに無事転向しました。
のんびりした開発というか、思い切りのんびりした感じで、逆に自分の中でメリハリつけないと大変そうだなぁと思いながら、いろんな要望を聞いています。

で、今回のこれ。
# ブラウザアプリで大量のデータをオフラインで持ちたい
 **※ブラウザはIE、あとiPadに対応させてほしい**

chrome縛り可であれば、serviceworkerでなんとでもなるのですが、この条件だと、使える技術が限られます。

- オフラインはappCacheで
- そのオフラインデータとやらは、IndexedDBで

ぐらいが妥当な線だと見て、生まれて初めて取得する盆休み中にいじってみました。

# 先に結論
　十分使える。むしろ自分用ツールをこれに載せたレベル。

# 実装
## appCacheの書き方
まず、HTMLタグに、appcacheを使用することを宣言します。

```html:index.html
<html manifest="manifest.appcache">
```

肝心のappcacheの定義は以下のような感じ。

```text:manifest.appcache

CACHE MANIFEST
# Version: 1

CACHE:
./count.php
./fonts/MaterialIcons-Regular.eot
./fonts/MaterialIcons-Regular.ijmap
./fonts/MaterialIcons-Regular.svg
./fonts/MaterialIcons-Regular.ttf
./fonts/MaterialIcons-Regular.woff
./fonts/MaterialIcons-Regular.woff2
./styles/materialicons.css
./js/jquery-2.2.4.min.js
./js/riot+compiler.min.js
./js/kl.js
./js/kl.location.js
./js/kl.dom.js
./js/kl.cache.js
./js/kl.syncidb.js
.       :必要なファイルを列挙
./riot/raw.tag
./styles/main.css
./manifest.json

NETWORK:
*
```

この中でも、

```
NETWORK:
*
```
は絶対に忘れないようにしましょう。
どうすることもできなくなります。

次に、HTMLで、BODYが始まった瞬間に、以下のscriptを入れます。
このscriptタグは、このscriptタグだけで終わらせます。

```HTML:index.html
<body>
    <script>
        var cache = window.applicationCache;
        cache.addEventListener("updateready", function() {
            alert('アプリケーションの新しいバージョンが利用可能なため、更新します')
            cache.swapCache();
            location.reload();

        });
        cache.addEventListener('noupdate', function() {
            //alert('アプリケーションは最新です');
            //cache.swapCache();
            //location.reload();
        });
        if (navigator.onLine) {
            try {
                cache.update();
            } catch (e) {
                console.dir(e);
            }
        }
    </script>
```

これがないと、iOSで詰みます。
更新できなくなります。怖い。

以上で、オフラインアプリがざっくり作れました。
アイコンとか色とか設定したい場合は、manifest.jsonとか同時に使えます。
**サービスワーカーは同時に使えません。**

## IndexedDBを使う。

　まず、どうしてIndexedDBか。

- 想定しているファイル量がどう聞いても5M超えそう。
- 限界突破できるのは、IndexedDBだけ。
- IE10以降、Mobile Safari8以降縛りだけど、許してね。

　って感じで。

- どうせ、こういうDBでデータ持つんなら、配信の仕組みいるよな。(a)
- 配信の仕組みで更新しきれなかったものがもし存在すれば、サーバに送る、ってすれば、もしかしてサーバの情報を、更新しちゃえる？(b)
- サーバの情報を、別の端末で受信したときに、(b)で(a)が更新されて、あたかも同期できちゃう？
- あ、じゃあ完全にオフラインアプリになるじゃん。データも。

　みたいな発想から双方向にしました。

　これはコードが長くなったので、githubに置きました。
　https://github.com/zrelyydereva/syncedIndexedDB

　こんなやりとりしてます。

| サーバ | - | クライアント |
|:-:|:-:|:-:|
|list| ←  | sync |
|list | →ID,リビジョン一覧→  |indexedDBで比較|
||||
|put|←自分のほうが新しいもの←|--|
|put|　：　|--|
|put|←自分のほうが新しいもの←|---|
||||
|get|←自分のほうが古いもののID一覧←|比較し終えて残ったもの|
|get|→データ(配列)→|indexDBに保存|

　正直、appCacheだけでは眉唾だった、過去の**HTML5でのオフラインアプリ！**みたいなキャッチで作られたHTML5アプリを見てきたので不安はありましたが、スマホなんかがどんどん外堀を埋めてきてくれた結果、割とすごいのが作れる時代になりましたね。
LEDEでダイナミックDNS設定

[LEDE](https://www.lede-project.org/index.html)（OpenWrtのfork）をインストールしたルータでダイナミックDNSの設定をしたメモです。

# パッケージインストール

まずはダイナミックDNS関連のパッケージをインストールします。筆者はCloudFlareのAPIを使って独自ドメインのダイナミックDNSをするためCloudFlare専用のパッケージ（ddns-scripts_cloudflare）も追加でインストールしました。

```
# opkg update
# opkg install ddns-scripts luci-app-ddns ca-certificates wget
# opkg install ddns-scripts_cloudflare
```

上記パッケージをインストールするとWeb管理画面に「Services」「Dynamic DNS」というメニューが増えており、ここからダイナミックDNSの設定ができます。

# 管理画面から設定

「Services」「Dynamic DNS」「Add」で設定を追加し、適切な値を設定すればOKです。

ダイナミックDNSサービスごとに「Domain」「Username」「Password」の意味が変わる点に注意してください。CloudFlareの場合、「Domain」にDNS登録対象のホスト名を、「Password」にAPIキーを登録する必要がありました。

# ログの確認

デフォルト設定では詳細なログが記録されています。うまく動かない場合は`/var/log/ddns/`以下を確認してみてください。

# 対応しているダイナミックDNSサービス

ddns-scripts 2.7.3-2時点で、下記のダイナミックDNSサービスに対応しています。

- 3322.org
- changeip.com
- cloudflare.com
- core-networks.de
- ddns.com.br
- dnsdynamic.org
- dnsexit.com
- dnshome.de
- dnsmax.com
- dnsomatic.com
- domains.google.com
- dtdns.com
- duckdns.org
- duiadns.net
- dy.fi
- dyndns.org
- dyndnss.net
- dyns.net
- dynu.com
- easydns.com
- free.editdns.net
- freedns.afraid.org
- he.net
- loopia.se
- mydns.jp
- myonlineportal.net
- mythic-beasts.com
- namecheap.com
- nettica.com
- no-ip.com
- no-ip.pl
- noip.com
- nsupdate.info
- nubem.com
- ovh.com
- regfish.de
- schokokeks.org
- selfhost.de
- spdns.de
- strato.de
- thatip.com
- twodns.de
- variomedia.de
- zerigo.com
- zoneedit.com
- zzzz.io
- BIND nsupdate
- Custom settings(HTTP/HTTPS)

詳細は「[DDNS Client [OpenWrt Wiki]](https://wiki.openwrt.org/doc/howto/ddns.client)」をご参照ください。
CircleCIの結果をSlackに通知する

# circle.ymlの準備

circle.ymlファイルを作って、プロジェクトRoot直下に置く。

- [Javaの設定](https://circleci.com/docs/language-java/)
- [参考](https://github.com/su-kun1899/schemaspy-maven-plugin/blob/master/circle.yml)

# CircleCI側の準備

GitHubアカウントがあればSign upできる。
https://circleci.com/

## プロジェクトを追加

[Add Projects] からCIしたいリポジトリ選んでビルド！
https://circleci.com/add-projects

これで以降pushを契機にCIが走るようになる。

# Slack側の設定

## Slack側の設定

integrationにCircleCIを追加する
https://my.slack.com/apps
https://my.slack.com/apps/A0F7VRE7N-circle-ci

1. [Add Configuration]
1. 通知したいチャンネルを選んで、Webhook URLを控える
1. アイコンは任意だけど僕はテンション上がるので変える
1. [Save Integration]

## CircleCI側の設定

1. 通知したいプロジェクトを選ぶ
1. [project settings]→[Chat Notifications]
1. SlackのWebhook URLをSaveしたらそれで完了
1. 「Hello from CircleCI 」みたいな感じで、最初の通知が来ているか確認する
tmuxチート

tmuxのコマンド忘れがちなので、チートシート書いておく。

## コマンドライン

```
# 新しいsession
tmux new -s hogehoge(session名)

# セッション一覧
tmux ls

# セッションアタッチ
tmux a -t hogehoge(session名)

# セッション終わる
tmux kill-session -t hogehoge(session名)

# tmux全体を終了
tmux kill-server

```

## キー

プレフィックスは、デフォで `Controll + b`

```
# help
?

# コマンド
:

```

### ペイン

```
# 時計

t

# 番号を表示

q

# 左右分割

%

# 上下分割

"

# 破棄

x

# 移動

o

```

### ウィンドウ

```
# 新規

c

# 一覧

w

# 番号のウィンドウに移動

0-9

# 検索

f

# rename

,

# 前のウィンドウ

p

# 次のウィンドウ

n

# 破棄

&

```

### セッション

```

# rename

$

# detach

d

# 一覧

s
```

時計表示が意外と便利(スクリーンセーバー的)
今週仕事などで調べたjavascriptがらみの知識とかサイトとか４

# 今週調べてみたこと
JavaScriptとHTMLは奥が深い・・・。

# JavaScriptで関数の存在有無を見分けるには
http://shohu.hatenablog.com/entry/20080122/1200977478

# 爆速でわかるjQuery.Deferred超入門
http://techblog.yahoo.co.jp/programming/jquery-deferred/

# jQuery.Deferredを使って楽しい非同期生活を送る方法
http://qiita.com/yuku_t/items/3d1cf51d7ae91305eaaa

# Google Chromeでコンソールのログを遷移しても残す
https://spphire9.wordpress.com/2012/08/28/google-chrome%E3%81%A7%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%92%E9%81%B7%E7%A7%BB%E3%81%97%E3%81%A6%E3%82%82%E6%AE%8B%E3%81%99/

# input 要素の disabled 属性と readonly 属性の違い
http://www.koikikukan.com/archives/2009/04/26-003300.php

# Subversion 競合発生時の正しい対処
http://d.hatena.ne.jp/deeeki/20080825/svncollision

# propdef-text-overflow
https://drafts.csswg.org/css-ui-3/#propdef-text-overflow

# Can I use
http://caniuse.com/#search=text-overflow

# クラスセレクタ
http://www.webword.jp/cssguide/basic/index7.html

# JavaScriptで要素を作るときのclass指定方法
http://d.hatena.ne.jp/shimonoakio/20071024/1201690016

# MDN text-overflow
https://developer.mozilla.org/ja/docs/Web/CSS/text-overflow#Internet_Explorer_notes

# セレクトメニュー <SELECT> <OPTION> <OPTGROUP>
http://html.eweb-design.com/0905_slc.html

# 「before」と「after」で文字を挿入
http://yossense.com/css-before-after/

# 【複数行にも対応】長過ぎる文字列を省略して末尾を三点リーダー（…）にする方法いろいろ
https://tech.recruit-mp.co.jp/front-end/tips-ellipsis/

# 二行目の最後を「...」をクロスブラウザで実現
http://qiita.com/BYODKM/items/83442749a985cb81448e

# 文字列を省略して「…」を付与する方法
http://dev.classmethod.jp/ria/string-replace-css-and-jquery/

# 【CSS】複数行でも3点リーダーをきかせる
http://qiita.com/yoshida-hi/items/055c36e015f0bf8fe4f6

# Windowsでzipファイルを分割したり結合したりする
http://ser1zw.hatenablog.com/entry/2014/10/19/051134

# 今週は
今週はいろいろと調査することと、覚えることが多かったですねー。
ひさびさにCan I useを訪れました。
Windows で webpack --watch が効かない時

## 概要

macOS で元気に動いていた webpack-dev-server が Windows 10 でファイルの更新にうんともすんとも言わなくなったことの対応です

`webpack --watch` でも同様です

## 結論

パスを作るところでは path.join を使います

## 以前の設定

```js:webpack.confg.js
const path = require("path")

module.exports = {
  context: __dirname + "/src",
  entry: {
    javascript: './main.js'
  },
  output: {
    path: __dirname + "/js",
    filename: "bundle.js",
    publicPath: "js"
  },
  module: {
    preLoaders: [
      {
        test: /\.js$/,
        loader: "eslint",
        exclude: /node_modules/
      }
    ],
    loaders: [
      {
        test: /\.js$/,
        loader: "babel-loader",
        exclude: /node_modules/
      }
    ]
  }
}
```

## 現象

こういうパスが生成されていましたが

```
C:\path\to/src\main.js
```

こうあるべきです

```
D:\path\to\src\main.js
```

## 修正後の設定

```js:webpack.confg.js
const path = require("path")

module.exports = {
  context: path.join(__dirname, "src"),
  entry: {
    javascript: './main.js'
  },
  output: {
    path: path.join(__dirname, "src"),
    filename: "bundle.js",
    publicPath: "js"
  },
  module: {
    preLoaders: [
      {
        test: /\.js$/,
        loader: "eslint",
        exclude: /node_modules/
      }
    ],
    loaders: [
      {
        test: /\.js$/,
        loader: "babel-loader",
        exclude: /node_modules/
      }
    ]
  }
}
```
neocomplete + vim-markdown で 「foldmethod=expr」エラーを解消

`neocomplete`と`vim-markdown`を使っていて、`filetype=markdown`なファイルでインサートモードに入ると↓エラーが出る場合の対処

```
[neocomplete]   foldmethod=expr
```

## 対処方法

`g:vim_markdown_folding_disabled`を設定

https://github.com/Shougo/neocomplete.vim/issues/525

.vimrcに`let g:vim_markdown_folding_disabled = 1`を追記するか、dein.vim使ってるなら.tomlに↓みたいに設定

```vim
# markdown
[[plugins]]
repo = 'plasticboy/vim-markdown'
on_ft = 'markdown'
hook_add = '''
let g:vim_markdown_folding_disabled = 1
'''
```
numpyの.flatten()[0]をつかって値を取り出す

##ベクトルの内積から値を取り出すまで

ベクトルの内積もしくは1行x列とx行1列の行列の掛け算は値になるけど、配列のまま利用すると配列の形[[]]もしくは[]になっているはず。


```
import numpy as np
t1 = np.zeros(shape = (3,1))
y2 = np.arange(3).reshape(3,1)
print(t1)
print(y2)
print(t1-y2)
print((t1-y2).T)
print((t1-y2).T.dot(t1-y2))
```

実行結果
```t1
[[ 0.]
 [ 0.]
 [ 0.]]
y2
[[0]
 [1]
 [2]]
t1-y2
[[ 0.]
 [-1.]
 [-2.]]
(t1-y2).T
[[ 0. -1. -2.]]
(t1-y2).T.dot(t1-y2)
[[ 5.]]```

ここから値を取り出したいのだけど、.flatten()だけだとだめみたい
```print((t1-y2).T.dot(t1-y2).flatten())```
```[ 5.]```

なので、さらに０番目の要素ですよと指定してあげる。
```print((t1-y2).T.dot(t1-y2).flatten()[0])
->5.0```

無事解決
Bootstrapで左・中央・右寄せする方法

##text-alignを使う
テキストなどのインライン要素に対しての指定

		<p class="text-left">左寄せ</p>
        <p class="text-center">中央</p>
        <p class="text-right">右寄せ</p>
(実行結果)  
![スクリーンショット 2016-08-14 6.35.55.png](https://qiita-image-store.s3.amazonaws.com/0/128479/4af730cd-afb6-e593-3771-b905e5b38bdc.png "スクリーンショット 2016-08-14 6.35.55.png")

        
##floatを使う
ブロック要素に対しての指定

左寄せ  
		
		<div class="pull-left">左寄せ</div>
		
(実行結果)  
![スクリーンショット 2016-08-14 6.37.59.png](https://qiita-image-store.s3.amazonaws.com/0/128479/f40713d8-1f80-d473-0da8-c3314f7cf985.png "スクリーンショット 2016-08-14 6.37.59.png")


中央寄せ  
		
		<div class="center-block">中央</div>
		
(実行結果)  
![スクリーンショット 2016-08-14 6.38.55.png](https://qiita-image-store.s3.amazonaws.com/0/128479/2744df1d-d210-aa74-abb5-f935a4f1141b.png "スクリーンショット 2016-08-14 6.38.55.png")


右寄せ  
		
		<div class="pull-right">右寄せ</div>
		

(実行結果)  
![スクリーンショット 2016-08-14 6.40.19.png](https://qiita-image-store.s3.amazonaws.com/0/128479/9cebca63-e9f7-16a5-10d6-fda4c28a5c11.png "スクリーンショット 2016-08-14 6.40.19.png")

		
##オフセット・カラムを使って中央揃えを行う
グリットシステムでの指定
	
	<div class="container">
        <div class="row">
           <div class="col-md-10 col-md-offset-1">col-md-10 col-md-offset-1</div>
        </div>
        <div class="row">
            <div class="col-md-8 col-md-offset-2">col-md-8 col-md-offset-2</div>
        </div>
        <div class="row">
            <div class="col-md-6 col-md-offset-3">col-md-6 col-md-offset-3</div>
        </div>
        <div class="row">
            <div class="col-md-4 col-md-offset-4">col-md-4 col-md-offset-4</div>
        </div>
        <div class="row">
            <div class="col-md-2 col-md-offset-5">col-md-2 col-md-offset-5</div>
        </div>
    </div>
    
(実行結果)  
![スクリーンショット 2016-08-14 6.45.02.png](https://qiita-image-store.s3.amazonaws.com/0/128479/7bf26b9a-4719-ed1a-e6c9-d67b1aad3001.png "スクリーンショット 2016-08-14 6.45.02.png")


divの位置を指定しているだけなので、div内テキストの表示位置を指定したい場合は`text-align`を使用すればよい
技術英語 > Be sure the code in each case statement's default or else clause [fails hard] (abort the program) / gracefully

@ Code Complete (No. 7135 / 36077)

> Be sure the code in each case statement's default or else clause <font color=red>fails hard</font> (abort the program) 

続きの文章として

> or is otherwise impossible to overlook.

case文のdefaultやelse節は通常の状態で到達しないとする場合、その発生を明確にする方法として上記の提案がされている。

<hr>
関連して思い出したのは

gracefully

http://eow.alc.co.jp/search?q=gracefully&ref=sa
> 優雅に、潔く、奥ゆかしく

@ Code Complete (No. 7247 / 36077)

> ..., leave the code in that allows the program to crash <font color=red>gracefully</font>.
Vue.js で truncate フィルタをつくる

長い文字列を省略したいときに フィルターほしくなると思います。

Vue.js では、

> グローバルな Vue.filter() を使用してカスタマイズしたフィルタを登録することができます。

とのことです。

## JS

```js
Vue.filter('truncate', function(value, length, omission) {
  var length = length ? parseInt(length, 10) : 20;
  var ommision = omission ? omission.toString() : '...';

  if (value.length <= length) {
    return value;
  }

  return value.substring(0, length) + ommision;
});
```

## html

View 側ではこんな感じで使えると思います。

```html
<!-- 'msg' => '隣の客はよく柿食う客だ' -->
<p>{{msg | truncate 5 '。。。'}}</p>
```

## 結果

```
隣の客はよ。。。
```

## REF
[カスタムフィルタ - vue.js](https://012-jp.vuejs.org/guide/custom-filter.html)
Docker Swarmで複数Dockerホストからクラスタを作る


<h1>経緯</h1>
Dockerホストを複数起動していたので、それらを1つのリソースプールにできないかなぁ...と思って
ためしてみました。

※Docker Swarmに関しては、割愛します。

<h1>事前準備</h1>
Dockerを1.12にアップデート
`docker --version`
Docker version 1.12.0, build 8eab29e

<h1>swarm クラスタの初期化/起動</h1>
`docker swarm init --advertise-addr="192.168.99.100" --listen-addr=0.0.0.0:2377`

<h1>個別のノードの確認</h1>
`docker info`
```
Containers: 23
 Running: 5
 Paused: 0
 Stopped: 18
〜(省略)〜
Swarm: active
```

<h1>参考文献</h1>
https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/
Rails - カラム名を変更する方法

##はじめに
Railsでカラム名を変更する方法をまとめた。
※ Ruby on Rails 4.2.2

| モデル名 | 変更前のカラム名 | 変更後のカラム名 | 
|:-------:|:-------------: |:--------------:|
| book    | titre          |title           |


# 1. migrationファイルを作成する。

カラム名を変更するためのmigrationファイルを作成する。

```bash
$ rails generate migration rename_titre_column_to_books
```

上記のコードを実行すると、
`db/migrate/20160814055550_rename_titre_column_to_books.rb`
といったファイルが生成される。

#2. 生成されたファイルを編集する

生成されたファイルにchangeメソッドを追加し、
その中に変更したいカラム名を記述する。

※ `rename_column テーブル名, 変更前のカラム名, 変更後のカラム名`

```db/migrate/20160814055550_rename_titre_column_to_books.rb
class RenamePiblishedColumnToBooks < ActiveRecord::Migration
  def change
    rename_column :books, :titre, :title
  end
end
```

#3. データベースに反映させる。
下記のコードを実行すると変更が反映される。

```bash
$ rake db:migrate
```

##おわりに
Railsでカラム名を変更する方法を簡単にまとめてみた。
誤りを見つけた場合はコメントで指摘していただけるとありがたい。
OpenGL について

OpenGL周りについての知識をまとめる。
間違っているところもあると思うが、とりあえず現状の認識を
指摘や新たに分かった事があれば随時反映。

### 1. OpenGL とは
* Open Graphics Library
* グラフィックライブラリで、ハードウェアに近いレベルの機能を提供する
* マルチプラットフォーム対応で様々なOS上で動く
* 3Dのプログラムを書こうと思った時に、まずこれか DirectX が候補にあがるぐいらい代表的なもの

>
**[補足] API, ライブラリ, フレームワークについて**
それぞれ自身のコードにリンクできる便利な外部機能群の事だが、それぞれ微妙に意味が異なるらしい。

> * API ... Application Programming Interface。便利機能を呼び出す際のプログラム的な仕様。  
文章でもいいし、実際のプログラムでもいいみたい
* ライブラリ ... 実装されたAPI
* フレームワーク ... ライブラリの中でもプログラムの土台部分を提供するもの


### 2. OpenGL を使うには

OpenGL自体はハードウェアに近いレベルの機能を提供するライブラリであるそうで、OS上にウィンドウを出すなどの機能は提供されていない。なので、実際にアプリを作る際は、下記の拡張ライブラリから使うのが一般的らしい。(それぞれマルチプラットフォーム対応で、言語はC/C++)

* GLUT
  * OpenGL Utility Toolkit
  * OpenGLを使うのに便利なツールキット(GUI機能)を提供する
  * だいぶ前から更新停止

* [FreeGLUT](http://freeglut.sourceforge.net/)
  * gultを強化したもの
  * 最終releaseは、2015/03
  * ツールキット部分は、コールバック関数を多用するのが特徴

* [GLFW](http://www.glfw.org/) (zlib/libpng)
  * freeglutに変わる新しいOpenGLフレームワーク
  * ツールキット部分は、普通の上から下に流れるプログラムで書ける

他にも OpenGL を使う上で便利なライブラリがある。

* [GLEW](http://glew.sourceforge.net/) (修正BSD, MIT)
  * OpenGL3.xや4.xの機能を使いやすく提供してくれるライブラリ
  * OpenGLを使う時には必須レベルのものらしい

### 3. 参考URL
* [OpenGL - wiki](https://ja.wikipedia.org/wiki/OpenGL)
* [OpenGL勉強会用の資料ページ](http://www.oit.ac.jp/is/~whashimo/server/~whashimo/Article/OpenGL/Chapter1/)
* [(1) GLFW で OpenGL を使う(床井研究室)](http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20120906)
Chrome のアドレスバーからの Google 検索が妙に遅い場合の対処法

# 概要

- 「どうもChromeのアドレスバーからのGoogle検索だけが遅い。」
- 「同じマシンのFirefox、IEなど他のウェブブラウザーではGoogleしても遅くない。」
- 「ChromeでもGoogleのウェブサイトから検索すると遅くない。」

そんな症状でChromeのデフォルト検索エンジンを本当は第1候補として使いたいわけではない他の検索エンジンに設定したり、諦めてしまっていたりする方へ。

もしかしたら簡単に"直る"かもしれない方法を紹介。

# 治療する方法

Chromeの設定の「検索エンジンの管理」の「その他の検索エンジン」の一番下から検索エンジンを追加する。

![](http://i.imgur.com/hHdeSjD.png)

- 「検索エンジンを追加」 -> `Google(Simple)` ... ここは好きにして構わない
- 「キーワード」 -> `google-simple` ... ここも好きにして構わない
- 「URL (%s=検索語句)」 -> `http://www.google.co.jp/search?q=%s` ここ重要

追加した検索エンジンにオンカーソルするとURLのあたりに「デフォルトに設定」ボタンが出るので「デフォルトに設定」する。

![](http://i.imgur.com/St5sEbd.png)

# だそく

`chrome://flags/` の設定を弄ってもどうもいつのころからか遅くなったままどうしようもなくなっていた方はこんな単純な方法で直るかもしれません。

Chromeにデフォルトで入っているGoogleの設定は次の通り:

`{google:baseURL}search?q=%s&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:instantExtendedEnabledParameter}{google:contextualSearchVersion}ie={inputEncoding}`

これで検索すると"素早さが足りない！"となる場合があるようです。そこで、Googleのウェブサイトから検索したら問題ないのに、という方は今回紹介した方法で直る可能性が高めと思われます。
IntelliJ IDEAのヒープサイズを増やす

IntellJ IDEAは、インストール直後だとMaxヒープサイズが700MBに設定されています。ちょっと少ないですよねw
メモリが潤沢な方は是非メモリサイズを増やしてください。

# 本投稿の前提バージョン

```
IntelliJ IDEA 2016.2.1
Build #IU-162.1447.26, built on August 2, 2016
JRE: 1.8.0_76-release-b216 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
```

# VMオプションのカスタマイズ

IDEのUI上からVMオプションをカスタマイズするためのファイルを作成することができます。

Help > Edit Custom VM Options... を選択する。

![スクリーンショット 2016-08-14 2.08.41.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d02470f1-32d9-baa7-0d30-aa0267b1a928.png)

# Mac

Macの場合は、「`~/Library/Preferences/IntelliJIdea2016.2/idea.vmoptions`」を作成するか尋ねられるので、「Yes」を指定し、最小・最大サイズをカスタマイズします。

```text
-Xms2048m
-Xmx2048m
```

とりあえず、2GBにしました :v: 
ファイルを保存した後に再起動すれば反映されます。

> Note: 手動で編集してもOK！！
>
> ```text
> $ vi ~/Library/Preferences/IntelliJIdea2016.2/idea.vmoptions
> ```


# Windows

そのうち追加しますが、Windowsの場合は「`<SYSTEM DRIVE>\Users\<USER ACCOUNT NAME>\.<PRODUCT><VERSION>\idea.vmoptions`」に同様の設定を行えばよいみたいです。（ためしてませんが、Macと同様にUI上からファイル作成できると思われます）

# メモリインジケータの表示

デフォルトで表示されていたか定かじゃないので、メモリのインジケータの表示方法も紹介しておきましょう。

IntelliJ IDEA > Preferences... を選択する。

![スクリーンショット 2016-08-14 2.14.34.png](https://qiita-image-store.s3.amazonaws.com/0/117313/822a700e-ba30-3ad1-7f66-f171050b1260.png)

Appearance & Behavior > Appearance > Windows Options の「Show memory indicator」をチェックする。

![IDEA-memory-indicator-settings.png](https://qiita-image-store.s3.amazonaws.com/0/117313/0d65abf4-81e1-f7f1-5deb-5499a6c879a2.png)

右下にメモリインジケータが表示されます :smile:
インジケータをクリックするとGCを走らせることができるみたいで、使用メモリが下がります :blush: 

![IDEA-memory-indicator.png](https://qiita-image-store.s3.amazonaws.com/0/117313/033c6b1e-b8b6-fc39-a5f2-967b469b7fd4.png)

# まとめ

せっかくメモリ沢山積んでるのに有効に使っていない方いるのでは？ IDEにガンガンメモリを割り当てて、快適な開発環境を構築しましょう！！
そんな私も今の職場は、まさかの32Bit OS... いつもマシンが唸っています :sob: :sob: 
職場ではガンガン開発するわけではないので、なんとかやっていっていますが・・・
32Bit OSは確実に生産性が下がるし、精神安定的にもよくない・・・。（今の職場はケチっているわけではないですが、マネージャにはPCケチるのは結果的にコストがかかるということを理解してほしい・・・）
自宅のMacは無駄に16GB積んでいるので快適です :v: 

# 参考サイト

* https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties
* https://intellij-support.jetbrains.com/hc/en-us/articles/206544519
* http://stackoverflow.com/questions/13578062/how-to-increase-ide-memory-limit-in-intellij-idea-on-mac/13581526#13581526
Haxe のドキュメント生成ツール dox を HaxeFlixel のプロジェクトで使う


「Haxeに対応したドキュメント吐き出しツールはないものか…」と適当に探し回ってたら公式でこんなのがありました

https://github.com/HaxeFoundation/dox

Haxeの公式ドキュメント
http://api.haxe.org/
とかHaxeFlixelの公式ドキュメント
http://api.haxeflixel.com/
と同じような体裁のドキュメントを吐き出すためのツールで、
いわゆるDoxygenみたいな、ソースコードドキュメンテーションシステムの一種だそうです

今回はコレを使って、HaxeFlixelのプロジェクトからAPIドキュメントを吐き出す手法をメモります

## 環境

* Windows
* HaxeFlixel 4.1.1
* dox 1.1.0

## インストール

コマンドプロンプトから

`haxelib install dox`

## HaxeFlixel プロジェクト側でやること

普通のhxmlプロジェクトと同様、ドキュメントhtml生成用のxml生成から最終的にdoxに流す流れ自体は同じです
ただし、HaxeFlixelプロジェクトの場合hxmlがない(?)のでxml生成指示をProject.xmlに書き込むのが違うところ

Project.xmlに以下のパラメータを挿入します

`<haxeflag name="-xml" value="bin/doc.xml" />`

※
valueに書くpathについては自由に決めてよいです
ちなみに、フォルダが存在しなかった場合は勝手に作られます

## dox の実行

上述のパラメータを挿入した状態でビルドを行うとプロジェクトフォルダ下の`bin`フォルダに`doc.xml`が作成されるので、
コンソールでプロジェクトフォルダまで移動して以下のコマンドを実行します

`haxelib run dox -i bin -o bin/pages`

`-i` の後ろには生成したxmlファイルのおかれているフォルダを、
`-o` の後ろにはこれから生成するhtmlドキュメント群を置くフォルダを指定します(これもフォルダがなかったら勝手に作られます)

処理中メッセージが出るのでしばらーく待つと Done. と出てきます。生成完了です
`bin/pages` に行くとなんかわんさかhtmlやらなんやらが吐き出されてます

index.htmlを開いてHaxeFlixelのAPIドキュメントページなんかでよく見る体裁のページが出てきたら成功です
後は開発を進めて増えていくドキュメントに思いを馳せましょう

## おまけ: 書式

説明を入れたいクラスやらなんやらの上に

```
/**
    
**/
```

とか

```
/**
 *
 *
 */
```

で囲んだ文章を入れると説明文としてドキュメントに挿入されます
書式としてはgithub-flavored markdownが使える（？）ようです
（ただ、基本的な構文は概ね動くようですが、箇条書きがあまりうまく動いてないような気もします）

```
@param Object1 hogehoge
@return hogehoge
```

javadoc風のパラメータ説明書式にも限定的に対応しているようです

## おまけ: フィルタリング

ドキュメント生成時、`-in`または`-ex`のパラメータにパッケージ名をつけて流すことで生成ドキュメントに含める含めないを選択することができます
`-in game -in flixel`とかやるとgame以下のパッケージとflixel以下のパッケージのみがドキュメント化され、
`-out cpp`とかやるとcpp以下のパッケージのみが除外されたドキュメントが出来上がります
自分が書いたやつはドキュメント化したいけどライブラリまでドキュメント化されるのはちょっと…という人も安心（？）
ちなみに、依存先のライブラリがドキュメント化されてなくても、
該当クラスの名前から直接詳細に飛べない程度で、ドキュメントとしての体裁が崩れることはありません　たぶん

オプションはここにいろいろあるようです
https://github.com/HaxeFoundation/dox/wiki/Commandline-arguments-overview

もっと色々機能はあるようですがまだあまり眺めきれてないのでひとまずこのへんで

## 感想

最初のパラメータ指定でちょっとハマりましたが、そのあとはサクサク進めて非常に楽にドキュメントが生成できました
Jenkinsなんかと組み合わせて、アプリのビルドと一緒にドキュメント更新とかやれると色々と捗るのではないかと思ったり思わなかったり
AWS CLIでインスタンスとEIP関連操作メモ

VPC型じゃないほうのインスタンスを対象にした記事が多かったので自分用にメモ

#### instance_nameを含むインスタンスを検索
` aws ec2 describe-instances --filter "Name=tag:Name,Values=*{instance_name}*"`

#### 新規Elastic IP発行
`aws ec2 allocate-address --domain vpc`

#### Elasitc IPをインスタンスに関連付け
`aws ec2 associate-address --allocation-id {allocation-id} --instance  {instance-id}`

#### Elasitc IPの関連付けを外す
`aws ec2 disassociate-address --association-id  {association-id}`


#### Elasitc　IPを開放(消す)
`aws ec2 release-address --allocation-id {allocation-id}`

###おまけ：ドキュメントに書いてあるけど動かない
`aws ec2 describe-instances --filter "Name=association.allocation-id,Values={allocation-id}"`

`aws ec2 describe-instances --filter "Name=association.association-id,Values={association-id}"`

`aws ec2-describee addresses --public-ips {public_id}`
scikit-learnで2016年夏の2回戦を予測

# はじめに

`scikit-learn` を触ってみる夏休みの自由研究第二弾です。第一弾は[こちら](http://qiita.com/radiocat/items/6fa86ae9ab435aabc48f) 。相変わらず初心者的な内容ですがご容赦ください。

今回は地方大会の成績を元に1回戦の対戦結果を学習して2回戦の得点力を予測することを考えてみました。念願の機械学習です（やってみたかっただけ感満載でスミマセン）。

# 学習データ

前回使用した [地方大会の打撃成績](https://github.com/radiocat/study-sklearn/blob/master/hs-bb/batting-2016.csv) を元に、代表校ごとの初戦の組み合わせから [相手高校の投手成績](https://github.com/radiocat/study-sklearn/blob/master/hs-bb/pitching-2016.csv) を学習データに組み合わせて、初戦の得点数を学習させてみることにしました。

作成した学習データが [こちら](https://github.com/radiocat/study-sklearn/blob/master/hs-bb/round1-result-2016.csv) 。49校なので盛岡大付が初戦の相手校として2回出てくることになりますね。

# 学習と予測

上記の通り、地方大会のデータを元に打撃成績と相手の投手成績を全て説明変数として学習させます。目的変数は甲子園初戦の得点数です。

学習アルゴリズムは `線形回帰` にしました。例のごとくあえて他を選ぶ知識がないので…

そして学習結果を検証するための予測データとして2回戦の組み合わせを調べて学習データと同様に [こちら](https://github.com/radiocat/study-sklearn/blob/master/hs-bb/round2-game-2016.csv) にまとめました 。


```py
#coding:utf-8
import pandas as pd
import numpy as np
from sklearn import linear_model

# 初戦の結果を学習
df = pd.read_csv('round1-result-2016.csv')
X = df.drop(['県','県No','学校名','対戦校','得点'], axis=1)
Y = df['得点'].as_matrix()

clf = linear_model.LinearRegression()
clf.fit(X, Y)

# 2回戦の予測
df_round2 = pd.read_csv('round2-game-2016.csv')
X_round2 = df_round2.drop(['県','県No','学校名','対戦校'], axis=1)
round2_pred=clf.predict(X_round2)

print(round2_pred)
```

# 結果

| 県 | 学校名 | 対戦校 | 得点 |
|:-:|:-:|:-:|:-:|
| 岩手 | 盛岡大付 | 創志学園 | 2.37607605 |
| 奈良 | 智弁学園 | 鳴門 | 3.62097786 |
| 徳島 | 鳴門 | 智弁学園 | 5.76513128 |
| 山梨 | 山梨学院 | いなべ総合 | 3.88857396 |
| 三重 | いなべ総合 | 山梨学院 | 5.36922697 |
| 茨城 | 常総学院 | 中京 | 5.14173416 |
| 岐阜 | 中京 | 常総学院 | 7.22823584 |
| 愛知 | 東邦 | 八戸学院光星 | 8.83172441 |
| 青森 | 八戸学院光星 | 東邦 | 1.28556647 |
| 神奈川 | 横浜 | 履正社 | 7.68159192 |
| 大阪 | 履正社 | 横浜 | 4.58766162 |
| 和歌山 | 市和歌山 | 日南学園 | 2.27939976 |
| 宮崎 | 日南学園 | 市和歌山 | 4.78286132 |
| 鹿児島 | 樟南 | 花咲徳栄 | -1.30671611 |
| 埼玉 | 花咲徳栄 | 樟南 | 1.90896096 |
| 広島 | 広島新庄 | 富山第一 | 1.28968031 |
| 富山 | 富山第一 | 広島新庄 | 2.03399291 |


これを書いた8/13時点で盛岡大府は予測と違いますが智弁と鳴門の結果がわりと当たってて若干驚きました。なんか１つマイナスの結果がでてますが…相手校の地方大会の失点と防御率が0だからだと思います。

あくまでデータサイエンス的な数値遊びですのであしからず。実際の対戦や選手に対して何かを訴えたり批判する意図は一切ありませんので誤解なきようお願いします。
Struts2やSpringに存在するAwareインタフェースとは何か

# インタフェースには違いないAwareインタフェース

Struts2やSpring frameworkの中にはAwareの接尾辞をつけているインタフェースがあります。
役目としてはインタフェースと何ら変わらないのですが、特定のクラスに対して役割を付与する意味で使われます。

例えばStruts2では、Actionクラスに機能拡張させる意味でセッション属性を扱えるSessionAwareや、クッキー情報を扱えるCookieAwareなどです。

インタフェースなので、実装宣言したインタフェースの内容を実装するのも変わりませんが、利用するメソッドと関連するフィールドはほぼ変えることなく利用できるものがほとんどです。

例えば SessionAwareはセッション情報を管理するインタフェースなので、以下の実装が必須です。

```java
public Map<String,Object> getSession() {
  return session;
}

Map<String,Object> session;
```

## Java8でインタフェースにdefault動作が追加されたことによる恩恵

defaultメソッドを提供することで、実装クラスにインタフェースの実装をすることなく、宣言だけで解決できます。
ただしインタフェースのフィールドは、public、static、finalの3つのみ許可されるため、アクセスレベルの制限から、これらのインタフェースのdefaultを定義する場合には、状態を持たないチェック機構として実装するのが良さそうです。

例えば

+ 管理者としてログインしているかを判定する
+ 登録しているデータが本人のものかを判定する
+ 入力されたモデルに正しく値が入力されているか判定する

などなど、入力チェックごとにインタフェースを作成し、必要に応じて実装するか、これらの入力チェックを束ねたスーパーインタフェースを作って、実装クラスではその中から利用するメソッドのみ実行する、といったことも可能でしょう。
vSphereで仮想マシンをPowerShellスクリプトからシャットダウンする

PowerShellスクリプトを使い、vCenter配下の仮想マシンをスクリプトからシャットダウンします。
メンテナンス作業などで一斉に仮想マシンをシャットダウンする用途を想定していますので、シャットダウン対象外としたい仮想マシンを指定できるようにしてます。
また、最初からパワーオフ状態だった仮想マシンはテキストファイルに書き出すようにしています。

```ps1

param (
  # vCenter Server IPアドレス
  $VCenter = "myserver",
  # vCenter Server ログインユーザ
  $User = "domain\username",
  # vCenter Server ログインパスワード
  $Pass = "password"
);

# シャットダウン対象外とするVM
$exclusionVMs = @("myvm1","myvm2")

# シャットダウン間隔を秒単位で指定
$sleepTime = 4

# パワーオフ状態のVMを記録するファイル
$PoweroffVMslist = "c:\poweroffvms.txt"

# 初期化処理
#-------------------------------------------------------------------------
function Do-Initialize()
#-------------------------------------------------------------------------
{
  if ( (Get-PSSnapin | Where-Object { $_.Name -eq "VMware.VimAutomation.Core"}) -eq $null )
  {
    Add-PSSnapin VMware.VimAutomation.Core
  }
}

#-------------------------------------------------------------------------
# Main Application Logic
#-------------------------------------------------------------------------
Do-Initialize

# vCenterへ接続
$Server = Connect-VIServer -Server $VCenter -User $User -Password $Pass

foreach ($getVM in Get-VM){

  if($getVM.PowerState -eq "PoweredOff"){
    $isPoweredOff = $true
    $getVM.Name | Out-File $PoweroffVMslist -Append
  }
  else {
    $isPoweredOff = $false
  }

  # 除外対象のVMかどうかを判定してフラグをセットする
  $isExclusionVm = $false
  foreach ($ex in $exclusionVMs){
    if($ex -eq $getVM.Name){
      $isExclusionVm = $true
      break
    }
  }

  # シャットダウン対象外のVMと最初からパワーオフ状態だったVMを除き、シャットダウンする
  if((-not $isExclusionVm) -and (-not $isPoweredOff)){
    Write-Host $getVM.Name
    Shutdown-VMGuest -VM $getVM -Confirm:$false
    Start-Sleep -s $sleepTime
  }
}

# vCenterから切断
Disconnect-VIServer -Server $Server -Confirm:$false
```
anyenvの*envたちを一括でアップデートする


rbenvで新しいバージョンをダウンロードできない・・・！そう困っていたらanyenv-updateというanyenvのプラグインがありました。これを使うとanyenvが管理している*envたちが一括でアップデートできる。

## 使い方
[Github](https://github.com/znz/anyenv-update)にもありますが、インストールは下記の通り。

```bash
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

アップデートしてみる

```bash
$ anyenv update
```

インストールできるバージョンが増えてるか確認してみる。

```bash
$ rbenv install -l
```

## 参考
[anyenv-update](https://github.com/znz/anyenv-update)
衝突しないユニークなファイル名を取得する方法

Tempfile みたいにFileを取得したい場合ではなく、ファイル名を取得したい場合の方法。

```rb
base_name = "image"  # 必要に応じてディレクトリパスも含める
ext_name = "jpg"
Dir::Tmpname.make_tmpname(base_name, ext_name) =>  "image20160902-29100-1xxd3n7-jpg"
```