OmniAICreator/Qiita-1.07M huggingface dataset:
マルチDBクライアントdatazenitを布教してみる


仕事でMySQLやPostgreSQLを使う機会が多いのですが、両DBMSに使えるクライアントツールはないかと探していたところ[datazenit](https://datazenit.com/)というものを見つけました。
[同ブログ](https://datazenit.com/blog/2016/03/1/datazenit-official-release/)を見ると、つい最近(2016/3/1)バージョン1.0がリリースされたとのこと。
ちょっと触ってみたところなかなかいい感じですが、日本語の記事がまだまだない状況なので、期待も込めつつ紹介記事を書いてみようと思います。
今はまだお試し中(後述)であり、使い込んではいないので、その辺は差し引いて読んでください。
ちなみに同様のアプリケーションではNavicat Essentialsが有名だと思いますが、こちらは使ったことがないので機能比較はしていません。

![datazenit_1.png](https://qiita-image-store.s3.amazonaws.com/0/25588/75cba15a-080e-08bb-272c-7db4e9a4c1aa.png)

※スクショは全て[公式ページ](https://datazenit.com/)より。最新版だと若干UIが変わっている部分があります。

# ライセンス

* 個人ライセンスと商用ライセンスの2形態があります。個人ライセンスは1人でしか使えませんが、仕事に使っていいみたいです。
* 個人ライセンスは通常 ~~$129~~ のところ、今(2016/03/10現在)なら **$79** だそうです。まぁきっとそういう作戦なので焦ることはないと思いますが。価格だけみればNavicat Essentialsより安いですね。
* 2週間の無料お試し期間があります。この間、機能制限はなく全機能が使用可能です。

# 機能

* 現在、MySQLとPostgreSQLに対応していて、DBを一元管理できます。またWindows, Mac, Linuxのマルチプラットフォームです。
* UIはブラウザベースです。というかブラウザです。つまりちょっとしたカスタマイズとかはChrome extensionとかユーザースタイルシートでできるということです。
* スキーマ情報の参照＆変更ができます。
* もちろん一般的なフィルター＆ソート機能は一通り揃っていると思います。両条件は動的に複数追加できます。
* データの追加・更新・削除ができます。
* クエリを書いて実行することもできますし、クエリはお気に入りに登録もできますし、履歴から実行することもできます。
* データをCSVファイルとしてExportすることもできます。
* テーブルやデータベースを横断的にインクリメンタルサーチできます。(Macの場合だと `Cmd + Shift + k`)
* SELECT結果をそのままグラフ表示することができます。（！！！）
  * 線グラフ、棒グラフ、帯グラフ、円グラフ、散布図など9種類から選択できます。
  * X軸は任意のカラムを選択できます。
  * 項目ごとの表示/非表示も切り替えられます。
![datazenit_2.png](https://qiita-image-store.s3.amazonaws.com/0/25588/f9d7402a-c35d-18a7-e17f-1327748f82e0.png)


# インストール方法など

※ Java6以上が必要です。

* [公式ページ](https://datazenit.com/download)より自分のプラットフォームにあったアプリケーションをダウンロード
* ダウンロードしたZipファイルを解凍し、中にある `bin/datazenit` を実行。詳しくは[こちら](https://datazenit.com/guide)
* ブラウザで http://localhost:9000/ を開く
* 最初にAdminユーザを登録しないといけないので適当に登録。まずはお試しで使いたいので、ライセンスキーはブランクのまま登録。
  * ちなみに現状はパスワードリセット等の機能がなさそうなので、Adminのパスワードを忘れると詰みそう。
* 任意のDBの接続情報を入力。

# おまけ

自分はMacを使っているのですが、毎回ターミナルから起動するのが面倒だったので、以下のようなシェルをAutomatorに登録してアプリケーションとして保存しました。Spotlightあるいはダブルクリックで起動できるようになります。
ご覧のとおり突っ込みどころは多いと思いますが、とりあえずはそんな感じで^^;

```bash
count=`ps -ef | grep [d]atazenit | grep -v grep | wc -l`
# appで実行する場合は1, Automatorで実行する場合は0
if [ $count = 1 ]; then
  # ダウンロード＆解凍したディレクトリのpath
  cd /path/to/your/datazenit-1.0.0/
  rm -f ./RUNNING_PID
  ./bin/datazenit >/dev/null 2>&1 &
  # 起動が完了するまで雑に待機。実行環境によるので適当に調節。
  sleep 3s 
fi
open http://localhost:9000
```

datazenitは一度起動したら放置です。終了させるにはターミナルからkillコマンドなどで終了させなければいけません。
処理時間計測


```javascript:javascript
console.time('処理時間：');
/*
計測したい処理
*/
console.timeEnd('処理時間：');
```

```javascript:javascript
var start_ms = new Date().getTime();
/*
計測したい処理
*/
var elapsed_ms = new Date().getTime() - start_ms;

console.log('処理時間：' + elapsed_ms);
```
Appiumで自動テスト(Mac OS X)

# はじめに
自身の備忘録のようなものです。
Android / iOSの自動テスト環境を作ってサンプルを動かすところまでです。
サンプルはまだiOSでしか動かしてません。。。

# 使用環境
|      環境       |        バージョン         |
|:----------------|:------------------------:|
| OS              | Mac OS X 10.10(Yosemite) |
| Home Brew       | 0.9.5                    |
| Node.js         | 0.12.7                   |
| Android Studio  | Android Studio 1.3.1     |
| JDK             | JDK6                     |
| Xcode           | 6.4                      |

環境構築手順はこの使用環境を整えたときの手順です。

# 環境構築
1.HomeBrew(パッケージマネージャー)のインストール

```bash
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

2.node.jsをインストール

```bash
$ brew install node
```

3.Appiumをインストール

```bash
$ npm install -g appium
```

4.[Android Studio for Mac](https://developer.android.com/sdk/index.html)をダウンロードしてインストール

5.[JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html)をダウンロードしてインストール

6.Rubyパッケージをインストール

```bash
$ brew install ruby
$ brew install brew-gem
$ brew gem install rspec
$ gem install appium_lib
```

7.環境変数にパスを追加

```bash
$ RSPEC_PATH=$(find /usr/local/Cellar/rspec -name "exe"|tr "\012" ":"|sed 's/:$//g')
$ RSPEC_RUBYLIB=$(find /usr/local/Cellar/rspec -name "lib"|tr "\012" ":"|sed 's/:$//g')
$ export PATH="/Users/admin/Library/Android/sdk/tools:/Users/admin/Library/Android/sdk/platform-tools:$RSPEC_PATH:$PATH"
$ export RUBYLIB=$RUBYLIB:$RSPEC_RUBYLIB
$ export JAVA_HOME=$(/usr/libexec/java_home -v 1.6)
$ export ANDROID_HOME="/Users/admin/Library/Android/sdk/"
```
*ANDROID_HOME*環境変数はAndroid SDKのインストールパスに変更してください。[Android Studio]/[Preferences]/[Appearance Behavior]/[System Settings]/[Android SDK]の「Android SDK Location」で確認できます。
*JAVA_HOME*環境変数はJDK6を利用する場合の記載です。
JDK6以外の場合は適宜読み替えてください。

8.確認

```bash
$ appium-doctor
```
すべてチェックが入ればOKです。

# シミュレータでテスト
ここからはiOSの場合です。テストコードはRubyを使用しました。

1.テストアプリをビルド

```bash
$ cd /Application/Appium.app/Contents/Resources/node_modules/appium/sample-code/apps/TestApp
$ xcodebuild -sdk iphonesimulator8.4
```

2.Appiumを起動

```bash
$ appium &
```

3.サンプルのテストケースを実行

```bash
$ cd /Application/Appium.app/Contents/Resources/node_modules/appium/sample-code/examples/ruby
$ rspec simple_test.rb
```
これで、シミュレータ上でテストアプリが起動し、テストケースの動作を確認できます。
なお、Appiumを停止するには以下のコマンドを実行します。

```bash
$ killall -9 node
```

# 実機でテストアプリを動かす

1. テストアプリを実機用にビルド

```bash
$ cd /Application/Appium.app/Contents/Resources/node_modules/appium/sample-code/apps/TestApp
$ xcodebuild -sdk iphoneos
```

2. Appiumを起動

```bash
$ appium -U [テストする実機のUDID]
```

3.テストケースのRubyを、実機用にビルドしたアプリを使用するように変更

```ruby:simple_test.rb
#APP_PATH="../../apps/TestApp/build/release-iphonesimulator/TestApp.app"
APP_PATH="../../apps/TestApp/build/release-iphoneos/TestApp.app"
```

4.テストケースを実行

```bash
$ cd /Application/Appium.app/Contents/Resources/node_modules/appium/sample-code/examples/ruby
$ rspec simple_test.rb
```
iOS端末の[設定]アプリで、[デベロッパ]の[Enable UI Automation]が無効になっていた場合は有効にしてください。

以上です。
実行中のBrowsersyncサーバのポートやURLを取得する

[Browsersync](https://www.browsersync.io/)で立てたサーバ上でテストをする際、オプションで指定したポート番号が埋まっていると別のポートで起動し、テストが失敗することがあります。
他にも、サーバの情報、例えば外部URLを他の処理に渡したいときにも役立ちます。

```js
bs.getOption('オプション名')
```

### 例1 : bsインスタンスから情報を取得する

```js
// Browsersyncサーバの起動（すでにポート9000が埋まっているとする）
var bs = require('browser-sync').create();
bs.init({server: 'app', port: 9000});    // 実際にはポート9001で起動する

// 起動後にサーバ情報を取得
setTimeout(function () {

  // ポート番号
  console.log(bs.getOption('port'));                  // 9001

  // ローカルURL
  console.log(bs.getOption('urls').get('local'));     // http://localhost:9001

  // 外部URL
  console.log(bs.getOption('urls').get('external'));  // http://10.49.5.12:9001

}, 2000);
```

名前のとおり`.getOption()`では、他にも`proxy`, `scriptPath`など[Browsersyncの各オプション](https://www.browsersync.io/docs/options/)が取得できるようです。

### 例2 : コールバックの引数を使う

```js
// Browsersyncサーバの起動
var bs = require('browser-sync').create();

// init()のコールバックで取得
bs.init({server: 'app'}, function (instance) {
  console.log(instance.getOption('port'));
  console.log(instance.getOption('urls').get('local'));
  console.log(instance.getOption('urls').get('external'));
});

// イベントのコールバックで取得
bs.emitter.on('init', function (instance) {
  console.log(instance.getOption('port'));
  console.log(instance.getOption('urls').get('local'));
  console.log(instance.getOption('urls').get('external'));
});
```

例1と同じように取得していますが、コールバック内の`instance`は`bs`オブジェクトそのものではなく、`bs.instance`にあたるようです。どちらのオブジェクトでも`.getOption()`が使えました。

### 例3 : 外部ファイルからインスタンスを取得する

`.create()`に文字列を渡すと、Browsersyncのインスタンスは名前ベースで共有できるので、他のファイルからでも起動中のサーバ情報を取得できます。

**サーバ起動のスクリプト**

```js
// Browsersyncサーバの起動
var bs = require('browser-sync').create('test-server');
bs.init({server: 'app'});
```

**別のファイル**

```js
// "test-server"インスタンスの取得
var bs = require('browser-sync').get('test-server');

// サーバの情報取得
console.log(bs.getOption('port'));
console.log(bs.getOption('urls').get('local'));
console.log(bs.getOption('urls').get('external'));
```

### 参考
https://github.com/BrowserSync/browser-sync/blob/master/examples/callback.js

※ この記事はbrowser-sync v2.11.1で確認しています。
Java SE7 Gold 取得を目指して (9)

Java SE7 Gold をとりたい…!
===

本日は第9回目です。
Java7でいろいろと変更のあった例外についての章でした。

## 今日のこぼれ話
いろいろなプログラミング言語を操る人々を「言語+er」で読んだりしますよね。Javaer、PHPerとか。
Javaerとか字面はかっこいいんですけど、声に出すと今ひとつだなーと思っていたのですが、Javaristaなんてのがあるらしいです。
Baristaとかけているらしくかっこいいので使おうかな…? まだまだちょっと気恥ずかしいですね。

[プログラマーの通り名まとめ](http://qiita.com/yukimura1227/items/b406606704db74de9a03)

## 本日知ったこと(7章)
* try-catch
  * ↓は**コンパイルエラー**(ただ派生クラス側が処理されないだけだと思っていた)

    ```java
   public void excec() {
     try {
       someMethod();
     } catch (Exception e) {
       // 親例外クラスが先
     } catch (NullPointerException e) {
       // 派生例外クラスが後
     }
   }
    ```
  * Java7より↓のコンパイルが通る(6以前ではコンパイルエラー)

    ```java
   public void excec() throws MyException1, MyException2 {
     try {
       if (!check1()) {
         throw new MyException1();
       }
       if (!check2()) {
         throw new MyException2();
       }
     } catch (Exception e) {
       e.printStackTrace();
       throw e
     }
   }
    ```
  * Java7より派生関係のない例外を`|`で区切ってマルチキャッチが可能

    ```java
   catch(IOException | SQLException e) {
     e.printStackTrace();
     // e は final になる
   }
    ```

* try-with-resources
  * Java7より
  * 複数リソースは`;`区切り
  * リソースクラスはClosableまたはAutoClosableを実装する
  * 例外発生 → close() → catch節 → finally節 の順で呼ばれる
  * 複数リソースを取得していた場合、取得順とは**逆**に`close()`が呼ばれていく

    ```java
   try (MyResource1 res1 = new MyResource1();
         MyResource2 res2 = new MyResource2()) {
     someMethod();
     // res2.close()
     // res1.close()
   } catch (Exception e) {
   }
    ```

  * try-with-resource内とcloseの両方で例外が発生した場合closeでの例外は抑制される
  * 取得したければ `e.getSuppressed()`

* アサーション
  * アサーション有効化は `java -ea XXXX`
  * プログラム中のバグを発見する機能なのでコード上からハンドリングできないようになっている

try-with-resources、これでやっとファイルの読み書きだけでtry-catchを2度も書くようなコードとはおさらば出来るんですね…!
Detail of Test Kitchen List

```shell-session
/opt/chefdk/bin/chef exec kitchen list 2> /dev/null | awk 'NR>1{ print $1 }' | xargs -I{} sh -c 'echo "#####"; echo {}; test -f .kitchen/{}.yml && cat .kitchen/{}.yml' 
```
```shell-session
#####
slave-nexus-centos
---
hostname: 127.0.0.1
port: '2222'
username: vagrant
ssh_key: "/home/takizawatake01/.vagrant/machines/default/virtualbox/private_key"
last_action: verify
#####
nfs-mount-centos
```
ズンドコキヨシ with python / ruby / Lua

[元ネタ](https://twitter.com/kumiromilk/status/707437861881180160)
- 正直これを思いつくのがスゴい。
- fizzbuzzより少し複雑なので言語の勉強によい気がする。

# python版
## 最終コード

- 基本的なところで間違っていたので、指摘をいただきました。
- あわせて少しリファクタリングもいただきました。
 
**ズンは四回**

``` py3
def kiyoshi():
    zd=deque(list(),5)
    while ''.join(zd)!='ズンズンズンズンドコ':
        word=choice(['ズン','ドコ'])
        print(word)
        zd.append(word)
    print('キ・ヨ・シ！')
```

## 以下間違えたコード

こんな感じ?
[deque](http://docs.python.jp/3/library/collections.html?highlight=deque#collections.deque)使うとかなりシンプル。

``` py3
from collections import deque
from random import choice
def kiyoshi():
    zd=deque(list(),4)
    while True:
        if "".join(zd)=='ズンズンズンドコ':
            print("キ・ヨ・シ！")
            break
        else:
            word=choice(['ズン','ドコ'])
            print(word)
            zd.append(word)
```

##モニタリング

```py3
%matplotlib inline
import pandas as pd
def kiyoshi2():
    c=0
    zd=deque(list(),4)
    while True:
        if "".join(zd)=='ズンズンズンドコ':
            print("キ・ヨ・シ！")
            break
        else:
            word=choice(['ズン','ドコ'])
            print(word)
            zd.append(word)
            c+=1
    return c
rslts=[kiyoshi2() for i in range(10000)]
pd.DataFrame(rslts).hist(bins=30)
```

![kiyoshi.png](https://qiita-image-store.s3.amazonaws.com/0/52875/6e3a3bde-9af6-59e6-c073-8438e0e762de.png)


オリジナルのアルゴリズムは[zunカウンター](https://twitter.com/kumiromilk/status/707451885620498432)を用いている様子。

```py3
def kiyoshi_org():
    zun=0
    while True:
        word=choice(['ズン','ドコ'])
        print (word)
        if word == 'ズン':
            zun+=1
        elif zun>=3:
            print("キ・ヨ・シ！")
            break
        else: zun=0
```

# ruby版

- [こちら](http://qiita.com/yancya/items/1167e9764719151d0c80)の方がスマートです。
- Ruby楽しくていいな。

``` kiyoshi.rb
#! ruby -Ku
require "kconv"

def kiyoshi()
  zd=[]
  while zd.join!="ズンズンズンズンドコ" do
    word=["ズン","ドコ"].sample
    p word
    zd<<word
    zd.slice!(0) if zd.length>=6
  end
  p "キ・ヨ・シ!"
end

def kiyoshi_org()
  zun=0
  while true do
    word = ["ズン","ドコ"].sample
    p word
    if word == "ズン"
      zun+=1
    elsif zun <= 3
      zun = 0
    else
      p "キ・ヨ・シ!"
      break
    end
  end
end

kiyoshi()
kiyoshi_org()
```

いまいち do end構文が慣れないな。

# Lua版

- はじめてlua書いた。確かに早い気がする。
- 配列の連結みたいの探したけど見つからなかった。
- 日本語文字化けするので、とりあえずローマ字で。

```kiyoshi.lua
function kiyoshi_org()
  words={"zun","doko"}
  zun=0
  while true do
    word = words[math.random (#words)]
    print (word)
    if word == "zun" then zun = zun + 1
    elseif zun < 4 then zun =0
    else break
    end
  end
  print "ki yo shi!"
end


function kiyoshi()
  words={"zun","doko"}
  zd={}
  while true do
    word = words[math.random (#words)]
    print (word)
    table.insert(zd, word)
    str=""
    for i,value in ipairs(zd) do
      str = str .. value
    end
    if #zd==5 then
      if str == "zunzunzunzundoko" then break
      else table.remove(zd,1)
      end
    end
  end
  print "ki yo shi!"
end
```

# 次何やろうかな・・・
[Ubuntu 14.04] Geanyにプラグインをインストール。

#[Ubuntu 14.04] Geanyにプラグインをインストール。
**最新パッケージを取得するためにリポジトリを追加。**
```$ sudo apt-add-repository ppa:geany-dev/ppa```  
**パッケージリストを更新。**
```$ sudo apt-get update```<br>
**Geanyのプラグインパッケージを一括インストール。**
```$ sudo apt-get install geany-plugins```<br>
**個別にプラグインパッケージをインストールする際は、**
```$ sudo apt-get install geany-plugin-{プラグイン名}```
※例(Overviewプラグインをインストール)。
```$sudo apt-get install geany-plugin-overview```

**なお、パッケージは以下のコマンドで確認できます。**
```$ apt-cache search geany```
***
参考：
[導入メモ2 - Ubuntu Cmasa - FC2](http://ubun2.wiki.fc2.com/wiki/%E5%B0%8E%E5%85%A5%E3%83%A1%E3%83%A22)
[Installation - Plugins for Geany](http://plugins.geany.org/install.html)  
***
Android N プレビュー1

[Android Developer Blog記事](http://android-developers.blogspot.jp/2016/03/first-preview-of-android-n-developer.html)のまとめです。

- マルチウィンドウモード
- Notificationに直接リプライするAPI [画像](http://developer.android.com/preview/features/notification-updates.html?utm_campaign=android_launch_n_030916&utm_source=anddev&utm_medium=blog#direct)
- 同アプリのNotificationを1箇所にまとめるAPI
- バッテリー消費を更に抑える
- ビルドツールのJava 8 サポート
Windows 7 > PC故障時の最後のログイン日時

PCが故障したとして、そのPCから最後にログインした情報を取得できるだろうか。
（本当にしたいことは、最後の起動時刻の確認ではあるがそれは難しいだろう）。

HDDからある特定のファイルを取得してWindowsログを見る、というのが今考えている方法.

以下のリンクはXPでの例。7はどうなのか。

http://okwave.jp/qa/q5796788.html
> コピー操作を行うと作成されたファイルは破損しますので、別のPC のイベントビューアで開いてから別名で保存する必要があります。

確認できた。
継承関係があるのはわかる、で、どちらが親でどちらが子？



オブジェクト指向プログラミングの「継承」、思っているほど簡単な概念でしょうかという話。
クラス継承を書くときに親と子を間違えるなんてそんな間抜けなことするわけないって本当に言えますかという話です。

実例を見ながら
--
クラス継承の親子関係を議論するのに簡単な例として、実数を表すReal型と複素数を表すComplex型を作ってみます。

```java
class Real {
  double r;
}

class Complex {
  double r;
  double i;
}
```

これら二つのクラスがまったく無関係なクラスではない、継承関係が見て取れるのは異論ないかと思います。どちらが親でどちらが子でしょう。

まず、フィールド構成だけ注目してクラス定義に継承をつけてみます。

```Java
class Real {
  double r;
}

class Complex extends Real {
  double i;
}
```

フィールド構成は、ComplexがRealのものをまるっと包含しています。だからこれだけ見てクラスを書くと上記の通り、Real型が親、Complex is-a Realの形になりそうです。
でも、それでいいんでしたっけ！？

そう、実数と複素数の意味を思い出してもらえば、実数 is-a 複素数のはずです。Complex型が親でないといけません。実数を求めている関数に複素数を渡したら怒られますよね。では、こう？

```java
class Complex {
  double r;
  double i;
}

class Real extends Complex {
  public Complex(double r) {
    this.r = r;
    this.i = 0;
    // iが常に0であるようにコードで保つ
  }
}
```

親子関係は正しくなったはずですが、プログラムとして全然ダメです。Real型は無駄なフィールドiを持っていますし、しかもそれをプログラマの注意力だけで0に保たないといけません。これが正しいことになるんだったらクラスベースOOPなんて無価値です。

インターフェースなんですよComplexは
--
**プロパティ**を使えるモダンな言語環境に慣れ親しんでいる方はもうお気付きかもしれません。メモリ領域確保を直に表現するフィールドという道具を使っているからおかしくなるんじゃないかと。

プロパティ使えばこんな感じになるわけなのです。

```csharp
class Complex {
  double r { get; set; }
  double i { get; set; }
}

class Real: Complex {
  double i {
    get { return 0; }
    set { }
    // そもそもミュータブルにするかってのはあるがとりあえず虚部の代入は無視。
    // 例外飛ばす方がより厳密ですよね。
  }
}
```

すると見えてきました。iは多態である必要があったのです。

多態ということはインターフェース。うん、複素数というのはまずインターフェースであると考えれば綺麗にまとまったようです。

```java
interface IComplex {
  double getR();
  double getI();
  // せっかくだから今回はイミュータブルにしてみましたよ！
}

class Real implements IComplex{
  double r;
  double getR() { return r; }
  double getI() { return 0; }
}

class Complex implements IComplex {
  double r;
  double i;
  double getR() { return r; }
  double getI() { return i; }
  // いつも冗長でうんざりさせられるgetter/setterもこういう状況では役に立つというもの。
}
```

結論として、「やはりComplexが親。ただしインターフェースとして」となりました。こんな簡単なクラスでも意外に一ひねりが必要でしたね。
物理windowsを仮想化するメモ

まだやってないのですが、
Windows（物理）からVirtualboxイメージをつくる記事をメモ

物理Windows7(vhd)をVirtualBoxに移す話
http://tboffice.hatenablog.jp/entry/2013/07/21/181958

Disk2vhd
https://technet.microsoft.com/ja-jp/sysinternals/ee656415.aspx
SQLite3 をキレイな CMake プロジェクトとしてビルドするキタナイ ExternalProject の書き方

# 概要

> とある sqlite3 に依存する CMake プロジェクトがありました。
> 
> そのプロジェクトでは sqlite3 の特定のバージョンのソースを手仕事で管理する git リポジトリーを用意して、
> 
> その git リポジトリーをプロジェクトの git リポジトリーの git submodule として取り込んでいました。
> 
> それから長い年月が経ち、いつの頃からか、このプロジェクトの sqlite3 は更新されなくなってしまっていました。
> 
> （†0）

類似の状況はままあちらこちらのプロジェクトで見かける事かもしれません。今回は CMake プロジェクトとして SQLite3 の更新管理とバージョン固定の手間とビルドなどの手間を CMake の仕組みに統合して管理が行方不明とまではならないようにしてみます。

具体的には ExternalProject で強引に SQLite3 のソースに CMakeLists.txt をパッチしてビルドする仕組みの基礎をつくります。

# 例

↓こんな cmake を用意してプロジェクト本体の `CMakeLists.txt` から `include` で取り込みます。

- `sqlite3.cmake`

```cmake
cmake_minimum_required( VERSION 3.2 )

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)

include( ExternalProject )

set( sqlite3_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/sqlite3/src/external_sqlite3/ )
set( sqlite3_cmake_file_path ${sqlite3_source_path}/CMakeLists.txt )

ExternalProject_Add( external_sqlite3
  PREFIX            ${CMAKE_CURRENT_BINARY_DIR}/external/sqlite3
  INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}
  # http://www.sqlite.org/download.html
  URL               http://www.sqlite.org/snapshot/sqlite-snapshot-201603091534.tar.gz
  URL_HASH          SHA1=cee1d63a9ae8d8f5948c12682c5d746b72363aaf
  PATCH_COMMAND
    COMMAND echo cmake_minimum_required( VERSION 3.2 ) > ${sqlite3_cmake_file_path}
    COMMAND echo project( sqlite3_project ) >> ${sqlite3_cmake_file_path}
    COMMAND echo find_package( Threads ) >> ${sqlite3_cmake_file_path}
    COMMAND echo add_library( sqlite3 SHARED sqlite3.c ) >> ${sqlite3_cmake_file_path}
    COMMAND echo install( TARGETS sqlite3 DESTINATION lib ) >> ${sqlite3_cmake_file_path}
    COMMAND echo install( FILES sqlite3.h DESTINATION include ) >> ${sqlite3_cmake_file_path}
  CMAKE_ARGS        -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                    -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
                    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
)
```

`ExternalProject_Add` の `PATCH_COMMAND` でやや強引に SQLite3 のソースを展開した先に SQLite3 プロジェクトの公式なソースには含まれていない `CMakeLists.txt` を生成し、その `CMakeLists.txt` を使い `ExternalProject` で SQLite3 の共有ライブラリーをビルドしています。

テンプレートファイルを用意する方法もありますが、この程度のちょっとしたビルド定義くらいだと echo で強引に作ってしまってもいいかな、と思います。

ここで紹介した内容は基本的なやり方の例なので、必要に応じてオプションを用意したり、静的リンク用のライブラリーも用意したり、実行コマンドを用意したり、`CMAKE_ARGS`で本体のプロジェクトと接続したり、などカスタムして使います。

CMake プロジェクトで、特に ExternalProject を使って依存ライブラリーを制御しているプロジェクトで SQLite3 も使いたい場合には管理方法を統一でき、 `URL` `URL_HASH` の更新で対象バージョンの管理もしやすいので、冒頭の昔話よりは改善されます。

# 註

- †0 : この物語はフィクションです。
PDIメモ書き

- オープンソースBIのPentaho（ペンタホ）ブログ
  http://www.pentaho-partner.jp/blog/2013/12/post-92.html
- How to Create a Pentaho Report Using the REST Client
  http://woodlouse.blogspot.com/2013/02/how-to-create-pentaho-report-using-rest.html
- Pentaho Data Integration : JSON input Step
  http://www.knowpentaho.com/2014/01/pentaho-data-integration-json-input-step.html
- JSON Inputについて
  http://www.pentaho-partner.jp/blog/2013/01/json-input.html
- Use JSON Input step to process uneven data
  http://stackoverflow.com/questions/9397884/use-json-input-step-to-process-uneven-data
python > check NoneType or not > if a == None: > if a is None:

```txt:動作環境
Raspberry Pi2 + raspbian
```

pythonコードで以下のようなコードの場合、srcpathのファイルが見つからないとreturn ""となる。

```
def read_fileModificationDate_sendText():
    srcpath="/home/pi/BYOP/send.txt"    
    if os.path.isfile(srcpath) == False:
        return ""
    mddt = time.ctime(os.path.getmtime(srcpath))
    parsed = time.strptime(mddt)
    yyyymmdd = time.strftime("%Y%m%d", parsed)
    return yyyymmdd
```

~~return ""で受け取った値は NoneType オブジェクトとなるようで、その判別方法は以下のリンクで見つかった。~~ (下にて訂正しました)

NoneTypeの判定は以下のリンクで見つかった。

http://python.g.hatena.ne.jp/oneshotlife_tom/20121127/1354009706

> PythonでNoneかどうかを判定するなら==演算子を使えばできますよ。

```
>>> a = None
>>> if a == None:
... print "None"
...
None
```

<hr>
(追記 2016/03/10)

@shiracamus さんのコメントをもとにコードを見直したところ、以下の関数の`return`でNoneTypeになっているようでした。

```
def read_sendtext():
#    debug_outputDebugString("read_sendtext","Line52 > start")
    srcpath="/home/pi/BYOP/send.txt"

    if os.path.isfile(srcpath) == False:
#        debug_outputDebugString("read_sendtext","Line55 > send.txt not found");
        return
    rdfd = open(srcpath)
    lines = rdfd.readlines()
    rdfd.close()

#    debug_outputDebugString("read_sendtext","Line80 > lines:" + str(lines))

    return lines
```
python > link > remove CR, LF >'test string\n'.rstrip()

```txt:動作環境
Raspberry Pi2 + raspbian
```

String型の文字列からCR,LFを取り除きたい。rstrip()を使うようだ。

http://stackoverflow.com/questions/275018/how-can-i-remove-chomp-a-newline-in-python

- 検索用キーワード
  - strip
  - lstrip
技術英語 > I'm open to suggestions. / I agree completely with the main point of the suggestion.

@ Star Trek Voyager > MANEUVERS

まだアイデアがありそうな Chakotay に対して Janeway が

> I'm open to suggestions.

http://eow.alc.co.jp/search?q=open+to+suggestion
> 人の意見に耳を傾ける姿勢だ◆通例複数形suggestionsで


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

@ 強くなる英語のディスカッション by 崎村耕二 日興企画

> I agree completely with the main point of the suggestion.
【Tips】djangoでHTMLを作る時に、template extends をする時のお作法について

#概要

- 継承するときのおおまかなhtml templateたちの構成
- tagの使い方に関するtips
- 注意点

#背景

- 参照したもの：django document version 1.9
- Django version : 1.9.2
- python version : 2.7.10
- OS : MacOS X

作っている人が自分で決めるべきものは大文字で、それ以外は小文字で書いてます。変数名とかファイル名とか。

#継承する時のhtml templates の構成

templateのextendsを使ってhtmlを書いていく時の効率の良い方法を公式HPで紹介していたのでほぼほぼそれの翻訳です。

##base.html を用意する


全ての大元になるベースのtemplateの作成。ここにwebサイトのベースになるものは全て詰め込む。

後からコンテンツを追加したいところには{% block CONTENTSNAME %}として、用意しておく。この時デフォルトの値を入れておくのも開発手法としては良いやり方。(下の方に補足あり。)


公式docにのってたのはこんな感じの具体例。

```base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
```

##base_SECTIONNAME.html として もう少し限定したものを作成

例えば、ブログを作っているのであれば、**base_index.html**とか**base_blogindex.html**とかbase.htmlよりも具体的だけど全部のコンテンツを埋め込まない感じ。

それぞれのページ毎に必要な個別の機能をここで用意してあげる感じ。ここでも子templateで挿入したい部分には```{% block CONTENTSNAME %}```としてblocktagを入れておいてあげる。

##個別ページを具体的に作成

足りないところとか、実際に変数を入れて代入したりすごく具体的なことをやる。webページを完成させるようなイメージ。


#tagの使い方に関するtips

tagに関する細かいルールがいくつかあったらしく、それについてまとめる。

##{% extends '親のtemplateの名前.html' %}

これはtemplateの親子関係を示すためのtag。子供の方にextendsってやって親のtemplateの名前を書いてあげる。そうすると親でblockタグを作ったところにコンテンツを挿入できる。


このタグの使用上の注意点は、extends tagは一番上になきゃいけないところ。このtagを真ん中に書いたりするとエラーが正常に継承されないので注意してください。

documentにあったのはこんな感じの具体例。

```base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
```

子供はこんな感じ。

```base_CHILD.html
{% extends 'base.html' %}

{% block title %}My amazing blog {%endblock%}

{% block content %}
{% for entry in bloc_entries %}
	<h2>{{entry.title}}</h2>
	<p>{{entry.body}}</p>
{%endfor%}
{%endblock%}

```

tagの使い方とか細かくて具体的なのは別でぐぐった方が良いかも。。

##{% block %}について

###block tagはたくさんあった方がいい

blockがたくさんあって悪いことはない。だから、将来使いそうなところには片っ端からツッコンどくのがいいらしい。

###繰り返しが多い場合

子供のtemplateの方でやたらとおなじことを繰り返しコーディングしてるなぁ、、と思ったら親templateの方に書いちゃうのがbest。

繰り返しが少なくなって読みやすくなる。DRY! DRY!!


###読みやすくするために、、

{% endblock CONTENTSNAME %}ってやって対応関係を書いておくと他の人が読んだ時にわかりやすい。オープンソースの時代なので他の人に読まれる前提で書いておかないと後で大変なことになる。。


###blockタグの作り方に関する注意点

block tagの名前はそれぞれ独立してないとダメ。おなじ名前があるとうまくいかない。

というのもblockタグのやりとりは親子間で一方通行ではなく、相互的なものらしい。親でたくさんblockタグを用意しておくと、子供の方あら親のタグを見た時にどれを参照していいかわからなくなって困っちゃうらしい。



たぶんこんな感じ。これを勉強してdocument読んで少し練習すればtemplateの継承関係は問題なくいけるはず。。。
sbtはpom.xmlに書いてある依存リポジトリを読んでくれない

タイトル通り。気づかなかったのでハマった。

## sbtは、標準じゃないリポジトリを使う場合、別途書かなければならない
sbtの公式ドキュメントが
http://www.scala-sbt.org/0.13/docs/ja/Library-Dependencies.html
> 依存ライブラリがデフォルトのリポジトリに存在しないなら、Ivy がそれを見つけられるよう resolver を追加する必要がある。

と謳っているため、導入したいレポジトリのpom.xmlに`<repositories>...</repositories>`が存在するとき、
そこに書き込まれている依存レポジトリ情報を、手動で `build.sbt`や`Build.scala`に追加してやる必要がある。

## 実際に遭遇した例
Mavenレポジトリに存在するCSV Validator[^1]を使おうと思い

```scala:build.sbt(インポートできない)
libraryDependencies += "uk.gov.nationalarchives" % "csv-validator-core" % "1.1.2"
```

と書いて `$ sbt compile` を行ったところ、UNRESOLVED DEPENDENCIESが起きた。

pomファイル[^2]を調べた所、pomファイルに書かれている、読まれるべきレポジトリをsbtが読み込んでいないことに気づいた。以下のように`build.sbt`に追記したところCSV Validatorをインポートすることが出来た。

```scala:build.sbt(依存レポジトリ情報を追加したため、インポートできる)
resolvers += "Scalaz Bintray Repo" at "http://dl.bintray.com/scalaz/releases"
resolvers += "Gilt Group Bintray Repo" at "http://dl.bintray.com/giltgroupe/maven"
libraryDependencies += "uk.gov.nationalarchives" % "csv-validator-java-api" % "1.1.2"
```

```xml:csv-validator-core-1.1.2.pom(依存レポジトリ情報が書かれている)
      :
    <repositories>
        <repository>
            <id>scalaz-bintray</id>
            <name>Scalaz Bintray Repo</name>
            <url>http://dl.bintray.com/scalaz/releases</url>
            <!-- needed for scalaz-stream -->
        </repository>
        <repository>
            <id>gilt-group</id>
            <name>Gilt Group Bintray Repo</name>
            <url>http://dl.bintray.com/giltgroupe/maven</url>
            <!-- needed for gfc-semver -->
        </repository>
    </repositories>
      :
```
[^1]: http://mvnrepository.com/artifact/uk.gov.nationalarchives/csv-validator-core/1.1.2
[^2]: https://jcenter.bintray.com/uk/gov/nationalarchives/csv-validator-core/1.1.2/:csv-validator-core-1.1.2.pom
grepより高速に検索できるag(The Silver Searcher)のインストール方法

# agとは
`ag` は `grep`のように、ファイルから文字列を検索するツールです。
grepよりも高速に動作するため、大きなプロジェクトやログファイルで検索をする場合にとても便利です。

# grepに比べて何がいいか
* 高速
* `gitignore` にあるファイルを検索対象外にできる
* 隠しファイルはデフォルトで検索対象外
* grepの `-ir` オプション（大文字小文字無視でディレクトリを再帰的に検索）がデフォルト
* コマンドも短く、結果が見やすい（後述）

# grepと結果を比較

grepとagの実行結果を比べると、このようになります。
agのほうがコマンドがとても簡単で、結果も見やすいことがわかるかと思います。

```
$ grep -rn test *
a/a.txt:1:test1
a/a.txt:2:test2
b/b.txt:1:test1
b/b.txt:2:test2

$ ag test
a/a.txt
1:test1
2:test2

b/b.txt
1:test1
2:test2
```

# インストール
インストール方法は[GitHub](https://github.com/ggreer/the_silver_searcher)の `Installing` という箇所にOS別で記載されています。
CentOSの場合は以下のようになります。

```
$ su - 
# git clone https://github.com/ggreer/the_silver_searcher.git
# cd the_silver_searcher
# yum -y groupinstall "Development Tools"
# yum -y install pcre-devel xz-devel
# ./build.sh
# make install
```

環境によっては、build.shにて以下のようなエラーが出ることがあります。
```
aclocal:configure.ac:71: warning: macro `AM_COND_IF' not found in library
```

その場合は、[tar](https://github.com/ggreer/the_silver_searcher#building-a-release-tarball)をダウンロードしてインストールする手順を実行しましょう。

```
# wget http://geoff.greer.fm/ag/releases/the_silver_searcher-0.31.0.tar.gz
# tar xvzf the_silver_searcher-0.31.0.tar.gz
# cd the_silver_searcher-0.31.0
# ./configure
# make
# make install
```

# 便利な使い方
## 特定のディレクトリを除外して検索
`--ignore-dir` オプションをつけることで、特定のディレクトリを除外することが可能です。
複数のディレクトリを除外したい場合は複数回入力します。

```
# 普通に検索
$ ag test
a/a.txt
1:test1
2:test2

b/b.txt
1:test1
2:test2

# bディレクトリを除外して検索
$ ag --ignore-dir b test
a/a.txt
1:test1
2:test2
```

## 正規表現で検索
agでもgrepと同様に正規表現を使うことができます。

```
$ ag "test\d*"
a/a.txt
1:test1
2:test2

b/b.txt
1:test1
2:test2
```

## 小文字だけを入力した場合は大文字小文字を無視し、大文字を入力した場合は厳密に検索
`-S` オプションを使うと、小文字だけを入力した場合は大文字小文字を無視し、大文字を入力した場合は厳密に検索するようになります。aliasに設定しておくのもおすすめです。

```
# 小文字の場合は大文字小文字を無視（つけても変わらない）
$ ag -S test
a/a.txt
1:test1
2:test2

b/b.txt
1:Test1
2:test2

# 大文字の場合は厳密に検索
$ ag -S  Test
b/b.txt
1:Test1
```
GASでToDo管理

#GASでToDo管理してみる

### 毎朝ToDoListを通知してくれるような機能を目指す
- 毎朝実行の部分はトリガ設定で簡単にできる
- 通知はmailよりもSlackとかLineがいいなーと思ったらこんなのがあった
http://qiita.com/soundTricker/items/43267609a870fc9c7453
- ToDo を管理するカレンダーを一つ用意して，適当な時刻にトリガ設定して，24時間以内のToDoをSlackで通知 
- こんな感じ https://github.com/kdotsaito/GAS

### 感想
- やっぱりGASって便利
低スペWindowsでvagrantを導入するときに初心者がつまずきやすい2点

色々な人にVagrantの使い方を教えていたら、なかなか躓くところが多いと感じたのでまとめておく。
#そもそもvagrant init できない
windowsのユーザー名（正確にいえばユーザーディレクトリ）が日本語を含む場合、vagrantコマンドが失敗する。

```
C:\Users\太郎\Desktop\work\vagrant>vagrant init
C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant.rb:59:in `requ
ire': cannot load such file -- childprocess (LoadError)
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant.r
b:59:in `<top (required)>'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:1
05:in `require'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:1
05:in `<main>'

```
日本語を含まないユーザーを作成し、そちらで作業するべし。

#vagrant upでタイムアウトして終了する

```
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```
単純にマシンスペックが足りず、VirtualBox側で起動に時間がかかり、起動しないケースもあったが、基本的には仮想化支援機構が有効になっていない場合もある。
Vagrantfileを下記のように編集して、virtualboxがGUIで立ち上がるようにする。

```
   config.vm.provider :virtualbox do |vb|
     # Don't boot with headless mode
     vb.gui = true
     # Use VBoxManage to customize the VM. For example to change memory:
     # vb.customize ["modifyvm", :id, "--memory", "1024"]
   end

```
しばらく待って、
>仮想化支援機構(VT-x/AMD-V)を有効化できません。64ビットゲストOSは64ビットCPUを検出できず、起動できません。
ホストマシンのBIOS設定でVT-x/AMD-V を有効化してください。

このようなメッセージが出ることを確かめる。
これが出る場合、BIOSの設定を変更して、仮想化支援機構を有効にしよう。
[BIOS設定を変更する](http://www.iu.a.u-tokyo.ac.jp/~kadota/bioinfo_ngs_sokushu_2014/troubleshooting_BIOS.pdf)

### 仮想化支援機構を有効にできない場合
古めのPCなどだと、仮想化支援機構を利用できないこともある。
仮想化支援機構を利用できないとゲストOSに64bitOSを使用できないので、32bitOSを使用することになる。
そんな人のためにvagrant up一発でrailsの環境が立ち上がるVagrantfileを書きました→[Saxtondrey/rails_dev32](https://github.com/SaxtonDrey/rails_dev32)
が、32bit環境ではメモリが4GBまでしか使用できなかったり、そもそも古いPCでは開発ば不便だと思いますので、おとなしく新しいPCを買いましょう。
TaskTiger, Django-Q, Luigi比較


気になったのでウェブサイトで見かけた内容をまとめた。

# 機能比較

|                | [TaskTiger](https://github.com/closeio/tasktiger)       | [TaskTiger](https://github.com/closeio/tasktiger) | [TaskTiger](https://github.com/closeio/tasktiger) |
|:--------------:|:---------------:|:---------:|:------:|
| 実行プロセス     | タスク毎にフォーク | ワーカをプーリング|       |
| ロック          | あり             | ? | |
| リトライ        | あり             | ? | |
| スケジュール済みのタスク | あり       | あり | |
| ログ            | JSONログ        | ? | |
| 管理画面         | あり (Flask)    | あり (Django Admin Site) | |
| パイプライン     | ?              | あり           | あり   |
| バックエンド    | Redis          | Redis, Disque, IronMQ, SQS, MongoDB, Django ORM | |


## 実行プロセス

どのようにタスクを実行するか。


## ロック

同一（と思われる）タスクをロックまたは排除することが出来るか。
tasktigerは引数で同一のタスクを排除するっぽい。

## リトライ

タスクが一時的なエラーに見舞われた場合にリトライすることができるか。

## スケジュール済みのタスク

cronのように定期実行する機能のサポート。

## ログ

ログ出力。Django-Qは普通にdjango loggingかな。

## 管理画面

ジョブキューシステムの管理画面の有無。

## パイプライン

グループやチェインなど、複数のジョブの流れを管理することが出来るかどうか。

## ディスパッチャ

キューがどこからディスパッチされるか。


# TaskTiger

ウェブアプリケーションのような並列性の高いサービスで使われることを想定しているようで、引数をキーにロックを作ったり、重複を排除したり出来るのが便利そう。タスクを毎回フォークするのもメモリ使用の観点（メモリリークの対策）という点でもよさげ。


# Django-Q

Django Admin Siteを使用できる。Djangoを使って開発している人であれば、Djangoの流儀に則って設計されているので一番手軽に導入できるソリューションかも。バックエンドが選べることや、管理画面がついてくるのもマル。

ドキュメントから読み取れない機能があるので、実際に使ってみないと何とも言えない。

```python
from django_q.tasks import async

async('some.module.build_hoge', 1)
```

# Luigi

開発元はSpotify

サンプルではフラットファイルから、Map / Reduceまたは任意の加工をしてRDBMSに放り込むような内容がまとめられている（[Luigi - Example top artists](http://luigi.readthedocs.org/en/stable/example_top_artists.html)）。長いバッチを実行するのが主な目的で、いわゆる非同期のジョブキューマネージャとは立ち位置が少し異なりそう。パイプラインも組めるので、定期実行するバッチに向いているみたい。
OpenCV3.1.0をCMakeを用いてbuildする

#buildが成功するまでの話
こちらの記事の手順４までを参照
http://qiita.com/yizumi1012xxx/items/762005e4b41cafcf1d43

#buildが成功したあとの話
C:\\opencv-3.1.0\\build内に沢山のフォルダが生成されます。
実際に使うのは・・・C:\\opencv-3.1.0\\build\\installの中にあるファイルです。
Visual Studioで新しいプロジェクトを作成した場合，以下の3点のパスを通せばOpenCVは動きます。
（OpenCVのバージョン，x64，vc14などは適宜読み替えてください）

**システム環境で通すPath**
C:\\opencv-3.1.0\\build\\install\\x64\\vc14\\bin
**Visual Studioで設定する追加のインクルードディレクトリ**
C:\\opencv-3.1.0\\build\\install\\include
**Visual Studioで設定する追加の依存ファイル**
C:\\opencv-3.1.0\\build\\install\\x64\\vc14\\lib\\\*.lib

#Pythonでやりたい！
C:\\opencv-3.1.0\\build\\lib\\Release\\cv2.pydをPythonライブラリフォルダにコピー
例） C:\\Python27\\Lib\\site-packages\\cv2.pyd
Elixirで中置演算子マクロ （Re: Elixirでもtryがしたい！）

[Elixirでもtryがしたい！](http://qiita.com/techno-tanoC/items/a252d9849f0150b91c3a) を読んで試してみたくなったので調べてみました。
NilClassが無い以上、try的な物を生やすのは諦めて、中置演算子なら見た目近いかなーということでパイプを置き換えてみます。

```ex
defmodule Attempt do
  defmacro left ~> right do
    quote do
      case unquote(left) do 
        nil -> nil
        other -> unquote(Macro.pipe(quote(do: other), right, 0))
      end
    end
  end
end
```
```ex
iex(1)> defmodule Attempt do
...(1)>   defmacro left ~> right do
...(1)>     quote do
...(1)>       case unquote(left) do
...(1)>         nil -> nil
...(1)>         other -> unquote(Macro.pipe(quote(do: other), right, 0))
...(1)>       end
...(1)>     end
...(1)>   end
...(1)> end
{:module, Attempt,
 <<70, 79, 82, 49, 0, 0, 5, 240, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 168, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
 {:~>, 2}}
iex(2)> import Attempt
nil
iex(3)> 1 ~> Integer.to_string
"1"
iex(4)> nil ~> Integer.to_string
nil
iex(5)>
```
ちなみにElixirの中置演算子は使える記号が限られていて、*今のところ*
http://www.rodneyfolz.com/custom-infix-functions-in-elixir/
`\\, <-, |, ~>>, <<~, ~>, <~, <~>, <|>, <<<, >>>, |||, &&&, and ^^^.`との事。例えば`|<`を定義しようとすると`** (SyntaxError) iex:7: syntax error before: '<'`で怒られました。
或いは[pipespect](https://github.com/alco/pipespect/blob/master/lib/pipespect.ex#L9-L10)のように

```ex
  import Kernel, except: [{:|>, 2}]
  defmacro first |> rest do
```
Kernelからexcept…あまり気持ちのいいものではないですよね。
初めてUnityでVertex Shader書いてみた

##結果
結果は[こちら(gfycat)](https://gfycat.com/ThreadbareShimmeringDrafthorse)

Unityのshaderを初めて書いたのでメモ。

##参考資料
参考：[Moving vertices in shaders - Unity Answers](http://answers.unity3d.com/questions/543558/moving-vertices-in-shaders.html)

というかほとんど上のShaderコピーしたんですがこれをきっかけにもっとshader書けるようになりたいなって感じです。

##コード
```shader:bekobeko.shader
Shader "Custom/BekoBekoShader" {
	Properties{
		_MainTex("Texture", 2D) = "white" {}
	_Amount("Height Adjustment", Float) = 1.0
	}
	SubShader{
		Tags{ "RenderType" = "Opaque" }
		CGPROGRAM
		#pragma surface surf Lambert vertex:vert
		struct Input {
			float2 uv_MainTex;
			float3 worldPos;
		};

		// Access the shaderlab properties
		float _Amount;
		sampler2D _MainTex;

		float rand(float3 co)
		{
			return frac(sin(dot(co.xyz, float3(12.9898, 78.233, 45.5432))) * 43758.5453);
		}

		// Vertex modifier function
		void vert( inout appdata_full v) {
			// Do whatever you want with the "vertex" property of v here
                        //コメント部分を適用すると中心から円状に波が広がる
			/*float mag = (v.vertex.x * v.vertex.x) + (v.vertex.z * v.vertex.z);
			mag = sqrt(mag);*/
			float mag = v.vertex.x + v.vertex.z;
			v.vertex.y = sin(_Time * _Amount + mag) / 3;
		}

		// Surface shader function
		void surf(Input IN, inout SurfaceOutput o) {
			o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
		}
	ENDCG
	}
	FallBack "Diffuse"
}
```
##解説をしようとするけど失敗するところ
UnityのShaderは大きく2つの部分に分けることができて、
Properties と SubShaderに分けられます。

```shader:minimum.shader
Shader "名前"{

Properties{}
SubShader{
CGPROGRAM
ENDCG
}

}
```
ってことですね。

PropertiesはUnityのInspectorに出てくる変数ですね。
![これ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100271/4cec4133-75b7-897a-316d-b33d682e09b6.png)

SubShaderの中から型指定して同じ変数名使えばPropertiesの変数にアクセスできます。(_Amount, _MainTexとか）
SubShaderは何個でも記述できて、ハードウェアに応じて上から順番にトライされて最終的にダメなら Fallbackで指定された名前のShaderをトライしていくって感じらしいです。

`#pragma surface surf Lambert vertex:vert`
ではVertex Shaderの関数がvertであると示すプリコンパイル命令的なものだと思います（雑）
この辺はまだちょっと理解できてません・・・

で vert 関数には特殊なシグネチャがあるのか、パラメータ増やそうとしたりすると怒られました。

見てのとおりググって適当に書いただけなのでコメントで指南いただけたらとてもうれしいです。


#PS
Lambertってちょいちょい見るけどなんぞやと思ったのでググってみました。
[Wikipedia: Lambertian Reflecance](https://en.wikipedia.org/wiki/Lambertian_reflectance)

要するにSpecularの逆で光がキレイに反射するよりDiffuse的に曇る、というか見る角度は関係なく光の影響を受けることを指すらしいです。
数式も簡単で素晴らしい

```math
I_{D}=\mathbf{L}\cdot\mathbf{N} C I_{L}
```

I(D)が出てくる光、Lが光の単位ベクトル、Nが面の法線、Cが色、I(L)が光の大きさの場合のLambertian Reflectanceだそうです。
詳しくはWikipediaを読んでもらうといいんですが、簡潔に「光の向きと法線が近い角度であるほど明るく見える」ってだけの話です。

これから覚えること多そうですがとりあえず[Earl Sweatshirt](https://youtu.be/5Ta7mnSux24)が風になびいたのでOKです。
【Shader Forge】ArithmeticにあるNodeについて

Arithmetic(アリィスマァティック/数値/数学)にあるNodeについてちょっと解説します。

<img width="372" alt="20160310004820.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/ae4ee80b-10fd-b333-729c-e3de401b9777.png">

***

| Node名 | 効果 |
|:-----:|:----:|
|Abs |Aの絶対値を出力する |
|Add|AとBを足して出力する|
|Blend|フラグメントにある元の色と新しい色とをどう合成するかの指定できるらしい|
|Ceil|少数点を切り上げる|
|Clamp|入力された値が指定した最小値と最大値の間になるよう加工する|
|Clamp 0-1|入力された値が0~1の間になるよう加工する|
|Clamp(Simple)|Clampが簡単に使えるNode|
|Divide|割り算をA/Bで計算|
|Exp|e=2.71828...(自然対数の底、Napierの数)のときのeのA乗を出力する|
|Floor|少数点を切り捨てる。床に叩きつける感じ|
|Fmod|浮動小数点除算の余りを求めます。例えば、5.0÷2.0の場合は1.0が返ります。とのこと|
|Frac|入力値の少数部分のみを出力する|
|HSV to RGB|HSVをRGBに変換して出力|
|Hue|色の色合いコンポーネントの値を返します。とのこと|
|If|条件によって出力する値を変えることができる|
|Inverse Lerp|Lerpの逆数が出力される。とのこと|
|Lerp|AとBを補完してくれる|
|Lerp(Simple)|Lerpが簡単に使えるNode|
|Log|対数を求める|
|Max|いくつかの入力の内、最大値を出力する|
|Min|いくつかの入力の内、最小値を出力する|
|Multiply|入力値を掛け算して出力|
|Multiply Matrix|行列用の掛け算をする|
|Negate|引数に対して算術否定演算をする？とのこと。よくわからん|
|Noise|入力値にノイズを混ぜて出力する？？。よくわからん|
|One Minus|入力値に-1を掛けて出力|
|Posterize|画像を入力値で分割する?|
|Power|Outputs the power [Val] ^ [Exp]とのこと|
|Reciprocal|Outputs the quotient 1 / inputとのこと|
|Remap|Remaps a value from one range to another. Same as Remap (Simple), but with inputs instead of numerical constantsとのこと|
|Remap(Simple)|Remapを簡単に使えるようにしたNode|
|RGB to HSV|RGBをHSVに変換して出力|
|Round|Outputs its input rounded to the nearest integer|
|Sign|Outputs the sign of its input.|
|Smoothstep|Blends smoothly between two values, based on where a third value is in that range, outputting values between 0 and 1. Think of it as a clamped inverse lerp with a smoothed output value.|
|Sqrt|Outputs the square root of its input|
|Step(A <= B)|Outputs 1 if [A] is less than or equal to [B], otherwise outputs 0|
|Subtract|Outputs the difference [A] - [B]|
|Trunc|Outputs its input rounded to the nearest integer towards zero. Essentially; it removes the decimals, leaving an integer|

まとめてるときにイロイロ調べてたらShader Forge本家がちゃんとまとめてたorz
http://acegikmo.com/shaderforge/nodes/
ローカルのgit-svnからSVNリポジトリを復元する方法

SVNリポジトリを削除しちゃった／(x.x)＼ﾅﾝﾃｺｯﾀ
以前のバックアップから復元はしたけどちょっと古い…
そんなときに、git-svnでcloneしたローカルリポジトリがあればそこから復元できます。

参考) ローカルのgit-svnからSVNリポジトリを復元する方法
http://stackoverflow.com/questions/2710073/can-i-recover-lost-commits-in-a-svn-repository-using-a-local-tracking-git-svn-br

※注意
以前と同じコミットログで復元できるが、 コミッター、日時はすべて復元した時点のものにはなってしまう。

# 必要なもの

 * 復元した(とある時点の)SVNリポジトリ (/path/to/repos.svn)
 * 最新のソースがcommitされているgit-svn repo (/path/to/uptodate)

# 手順

1. 復元した(古い)SVNリポジトリから適当な場所にcloneし直す

        $ pwd
        /home/hirose
        $ git svn clone -s --prefix svn/ /path/to/repos.svn recover
        $ cd recover
        $ git svn info | grep ^Revision
        Revision: 1246          ★r1246まで戻っている

2. 作った新しいgit-svn repoに、今まで使用していた(最新のソースがcommitされている)git-svn repoを追加する

        $ git remote add -f uptodate /path/to/uptodate

3. 元のgit-svn repoからmergeする

     A) merge する場合
        ※この手順だと自分の場合コンフリクトが発生してよく分からなかったので未確認。

        $ git merge remotes/uptodate/master

     B) cherry-pick する場合

        $ git log --all
        ★復元の始点となるr1247のコミットハッシュを確認
        $ git cherry-pick d088555035adafe0546f7ab25d1d72543965cd5b^..remotes/uptodate/master

    cherry-pick のコミットハッシュの始点には「再適用する先頭のコミットハッシュ+^(ひとつ前)」を指定する。間違えると一部のコミットだけ復元できずに消える可能性があるので注意。

4. SVNリポジトリにコミットする

        $ git svn dcommit

完了。

過去にcheckout済の作業フォルダはそのまま使えているようだ。
(checkoutし直した方が無難かも。)
フリーのワイヤーフレームを求めて

# 概要
  * やり取りで Boostrap から htmlt デザインをやる前に一回ワイヤーで大きな方向を決めたい
  * Webサイトのワイヤーが必要（スマホは今回不要）
  * 管理系なので複雑なレイアウトはいらない（だったらMSのソフトでも・・・はなしで）
  * ワイヤーフレームのフリーのソフト・クラウドを探してみる

## 選定のポイント
  * 学習コストがすくない
  * 直感的に利用できる
  * 最低限のパーツなどを備えている（ボタンや入力フォームなど）

# ソフト紹介

1. [Cacoo](#https://cacoo.com/lang/ja/home)
  * Webブラウザベース
  * 日本語。同僚に勧められたのは、これ。backlogで有名な nulab が開発
  * 初見UIがちょっとごちゃごちゃして個人的はあまり好きじゃない
  * export file: png, svg, pdf, ps, ppt, vector type
  * フリーで、25シートはすこしばかり心細い
  * private で利用できる
2. [moqups](#https://moqups.com/)
  * Webブラウザベース
  * 英語だけどアイコンから直下的でわかりやすい
  * すぐにモックアップが簡単にできる
  * export file: pdf, png, png(x2 Retina)
  * export to: local, Google Drive, Dropbox
  * フリーは、github 同様 public になってしまうのが残念すぎる
  * private にしたいならば有料にするしかない
  * 1 プロジェクトで 300シートがフリーが使用できるのがいい
3. [justinmind](#http://www.justinmind.com/)
  * Desktop 型
  * 直感的に form のパーツがわかりやすい
  * private でもいける
  * export file: img, html(chrome extension からインストールして設定が必要)
  * 先方でやり取りしてコメントもらいたい時はソフトをインストールしてもらうのが面倒

# 総評
  * 他にもいろいろありましたが今回は3つに絞りました。
  * moquupsを使いたかったけど、フリーは public only なので justinmind 使っていきます
  * これよりも他におすすめやつを教えて下さい。
[C++11] sizeof

We usually use the `sizeof` to evaluate the size of a instance (class or struct) or variable. Such as:

```cpp
class Car {
public:
    int id;
    string name;
    static int count;
};

int main() {
    Car p;
    cout << sizeof(p) << endl;           // 4
    cout << sizeof(Car::count) << endl;  // 4
    return 0;
}
```

In C++98, we can not evaluate the size of id without creating a instance with sizeof, but we can do it with C++11.

```cpp
//C++98: error: invalid use of non-static data member 'id'
//C++11: 4
cout << sizeof(Car::id) << endl;
```

In C++98, if we do the same thing, we maybe do something like this:

```cpp
cout << sizeof(((Car*)0)->id) << endl; // 4
```

It's very clear to see that the way of C++11 is easier to read.
npm で velocity.js を入れようとしてハマった。	



この velocity（http://julian.com/research/velocity/ ）を入れたくて、

```
$npm i velocity -S
```

でいれようとしてたら、`fs` がないよって怒られた。

他にもたくさん velocity があった。
https://www.npmjs.com/search?q=velocity

本物はこれ。
https://www.npmjs.com/package/velocity-animate

なので、求めてたやつはコレ。

```
$npm i velocity-animate -S
```

```index.js 
const velocity = require('velocity-animate') // ES6 x webpack
```
【Shader Forge】ノード接続の外し方

ノード接続の外し方について書きます。

Shader Forgeを使っていると、誤って別のノードに接続してしまうことがあります。
<img width="427" alt="スクリーンショット 2016-03-10 0.41.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/d3f6a141-add3-9481-4f07-ad0d28d39f77.png">

そんなときは、(何でも良いので)空のNodeを作成し、接続を外したいNodeに付けます。
そのあと空のNodeを選択した状態で`Command + X(本来なら切り取り)コマンド`を実行することでノード接続を外すことができます。

めっちゃ画質悪いけど・・・
![3月 10, 2016 00:46.gif](https://qiita-image-store.s3.amazonaws.com/0/67575/3fa6bacd-91f2-a5bc-38b6-6941f7be9436.gif)
【Shader forge】Multiplyについて

Multiply(まるてぃぷらい?)についてちょっとだけ調べてみました。

MultiplyはArthmetic(算数/計算という意味)のメニューから作成できます
<img width="366" alt="スクリーンショット 2016-03-10 0.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/bbe03d4d-ed35-1001-bfbe-fe7f0f26e2be.png">

Multiplyは
AパラメータとBパラメータを掛けて出力します。
<img width="192" alt="スクリーンショット 2016-03-10 0.25.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/6364f08f-a1df-7258-703f-e88c6dacf3be.png">

ColorとColorを掛け合わせて新しい色を出力できます。
(黄色に水色をかけて緑を作成)
この場合は、rgba(1,1,0,1) X rgba(0,1,1,1)なので、それぞれを掛けてrgba(0,1,0,1)が出力されます。
<img width="359" alt="スクリーンショット 2016-03-10 0.28.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/47d9ac06-de54-1d53-9ae1-8acc129e52f2.png">

Timeにspeedをかけて増減させたり・・・
<img width="352" alt="スクリーンショット 2016-03-10 0.32.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/be1d5bd9-086b-93e2-041b-b9b85172b395.png">

Vector同士を掛け算することも可能です。
<img width="338" alt="スクリーンショット 2016-03-10 0.36.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/67575/ea0c9c78-7bf4-753e-89db-1e21fed2be9c.png">


めっちゃ大切なので覚えておきましょう!
seleniumでmetaタグ出力メモ



```rb

require 'selenium-webdriver'

# ブラウザ起動
driver = Selenium::WebDriver.for :firefox

# サイトマップページにアクセス
driver.navigate.to "https://www.example.com/sitemap"

# ページ内のリンク取得
elements = driver.find_elements(:tag_name, 'a')
links = elements.map{|a| a.attribute('href')}
links.uniq! #重複削除

links.each.with_index(1) do |url,i|
  
  sleep 2 #２秒待つ
  
  driver.navigate.to url
  puts url
  # title 出力
  puts driver.title
  # meta description 出力
  puts driver.find_element(:xpath, "//meta[@name='description']").attribute('content')
  # meta keywords 出力
  puts driver.find_element(:xpath, "//meta[@name='keywords']").attribute('content')

  # 画面キャプチャ
  #driver.save_screenshot('filename.png')

  # 100件で終了
  break if i == 100

end


# ブラウザ終了
driver.quit

```
ipython を起動しながら自作モジュールを修正した場合

# 目的
**ipython起動中に、自作モジュールの修正をしても反映されない**ので、この問題を回避する策を提示すること

# メイン
[本家](http://ipython.readthedocs.org/en/stable/config/extensions/autoreload.html?highlight=reload) の翻訳のようになってしまうがお許しください。

以下の順番で進みます
- `%autoreload 2`
- `%autoreload 1`
- `%autoreload`

## `%autoreload 2`
簡単のため本家そのまま引用する

```sampleそのまま
In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
```
1. 外部のモジュール`autoreload`をロード
2. `autoreload 2`を実行
3. `some_function`をインポートする
4. 実行(42を返す)
5. ここで、`some_function()`を43を返すように修正
6. 実行(43を返す)


`autoreload 2`は、実行する度にインポートしたモジュールをリロードする。ここでは`some_function`を毎回リロードしてくれる。

## `%autoreload 1`

```sampleそのまま
In [1]: %load_ext autoreload

In [2]: %aimport foo

In [3]: %autoreload 1

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: some_function()
Out[6]: 43
```

`autoreload 1`は`%aimport [module]`したモジュールを実行する度にリロードしてくれる。

## `%autoreload`

```sampleそのまま
In [2]: %load_ext autoreload

In [3]: from foo import some_function

In [4]: some_function()
Out[4]: 42

In [5]: # open foo.py in an editor and change some_function to return 43

In [6]: %autoreload

In [7]: some_function()
Out[7]: 43

In [8]:# open foo.py in an editor and change some_function to return 42

In [9]: some_function()
out[9]: 43
```

`%autoreload`は`%autoreload`が実行される度にインポートしたモジュールをリロードする。`%autoreload`しなければ、リロードはされない

# まとめ

| コマンド|特徴| 用途|
|---|---|---|
|`autoreload 2` |実行する度にモジュールを自動でリロードする | すべてのモジュールをいつでもリロードしたいとき|
|`autoreload 1` |`%aimport`で指定したものを実行する度に自動インポート |　選択的にモジュールを自動リロードしたい時|
|`autoreload` | このコマンドを実行するとモジュールが自動リロード| 自動リロードするタイミングを指定したい時|

といったところでしょうか。結構ハマりました。しかもバージョンが上がって、過去のものは使えなくなったりしていました。`reload`とか。。。

これでipythonのモジュール修正が反映されない問題が解決できました。更に楽しいipythonライフを！


## 先人の投稿
http://qiita.com/ksomemo/items/74607f4dd3222fe9273d