OmniAICreator/Qiita-1.07M huggingface dataset:
Android開発するときのモックAPIサーバ（json:api互換）

## はじめに

node.jsを使ってモックAPIサーバを立てます。

# よくある方法

jsonファイルからAPIサーバのモック作るときは[json-server](https://github.com/typicode/json-server)がいい感じです。下記のようなjsonを用意しておくと `/users`, `/users/1`といったエンドポイントを自動生成してくれます。詳しくは公式ドキュメントを読むといいです。

```json
{
  "users": [
    {"id": 1, "email": "hoge@example.com", "profile": {"id": 1, "name": "coldplay"}},
    {"id": 2, "email": "saba@example.com", "profile": {"id": 2, "name": "deathcab"}}
  ]
}
```

# json:api互換ではjson-serverが使えない

対象のAndroidアプリのバックエンドAPIは [json:api](http://jsonapi.org/) 互換となっています。json:api形式では上記の方法ではうまくいきません。
下記のように単純に配列にオブジェクトが入った状態で表現できないからです。


複数の場合のフォーマット

```json
{
  "data": [
    {"id": 1, "type": "users", "attributes": {"email": "hoge@example.com"}, "relationships": {"profile": {"id": 1, "type": "profiles"}}, "included": [{"data": {"id": 1, "type": "profiles", "attributes": {"name": "coldplay"}}}]},
    {"id": 1, "type": "users", "attributes": {"email": "hoge@example.com"}, "relationships": {"profile": {"id": 2, "type": "profiles"}}, "included": [{"data": {"id": 2, "type": "profiles", "attributes": {"name": "deathcab"}}}]}
  ]
}
```

単数の場合のフォーマット

```
{
  "data": {
    "id": 1,
    "type": "users",
    "attributes": {"email": "hoge@example.com"},
    "relationships": {"profile": {"id": 1, "type": "profiles"}},
    "included": [{"data": {"id": 1, "type": "profiles", "attributes": {"name": "coldplay"}}}]
  }
}
```

# 解法（Expressで実装する）

`src/test/dummy/server.js`

```js
var express = require('express')
var app = express();
var _ = require('lodash-node')

var router = express.Router();

var users = [
    {"id": 1, "type": "users", "attributes": {"email": "hoge@example.com"}, "relationships": {"profile": {"id": 1, "type": "profiles"}}, "included": [{"data": {"id": 1, "type": "profiles", "attributes": {"name": "coldplay"}}}]},
    {"id": 1, "type": "users", "attributes": {"email": "hoge@example.com"}, "relationships": {"profile": {"id": 2, "type": "profiles"}}, "included": [{"data": {"id": 2, "type": "profiles", "attributes": {"name": "deathcab"}}}]}
]

function find(resources, id) {
  return _.find(resources, function(resource) {
    return parseInt(resource.data.id) === parseInt(id);
  })
}

function toCollectionFmt(resources) {
  return _.reduce(resources, function(acc, resource) {
    acc['data'].push(resource.data)
    return acc
  }, { data: [] })
}

router.get('/:resources', function(req, res) {
  console.log('get: ' + req.params.resources)
  res.json(toCollectionFmt(eval(req.params.resources)))
})

router.get('/:resources/:id', function(req, res) {
  console.log('get: ' + req.params.resources + '/' + req.params.id)
  resource = find(eval(req.params.resources), req.params.id)
  res.json(resource)
})

app.use('/', router)
app.listen(3000)

console.log('the server is ready!')

```

# json:api

json:apiはYahuda Katzによって提唱された規格で、HALなどで問題となっていた相互参照によるネスト問題などを、フラットに出力することで解決してくれる良いものです。一読あれ。

# Links
retrofitでjson:apiを扱う方法を今度書きます。
retrofit + realmで実践的なアプリを書く方法を今度書きます。
nginxでリクエスト開始時刻をログに出力する

nginxがログに出力する時刻はリクエスト処理が終わった時点の時刻のため、障害対応時など、いつ開始したリクエストから問題が出たのかを調査するために開始時刻もログにだしたいことがあります。

nginx単体ではリクエスト開始時刻にアクセスする方法が見つけられなかったのですが  [lua-nginx-module](https://github.com/openresty/lua-nginx-module) を使うと以下のようにできました。

```conf
set_by_lua_block $start_time {
    return os.date("%Y-%m-%dT%T%z", ngx.req.start_time());
}
```

`ngx.req.start_time()` でリクエスト開始時刻のunix timeが取れるので、それを `os.date()` でフォーマットして変数に設定し、ログでは `$start_time` 変数を出力する形です。

```
log_format ltsv 'time:$time_iso8601\t'
                'start_time:$start_time\t'
...
```

出力結果

```
time:2016-03-29T12:33:15+09:00	start_time:2016-03-29T12:33:14+0900
```

timezone部分が `$time_iso8601` と異なり `:` が入らないのが若干気持ち悪いですが…
Zybo > Chronicles blog 08 > XADCによる internal temperature and voltage測定 > XAdcPs_GetAdcData() / XAdcPs_RawToTemperature() / XAdcPs_RawToVoltage()

@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/MicroZed-XADC-Software-Adam-Taylor-s-MicroZed-Chronicles-Part-8/ba-p/383861

XADCによる internal temperature and voltage測定

> Reading a sample from the XADC can be as simple as calling the function "XAdcPs_GetAdcData()." For the internal temperature and voltage parameters, I then used two of the provided macros -- "XAdcPs_RawToTemperature()" and "XAdcPs_RawToVoltage()" -- to convert the raw XADC values into their real-world temperature or voltage equivalents.

- XAdcPs_GetAdcData()
- XAdcPs_RawToTemperature()
- XAdcPs_RawToVoltage()
UbuntuにTensorFlowをインストール


### パッケージアップデート
```
$ sudo apt-get update
```

### Pythonのバージョン確認
```
$ python -V
Python 2.7.9
```

### pipインストール
```
$ sudo apt-get install python-pip python-dev
```

### TensorFlowインストール
```
# CPUのみ 今回はこっち
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

# GPUはこっち
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl

```

### テストで動かしてみる
```
$ python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> sess.run(a+b)
42
>>>

```

うごいた
nginxでproxy_pass先にSNIなhttpsを指定する

nginxで `proxy_pass` する先を SNI ではない HTTPS から SNI な HTTPS (具体的には CloudFront) へ変更したらハマったのでメモ。

こんなログがでて接続できない。

```
[error] 21711#0: *32897 SSL_do_handshake() failed
 (SSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure)
 while SSL handshaking to upstream,
 client: ****, server: ****, request: "GET / HTTP/1.1",
 upstream: "https://****", host: "****"
```

nginx 1.7.0 以降で proxy 先への SNI 対応が入っているので、`proxy_ssl_server_name on` して解決しました。

```
resolver 127.0.0.1;
set $server "sni.example.com";
location / {
    proxy_ssl_server_name on;
    proxy_pass https://$server;
}
```
よく使うけど忘れがちな sublime text のショートカット ( Mac ) 

* コマンドパレットの表示
  * Shift + command + p
* ブックマーク
    * command + F2
* タブ移動
    * command + Shift + `[` or `]`
* ブロックコメント
    * command + option + /
* 1行コメント
    * command + /
* 行の選択
    * command + `l`
* 行の削除
    * control + Shift + k
Ruby on Rails カラムの追加と削除


# マイグレーションスクリプトの作成

マイグレーションを使ってテーブルに変更を行う場合、以前のマイグレーションスクリプトを修正するのではなく、変更を加える為の別のマイグレーションスクリプトを作成し実行します。

モデルを作成する時に自動で作成されるものではなく、新しくマイグレーションスクリプトを作成するには次のように実行します。

```
rails generate migration クラス名
```

クラス名は任意ですが、通常は「行なう処理＋テーブル名」のようになります。
例えば`AddColumnTitles`です。

```
rails generate migration AddColumnTitles
```

マイグレーションスクリプトファイルが`db/migrate/20120416054354_add_column_titles.rb`に作成されており中身は次のようになっています。

```rb
class AddColumnTitles < ActiveRecord::Migration
  def up
  end

  def down
  end
end
```
中身が空の`up`メソッドと`down`メソッドが定義されてクラスが記述されています。クラス名は先程実行する時に指定したクラス名となっています。
あとは実行した処理を`up`メソッドの中に記述し、変更を元に戻すための処理を`down`メソッドの中に記述します。

```rb
class AddColumnTitles < ActiveRecord::Migration
  def up
    add_column :titles, :place, :string
  end

  def down
    remove_column :titles, :place, :string
  end
end
```
これでテーブルに変更を加えるためのマイグレーションスクリプトが完成しました。

# カラムの追加と削除

カラムの追加、またはカラムの削除を行いたい場合、`rails generate migration`を実行する時に特別な規則に従った名前を指定し、引数に追加又は削除するカラム名とデータ型の組み合わせを指定することで、自動的に`add_column`又は`remove_column`メソッドを呼び出す文がスクリプトファイル内に記載されます。

書式は次のとおりです。

```
rails generate migration クラス名 カラム名:データ型( カラム名:データ型)
```
クラス名は`AddXXXToYYY`または`RemoveXXXFromYYY`とします。
`YYY`にはテーブル名を指定します。
`XXX`には追加又は削除するカラム名を指定するのですが違う文字列でも構いません
(複数のカラムを同時に追加する場合などは指定できないので)。

## カラム追加
では実際に実行してみます。まずは`integer`型の`price`カラムと`string`型の`author`カラムを追加してみます。

```
rails generate migration AddDetailsToTitles price:integer author:string
```

マイグレーションスクリプトファイルが`db/migrate/20120416072618_add_details_to_titles.rb`に作成されており中身は次のようになっています。

```rb
class AddDetailsToTitles < ActiveRecord::Migration
  def change
    add_column :titles, :price, :integer

    add_column :titles, :author, :string

  end
end
```
クラス名で指定したテーブルに対して指定した2つのカラムを追加するための文が記述されています。(`add_column`と`remove_column`の呼び出したがそれぞれ使われるため、`up`メソッドと`down`メソッドではなく`change`メソッドが使われています。

## カラム削除

次に先程追加した`string`型の`author`カラムを削除してみます。

```
rails generate migration RemoveAuthorFromTitles author:string
```

マイグレーションスクリプトファイルが`db/migrate/20120416074444_remove_author_from_titles.rb`に作成されており中身は次のようになっています。

```rb
class RemoveAuthorFromTitles < ActiveRecord::Migration
  def up
    remove_column :titles, :author
      end

  def down
    add_column :titles, :author, :string
  end
end
```

クラス名で指定したテーブルに対してカラムを削除するための文が記述されています。(この場合は`change`メソッドではなく`up`メソッドと`down`メソッドを分けて記述する必要があります)。

このように比較的使われるとカラムの追加と削除についてはここでご紹介した方法を使うと少し簡単にマイグレーションスクリプトを作成できます。

# マイグレーションスクリプトの削除

```
rails destroy migration クラス名
```
の書式で、削除できます。

```
rails destroy migration AddColumnTitles
```
Excelで、重複しないデータだけを表示する（フィルタ）

## 環境
Microsoft Office Home and Buisiness 2013
Excel

## やりたいこと

重複するレコードを非表示に。（レコードでユニークと、１項目のユニーク）

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/dd88d2b4-75bd-9946-56f6-d059730c6cbc.png)
　　　　　　　　↓ 
レコードでユニーク
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/c97fcf69-4b95-b73b-0aa7-48574a632491.png)

１項目のユニーク（名前だけでユニーク）
![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/cc86436d-440a-b686-0ea1-f5761104c7d5.png)


## 方法

レコードでユニークの場合：テーブルを全て選択
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/5cca7e70-f0dd-4d89-ba88-51208dcbb858.png)

１項目でユニークの場合：ユニークにする列のみ選択
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/41345141-41a3-96f2-2bad-f18db184b78b.png)


