OmniAICreator/Qiita-1.07M huggingface dataset:
adbコマンドを利用したandroid制御まとめ

最近非常にadbコマンドを利用するので、覚えておきたいコマンドをメモします。
他の方と重複する内容があるかもしれませんがご容赦ください。

コマンドについては随時追加していく予定です。
私自身既に覚えてしまっているコマンドは記載していませんが、後々整理していきますm(__)m

## 接続端末を確認
```
adb devices
```

## 端末のバージョン確認
```
adb shell getprop ro.build.version.release
```

## 端末にログイン
```
adb shell
```
※ 複数端末と接続していて、端末を指定したログインを行いたい場合、-s オプションを利用します

```
adb -s <デバイスID> shell
```


## 端末ログを確認
```
adb logcat
```

## 端末解像度確認
```
adb shell wm size
```

## アプリ制御関連
###APKインストール

```
adb install <APKファイル名>
```

※ APKを更新したい場合、-r オプションを利用する

###APKアンインストール

```
adb uninstall <APKファイル名>
```


※ chromeを例にしてコマンドを説明すると
###アプリ起動
```
adb shell am start \
          -n com.android.chrome/com.google.android.apps.chrome.Main
```


##### ちょっと応用編）
※ URLを指定してchromeを起動してみる

```
adb shell am start \
          -a android.intent.action.VIEW \
          -n com.android.chrome/com.google.android.apps.chrome.Main \
          -d http://m.yahoo.co.jp/
```

【オプション説明】

```
-a <暗黙的Intent> (android.intent.action.VIEWは、ブラウザ起動）
-n <起動したいアプリケーションのパッケージ名>/.<Activity名>>
-d <起動したいURL>
```


### データ削除
```
adb shell pm clear com.android.chrome
```

### 強制終了
```
adb shell am force-stop com.android.chrome
```

### アプリのパッケージ一覧を取得する方法
```
adb shell pm list packages

```

### Activityスタックの状態をダンプして確認する方法
```
adb shell dumpsys activity activities
```

→ インストールしたアプリのアクティビティ名が知りたい場合などに利用できます

###【補足】

androidのバージョンによって利用できないコマンドやオプションがあるのに注意しましょう！
ErrbitをHerokuにデプロイ

Errbit https://github.com/errbit/errbit
エラーを管理できるらしいので導入してみる。

### Errbitのソースを取得
```bash
git clone http://github.com/errbit/errbit.git
```

### 管理画面のメールアドレスとパスワードを設定
```bash
vim Gemfile #admin_emailとadmin_passを任意の値に設定
```

### GemのインストールとHerokuにアプリケーションの作成
```bash
bundle install #Gemのインストール
heroku create #Herokuに新しいアプリケーションを作成
```


### Add-onのインストールと設定ファイルの編集
```bash
heroku addons:add mongolab:sandbox #MongoDBを0.5GBまで無料で使えるアドオン
heroku addons:add sendgrid:starter #一日200通のメールを無料で送れるアドオン
```

```bash
heroku config:add HEROKU=true
heroku config:add SECRET_TOKEN="$(bundle exec rake secret)"
heroku config:add ERRBIT_HOST=ホスト名
heroku config:add ERRBIT_EMAIL_FROM=上で設定したメールアドレス
```

### HerokuにソースをPushする
```bash
git add . -A && git commit -m 'first commit'
git push heroku master
```

### DBのシードを作成
```bash
heroku run bundle exec rake RAILS_ENV=production db:seed
heroku run bundle exec rake RAILS_ENV=production db:mongoid:create_indexes
```

### 確認
```bash
heroku open
```

### 参考
Errbit - Railsアプリの本番エラーをherokuで管理、メール通知する【無料枠】
http://morizyun.github.io/blog/errbit-heroku-rails-error-ruby/

errbit-phpを試してみる
http://qiita.com/arc279/items/fe5ab0eb4210866bbd86
PHPでオブジェクトを配列に変換

PHPのオブジェクトを配列に変換。
stackoverflowで面白い回答を見つけた。

```php
$array = json_decode(json_encode($object), true);
```
一度jsonにして、decodeするときにtrueをつければ配列になる。

## 参考
php stdClass to array
http://stackoverflow.com/questions/18576762/php-stdclass-to-array
PHP Simple HTML DOM Parserで文字化けするときの対処法

Simple HTML DOMで、外部のファイルを扱う場合、

```php
// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');
```
と書くことが多い。

でも日本語サイトの場合は、文字化けする可能性が高いので、

```php
mb_language('Japanese');

$source = file_get_contents('http://www.google.com/');
$source = mb_convert_encoding($source, 'utf8', 'auto');

$dom = str_get_html($source);
```
とやった方がいい。

## 参考
PHP Simple HTML DOM Parser
http://simplehtmldom.sourceforge.net/

Simple HTML DOM Parserのサンプル
http://tips.recatnap.info/sample_simple_html_dom_parser/
strtotime に妥当性の判断を任せてはいけない

```PHP:

<?php


function test($date) {
	$work = date('Y/m/d', strtotime($date));
	echo $date === $work ? 'OK ' : "NG ($date -> $work)" ;
	echo "";
	echo "\n";
}

$testdata = [

	  '2008/02/29' 			// うるう年の年 ウチの息子の誕生日
	, '2015/02/29' 			// うるう年じゃない年 不正な日付にならずに次の日になる

	, '2015/03/32' 			// 不正な日付の扱いを受ける
	, '2015/06/31' 			// 不正な日付にならずに次の日になる 

	, '2015/06/30 23:59' 	// 正常 
	, '2015/06/30 24:00' 	// 正常 次の日になる
	, '2015/06/30 24:59' 	// ここまでは大丈夫
	, '2015/06/30 25:00' 	// 不正な日付の扱いを受ける

];

foreach ($testdata as $date) {
	test($date);
}

// OK 
// NG (2015/02/29 -> 2015/03/01)
// NG (2015/03/32 -> 1970/01/01)
// NG (2015/06/31 -> 2015/07/01)
// NG (2015/06/30 23:59 -> 2015/06/30)
// NG (2015/06/30 24:00 -> 2015/07/01)
// NG (2015/06/30 24:59 -> 2015/07/01)
// NG (2015/06/30 25:00 -> 1970/01/01)

```

妥当性の判断は別にちゃんとやる。
整数配列の連続区間をハイフンで連結してグループ化する定番のアレ

# 問題

### 問題概要

要素に整数を取る配列に関して、以下のように処理する関数を作成せよ。

1. 連続する数字の集合を1つの区間とし、区間最小値と区間最大値をハイフンで連結して1つの文字列とする。区間最小値と区間最大値が等しい場合、その数字をそのまま文字列として扱うこととする。
2. 上記で生成した文字列をまとめて配列として返す。

### 入力例と出力例

```json:入力
[1,2,3,4,5,8,9,10,13,14,20,22]
```

```json:出力
["1-5","8-10","13-14","20","22"]
```

出力用に`json_encode`を使っても良し、単に`implode`で結合しても良し、`var_dump`や`print_r`でも良し。この処理は<ins>関数内に実装する必要はなく</ins>、詳細なフォーマットにはここでは拘らないことにする。

### 制約

- 配列のキーは0番開始の連続した整数
- 配列の値はソート済み
- 配列に重複する値は含まれない

# 回答例

### コード

```php:制約を前提とする場合
function array_group_by_range(array $array, $separator = '-')
{
    $pairs = $ranges = [];
    foreach ($array as $i => $v) {
        $pairs[$v - $i][isset($pairs[$v - $i])] = $v;
    }
    foreach ($pairs as $pair) {
        $ranges[] = implode($separator, $pair);
    }
    return $ranges;
}

echo json_encode(array_group_by_range([1,2,3,4,5,8,9,10,13,14,20,22]));

/* ["1-5","8-10","13-14","20","22"] */
```

```php:制約を前提としない場合
function array_group_by_range(array $array, $separator = '-')
{
    sort($array, SORT_NUMERIC);
    $pairs = $ranges = [];
    foreach (array_values(array_unique($array, SORT_NUMERIC)) as $i => $v) {
        $pairs[$v - $i][isset($pairs[$v - $i])] = $v;
    }
    foreach ($pairs as $pair) {
        $ranges[] = implode($separator, $pair);
    }
    return $ranges;
}

echo json_encode(array_group_by_range([5,4,8,3,2,9,'a'=>10,14,'b'=>1,20,13,22]));

/* ["1-5","8-10","13-14","20","22"] */
```

