OmniAICreator/Qiita-1.07M huggingface dataset:
Appium を使ったテスト環境　その２

前回の表記載した要素の表です

| 要素 | 因子１ | 因子２ | 因子３ |
|:-----------|------------:|:------------:|:------------:|
| appium稼働OS | window | OSX | linux |
| テスト対象 | ネイティブアプリ | ブラウザ | ハイブリッド |
| ブラウザ |　(標準）ブラウザ |　chrome | |
| テスト動作OS | Android | IOS | | | 
| android OS | 2.x | 3.x | 4.x | 
|テスト動作環境| 実機 | エミュレータ | | |
|appium動作 | GUI版 | CUI版 |||


これを　構築したい環境の条件に展開してみます

条件１　windows環境で構築する
条件２　appiumの動作は　GUI版でおこなう
条件３　androidOS 3.xは対象から外す
条件４　動作環境は　エミュレータでおこなう

| No.| テスト対象 | ブラウザ | テスト動作OS | 構築記事 |
|:--:|------------:|:------------:|:------------:|:------------:|
| 1| ネイティブアプリ | - | 2.x | |
| 2| ネイティブアプリ | - | 4.x | その１|
| 3| ブラウザ | (標準）ブラウザ | 2.x |その２|
| 4| ブラウザ | (標準）ブラウザ | 4.x |その２|
| 5| ブラウザ | chrome | 4.x ||
| 6| ハイブリッド | (標準)ブラウザ |2.x|| 
| 7| ハイブリッド | (標準)ブラウザ |4.x| |
| 8| ハイブリッド | chrome | 4.x ||

ハイブリッドアプリについては、調査できるところまですることとする。

前回は　No.2 が動くところまで構築しました。


# ブラウザテスト
標準ブラウザの場合ポイントは　capabilities の指定設定になります

```ruby:starup2.rb
require 'selenium-webdriver'
require 'appium_lib'

opts = {caps: {deviceName: 'emulator-5554',
               platformName: :android,
               browserName: 'Browser'}}

driver = Appium::Driver.new(opts).start_driver
driver.navigate.to "http://www.google.com"
driver.find_element(:id, "lst-ib").send_keys("test")
driver.find_element(:name, "btnG").submit

driver.quit
```

この設定で、あらかじめ起動しておく　エミュレータが　2.x　でも　4.x　でも動作しました。

### 考察
さて、同じブラウザでも　4.4以降になると　chrome　がでてくるのですが
標準のブラウザがchromeベースになっているとも明示的にchromeになっているともありこの辺り理解できていません、詳しい方教えてください。


もう１点
ブラウザとしての　chrome　は　ネイティブアプリとも言えます。
つまり　ブラウザとして指定するのではなく　アプリとして chrome　を指定することもできるということです。

アプリとして動かす場合

```
deviceName: 'emulator-5554',
platformName: :android,
app  "./chrome.apk"
```

ブラウザとして動かす場合

```
deviceName: 'emulator-5554',
platformName: :android,
browserName : "Chrome"
```



ではでは
List<Object>とList<?>の違い

##はじめに

JavaのList\<Object\>とList<?>のふるまいの違いを簡単に解説する。

## 代入できる値

List<?>型の変数には、すべてのList型の値を入れることができる。\<\>の中の型はなんでもよい。
List\<Object\>型の変数には、List\<Object\>型の値のみ入れることができる：

```
List<?> list1;
List<Object> list2;

list1 = new ArrayList<Object>();
list2 = new ArrayList<Object>();

list1 = new ArrayList<Integer>();
list2 = new ArrayList<Integer>(); //コンパイルエラー
```

##add()

List<?>には、nullしかaddできない。
List\<Object\>には、Object型を継承した値ならなんでもaddできる：

```
List<?> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();

list1.add(null);
list2.add(null);

list1.add(new Object()); //コンパイルエラー
list2.add(new Object());

list1.add(new Integer(1)); //コンパイルエラー
list2.add(new Integer(1));

```

##get()

List<?>もList\<Object\>も、ともにObject型を返す：

```
List<?> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();

Object value1 = list1.get(0);
Object value2 = list2.get(0);
```

##なぜこのような違いがあるのか

List<?>型の変数には、すべてのList型を入れられるのだから、すべての型をaddできてもよさそうに思える。
しかし、すべての型をaddできることにしてしまうと、型安全性が失われてしまう：

```
List<?> list1 = new ArrayList<Integer>();
list1.add(new String()); //Integer型のListにStringをaddできてしまった。
```

つまり、List<?>には、すべてのList型に対してaddできる値のみaddできるようにする必要がある。
この値はnullしかない。
submoduleとsubtree、どっちで構成する？

なんだかその辺をググるとsubtreeラブな話が多いんだけど...。

## subtreeを使う方がいい場合

subtree-mergeと呼ばれるようにマージしちゃうので修正を元のリポジトリに戻すのが面倒だが、マージした結果がリポジトリに含まれるので親リポジトリをcloneした時点で中身が入っている。

subtreeで取り込むとマージされてしまうのでsubtreeを使うのは **取り込むリポジトリに修正を戻さない場合** に限定するほうが良さそうだ。 **変更をリポジトリごとに分類するのは人力** なので。

それと取り込んだリポジトリのアップデートを追う場合、取り込んだブランチでpullしてからそれを再マージすることになる。

## submoduleを使う方がいい場合

リポジトリを取り込んでもリポジトリは分離されたままなので **取り込んだリポジトリに修正を戻す場合** はsubmoduleの方がずっと使い勝手がいい。subtree-mergeみたいに変更が混ざってしまって **人力で分離しなければならない** ということもないし。

取り込んだリポジトリのアップデートに追随するのは一度ブランチを取り込んでおけばsubmoduleの方でpullするだけでいいし、変更はsubmoduleの方で為され、その変更を送るのも普通にpush。というように本当に普通の操作でできる。subtree固有の操作は親子関係に関することだけだ。

それと、submoduleの場合の「updateしないとソースが入ってない」という「欠点」はmakefileにでもupdateする文を書いておけば解決してしまうのであんまり欠点っぽくない。

## 結論

結局のところ大抵の物事と同様に、得手不得手を把握して使い分ければいい。という身も蓋もない結論になるわけだが、個人的にはsubmoduleの方が好み。subtreeの混ざるというのが気持ち悪いので。
yhpgの「異星の電光掲示板」をSwiftで


|問題|http://nabetani.sakura.ne.jp/hena/ord15elebubo/|
|:--|:--|
|Ruby/C++/Python/C|http://qiita.com/cielavenir/items/3d147bdeebcadcb4e3d9|
|Ruby(Golf,鍋谷さんのアルゴリズム復習)|http://qiita.com/cielavenir/items/732a3140efe3db571480|
|Swift|http://qiita.com/cielavenir/items/600e264d39c402b244c1

標準入力の取り方がわかったので。Cの答案を書き換えてみた。
yhpgのSwift答案は初だと思う。

コンパイル方法は http://qiita.com/cielavenir/items/abcf982d2695b357dd5b を参考に。

採点プログラムはv1(C++)とv2(Ruby)両方使える。

```swift:tyama_hena15.swift
#!/usr/bin/env xcrun -sdk macosx10.10 swift
//http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
//http://nabetani.sakura.ne.jp/hena/ord15elebubo/
import Darwin
var v:[UInt]=[0,0] // I cannot specify the array size...
var i=0,j=0
for ;(withUnsafePointer(&v[0]){vscanf("%08x",getVaList([COpaquePointer($0)]))}>0); {
	withUnsafePointer(&v[1]){vscanf("/%08x",getVaList([COpaquePointer($0)]))}
	var a:[[Int]]=[[],[]]
	for i=0;i<2;i++ {
		for j=0;j<32;j++ {
			a[i].append( Int((v[i]>>(31-j))&1) )
		}
		a[i].append(0)
		a[i].append(0)
	}

	for i=0;i<32; {
		if a[0][i] == 0 && a[1][i] == 0 {
			i++
		} else if a[0][i] != 0 && a[1][i] != 0 { //need space; otherwise treated as "a[0][i]!"
			if a[0][i+1] != 0 {
				if a[0][i+2] != 0 {
					print("N")
					i+=3
				} else {
					print("R")
					i+=2
				}
			} else if a[1][i+1] != 0 {
				if a[1][i+2] != 0 {
					print("U")
					i+=3
				}else{
					print("L")
					i+=2
				}
			}
		} else if a[0][i] != 0 {
			if a[0][i+2] != 0 {
				print("T")
				i+=3
			} else { //if a[1][i+2] != 0
				print("Z")
				i+=3
			}
		} else {
			if a[0][i+2] != 0 {
				print("S")
				i+=3
			} else {
				print("J")
				i+=2
			}
		}
	}
	println()
	fflush(stdout)
}
```
Vagrant利用手順



# インストール

- Vagrant
- Virtual Box

環境
osx 10.9

参考
http://easyramble.com/install-vagrant-virtualbox-on-mac.html


# 初期設定


## boxの取得

```bash
$ vagrant box add <NAME> <URL>
```

http://www.vagrantbox.es/




## 初期化

```bash
$ mkdir box_name
$ cd box_name
$ vagrant init
$ vi Vagrantfile

下記の箇所を編集
config.vm.box = "centos64"
```

# 使い方

## 起動と接続

```bash
$ vagrant up
$ vagrant ssh
```



## ファイルの転送



```bash
$ vagrant ssh-config > ssh.config
$ scp -F ssh.config test.txt vagrant@default:~/
```

http://momijiame.tumblr.com/post/81676862588/vagrant-scp



## 停止

```bash
$ vagrant halt
```
Ruby | 日付フォルダ生成用 CLI ツール defoker gem に gem 情報表示機能を追加 (ver 0.0.8) #ruby #defoker

# Ruby | 日付フォルダ生成用 CLI ツール defoker gem に gem 情報表示機能を追加 (ver 0.0.8) #ruby #defoker
## 概要
日付フォルダ生成用 CLI ツール defoker gem にgem 情報表示機能を追加します。

## defoker gem って何？という方は

まずはこちらを御覧ください。  

* [Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)

## 追加機能

~~~bash
$ defoker gem_info
 ____        __       _
|  _ \  ___ / _| ___ | | _____ _ __
| | | |/ _ \ |_ / _ \| |/ / _ \ '__|
| |_| |  __/  _| (_) |   <  __/ |
|____/ \___|_|  \___/|_|\_\___|_|

[gem name]
defoker
[version]
0.0.8
[document url]
https://github.com/tbpgr/defoker
[RubyGems url]
http://rubygems.org/gems/defoker
~~~

## 参照
* [Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)
* [Defoker GitHub](https://github.com/tbpgr/defoker)
* [Defoker Rubygems](http://rubygems.org/gems/defoker)
JavaScript (node.js/chrome/firefox) で Invalid Date を判定する

**2016/09/16 取り直しました**

* node v6.6.0
* chrome 53.0.2785.116
* firefox 48.0.2

無効な時間文字列を`new Date`に渡すと`Invalid Date`という`Date`オブジェクトが返されます。

```js
var str = "2014-09-A";
var d = new Date(str); // Invalid Date
d.constructor; // [Function: Date]
if(d){
  console.log("d is truthy"); // d is truthy
}else{
  console.log("d is falsy");
}
```

おまけにこいつ自体は真値となります。

判別方法として

1. `d.toString() === "Invalid Date"`
2. `""+d === "Invalid Date"`
3. `isNaN(d)`
4. `isNaN(+d)`
5. `isNaN(d.getTime())`

などがあります(3と4はほぼ同じ)。

modelで日付が含まれており、そのvalidationを行うようなときには結構な回数が呼ばれるのでなんとかしたいところなのでそれぞれパフォーマンスを調べました

結論から言うと1が最も速く、次が5になります。

n=1000000

| 項番  |式 |node msec|chrome msec|firefox msec|
|:------:|:--|---:|---:|---:|
|1|`d.toString() === "Invalid Date"`|166|171|951|
|2|`""+d === "Invalid Date"`|424|378|1173|
|3|`isNaN(d)`|258|210|1380|
|4|`isNaN(+d)`|287|230|1406|
|5|`isNaN(d.getTime())`|15|11|1208|

* 検証コード

```js
const d = new Date("2014-09-A");
n=1000000; console.time(1); while(n--){ d.toString() === "Invalid Date"} console.timeEnd(1);
n=1000000; console.time(2); while(n--){ ""+d === "Invalid Date"} console.timeEnd(2);
n=1000000; console.time(3); while(n--){ isNaN(d) } console.timeEnd(3);
n=1000000; console.time(4); while(n--){ isNaN(+d)} console.timeEnd(4);
n=1000000; console.time(5); while(n--){ isNaN(d.getTime())} console.timeEnd(5);
```

## 追記(2014/10/09 22:27:15)

ちなみに[moment.js](http://momentjs.com)の`#isValid`は最遅でおおよそ4000msかかります。
Elixir Exception と try-rescue

# Elixir Exception と try-rescue

## 概要
Elixir の Exception と try-rescue について。

## Exception

### Exception の発生
文字列と数値を連結させてエラーを発生させてみます。

~~~
iex> "a" <> 1
** (ArgumentError) argument error
~~~

### RuntimeError の発生
引数なしの raise マクロか、文字列引数のみの raise マクロで
RuntimeError を発生させることができます。

~~~
iex> raise
** (RuntimeError)
iex> raise "hogehoge"
** (RuntimeError) hogehoge
~~~

### RuntimeError の発生
例外を引数にとる raise マクロか、
例外・文字列を引数にとるの raise マクロで
任意の Error を発生させることができます。

~~~
iex> raise ArgumentError
** (ArgumentError) argument error

iex> raise ArgumentError, "hogehoge"
** (ArgumentError) hogehoge
~~~

### try rescue による例外の補足
try / rescue によって例外を補足出来ます。

~~~
try do
  some_logic
rescue
  # Error の返却
  e in ArgumentError -> e
  e in RuntimeError -> e
end
~~~

* サンプル

乱数 1-100 を生成します。
基本は FizzBuzz のルールで返却値を決定しますが、
4の倍数なら RuntimeError
6の倍数なら ArgumentError
を返却します。
※倍数が大きい方が優先されます

30回繰り返して処理結果を確認します。

~~~
defmodule ExceptionSample do
  def random_raise do
    x = :random.uniform(100)
    strx = Integer.to_string(x)
    cond do
      rem(x, 15) == 0 ->
        "FizzBuzz" <> strx
      rem(x, 6) == 0 ->
        raise ArgumentError, strx
      rem(x, 5) == 0 ->
        "Buzz" <> strx
      rem(x, 4) == 0 ->
        raise strx
      rem(x, 3) == 0 ->
        "Fizz" <> strx
      true ->
        x
    end
  end

  def try_rescue do
    try do
      ExceptionSample.random_raise
    rescue
      e in ArgumentError -> e
      e in RuntimeError -> e
    end
  end

  def try_rescue_times(0) do
    # do nothing
  end

  def try_rescue_times(n) do
    IO.inspect ExceptionSample.try_rescue
    try_rescue_times(n - 1)
  end
end

ExceptionSample.try_rescue_times(30)
~~~

* 出力1回目

~~~
"FizzBuzz45"
73
"Buzz95"
"Fizz51"
%RuntimeError{message: "32"}
"FizzBuzz60"
%RuntimeError{message: "92"}
67
%ArgumentError{message: "48"}
"FizzBuzz60"
"FizzBuzz15"
"Fizz21"
"Buzz70"
%RuntimeError{message: "16"}
%RuntimeError{message: "56"}
22
46
43
1
"Fizz57"
%ArgumentError{message: "48"}
41
31
%ArgumentError{message: "6"}
58
"Fizz99"
34
19
"Fizz21"
%RuntimeError{message: "4"}
~~~

## 注意
try - rescue はあくまでも例外のための仕組み。
処理フローの制御には利用しないこと。
処理フローの制御に利用したい場合は、
try - throw - catch を利用します。

## 参照
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#raise/1
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#raise/2
* http://elixir-lang.org/getting_started/17.html
octpressのBuild Warningが出ないようにする

# 現象

今まで書いたブログにタグをつけて```rake preview```したら、こんなんいっぱいでてきた。

もうだめだ。

```bash
 Build Warning: Layout 'nil' requested in blog/categories/blog/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/sugoiguang-dao/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/aws/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/rails/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/devise/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/hobby/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/event/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/debusami/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/ltqu-dong/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/hackathon/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/guang-dao/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/event/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/cloudstack/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/mian-qiang-hui/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/oss/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/sugoiguang-dao/atom.xml does not exist. 
 Build Warning: Layout 'nil' requested in blog/categories/scrum/atom.xml does not exist.
 Build Warning: Layout 'nil' requested in blog/categories/ruby-rails-sonicgarden/atom.xml does not exist.
以下略
```
実際はこれの３倍くらい。

関係ないけど、漢字が中国語読みに変換されている…

# 解決法
下記ファイルの

- source/atom.xml
- source/robots.txt
- source/\_includes/custom/category_feed.xml

```layout: nil``` を ```layout: null``` にかえる。

念のため ```layout: nil``` でgrepするといいかも。

# 参考
[How to fix Octopress build warning Layout nil requested](http://www.bravo-kernel.com/2014/08/how-to-fix-octopress-build-warning-layout-nil-requested/index.html)
[妄想] Rubyに欲しい文法

表題の通りだけど、Rubyコミュニティのことをよく知らないのでここに書いてみることにします。
誰か見てくれると嬉しいな。

## 動的型チェック（型に限らないけど）

Rubyに型チェックがほしいという人はそこそこいるみたいだけど、現状のRubyと静的解析は相性がよくないので、
だったら動的に使いやすい仕組みにしたい。

```rb
def foo(t1 value1, t2 value2)
end
```

これが

```rb
def foo(value1, value2)
  raise TypeError, "#{value1} must be #{t1}" unless t1 === value1
  raise TypeError, "#{value2} must be #{t2}" unless t2 === value2
end
```

こんな風に変換されるのを期待したい。


そう展開するルールであれば、

```rb
def foo(String str, Integer num)
  # ...
end
```

という想像通りの使い方の他にも

```rb
def get_content(/^https?:/ url)
  # ...
end
```

のように正規表現を書くことができる。
`===`という演算は`case-when`で使われるのでRubyらしいと思う。

## 自動`end`ブロック

Rubyの`do-end`はとても良いのだけど、ネストが深くなりがちだと思う。
例えばファイルを読み書きするとReadとWriteで2段になるし、たいてい中で`each`するのでもう一段必要。

なので

```rb
Dir.chdir(some_path) do
  autoend src  = File.open(src_path, 'r')
  autoend dst  = File.open(dst_path, 'w')
  autoend line = src.each
  dst.print line unless /^#/ =~ line
end
```

こう書けて

```rb
Dir.chdir(some_path) do
  File.open(src_path, 'r') do |src|
    File.open(dst_path, 'w') do |dst|
      src.each |line|
        dst.print line unless /^#/ =~ line
      end
    end
  end
end
```

こんな風に変換してほしい。

具体的には `autoend`が出てきたら次の式から`end`が来るまでを一つのブロックとして最初の式に渡す。
ブロックを開くタイミングはバラバラな事も多いけど、閉じるのはたいてい最後にまとめて行うことが多いので都合がよい。
ただし適当なキーワード（ここでは`autoend`）を使うと確実に既存のコードとぶつかるので、どうにかしないといけない。

これができるとC++erのデストラクタによるRAIIが好きな人とかJavaScripterでコールバックが嫌いな人とかC#erで`await`好きな人とかScalaユーザで`for`式が好きな人が喜ぶはず。

## 最後に

Rubyでは「短いが正義」だと思う
Eclipse Dark Juno 黒背景にしたい

## はじめに

Eclipseはデフォルトで白背景となっている。
黒背景にしたかったので、その時に対応した内容をメモ。 

## 手順1

Eclipse Dark Junoなるものが有名だったので、そちらのプラグインを使用した。

http://rogerdudler.github.io/eclipse-ui-themes/

* Eclipse 4.2以上
* Eclipse New software install (http://eclipse-color-theme.github.com/update)

## 手順2

下記のzipをDownloadして、eclipseのdropinsフォルダに展開する。

https://github.com/downloads/rogerdudler/eclipse-ui-themes/com.github.eclipsecolortheme.themes_1.0.0.201207121019.zip

## 手順3

Preferences > General > Appearance and choose Dark Juno

まぁ、好みもあってDarkを選択した。


![Screenshot from 2014-10-09 21:41:00.png](https://qiita-image-store.s3.amazonaws.com/0/53259/514e645a-0447-09f7-039c-f5274a03a8fd.png)
Scalaで変数を良い感じに他の文字列と連結する


[ここ](http://docs.scala-lang.org/overviews/core/string-interpolation.html)にいろいろまとまってました。

```Scala
val hoge = "HOGE"
val fuga = "FUGA"

val string = s"hoge is '${hoge}', fuga is '${fuga}.'" //s!!
println(string)
//hoge is HOGE, fuga is FUGA.
}
```

`s`とか`f`、`raw`が使えるみたいです。
なんだか変わった書き方。
Laravelアプリ下のpublicディレクトリを分離する


## 環境
* PHP 5.4.24
* Laravel 4.2.9

## publicディレクトリを分離

laravelのディレクトリ構成は、アプリルート下にpublicディレクトリを配置しています。
レンタルサーバの公開ディレクトリに、このまま配置してしまうと、よけいなファイルやディレクトリが公開されてしまいます。

公開ディレクトリ以外にもファイルを配置できるレンタルサーバなら、非公開ディレクトリにアプリ本体を配置して、公開ディレクトリには、public以下を配置したいでしょう。

laravalでは、public/index.php内のパスを修正することで、ディレクトリを分離できます。
public/index.phpのbootstrap/autoload.phpとboostrap/start.phpのパスを修正します。

### 修正前
```php:public/index.php

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/start.php';

$app->run();

```

### 修正後

アプリ本体のパスへ修正します。パスは相対でも絶対でもよいでしょう。

```php:public/index.php

require '/home/laravel/bootstrap/autoload.php';
$app = require_once '/home/laravel/bootstrap/start.php';

$app->run();

```

## パッケージのファイルパス

利用しているパッケージによっては、パスの修正が必要となる場合もあるでしょう。

私の場合、ファイルアップロードに使っているCodeSleeve/laravel-staplerが利用するローカルファイルパスの修正が必要でした。

CodeSleeve/laravel-staplerのコンフィグレーションをpublishしているので、アプリ下のapp/config/packages/codesleeve/laravel-stapler/filesystem.phpを修正します。

```php:filesytem.php
/*-------------------------------
| Stapler File Path
---------------------------------
*/
     
// 'path' => ':app_root/public:url',
'path' => '/home/public_html/hoge:url',


```
iperf 帯域を調べたい


## Command

AWSのInstanceにおける帯域調査を行った。
その際にはiperfコマンドを使用した。

apt-get 
* iperf

## 実行例

* Server

```
iperf -s
```

* Client

```
iperf -c 192.168.**.**
```

* 結果

```
[  3] local 192.168.10.209 port 37949 connected with 192.168.10.209 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  66.8 GBytes  57.4 Gbits/sec
```

自分自身へ投げているだけの結果値。
帯域が57.4 Gbsとわかる。
Ubuntu 初期設定/環境構築


自作PCにUbuntu 14をインストールした。
初回時にインストール/構築した内容をメモしておく。

## Command

* sudo apt-get update
* sudo apt-get install 
  * git
  * g++
  * gitk
  * openssh-server (sshでloginするのに必要)
  * emacs
  * vim
  * wireshark（何となく)
  * iperf（何となく）
  * cairo-dock (mac風にして使うかも)
  
## 備考

その他にもJDK, Eclipse系の構築、などその他行う予定。

別のメモとして切り出した方が良いかもなので、
とりあえずこの辺で書き留める。
ログアウトしても処理を続けたい


## command
nohupコマンドを使う事でログアウトしても処理を続けさせる事が可能


* Client - Server(ssh)
sshで入り、そのまま処理を終日回しておきたい等で有効
* Terminalにおいて、TimeoutしてしまいPipeが切れてしまった場合等で有効


## 実行例

* & をつけてバックグラウンドで実行

```shell
nohup ./script.sh &
```

* nohup.out を出力させたくない場合 


```shell
nohup ./script.sh > /dev/null 2>&1 &
```
Sphinxインストール


## 手順
* Windows
* Mac
* Linux(Ubuntu, CentOS)

python 2.5以上必要


```python
python ez_setup.py

easy_install sphinx
```

http://sphinx-users.jp/gettingstarted/install_windows.html#install-easy-install


## Proxy対応
Name Serviceエラー等がでてインストールに失敗
下記により解決

```shell
vi /etc/enviroment
```

```shell
export http_proxy=XXXXXXX
export https_proxy=XXXXXX
```

## Version指定
1.2.2を指定したい
下記により解決

```
easy_install sphinx == 1.2.2
```
＄＄とか｜｜で条件付きコマンド実行 (linux)

## 概要

testコマンドというか直前に実行した確認コマンドの結果次第でやりたいコマンド実行したい時の書き方。たまに使おうとすると思い出すのに時間がかかるのでめも。

参考:[Linuxコマンド集 - 【 test 】 条件式の真偽を判定する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230901/)

## &&で条件が真だったら実行
ユーザが誰か?を確認の上でコマンド実行 echo "run"はまぁ好きなコマンドで。

```bash
### $USERと文字列比較して実行。
[test-user@hoge ~]$ test $USER = test-user && echo "run"
run

### 別ユーザだったら何もしない。
[root@hoge ~]# test $USER = test-user && echo "run"
[root@hoge ~]#

### testコマンドは[]でも書けるけど分かりづらいのであまり好きくない。
[test-user@hoge ~]$ [ $USER = test-user ] && echo "run"
run

### コマンド実行結果で条件。
[test-user@hoge ~]$ test `whoami` = test-user && echo "run"
run

```

あまり使わないのだけどrootでもない特権ユーザがいて、そいつが実行するようにカスタムしてるミドルウェアでうっかりrootでやるとファイル所有者とかごたごたになる問題になる場合とかでたまにいる。

手順書とかで確認コマンド実行→目視確認→やりたいコマンド実行とかで毎度定型なのはちょっと仕掛けたくなる。

ファイルあるか?とかなんかの結果が指定文字列と一致したらとか条件工夫したい場合はtestコマンドのオプションで頑張る。


## ||で条件が偽だったら実行

crondで定期的にコマンド実行して失敗したらコマンド実行したりとか。
雑にプロセス監視したい場合とかプロセス消えたらメール送ったりに使える。

```bash
$ crontab -l
* * * * * ps -C httpd > /dev/null || /bin/mail -s "test mail" hoge@hoge.com
```

httpd(お好きなものを)を毎分監視して死んでたらメール送って教えてくれる。
(死んだら毎分メール来るとかは気にしない...)

もろもろ根本的な対策ではないのは重々承知している。

以上。
Ubuntu Eclipse環境構築


## はじめに

実施した手順をメモしておく。
apt-getで環境構築した事がなかったので、こちらで構築した。

wget等で指定のversionで構築しても良かったですが。。


## 手順1 (JDK)

Ubuntu 14.04 で環境構築した。

* apt-get install default-jre 
  * java version : 1.7.0.65
  * JDK(Java SE Development Kit) : 7u65

## 手順2 (Eclipse)

* apt-get install eclipse
  * version : 3.8 (Indigo)

default で apt-getすると3.8(Indigo)が入ってしまった。
一度 apt-get autoremove eclipse して 4.4(luna) を入れ直した。
 
Eclipse install directory

* /usr/local/eclipse

Install 

* cd /usr/local
* sudo tar xvfz eclipse-cpp-luna-SR1-linux-gtk-x86_64.tar.gz

その他便利なものもinstallしておく

* Eclise Java
* Pydev


## 手順3 (Android SDK/NDK)

developer公式サイトから落としてくる。

* android-sdk_r23.0.2-linux.tgz
* android-ndk64-r10b-linux-x86_64.tar.bz2

directory
* /usr/local/android-ndk-r10b
* /usr/local/android-sdk-linux

.bashrcに下記を入れる

```bash
export PATH="/usr/local/eclipse:$PATH"
export PATH="... android-ndk-r10b ..."
export PATH="... android-sdk-linux ..."
export PATH="... android-sdk-linux/tools ..."
```

android-sdk-linux に SDK Managerが入ってなかった。
0 bytesだった。platform-toolsすらないのね。
下記の対処で解決した。

```bash
cd android-sdk-linux
tools/android update sdk
```


## 手順4 (ADT Plugin)

ADT Pluginがないと 設定画面からAndroidを選べず、Android SDK/NDK　パスを選べない事が判明。

下記のパスからnew software installを行う。

https://dl-ssl.google.com/android/eclipse

* Android DDMS
* Android 開発ツール
* Android 階層ビューワ
* Android trace view
ADBが使えない場合の対処 (file not found) 


## 原因

当環境ではUbuntu 14.04 x64である。
Eclipse/NDK/Android であるが adb でerrorになってしまった。

64bit環境と32bit環境の問題らしい。
32bit互換ライブラリをインストールする必要がある。


## 対応

下記のどちらかでうまくいくはず。

```
apt-get install ia32-libs
```


```
apt-get install lib32stdc++6 lib32z1 lib32z1-dev
```
ここ大事＞トランザクション ロールバック時のオートナンバーフィールドの挙動について

DBのトランザクションってそういうものでしょ？という認識はありつつも実際やったことがなかったので試してみました。
ここでの検証は、トランザクションをかけて、オートNO型のフィールドがどのように扱われるのか？を検証した結果です。

## 検証テーブル

今回以下のテーブルを検証につかってみました。ここで気にしているのは、id フィールドです。このフィールドは、AUTO_INCREMENTで設定されております

```sql
CREATE TABLE `test_ptable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `updated_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'UTC-DATE',
  `domain` varchar(128) DEFAULT NULL COMMENT 'ex: www.yourdomain.com',
  PRIMARY KEY (`id`,`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=8177590 DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE  COLUMNS(updated_at)
(PARTITION p20140901 VALUES LESS THAN ('2014-09-01') ENGINE = InnoDB,
 PARTITION p20141001 VALUES LESS THAN ('2014-10-01') ENGINE = InnoDB,
 PARTITION p20141101 VALUES LESS THAN ('2014-11-01') ENGINE = InnoDB) */
```

## テーブルにインサートしてみる（ロールバックの挙動）

### トランザクションをかけて、テーブルにインサートしてみます、ただしロールバックします

```sql
MariaDB [knowledge]> begin ;                                                                                                                                 
Query OK, 0 rows affected (0.00 sec)

MariaDB [knowledge]> insert into test_ptable (updated_at) values (current_timestamp) ;                                                                       
Query OK, 1 row affected (0.00 sec)
```

### ロールバック前に、状態を確認

idに8177588が割りあたっています

```
MariaDB [knowledge]> select * from test_ptable ;                                                                                                             
+---------+---------------------+--------+
| id      | updated_at          | domain |
+---------+---------------------+--------+
| 8177588 | 2014-10-09 20:17:28 | NULL   |
+---------+---------------------+--------+
1 row in set (0.00 sec)
```

### ロールバックします

```
MariaDB [knowledge]> rollback ;
Query OK, 0 rows affected (0.03 sec)

```
### ロールバック後の状態

当たり前ですが、データはないです

```
MariaDB [knowledge]> select * from test_ptable ;
Empty set (0.00 sec)
```

## テーブルにインサートしてみる（トランザクションをかけない）

ここで、重要なことは、再度インサートを試みた時に、前回ロールバックした際のidを再びもってこないよね？というところです

### さっそくインサートします

こんどは、オートコミットです

```
MariaDB [knowledge]> insert into test_ptable (updated_at) values (current_timestamp) ;
Query OK, 1 row affected (0.00 sec)
````

### インサートの結果

```
MariaDB [knowledge]> select * from test_ptable ;
+---------+---------------------+--------+
| id      | updated_at          | domain |
+---------+---------------------+--------+
| 8177589 | 2014-10-09 20:18:06 | NULL   |
+---------+---------------------+--------+
1 row in set (0.00 sec)
```

おぉおお、、よかった、前回ロールバック前に取得したid 8177588 は欠番になり、新たに8177589が割当たりました！！！！


とりあえず、安心？？？
VARCHAR(n) 型カラムにn文字を超える文字列を入れるとき自動切り詰め

テーブル設計に文字列長を含める場合
--
最近私はRDBテーブルを設計するとき、VARCHARに文字列長を付けていません。
長さ無制限でもインデックスだって貼れるし物理ファイル構造はRDBエンジンがなんとかしてくれるし、長さ制限はどちらかというとアプリケーション要件だし、なによりも
**アプリケーション側の処理系とSQLで文字列長を数える基準が一致困難** だからです。
サロゲートペア文字、異体字セレクタ、合字の正規化、… いろいろと深まる闇を感じますね。
そして、アプリケーション側では文字数に収まったと判定したのにRDB側では文字数オーバーとなった場合、書き込みで何が起きるか。自動切り詰めではありません。 **実行エラーとなる** のがSQLの仕様です。

文字列長オーバーで自動切り詰めさせる
--
しかし以上のような警告にもかかわらず、諸般の事情でどうしてもVARCHARに最大長を設定することを強いられて次のようなテーブルを作らざるを得なかった場合。

| カラム | 型 | オプション |
|:------:|:------------:|:------------:|
| id|INTEGER|PRIMARY KEY NOT NULL|
|name|VARCHAR(10)|NOT NULL|

せめてINSERTやUPDATEが実行時にこけないよう、自動切り詰めをさせましょう。

```sql
INSERT INTO items (name) VALUES (?);
```

と書く代わりに

```sql
INSERT INTO items (name) VALUES (CAST(? AS VARCHAR(10)));
```

です。最大長つきVARCHARへのキャストは切り詰めでありエラーにはならないのです。
EditorForでhtmlAttributesを指定できるようにする

ASP.NET MVC 5からEditorForにadditionalViewDataを渡せるようになり、HTMLの属性などを指定できるように作れるようになりました。

受け取ったhtmlAttributesをそのまま指定するだけなら簡単ですが、エディターテンプレート側でclass属性などを付けている場合があり、そういう場合はパラメータとして受け取ったものとエディターテンプレートで付けようとしているものをマージしてやる必要があります。とはいえhtmlAttributesはおおむね匿名型で来るのでマージできない……

と思ったら、まさにそれ用の`HtmlHelper.AnonymousObjectToHtmlAttributes()`という匿名型をディクショナリに変換するメソッドがありました。

```csharp
@Html.EditorFor(model => model, new { htmlAttributes = new { @class = "form-control" }, })
```

```csharp:EditorTemplate/DateTime.cshtml
@model System.DateTime?
@{
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
    htmlAttributes.Add("class", "datepicker");
}
@Html.TextBox("", Model != null ? Model.Value.ToString("yyyy/MM/dd") : "", htmlAttributes)
```

参考)
http://msdn.microsoft.com/ja-jp/library/system.web.mvc.htmlhelper.anonymousobjecttohtmlattributes(v=vs.118).aspx
[Android]エミュレーターでDBに保存したデータを見たいとき

Androidアプリを開発していてDBに保存する処理を書きました。
エミュレーターを動かしてデータをDBに保存する処理を行なったが、本当に保存されているのかわからない！
そんなときにDBを直接みてデータが保存されているか確認する方法を調べました。
調べているとやり方はいろいろあるようなのですが、ターミナルでできるというadbを使う方法についてまとめます。

adbのインストールは済んでいる前提で進めます。
adbはAndroid SDKをダウンロードしていれば使えるようです。(パス設定などは必要)

## ターミナルからDBにアクセスしよう！

以下のコマンドを入力します。

```
# adb shell
# cd data/data/<package name>/databases
```

このディレクトリでlsをするとお目当てのDBが見つかるかと思います。
それではDBの中に入って実際にデータが格納されているか確認しましょう。

```
# sqlite3 <見たいDB名>
```

上のコマンドでDBに入ることができます。正しければおそらく以下のように表示されます。

```
# sqlite3 <見たいDB名>
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
```

これでDBの中にはいることができたので、欲しいデータを確認しましょう。

テーブルの一覧を取得するコマンド

```
sqlite>.tables
```

あるテーブルのデータを取得する

```
sqlite> select * from <table name> ;
```

こんな感じで好きにDBを操作することができると思います。
Macの外付けキーボード設定まとめ


# 概要

Macに外付けキーボードを付けた時に、
デフォルトの状態だと色々とおかしな感じになるので、
設定する必要がある。

再インストールしたりしたときに毎回ハマるのでメモ。


# キーボードの種類を変更

なぜかUSキーボードとして認識される場合があるので、
JISに認識されるようにする。

環境設定 > キーボード > キーボードの種類を変更
のボタンを押下する。

![スクリーンショット 2014-10-09 19.38.36.png](https://qiita-image-store.s3.amazonaws.com/0/2278/88543a02-680f-ee59-de86-87cfb6549ad1.png "スクリーンショット 2014-10-09 19.38.36.png")

あとは指示に従ってキーを押していけば、
種類を選択する画面が現れるのでJISを選択する。

![スクリーンショット 2014-10-09 19.39.18.png](https://qiita-image-store.s3.amazonaws.com/0/2278/bb24a5cd-c1e1-75d7-fd38-a78bb2e29c56.png "スクリーンショット 2014-10-09 19.39.18.png")



# 修飾キーの設定

システム環境設定 > キーボード > 修飾キー
と進む。

![スクリーンショット 2014-10-09 19.18.11.png](https://qiita-image-store.s3.amazonaws.com/0/2278/50a67e79-d46a-39b6-0735-45e50a1882aa.png "スクリーンショット 2014-10-09 19.18.11.png")

「キーボード選択」で、外部キーボードを選択し、以下のように設定した。

![スクリーンショット 2014-12-30 10.55.48.png](https://qiita-image-store.s3.amazonaws.com/0/2278/7dde282a-ac5e-8849-4ecf-cb9a94ace5c4.png "スクリーンショット 2014-12-30 10.55.48.png")


# Karabiner のインストール

いろいろキー設定を行うために、Karabiner をインストールする。
https://pqrs.org/osx/karabiner/index.html.ja



# リピート速度を変える

カーソル移動を調整するためにリピート速度を変える。

Karabinerを立ち上げ、「Key Repeat」の数値を変えれば良い。
早くする場合は数値を小さくすれば良い。

![スクリーンショット 2014-10-09 19.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/2278/16722da2-727e-3c8b-d43e-d2cdcf0b012b.png "スクリーンショット 2014-10-09 19.43.48.png")



# Vim でノーマルモードに戻った時の挙動設定

Vimでノーマルモードに戻った時に、半角英数に切り替わるように設定する。

Karabinerを立ち上げ、
Misc & Uninstall > Open private.xml
のボタンを押下する。

![スクリーンショット 2014-10-09 19.27.52.png](https://qiita-image-store.s3.amazonaws.com/0/2278/0947da26-84cd-bf34-60b2-4e7c06274ada.png "スクリーンショット 2014-10-09 19.27.52.png")

private.xml に以下の内容を記載して保存する。

```xml:private.xml
<?xml version="1.0"?>
<root>
<appdef>
<appname>iTERM2</appname>
<equal>com.googlecode.iterm2</equal>
</appdef>
<appdef>
<appname>MACVIM</appname>
<equal>org.vim.MacVim</equal>
</appdef>
<list>
<item>
<name>Leave Insert Mode with EISUU (vim keybind apps)</name>
<identifier>private.vim_keybind_apps_esc_with_eisuu</identifier>
<only>iTERM2,TERMINAL,MACVIM</only>
<autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
<autogen>--KeyToKey-- KeyCode::JIS_BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
</item>
</list>
</root>
```

「Change Key」に移動して、「ReloadXML」を押すと、
「Leave Insert Mode with EISUU (vim keybind apps)」という項目が表示されるので、
チェックを入れる。

![スクリーンショット 2014-10-09 19.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/2278/ffc8c20e-8078-17b9-617a-36dde19c6d82.png "スクリーンショット 2014-10-09 19.33.58.png")

これで完了。




# Seil で、英数/かな を設定

Seilをインストールする。
https://pqrs.org/osx/karabiner/seil.html.ja

以下の項目をオンにする。


For Japanese > Enable NFER on PC keyboard
For Japanese > Enable XFER on PC keyboard


![スクリーンショット 2014-10-09 19.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/2278/b5484436-1a19-cbcc-1eff-31d64c15d197.png "スクリーンショット 2014-10-09 19.15.51.png")



# 参考

 MacBook セットアップ備忘録 外付けキーボード(REAL FORCE) 編
http://d.hatena.ne.jp/ginbear/20090505/1241505354

Vimのインサートモードを抜けるときにIMEをオフにするKeyRemap4MacBookのprivate.xml設定
http://m.designbits.jp/13091710/
CentOS6.5にmysql5.6をインストールする手順

## 環境
OS : CentOS release 6.5 (64bit)

## 既にmysqlの何かあるか確認する
`$ sudo yum list installed | grep mysql`

## あった場合、けす
`$ sudo yum erase mysql-libs`

## rpm 入手
http://downloads.mysql.com/archives/community/ から

`$ wget http://downloads.mysql.com/archives/get/file/MySQL-client-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ wget http://downloads.mysql.com/archives/get/file/MySQL-server-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ wget http://downloads.mysql.com/archives/get/file/MySQL-shared-compat-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ wget http://downloads.mysql.com/archives/get/file/MySQL-devel-5.6.20-1.linux_glibc2.5.x86_64.rpm`

### インストール
`$ sudo yum install MySQL-client-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ sudo yum install MySQL-server-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ sudo yum install MySQL-shared-compat-5.6.20-1.linux_glibc2.5.x86_64.rpm`
`$ sudo yum install MySQL-devel-5.6.20-1.linux_glibc2.5.x86_64.rpm`

## インストール確認
`$ mysql --version`

## 設定ファイル作成
* 設定ファイルひな形をコピって作る  
`$ sudo cp /usr/share/mysql/my-default.cnf /etc/my.cnf`
`$ sudo vi /etc/my.cnf`
以下を貼り付け

        [mysqld]
        datadir=/var/lib/mysql
        socket=/var/lib/mysql/mysql.sock
        user=mysql
        # Disabling symbolic-links is recommended to prevent assorted security risks
        symbolic-links=0
        character-set-server = utf8

## MySQL起動
`$ sudo service mysql start`

## root初期パスワードの確認
`$ sudo view /root/.mysql_secret`

## MySQL初期設定
`$ sudo mysql_secure_installation`

## MySQL ログイン
`$ sudo mysql -u root -p`

## データベース作成
* rootでMySQLにログイン
`$ mysql -u root -p`

* rootユーザのパスワード設定
`mysql> SET PASSWORD FOR root@localhost=PASSWORD('{新しいパスワード}');`

* 自サーバからtestuserユーザでprodDBデータベースに接続できるように
`mysql> grant all privileges on prodDB.* to testuser@localhost identified by '{testuserのパスワード}' with grant option;`
※ 全てのホストからrootユーザで接続できるようにしたい場合
`mysql> grant all privileges on proddb.* to root@"%" identified by 'root' with grant option;`

* ユーザ登録確認
`mysql> select user from mysql.user where user='testuser';`

* 一旦ログアウト
`mysql> exit`

* testuserユーザでMySQLサーバーへログイン
`$ mysql -u testuser -p`

* prodDBデータベース作成
`mysql> CREATE DATABASE prodDB CHARACTER SET utf8;`

# その他コマンド

* テーブル一覧表示
`mysql> show tables;`

* 存在するデータベースの一覧を確認
`mysql> show databases;`

* ユーザーの確認
`mysql> select user,host from mysql.user;`

* DB切り替え
`mysql> use proddb;`

# 参考リンク
[MySQL本家](http://www.mysql.com/)
************************************************************
[データベースサーバー構築(MySQL)](http://centossrv.com/mysql.shtml)
[MySQLでrootパスワードを忘れた場合の対処方法](http://liginc.co.jp/web/programming/mysql/87393)
[外部ホストからのMySQL接続](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E5%A4%96%E9%83%A8%E6%8E%A5%E7%B6%9A%E8%A8%B1%E5%8F%AF%E8%A8%AD%E5%AE%9A.php)
次のフレーム更新のタイミングまで処理を持ち越す


ActionScript の callLater みたいなものを作った

```
namespace Hoge.Extensions {
	static class MonoBehaviorExtensions {
		
		public static void CallLater(this MonoBehaviour mono, Action callback) {
			mono.StartCoroutine(Later(callback));
		}
		
		private static IEnumerator Later(Action callback) {
			yield return null;
			callback.Invoke();
		}
	}
}
```

使い方

```
// MonoBehaviorを継承しているクラス内で
this.CallLater(() => {
	// ここに記述した処理は次のフレーム更新時に呼び出される
});

```
PlayFramework2.3でハマった箇所と対応内容

## 1.Procfileの起動オプションが前バージョンと異なる

- v2.2.X

```
web: target/start
```

- v2.3

```
web: target/universal/stage/bin/{your project name} -Dhttp.port=$PORT
```

## 2.HerokuでNewRelicを使う場合のオプションが異なる

- v2.2.X

```
-javaagent:/path/to/newrelic.jar
```

- v2.3

```
-J-javaagent:/path/to/newrelic.jar
```
Railsでhas_and_belongs_to_manyのモデルを作成する

このような関係を作成するときの手順です。

![hbtm_erd.PNG](https://qiita-image-store.s3.amazonaws.com/0/45172/b7a222d6-3b37-4606-7c7e-f41757db3189.png)

まずはモデルとマイグレーションを作成。

```
$ rails g model user name:string email:string
$ rails g model group name:string description:text
$ rails g migration create_groups_users group:references user:references
```

*※`create_groups_users`のところはテーブル名をアルファベット順でつなぐ。*

中間テーブルはidカラムを作成しないようにするため、以下のようにマイグレーションファイルを編集します。

```rb
class CreateGroupsUsers < ActiveRecord::Migration
  def change
    create_table :groups_users, id: false do |t|
      t.references :group, index: true, null: false
      t.references :user, index: true, null: false
    end
  end
end
```

1. create_table()の引数に `id: false` を追加
2. t.references の引数に `null: false` を追加

これでマイグレーション実行。

```
$ rake db:migrate:reset
```

で、モデルにアソシエーション設定を記述。

```rb:app/models/user.rb
class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
end
```

```rb:app/models/group.rb
class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
end
```

## 使えるようになるメソッド
[has_and_belongs_to_many - リファレンス - Railsドキュメント](http://railsdoc.com/references/has_and_belongs_to_many)

## 使い方の例

### whereメソッドでの絞り込み
グループID:1に所属するユーザーを取得。

```rb
User.includes(:groups).where('groups.id' => 1)
```

配列でも指定できる。

```rb
User.includes(:groups).where('groups.id' => [1, 2])
```

### ユーザーにグループを関連付ける

```rb
new_user = User.new(:name => 'newuser', email => 'newuser@example.com')
new_user.groups << Group.find(1)
new_user.save
```

## コントローラー／ビューからの使い方
記事を追加しました。
[Railsでhas_and_belongs_to_manyを利用したUIを作成する](http://qiita.com/gotohiro55/items/0d76ac9412b04a431e32)
TypeScriptでもwebpackでcommonjs requireしたい！

## やりたいこと

```
app/
  hoge.ts
  foo.coffee
```

って構成があったら

hoge.tsから

```javascript
var jQuery  = require 'jquery'
var foo = require('./foo');

export class Hoge {}
```
とか

foo.coffeeから

```coffeescript
hoge = require './hoge'
module.exports = class Foo
```

とかしたいですよね？もちろん外部モジュールも同梱した状態でコンパイルしたいですよね？

一応typescript-loaderあるんですが、typescript側からの require のトランスフォームに対応してないし、v1.1でコンパイラ高速化したことだし各種プラグインが対応するのはだいぶ時間かかると思うので、直接使うことにしました。

注意: これは2014/10/09の暫定的な対応なので後の世ではもっとまともになってることでしょう

## 方法

別ディレクトリで相対パスそのままにcoffee/typescriptともにコンパイルし、その後webpackでビルドする

つまり

```
app/
  hoge.ts
  foo.coffee
```
を、一旦

```
lib/
  hoge.js
  foo.js
```

にしてwebpackでビルドする。このディレクトリはgitignoreしてよさそうだしtempみたいな名前でも良い。


プロジェクトサンプル
[mizchi-sandbox/webpack-ts-cs](https://github.com/mizchi-sandbox/webpack-ts-cs "mizchi-sandbox/webpack-ts-cs")

多段ソースマップは面倒くさすぎるので一旦諦める。

typescriptのビルド(--watchモード)

```
$ tsc -w -m commonjs --target es5 --outDir lib app/app.ts
```

の、前に… このままだとtypescript側のrequire機構で参照が解決されてしまう(コンパイル時に消える)ので、node.d.tsをreferenceに追加するか `declare var require:Function;`する必要があるので、適宜読み込んでください。

https://github.com/borisyankov/DefinitelyTyped/blob/master/node/node-0.11.d.ts

(今気づいたけどこれJxckさんだ)


coffeeのビルド(gulp)

```coffee
coffee = require 'gulp-coffee'
gulp.task 'coffee', ->
  gulp.src('./app/**/*.coffee')
  .pipe(coffee())
  .pipe(gulp.dest('./lib'))
```

(coffee -o lib -c app/**/*.coffee だとディレクトリの相対パスが保存されなかったので、仕方なくgulpタスクにした)


Webpackと監視

```coffee
webpack_config =
  output:
    filename: 'all.js'
  resolve:
    extensions: ["", ".js"]

gulp.task 'webpack', ->
  gulp.src('lib/initialize.js')
  .pipe(webpack(webpack_config))
  .pipe(gulp.dest('public'))

gulp.task 'watch', ['webpack'], ->
  gulp.watch 'app/**/*.coffee', ['coffee']
  gulp.watch 'lib/**/*.js', ['webpack']
  gulp.task 'default', ['webpack']
```

とはいえサンプルプロジェクト見てくださいって感じがある。
TitaniumでAndroidのActionBarの外観をカスタマイズする

Titanium SDK 3.3.0からAndroidのThemeがAppCompatになりましたね。もうあれこれ悩まずActionBarの外観をカスタマイズすることができます。方法は簡単で、カスタムのテーマを作成して、アプリのメインのActivityにそちらを使うと宣言するだけです。

まずカスタムのテーマを作成しましょう。

できましたね？

…できませんよね？

そういうときに便利なツールがあります。「[Android Action Bar Style Generator](http://jgilfelt.github.io/android-actionbarstylegenerator/)」でさくっと外観を設定しましょう。こちらは大変便利なシステムで、色の組み合わせを設定するだけで必要なリソースが全て用意されてしまう優れものです。

![android_style_generator.png](https://qiita-image-store.s3.amazonaws.com/0/1782/a9ff9b92-f4f4-961f-ddf0-a51cc42bd52e.png)

Style nameはこれから作成するテーマの名前です。他とかぶらないように適当に（アルファベットで、できれば記号など使わず、数字もスペースも無しで）設定して、Style compatibilityに「AppCompat」を選択したら、ZIPファイルをダウンロードします。展開するとresというディレクトリになるはずです。

次にTitanium側の設定です。ダウンロードしたテーマをプロジェクト直下のplatform/androidディレクトリの下にコピーしてください（ディレクトリがなければ作成しましょう）。

次にThemeの設定です。tiapp.xmlを開いて（XMLが編集できるエディタで開いてください）、androidディレクティブを編集します。

```xml
   <android xmlns:android="http://schemas.android.com/apk/res/android"/>
```

この行を編集して

```xml
    <android xmlns:android="http://schemas.android.com/apk/res/android">
      <manifest>
        <application android:theme="@style/Theme.テーマの名前"/>
      </manifest>
    </android>
```

にします。以上です。

Android 4.4のスクリーンショット：
![android_theme_44.png](https://qiita-image-store.s3.amazonaws.com/0/1782/4f5bce1e-d102-a922-4405-8ce85319c4f6.png)


Android 2.3でも…
![android_theme_23.png](https://qiita-image-store.s3.amazonaws.com/0/1782/d86b3497-9015-11ab-9770-cfed1044ff60.png)


簡単でしょ？
SELinuxのポートの確認


ポートをかえる必要があるのでSELinuxで制限を確認します.

今回の環境

- CentOS 6.5

## ポートを確認

`semanage port -l`でポートの確認ができます.
今回は`mysqld`で利用できるポートを確認するのが目的で調べてみた.

実行するとtcpのポート`1186, 3306, 63132-63164`が利用できる.

```
$ sudo semanage port -l | grep mysql
mysqld_port_t                  tcp      1186, 3306, 63132-63164
mysqlmanagerd_port_t           tcp      2273
```

## semanageコマンドのインストール

そもそも`semanage`コマンドが無かったので以下の手順でインストールしました.

まずは`whereis`で探します.

```:見つからない場合
$ whereis semanage
semanage:
```

```:見つかった場合
$ whereis semanage
semanage: /usr/sbin/semanage /usr/share/man/man8/semanage.8.gz
```

見つからない場合は`yum provides`で対象のパッケージを特定します.
実行したみたところ、どうやら`policycoreutils-python-2.0.83-19.39.el6.x86_64`に含まれているな.

```
$ yum provides /usr/sbin/semanage
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
policycoreutils-python-2.0.83-19.39.el6.x86_64 : SELinux policy core python utilities
Repo        : base
Matched from:
Filename    : /usr/sbin/semanage
```

そしてインストール

```
yum -y install policycoreutils-python-2.0.83-19.39.el6
```
Titanium3.4でiOS8の位置情報をとる際の設定


tiapp.xmlに設定追加しないとだめなんですね。

``` tiapp.xml
<ios>
	<plist>
		<dict>
			<key>NSLocationWhenInUseUsageDescription</key>
			<string>Test NSLocationWhenInUseUsageDescription</string>
			<key>NSLocationAlwaysUsageDescription</key>
			<string>Test NSLocationAlwaysUsageDescription</string>
		</dict>
	</plist>
</ios>

```

* 使用中のみ許可	
 > NSLocationWhenInUseUsageDescription

* 常に許可	
 > NSLocationAlwaysUsageDescription

## 参考ページ
> http://qiita.com/koogawa/items/6ec24ca3201977e9642b

> https://gist.github.com/benbahrenburg/c4c992c8c61d197510ea





## うまくいくと位置情報を取得しようとした際に、確認ダイアログが表示されます。

![kobito.1412846910.673153.png](https://qiita-image-store.s3.amazonaws.com/0/19316/e87a709d-74eb-0832-5c57-9780dc5b342f.png "kobito.1412846910.673153.png")


##　サンプルソース

https://github.com/ganezasan/gpstest-titanium-ios8
IntelliJ IDEA Tips

---

Mac環境です。キーバインド変えているので一部違うかもしれないです。

## 一般
* ウィンドウを分割した時に隣のウィンドウへ移動するときには Option + Tabで移動できる
* Shift + command + e で最近修正したファイル一覧を見れる
* command + - でimport文の部分などを閉じる. command + ^で開ける。日本語キーボードなのでKeymapに書いてあるものと実際は若干違うので注意
* complete current statementは ``` if (i % 3 != 0 && i % 5 != 0) ```
の最後の0のところで shift + command + enterを押すと以下のようになる  

```
if (i % 3 != 0 && i % 5 != 0) {

}
```

* 以前使った検索条件でもう一度検索したいときは、``` 3:Find ```のパネルにフォーカスを合わせて ```command + e ```で検索できる


## Git
* 複数のモジュールを扱うときは同じブランチ名にしておくと、Common Local Branchで一度に切り替えることができる。PreferencesのVersion Controlに複数Gitのモジュールを登録するか、ProjectのVCSをGitにしたあと、Control〜にチェックを入れておく
 ![img.png](https://qiita-image-store.s3.amazonaws.com/0/1765/72062ac1-0113-8bdb-6ed5-6ef5754d9856.png)

* GitでMergeするときは、VCS -> Git -> MergeにしてNo commitをチェック入れたほうが便利
* Perferences + GitHubでGHEのサーバを設定すると、そこからPull Requestが遅れる(もちろんそのままだとGitHubへ遅れる)


## Database
* ``` select * from bar where id = ? ``` とするとバインド変数を設定できる。
* option + command + e で履歴を選べる。

## その他
* can not resolve symbol が表示されたら,[File]-->[Invalidate cache]をする
* Auto ImportするにはPreferencesのAdd unambiguous import on the flyにチェックを入れる
* Task Serverを設定してからcommitするときに、ctrl - spaceすると、メッセージを保管してくれる
* Preferences -> Build Tools > Maven > Repositoriesの updatedがエラーになる場合は、~/Library/Caches/IntelliJIdea<バージョン>/Mavenがあるので一度消してみる
* GoLangの[gom](https://github.com/mattn/gom)を使うときには、Preferences -> Go > Go Libiraries のProject Libirariesに<プロジェクトルート>/_vendorを設定すると、ライブラリなどを見に行く。(Goプラグイン0.9.402で確認)
CircleCIの便利な機能


[CircleCI](http://circleci.com/)の設定をする際に便利だった機能について書く。

## 便利な機能
### ssh接続
ビルド結果画面にある「&enable SSH」をクリックすると別インスタンスが起動し、ssh接続可能になる。

「ローカルでは動くか、CI上では動かない」などのトラブル調査の際に便利。

![standfirm_sfinvoice__245_-_CircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/5920/cd197221-5738-e859-2822-de24706c9ae1.png)



## circle.ymlで設定可能な項目(抜粋)
[Configuring CircleCI](https://circleci.com/docs/configuration)からの抜粋。

### /etc/hostsへの登録
名前解決できないテスト用サーバ等を設定するとよい。

```yaml
machine:
  hosts:
    dev.circleci.com: 127.0.0.1
    foobar.com: 1.2.3.4
```

### 環境変数の登録
環境変数はWebUIでも設定可能ですが、`circle.yml`の内容が優先されます。

```yaml
machine:
  environment:
    foo: bar
    baz: 123
```

### タイムゾーン
デフォルトではUTCになっているので、日本にしておいたほうが無難。

```
machine:
  timezone:
    Asia/Tokyo
```

### 任意コマンドの実行
`pre`や`post`に任意のコマンドが書ける。 


```yaml
machine:
  pre:
    - echo foo
    - echo bar
  post:
    - echo baz
```

## ビルド
### 任意コマンドの実行
`machine`と同様に`pre`と`post`が利用できる。

```
dependencies:
  pre:
    - sudo cp .env.sample .env
```

### 特定ディレトリのキャッシュ
複数のビルド間で共有するディレクトリを指定する。
あまりサイズが大きくなるとつらい。(例: `/usr` を指定したら10分くらい待たされた)

```yaml
dependencies:
  cache_directories:
    # 絶対パス
    - /path/to/cache
    # 相対パス
    - cache
    # /homeからの相対パス
    - ~/cache
```

`pre` と組合せて独自でいれるソフトウェアのキャッシュができる。

```yaml
dependencies:
  cache_directories:
    - redis-2.4.18
  pre:
    - if [[ ! -e redis-2.4.18/src/redis-server ]]; then wget http://redis.googlecode.com/files/redis-2.4.18.tar.gz && tar xzf redis-2.4.18.tar.gz && cd redis-2.4.18 && make; fi
```

## テスト
### 任意コマンドの実行
`machine`と同様に`pre`と`post`が利用できる。

```yaml
test:
  pre:
    - bundle exec rubocop
```
### テストコマンドの変更
`override` でテストのコマンドを変更できる。CircleCI自体をいじるときは、ここを適当なコマンドに差し替えると楽。

```yaml
test:
  override:
    - echo "Ya! All the tests are passed!!"
```
Androidの標準UI部品をサクッと全とっかえ！

Android標準のUI部品　そのまま使うとイケてないので「カスタマイズしたい」と思うことよくありますよね～！

でも、**「色を少し変えたいだけ…」**って場合もあります。


そんなときにわざわざカスタムすると
・ボタンの画像を作って、
・タップしたときの画像も作って、
・その画像を指定するXML書いて…

例えばボタンをカスタムするとこんな感じ。。。
「すっげー面倒だし時間もかかるじゃん！」

そんな時は**Android Holo Color Generator** が良いですよ！
はい。

#Android Holo Color Generator とは
Android標準のUI部品を好きな色に変更して一括ダウンロードできる素敵なサービスです。
ご存知の方も多いですよね。
リンクはこちら
**http://android-holo-colors.com**

PayPalのボタンが下の方にありますが、寄付用。
基本全て無料で使えます。


ライセンスは上記リンクの最下部にありますね。
All generated art is licensed under a [Creative Commons Attribution 3.0 Unported License.](http://creativecommons.org/licenses/by/3.0/)
「商用でつかってOKよ！でもどっかにクレジット表示してね」てな感じでしょうか。
気になる方は日本語訳どうぞ→　http://creativecommons.org/licenses/by/3.0/deed.ja


#使いかた
ざっくりと説明しますね。
いたって簡単です！

1.　**好きな「color」を選択**
（1.5.　Android 2.3以下をサポートする場合は「>= 11」を選択）

2.　**必要なものだけ「YES」を選択し**
3.　**「download.zip」をクリックし**
4.　**解凍したresフォルダの中身をアプリのresフォルダに突っ込む**
　
以上です。5分もあれば終わります。
ほぼ画像ファイルとxmlファイルですね。



#使ってみた
左：よく見る標準のUI部品はのような感じですよね。
右：それがサクッっとこんな感じに色が変わってくれます。
![Screenshot_2014-10-15-18-45-16.jpg](https://qiita-image-store.s3.amazonaws.com/0/32732/1dc975ce-04e1-f12f-75e7-1f59eef576f3.jpeg)![Screenshot_2014-10-15-18-48-12.jpg](https://qiita-image-store.s3.amazonaws.com/0/32732/09c5f15c-0b7b-9a2c-c514-3e5aa134573c.jpeg)

今回全てのUI部品に「YES」を選択してアプリに突っ込みましたが、
アプリのサイズは　1.66MB　→2.18MB　で520KBの増加です。
まぁ許容範囲のサイズではないでしょうか。



標準のUIが変えらるとうれしいのは、外部SDKのUIでも、標準UI使っていればその部分も変わってくれるのが良いです。（↓FAQとか作れるフリーのSDK）
標準UI以外の部分はAndroid Holo Color Generatorじゃ変わんないので普通にXMLファイルをごにょごにょカスタマイズすればOK！

こんな感じになりました。（キャプチャ撮るの失敗しました。背景が違うのは無視でf(==;　）
（左：標準UI変更前　→右：Android Holo Color Generatorで標準UIを変更後）
![Screenshot_2014-10-15-22-26-48.jpg](https://qiita-image-store.s3.amazonaws.com/0/32732/2d85b1aa-5660-d914-c5cf-3679dde7e4b6.jpeg)![Screenshot_2014-10-15-22-19-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/32732/fa4747a7-f99c-67b9-ec8e-913e3d15c643.jpeg)


Android Holo Color Generatorいかがだったでしょうか？
手間をかけずにやれるので、もし知らなかった方はUIをがっつりカスタマイズする前に一度試してみるのが良いですよ！

ちなみにActionBarのUIも変更する場合はこっちも必要とおもいます。
http://jgilfelt.github.com/android-actionbarstylegenerator/
こっちはまたの機会に。
ご参考まで～
Laravel 4 (4.2) をインストール (Mac OS X Mavericks 10.9.5, PHP 5.4)

========

composer をインストール
--------
`curl -sS https://getcomposer.org/installer | php`

して `composer.phar` をワーキングディレクトリに設置。


laravel を laraevl インストーラーからインストール
--------
[Laravel - The PHP framework for web artisans.](http://laravel.com/docs/4.2/quick) を参考に、

`php composer.phar global require "laravel/installer=~1.1"`

して `~/.composer/bin/` に `laravel` ユーティリティコマンドをインストール。


### Laravel インストーラーからインストールすることの利点 ###
`app/storage` などのディレクトリのパーミッションを自動で設定してくれる、かと思った。
**してくれなかった** 。 (もしかしてインストーラーを使う利点は無いのか？)

(下記、 **Laravel 環境を構築** の後で↓)

[Laravel - The PHP framework for web artisans.](http://laravel.com/docs/4.2/installation) を参考に、

`chmod -R 707 app/storage` する。


Laravel 環境を構築
--------
`laravel new name-of-webapp` して web フレームワーク環境を自動セットアップ。

その後、

[Laravel - The PHP framework for web artisans.](http://laravel.com/docs/4.2/installation#configuration) を参考に、

- `timezone` -> `Asia/Tokyo`
- `locale` -> `ja`

に修正する。


動作確認
--------
`php artisan serve` コマンドで立ち上げてみる。 (OS は Mac OS X Mavericks 10.9.5, PHP 5.4.30 で OS に最初から入ってた環境)
下記のようなエラーが出る。

```console
$ php artisan serve
Mcrypt PHP extension required.
```

brew でインストールしようと試みたがうまくいかなかったので、

[MacOSX - mac OSX環境にphp-mcryptをインストールするtips - Qiita](http://qiita.com/yokozawa/items/33df4ba2f81ead0d9db7) を参考に、

[Mcrypt installer - Tools, Support and Consultancy for OS X Server - Taking care of OS X Server](http://topicdesk.com/downloads/mcrypt)

からインストーラーを落としてインストールすると…動いた。神。

ブラウザで `http://localhost:8000` を開いてみて確認。動いてるので、
引き続き [Laravel - The PHP framework for web artisans.](http://laravel.com/docs/4.2/quick) を参照しながらアプリを書いていってみる。