データ > フィルター 詳細設定
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/6bec049f-4d40-5aea-1d2e-3802c6772b4a.png)

「重複するレコードは無視する」にチェックを入れる
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/6fd3287f-d8ce-124d-868a-f776fa384b63.png)



## 参考にしたページ （わかりやすかった順）
- http://kokodane.com/2013_waza_044.htm
- http://office-qa.com/Excel/ex16.htm
- https://support.office.com/ja-jp/article/%E9%87%8D%E8%A4%87%E3%81%97%E3%81%AA%E3%81%84%E5%80%A4%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E9%87%8D%E8%A4%87%E3%81%99%E3%82%8B%E5%80%A4%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-ccf664b0-81d6-449b-bbe1-8daaec1e83c2
mongoose バリデーションパターンまとめ

## バージョン
MongoDB: 3.0.7
mongoose: 4.3.6

## ビルトインバリデータ

### String
`enum`: リストにない値をはじく

```js
var SakeSchema = new Schema({
  sakeType: {
    type: String,
    enum: ['Junmai', 'Ginjo']
    // 'Junmai'はOK
    // 'JunmaiDaiGinjo'はエラー
  }
});
```

`match`: 正規表現にマッチしない値をはじく

```js
var SakeSchema = new Schema({
  sakeType: {
    type: String,
    match: /\.*Junmai\.*/
    // 'JunmaiGinjo'はOK
    // 'Ginjo'はエラー
  }
});
```

`maxlength`, `minlength`: 最大,最小文字数

```js
var SakeSchema = new Schema({
  sakeType: {
    type: String,
    maxlength: 10,
    minlength: 2
    // 'Junmai'はOK
    // 'TokubetsuJunmai'はエラー
  }
});
```

### Number
`max`, `min`: 最大,最小値

```js
var SakeSchema = new Schema({
  alcoholContent: {
    type: Number,
    max: 21,
    min: 0
    // 21はOK
    // 0はOK
    // 22はエラー
    // -1はエラー
  }
});
```

### 共通
全てのスキーマタイプで使えるバリデータに、`required`, `unique`がある。それぞれ必須制約とユニーク制約をかけるバリデータ。

```js
var SakeSchema = new Schema({
  brand: {
    type: String,
    required: true,  // 空文字はエラーになる
    unique: true
  }
});
```

## カスタムバリデータ
ビルトインバリデータでは不十分な場合に独自にバリデータを作ることができる。

自分が作ったバリデータを紹介。

### Emailバリデータ

```js
var emailValidator = {
  validator: function(v) {
    var pattern = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
    return pattern.test(v);
  },
  message: '`{VALUE}` is invalid syntax of `{PATH}`'
}

var UserSchema = new Schema({
  email: {
    type: String,
    validate: emailValidator
  }
});
```

### 数値バリデータ(0以上の整数)

```js
var positiveIntegerValidator = {
  validator: function(v) {
    var pattern = /^([1-9]\d*|0)$/;
    return pattern.test(v);
  },
  message: '`{VALUE}` is invalid value. `{PATH}` should be a positive integer'
}

var SakeSchema = new Schema({
  polishingRate: {
    type: Number,
    max: 100,
    min: 0,
    validate: positiveIntegerValidator
    // 0-100の整数以外はエラー
  }
});
```

### 配列サイズバリデータ

```js
var arrayLengthValidator = function(len) {
  return {
    validator: function(v) {
      return v.length <= len;
    },
    message: '`{PATH}` can be stored up to ' + len
  }
}

var SakeSchema = new Schema({
  pictureUrl: {
    type: [{
      type: String
    }],
    validate: arrayLengthValidator(10)
    // 写真のURLは10個まで保存可能
  }
});
```

## プラグイン
スキーマはプラガブルになっていて、公開されているプラグインを使ってスキーマを拡張することができるようになっている。