### ポイント

- 不連続な値が1つ現れるたびに `$v - $i` がその差だけ増加するため、`$v - $i` の値でグループ化すれば連続区間でグループ化したことになる。
- `isset($pairs[$v - $i])`を第2階層のキーに指定すると、属する第1階層への最初の代入のときに`0`、それ以降には`1`という値を取るようになる。これにより、**`0`番目が区間最小値**、**`1`番目が区間最大値**になる。この方法を採用すると、値が1つしか存在しない場合にも自動的には`0`番目の要素しか作成されず、区間が存在する場合のみ連結したいと考える場合にはよりシンプルなコードを実現できる。

<table>
<tr>
<th><code>$v</code></th>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>8</td>
<td>9</td>
<td>13</td>
<td>14</td>
<td>20</td>
<td>22</td>
</tr>
<tr>
<th><code>$i</code></th>
<td>0</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
<td>9</td>
<td>10</td>
</tr>
<tr>
<th><code>$v - $i</code></th>
<td colspan="5">1</td>
<td colspan="2">3</td>
<td colspan="2">6</td>
<td>11</td>
<td>12</td>
</tr>
<tr>
<th><code>$pairs[$v - $i][0]</code></th>
<td colspan="5">1</td>
<td colspan="2">8</td>
<td colspan="2">13</td>
<td>20</td>
<td>22</td>
</tr>
<th><code>$pairs[$v - $i][1]</code></th>
<td colspan="5">5</td>
<td colspan="2">9</td>
<td colspan="2">14</td>
<td>未定義</td>
<td>未定義</td>
</tr>
</table>

# 応用例

### 文字の範囲を求める

要素が必ず整数である必要はありません。文字(1バイトの文字列)にも応用することが出来ます。場合によっては正規表現の最適化などで使えるかもしれません。

```php:実装例
function string_group_by_character_range($characters, $separator = '-')
{
    $array = str_split($characters);
    sort($array, SORT_STRING);
    $pairs = $ranges = [];
    foreach (array_values(array_unique($array)) as $i => $v) {
        $ord = ord($v);
        $pairs[$ord - $i][isset($pairs[$ord - $i])] = $v;
    }
    foreach ($pairs as $pair) {
        $ranges[] = implode($separator, $pair);
    }
    return implode('', $ranges);
}

echo string_group_by_character_range("ABCabc01234def56789DEF");

/* 0-9A-Fa-f */
```
VirtualBox:Vagrant:仮想環境を構築する


# VirtualBoxとVagrantをインストール
 
```
$ brew cask install virtualbox
$ brew cask install vagrant
#vagrantバージョン確認コマンド (正常にインストールされたか確認)
$ vagrant --version
```

#Vagrantにboxの追加
Vagrantには、boxと呼ばれる仮想環境にいれるテンプレート(OS)がたくさん用意されている。box追加コマンドを利用してOS環境を追加することができる。

box追加コマンド

```
$ vagrant box add [任意のbox名] [ダウンロードURL]
```

各テンプレート(OS)ごとのboxファイルダウンロードURL一覧
http://www.vagrantbox.es/

「centos-6.4」box 追加コマンド

```
$ vagrant box add centos-6.4 https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box
```

追加済みbox 確認コマンド (正常に追加されたか確認)

```
$ vagrant box list
```

>実行結果
>centos-6.4 (virtualbox, 0)

# Vagrantの初期化
実際に、vagrantの立ち上げ(=仮想環境の立ち上げ)を行う前に、初期化を行い、
Vagrantfile と呼ばれる設定ファイルを生成します。

Vagrant 初期化コマンド

```
$ vagrant init [box名]
```

「centos-6.4」というboxを利用して、Vagrantを初期化します。

```
$ vagrant init centos-6.4
```

#Vagrantfileを設定する

localから仮想環境にアクセスできるようにするためにVagrantfileの下記の項目を設定する。
- config.vm.box
- config.vm.network
- config.vm.provider

```
$ vi  /Vagrantfile
```

以下の内容になるようにコメントアウトを外す。

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
	config.vm.box = "centos-6.4"
	config.vm.network "private_network", ip: "192.168.33.10"
    config.vm.network "forwarded_port", guest: 80, host: 80
	config.vm.network "forwarded_port", guest: 443, host: 443
	config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
		vb.gui = true
  #   # Customize the amount of memory on the VM:
		vb.memory = "1024"
	end
end
```

Vagrantfileを反映させるにはVagrantの再起動が必要

#Vagrant 実行コマンド

```
$ vagrant up     # 起動(= 仮想環境の立ち上げ)
$ vagrant halt   # シャットダウン
$ vagrant reload # 再起動
```
vagrant upして
http://192.168.33.10/ にアクセスしてみる。

# 仮想環境にログイン
仮想環境ログインコマンド

```
$ vagrant ssh
```

#plugin
##vagrant-hostsupdater
vagrant-hostsupdater を利用すると、vagrant 実行時に /etc/hosts を書き換えてくれる。

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

##vagrant-cachier
```
$ vagrant plugin install vagrant-cachier
```

#pluginを設定したVagrantfile

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
	config.vm.box = "centos-6.4"
	config.vm.network "private_network", ip: "192.168.33.10"
	#port 80 443
	config.vm.network "forwarded_port", guest: 80, host: 80
	config.vm.network "forwarded_port", guest: 443, host: 443
	### vagrant-hostsupdater:使用したいホスト名を追加
	config.hostname = "example.com"
	config.hostsupdater.aliases = ["example.com", "dummy.com","dummy-dummy-dummy.com"]
	###
	
	config.vm.provider "virtualbox" do |vb|
		vb.gui = true
		vb.memory = "1024"
	end
end
```

vagrantを起動してhttp://example.com にアクセスできることを確認する。
配列の作成・ハッシュの作成の備忘録

2015/03/13 修正しました。

```ruby
require 'rubygems'
require 'json'

print "プロダクトID？："
project = gets.chomp
print "トラッカーID？："
tracker = gets.chomp
print "タイトル？："
subject = gets.chomp
print "内容？："
desc = gets.chomp

#ハッシュ
issue = {}
issue[:project_id] = project
issue[:tracker_id] = tracker
issue[:subject] = subject
issue[:description] = desc
data = { :issue => issue }

puts data.class
puts "================================================================="
  p data
puts "================================================================="

#配列
issue = []
project_id = project
tracker_id = tracker
subject = subject
description = desc
issue <<  {"projcect_id" => project_id , "tracker_id" => tracker_id , "subject" => subject , "description" => description}

puts issue.class
puts "================================================================="
  p issue
puts "================================================================="


#おまけ JSON
puts "おまけJSON"
puts data.to_json
puts
puts issue.to_json


```

```
$ ruby hash.rb
プロダクトID？：1
トラッカーID？：4
タイトル？：hogehoge
内容？：mogemoge
Hash
=================================================================
{:issue=>{:project_id=>"1", :tracker_id=>"4", :subject=>"hogehoge", :description=>"mogemoge"}}
=================================================================
Array
=================================================================
[{"projcect_id"=>"1", "tracker_id"=>"4", "subject"=>"hogehoge", "description"=>"mogemoge"}]
=================================================================
おまけJSON
{"issue":{"project_id":"1","tracker_id":"4","subject":"hogehoge","description":"mogemoge"}}

[{"projcect_id":"1","tracker_id":"4","subject":"hogehoge","description":"mogemoge"}]
```

気をつけよう（´ω｀）‥ﾄﾎｰ
FragmentでActionBarを指定したい！

普通ハマらないと思うんですが、僕はなぜかハマってしまったので、備忘録として。

fragmentで画面作ったけど、Actionbar反映されないよ！なんでって方は、よければ参考にしてみてください。

