OmniAICreator/Qiita-1.07M huggingface dataset:
Scalastyleで特定のパッケージに依存できないようにする



ドメイン駆動設計では、あるBoundedContextが外部のBoundedContextに依存する場合、外部のドメインモデルに直接依存するのはアンチプラクティスです。ここでは、Scalaの静的解析ツールScalastyleを使ってContext同士がスパゲッティになることを予防する方法を紹介します。

BoundedContextの境界線をはっきりさせるために、各BoundedContextは別プロセスになるようなアーキテクチャ(例えば、[Microservices]やサービス指向アーキテクチャ)にしたり、コードベースも全く別のリポジトリするのが理想です。さらに大規模なプロジェクトなら、開発チームもContextごとに組織が分かれていたほうがいいです。

しかし、小さなプロジェクトでは、教科書通りに分割してしまうと、Published LanguageとしてのREST APIの設計に余計な工数がかかったり、リポジトリがバラバラであるため、チケットの管理が大掛かりになったりします。(僕のいる[ShouldBee]チームではMicroservicesをアーキテクチャとして採用したが、開発にオーバーヘッドがありすぎて、Context毎にばらばらだったリポジトリも統合し、各ContextがRESTやRemote Actor等でやりとりするアーキテクチャも見直しに入っている)

2,3人の小さなチームでドメイン駆動設計をする場合は、すべてのBoundedContextをひとつのリポジトリでコードを管理することをお勧めします。さらに、初期の段階では、各BoundedContextも1つのプロセスで動くようにするだけで十分です。Context同士の関係がスパゲッティにならないよう注意してさえいれば、いずれスケールに迫られたときにでも、最小のコストで、Contextを独立のサービスに切り出せるからです。


複数のContextをひとつのリポジトリに入れて開発していく場合、最新の注意を払わなければならないのが、Context間の結合方法です。あるContextが別のContextのドメインモデルに直接依存するのは大変良くありません。

その代わり、クライアント側のContextが依存しても良いレイヤーを設けるようにします。よくあるドメイン駆動設計のアーキテクチャデザインパターンとしては、Layered Architectureがあります。その中のApplication Layerは、クライアント側のContextが依存するのにピッタリの場所です。Application Layerを提供するContextはクライアントにとって最適で、かつ最小限のAPIを実装できるからです。


