OmniAICreator/Qiita-1.07M huggingface dataset:
技術英語 > We're five seconds behind schedule. > 予定より5秒遅れている

Star trek Voyagerにてタイムワープして過去の出来事を修正するというエピソードで使われていた。ホログラムを使ってシミュレーションを多数回繰り返す中で、予定どおりにことが運んでいない中、ジェイウェイン艦長が使っていた。

以下のように予定通りに行かない時に使える。

A「How are things going?」
B「I am afraid but, we're two weeks behind schedule.」
secureCoding > strncpy() > コピーすべきデータがなくなると、残りのバッファをnullバイトで埋め尽くすという仕様からくる性能上の問題もある

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> strncpy()には、コピーすべきデータがなくなると、残りのバッファをnullバイトで埋め尽くすという仕様からくる性能上の問題もある。

<hr>

strncpy()以外の関数はどうなっているのだろうか疑問に思った。

http://ideone.com/qkKrFK
にてstrcpy()をしたところ、nullバイトで埋め尽くすのではないことがわかった。

strncpy()を頻繁に呼んでいて、かつコピー文字列が長いソフトになると性能上の問題がでるのだろう。
secureCoding > strncpy()の注意点 > null終端を保証しない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

```
strncpy(dest, source, dest_size - 1);
dest[dest_size - 1] = '¥0';
```

>strncpy()関数は、コピー先の文字列がnull終端されていることを保証しないため...

<hr>
上記のようなコードだが、先にdestをmemsetでゼロクリアしておいたらダメなのだろうか?
secureCoding > strcpy_s() > 様々な実行時制約が課せられている

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> strcpy_s()関数には、様々な実行時制約が課せられている。
...
これらの条件を満たすと、コピー先の文字列は空文字に設定され、関数はゼロ以外の値を返すことで、問題の発生に気づきやすくしている。

<hr>
strcpy_s()の使い方に間違いがあった時にその間違いに気づきやすくすることでデバッグ時間を短縮できそう。
linuxで一時的にIPとデフォルトゲートウェイを変更

## 1. 現在設定しているデフォルトゲートウェイを削除

```bash:
sudo /sbin/route del default gw 192.168.0.1
```

## 2. IPを取得

```bash:
sudo /sbin/dhclient eth0
```

* /etc/resolv.conf が書き換わるので後で戻すの忘れないこと。

## 3. デフォルトゲートウェイを設定

```bash:
sudo /sbin/route add default gw 192.168.11.1
```
Flowtypeと生JSでジェネリックプログラミング