便利なプラグインを一つ紹介。
[mongoose-id-validator](https://github.com/CampbellSoftwareSolutions/mongoose-id-validator)は参照制約をチェックするバリデータで、参照先ドキュメントが存在しない場合にエラーを出してくれる。

```js
var idValidator = require('mongoose-id-validator');

// 参照バリデータを全てのスキーマに適用
mongoose.plugin(idValidator);

var SakeSchema = new Schema({
  customer: {
    type: Schema.Types.ObjectId,
    ref: 'Customer'
    // 'Customer'コレクションに存在しないObjectIdを指定したらエラー
  }
});
```
打倒Gmail(Gemのほう)

現状rubyでgmailを使おうと考えていると

* [gmail](https://github.com/gmailgem/gmail)
* [ruby-gmail](https://github.com/gmailgem/gmail)

ここになる。
とはいえ以前の記事にも書いたが、上記を使用しようとする場合
・2段階認証をOFFにして安全性の低いアプリのアクセスを許可するか
・2段階認証をONにするかわりにアプリパスワードというものを発行するかになる
http://qiita.com/hata-yusaku/items/8d701c934b143e490599

セキュリティどうなのって話が出たりして、微妙な感じ。
googleはapi提供してくれているのでそれを使いたい
とりあえず作ってみた

https://github.com/hatappi/send_gmail

インストールは


```rb
gem 'send_gmail'
```

## 認証について

googleのapi周りはユーザー認証, OAuth周りで挫折することがあるので、
できるだけ手軽にできる用にgemに内包しました

```rb
$ client = SendGmail::Client.new
$ client.authorize(credentials_path, client_id, client_secret, scope)
```

* credentials_path
  * 認証情報を保存しておくパス(json)。
  * ない場合はブラウザが起動して認証後に情報を保存してファイルがあるときはそれを利用して認証する
* client_id, client_secret
  * https://auth0.com/docs/connections/social/google
* scope
  * https://developers.google.com/gmail/api/auth/scopes

## メール取得
```rb
$ mail_list = client.mail_list(searching_option)
  => {
   :mail_id_list => [#<SendGmail::Objects::Mail... , ...],
   :next_page_token => "123456789"
   }
```
* searching_option
  * これはgmailでいう検索。文字列で指定する。詳細に関しては下記を参考にして指定するとよさそう
  * https://support.google.com/mail/answer/7190

## メール送信
```rb
$ client.send_mail(to, subject, msg, from = nil, bcc = nil, cc = nil, user_id = 'me')
  => 200
```
ここらへんのパラメータはパラメータ名を参考にしてもらえると良いかもしれません。
正しいく送信できればstatus code 200がかえってきます

## 最後に
まだまだ未完成なものなのでissueなりPRなどがんがん飛ばしてください！
ドキュメント駆動 REST API テストフレームワーク


<img src="https://raw.githubusercontent.com/matryer/silk/master/other/SilkLogo-256.png" />

# Silk

[matryer/silk](https://github.com/matryer/silk)

Markdownで書かれた、REST-APIの設計書からテストケースを生成して、テストを実行することができます。

# Install

以下から、環境にあった実行ファイルをダウンロードした後、
silkコマンドが実行できるようにパスが通った所に配置してください。

[matryer/silk/releasees](https://github.com/matryer/silk/releases)

# Tutorial


## 1. ドキュメントを作成

- hello.silk.md

<pre>
# Hello API

## `GET /hello`

Gets a personalised greeting.

* `?name=hikouki` // The name of the person to greet

===

* Status: `200`

```
Hello hikouki.
```
</pre>

## 2. テストを実行

```bash
$ silk -silk.url="http://outlearn-hello.appspot.com" hello.silk.md
```

テストが実行され、PASSされることがわかると思います。

`http://outlearn-hello.appspot.com`は`name`パラメタの値と、
文字列`Hello`を結合して`Hello <name>`を返すAPIになります。

`?name=hikouki`の値を変えて、テスト結果を変えて見てみると動きがわかると思います。

## おわり

詳細は [matryer/silk](https://github.com/matryer/silk) を参照ください。

この記事は[こちら](https://medium.com/@matryer/introducing-silk-markdown-driven-api-tests-1f8cfb0ef99a#.bq9g1mfxa)を引用しています。
CentOS6.5　php7　にowncloudをインストール

CentOS6.5のphpを7に変更したあとで、Owncloudをインストールする。

`$ sudo yum -y --enablerepo=remi install owncloud`
とインストールしたら

`Error: Package: php-ldap-5.4.45-5.el6.remi.x86_64 (remi)
Error: Package: owncloud-server-8.1.6-13.1.noarch (isv_ownCloud_community)`
と怒られた。


`Installed: php-common-7.0.4-1.el6.remi.x86_64 (@remi-php70)`
のメッセージをヒントに

`$ sudo yum -y --enablerepo=remi,remi-php70 install owncloud`
           
としたら、Complete!　となった。


これでOKと思ったら、
http://xx.xx.xx.xx/owncloud/ にアクセスすると

`This version of ownCloud is not compatible with PHP 7.`
`You are currently running 7.0.4. Please use at least ownCloud 8.2.0.`
と言われてしまった。

8.2にすればいいのね、ということで
`$ sudo wget http://download.owncloud.org/download/repositories/8.2/CentOS_6/ce:8.2.repo -O /etc/yum.repos.d/ce:8.2.repo`
`sudo yum install owncloud`
としたら、
やっとブラウザに初期設定画面が表示されました。
RackアプリケーションのエンドポイントをHTTPを経由せずに呼び出す方法

概要
----

たとえば Sinatra でとあるエンドポイントから他のエンドポイントから呼び出したくなったこと、ありませんか？

```rb
require "sinatra/base"
class WebApp < Sinatra::Base
  get "/" do
    # ここで /callee を実行して、その返り値を得たい
    # でもHTTPリクエスト経由にはしたくない
  end

  get "/callee" do
    "From /callee data"
  end
end
run WebApp
```

論よりコード
----------

```rb
require "sinatra/base"
class WebApp < Sinatra::Base
  get "/" do
    status, headers, content = WebApp.call(Rack::MockRequest.env_for("/callee"))
    "I am '/' #{content.first}"
  end

  get "/callee" do
    "From /callee data"
  end
end
run WebApp
```

```console
$ curl localhost:9292/
I am / From /callee data
```

解説
----

Rack::MockRequestを使ってリクエストを行ったように見せる方法です
rack/test で使われている方法を参考にしました

Sinatraに限らず、RailsやGrapeでも使うことができます

注意: `content`のデータ構造はフレームワークによってマチマチなので、適当に合わせてください (e.g. Grapeは content.body が実データ(Array)になります)

あとがき
-------

そもそも、こうならないように設計すべきですけど
これじゃテストもやりにくいし
【swift2】透明UIButtonのハイライトがStoryboardで設定できるようになーるExtension

# 経緯
+ UIViewの上に透明UIButtonを置いて実装することがあった

# 問題点
+ defaultでハイライトの設定ができるのはImageとかBackgroundImage
+ 半透明画像を用意して設定しても大きさが変わると面倒くさい

# したいこと
+ ハイライトのときのUIButtonのBackgroundColorを設定したい
+ addTargetする方法もあるが、どーせならStoryBoardの方がかっこいい
+ swift2.Xに対応したコードがほちい
+ ついでにextension作ってしまおう！

# Extension

```swift

private var HighlightedBackgroundColorKey = 0
private var NormalBackgroundColorKey = 0

extension UIButton {
    
    @IBInspectable var highlightedBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &HighlightedBackgroundColorKey) as? UIColor
        }
        
        set(newValue) {
            
            
            objc_setAssociatedObject(self, &HighlightedBackgroundColorKey, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
    
    private var normalBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &NormalBackgroundColorKey) as? UIColor
        }
        
        set(newValue) {
            
            objc_setAssociatedObject(self, &NormalBackgroundColorKey, newValue, .OBJC_ASSOCIATION_RETAIN)

        }
    }
    
    override public var backgroundColor: UIColor? {
        didSet {
            if !highlighted {
                normalBackgroundColor = backgroundColor
            }
        }
    }
    
    override public var highlighted: Bool {
        didSet {
            if let highlightedBackgroundColor = self.highlightedBackgroundColor {
                if highlighted {
                    backgroundColor = highlightedBackgroundColor
                } else {
                    backgroundColor = normalBackgroundColor
                }
            }
        }
    }
}


```

# 使い方

+ UIButtonをどっかにおく！
+ HighlighedColorが設定できる！

<img width="261" alt="Screen Shot 2016-03-29 at 11.07.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/8187a606-58d6-a120-a4c5-e9e9114486a3.png">


+ これで透明UIButtonをおいても、ハイライトがわかりやすくなった

# 最後に
+ そんな大したことないですが、参考までにどうぞ
Linux　USBオーディオデバイスの優先順位を上げる

linux（kona linux3.0）に、USBオーディオデバイスを挿して音声認識(julius)やる準備として
USBオーディオデバイスの優先順位を上げようかと

raspberry piで同様の設定をしたことあるので下記の様に、、

使用したusbデバイスは「plugable USB Audio Adopter」

cat /proc/asound/modulesで確認すると

0 snd_hda_intel
1 snd_usb_audio

/etc/modprobe.d/alsa-base.confを編集すればいいねと思って探したけど、、alsa-base.confが無い。。

いろいろ調べて、/etc/modprobe.d/にsound.confというファイルを作って

options snd_usb_audio index=0
options snd_hda_intel index=1

と書けばOK。

再起動して、cat /proc/asound/modulesで確認すると

0 snd_usb_audio
1 snd_hda_intel
論理演算子OR で条件を書くとださくなっちゃうときの自分なりの解決法

論理演算子OR で条件を書くとださくなっちゃうときの自分なりの解決法です。
あくまで個人的にこっちのほうがいいんじゃね！？という突発的な投稿なので、あしからず。

まず、前提として、このような条件文があったとします。

`変数teamに入っている値が :dortmundか:milanの時にtrue`

普通に書くなら、こうですね。

```
team == :dortmund || team == :milan
```


ついついこう書きたくなっちゃいますが、これはだめ

```
team == :dortmund || :milan
```

先に `team == :dortmund`が評価され、
もしtrueだったらtrueが返り、
もしfalseだったら、||　の右辺が返るだけですね。
つまり、

```
1. team == :dortmund # もしteamが:dortmundだったらtrueが返る。falseだったら、2へ。
2. false || :milan   # :milanは論理演算子的にはtrueなので、:milanが返る。
```
こういう流れになっています。
これではいけません。

かといってこれもだめ

```
team == (:dortmund || :milan)
```

trueかfalseになりますが、
まず()の中の||の左辺が返り、
左辺とteamの評価が行われるだけ。

```
1. (:dortmund || :milan) # :dortmundが返る。:milanは絶対に返らない。
2. team == :dortmund　　 # 1の結果は:dortmundなので、こういう評価になる。
```

いけませんね。


論理演算子で書くならば、やはりこうしないといけないんですね。

```
team == :dortmund || team == :milan
```
これならば思っている通りに動いてくれそうです。

しかしダサいですね。僕はいつもこれを書くたびに吐きそうになっていました。
なんでteam == を2回も書かせるんだよ！条件式が長くなるだろって。
今もこの記事を書きながら吐きそうです。

そしてついに先ほど、見つけました。これを吐かずに書く方法を。

###　こちらです！

```
%i(dortmund milan).include?(team)
```

これならば僕は満足、気分よく条件分岐をしてやれますよ。
たとえば　`:arsenal`　も条件に加えたくなったら、%i()の中に足せばいいだけ。

もし同じように吐きそうになっている方がいらっしゃいましたら幸いでございます。

Ruby最高！気持ちいい！
[Swift] 画面サイズ、statusBar、navigationBar、tabBarなどの高さを取得するのをまとめた

# 目的
よく使う、statusBar、navigationBar、tabBarの高さや、画面サイズの取得をまとめた。

# 方法

```swift
import UIKit

struct DeviceSize {
    
    //CGRectを取得
    static func bounds() ->CGRect {
        return UIScreen.mainScreen().bounds
    }
    
    //画面の横サイズを取得
    static func screenWidth() ->Int {
        return Int(UIScreen.mainScreen().bounds.size.width)
    }
    
    //画面の縦サイズを取得
    static func screenHeight() ->Int {
        return Int(UIScreen.mainScreen().bounds.size.height)
    }
    
    static func statusBarHeight() -> CGFloat {
       return UIApplication.sharedApplication().statusBarFrame.height
    }
    
    static func navBarHeight(navigationController: UINavigationController) -> CGFloat {
        return navigationController.navigationBar.frame.size.height
    }
    
    static func tabBarHeight(tabBarController: UITabBarController) -> CGFloat {
        return tabBarController.tabBar.frame.size.height
    }
    
}
```
カメラの消失点を移動させる

Unityを使うと、カメラ左右に並べるだけで[簡単にVRコンテンツを作成する](http://qiita.com/ELIXIR/items/084839ae0824985fcfaf)ことができます。

ただ昨今のスマホは大きいので、普通に画面に表示すると左右に並べた画像の中心が目の距離より大きくなり、立体視がしにくくなってしまいます。

そんな時は[カメラの消失点を移動させる](http://docs.unity3d.com/ScriptReference/Camera-projectionMatrix.html)ことで違和感を緩和できます。

*Cameraオブジェクトにアタッチして使用できるよう下記コードを修正しました。*

```c#:VanishingPointCtrl.cs
using UnityEngine;
using System.Collections;

namespace CameraUtils
{
    [HelpURL("http://docs.unity3d.com/ScriptReference/Camera-projectionMatrix.html")]
    [RequireComponent(typeof(Camera)), ExecuteAlways]
    public class VanishingPointCtrl : MonoBehaviour
    {
        [SerializeField, Range(-0.1f, 0.1f)] private float offsetX = 0f;
        [SerializeField, Range(-0.1f, 0.1f)] private float offsetY = 0f;
        Camera m_camera;

        void Start()
        {
            m_camera = gameObject.GetComponent<Camera>();
        }

        void LateUpdate()
        {
            if (m_camera == null)
            {
                m_camera = gameObject.GetComponent<Camera>();
            }
            SetVanishingPoint(new Vector2(offsetX,offsetY), m_camera);
        }

        static public Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far)
        {
            float x = (2f * near) / (right - left);
            float y = (2f * near) / (top - bottom);
            float a = (right + left) / (right - left);
            float b = (top + bottom) / (top - bottom);
            float c = -(far + near) / (far - near);
            float d = -(2f * far * near) / (far - near);
            float e = -1f;
            Matrix4x4 m = new Matrix4x4();
            m[0, 0] = x; m[0, 1] = 0f; m[0, 2] = a; m[0, 3] = 0f;
            m[1, 0] = 0f; m[1, 1] = y; m[1, 2] = b; m[1, 3] = 0f;
            m[2, 0] = 0f; m[2, 1] = 0f; m[2, 2] = c; m[2, 3] = d;
            m[3, 0] = 0f; m[3, 1] = 0f; m[3, 2] = e; m[3, 3] = 0f;
            return m;
        }

        static public void SetVanishingPoint(Vector2 perspectiveOffset, Camera cam)
        {
            cam.ResetProjectionMatrix();
            Matrix4x4 m = cam.projectionMatrix;
            float w = 2f * cam.nearClipPlane / m.m00;
            float h = 2f * cam.nearClipPlane / m.m11;
            float left = -w / 2f - perspectiveOffset.x;
            float right = left + w;
            float bottom = -h / 2f - perspectiveOffset.y;
            float top = bottom + h;
            cam.projectionMatrix = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
        }
    }
}
```

![ss0.png](https://qiita-image-store.s3.amazonaws.com/0/59911/c29414f6-8431-05ba-14c5-ac27ad296668.png)

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/59911/66dc4763-d3a5-1f34-8ffc-fd8ea9a82075.png)

VR以外でも、「画面全体に３D空間を表示しておきたいけど、右半分にはUIがたくさん表示されるので、消失点を左のほうに寄せたい」といった場合に使用できます。
MySQLサーバが起動しない問題

# 環境
- CentOS 7.0
- mysql 14.14

# 内容
MySQLサーバを起動しようとするとFAILEDになる・・・
![mysql_error2.png](https://qiita-image-store.s3.amazonaws.com/0/116983/5de1d52f-318b-83ab-641e-d7dc73d0e00b.png)
# 対処
まず以下のコマンドでlogを確認すると，

```
 less /var/log/mysqld.log
```
![mysql_error1.png](https://qiita-image-store.s3.amazonaws.com/0/116983/f9eec8b2-80bd-e9e4-1099-10731c722012.png)
となり，

```
unknown variable 'default-character-server=utf8'
```
であるので，/etc/my.cnfにあるdefault-character-server=utf-8をコメントアウトします．そうすると，Errorは消えました．
しかし，MySQLサーバは起動しませんでした．もう一度/var/log/mysqld.logを見てみると，Can't create/write to file '/var/run/mysqld/mysqld.pid'と出ており，ファイル作成や書き込みが出来ないとのことなので/var/run/mysqldをchownでmysqlユーザにします．
![mysql_error3.png](https://qiita-image-store.s3.amazonaws.com/0/116983/2f771efc-52b0-3d2b-bd6e-a511bac58da9.png)


```
ls -la /var/run/mysqld
ls: cannot access /var/run/mysqld: No such file or directory
```
まずそんなフォルダなかった・・・のでmkdirでフォルダ作成

```
mkdir /var/run/mysqld
chown -R mysql:mysql /var/run/mysqld
```
そして，MySQLサーバ起動すると動いた！
![mysql_error4.png](https://qiita-image-store.s3.amazonaws.com/0/116983/bac425c6-9754-d21b-0240-8cf2d6618078.png)
git pushでVPSにデプロイするには`git config receive.denyCurrentBranch updateInstead`で

git pushでVPS上のHTMLを更新する方法です。通常、gitではリモートはbareリポジトリにし、そこに対してローカルからgit pushします。bareリポジトリはgitの変更履歴等のみを保持するリポジトリで、チェックインしたファイルがそのまま配置されるわけでないです。scp的な感覚でgit pushしてリモートのコードを変更したい場合は、non-bareなリポジトリをリモートに作ります。


## 前提

前提として、複数人でgit pushしない運用になっていることです。[git config --add receive.denyCurrentBranch ignoreはどう危険なのか - 西尾泰和のはてなダイアリー](http://d.hatena.ne.jp/nishiohirokazu/20120416/1334548800)を参照。個人的なサイトであれば問題ないと思います。

## リモートにnon-bareなリポジトリを作る

```
cd /var/www/sites-available/
git init example-site.com
git config --local receive.denyCurrentBranch updateInstead
```

`receive.denyCurrentBranch updateInstead`をセットしておかないと次のようなエラーになりgit pushできません。

```
Counting objects: 368, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (327/327), done.
Writing objects: 100% (368/368), 76.40 MiB | 1.97 MiB/s, done.
Total 368 (delta 35), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
```

## ローカルからpushする

```
git remote add origin example.com:/var/www/sites-available/example-site.com
git push -u origin master
```

ここの`example.com:/var/www/sites-available/example-site.com`の部分は、`ホスト名:.gitがあるディレクトリのパス`にします。

ホスト名の部分は、ローカルマシン(OSXなど)の`$HOME/.ssh/config`に設定したホスト名です。

```text:~/.ssh/configの例
Host example.com
  User bob
  Port 2222
```

## まとめ

* 個人的なサイトなのでscp感覚でgit pushでサーバにソースをデプロイしたい
* リモートは`git config --local receive.denyCurrentBranch updateInstead`でnon-bareなリポジトリを作る
* ローカルは`git remote add origin example.com:/var/www/sites-available/example-site.com`のようにしてremoteを追加しておく
wine を mac にインストールしてA5:SQL Mk-2を使ってテーブル定義書を作る

▪️目的
テーブル定義書をA5:SQL Mk-2を使用して作成する

▪️背景
メモ代わりにテーブル定義（とは程遠い）を書いていた
プロジェクトの途中からDocsのメンテナンスを始める
フォーマットが決まっていない

▪️前提
綺麗なフォーマットでテーブル定義書を作成したい
一から作成したくはない
Macで作成したい
brewコマンドが実行可能なこと

▪️問題
A5:SQL Mk-2がMacに対応していない
→wineを入れるとwindowsのexeが叩けるらしい

***

①wineをbrewでインストールする
```$ sudo brew install --devel wine
```

②xzをlinkしてくださいという旨のerrorが発生
```$ sudo brew link xz
```

③インストールされた確認
```$ wine --version                                                                                                                                                                                                                                                                 ```
wine-1.9.5

④A5:SQL Mk-2をインストール
http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/

![A5 SQL Mk 2   フリーの汎用SQL開発ツール ER図ツール.png](https://qiita-image-store.s3.amazonaws.com/0/29216/2d049034-85a5-b562-92d5-d89fb6714345.png)

上のダウンロードをクリックして、ページ遷移後に、下記を取得
a5m2_2.11.4_x86.zip

⑤ダウンロードしたディレクトリへ移動し、実行
```$ wine A5M2.exe```


やった！起動しました！

が、エクセルが認識されないので、htmlで出力して、コピってスプレッドシートにはりつけて完成しました。

▪️あとがき
EasyWine.appという便利なものがあるらしいです！使いませんでしたが
http://matome.naver.jp/odai/2140238022377155001


おしまい
el capitanでsafari stand。

### SafariStand
公式
http://hetima.com/safaristand/
safariを便利にするプラグイン

### <i class="fa fa-list-alt"></i> ざっくり手順

こんなことをしていきます。

01. SIPを解除
* SIMBLをインストール
* SIPを有効にする
* SafariStandのインストール

### <i class="fa fa-hand-o-right"></i> やってみよう。

#### 01. SIPを解除する

###### 補足 <i class="fa fa-bicycle"></i> SIP(System Integrity Protection)とは？

```
El Capitanから導入された新しいセキュリティシステム
rootlessと呼ぶこともあるそうな。
参考： http://rcmdnk.github.io/blog/2015/10/10/computer-mac/
```

##### リカバリーモードで起動する

`⌘(command)` + `R`を押しながら
再起動してリカバリーモードで起動します。

するとこんな画面が。
（スクショ撮れないのでiphoneで撮ったw）

![safaristand_01__recovery_mode.png](https://qiita-image-store.s3.amazonaws.com/0/52774/531fe0fb-550a-fc4e-eeb0-affbe33eec36.png)

##### ターミナルを開いてSIPを解除

メニューバーのユーティリティの中に
ターミナルがあるのでそいつを起動します
（画像ひどいな）

![safaristand_02_menubar_utility.png](https://qiita-image-store.s3.amazonaws.com/0/52774/668db07a-0866-de03-2bf5-aabd772c362f.png)


そこで以下コマンドを実行

```bash
csrutil disable
```

![safaristand_03_terminal.png](https://qiita-image-store.s3.amazonaws.com/0/52774/0c03c95a-742d-f985-22d7-3d68601903df.png)

そしてまた再起動します。

#### 02. SIMBLをインストール

###### 補足 <i class="fa fa-bicycle"></i> SIMBLとは？

```
SIMBL(Smart InputManager Bundle Loader) しむぶる
Mac OS X のアプリケーション拡張ソフトウェア。
```

[SIMBL公式ページ](http://www.culater.net/software/SIMBL/SIMBL.php)から
`SIMBL-0.9.9.zip` (Snow Leopard and Leopard)をダウンロード
<i class="fa fa-exclamation-circle"></i> 解凍してできた「SIMBL-0.9.9.pkg」はダブルクリックしない。

ターミナル上でSIMBLを解凍したフォルダに移動し、
以下のコマンドでインストール

```bash
$ sudo installer -verbose -pkg SIMBL-0.9.9.pkg -target /
（パスワードを入力）

$ sudo rm -rf /System/Library/ScriptingAdditions/SIMBL.osax

$ ファイルを移動
sudo mv /Library/ScriptingAdditions/SIMBL.osax /System/Library/ScriptingAdditions/

$ sudo cp -p /System/Library/ScriptingAdditions/SIMBL.osax/Contents/Resources/SIMBL\ Agent.app/Contents/Resources/net.culater.SIMBL.Agent.plist /System/Library/LaunchAgents/

$ sudo sed -e "s/Library/System\/Library/" -i "" /System/Library/LaunchAgents/net.culater.SIMBL.Agent.plist
```

ちなみにSIPを無効にしないでやると
sudo mv .. あたりで`Operation not permitted`になります←



#### 03. SIPを有効にする

再びリカバリーモードで起動
メニューバー > ユーティリティ >　ターミナルで
以下コマンドを実行してSIPを有効にする

```bash
csrutil enable
```
そしてまた再起動します。

#### 04. SafariStandのインストール

[ここ](http://hetima.com/safaristand/)から
SafariStand 9.0をダウンロード

解凍してできた`SafariStand.bundle`を
`/Library/Application\ Support/SIMBL/Plugins`
に移動する

safariを再起動して
メニューバーに`stand`というメニューが追加されていたら
完了です。
（アイコンの表示とかはsafari standの設定をしてください）

### <i class="fa fa-desktop"></i> 環境

Mac os

```zsh
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
```
safari

```
バージョン 9.0.3 (11601.4.4)
```

### thank you ..<i class="fa fa-heart"></i>

参考：
http://dispatchist.com/how-to-install-safaristand-on-el-capitan/
http://tangerine.hateblo.jp/entry/2015/11/01/021050
「ORA-01031: 権限が不足しています」って表示されるんですが

接続しようとすると…

```commnad:command
SQL> connect / as sysdba
ERROR:
ORA-01031: insufficient privileges
````

と出て次に進めないです…

このエラー自体は
「ORA-01031: 権限が不足しています」
 で権限がないのでダメとの事なので
権限を追加します

```command:commad
-- 上記ユーザーをDBAグループへ追加 (rootユーザーで実行)
$ sudo usermod -G dba myuser

[sudo] password for myuser: 

```

もう一回やってみた

```command:command
$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> connect / as  sysdba
Connected...
SQL> 
  
```

できた
dockerでKVM動かし、Proxmox4を動かす (ianblenke/kvm)

* 今なら[dockerでKVM (ennweb/kvm) - Qiita](http://qiita.com/tukiyo3/items/3054f1ad2f744b42d33d)のほうがいいかも。

## 参考

* [ianblenke/kvm](https://hub.docker.com/r/ianblenke/kvm/) ubuntu 14.04ベース
* @flnyさん[Docker + KVM 上で Xubuntu を動かす - Qiita](http://qiita.com/flny/items/ba1ac612d6bea11387ad)

## 準備 (konalinux)

```bash:3gbのqcow2イメージ作成
qemu-img create -f qcow2 kona3gb.qcow2 3G
```

```bash:docker-compose.yml
kvm:
  image: ianblenke/kvm
  container_name: kvm
  tty: true
  privileged: true
  ports:
    - "5900:5900"
  volumes:
    - .:/mnt/
  command: "/run.sh  \
    -name kvm -smp 2 -m 2512 \
    -vnc :0  \
    -vga qxl \
    -k ja \
    -cdrom /mnt/konalinux-3.0-black_i386.iso \
    -drive file=/mnt/kona3gb.qcow2,if=virtio"
```

## 起動

```bash:起動
docker-compose up -d
vncviewer localhost:5900
```

![kona.png](https://qiita-image-store.s3.amazonaws.com/0/25728/14c15eb1-c632-c47d-0427-f20bcc3c6b38.png)

![small.png](https://qiita-image-store.s3.amazonaws.com/0/25728/efa7840f-13ea-483a-4983-310def66228a.png)

* 解像度が変わったらVNCを再接続すればよい

![ok2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e54c9783-f33a-9552-08a9-775b953717d6.png)

* メモリ2512mb, cpu2個を認識していることを確認


-----

## proxmox4

```bash:proxmox
qemu-img create -f qcow2 mox9gb.qcow2 9G
```

* 8006ポートのフォワーディング

```bash:docker-compose.yml 
kvm:
  image: ianblenke/kvm
  container_name: kvm
  tty: true
  privileged: true
  ports:
    - "5900:5900"
    - "8006:8006"
  volumes:
    - .:/mnt/
  command: "/run.sh  \
    -name kvm -smp 2 -m 2512 \
    -vnc :0  \
    -vga qxl \
    -k ja \
    -redir tcp:8006::8006 \
    -cdrom /mnt/proxmox-ve_4.1-2f9650d4-21.iso \
    -drive file=/mnt/mox9gb.qcow2,if=virtio"
```


![aa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c838df1d-339b-37be-4e46-d26ec6ef6011.png)

![aab.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2f4b292c-417f-b4c0-4ac6-74be49a81a11.png)

![ip.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1ad44954-996f-5c10-aecd-daef1bd06c54.png)

![df.png](https://qiita-image-store.s3.amazonaws.com/0/25728/208b7285-24e6-9b8a-8709-c40f585c63a9.png)

![ui.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c872c6a4-3f14-9c46-a775-ebdf257719a2.png)
minGW でTreadプログラム

#minGW でTreadプログラム
メモ

```c:mtread.c
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <stdlib.h>

unsigned __stdcall func1(void *p)
{
	int i;
    puts(p);

	for(i=0; i<10; i++){ 
		Sleep(10);/* 時間稼ぎ */
		printf("[func1] %d\n",i);
	}
	_endthreadex(0);
    return 0;//コンパイラの警告を殺す
}
unsigned __stdcall func2(void *p)
{
	int i;
    puts(p);

	for(i=0; i<10; i++){ 
		Sleep(14);/* 時間稼ぎ */
		printf("[func2] %d\n",i);
	}
	_endthreadex(0);
    return 0;//コンパイラの警告を殺す
}

main()
{
    HANDLE handle1;
    HANDLE handle2;
	int i;

    handle1 = (HANDLE)_beginthreadex(NULL, 0, func1, "I am func1", 0, NULL);
    handle2 = (HANDLE)_beginthreadex(NULL, 0, func2, "I am func2", 0, NULL);
	for(i=0; i<10; i++){ 
		Sleep(12);/* 時間稼ぎ */
		printf("[Main] %d\n",i);
	}
	WaitForSingleObject(handle1, INFINITE); /* スレッドが終了するまで待つ。 */
	WaitForSingleObject(handle2, INFINITE); /* スレッドが終了するまで待つ。 */
    CloseHandle(handle1); /* ハンドルを閉じる */
    CloseHandle(handle2); /* ハンドルを閉じる */
}

```
***
<<参考>>
http://www.geocities.jp/debu0510/personal/kusosure.html
SwiftでCommand failed due to signal:Segmentation fault: 11と出るコードと解決方法

（追記）
※XCode7.3ではビルドエラー発生しませんでした。Swift2.2で修正されているようです。


次のコードをビルドすると表題のエラーが出ます。
(Xcode7.2)
testAsyncNGの入れ子にされたクロージャがキャプチャしている変数の宣言位置が違うだけなのですが。

StringだとかIntだとか単純な型ならエラーにはなりませんでした。タプルだけの現象なんでしょうかね。

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    ///こっちのコードはOK
    func testAsyncOK(block: (argments:(arg1:String,arg2:Int,arg3:CGRect)) -> ()){

        var arg:(arg1:String,arg2:Int,arg3:CGRect) = (arg1:"test",arg2:1,arg3:CGRectMake(0, 0, 10, 10))

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in

            //何か処理
            arg.arg1 = "処理結果"
            arg.arg2 = 100
            arg.arg3 = CGRectMake(0, 0, 199, 999)

            //メインスレッドで実行
            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                block(argments: arg)
            })
        }
    }

    ///こっちのコードはNG
    func testAsyncNG(block: (argments:(arg1:String,arg2:Int,arg3:CGRect)) -> ()){

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in

            var arg:(arg1:String,arg2:Int,arg3:CGRect) = (arg1:"test",arg2:1,arg3:CGRectMake(0, 0, 10, 10))

            //何か処理
            arg.arg1 = "処理結果"
            arg.arg2 = 100
            arg.arg3 = CGRectMake(0, 0, 199, 999)

            //メインスレッドで実行
            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                block(argments: arg)
            })
        }
    }

}

```

とにかくかなり悩まされたので、同じような現象に遭遇している人の一助になればと思い。
AD2 > Link > reference manual > 9.3. Logic Analyzer > Cross-triggering between Analog input channels, Logic Analyzer, Pattern Generator or external trigger

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_outputs_arbitrary_waveform_generator) 9. Features and Performances > 9.3. Logic Analyzer

> Cross-triggering between Analog input channels, Logic Analyzer, Pattern Generator or external trigger 35)

色々な機能からトリガをかけられる。

Logic の GPIO の変化だけではトリガを設定しにくい時に有効なのだろう。
AD2 > Link > reference manual > 9.3. Logic Analyzer > Input logic: LVCMOS (1.8V | 3.3V, 5V tolerant)

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_outputs_arbitrary_waveform_generator) 9. Features and Performances > 9.3. Logic Analyzer

> Input logic: LVCMOS (1.8V/3.3V, 5V tolerant)

https://en.wikipedia.org/wiki/LVCMOS

http://www.wdic.org/w/SCI/LVCMOS
AD2 > Link > reference manual > 9.2. Analog Outputs (Arbitrary Waveform Generator) > User-defined arbitrary waveforms: defined within WaveForms software user interface or using standard tools (e.g. Excel)

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_outputs_arbitrary_waveform_generator) 9. Features and Performances > 9.2. Analog Outputs (Arbitrary Waveform Generator)

> User-defined arbitrary waveforms: defined within WaveForms software user interface or using standard tools (e.g. Excel) 31).

任意の波形を作れそうだ。
使い方をそのうち覚えよう。
技術英語 > We stood back to back, … / a blind spot in our common sense

@ Star Trek Voyager > ALLIANCES

Chakotay が亡くなったクルーについて語っている

> We stood back to back, …

字幕はない。

http://ejje.weblio.jp/content/back+to+back

危険な状況でお互いの死角をかばいあったということだろう。

<hr>
死角で検索すると blind spot というフレーズにたどり着いた。

linguee で blind spot で検索すると

http://www.linguee.jp/日本語-英語/search?source=英語&query=blind+spot

@ kansai.gr.jp
> Elementary schools need life jackets—that has been a blind spot in our common sense that few people realized.
> 小学校に救命胴衣。ほとんどの人が思い当らなかった「常識 に 盲点」 だっ たといえる。 

（和訳が少し変であるが）
blind spot を「盲点」として使っている。
メンバ関数ポインタへのコールバックをtemplateで

#　動機

templateでメンバ関数ポインタへのコールバックってどうやるんだろうと思ったので。

## やりたいこと

1. メンバ関数ポインタをtraitsで保持したい。(でもオブジェクト保持はめんどくさいのでSingleton前提にしている)
2. コンストラクタでnewはしたくない
3. コールバックを要求する側でtraitsを定義したらそれに応じてコールバックする側は変更なしでattachしたい
4. コールバックの要素数はコンパイル時に決定したい

## コード

```cpp:Caster.hpp
#pragma once
#include "Singleton.hpp"
using namespace std;


struct Listner
{
public:
	Listner() {}
	virtual ~Listner(){}
	virtual void execute() = 0;

};

enum ListnerName
{
	Listner_start = -1,
	Listner1_event1 = 0,
	Listner1_event2,
	Listner_end,
};

class Caster
{
public:
	Caster()
	{

	}
	bool initialize()
	{
		return initialize<Listner_start>();
	}

	void run()
	{
		for (int i = 0; i < Listner_end; ++i)
		{
			listners_[i]->execute();
		}
	}
	~Caster()
	{
		for (int i = 0; i < Listner_end; ++i)
		{
			delete listners_[i];
		}
	}

private:
	template<ListnerName N>
	bool initialize();
	template<>
	bool initialize<Listner_start>()
	{
		const ListnerName next = static_cast<ListnerName>(Listner_start + 1);
		return initialize<next>();
	}
	template<>
	bool initialize<Listner_end>()
	{
		return true;
	}
	template <typename T>
	class ConcreteListner : public Listner
	{
	public:
		ConcreteListner(void(T::*func)())
			: func_(func) {}
		~ConcreteListner(){}
		void execute() { (T::getInstance()->*func_)(); }
	private:
		void (T::*func_)();
	};

	Listner* listners_[Listner_end];
};

template<ListnerName N> struct listner_traits;

template<ListnerName N>
bool Caster::initialize()
{
	if ((listners_[N] = new(std::nothrow) ConcreteListner<listner_traits<N>::object_t>(listner_traits<N>::cb)) == 0)
	{
		return false;
	}
	return initialize<static_cast<ListnerName>(N+1)>();
}

```

```cpp:Listner1.hpp
#pragma once
#include <iostream>
#include "Singleton.hpp"
using namespace std;


class Listner1 : public Singleton<Listner1>
{
public:
	void event1()
	{
		cout << "event1" << endl;
	}
	void event2()
	{
		cout << "event2" << endl;
	}
};

template<>
struct listner_traits<Listner1_event1>
{
	typedef Listner1 object_t;
	typedef void(Listner1::*callBack)();
	static const callBack cb;
};
const listner_traits<Listner1_event1>::callBack listner_traits<Listner1_event1>::cb = &Listner1::event1;

template<>
struct listner_traits<Listner1_event2>
{
	typedef Listner1 object_t;
	typedef void(Listner1::*callBack)();
	static const callBack cb;
};
const listner_traits<Listner1_event2>::callBack listner_traits<Listner1_event2>::cb = &Listner1::event2;


```

```cpp:Singleton.hpp
#pragma once

template <typename T>
class Singleton
{
protected:
	Singleton(){}
	Singleton(Singleton const&);
	~Singleton(){}

	Singleton& operator=(Singleton const&);

public:
	static T* getInstance()
	{
		static T i;
		return &i;
	}
};

```

```cpp:main.cpp
#include "Singleton.hpp"
#include "Caster.hpp"
#include "Listner1.hpp"
using namespace std;


int main(int argv, char* argc[])
{
	Caster caster;
	caster.initialize();
	caster.run();
	return 0;
}
```
Ruby でモルダー、あなた疲れてるのよを出力する方法

# まえがき

Ruby を仕事で使う上で、「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりしたいことはままあります。

そこで今回は「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりします。

# 本文

## コード

```rb
def mulder
  %w[モルダー あなた 疲れてる のよ].shuffle.each_slice(2).map { |ws|
    ws.map { |w|
      w.chars.each_slice((w.size/2.0).ceil).map(&:join)
    }.flatten.tap{ |_|
      break [_[2], _[1], _[0], _[3]] if rand(2) == 0
    }
  }.flatten.insert(2, '、').join
end

loop.with_index(1) do |_, i|
  print "#{i}: "
  puts mulder.tap{ |_|
    exit puts(_).to_i if _ == 'モルダー、あなた疲れてるのよ'
  }
end
```

## 実行結果例

```
1: のよ、あなたモルダー疲れてる
2: のてる、疲れよモルダーあなた
3: のよ、疲れてるあなたモルダー
4: 疲れてる、あなたモルよのダー
5: 疲れダー、モルてるのよあなた
6: モルダー、疲れてるのよあなた
7: モルダー、あなた疲れよのてる
8: モルダー、あなたのてる疲れよ
9: のた、あなよ疲れダーモルてる
10: 疲れた、あなてるのよモルダー
11: のダー、モルよあなた疲れてる
12: あなた、疲れてるモルダーのよ
13: モルダー、疲れてるあなたのよ
14: あなた、疲れてるモルよのダー
15: あなた、モルダーのよ疲れてる
16: モルよ、のダーあなてる疲れた
17: モルダー、のよ疲れたあなてる
18: 疲れてる、モルダーのよあなた
19: 疲れてる、のよモルダーあなた
20: モルダー、あなた疲れよのてる
21: のよ、疲れてるあなダーモルた
22: のてる、疲れよモルダーあなた
23: のてる、疲れよあなダーモルた
24: 疲れてる、のよあなダーモルた
25: のよ、あなた疲れダーモルてる
26: のよ、モルダー疲れてるあなた
27: 疲れた、あなてるのダーモルよ
28: のよ、モルダーあなてる疲れた
29: 疲れダー、モルてるあなたのよ
30: のよ、モルダーあなた疲れてる
31: モルダー、疲れてるのよあなた
32: 疲れよ、のてるモルたあなダー
33: 疲れてる、モルダーのよあなた
34: 疲れた、あなてるのよモルダー
35: 疲れてる、モルダーあなたのよ
36: のダー、モルよ疲れてるあなた
37: モルてる、疲れダーのよあなた
38: 疲れダー、モルてるのたあなよ
39: のダー、モルよ疲れてるあなた
40: あなダー、モルたのよ疲れてる
41: 疲れてる、のよあなたモルダー
42: あなよ、のたモルダー疲れてる
43: あなよ、のたモルてる疲れダー
44: 疲れてる、あなたのダーモルよ
45: あなダー、モルたのよ疲れてる
46: モルダー、疲れてるあなよのた
47: あなてる、疲れたのダーモルよ
48: モルよ、のダーあなた疲れてる
49: 疲れた、あなてるのよモルダー
50: あなた、疲れてるモルよのダー
51: あなダー、モルた疲れよのてる
52: のた、あなよモルダー疲れてる
53: モルてる、疲れダーのよあなた
54: モルダー、あなた疲れてるのよ
```

## ピックアップ

- 疲れてる、あなたモルよのダー
- 疲れダー、モルてるのよあなた
- あなダー、モルたのよ疲れてる
- モルてる、疲れダーのよあなた
- 疲れてる、のよあなたモルダー
- モルダー、疲れてるのよあなた

いいですか？色々なモルダーがあります。色々ありますので、よろしくお願いします。

## コード内に出現した Ruby tips

- [percent notation](http://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html#label-Percent+Strings) を使うと文字列の配列などをいい感じに生成できます
- `tap` はブロック内で `break` した場合のみ返り値に副作用を起こすことが出来ます
- `Kernel#puts` の返り値は `nil` なので、`to_i` すると 0 が得られます。これを悪用して `exit` に `puts("some str").to_i` を渡すと、文字列を出力しつつエラーなしで（exit code を 0 にして）終了することができます

無限ループをして文字列を出力しつつ、特定の文字列が出現した場合は終了するといったコードを書きたい場合、上記 `exit` と `loop`、`tap` を組み合わせることで短いけど気持ち悪いトリッキーなコードが書けます。おめでとうございます。


# おわりに

「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりすることができました。みなさんも、お使いください。
Particle SystemにつくColliderのCenter、SizeはそのParticleSystemによって変わる

AddComponentをした時のColliderの初期の値が思ってもいないものになってバグったので挙動を調べた。
先にまとめを書くと、以下になる
1.オブジェクトにParticleSystemが存在してそいつが悪さをしていた
2.Rendererが切られていてParticleSystemがついているという発見が遅れた
3.コードからColliderをAddComponentするときは明示的に初期化しよう

まず何もないGameObjectを用意する。
<img width="946" alt="EmptyGameObject.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/443d833a-bbf2-826e-09b4-c1b50f3537ec.png">

BoxColliderをつけると次のようなCenter(0,0,0), Size(1,1,1)のColliderがつけられる。
<img width="956" alt="Collider.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/e14dbf3d-7591-f3d2-e426-cf7d0e8c62ce.png">

次に、ParticleSystemにColliderをつける。
<img width="947" alt="ParticleSystemCollider.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/dedc67d9-8019-6e65-0de4-ab356816e705.png">

ColliderのSizeとCenterの位置がParticleの飛ぶ範囲に影響される。
これは、ParticleSystemのRendererを切っているものにColliderをつけても同じ結果になる。

Rendererを切ったParticleSystemを用意してColliderをつけてみる。
<img width="947" alt="DisableRenderer.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/cce8b23a-becc-345b-eeb8-da5083c0d2c2.png">

<img width="947" alt="DisableRendererCollider.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/96627deb-da83-df7e-7e58-ff45201f460d.png">

RendererがついていないParticleSystemにコード側からColliderをつけようとしてとあるバグを踏んだりもした。

次に、コード側からのColliderのAddComponentの挙動を見る。

```csharp:StartAddComponent.cs
public class StartAddComponent : MonoBehaviour {

    void Start () {
        gameObject.AddComponent<BoxCollider>();
    }
}
```
<img width="947" alt="AddComponentStart.png" src="https://qiita-image-store.s3.amazonaws.com/0/110527/26dd518b-3206-05a3-0129-bf573d570a39.png">

Startは同じ挙動になるがAwakeは違う。

```csharp:AwakeAddComponent.cs

public class AwakeAddComponent : MonoBehaviour {

    void Awake () {
        gameObject.AddComponent<BoxCollider>();
    }
}
```

CentreやSizeが初期値になる。

なので、PrefabをInstantiateしたタイミングでColliderをAddComponentした場合と、1frame挟んだあとにAddComponentしたのでつくColliderのサイズは変わるので注意。

なので、ここらの挙動に惑わされないように、CodeからAddComponentする場合は明示的にCenterとSizeに値は代入しておきたい。

```csharp:
        var collider = gameObject.AddComponent<BoxCollider>();
        // 期待する値を代入
        collider.center = Vector3.zero;
        collider.size = Vector3.one;
```
gem json 1.8.1が入らなかった話

Ruby2.3.0をインストールしたMacにRuby2.1.0で作られたRailsのbundle installでgem json 1.8.1が入らなかった話です。
そもそもRuby2.3.0をrbenvでインストールしたときのgemとbundlerのバージョンが高かったせいか、json1.8.3が既にインストールされていました。

四苦八苦しましたが
```
rm Gemfile.lock
```
したら普通にインストールできました。

一応メモしておこうっと。
libv8がOS X 10.9以上で入らない

Macに開発環境を移動させたら色々つまずきました。

Vagrantでは問題なかったlibv8がMacでは入らない。。。

```
Installing libv8 3.16.14.13 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/entershare/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20160329-32646-120kz1c.rb extconf.rb
creating Makefile
```



Google先生に聞いた対処法はこんな感じ。

```
gem install libv8 バージョン -- --with-system-v8
```

```
bundle config build.libv8 --with-system-v8
```

これで問題なくインストールできました。