![直接外部のContextのドメインモデルに依存してはいけない](https://qiita-image-store.s3.amazonaws.com/0/889/e7b5215f-d298-9b6c-a818-acf577f35141.png)

## Scalastyleで特定のパッケージに依存できないようにする

背景的な話が長くなってしまいました。。。

要するに何が言いたかったかというと、理論的にはApplication Layerにのみ依存するのがいいということです。が、しかし、開発チーム全員がこのことを常に意識下に置いて開発するのは、現実的ではありません。単に開発者が忘れっぽいというケースだけでなく、IDEが自動importした結果、知らずのうちに依存している場合もあります。

例えば、frontendコンテキストのコードのどこかに`import account.domain.User`と一行書いてしまうだけで、frontendがaccountコンテキストのドメインモデルに依存する状況が、いとも簡単に出来上がってしまうからです…。[^1]

同じコードベースに含まれる以上、Context同士を物理的に離しておく方法は多くありませんが、Scalaの静的解析ツールScalastyleを使うことで、Contextのドメインモデルがスパゲッティに絡み合うことを予防することができます。

やり方は簡単です。`scalastyle-config.xml`にカスタムルールとして下記を追加するだけです。

```xml:scalastyle-config.xml
 <!-- Custom rules -->
 <check level="error" class="org.scalastyle.file.RegexChecker" enabled="true">
   <parameters>
     <parameter name="regex"><![CDATA[myapp\.account\.domain]]>  </parameter>
   </parameters>
   <customMessage>Don't depend on other context domain model directly.</customMessage>
 </check>
 ```
 
 `org.scalastyle.file.RegexChecker`は、`<parameter name="regex" />`に設定した正規表現にマッチするテキストを見つけると警告してくれます。これを活用して、依存してほしくないパッケージ名をパターンに入れておきます。
 
更に、 Scalastyleでエラーがある場合、コンパイルを止めるように build.sbt に設定しておけば、間違ってドメインモデルがimportされたコードが、コードベースにチェックインすることも避けられるでしょう。
 
 もちろん、上記の設定では次のような方法で依存するといった抜け道もあります。
 
 ```scala
import myapp._
import account._
import domain._
 ```

このようなコードも正規表現で排除することもできますが、通常は`import myapp.account.domain`と書くのが普通なので、こうした例外的なコードはコードレビューで発見できればいいのかと思います。できれば、依存関係を静的解析してCIで発見したいところですが。


[Microservices]: http://martinfowler.com/articles/microservices.html
[ShouldBee]: https://shouldbee.at/

[^1]: もちろん、Domain Layerすべてのクラスに`private [account]`とつけることも出来る。
IEでPromiseを利用する

# Promiseとは
Promiseは非同期処理を綺麗に書けるAPIです。
従来は複数の非同期処理を繋げるとコールバック地獄に陥ってしまいがちでしたが、Promiseを利用することで可読性の高いコードを実装することが出来るかと思います。

Promiseについては他の記事が沢山ありますので割愛します。
詳細を学ばれたい方は、@azu氏の [Promiseの本](http://azu.github.io/promises-book/) が解りやすいのでおすすめです。

# 各ブラウザの対応状況
各ブラウザの対応状況は[こちら](http://caniuse.com/#feat=promises)で確認できます。
主要なブラウザは対応しているため問題ありませんが、残念ながらIEは未対応です。

# IEでPromiseを動作させる
IEなどのブラウザでPromiseに対応させる方法はいくつか有りますが、polyfillを読み込む方法が楽かと思います。
polyfillも複数ありますが、個人的には [es6-promise](https://www.npmjs.com/package/es6-promise) がおすすめです。
browserifyやwebpackなどで読み込んでしまうのが良いでしょう。

# IE8以下での注意点
Promiseで非同期処理の結果を受け取る場合、通常は以下のようになるかと思います。
しかしIE8以下では`.catch()`を使うとエラーとなるため、避ける必要があります。
(catchは予約語なので、IE8以下では利用できないのが原因のようです。)

```js
promise.then(function onFulfilled(value){
    console.log(value);
}).catch(function onRejected(error){ // Syntax Error
    console.error(error);
});
```

手っ取り早く解決するには、`.catch`を`["catch"]`に置き換えれば良いでしょう。

```js
promise.then(function onFulfilled(value){
    console.log(value);
})["catch"](function onRejected(error){
    console.error(error);
});
```

`.catch()`を使わず、`.then()`で繋げることも可能です。

```js
promise.then(function onFulfilled(value) {
  console.log(value);
}).then(undefined, function onRejected(error) {
  console.log(error);
});
```

以下の実装でも動作しますが、onFulfilled で例外が発生した際に onRejected が呼ばれないため注意が必要です。

```js
promise.then(function onFulfilled(value) {
  throw new Error(value); // ここで例外が発生しても
}, function onRejected(error) {
  console.log(error); // この関数は呼ばれない
});
```
ReactJS + flummox を ES6 の記述でカウンターのサンプル


## 目的
[Web+DB Press Vol.87 の Flux の記事](http://gihyo.jp/magazine/wdpress/archive/2015/vol87) が素晴らしかったので、サンプルコードの flux-counter([fluxxor](http://fluxxor.com/)) を ES6 の class など使って書ける [flummox](http://acdlite.github.io/flummox) で書き換えてみた。

下記以外ファイルは [雑誌のサンプルコード](http://gihyo.jp/magazine/wdpress/archive/2015/vol87/support) を参照してください。
 - [「Emerging Web Technology研究室」で使用されたソースコード](http://image.gihyo.co.jp/assets/files/magazine/wdpress/2015/87/WDB87-EmergingWebTech-13.zip)


## package

reactify ではなく babelify を使う

```pacage.json
{
  "devDependencies": {
    "browserify": "^10.2.4",
    "flummox": "^3.5.2",
    "react": "^0.13.3",
    "watchify": "^3.2.3"
  },
  "scripts": {
    "watch": "watchify -t babelify src/app.jsx -o dest/app.js -v"
  }
}

```

```
$ npm run watch
```

## code

```app.jsx
import React from 'react';
import { Actions, Store, Flummox } from 'flummox';
import FluxComponent from 'flummox/component';


const constants = {
    UPDATE_COUNTER: 'UPDATE_COUNTER'
};


class CounterStore extends Store {
    constructor(flux) {
        super();

        const counterActions = flux.getActions(constants.UPDATE_COUNTER);
        this.register(counterActions.plusCounter, this.handleUpdateCounter);
        this.register(counterActions.minusCounter, this.handleUpdateCounter);

        this.state = {
            counter: 0
        };
    }

    handleUpdateCounter(payload) {
        this.setState({
            counter: this.state.counter + payload
        });
    }
}

class CounterActions extends Actions {
    plusCounter() {
        return 1;
    }
    minusCounter() {
        return -1;
    }
}

class CounterAppView extends React.Component {
    render() {
        return (
            <div>
                <FluxComponent connectToStores={[constants.UPDATE_COUNTER]}>
                    <CounterView />
                </FluxComponent>
            </div>
        );
    }
}

class CounterView extends React.Component {
    onClickPlus() {
        this.props.flux.getActions(constants.UPDATE_COUNTER).plusCounter();
    }

    onClickMinus() {
        this.props.flux.getActions(constants.UPDATE_COUNTER).minusCounter();
    }

    render() {
        return (
            <div>
                <span>count: {this.props.counter}</span>
                <div>
                    <button onClick={this.onClickPlus.bind(this)}>+1</button>
                    <button onClick={this.onClickMinus.bind(this)}>-1</button>
                </div>
            </div>
        );
    }
}
CounterView.propTypes = {
    counter: React.PropTypes.number
};

class Flux extends Flummox {
    constructor() {
        super();

        this.createActions(constants.UPDATE_COUNTER, CounterActions);
        this.createStore(constants.UPDATE_COUNTER, CounterStore, this);
    }
}

const flux = new Flux();

React.render(
    <FluxComponent flux={flux}>
        <CounterAppView />
    </FluxComponent>,
    document.getElementById('app-container')
);
```

### 参考

- http://gihyo.jp/magazine/wdpress/archive/2015/vol87
- http://acdlite.github.io/flummox
- http://giveitashot.hatenadiary.jp/entry/2015/04/29/141216
VBAでサブフォルダのファイル名取得

With句を使ってメモリを無駄遣いしない実装にしています。

```vbnet:サブルーチンでサブフォルダ取得
'引数のフォルダ配下に存在する全てのファイル情報を取得
'
'  Path:親フォルダパス
'  cnt:回帰用の階層変数.呼び出し元の初期値は0.
'　fileName:回帰用の階層変数.初期値はダミー変数でOK
'
'  return:Vartial変数が暗黙的に定義されていて、文字列の配列が戻値として設定
'　　　　　　ヒント:Forで全量を取得するならUBoundを利用すれば終わりの個数がわかる
'
'　*Note:このメソッドを隠蔽するイベントハンドラがあるとより良い。
Function SubForderLoop(Path As String, cnt As Long, fileName() As String, Optional isSubLoop As Boolean)
    Dim buf As String, f As Object
    buf = Dir(Path & "\*.*")
    Do While buf <> ""
        cnt = cnt + 1
        ReDim Preserve fileName(cnt)
        fileName(cnt - 1) = Path & "\" & buf
        buf = Dir()
    Loop
    If isSubLoop = True Then
        With CreateObject("Scripting.FileSystemObject")
            For Each f In .GetFolder(Path).SubFolders
                Call SubForderLoop(f.Path, cnt, fileName, True)
            Next f
        End With
    End If
    SubForderLoop = fileName
End Function
```
RailsのLogでのパラメータをFILTEREDする。

Railsでpasswordパラメータはデフォルトで見えなくなってますね。

```
Started POST "/users" for ::1 at 2015-06-29 14:16:14 +0900
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZrB1VEJ6B0nd7GxJ/BkxybIpF2jAyqhT6DjCx6YOuOXyK6kRBn75IPeN1RO/DHhEvJ1VyA96H6XHg8Cfsb6Jww==", "user"=>{"email"=>"test@hogehoge.com", "password"=>"[FILTERED]"}, "commit"=>"submit"}
```

ここにemailもLogに見せたくない場合。

```ruby:config/initializers/filter_parameter_logging.rb
Rails.application.config.filter_parameters += [:password]
```
↓

```rb
# emailも付与する
Rails.application.config.filter_parameters += [:password, :email]
```

こうすると、↓になる。


```
Started POST "/users" for ::1 at 2015-06-29 14:18:34 +0900
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZrB1VEJ6B0nd7GxJ/BkxybIpF2jAyqhT6DjCx6YOuOXyK6kRBn75IPeN1RO/DHhEvJ1VyA96H6XHg8Cfsb6Jww==", "user"=>{"email"=>"[FILTERED]", "password"=>"[FILTERED]"}, "commit"=>"submit"}
```
Ubuntu プロキシ設定方法（インターネット）

### 1. [システム設定] を開く

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/81548/e39437ac-f879-93a0-bc6f-9b6b11cc350d.png)

### 2. [システム設定]-[ネットワーク] を選択

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/81548/d283bfd0-d9d0-3518-a647-18706f7de16f.png)

### 3. [ネットワークプロキシ] を選択

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/81548/1ee814a4-eaf3-5d8b-5b99-de43726a83a6.png)

### 4. [メソッド] を [手動] に変更して、プロキシサーバーを入力

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/81548/9d3b2726-0721-7d6e-734f-c0f0b92c7fe0.png)

### 5. [システム全体に適用する] ボタンを押下
aws-sdk v2をつかったDynamoDBからのselect

# RailsでDynamoDBからSelectしたい

例えばusersテーブルからpasswordが123456のレコードを取り出したい場合があるとします。（暗号化はここでは考えないことにする）

MySQLだと

```mysql
select * from users where password = '123456';
```

ActiveRecordだと

```rb
result = User.where(password: '123456')

# 結果のname値を全て表示
result.each do |r|
 p r.name
end
```

ですが、実際にDynamoDBで行う場合はどうしたらいいの？ということで調べました。


```rb
# AWSにアクセスするための基本情報（お約束）
dynamodb_client = Aws::DynamoDB::Client.new(
  # リージョンの選択
  region: ENV['AWS_REGION'],
  # IAMで発行したアクセスキー
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  # IAMで発行したシークレットキー
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'])


result = dynamodb_client.scan({
  # テーブル名ここ
  table_name: 'users',
  select: 'ALL_ATTRIBUTES',
  # 検索したいアイテム
  scan_filter: {'password' => {
    # ここに値
    attribute_value_list: ['123456'],
    # EQはイコールのこと。
    comparison_operator: 'EQ'}}})

# => #<struct Aws::DynamoDB::Types::ScanOutput
# items=
#  [{"id"=>"c09c8d8d-27c5-43ec-93ab-b6bba8e08aed",
#    "name"=>"shota",
#    "password"=>"123456"}],
# count=1,
# scanned_count=1000,
# last_evaluated_key=nil,
# consumed_capacity=nil>

# 結果のname値を全て表示
result.items.each do |i|
 p i['name']
end
```

DynamoDBのClientクラスではqueryメソッドとscanメソッドがあるけど、プライマリーキーやセカンダリーインデックスを使って検索する場合はqueryメソッドを使い、それ以外はscanメソッドを使うといいっぽい。オプションがたくさん用意されているので、下記リンク参照。

## [queryメソッド](http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#query-instance_method)

> A Query operation uses the primary key of a table or a secondary index to directly access items from that table or index.


##[scanメソッド](http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#scan-instance_method)

> The Scan operation returns one or more items and item attributes by accessing every item in a table or a secondary index.
個人的によく使うMySQLとSQliteの対応メモ


##mysqlの接続方法

```
mysql -u ユーザ名 -pパスワード -h ホスト名 -P ポート番号 データベース名
```

## sqliteの起動方法

```
sqlite3 db_file #ファイル名がデータベース名となる
```

## 操作比較

|操作|msqyl|sqlite|
|---|---|---|
|データベースの作成|create database データベース名;| (コマンドライン起動時に)sqlite3 データベース名|
|データベースの確認|show databses;(dbの一覧)|.databases(DBのファイルパスを表示)|
|データベースの指定|use データベース名|(コマンドライン起動時に)sqlite3 データベース名;|
|データベースのテーブル一覧|show tables|.tables|
|テーブルのスキーマの確認|desc テーブル名|.schema テーブル名|
|CLI終了|exit もしくは quit|.quit|

## 調べ方

sqliteの場合は ```.help```コマンドがあるので、sqliteの使いかたが分からない場合はそこを参照したら良い
BigQueryのうるう秒対策

7/1 0時(日本時間の9時)閏秒が挿入される。
通常59秒の次は00秒だが、60秒が追加される。http://www3.nhk.or.jp/news/html/20150628/k10010130831000.html

BigQueryにうるう秒が差し込また時に、きちんと動くかどうかを確認する。

bigqueryへは通常のロードの他に、td-agent経由でデータを入れることが多いので、td-agent経由でデータをインサートする場合も検証する。

## 結論

td-agent,bigqueryへのデータロード共に、 特に対策は必要ないようだ。

## BigQueryのうるう秒対策

### BigQueryが異常な動作をしないか？

うるう秒が入ることで、BigQueryが異常な挙動を示すか？

http://googlecloudplatform-japan.blogspot.jp/2015/05/6-30-1.html

こちらの記事によるとBigQueryは、1秒を20時間にぼかして埋め込むことで、59:60秒を作らないようにしている。そのため、BigQueryが異常な動作をすることは無いだろう。

### BigQueryはうるう秒(60秒)を受け入れるか？

データロードで閏秒を含むレコードを挿入してみると問題なく挿入できた。

```
1 2015-07-01 09:00:00.000 +09:00
2 2015-07-01 08:59:60.000 +09:00
```

みたいなデータをBQにロードしてみると、

```
1 2015-07-01 00:00:00 UTC
2 2015-07-01 00:00:00 UTC
```

のようにエラーなしでデータが入る(60秒は、次の00秒に置換される)。

## fluentdのうるう秒対策

### rubyはうるう秒を送信するか？

タイムゾーンの設定によって、rubyはうるう秒を扱うかどうかが変わる。

http://tmtms.hatenablog.com/entry/2015/01/10/leap-second

通常のタイムゾーンを使用しているので、rubyがうるう秒自体を送信しないだろう(単に一秒ずれる)。

### 他のシステムのログで、うるう秒が含まれている場合

td-agentでtailプラグインを使えば、他のアプリが吐いたログも収集できる(例えばapacheのログとか)。

例えば、あるアプリのログで、`2015-07-01 08:59:60`が含まれている場合、`2015-07-01 09:00:00`として処理される。

```
2015-06-29 17:27:38 +0900 [info]: plugin/in_tail.rb:475:initialize: following tail of /Users/kshibao/Prog/bq/leap_time_test/test2.csv
2015-07-01 08:59:59 +0900 debug.out: {"id":"1","uid":"11","str":"test1","str_time":"2015-07-01 08:59:59"}
2015-07-01 09:00:00 +0900 debug.out: {"id":"2","uid":"12","str":"test2","str_time":"2015-07-01 08:59:60"}
2015-07-01 09:00:00 +0900 debug.out: {"id":"3","uid":"12","str":"test3","str_time":"2015-07-01 09:00:00"}
```

timeを指定したものは、`2015-07-01 08:59:60`を渡しても、`2015-07-01 09:00:00`として処理される。

```
2015-07-01 09:00:00 +0900 debug.out: {"id":"2","uid":"12","str":"test2","str_time":"2015-07-01 08:59:60"}
```

ログの文字列としては、`2015-07-01 08:59:60` として渡されれるが、Rubyの`strptime`を内部で使っているようで、`2015-07-01 09:00:00`として処理される。上のrubyの処理と同じだと考えられる。

## まとめ

BigQueryも、td-agentも特に対応が必要ないようだ。タイムゾーンで、`right/Japan`みたいな特殊なタイムゾーンを指定している場合は、どうなるか調査できていない。
jQueryを利用したDOM操作 要素の追加メソッドまとめ

# はじめに

jQueryでの要素追加メソッドをよく忘れるので、それのメモです。
似たような記事はもう沢山あると思いますが、すぐに思い出せるようコードベースで動きを確認できるようにしています。言葉での説明はあえて省きます。Don't think feel !

> なお実際の動作は↓で確認ができます
> http://nekoneko-wanwan.github.io/demo/jquery/dom/

# とりあげるメソッド

- `append()`
- `appendTo()`
- `prepend()`
- `prependTo()`
- `after()`
- `insertAfter()`
- `before()`
- `insertBefore()`
- `wrap()`
- `wrapInner()`
- `wrapAll()`

# メソッド

## append()
```js
$('ul').append('<li>追加されました</li>');
```

![append.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/76553b2d-fbc0-25e3-065d-67baabc3e8b3.gif)

## appendTo()
```js
$('<li>追加されました</li>').appendTo('ul');
```

![appendTo.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/1ef7b8b1-1c0d-5641-2ede-1f242af756c8.gif)

## prepend()
```js
$('ul').prepend('<li>追加されました</li>');
```

![prepend.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/6f502a98-06be-2273-4345-17613a056980.gif)

## prependTo()
```js
$('<li>追加されました</li>').prependTo('ul');
```

![prependTo.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/692e0fe2-5aee-509a-4641-fa0352b9e55d.gif)

## after()
```js
$('ul').after('<p>追加されました</p>');
```

![after.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/25a265c0-1f58-d129-74ff-575e6eae8dfe.gif)

## insertAfter()
```js
$('<p>追加されました</p>').insertAfter('ul');
```

![insertAfter.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/7d2df16d-8ce0-acab-d9e3-f5142c9bd2e1.gif)


## before()
```js
$('ul').before('<p>追加されました</p>');
```

![before.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/58d77abb-161a-7dc5-a46b-3bfc3e039df9.gif)


## insertBefore()
```js
$('<p>追加されました</p>').insertBefore('ul');
```

![insertBefore.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/0742931e-3611-4d38-a37f-8f7317663883.gif)


## wrap()
```js
$('p').wrap('<div />');
```

![wrap.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/62fd330a-d309-948f-af1c-0c2042523a18.gif)

## wrapInner()
```js
$('li').wrapInner('<span />');
```

![wrapInner.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/dde40221-e2ac-d9a7-4250-f3cf3c0ca72c.gif)


## wrapAll()
```js
$('p').wrapAll('<div />');
```

![wrapAll.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/de93d2ce-e5e8-974e-45f7-7350000c8814.gif)
リアルタイム背景・前景の分離への道（１）

どうもmeanshift追跡が背景ノイズに捕まってしまうことが多いので、リアルタイムに前景と背景を分離し、前景に対してのみmeanshift追跡を適用してみたいと思います。

使うAPIは以下のもの。

[absdiff（日本語リファレンス）](http://opencv.jp/opencv-2svn/cpp/gpu_per-element_operations..html?highlight=absdiff#absdiff)

で、やってみました。

```py
import cv2

cam = cv2.VideoCapture(0)
winName = "Movement Indicator"
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE)

img_past = None
img_now  = None

while True:
    img_past = img_now
    img_now  = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
    if img_now is not None and img_past is not None:
        img_diff = cv2.absdiff(img_now, img_past)
        cv2.imshow(winName, img_diff)
    key = cv2.waitKey(10)
```

直前のフレームと比較して画素に変化があれば、その差分の大きさが大きいほど白くなります。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/QJKgy8jcc18/0.jpg)](http://www.youtube.com/watch?v=QJKgy8jcc18)

今日はここまで。

---
ブログやっています：http://weed.nagoya
OpenGLをMacでcompile出来ない時

macにて
OpenGLを使おうとして、

```gl.cpp
#include <GLUT/glut.h>
```

```
g++ gl.cpp -o gl_cpp
```

すると

```
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

というerrorが出るとき、
```
g++ gl.cpp -o gl_cpp -framework OpenGL -framework GLUT
```
としてcompileが通る
GitHubにあるリポジトリを直接カレントディレクトリに展開する

[sasaplus1-prototype/webpack-base-config](https://github.com/sasaplus1-prototype/webpack-base-config)にwebpackの設定などがしてあるリポジトリがあるので、それを直接カレントディレクトリに展開したい。

```bash
$ curl -L https://github.com/sasaplus1-prototype/webpack-base-config/archive/master.tar.gz | tar xvfz - --strip-components 1
```

これでできた。簡単（？）便利₍₍ (ง ˘ω˘ )ว ⁾⁾

でもリポジトリのURLに`/archive/master.tar.gz`を足す、というのと`- --strip-components 1`を足すというのを覚えてられないかも。`git clone [URL] --separate-git-dir=/tmp`の方がまだ覚えられそう。
チケットにコメントする際に注意する4つのポイント

# すべてのコメントは読まれるために書かれる

1日の内でどのくらいの時間をチケットを探し・読むことに使っていますか？
4スクロール分のコメント列を全て読んでも要領が得られず、結局担当者に聞きに行ったり（そして覚えていないと言われたり）、自分で調べたりすることはないですか？

# コメントを書くときに注意する4つのポイント

* 誰に向けて書いているのか？（対象）
* 何のために書いているのか？（目的）
* 記載する情報の中で最も重要なものは何か？（要点）
* 要点が最短の時間で伝わるようになっているか？（構成）

「なぜそれをコメントに残すのか？」という意図（目的）が明らかになれば、どう書けば目的を達成できるかの判断が楽になります。

情報が増えるほど記載順序や構成に注意が必要になるでしょう。
もちろん最重要なのは記載される「情報そのもの」であって「どう書かれたか」ではありませんが、以下のようなUXデザインに関する知識も情報伝達の助けになると思います。

[Webコンテンツを読む視線の軌跡は“F”を描く](http://u-site.jp/alertbox/20060417_reading_pattern) 
[視野狭窄と選択的注意](http://u-site.jp/alertbox/tunnel-vision)

# よくない構成の例

* 対象…開発者
* 目的…試験結果報告
* 要点
  1. NGの情報（NGがあった場合）
  2. 試験内容

----
**試験環境：** 環境1, 環境2, 環境3
**確認内容：**
* 条件aで期待動作Aになること
* 条件bで期待動作Bになること
* 条件cで期待動作Cになること
* 条件dで期待動作Dになること

**試験結果：**

|           |環境1|環境2|環境3|
|-----------|------------|------------|------------|
|条件aで期待動作Aになること|OK※2※3|/※1|OK※2|
|条件bで期待動作Bになること|※4    |※4 |OK  |
|条件cで期待動作Cになること|OK    |※5 |※6  |
|条件dで期待動作Dになること|OK    |※5※7|※6※7|

※1: 試験対象外
※2: XXの条件で試験すること
※3: OOになることを確認
※4: クラッシュしたので別途記載
※5: 期待動作にならずにYYになる（修正前/後両方で同じ動作）
※6: 期待動作にならずにZZになる
※7: ※5,※6の状態になるが期待動作Dは満たす

## 問題点

**試験結果が把握しづらい**
※印しかない欄は未試験なのかOKなのかNGなのかぱっと見でわからず、表で書いている意味がない

**NG・不明点が注釈に紛れている**
※1以外は注釈とするのは不適切
（※1を確認内容に含めてもよいが、1件しかないので注釈でもよいかと…）

**試験の条件・期待結果が分散して書かれている**
※2: XXの条件で試験すること => 条件aに含めるべき
※3: OOになることを確認 => 期待動作Aに含めるべき

**NGについての情報が不足している**
※6: 期待動作にならずにZZになる => 修正前の挙動を調べて記載する


# 修正例

to: Aさん

試験を行いましたが、下記のような挙動になりました。
確認をお願いします。

* 環境1,環境2で条件bのときクラッシュする（環境3ではOK）
* 環境2,環境3で条件c,条件dのとき、期待動作にならない（NGか、期待動作の誤り？）
  * 環境2の現状動作： YY (修正前/後で同じ挙動)
  * 環境3の現状動作： ZZ (修正前は不再現)
  * YY, ZZ の状態でも期待動作Dは満たす

--
**試験環境：** 環境1, 環境2, 環境3
**確認内容：**

* 条件aで期待動作Aになること
  * 条件aにはXXも含める
  * 期待動作AにはOOも含める
* 条件bで期待動作Bになること
* ...(略)...

**試験結果： NG**

|                     |環境1    |環境2   |環境3   |
|---------------------|--------|--------|-------|
|条件aで期待動作Aになること|OK      |/※1     |OK    |
|条件bで期待動作Bになること| **NG** | **NG** |OK    |
|条件cで期待動作Cになること|OK      | 要確認  | 要確認 |
|条件dで期待動作Dになること|OK      | 要確認  | 要確認 |

※1: 試験対象外

# まとめ

* 目的を持ってコメントを書く
* 長文は読まれにくいので工夫が必要

コメントは情報を必要とする誰かにそれを提供する、秘書のような存在です。
クールで有能な秘書官を育成して、快適なチケット駆動開発ライフを送りましょう。
アーティファクトリポジトリマネージャの比較 Nexus/Archiva/Artifactory

アーティファクトリポジトリマネージャというのは、成果物の管理や配布に使ったり、外部ライブラリのプロキシとして動かしたりするツールの総称。説明はこちらをどうぞ [リポジトリ管理ツール：Artifactoryの紹介 - @ikikko のはてなブログ](http://ikikko.hatenablog.com/entry/20111114/1321285473)。
有名どころ３つについて調べたのでまとめてみた。

調べてみると、RubygemsとかPyPIとかNPMとかNuGetにも対応してて賢い。こういうの使うとライブラリが取得できなくて悲しい思いをするのが減ってよいと思う。

Python書く人間としてはArtifactoryを推したいかな。

Archiva
-----------------

https://archiva.apache.org/

### 開発元

Apache Software Foundation

### 対応リポジトリフォーマット

- Maven

### そのほか目玉機能

シンプルなMavenリポジトリマネージャーなので、これが一番基本になるのではないか。

Nexus
------------------

http://www.sonatype.org/nexus/

### 基本情報

開発元: Sonatype Inc. http://www.sonatype.org/

OSS/PRO/PRO+などいろいろなエディションあり。 [機能比較](http://www.sonatype.com/nexus/try-compare-buy/compare)

### 対応リポジトリフォーマット

- Maven
- Rubygems
- NPM
- NuGet
- Yum
- P2 (PRO以降)
- OSGi Bundle Repository OBR (PRO以降)

OSS版でもRubygems対応とか使えてよい。

### そのほか目玉機能

- LDAP連携
- Atlassian Crowd連携
- システムモニタリング
- 監査対応
- REST API
- Sonarcube連携

などなど。ユーザーベースは一番大きい気がするので、それがメリットかもしれない。Stackoverflowの質問数は[Nexusで973](http://stackoverflow.com/questions/tagged/nexus)、[Artifactoryで613](http://stackoverflow.com/questions/tagged/artifactory)、[archivaで182](http://stackoverflow.com/questions/tagged/archiva)。

Artifactory
--------------------------

http://www.jfrog.com/artifactory/

### 基本情報

開発元: http://www.jfrog.com/

ArtifactoryとBintrayが主なプロダクトっぽい。

OSS/PRO/ONLINE/ENTERPRISEなどいろいろなエディションあり。 [機能比較](http://www.jfrog.com/confluence/display/RTF/Artifactory+Comparison+Matrix)

OSS版はシンプルなMavenリポジトリマネージャーなので、ここではPRO以降のエディションについて記す。

### 対応リポジトリフォーマット

- Maven
- Rubygems
- PyPI
- NPM
- NuGet
- Debian
- Yum
- P2
- Bower
- Git LFS

などなど。なんか対応フォーマット増やすのに命かけてる感じ。

### そのほか目玉機能

- LDAP連携
- Atlassian Crowd連携
- システムモニタリング
- 監査対応
- REST API

などなど。
PHP -a をちょっとだけ便利にするライブラリBoris(と言うのを紹介したかったけど、psyshっていうもっと便利なのがあった。)

##コメントで```psysh```っていうライブラリがあることを指摘して頂いた。

@aooni_kun さんに指摘していただいた。

http://psysh.org/

こっちのほうがもう少し便利そうなので、こっちを使ったほうが良いと思う。

なので、以下のライブラリはこういうのがあったよ。と言うことで。

# Borisとは

Ruby に```irb```と```pry```があるように。

Pythonに```python```と```ipython```があるように。

PHPには```PHP -a```と```boris``` というライブラリがあります。

https://github.com/borisrepl/boris


# インストール

composerでダウンロード出来ます。composerのインストールは別途参照をしてください。

ライブラリを利用しないPHPのCLI環境として利用するならグローバルに、
ライブラリを利用したいのであれば、ローカルにインストールすると良いと思われます。

どっちをインストールしても問題無いので、どっちもインストールするのもありです。

グローバルなら

```
# comopser.phar とか php comopser.phar とかになる可能性もある
composer global require 'd11wtq/boris'
```

ローカルならば

```
# comopser.phar とか php comopser.phar とかになる可能性もある
composer require 'd11wtq/boris'
```

\* macならばbrewなどを使ってもインストール出来る様です。

# 使いかた

global にインストールしている場合、

```
boris
```

ローカルの場合は

```
vendor/bin/boris
```

# 何が便利？

とりあえずオブジェクトや連想配列の出力がいい感じになる。
型ごとに出力の色が異なる様。

# もっと便利な使いかた

composerで```boris```と何かをダウンロードしたディレクトリ以下で ```cli.php```などと名前をつけて以下のように記述し保存。

```php

<?php

require "vendor/autoload.php";

if (php_sapi_name() == 'cli') {
    $boris = new \Boris\Boris();
    $boris->start();
}


```

後に```php cli.php```などと起動すると、comopserでダウンロードしたライブラリをCLIから利用できる様になる。

ちなみにborisを通常起動してから、```require "vendor/autoload.php"```は出来ないので注意
kobito for Windows の設定ファイルの場所

kobito の設定ファイルとは
----------------

kobito for Windows はインストール不要で、ファイルを削除するだけでアインストールが完了します。しかし、アンイストール後に再度ダウンロードして解凍したファイルを実行しても、アンインストール前の環境が自動的に復元されます。これは、PC 上の別の領域に kobito が設定ファイルを保持しているためです。

保存場所
---------

設定ファイルは`%APPDATA%\KaitaBrowser`に保存されます。
`%APPDATA` は Windows Vista 以降で使用可能なショートカット表記です。

バージョン
---------

kobito ver. 1.0.2
Windowsのブラウザテスト用サービス

Node.jsで書かれたDIRT（Data-Intensive Real-Time「大量のデータを扱うリアルタイムな」）なアプリケーションサービス[Browserling](https://www.browserling.com)。

他のブラウザ（IE,Chrome,FF,Safari,Opera）を自分のブラウザ上で処理することができる。StackVMというNode駆動のプロジェクトを利用しているらしい。

下記はフリープランでMacのSafariからFFを起動させたキャプチャ。
![スクリーンショット 0027-06-29 16.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/64427/512a0202-637f-2e0d-42cc-813f1a081e68.png)

Optionを見てみるとSSHトネリングなどもできそうですね。
![スクリーンショット 0027-06-29 16.47.08.png](https://qiita-image-store.s3.amazonaws.com/0/64427/346259cd-0126-668b-7711-969f2db92e4f.png)

無料プランだと3分のセッション制限があるが、実際にWindowsのテストをする時などにはこのサービスを検討してみたいと思う。
[linux]ディレクトリごとrmで削除

```shell:shell
rm 消したいディレクトリのパス 
rm: cannot remove `消そうとしたディレクトリ': Is a directory
```


こんな感じで文句を言われた時。

ようは-rをつければいい。
※当たり前だけど中身のファイルは実行前に確認すること。

```shell:shell
rm -r 消したいディレクトリのパス
```
PythonBoxでのエラー処理

## 概要

PEPPERアプリを開発するときのエラー処理について
PythonBoxでハンドリングする方法のまとめめも。

弊社でやっているUtage Blogからの転用記事です。

http://utage.headwaters.co.jp/blog/?p=4656

## エラー処理の方法

PythonBoxでエラーが発生した際、
ハンドリングしていないエラーの場合はアプリケーションが即座に終了します。

現状では、ロボットが強制終了した場合、
ユーザからはなんの前触れもなく突然終了したように見えてしまうので、
必ずハンドリングしてユーザに伝えるようにしましょう。

Choregrapheで検知できたエラーの場合は、
エラーが発生したボックスが赤くなります。
これはSyntaxErrorなどの場合でも同様です。

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/84155/35aa9cdc-4af6-fedd-2001-aac45b22a2a9.png)


PythonBoxでエラーをハンドリングするためにはいくつかの方法がありますので、
それらの方法について解説していきます。

### 1. try, except

一般的なPythonでのエラー処理のように
try: except: で記述することでエラーをハンドリングできます。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
 
    def onLoad(self):
        pass
 
    def onUnload(self):
        pass
 
    def onInput_onStart(self):
        try:
            raise Exception, "Raise Error."
        except Exception as e:
            self.log(str(e))
 
    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()
```

上記の例では単純にログを吐いているだけなので、
なんのカバーもできてませんが、tryのなかでやっている処理で
例外が発生した場合でもアプリが落ちることはありません。

実際に使うケースだと下記のように使うことが多くなると思います。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
 
    def onLoad(self):
        pass
 
    def onUnload(self):
        pass
 
    def onInput_onStart(self):
        try:
            # エラーが発生しうる処理
            self.onSucceeded()
        except Exception:
            self.onFailed()
 
    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()
```

上のようにraiseされた場合の出力を変えてやることで
PythonBoxでエラーのハンドリングを行えます。


### 2. PythonBox標準の機能を使う

Boxを編集画面でonError出力を追加

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/84155/3d92acfe-b052-e6d8-078e-1ec6ec7ce741.png)

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/84155/df54038d-5cc7-4d87-f92c-6cb575781263.png)

