OmniAICreator/Qiita-1.07M huggingface dataset:
Quantum Chemistry - Postulates of Quantum Mechanics 2: Operators

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Postulates of Quantum Mechanics 2: Operators
https://www.youtube.com/watch?v=Kk1Gf-T2a-M&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=25

- Postulates とは何か?
  - [このビデオから](https://www.youtube.com/watch?v=ppvk2hSYcG4&index=24&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)
     - trueとして証明されていない
     - trueとして考えられている(given)
     - predictionの妥当性を見てチェックされる
- 白文字
  - 古典力学における、あらゆる観測可能なもの
     - energy, position, momentumなど
  - それは以下に特性を持つ quantum mechanical operator に対応する
     - linear
     - Hermitian
        - 後のビデオで説明
        - (補足) http://mathworld.wolfram.com/HermitianOperator.html
- 紫の式
  - Linearの意味
  - c_iとプサイiの積の総和に対するオペレータ(オー・ハット)は
  - プサイiに対するオペレータ(オー・ハット)にc_iをかけた値の総和に等しい
    - c_i : 複素数 (Cの太字 @ 工学における特殊関数 p10)
- ピンク
  - オペレータがlinearかどうか
    - xのn乗 : linear
    - n階微分 : linear
    - xでの積分: linear
      - (補足) n階積分のことを言いたいのでは?
    - square root: not linear
    - square : not linear
- オレンジ
  - Hermitianは後のビデオで登場
- 右側の表
  - 観測可能な値(黄色)
  - 表記(ピンク)
  - オペレータ(水色)
  - Total EnergyのオペレータはPotential EnergyとKinetic Energyのオペレータを足したもの
  - Total Energyの∇はここではDelと発音している
    - Del squared
      - 位置に対する2階の偏微分
  - Positionのピンクはxとr(ベクトル表記: 矢印付き)
      - rは位置ベクトルでx,y,zの成分を持つ
UISliderのツマミに画像設定

<img width="375" alt="volume.png" src="https://qiita-image-store.s3.amazonaws.com/0/23378/f6d78746-6971-ff60-4650-1f64df04eb75.png">

![volume50.png](https://qiita-image-store.s3.amazonaws.com/0/23378/486f38bc-fdfc-26ca-db25-4e5540c8d7f7.png)
volume50.png

UISliderのインスペクタペインでは設定出来ない。
コードで設定する為、Storybordに反映されません。

```swift
@IBOutlet weak var sliderVolume: UISlider!

override func viewDidLoad() {
    ：
    〜省略〜
    ：
    sliderVolume.setThumbImage(UIImage(named: "volume50.png"), forState: .Normal)
    ：
}
```
技術英語 > orbiting / rotate around y axis


@ LOE > August 8, 2003
http://www.loe.org/shows/shows.html?programID=03-P13-00032
> satellites and other spacecraft have paved a path for space exploration, <font color=red>orbiting</font> and collecting data from the far reaches of the universe.

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

http://stackoverflow.com/questions/38790724/mayavi-rotate-around-y-axis
> Mayavi: <font color=red>rotate around y axis</font>

y軸回りの回転、という時に「around」を使う。
Database Cloud ServiceのインスタンスをPSM CLIで削除してみた


# 概要
以前、PSM CLIを使って、Database Cloud Serviceのインスタンスを作成してみました。

- [Database Cloud ServiceのインスタンスをPSM CLIで作成してみた](http://qiita.com/shinyay/items/e6e0c038090039dabb18)
- [Oracle Cloudのコマンドライン・インターフェース(CLI)を使えるようにしてみた](http://qiita.com/shinyay/items/a3773b37fdbb677e52b1)

作成したので、同様に削除してみます。

# 削除手順
以下のコマンドを実施
- psm dbcs delete-service -s <Databae Cloud Serciveのインスタンス情報>
    - インスタンス情報は、作成時に指定した同様のJSONファイル

## 1.  Database Cloud Service インスタンス削除実行
```bash
$ psm dbcs delete-service -s DB12cHP
{
    "service_name":"DB12cHP",
    "version":"12.1.0.2",
    "status":"Terminating",
    "description":"DB12cHP",
    "identity_domain":"seprivatee",
    "creation_time":"Mon Aug 29 14:3:33 UTC 2016",
    "last_modified_time":"Mon Aug 29 14:3:33 UTC 2016",
    "created_by":"shinyay",
    "sm_plugin_version":"16.3.3-137",
    "backup_supported_version":"16.2.3",
    "service_uri":"https://psm.europe.oraclecloud.com:443/paas/service/dbcs/api/v1.1/instances/seprivatee/DB12cHP",
    "database_id":"0"
}
Job ID : 1949321
```
Job IDが採番されるので、この番号を使って削除状況の確認を行います。

## 2. 削除状況の確認
状況の確認には、以下コマンドを使用します。

- psm dbcs operation-status -j <Job ID>

```bash
$ psm dbcs operation-status -j 1949321
{
    "activityLogId":1038950,
    "serviceName":"DB12cHP",
    "serviceType":"dbaas",
    "identityDomain":"seprivatee",
    "serviceId":52410,
    "jobId":1949321,
    "startDate":"2016-08-31T12:24:22.959+0000",
    "endDate":"2016-08-31T12:28:15.981+0000",
    "status":"SUCCEED",
    "operationId":52410,
    "operationType":"DELETE_SERVICE",
    "summaryMessage":"DELETE_SERVICE",
    "authDomain":"seprivatee",
    "authUser":"shinyay",
    "initiatedBy":"USER",
    "messages":[
        {
            "activityDate":"2016-08-31T12:24:22.959+0000",
            "message":"Activity Submitted"
        },
        {
            "activityDate":"2016-08-31T12:24:30.678+0000",
            "message":"Activity Started"
        },
        {
            "activityDate":"2016-08-31T12:24:30.711+0000",
            "message":"Initiating Database Service Termination..."
        },
        {
            "activityDate":"2016-08-31T12:28:03.585+0000",
            "message":"Stopped all Compute resources..."
        },
        {
            "activityDate":"2016-08-31T12:28:11.641+0000",
            "message":"Removed Compute resources..."
        },
        {
            "activityDate":"2016-08-31T12:28:14.154+0000",
            "message":"Database Service record removal complete..."
        },
        {
            "activityDate":"2016-08-31T12:28:15.981+0000",
            "message":"Activity Ended"
        }
    ]
}
```
Activity Endedと表示されていれば、削除作業が終了しています。

## 3. 削除の確認
サービス一覧を表示してみます。

```bash
$ psm dbcs services
{
    "uri":"https://psm.europe.oraclecloud.com:443/paas/service/dbcs/api/v1.1/instances/seprivatee",
    "service_type":"dbaas",
    "implementation_version":"1.0",
    "services":[],
    "subscriptions":[]
}
```
何も表示されていないので、削除完了です。

# まとめ
PSM CLIでインスタンス・ライフサイクルは簡単に管理できそうです。
Java Cloud Serviceで2つのプラガブル・データベースを利用して別々のデータソースを作成してみた


# 概要
Oracle CloudのDatabase Cloud Serviceでプラガブル・データベースを追加する方法を以前投稿しました。

- [Database Cloud Serviceのインスタンスにプラガブル・データベース(PDB)を追加してみた](http://qiita.com/shinyay/items/3a0c703104d3962dbb9e)

PDB1とPDB2という名前でのプラガブル・データベースを2つ作成したので、それぞれ対するデータソースを作成します。

## Java Cloud Serviceインスタンス作成時のデータベース指定
Java Cloud Serviceのインスタンスを作成する際に、Database Cloud Serviceで作成したデータベースを指定しますが、デフォルトではメタデータ格納用のリポジトリデータベースとして使用するデータソースが作成されます。

追加で登録するデータベースはメタデータとしてではなく、一般アプリケーション利用としてのデータベースが登録されます。

同一のデータベースへの指定もできますが、メタデータとアプリケーションデータの格納先を分離したい場合には、データベースを分けてJava Cloud Serviceインスタンスを作成します。

## WebLogic Serverのメタデータ
WebLogic Serverはオラクルのミドルウェア製品（Fusion Middleware）ファミリーの中の１製品です。
多くのFusion Middleware製品はこのWebLogic Server上に構成されます。
メタデータはそれらのミドルウェア製品が使用したり、また　Oracle Application Developer Frameworkで構築されたアプリケーションが使用したりします。
そのメタデータとしての格納先として、リポジトリデータベースを用意してWebLogic Server上でデータソースを定義しています。

# 2つのデータベース構成手順
Java Cloud Serviceのインスタンス作成画面の中で2つのデータベースを設定します。

## 1. 必須スキーマの作成
必須スキーマと呼ばれている構成が、メタデータ用のデータソースを作成する対象のデータベースの指定です。

1. 作成済みのDatabase Cloud Serviceインスタンス一覧のドロップダウンリストからインスタンスを選択
2. プラガブル・データベースの名前を選択
　　デフォルト：PDB1
3. 管理者ユーザ名 /  パスワードを指定

![pdb06](https://bytebucket.org/shinyay/images-for-blog/raw/b0b80ae52a482a01a6cb1b1369734e38941864db/qiita/160908_dbcs-pdb/jcs.emea.oraclecloud.com_2016-09-06_09-05-48.png)

## 2. アプリケーション・スキーマの作成
アプリケーション・スキーマと呼ばれているのが一般アプリケーション用として設定される対象のデータベースです。

なお、作成は必須ではありません。
ここで設定しておくことで、事前に自動構成がされますが、事後に管理コンソールなどから手動でアプリケーション用のデータソースは作成可能です。

1. アプリケーション・スキーマの場合「追加」ボタンをクリック
2. データベース情報の入力ダイアログが表示
3. 作成済みのDatabase Cloud Serviceインスタンス一覧のドロップダウンリストからインスタンスを選択
4. プラガブル・データベースの名前を選択
　　デフォルト：PDB1
5. 管理者ユーザ名 /  パスワードを指定
 
![pdb07](https://bytebucket.org/shinyay/images-for-blog/raw/b0b80ae52a482a01a6cb1b1369734e38941864db/qiita/160908_dbcs-pdb/jcs.emea.oraclecloud.com_2016-09-06_09-06-11.png)

追加登録されます。
このままJava  Cloud Serviceのインスタンス作成を続け、完了させます。
![pdb08](https://bytebucket.org/shinyay/images-for-blog/raw/b0b80ae52a482a01a6cb1b1369734e38941864db/qiita/160908_dbcs-pdb/jcs.emea.oraclecloud.com_2016-09-06_09-06-30.png)

## 3. 管理コンソールから確認
Web Logic 管理コンソールでデータソースを確認してみます。

DB12cHP-DSというように、<DatabaseCloudServiceインスタンス名>-dsで定義されているデータソースがアプリケーション用として構成されたデータソースです。

![pdb09](https://bytebucket.org/shinyay/images-for-blog/raw/0fb8746bedcdd1afd5ef6239f6d8b085385726ab/qiita/160908_dbcs-pdb/141.144.35.91_2016-09-12_03-28-13.png)

接続情報を確認すると、アプリケーション・スキーマとして設定していた **PDB2**に対する構成となっています。

![pdb10](https://bytebucket.org/shinyay/images-for-blog/raw/0fb8746bedcdd1afd5ef6239f6d8b085385726ab/qiita/160908_dbcs-pdb/141.144.35.91_2016-09-12_03-30-05.png)

一方でそれ以外のデータソースを確認すると、以下のように必須スキーマとして設定した**PDB1**に対する構成となっています。

![pdb11](https://bytebucket.org/shinyay/images-for-blog/raw/0fb8746bedcdd1afd5ef6239f6d8b085385726ab/qiita/160908_dbcs-pdb/141.144.35.91_2016-09-12_03-30-46.png)

# まとめ
従来、WebLogic Serverのデータソースの定義を行う場合、宛先のデータベースの接続情報を控えたうえで、個別に管理コンソールから設定を行いました。またリポジトリデータベースの場合には、Oracle Fusion Middleware Repository作成ユーティリティ(RCU)を使用して作成する必要がありました。

このような構成手順を行わずにデータソース定義が行えるのは、PaaSならではのWebLogic環境だと思います。
ES2015 classメソッド内のthisを自インスタンスとして扱わせる。

JavaScriptのthisの扱いは少し注意が必要です。

参考記事: [JavaScriptの「this」は「4種類」？？](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

ES2015のclassでもそれは同じこと。
下記のように呼びだされ方で結果が変わります。

```index.js
'use strict';

class Message {
  constructor(message) {
    this.message = message;
  }
  show() {
    try {
      console.log(this.message);
    } catch (e) {
      console.error(e);
    }
  }
}

var m = new Message('Hello!');

m.show();
// Hello!

var show = m.show;
show();
// [TypeError: Cannot read property 'message' of undefined]

setTimeout(m.show, 0);
// undefined
```

thisを自インスタンスとして扱わせるには下記のような方法があります。

### bindを使用

classメソッドも所詮はfunctionなのでbindメソッドでthisを明示できます。
http://stackoverflow.com/questions/31362292/can-i-use-es6-arrow-in-class-methods

```index.js
'use strict';

class Message {
  constructor(message) {
    this.message = message;
    this.show = this.show.bind(this);
  }
  show() {
    try {
      console.log(this.message);
    } catch (e) {
      console.error(e);
    }
  }
}

var m = new Message('Hello!');

m.show();
// Hello!

var show = m.show;
show();
// Hello!

setTimeout(m.show, 0);
// Hello!
```

### constructor内でarrow functionを使用

arrow functionがthisの参照先を変えないことを利用してconstructorでメソッドを定義します。

```index.js
'use strict';

class Message {
  constructor(message) {
    this.message = message;
    this.show = () => {
      try {
        console.log(this.message);
      } catch (e) {
        console.error(e);
      }
    };
  }
}

var m = new Message('Hello!');

m.show();
// Hello!

var show = m.show;
show();
// Hello!

setTimeout(m.show, 0);
// Hello!
```

### classを使う側で対処

```index.js
'use strict';

class Message {
  constructor(message) {
    this.message = message;
  }
  show() {
    try {
      console.log(this.message);
    } catch (e) {
      console.error(e);
    }
  }
}

var m = new Message('Hello!');

m.show();
// Hello!

var show = m.show.bind(m);
show();
// Hello!

setTimeout(m.show.bind(m), 0);
// Hello!

setTimeout(() => {
  m.show();
}, 0);
// Hello!
```

ソースコード: https://github.com/boushi-bird/sample-es2015-class
ubuntu 16.04でkubernetes-vagrant-coreos-clusterを使ってみる

# はじめに

3週遅れくらいのネタではありますが，いまさらkubernetesさわりたくなりました．

kubernetesを遊ぶ前に，まずkubernetesを動かせる環境を用意せねばならぬ．
クラウド礼賛の割には，あまりクラウド使わないオオカミ少年の自分．kubernetes + GCEじゃなく，ローカルにUbuntu 16.04の物理ホストを立ててkubernetes-vagrant-coreos-clusterでトライしてみることにした．

というチラシの裏．

# インストール
## Ubuntu 16.04 desktop
ぐぐれ

## Ubuntu host環境

以下をインストールする．

* git
* virtualbox
* vagrant
* nfs

### git
```
sudo apt-get install -y git
```

### virtualbox & vagrant
主にぐぐれ

とりあえず，以下からdebをダウンロードしてダブルクリックするなり，dpkgなり，gdebiでインストールすればよいはず．

* https://www.virtualbox.org/wiki/Downloads
* https://www.vagrantup.com/


aptでも入るみたいなんで，面倒なら```sudo apt-get install virtualbox vagrant```でもいいのかもしれない．自分はaptのおまけに付いてくる大量の依存ライブラリを見て恐れをなして公式からdebを落としてポチポチ手動インストールした．


### NFS
kubernetes-vagrant-coreos-clusterを何も考えずvagrant upすると以下の様なエラーが表示され，NFSが必要だということが分かる，という未来が見えたので先回りして入れておきます．

```
$ vagrant up 

...

It appears your machine doesn't support NFS, or there is not an
adapter to enable NFS on this machine for Vagrant. Please verify
that `nfsd` is installed on your machine, and try again. If you're
on Windows, NFS isn't supported. If the problem persists, please
contact Vagrant support.
```

NFSの設定方法をぐぐると，[先達が書き残したありがたい情報](https://coderwall.com/p/uaohzg/use-nfs-to-speed-up-your-vagrant)を発見したので，何も考えずターミナルにコピペ．

```
sudo apt-get install nfs-kernel-server nfs-common portmap
```

# kubernetesクラスタを作る

世界中の「k8sを触ってみる」系の記事で書かれまくっている[pires/kubernetes-vagrant-coreos-cluster](https://github.com/pires/kubernetes-vagrant-coreos-cluster)というありがたいソリューションを使わせてもらう．

## クラスタ作成
とりあえず動かしてみるなら3コマンドという脅威のお手軽さ．
vagrant upしてしばらく待てば，masterとminionが適宜設定されkubernetes readyになっているはず．

```
git clone https://github.com/pires/kubernetes-vagrant-coreos-cluster.git
cd kubernetes-vagrant-coreos-cluster
vagrant up
```

## 確認
vagrant upが正常に終了したら，kubectl叩いてクラスターが見えることを確認します．

```
$ kubectl cluster-info
Kubernetes master is running at http://172.17.8.101:8080
kube-dns is running at http://172.17.8.101:8080/api/v1/proxy/namespaces/kube-system/services/kube-dns

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

$ kubectl get nodes
NAME           STATUS    AGE
172.17.8.102   Ready     1h
172.17.8.103   Ready     1h
```

やったぜ．

## クラスタのカスタマイズ等

ノード数変えたいとか，細かい使い方はぐぐれば出てくる．お好みのページを参考に無心でコマンドをコピペしていけばよいはず．

## この先へ

そして本題のk8s自体の使い方を習得するという作業が残っている．俺たちの戦いはこれからだ！
(っていうか，簡単すぎて何が起こっているのか理解出来なかったわけだが...:scream: )

# 参考

* [kubernetesクラスタを手軽に構築して試す](http://qiita.com/kazegusuri/items/1b73257b855a963c7f06)
* [Kubernetesハンズオン準備編 ～ローカルマシンにKubernetesクラスタを構築する～](http://qiita.com/tominaga443/items/4aa8be180ef6e3481e83)
iOS10ではカメラアクセスなどの目的を明示しないと強制終了する

## エラー内容
かなり前からあったオプションではあるようですが、
対応をしていないiOS10向けのビルドで例えばカメラにアクセスする処理を走らせると以下のようなエラーメッセージがコンソール出力され、強制終了します。
※Xcode8GMでデバッグビルドした場合のことなので、もしかするとストアアップロード版ではクラッシュしない「かも」しれません。

> This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

これに関しては、エラーメッセージ内でも記述されているようにNSCameraUsageDescriptionのキーをinfo.plistに説明と一緒に記述することが必須になったということです。
[Cocoa Keys](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html)のうち、以下のような注意書きがされているキーが今回必須になるものです。

> Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and which accesses the media library, must statically declare the intent to do so. Include the NSAppleMusicUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access the media library without a corresponding purpose string, your app exits.


## 参考
以下のサイトで、基本的なことはすべて解説されてました。

[iOS 10] 各種ユーザーデータへアクセスする目的を記述することが必須になるようです
http://dev.classmethod.jp/smartphone/iphone/ios10-privacy-data-purpose-description/

## 補足
Xcodeのプロパティリストから直接追加する場合は、Cocoa Keysの表で
[Xcode name] に書かれているように、`Privacy - xxx` の形で定義されているのでそこから選択してください。
例えばカメラなら、`Privacy - Camera Usage Description` です。
Valueに書いた内容がアラートに表示されます。

<img width="584" alt="スクリーンショット 2016-09-12 2.12.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/34166/fb65b7de-cfaf-6a90-2856-790c40d5b93d.png">

![alert.jpg](https://qiita-image-store.s3.amazonaws.com/0/34166/8c90dc42-9eab-59fc-b417-2e1425d493a0.jpeg)



私はこれ、Enterpriseアプリだから大丈夫だけどストアのアプリは間に合うんだろうか・・・。


## 追加情報
コメントでいただいた情報から、PrivacyがInfo.plistに明示されていないと
ストアへのアップロードから正常に行えないようです。
これからのアプリでは気をつけていかないといけませんね。。。
AndroidStudioでカバレッジレポートを取得する

業務＋自宅作業でえらいハマったので。
以前はJaCoCoというライブラリを使っていたらしく、
設定の仕方も変わっているようなので簡単にメモ。

***※テストコードの書き方については記載しない。***


###build.gradleの設定
以下の箇所に設定を追加する。

**android_buildTypes**
buildTypesの必要な箇所に
「testCoverageEnabled true」と記載する。
初期でプロジェクトを作成した時にはreleaseしか存在しないが、
以下の例ではdebugを作成し、その中に記載している。


```
android{

　　~中略~

    buildTypes{
        debug {

            ~中略~

            testCoverageEnabled true

            ~中略~

        }
    }

　　~中略~

}

```

**dependencies**
dependenciesにテストに必要なライブラリを記述する。
$versionはあくまで例のため、
プロジェクトに必要なバージョンを正しく記載すること。

Espressoは不要だと思っていたのだが、
実際にはないと起動できなかったので必要。

```

dependencies {

　　~中略~

    testCompile "junit:junit:$dependencies"

    androidTestCompile "com.android.support.test:runner:$version"
    androidTestCompile "com.android.support.test:rules:$version"
    androidTestCompile "com.android.support:support-annotations:$version"
    androidTestCompile "com.android.support.test.espresso:espresso-core:$version"

　　~中略~

}

```

###実行
AndroidStudioの右側に「Gradle」というタブがあるため開く。
上記の設定が追加できていれば、
:app→Task→otherの中に「createDebugAndroidTestCoverageReport」と表示されているはず。
該当の項目上で右クリックし、Run　を押下する。

![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/64466/85340988-d11f-a354-853f-1447918dbe63.jpeg)



###実行結果格納箇所
プロジェクト配下の「app\build\reports」に格納されている。
「reports\coverage\debug\index.html」でグラフィカルにカバレッジ率などを確認できる。
Ergodox EZ雑感

最近Ergodox買いましたので雑感を

参考

- [Ergodox EZ を使ってみよう
](http://qiita.com/kei_s/items/40a896d1a1c70f2961e0)

# どこで買ったのか

Ergodoxはキーボードの設計のことなのでどうやってキーボードを手に入れるかというとパーツを揃えて組み立てていくのが一般的なようです。

まぁそれはひたすらめんどくさかったので以下で完成品を注文することにしました。
[Ergodox EZ](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard-computers-health#/)

今(2016/09/11)見たら約＄401,000 売り上げてるので割と売れてるのかなぁ。一つ＄320くらいなので1000個強って考えるとイマイチかも

# 買う

ログインしてフォームの記入箇所があるので書き込みます。英語で住所書いたことなかったのでちょっと怖かったですがググりながらなんとか入力
３週間くらいかかるって話だったんですが、２週間くらいで到着

![unnamed.png](https://qiita-image-store.s3.amazonaws.com/0/134294/fd101417-8e19-597c-e691-34608a1b1477.png)

keyはbrownにしました。オーソドックスみたいだったので

# キターーーーー!

![Crv-s6VUkAA04gx.jpg](https://qiita-image-store.s3.amazonaws.com/0/134294/892ae503-506a-9a0b-a5f9-395785f244a8.jpeg)

届いて最初に感じた不満としてはキーボードの間のコード短いなぁってこと。もっと両腕を広げてコーディングするイメージをしてたので少しがっかり。。。

![thumb_IMG_0425_1024.jpg](https://qiita-image-store.s3.amazonaws.com/0/134294/9f70980f-84fa-f238-a8cb-1ed95a6a572d.jpeg)


#　使ってみる

ErgoDoxEZの[ページ](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard-computers-health#/)チートシートが用意されています

![so1poghihmbvh36fsugv.png](https://c1.iggcdn.com/indiegogo-media-prod-cld/image/upload/c_limit,w_620/v1454936237/so1poghihmbvh36fsugv.png)

## Coder layer

私自身はあんまりFunction key 使わないのであんまりいらないレイヤーかなぁって思いました

## Medi & Mouse Layer

これのおかげでマウス操作が激減します。***ErgoDox使ってるとマウスに手を動かしたくなくなる***んですよ。
まぁマウス使った方が早いことも多いんですけど、頑張ればキーボードで全部完結できるのは結構気持ちがいいです

# ちなみに

MacはUSキーボードではctrl + spaceでRomaji Hiragana変換をします。これ知らなくって最初どうやって変更すればいいのかすごく悩みました。

# 配列を変更する

手順は[こちらの記事](http://qiita.com/kei_s/items/40a896d1a1c70f2961e0)がすごくわかりやすかったです。
ということでいろんな方のKEYMAPを参考に自分用のKEYMAPを作ってみました。

https://github.com/1984weed/qmk_firmware/tree/master/keyboards/ergodox/keymaps/kunihiro_osx

正直何ら工夫はないですが特徴は左右のコマンドボタンの配置とマウスレイヤーでの移動をvimに合わせたこと程度です。
karabinerの左右コマンドでの変換は絶対に適応させたかった。。。

マウスレイヤーにスクロール入れたかったんですが、それはこれから調べてからですかね。。。

# まとめ

- keymapの変更をしたら概ね快適
- セパレートはマジで最高!!
- 高いからあんまり人にはお勧めできない
- キー配列が若干違うからM, Nの入力ミスが多発する
- 肩こりへの効果とかはもっと経過観察したいところ

結論としては買ってよかったなぁっと
Angular キャッシュ対策

###  背景

キャッシュ対策を行っていなかったため、毎回ソース差し替え後にブラウザ側のキャッシュクリアが必要だった。js、cssファイルについては、ファイル名にビルド時にハッシュ値をつけるようにしていたため、対策を取れていたがhtmlファイルについては、未対応だった。

#### なぜ、htmlファイルだけ未対応だったのか。
js、cssファイルのビルド時のハッシュ値付与は、gruntのfilerevディレクティブで行っていた。filerevディレクティブはhtmlのハッシュ値付与は対応していない(厳密にはハッシュ値付与はできるが、usermin時に紐付きがうまくいかない)

### 環境
 - AngularJs1.4
 - ビルドツール(grunt)

###  解決方法
以下2点の対応を行いました。

- #### htmlファイルをjsファイルにして、filerevの対象にする。
そうすることで、ハッシュ値を付与することができるようにする。
最終的には、usminを利用して他のjsファイルとあわせて1つのファイルにしています。
htmlファイルをjsにする
→```grunt-angular-templates```を利用※
grunt-angular-templatesとは、$templateCacheサービスを利用したもの。
これを利用することで複数のhtmlファイルを１つにまとめることができる。


- #### index.htmlにキャッシュを使うかどうかは毎回確認するようmetaタグで明示的に指定
一つめの対応では、各テンプレートファイル(html)を呼びだす大元のindex.htmlだけはまとめることはできないので、これについてはmetaタグで対応を行いました。
index.htmlの`<head>`タグで以下を指定
※no-cacheは、キャッシュを取らないという意味ではなく、キャッシュを利用するか毎回Webサーバに問い合わせにいく

```
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
```


※`grunt-angular-templates`の使いかた

1. `grunt-angular-templates`を有効にする  
Gruntfile.jsに以下を追加
`grunt.loadNpmTasks('grunt-angular-templates');`
1. まとめる対象のhtmlのパスと出力先、ファイル名を定義

```Gruntfile.js
ngtemplates:
  app:
    cwd: 'app'
    src: 'templates/**.html',
    dest: '.tmp/template.js'
```
3.gruntのbuildタスク時にngtemplateを実施するよう定義

```Gruntfile.js
  grunt.registerTask('build', [
    'clean:dist',
    'wiredep',
    'useminPrepare',
    'ngtemplates',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'ngAnnotate',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'filerev',
    'usemin',
    'htmlmin'
  ]);
```

4.他のjsファイルと最終的には一つにするため(usemin)のための記載
template.jsが複数htmlを一つにまとめたものになります。

```index.html
        <!-- build:js({.tmp,app}) scripts/scripts.js -->
        <script src="scripts/app.js"></script>
        <script src=".tmp/template.js"></script>
```

5.grunt buildを実施


### 確認
Chromeのデベロッパーコンソールで、以下を確認。

- index.htmlについては、HTTPステータスコードが304(サーバ上のファイルが更新されていなかったのでキャッシュを利用)
- jsにしたhtmlファイルがリリース後は、新しく読み込まれること(キャッシュを使用しないこと）

以下記事を参考にさせていただきました。
http://qiita.com/katahirado/items/95dfc456c73fb6389e27
http://qiita.com/izumin5210/items/6489476c650c022e402a
ブックの保護を実行するマクロ

ブックを閉じる時と、Ctrl + m を実行した際に、
ブックの保護を実行する。

```vbnet

Public Const MESSAGE_OF_PASSWORD_INPUT_TITLE As String = "Input Box"
Public Const MESSAGE_OF_PASSWORD_INPUT_CONTENT As String = "Please input password"

Public Sub protectBookMain()
    Dim passPhase As String

    passPhase = InputBox(MESSAGE_OF_PASSWORD_INPUT_CONTENT, MESSAGE_OF_PASSWORD_INPUT_TITLE)
    
    If passPhase <> "" Then
        Call protectBook(passPhase)
    End If
    
End Sub

Public Sub protectBook(passPhase As String)

    Dim savePath As String
    
    Application.DisplayAlerts = False
    With ActiveWorkbook
            savePath = .Path
            saveFileName = .Name
            .SaveAs _
            Filename:=savePath & "\" & saveFileName, _
            passWord:=passPhase
    End With
    Application.DisplayAlerts = True

End Sub
``` 

以下をイベントプロシージャに登録する。

```vbnet
' ショートカットに登録
Private Sub Workbook_Open()

    ' キーバインドの設定
    Application.OnKey "^{m}", "protectBookMain"

End Sub

' ワークブックを閉じる時に実行
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call protectBookMain
End Sub

```
Arch Linux に fluentd をインストール

# はじめに
Arch Linux 上で fluentd を動かすときのメモです

# 最低限必要なもの

```bash
pacman -Sy base-devel ruby
```


# fluentd のインストール

pacman に無いので gem で入れる
systemd で管理したい場合は必ず `--no-user-install` をつける

```bash
gem install fluentd --no-ri --no-rdoc --no-user-install
```


# fluentd のセットアップ

パスの確認

```bash
which fluentd # => /usr/bin/fluentd
```

セットアップ

```bash
fluentd --setup
```

# fluentd plugin のインストール

fluentd に プラグインを入れる場合は `fluent-gem` コマンドと `--no-user-install` オプションを使用する

```bash:e.g.
fluent-gem install fluent-plugin-mongo --no-user-install
```


# fluentd を systemd で管理
```:/etc/systemd/system/fluentd.service
[Unit]
Description=Fluentd daemon

[Service]
ExecStart=/usr/bin/fluentd
Restart=always

[Install]
WantedBy=multi-user.target
```
Pandocを使って、改行が必要な箇所にスペースを2ついれる

スペースを入れなくても改行をしてくれるMarkdownもあるが、本来のMarkdownは改行をするには文末にスペース2つを入れる必要がある。
でもスペースをいれるのは面倒なので、スペースをいれないで書いて、変換が必要なときにPandocを使ってスペースを入れる。

こんな感じのコマンドでおｋ。

```bash
$ pandoc -f markdown+hard_line_breaks -t markdown_strict --wrap=none hoge.md -o hoge.md
```

このコマンドに意味は

改行を改行とする形式のMarkdown(Markdown+hard_line_breaks)で書かれたhoge.mdの内容を、自動で折り返すオプション無し(`--wrap=none`)てhoge.mdに出力する(-o)

である。

PandocではMarkdownの拡張を追加したい時に`+`で指定する。`+hard_line_breaks`は段落のすべての改行を改行として解釈する拡張。
`--wrap=node`はお好みで。

詳しい拡張については[Pandoc ユーザーズガイド 日本語版のPandocによる拡張Markdown](http://sky-y.github.io/site-pandoc-jp/users-guide/#pandocs-markdown)参照。

Vimから使うなら

```vim
:%!pandoc -f markdown+hard_line_breaks -t markdown_strict --wrap=none
```

こんな感じで。commandを定義してもよい。

```vim
command! -range=% MarkdownStrict :<line1>,<line2>!pandoc -f markdown+hard_line_breaks -t markdown_strict --wrap=none
```

範囲を指定せずに

```vim
:MarkdownStrict
```

でファイル全体を、visual modeなどで範囲指定して

```vim
:'<,'>MarkdownStrict
```

で、指定した範囲を変換する。
learning Redux from todo[3]


###Store

上面我们接触到如何定义 action 来表示发生了什么变化, 还有 **reducer** 它是如何通过不同的 action 来修改 app 的 state. 

下面我们要说的` Store` , **Store** 是什么,从字面意思看它是用来存储什么的, 对, 它就是存储 `state tree` 的. 

`Store` 有这样的作用:

- 管理app的 `state`
- 可以通过` getState()`来访问 `state`
- 通过` dispatch(action)`来修改 app 的` state`
- 通过` subscribe(listener)`来注册监听
- 处理没有注册的监听

---

再次重申: **Redux app** 的 `state` 是保持在一个单独的对象里. 当需要分割处理数据的逻辑时, 应该使用`复合 reducer`来替代多个 store.

---

如果你有 reducer,很容易来创建` store`. 上面我们使用了`combineReducer()`来组合多个 reducer, 现在我们引用它然后把它传递给` createStore()`.

```
import { createStore } from 'redux'
import todoApp from './reducers'
let store = createStore(todoApp)
```

>你可以通过传递一个可选的参数给`createStore()`来给 **app** 一个初始的状态,用来处理客户端和服务器端不同的状态(×)


```
let store = createStore(todoApp, window.STATE_FROM_SERVER)
```

###分发动作


至此, 我们已经创建了` Store`, 让我们来验证 app 是否工作,我们可以在没**UI** 的情况下测试更新逻辑:

import { addTodo, toggleTodo, setVisibilityFilter, VisibilityFilters } from './actions'

// Log the initial state
console.log(store.getState())

// Every time the state changes, log it
// Note that subscribe() returns a function for unregistering the listener
let unsubscribe = store.subscribe(() =>
  console.log(store.getState())
)

// Dispatch some actions
// 通过 store.dispatch() 方法可以模拟用户交互, 出发 action
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))

// Stop listening to state updates
unsubscribe()
```

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

> index.js

```
import { createStore } from 'redux'
import todoApp from './reducers'

let store = createStore(todoApp)
```

**接下来我们要了解 redux app 里的数据流**

 
---

index

learning Redux from todo

- [learning Redux from todo[1]](http://qiita.com/xiangzhuyuan/items/a26e97c6cac476369e37)
- [learning Redux from todo[2]](http://qiita.com/xiangzhuyuan/items/86c5c6508e8481c2dd3a)
- [learning Redux from todo[3]](http://qiita.com/xiangzhuyuan/items/9ce23a8c9f3b26c48838)
- [learning Redux from todo[4]](http://qiita.com/xiangzhuyuan/items/c082e97c3b863602fccf)
- [learning Redux from todo[5]](http://qiita.com/xiangzhuyuan/items/4e6f61a27c068b4f33e7)
【VMware@SoftLayer】Endurance/Performance File Storageの接続

#内容
VMware環境の共有ストレージとして利用可能なEndurance/Performance **File** Storageの接続方法の紹介です。

#SoftLayer側の作業
##オーダー
以下の画面からオーダーします。
<img width="1259" alt="Endurance-qiita-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/4a6317cf-b1b4-c993-5bde-ef4ab6e29fe8.png">

##情報確認と認証ホスト登録
払い出されたFile Storageの情報を確認します。
左上の「IBM01...」と
Host Name欄の「nfstok02...」はVMwareのNFSマウント時に利用するのでメモしておきます。
NFSマウントをしたいベアメタルを「Authorized Host」から登録しておきます。
![Endurance-qiita-2.png](https://qiita-image-store.s3.amazonaws.com/0/101361/181d465a-b4bd-40df-04aa-783422d872ca.png)

#VMware側の作業
「新しいデータストア」から設定をおこないます。
<img width="1273" alt="Endurance-qiita-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/84cfb386-a674-aa77-7caf-50ce26a89d04.png">

「NFSデータストアのマウント」を選択します。
<img width="951" alt="Endurance-qiita-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/5b10ac7b-5c13-3a0a-3818-8ce4cdb8241f.png">

先ほど確認したSoftLayer側の情報を入力します。
<img width="950" alt="Endurance-qiita-6.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/3294dc5a-7cf8-aff2-a87b-63db8b5fa105.png">

「完了」します。
<img width="954" alt="Endurance-qiita-8.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/dba9972c-868c-ac13-c205-f1ca0a1f980e.png">

登録されていることを確認します。
<img width="1273" alt="Endurance-qiita-9.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/2af69c8b-166c-58a6-f5a2-fdfc0ac39d4c.png">

#さいごに
SoftLayer上のVMware環境で手軽に共有ストレージをマウントさせたい場合は、**Endurance/Performance File Storage**を使うと以上のように、簡単に接続が可能です。
ぜひお試しあれ。
Xcode8になっていろいろ変わったこと

# 概要

もはや恒例行事ですが、既存のアプリをXcode8に移行した際に発生した問題をつらつらとメモっておきます。
当面、随時更新される予定。

## swift3.0

けっこう変わってますね。
まぁ、自動的にある程度置き換えてくれるのでさほど問題は出てません。
privateがfileprivateに置き換わったとか、publicが openになったとかetc...そういうのが中心。

### openURL

```swift3.0
UIApplication.shared.open(url, options: [:], completionHandler: nil)
```


```objective-c
[[UIApplication sharedApplication] openURL:url
                                       options:@{}
                             completionHandler:nil];
```

## Framework

これの変更が多分今後の更新の中心になりそうです。

### UIActivityType

UIActivityのactivityTypeがStringからUIActivityTypeに変更になりました。

```
-  override func activityType() -> String? {
-    return "XXXX"
+  override var activityType : UIActivityType {
+    return UIActivityType(rawValue: "XXXX")
   }
```

こんな感じに置き換える。
よく見ると、メソッドではなくてプロパティみたいになってますね。

### 追跡型広告の制限

仕事関係だと、今回一番影響が大きい。
オプトアウトした端末だとiOS10で広告ID(IDFA)が0を返してくるので、サードパーティ製の広告モジュール(TapJoyとか）を組み込んでいるとそれが原因でクラッシュすることも。
とはいえ、大概のメーカーで問題を認識してて対応が完了してるのでアップデートすれば、問題ない。
（問題はそのアップデートの際に、元のモジュールの世代があまりにも古くて大幅なコードの更新が必要になったりすることとかね。まめに更新にやっておかないと、他のモジュールのアップデートなんかもあったりして地獄になったりする）

### 謎

UIActivityControllerで"Add to iCloud drive"を非表示にしたいのですが、まだ方法わかってないんですよね。
Forumにも同じ質問がアップされてますが・・・
https://forums.developer.apple.com/thread/54183

今後追記していきます。
細かい変更が多い印象です。
Windowsでサイキョーの開発環境を作る


こんばんは普段はMacユーザの[vvakame](https://twitter.com/vvakame)です。
Oculus CV1で遊ぶという名目でそれなりによさげなスペックのWindowsマシンを購入したのでサイキョーの開発環境を整えようと思い、入れたものとかを書いていけば真のWindows強者兄貴らからアドバイスとかオナシャス！できると思ったのでやります。

コメントが恥ずかしければぶコメとかにオナシャス！

## わからなかった文化

brew的なやつとしてchocolateyとかあると思うんですがあれって生きてるの？
PowerShellもなんか似たような機能搭載した気がするけど使ってる人いるの？
ついでにいうとWindowsストアって使われてるの？

## アプリケーションランチャー

Macでは[Alfred](https://www.alfredapp.com/)経由でだいたいのアプリケーションを起動しているため、似たようなのがほしいところ。
@mhidaka に聞いたところ、「Windowsキーがランチャーだよ」って言われたのでなるほどと思った。
でもKobitoとかインストーラ経由で入れたわけじゃないexeが引っかかってきてくれないのはどうしたらええんじゃ…。

## コマンドプロンプト的な

@mhidaka に聞いたところ、PowerShell使ってるらしいのでとりあえずそれで。
コマンドプロンプト派 vs PowerShell派 vs MinGW派ってどんな感じなんですかね？

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">アンケート：Windowsユーザの人って普段シェル何を使ってるの？</p>&mdash; わかめ@TypeScript味 (@vvakame) <a href="https://twitter.com/vvakame/status/774960537100705793">2016年9月11日</a></blockquote>

## git

[公式](https://git-scm.com/)が使ってるのを適当に使う。
`brew update && brew upgrade` 的なのないとセキュリティフィックスが必要な時にちゃんとアップデート忘れずにできるかめっちゃ不安なんだけどみんなどうしてるのこの問題…。

## Node.js

なにはなくともNode.jsです。
Macではnodebrewをずっと愛用していましたが、Windowsでも何かしらのNode.js本体のバージョン管理マネージャがほしい。
直近1年以内の流行りをざっくりGoogle先生に聞いてみたら[nodist](https://github.com/marcelklehr/nodist)が使われてるっぽいのでのっかっておく。

## エディタ

[Visual Studio Code](https://code.visualstudio.com/)と[Atom](https://atom.io/)を入れるのは確定的に明らか。

## Docker

Windows 10 Pro買ったのでHyper-V有効にして公式のDocker for Windows入れて終わり！
と思いきや、RagnarokOnlineの後継と噂されるTree Of Saviorとかいうゲームを起動するにはチート対策か何かでHyper-V切れとか言われる。クソかよ。

## 終わり

とりあえずこれだけあれば最低限開発できる…。
GoとかGAE/Go SDKとかIntelliJ IDEAとかも入れないとあかんか。
やっぱりbrewが恋しい。
LinuxでグローバルIPアドレスを確認する方法

## 概要
Linux環境でサーバのグローバルIPアドレスを確認したいとき、curlで以下のURLを入力すると確認することができます。

## Curl コマンド

* http://inet-ip.info/

```
$ curl inet-ip.info
XXX.XXX.XXX.XXX  # グローバルIPアドレス
```

* http://httpbin.org/ip

```
$ curl http://httpbin.org/ip
{
  "origin": "XXX.XXX.XXX.XXX"  # グローバルIPアドレス
}
```

* http://globalip.me/

```
$ curl globalip.me
xxx.xxx.xxx.xxx
```
Pythonのfoliumパッケージで地図を描いてみる

foliumについての日本語のドキュメントが少なかったので、初歩的な使い方をまとめてみました。
(本文はfolium-0.2.1を対象にしています)

#foliumとは
インタラクティブな地図が作成できるLeaflet.jsというライブラリをpythonから使えるようにしたパッケージ。
#インストール
```
pip install pandas
pip install folium
```
#folium(leaflet)の簡単な使用法
1. folium.Mapで地図を作成する
2. folium.Markerなどでリズに表示するオブジェクトを生成
3. Map.add_childrenでオブジェクトを設置
4. Map.saveで地図を出力する


#簡単な地図作成の例
```
# -*- coding:utf-8 -*-
# pythonでfoliumを利用する際のサンプル

import folium

# 地図の基準として兵庫県明石市を設定
japan_location = [35, 135]

# 基準地点と初期の倍率を指定し、地図を作成する
map = folium.Map(location=japan_location, zoom_start=5)

# 基準地点にマーカーを設置するs
marker = folium.Marker(japan_location, popup='Akashi')
map.add_children(marker)

# 地図をhtml形式で出力
map.save(outfile="map.html")
```
このような地図が作成されます
![スクリーンショット 2016-09-11 22.43.29.png](https://qiita-image-store.s3.amazonaws.com/0/140192/5cfa5258-368d-1e9f-7e1e-6a2ede8277c1.png)




#備考
・folium.Mapで地図を作成する際には tiles で地図タイルを指定できます。

```
# -*- coding:utf-8 -*-
# 地図タイル指定のサンプル
import folium

# 地図の基準として兵庫県明石市を設定
japan_location = [35, 135]

# 地図タイルをStamen Terrianとして地図を作成
map = folium.Map(location=japan_location, zoom_start=5, tiles="Stamen Terrain")

# 地図をhtml形式で出力
map.save(outfile="stamen_terrain_map.html")
```
・地図に設置するオブジェクトとしては
　CircleMarker, ClickForMarker, RegularPolygonMarker
　などがデフォルトで利用できます。

#おわりに
グリグリ動かせる地図が簡単に作れるのでオススメです。ぜひ使ってみてください。

#参考
https://pypi.python.org/pypi/folium
http://www.hexacosa.net/blog/detail/147/
http://sinhrks.hatenablog.com/entry/2015/12/26/231000
サバティカらないゲーム開発改めVJ製作ブログ2日目

熱を出して寝こんでいたらあっと言う間に2、3日が過ぎてしまった！

熱にうなされつつもアイディアを考えて、なんとか「爆発＋パズル」というところまではまとまった。
まとまったのだが、ちょっとした縁があって10月末にVJ(最長なら3時間くらい)をやることになった。
正直さすがに本業＋ゲーム開発＋VJ製作＋育児を同時にこなすのは物理的に無理やろ！
というわけで、このブログは一時的に「サバティカらないVJ製作ブログ」になりました！(2日目にしてこの変わり身の速さよ…)

もちろんVJはUnityで演る。
いちおう、以前fuZeというUnityでVJ映像を作って実際にクラブでパフォーマンスするワークショップに参加したこともあるので、まあなんとかなるやろ！
Unityでやるなら、けいじろう神のリポジトリをクローンして実行するという最後の手段も使える！(ごめんなさいウソですやりますん)

とりあえず3時間という長丁場、ばしばしモチーフを切り替えていかないと飽きると思うので、まずそこらへんの仕組みを明日からUnityで仕込んでいきたい。
OrangeでPythonからAprioriを動かす


## はじめに
- AprioriのPython実装を探してるとどうやらOrangeで実装されているので試してみたときのメモ
- Orange is a component-based data mining software.

## 注意

- 新しいバージョンのOrange 3 と 古いバージョンのOrange 2（2016/9/11 時点では、Orange 2.7.8） がある

- Orange 3 にAprioriモジュールが見つからない。。[can't find associate module](https://github.com/biolab/orange3-associate/issues/4)

- ということで Orange 2 をインストールをする

## インストール

Ubuntu にインストールした例を示す

[公式サイト](http://orange.biolab.si/orange2/)よりソースファイルをダウンロードして、展開

[Python Software Foundation](https://pypi.python.org/pypi/Orange/2.7)にあるとおりビルドしてインストール

```
python setup.py build
python setup.py install
```

scipyが必要なのでなければインストールしておく

## Apriori

[アソシエーション分析](http://www.codereading.com/statistics/association-analysis.html)を参考にした

データは以下のように用意。拡張子がbasketである必要がある

```
$ more hayes-roth-train1-1.basket
a2,b2,c3,d4,D3
a3,b2,c1,d3,D1
<snip>
```

### 実行


```
>>> import Orange
>>> data = Orange.data.Table('hayes-roth-train1-1.basket')
>>> rules = Orange.associate.AssociationRulesSparseInducer(data, support=0.03, confidence=0.2, classification_rules=1, store_examples=True)
>>> print "%4s %4s %4s  %4s" % ("Supp", "Conf", "Lift", "Rule")
Supp Conf Lift  Rule
>>> for r in rules[:5]:
...     print "%4.1f %4.1f %4.1f   %s" % (r.support, r.confidence, r.lift, r)
...
 0.0  0.2  3.6   b4 -> c4
 0.0  0.3  3.6   c4 -> b4
 0.0  0.2  7.2   c4 -> b4 a1
 0.0  0.5  6.0   c4 a1 -> b4
 0.0  0.2  7.2   c4 -> b4 a1 D3
```

### Ruleを取り出す

以下のドキュメントを見て動かしてみる

[Association rules and frequent itemsets](http://orange.readthedocs.io/en/latest/reference/rst/Orange.associate.html)
[Orange.data.Instance](http://orange.readthedocs.io/en/latest/reference/rst/Orange.data.instance.html#Orange.data.Instance)
[Orange.data.Value](http://orange.readthedocs.io/en/latest/reference/rst/Orange.data.value.html#Orange.data.Value)


```
>>> len(rules)
400
>>> rules[383]
b2 a2 -> c1
>>> rules[383].left
[], {"b2":1.000, "a2":1.000}
>>> rules[383].left.get_metas(str).keys()
['a2', 'b2']
>>> rules[383].right.get_metas(str).keys()
['c1']
>>> rules[383].confidence
0.7333333492279053
>>> rules[383].support
0.07692307978868484
>>> rules[383].n_applies_both
11.0

```

### 対象がルールにマッチするか

```
>>> rule = rules[383]
>>> for d in data:
...     if rule.appliesBoth(d):
...         print d
...
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d4":1.000, "D3":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d3":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d2":1.000, "D2":1.000}
[], {"a2":1.000, "b2":1.000, "c1":1.000, "d1":1.000, "D1":1.000}

>>> rule.examples
Orange.data.Table 'table'
>>> rule.match_both
<2, 3, 5, 40, 87, 105, 111, 116, 118, 135, 137>

```

## おわりに
- 速度が出るかはこれからチェック
- scikit-learnとの違いはどこかに載っているのかな
未解決: Docker を aufs ではなく Device-mapper で使うとどうなるかディスクフルにしてみた

# なぜこれをやろうと思ったか

Docker を aufs ではなく Device-mapper で使っていて、なんだか「おかしいな」と思うことがあった。

https://docs.docker.com/engine/installation/linux/ubuntulinux/
Docker の Ubuntu でのインストール方法によると、 Prerequisites by Ubuntu Version の項に

> For Ubuntu Trusty, Wily, and Xenial, it’s recommended to install the linux-image-extra-* kernel packages. The linux-image-extra-* packages allows you use the aufs storage driver.

とある。

aufs を使うことを推奨し、そのために
`linux-image-extra-$(uname -r)` と `linux-image-extra-virtual` をインストールせよ、と記載されている。

探してみると [このような Issue もある。](https://github.com/docker/docker/issues/3182)

Device-mapper でディスクフル状態になると、 Docker イメージもコンテナも削除不能に陥ってしまい、
最終的にプロセスを止め、 Docker を完全リセットするために `sudo rm -rf /var/lib/docker` するしかなくなってしまうという症状が報告されている。

Issue の状態は Closed になっていたが、コメント欄のやりとりを見るに、なんだか状態は続いているように読めたので、実際に試してみた。

(なお、今回はユーザを docker グループに入れている。グループに入れたくない場合は、すべて sudo をつけて `sudo docker` のように実行する。)


# 再現方法

Ubuntu 14.04 で試してみた。

## インストール

```console
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo add-apt-repository "deb https://apt.dockerproject.org/repo ubuntu-$(lsb_release -s -c) main"
$ sudo apt-get update
$ sudo apt-get purge lxc-docker
$ sudo apt-get install -y docker-engine
$ sudo service docker start
```

```console
$ sudo apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual
```

これを手順から抜いたものを Device-mapper 版、抜かないものを aufs 版とした。

## コンテナの中でわざとディスクフルを引き起こす。

次のコマンドは 1G のファイルを作る。サイズはディスクフルになる量に bs と count を調整する。

```console
$ dd if=/dev/urandom of=testdata bs=64M count=16 iflag=fullblock
```

このように dd コマンドを使いデータを書き込む。 /dev/zero からコピーすると、中身がゼロ埋めされていると、賢い aufs は実際に容量を消費してくれない。
なので適度にランダムなデータを書き込むため /dev/urandom をコピー元に使った。

これを

```console
$ docker run -it ubuntu /bin/bash
```

でコンテナの中にログインし、エラーになるまで実行した。
エラーがでたらコンテナからログアウトする。

## コンテナを削除する。

その後

```console
$ docker ps
$ docker rm コンテナのID
```

を試みる。

## 結果

### aufs 版

特に問題なくコンテナは削除できた。 df から見るストレージの使用状況も 100% から元の数値に戻った。

### Device-mapper 版

次のようなエラーが出て、コンテナの削除ができない状態になった。 `docker rm -f` でも同じ。

```
Error response from daemon: Driver devicemapper failed to remove root filesystem xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: devicemapper: Error running DeleteDevice dm_task_run failed
```

いろいろと試したものの、 Issue に書かれている通り、
悔しい思いをしながら `sudo rm -rf /var/lib/docker` するぐらいしか、自分にはできることが思いつかなかった。

# まとめ (未解決)

今のところインストール手順で推奨されている通り aufs をストレージドライバに使った方がよさそうだ。
Device-mapper を使う場合は、何か追加の設定が必要なのかもしれないが、その設定方法を私には見つけることができなかった。

もし設定方法を探しだすことができれば、この記事に追記する。
あるいは、もしソフトウェア上の原因を見つけることができれば報告したいと思う。
RustのLinux/Windows/OS X向けバイナリをCIで生成する（更新版）

# はじめに
以前「[RustのLinux/Windows/OS X向けバイナリをCIで生成する](http://qiita.com/dalance/items/a0d0a3f6a82a9e2a569e)」という記事を書いたのですが半年たって情報が古くなってしまったので更新します。
また、前回記事を書いた後に気づいたのですが、[rust-everywhere](https://github.com/japaric/rust-everywhere)というのもあるようです。こちらもCIでRustのバイナリ生成するテンプレートになっていて、ARMとかもサポートしているようです。

# 変更点
前回からの変更点は以下の2点です。

- [rustup.rs](https://rustup.rs/)の使用
- muslターゲットに変更

[rustup.rs](https://rustup.rs/)は現在のRustのデフォルトのセットアップツール兼ツールチェーン管理ツールです。以前の[rustup.sh](https://github.com/rust-lang/rustup.sh)や[multirust](https://github.com/brson/multirust)は非推奨になったようなので皆さん乗り換えましょう。
[rustup.rs](https://rustup.rs/)ではクロスコンパイル用のターゲット追加が簡単にできるようになっているのでCI用のスクリプトがだいぶ簡素化されました。

muslはi686/x86_64のLinux環境で選択可能なターゲットで、libcとしてglibcを使うのではなく、[musl libc](https://www.musl-libc.org/)というライブラリを使い、staticリンクしたバイナリを生成できます。CIで生成したバイナリをそのまま配布する場合、glibcのバージョンが古い環境などで動かないことがあったのでこちらに変更しました。ただ、後述しますが、現状では問題もあるようです。

# Travis-CIによるLinux/OS X向けビルド

```travis.yml
language: rust

os:
  - linux
  - osx

env:
  - ARCH=i686
  - ARCH=x86_64

before_script:
  - curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain beta
  - export PATH=~/.cargo/bin:$PATH
  - if [[ $TRAVIS_OS_NAME == "linux" && $ARCH == "x86_64" ]]; then rustup target add x86_64-unknown-linux-musl; fi
  - if [[ $TRAVIS_OS_NAME == "linux" && $ARCH == "i686"   ]]; then rustup target add i686-unknown-linux-musl;   fi
  - if [[ $TRAVIS_OS_NAME == "osx"   && $ARCH == "i686"   ]]; then rustup target add i686-apple-darwin;         fi

script:
  - if [[ $TRAVIS_OS_NAME == "osx"   && $ARCH == "x86_64" ]]; then cargo build --release --target=x86_64-apple-darwin;       fi
  - if [[ $TRAVIS_OS_NAME == "osx"   && $ARCH == "i686"   ]]; then cargo build --release --target=i686-apple-darwin;         fi
  - if [[ $TRAVIS_OS_NAME == "linux" && $ARCH == "x86_64" ]]; then cargo build --release --target=x86_64-unknown-linux-musl; fi
  - if [[ $TRAVIS_OS_NAME == "linux" && $ARCH == "i686"   ]]; then cargo build --release --target=i686-unknown-linux-musl;   fi
```

rustupのおかげで`rustup target add`するだけで新規ターゲット追加ができます。Travis-CIのRustインストーラがrustup.rsになってくれればもっと楽なのですが。
また、現状（Rust1.11）ではTravis-CI環境でmuslターゲットのビルドは失敗するようです。Rust1.12では直るようなのでとりあえずbetaチャンネルを使っています（`--default-toolchain beta`の部分です）が、来月にはstableでビルドできるようになるかと思います。

# AppVeyorによるWindows向けビルド

```appveyor.yml
platform:
  - x64

environment:
  matrix:
    - TARGET: i686-pc-windows-msvc
    - TARGET: x86_64-pc-windows-msvc

install:
  - curl -sSf -o rustup-init.exe https://win.rustup.rs
  - rustup-init.exe -y
  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
  - if NOT "%TARGET%" == "x86_64-pc-windows-msvc" rustup target add %TARGET%

build_script:
  - cmd: cargo build --release --target=%TARGET%
```

rustup.rsはちゃんとWindowsにも対応しているのでTravis-CI側と同じようなコマンドでOKです。
AWS IoTからDynamoDBへRulesを使ってデータ投入したらPayload部がデータ変換されて焦った話

AWS IoTを通してDynamoDBへデータ投入を試みます。2015年後半に突然の仕様変更をしたみたいで、DynamoDBに保存されるパターンが変わってしまったので、メモ。

#準備
##AWS IoT側の設定
RulesでDynamoDBの方に流れるようにしておきます。

Rulesは以下の設定をしておきます。

|カテゴリ|内容|
|----|----|
|Query|SELECT * FROM '/test/#'|
|Action|<img width="429" alt="スクリーンショット 2016-09-11 21.03.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/ac8a88d9-d0a7-97e1-060f-d9765d8288e7.png">|


##DynamoDB側の設定
次の設定をしておきます。

|カテゴリ|内容|タイプ|
|----|----|----|
|プライマリパーティションキー|id|文字列|
|プライマリソートキー|timestamp|文字列|
*timestampは受信時刻用

##送付用データ
次のデータを流してみます。送付のトピックは「/test/sensor_result」

```json
{
  "sensor_id": 101,
  "temperature": 25.4,
  "humidity": 40.5,
  "timestamp": '2016-09-11T11:00:00'
}
```

#送付結果
データ送付をすると、DynamoDBにデータが投入されるのですが、こんな感じで送ったデータがpayload_rawとしてエンコードされた状態で保存されてしまっていました。これでは投入したデータを使おうとしても使えません。少し焦りました。
※ちなみにpayload_rawはBase64にエンコードされていました。

<img width="659" alt="スクリーンショット 2016-09-11 21.12.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/d884b033-8231-50d5-c58e-397a22d379b6.png">

#データ取得すれば問題はなかった
なんのことはない、Pythonなどでデータ取得した際には特に問題なく表示されました。DynamoDB側に表示モードみたいなものがあれば焦らずに済んだのに。

一応確認するためにLambdaでスクリプトを組みました。

```py
import boto3
import logging
from boto3.dynamodb.conditions import Key

logger = logging.getLogger()
logger.setLevel(logging.INFO)

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('AWSTest')

def handle_request(event, context):
    response = table.query(
        KeyConditionExpression=Key('id').eq('sensor_result')
    )
    logger.info("response: {}".format(response))
```

結果はこんな感じ。

```
[INFO]	2016-09-11T13:08:27.232Z	d3c0e7af-7820-11e6-801d-230a9d8bdc12	response: {u'Count': 4, u'Items': [{u'timestamp': u'1473595931501', u'payload_raw': Binary('{
  "sensor_id": 101,
  "temperature": 25.4,
  "humidity": 40.5,
  "timestamp": \'2016-09-11T11:00:00\'
}')
```
SQLServerでゼロサプレスする

SQLServerには先頭の0を削除する関数がないので
ストアドファンクションを作成してみました。

```sql
CREATE FUNCTION ZeroSuppress (@Target VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN

  DECLARE @Result AS VARCHAR(MAX)
  SET @Result = '' 

  DECLARE @IsNotZero AS BIT
  SET @IsNotZero = 0

  DECLARE @Counter AS INT
  SET @Counter = 0

  WHILE LEN(@Target) > @Counter
  BEGIN
    IF SUBSTRING(@Target, @Counter + 1, 1) = '0'
      BEGIN
        IF @IsNotZero = 1
          BEGIN
            SET @Result = @Result + SUBSTRING(@Target, @Counter + 1, 1)
          END
      END
    ELSE
      BEGIN
        SET @Result = @Result + SUBSTRING(@Target, @Counter + 1, 1)
        SET @IsNotZero = 1
      END

    SET @Counter = @Counter + 1
  END

  IF @Result = ''
    BEGIN
      SET @Result = '0'
    END

  RETURN @Result
END
```

これを以下のようにして実行します。

```sql
SELECT dbo.ZeroSuppress('000123') AS RESULT
```

なお、今回使用したバージョンは以下の通りです。
Microsoft SQL Server 2012 Express Edition
Qt QTableWidgetで行を入れ替える

QTableWidgetで行と行を入れ替えたいと思ったのですが、APIが用意されていませんでした。順番の入れ替えや特定行をひとつ上に移動したい場合などけっこうありそうなのになぁ。簡単ですが対処法をメモで残しておきます。言語はC++です。

```cpp
void exchangeTalbeRow(int row1, int row2)
{
        QTableWidgetItem *temp;
        for (int col = 0; col < ui.tableWidget->columnCount(); col++)
        {
                temp = ui.tableWidget->takeItem(row1, col);
                ui.tableWidget->setItem(row1, col, ui.tableWidget->takeItem(row2, col));
                ui.tableWidget->setItem(row2, col, temp);
        }
        ui.tableWidget->setCurrentCell(row2, ui.tableWidget->currentColumn());
}
```
spark(graphx)で動作する分散グラフ分析器 sotera-DGAを動作させる

# 目的

Hadoopやsparkなどの分散処理基盤でlouvain法を実行するためのソースコードをあさっていたところ、Sotera defence社のdistributed-graph-analyticsというのを見つけたので、調査します。
前回hadoop(giraph)で動かしたので、今度はspark(graphx)で動かしてみます。
https://github.com/Sotera/distributed-graph-analytics

# 概要

sotera-DGAのspark(graphx)版で、louvain法を使ってkarateクラブのデータをクラスタリングしてみます。
sparkのデータ入出力先にはhadoop(疑似分散環境)のHDFSを指定します。

# 環境
|OS/ライブラリなど|バージョン|
|:------------------|------------:|
|CentOS|	7.0|
|sotera/distributed-graph-analytics|	0.0.1|
|Java|	1.8.0_45|
|Gradle|	2.12|
|spark|   1.6.2|
|CDH|	5.0|

## 手順
### Hadoop(CDH5)とgradleのインストール
下記のとおり
http://qiita.com/k_ishi/items/6ea2d4cce090e47b374a#%E7%94%A8%E8%AA%9E

### sparkのinstall
http://qiita.com/oic0310/items/d708639b9fe4d92b6d79
を参考にしてspark-1.6.2をインストールしました。

### sparkの起動
```bash
sudo /usr/local/lib/spark/sbin/start-master.sh
sudo /usr/local/lib/spark/sbin/start-slaves.sh
```

### karateクラブのデータの生成と配置など
下記と同様です。
http://qiita.com/k_ishi/items/1586de190a877d4b2697#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%BA%96%E5%82%99

`/user/hdfs/input/karate.txt`にkarateクラブのデータを配置します。

### sparkジョブのsubmit
実行パラメータの読み込み部分にバグがあって、そのままだとCLASS NOT FOUNDとなり動作しません。
https://github.com/Sotera/distributed-graph-analytics/issues/89
用意されている起動スクリプトは、起動に必要な複数のjarファイルを一つ一つ指定しながらsubmitするようになっていますが、下記のようにライブラリを一つのjarにまとめてsubmitすると動きました。
https://github.com/ken57/distributed-graph-analytics/commit/691e287e1f041d7ab5522a3d8cfb1b74718bf353

```bash
# ビルド
cd distributed-graph-analytics
gradle fatJar
cp dga-graphx/build/libs/dga-graphx-0.1.jar /var/lib/hadoop-hdfs/

# hdfsユーザになる
sudo su - hdfs
export HADOOP_CONF_DIR=/etc/hadoop
spark-submit --executor-cores 2 --num-executors 2 --executor-memory 1G --driver-memory 1G --class com.soteradefense.dga.graphx.DGARunner --master yarn-client dga-graphx-0.1.jar louvain -i /user/hdfs/input/karate.txt -o /user/hdfs/output -s /usr/local/lib/spark -n NameGoesHere -m spark://vm-cluster:7077 --ca hdfs.url="hdfs://vm-cluster:8020/" --ca parallelism=2 --ca spark.master.url="spark://vm-cluster:7077" --ca spark.home="/usr/local/lib/spark/"
```
どうも、hadoopの疑似分散モードを使用していると、yarn-clusterモードでsparkのジョブをsubmitできないようなので、yarn-clientモードでsubmitしています。

### 実行結果

出力されるファイルの形式はこんな感じです。

```bash
(34,{community:23,communitySigmaTot:96,internalWeight:0,nodeWeight:34})
(4,{community:4,communitySigmaTot:58,internalWeight:0,nodeWeight:12})
...
(16,{community:23,communitySigmaTot:96,internalWeight:0,nodeWeight:4})
```

実行結果を図にするとこんな感じですね。
![spark_result.png](https://qiita-image-store.s3.amazonaws.com/0/85207/dd04e63a-792c-a7e1-febc-c516f93418d0.png)

実行結果は[giraphの時](http://qiita.com/k_ishi/items/1586de190a877d4b2697#%E7%B5%90%E6%9E%9C)のちょっと違った感じになっています。
モジュラリティQは0.402で、giraphのパラメータ調整後の0.419より少し低いですね。
オプションのパラメータをいじっても結果は変わりませんでした。
どうも、計算方法自体がちょっと違いそうな感じがします。。。

アルゴリズムの説明を読んだ感じ、louvain法のノードの選択とグラフの状態のアップデートを同時並行でやってるから、直列のアルゴリズムに近い結果を得ることはできても、同じ結果にはならないとのこと・・・（要調査）
https://github.com/Sotera/distributed-graph-analytics/tree/master/dga-graphx

giraphのほうにはこんなこと書いてないけど、なんか方針が違うんだろうか。。。

# まとめ
現時点ではパラメータ読み込み部分にバグがあったりするし、プロジェクトの更新もしばらく止まっているので、参考にするだけにして１から自分で書いたほうがよさそうな気がしてきます・・・.
scalaならgradleじゃなくてsbt使いたいし。
今イマ、Python3からのSelenium WebDriverでFireFox動かすならFF47にしとくといいみたい。

　きわめて小ネタですが、同じ問題に遭遇するかもしれない、どなたかの
役に立つかもしれないので、Qiitaでシェアさせてください。

## 経緯
　Python3.5からのSelenium WebDriverでFireFoxをプログラムから制御
して、いろいろやろうと思いました。たとえばサイトの自動テストを
書いたり、BeautifulSoupと組み合わせてスクレイピングしたり等です。
　ところが、[Selenium with Python](http://selenium-python.readthedocs.io/index.html)の、いちばん最初のサンプルコード、
[2.1 Simple Usage](http://selenium-python.readthedocs.io/getting-started.html#simple-usage)からしてうまくいきません。
　ちなみにFireFoxは 本稿投稿時点での最新、Version 48.0.2 を使ってました。

## 解決方法
　自分は、Seleniumをそれほど掘って調べたことはなく詳しくはありませんから、
[下手の考え休むに似たり](http://kotowaza-allguide.com/he/hetanokangae.html)にならないうちに
「もう、知ってる人に聞いたほうが早ええわ」
と判断。Stackoverflow に質問投げたら、ほぼ即レスで
**「FFをVersion47にダウングレードすると動くよ」**
というアドバイスが返ってきて、やってみたら解決しました。

　以下、自分の投げた、その質問です。

[“Can't load the profile” error occured with Selenium WebDriver by Python3.5 and FF48](http://stackoverflow.com/questions/39435532/cant-load-the-profile-error-occured-with-selenium-webdriver-by-python3-5-and)


## 雑感
やっぱ英語で質問すると解決早いわー。見てる人の数が違うもんな。