OmniAICreator/Qiita-1.07M huggingface dataset:
dockerでzabbixをデータソースにして自分好みのグラフを作るgrafanaを入れてみた話

# grafanaとは

- [公式サイト](http://grafana.org/)
- 超手軽にかっこいいグラフ
- OSS

↓実際使ってみるとこんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/3e4e7170-f190-a4f9-1807-d7cb3ea1c0dd.png)

# 今回想定している環境

「zabbixはあるけどグラフがちょっとイケてない…なんとかして！」みたいな意見をなんとかする

# データソースについて

2016/07/12現在、公式で対応しているデータソースは下記の通り

- Graphite
- Elasticsearch
- CloudWatch
- InfluxDB
- OpenTSDB
- KairosDB
- Prometheus

zabbixからデータ取れないじゃん！

# 救世主登場 「grafana-zabbix」

- [grafana-zabbix](http://play.grafana-zabbix.org/dashboard/db/grafana-zabbix-demo)
- [GitHub](https://github.com/alexanderzobnin/grafana-zabbix)

ということでzabbixをデータソースにして出来そう。

# さくっと準備

適当なフォルダ作って、docker-compose.ymlを作る

```sh
$ cd ~/docker/grafana
$ vi docker-compose.yml
```

```docker-compose.yml
grafana-zabbix:
  image: grafana/grafana:latest
  volumes:
    - /mnt/sda1/docker/grafana/libdata:/var/lib/grafana #tmpfsでないディレクトリへ
  ports:
    - 3000:3000
  environment:
    - GF_SERVER_ROOT_URL=http://{ホストPCのIPやPC名}:3000
    - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,alexanderzobnin-zabbix-app
  restart: always
```

```sh
$ docker-compose up -d
```

※ volumesは例にならってMac/Windowsの場合はVirtualBoxの共有フォルダの使用でダメそうなので、docker-machine内にする
※ DockerToolbox使っていてネットワーク外に公開したい場合は[過去記事](http://qiita.com/mitsugogo/items/0169481c4ae192ce4f26#%E7%A4%BE%E5%86%85%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%90%91%E3%81%91%E3%81%AB%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B)参照

# 初期設定

1. ログイン。admin/adminで入れる
2. ユーザーを作成する
 - 左上のgrafanaのアイコン→admin→usersでとりあえず自分のアカウントを作っておく
3. grafana-zabbixでデータソースとするzabbixを設定する
 - 左上のgrafanaアイコン→Zabbix→plugin config→configタブ→enable
 - 左上のgrafanaアイコン→Data Sources→Add Data Source
 - 下記のような感じで登録する
 - ![image](https://qiita-image-store.s3.amazonaws.com/0/109466/510d0b02-c338-776c-cbb0-d72997a8ad25.png)
 - Save & Testで疎通が確認できればOK


# ダッシュボードを作成する

1. 自分のID・PASSでログイン
2. 左上のgrafanaアイコンの右にあるタイル（Windowsのロゴみたいな）を押す
3. +Newを押す
4. 新しいダッシュボードが作成されます
5. 画面左端の黄緑のバーからGraphを指定
 - ![image](https://qiita-image-store.s3.amazonaws.com/0/109466/4d1c1428-35c2-6878-19ca-32b4650527f0.png)
6. enjoy! :)
7. ダッシュボード作ったら、保存するのを忘れずに！

[Google検索](https://www.google.co.jp/search?q=grafana%20graph%20%E8%A8%AD%E5%AE%9A&rct=j)すると詳しい記事出てくるのでここでは言及しません

# 使ってみてわかったこと

- これまではMuninのグラフがお気に入りだったが乗り換えられるレベルで見やすい
- 自分の思い通りに作りたいグラフが作れて◎◎◎
- Muninはグラフが丸められたりしてアレだったけど、grafanaはそんなことはない
- 異なるサーバーのグラフを重ねて表示することももちろん可能（他の開発者からの要望があった）
- スナップショット機能で、「数日前に負荷が上がった時のグラフを他人に共有する」といったことも可能

# 結論：docker最高

- 会社で監視ツールとしてzabbix入れていたけど、グラフがイマイチであんまり見てなかった
- 自分のPCに入れて自分だけのグラフなんて素敵すぎる
- zabbixをデータソースにしてしまう、こんな使い方があったとは・・・
FlywayのサンプルをSQLiteでやってみる

FlywayはJDBCを使ったデータベースマイグレーションツール。FlywayのページにはH2+Gradleのサンプルが書いてあるがSQLiteでやってみた。

```build.gradle
apply plugin: 'java'
apply plugin: "org.flywaydb.flyway"

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath group: "org.flywaydb", name: "flyway-gradle-plugin", version: "4.0.3"
        classpath group: 'org.xerial', name: 'sqlite-jdbc', version: '3.8.11.2'
    }
}

repositories {
    mavenCentral()
}

flyway {
    url = "jdbc:sqlite:./target/sample.db"
}
```

flywayのpluginを導入するがpluginの定義に注意。Flywayのサイトにはplugins{}を使ってあるがエラーが発生した。原因を調べるのも面倒なのでGradleのドキュメントに説明してある方法でpluginを定義してある。

次にmigrationのSQLのファイルを作成する。

```src/main/resources/db/migration/V1__Create_person_table.sql
create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);
```

このあとにmigrationを実行する。

```
$ gradle flywayMigrate 
```

テーブルの作成を確認する。

```
$ sqlite3 target/sample.db '.schema PERSON'
CREATE TABLE PERSON (
    ID int not null,
    NAME varchar(100) not null
);
```

次にデータを挿入するファイルを作成する。

```main/resources/db/migration/V2__Add_people.sql
create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);
```

このあと同様にmigrationを実行する。

```
$ gradle flywayMigrate 
```

テーブルの中身を確認する。

```
$ sqlite3 target/sample.db 'select * from person'
1|Axel
2|Mr. Foo
3|Ms. Bar
```

基本的に何も変わらない。H2をごちゃごちゃするよりSQLiteのほうが楽だったので試してみた。

# 参考
* https://flywaydb.org/getstarted/firststeps/gradle
Qiitaで自分用の覚書を作ろうと思い立った

#Qiitaで自分用の覚書を作ろうと思い立った
##思い立ったきっかけ
- 何回も同じことを調べることがある
- 自分で作った物に関してまとめていない
- Qiitaでお世話になる記事が多いので、少しでも貢献になればという気持ち
Observable#createは今後使わないほうがいいかもしれない


若干の釣り気味ですが、RxJavaを利用されている方には結構重要そうだよな−と思う話題だったのでQiitaにまとめました。

### ことのはじまり

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Check out the new fromAsync() operator for adapting callback-based sources into Observables. Stop using create()! <a href="https://t.co/3SvYMmgeWx">https://t.co/3SvYMmgeWx</a></p>&mdash; Jake Wharton (@JakeWharton) <a href="https://twitter.com/JakeWharton/status/752162360916258816">2016年7月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なんだかJakeが過激なこと言ってる気配があったので、背景を調べるために少しissueを漁り始めました。

きっかけのissue
https://github.com/ReactiveX/RxJava/issues/4177

すごく雑に3行でまとめると、

* 非Rxの世界の非同期処理をラップするのに`Observable#create`使うよね
* でもback-puressureまでちゃんと考慮して実装するのクソ難しいよね(僕も多くの失敗から学んでやっと正しい実装をやっと理解したよ)
* みんなも間違った実装しがちだから、非同期処理をラップしやすいインターフェースあったほうがよくないかな？

という提案です。もう少しだけ文脈を補足すると、前提となっているのはn個のitemをemitするようなObservableについてです。Http通信のやり取りなどrx.Singleで事足りる場合は今回の議論の対象ではなさそうですね。

### どうなったの？

2016/07/12地点で最新のver 1.1.7において、[`Observablue#fromAsync`](https://github.com/ReactiveX/RxJava/pull/4179)が追加されました。
インターフェースは`Observable#create`を使う場合とほとんど一緒ですが、第二引数にBackpressureModeというものを明示的に指定する必要があって、itemを貯めておきたいのか、最新だけ保持したいのかなど決めることが出来ます。ユースケースは様々だと思いますが、BUFFERとLATEST辺りがよく使われそうですね。

```java
        Observable.fromAsync(new Action1<AsyncEmitter<Item>>() {
            @Override
            public void call(final AsyncEmitter<Item> emitter) {
                XyzClient.enqueue(new Callback<List<Item>>() {
                    @Override
                    public void onResponse(Response<Item> response) {
                        emitter.onNext(response.body);
                    }
                    @Override
                    public void onFailure(Call<List<Item>> call, Throwable t) {
                        emitter.onError(t);
                    }
                });

            }
        }, AsyncEmitter.BackpressureMode.BUFFER);
```        

私は普段Promise的な使い方しかほとんど利用しないので、なるほどという気持ちもありつつ、あまりピンときていません。ただ今後`Observable#create`を敢えて利用するメリットも特になさそうなので、`Observablue#fromAsync`で書いていこうという気持ちです。 正直わかってない部分もあるので、より詳しい人が詳細に解説して頂けると嬉しいです！ お待ちしています。
ES6のアロー演算子とRSpecのletについて、ネットで見かける情報の半数ぐらいが間違っている（もしくは説明不足と思える）

ES6とRSpecはまったく別物だが、Railsの開発でよく使われているものなので、一緒に書きました。

## 誤り：ES6のアロー演算子はfunctionの単なるシンタックスシュガー
「`ES6`の`アロー演算子`は`function`の単なる`シンタックスシュガー`」という説明は **誤りもしくは説明が足りない** 。
`function`は`this`を束縛しないのに対して、`アロー演算子`は`this`を束縛するので、単なるシンタックスシュガーではない。

詳しくは下記参照
* [アロー関数 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)

## 誤り：RSpecのletは遅延評価され、メモ化されて、ずっとキャッシュされている
RSpecのletは確かにメモ化されるが、　ずっとキャッシュされている **というわけではない** 。

> letはメモ化のためのヘルパーメソッド（memoized helper method）を定義するために使います。
値はキャッシュされ、同じexampleの中では何度呼ばれても同じ値（同じオブジェクト）が返ります。
しかし、exampleが異なる場合は異なるオブジェクトが返ります。


詳しくは下記参照
* [RSpecのletを使うのはどんなときか？（翻訳） - Qiita](http://qiita.com/jnchito/items/cdd9eef2ed193267c651)
Build.ioのFlowを使ってみた　その１


TechCrunchの記事「[いろんなツールを一つのワークフローへと統合するBuilt.ioのFlow、数週間の工程を数時間に短縮](http://jp.techcrunch.com/2016/07/12/20160711built-io-flow-makes-building-enterprise-integrations-easier/)」を読んで、楽しそうだったんで試してみました。

上記記事末尾のリンクからからBuilt.ioのアカウントを作成すると、30日間・7500monthly creditが付与されますので、無料で試用ができます。（2016/07/12現在）

アカウントを作成して最初にログインすると、チュートリアルビデオを見せてくれます。これをみるだけで夢が膨らみます。

メニューから`My Flows`を選択すると、”Onboarding Flow #1 template
”というのが用意されているので、これをEditしてみます。
(ここの操作の記憶が曖昧なのですが、もしかすると、自分でFlow Libraryから"BEGGINER"を選んで、”Onboarding Flow#1”を追加したかもしれません、、、、)


![image](https://qiita-image-store.s3.amazonaws.com/0/117772/79865be0-6c41-a437-fd11-531f8ca34933.png)

大体何をやるか想像できますね。これをいきなり実行したいところですが、一箇所だけ設定が必要です。

`Send Email`アクティビティのメールの送り先を設定しなければなりません。ページ上の歯車アイコンから`Flow Settings`-`PARAMETERS`とたどると、"email"パラメータの値が未設定なので、自分のメールアドレスを設定します。

設定したらとにかく実行してみましょう。

`Active`にして`TEST`をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/2ed7b0a7-f7a4-45f0-ac69-e8f61afe969d.png)

フローの矢印の色が変わり、それぞれ実行している様子が見えます。
完了したら、設定したメールアドレスにメールが来ているかを確認しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/20d2471e-0247-4e6b-4758-304e49a8bc58.png)

このようなメールが届いていました。

では、フローの中を見ていきます。

"Generate  Random Number"と書かれているJSのアイコンにカーソルを重ねるとコンテキストメニューが出てくるので、歯車をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/e864b03a-8eaf-fb76-0262-35709a60c818.png)

このようなエディタが出てきました。どうやらJavaScriptで擬似乱数を生成しているようです。

では次に、"Translate Text"と書かれたbingを開いてみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/6895bf48-223a-2a57-6d6a-f6aaba4827e3.png)

なるほど、bingに対して"I like apples."を英語からドイツ語に翻訳するように指示していますね。

次に”Send Email”を開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/d3ea9f8f-d9c8-6537-707b-600d6bba57db.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/117772/5a8080b4-03f5-274d-e753-1c23737adc1c.png)

ToやBodyにはPARAMETERや、このアクティビティの前のアクティビティの出力から値を引っ張ってこれるようです。


次に"Flow Completion Settings"![image](https://qiita-image-store.s3.amazonaws.com/0/117772/d726cc5c-adeb-d9b6-88a8-1dfac807595f.png)を開いてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/559caa05-1586-25ee-4185-857f17c152e6.png)

どうやら、終了状態によりメールを送信できるようですね。


最後に順番が逆のような気もしますが、開始のアイコン![image](https://qiita-image-store.s3.amazonaws.com/0/117772/d1c0c48b-8903-b370-29fb-50f7317dbdb7.png)
を開いてみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/117772/85dabde4-e5e9-4214-b528-605596ae8f4b.png)

今は何も設定されていませんが、多分「Gmailにこういうメールが来たらこのフローを開始する」といったことができそうです。

ここまで、全くドキュメントを見ずとも、なんとなく理解できてしまうくらいシンプル（に見えるように作りこまれた）なサービスでした。

これから、（30日間だけど）いろいろと試してみようと思います。

では。
GitBucket4.2.1新規インストールとしょうもない罠

WindowsにGitBucketの新規インストールを試みると、
悲しい所で引っかかってしまいました。
少しの間しか意義が無いですが、これを記しておきます。

■ インストールしようとしたもの
・GitBucket4.2.1(新規)
・JRE Ver8 Update91

■ 目に付いた警告文
・HTTP ERROR:503 Problem accessing /. Reason : Service Unavailable
・NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
・WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext
・org.h2.jdbc.JdbcSQLException: テーブル "VERSIONS" が見つかりません|Table "VERSIO
NS" not found; SQL statement:|SELECT VERSION FROM VERSIONS WHERE(以下略)

■ 追加で行ったこと(的外れ)
・TomCatのインストール
・環境変数 GITBUCKET_HOME の設定
・管理者権限で起動


■ 原因
![image](https://qiita-image-store.s3.amazonaws.com/0/133456/d1464955-cfd9-d506-2904-8f93fbb41e99.png)

あ、ああ、パッチみたいなもんですかコレ・・・
どこもwarファイルをサクッと取ってきてサクッと実行と書いてますし、
Download latest gitbucket.war とのことでしたので、
一番上のをサクッと取っちまいました。

■ 正解
・GitBucket4.2.0を入れる

はい、サクッと動きました。
JAVAでGET通信してXMLを読み込む方法のメモ

JAVAでXMLがあるURLからGET通信して、ノードの文字列を取得する方法のメモになります。

```java:XMLUtil.java
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLUtil {

    /*
     *GET通信してXMLを取得するメソッド
    */
    public static InputStream getXMLFromHttp() throws  Exception{
        HttpURLConnection connection = null;
    	try{
    	    // XMLの取得元URL設定
            URL url = new URL("http://www.xxx.xxx.xxx");

            // コネクションをオープン
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            // レスポンスが来た場合は処理続行
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                // InputStreamを返す
                return connection.getInputStream();
            }else{
            	Exception e = new IOException();
            	throw e;
            }

    	}catch(Exception e){
    		throw e;
    	}finally{
            if (connection != null) {
                connection.disconnect();
            }
    	}
    }
    
    /*
     *XMLからコンテンツを取得するメソッド
    */
    public static String getXMLContents(InputStream is) throws  Exception{
    	try{
    		// GET通信で取得したXMLを読み込み
    		Document document= DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
    		
    		// タグのnameからコンテンツのノードを取得
    		Element rootElement=document.getDocumentElement();
    		NodeList nodeList = rootElement.getElementsByTagName("文字列の値を取得するタグ名");
    		
    		//最初の1つめのXMLのノードの値を取得
    		Element elem = (Element)nodeList.item(0);
    		return elem.getFirstChild().getNodeValue();

    	}catch(Exception e){
    		throw e;
    	}	
    }    
}
```

## 参考URL
【3. XML文書を読む2 (2) | TECHSCORE(テックスコア)】
http://www.techscore.com/tech/Java/JavaSE/DOM/3-2/
Visual Studio Code のユーザ設定を複数PCで使いまわす（Dropbox経由）

Visual Studio Code は先月のアップデートでタブ機能、コマンドライン統合機能が追加されてより便利になりました。そんな Visual Studio ユーザ設定をDropbox経由で複数PCで共有する方法を紹介します。Windows OS を想定しています。

### おおまかな手順

1. Visual Studio Code の設定ファイルを Dropbox の適当な場所に移動します
2. Visual Studio Code の設定フォルダとして Step 1 で補完した場所へシンボリックリンクを張ります
3. 各PCで Step 2 を実行します。

### 詳しい手順

#### Step 1.

Windows にログインしているユーザ名を "Tarou" とします。
すると Visual Studio Code の設定ファイルは通常

```
C:\Users\Tarou\AppData\Roaming\Code\User
```

にあります。これをカット＆ペーストで Dropbox の設定フォルダに移動します。
Dropbox の保存先はどこでもいいですが、この記事では以下のパスだとします。

```
C:\Users\Tarou\Dropbox\settings\VSCode\User
```

#### Step 2

Step 1 で作成した Dropbox 保存フォルダにシンボリックリンクを貼ります。
コマンドプロンプトを管理者権限で起動します。 Windows 10 の場合、「スタートメニューを右クリック→コマンドプロンプト（管理者）」で起動できます。

AppData の Visual Studio Code 保存フォルダに移動し...

```bat
> cd C:\Users\Tarou\AppData\Roaming\Code
```

シンボリックリンクを貼ります。

```bat
> mklink /D User "C:\Users\Tarou\Dropbox\settings\VSCode\User"
```

![2016-07-12_23h07_00.png](https://qiita-image-store.s3.amazonaws.com/0/14284/e892a53a-28e1-df24-5462-0c0d9b9aa85b.png)

エクスプローラで上の画像になってたら成功です。

#### Step 3

今後は Visual Studio Code の設定を変更すると Dropbox のファイルが更新されるようになりますので、Dropbox アカウントを共有している別の PC で同じ手続きをすれば設定を共有できます。

### 補足

拡張機能に対して同じことをしたい場合にはユーザプロファイル直下の .vscode フォルダ（この記事例では C:\Users\Tarou\.vscode）に同じことをやればできると思います（たぶん）。
git for windows エディタをTeraPadに変更

コミットコメント入力時にVIが立ち上がりますがunixに慣れていないと戸惑いますね。

**エディタの変更方法（TeraPad)**

```
$ git config --global core.editor "'f:\tool\TeraPad\TeraPad.exe' //cu8" 
```
パスやエディターは自分の環境に合わせましょう。//cu8はUTF-8の文字コードの指定です。ご自分のエディターのオプションを確認しましょう。

**確かめてみよう**

```
git commit --amend
```
git commit --amendコマンドで直前のコミットの編集ができます。これでTeraPadが立ち上がればOKです。
git for windows 初めてのbranch

#branchとは
日本語で言えば枝。バージョンを枝分かれさせて管理します。
幹となるブランチはmasterです。

```
$ git branch
* master
```
git branchコマンドを実行すると*masterとでてきます。*は現在のブランチを示しています。

#branchを作ってみよう

**branch-aをつくる**

```
$ git checkout -b branch-a
Switched to a new branch 'branch-a'

$ git branch
* branch-a
  master
```
git checkoutコマンドでブランチの作成、切り替えができます。
-bオプションで作成と切り替えが同時にできます。
以下の操作と同じになります。

```
$git branch branch-a
$git checkout branch-a 
```

**branchの確認**

```
$ git branch
* branch-a
  master
```
branch-aができて、現在のブランチがmasterからbranch-aに移っています。

**branch-aでファイルの変更をしてコミット**

```
$ vi read.me

$ cat read.me
#Git-tutorial
branch-a

$ git add read.me

$ git commit -m "ADD branch-a"
[branch-a 3b21508] ADD branch-a
 1 file changed, 1 insertion(+), 1 deletion(-)
```
viエディタを使いましたが、なじみがない人はメモ帳でもなんでもOKです。
read.meに「branch-a」を一行追加しました。
addして、comittします。

**masterはどうなっている**

```
$ git checkout master
Switched to branch 'master'

$ cat read.me
#Git-tutorial
```
masterはどうなっているのか確認しましょう。当然ですが、「branch-a」は追加されていません。


#masterにブランチをマージ
```
$ git checkout master
Switched to branch 'master'

$ git merge --no-ff branch-a
Merge made by the 'recursive' strategy.
 read.me | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
```
branch-aの変更をmasterにマージします。--no-ffオプションにより、コメントにbranch-aをマージしたことが明記されます。これを実行するとviエディタが立ち上がりコメントの編集を求められます。よくわからない人はESCキー、:q!、ENTERキーで強制終了しましょう。

**ブランチを視覚的に確認**

```
$ git log --graph
*   commit 8f5dd5856914c611b42d383d7839ee007e54ccda
|\  Merge: 261a8f8 3b21508
| | Author: firstname lastname <your_email@example.com>
| | Date:   Mon Jul 11 22:23:11 2016 +0900
| |
| |     Merge branch 'branch-a'
| |
| * commit 3b215082832159390120f2de503f98c14dd5edc4
|/  Author: firstname lastname <your_email@example.com>
|   Date:   Mon Jul 11 22:18:51 2016 +0900
|
|       ADD branch-a
|
* commit 261a8f8b88b61ed304a0797c637d6a590fedccce
| Author: firstname lastname <your_email@example.com>
| Date:   Sat Jul 9 14:54:58 2016 +0900
|
|     my second commit
|
* commit 4833fd1ad12c674fb6d4583afb59a11193e759b4
  Author: firstname lastname <your_email@example.com>
  Date:   Sat Jul 9 12:25:18 2016 +0900

      my  first commit
```
ErgoDox Ezでスリープ時のLEDをOFFにする方法

ErgoDoxの右側上にある３つのLEDですが、デフォルトではPCのスリープ時にめっちゃギラギラ輝く仕様になっています。ちと眩しかったのでOFFにする方法を探したところ、makeのオプションで指定するだけでした。

```
make KEYMAP=... SLEEP_LED_ENABLE=no
```

簡単ですが情報共有まで。
アニメーションIKで、（やだ、あの人こっち見てる・・・）にする

Mecanimに対応したキャラクターは、アニメーションに「ある点を見る」という行動をブレンドすることが可能です。

まず、Mecanimに対応したキャラクターを用意します。
![2016-07-12_215738.png](https://qiita-image-store.s3.amazonaws.com/0/59911/37acaced-5e9a-fc0c-1c30-e5e461193125.png)

キャラクターのControllerを選択し、
![2016-07-12_220818.png](https://qiita-image-store.s3.amazonaws.com/0/59911/8d7f45ab-b486-0186-95dd-db9925e42875.png)

AnimatorウインドウでBaseLayerのIK PassをOnにします。
![2016-07-12_215018.png](https://qiita-image-store.s3.amazonaws.com/0/59911/fd1c6463-c7ca-2112-9031-c0e42672caed.png)


用意したキャラクターに、以下のスクリプトをアタッチします。

```csharp:IKLookAt.cs
using UnityEngine;
using System.Collections;

public class IKLookAt : MonoBehaviour
{
    private Animator avator;
    public Transform lookAtObj = null;

    [SerializeField, Range(0, 1)]
    private float lookAtWeight = 1.0f;
    [SerializeField, Range(0, 1)]
    private float bodyWeight = 0.4f;
    [SerializeField, Range(0, 1)]
    private float headWeight = 0.7f;
    [SerializeField, Range(0, 1)]
    private float eyesWeight = 0.5f;
    [SerializeField, Range(0, 1)]
    private float clampWeight = 0.5f;

    // Use this for initialization
    void Start()
    {
        avator = GetComponent<Animator>();
        if (lookAtObj == null)
        {
            lookAtObj = Camera.main.transform;
        }
    }

    void OnAnimatorIK(int layorIndex)
    {
        if (avator)
        {
            avator.SetLookAtWeight(lookAtWeight, bodyWeight, headWeight, eyesWeight, clampWeight);
            avator.SetLookAtPosition(lookAtObj.position);
        }
    }
}
```

（やだ、あの人こっち見てる・・・）
![2016-07-12_215837.png](https://qiita-image-store.s3.amazonaws.com/0/59911/e557dc70-9fb7-2261-f50c-b7f9a5bb6a13.png)

目、首、胴の各ブレンド率、ブレンド制限率などはパラメータで変更可能です。
![2016-07-12_221058.png](https://qiita-image-store.s3.amazonaws.com/0/59911/73fdbab7-0373-dc54-43ad-e1226a063cb3.png)
３日くらいの対策でAWS認定ソリューションアーキテクト　アソシエイトに合格したので、対策内容をまとめてみた


2016年6月、AWS認定ソリューションアーキテクト　アソシエイトに合格しました。
今後受験される方の参考になればと、自分なりの対策をまとめてみました。

## __出題範囲の推測__

AWS認定試験は試験対策本がありません。
なので、これだけやっておけばOKというものはありません。
また、規約として試験内容の公開が出来ません。
そういうこともあり、本稿のような受験記で傾向や対策を投稿されているケースが多いようです。

Qiitaだけでも「__aws ソリューションアーキテクト__」みたいなキーワードで探すとわんさか出ますね。
http://qiita.com/search?q=aws+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88

まずは、上記のような受験記をいくつか見て、重点的に勉強したほうが良さそうな範囲を絞り込みました。

__⇒実際に絞り込んだ範囲__
* `EC2, EBS, RDS, VPC, IAM, ELB, AutoScaling, Route53` 

## __勉強方法__

* [AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)

いわゆる「__BlackBeltシリーズ__」と呼ばれてる資料です。
毎週水曜日に公式のWebinerが開催されていて、そこで使用した過去分含む資料がPDFやSlideShareで公開されています。

内容は、サービス概要から細かい仕様（制限事項等）まで網羅されています。
知らないサービスを１から勉強する場合でも、または、試験対策の仕上げをする場合としても利用できるはずなので、最低限上記で絞り込んだ範囲の資料は読み込んだ方が良いです。

* __模擬試験__

Webから模擬試験が受けられます。１回2,000円です。
試験１回あたりの問題数は本試験より少ないですが、本試験と同様の形式が経験できる数少ない場ではあるので、本試験前の仕上げとして実施すると良いでしょう。

* __いかに実践を積むか__

実際に経験したことないとわかんないだろって問題がいくつか出ます。
具体的な試験内容がお伝えできないので説明しにくいのですが、つまり、サービスの仕様は理解している前提で「じゃあ○○のケースではどうやって△△を実現するの？」というような課題に応じた実現方式を回答出来る必要があります。

上述のBlackBeltのような机上の学習だけでは、課題ケース毎の対策を学ぶことが難しいので、実践で学ぶしかないと考えます。
ただ、実際問題として、実践できるかどうか（課題にどれだけ直面出来るか）は個人（会社や業務）の状況によって様々だと思います。

なお、実践するといっても、初歩のチュートリアル的にEC2とRDSでシステム構築しました！レベルだと足りないと思います。
「__では、その構成から、EC2とRDSそれぞれデータ暗号化したいんだけどどうしましょう？__」レベルが求められます。
セキュリティ的な内容は、個人のテスト使用レベルだとあまり触れられないので、事例とか探して似た構成を作ってみる等の対策はしても損はしないと思います。

## __本試験にあたってのポイント__

上述の実践のような、難しめの内容もありますが、逆に、簡単なサービス問題もあります。
試験問題１問あたりの得点配分が均等と仮定すると、いかに簡単な問題を確実に取るか　という戦法もアリだと思います。それだけで合格できるとは思いませんが・・・。

* サービス毎の特徴とユースケース
* 類似サービス（デプロイ系等）の比較

あたりを広く浅くおさえておくだけでも、正解できる問題はあるかと思います。

## __総括（宣伝）__

私は上述の試験対策を３日程度の内、空き時間（正味数時間）だけ実施して合格出来ました。

昔からインフラエンジニアとしてやってきたので、インフラ面の理解がしやすかったのはあると思いますが、
弊社（[株式会社スタイルズ](https://www.stylez.co.jp/)）がAWSに注力していることもあり、AWS案件で要件定義や設計をする事が多いので、実際に経験した内容が試験にそのまま出た　という実績面でのアドバンテージ的なものは少なからずあると思っています。

弊社では今後一層AWSに注力していく方針です。
AWS認定試験をこれから取得される方も、既に取得された方も、AWS案件にもっと触れたいのであれば、一緒に働ければ良いなと思っています。
ぜひ弊社サイトからエントリーしてください。

[株式会社スタイルズ採用サイト](https://recruit.stylez.co.jp/)

・・・露骨な宣伝記事になってしまった。
Jenkins Pluginに頼らずシェルだけでJobを構築する（github webhook編）


# 概要

githubでpushされたら、Jobを起動して、Pushの内容によって次のJobに繋げる処理をシェルで書きます。

シェルで書いておくメリットは、コマンドレベルで何をしているのかが理解できることでしょう。

# インストール

## jenkins

homebrewで入れてます。

```
$ brew update
$ brew cask install java
$ brew install jenkins
```

設定はネットで探せばすぐ出てくるので割愛。

## jq

シェルでjsonを扱うツールです。githubのpushを解析するのに利用します。

```
$ brew install jq
```

# Github

Github APIを利用するためトークンを発行します。
トークンは、[githubのページ](https://help.github.com/articles/creating-an-access-token-for-command-line-use/)を参考に作成してください。

pushをjenkinsに知らせるためgithubのWebHookで設定します。
```Add Service``` で ```Jenkins (GitHub plugin)``` を選択します。

![github-webhook.png](https://qiita-image-store.s3.amazonaws.com/0/10494/f8c52f88-5235-d9cf-e0ad-a70f062d2a8c.png "github-webhook.png")



```Jenkins hook url``` で以下のように入力して、Activeにチェックを入れておきます。

http://\<userid\>:\<password\>@\<ホスト名\>:8080/job/<JOB名>/buildWithParameters

# 想定運用

Gitでpushをしたら、ブランチごとのJobを呼び出します。
WIPなPull Requestで運用するので、featureブランチやbugfixブランチの場合は、すぐにレビューをして欲しいので、チャットに送信します。(今回はChatworkに送っています)
すべてのブランチで単体テストを動作させるJobを呼びます。

# Job

## JenkinsのGUI設定

まずは、GUI上で記述します

* ビルドのパラメータ化にチェックを入れ、以下のようにします。

![github-parameter.png](https://qiita-image-store.s3.amazonaws.com/0/10494/9250e258-4a6b-e75b-e12e-46321cf160fc.png "github-parameter.png")

* ビルドのシェルの実行を記述します。

最初のif文で、branchを削除した場合やプログラムによってpushされてきた(github-bot-userはプログラムでpushするときに利用しているユーザ)場合は無視するようにしています。
ブランチが```review``` と ```release```の場合にビルドしてFabricで転送するJobを呼びます。（[他の記事を参照](http://qiita.com/ko2ic/items/86c66766e94551d4c726)）
また、```feature.*``` や ```bugfix.*``` ブランチの場合は、チャットで知らせるようにしています。
あとは、単体テスト用のJobを呼び出しています。（他の記事を参照）



```
#!/bin/bash -l

set -eux

chatworkToken=XXXXXXXXXX

deleted=`echo $payload | jq -r '.deleted'`
author=`echo $payload | jq -r '.head_commit.author.name'`

if  [[ $deleted != "true" ]] && [[ $author != "github-bot-user" ]]; then

  GIT_BRANCH=`echo $payload | jq -r '.ref' | sed "s/refs\/heads\///"`

  if  [[ $GIT_BRANCH =~ review.* ]]; then

    curl -X POST "http://<ホスト名>:8080/job/<Fabric転送するJOB名>/buildWithParameters?server=develop&branch=${GIT_BRANCH}"

  elif [[ $GIT_BRANCH =~ release.* ]]; then

    curl -X POST "http://<ホスト名>:8080/job/<Fabric転送するJOB名>/buildWithParameters?server=staging&branch=${GIT_BRANCH}"

  elif [[ $GIT_BRANCH =~ (feature|bugfix).* ]]; then
    pusher=`echo $payload | jq -r '.pusher.name'`
    curl -X POST -H "X-ChatWorkToken: ${chatworkToken}" -d "body=${pusher}が${GIT_BRANCH}にPushしたのでレビューして。" "https://api.chatwork.com/v1/rooms/＜ルームID＞/messages"

  fi

  curl -X POST "http://<ホスト名>:8080/job/<単体テストのJOB名>/buildWithParameters?branch=${GIT_BRANCH}"

fi
```
Hubotの正規表現を可視化する

# 環境
* hubot 2.19.0
* Atom 1.8.0

# 正規表現を書いてみる
``` nekobot.coffee
# scripts/nekobot.coffee
#Commands:
#  msg - Return a message msg
#
module.exports = (robot) ->
 robot.hear /(.*)$/i, (msg) ->
        room = msg.envelope.room
        text = msg.message.text
        text_en = encodeURIComponent text
        if room == "test"
          msg.send room, "#{text} "
```

前回書いたとりあえず全てに反応する`robot.hear /(.*)$/i, (msg) ->`くらいなら可視化しなくても問題はない。。。
しかし皆がSlackでふざけすぎた結果がコレだ

``` nekobot.coffee
# scripts/nekobot.coffee
#Commands:
# しいたけ - Return a message しいたけ一人前追加でーす。はいよろこんでー
#
module.exports = (robot) ->
  robot.hear /(shiitake|([C椎]|[しシ]\s*([いイぃィー]))\s*([たタ]\s*[けケ]|茸)|Shiitake\s*mushrooms|เห็ดหอม)/i, (msg) ->
      room = msg.envelope.room
      if room == "Shell"
        text = msg.match[1]
        msg.send  "#{text}一人前追加でーす。はいよろこんでー"

```

「しいたけ」だけに反応する要求が、次第に英語やらタイ語まで。。。
ぱっとみだと何の発言に対して反応するのかがわかりにくい

# 本題 正規表現見える化する
Atomにちょうどいいpackageがあった。それが`regex-railroad-diagram`だ
さっそくinstallして使ってみる
[regex-railroad-diagramはこちらから](https://atom.io/packages/regex-railroad-diagram)

正規表現で記載している行にカーソルを持って行くとこのように表示される
![SS.png](https://qiita-image-store.s3.amazonaws.com/0/128306/22c7a2f3-fc65-9381-702f-59df2abba173.png)

文字だけで書かれているよりわかりやすい！

ちゃんと動くかローカルでテストしてみる。
※ローカルで動かすときは`room == "Shell"`にするとちゃんと返してくれる

```
$ bin/hubot
nekobot> [Tue Jul 12 2016 21:26:50 GMT+0900 (JST)] INFO hubot-redis-brain: Using default redis on localhost:6379

nekobot>
nekobot> siitake
nekobot> しいたけ
nekobot> しいたけ一人前追加でーす。はいよろこんでー
nekobot> shiitake
nekobot> shiitake一人前追加でーす。はいよろこんでー
nekobot> し　い　た　け
nekobot> し　い　た　け一人前追加でーす。はいよろこんでー
nekobot> シ　　いたけ
nekobot> シ　　いたけ一人前追加でーす。はいよろこんでー

```

これで、正規表現の確認も動かす前に確認できるようになるかなっと。。。
FinalIKで手を繋ごう

今回は<a href="https://www.assetstore.unity3d.com/jp/#!/content/14290" target="_blank">FinalIK</a>で手をつないでみます。

でものシーンでいうと Holding Handsのシーンです
適当にメカニムのモデルを二つ用意してみました。
アニメーションみんな同じのにしているので女の子がにまたですがご愛嬌。
今回はこのキャラを手繋がせてみようかと思います
![walk.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/86db8f4a-f34e-6a31-9714-b759e14dc703.gif)

まずは男の子、女の子のモデル両方にFull Body Biped IKをアタッチ。
メカニム対応モデルであれば自動でRefarencesのところがアタッチされるので楽チン
<img width="473" alt="スクリーンショット 2016-07-12 16.47.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/0b139aa7-c91e-2eb8-a19f-4f47d7046662.png">

Scene上の見た目はこんな感じ。女の子の方は髪揺れとかスカート揺れが入ってるのでちょっと見栄えが複雑なことになってるけど。
<img width="370" alt="スクリーンショット 2016-07-12 16.49.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/cede04ee-aa89-69df-1563-e0de4d8f7339.png">

##手の位置を固定する
まずは女の子の右手の骨と男の子の左手の骨を固定します。
Full Body Biped IKの女の子はRight Arm 男の子はLeftArmのところのweightを1を全て1にして固定。
Targetはこれから作るので今は放置
<img width="305" alt="スクリーンショット 2016-07-12 20.56.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/fb7b5608-8923-5b96-3c72-d9a69b787590.png">

この時点でこうなります
![walk3.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/140a5088-3844-efcf-75b1-c3a725d4fca1.gif)

次に指をにぎったり歩きに合わせて揺らしたりします

まずは空のゲームオブエジェクトを作ってHoldingHands.csをアタッチ。
そして、手のひらの骨を階層ごとその子に配置
handRが女の子の手のジョイント、Bone012が男の子の手のジョイントです。
おことの子は指先のジョイントがないので骨は一つ
<img width="117" alt="スクリーンショット 2016-07-12 21.02.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/66835bfc-26bf-8c56-1149-14700660aeb1.png">

そうしたら先ほどアタッチしたHoldingHandsにFullBodyBipedIKといまコピッてきた骨をアタッチ。
この骨の回転などで固定されるのでこの骨を回転させたりして握らせたりします。
<img width="311" alt="スクリーンショット 2016-07-12 21.02.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/1c28c30b-3aec-0af8-ea5f-50e9890aee61.png">

あとは、本体の方の手の骨にHandPoser.csをアタッチ。
PoseRootに先ほどコピーしたところの骨をセット
<img width="321" alt="スクリーンショット 2016-07-12 21.06.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/e5c6ac87-8761-d755-2970-925c69570d5f.png">

これで完成！
指の関節とかまげてないけど・・・w
![walk2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/8fa0e069-7332-c215-2e30-40d6394e5cfd.gif)
こんな風にしてみたり好きな感じの繋ぎ方ができます。
![walk6.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/172413a6-af6a-80c2-e532-9b664d591b99.gif)
指まで骨があれば指も固定できるので、理想の繋ぎ方を・・・お楽しみください。

こんな感じでいろいろお手軽に固定させたりできるから楽しいです
こちらデモですが、Idleのモーション一つでこんなにバラエティーに富んだアクションができるので便利便利
![walk5.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/63a96b87-6b0b-d417-daa2-d750a1318941.gif)![walk4.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/2aa371a5-a2db-f689-6ec1-75da06e147df.gif)

はい、ここまで。
平面直角座標系とEPSG 

[平面直角座標系（平成十四年国土交通省告示第九号）](http://www.gsi.go.jp/LAW/heimencho.html) と[EPSG Geodetic Parameter Registry](http://www.epsg-registry.org/)の内容をくっつけたもの。


||EPSG     |旧EPSG     |系番号|EPSG名称<br>適用区域|
|---:|---------|---------|------|--------|
|1|EPSG:6669|EPSG:2443|I     |Japan Plane Rectangular CS I<br>長崎県 鹿児島県のうち北方北緯32度南方北緯27度西方東経128度18分東方東経130度を境界線とする区域内（奄美群島は東経130度13分までを含む。)にあるすべての島、小島、環礁及び岩礁|
|2|EPSG:6670|EPSG:2444|II|Japan Plane Rectangular CS II<br>福岡県 佐賀県 熊本県 大分県 宮崎県 鹿児島県（I系に規定する区域を除く。)|
|3|EPSG:6671|EPSG:2445|III|Japan Plane Rectangular CS III<br>山口県 島根県 広島県|
|4|EPSG:6672|EPSG:2446|IV|Japan Plane Rectangular CS IV<br>香川県 愛媛県 徳島県 高知県|
|5|EPSG:6673|EPSG:2447|V|Japan Plane Rectangular CS V<br>兵庫県 鳥取県 岡山県|
|6|EPSG:6674|EPSG:2448|VI|Japan Plane Rectangular CS VI<br>京都府 大阪府 福井県 滋賀県 三重県 奈良県 和歌山県|
|7|EPSG:6675|EPSG:2449|VII|Japan Plane Rectangular CS VII<br>石川県 富山県 岐阜県 愛知県|
|8|EPSG:6676|EPSG:2450|VIII|Japan Plane Rectangular CS VIII<br>新潟県 長野県 山梨県 静岡県|
|9|EPSG:6677|EPSG:2451|IX|Japan Plane Rectangular CS IX<br>東京都（XIV系、XVIII系及びXIX系に規定する区域を除く。) 福島県 栃木県 茨城県 埼玉県 千葉県 群馬県 神奈川県|
|10|EPSG:6678|EPSG:2452|X|Japan Plane Rectangular CS X<br>青森県 秋田県 山形県 岩手県 宮城県|
|11|EPSG:6679|EPSG:2453|XI|Japan Plane Rectangular CS XI<br>小樽市 函館市 伊達市 北斗市 北海道後志総合振興局の所管区域 北海道胆振総合振興局の所管区域のうち豊浦町、壮瞥町及び洞爺湖町　北海道渡島総合振興局の所管区域　北海道檜山振興局の所管区域|
|12|EPSG:6680|EPSG:2454|XII|Japan Plane Rectangular CS XII<br>北海道（XI系及びXIII系に規定する区域を除く。）|
|13|EPSG:6681|EPSG:2455|XIII|Japan Plane Rectangular CS XIII<br>北見市 帯広市 釧路市 網走市 根室市 北海道オホーツク総合振興局の所管区域のうち美幌町、津別町、斜里町、清里町、小清水町、訓子府町、置戸町、佐呂間町及び大空町　北海道十勝総合振興局の所管区域　北海道釧路総合振興局の所管区域　北海道根室振興局の所管区域|
|14|EPSG:6682|EPSG:2456|XIV|Japan Plane Rectangular CS XIV<br>東京都のうち北緯28度から南であり、かつ東経140度30分から東であり東経143度から西である区域|
|15|EPSG:6683|EPSG:2457|XV|Japan Plane Rectangular CS XV<br>沖縄県のうち東経126度から東であり、かつ東経130度から西である区域|
|16|EPSG:6684|EPSG:2458|XVI|Japan Plane Rectangular CS XVI<br>沖縄県のうち東経126度から西である区域|
|17|EPSG:6685|EPSG:2459|XVII|Japan Plane Rectangular CS XVII<br>沖縄県のうち東経130度から東である区域|
|18|EPSG:6686|EPSG:2460|XVIII|Japan Plane Rectangular CS XVIII<br>東京都のうち北緯28度から南であり、かつ東経140度30分から西である区域|
|19|EPSG:6687|EPSG:2461|XIX|Japan Plane Rectangular CS XIX<br>東京都のうち北緯28度から南であり、かつ東経143度から東である区域|
Rでローパスフィルター

#概要
Rでローパスやってみた。
#写真
![lo.png](https://qiita-image-store.s3.amazonaws.com/0/18104/6eac5abc-994f-bbf8-61b6-b6bb0db3bd8c.png)

#サンプルコード
```
par(mfrow = c(2, 1))
samplingFreq <- 1200
x <- seq(0, 0.5 * pi, 1 / samplingFreq)
length(x)
i <- (sin(2 * pi * 110 * x) + 0.5 * sin(2 * pi * 440 * x)) / 2
o <- (sin(2 * pi * 110 * x) + 0.5 * sin(2 * pi * 440 * x)) / 2

samplerate <- 1200
freq <- 300
q <- 1
omega <- 2 * pi * freq / samplerate
alpha <- sin(omega) / (2 * q)
a0 <-  1 + alpha
a1 <- -2 * cos(omega)
a2 <-  1 - alpha
b0 <- (1 - cos(omega)) / 2
b1 <-  1 - cos(omega)
b2 <- (1 - cos(omega)) / 2
in2 <- 0
in1 <- 0
out2 <- 0
out1 <- 0
for (j in seq(length(i)))
{
	o[j] <- b0 / a0 * i[j] + b1 / a0 * in1 + b2 / a0 * in2 - a1 / a0 * out1 - a2 / a0 * out2
	in2 <- in1;
	in1 <- i[j];
	out2 <- out1;
	out1 <- o[j];
}

s <- samplingFreq / 2
h <- c(seq(0, s, length.out = length(i) / 2), seq(-s, 0, length.out = length(i) / 2))
fi <- fft(i)
mi <- Mod(fi)
FFTdata0 <- cbind(h, mi)
plot(FFTdata0[1:nrow(FFTdata0) / 2, ], t = "l", pch = 20, lwd = 2, cex = 0.8, main = "110hz+440hz", xlab = "f(Hz)", ylab = "p")
fo <- fft(o)
mo <- Mod(fo)
FFTdata1 <- cbind(h, mo)
plot(FFTdata1[1:nrow(FFTdata1) / 2, ], t = "l", pch = 20, lwd = 2, cex = 0.8, main = "lowpass", xlab = "f(Hz)", ylab = "p")


```
GoogleCastでの再生レンディション(帯域)制御


## 映像の帯域指定
* 以下の Youtube の PC プレイヤーにあるように、Adaptive な映像の視聴時に動画プレイヤー側で再生時のレンディションを指定したいケースはままある

![ss_20160708_091744s.png](https://qiita-image-store.s3.amazonaws.com/0/112602/5dbd3f61-79c4-4378-fa85-5c419dab6a82.png)


## GoogleCastでの実現方法

* GoogleCast の Receiver アプリでも MPL ライブラリの機能を利用するとレンディションの選択を簡単に実現が出来る
* [MPLのガイド](https://developers.google.com/cast/docs/player) の 「Set video/audio bitrates」 に以下のような記載があるがこれだけだと少し分かり辛い

```js
host.getQualityLevel = function(streamIndex, qualityLevel) {
    if (streamIndex == videoStreamIndex && videoQualityIndex != -1) {
        return videoQualityIndex;
    } else if (streamIndex == audioStreamIndex && audioQualityIndex != -1) {
        return audioQualityIndex;
    } else {
        return qualityLevel;
    }
};
```

* streamIndex は各 Stream に割り振られた Index
    * 例) 映像→0, 音声→1, キャプション→2
* qualityLevel は各 Stream 毎のレンディション
    * 例) 720p→0, 480p→1, 360p→2, …
* MPL は定期的にこの関数を呼び出し、現在の通信状況から候補として qualityLevel を提示してくる
  * 例えば以下のように実装すると、何もハンドリングしないのと同じ結果になる

```js
host.getQualityLevel = function(streamIndex, qualityLevel) {
    return qualityLevel;
}
```
* ここで 任意の qualityLevel の Index を返却することで再生するレンディションを指定出来る
* ガイドにある例だと、映像、音声、それぞれで予めどのレンディションを返すかを videoQualityIndex, audioQualityIndex で決めておいて固定で返す実装になっている

### streamIndex と各レンディションの確認

* 再生しようとしている映像について、事前に何番目の streamIndex が映像/音声なのか、何番目の qualityLevel がどのレンディションか、を知る必要がある
* ガイドには記載されていないが、以下の onManifestReady のタイミングで取得出来る

```javascript
var host = new cast.player.api.Host({
    mediaElement: element, url: url
});
var protocol = cast.player.api.CreateDashStreamingProtocol(mediaHost); // DASHの場合
host.onManifestReady = function() {
    for (var i = 0, count = protocol.getStreamCount(); i < count; i++) {
        var streamIndex = i;
        var streamInfo = protocol.getStreamInfo(i);
        // ...
    }
};
// ...
```

* streamInfo は [StreamInfo](https://developers.google.com/cast/docs/reference/player/cast.player.api.StreamInfo) 型になっていて、Manifest をパースした結果の様々な情報が取れる
    * この情報を保持しておいて、先の getQualityLevel の判定で用いる
初心者の僕が知らなかったCakePHP2の便利機能

## 時間定義定数

地味だけど使うと便利。

```php
$seconds = 3 * DAY;
```

http://book.cakephp.org/2.0/ja/core-libraries/global-constants-and-functions.html#id4

## 配列をconditionsにぶっ込めばIN句になる

ORでつなげる必要はない。

```php
$ids = array(1, 3, 6);
$posts = $this->Post->find('all', array(
    'conditions' => array('Post.id' => $ids)
));
```

## 毎回複雑なconditionsを書くならカスタムfindを使う

「表示ステータスがオンで、在庫が0より大きく、現時点で発売日を過ぎている商品」を取得したいなど、明らかに数カ所で使い回すであろうfindの条件があったらカスタムfindで定義しておくとDRYで良い感じになる。
Paginatorでも使えるし、CakePHP2.8からはマジックメソッドにも対応して、既存のfindメソッドと比べても遜色なく使える感じ。

http://book.cakephp.org/2.0/ja/models/retrieving-your-data.html#model-custom-find

## 配列で死ぬ前にHashクラスに頼る

ややこしい配列を操作したいならHashクラス。
ぶっちゃけドキュメントを読んでも便利さがわかりにくいからいくつかサンプルコードを読んでみるのがおすすめ。

CakePHPのarray地獄をHashクラスで生きのこる
http://blog.howtelevision.co.jp/entry/2014/07/04/160309

【cakePHP】配列を組み替える便利なHashクラス
http://www.mikame.net/pr/archives/834

## Containableビヘイビアを使うならAppModelでrecursive = -1っておく

関連データが増えてくると予期せぬアソシエーション先のデータをやたらと自動で引っ張ってくるのでデフォルトは-1で運用しておいた方が安心。

## Paginatorのコロン区切りをやめるぞ

namedパラメーターのページネーションはどうしても好きになれない、そんなときはparamTypeにquerystringを指定してあげる。
見慣れたGETパラメーターでのページネーションが完成。

http://book.cakephp.org/2.0/ja/core-libraries/components/pagination.html#get
NginxのX-Forward-Forを利用して条件付きでBasic認証制御


#要件

特定IPのみBasic認証しない
その他IPのすべてはBasic認証をかける

#ELB配下ではないNginxの設定

基本的には以下の設定でうまくいくはずですが、

```nginx
server {
    #....
        location / {
            satisfy any; #下記の設定どちらか一致すればよい
            allow xxx.xxx.xxx.xxx;
            # basic認証をしないIPを追加していく
            deny all;
            auth_basic "basic authentication";
            auth_basic_user_file /xxx/.htpasswd;
        }
}
```

#ELB配下のNginx設定

AWSのELB配下にNginxを置くとELBを経由してNginxにアクセスするのでまともなリモートIPが取得できません。
ので以下のようにif文を使うことで要件を満たすことができました。


```nginx
server {

 auth_basic_user_file /xxx/.htpasswd;
 set_real_ip_from 10.0.0.0/8; # ELBのIPが複数あるのでまとめて指定
 real_ip_header  X-Forwarded-For;

 location / {
   set $allow "false";
     if ($http_x_forwarded_for ~ " ?xx\.xx\.xx\.xx$" ) { set $allow "true"; } #Basic認証かけないIP指定
     if ($http_x_forwarded_for ~ " ?xx\.xx\.xx\.xx$" ) { set $allow "true"; } #Basic認証かけないIP指定

if ($allow = "true"){
   set $auth_basic off;　#Basic認証off
}
if ($allow = "false"){
   set $auth_basic "basic authentication"; #Basic認証を使う＆文言指定
}

auth_basic $auth_basic;

  }
}

```

※注意
if文中にauth_basicを入れるとエラーになるので変数を使って処理します。



#その他(NginxでIFを使うのはまずい？）

> Nginxにおいてifは鬼門です。できるだけ使わないようにしましょう。
> ifは内部的にlocationを作って動作するため、動作が非常にわかりづらいことにトラブルの原因があります。
> 遷移をともなわない箇所（変数操作など）でifを使おうとすると、意図通りに動作しません。
> 変数操作にはmapディレクティブを使いましょう

私が見てる「Nginxポケットリファレンス」という本には上記のような文が書いてありました。
ifは鬼門ですね、、まだトラブってないですが、ifよりmapのほうがおススメのようです。





参考：
http://www.edwiget.name/2013/03/nginx-how-to-stop-requests-from-specific-ip-behind-aws-elb/
PHPで学ぶオブジェクト指向再入門


## 概要

最近オブジェクト指向でコードを書く機会が増えてきたので、改めて復習がてら書いてみます。
以前も似たような記事を投稿しましたが、また理解が変わったので。

参考書籍: 「効率的なwebアプリケーションの作り方」小川雄大

## 前提知識 - MVCとは

そもそもなぜwebアプリケーションにはMVCという考え方があるのか？
すっごい雑にwebアプリケーションを説明すれば、「サーバで何らかの処理をして、HTMLを吐き出すもの」である。

ゆえに、最終的なアウトプットがHTMLなので、如何せんロジックの処理と、HTMLで表示したい部分がごっちゃになりがちである。

特にPHPで言えば、コードの中にHTMLを書く事も出来るので余計に混同しやすい。
(私が最初の頃に書いてたコードもそんな感じでした)

### コードが混同すると何が困るのか

ぶっちゃけ、個人的に書いてる分には良いと思いますが、チームで開発し始めるとカオスの始まりです。

* どこを修正すれば良いのか分からない
* 修正したら他の所に影響出た
* ちょっと変えようと思っただけなのに、修正範囲が多すぎて辛い
* テスト書きづらく、安全性に欠ける

などなど。

### じゃあどうやって解決するのか

そこで出てきたのがMVCという考え方で、

Controller: リクエストの処理
Model: ドメインレベルのデータを扱う
View: コントローラから指示された内容の表示(別にViewがModelを参照してもOK)

と、それぞれに役割を与えてやれば、どこに何を書けば良いのかが明確になり、責任の分担が可能になります。
そして、コードが混同しないので、上記のような問題が起きにくくなります。
(MVCで書いてても、コードが混同する可能性はあるし、テストが書きづらい場合は起きます。なので `起きにくく` という表現を使ってます)


## オブジェクト指向の基本的な考え方

オブジェクト指向には、いくつか、基本的な考え方があります。
設計原則と呼ばれるものですが、あくまでも「原則」なので、必ず守れ！って訳ではなくて、
守ってると良い的なものです。

幾つか上げておきます。

* SRP - Single Responsibility Principle
  * 単一責任の法則
* OCP - the Open-Closed Principle
  * 開放 - 閉鎖原則
* LSP - the Liskov Substitution Principle
  * リスコフの置換原則
* DIP - the Dependency Inversion Principle
  * 依存関係逆転の原則
* ISP - the Interface Segregation Principle
	* インターフェイス分離の原則

詳しくはぐぐって欲しいんですが、OCPだけ説明しておきます。
これが自分の中では一番基本的な考え方かなと感じていて、
この考え方を意識するようになってから、割りと良いコードが書ける様になってきたように思います。

### OCP - Open-Closed Principleとは

これは、拡張に対しては開いていて、修正に対しては閉じていなさい。という意味で、
モジュールの`振る舞い`を拡張することが出来て、モジュールの振る舞いを変更してもコードは影響を受けないという事です。

よくわからないかと思いますので、例を。

例えば、`ログを吐く`という振る舞いをもつクラスを考えて見ます。

```
class Logger
{
    public function perform()
    {
        $this->log('Peform');
    }

    /**
     * 標準出力にメッセージ表示
     */
    private function log($message)
    {
        echo $message;
    }
}
```

簡単ですね。

じゃあ、ここで、`振る舞い`を拡張してみましょう。
例えば、このログを標準出力ではなくて、ファイルに吐き出したい。となった場合、どうなるでしょうか。
このLoggerを修正する必要があります。

```
class Logger
{
    // $outputTypeによって、ログを吐く場所を変える
    public function perform($outputType)
    {
        if ($outputType === 'file') {
            $this->logForFile('Peform');
        } else {
            $this->log('Peform');
        }
    }

    /**
     * ファイルにログを吐く
     */
    private function logForFile($message)
    {
        // ファイルにログを吐く
    }

    /**
     * 標準出力にログを吐く
     */
    private function log($message)
    {
        echo $message;
    }
}
```

雑ですが、こんな感じ。
これが、DBにログを残す、メールにログを(ryとか増えていくと、どんどんLoggerを修正しないといけないですよね。
これは「振る舞いを変えた時に、既存のコードを書き換えている」状態なので、OCP違反という事になります。
まぁ、こんな感じで処理変えていくと辛いですよね。

そこで、出てくるのがOCPの考え方で一般的にはポリモーフィズムとか言われてます。
先ほどのコードを、次のように振る舞いを委譲してみます。

```
class Logger
{
    public function perform($logger)
    {
        $logger->log('Peform');
    }
}

class EchoLogger
{
    public function log($message)
    {
        echo $message;
    }
}

$logger = new Logger();

$echoLogger = new EchoLogger();

// 標準出力にログ吐く
$logger->perform($echoLogger);
```

perfomeは、$loggerというインスタンスを受け取って、その$loggerのlogメソッドを呼び出すようにしてます。
こうすることで、ファイルやDB・メールにログを残したくなった場合、既存コードのLggerを修正することなく、`FileLogger` `DBLogger` `MailLogger` クラスを拡張するだけで、振る舞いを追加することが出来ます。

このように、既存のコードを修正することなく、モジュールの振る舞いを拡張出来るようにすることがオブジェクト指向の大原則であり、大きなメリットでもあります。
この原則をOCPと呼ぶのです。

これがわかるとオブジェクト指向の有り難みがわかってきます。
では、続きはまた次回。
【three.jsのヘルパー解説集】 ③BoundingBoxHelperの使い方


## BoundingBoxHelper
継承：THREE.Mesh
解説：オブジェクトの境界エリアを可視化してくれるヘルパーです。__大雑把なあたり判定であればこのBoxを活用するとシンプルな実装で済むのでおすすめです。__


### デモ

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/42248/85ef4dde-b156-bf14-0cd1-c2063027ba5b.gif)


- [jsdo.itで確認する。](http://jsdo.it/sawa-zen/yr8c)
- [ソースコードを確認する。](https://github.com/sawa-zen/three_js_demo/blob/master/helper/src/helper/BoundingBoxHelper.ts)　

### 実装例

```js:javascript
var hex  = 0xff0000;

var sphereMaterial = new THREE.MeshLambertMaterial( {color: 0x00ff00} );
var sphere = new THREE.Mesh( new THREE.SphereGeometry( 30, 12, 12), sphereMaterial );
scene.add( sphere );

var bbox = new THREE.BoundingBoxHelper( sphere, hex );
bbox.update();
scene.add( bbox );
```

BoundingBoxHelper(object, hex)

- object：境界を表示させたいObject3Dオブジェクト
- hex：boxのラインの色
AtomでGraphvizを使う

この記事は、Atom のパッケージ  [graphviz-preview](https://atom.io/packages/graphviz-preview) と [language-dot](https://atom.io/packages/language-dot) の使い方の説明です。

## 前置き

### Atomとは

皆さん、すでにご存知のことでしょう。
なので、省略。

[Atom](https://atom.io/)

### Graphvizとは

AT&T研究所が開発したグラフを視覚化するオープンソースのフリーソフトウェア。
Graphvizの特徴として、ノードが増えても賢くレイアウトを整えてくれます。

[Graphviz | Graphviz - Graph Visualization Software](http://www.graphviz.org/)

[Graphviz - Wikipedia](https://ja.wikipedia.org/wiki/Graphviz)

### DOT言語とは

DOT は、テキストを用いてデータ構造としてのグラフを表現するための、データ記述言語の一種。
コンピュータで処理しやすく、かつ目で見ても分かり易い、単純化された形式でグラフを記述することができます。

[The DOT Language | Graphviz - Graph Visualization Software](http://www.graphviz.org/content/dot-language)

[DOT言語 - Wikipedia](https://ja.wikipedia.org/wiki/DOT%E8%A8%80%E8%AA%9E)

### グラフ（graph）とは

ここでいうグラフとは、棒グラフや円グラフのことではありません。
ノード（頂点）群とノード間の連結関係を表すエッジ（枝）群で構成される抽象データ型の一種である。

[グラフ (データ構造) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0))

[グラフ理論 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95%E7%90%86%E8%AB%96)

箱を矢印でつないだ図形です。
ネットワーク図、フロー図、関係図などが相当します。

##前提条件

- Atomはすでにインストール済み
- Graphvizはすでにインストール済み

##なにをやりたいのか

DOTファイルのシンタックスハイライト（language-dot）
Atomからグラフの図形を書く（graphviz-preview）

個人的には、書きたい文章の関係図をつくって、整理したかったのです。

## インストール

apm install language-dot
apm install graphviz-preview

入れたらすぐに使えるようになります。

使用例
![スクリーンショット 2016-07-12 19.58.31.png](https://qiita-image-store.s3.amazonaws.com/0/26107/0c420356-49bd-79c9-d8c9-6ff31c1b7a1a.png)


## 使用感

大きなグラフを表示するのには向いていないようです。
JavaScriptでcookie処理（読み・書き・削除）

今更感ありますが、最近クッキーを扱うことが多かったのでメモ

#クッキーの基本
クッキーとはString型の文字列。
HTMLDocumentのプロパティとして実装されているので`document.cookie`でアクセスすることができる。

##書き込み
クッキーは`名前=値`の形で書き込みます。下記の場合はdata1という名前のcookieに123という値をセットしたことになります。
`document.cookie = 'data1=123';`

###エンコード
クッキーの名前や値にはセミコロン(;)、カンマ(,)、空白を含めてはいけません。encodeURIComponent()を使用しましょう。

###パラメータ
クッキーを書き込む際にいくつかの属性を設定することができます。

**path**
クッキーが有効なパス
**domain**
クッキーが有効なドメイン
**max-age**
クッキーの有効期限 (秒数で指定/設定しないとブラウザ終了時に削除)
**expires**
クッキーの有効期限 (日付で指定/設定しないとブラウザ終了時に削除)
**secure**
セキュリティの設定

##読み込み

`console.log(document.cookie)`
セミコロンで区切られた`key=value`のリストが返ってきます。

##削除
クッキーを削除するには下記の2つの方法があります。
1. 有効期限に過去の日付を入れる
2. 空の値をセットする（名前は残るので完全には消えない）


#cookie.js
MDNにクッキーを簡単に扱えjQueryに依存しないオブジェクトがありました。（[js.cookie.js](https://github.com/js-cookie/js-cookie)なんてのもあるみたいです。）
これを使えば細かいこと気にせずcookieを扱えますね。感謝感謝。
[document.cookie](https://developer.mozilla.org/ja/docs/Web/API/Document/cookie)

#参考
https://developer.mozilla.org/ja/docs/Web/API/Document/cookie
Bash  | シェルスクリプトの中に ruby をヒアドキュメントで書いて実行する

# こんな感じ

```:june.sh
ruby <<-EOM
  puts 'This is ruby!' 
EOM
```

## 結果

```
$ bash june.sh

This is ruby!
```

# Ruby にかぎらず

何でもできるね。

```:july.sh
perl <<-EOM
  print 'This is perl!!' 
EOM
```

## 結果

```
$ bash july.sh

This is perl!!
```

# 環境

- bash 3.2

# 参考

- https://itshouldbeuseful.wordpress.com/2011/11/11/run-ruby-code-from-within-a-shell-script/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
OpenCV で使えるように HICON および HBITMAP を cv::Mat に変換するためのライブラリ

# 目的および用途
プログラム(EXE)に埋め込まれたアイコンを抽出してPNG形式のバイナリイメージに変換する関数を作ったので、ついでに OpenCV で使える cv::Mat型に変換する関数も作ってみました...(もう少し詳しい解説と用途について後で書きます)

# ヘッダファイル
ライブラリのソースは [こちら(gist)](https://gist.github.com/java-sample/045145423b0ede9ab5398a478ec4cfd2) から参照してください。5つの関数がありますが、IconToBitmap() は内部で使っているもので実質4関数です。
～ToPng() という関数は HBITMAP または HICON を引数にとって、std::vector<uchar>型(バイト配列)の結果をかえします。このバイト配列をファイルに保存するとれっきとしたPNG形式の画像ファイルとなります。
～ToMat() という関数は HBITMAP または HICON を引数にとって、画像データを含んだ OpenCV の cv::Mat を返します。

```cpp:cvwin.hpp(ライブラリのヘッダファイル。関数本体は上記リンク(gist)から参照してください)
#pragma once

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <vector>
#include <windows.h>

namespace cvwin {

	HBITMAP IconToBitmap(HICON hIcon);

	std::vector<uchar> BitmapToPng(HBITMAP hBitmap);
	cv::Mat BitmapToMat(HBITMAP hBitmap);

	std::vector<uchar> IconToPng(HICON hIcon);
	cv::Mat IconToMat(HICON hIcon);

}
```

# ライブラリ関数の使い方
このサンプル(main.cpp)では、上記ヘッダファイルにある cvwin::IconToMat() 関数を呼び出しています。
プログラムの最初で、notepad.exe のアイコンを抽出して HICON型のハンドル(変数hIcon)を取得しています。
cvwin::IconToMat(hIcon) という風に呼び出すと戻り値として cv::Mat を返します。その戻り値を使って、OpenCV の関数でウィンドウを開いて画像を表示させています(OpenCV で利用可能であることを示すために)。


```cpp:main.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <windows.h>

#include "cvwin.hpp"

int main(void)
{
	HINSTANCE hInstance = ::GetModuleHandle(NULL);

	HICON hIcon = ExtractIcon(
		hInstance,                   // インスタンスのハンドル
		L"C:\\Windows\\notepad.exe", // ファイル名
		0                            // アイコンのインデックス番号
	);

	cv::Mat img = cvwin::IconToMat(hIcon);

	DestroyIcon(hIcon);

	// 結果画像表示
	cv::namedWindow("Image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::imshow("Image", img);
	cv::waitKey(0);
}
```

# 実行結果(スクリーンショット)

![2016-0712-1929.png](https://qiita-image-store.s3.amazonaws.com/0/133435/a6a1d05e-95a8-c289-7cd9-ff2ba6d35771.png)
シェルスクリプトで、CSVファイルを読み込んでSqlPlusでクエリ（削除）を実行するサンプル


# 概要
　CSVファイルを読み込み、sqlPlusを使いDELETEのクエリを流すシェルスクリプトのサンプルとなります。途中でSQLエラー（OSレベルのエラーも含め）なった場合は、すべてロールバックします。
※筆者の備忘録用としてのメモ書きでもあります。

# シェルスクリプトのサンプル
```bash:example-delete.sh
#!/bin/sh

# @(#) このスクリプトは、CSVファイルを読み込み、sqlPlusを使いクエリを実行します。

# ★★★ パラメータチェックの仕様変更はここで
checkParam()
{
  param="$1"
  if [ ${#param} -eq 10 ]; then
    return 0
  else
    return 1
  fi
}

sql=""

# ★★★ CSVファイル（list.csv）の1行の内容は、3列のカンマ区切りを想定しています。
while read line; do

    id=`echo ${line} | cut -d , -f 1`

    param1=`echo ${line} | cut -d , -f 2`
    checkParam ${param1}

    param2=`echo ${line} | cut -d , -f 3`
    checkParam ${param2}

    # ★★★ クエリの仕様変更はここで
    sql="${sql}DELETE FROM TB_HOGE1 WHERE ID=${id}\n;"

done < list.csv
(
  echo "WHENEVER SQLERROR EXIT 1 ROLLBACK;"
  echo "WHENEVER OSERROR EXIT 1 ROLLBACK;"
  echo "VARIABLE code NUMBER;"
  echo "BEGIN"
  echo ":code:=0;"
  echo -e "${sql}"
  echo "COMMIT;"
  echo "END;"
  echo "/"
  echo "EXIT:code"

) | sqlplus /nolog
echo "$?"


```
# 補足

|コマンド使用例|シェルスクリプトでの処理内容|参考URL|
|:-----------|:-----------|:-----------|
|WHENEVER SQLERROR EXIT 1 ROLLBACK|SQLでエラーとなる場合はROLLBACKし「:code」に1が設定され、sqlplusコマンドの戻り値になる|[WHENEVER SQLERROR](http://www.shift-the-oracle.com/sqlplus/command/whenever-sqlerror.html)|
|WHENEVER OSERROR EXIT 1 ROLLBACK|OSレベルでエラーとなる場合はROLLBACKし「:code」に1が設定され、sqlplusコマンドの戻り値になる|[WHENEVER OSERROR](http://www.shift-the-oracle.com/sqlplus/command/whenever-oserror.html)|