最近、Flowtype+生JSという構成にハマっています。[Flow Comments](http://flowtype.org/blog/2015/02/20/Flow-Comments.html)を使うことで型の恩恵を受けつつ、LL特有な動的な部分はそのままにも出来るというバランス感覚が良いですね！！

ただ、JS定番の配列やオブジェクトのdeep cloneを作る`clone`や、オブジェクトの拡張をする`extend`を通すと型情報が消えてしまうのが嫌だなと思って調べてみたら、ジェネリックプログラミングができるのでどうにか対策ができそうです！

* [Polymorphic functions - Functions](http://flowtype.org/docs/functions.html#polymorphic-functions)

# cloneの型情報を付与する

```js
var clone = require('clone');
var o/*: {x:number} */ = {x: 1};
var v = clone(o);
console.log(v.y); //-> no error
```

`clone`を扱うコードはこんな感じを想定です。第一引数に渡した値の型情報をそのまま同じ型で戻り値を返すようにしたいのですが。このコードでは`any`（本当にそうかは知らない）と扱われてしまい、存在しないプロパティにアクセスしてもエラーが発生しません。そこで、ジェネリックを使って引数と同じ型で戻り値を返すように定義します。


```js
var clone/*: <T>(a: T) => T */ = require('clone');
var o/*: {x:number} */ = {x: 1};
var v = clone(o);
console.log(v.y); //-> Property not found
```

これで、型情報を失わずに`clone`を実行することができました！！

ちなみにですが、0.1.0のflowtypeでは関数を返す`require`の場合は`declare`で宣言することはできません。

```
/*:: declare function clone<T>(a: T): T; */
var clone = require('clone');
var o/*: {x:number} */ = {x: 1};
var v = clone(o);
console.log(v.y); //-> no error
```

正直、よく使うので別ファイルに宣言を切り出したいので、何か良い方法をご存知の型がいたら教えてください。

# extendの型情報を付与する

```js
var extend = require('extend');
var o/*: {x:number} */ = {x: 1};
var v = extend(o, {y: 'hoge'});
console.log(v.y * 2); // no error
```

次に`extend`を扱うコードはこんな想定です。第一引数と第二引数に渡されたオブジェクトの型情報を合成して戻り値の型情報として返すということをやりたいです。この場合でも`clone`と同じように書くことができます。

```js
var extend/*: <A, B>(a: A, b: B) => A & B */ = require('extend');
var o/*: {x:number} */ = {x: 1};
var v = extend(o, {y: 'hoge'});
console.log(v.y * 2); // This type is incompatible with
```

肝は`A & B`というところで、こう書くことで戻り値の型情報が引数の型`A`でもあり、`B`でもある型として返すことができます。ちなみにどちらかが返されるというときは`A | B`と書けます。

また、このままでは`extend`にオブジェクト以外の値も渡せてしまうので、型を縛っておきます。

```js
var extend/*: <A: Object, B: Object>(a: A, b: B) => A & B */ = require('extend');
var o/*: {x:number} */ = {x: 1};
var v = extend(o, {y: 'hoge'});
console.log(v.y * 2); // This type is incompatible with
```

これで`extend`に型情報を付与することができました！

# まとめ

Flowtypeは超絶便利ですね！細かくできないことがあったりはしますが、ゆるく型の恩恵を受けたいというときには良い感じです。
Electronでipcを使ってプロセス間通信を行う

# 概要

Electron（旧称atom-shell）には起動時に立ち上がるJavaScript側のプロセス（メインプロセス）と、メインプロセスから立ち上げるBrowserWindowのプロセス（レンダラプロセス）が存在する。メインプロセスとレンダラプロセスは別物なので、これらの間で状態を伝達する仕組みが必要になることがある。ElectronにもIPC（プロセス間通信）の仕組みは存在し、ずばりipcモジュールとして定義されている。

# 前提

BrowserWindow（レンダラプロセス）を立ち上げてHTMLを表示する部分までは終了しているものとする。

```js
var app = require('app');
var BrowserWindow = require('browser-window');

app.on('ready', function() {
  var currentWindow = new BrowserWindow({});
  currentWindow.loadUrl('file://' + __dirname + '/index.html');
});
```

だいたいこれぐらいの環境を想定。

# ipcを使う

## レンダラプロセス（送信側）

```js
var ipc = require('ipc');

// 非同期
ipc.send('asynchronous-message', 'ping');

// 同期
var response = ipc.sendSync('synchronous-message', 'ping');
```

`sendSync`を使えば即座にメインプロセスからのレスポンスが取れるが、レスポンスを返すまでレンダラプロセスがブロックされるので、利用は非推奨となっている。

## メインプロセス（受信側）

```js
var ipc = require('ipc');

// 非同期
ipc.on('asynchronous-message', function(event, arg) {
  event.sender.send('asynchronous-reply', 'pong');  // 送信元へレスポンスを返す
});

// 同期
ipc.on('synchronous-message', function(event, arg) {
  event.returnValue = 'pong';  // 送信元へレスポンスを返す
});
```

ipcモジュールの実態はEventEmitterなので、同期非同期に関わらず`on`で受けられる。送信は非同期だったのに同期でレスポンスを返してしまった場合は、無効なレスポンスとして無視される。同期で送信して非同期でレスポンスを返した場合は、処理の終了を待った上で非同期レスポンスとして処理される。

非同期レスポンスはレンダラプロセスにて`on`で指定すれば受けられる。

## WebContents.send

メインプロセスからレンダラプロセスへ送信を行う場合、`WebContents.send`で送ることができる。

```js
current.webContents.on('did-finish-load', function() {
  current.webContents.send('asynchronous-message', 'ping');
});
```

同期通信はデッドロックが発生しやすいという理由により存在しない。内部的にはipcの呼び出しなので、レンダラプロセスにおけるipcのレスポンス処理と同様に、`on`で指定することにより受けられる。

このときレンダラプロセスでJavaScriptの実行が完了していないと、コールバックが登録されていないことになり、コールバックが意図したとおりに発火しないことに注意しなければならない。そのため、`did-finish-load`イベントにコールバックを登録し、レンダラプロセスにおけるJavaScriptの実行が完了するまで待つなどの工夫が必要になる。
enumを使ってTableViewを見やすく書けないか


当たり前だけど、tableviewを記述するときにsection(row)にマジックナンバーを使うとカオスになることが多々ある。objective-cのときはNSENUMつかってやってたけど、swiftだとどうなるのかなと思い書いてみた

# やったこと概要
1. enumにSection情報をまとめる
2. indexPathから列挙子を取得  #rawから列挙子を取得
3. enumから必要な情報をとってきてdatasourceに設定

Sectionの情報まとまったので、確認しやすくなった気がする。
もっとエレガントな書き方知りたい

# enumにSection情報をまとめる

```swift
    private enum SectionType:Int {
        case Fruit = 0
        case Vegitable
        case Max
        
        func configure() -> (sectionTitle:String, cellIdentifier:String) {
            switch self {
            case .Fruit:
                return ("fruit section", "FruitCell")
            case .Vegitable:
                return ("vegitable section", "VegitableCell")
            case .Max:
                return ("", "")
            }
        }
    }
```

# enumから必要な情報をとってきてdatasourceに設定

## cellの設定
```swift
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
	    //rawから列挙子を取得
        let section = SectionType(rawValue: indexPath.section)!
        
        //sectionに応じたidentifierを取得
        let (_, identifier) = section.configure()
        var cell = tableView.dequeueReusableCellWithIdentifier(identifier) as! UITableViewCell
        
        //section毎にcellを処理
        switch section {
        case .Fruit:
            return self.configureCellForFruitCell(cell as! FruitCell, indexPath: indexPath)
        case .Vegitable:
            return self.configureCellForVegitableCell(cell as! VegitableCell, indexPath: indexPath)
        case .Max:
            return UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Default")
        }

    }
```

## タイトルの設定

```swift
    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
	    //configureから必要なtitleを取り出して利用
        let (title, _) = SectionType(rawValue: section)!.configure()
        return title
    }
```

## section/rowの数を設定

```swift
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return SectionType.Max.rawValue
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        switch SectionType(rawValue: section)! {
        case .Fruit:
            return self.fruitsData.count
        case .Vegitable:
            return self.vegitablesData.count
        default:
            println("undefined section")
            return 0
        }
    }
```
Composerをインストールしてみた

参考RUL：https://getcomposer.org/download/


##Mac
###インストール
####brew使えばこれだけ

```Bash:コマンド
brew install homebrew/php/composer
```
--

####コマンドで入力

コマンドで次の __どちらか__ を打つ

```Bash:インストールコマンド１
curl -sS https://getcomposer.org/installer | php
```

```Bash:インストールコマンド２
php -r "readfile('https://getcomposer.org/installer');" | php
```

pathの通った場所へ移動させる

```コマンド
mv composer.phar /usr/local/bin/composer
```

```テストcomposer
composer
```
上のコマンドを打って、こんな感じでコマンドプロンプトに出たらインストール完了

```
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.0-dev
```

##windows
###インストール



コマンドで次の __どちらか__ を打つ

```Bash:インストールコマンド１
curl -sS https://getcomposer.org/installer | php
```

```Bash:インストールコマンド２
php -r "readfile('https://getcomposer.org/installer');" | php
```
--

###batファイルを作成

batファイルを作成したら今後は簡単にcomposerコマンドが使える

```Bash:(コマンド)batファイル作成
echo @php "%~dp0composer.phar" %*>composer.bat
```

```Bash:(コマンド)composerだけでコマンドが通るようになる
c:¥bin>composer
```

--
###PATHを通す
windowsでc:¥binの中にcomposer.pharなどをインストールした場合環境変数にPathを追加

僕の環境で追加するPath
C:¥bin;


##Mac,Windows共通Tips
###インストールオプション
インストールするときにはオプションで詳細を少しいじれるみたい


```Bash:(コマンド-optinon1)インストールするディレクトリ指定
curl -sS https://getcomposer.org/installer | php -- --install-dir=bin
```

```Bash:(コマンド-option2)インストールしてできたファイル名を指定
 curl -sS https://getcomposer.org/installer | php -- --filename=composer

```

```Bash:(コマンド-option3)インストールするバージョンを指定
curl -sS https://getcomposer.org/installer | php -- --version=1.0.0-alpha8
```

```Bash:(コマンド-potion1)php使うならこれでおけ
php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=bin
```

##Mac,Windows共通-composer.jsonの作成
###composer.jsonを作成

今回はバージョン1.0.0のmonologをインストールするcomposer.jsonを記述

```json:composer.json
{
	"require": {
		"monolog/monolog": ">=1.0.0"
	}
}
```

--
###compose.jsonを実行
次のコマンドを打つと、composer.jsonに書いた、monologがインストールされる
場所はvendorフォルダ以下

```Bash:(コマンド)
php composer.phar install
```

--
Rubyの「if a = b」とSwiftの「if let a = b」は意味が異なる



SwiftはRubyに似ている（c.f. [Swiftは○○に似ている](http://qiita.com/irxground/items/90c992836e0e6377adb1)）。
しかし、見た目は似ているけれど意味が異なる構文がある。


## Rubyの`if a = b`
"false"が出力される。

```ruby
b = false

if a = b
  puts("true")
else
  puts("false")
end
```


## Swiftの`if let a = b`
"true"が出力される。

```swift
let b:Bool?
b = false

if let a = b {
    println("true")
} else {
    println("false")
}
```


## どうしてこうなった
### Rubyの動作
Rubyの`if a = b`は次の動作をする。

1. 代入
2. 分岐

それぞれを分けて書くとこうなる。

```ruby
b = false

# 代入
condition = (a = b) #=> false

# 分岐
if condition
  puts("true")
else
  puts("false")
end
```

まず、`a = b`で代入が行われる。
この部分が`false`に評価され分岐条件になるので、"false"が出力される。


### Swiftの動作
一方、Swiftの`if let a = b`は次の動作をする。

1. Optionalの判別
2. 分岐
3. 代入

それぞれを分けて書くとこうなる。

```swift
let b:Bool?
b = false

// Optionalの判別
let condition = (b != nil) // true

// 分岐
if condition {
    // 代入
    let a = b!
    println("true")
} else {
    println("false")
}
```

まず、`b != nil`でOptionalの判別が行われる。
分岐条件が`true`なので、`let a = b!`でforce unwrap＆代入した後、"true"が出力される。

これは「optional binding」と呼ばれる機能で、Optional型の変数をunwrapする方法の一つ。
data-ga属性をつけるとGoogle Analyticsのクリックイベントを取得してくれるJavascript


クリックイベントをつけようと思った時に、どうやってつけようかなぁ。とかいつも迷っていたので汎用的に使えるものを作ってみました。

プラグイン化するほどでもないかなぁってことで、ソースのみ書いちゃってます。

こういうのってプラグイン化しちゃったほうがいいのかな。
ちょっと時間あるとき整理してプラグイン化してgithub公開しようかと思います。
とりあえずgaのクリックイベント周り設定しやすくしてくれるjsです。

手順・仕様は下記のとおりです。

1. 取得したいタグにdata-gaをつける。


aタグにつけた場合（単一） 
---

1. **data-ga="値"が入っている場合**は値を取得
2. **値がなく**、そのなかの画像にalt属性がついていた場合にはaltの値を取得
3. 上記どちらにも当てはまらない場合は、タグ内のテキストを取得


aタグ以外についていた場合（複数） 
---
1. タグ内のaタグに反応
2. **data-ga="値"が入っている場合**は値を取得の形で取得 

		'data-ga="値"' + (img alr || タグ内text)
	
3. **値がなく**、aタグ内の画像にalt属性がついていた場合にはaltの値を取得
4. 上記どちらにも当てはまらない場合は、タグ内のテキストを取得


最後に`Category`にページのタイトルを入れ
取得したテキスト値を`Label`に入れ`send event`で送信

	ga('send', 'event', 'ページのタイトル', 'click', '値');


実際のソース
--


	var gaClickEvent = (function() {
		var title = $('title').text();
		$('[data-ga] a, a[data-ga]').on('click',
				function(e) {
					var currentTarget = e.currentTarget;
					var $this = $(currentTarget);
					var alt = $this.find('> img').prop('alt');
					var gaq = $this.data('ga');

					if(gaq === undefined) {
						var parentGaq = $this.parents('[data-ga]').data('ga');
						var mainText = alt ? alt : $this.text();

						var text = parentGaq ? parentGaq + ' ' + mainText : mainText;
					} else {
						var text = gaq ? gaq :
								alt ? alt : $this.text();
					}

					if(typeof ga !== 'undefined') {
						ga('send', 'event', title, 'click', text);
					}
				}
		);
	})();
Redmine 2.6.4インストール for Windows + MySQL

# Redmine 2.6.4インストール for Windows + MySQL

## Ruby環境の作成

1. Ruby 2.1.6を"D:\Ruby21\"にインストール
RubyInstaller 2.1.6でインストール(Ruby 1.9以降ではRubyGemsを標準梱包)

2. [Development Kit](http://rubyinstaller.org/add-ons/devkit)のインストール
DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe（自己解凍exeファイル）を入手し、"D:\DevKit-mingw64-32-4.7.2"に解凍する

3. DevKitのセットアップ
DevKitをインストールしただけではRedmineセットアップ時にjsonパッケージのインストールに失敗する。次のコマンドを実行し、DevKitをセットアップする。
```ruby D:\DevKit-mingw64-32-4.7.2\dk.rb init```
```ruby D:\DevKit-mingw64-32-4.7.2\dk.rb install```

3. Redmineはgemの依存関係を管理するためにBundlerを使っているので、Bundlerをインストールする
`gem install bundler`

## MySQL環境の作成

1. MySQL Community Server 5.1を"D:\DB\MySQLServer5.1"にインストール
（詳細略）

2. MySQL Connector/C 6.1.5を"D:\DB\MySQLConnectorC6.1"にインストール
（詳細略）

3. libmysql.dllのコピー
`copy D:\DB\MySQLConnectorC6.1\lib\libmysql.dll D:\Ruby21\bin`

4. MySQLのC bindingをインストール
`gem install mysql2 -- --with-mysql-dir=D:/DB/MySQLConnectorC6.1`


## Redmine用データベース（redmine）を作成

```mysql
mysql -u root -p -e "drop database redmine"
mysql -u root -p -e "create database redmine CHARACTER SET utf8"
mysql -u root -p -e "grant all privileges on redmine.* to 'redmine'@'localhost'"
```

## Redmine 2.6.4の準備

1. Redmine 2.6.4を解凍

2. $redmine/config/database.yml.exampleをdatabase.ymlに変更し編集する

5. bundle installを実行する
`bundle install --path=vendor/bundle --binstubs=vendor/bin --without development test rmagick postgresql sqlite`

6. データベースの初期化
`set RAILS_ENV=production`
`call bundle exec rake db:migrate`
`call bundle exec rake redmine:load_default_data`


7. セッションストア秘密鍵を生成します
`bundle exec rake generate_secret_token`

8. プラグインのインストール（プラグインを用意した場合）
`set RAILS_ENV=production`
`call bundle exec rake redmine:plugins:migrate RAILS_ENV=production`

9. 初期状態のデータベースの内容をエクスポートする（バックアップのため）
`mysqldump -u root -p --add-locks -e redmine -r redmine_db_org.txt`

## Redmineの起動（Webサーバ起動）

次のコマンドでWebサーバを起動し、http://localhost:3000/ にアクセスする

```
set RAILS_ENV=production`
ruby script/rails server webrick -e production
```
ループ内で binding.pry を入れるときはちょっと条件を加えると幸せ

# ループの内部で `binding.pry` を使い処理を途中で止めたいとき

```rb
class FooController
  def index
    100.times do
      # なにか処理1
      binding.pry
      # なにか処理2
    end
  end
end
```

こうやって書くと `finish`, `continue`, `exit` などで処理を抜けたくても直後にまた次のループ評価でストップしてしまい、かなりうざい。

# `!!!`, `exit!` などで脱出 -> ちょっと違う

`!!!`, `exit!` などで脱出してもいいけど、例外吐いて終わらせたいわけじゃなく、処理自体は続行して綺麗に終わって欲しい。

# `disable-pry` で無効化 -> ちょっと違う

`disable-pry` コマンドを叩けばそれ以降は `binding.pry` で止まらなくなりますが、設定するとそれ以降ずっと有効なフラグなので今度は逆に止められなくて困ります。

# 条件をつければ良い

そんなときは、適当に `binding.pry` を評価する為の条件をつけてやるとちょっと幸せになれます。

```rb
class FooController
  def index
    100.times do
      # なにか処理1
      binding.pry unless @stop
      # なにか処理2
    end
  end
end
```

処理が止まって確認後、 `finish`, `continue`, `exit` などを叩く直前にこの場合なら `@stop = true` とかを実施してやれば次は `binding.pry` の条件が成立しないので止まりません。
条件はもちろん `@stop` じゃなくてもなんでもいいですが、適当な名前のインスタンス変数がいろんな箇所で記述しやすいと思います。
（該当箇所のインスタンスが繰り返し生成される場合は別）
HaskellでCtrl-Cを制御する

SIGINT等のシグナルの扱い方です。

##tl;dr
[System.Posix.Signals](https://hackage.haskell.org/package/unix/docs/System-Posix-Signals.html)を使います

## 2019/1/25 追記
WindowsでCtrl-Cを制御する方法については @kakkun61 氏の記事を参照してください
[Haskell で Ctrl-C を制御する（Windows） - 趣味はデバッグ……](http://kakkun61.hatenablog.com/entry/2019/01/25/Haskell_%E3%81%A7_Ctrl-C_%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%EF%BC%88Windows%EF%BC%89)

----

`Ctrl-C`が押されたらクロージングの処理を伴って終了するプログラムを書いてみます。

```haskell
import Control.Concurrent
import System.Posix.Signals

main :: IO ()
main = do
    tid <- myThreadId
    let handler = do
            putStrLn "goodbye!"
            killThread tid
    installHandler keyboardSignal (Catch handler) Nothing

    let loop n = do
            putStr $ show n ++ ", "
            threadDelay 1000000
            loop (n+1)
    loop 0
```

実行してみましょう

```bash
$ runhaskell Main.hs
0, 1, 2, 3, 4, 5, ^Cgoodbye!
Main.hs: thread killed
$
```

ちゃんとgoodbyeと出力されて終了しました！`killThread`は例外を伴って終了するので`Main.hs: thread killed`というメッセージが出てしまっています。もし気になるなら例外を握りつぶすか`MVar`を使って終了を監視する仕組みを作るといいでしょう。

肝心のSignalを制御する関数は`installHandler :: Signal -> Handler -> Maybe SignalSet -> IO Handler`です。`Signel`には制御するSignal、`Handler`にはSignalが投げられた時の処理、`Maybe SignalSet`には処理時にブロックする他のSignalを指定します。

`Signal`の値は予め用意されていて

|Function           |Signal |
|:------------------|:------|
|keyboardSignal     |SIGINT |
|keyboardStop       |SIGTSTP|
|keyboardTermination|SIGQUIT|
|openEndedPipe      |SIGPIPE|

と言った感じです。

`Handler`は`Default`にすれば標準の動作を、`Ignore`にすれば何もしなくなり、`Catch (IO ())`で処理を記述すればSignalが投げられた時の処理を記述することができます。上の例では`handler`という関数にメッセージの表示とメインスレッドの停止の処理を書いて`Handler`として渡していました。

簡単に解説しましたがまだまだ色々な使い方ができるので是非一度[System.Posix.Signals](https://hackage.haskell.org/package/unix/docs/System-Posix-Signals.html)を読んでみてください(^^)
PythonでGIST特徴量によるシーン認識

numpy, scipy, scikit-learn, scikit-imageといったライブラリを擁するPythonは
機械学習屋さん，CV屋さん御用達言語ですが，
これらを使ってシーン認識するために，
Cで書かれたGIST特徴量抽出ライブラリのPythonラッパーを作りました．

# GIST 特徴量
A. Torralbaが開発した特徴量でシーン認識に向いていると言われています．
Deep Learning全盛の今，今更感ありますが，手軽に試せるので今回使いました．
http://people.csail.mit.edu/torralba/code/spatialenvelope/

# Lear's GIST implementation
GIST特徴量のC実装です．
今回はこれのPythonラッパーを作りました．
http://lear.inrialpes.fr/software

# lear-gist-python
今回書いたラッパーです．
こちらです：https://github.com/tuttieee/lear-gist-python

こんな感じで使えます．

```py
import gist
import numpy as np

img = ... # numpy array containing an image
descriptor = gist.extract(img)
```

上記A. Torralbaのサイト（ http://people.csail.mit.edu/torralba/code/spatialenvelope/ ）で公開されている８シーンデータセット（これも今更…笑）を使った認識のサンプルもあります．

# その他
初めてPythonのC拡張を書きました．
指摘などあればコメントをお願いします．
xcode+gradle xcode pluginでUnitTest実行


# 環境

- xcode6.3
- gradle2.3

# 前提条件

- 対象のXcodeプロジェクトでXCTestを使ったユニットテストがGUIから実行出来る状態になっていること

# スクリプト

UT実行に必要な最小限のgradleスクリプトは以下の通り。

```build.gradle
buildscript {
  repositories {
    maven {
      url('http://repository.openbakery.org/')
    }
    mavenCentral()
  }
  dependencies {
    classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.10.3'
  }
}
apply plugin: 'xcode'

xcodebuild {
  scheme = 'Sample'
  sdk = "iphonesimulator"

  // destinationに何も指定しなければ、全てのシミュレータでテストが実行される。
  destination {
    os = '8.3'
    platform = 'iOS Simulator'
    name = 'iPhone 6'
  }
}
```

上記をxcodeprojと同階層に配置し、`gradle test`のコマンドを実行すると、XcodeのUnitTestが実行される。

```
$ gradle test    
:keychainClean
:keychainCreate SKIPPED
:provisioningClean
:provisioningInstall SKIPPED
:xcodebuildConfig
Parse project file: /Users/mikesorae/Documents/Sample/Sample.xcodeproj/project.pbxproj
:test

Start unit tests


Perform unit tests for: iPhone 6/iOS Simulator/8.3

      OK -[SampleTests.SampleTests testExample] - (0.000 seconds)
      OK -[SampleTests.SampleTests testPerformanceExample] - (0.331 seconds)
      OK -[SampleTests.SampleTests testVendor] - (0.000 seconds)


Tests finished: iPhone 6/iOS Simulator/8.3


All 3 tests were successful
Done

BUILD SUCCESSFUL
```
Symfonyにプルリク2件送ってFabien様にマージされてお褒めの言葉をもらうまで


Symfony使ったことのない私がプルリク2件を送ったら速攻でマージされてFabien様にありがたきお言葉をいただきました( ˘ω˘)

(※正確に言うとResponseクラスだけ使ったことある)

ある日のこと、PHP (not Symfony) でバッチ処理を書いていました
↓
テスト書かねば
↓
あれ、PHPの単体テストってどうやって書けばいいんだろ？
↓
参考になるOSSはないかな？
↓
そういえば [「Symfonyは設計がすぐれてる」](http://blog.tojiru.net/article/386194372.html)って @hiraku さんが言ってたなー
↓
[Symfonyのテストコード](https://github.com/symfony/symfony/tree/2.7/src/Symfony/Component/HttpFoundation/Tests)を読んでみよう!
↓
読んでみた( ˘ω˘)
↓
ほうほう、噂どおりテストしやすい設計になっててテストコードが充実してる！
↓
あれ？[このdocblock間違ってる](https://github.com/symfony/symfony/commit/df9febf64afff30982bf5724eebb408f2bcedb1b) んじゃね？
↓
およ？[この変数名はもっとわかりやすくできる](https://github.com/symfony/symfony/commit/47fad106d584679bf2bcd296e0b9a445ca1bb3cd) んじゃね？
↓
ダメもとでプルリク送ってみよ
↓
送ってみた( ˘ω˘)
 * [1件目](https://github.com/symfony/symfony/pull/11811)
 * [2件目](https://github.com/symfony/symfony/pull/11812)
↓
マージされた!!
↓
あのFabien様から[お褒めの言葉](https://github.com/symfony/symfony/pull/11811#issuecomment-54050125)が!! 
↓
૮(꒦ ິཅ꒦ ິ)ა ブワッ

# まとめ
* Symfony使ってなくてもコントリビュートするチャンスはある
* テストコードは開発者の目が行き届いてない箇所があるのでワンチャンあるで
* みんなでコントリビュートしてこ( ˘ω˘)
【javascript】jQuery入力制限

テキストインプットのkeyupイベントに入力制限をかける

with属性で入力種別を制御
limit属性で入力文字数を制御

独自属性ってあまり使ってる人を見ないんだけど、
こういう実装ってなにかマズいんだろうか？




```js:inputcontrol.js
/**
 * 独自属性による入力制御
 * limit = 文字数制限(>0の数値)
 * with  = 入力文字制限
 * 例：６文字以内の数値
 * <input type="text" with="numeric" limit="6" />
 */
;(function($){
$(function(){
    $("[with]").off(".inputcontrol")

    /**
     * 半角数値のみ
     */
    $("[with='numeric']")
        .off(".inputcontrol.numeric")
        .on("keyup.inputcontrol.numeric", function(){
            $(this).val($(this).val().replace(/[^0-9]/g,""));
        })


    /**
     * 半角英字のみ
     */
    $("[with='alpha']")
        .off(".inputcontrol.alpha")
        .on("keyup.inputcontrol.alpha", function(){
            $(this).val($(this).val().replace(/[^a-zA-Z]/g,""));
        })


    /**
     * 半角英数のみ
     */
    $("[with='alphanum']")
        .off(".inputcontrol.alphanum")
        .on("keyup.inputcontrol.alphanum", function(){
            $(this).val($(this).val().replace(/[^0-9a-zA-Z]/g,""));
        })



    /**
     * 全角カナのみ
     */
    $("[with='zenkana']")
        .off(".inputcontrol.zenkana")
        .on("keyup.inputcontrol.zenkana", function(){
            $(this).val($(this).val().replace(/[^ァ-ヶヽヾー]/g,""));
        });


    /**
     * 半角カナのみ
     */
    $("[with='hankana']")
        .off(".inputcontrol.hankana")
        .on("keyup.inputcontrol.hankana", function(){
            $(this).val($(this).val().replace(/[^ｦ-ﾟ]/g,""));
        });


    /**
     * 半角のみ
     */
    $("[with='hankaku']")
        .off(".inputcontrol.hankaku")
        .on("keyup.inputcontrol.hankaku", function(){
            $(this).val($(this).val().replace(/[^ -~]/g,""));
        });


    /**
     * 全角のみ
     */
    $("[with='zenkaku']")
        .off(".inputcontrol.zenkaku")
        .on("keyup.inputcontrol.zenkaku", function(){
            $(this).val($(this).val().replace(/[ -~]/g,""));
        });



	/**
	 * 文字数制限
	 */
	$("[limit]")
		.off(".inputcontrol.limit")
		.on("keyup.inputcontrol.limit", function(){
			var limit = $(this).attr("limit");
			var currentval = $(this).val();

			if (currentval.length>limit) {
				$(this).val(currentval.substr(0,limit));
			}

		});
});
})(jQuery);

```
AndroidStudio + PowerMock でstaticメソッドをmockする

# AndroidStudio + PowerMock でstaticメソッドをmockする

転載元: [Yukiの枝折 - Android : AndroidStudio + PowerMock でstaticメソッドをmockする](http://yuki312.blogspot.jp/2015/04/android-androidstudio-powermock.html)

## 確認環境

 - Android Studio 1.1
 - Android Gradle Plugin 1.1
 - JUnit 4.12
 - PowerMock 1.6.2

## はじめに

Android Studio 1.1(android gradle plugin 1.1)からUnitTestがサポートされた. 
今回は[PowerMock](https://code.google.com/p/powermock/)を使ってstatic methodをモックするUnitTestを書いた. 

Android StudioでUnitTestを開始するには下記を参考. 

 - [Unit testing support - Android Tools Project Site](http://tools.android.com/tech-docs/unit-testing-support)
 - [Gradle Plugin 1.1.0-rc1でJVMでテストを実行出来るようになったらしい](http://sys1yagi.hatenablog.com/entry/2015/02/06/154430)

UnitTestの準備が整ったならモジュールのbuild.gradleに下記の依存ライブラリを記述する.

```groovy
    // UnitTestにはtestCompileキーワードを使用
    testCompile 'junit:junit:4.12'

    // PowerMockのライブラリを指定
    testCompile 'org.powermock:powermock-module-junit4:1.6.2'
    testCompile 'org.powermock:powermock-api-mockito:1.6.2'
```

次はoptionだが, Android StudioのUnitTestは実行時にandroid.jarのモックとなる`mockable-android*.jar`を作成する. 
ここで定義されるメソッドスタブはすべてRuntimeExceptionをスローするように実装される. 
これをExceptionではなくDefault value(false etc.)を返却するように変更するには下記を指定する. 

```groovy
    testOptions {
        unitTests.returnDefaultValues = true
    }
```


あとはいつもの方法でPowerMockを使えばOK.

 - TestRunnerにPowerMockRunnerを指定

```java
	@RunWith(PowerMockRunner.class)
	public class MyTestCase extends TestCase {
```

 - TestCaseを継承したクラスにアノテーションを追加

```java
	@RunWith(PowerMockRunner.class)
	@PrepareForTest(Static.class) // Staticメソッドをモックするクラスを指定(,で複数指定可)
	public class MyTestCase extends TestCase {
```

 - `PowerMockito.mockStatic()`でモックするクラスを指定
 - `Mockito.when()`でモックするメソッドとその振る舞いを指定.

``` java
	PowerMockito.mockStatic(StaticHogeClass.class);
	Mockito.when(StaticHogeClass.apply()).thenThrow(new Throwable("Hello PowerMock"));
```

以上.
MacのJavaScript for Automation(JXA)のライブラリを作る

以前はsegmentation faultで落ちて動かなかったので放置してました。
ふと思い出して使ってみたら動くようになってたのでメモ。

OS X 10.10.3

# 作ってみる
Script Editorを開き、適当に関数を作ります。

```js:sample.scpt
function greeting(){
  return "ぷいにゅー"
}
```

`~/Library/Script Libraries/`に保存して終わりです。
このフォルダが無い場合は作成します。
「sample」という名前で保存しました。

# 使ってみる

ライブラリの参照を`Library`関数から得ることができます。
ファイル名を指定します。拡張子(.scpt)はいりません。

この参照から、そのライブラリの関数を使うことができます。

```
lib = Library("sample")
lib.greeting()
//=> "ぷいにゅー"
```

## 関数の外の処理

関数の外はライブラリの参照を得た際に実行されます。
トップレベルで変数を宣言する際、ライブラリを使う側には影響ないのでvarはつけてもつけなくてもいいです。

```js:sample.scpt
app = Application.currentApplication()
app.includeStandardAdditions = true

app.displayDialog("そと")

function disp(){
  app.displayDialog("なか")
}
```

```
lib = Library("sample") //この時点で「そと」というダイアログが表示される
lib.disp() // 「なか」というダイアログが表示される
```

# スクリプトエディタを使わないでライブラリを作る

ライブラリはプレーンテキストのJavaScriptでは駄目です。
scptにコンパイルされている必要があります。

プレーンテキストからコンパイルする場合は`osacompile`を使います。

```text:「sample2.scpt」として「sample2.js」をコンパイル
$ osacompile -l JavaScript -o sample2.scpt sample2.js
```

`-o xxx`は出力するファイル名です。省略すると`a.scpt`という名前になります。
拡張子の補完はされないので必ず`.scpt`をつけます。

# AppleScript

ライブラリがAppleScriptで書かれていてもJXAから使用できます。逆も可。

```applescript:apple.scpt
on versionOfMac()
	system version of (system info)
end versionOfMac
```

```js
lib = Library("apple")
lib.versionOfMac()
//=> "10.10.3"
```

# 超絶注意

・**戻り値が浮動小数点数の場合、整数に強制変換される**っぽい
・ライブラリの保存後、なぜか変更が反映されるまでしばらく時間がかかる

# 参考
[JavaScript for Automation Release Notes](https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/#//apple_ref/doc/uid/TP40014508-CH109-SW14)
iOS 7以下で画面のスクロール量と連動したJavaScript処理を行う（iScroll 5使用）

# iOS 7以下におけるscrollイベントの問題

いわゆる「パララックス」などのスクロール連動型コンテンツを実装する場合、JavaScriptでwindowのスクロール量を連続的に取得し、その結果に応じてリアルタイムに画面描画を変更していく手法が取られます。

~~~javascript:JavaScript
// jQuery使用

$(window).on('scroll', function() {
  var scrollTop = $(this).scrollTop();

  // PCやAndroid、iOS 8以上では画面スクロール操作に応じてスクロール量が連続的に出力される
  console.log(scrollTop);
});
~~~

ただし、iOS 7以下においては「スクロール中」にscrollイベントが連続的に発生せずに「スクロールが完了したタイミング」で1度だけ発生するため、スクロール操作に完全に連動したシームレスな演出が行えないという問題があります。

# iScroll 5を利用した「擬似スクロール」の実装

上記のようなOSの仕様上の問題やブラウザパフォーマンスの観点から、**スマートフォン端末向けのWebページ制作においては「スクロール連動処理を省略する」**という対応がとられる場合が多いかと思います。

しかし、何らかの事情で、「どうしてもiOS 7以下を含めたスマートフォン端末でスクロール連動処理を実装しなくてはならない」という状況に陥った場合には、iScroll というJavaScriptライブラリを利用することで**「それらしい処理」を擬似的に**再現することができます。

以前のバージョンではiScroll本体のJSコードをカスタマイズする必要がありましたが、バージョン5で追加された "iScroll probe edition" で擬似scrollイベントの利用が可能になりました。

- [iscroll - GitHub](https://github.com/cubiq/iscroll)

## 実装例

※この例ではjQueryを使用していますが、iScroll自体はjQueryを使用しなくても動作します。

~~~html:HTML
<head>
  <script src="jquery.js"></script>
  <script src="iscroll-probe.js"></script>
</head>

<body>
  <div id="scrollContainer">
    <div class="scrollInner">

      <!-- スクロールさせたいコンテンツ全体 -->

    </div>
  </div>
</body>
~~~

~~~css:CSS
body {
  overflow: hidden;
}

#scrollContainer {
  position: absolute;
  z-index: 1;
  top: 0;
  bottom: 0;
  left: 0;
  width: 100%;
  overflow: hidden;
}
~~~

~~~javascript:JavaScript
// jQuery使用

// iScroll 実行処理
function init() {
  var myScroll = new IScroll('#scrollContainer', { probeType: 3, mouseWheel: true, click: true });

  // 擬似scrollイベントに関数を紐付け
  myScroll.on('scroll', updateScroll);
  myScroll.on('scrollEnd', updateScroll);

  // デフォルトのtouchイベントを無効化
  $(document).on('touchmove', function(e) {
    e.preventDefault();
  });
}

// 「擬似スクロール量」を更新
function updateScroll() {
  var y = this.y >> 0; // this.y で取得できる擬似スクロール量を整数化
  moveParallaxObj(y);
}

// 例：パララックス処理
function moveParallaxObj(y) {
  var parallaxY = -1 * y / 2;	
  $parallaxObj.css({top: parallaxY + 'px'});
}

init();
~~~

## iScrollがやっていることと、利用する上での注意点

iScrollは大まかには以下のような処理を行なっています。

- スクロールさせたい要素を絶対配置し、Webブラウザの本来のスクロール機能を無効にした上で、要素の内容をCSS transformで移動させて擬似的に「画面をスクロールしている」ように見せる。

**実際にwindowをスクロールさせているわけではない**ため、Webブラウザが本来備えている機能（例：ページ内アンカーリンクなど）をそのまま利用することができず、それぞれ独自の実装が必要になります。

思わぬところで作業コストが爆発的に増える可能性があり、導入は慎重に行なったほうが良いでしょう。

***

iScroll に関する詳細な情報は公式ページかGitHubをご覧ください。

- [iscroll - GitHub](https://github.com/cubiq/iscroll)
TextMate 2 設定メモ（空白可視化編）


Mac の TextMate 2 でホワイトスペースの可視化を行います。一部読みかえれば他のプラットフォームでも適用可能だと思います。

## 行末のホワイトスペースを可視化
	
以下のバンドルをインストールします。

* https://github.com/mads379/Whitespace.tmbundle

```bash
$ mkdir -p ~/Library/Application\ Support/Avian/Bundles
$ cd ~/Library/Application\ Support/Avian/Bundles
$ git clone https://github.com/mads379/Whitespace.tmbundle.git
```

上記を実行して TextMate 2 を再起動。念のため、GitHub のサイトを参照してそちらの手順に従ってください。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/0aa516f9-5cf7-8d34-0ec7-7bab4410bc7a.png "")

行末のホワイトスペースが強調されるようになりました。

3 行目のコロンが同時に強調されているのは、TextMate 2 にバンドルされている JSON の強調構文が、行末にカンマを期待しているため、シンタックスエラーを出しているようです。JSON のありがちなカンマ忘れを教えてくれるのはすごく助かるのですが、意外とつまらないバグ？があるんだなぁ、と思いました。

## タブ文字を可視化

TextMate 2 はホームディレクトリかカレントディレクトリにある `.tm_properties` というファイルの内容を読み出します。TextMate 2 のヘルプで `.tm_properties` で検索すると一通りの説明が出てきます。

ヘルプにはタブ文字を可視化する方法は記載されていませんが、設定で可能になります。

```.tm_properties
showInvisibles = true
```

これでタブ文字が可視化されるようになりました。

![](https://qiita-image-store.s3.amazonaws.com/0/31613/53dfd71d-4a5e-bf4c-33b7-5ae2aa06fb08.png "")

半角スペースの可視化が邪魔くさいです。タブだけを可視化したいのですが、そのような設定はできません。

## 全角空白を可視化

全角空白は Ricty というフォントで可視化します。

`.tm_properties` に以下の設定を記載します。

```.tm_properties
fontName = "Ricty"
```

![](https://qiita-image-store.s3.amazonaws.com/0/31613/f97f9b17-a241-cd36-ba0f-283cad598d2f.png "")

Ricty の全角スペースのグリフが表示されました。
VCCWでphp.iniのupload_max_filesizeを変更する

vagrant ssh で編集 **せずに**、 Vagrantfile へ設定を追加するのがおすすめです。だいたい使いまわすので。

```rb
  config.vm.provision :chef_solo do |chef|
    # ... 省略
    chef.json = {
      # ... 省略
      :php => {
        :packages => %w(php php-cli php-devel php-mbstring php-gd php-xml php-mysql),
        :directives => {
            'default_charset'            => 'UTF-8',
            'mbstring.language'          => 'neutral',
            'mbstring.internal_encoding' => 'UTF-8',
            'date.timezone'              => 'UTC',
            'short_open_tag'             => 'Off',
            'session.save_path'          => '/tmp',
            'upload_max_filesize'        => '48M', # ここを追加
        }   
      },
```

VMを作成する前ならばこのまま

```sh
$ vagrant up
```

VMを作成した後に変更したい場合は

```sh
$ vagrant provision
```

で反映されるはずです。
UnityでAndroid In App Billing Pluginを使った課金テストで詰まったポイント

Unityで開発中のアプリで、アプリ内課金を実装してテストした際に詰まったところのメモ

アセットストアの「Android In App Billing Plugin」を使っています。
主にGoogle Developer Consoleの設定周りでの出来事です。

■アプリ内アイテムのタブで各アイテムのステータスを「有効」にしていなかった
　アイテムごとに有効にする必要があります。

■アプリを公開中にしていなかった
　ベータ版テストかアルファ版テストにAPKをアップして
　「公開中」のステータスにしないと課金テストが出来ません。

■アプリをアップする際に50MBを超えてしまった
　50MB未満に落とす必要があります。やり方は複数ありますが
　リソース類を全て削ってビルドを行い、アプリとしては動かない成果物(apk)を
　アップしても課金テストは行えました。
　一度Bundle Identifer・証明書が整ったアプリを上げてしまえば
　GooglePlayからアプリをダウンロードしなくてもテストは可能です。

■アプリが送信するRSA鍵が間違っていた
　これが詰まった。RSA鍵が異なっていてもGooglePlayの課金完了画面までは到達してしまう。
　実際は課金がSuccessしていないので、これ以降に失敗した課金のキューが溜まってしまい、
　PluginのqueryInventoryメソッドで以下のエラーでこけてしまい、商品リストがとれなくなった。
　(response: -1003:Purchase signature verification failed)
　RSA鍵を正しくすれば解決したが、今まで失敗したアカウントに関してはキューを消化する術が見つからず工場出荷状態にするしかない模様…

■GooglePlayDeveloperConsoleのアカウントの詳細で、「テスト用のアクセス権がある Gmail アカウント」に対象のGmailアカウントを登録していなかった。
　登録していなかった上に、登録しても数時間は反映されなかった…

■（追加）BundleIdentiferが異なるビルドだった…
　AndroidでBundleIdentiferが署名と異なる場合、課金しようとした時にGooglePlayが出すダイアログでは
　「このバージョンでは課金できません」的な文言が出る。
　てっきりバージョンかと思ったが、このメッセージは署名に不備がある場合などでも出る模様なので注意。
　（ビルドジョブが複数ある関係でIdentiferも複数あったため起こった）



上記の箇所に順番につまって最終的には課金テストが成功しました。
他にも詰まったところがあった気がするので思い出したら備忘録的に追加します。

それにしてもAndroidの課金テストはやりづらい…
cassandra トラブルシューティング

自分用メモです。内容は随時追記します。

# compaction がやたら重い
## 状況

- 特定の partition key における columns サイズが大きいのが怪しい

## 対応

- partition key を細かく分割できるよう、テーブル（columnfamily）の設計を変更する
- サイズ感としては `100k columns/partition key` and `100MB/partition key`
- 怪しいテーブルを見つけるにはログを漁る。

```
$ grep 'Compacting large row' /var/log/cassandra/system.log
```


# クエリがタイムアウトする
## 状況

- `Request did not complete within rpc_timeout.` が出て結果が返ってこない
- 特定の row のみで発生する。その row を外せば正常にレスポンスを取得可

=> 特定の row が破損している可能性が高い

## 対応

```
$ sudo nodetool scrub {keyspace} {table_name}
```


### 参考
http://docs.datastax.com/en/cassandra/2.0/cassandra/tools/toolsScrub.html?scroll=toolsScrub__synopsis_unique_45


# replication factor を調べる

```
cqlsh> SELECT * FROM system.schema_keyspaces;
```
[Android][Java] Button #1

# 生成

Widgetsから`Button`を選んで配置。
![android_button.JPG](https://qiita-image-store.s3.amazonaws.com/0/18828/c19e6378-64c7-410b-7517-eeac76328a63.jpeg)

これによって追加されたコード

```xml:activity_main.xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />
```

# 押されたら

プロパティの`onClick`を見てみると何やら2つ出てくる。
![android_button2.JPG](https://qiita-image-store.s3.amazonaws.com/0/18828/9515c02b-c4a8-9d50-fc32-ef04603163de.jpeg)

* setListFooter
* setContentView

よく分からないので、とりあえずこれは無視して自分でメソッドを作る。

```java:MainActivity.java
public void onClick(View view) {
    System.out.println("[onClick] view="+view);
}
```

これでプロパティの`onClick`に作成したメソッドが表示されるようになるので、選択すると以下のコードが追加される。

```xml:activity_main.xml
<Button
    (中略)
    android:onClick="onClick" />
```

実行してボタンを押すと、

```text:logcat
I/View﹕ Touch down dispatch to android.support.v7.internal.widget.TintButton{421ddea0 VFED..C. ........ 272,511-448,607 #7f090040 app:id/button}, event = (以下略)
I/View﹕ Touch up dispatch to android.support.v7.internal.widget.TintButton{421ddea0 VFED..C. ...P.... 272,511-448,607 #7f090040 app:id/button},  event = (以下略)
I/System.out﹕ [onClick] view=android.support.v7.internal.widget.TintButton{421ddea0 VFED..C. ...P.... 272,511-448,607 #7f090040 app:id/button}
```

# ToDo

* ボタンを動的に生成する。
* onClickが適当なのでちゃんと調べる。
 * [美しいOnClickListenerの実装方法](http://qiita.com/t2low/items/8ac683c7ebf4b6dd1b41) / Qiita - t2lowさん
 * [ボタンクリックイベントを取得する]() / Android Studioでアプリ開発！
* 複数ボタン対応。
【俺用メモ】SeleniumIDEについて調べたこと

俺用メモシリーズ第三弾。
いつものメモなので文体が入り混じってます。

# セレクタ
セレクタが何個か使えるらしい。
よく使う2個だけメモ。

## cssセレクタ
css=#hoge
このように先頭にcss=とつければOK。
css=.huga:first-childとかもできるので便利。
ループが使えるようになるプラグインを使えば.huga全部に対してテスト、とか細かくできそう。

## XPath
//html/body/header/div/div[1]/a/img
みたいな感じで。デバッグツールでDOMツリーを右クリックするとだいたい「XPathでコピー」みたいなのがあるので、それを選択した上で**先頭に/**をつける。
先頭に/をやることでXPathですよ、という指定になるのかな？

# コマンド関連

## assertXxxとverifyXxxの違い
[日本語ドキュメント](http://oss.infoscience.co.jp/seleniumhq/docs/04_selenese_commands.html)に以下のような記述があります。

> ”assert” では、テストがエラーになり、現在のテストケースは中止されますが、”verify” では、テストはエラーになるものの、テストケースの実行は続行されます。
> この機能を上手に活用するには、テストのコマンドを論理的にグループ化し、各グループを “assert” で始め、その後に 1 つまたは複数の “verify” コマンドを続けて記述します。

例えば「そのページが表示されていること」をassertで確認して、
「そのページ内にこの文言あるよね」とかをverifyとすれば、
ページが表示されていることが前提条件としてあって、
その上で文言チェックをするということになり擬似的にグループ化しましょう。
ということですね。

## clickAndWaitではなくpause
リンクなりボタンなりをクリックした後、なにかhtmlの要素を追加することがあるかと思います。
次の20件を表示する、みたいなそういうボタン。

その挙動をテストしようとすると

1. クリックする
2. htmlが追加されるのを待つ
3. htmlの要素数なりで追加されたことをテストする

という手順になるかと思います。
それの1,2をやってくれそうな名前をしている``clickAndWait``コマンドですが
ページ遷移を想定しているコマンドであって想定している用途には使えません。
試しにクリックされてhtmlが追加されるのをテストしてみたのですが、Timeoutでエラーになります。

> [info] Executing: |clickAndWait | css=#add-dom | |
> [error] Timed out after 30000ms
> [info] Test case failed 

``clickAtAndWait``というそれっぽい名前のコマンドもありますが、これはx,yを引数で渡すと、その座標の分、カーソルを動かしてくれる、的な？のもありますが、ちょっと使い方がよくわかりません。

なのでそれぞれ別々のコマンドで動かしていきます。

1. ``click``
2. ``pause``
3. ``assertXxx``

## pause
ミリ秒の指定、 値じゃなくて対象に入れる。
![スクリーンショット 2015-04-28 20.41.00.png](https://qiita-image-store.s3.amazonaws.com/0/46392/dec1c4c5-7657-255a-cad1-bd0f4598bfd8.png)
値の方に入れて書き換えて「効かない効かない」とか言ってたアホが私です。

## waitForXxx

上記と関連して、

1. ``click``
2. ``pause``
3. ``assertAlertPresent``

とかやってみたんです。例えばボタンクリックしたらajaxでpostして、結果がOKなら「保存しました」みたいなアラートを出す感じのテストです。
が、アラートが出るタイミングでテストがコケるんですよね。
pauseを長く指定してみたりもしても解決できず。
で、解法は以下のとおり

1. ``click``
2. ``waitForAlertPresent``

アラートが出るまで待ってくれるんですね。痒いところに手が届きますわ。
なお、アラートの文章まで確認したい場合は``waitForAlert(string)``の方を使うのが良さそう。（アラートの内容が「保存できませんでした」みたいなメッセージかもしれないしね）

それで言うと前述の例もpauseを使わずにwaitForXxxで代用できる可能性はあるなぁ、と思います。

# コメント
コメントを挿入できます。
適宜、このコマンドが何のためのテストなのか？などを書いておくとレビューなども捗ります。
コメント書いててRPGツクールのイベントの管理方法を思い出した。
--以下、戦闘イベント--みたいな空のイベント作ってたわ。
Apple WatchのUDIDを調べる・追加する方法

ついに発売されました、Apple Watch。
今までXcodeのiOSシミュレーターでしか確認できなかったものがついに実機で確認できるようになりました。

アプリを作成し、テスターの人にAdHoc配布でアプリをテストしてもらう時になぜかインストールできない症状が起こっていました。

調べてみると、Apple WatchもiPhone、iPad同様にUDIDがある模様。
ProvisioningFileにApple WatchのUDIDがないと、iPhoneにはアプリをインストールできても、Apple Watchにはインストールできない、ということが起こります。

そこで、UDIDを調べる方法をご紹介します。

##UDIDを調べるにはXcode＞Deviceで確認する
事前にiPhoneとApple Watchをペアリングしておきます。

その後、ペアリングしたiPhoneをMacに接続。
そして、Xcodeを起動させます。

Xcodeのメニューバーにある「Window」の中にある「Device」を選択します。

すると、この画面が表示されます。

![スクリーンショット_2015-04-28_16_19_12.jpg](https://qiita-image-store.s3.amazonaws.com/0/40009/e1f7ca57-3585-8fb2-a73e-dd093884c4d2.jpeg)

接続しているiPhoneを選択すると、ペアリングしているApple Watchも紐付いて表示されます。

Apple Watchの「Identifier」の部分がApple WatchのUDIDとなります。


このUDIDをApple Developer CenterでUDIDを登録します。

あとはいつも通りにProvisioningProfileにインストール可能なデバイスを選ぶところからApple Watchを含める。


これでAdHoc配布でもApple Watchにインストールが可能になります。



まとめると、以下の通りです。

1. iPhoneとApple Watchをペアリングする
2. ペアリングしたiPhoneをMacにつなぐ
3. Xcodeを起動してメニューバー「Window」＞「Device」を選択
4. 接続されているiPhoneを選択すると、ペアリングされているApple Watchが表示される
5. Apple Watchのところの「Identifier」を確認

しかし、Xcode上からしかUDIDが確認できないのは不便ですね。
他に確認する方法を知っていたら、教えてください。。。
Raspberry Pi や Mac の MANET (Mobile Ad-hoc NETwork) による wifi メッシュネット


#始めに
olsrd を使って Raspberry Pi や Mac によるメッシュネットワークを簡単に構築できます。災害時等、現場でトポロジを意識しないで一時的なネットワークを構築したい時に便利です

#なにが嬉しいのか
[ad-hoc 通信ができるようになったら](http://qiita.com/UedaTakeyuki/items/851fc8c19f36b96a0ae6)、次は olsrd を動かすとメッシュネットを構築できます。メッシュネットになると通常の ad-hoc 通信と違い、マルチホップで通信をすることができます。ルーティングテーブルは olsrd が定期的に再構成してくれるので、ピアが移動してネットワークトポロジが変わっても大丈夫なあたりが MANET の Mobile たる所以ですね

#インストール
Raspberry Pi の場合は apt で、Mac は brew でインストールできます

```bash:RaspberryPi
sudo apt-get install olsrd
```

```bash:Mac
brew install olsrd
```

#起動
```bash
sudo olsrd -i インターフェース1 (インターフェース2 ...) -d 1
```
インターフェースは Raspberry Pi の場合は wlan0 とか、Mac の場合はおそらく en0 とかだと思います。
-d 1 はデバッグオプションで、1 で標準出力に下記のようなデバッグ情報を出力してくれます。0 でデバッグ出力なしです
![スクリーンショット 2015-04-28 18.43.29.png](https://qiita-image-store.s3.amazonaws.com/0/46544/258d8880-aa57-e2eb-9f6c-254d7664bf6c.png "スクリーンショット 2015-04-28 18.43.29.png")
ここで LQ は Link Quality で、LQ をベースに COST が計算されます。
上のデバッグ出力は 192.168.12.x ネットワーク内で

+ 192.168.12.1
+ 192.168.12.3
+ 192.168.12.5

の３台がそれぞれお互いすぐそばにあり、olsrd を起動している時の、12.1 のデバッグ出力です。
  1-hop として 192.168.12.3 と 192.168.12.5 両方が見えていて、さらに 2-hop でぞれの相手が見えているメッシュになっています。
　ここで、1 と 3 がかろうじてつながる程度に距離を離して、さらに 3 と 5　がかろうじてつながるよに距離を離して、1 - 3 - 5 という接続しかできないようにメッシュを引き延ばすと 1 のデバッグ出力は以下のようになります

![スクリーンショット 2015-04-28 18.51.12.png](https://qiita-image-store.s3.amazonaws.com/0/46544/73056c98-2634-0d8d-34c8-6fdf23392847.png "スクリーンショット 2015-04-28 18.51.12.png")

1-hop で 3 が、2-hop で 5 が見えています
この時、1 から 5 が（3経由のマルチホップで) 普通に使えます。

#補足
因に、olsrd を動かすのに ad-hoc 接続は別に必須ではないです。 managed mode の wifi に対してもルーティングテーブルをつくってくれます。例えば、wifi ドングルを二個刺して、一個が ad-hoc接続、もう一個を AP 接続（managed）にして、その両方を olsrd で管理することも可能です。下の図では 192.168.12.x 系が ad-hoc, 192.168.11.x 系が AP 接続な状態で olsrd でルーティングしています。
![スクリーンショット 2015-04-28 18.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/46544/8a9675a3-52c1-6919-6862-c41c98fcabbe.png "スクリーンショット 2015-04-28 18.42.20.png")

もちろん、APに接続することが前提なメッシュネットというのは本来の柔軟性がなくて嬉しくしくないですね。

#感想
メッシュネットは消費電力の小さい ZigBee とか 920MHz モジュールとかで構築するもの、という先入観が私はあったのですが、よく考えてみると Raspberry Pi + WiFi という大飯食らい（！）な構成でもパワーリソースが問題にならないような現場では、モジュールの安さと Linux が使えてしまうソフトウェアの柔軟さの魅力のほうが大きいので、これはこれでありな気がします

#参考URL

+ [OLSR.org](http://www.olsr.org/mediawiki/index.php/Main_Page)
+ [Linux Olsr HOWTO](http://www.tldp.org/HOWTO/OLSR-IPv6-HOWTO/intro.html)
+ [アドホックネットワークにおける プロアクティブ型経路制御の適用限界](http://www.qos.tu.chiba-u.jp/thesis/2009_m2_choyo_kou.pdf) もの凄く丁寧に書かれている修論なのですが、本当にわかりやすくまとまっていて概要がよくわかりました
+ [アドホックネットワーク](http://www.ieice-hbkb.org/files/04/04gun_05hen_02.pdf) 信学会の知識ベース。あっさりとした説明
3x3行列から回転・拡大縮小・平行移動の成分を取り出す

AndroidのCanvas APIを使った描画をしていてMatrixから回転・拡大縮小・平行移動の成分を取り出したくなったので計算方法を考えてみた。

2次元の点の変換を定義するある行列から回転成分・拡大縮小成分・平行移動成分を抽出するためには、回転行列と拡大縮小・平行移動の行列の積に分割すれば良い。行列の積は順番によって結果が異なるので、回転を先に行うか拡大縮小・平行移動を先に行うかによって求める値が異なる。
求めたい回転成分を θ 、拡大縮小成分を sx, sy 、平行移動成分を dx, dy とする。

## 先に拡大縮小・平行移動してから回転すると考える場合

![1.png](https://qiita-image-store.s3.amazonaws.com/0/56668/e4cc5104-eda7-b924-85a6-08fead68180d.png)

上記より

![2.png](https://qiita-image-store.s3.amazonaws.com/0/56668/4a58e5c9-e5f0-0112-f15b-23d91ff9b039.png)

であることがわかる。
a,b,d,eをそれぞれsx,syについて解くと

![3.png](https://qiita-image-store.s3.amazonaws.com/0/56668/4bc0212b-046b-cc25-8f71-cf1ae993140b.png)

また、a と d より

![4.png](https://qiita-image-store.s3.amazonaws.com/0/56668/78e373f3-dd4b-b398-5b87-250da32a0e08.png)

となるから

![5.png](https://qiita-image-store.s3.amazonaws.com/0/56668/49d258bf-f32d-ba47-61f0-b742fd957cd0.png)

---

θがわかったので、式1、式2からsx, syを計算する。sinθとcosθのどちらか0でない方を使って計算する。
c にcosθを掛けて、f にsinθを掛けると

![6.png](https://qiita-image-store.s3.amazonaws.com/0/56668/0478af5c-e1cb-70dc-14db-f8f368e4ae46.png)

2つの式を足すと

![7.png](https://qiita-image-store.s3.amazonaws.com/0/56668/2f8fae9a-231f-1121-7be7-a120a65928cf.png)

sinθ≠0のとき、cより

![8.png](https://qiita-image-store.s3.amazonaws.com/0/56668/736191aa-81bd-770e-b904-2e567bcefd56.png)

cosθ≠0のとき、fより

![9.png](https://qiita-image-store.s3.amazonaws.com/0/56668/40151a81-aabe-e5e4-0f1e-a1fe9d71a4d3.png)

## 先に回転してから拡大縮小・平行移動すると考える場合

![10.png](https://qiita-image-store.s3.amazonaws.com/0/56668/47dfc614-5f97-05ef-2b7a-e346ca4d0982.png)

成分同士の対応から、

![11.png](https://qiita-image-store.s3.amazonaws.com/0/56668/2b8d7461-a2b1-8a7f-0932-7e984c26b7cd.png)

cosθ≠0のとき、

![12.png](https://qiita-image-store.s3.amazonaws.com/0/56668/0c37b71a-b1b0-96ff-ee73-911c731b3504.png)

sinθ≠0のとき、

![13.png](https://qiita-image-store.s3.amazonaws.com/0/56668/0205d08a-9fea-3813-6972-296b8d740a8a.png)

こっちのほうが簡単ですね。

## 注意

書いてから気づいたけど a = 0 となる場合とか、分母が0になる可能性を考慮した処理が抜けてるな…でも普通の描画処理だったらあんま気にしなくていいのかな？気にしなきゃいけなかったら教えてください。

tan-1 はJavaでいうところの `Math.atan()` です。
arrow function の引数は括弧で囲っておいた方が良さそうな件

# ES6 クイズの答え

[ES6 クイズ](http://qiita.com/Jxck_/items/11e8dcdb97e5e82c8cc9) は、俺自身が「いずれ引っかかりそうだな」と思ったもの。
「そう見えるのは俺だけかも。。」と思って何人かにクイズとして出してみたら、意外と引っかかったので俺だけじゃなさそうと思って書いた。


## クイズ1

```js
var a = 1;
if (a => 2) {
 console.log('bigger');
} else {
 console.log('smaller')
};

// bigger
```

`a => 2` は比較演算ではなく、 arrow function なので常に `true` になる。
念のため言うと、本来比較演算の greater than は `a >= 2`。


## クイズ2

```js
var a = 1, b = 2, c = 3, d = 4;
var f = a => b ? c: d;

// f = ?
```

1 と全く同じで、 `f` は arrow function になる。
(`a` と `b` の比較なら `a >= b`)

わかりやすく書くとこう。

```js
var f = (a) => { b ? c: d; }
```

つまり、 `f` を実行すると、 `b` が `truthy` なので `c` が返る。

```js
f(); // 3
```

ちなみに AST レベルでは [和田さんが調べてた](http://qiita.com/t_wada/items/2187704e31d25e1ae414) のでそちらを参照。


## 本当の問題

この問題、単なる引っ掛けで済めば良いけど、
実際にだれかがこのコードをしれっと入れてしまったときに、気づくのって簡単だろうか。
(たとえ、このエントリを読んで、問題を知っていたとしても。)


特に初心者は、 `<=` の反対は `=>` だろと思うのは無理も無いと思う。
というかそっちの方が直感的な気もするし。


本当の問題は、「今まで `=>` はエラーだった」ということだ。
構文的に間違っていることを処理系が教えてくれたから、俺らは自然とそれを避けてこれた。


でも、 arrow function が有効な環境では、もうこれは Valid なものとして解釈されてしまう。
自分でそれに気づく仕組みを持っておきたいと思うのが、自然なアプローチのように思う。


## 対策

個人的には、以下のスタイルを強制するのが一番楽だと思う。
(もちろん、テストは書こう。でもその話はしてない。)


```
arrow function の引数は必ず `()` で囲む
```

そして、それを強制するための eslint plugin を書いた。


https://github.com/Jxck/eslint-plugin-arrow-function

[追記] @teppeis さんの PR で、 Condition が期待される部分のみ検出するルールを追加しました。 [no-condition](https://github.com/Jxck/eslint-plugin-arrow-function#no-condition)

これを入れれば、以下のようなコードは全て怒られる。

```js
a => {}
a => a
a => {\n}
a.then(foo => {});
a.then(foo => a);
a(foo => { if (true) {}; });
```

こう直すと通る。

```js
() => {}
(a) => {}
(a) => a
(a) => {\n}
a.then((foo) => {});
a.then((foo) => { if (true) {}; });
```


このルールを導入していると、クイズのコードはこう書かないと動かなくなり、
もし比較演算を意図していたなら、おかしいことに気づけると思う。


```js
if ((a) => 2) {
  // snip
}
```

```js
var f = (a) => b ? c: d;
```


中括弧や `return` まで強制すればもっと良いかもしれないけど、それは arrow function の旨味まで消えている気がするので、
スタイルで強制するのはこのくらいがちょうどいいと思う。今のところ違和感は感じてない。



なお、「今まで動かなかったコードが動くようになる」ということがもたらす問題に、これからもっと直面するだろうなと思う。
連鎖決済にてPENDDINGになっている支払の返金

連鎖決済にてPENDDINGになっている支払に対して返金処理(Refund API) もしくは決済の取消の処理を行うことができるか？
可能な場合、通常の返金処理と同様にRefund API を実行すればよい認識で問題ないか？
TableauからGoogle Analytics, BigQueryにつなぐとき、証明書エラーが出たら(on MacOSX Yosemite)

# こういうエラーが出たとき

TableauでデータソースとしてGoogle AnalyticsやBigQueryを選択すると、証明書エラー ("The root CA certificate is not trusted for this purpose") が出ることがあります。(Tableau Desktop 9.0 / MacOS 10.10.3で確認)

![Tableau.png](https://qiita-image-store.s3.amazonaws.com/0/50490/e56bdce6-0acc-c1dd-c9ac-c4af530f99d4.png)


# 証明書をインポートして対応する

Yosemite 10.10.3のアップグレードで一部のルート証明書が削除されたことが原因らしく、TableauからGoogle Analytics, BigQueryにつなぐときに使われている「Equifax Secure Certificate Authority」(GeoTrustが昔発行したSSL証明書のルートCA?)の証明書も消えたようです。

そこで、GeoTrustからルート証明書をダウンロードしてインポートすれば解決するようです。

1. Tableauが起動していたら終了します。
2. https://www.geotrust.com/resources/root-certificates/ から 「Download - Equifax Secure Certificate Authority」を右クリックして保存します。<br>
![Download_Root_Certificates_-_GeoTrust.png](https://qiita-image-store.s3.amazonaws.com/0/50490/b4c9ed48-0a6b-e3f2-4d62-9675a443ff25.png)
3. ダウンロードしたpemファイルをダブルクリックして、「Always Trust」ボタンをクリックしてKeyChainにインポートします。


(参考: Tableauコミュニティでの回答 http://community.tableau.com/message/353214#353214)
XMLを書かずにGroovyからLogbackのログ出力をINFOレベル以上に限定する

以下のようなときに使う秘伝の1行。

* Groovyで、1ファイルで動くようなシンプルなスクリプトを書いている。
 * なので、いちいちxmlファイルを置きたくない。
* 何らかの理由で、CLASSPATHにLogbackが入っている。
* 何らかの理由で、どれかのライブラリがSlf4j経由でDEBUGログをたくさん出している。
* DEBUGログは不要なので、INFOレベル以上に限定したい。

```groovy
org.slf4j.LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME).setLevel(ch.qos.logback.classic.Level.INFO);
```

みんなlogback.xmlを書くので、コードから設定する例が全然なかった。