このようにすると
PythonBoxで例外が発生した場合にonError出力から出力されるようになります。

```py
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)
 
    def onLoad(self):
        pass
 
    def onUnload(self):
        pass
 
    def onInput_onStart(self):
        raise Exception, "Raise Error."
 
    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()
 ```

また、onErrorのTypeを文字列にすることで、
raiseしたExceptionのエラーメッセージなどの引数を文字列で出力することができます。
UITableView / UICollectionView の reloadData が完了した直後にセルを参照したい

　UITableView や UICollectionView の `reloadData` を実行した時点ではまだセルのレイアウトが完了していないことがあります。

```objc:-visibleCells
[tableView reloadData];
NSArray *cells = [tableView visibleCells];
```

```objc:-indexPathsForVisibleItems
[collectionView reloadData];
NSArray *indexPaths = [collectionView indexPathsForVisibleItems];
```

　このときの `cells`, `indexPaths` には reloadData で反映する前のセルやインデックス、もしくは nil が返ってくることがあります。それだと困るので、reloadData が完了した後でセルやインデックスを参照できるようにするために強制レイアウトを実行します。

```objc:-layoutSubviews
[tableView reloadData];
[tableView layoutIfNeeded];
NSArray *cells = [tableView visibleCells];
```
　強制レイアウトでは `layoutSubviews` ではなく `layoutIfNeeded` を使用します※。これで reloadData で反映したセルがおそらく得られるかと思いますが、手元で検証したところ、これでもうまくいかない場合があるようです。なので代わりに GCD で対応します。