ちなみに[これ](http://begirama.hatenablog.com/entry/2012/12/03/103255)が参考になります。

##【FragmentでActionBarを使うための3step!】
①onCreateViewの中のsetHasOptionsMenu(true)を選択


②onCreateOptionsMenuで、どのメニューを使うか指定


③onOptionsItemSelectedでメニューの処理を設定

さあ初めてみましょう。


##①onCreateViewの中のsetHasOptionsMenu(true)を選択
javaのFragmentの中に```onCreateView```というのがありますね。
そこに、```setHasOptionsMenu(true);```というのを追記します。

こんな感じです。

```
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }
```


setHasOptionsMenは、OptionMenuを設定しますよって事です。
オプションメニューとは、アクションバーの右に出てくるやつですね。
setHasOptionsMenはお守りだと思ってください。

##②onCreateOptionsMenu
次にメニューを設定してきます。大事なのは、```inflater.inflate(R.menu.menu, menu);```でinflateするわけですが、ここで設定するmenuです。resにmenuがあると思うので、そこを参照してみてください。つまり、この参照するmenuを変えれば、画面毎にoption menuの出し分けが出来るって事だと思う。（多分）


```
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu, menu);
        menu.findItem(R.id.menu_add).setVisible(true);
        menu.findItem(R.id.menu_share).setVisible(true);
    }
```


ちなみに今回設定したmenu.xmlは、例えばこんな感じ。showAsActionで表示非表示を設定します。
読み込んでないですが、多分[ここ](https://developer.android.com/guide/topics/resources/menu-resource.html)らへんを参考にすればいいかと思います。
ちなみに種類だけは書いておきます。


```android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]```


```
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android:id="@+id/menu_share"
        android:icon="@drawable/ic_share"
        android:title="Share"
        app:showAsAction="always"/>

    <item
        android:id="@+id/menu_add"
        android:icon="@drawable/ic_add_white_24dp"
        app:showAsAction="ifRoom"
        android:title="@string/add"/>
</menu>
```

##③onOptionsItemSelectedで処理を設定

最後に```onOptionsItemSelected```に処理を書いていきます。例えばこんな感じです。

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()) {

            case R.id.menu_add:
                Toast.makeText(getActivity(), R.string.add, Toast.LENGTH_SHORT).show();
                break;

            case R.id.menu_share:
                Toast.makeText(getActivity(), R.string.share, Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

とりあえず今回は、Toastでやってみました。res/values/stringsに文字は設定してくださいね。
これで、ActionBarの動作がjavaから指定できます。ActionBarも深いですね。
Multi Region & Multi AZで動作可能なCloudFormationテンプレートを書くためのAZの指定方法

# 前置き
記述方法は`JSON`と`Kumogata`のRuby DSLで表記してます。
`Kumogata`は、JSONだと複雑になりがちなCloudFormationテンプレートをRuby DSLで書けるようにした、
@winebarrel@github さんによる[codenize.tools](http://codenize.tools/)の一つです。

https://github.com/winebarrel/kumogata

Region毎に異なるAZ名を自動で解決させたい場合の記述方法になります。

# 各種記述方法

## Region指定

```json:cloudformation
"Ref": "AWS::Region"
```

```rb:kumogata
Ref "AWS::Region"
```

APIがコールされたRegionが自動的に入ります。

## 該当のRegionにおけるAZを全指定

```json:cloudformation
"Fn::GetAZs": {
  "Ref": "AWS::Region"
}
```

```rb:kumogata
Fn__GetAZs do
  Ref "AWS::Region"
end
```

## 該当のRegionにおけるAZのうち一つだけを指定

```json:cloudformation
"Fn::Select": [
  "0",
  {
    "Fn::GetAZs": {
      "Ref": "AWS::Region"
    }
  }
]
```

```rb:kumogata
Fn__Select [
  "0",
  _{
    Fn__GetAZs { Ref "AWS::Region" }
  }
]
```

上記と異なるAZを指定する時には配列のインデックスである`"0"`を`"1"`等に変えます。
そのRegionが有するAZ数を超えるインデックスを指定するとエラーになります。

# 気になる点等
- `GetAZs`が返すAZの配列の順序は保証されているのか
- RegionによってAZ数が異なるが、それも自動で解決する方法はないのか
WordpressのURLを変更したいとき（スラッグとか、、、）


実際にやったのは、wordpress 4.1 と 4.1.1になります。
他のバージョンでやっていないので、その他のバージョンの人は詳しく見てください！

環境は
AWS の amazon Linuxです。


#変更したい内容

例えば、  domain.com/aaaa/
ってのを、 aaaa.domain.com　に変更する場合。

#1)ドメインを変更する。

#2)search-and-replace-for-wordpress-databasesをダウンロードする。

以下のものをダウンロードしてきて、Wordpressのトップディレクトリに導入する。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/


```以下のを実行
$wget https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

$unzip search-and-replace-for-wordpress-databases.zip

$mv search-and-replace-for-wordpress-databases /wpのトップフォルダ/

```

#3)早速実行
http://aaaa.domain.com/Search-Replace-DB-master/

にアクセスする。


勝手にwp-configとかの値を読んで、DB情報とかが入っていることを確認する。

![search-replace-mobile-screenshot-320x1171.jpg](https://qiita-image-store.s3.amazonaws.com/0/44315/1f7bfb44-f7bd-0aac-9544-5428f2b3f545.jpeg "search-replace-mobile-screenshot-320x1171.jpg")

replaceに、以下のものを設定
 domain.com/aaaa

withに以下のを設定
aaaa.domain.com

「dry run」 をクリックして、どんだけ書き換えられるのかをチェックする。
OKだったら、liveを押して実行する。

きっと数十秒で終わるはず、、、（件数にもよるが、、、）


#その後、wpトップの .htaccessを書き換える。


```.htaccess
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

＃ここ重要です。
Search-Replace-DB-master　ディレクトリを削除する。
【jQuery】ラベルで囲まれたチェックボックスでclickイベントが2回実行される

##事象

以下のソースで、チェックボックスもしくはラベルをクリックしたときにclickイベントが発生することを期待。

しかし、ラベル部分をクリックしたとき2回clickイベントが実行されてしまう。（チェックボックスをクリックだと1回）

おそらく、ラベルをクリックで1回。それを契機に、チェックボックスがクリックと見なされ、それがバブリングしてさらに1回。こういうことだと思う。

```html:html
<label>
  <input type="checkbox">
  testtest
</label>
```

```js:jQuery
$('label').click(function(){
  console.log('test');
})
```

##対策
ググった結果、対策は2つ。

###input要素のクリックをイベント対象にする方法
ラベル部分クリックでチェックボックスクリックが走るので。

```js:jQuery
$('input').click(function(){
  console.log('test');
})
```

###チェックボックスにchangeイベントを対象にする方法
ラベル部分クリックで、チェックボックにチェックのON/OFF走るので。

```js:jQuery
$('input').change(function(){
  console.log('test');
})
```

##雑感
そもそもラベルにイベントを設定したのは、チェックボックスだけでなくラベルクリックでもイベントを拾うためだったが、チェックボックスにイベントを設定しても、ラベルクリック→チェックボックスクリックとなるので、チェックボックスにイベントを設定しても期待する動きになった。
mysql4.0.30のclientだけインストール＠RHEE6.3


・今更ながらmysqlのVer3系への接続が必要になった。
・4.1からPWハッシュが16桁→41桁となった。
・「--secure_auth=0」オプションで認証は通ったもののクエリを投げるとエラーになるので、4.0版クライアントをビルドする。
・5.6はCMakeでビルドしたが、5.5以前は従来通りのconfigureで実施

使用するソース・ファイルは下記からDLする。
http://dbstudy.info/mysql/4.0.30/mysql-4.0.30.tar.gz


## コンパイル環境を整える


```
# yum install glibc
〜中略〜
Updated:
  glibc.x86_64 0:2.12-1.149.el6_6.5

Dependency Updated:
  glibc.i686 0:2.12-1.149.el6_6.5                 glibc-common.x86_64 0:2.12-1.149.el6_6.5
  glibc-devel.x86_64 0:2.12-1.149.el6_6.5         glibc-headers.x86_64 0:2.12-1.149.el6_6.5
  nscd.x86_64 0:2.12-1.149.el6_6.5

Complete!
```

## アーカイブダウンロード

```
# cd /tmp
# wget http://dbstudy.info/mysql/4.0.30/mysql-4.0.30.tar.gz
```

## アーカイブファイル解凍

```
# tar zxvf mysql-4.0.30.tar.gz
```



## configureする

```
# cd mysql-4.0.30

# ./configure --prefix=/sb/mysql/mysql4.0 --without-server
〜中略〜
MySQL has a Web site at http://www.mysql.com/ which carries details on the
latest release, upcoming features, and other information to make your
work or play with MySQL more productive. There you can also find
information about mailing lists for MySQL discussion.

Remember to check the platform specific part of the reference manual for
hints about installing MySQL on your platform. Also have a look at the
files in the Docs directory.

Thank you for choosing MySQL!
```

--prefixでインストール先指定
--without-serverでクライアントだけに指定
その他のオプションは下記参照
http://dev.mysql.com/doc/refman/4.1/en/source-configuration-options.html


## makeする

```
# make
〜中略〜
/bin/mv binary-configure-t binary-configure
make[3]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30/support-files' から出ます
make[2]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30/support-files' から出ます
make[1]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30' から出ます
```

## インストールする

```
# make install
〜中略〜
 /usr/bin/install -c 'mysql.server' '/sb/mysql/mysql4.0/share/mysql/mysql.server'
make[3]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30/support-files' から出ます
make[2]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30/support-files' から出ます
make[1]: ディレクトリ `/root/mysqlbuild/build4.0.30/mysql-4.0.30/support-files' から出ます
```


## おまけ〜アンインストール〜

```
# make uninstall
```


## 動作確認

```
# /sb/mysql/mysql4.0/bin/mysql --version
/sb/mysql/mysql4.0/bin/mysql  Ver 12.22 Distrib 4.0.30, for unknown-linux-gnu (x86_64)
```
緯度・経度を用いて距離を算出するSQL

以下の様なテーブルで緯度・経度を管理しているとする。

＜POSITION_TESTテーブル＞

| NAME                         | LATITUDE  | LONGITUDE   |
|:-----------------------------|----------:|------------:|
| ヒューリック神谷町ビル       | 35.663729 | 139.744047  |
| 虎ノ門ヒルズ森タワー         | 35.666863 | 139.74954   |
| 六本木ヒルズ森タワー         | 35.660477 | 139.729356  |
| 神谷町郵便局                 | 35.664442 | 139.745396  |
| 東京都庁                     | 35.689604 | 139.692305  |
| 北海道庁                     | 43.064313 | 141.347255  |
| ヒルズデール・ハイ・スクール | 37.532225 | -122.313028 |

で、緯度：35.663729、経度：139.744047 の位置から
これらの場所までの距離（km）を算出するには、以下のSQLを実行すれば良い。

```lang:SQL
select
    a.NAME
  , a.LATITUDE
  , a.LONGITUDE
  , ( 
    6371 * ACOS( 
      COS(RADIANS(35.663729)) * COS(RADIANS(a.LATITUDE)) * COS(RADIANS(a.LONGITUDE) - RADIANS(139.744047))
       + SIN(RADIANS(35.663729)) * SIN(RADIANS(a.LATITUDE))
    )
  ) as DISTANCE 
from
  position_test a; 
```

結果は以下のとおり。

＜結果＞

| NAME                         | LATITUDE  | LONGITUDE   | DISTANCE          |
|:-----------------------------|----------:|------------:|------------------:|
| ヒューリック神谷町ビル       | 35.663729 | 139.744047  | 0                 |
| 虎ノ門ヒルズ森タワー         | 35.666863 | 139.74954   | 0.606372208057947 |
| 六本木ヒルズ森タワー         | 35.660477 | 139.729356  | 1.37559981865335  |
| 神谷町郵便局                 | 35.664442 | 139.745396  | 0.145388038990192 |
| 東京都庁                     | 35.689604 | 139.692305  | 5.48826712967876  |
| 北海道庁                     | 43.064313 | 141.347255  | 834.321307653742  |
| ヒルズデール・ハイ・スクール | 37.532225 | -122.313028 | 8291.19638773377  |
Xcode6.2 にアップデートした後、GHUnitを動かす

# Xcode 6.2 にアップデート！しかし・・・

先日 Xcode 6.2 が公開され、AppStore からアップデートできるようになりました。
iOS 8.2 が使用できるようになるので、さっそくインストール・・・っとここまでは良かったんですが

## iPhoneSimulator 7.0 が使用できなくなる

過去のXcode もそうでしたが、新しい Xcode をインストールすると古いものは上書きされ、
シミュレータも古いものは使えなくなります。
まぁ別途インストールしなおせば良いかと思ったのですが・・・
Xcode 6.2 でインストールできる iPhoneSimulator  は 8.1 と 7.1 だけです。
しかも、xcodebuild -showsdks で一覧を出しても 8.2 しか出てこない

## GHUnit の問題

GHUnit を使用している場合で、Jenkins などシェルから実行する場合は、
iPhoneSimulator 7.0 でないとちゃんと動かないんです。
Xcode 6.1.1 は 7.0 もインストールできて何とかつかえていたのですが、
Xcode 6.2 からはついに使えなくなってしまいました・・・

## 解決方法

いろいろとやってみたんですが、Xcode 6.2 で iOS 7.0 sim を使用するのは難しいみたいです。
残る手段は古い Xcode を使用するしかなさそうです・・・

1. iOS Dev Center から Xcode 6.1.1 をダウンロード
2. /Applications にインストールするのではなく適当な場所において Xcode_6.1.1.app にりネーム
3. 起動させ、iPhoneSimulator 7.0 をインストール
4. xcodebuild する前に xcode-select を使用して Xcode_6.1.1.app を指定する
5. ビルド＆テストが終わったら xcode を /Applications に戻す

とりあえず、これで何とか GHUnit が使用できるようになりました。
・・・まぁもう XCTest を使えってことだとは思いますが・・・
よく利用するgitコマンド

自分用のメモ

#git init
.gitディレクトリを作成（ローカルリポジトリ）

#git remote add origin "URL"
リモートリポジトリの追加

#git remote -v
現在のリポジトリ設定の確認

#git status
ファイルの確認

#git branch
現在のブランチの確認

#git add .
ファイルの追加

#git commit -m "comment"
コミット

#git push <remote_rep> 送信するbranch:送信先branch
##git push origin master
#git pull <remote_rep>

#git checkout rep
ブランチ切り替え

#git branch
現在のブランチ確認
外部キーと rails の add_foreign_key の意味

**外部キー(foreign key)** という用語は、下の二つの意味で用いられるので混乱しやすい。

1. あるテーブルが、他のテーブルを参照している時、参照元のカラム（またはその組）のこと。
2. 上のカラムが持つべき制約のこと。**外部キー制約**　とも言う。レコードの作成/更新/削除がなされたとき「参照先のレコードが見つからない」ようなレコード（＝迷子のレコード）を作らないようにする制約。


SQL では、`CREATE` 文もしくは`ALTER TABLE`文の中で、 `FOREIGN KEY` 句を使って外部キー制約を与えることができる。細かい指定がない場合、レコードの作成に対する制約だけがかかる。

Rails では migration のファイルに `add_foreign_key` メソッドを使って外部キー制約を与えることができる。オプションを与えない場合は、やはりレコードの作成に対する制約だけがかかる。

参考 
http://b.pyar.bz/blog/2014/10/21/foreigner/
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key
http://www.postgresql.jp/document/9.3/html/ddl-constraints.html#DDL-CONSTRAINTS-FK
http://www.postgresql.jp/document/9.3/html/sql-createtable.html#SQL-CREATETABLE-EXCLUDE
PHPでイミュータブルなオブジェクトを作る

```php
trait Immutable
{
    public function __construct(array $properties)
    {
        parent::__construct();
        foreach ($properties as $propertyName => $propertyValue) {
            $this->$propertyName = $propertyValue;
        }
    }

    public function __get($propertyName)
    {
        return $this->$propertyName;
    }

    public function __set($propertyName, $propertyValue)
    {
        throw new \ErrorException(get_class($this) . ' is immutable object');
    }
}
```

```php
class Diamond extends Jewel
{
    use Immutable;
    private $carat;
    private $price;
}
```

```php
class JewelBreaker()
{
    public static function break(Jewel $jewel)
    {
        $jewel->carat = 0.1;
        $jewel->price = 10;
        return $jewel;
    }
}
```

```php
$diamond = new Diamond(['carat' => 1, 'price' => 2600000]);
echo $diamond->carat;

try {
    JewelBreaker::break($diamond);
} catch (\Exception $e) {
    echo 'Diamond is unbreakable';
}
echo $diamond->carat;

```

みたいな感じ？今、手元にtraitが動く環境が無いから動作確認はしてない。
lombok 1.16.2 で javax.annotaionが存在しないエラー

# 内容

ほぼstackoverflowの内容のメモ

```shell
$ ./gradlew assembleDebug
...
:app:compileDebugJava
/Users/mattak/project/MyApplication/app/src/main/java/me/mattak/myapplication/MainActivity.java:13: エラー: パッケージjavax.annotationは存在しません
    @Getter(AccessLevel.PUBLIC)
    ^
/Users/mattak/project/MyApplication/app/src/main/java/me/mattak/myapplication/MainActivity.java:13: エラー: パッケージjavax.annotationは存在しません
    @Getter(AccessLevel.PUBLIC)
    ^
エラー1個
:app:compileDebugJava FAILED
```

上のようなエラーがでてしまう。

# 原因

Lombokは@javax.annotation.Generatedをすべてのノードに対して、出来る限りつけようとする。
よってAndroidでは、javax.annotation 以下のパッケージは存在しないのでエラーが出る。

# 対処

build.gradleと同じディレクトリにlombok.configファイルを作成する。

```:lombok.config
lombok.addGeneratedAnnotation = false
```

# 参考

- [Error: package javax.annotation does not exist after upgrade to lombok 1.16.2](http://stackoverflow.com/questions/28465603/error-package-javax-annotation-does-not-exist-after-upgrade-to-lombok-1-16-2)
- [Configuration system](http://projectlombok.org/features/configuration.html)
mbedのSeeeduino ArchとGroveのLEDを使ってLチカする

Seeeduino Archと一緒に購入した[Grove Blue LED](http://www.seeedstudio.com/depot/Grove-Blue-LED-p-1139.html)を使ってLチカしてみます。[Grove Starter Kit for Arduino](http://www.seeedstudio.com/depot/Grove-Starter-Kit-for-Arduino-p-1855.html)や[GrovePi+ Starter Kit for Raspberry Pi](http://www.seeedstudio.com/depot/GrovePi-Starter-Kit-for-Raspberry-Pi-p-2240.html)と違い、[Wiki](http://www.seeedstudio.com/wiki/Grove_-_LED)にmbedのサンプルコードがないのでちょっと困りました。


## Grove Blue LED

[GROVE - 青 LED (5mm)](https://www.switch-science.com/catalog/1251/)をスイッチサイエンスから購入しました。4ピンケーブルは付属してました。別途購入してしまいましたが。

![grobe-blue-led.jpg](https://qiita-image-store.s3.amazonaws.com/0/43745/d0e2f62a-41cc-3437-73d5-a00ade6119c4.jpeg)



## ピンアウト図

[Arch　V1.1](http://developer.mbed.org/users/seeed/notebook/Arch_V1_1/)のピンアウト図を見るとGroveのポートは3つあります。


![arch_v1.1_pinout.png](https://qiita-image-store.s3.amazonaws.com/0/43745/e0ecc585-d7c7-eee0-48d9-7bcc97764f8c.png)

マイコンボードによってピン番号が異なり、Arduinoの`digital port 2`やRaspberry Piの`D4`といった表記になっていません。Seeeduino Archの場合は以下のピン番号を使うとLチカするようです。

* UARTポート: `P1_14`
* I2Cポート: `P0_04`

## mbed Compiler

オンラインの[mbed Compiler](https://developer.mbed.org)で[前回](http://qiita.com/masato/items/de4be34b270787e815f5)コンパイルした`mbed_blinky`プロジェクトと同様に`Blinky LED Hello World`テンプレートを使います。ピン番号を`LED1`から`P1_14`に変更しただけです。

### main.cpp

```cpp:main.cpp
#include "mbed.h"

DigitalOut myled(P1_14);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}
```

### ファームウェアの書き込み

OSXにUSBケーブルで接続して、Seeeduino Archのリセットボタンを押します。D0が青色に点灯し、OSXのデスクトップに`CRP DISABLD`ボリュームがマウントされたことを確認します。

![crp-disabled.png](https://qiita-image-store.s3.amazonaws.com/0/43745/7ccba9e8-3505-a992-9adb-14af0f8482af.png)


mbed Compilerからコンパイルを実行するとバイナリファイルがダウンロードできます。ddコマンドを使ってSeeeduino Archに書き込みます。

``` bash
$ dd if=~/Downloads/grove_led_LPC11U24.bin of=/Volumes/CRP\ DISABLD/firmware.bin conv=notrunc
20+1 records in
20+1 records out
10308 bytes transferred in 0.000077 secs (133854135 bytes/sec)
```

Seeeduino Archのリセットボタンを押すと「ディスクの不正な取り出し」の警告がでますがLチカが始まります。

![alerts.png](https://qiita-image-store.s3.amazonaws.com/0/43745/14a5a381-8550-fccd-4d51-bc2a112e2d3c.png)
csvや標準入力をsqlで取得できるqコマンド


csvファイルを扱うときにいつもなんかコマンドがあったはず！？ってググることから始めてしまうのでメモ。

### ドキュメント
http://harelba.github.io/q/index.html

### インストール条件

Just Python 2.5 and up or Python 2.4 with sqlite3 module installed. Python 3.x is not supported yet.

http://harelba.github.io/q/requirements.html

### インストール

macだとbrewでできるらしい

```
brew install q
```

http://harelba.github.io/q/install.html


### 使い方

元のcsvファイル

```aaa.csv
a_id,b_id,a_name,a_memo
1,1,aa1,a_memo1
2,2,aa2,a_memo2
3,3,aa3,a_memo3
4,4,aa4,a_memo4
5,5,aa5,a_memo5
6,6,aa6,a_memo6
7,7,aa7,a_memo7
8,8,aa8,a_memo8
9,9,aa9,a_memo9
10,10,aa10,a_memo10

```

#### 絞込（select）

```bash
~/tmp  ᐅ q -H -O -d ',' "select * from aaa.csv where a_id in (2,4,6,8,10);"
a_id,b_id,a_name,a_memo
2,2,aa2,a_memo2
4,4,aa4,a_memo4
6,6,aa6,a_memo6
8,8,aa8,a_memo8
```

sumとかも使える。

```bash
~/tmp  ᐅ q -H -O -d ',' "select sum(b_id) from aaa.csv ;"
sum(b_id)
55
```

#### 結合（join）

もう一つcsvファイルを用意

```bbb.csv
b_id,b_name,b_memo
1,bb1,b_memo1
2,bb2,b_memo2
3,bb3,b_memo3
4,bb4,b_memo4
5,bb5,b_memo5
6,bb6,b_memo6
7,bb7,b_memo7
8,bb8,b_memo8
9,bb9,b_memo9
10,bb10,b_memo10
```

```bash
~/tmp  ᐅ q -H -O -d ',' "select a.*,b.b_name,b.b_memo from aaa.csv as a left join bbb.csv as b on a.b_id=b.b_id"
a_id,b_id,a_name,a_memo,b_name,b_memo
1,1,aa1,a_memo1,bb1,b_memo1
2,2,aa2,a_memo2,bb2,b_memo2
3,3,aa3,a_memo3,bb3,b_memo3
4,4,aa4,a_memo4,bb4,b_memo4
5,5,aa5,a_memo5,bb5,b_memo5
6,6,aa6,a_memo6,bb6,b_memo6
7,7,aa7,a_memo7,bb7,b_memo7
8,8,aa8,a_memo8,bb8,b_memo8
9,9,aa9,a_memo9,bb9,b_memo9
10,10,aa10,a_memo10,bb10,b_memo10
```

#### 標準入力から

vimとかと同じで```-```で標準入力が取れる。

```bash
~/tmp  ᐅ cat aaa.csv|q -H -O -d ',' "select * from - where a_id=1"
a_id,b_id,a_name,a_memo
1,1,aa1,a_memo1
```

#### 文字コード変換
csvとかだとsjisで作成されてることが多いのでかなり便利

以下はsjisファイルをutf-8に変換してる。

```bash
q -d ',' -e SJIS -E UTF-8 "select c3 from sjis_file.csv limit 10"
```

### 参考サイト

http://serima.co/blog/?p=429

ぶっちゃけ参考サイトを見れば十分である。
ListFragmentのTopに画像やxmlなどの追加方法

ListFragmentのTopにxmlを参照して画像を入れる方法。
以前、imageだけTopに画像を追加してみた事がありましたが、それだと画像のサイズなどが上手く調整出来なかったので、xmlで参照する方法にしてみました。

該当するjavaファイルの```public void onViewCreated```の部分に```addHeaderView```をして行く。
以下こんな感じ。

先ずは挿入するheaderのxmlから。xmlファイルを別に作成します。

【top_listview_header.xml】

```
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/header_layout_root"
    android:background="#ff000000"
    android:orientation="vertical">
        <ImageView
            android:id="@+id/sample_image"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_launcher"
            android:scaleType="centerCrop">
        </ImageView>
</LinearLayout>
```


次に、javaに以下を追記していきます。

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        Super. onViewCreated (view, savedInstanceState);
        ListView lv = getListView();
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        View header = inflater.inflate(R.layout.top_listview_header, findViewById(R.id.header_layout_root));
        lv.addHeaderView(header, null, false);
    }


inflaterを使って、他のxmlファイルを動的に挿入する。という事ですね。addHeaderViewでheaderを追加してみます。

参考にしたのは[こちら](https://stackoverflow.com/questions/13507821/how-to-set-banner-at-top-of-list-view-dynamically)
RDSでロックなしのALTER TABLE(pt-online-schema-change使用)


データ件数が大量に(レコード数100万以上とか)ある場合、ALTER TABLE時にテーブルの書き込みロックが無視できないレベル(時間)で発生します。

# テーブルの書き込みロックについて
MySQL5.5以前: ALTER TABLE時に発生
MySQL5.6以降: ALTER TABLEでカラムのデータ型変更、全文検索用インデックスの追加、プライマリキーの削除、文字コードの変換/指定 を行った時に発生
参考: http://takatoshiono.hatenablog.com/entry/2015/03/11/013316

pt-online-schema-changeを使用することで、テーブルロックなしでのALTER TABLEができます。

# pt-online-schema-changeのインストール方法(Mac homebrew)
$ brew install percona-toolkit

※pt-online-schema-changeはpercona-toolkitに含まれるコマンドです

# RDSでの実行方法

1. パラメータグループ変更
RDSのパラメータグループにlog_bin_trust_function_creators=1 を追加(既に設定されている場合は不要)
※このパラメータはApply TypeがDynamicなので、設定変更後のRDSの再起動は不要です。

2. コマンド実行(以下、コマンド例)
$ pt-online-schema-change --alter='CHANGE COLUMN fooColumn fooColumn BIGINT NOT NULL DEFAULT 0' h=xxxxx.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com,P=3306,D=foodb,t=footable,u=root,p=************ --recursion-method processlist --dry-run

※RDSの場合、--recursion-method processlistは必須らしい
問題なければ--dry-runを--executeに変更して実行

参考: http://blog.livedoor.jp/sasata299/tag/pt-online-schema-change

## ローカルから実行したいが直接RDSに接続できない場合

RDSがローカル環境から接続できない場合は踏み台サーバを経由してMySQLをトンネリングする。

$ ssh -f -N -L 13306:xxxxx.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 [踏み台サーバのログインユーザ名]@[踏み台サーバのIPアドレス]
$ pt-online-schema-change --alter='CHANGE COLUMN fooColumn fooColumn BIGINT NOT NULL DEFAULT 0' h=127.0.0.1,P=13306,D=foodb,t=footable,u=root,p=************ --recursion-method processlist --dry-run

※事前にssh-addで証明書が使える状態にして踏み台サーバにSSHアクセスできるようにしておくこと

# 素のALTER TABLEとの比較

条件

|項目|値|
|:-----------|------------:|
|MySQL version|5.6.21|
|Instance Class|db.m3.2xlarge|
|Storage Type|General Purpose(SSD)|
|IOPS|disabled|
|Storage|200GB|
|レコード数|600万|
|カラム数|20|
|バースト|あり|

結果

|項目|素のALTER TABLE|pt-online-schema-change|
|:-----------|------------:|------------:|
|実行時間|450秒|323秒|
|Write IOPS最大値|3000|2500|
|Queue Depth|150|15|
|Write Latency|200〜400ms|8ms|
|Read Latency|100ms|10ms|

pt-online-schema-changeを使用したほうが負荷は低くなるので、MySQL5.6でテーブルロックしないALTER TABLEを実行する場面でも有効だと思われます。
MacにAndroid開発環境を構築してみた

MacにAndroid開発環境を構築する際、ところどころはまったのでメモ。

## 環境
Mac OS X yosemite(10.10.2)
Eclipse(4.4.2)

## Javaインストール
1. http://www.oracle.com/technetwork/java/javase/downloads/index.html からDL。（JDK 7の最新版を使用した）
2. DLしたdmgファイルを叩いてインストール

## Eclipseインストール
1. https://www.eclipse.org/downloads/ からDL。（Eclipse IDE for Java EE Developersを使用）
2. DLしたファイルを解凍し、「Application」に移動（以降、Applicationフォルダの下にeclipseがある前提で記載）

## Eclipseの日本語化
1. http://mergedoc.sourceforge.jp/index.html#/pleiades.html から、最新版をDL。（「Pleiades All in One」ではなく、「Pleiades プラグイン」のほうをDLする）
2. DLしたファイルを解凍
3. 以下のコマンドで、Eclipseを上書きする
> $ mv pleiades/features/* /Applications/eclipse/features
> $ mv pleiades/plugins/* /Applications/eclipse/plugins

4. Application/eclipse/eclipse.app を右クリックして、「パッケージの内容を表示」する。
5. 「Contents/MacOS/eclipse.ini」ファイルを開く(Eclipse4.5の場合、「Contents/Eclipse/eclipse.ini」)
6. 末尾に以下を追記する
> -javaagent:/Applications/eclipse/plugins/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
>
> ※もし上記で動かなかった場合、以下も追記する
> -Xverify:none

7. Eclipseが起動するか確認する。
 
## AndroidSDKのインストール
1. Eclipseを起動し、「ヘルプ - 新規ソフトウエアのインストール」を選択する
2. 「作業対象」に以下を入力
> https://dl-ssl.google.com/android/eclipse/

3. 表示された開発ツールから、必要なものをインストールする。
4. Eclipse再起動

＊ プロキシに阻まれる場合 ＊
1. 「Eclipse - 環境設定 - 一般 - ネットワーク接続」からプロキシを設定する
2. 「SOCKS」はチェックを外したほうが無難。
 
## Androidエミュレータのインストール
1. Eclipseのメニューから「AndroidSDKマネージャ」を起動する
2. 最新のSDKと、必要なSDKのバージョンにチェックを入れる。
3. Extrasの中にある必要な物にチェックを入れる。（特に「HAXM installer」は入れたほうが無難。エミュレータ起動時にエラーになる場合がある）
4. 「install packages」を押下して、インストール 

＊ プロキシに阻まれる場合 ＊
1. 「Android SDKManager - Setting」でプロキシの指定可能
2. 「Others」の項目は環境に合わせてチェック。（検索すると「Forcs https://... 」のチェックは入れたほうがいい、という記事がヒットしますが、私はチェックを入れたほうがインストールできませんでした）

## エミュレータの実行
1. Eclipseのメニューから「Android 仮想デバイスマネージャ」を起動する
2. 使用するデバイスの種類などを選んで、「OK」押下。
3. 作成したデバイスを選んで、開始する。
mysqldumpでテーブル定義をダンプする

`-d`または`--no-data`オプションでテーブル定義だけ出力できる

```bash
mysqldump -d <database> <table>
```

ついでにAUTO_INCREMENTの情報を消す（自分はよくこれを使います）

```bash
mysqldump -d <database> <table> | sed -e 's/AUTO_INCREMENT=[0-9]*//'
```

他にもオプションいろいろあるみたいだけど調べてない。
RANGEパーティションはいらないとか、いろいろ要望ありそうだけど、そういうの簡単にできないかな...
WP-APIのフックをまとめてみた

WP-APIでフックできるアクションとフィルターのまとめが見当たらなかったので、自分用にメモ。  
どういう動きをするかなどの使い方については分かり次第追記します。

#探し方
GitHubのリポジトリを「do_action」と「apply_filters」でそれぞれ検索しただけです。

- [do_actionの検索結果](https://github.com/WP-API/WP-API/search?utf8=%E2%9C%93&q=do_action)
- [apply_filtersの検索結果](https://github.com/WP-API/WP-API/search?utf8=%E2%9C%93&q=apply_filters&type=Code)

#アクションフック
##wp_json_server_before_serve
tests/class-wp-test-json-controller-testcase.php
##json_query_navigation_headers
lib/infrastructure/class-wp-json-response.php 
##json_insert_user
なぜか2回セットされている。
lib/endpoints/class-wp-json-users-controller.php 
##wp_json_server_before_serve
- tests/test-json-server.php 
- plugin.php

デフォルトで「create_initial_json_routes」という関数をコールしている。
「Register default JSON API routes」とコメントが書かれている＋各データタイプのオブジェクトを作成している様子なのでここで独自のJSON-APIを作成できそうな雰囲気。

##json_insert_post
3/12時点ではコメントアウトされていて利用不可。
>@TODO: Enable json_insert_post() action after
244			 * Media Controller has been migrated to new style.

ということらしい。
lib/endpoints/class-wp-json-posts-controller.php 

#フィルターフック
##json_post_dispatch
これも2回コールされている。
tests/test-json-server.php 
##json_authentication_errors
lib/infrastructure/class-wp-json-server.php 
##json_enabled
lib/infrastructure/class-wp-json-server.php 
##json_prepare_taxonomy
lib/endpoints/class-wp-json-taxonomies-controller.php 
##json_post_query
lib/endpoints/class-wp-json-posts-controller.php 
##query_vars
lib/endpoints/class-wp-json-posts-controller.php 

WordPress本体のフックっぽい。
##json_pre_insert_comment
lib/endpoints/class-wp-json-comments-controller.php 
##comment_text
lib/endpoints/class-wp-json-comments-controller.php 

WordPress本体のフックっぽい。
##json_user_query
lib/endpoints/class-wp-json-users-controller.php 
##json_prepare_user
lib/endpoints/class-wp-json-users-controller.php 
##wp_json_server_class
plugin.php 
##json_url_prefix
plugin.php 
##json_prepare_meta
lib/endpoints/class-wp-json-meta.php 
##json_prepare_meta_value
lib/endpoints/class-wp-json-meta.php 
##json_prepare_term
lib/endpoints/class-wp-json-terms-controller.php 
##json_request_parameter_order
lib/infrastructure/class-wp-json-request.php 

#ひとりごと
なんか他にもまだまだありそう。
TheanoをpyenvでインストールしたPython3.4.2で動かそうとしたら「PICオプションつけて再コンパイルしろよ」と怒られた時にやった対処メモ

##起こったこと
特にオプションなど指定せず、何も考えないでPython3.4.2をpyenvでインストールした後、Theanoを入れて動かそうとしたら、シェアードオブジェクト作りたいのに使えないコードがあるよ、PICオプション付けて再コンパイルしてねと言われた。特にTheanoの問題ではなく、共有ライブラリ関連で起こりうる問題。

**※エラーメッセージをコピり忘れてしまった。すんません。。**

ということで、対処時のメモ。

##対処
他にも対処法があるのかもしれないが、知ってる範囲と調べた範囲で、エイやとPythonを入れなおした方がよいかという結論にいたり、以下を実行した。

```shell-session:実行例
$ pyenv uninstall 3.4.2
$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.4.2
$ pyenv local 3.4.2
$ pip install numpy
$ pip install scipy
$ pip install Theano
```

要は単純に一度3.4.2をアンインストールしてから、PYTHON_CONFIGURE_OPTSオプションでシェアードオブジェクトを利用するオプションを付けて再度インストール後に諸々も再インストールしただけ。

普段ちゃんと意識してインストールしている人はpyenvでインストールするときでもコンパイル時のオプションを考えてるのかもしれないけど、あんまり考えていなかったので陥った罠だった。気を付けます。

##確認
対話モードでも何でもよいので、怒られたライブラリ、モジュール（今回はTheano）をインポートしてみて、何も怒られなかったら大丈夫なはず。
@Execute(input = "index")  と@Execute(input = "index", redirect = true)　の違いについて

結論から言うと

@Execute(input = "index")  と　@Execute(input = "index", redirect = true)　において処理にどのような違いがあるのでしょうか？
<br>
私は今JavaとSeasar2(SAStrats/S2JDBC)を使ってWebアプリケーションを作っています。

そこでこのアノテーションの要素に疑問を持ちました。
実際の処理にも違いはなく、Chromeデベロッパーツールで速さの違いも見ましたが、ほぼ変わりませんでした。

なのでこの両者のコーディングにおいて処理の内容に違いはないと思っています。

ただ私が参考にしているサンプルでは後者の書き方になっています。

redirect=trueになっていると何か前者と処理の内容が変わってくるのでしょうか？

わかる方がいればお願いします。


もちろんリダイレクトについても調べて、指定したページから自動的に他のページに遷移すること。という認識を持っています。

是非おねがいします。
UITextFieldクリア時のキーボード再表示を抑制

# はじめに
UITextFieldのクリアボタンをタップした際に、キーボードが表示されてしまう挙動。

む！クリアしたいだけなのに！

なのでそれを抑制します。

# textFieldShouldClearで制御

```objc
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    textField.text = @"";
    [textField resignFirstResponder];
    
    return NO;
}
```

UITextFieldのdelegateにselfを設定しておくのを忘れないようにしましょう。

# おわりに
参考になりましたら幸いです。
jQueryページ遷移時にアラートを表示する方法

form入力中に別のリンクを押してしまうと
「入力中のデータが保存されませんがよろしいですか？」
のようなメッセージを表示してくれるサイトがよくある。とても親切ですね。

以下のサイトでその方法を紹介していました。

18th Tech Note さん
　http://www.18th-technote.com/beforeunload-change
FragmentでgetLayoutInflater();がエラーな時

LayoutInflater inflater = getLayoutInflater();
とFragentで書いてみたけど、エラーになってしまった時

だいたいこの4つに書き直す事で対処出来そう。
[stackoverfLow](https://stackoverflow.com/questions/26368178/getlayoutinflater-in-fragment)を参考にしました・

①getActivity().getLayoutInflater();

②layoutInflater.from(getActivity());

③View.inflate();

④LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RailsのSimpleCovでカバレッジレポートが出力されない場合の対処法



## 環境
Ruby 2.0
Rails 4.0
simplecov 0.9.2
またテストはRSpecを使用


## 状況

Gemfileとspec_helper.rbは以下のように設定

```ruby:Gemfile
group :test do
  # 以下追記
  gem 'simplecov', require: false
end
```

```ruby:spec_helper.rb
# 以下追記
require 'simplecov'
SimpleCov.start 'rails'
```

RSpecの実行

```bash
$ bundle exec spring rspec spec
```

カバレッジのレポートは`coverage/index.html`を開くと確認可能ですが、
見てみると全ての項目が100%に、つまりレポートが1つも出力されていませんでした。


## 対処法
### 最初にSimpleCov.startを実行する
`SimpleCov.start`の記述位置が問題となっている場合があります。
これは`spec_helper.rb`内の先頭に記述される必要があります。

**ダメな例**

```ruby:spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'helpers'
# ...略
require 'simplecov'

# 適当な位置で実行
SimpleCov.start 'rails'

RSpec.configure do |config|
 # ...略
end
```

**良い例**

```ruby:spec_helper.rb
# 先頭に配置
require 'simplecov'
SimpleCov.start 'rails'

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'helpers'
# ...略

RSpec.configure do |config|
 # ...略
end
```

より具体的には、`require File.expand_path("../../config/environment", __FILE__)`より先に`SimleCov.start`を持ってくる必要があるらしいです。


### springを使用しない
rspec実行時に`spring`を使っていると正常に動作しません。
詳細は不明ですがspringとsimplecovは相性が良くないらしので、実行する際は

```bash
$ bundle exec rspec spec
```
で実行します。


## まとめ
simplecovのissues見ると「レポートが出力されない」という事例がいくつかあるみたいなので、
今回紹介した方法でなおらなければissuesを漁ってみるといいかもしれません。

## 参考
[Always 100% test coverage with Ruby 2.0p353 and Rails 4.1beta · Issue #271 · colszowka/simplecov](https://github.com/colszowka/simplecov/issues/271)
POSTされてきたHTTP Requestをひたすらに標準出力するHTTPサーバをRubyで書いた


## 使いどころ
あるデータを定期的にHTTPサーバにPOSTするプログラムを作ってました。

当初、評価用HTTPサーバスタブは適当にApache等が動いている仮想マシンを使っていました。
ですがPOSTされてるリクエストの中身をリアルタイムに確認したかったので、そういうものを作りました。

## 使い方

rubyコマンドで実行します。

```
$ ruby httpserver.rb
```

これで試しにブラウザやcurlコマンド等で `http://localhost:8080` にアクセスし、 `httpserver.rb` を実行したコンソール上に何やら出れば成功です。

![hgw.gif](https://qiita-image-store.s3.amazonaws.com/0/44663/8e554e26-1792-5f27-ce94-fb0c437b14d9.gif "hgw.gif")

終了するには `Ctrl-c` で。

## ソース

```ruby:httpserver.rb
require 'socket'

# 初期設定
port = 8080
server = TCPServer.open(port)
length = 0

# ソケット通信
loop do
  socket = server.accept

  # HTTPメッセージを1行ずつ読み出す
  while buffer = socket.gets
    puts buffer

    # Content-Lengthの値をlengthに格納
    if buffer.include? "Content-Length"
      length = buffer.split[1].to_i
    end

    # 改行のみ→次の行以降はBody
    if buffer == "\r\n"
      # BodyからContent-Length文字読み出す
      length.times do
        putc socket.getc
      end
      break
    end

  end
  
  puts "\n\n"

  # 無条件に200OKを返しているので必要あれば変更する
  socket.puts "HTTP/1.1 200 OK"
  socket.close
end

server.close
```
MITライセンスの自分用テンプレを気軽に作れるWebサービス

# 昼休み

今昼休み中で、適当にgithub上をウロウロしていたら見つけた。

http://mit-license.org/
https://github.com/remy/mit-license

curlでjsonをこのサービスにぶん投げると自分用のMIT License用テンプレートページを作成してくれるようだ

# 試してみる

[プロダクトのREADME.md](https://github.com/remy/mit-license/blob/master/README.md)に書かれてる通りに
jsonを自分用のサブドメインを指定してサービスに対して投げつけてみた。

```
curl -d'{ "copyright": "Keiji Matsuzaki" }' http://futoase.mit-license.org
>>> MIT license page created: http://futoase.mit-license.org
```

http://futoase.mit-license.org にアクセスしてみる。

![Screen Shot 2015-03-12 at 12.17.39.png](https://qiita-image-store.s3.amazonaws.com/0/3985/3cbd8f10-c346-442c-666a-8d91f4fa74c8.png)

作成されている。便利だ。

# 色々な機能がある

[複数のテーマがある](https://github.com/remy/mit-license/blob/master/README.md#themes)ので指定することもできる。

# 情報をアップデートするためには

[user名.jsonを作ってPRにすること](https://github.com/remy/mit-license/pulls)で対応するとのことだ(のであとでテーマ変えたりしよっと)

```
Equally if you need to update the user file to include more details that you didn't initially include (extra fields in the next section) you will need to send a pull request on that user.json file via GitHub.
```
モーダルで開いたUIViewControllerを全て閉じる話


モーダルでViewControllerいっぱい開いちゃうときありますよね。それを一気に閉じる方法の紹介です。最強です。全部一気に閉じちゃいます。

##とにかくすべて閉じる方法
```objectivec:Objective-C　
[[UIApplication sharedApplication].keyWindow.rootViewController 
dismissViewControllerAnimated:YES completion:nil];
```

または，

```objectivec:Objective-C
[[UIApplication sharedApplication].delegate.window.rootViewController　
dismissViewControllerAnimated:YES completion:nil];
```

##あるところまで閉じる方法
```objectivec:Objective-C
[self.presentingViewController.presentingViewController.../*到達するまでひたすら書く*/ 
dismissViewControllerAnimated:YES completion:nil];
``` 
 


##一つだけ閉じる方法
```objectivec:Objective-C
[self dismissViewControllerAnimated:YES completion:nil];
```



###使えます！！
Travis Ci上でReact.jsのプロジェクトをPhantomJSでテストした場合にFailする現象

React.jsを使用しているSinatraプロジェクトでPoltergeistを使用したテストを実施した場合に、
自環境では成功するのに Travis CI上で失敗するという事象に出会いました。

Travis上でのエラーログ

```
  Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).
       
    TypeError: 'undefined' is not a function (evaluating 'ReactElementValidator.createElement.bind(
             null,
             type
           )')
    TypeError: 'undefined' is not a function (evaluating 'ReactElementValidator.createElement.bind(
             null,
             type
           )')
...
```

phantomjsバージョンを確認した所、
Travisは`1.9.8`(2015/03/11 時点)で、自環境は`2.0.0`でした。

ここに原因があると推測し、
Travis側のphantomjsのバージョンを上げる方法はないのかと調査した所、以下のような記事を見つけました。

https://mediocre.com/forum/topics/phantomjs-2-and-travis-ci-we-beat-our-heads-against-a-wall-so-you-dont-have-to

以下の設定を追加する事で無事にテストを実施することができました。

```yaml:.travis.yml
before_install:
  - wget https://s3.amazonaws.com/travis-phantomjs/phantomjs-2.0.0-ubuntu-12.04.tar.bz2
  - tar -xjf phantomjs-2.0.0-ubuntu-12.04.tar.bz2
  - sudo rm -rf /usr/local/phantomjs/bin/phantomjs
  - sudo mv phantomjs /usr/local/phantomjs/bin/phantomjs
```
Windows版Gitで、直接接続できないリモートリポジトリにssh踏み台サーバ経由でアクセスする

すでに同内容記事多数なのですが、自分用メモとして記載します。
お目汚し失礼。

# 環境 

ネットワーク的には下記のようになっています。
リポジトリが置いてある``repo-server``には、``fumidai``からしかsshログインできません。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/59475/cc9c32d5-7a14-c9fe-f883-c81b12c9c13d.png)

- ローカルWindows PC（Windows 8.1)
- ``fumidai`` 懐かしのTurboLinux
- ``repo-server`` CentOS
- Windows版Git git version 1.9.5.msysgit.0

# 準備

## WindowsへGitをインストール

[chocolatey](https://chocolatey.org/)を使うと簡単です。
chocolateyをインストールしたら、Admin権限のあるコマンドプロンプトで``choco install git``と実行するだけです。

## 踏み台サーバへconnectをインストール

踏み台サーバは懐かしのTurboLinuxのため、ncもconnectも入っていませんでした。

[connect.c](https://bitbucket.org/gotoh/connect/wiki/Home) から``connect.c``をダウンロードします。

ダウンロードしたら踏み台サーバにコピーしてコンパイルします。
``gcc -O2 connect.c -o connect``

コンパイル成功したら適当なディレクトリにコピーします。
``cp connect ~/bin/``

## Windows環境変数を設定

Windowsの環境変数``HOME``を設定します。値は``%USERPROFILE%``にします。ここに``.ssh``ディレクトリを作成します。

![homeenv.png](https://qiita-image-store.s3.amazonaws.com/0/59475/d98e5c7a-5c52-6b43-9fdb-29707488710e.png)

# sshを設定

## ssh設定ファイルを作成

コマンドプロンプトを起動して、.sshディレクトリを作成します。
``mkdir %HOME%\.ssh``

``config``ファイルを作成します。
``notepad %HOME%\.ssh\config``

内容は次のようになります。

```text:config
Host fumidai
  User sengoku
  Hostname fumidai.local

Host repo-server
  User guest001
  Hostname repo-server.example.com
  ProxyCommand "C:\Program Files (x86)\Git\bin\ssh.exe" fumidai /home/sengoku/bin/connect %h %p 
```

最初の``Host``は``fumidai``へログインするための設定です。ユーザ名はsengoku、ホスト名はfumidai.localです。ユーザ名やホスト名は適宜変更してください。

2番目の``Host``は``repo-server``へログインするための設定です。ユーザ名はguest001、ホスト名はrepo-server.example.comです。
``fumidai``上で``/home/sengoku/bin/connect``コマンドを起動し、プロキシ動作させています。
ユーザ名やホスト名は適宜変更してください。

## sshの設定を確認

sshの設定が正しくできたか、まずは普通にsshしてみます。

コマンドプロンプトからsshを起動し``fumidai``へログインしてみます。
``"C:\Program Files (x86)\Git\bin\ssh.exe" fumidai``
引数の``fumidai``はHostに記述したものです。

うまくいったらリモートにもログインしてみます。
``"C:\Program Files (x86)\Git\bin\ssh.exe" repo-server``

うまくいかないときは、sshに``-v``オプションをつけてdebug情報を見てみてください。

# リモートリポジトリにアクセス

準備が整いましたので、リモートリポジトリからソースを取得します。

``git clone ssh://repo-server/~/repos/myproj.git``

ここではリポジトリは``~/repos/myproj.git``にあります。適宜変更してください。

お疲れ様でした。


# 参考URL

- [sshで多段接続 (ncも-Wもない人用)](http://auewe.hatenablog.com/entry/2014/03/10/043030)
- [connect を使って簡単に多段 SSH を実現する方法](http://cl.pocari.org/2006-09-04-2.html)