OmniAICreator/Qiita-1.07M huggingface dataset:
細かすぎて伝わらないDatadog API

まず[リファレンス](http://docs.datadoghq.com/ja/api/)にしたがって、以下のようなスクリプトを回してみます。

```bash
#!/bin/bash
API_KEY=...
TIMESTAMP=$(date +%s)
 
curl  -X POST -H "Content-type: application/json" \
-d '{ "series" :
         [{"metric":"test.metric",
          "points":[['$TIMESTAMP', 20]],
          "type":"gauge",
          "host":"test.example.com",
          "tags":["environment:test"]}
        ]
    }' \
"https://app.datadoghq.com/api/v1/series?api_key=$API_KEY"
```

![スクリーンショット 2015-03-14 21.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/20100/33e1754e-9dae-46a4-f69f-80d10f8e7b5f.png)

```json
{
  "viz": "timeseries",
  "requests": [
    {
      "q": "avg:test.metric{*}"
    }
  ],
  "events": []
}
```

おｋ。

# 同じタイムスタンプのデータを送る
続いてタイムスタンプが同じデータを送ってみます。

```bash
#!/bin/bash
API_KEY=...
TIMESTAMP=$(date +%s)
 
curl  -X POST -H "Content-type: application/json" \
-d '{ "series" :
         [{"metric":"test.metric",
          "points":[
            ['$TIMESTAMP', 20],
            ['$TIMESTAMP', 21],
            ['$TIMESTAMP', 22]
          ],
          "type":"gauge",
          "host":"test.example.com",
          "tags":["environment:test"]}
        ]
    }' \
"https://app.datadoghq.com/api/v1/series?api_key=$API_KEY"
```

![スクリーンショット 2015-03-14 21.14.59.png](https://qiita-image-store.s3.amazonaws.com/0/20100/a055f40b-1ecf-dcd4-2ecc-c8b6953b1907.png)

```json
{
  "viz": "timeseries",
  "requests": [
    {
      "q": "sum:test.metric{*}"
    }
  ],
  "events": []
}
```

`sum:`ですがなんかガタガタしてますね…。
同じタイムスタンプのデータを送った場合、いずれかが選択されるよう。

# タグを変えてみる
同じタイムスタンプのデータを異なるタグで送ってみます。

```bash
#!/bin/bash
API_KEY=...
TIMESTAMP=$(date +%s)
 
for i in {1..3}; do
  curl  -X POST -H "Content-type: application/json" \
  -d '{ "series" :
           [{"metric":"test.metric",
            "points":[
              ['$TIMESTAMP', 2'$i']
            ],
            "type":"gauge",
            "host":"test.example.com",
            "tags":["environment:test'$i'"]}
          ]
      }' \
  "https://app.datadoghq.com/api/v1/series?api_key=$API_KEY"
done
```

![スクリーンショット 2015-03-14 21.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/20100/ad5fd391-85a0-74cc-e55e-a12215945f56.png)

今度はちゃんと合計されました…って`88`？

詳細が分からないので、ダグごとに色分け。

![スクリーンショット 2015-03-14 21.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/20100/455a9a4a-3084-4712-6702-a802496a45b4.png)

```json
{
  "viz": "timeseries",
  "requests": [
    {
      "q": "sum:test.metric{*} by {environment}"
    }
  ],
  "events": []
}
```

送ってないはずの`environment:test`が…

…しばらく待ったら、直りました。

![スクリーンショット 2015-03-14 21.25.17.png](https://qiita-image-store.s3.amazonaws.com/0/20100/6ab4115a-4c02-41c8-dc1c-bad36d7edaa4.png)
Mysqlで1／0はNULLになる

mysqlでデータを管理していてよくある集計のひとつして、
様々な条件を満たすレコード数を取得するというものがある。

* 会員の年代傾向を取得したい
* 有効な会員数を取得したい
* 1000円以上の商品数を取得したい

このうちの年齢傾向を取得するケースを見ていきたいと思います。

### オーソドックスなやりかた
一番簡単なやり方としては、以下のようなSQLを6回発行するパターン。
正直苦痛でしかないですね。。

```
select count(1) as '10歳未満' from user where age < 10;
select count(1) as '10代' from user where age >= 10 and age < 20;
select count(1) as '20代' from user where age >= 20 and age < 30
select count(1) as '30代' from user where age >= 30 and age < 40;
select count(1) as '40代' from user where age >= 40 and age < 50;
select count(1) as '500歳以上' from user where age >= 50;
```

## 本題

記事タイトルにも書いたように以下のポイントに注目するともう少し上手いとり方が出来ます。

* 0による除算はNULLになる
* count関数は非NULL値の数を返す

### テストデータ

```filename:会員(user)テーブル
+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| user_name | char(30)   | NO   | PRI |         |       |
| age       | int(11)    | YES  |     | NULL    |       |
| enabled   | tinyint(1) | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+
```

```filename:テストデータ
mysql> select * from user;
+-----------+------+---------+
| user_name | age  | enabled |
+-----------+------+---------+
| hashimoto |   23 |       1 |
| inoue     |   47 |       1 |
| ito       |   14 |       1 |
| jonson    |   56 |       1 |
| matsumoto |   10 |       1 |
| nagashima |   21 |       0 |
| saito     |   34 |       0 |
| sakurai   |   36 |       1 |
| sasaki    |   17 |       0 |
| suzuki    |   20 |       1 |
| takayama  |   21 |       1 |
| watanabe  |   31 |       1 |
| yamazaki  |    8 |       0 |
+-----------+------+---------+
13 rows in set (0.00 sec)
```
----

このデータを使って、年齢傾向を一括で取得できる書き方が以下のクエリ。

```sql:クエリ
select 
  count(1) as '会員数',
  count(1/(age < 10)) as '10歳未満',
  count(1/(age >= 10 and age < 20)) as '10代',
  count(1/(age >= 20 and age < 30)) as '20代',
  count(1/(age >= 30 and age < 40)) as '30代',
  count(1/(age >= 40 and age < 50)) as '40代',
  count(1/(age >= 50)) as '50歳以上'
from
  user;

```

```filename:結果
+--------+----------+------+------+------+------+----------+
| 会員数  | 10歳未満 | 10代 | 20代 | 30代  | 40代 | 50歳以上 |
+--------+----------+------+------+------+------+----------+
|     13 |        1 |    3 |    4 |    3 |    1 |        1 |
+--------+----------+------+------+------+------+----------+
```

*簡単！*

### 補足

ちなみにSum関数を使っても同様のことは出来るのでどっちの書き方をするかは好みの問題かなと思います。

```sql:sumを使うパターン
select 
  count(1) as '会員数',
  sum(case when age < 10 then 1 else 0 end) as '10歳未満',
  sum(case when age >= 10 and age < 20 then 1 else 0 end) as '10代',
  sum(case when age >= 20 and age < 30 then 1 else 0 end) as '20代',
  sum(case when age >= 30 and age < 40 then 1 else 0 end) as '30代',
  sum(case when age >= 40 and age < 50 then 1 else 0 end) as '40代',
  sum(case when age >= 50 then 1 else 0 end) as '50歳以上'm
from
  user;
```
Swiftの総称型がサポートしていないこと

Swiftの総称型がサポートしていないことを調べた。Swiftの総称（ジェネリクス）はとにかく制限が沢山あって現状だと使いづらいので、あまり考え過ぎないほうがよさそうだという気がしている。

## 総称型の型引数を使った型プロパティ定義

未サポート。"not yet supported" なのでいずれサポートされる可能性はありそう。とはいえ用途があるかどうかは難しい。

```swift
// Swift
class G<T> {
  // class stored properties not yet supported in generic types
  class var value: T? = nil
}
```

なおC++, C#ではできる。Javaではできない。

```csharp
// C#
class G<T> {
	public static T value;
}

class S: G<string> {
}
class I: G<int> {
}

// use
S.value = "foo";
I.value = 42;
```


## 総称クラスを継承して非総称クラスを定義する

未サポート。これは普通に使うのでないとつらい。

```swift
// Swift
class G<T> {

}

// ERROR: classes derived from generic classes must be generic
class N: G<Int> {

}
```

実際、Java, C#, C++いずれもサポートしている。

```csharp
// C#
// 定義する
class G<T> {
	public T value;
}
class S: G<string> {
}
class I: G<int> {
}

// 使う
var s = new S();
s.value = "foo";
var i = new I();
i.value = 42;
```

## 総称プロトコル型の変数を宣言する

なぜできないのか理解に苦しむ。だれか説明してくれ…。

```swift
// Swift
// in Swift.swift
protocol GeneratorType {
    typealias Element
    mutating func next() -> Element?
}

// Generator with Int を表現する方法がない
var g: GeneratorType; // ERROR: Protocol 'GeneratorType' can only be used as a generic constraint
```

以下のようにラッパークラスを使ってなんとか `Set<Int>().generate()` と `Array<Int>().generate()` 両方を入れられる型を宣言できないかと思ったが、結局具象型が必要でラッパークラスを使わないケースと何ら変わりがない。

```swift
// Swift
// 失敗した例
struct GeneratorHolder<G: GeneratorType> {
    var generator: G

    init(_ generator: G) {
        self.generator = generator
    }
}

var a = [10, 20]

// GeneratorTypeをラップした型の変数を宣言できているように見えるが誤り
var g = GeneratorHolder(a.generate())
g.generator.next() // 10
g.generator.next() // 20
g.generator.next() // nil


// 以下はコンパイルエラー
// なぜなら、gの型はGeneratorHolder<IndexingGenerator<[Int]>>で
// 結局のところa.generate()の具体的な型で特殊化されてしまっているから
var s = Set(arrayLiteral: 10, 20)
g = GeneratorHolder(s.generate())
```

## 総称の明示的な特殊化

C++だとこれを使ったテンプレートメタプログラミングが大変発達していてる。Swiftではできないが、Javaでもできないので大きな問題は感じない。

```swift
// Swift
struct S<T> {}

struct S<Int> {} // ERROR
```

そもそもこれのできるC++は型引数にclassないしtypenameをつけるので構文上の区別ができるが、Swiftでは構文上の区別が付けられないのでいずれできるようになる可能性もなさそうだ。

```
// C++

template <typename T> struct S {};

template <> struct S<int> {}; // explicit specialization
```
コマンド履歴 - fc


### エディタの指定
```shell-session:@CentOS
$ export FCEDIT=gedit
```
普通に、`$EDITOR` の値でいいって人は設定する必要無し。（`$EDITOR` すら設定してない場合は、`vi`）
mac だったら、`mate -w` とか、`/App略/mi.app/略/MacOS/mi` とか、`/App略/CotEditor.app/略/MacOS/CotEditor` とか


### コマンドの編集
```shell-session:
$ fc 42
```
42 の所は履歴番号。
エディタが立ち上がるので、編集して保存したらコマンドが実行される。

履歴番号じゃなくても文字列で、直近の `perl` ワンライナーなんかを指定出来る。


エディタを指定したい場合は、`-e` オプション。
* 同僚のアカウントでは、GUI のエディタ設定しといてあげて、依頼されたら `vi` でも指定して使うべ、、、って事で。

### `r`
`bash` だと、

```shell-session:
alias r='fc -s'
```

するのは、 `man bash` に載る程度には常識。

`zsh` だと、`r` がそのまんま実装されてる、、、って言っても

>r      Same as fc -e -.

だけれども。`-e -` の意味は、

>If ename is `-', no editor is invoked.  When editing is complete, the edited command is executed.


#### 使い方
双方とも、

```shell-session:
$ r
```

で直前のコマンド実行して、

```shell-session:
$ r mv
```

で直近の `mv` を再実行すると。

`zsh` だと、

```shell-ssession:
% man zshbuiltins
% r builtins=
```

な使い方も一応出来るけど。
ディレクトリローカルなコマンドの作成とデプロイ

## 前提
* 環境はMac OS X Yosemite
* 特定ディレクトリでだけ有効なコマンドを作成する
* 環境変数`PATH`に相対パスを加えることで実現できる
    * 以下の例の場合、カレントディレクトリ内のbinディレクトリにあるスクリプトにパスが通る

```~/.bashrc
PATH="$PATH:~/bin:./bin"
```

## 動機
* コマンドスクリプトの存在するディレクトリがバラバラなので、どこにローカルコマンドがあるのかわからない
* 一ヶ所でまとめて管理したい
* それを自動化したい

## 構想
* ホームディレクトリ以下にしか作らないものとする
* スクリプトファイルの本体は ~/bin/local 以下に保存する
* 実際にコマンドを利用するディレクトリ内の bin ディレクトリにシンボリックリンクを貼る

## 管理用スクリプト

### コマンド作成(~/bin/msh)
別途テンプレートファイルを作成する。
これは、`@(#)`による`what`コマンド用説明文がテンプレートに含まれており、テンプレートをスクリプト内に記述すると、`what ~/bin/msh`したときに表示されてしまうため。

```~/bin/msh
#!/bin/bash
# @(#) Make executable shell script file.
# @(#) Usage: $0 [-lh]
readonly SCRIPTNAME="$(basename "$0")"
DIRPATH=~/bin
LINKPATH=""
Usage () {
  what "$0" | sed "s/\$0/$SCRIPTNAME/" 1>&2
}
while getopts lh OPT
do
  case $OPT in
    l) # @(#)-l: Make local cmd. (only under home dir.)
      if ! pwd | grep -q "$HOME"; then
        echo "$SCRIPTNAME: Not under home dir." 1>&2
        exit 1
      fi
      LINKPATH="$(pwd)/bin"
      mkdir ./bin >& /dev/null
      DIRPATH=~/bin/local/"$(sed "s@^$HOME/@@" <<< "$LINKPATH")"
      ;;

    h) # @(#)-h:Print help.
      Usage
      exit 0
      ;;
    ?)
      echo "$SCRIPTNAME: ERROR - Undifined option." 1>&2
      Usage
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))
if [ -n "$1" ];then
  NAME="$1"
else
  echo "Input script NAME/path" 1>&2
  read NAME
  if [ -z "$NAME" ]; then
    echo "No NAME" 1>&2
    exit 1
  fi
fi
FILEPATH="$DIRPATH/$NAME"
if [ -f "$FILEPATH" ];then
  echo "$SCRIPTNAME: ERROR - $FILEPATH is already existing." 1>&2
  exit 1
fi
mkdir -p "$(dirname "$FILEPATH")" >& /dev/null
cp ~/bin/template/sample.sh "$FILEPATH" && chmod +x "$FILEPATH"
if [ -n "$LINKPATH" ];then # = local cmd
  ln -s "$FILEPATH" "$LINKPATH"
  echo 'cd "$(dirname "$(dirname "$0")")"' >> "$FILEPATH" # 別のディレクトリからフルパス指定で実行する場合に対応
fi
mvim +2 +"normal $" "$FILEPATH"
```

テンプレートファイルは以下の通り。

```~/bin/template/sample.sh
#!/bin/bash
# @(#)
# @(#)Usage: $0 [-h]
readonly SCRIPTNAME="$(basename "$0")"
```

### デプロイ(~/bin/local/deploylocalcmd.sh)

```~/bin/local/deploylocalcmd.sh
#!/bin/bash
# @(#)deploy local command (./bin) under this directory.
# @(#)Usage: $0
readonly SCRIPTNAME="$(basename "$0")"
cd "$(dirname "$0")"
find . -type f -mindepth 2 | sed 's@\./@@' | xargs -n1 -I{} sh -c 'ln -s $(pwd)/{} ~/{} && echo "Linked: {} -> ~/{}" 1>&2 || echo "$SCRIPTNAME: ERROR - Symlink failed {} 1>&2'
```

## 使い方

```bash
$ cd ~/Documents/
$ msh -l hoge
$ type hoge # スクリプトが作成されパスが通っている
hoge is ./bin/hoge
$ readlink ./bin/hoge # ~/bin/local以下の実体からリンクされている
/Users/catfist/bin/local/Documents/bin/hoge
```

* OSクリーンインストール後などは`~/bin/local/deploylocalcmd.sh`一発で配置できる……はず

## 関連
* [ShellScript - 簡単にシンボリックリンクを作るシェルスクリプト - Qiita](http://qiita.com/catfist/items/7845ef6cb467a88b4f67)
enhancd と autojump


`cd` の機能の拡張。
両方とも、大文字小文字の区別無しに、部分文字列でディレクトリ移動が可能になる。 `zsh` だと更に便利だけど、`bash` でも十分戦力に。

## enhancd

[enhancd](http://b4b4r07.hatenadiary.com/entry/2014/11/20/134901)

別コマンドではなく cd の拡張って事で、意識せずに普段使いが出来そう。

### install

```shell-session:
$ cd ${HOME}/cmd/share
$ git clone http://github.com/b4b4r07/enhancd.git
$ cd enhancd
$ PREFIX=${HOME}/cmd make
```

以下を `*ashrc` に

```bash:.bashrc
source ${HOME}/cmd/share/enhancd/enhancd.sh
```


### 使い方。

まずは普通に、`cd` して履歴にある程度残す。

```shell-session:これはコマンド履歴
$ fc -l -5
   21  cd
   22  cd Desktop
   23  cd ~/Downloads/
   24  cd ~/Documents/
   25  cd ~/Public/
```
で、どこにいようと、移動したい場所のユニーク文字列（大文字小文字区別無し）を `cd` の引数に与えれば、 `cd` 出来る様になる。

```shell-session:
$ cd dow
```

* 上の例だと `wnl` だと駄目（`autojump` では出来る @mac）
* `cd - 0`
は当環境では効かない。web の説明文では 0 の存在が無い様に書かれてるけど、`man` では 0 を含めた説明文。ページの gif でも `cd - 0` してる。
* `jo` に該当するものがあれば、移行できるのに。



## autojump

`mac` では `brew` でも配布

### install

```shell-session:
$ git clone git://github.com/joelthelion/autojump.git
$ cd autojump/                          
$ python install.py --prefix=${HOME}/cmd
```

以下を `*ashrc` へ。

```zsh:.bashrc
# export FPATH=${HOME}/.autojump/functions:$FPATH # <= .zshrc はこの行も
source ${HOME}/.autojump/etc/profile.d/autojump.sh
```

mac からサーバ上の `jo` で `xdg-open` させると、何故だか `firefox` の方に飛ばされてパスツリーを表示してしまうので、 `gnome-open` を叩く様に変更。単独で `xdg-open` すると普通にファイラー開くのに、何故だろう？

```shell-session:
$ pwd
${HOME}/cmd/share/autojump
$ diff autojump.bash  autojump.bash.bak
97,98c97
<                 #xdg-open "${output}"
<                 gnome-open "${output}"
---
>                 xdg-open "${output}"
```
\# 必要なら、 `autojump.zsh` も同様に編集

### 使い方。
上の `enhancd` の例の様に使うには、

```shell-session:
$ j dow
```

他には、 `jo dow` でファイラー（ファインダ）を開くとか。
HTTPでzipを返すメモ

簡単なダウンローダのような物を作ろうとしてすんなり調べて出て来なかったのでそのメモ

```go
package main

import (
	"io/ioutil"
	"net/http"
)


func zipDownload(w http.ResponseWriter, r *http.Request) {
	file, err := ioutil.ReadFile("test.zip")
	if err != nil {
		fmt.Println(err)
		return
	}
	w.Header().Set("Content-Type", "application/zip")
	w.WriteHeader(http.StatusOK)
	w.Write(file)

}


func main() {
	http.HandleFunc("/", zipDownload)
	http.ListenAndServe(":8080", nil)
}

```
node lifecycle (Infrastructure as codeの自分なりの整理）

## Infrastructure as code の使いどころ
各ノード・ライフサイクルのどの部分をどのソフトウェアで実現、対応するかをしっかり検討してから使い始めたい。けど、Web上には諸所いろいろな意見があり実は自分自身頭が整理できていない。

### Provisioning Toolchain

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/64827/13b320fa-d328-6cbb-d2b1-1772a20eaf5e.png)



### ノード・ライフサイクル

[Add] 既存のサービスにノード（サーバ、ストレージ、ネットワーク機器など）を追加する。
・目的は、既存サービスを素早くスケールアウトさせること。負荷対策、サービス提供リソースの絶対量増強など。

[Update] 既存のサービスに展開済みのノードへの変更を加える。
・目的は、既存サービスに変更を加えること。アプリケーションの設定変更、バグ改修など。

[Delete] 既存のサービスに展開済みのノードを取り除く。
・目的は、故障等でサービス影響を発生させているノードを素早く取り除くこと。

　

![図3.png](https://qiita-image-store.s3.amazonaws.com/0/64827/de9e8ecb-fade-42bb-2745-909452ff85f6.png)


　
・あくまで頭の整理のために書いてみた図なので、なんか違うとかコメントはたくさんあると思いますが、そういった突込みいただけますと今後の参考になります。オーケストレーションはスケールアウト可能な環境への新規ノード追加（サービスへのノード追加）のイメージ。seleniumで試験などはオーケストレーションの枠組みに入らないと思うけど、サービス全体の正常性確認という意味合いで入れている。

## 参考
・http://www.slideshare.net/TakashiHonda0628/infrastructure-as-a-code-45047762
・http://www.slideshare.net/y05_net/infrastructure-as-code-35373108
・http://qiita.com/hiracy/items/c8bfb69ff624d4b711e4
・http://labs.gree.jp/blog/2014/12/11959/
・http://qiita.com/takachan/items/8cd832bba9779390c6d8#2-5
・http://kentana20.hatenablog.com/entry/2014/02/15/023158
OCamlでpecoっぽいのを作ってみる

pecoと見ると、[paco](http://porg.sourceforge.net/)を思い出しそうになる私です。（pacoは名前が変わってporgとなっていたようです。気づかなかった・・・）
pacoは今でも便利に使ってますが、まぁ普通は使わずにパッケージマネージャを使ったほうがいいと思います。emacsを手でビルドしていると手放せないんだ・・・

## 前書き
pecoって？という方はこちらを。 https://github.com/peco/peco

機能としては、標準入力から受け取ったものを任意に絞り込んで、標準出力に出力する、というかなりシンプルですが、emacsでhelm/anythingを、Vimならば・・・なんだっけ。そういった絞りこみインターフェースをシェル上で実現する、という感じのものです。

私も以前、zshで似たような（ものすごい機能劣化版）を、zshの機能だけを使って作ったりしたことがありますが、これはコマンドなのでシェルに関係なく使えます。

qiitaでも検索すれば色々利用法は出てきます。ものがシンプルなので、応用が非常に効く、というのも人気の一つのようです。

peco自体は、percolというpython製のツールにインスパイアされて作った（とpecoのreadmeに書いてます）、ということなので、そのさらに前のツールを作った方に先見の明があったということでしょう。知っている人は知っている、Keysnailを作った方です。

## 本題
さて、pecoはwindowsも含めた複数環境をサポートするため（なのかどうかはしりませんが）、golangで作成されています。最近気づきましたが、golangってインデントがタブのせいか、github上で非常にインデントが広くて読みづらいですね。

個人的にgolangは仕事で使うんならやらんでもないけど、個人的には積極的に利用したくないなー、という感じです。書き方が冗長すぎると感じたもんで。
（そもそもツールだからええやん、というのはそのとおり。私もpeco入れて便利に使ってます）

OCamlで何かしらターミナルを利用したツールを作ってみたかった、というのもあっていつものノリで、OCamlで似たものに作ってみました。

https://github.com/derui/oif

### 利用したライブラリ
ライブラリとしては、以下を利用しました。

- [lambda-term](https://github.com/diml/lambda-term)
  - Lwt
  - React
  - これらは、lambda-termがReactを利用したZedと、Lwtを盛大に利用しているため、必須です

lambda-termには、read_lineという入力インターフェースがすでに実装されているため、これを思いっきり利用して、面倒な部分を省くことにしました。

### ドハマりしたところ
あまりこういったコマンドラインツールとか書いたこと無いので、ところどころでドハマりしてめちゃ時間取られたりしました。単純にLwtの使い方を調べるのにもすごい時間かかった・・・。

#### ttyのとき/パイプのときのハンドリング
単純に私の知識がなかったのが原因ですが、パイプで繋いだ時の標準入力、標準出力の使い方に非常に悩まされました。ttyかどうか、というところについても同様に、 **何やっても動かねぇぇ** みたいな感じにもなったりしました。

これについては、OCamlでのシステムプログラミングをまとめたGithub pagesがあったので、これを熟読することでなんとか解決できました。

http://ocaml.github.io/ocamlunix/

非常に役立ちました。

#### 複数のReact.Eのハンドリング
今回、絞り込んだものを選択するキーシーケンスと、編集された時のキーシーケンスとに別々にReact.Eを割り当てて、それらに対するハンドラを設定する、という形にしましたが、これがまたうまく行かない。

```ocaml
let e1, _ = React.E.create () 
and e2, _ = React.E.create () in
(* f1, f2はそれぞれ別の処理をtermにするものだと思ってください *)
React.E.map e1 f1 |> ignore;
React.E.map e2 f2 |> ignore;
```

みたいな感じにすると、f1が動いた後にf2が動かなく、f2が動いた後にはf1が動かない、みたいな形になります。解決としては、きれいじゃないかもしれないけれども、こんな形に落ち着きました。

```ocaml
type t = {mutable v: int}
let i = {v = 0} in
let e1, _ = React.E.create ()
and e2, _ = React.E.create () in
let e = React.E.select [React.E.stamp e1 (); React.E.stamp e2 ()] in
React.E.map e (fun () -> i.v <- succ i.v) |> ignore;
```

mutableを使うのはなんかシャクですが、無理して複雑怪奇にするよりはこっちのほうがすっきりしました。

### ひとまず作ってみて
とりあえずどんなものか、感触を掴みたかったんで作ってみましたが、意外としんどいです。ただ、一回軌道に乗ってしまえば、リスト処理とかoptionの処理とか、若干冗長でもザクザク書いていくことはできました。

だいぶ行き当りばったりで作ったので、モジュール分けとかあまり考えてないし、何よりテストなんて書いてませんが、それでもほとんど実行時エラーには（IOに関するところを除いて）ぶち当たりませんでした。この辺はOCamlとかHaskellを使っていて気持ちがいいところですね。

まぁ、OCamlでわざわざツールを書くか？と言われればウーン・・・となりますが。速度を気にしないのならRuby/Pythonとかでトライ＆エラーしたりしたほうが速いケースもあるかと思いますので、その辺は臨機応変で。
(相変わらずまとまりないな)
SeleniumのChrome driverのデフォルトダウンロードフォルダを設定する

SeleniumのChrome driverを使ってWebスクレイピングを行うときのデフォルトのダウンロードフォルダを設定する方法です。

```py:sample.py
from selenium import webdriver

chromeOptions = webdriver.ChromeOptions()
prefs = {"download.default_directory" : "C:\Users\\{username}\\Downloads\\test"}
chromeOptions.add_experimental_option("prefs",prefs)
#Chrome diriverのパス
chromedriver = "/tools/chromedriver_win32/chromedriver.exe"

driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=chromeOptions)
```
##注意点
`download.default_directory`にパスを設定するときは階層の区切り文字を `\\` とするか、文字列の前にRAWの意味の `r` または `R` をつけて記述します。
例：`r"C:\Users\{username}\Downloads\test"`

階層区切りを`\\`としたときは、サンプルコードのようにドライブのルート階層の文字は区切り文字を1つにしないとうまくいきません。例：`"C:\" `

一方、chromedriverのパスはスラッシュ(`/`)区切りとし、webdriverをインスタンス化するときに`executable_path`と`chrome_options`を引数として渡します。

chromedriverのパスを環境変数で設定してある場合でも、`chrome_options`を指定するときには`executable_path`が必要になるようです。

##確認
実行してChromeが立ち上がったときに右上ボタンの[Google Chromeの設定] > [設定] > [詳細設定を表示]から『ダウンロード保存先:』で指定したダウンロードフォルダが設定されているかを確認することができます。
Linux のブートプロセスに関係するレジスタ


## 概要

Linux のブートプロセスに関係するレジスタのみ記載（x86_64）

## 一覧

### 汎用レジスタ

#### RAX
![rax.png](https://qiita-image-store.s3.amazonaws.com/0/14521/f1fec6b0-3f53-b9c9-0ef7-bb082534b8fc.png "rax.png")

#### RDX
![rbx.png](https://qiita-image-store.s3.amazonaws.com/0/14521/d62fc58d-5571-683b-ab82-3ec99185350e.png "rbx.png")

#### RCX
![rcx.png](https://qiita-image-store.s3.amazonaws.com/0/14521/c7a36cf5-ebdb-a43c-0ce5-6cc2a1a1b1e4.png "rcx.png")

#### RDX
![rdx.png](https://qiita-image-store.s3.amazonaws.com/0/14521/8454e224-dc0f-8c7f-77d1-1e504ed8e84c.png "rdx.png")

#### RSI
![rsi.png](https://qiita-image-store.s3.amazonaws.com/0/14521/77d370ee-2ad0-bebf-49b3-7afd862d8170.png "rsi.png")

#### RDI
![rdi.png](https://qiita-image-store.s3.amazonaws.com/0/14521/e2260177-0642-c5b7-b461-8ca2668e7358.png "rdi.png")

#### R8 - R15
![r8-15.png](https://qiita-image-store.s3.amazonaws.com/0/14521/4768a87a-e127-a917-fc19-fa4de4b4886d.png "r8-15.png")


### ベースポインタ
![rbp.png](https://qiita-image-store.s3.amazonaws.com/0/14521/e6b0aec9-e9c7-27ba-1cf7-74735e331503.png "rbp.png")


### スタックポインタ
![rsp.png](https://qiita-image-store.s3.amazonaws.com/0/14521/d2bd234f-e16b-63ca-2844-ce0975c901e3.png "rsp.png")


### インストラクションポインタ
![rip.png](https://qiita-image-store.s3.amazonaws.com/0/14521/6f986112-fec7-efef-0299-14d13987284f.png "rip.png")

### コントロールレジスタ
![cr.png](https://qiita-image-store.s3.amazonaws.com/0/14521/d552c23c-70fc-ecb1-a6c1-fe63dd233dd9.png "cr.png")


### プログラムステータスレジスタ / フラグレジスタ
![flags.png](https://qiita-image-store.s3.amazonaws.com/0/14521/dd4ec5ff-fdc8-ab43-b863-0d892d8d5964.png "flags.png")

### セグメントレジスタ / セレクタレジスタ
![seg.png](https://qiita-image-store.s3.amazonaws.com/0/14521/570a49e4-20aa-efc6-e511-447436558894.png "seg.png")

### メモリ管理レジスタ
![tr.png](https://qiita-image-store.s3.amazonaws.com/0/14521/70a292c6-9202-b44d-b8ad-f4e4560bc5b1.png "tr.png")


## MSR（Model Specific Register）

一部のレジスタはアドレス番号で参照できる。
たとえば Extended Feature Enable Register（EFER）は 0xc0000080
CentOS7 では msr-tools を入れると MSR の内容を読める。

```shell-session
$ sudo yum install msr-tools -y

$ sudo /usr/sbin/rdmsr -x0 0x10 # TSC
0000005486b2095a
```
cookbook の root パスを取得する

libraries にこんなコードを入れておく

```ruby:libraries/cookbook_root.rb
class Chef
  module CookbookRoot
    # Obtain cookbook root path
    def cookbook_root(cookbook=nil)
      if self.is_a?(Chef::ResourceDefinition)
        raise "Not available at Chef::ResourceDefinition. Use at outside of block"
      end
      cookbook ||= cookbook_name
      run_context.cookbook_collection[cookbook].root_dir
    end
  end

  Chef::Recipe.send(:include, Chef::CookbookRoot) # recipes
  Chef::Resource.send(:include, Chef::CookbookRoot) # for `resource { here }`
  Chef::ResourceDefinition.send(:include, Chef::CookbookRoot) # for `definition { here }`
end unless defined?(Chef::CookbookRoot) # protect multiple loadings
```

これでレシピ内で 

```
cookbook_root
```

とすれば knife solo cook で chef-solo 実行サーバに rsync された cookbook の root パスがとれる。
【Swift】配列内で重複する要素を除去する

## NSOrderedSet
NSOrderedSetは「重複した要素を保存しない」という特徴を持つ。


## Array -> NSOrderdSet -> Array
ArrayからNSOrderdSetを生成し、それをまたArrayに戻すと、重複した要素が除去される。
各要素の順番は、元のまま保たれる。
 
## サンプル
```swift:
/* Swift2.1 */

let values = ["1st", "2nd", "3rd", "2nd"]
let orderedSet = NSOrderedSet(array: values)
let uniqueValues = orderedSet.array as! [String]

print(uniqueValues) // ["1st", "2nd", "3rd"]
```

## 参考
- [Objective-Cで配列の要素の重複を取り除く方法　NSOrderedSetを用いる](http://app.k-server.info/blog/archives/212)
- [NSArrayとNSOrderedSet](http://akinto.jimdo.com/2013/06/30/nsarray%E3%81%A8nsorderedset/)
IndexedDbをActiveRecord+Promiseっぽく扱えてJSONSchemaでバリデーションできてnodeでもオンメモリで動いてくORMみたいな何か作ってみた


タイトル盛りすぎた。 [mizchi/stone-skin](https://github.com/mizchi/stone-skin "mizchi/stone-skin") です。 `npm install stone-skin` で入るんでbrowserifyと一緒に使ってください。


命名は、時間があったらFF14やるんだけどなという気持ちを込めて。(ナイトだけLv50にしてから1年以上触ってない)


この前紹介したArdaと一緒で、本番環境でドッグフーディングしつつ開発したので、使い物になるはず。今さっきドキュメント書いてv0.1.0にしたので紹介。


## サンプルコード

非同期APIはPromiseを返すので、この前書いた
[JavaScript - Babelのasync/await試してみた(+中の処理をちょっと追ってみた) - Qiita](http://qiita.com/mizchi/items/46dfe1c3ad2e6d9c9007 "JavaScript - Babelのasync/await試してみた(+中の処理をちょっと追ってみた) - Qiita") のasync/awaitを使いつつ紹介。

```js
import "babel/polyfill";
import StoneSkin from '../with-tv4';

class ItemStore extends StoneSkin.IndexedDb {
  storeName: 'Item';
  schema: {
    properties: {
      title: {
        type: 'string'
      }
    }
  }
}

let itemStore = new ItemStore();
(async () => {
  await itemStore.ready;
  await itemStore.save({title: 'foo', _id: 'xxx'});
  let item = await itemStore.find('xxx');
  console.log(item);
  let items = await itemStore.all();
  console.log(items);
})();
```

`_id` だけ予約語。find(), save({..}), all(), select(i => bool) っていうそれっぽいAPIで永続化されたIndexedDbを扱える。

MemoryDbっていうクラスを継承しても全く同じAPIになるが、永続化はされない。扱ってる時はどっちか気にしなくてよい。

save時に渡したインスタンスは、JSONSchemaでバリデーションされる。
TypeScript用の型定義も用意した https://github.com/mizchi/stone-skin/blob/master/stone-skin.d.ts のだけど、TypeScriptの抜け道がいくらでもある型チェックより保存時のインスタンスのバリデーションの方が安心できそうだったので、実行時バリデーションを大事にした。型情報は補完用。


他にも `StoneSkin.utils.setupWithMigrate(version)` っていうスキーマバージョンが変わった時のマイグレーションヘルパとかある。というか必要に迫られて作った。


他は [mizchi/stone-skin](https://github.com/mizchi/stone-skin "mizchi/stone-skin") の README や examples を見てください。

## 作った動機

近年、JavaScriptアプリの多機能化により、ブラウザストレージを適切に扱う必要性が増してきた。うんぬん。


似たようなライブラリとして [Dexie.js - Minimalistic IndexedDB Wrapper](http://www.dexie.org/ "Dexie.js - Minimalistic IndexedDB Wrapper") や [mWater/minimongo](https://github.com/mWater/minimongo "mWater/minimongo") がある。


弊社某アプリの開発でminimongo使ってたんだけどmongo部分がどんどんいらなくなってきて、結局モンゴクエリでwhereするの面倒くさくなってきた。どうせJSから扱うんだし、カーソル処理+filter関数だけでどうにかできるはず、という直感はあった。ついでに適切にバッチ処理にフォールバック出来るようにするとパフォーマンスあがるはずで、薄いラッパーの上でそういうの作りたかった。作った。


で、最初[jensarps/IDBWrapper](https://github.com/jensarps/IDBWrapper "jensarps/IDBWrapper")をみてたんだけど、Promise化ぐらいならいけるやろと思い [mizchi/idb-wrapper-promisify](https://github.com/mizchi/idb-wrapper-promisify "mizchi/idb-wrapper-promisify") を書き(これのテストをPromise用に書き換えて通すのが面倒だった)、その上にActiveRecord風のAPIを被せた。


永続化ストレージ、簡単に扱うよりも固く扱えるようにするのが動機として強いんだけど、とはいえある程度簡単じゃないとモチベーション下がる。素のIndexedDbは妙にローレベルで最適化難しく、StoneSkinはまだパフォーマンス的な最適化は施してないがそれが出来る余地を残してある。

お試しください。
CPU のモード


## 概要

Linux のブートプロセスに関連する内容について

## 各モードの概説

### real-address mode

メモリ空間：20bit, 1MB（0x00000 - 0xFFFFF）
8086 のアドレスバスが20本のため。
ブートローダは最初 real-address mode で動き途中から protect mode へ切り替える。

### protect mode

メモリ空間：32bit, 4GB（0x00000000 - 0xFFFFFFFF）
アクセス保護があり違反すると割り込みを発生させて OS に通知。

### virtual 8086 mode

protect mode で動く仮想的な real-address mode。
8086 用のプログラムを real-address mode で動かすと挙動によっては OS に戻ってこれなくなるため用いる。
Linux のブートプロセスでは利用されない。

### 64bit mode

protect mode のアドレスサイズが 64bit になったもの。
現在の CPU ではアドレスバスが40本しかないのでアドレス空間は下位 40bit しか使われない。
40bit だと 1TB までアドレッシング可能。
EM64T の上限は 52bit なので 1PB まで。
仮想アドレスで扱えるのは下位 48bit で 256TB まで。

### Compatibility mode

IA-32e モードのサブモードとして提供される。
virtual 8086 mode のようなもので 64bit OS の上で 32bit アプリのバイナリを動かせるようになる。
32bit 環境でアドレスサイズを拡張する PAE（Physical Address Extention） もサポートされる。

## モード移行

### real -> protect

モード切り替え自体は CR0 レジスタ最下位 bit で制御する。
1 == protect, 0 == real

実際には次のような手続きが必要。

1. GDT（Global Descriptor Table）の作成
2. GDT レジスタに登録
3. IDT（Interrupt Descriptor Table）の作成
4. IDT レジスタに登録
5. A20 のマスク解除
6. 割り込みマスク
7. CR0 レジスタに最下位 bit をセット
8. パイプラインの内容をフラッシュ
9. セグメント・レジスタを設定

### protect -> real

Linux ではこのモード移行はない。

### IA-32 -> IA-32e

EFER（Extended Feature Enable Register）の LME フラグによって切り替える。
IA-32e のページングは PAE を事前に有効化しておく必要がある。

1. CR0 の最上位 bit をリセット（ページング無効化）
2. PAE を有効にする
3. ページングテーブルをロード
4. IA32_EFER.LME をセット（IA-32e 有効化）
5. CR0 の最上位ビットをセット（ページング有効化）
6. 64bit コードセグメントにジャンプ

ジャンプ先のコードセグメントのフラグ種別に応じて 64bit or Compatible が決定。

### IA-32e -> IA-32

1. CR0 の最上位 bit をリセット（ページング無効化）
2. ページングテーブルをロード
3. IA32_EFER.LME をリセット（IA-32e 無効化）
4. CR0 の最上位 bit をセット（ページング有効化）
5. 32bit コードセグメントにジャンプ
SwiftでUserAgentを偽装し、iPhoneからPCのWebサイトを見る

## SwiftでUserAgentを書き換える

iOSのWebView使って、PC版サイトを表示したいとき。

    func changeUserAgent(){
        let userAgentStr = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
        let dic:NSDictionary = ["UserAgent":userAgentStr]
        NSUserDefaults.standardUserDefaults().registerDefaults(dic)
    }

* SwiftでUAについて参考: [iOS - [Swift]UserAgentを設定する - Qiita](http://qiita.com/nagatasci/items/6c337de0cecf97909a02)
* SwiftのWebView参考: [009 UIWebViewでページを表示 - Swift Docs](https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/uiwebviewdepejiwo-biao-shi)
* UserAgent一覧: [userAgent一覧/ユーザーエージェント一覧](http://www.openspc2.org/userAgent/)

## 実装ソース

```
import UIKit

class FirstViewController: UIViewController,UIWebViewDelegate {
    @IBOutlet weak var twitterWebView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        changeUserAgent()
        loadTwitterWebView()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // UA書き換え
    func changeUserAgent(){
        let userAgentStr = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36"
        let dic:NSDictionary = ["UserAgent":userAgentStr]
        NSUserDefaults.standardUserDefaults().registerDefaults(dic)
    }

    // webview load
    func loadTwitterWebView(){
        twitterWebView.delegate = self
        let url: NSURL = NSURL(string: "http://twitter.com")!
        let request: NSURLRequest = NSURLRequest(URL: url)
        twitterWebView.loadRequest(request)
    }

    /*
    Pageがすべて読み込み終わった時呼ばれる
    */
    func webViewDidFinishLoad(webView: UIWebView!) {
        println("webViewDidFinishLoad")
        println(webView.request?.URL)
    }

    /*
    Pageがloadされ始めた時、呼ばれる
    */
    func webViewDidStartLoad(webView: UIWebView!) {
        println("webViewDidStartLoad")
        println(webView.request?.URL)
    }
}
```

## 結果

![iOS Simulator Screen Shot 2015.03.14 16.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/5678/ca0f8f58-430e-9e89-4d8c-fc1ec1d2290d.png)
laravel5でサイトのルートを変更する

laravel5のプロジェクトフォルダをftpでそのままうｐると…
http://example.com/プロジェクト名/public/

というURLになっちゃうけど、これを…
http://example.com/プロジェクト名
**こうしたい！**

---

1. publicフォルダの中身を全部１つ上の階層（プロジェクトフォルダのルート）に移動させます。
2. index.phpを編集します。

```php:index.php_変更前
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
```
```php:index.php_変更後
require __DIR__.'/./bootstrap/autoload.php';
$app = require_once __DIR__.'/./bootstrap/app.php';
```

---

wordpressのindex.phpの場所変更するみたいにできるかなーって思ってやってみたら普通に出来ちゃった
UbuntuでPython3によるKivy環境を構築する

実は公式ドキュメントにやり方は書いてますが。
[Installation on Linux — Kivy 1.9.0-dev documentation](
http://kivy.org/docs/installation/installation-linux.html)

まずはPygameのPython3対応版のリポジトリを入れます。
```sudo add-apt-repository ppa:thopiekar/pygame
```
次にアップデートしてPython3版のPygameとKivyをインストール。
```sudo apt update
sudo apt install python3-pygame python3-kivy
```
以上。
[gulp] 効率的にプラグインを読み込む

gulp で利用するプラグインをひとつひとつ読み込むと大量の `require` が並ぶことになる。`gulp-load-plugins` を利用すると `package.json` から自動で読み込み利用できるようになり、`require` する必要がなくなる。

- [gulp-load-plugins](https://www.npmjs.com/package/gulp-load-plugins)

```javascript:gulpfile.js
var gulp   = require('gulp');
// ひとつひとつ読み込む必要がある
var jshint = require('gulp-jshint');
 
gulp.task('lint', function() {
    return gulp.src('./lib/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter());
});
```

```javascript:gulpfile.js
var gulp = require("gulp");
// $ のメソッドとして自動的に読み込まれる
var $ = require("gulp-load-plugins")();

gulp.task('lint', function() {
    return gulp.src('./lib/*.js')
        .pipe($.jshint())
        .pipe($.jshint.reporter());
});
```

プラグインとして認識されるのは `package.json` に依存パッケージとして書かれている `gulp-*` のパッケージのため、直接インストールした場合などには自動的に読み込まれないので注意。
AngularJSのOne Time Binding使用例


digestループ内の処理を軽くして高速化を実現出来るone-time-bindingが1.3から導入されました。しかし、簡単なサンプルしかネットでは拾えない気がしたのでよく使う使用例をまとめてみます。

### 基本
```html
<p ng-bind="::message"></p>
<p>{{ ::message }}</p>
```
一番シンプルなパターン

### filter
```html
<p ng-bind="::website_url | linky"></p>
```
filterをかませるときも同様

### ng-repeat
```html
<div ng-repeat="list in ::lists">
  <p ng-bind="::list"></p> <!-- ここにも -->
</div>
```
配列名の前に::を付ける。加えて、ループ内の要素にも::を付けるとその要素分bindingを減らせる

### ng-class
```html
<span ng-class="::{'selected': is_seleted}">hoge</span>
```
::is_selectedと書きたくなるが、curlyの前に::を置くのが正解

### ng-if, ng-show, ng-switch
```html
<div ng-if="::user.is_sageman"></div>
<div ng-if="::!user.is_sageman"></div> <!-- 否定 -->
<div ng-show="::user.is_ageman"></div>

<div ng-switch="::tribe_type">
  <p ng-switch-when="exile">EXILE</p>
  <p ng-switch-when="jsoulbro">J Soul Brothers</p>
  <p ng-switch-when="egirls">E Girls</p>
</div>
```
ng-if,ng-switchの論理評価も対象にできる。ng-switch-whenは元々bindingに含まれていない

```html
<div ng-if="::(is_ageman && is_ikemen)"></div>
```
::is_ageman && ::is_ikemenではなく、全体を括弧で括ってその前に::を付ける
`is_ageman && ::is_ikemen`にように片方だけ::を付けることは出来ない

### 不等式
```html
<div ng-if="::(count > 0)"></div>
```
上と同様に括弧で括ります

### directive
```html
<div tag-cloud tags="::tags"></div>
```
```js
.directive('tagCloud', function() {
  return {
    template:"<div ng-repeat=\"tag in ::tags\"><p>{{ ::tag }}</p></div>",
    scope: { tags: "=" }
  };
})
```
directive内のtemplateでone time bindingが使えるのはもちろんだが、
directiveに渡すscopeにも::を付けて`tags=::tags`とするとひとつbindingを減らせる

## まとめ

これくらいを抑えておけば、だいたいのケースには対応出来るはずです
SoftLayerの無料ベアメタルでOpenStackの学習をする(3) - クライアント環境の整備とOpenStackの基本操作

[前回はこちら](http://qiita.com/orz/items/bb23d01b3f05b734ae5f) - [次回はこちら](http://qiita.com/orz/items/79c5dcc5e0304c0e5337)
***
#これはなに
[「OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門」](http://www.shoeisha.co.jp/book/detail/9784798139784)の実習をSoftLayerの無料ベアメタルで行う記録である。
![OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門](http://www.seshop.com/static/images/product/17681/L.png)

# 第3章　OpenStackクライアント環境の整備
[前回](http://qiita.com/orz/items/bb23d01b3f05b734ae5f)、2章まですすめて3VMによる実習環境を調えた。
この章は短く、CLIクライアントツールの導入方法の説明だけ。
今回の環境は、[install_cli.sh](https://github.com/josug-book1-materials/quick-devstack/blob/master/install_cli.sh)でクライアントツールを導入しているので作業はなし。3.2の基本的な方法のようだ。今回はUbuntu14.04なのでIcehouseベースのクライアント環境になるらしい。導入されたクライアントツールのバージョンは下記のとおり。

```
root@test:~# nova --version
2.17.0
root@test:~# neutron --version
2.3.4
root@test:~# glance --version
0.12.0
root@test:~# cinder --version
1.0.8
root@test:~# swift --version
swift 2.0.3
root@test:~# keystone --version

```

# 第4章　OpenStackの基本操作
OpenStackの基本操作の解説の章。そのため当章も作業なし。50ページほどだが、長すぎずよくまとまっていて勉強になった。
***
今回は実作業はなし。でも勉強になった。5章から、いよいよストーリー仕立てのOpenstack活用が始まるが、その前にHorizonにつながるようにしておこうと思う。
***
[前回はこちら](http://qiita.com/orz/items/bb23d01b3f05b734ae5f) - [次回はこちら](http://qiita.com/orz/items/79c5dcc5e0304c0e5337)
grafanaのannotation機能を活用する


# 概要

InfluxDBなどのデータから生成したグラフをgrafanaで可視化する際、イベントなどをオーバーレイして表示する「annotation」と呼ばれる機能があります

http://grafana.org/docs/features/annotations/

grafanaの「annotation」はInfluxDB以外の、Elasticsearchなどのデータソースにも対応していますが、本エントリではInfluxDBにおける「annotation」の使い方についてまとめます

なお、grafanaを通してInfluxDBのデータが見れるようになっていること、を前提として本エントリを記述します

# 実現できること

## 出来ること
* 記録済みのイベント発生タイミングをグラフにオーバーレイする
* 付加テキストをつける
* オーバーレイに利用する線やマークの色を出し分ける

## 出来ないこと(2015/03)
* grafanaのUI上から、グラフを見ながらイベント情報を記録する
* 特定のグラフのみにイベントをオーバーレイする

# イベント情報の登録

「記録済みのイベント」をどのように記録するか、について記載します

## データフォーマット

grafanaで設定したdatasourceの「events」seriesに、下記のカラムを設定して保存すれば、簡単にgrafanaからイベントを取得するように設定できます

* title
* tags
* text

![スクリーンショット 2015-03-14 12.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/7625/55ce9d5e-e929-deb2-11f8-be04d253980d.png "スクリーンショット 2015-03-14 12.33.47.png")


InfluxDBで通常行うように、イベントに時刻を明示的に指定する場合(現在時刻ではなく、過去や未来のイベントを作成する場合)は、timeを追加で指定してください

![スクリーンショット 2015-03-14 12.35.12.png](https://qiita-image-store.s3.amazonaws.com/0/7625/1238263d-03a7-db1d-7317-dce76874ca76.png "スクリーンショット 2015-03-14 12.35.12.png")

![スクリーンショット 2015-03-14 12.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/7625/bbf05d42-2eef-6f22-d780-d66ed7df0880.png "スクリーンショット 2015-03-14 12.35.23.png")

## 記録方法

イベントの記録は、

* ログ経由で記録(fluentd-plugin-influxdbなどを活用)
* curlコマンドで直接イベントを記録
* 第3者ツールを利用
 * https://github.com/underley/annotate-influxdb

など、様々な方法が考えられます
適宜記録してください

# grafanaの設定

grafanaでは、annotationの有効化/無効化や、イベント情報とannotationカラムの紐付けを行います

## annotationの有効化/無効化

画面右上の Configure dashboard > Features (tab) を選択し、Annotationsにチェックをつけます

![スクリーンショット 2015-03-14 14.39.42.png](https://qiita-image-store.s3.amazonaws.com/0/7625/85e46cca-d98f-f480-307d-04c50027326e.png "スクリーンショット 2015-03-14 14.39.42.png")

![スクリーンショット 2015-03-14 14.41.52-2.png](https://qiita-image-store.s3.amazonaws.com/0/7625/8a7ae89d-cfd2-bf4d-1ff4-6bcb2f6bbed8.png "スクリーンショット 2015-03-14 14.41.52-2.png")

画面左上に歯車のマークが表示されるようになったらうまくいっています

## イベント情報とannotationカラムの紐付け

上記「イベント情報の登録」に設定例を示しましたが、grafanaに設定済みの任意のdatasource(多くの場合はdatabase), 任意のseries, 属性をイベント情報として利用することが出来ます

Annotations > Add (tab) からAnnotationを作成します

* Name
 * Annotation(イベント列)の識別子なので適宜付与してください
* InfluxDB Query
 * event情報が取得できるクエリを指定してください
* Column mappings
 * eventをtitle, tags, textという列以外に格納した場合に、どの列をどのように対応づけるか、を指定してください

![スクリーンショット 2015-03-14 14.42.09.png](https://qiita-image-store.s3.amazonaws.com/0/7625/9930cf1c-734b-1108-33b6-daee44c70273.png "スクリーンショット 2015-03-14 14.42.09.png")

![スクリーンショット 2015-03-14 15.01.12.png](https://qiita-image-store.s3.amazonaws.com/0/7625/7a105882-5a1a-9d70-ce66-234cde012877.png "スクリーンショット 2015-03-14 15.01.12.png")

ここではeventsというNameを付与しています

下記のようなオーバーレイが表示されます

![スクリーンショット 2015-03-14 15.01.27.png](https://qiita-image-store.s3.amazonaws.com/0/7625/147de965-a880-864c-ffe8-bbac236afe40.png "スクリーンショット 2015-03-14 15.01.27.png")

線やマークがカスタマイズできますので、イベント種別毎に色を変えるとか、イベント開始/終了で色を変える、などの利用方法が考えられそうですね

# 最後に

フィードバックいただければ、随時対応していきます
下記観点でコメントいただければと思います

* 誤っている内容
* 追加の情報(これ知ってるよ!っていう話)
* 記事にして欲しいこと

ありがとうございました
ビルドトリガにスクリプトを設定してみる

SVNのリポジトリ更新をトリガにしてビルドかけるのは楽なもんだが、
仕事でJenkinsおじさんやってると、たまーに一筋縄ではいかん状況があったりする。
「ここに置かれてるファイルが更新されてたら、このフォルダとあのフォルダから
プロジェクト一式持ってきてビルドかけてちょうだいね！」みたいな注文入ったり。

この○○されたら、という条件をトリガ扱いにして、
スクリプトか何かで自由に書けたりしないもんだろうかにゃー？
と思ってググってみたら、それっぽいプラグインがあったので導入してみた。

[ScriptTrigger Plugin](https://wiki.jenkins-ci.org/display/JENKINS/ScriptTrigger+Plugin)


![jenkins_trg1.jpg](https://qiita-image-store.s3.amazonaws.com/0/69388/6bed3f4b-0dd6-0e3e-7ae2-b72f9c4fddce.jpeg)

プラグインを有効にしてやった後、プロジェクトの設定画面で
「Poll with a shell or batch script」にチェック入れてやって、
「Script」にトリガ条件に使うスクリプトを指定する。
「Exit Code」には、どの終了コードが返ってきたらビルドを走らせるかを設定できる。
「Schedule」にトリガスクリプトを走らせる間隔を設定。そんぐらいでOK。

次は、Scriptで指定したパスにトリガスクリプトを記述する。

```lang:trigger.py
# conding: UTF-8
exit(0)
```
こんな感じで、判定処理なり何なりやった後にexitコード返してやればOK。

![jenkins_trg2.jpg](https://qiita-image-store.s3.amazonaws.com/0/69388/cb380012-bb99-4c3b-9203-f6ae9a306468.jpeg)

メニューの「ScriptTrriger Log」を選ぶと、最新のポーリング結果が表示される。
exit(0)だと、何も実行されてないことがわかる。

```lang:trigger.py
# conding: UTF-8
exit(1)
```
次は、exitコードを1に変えてみる。

![jenkins_trg3.jpg](https://qiita-image-store.s3.amazonaws.com/0/69388/3beec067-d33e-59fb-dc75-68204f7c20fd.jpeg)

すると、無事にビルドがスケジュールされた。これにて一件落着。
ひとまずpythonで試したが、cmdで実行できるスクリプトだったら何でもいけるっぽい。

```lang:Script
powershell "& {C:\scripts\ps\trigger.ps1;exit $LASTEXITCODE}" 
```

```lang:trigger.ps1
exit 1
```
ちなみにpowershellだとこんな感じになった。
Steins; GCD

*「フゥーハハハ！　これが運命石の扉の選択か……*
*　これより、オペレーション・GCDを開始する！！」*

前回、[C++11で黒魔術的NTZとNLZを実装する話](/kazatsuyu/items/38203287c19890a2b7c6)をやりました。今回はその続きです。
まあ、続きと言っても、NTZを使えばこういうことができるよ！　ってだけなのですが。

#SteinのGCDアルゴリズム
タイトルと冒頭で謎のシュタゲネタをぶち込みましたが、今回実装するのは「バイナリGCDアルゴリズム」とか「Steinのアルゴリズム」と呼ばれるアルゴリズムです。
Steinというのは別に運命石ではなくて、人名です。Josef Steinさんという方が発見した最小公倍数アルゴリズムらしいです。
前回と同じくネタ元のブログ記事を紹介します。

[sh-2の日記: 最大公約数を求める2つのアルゴリズムを書いてみた](http://d.hatena.ne.jp/sh-2/20100320/1269039543)

前回のNTZ/NLZと比較するとそれほど黒魔術的ではありません。
考え方はこうです。

* ユークリッドの互除法は美しいが最速ではない。
* なぜ速くないか→剰余が遅いから
* なら剰余をを使わなければいい
* 剰余の代わりに全部シフト演算にできたら速くなるんじゃね？

上記のブログ記事では非常に素直な実装を行っていますが、私のような狂気のマッドC++erはこう考えます。

* ループ回してシフト演算してる所、NTZに置き換えられるんじゃね？
* C++11らしくconstexprにしたいよね。再帰しかないな！

やってみました。

```gcd_stein.hpp
#include <ntz_nlz.hpp>

// std::minがconstexprじゃないのが悪い
template<typename T> inline constexpr T min(T x, T y) noexcept { return x<y?x:y; }

template<typename T>
struct gcd_stein_
{
    using result_type = decltype(std::declval<T>()%std::declval<T>());
    static inline constexpr result_type func1(T x, T y, int n, int m) noexcept { 
        return func2(x>>n, y>>m) << min(n, m);
    }
    static inline constexpr result_type func2(T x, T y) noexcept {
        return x==y? x: (x>y ? func2(func3(x-y),y) : func2(func3(y-x),x));
    }
    static inline constexpr result_type  func3(T x) noexcept { return x >> ntz(x); }
};

template<typename T>
inline constexpr typename gcd_stein_<T>::result_type gcd_stein(T x, T y) noexcept {
     return gcd_stein_<T>::func1(x, y, ntz(x), ntz(y));
}
```

意外と短い。そして元記事のサンプルコードが影も形もない。
なお、ここで実装したGCDは、x, yのどちらかが0以下であった場合を考慮していません。あくまで正の2つの整数の最大公約数を求める関数であることをご了承ください。

それでは、短いですが本日はここまで。
俺様専用・正規表現メモ

仕事やら趣味やらでプログラム書くときに正規表現を頻繁に使ってるんだが、
言語によって微妙に実装違うおかげで頻繁にググってる気がするのでメモ。
とりあえず検索と置換ができればなんとかなるんで、そのあたりだけ書いとこ。

```lang:c#
using System.Text.RegularExpressions;

// 入力
string input = "VERSION_ALPHA";
// パターン
string pattern = @"^VERSION_(?<sub>.*)$";
// 置換後
string replacement = "VERSION_BETA";
// 検索処理
Match mc= Regex.Match(input, pattern);
// 引っかかったか？
if (mc.Success)
{
    // 名前付きサブパターン抽出
    string sub = match.Groups["sub"].ToString();
    // 置換
    replaced = Regex.Replace(input, pattern, replacement);
}
```

```lang:python
import re

# 入力
input = "VERSION_ALPHA"
# パターン
pattern = "VERSION_(?P<sub>.*)$";
# 置換後
replacement = "VERSION_BETA"

# 検索
mc = re.search(pattern, input)
# 引っかかったか？
if mc:
	# 名前付きサブパターン抽出
	sub = mc.groups("sub")[0]
	# 置換
	replaced = re.sub(pattern, replacement, input)
```

```lang:php
// 入力
$input = "VERSION_ALPHA";
// パターン
$pattern = "/^VERSION_(?<sub>.*)$/";
// 置換後
$replacement = "VERSION_BETA";

// 検索
$mc = preg_match($pattern, $input, $matches);
// 引っかかったか？
if($mc)
{
    // 名前付きサブパターン抽出
    $sub = $matches["sub"];
    // 置換
    $replaced = preg_replace($pattern, $replacement, $input);
}
```

```lang:javascript
// 入力
var input = "VERSION_ALPHA";
// パターン(名前付きサブパは無理っぽい？)
var pattern = /^VERSION_(.*)$/;
// 置換後
var replacement = "VERSION_BETA";

// 検索
var mc = input.match(pattern);
// 引っかかったか？
if(mc)
{
    // サブパターン抽出
    var sub = result[1];
    // 置換
    var replaced = input.replace(pattern, replacement);
}
```
Jenkins + phing + phpunit

で、ハマったこと。

※環境はお決まりの、Jenkins + Phing + phpunit + phpmd + phpcpd + git　的な感じ

アプリケーションのソースと、そのphpunitテストソースをコミットして、Jenkins→PhingXMLで自動実行したかった。

けれども、なぜかphpunitタスク実行中にアプリソースのrequire_onceやinclude_onceで、phpファイルが見つからないと怒られる。
怒られたのは、以下のような形でPHPのパスを指定していた箇所。

`$_SERVER['DOCUMENT_ROOT'] . /path/from/applicationroot`

調べてみてわかったこと。
`$_SERVER['DOCUMENT_ROOT']`　はApacheかphp.iniかで設定している。
phpunitでは、上記変数が未定義の状態になっているため、上の書き方ではファイルを見つけることができない。

これを解決するには、phpunitテストクラスのsetUpBeforeClass()で上記変数を定義してやればいい。

`$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/relative/path/to/application/root";`

[参考ページ](http://stackoverflow.com/questions/1653910/dealing-with-path-issues-with-phpunit)


~~通常、phpは他のファイルをインクルードする際、ファイルのパスをアプリケーションルートからの相対パスか、自分自身がいる場所からの相対パスで指定できる。~~

~~普通にアプリケーションルートからの相対パスで読み込めるようにするには、Phingのbatchtestタスクの中で明示的にそのアプリ＆テストソースが
置かれる場所をclasspathで指定してやればいい。
https://www.phing.info/docs/guide/stable/apcs59.html
こうした上で、アプリソースのインクルードパスをアプリケーションルートからの相対パスで書くようにすれば、タイトル通りの構成でテストの自動実行が可能になる。~~→すみません、嘘を書きました。
Excel::Writer::XLSX  


#####　20150301 現在

Perl の Excel の writer について。
有名なものとして、メンテナンスモードの `Spreadsheet::WriteExcel` がある。過去には定番中の定番だったが、メンテナンスモードと言う通り、大昔の Excel しか相手にしてないので使いものにならない。
で、最近の書式を相手にするものには、同じ作者の `Spreadsheet::WriteExcelXML` がある。しかし、pod で「非推奨だよ、`Excel::Writer::XLSX` 使ってね。」と宣言までされている。（そこまで書くなら公開停止すりゃいいのに、、、）

ので素直に `Excel::Writer::XLSX` を使いましょう。

\# windows の人は、 `Win32::OLE` を覚えてしまうのが、結果的には覚える事が少なくなるのかも知れない。

## インストール
```bash:
$ cpanm Excel::Writer::XLSX
```

### サンプルコード

無し

### メモ

1. 色付け、斜め線などは違ったり違わなかったり。
2. ハイパーリンクの書き込みは[65530](http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm#limitations)まで。
3. `Spreadsheet::WriteExcel` と `Excel::Writer::XLSX` では微妙に書式が違う。



1.は、モニタの仕様もあるけど、線が見えなくなるのは Numbers と Excel の互換の問題（？）
2.は、このリミテーションに引っ掛かる様なデータを弄ったので。他にもリミテーションが色々とあるので留意する事。
3.に関しては以下とか、


#### 例）write_url
pod より。

>write_url($row, $col, $url, $label, $format)
[Spreadsheet::WriteExcel](http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel-2.40/lib/Spreadsheet/WriteExcel.pm#write_url($row,_$col,_$url,_$label,_$format))

>write_url( $row, $col, $url, $format, $label )
[Excel::Writer::XLSX](http://search.cpan.org/~jmcnamara/Excel-Writer-XLSX/lib/Excel/Writer/XLSX.pm#write_url(_$row,_$col,_$url,_$format,_$label_))

```shell-session:plenv使用環境下です。
$ grep -A 20 'sub write_url ' ${PLENV_ROOT}/versions/5.18.4/lib/perl5/site_perl/5.18.4/Excel/Writer/XLSX/Worksheet.pm 
sub write_url {

    my $self = shift;

    # Check for a cell reference in A1 notation and substitute row and column
    if ( $_[0] =~ /^\D/ ) {
        @_ = $self->_substitute_cellref( @_ );
    }

    if ( @_ < 3 ) { return -1 }    # Check the number of args


    # Reverse the order of $string and $format if necessary. We work on a copy
    # in order to protect the callers args. We don't use "local @_" in case of
    # perl50005 threads.
    my @args = @_;
    ( $args[3], $args[4] ) = ( $args[4], $args[3] ) if ref $args[3];


    my $row       = $args[0];    # Zero indexed row
    my $col       = $args[1];    # Zero indexed column

```

後方互換のコードは書かれてるけど、pod に書かれた書式に変更しておくのが、大人な対応だろう。
レポート用オレオレggplot2設定


レポートとかに掲載する場合、デフォルトの凡例では文字が小さすぎるんで。

```
qplot(displ, hwy, data=mpg, colour=factor(cyl),
      geom="line") + ## opts(drop = "legend_box")
  theme(legend.box = NULL)
```

![def0.png](https://qiita-image-store.s3.amazonaws.com/0/9239/0b54688f-9940-baed-3714-d37ecd5d4aca.png)


```
oldTheme <- theme_update(
    axis.title.x = element_text(size = 18, vjust = 0.5), # ｘ軸ラベルサイズ
    axis.title.y = element_text(size =18, vjust = 0.5, angle = 90),# y軸ラベル
    legend.text =  element_text(size = 18), # 凡例
    legend.key.size = grid::unit(3.0, "lines"),
    legend.title = element_text(face = "bold", size = 18, hjust = 0),
    axis.text.x = element_text(colour = "grey50", size = 18, vjust = 1,     lineheight = 0.9),#x軸目盛ラベル
    axis.text.y = element_text(colour = "grey50", size = 18, hjust = 1,  lineheight = 0.9),#y軸目盛ラベル
    strip.text.x = element_text(size = 18), #ストリップ内の凡例サイズ
    strip.text.y = element_text(size = 18, angle = -90),
    plot.title = element_text(size = 22)
    )
```

![def.png](https://qiita-image-store.s3.amazonaws.com/0/9239/453d7aca-e14f-b10c-41c0-f803584c118a.png)


[設定後]()
perldoc のアップデートと groff のインストール


yosemite のシステムの `perldoc` （`perl` 5.18.2, versin 3.19）では何故だがエラーが出なくなってて気付かなかったんだけど、plenv でインストールした `5.18.4` の `perldoc`（versin 3.19）では perldoc 呼ぶと以下みたいなエラーが出る。

```shell-session:
You have an old groff. Update to version 1.20.1 for good Unicode support.
If you don't upgrade, wide characters may come out oddly.

 at ${PLENV_ROOT}/versions/5.18.4/lib/perl5/5.18.4/Pod/Perldoc.pm line 1346.
You have an old groff. Update to version 1.20.1 for good Unicode support.
If you don't upgrade, wide characters may come out oddly.

 at ${PLENV_ROOT}/versions/5.18.4/lib/perl5/5.18.4/Pod/Perldoc.pm line 1346.
```

久々に見たなー、懐かしーっ
 

てんで、対処法を。

### perldoc のアップデート

>Pod::Perldocの3.20からは挙動が変わり、Pod::Manではなく、Pod::Text::Termcapを使う様に変わっています。
>[引用元](http://code-stylistics.net/archives/perldoc.html)

```shell-session:
$ cpanm update Pod::Perldoc 
```

これで終わりなんだけど、ついでに、`groff` のインストール

### groff

```shell-session:
$ export PERL5OPT=   # <= 自分のみ
$ wget -q http://ftp.gnu.org/gnu/groff/groff-1.22.3.tar.gz
$ tar zxf groff-1.22.3.tar.gz                             
$ cd groff-1.22.3/ 
$ ./configure --pref=${HOME}/cmd
$ diff Makefile Makefile.bak      #1 <= plenv してない人は無関係
473c473
< PERL=/usr/bin/perl
---
> PERL=${PLENV_ROOT}/shims/perl

$ make
$ LANG=C make install             #2
$ cd ../
$ rm -rf groff-1.22.3
```

* #1. => `plenv shell system` してても、`./font/devpdf/util/BuildFoundries` の実行時にコケる。
* #2. => 普通に実行すると、 `sed: RE error: illegal byte sequence` エラーが出たので `LANG=C`

普通に、`brew` した方が早かった。
                                   
```shell-session:
$ brew tap homebrew/dupes
$ brew install groff
```
コマンド履歴 - 覆水を盆に返す


なんかで、`mv` したのを元に戻したいとき
なんかで、`cp` したのを元に戻したいとき

コマンドを懇切丁寧に打ち直すのは避けたいものだ。
そんな時は、コマンド履歴。つっても、 `history` やら `fc` やらのお話では無い。（関係はしてるけど）

キーワードは、 `bash` の「イベント指示子」と「単語指示子」とその「修飾子」。
もちろん、 `zsh` でも使える。


## ファイル対ファイル
##### 前提

* コマンドに対するオプションを使ってない、ファイル対ファイルの単純なケースを想定
* 対象コマンドでは、ブレース展開を使ってない（履歴に残ってない）事。
	* ブレース展開を使ってた場合については後述

```shell-session:
$ touch foo
$ mv foo foo.bak
```

なんらかの理由で .bak を元に戻したい時

### 直近
対象 `mv` 以降にコマンドを打っていないケースの場合。

`mv` に直近のコマンドの最後の引数 `!$` と二番目のコマンド文字列 `!:1` を与える。

```shell-session:
$ mv !$ !:1
```
第一引数 `!^` を与える。

```shell-session:
$ mv !$ !^
```

もしくは、多くのケースでは、

`mv` に直近のコマンドの最後の引数 `!$` と、それの拡張子を除いた単語 `!$:r` を与える。

```shell-session:
$ mv !$ !$:r
```


拡張子ではなく、`foo~` の様にしていた場合は、

```shell-session:
$ mv foo foo~
$ mv !$ !$:s/~//
```
* 早合点しがちだが、 `s///` の変換前部分も **正規表現表記ではない**。単なる文字列。（変換後部分は言うまでもないが）


### 実際に使うのは
殆どの場合は、別の作業をした後に実行するので、

コマンド履歴の番号でアクセスするか、コマンド文字列参照によってアクセスする事になる。

```shell-session:コマンド履歴の番号
$ history
（略）
140 mv foo foo.bak
（略）
$ mv !140$ !140:1
```

```shell-session:直近からの番号
$ mv !-2$ !-2:1
```
2回前だった場合ね

```shell-session:コマンド文字列参照
$ mv !m:$ !m:1
```

`more` とか他の m で始まるコマンドを間に挟んでたら、`!m` を `!mv` にすればいい。

* 文字列の時は、 `!m$` はエラーになる。同様に `!m^` も。

### ブレース展開を使ってた場合

```shell-session:
$ mv foo{,.bak}
```

展開してない状態で履歴に残ってたら。

直前なら、

```shell-session:
^,.bak^.bak,
```

そうでないなら、

```shell-session:
!mv:s/.bak,/,.bak/
```

* こちらも、 `s///` の変換前部分は **正規表現表記ではない**。単なる文字列。
大事な事なので二度言いました。
* このケース。 `zsh` では、 文字列記載後にタブを打つ事で、展開させる事が可能なので、展開させて制約を除くほうが都合が良い。

### ここまで押えれば、

後は、ケースバイケース。工夫次第で、色々活用出来る。

例えば、ある拡張子を持つファイルを、ごそっと移動した以下の様な場合に、元に戻したくなったとする。


```shell-session:
$ touch foo.pl bar.pl buz
$ mkdir foo
$ mv *.pl foo
```
移動先に同一拡張子のものが無いと言う保証があるなら、

```shell-session:
$ mv !$/!:1 .
```

で復元が出来る。