```objc:dispatch_async()
[tableView reloadData];

dispatch_async(dispatch_get_main_queue(), ^{
	NSArray *cells = [tableView visibleCells];
});
```

※ [UIView Class Reference – layoutSubviews](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/layoutSubviews)
> layoutSubviews
> ~
> You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
drobertadams/toggl-cliをMacに導入する方法

## <i class="fa fa-list" style="font-size:1em;"></i> Outline

1. toggl-cliとは
    2. Mac版のデスクトップアプリ
2. インストール方法 
    3. 登録
    4. ツールのダウンロード
    5. 設定ファイルの生成
    6. 設定ファイルの編集
3. 利用方法
4. 参考URI 

## toggl-cliとは

タイムレコーダーのWebサービスであるTogglをコマンドラインから利用するための非公式ツールです。
(後から忘れた作業を思い出したり、無駄な作業時間を探したりするのにも役立つかも？）

toggl-cliはTogglの公式APIを呼び出していて、類似ツールもいくつか存在しています。

また、Togglはこれから紹介するコマンドラインツール以外のポイントから利用できます。（Webサービス以外にも、iPhoneやデスクトップのアプリも提供している）

Toggl
https://toggl.com/

### Mac版のデスクトップアプリ

Mac版のデスクトップアプリは、メニューバーから利用できるアプリとなっています。
`brew cask install toggldesktop`でインストール可能
http://support.toggl.com/toggl-desktop-for-mac-osx/


## インストール方法

### まずは登録

Toggl
https://toggl.com/

※ googleアカウントでの登録はしないでくさい。
もしかしたら、passwordの再設定から、
アカウントのpasswordを設定できるかもしれませんが、
よくわからないので・・。

### ツールのダウンロードなど

toggl-cliのWebページはこちらになります。
https://github.com/drobertadams/toggl-cli

次のコマンドは、`Applications`にツールを配置する設定です

```bash
brew install python --framework
pip install iso8601
pip install pytz
pip install requests
pip install python-dateutil
cd /Applications/
git clone https://github.com/drobertadams/toggl-cli.git
```
お使いのターミナル環境にあわせてtogglコマンドを使えるようにします
`vi ~/.bash_profile`などでファイルを開き、次の一行を追加してください

```bash
alias toggl="/Applications/toggl-cli/toggl.py"
```

※　編集後は、`source ~/.bash_profile`も実行してください

### 設定ファイルの生成

`toggl`を実行してください。ユーザのルートに設定ファイルが生成されるはずです。


### 設定ファイルを編集する

`vi ~/.togglrc`
- username：設定したeメールアドレス
- password：設定したpassword
- api_token：https://www.toggl.com/app/profile にアクセスすると、下の方に書かれています。
- timezone：Asia/Tokyo

![toggl.png](https://qiita-image-store.s3.amazonaws.com/0/49263/0ad67032-018f-b4ff-cec1-f726d98c0cd7.png)



## 利用方法

コマンドラインでの操作イメージは次のとおりです。

1. `toggl start writeBlog`
2. `toggl stop`

使い方は次のURLの下の方に書かれているので参考にしてください。

引用：https://github.com/drobertadams/toggl-cli

```
Usage: toggl [OPTIONS] [ACTION]

Options:
  -h, --help     show this help message and exit
  -q, --quiet    don't print anything
  -v, --verbose  print additional info
  -d, --debug    print debugging output

Actions:
  add DESCR [@PROJECT] START_DATETIME ('d'DURATION | END_DATETIME)
      creates a completed time entry
  clients
      lists all clients
  continue DESCR
      restarts the given entry
  ls
      list recent time entries
  now
      print what you're working on now
  projects
      lists all projects
  rm ID
      delete a time entry by id
  start DESCR [@PROJECT] [DATETIME]
      starts a new entry
  stop [DATETIME]
      stops the current entry
  www
      visits toggl.com

  DURATION = [[Hours:]Minutes:]Seconds
```



# 参考にしたURI

https://github.com/drobertadams/toggl-cli

http://www.clausconrad.com/blog/toggl-command-line-on-windows

http://stackoverflow.com/questions/11962714/installing-python-dateutil
httpsでgit-reviewをセットアップする際のメモ

某クラスタ内の人々しか使っていないと思われるgit-reviewについて。

たぶん
https://github.com/openstack-infra/git-review/commit/d6df9e8e64bc1dd6d1c2436c5198feb89b212921
この辺くらいから、httpsがちゃんと使えるようになっています。
21世紀になってもまだ大きなFirewallに付き従う我々のような存在には大変有り難い。

以前は`git review -s`とかやってもremoteがsshで29418という異様なハイポートを使う仕様でべた書きされていて、自分でremoteをhttpsに書き換えないといけなかったんですが、

```
git config gitreview.scheme https
git config gitreview.port 443
git config gitreview.username makisyu
```

こんな設定を`git config`しておくと、`git review -s`がhttpsでセットアップされます。
Ref) https://wiki.openstack.org/wiki/Documentation/HowTo/FirstTimers#Accessing_Gerrit_over_HTTP.2FHTTPS

そんなこんなで、改めて`git review -l`とか`-d`とか使ってみたんですが、めっちゃ便利ですねこれ。
processingでベジェ曲線を描く01

ベジェ曲線を描いてみました。各線分を等間隔に分割し、それぞれの分割点を線で
繋いだとき、その交点にあたるのがベジェ曲線の軌跡になります。

![20141210.jpg](https://qiita-image-store.s3.amazonaws.com/0/75611/cc872928-d630-17eb-a00f-fa677ef2613e.jpeg)

~~~java
int order;
int count;

float steps;
float diffs;
float cpx[];
float cpy[];
float bzx[][];
float bzy[][];
float tempx[][];
float tempy[][];

boolean step_flag;
boolean draw_flag;

void setup () {

	size (624, 468);
	colorMode (RGB, 256);
	background (255);
	frameRate (60);
	strokeWeight (1);

	order = 2;
	count = 0;
	steps = 0.00;
	diffs = 0.01;

	cpx = new float[order + 1];
	cpy = new float[order + 1];
	bzx = new float[order][int (1 / diffs)];
	bzy = new float[order][int (1 / diffs)];
	tempx = new float[order][int (1 / diffs)];
	tempy = new float[order][int (1 / diffs)];

	step_flag = false;
	draw_flag = false;

}

void draw () {

	if (step_flag == true && count < int (1 / diffs)) {
		for (int i = 0; i < order; i++) {
			tempx[i][count] = (cpx[i + 1] * (1 - steps)) + (cpx[i] * steps);
			tempy[i][count] = (cpy[i + 1] * (1 - steps)) + (cpy[i] * steps);
			if (i > 0) {
				bzx[i][count] = (tempx[i][count] * (1 - steps)) + (tempx[i - 1][count] * steps);
				bzy[i][count] = (tempy[i][count] * (1 - steps)) + (tempy[i - 1][count] * steps);
				stroke (100, 20);
				line (tempx[i - 1][count], tempy[i - 1][count], tempx[i][count], tempy[i][count]);
				if (count > 0) {
					stroke (255, 0, 0);
					line (bzx[i][count - 1], bzy[i][count - 1], bzx[i][count], bzy[i][count]);
				}
				if (count == int (1 / diffs) - 1) {
					stroke (255, 0, 0);
					line (bzx[i][count], bzy[i][count], cpx[i - 1], cpy[i - 1]);
				}
			}
		}
		steps += diffs;
		count += 1;
	} else {
		step_flag = false;
	}

}

void mouseReleased () {

	background (255);
	steps = 0;
	count = 0;
	cpx = new float[order + 1];
	cpy = new float[order + 1];
	for (int i = 0; i <= order; i++) {
		cpx[i] = random (width);
		cpy[i] = random (height);
		if (i > 0) {
			stroke (100);
			line (cpx[i], cpy[i], cpx[i - 1], cpy[i - 1]);
		}
	}
	step_flag = true;

}
~~~
Visual Studio 2015 RCを使用したAndroidPulugin作成


Visual Studio 2015 RCをインストール

ファイル -> 新規作成 -> プロジェクト
![1.png](https://qiita-image-store.s3.amazonaws.com/0/44773/74c65eb4-91bf-b8c7-7aa6-e3427e03d8bd.png)
で新しプロジェクトというウィンドウが出てくる

Visual C++ -> ClossPlatform -> ダイナミック共有ライブラリ 
![2.png](https://qiita-image-store.s3.amazonaws.com/0/44773/e43432e1-37e0-bdb3-acba-7ba22c6dac4d.png)

を選択しプロジェクトを作成する

ダイナミック共有ライブラリがなかった場合インストーラーを起動し「変更」を選択
オプションの中からVisualC++モバイル開発を選択をして次へを押す
その後更新を押すとインストールが始まる

プロジェクトを作成するとヘッダーファイル(.h)が二つとソースファイル(.cpp)が一つある
ソースファイル内のextern"C"のスコープ内に関数を追加して書く

```c:Pulugin.cpp
extern"C"{
    int Test1(int i){
        return i*100;
    }
}

``` 



上部にあるアクティブソリューション構成をDebugからReleaseに変える
![3.png](https://qiita-image-store.s3.amazonaws.com/0/44773/556ac0be-86ac-d77b-c27e-cea3e31d55b9.png)


デバック -> (プロジェクト名)のプロパティ
![4.png](https://qiita-image-store.s3.amazonaws.com/0/44773/21cca283-8d95-f8a5-051b-38c263f33e5c.png)


を開き
構成プロバティ -> 全般　の中にある　ターゲット名を変える
![5.png](https://qiita-image-store.s3.amazonaws.com/0/44773/ca13895f-f5de-3c6a-39f9-81536f7a061f.png)


初期では
lib$(RootNamespace)
となっている。
これを
libAndroid$(RootNamespace)
のようにプラグイン名を追加する
デフォルトのターゲット名ではビルドしたときにlib.soというファイルができるがUnityで使用する際には最初のlibと.soは省くという決まりがあるために追加する

ビルド -> ソリューションのビルド
![6.png](https://qiita-image-store.s3.amazonaws.com/0/44773/c880bac0-e142-3859-59b1-0579ea1cedfc.png)

を選択する


できた.soファイル(上記の例ではlibAndroid.so)はUnityのプロジェクトの
Asset -> Plugins -> Android フォルダに入れる

使用する際は

```csharp:test.cs
#if UNITY_ANDROID && !UNITY_EDITOR
 [DllImport("Android", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int Test1(int i);
#endif
```
と記述するとAndroidでのみ使用できるようになる

この方法で作成したプラグインはAndroid以外のプラットフォームでは使用できないため
Windows等の別プラットフォームで作成する場合別にプラットフォームを作成しなければならない
この時関数名を同じにしておけば以下のように書ける


```csharp:test.cs
#if UNITY_ANDROID && !UNITY_EDITOR
 [DllImport("Android", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
#else
 [DllImport("WindowsDll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
#endif
private static extern int Test1(int i);

```
以下はWindowsDll.dllというWindowsプラグインに同じような関数を記述したものである

```c:Pulugin.cpp
extern"C"{
   __declspec(dllexport) int Test1(int i){
        return i*100;
    }
}

``` 
DllImportを使用するためには以下を記述する
``` using System.Runtime.InteropServices;```

※7/2 Androidでのみ起動可能ということを書き忘れたため追記
Asterisk 11.6インストールメモ

CentOS 6.6にて

必要なライブラリをインストール

```
$ sudo yum -y install gcc gcc-c++ libxml2 libxml2-devel openssl-devel ncurses-devel sqlite-devel newt-devel libuuid-devel uuid-devel
```

ファイルをダウンロード、解凍、makeなど

```
$ wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-11.6-current.tar.gz
$ tar xzvf certified-asterisk-11.6-current.tar.gz
$ cd certified-asterisk-11.6-cert11
$ ./configure
$ make
$ sudo make install
$ sudo make samples
$ sudo make config
```

いろいろ設定

```
$ sudo vi /etc/asterisk/sip.conf
[general]
context=default
```

ユーザー

```
$ sudo vi /etc/asterisk/users.conf
[6000]
type=friend
username=6000
secret=1234
canreinvite=no
host=dynamic

[6001]
type=friend
username=6001
secret=1234
canreinvite=no
host=dynamic
```

内線

```
$ sudo vi /etc/asterisk/extensions.conf
exten => 200,1,Dial(SIP/6000)
exten => 200,n,HangUp
exten => 201,1,Dial(SIP/6001)
exten => 201,n,HangUp
```

Asterisk起動

```
$ sudo service asterisk start
```

CLI起動

```
$ sudo asterisk -r
```

SIPの接続状況を確認する

```
> sip show peers
```

CLIからのAsterisk再起動

```
> core restart now
```
gist使い方

<h1>gistの使い方をまとめた</h1>
```sudo gem install gist```でインストール
```gist --login```でログイン
```gist ファイル名```で投稿
```gist -d "コメント" ファイル名```でコメント付き投稿
```gist -p ファイル名```でプライベート投稿
```gist -u URL ファイル名```でファイルの更新
```gist -h```でヘルプ
手軽にコードをあげられるから便利
ServerspecのテストをWindowsServerに対して実行する為の前準備


WindowsServerに対して、Serverspecを実行する場合に、Windows側にWinrm(Windowsリモート管理)を有効にする必要がある。
※Serverspecの実行をWindowsでやる手順ではない。
簡単だが、設定しないとServerspecでのテスト出来ないのでメモ。

##手順

####psの実行ポリシー変更(デジタル署名のないスクリプトの実行許可)

※管理者権限で、powershellを起動

```
set-executionpolicy remotesigned -Force
```

####下記でwinrmを有効化

ps1形式で保存して、スクリプト実行すると楽!!

```winrm_enable.ps1 
#リモートアクセスを有効にする
Enable-PSRemoting -Force
 
#タイムアウト設定
Set-Item -Path "WSMan:\localhost\MaxTimeoutms" 1800000
Get-Item -Path "WSMan:\localhost\MaxTimeoutms"
 
#暗号化されていない接続を許可
Set-Item -Path "WSMan:\localhost\Service\AllowUnencrypted" "true"
Get-Item -Path "WSMan:\localhost\Service\AllowUnencrypted"
 
#Basic認証許可
Set-Item -Path "WSMan:\localhost\Service\Auth\Basic" "true"
Get-Item -Path "WSMan:\localhost\Service\Auth\Basic"

```

[参照]http://opcdiary.net/?p=29576
try-with-resources時のclose順について

# はじめに
try-with-resourcesは自動でcloseしてくれる便利な構文です
ただ以下の様な順でインスタンス化したものをcloseする際には順序を逆にしなければいけないですよね
これが正しい順番になるかを検証してみました

(e.g)
1. Aをインスタンス化
2. インスタンスAを用いてBをインスタンス化
→→→→→ これをcloseする際にはB→Aの順でcloseしてほしい

# 結論
ただしくB→Aの順でcloseされる

# 調査内容

```java:TestCloseableA.java
package jp.co.test.autocloseable;
 
public class TestCloseableA implements AutoCloseable {
  
  public TestCloseableA(){
    System.out.println("Aのコンストラクタだよ");
  }
 
  @Override
  public void close() throws Exception {
    System.out.println("AのCloseだよ");
  }
}
```

```java:TestCloseableB.java
package jp.co.test.autocloseable;
 
public class TestCloseableB implements AutoCloseable {
 
  public TestCloseableB() {
    System.out.println("Bのコンストラクタだよ");
  }
  
  @Override
  public void close() throws Exception {
    System.out.println("BのCloseだよ");
  }
}
```

```java:main.java
package jp.co.test.autocloseable;
 
public class TestCloseableA {
  public static void main(String[] args) {
 
    try(TestCloseableA a = new TestCloseableA();
        TestCloseableB b = new TestCloseableB();) {
      System.out.println("Try処理開始");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
```

```console:標準出力
Aのコンストラクタだよ
Bのコンストラクタだよ
Try処理開始
BのCloseだよ
AのCloseだよ
```

問題なく逆になってますね　想定どおりです
railsのコマンドが動かない時はspringを(stop|kill)してみよう

突然railsのmigrationコマンドが動かなくなって泣きそうになりました。
にっちもさっちもいかないので、強制停止するとspring関連のエラログが出ています。


```

$ rails g migration create_publisher_contacts
/Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/run.rb:47:in `gets': Interrupt
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/run.rb:47:in `verify_server_version'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/run.rb:19:in `call'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/command.rb:7:in `call'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/rails.rb:23:in `call'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client/command.rb:7:in `call'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/client.rb:26:in `run'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/bin/spring:48:in `<top (required)>'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/binstub.rb:11:in `load'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/spring-1.1.2/lib/spring/binstub.rb:11:in `<top (required)>'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Users/yokozawa/.rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Users/yokozawa/dev/connect/bin/spring:16:in `<top (required)>'
	from bin/rails:3:in `load'
	from bin/rails:3:in `<main>'

```

とりあえずspringを止めてみましょう。

```

$ spring stop
Spring is not running

```

ファッ！！？！

「なんだこれは・・・？」と考えること５分、そうだプロセス見てみよう。


```

$ ps aux | grep spring
yokozawa        1838   0.0  0.0  2484624   3440 s006  S     2:46PM   0:00.75 spring server | my_app | started 54 mins ago
yokozawa        2682   0.0  0.0  2432772    484 s006  R+    3:41PM   0:00.00 grep spring

```

なんか居たのでkillする。

```

$ kill -9 1838
$ ps aux | grep spring
yokozawa        2684   0.0  0.0  2432772    640 s006  S+    3:41PM   0:00.00 grep spring

```

動いたぜー！

```

$ rails g migration create_publisher_contacts
      invoke  active_record
      create    db/migrate/20150629064143_create_publisher_contacts.rb

```
try-with-resourcesのclose時にflushは走るのか？

# はじめに
Java7.0から導入されたtry-with-resources構文
自動でcloseされるので便利ですが、Bufferedxxx系のflush処理も動作するのか心配だったので確認しました

# 結論
標準APIではflushしてそう
ただし保証されているものではなく実装による（大概は大丈夫だと思うのですが…）

# 調査内容
以下の様なコードを組んで単純に実行してみました
close,fluseをオーバーライドしてコメントを出力しただけですね
※try-with-resourcesでdispose時に実行されるのはcloseメソッドとなります

```java:CustomBufferedOutputStream.java
package jp.co.test.autocloseable;

import java.io.BufferedOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;

public class CustomBufferedOutputStream extends BufferedOutputStream {

  public CustomBufferedOutputStream(OutputStream out) {
    super(out);
  }
  
  @Override
  public void flush() throws IOException{
    System.out.println("OUTPUT flush executed!!");
    super.flush();
  }
  
  @Override
  public void close() throws IOException {
    System.out.println("OUTPUT close executed!!");
    super.close();
  }
}
```

```java:main.java
package jp.co.test.autocloseable;

import java.io.FileOutputStream;
import java.io.IOException;

public class main {
  public static void main(String[] args) throws IOException {
    try (
      FileOutputStream outFile = new FileOutputStream("xyz.bin");
      CustomBufferedOutputStream outBuffer = new CustomBufferedOutputStream(outFile);
    ){
      outBuffer.write(Byte.parseByte("1"));
      outBuffer.write(Byte.parseByte("2"));
    } 
  }
}
```

この結果、以下の様な標準出力が表示されます

```console:標準出力
OUTPUT close executed!!
OUTPUT flush executed!!
```

flushは実行されてますね！
closeが先に実行されてますが、これはオーバーライドして標準出力しているからですね
下記にOpenJDKのコードを示しましたがちゃんとflush→closeの順に処理してます

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/FilterOutputStream.java#FilterOutputStream.close%28%29

```java:FilterOutputStream.java
public void  close() throws IOException {
  try {
    flush();
  } catch (IOException ignored) {
  }
  out.close();
}
```

というわけで問題ないようです
ただ当たり前ですが、これは保証されているわけではなく実装によるところが大きいので念のため気をつけてください
DockerでCentOS7のコンテナを使用する手順を、初めから丁寧に(Mac版)

### 前提

* MacでのDockerは、boot2dockerを使用しますよね。なのでインストール済みであること。
* `docker pull centos:7`で、既にCentOS7のイメージをインストール済みであること。

### 問題点

* centos7のコンテナを、今まで(Centos6系など）と同様に、以下のように起動します。

```
> docker run　-i -t -d -p 8888:80 -p 10022:22 --name="container_name" centos:7 /bin/sh
```

* すると、以下のようなエラーが吐かれてしまいますた。。。

```
Failed to get D-Bus connection: No connection to service manager.
```

### 原因

* CentOS 7ではinitデーモンがsystemdに変更されたため。

### 解決策

* **nsenter** を使って、CentOS7のコンテナを起動すると、うまくいきますよー。ってことで、手順は、以下の通りです。


### nsenterのインストールから、コンテナ起動まで。

* 分かりやすさのため、コマンドプロンプトのマークの意味は、以下のようにします。

	* `>` : OS X 内
	* `$` : boot2docker VM内
	* `%` : Dockerコンテナ内


#### 1. boot2dockerのパスを調べておく

```
> which boot2docker
/usr/local/bin/boot2docker
```

#### 2. boot2docker VMに、sshログイン

```
> boot2docker ssh
```
#### 3. nsenterをインストール

```
$ docker run --rm -v /usr/local/bin/boot2docker:/target jpetazzo/nsenter
```

#### 4. boot2docker VM内のPATHに、`/usr/local/bin/boot2docker`を追加する。

```
$ echo 'export PATH=/usr/local/bin/boot2docker:$PATH' >> ~/.profile
$ source ~/.profile
```

* OS X 内の`.profile`ではなく、**boot2docker VM内**の`.profile`ですよー。気をつけて!!

#### 5. nsenterのパスが通ったか？を確認

```
$ which nsenter
/usr/local/bin/boot2docker/nsenter
```

#### 6. centos7のコンテナを起動

* 「boot2docker ssh」でログイン状態にあることが前提

* ポイント

```
・特権モードにする(--privileged)
・コンテナで起動されるコマンドは/sbin/initにする
```

```
$ sudo docker run --dns 8.8.8.8 --privileged -d -p 8888:80 -p 10022:22 --name="container_name" centos:7 /sbin/init
```

* **`sudo`**を付けてコンテナを起動してね。でないと、後で**Permission Error**というエラーが吐かれちゃうよー。気を付けて!!

#### 7. nsenterを使用してコンテナに入る。

* 良い子は、ここでも、ちゃんと **sudo**を付けようね。

```
$ sudo nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' container_name) -m -u -i -n -p /bin/sh
```


* これでsystemctlが使えます。

```
% systemctl get-default
multi-user.target
```

### 最後に

* うまくいきましたか？　よかったら、ぜひ参考にしてください。
ransackでのOR検索について[Rails gem]

ransackで以下の様なOR検索をしたくなったので調べてみました。

```psql
# (a AND b) OR c
SELECT `tables`.* FROM `tables`  WHERE (((`tables`.`hoge1` = 1 AND `tables`.`hoge2` IS NOT NULL) OR `tables`.`hoge1` = 2))
```


OR検索の記事で見つけたのが以下
http://www.willnet.in/85

コチラを参考にransackの検索条件を作成

```ruby
{
  g: {
    '0' => {
      m: 'or',
      g: {
        '0' => {
          hoge1_eq: 1,
          hoge2_not_null: 1
        },
        '1' => {
          hoge1_eq: 2
        }
      }
    }
  }
}
```

`'0'`とかがすごく気持ち悪いですが検索できるようになりました。
Gitリポジトリ管理のvccwをwindowsに入れる手順


#0.1 コマンドプロンプトを管理者権限で開く

* スタートメニュー＞すべてのプログラム＞アクセサリ＞コマンドプロンプト
右クリックでプロパティを開く

* 「ショートカット」タブの「詳細設定」ボタンを押して
* 「管理者として実行」をチェック
---そのショートカットをタスクバーとかにおいておく。---

* Git,vagrant,virtualboxについてはそのままインストールでよかったはず。これから確認する。

#0.2 その他

* ユーザー名が日本語もしくはディレクトリ名が日本語だとエラーとなるので注意が必要（ユーザー名の場合は環境変数を作るなど）
*

#1 作業ディレクトリの作成
* 顧客のディレクトリで手動でフォルダを作成するかコマンドで作成

```コマンドで作成
mkdir Users/[user_name]/[vccw_dir]
```
#2 ディレクトリに移動

```移動
cd Users/[user_name]/[vccw_dir]
```

#3 既存リポジトリのクローン
ディレクトリを作る場合はオプションで指定

```リポジトリのクローン
git clone [clone_URL] [dir_name]
```

履歴が多い場合はオプション指定することも可能
例えば最新の一つを落とすとき

```クローンしてくる履歴の数を指定
git clone --depth 1 [clone_URL] [dir_name]
```

#4 vagrant up
※ディレクトリ名で日本語を使っているとエンコーディングエラーのような感じでエラーとなるので注意

```
C:/HashiCorp/Vagrant/embedded/gems/gems/childprocess-0.5.3/lib/childprocess/wind
ows/process_builder.rb:43:in `join': incompatible character encodings: Windows-1
251 and UTF-8 (Encoding::CompatibilityError)
```

※macでvagrant upの方がはやくダウンロードできていたような気がする・・気のせいかもしれないですが。
※ホスト書き換えるために

```
vagrant plugin install vagrant-hostsupdater
```

をしたらエラーで動かなくなった。
とりあえず保留。

追記：
vagrant-hostsupdaterを入れる際にbundlerのエラーとでていたのでいれる。
まずその前にrubyも入っていないので
ruby のインストール手動で最新の安定板とかを


```
gem install bundler
```

vagrant hostupdater のインストール・・・やっとはいった。

ここでvagrant upをしてもなぜか「hyepr-vが入っていません。」のようなエラーがでる。
ちょっと検索であさったときのリンクなどは忘れてしまったけどもhyper-vはwindows内で仮想OSを作るアプリケーションらしい。win8以降に入ってるらしい。

virtualbox、vagrantを再インストールして

```
vagrant up
```

でいけました。


今度は[vagrant ssh]ができないみたいなのであとで調べる。

追記：
Git bashでできるようになる
http://www.symmetric.co.jp/blog/archives/533

Git bash でのコピペ
http://arata.hatenadiary.com/entry/2013/10/03/194753