OmniAICreator/Qiita-1.07M huggingface dataset:
docker0.9.1でmysqldが起動できず、docker1.1.2に上げたら動いた

ubuntuのdockerでmysqldが起動できなかった。
docker.ioパッケージが 0.9.1~dfsg1-2 と古かったのが原因かと思い、最新の1.1.2を入れたら動いた。

参考: [Dockerハンズオン資料 - Qiita](http://qiita.com/zembutsu/items/3a396dd1e9d16193b0ba)

# 最新のdockerをインストール

```bash:
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sh -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
apt-get update
apt-get install lxc-docker
```

# docker.io 0.9.1でのmysqld起動不具合

```bash:
# run -it -p 8080:80 tukiyo3/centos6-ja-alminium:no_jenkins /bin/bash
```

```bash:
# /etc/init.d/mysqld start
MySQL Daemon failed to start.
mysqld を起動中:                                           [失敗]

# /usr/libexec/mysqld --skip-grant
140804  9:37:46  InnoDB: Initializing buffer pool, size = 8.0M
140804  9:37:46  InnoDB: Completed initialization of buffer pool
140804  9:37:46  InnoDB: Started; log sequence number 0 3687108
140804  9:37:46 [ERROR] Can't start server : Bind on unix socket: Permission denied
140804  9:37:46 [ERROR] Do you already have another mysqld server running on socket: /var/lib/mysql/mysql.sock ?
140804  9:37:46 [ERROR] Aborting

140804  9:37:46  InnoDB: Starting shutdown...
140804  9:37:51  InnoDB: Shutdown completed; log sequence number 0 3687108
140804  9:37:51 [Note] /usr/libexec/mysqld: Shutdown complete


# tail /var/log/mysqld.log
140804  9:37:14  InnoDB: Started; log sequence number 0 3687108
140804  9:37:14 [ERROR] Can't start server : Bind on unix socket: Permission denied
140804  9:37:14 [ERROR] Do you already have another mysqld server running on socket: /var/lib/mysql/mysql.sock ?
140804  9:37:14 [ERROR] Aborting

140804  9:37:14  InnoDB: Starting shutdown...
140804  9:37:19  InnoDB: Shutdown completed; log sequence number 0 3687108
140804  9:37:19 [Note] /usr/libexec/mysqld: Shutdown complete

140804 09:37:19 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
```
Redmineのチケットをエクスポート、インポート

この方法ではチケットの履歴についてはエクスポートできないので注意。

# 1. CSV出力

* プロジェクト -> チケット -> 他の形式にエクスポート -> CSV をクリック

![スクリーンショット 2014-08-04 8.58.52.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5b467b3b-6150-bef1-25af-ae124895c377.png)

# 2. Importerモジュールを有効にする

* インポートさせたいRedmineのプロジェクトにてImporterを有効にする。

![スクリーンショット 2014-08-04 9.00.33.png](https://qiita-image-store.s3.amazonaws.com/0/25728/960c786f-d5c3-729b-4978-d6c4797df5da.png)

# 3. インポート実施

* エンコーディングでSJISを指定しファイルをアップロード。
* 適宜カラムの`無視`をすること。

![スクリーンショット 2014-08-04 8.55.36.png](https://qiita-image-store.s3.amazonaws.com/0/25728/15e37f70-fc8f-9e35-dec7-8d0790f0f2c6.png)
複数のredmineを1ドメインで動作せる時のsession_store設定

参考: [Ruby - 複数 Redmine を1ドメインでホストする - Qiita](http://qiita.com/yteraoka/items/72b111e69511f254f97e)

```diff:/opt/alminium/config/application.rb
-     config.session_store :cookie_store, :key => '_redmine_session'
+     config.session_store :cookie_store, :key => '_redmine_session_Tooziec3'
```

keyを重複しないものに書き換えればよい。

もしくは[Ruby - 複数 Redmine を1ドメインでホストする - Qiita](http://qiita.com/yteraoka/items/72b111e69511f254f97e)を試すのもひとつの手


```bash:
/etc/init.d/httpd restart
```
test-unit3を触る。 6年ぶりのメジャーバージョンアップ

# 注目はPower Assert
Power Assertはテスト途中の値を視覚的に表示してくれる。

library test/unit
http://docs.ruby-lang.org/ja/2.1.0/library/test=2funit.html
（このページのテストでtest-unit3の動作を見てみる。）

# test-unit3を動かす。
## 動作確認環境
ubuntu14
ruby 2.1.2
gem 2.3.0

## test-unitのインストール
gem install test-unit

## 使い方:
require "test-unit"

## ファイル
foo.rb
test_foo.rb
（今回は特にtestディレクトリを作らず、同じ階層に置いた。）

```ruby:foo.rb
class Foo
   def foo
     "foo"
   end
   def bar
     "foo"
   end
end
```

```ruby:test_foo.rb
require "test-unit"
require './foo'

class TC_Foo < Test::Unit::TestCase
  def setup
    @obj = Foo.new
  end

  # def teardown
  # end

  def test_foo
    assert_equal("foo", @obj.foo)
  end
  def test_bar
    assert_equal("bar", @obj.bar)
  end

# 追加部分
  def test_foo
    assert do
      ("foo" == @obj.bar)
    end
  end

  def test_bar
    assert do
      ("bar" == @obj.bar)
    end
  end
end

```

## 実行方法
ruby test_foo.rb

## 実行結果
![test_unit3.png](https://qiita-image-store.s3.amazonaws.com/0/44761/c60a0d60-1c17-f701-43f6-8e223819cc15.png)

# 参考

## Power Assertとは。
test-unit-power_assertをリリース - 継続にっき(2014-05-31)
http://www.callcc.net/diary/20140531.html#p01

## test-unit 公式サイト
http://test-unit.github.io/ja/index.html

注、2014年8月4日午前現在
test-unitのドキュメント
リファレンスマニュアル
のリンクが死亡中。
Ubuntu+eclipseでAndroidアプリ開発の環境構築

eclipseの新しいのを入れたので，改めてAndroid環境の構築をメモしておきます．

また，その後にlibgdxの環境構築とかにもつなげていきたいと思っています．

#準備
Javaとeclipseはすでに入っている前提です．

入れ方はここを参考に
[eclipseのインストール](http://qiita.com/ayihis@github/items/6604c191c7f6e3df4195#1-5)
[メニューバーが表示されない場合の対応](http://qiita.com/ayihis@github/items/27d4c433ce162887c4b4)


#SDK(Software Development Kit)を落としてくる

①[公式ページ](http://developer.android.com/sdk/index.html#download)から落としてくる．
この時に「Download Eclipse ADT」ってのを押しがちだけど，すでにeclioseは入ってるので，
「GET THE SDK FOR AN EXISTING IDE」からSDKだけ落とせば良い感じです

②落としてきたやつをどうにか展開する→「android-sdk-linux」ってディレクトリができる
これを，どこか邪魔にならない場所に移動させる．
eclipseのディレクトリと同じ階層とかで良いと思います．

僕は，eclipseがホーム以下の.localに入れたので

```
/home/ユーザ名/.local/eclipse
/home/ユーザ名/.local/android-sdk-linux
```
みたいな感じの場所にいれました．

#ADT(Android Development Tools)プラグインのインストール

「ヘルプ」→「新規ソフトウェアのインストール」→「サイトを入力または選択」のところに
以下のURLを貼る
「https://dl-ssl.google.com/android/eclipse/」
あとは出てきた開発ツールをまるっと落とすだけ．インストールができると一度再起動を要求される．

#eclipseからSDKを読み込む

「ウィンドウ」→「設定」→「Android」→「SDKロケーション」のところを設定します．
先ほどの例だと，この場所は「/home/ユーザ名/.local/android-sdk-linux」になりますね．
SDKのあるディレクトリを指定します．

そしたら，自動的にSDKマネージャが開く気がします．
もしも自動で開かなかったら，「ウィンドウ」→「SDKマネージャ」を起動してください．

SDKマネージャが起動したら，欲しいバージョンのパッケージをポチポチ選択して，
「Install ** Packages...」みたいなボタンを押します．

すると，選択したそれぞえのパッケージにライセンス承諾の画面に移行しますので
「Accept License」のボタンを押してください．それぞれのパッケージで承諾のボタン必要だと思いますので，ちょっと注意です．
ちゃんとAcceptしたやつのパッケージには緑のチェックマークが表示されるはずです．

インストールには割と時間かかります．

これで準備完了だと思います

#確認

確認の為，
「ファイル」→「新規」→「その他」→「Android」→「Androidアプリケーション・プロジェクト」で
新規のアプリを作成できるかどうかを確認してみてください

以上です．
[Ruby] 例外処理を実装する時のrescue書き方3パターン


### 1. 普通にbegin~rescue

```
begin
  # 普通の処理
rescue => e
  # 例外時の処理
end
```

eに例外オブジェクトが入ってきます。

### 2. メソッド単位でrescue

```
def foo
  # 普通の処理
rescue => e
  # 例外時の処理
end
```

begin省略してちょっとすっきりします。

### 3. 1行でrescue

```
some_method rescue p $!
```

1行で書く場合は$!で例外オブジェクトを取得できますね。

### その他

その他の例外関連はこちらなどを参考に
http://www.namaraii.com/rubytips/?%E4%BE%8B%E5%A4%96
MS-IMEとHTML5のinput[type=xxx]

HTML5で追加された様々なinputのtype属性値。
その値によってフォームの見た目が変わるっていうのはよく知られていることだが、いつからかIMEにも影響を与えるようになっていた模様。

#IMEがオフになる
具体的にいうと、type属性値が `number`, `tel`, `email`, `url` の時に、IMEがオフになるというもの。

ただし、どういう環境でもということではなく、以下の環境でのみIMEの変化を確認。

OS：Win7 or 8
ブラウザ：IE11、Chrome、Firefox
IME：MS-IME

[確認用HTML](http://jsdo.it/forty4_jp/html5-input-type/fullscreen)

通常この手のものはブラウザのみが対象になると思うが、どうやらブラウザとIMEの組み合わせで起こっている模様。
手元で確認した限りだと、WinでもMacでもGoogle日本語入力では起こらなかったし、Macのことえりでも起こらなかった。
MS-IMEのみが該当のブラウザで該当のtype属性値の場合にのみIMEをオフにする模様。

ちなみに、IMEがオフになると書いたが、無効になるわけではないので、日本語入力に切り替えることは可能。

##IME（Input Method Editor）制御
入力フォームにフォーカスした際に、ひらがなモード・半角英数モードどちらをデフォルトのモードとするかやソフトウェアキーボードのレイアウトをどうするかといった制御のこと。

###PC向けの対応
PC向けサイトのフォーム要素でIMEを制御しようとする際は、IEが独自に実装（Firefoxもver.3から対応）したCSSのime-modeプロパティを使ってオン・オフ・無効などを切り替えていた。

###スマートフォン向けの対応
スマートフォンやタブレットでは表示されるソフトウェアキーボードのレイアウトを目的にあったものに切り替えられるということで、これまでもinputのtype属性を切り替えていた。
各ページからレイアウトにjavascriptを挿入する。

レイアウトでscriptsセクションを呼び出すように指定して

```csharp:_Layout.cshtml
@RenderSection("scripts", required: false)
```

各ページでscriptsセクションを用意してあげる。

```html:Index.cshtml
@section scripts{
<script type="text/javascript">
	$(function(){
		$(".products table").tile(4);
	});
</script>
}
```
swiftでファイルの書き込み

ドキュメントへのファイルの書き込みを行う方法

```lang:saveFile(swift-v2.1)
// ドキュメントパス
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
// 保存するもの
let fileObject = "sample"
// ファイル名
let fileName = "file.txt"
// 保存する場所
let filePath = documentsPath + fileName

// 保存処理
do {
    try fileObject.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
} catch {
   // Failed to write file
}
```

【追記】
ついでにmp3の保存

```swift:saveMp3File(swift-v2.1)
let fileData = NSData(contentsOfURL:NSURL(string:"url")!)
let fileName = "test.mp3"
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
fileData!.writeToFile("\(documentsPath)/\(fileName)", atomically: true)
```

【追記】
ディレクトリの作り方
https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html


```swift:createFolder(swift-v2.1)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let directoryName = "test"  // 作成するディレクトリ名
let createPath = documentsPath + "/" + directoryName    // 作成するディレクトリ名を含んだフルパス

do {
    try NSFileManager.defaultManager().createDirectoryAtPath(createPath, withIntermediateDirectories: true, attributes: nil)
} catch {
    // Faild to wite folder
}

```
リッチ系CSSフレームワークGumby を Rails 4 で動かす方法

レスポンシブな HTML/CSS の組み方を勉強するために、Gumby という CSSフレームワークを使ってみたのですが、
Rails で使っている記事があまり見当たらず、動かすまでに少し戸惑ったので、手順をメモしておきます。

今回は、現行のバージョンである Gumby framework 2 を、Rails 4.1.1 の環境で動かしました。

## Gumby framework とは

[Gumby framework](http://gumbyframework.com/) は、いわゆる Twitter Bootstrap と同じような機能を持った、Sass 製のレスポンシブな CSS フレームワークです。

![スクリーンショット_2014-07-28_19_33_32.png](https://qiita-image-store.s3.amazonaws.com/0/12033/3f35f164-f59f-c2eb-f066-079f0049f31a.png)


特徴としては、
・フレキシブルなグリッドレイアウト
・トグル機能で簡単に、交互に表示/非表示の切り替えができる
・表示する画面サイズによって、要素の位置（DOM構造）をシャッフルできる
・表示する画面サイズによって、画像を別々にロードできる
・デザインのカスタマイズが可能

などがあります。
詳しくは、[Gumby framework の公式サイト](http://gumbyframework.com/) をご覧ください。

==

ざっくり Twitter Bootstrap との UI デザインの違いを比べるには、こちらのURLを見るのがいいと思います。

**Gumby 2 UI Kit**
http://gumbyframework.com/docs/ui-kit/

**Twitter Bootstrap 3 UI**
http://getbootstrap.com/examples/theme/


## gem を使って Gumby を入れる

まず、gumby を Rails で使うための gem を検討しました。

「gumby」で検索すると、いくつか出てきます。

![スクリーンショット_2014-07-25_14_31_26.png](https://qiita-image-store.s3.amazonaws.com/0/12033/f6073f17-371e-941e-2ac4-4e5a16d805a2.png)

GitHub の README を読んでみたり、それぞれの gem を実際に使ってみたりしましたが、
`gumby` gem というのが、README に設定方法も詳しく書かれていてわかりやすかったので、今回はこの gem を使いました。

https://github.com/afnecors/gumby

## インストール手順

`Gemfile` に以下のように書き込んで、gem をインストールします。

```Gemfile
gem 'gumby'
gem 'jquery-rails'
gem 'modernizr-rails'
```


書けたら、`bundle install` します。

```
$ bundle install --path vendor/bundle
```

次に、Modernizr を使えるように、 `app/assets/javascripts/application.js` ファイルに以下を追記します。

```app/assets/javascripts/application.js
//= require modernizr
```

Modernizr は、gem で入れなくても、ファイルを直接  `app/assets/javascripts` 以下に置く形でも簡単に読み込めます。

その場合は、 `app/assets/javascripts/application.js` の中に、

```app/assets/javascripts/application.js
//= require modernizr-2.6.2.min
```

という感じに書いておきます。


最後に、スタイルシートの読み込みです。

`app/assets/stylesheets/application.css` の中で、
Gumby を使えるように宣言します。


```app/assets/stylesheets/application.css

*= require gumby
```

これで、設定は完了です。

Rails Server を起動します。


```
$ bundle exec rails s
```

![スクリーンショット_2014-07-28_19_31_28.png](https://qiita-image-store.s3.amazonaws.com/0/12033/bc2f0fff-4946-5f13-a1f5-c1320671bf3b.png)


これで、Gumby が動いてくれました！
Entity Framework で既定のスキーマ名を変更する

ASP.NET MVC5で、PostgresでASP.NET Identityを使用する場合に、
既定のスキーマ名をdbo から public 変更する。

```csharp:MyContext.cs
public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("public");
    }
}
```
Goのtestingパッケージを使ってテストを書く


`go test`で実行するテストの書き方。

```go:string.go
package string

func Reverse(s string) string {
  b := []byte(s)
  for i := 0; i < len(b)/2; i++ {
    j := len(b) - i - 1
    b[i], b[j] = b[j], b[i]
  }
  return string(b)
```

のテストを書く場合

```go:string_test.go
package string

import "testing"

func Test(t *testing.T) {
  var tests = []struct {
    s, want string
  }{
    {"Backward", "drawkcaB"},
    {"Hello, 世界", "界世 ,olleH"},
    {"", ""},
  }

  for _, c := range tests {
    got := Reverse(c.s)
    if got != c.want {
      t.Error("Reverse(%q) == %q, want %q", c.s, got, c.want)
    }
  }
}
```

実行

```bash
$ go test
```

これだと失敗する

```bash
$ go test
--- FAIL: Test (0.00 seconds)
     string_test.go:17: Reverse(%q) == %q, want %q Hello, 世界 ��疸� ,olleH 界世 ,olleH
FAIL
exit status 1
FAIL     playground/string     0.014s
```

なので、`string.go`を変更する

```diff
 func Reverse(s string) string {
-       b := []byte(s)
+       b := []rune(s)
```

再実行

```bash
$ go test
PASS
ok       playground/string     0.015s
```

動きました。

# 参考

* [testing - The Go Programming Language](http://golang.org/pkg/testing/)
* [Writing, building, installing, and testing Go code](https://www.youtube.com/watch?v=XCsL89YtqCs)
入力した条件だけが使われる検索(柔軟な検索)を1つだけのSQL Prepared Statementで書いてみる

Webの検索画面から、RDBのカラムAとカラムBで検索結果を絞り込みたいとする。
ただしAだけやBだけといった、入力した条件だけで絞り込むこともあるとする。
このとき、AやBを指定するパターンごとにSQLを作るかもしれないが、
SQLをたくさん作るのが面倒という人もいると思われる。

##前提条件
* あるカラムで絞りこむ必要がないときは、そのカラムはNULLで入力されるものと見なす。
* またあるカラムに対して、そのカラムがNULLのものを絞り込む必要はないとする。
* ?はバインド変数とする。
* 同じ意味のバインド変数を複数入力することは避ける。

###NOT NULLのカラム編
```sql
SELECT column_a, column_b FROM a_table 
WHERE column_a = COALESCE(?, column_a) AND column_b = COALESCE(?, column_b)
```
バインド変数`?`がNULLだった際は、条件がTRUEになるので絞り込み対象外になることがポイントである。
COALESCE関数により`column_a = column_a`になるため。

###NULLありのカラム編
残念ながら上記の方法ではNULLありのカラムに対してはうまくいかない。
なぜならあるカラムが検索対象ではないときは、そのカラムがNULLであるデータが結果から漏れてしまうため。
SQL上`NULL = NULL`の結果はTRUEではなくUNKNOWNになることが理由である。
そこで上記を改良したものは以下の通り。

```sql
SELECT column_a, column_b FROM a_table 
WHERE COALESCE (column_a, 'ありえないデータA’) = COALESCE(?, column_a 'ありえないデータA’)
  AND COALESCE (column_b, 'ありえないデータB’) = COALESCE(?, column_b 'ありえないデータB’)
```
今度は左辺右辺双方のNULLを削除するのがポイントになる。
バインド変数もカラムもnullの場合、COALESCE関数により
`'ありえないデータ'='ありえないデータ'`となり条件がTRUEになる。
`'ありえないデータ'`は全部同じでも構わないものの、
型がカラムと違うほうが便利かもしれない。

##制約事項
パフォーマンスは特に意識していません。
前提に書いたとおり、NULLのカラムをNULLで絞り込むことはできません。
（CASE式を駆使すればいける？）

みなさんこういう時どうしてるのでしょうか。
天才火消しエンジニア霧島 動的計画法での試み

ナップサック問題の解法で有名な動的計画法を使ってやってみました。

```
<?php
//メイン処理
$arrSitauke = array();              //下請け会社の組み合わせ配列
$need_se_num = trim(fgets(STDIN));  //必要なプログラマ(SE)の人数
$sitauke_total = trim(fgets(STDIN)); //下請け会社の総数
if ($need_se_num > 200000 || $sitauke_total > 50) {
    exit("\n");
}
for ($si = 0; $si < $sitauke_total; $si++) {
    $arrSitauke[] = explode(" ", trim(fgets(STDIN)));
}
//動的計画法
$arrNapsack = array(0 => 0);
for ($i = 0, $i_max = sizeof($arrSitauke); $i < $i_max; $i++) {
    $se_num = $arrSitauke[$i][0];
    $price = $arrSitauke[$i][1];
    foreach ($arrNapsack as $num => $nap_price) {
        if ($num >= $need_se_num)   //もう既に必要人数がいるのでこれ以上計算する必要がない
            continue;
        if (!isset($arrNapsack[$num + $se_num]) || $arrNapsack[$num + $se_num] >= $nap_price + $price) {
            $arrNapsack[$num + $se_num] = $nap_price + $price;
        }
    }
}
//コストが低い順に並べ替える
asort($arrNapsack);
//必要条件以上の人数が最初に出てきた価格が最安値
foreach ($arrNapsack as $num => $price) {
    if ($num >= $need_se_num) {
        exit("$price\n");
    }
}
exit("\n");
```
ケース7で3秒ぐらいかかります。
0.01秒の解法は深さ優先探索で枝刈りすればいけます。
http://paiza.jp/poh/kirishima/result/ce274bd444dbf960569ea2fdab310ea0
Cocos2d-xで新しいクラスを実行させる方法


cocosコマンドで出来るプロジェクトから
自分で新しくファイルを追加したものを動作する方法のメモ

どこで起動させるか、パッと見分かりにくかったが

    AppDelegate.cpp/AppDelegate.h

ここにファイルをincludeして、

	director->runWithScene();

で指定するとシーンが実行出来る。
ローカル関数で並列処理


Poolはローカル関数を並列処理できないのでProcessを使う

```python
#! /usr/local/bin/python
# -*- coding:utf-8

import multiprocessing
from time import sleep

def foo():
    def f(j,k):
        l = j + k
        print "no:%s" % i
        sleep(5 - i)
        print "unko%s" % l
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=f,args=(i,100))
        jobs.append(p)
        p.start()
foo()
Mac の default コマンド覚え書き

参考
http://tukaikta.blog135.fc2.com/blog-entry-209.html

>defaults コマンドとは
>「plist」と呼ばれるアプリやシステムの設定ファイルに、設定値を追加、変更、削除、検索するコマンドです。このコマンドを使う事で、システム環境設定や各アプリの環境設定画面では設定できない値を設定します。ファイルパスを指定したり、先頭に sudo をつけたりしなければ、このコマンドを実行すると/Library/Preferences/以下の plist ファイルが変更されます。

```
$ls /Library/Preferences
Audio
com.apple.HIToolbox.plist
com.apple.dockfixup.plist
com.apple.timezone.auto.plist
DirectoryService
com.apple.MCX.plist
com.apple.driver.AppleIRController.plistcom.apple.updatesetings.plist
OpenDirectory
com.apple.P2PSupervisor.plist
com.apple.iPod.plist
com.apple.windowserver.plist
SystemConfiguration
com.apple.SoftwareUpdate.plist
com.apple.iokit.AmbientLightSensor.plistcom.apple.xsanmgrd.plist
Xsan
com.apple.TimeMachine.plist
com.apple.loginwindow.plist
com.microsoft.PlayReady.plist
com.apple.BezelServices.plist
com.apple.airport.opproam.plist
com.apple.noticeboard.plist
com.oracle.java.Helper-Tool.plist
com.apple.Bluetooth.plist
com.apple.alf.plist
com.apple.security.appsandbox.plist org.cups.printers.plist
com.apple.ByteRangeLocking.plist
com.apple.apsd.launchd
com.apple.security.plist
com.apple.CoreRAIDServer.cfdb
com.apple.apsd.plist
com.apple.security.systemidentities.plist
com.apple.FindMyMac.plist
com.apple.captive.plist
com.apple.storeagent.plist
```

$defaults write filename：設定値の追加と変更
$defaults delete filename：設定項目の削除
$defaults read filename：設定ファイルを表示
$defaults find word：設定項目の検索
MacにIntelliJ IDEAでGolangの開発環境を構築する


IntelliJ IDEAとHomebrewでインストールしたGolangで開発環境を構築した時にハマったのでメモ。

## 環境
* Mac OS X Marvericks 10.9.4
* [Homebrew 0.9.5](http://brew.sh/)
* [IntelliJ IDEA Community Edition 13.1.4](http://www.jetbrains.com/idea/)

## GolangをHomebrewでインストール
下記コマンドでGolangをインストール

```bash:Terminal
$ brew install go
$ go version
go version go1.3 darwin/amd64
```

## 環境変数にGOROOTとGOPATHを追加
`.bash_profile`もしくは`.bashrc`に __GOROOT__ と __GOPATH__ を追加します。
__GOROOT__ に設定するパスは`/usr/local/opt/go`ではなく`libexec`まで指定する必要があります。(ここでハマりました)

```bash:.bash_profile
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
```

[ここ](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/blob/master/Missing%20ENV.md#--mac-os-x)を参考に`/etc/launchd.conf`にも同じ値を追加します。
`/etc/launchd.conf`が存在しない場合は、新規作成してください。

```bash:launchd.conf
setenv GOROOT /usr/local/opt/go/libexec
setenv GOPATH $HOME/.go
```

最後に下記コマンドで環境変数を反映します。

```bash:Terminal
$ source ~/.bash_profile
$ launchctl < /etc/launchd.conf
$ echo $GOROOT
/usr/local/opt/go/libexec
$ echo $GOPATH
/Users/Yourname/.go
```

## IntelliJ IDEAにGolang環境を構築
* IntelliJ IDEAのPluginsで[Go language support plugin](https://github.com/go-lang-plugin-org/go-lang-idea-plugin)をインストール＆再起動
* [Create New Project]でGoのプロジェクトを作成し、SDK選択画面で[Configure...]から`GOROOT`を選択
* プロジェクト作成後に`GOROOT`、`GOPATH`に関するエラーが表示されなければ構築完了

![intellij_golang.png](https://qiita-image-store.s3.amazonaws.com/0/48728/8044d6d6-d33e-39d1-8934-941de8fcb5b0.png "intellij_golang.png")

## 備考
PhpStormでも同様の手順で環境構築ができます。

## 謝辞
@abe00makoto さん__GOROOT__の指定についてご指摘いただき、ありがとうございます。
ダンボールでヘッドマウントディスプレイを雑に自作してみた #AR_fukuoka #Cardboard


2014/8/2に参加した「ARコンテンツ作成勉強会」」で、@Taka_Yoshinagaに見せていただいた段ボール製VRヘッドセット「Cardboard」にいたく感銘を受けてしまい、早速作成してみました。

##必要なもの
###素材
ダイソー「とげ抜きルーペ」(NO.13203)x2

![とげ抜きルーペ](https://dl-web.dropbox.com/s/x28olbunr9xo8yc/2014-08-03%2019.47.07.jpg)


これを外してレンズにします。

ダイソー「強力マグネット 25個入り 1個600Gs」(No372)

![強力マグネット](https://dl-web.dropbox.com/s/pluaep4f3mrfhqf/2014-08-03%2011.44.13.jpg)


2個使います。これでなんか操作ができちゃいます。

ダイソー「ファスナーテープ接着タイプ巾25mm 30cm」(No.24)

![ファスナーテープ](https://dl-web.dropbox.com/s/4jtmw0mv3f7srwj/2014-08-03%2018.37.57.jpg)


「段ボール」
なるべく厚みがないものが楽です。
Amazonのやつは厚みがあって結構大変でした・・・

###ソフト
https://play.google.com/store/apps/details?id=com.google.samples.apps.cardboarddemo

サンプル的な。


###その他必要なもの
「デザインナイフ」「コンパスカッター」
　ダイソーで売ってます。
　こんなん


「根気」
　意外と細かい・・・


##作業その１　設計図を印刷
「Cardboard」のホームページから設計図をダウンロードして印刷します。

ページの真ん中あたりにある「Cardboard Design Files」をタップすると、PDFでダウンロードすることができます。

![ここからDL](https://dl-web.dropbox.com/s/sm4g8jfdj8p7kas/Cardboard.jpg)


##作業その2　設計図を段ボールに貼り付けて、切り抜きします。

設計図をテープではりつけ、デザインカッターでひたすら切り抜きました。
ひたすら切り抜きました。

大事なことなので二回言いました。

![切る！斬る！](https://dl-web.dropbox.com/s/30hl58alj8s3s6u/2014-08-03%2015.56.18.jpg)


##作業その3 組み立てその１ レンズをセット

ダイソー「とげ抜きルーペ」を力任せにぶちぬいてください。
刃は逆向きなので大丈夫だと思う。

こんなかんじに。

![ぶちぬく](https://dl-web.dropbox.com/s/rfgkec11xnkl471/2014-08-03%2019.47.52.jpg)


そうすると、黒枠が残ってあらまぁ、穴にぴったりフィット！！

![切る！斬る！](https://dl-web.dropbox.com/s/rkmi0diy6p0v1bs/2014-08-03%2019.12.27.jpg
)

内向きに黒枠がくるようにセットするといいのかな？（ちょっと自信がない）

![つける](https://dl-web.dropbox.com/s/xxd2qez7a4p3x47/IMG_20140803_215826.jpg)


あとは段ボールを折り曲げます。
輪ゴムでとめとくと後で調整できるので、自分と同じような作業が雑なひとにオススメ

![折り曲げる](https://dl-web.dropbox.com/s/b2rz940zzg6clpu/2014-08-03%2019.21.32.jpg)




##作業その4 組み立てその2 磁石をセット

所定の位置に磁石をセットします。

![磁石セット](https://dl-web.dropbox.com/s/zmrh19tiuge1l41/2014-08-03_18_54_40.jpg)


どういう仕組みかわかってませんが、「Cardboard」の決定ボタンになります。

![磁石ボタン](https://dl-web.dropbox.com/s/1vh6a7hvan97qt2/2014-08-03%2021.24.11.jpg)



##作業その5 組み立てその３　折り曲げ

正直最初はまりました・・・・どっちにどうくみたてんのーみたいなかんじで。

![組み立て前](https://dl-web.dropbox.com/s/yr8r5ag9m8mktj9/2014-08-03%2018.54.34.jpg)



オフィシャルサイトの折り曲げ動画をジーっと眺めてなんとか完成!!

名刺と比較するとこんくらいの大きさ

![磁石ボタン](https://dl-web.dropbox.com/s/4z7q2fa17r29ldh/2014-08-03%2022.07.56.jpg)



##Cardboardのいいところ

1.安い
 材料費だけでいえば、400円ですよ！
　段ボールはたいがい家にAmazonの箱の5個や6個ある人が多いし！
　磁石とファスナーは余るので、複数人で作ればもっと安い。

 今回いろいろ失敗した俺の屍を越えて行け！！（涙）

2.カメラからリアルの映像を取り込める
 これはとてもとても可能性を秘めていると感じました。
 リアルと仮想現実の接点がグッと近くなると思う。
 イベントで使えば没入感がめちゃくちゃでるはず。
 
 junaioでCardboardに対応したARコンテンツが簡単につくれちゃうのです。
![junaio](https://dl-web.dropbox.com/s/pcvsx6h7nx1tsmw/Screenshot_2014-08-03-22-09-44.png)

 
##結論
　すげーーーー！！

　段ボールで夢広がりました。
　いろいろいじり倒していきたいです！！


##スペシャルサンクス
・AR勉強会主催の吉永さん
　いつも楽しい勉強会をありがとうございます。
　資料や進め方といった勉強会のつくりかたそのものも勉強させてもらっています。
http://vizyoshinaga.sblo.jp/article/67826388.html


・宮地さん
　触らせて頂いて感動しました！人力は大変でした・・・

http://d.hatena.ne.jp/eryngii_mori/
fluentdのexec Output PluginでPythonプログラムを使う



実戦で使い始めて1週間ですがfluentdとても便利。そしてexec Output PluginでPythonプログラムにデータを渡してみる。

## 起動コマンド

[ドキュメント](http://docs.fluentd.org/articles/out_exec)にあるPythonの例は次の通り。

```td-agent.conf
<match fizzbuzz>
  type exec
  command python /path/to/fizzbuzz.py
  buffer_path    /path/to/buffer_path
  format tsv
  keys fizzbuzz
  flush_interval 5s # for debugging/checking
</match>
```

が、実際に使う時はvirtualenvで入れたPythonを指定したいし、PYTHONPATHどうなるのこれ、という疑問もあったので```command```の指定はこうしてみた。

```td-agent.conf
  # pythonはvirtualenvで入れた物を指定
  # 自分のコードであるmyappはsetup.pyを書いて予めパッケージインストールしておく
  command /path/to/myapp/bin/python −m myapp.command.xxxx arg1
```

これでPYTHONPATHは気にしなくても良いし、ファイルパスを長々と書かなくても済む。setup.pyは面倒くさがらずに書こう。

環境変数をセットしようとして


```td-agent.conf
  # 環境変数を指定 (エラーになる)
  command HOGE=FUGA /path/to/myapp/bin/python -m myapp.command.xxx arg1
```

とすると次のエラーになってしまった。何か渡したい時は引数を使えと。32512なんて初めて見た。

```td-agent.log
2014-08-03 17:59:54 +0900 [warn]: temporarily failed to flush the buffer. next_retry=2014-08-03 17:59:57 +0900 error_class="RuntimeError" error="command returns 32512: HOGE=FUGA /path/to/myapp/bin/python /path/to/myapp/myapp/command/xxx.py /path/to/buffer_path/.20140803.q4ffb5d85bf81f0d4.log"
```

## 実行ファイル

引数の最期にバッファファイルのパスが渡される。1行ずつ読んで処理するコードはこんな感じになる。テストコードから各処理を呼びたい場合はメソッドを分けておく。ファイルの読み込みから最後の処理までストリーム処理にしてあげると綺麗に書けるのと、PyMongoであればジェネレータをそのままCollectionのinsertメソッドに渡せるのでパフォーマンスも良い。

```python:/path/to/myapp/myapp/command/xxx.py
# coding=utf-8

import json
import logging
import logging.config
import traceback

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('fluent-exec-out')

def main():
	file_path = parse_args()
    do_something(exclude_error_row(parse(readline(file_path))))

def parse_args():
	return sys.argv[-1]

def readline(file_path):
    with file(file_path) as input:
        for line in input:
            yield line

def parse(lines):
	# 入力フォーマットをjsonとした場合
    for line in lines:
        yield json.loads(line)

def exclude_error_row(rows):
    for row in rows:
        # バリデーションとログ出力
        if xxxxxx:
			logger.warn("Invalid line found %s", row)
			continue
       yield row

def do_something(rows):
	# なにかやる


if __name__ == '__main__':
	logger.info('Start')
	try:
		main()
	except:
		logger.error(traceback.format_exc())
	logger.info('End')
```

### テストコード

mainメソッドのテストはfluentdから渡されるバッファファイルと同じ形式のファイルを作って、引数に渡せば良い。

```python:test_xxx.py
# coding=utf-8

from nose.tools import ok_, eq_

from myapp.command import xxx

original_argv = sys.argv

class TestAll(object):
	def teardown(self):
		sys.argv = original_argv

	def test_main(self):
		sys.argv.append('./tests/data/fluentd_buffer.log')
		xxx.main()
		# 何かテストする

	def test_readline(self):
		gen = xxx.readline('./tests/data/fluentd_buffer.log'):
		# 何かテストする
```

### ログ出力

[fluent-logger-python](https://github.com/fluent/fluent-logger-python)なんかを使って、さらにログをfluentdに渡すとかっこいいかもしれない。

### フィルタ処理

上記コードではフィルタ処理もやっているが、exec_filter Output Pluginを使って一つ前のmatchでやるのがfluentd的には綺麗かもしれない。どっちでも出来るので好みの問題かな。

フィルタ処理程度なら一つのexec Outputでまとめてやっても良いと思うが、いくつもの処理を詰め込みすぎると途中で処理がコケたらどうするの、という心配毎が増える。exec Outputを分けて別々のコード呼び出しにした方が良いだろう。
SwiftでInt型に素数かどうか判定するメソッドを追加

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/a/alex23drum/20140803/20140803222155.png" alt="prime" title="prime" style="border:none;">
今回はSwiftのextensionを使って、Int型に素数かどうかを判定するメソッドを追加したいと思います！！

## 「extension」って何？

extensionは既存の型に新たな機能を後から付け加えることの出来る機能です。
書き方としては、

```
extension 拡張したい型 {
    拡張する機能
}
```
このような記述をして使います。

## Int型に素数かどうか判定するメソッドを追加してみよう！

では、このextensionを使ってInt型に素数かどうかを判断するインスタンスメソッドを追加してみましょう！

```swift
extension Int {
  
  // judge the number is a prime or not
  func is_prime() -> Bool {
    var arr: [Int] = []    // store divisors
    for num in 1...self {
      // find divisors
      if self % num == 0 {
        arr += num
      }
    }
    if arr.count < 3 && self != 1 && self > 0 {
      return true
    } else {
      return false
    }
  }
}

8.is_prime()    // return false
11.is_prime()   // return true
```

以上です。お疲れ様でした^^

## ブログやってます！

[その時凡人が動いた](http://alex23drum.hatenablog.com)
vagrantとchefとdockerによるRails開発環境構築(vagrantの簡単な操作)

#vagrantで利用する可能性が高いコマンドをまとめておきます。

##sshによる通信
```
$ vagrant ssh
```

##仮想サーバの終了
```
$ vagrant halt
```

##仮想サーバの破棄
```
$ vagrant destroy
```

##仮想サーバの再読み込み
```
$ vagrant reload
```

##仮想サーバの稼動ステータス表示
```
$ vagrant status
```

随時更新していくので、コメント等をお待ちしています。
Scrapy を使ってクローリング


## Scrapyを使っていて怒られたこと

### Unknown command: crawl
scrapy crawl <project> -o <file>
を実行したときに現れた。

カレントディレクトリがプロジェクト外のときにコマンドを打つとなるらしい

### UserWarning: You do not have the service_identity module installed.
scrapy crawl <project> -o <file>
を実行したときに現れた。

service_identityというモジュールがpythonの中に入っていないといけないらしい

`pip install service_identity`
で解決
vagrantとchefとdockerによるRails開発環境構築(centosを導入)

#vagrantによるcentos立ち上げ
　vagrantで仮想サーバを立ち上げるには、initによる初期化とupによる立ち上げが必要なので、早速行ってみる。

```
$ vagrant init centos
$ vagrant up
```

　おっとエラーが発生してしまいました。

```
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

Couldn't open file 
実行ディレクトリ/centos
```

　つまり、centosなんてファイルはないぞ！と言ってるんですね。
　vagrantのosを提供しているところを探してみると、いいところ発見！
　http://www.vagrantbox.es/
　ここだと、virtualboxからvmwareやparallelsまで提供しているんですね。
　では、早速利用してみます。
　一覧にあるosから好きな場所のurlをコピーして、vagrant box addで追加すればいいです。
　今回はvirtualboxのcent os6.5を利用してみます。

```
$ vagrant box add centos https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```
　osを取得してるんで、しばらく時間がかかります。
　追加が終わったら、再度実行。

```
$ vagrant up
```

　またしても、エラーがでた。
　次は、なんだろうか。

```
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.
```

　つまり、もうvirtualboxが動いているから実行出来ませんといっているのかな？
　状態を確認してみるかな。

```
$ ps aux | grep vagrant
$ vagrant status
```

　別に動いていなそう。
　原因不明なので、GUI起動をtrueに変更。
　vagrant initを行ったときに作成されたVagrantfileを編集する。

```Vagrantfile
  ###　変更前
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Don't boot with headless mode
  #   vb.gui = true
  #
  #   # Use VBoxManage to customize the VM. For example to change memory:
  #   vb.customize ["modifyvm", :id, "--memory", "1024"]
  # end

  ### 変更後
  #
  config.vm.provider "virtualbox" do |vb|
    # Don't boot with headless mode
    vb.gui = true
  #
  #   # Use VBoxManage to customize the VM. For example to change memory:
  #   vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
```

　再度実行してみるとvirtualboxでエラーがでていた。

```
Kernel driver not installed (rc=-1908)

Make sure the kernel module has been loaded successfully.
```

　調べてみると、virtualboxの再インストールで解決できるようなので、再インストールを行ってみる。

```
$ vagrant up
```

　起動後のdefaultは

```
user: root
password: vagrant
```

　vagrantの起動まで終了です。

##vagrantにnginxの導入とchef等について
　vagrantとnginxについては別ページに用意しています。

http://qiita.com/ogi1003/items/60a2aa6f175f1702e7b8
npm searchの実行時にエラー


## 実際に遭遇したエラー

npmを使用して、あるパッケージをインストールしようとしたところ、見慣れないエラーが発生した。

	$ npm search yeoman-generator
	npm http GET https://registry.npmjs.org/-/all/since?stale=update_after&startkey=1407061252696
	npm http 200 https://registry.npmjs.org/-/all/since?stale=update_after&startkey=1407061252696
	npm ERR! TypeError: Object.keys called on non-object
	npm ERR!     at Function.keys (native)
	npm ERR!     at stripData (/usr/local/lib/node_modules/npm/lib/ search.js:89:28)
	npm ERR!     at Array.map (native)
	npm ERR!     at filter (/usr/local/lib/node_modules/npm/lib/search.js:73:6)
	npm ERR!     at /usr/local/lib/node_modules/npm/lib/search.js:63:21
	npm ERR!     at /usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:89:14
	npm ERR!     at Object.oncomplete (fs.js:107:15)
	npm ERR! If you need help, you may report this log at:
	npm ERR!     <http://github.com/isaacs/npm/issues>
	npm ERR! or email it to:
	npm ERR!     <npm-@googlegroups.com>

	npm ERR! System Darwin 13.3.0
	npm ERR! command "node" "/usr/local/bin/npm" "search" "yeoman-generator"
	npm ERR! cwd /Users/XXXXXXXXXXXXXX
	npm ERR! node -v v0.10.12
	npm ERR! npm -v 1.2.32
	npm ERR! type called_on_non_object
	npm ERR! 
	npm ERR! Additional logging details can be found in:
	npm ERR!     /Users/XXXXXXXXXXXXXX/npm-debug.log
	npm ERR! not ok code 0

## いつnpmをインストールしたのか？
意識してnpmをインストールした記憶は無かった。頑張って思い返したところ、以前yuidocを使うために、node.jsをインストールしたのだが、この「node.js」にnpmが含まれていたようである。

## 解決方法
[ここ](https://github.com/npm/npm/issues/3443)の記事に、以下のコメントを載せている人がいた。

	I was able to resolve this by running:

	sudo npm update -g

	Then deleting the package.json and re-running:

	npm init

読むと、npm自身をアップデートすることで解消したとの事。試しに自分の端末で実行した所、私の環境下においては、npmバージョンが「1.2.32」から「1.4.23」にバージョンアップされ、無事に解決できた。

## 補足として
npmをバージョンアップして、最初にnpmを実行するとローカルインデックスを作成するようで、少し時間を必要とするようだった。

	$ npm search yeoman-generator
	npm WARN Building the local index for the first time, please be patient
英語で学ぶHTML+CSS, PHPのオススメサイト

#英語で学ぶHTML+CSS, PHPのオススメサイト
##HTMLとCSSを英語で学ぶオススメサイト
　[Dash](https://dash.generalassemb.ly/projects)

##PHPを英語で学ぶオススメサイト
　[codecademy](http://www.codecademy.com/learn)

英語の書籍を読む前にこれをやっとくと楽になるかも :exclamation: :question:
Chrome拡張のポップアップでCDNのjQueryを読み込む


セキュリティ的な制約から割と面倒だったのでメモ。

manifest.jsonに

```json:manifest.json
{
"content_security_policy": "script-src 'self' 'unsafe-eval' https://ajax.googleapis.com/ ; object-src 'self’"
}
```

を追加し、popup.htmlで

```html:popup.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
```

と書くだけ。


ただし、popup.htmlでしか使えないので、 
background.htmlとかで使いたい場合はやっぱりローカルに入れる必要がある模様。
td-agent2をCentOSにインストールする



## まず既存のtd-agentを削除
```bash
yum --setopt=tsflags=noscripts remove td-agent
yum --setopt=tsflags=noscripts remove td-agent2
```

## インストール
```bash
curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## 必要なpluginをインストール
```bash
PLUGINS="forest mysql-replicator record-reformer elasticsearch file-sprintf"
for PLUGIN in $PLUGINS; do td-agent-gem install fluent-plugin-${PLUGIN};done
```

### pluginが入ってるか確認
```bash
ls -l /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/
```

## 起動(service名はtd-agent)
```bash
sudo /etc/init.d/td-agent restart
```
抽象ファクトリメソッドのためのテンプレートクラスを作ってみた

※デザパタのAbstractFactoryと紛らわしいけど違うっぽい...でもGoFのアレは「パターン」と呼べるのか？

...ともかく、抽象クラスのファクトリメソッドを呼んだら適切な具象クラスのインスタンスがnewされて返ってきたら便利だと思わないか？

だが親クラスは子クラスの実装は知らないのが原則(解放/閉鎖)なので普通にC++だけで組むと子クラスのファクトリメソッドを呼べなくて実装不可能...だと思ってたんだけど、ふと思いついてそれを可能にするテンプレートクラスを作ってみた。

```cpp
template<typename T> class FACTORY{
	FACTORY();
	FACTORY(const FACTORY&);
	void operator=(const FACTORY&);
public:
	FACTORY(T* (*f)()) :
		next(start),
		factory(f){
			start = this;
		};
	static T* New(){
		for(FACTORY* f(start); f; f = (*f).next){
			T* const t(((*f).factory)());
			if(t){
				return t;
			}
		}
		return 0;
	};
private:
	static FACTORY* start;
	FACTORY* const next;
	T* (*const factory)();;
};
```
こんな感じ。
FACTORY<親クラス>で使う。
親クラス側で、

```cpp
FACTORY<親クラス>::start(0);
```
をstaticに作っておいて子クラス側で、

```cpp
FACTORY<親クラス> hoge(子クラスのファクトリメソッド)
```

とこれもstaticにインスタンスを作る。

するとstartはただの値なのでメモリに読み込んだ時点で初期化されてて、その後グローバルコンストラクタがファクトリメソッドを持ってるインスタンスを登録してくれるという寸法。あとは親クラスのファクトリの中で、

```cpp
FACTORY<親クラス>::New();
```
するようにしとくと登録されたファクトリメソッドを順繰りに(でも指定はできない)呼び出してどれかが0以外の値を返したらその値が、でなければ0が帰ってくる。

当然子クラスのファクトリメソッドは自分がnewされるべきかどうか自分で調査しなきゃならない。例えば所定のデバイスファイルが存在するかどうかを調べるようにするとインターフェイスはそのままで、つながってるデバイスに合わせて適切なクラスを選択できる。もともとはOculusRiftのDK1とDK2を区別するために作ったものだし。

それと、今のところ子クラスのファクトリメソッドは「親クラス* (*)()」のみだけど、ファクトリメソッドをテンプレートで受けてうまく作ればもうちょっと色々できるかも。あと、グローバルコンストラクタを使ってるのでmainに入る前の動作は保証できない。

そうそう、このコード自体のライセンスはGPL3ね。GPLは著作権なのでGPLが嫌なら書き直してねー。
MySQL初級者を脱するために勉強してること -調査編-


テーブルを4,5個結合して表示するような管理画面や大量のデータを扱うようなバッチ処理を作成していると、
重くて画面が描画されるまでに時間がかかる、定期的にまわすバッチ処理が終わらない…なんて事に直面する事がよくある。
欲しいデータを取得するくらいにはSQL書けるし、システム要件を満たすくらいにはテーブル設計は出来る、そんな僕が中級者を脱するために勉強している内容を備忘録的に書き綴ります。

予約語は大文字 その他は小文字で記述しています。

間違ってるところやチューニング方法があればコメントで教えていただけると幸いです。

## スロークエリ

まずはボトルネックとなっているSQLをあぶり出す事からはじめる。
MySQLには処理に時間がかかっているSQLを物理ファイルに書き出してくれる機能があるので、その機能自体を有効にする事からはじめる。
出力されたログファイルは実行に時間がかかっている順に出力されるため、ファイルの上位にあるSQLから見て行くと良い。

ただし下記設定を行うとログの書き出しなどに時間がかかったり、ハードディスクの容量を圧迫したりするので、本番のサーバでは行わず開発環境で行うようにする。
必要なログの集計が完了したら、必ずパラメータは元に戻すこと。

```sql:sql
-- スロークエリのログを取る
SET GLOBAL slow_query_log = 1;
-- ログ出力先
SET GLOBAL slow_query_log_file = '/tmp/slow_query.log';
-- ログを取るSQL実行時間 下記例だと1秒以上かかっているSQLのログを取得
SET GLOBAL long_query_time = 0;
```

### SQLの分析
スロークエリが抽出出来たらそのSQLの先頭にEXPLAINを追加して実行してみる。

![スクリーンショット 2014-07-31 3.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/35451/f7850f31-8af2-ede0-ff70-4e22e2cb2e8a.png "スクリーンショット 2014-07-31 3.52.33.png")

Using filesortとUsing temporaryは最悪な組み合わせ
Using filesortはソートに必要な領域がメモリ上に乗り切らずに物理ファイルに書き出しソートを行う。
Using temporaryはクエリを実行するのにテンポラリテーブルが作られる。
リアルタイム処理を行うようなシステムの場合はUsing filesortとUsing temporaryが表示されたら改善必須

対策としては、SQLがインデックスを利用するように修正するかINDEXをテーブルに作成する。
INDEXは別の記事にまとめます。

## パラメータ
漢のコンピュータ道さんの[MySQLを高速化する10の方法](http://nippondanji.blogspot.jp/2009/02/mysql10.html "MySQLを高速化する10の方法")を参考にさせていただいたので、
内容はほぼほぼ同じ…何かあれば追記していきます。

### innodb_buffer_pool_size
InnoDBだけを利用する場合は空きメモリの7〜8割程度を割り当てる最も重要なバッファである。
実際にはここで割り当てた値の5〜10%ぐらいを多めにメモリを使うので注意が必要。

> 引用 漢のコンピューター道

空きメモリを計算するにはvmstat -aコマンドを利用する。
![スクリーンショット 2014-08-03 19.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/35451/57504dcd-4f0e-ecb3-8255-c8b14374cb39.png "スクリーンショット 2014-08-03 19.37.28.png")
freeとinactの値を足した物が空き容量でfreeは言葉通りだがinactはページキャッシュや無名ページのうち、ストレージとの同期も完了しているためすぐに解放される領域
activeはページキャッシュや無名ページのうちストレージとの同期が完了していないすぐには解放されない領域

上記の例だと51888 + 141024 = 192921Kバイトである。メガバイト表記にしたい場合は-SオプションでMを指定するとメガバイト表記になる。
vmstat -a -S M

時間帯によってトラフィック量が変わるようなシステムの場合は当然一番トラフィックが集中する時に計測しないと意味がない。
一つのマシンにDBとWebサーバを同居させている場合はなおさら。

### key_buffer_size
INDEXをメモリにどれだけのせるかという値デフォルトでは8Mバイトらしいので、MyISAMだけを利用する場合は、空きメモリの3割程度割り当てると良い。
> 引用 漢のコンピューター道

一方InnoDBの場合はデータもインデックスもMySQLがキャッシュ管理するためinnodb_buffer_pool_sizeの方が重要っぽい。この辺は実際に試していないので、ちょっと不安



### sort_buffer_size
ソート処理に利用するバッファである。OLTPでは256K〜1Mぐらいを割り当てると良い。これがあまり大きすぎると、メモリの割り当てのオーバーヘッドが大きくなるので注意しよう。DWH系の処理などで大きなソートが必要な場合、セッションごとに動的に調整すると良い。
> 引用 漢のコンピューター道

### read_buffer_size
全体スキャンする時に利用するバッファ。
OLTPでは128K〜512Kぐらいを割り当てると良い。
> 引用 漢のコンピューター道

### read_rnd_buffer_size
ソート処理でインデックスを利用する場合に利用するバッファ。
OLTPでは256K〜1MぐらいをDWH系の処理などで大きなソートが必要な場合、セッションごとに動的に調整すると良い。
> 引用 漢のコンピューター道

### RDSの場合
RDSでMySQLサーバ(InnoDB)を作成している場合はチューニングはほぼほぼRDSが自動でやってくれるため、
パラメータの変更などは必要ないらしい。
唯一必要なのはlatin1から文字コードを変更するくらい。

## 参考にさせていただいたサイト
漢のコンピュータ道 [MySQLのEXPLAINを徹底解説!!](http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html "MySQLのEXPLAINを徹底解説!!")
漢のコンピュータ道 [5.1のスロークエリログ](http://nippondanji.blogspot.jp/2009/01/mysql-51.html "5.1のスロークエリログ")
漢のコンピュータ道 [やってはいけない!!MySQLに悲鳴をあげさせる10の方法](http://nippondanji.blogspot.jp/2009/04/mysql10.html "やってはいけない!!MySQLに悲鳴をあげさせる10の方法")
特定のリポジトリのuser.nameとuser.emailを変える

Gitを入れたときに以下のコマンドでユーザー情報設定しました。

```
$ git config --global user.name "name"
$ git config --global user.email "sample@sample.com"
```

特定のリポジトリでは、このuser.nameとuser.emailを使いたくないってのが出てきた場合、変更したいリポジトリに移動して以下をたたけばOK。
git commitの前に設定しないと、変更されません。

```
$ git config user.name "name2"
$ git config user.email "sample2@sample.com"
```

設定した情報はこれで確認できます。

```
$ git config -l
```
RuboCop | Style/VariableName

# RuboCop | Style/VariableName

## 概要

RuboCopの「Style/VariableName」警告について。

変数名をチェックします。
デフォルトはsanake caseを正とします。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|EnforcedStyle|snake_case|sanake caseではない場合は警告する|○|
|EnforcedStyle|camelCase|camel caseではない場合は警告する|--|

## VariableName

各設定値での検証結果をまとめます。

### 検証プログラム

variable_name.rb

~~~ruby
snake_case = 'snake case'
puts snake_case

camelCase = 'camelCase'
puts camelCase
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

~~~yaml
VariableName:
  EnforcedStyle: snake_case
~~~

~~~bash
$ rubocop variable_name.rb
Inspecting 1 file
C

Offenses:

variable_name.rb:4:1: C: Use snake_case for variables.
camelCase = 'camelCase'
^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 camelCase に設定します

.rubocop.yml

~~~yaml
VariableName:
  EnforcedStyle: camelCase
~~~

~~~bash
$ rubocop variable_name.rb
Inspecting 1 file
C

Offenses:

variable_name.rb:1:1: C: Use camelCase for variables.
snake_case = 'snake case'
^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/variable_name.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/variable_name_spec.rb

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
HomeBrewでPythonがインストールできない(at Mavericks)

HomeBrewでpython入れようとしたらzlibないよエラー

~~~
$ brew install python
(中略)
==> /usr/local/Cellar/python/2.7.3/bin/python -s setup.py --no-user-cfg install 
  File "/private/tmp/__UNKNOWN__-BJ7g/distribute-0.6.34/setuptools/command/bdist_egg.py", line 540, in make_zipfile
    z = zipfile.ZipFile(zip_filename, mode, compression=compression)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 681, in __init__
    "Compression requires the (missing) zlib module"
RuntimeError: Compression requires the (missing) zlib module
~~~

XCodeツールを入れたら無事インストールできました

~~~
xcode-select --install
~~~

参考URL
http://qiita.com/soramugi/items/aff9234b08ff1c3b4f46
【初心者】modelでのscopeの使い方

そもそもscopeってなんぞや。
scopeとは、メソッドを共通化もしくは部品化という役割を果たしてくれる素晴らしい機能です。

つまり、様々な箇所で何回も使うようなメソッドをscopeでくくることでデフォルトで定義している引数が変わったときや、参照元が変更した際に、各々のファイルに書いている同じメソッドを変える必要はなく、scope内のメソッドを変更すれば万事解決という利点があります。

具体的な書き方は以下の通りです。

```hoge.rb
class Hoge < ActiveRecord::Base
  scope :fuga -> {where("user_id = 1")}
end
```

```hoge_conntroller.rb
class HogeController < ApplicationController
  def index
    hoge = hoge.fuga
  end
end
```
CORS(Cross-Origin Resource Sharing)をexpress4で実現する


express4になってCORSにもハマったのでメモ。
WebStormなどを使ってlocalhostの任意のポートでデバッグをしているとSame origin policyにかかって涙目になる人は多いかと思います。そんなときは、サーバー側でcorsに対応して簡単に回避がしたいことがあるかと思います。
そこで、express4でcorsを実現してみます。
前提として、expressコマンドでひな形を作っているとします。

1. [corserミドルウェア](https://www.npmjs.org/package/corser)を使うのでcorserをインストール  
``` 
$ npm install corser
```
2. node.jsのサーバー側のソースコードに以下を追加します。通常はapp.jsです。  


``` javascript:app.jsへ追加 
var corser = require("corser");
app.use(corser.create());
```

これで、CORSが実現できます。app.getやapp.postを事前に捕まえててrequest headerに"Access-Control-Allow-Origin"を追加する方法などもググれば出てきますが、（例えば[ここ](https://gist.github.com/cuppster/2344435)）corserを使うのが一番簡単だと思います。
セキュリティにはくれぐれもご注意を。
ecors
vagrantとchefとdockerによるRails開発環境構築(はじめに〜インストール)

#はじめに
***
　最近、devopsという言葉をよく聞きます。そこで、devopsでよく話しにあがる技術である、「vagrant」と「chef」と「docker」による開発環境を構築していきたいと思います。
　また、開発環境を構築した後は、「jenkins」によるCI(継続的イテレーション)を組み合わせて、テスト環境等についても行っていきたいと思います。
 ＊環境: MacOS version 10.9.4

#devopsとは？
***
　devopsaとは、「dev(開発者)」と「ops(運用者)」が互いに協力して、継続な成果を出していき、対応速度の向上を行うこと。ただ、現状では理解は高くなく、運用者は稼働中のシステム変更から起きる不具合等を嫌い、開発者はアジャイル等で継続的に開発を行って成果を出すたびに衝突や運用者の負担ということが大きくなってストレスのもとになっているようです。

#vagrantとは？
***
　最近、注目を浴びているVM(仮想化ソフトウェア)上で動作するOSS(オープンソースソフトウェア)で、仮想サーバを簡単に構築できるツールです。

#chefとは？
***
　rubyを使用して、設定を記述し、自動的にユーザ作成やパッケージをインストールすることができるようです。

#vagrantのインストール
***
　vagrantの公式サイトからインストーラをダウンロードして、実行します。インストール方法は手順が載っているので、参考にしてください。
　http://www.vagrantup.com/downloads

#chefのインストール
***
chefをインストールする前には、rubyをインストールする必要があります。私はrbenvというrubyのバージョン管理を使用しています。

参考までに
　1.rbenvのclone
　　https://github.com/sstephenson/rbenv

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

　2.rbenv installのclone
　　https://github.com/sstephenson/ruby-build

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

　3.chefのインストール

```
$ gem install chef
```

　以上でインストールは完了です。
[Ruby] Net::FTP で FTP サーバー上のファイルのパーミッションを変更する

Ruby から FTP サーバー上のファイルのパーミッションを変更する場合は、`SITE CHMOD permission filename` というコマンドを `sendcmd` メソッドに渡すことで実現できました。下記は動作確認ができたサンプルコードです。

```ftp.rb
require "net/ftp"

ftp = Net::FTP.new
ftp.connect("YOURHOSTNAME")
ftp.login("YOUUSERNAME", "YOURPASSWORD")
ftp.chdir "path/to/directory"
ftp.sendcmd "SITE CHMOD 0644 index.html"
ftp.close
```

下記を参考にしました。ありがとうございます。
https://www.ruby-forum.com/topic/188626
指定のクラスを複数のタグに追加したり、削除したりをtoggleするjQueryプラグイン


1回目にクリックした時は例えば「on」というクラスが付き、2回目クリックした時は「on」が削除されるような場合に使えます。

クリック時に複数のクラスを変えたい場合などに、jsを書き換える必要がないような仕組みにしています。

割りと使う機会が多い機能でなのに、いままでプラグイン可していなかったので使いやすいようにプラグイン化してみました。

GitHub: https://github.com/kamem/jquery.dataExtend

（jQuery.dataExtedの説明と合わせて同じリポジトリに入っています。）

[DEMO]
[DEMO]: http://github.develo.org/jquery.dataExtend/extraToggleClass.html


仕様
------
1. クリックしたタグのクラスをtoggleする。
2. 他要素もしたい場合は「content_（toggleしたいタグのクラス名）」のように指定する。
3. ストレージ保存可能。


使い方
------
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.tab.js"></script>
    <script type="text/javascript">
	$(function(){
		 $('.toggle').extraToggleClass();
	});
	</script>


###  html ###
	<p class="toggle content_test">toggle click</p>

	<p class="test">test</p>
	<p class="test">test</p>


* 「content_test」「content_」の後の文字（例の場合test）クラスが付いているタグのクラスも一緒にtoggleします。



### 初期設定 ###

	name: 'on',
	isSessionStorage: false

 * name: {String} toggleしたいクラス名
 * isSessionStorage: {Boolean} ストレージに保存するか
FLEXLM Floating License Service On Ubuntu 14.04

# 何が起きたか？

ubuntu 14.04LTS で FLEXLM License Server を動かそうとしたら

```shell-session
/usr/local/bin/lmgrd: No such file or directory
```

エラーメッセージが出てきて起動しない。ファイルあるっちゅうねん・・・

# 調査

Linuxでは、Executable file の場合に自身だけでなく依存ライブラリが存在しないときもこのエラーになる。
改善してほしいが英語で提案して切り込んでいく時間はいまんとこない。

まず、何が足りないか？

```shell-session
$ ldd /usr/local/bin/lmgrd 
	linux-gate.so.1 =>  (0xf7716000)
	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf76df000)
	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7699000)
	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf767b000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf74cc000)
	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf74c7000)
	/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xf7717000)
```

つうことで見慣れない `/lib/ld-linux.so.2` が必要。

# 対処

```shell-session
$ sudo apt-get install lsb-core
```

してから起動しなおすと・・・

```shell-session
Starting license_DS5PE-LD-40001_00a0b0a88d57 license server
	license=/usr/local/etc/FLEXlm/licenses/license_xxxxxxxxxxxxxxxx.dat
	logfile=/var/log/FLEXlm/license_xxxxxxxxxxxxxxxx.flexlm.log
```

応急処置完了。

# LSBって？

Linux Standard Base

Distro間の差分を吸収したいらしい。
MacのCLIP STUDIO PAINTで「スペースキーが効かない」こう対処してみた


ここではきっと場違いなのだろうけど、イラスト描くのに重宝するCLIP STUDIO PAINTの「スペースキーが効かない」の対処してみたメモ。

スペースキーで手のひらツール出したり、拡大小するIllustratorと同じキーバインドがCLIP STUDIO PAINTで効かない現象が著しくて不便すぎて調べてた。

けどChromeを閉じたら直ったとか、自分のMacでは全く通じない。マイMacはOSX10.9.4

でもChromeが影響してるならGoogleのキーバインドとぶつかってるのか？　Googleのデーモンが限りなく怪しいのか？
ということでプロセスをみてみる。

```
$ ps aux | grep Google
```
Google日本語入力ツール、こいつらが怪しい。

```
/Library/Input Methods/GoogleJapaneseInput.app/Contents/MacOS/GoogleJapaneseInput

/Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputConverter.app/Contents/MacOS/GoogleJapaneseInputConverter

/Library/Input Methods/GoogleJapaneseInput.app/Contents/Resources/GoogleJapaneseInputRenderer.app/Contents/MacOS/GoogleJapaneseInputRenderer
```

試しにこのデーモンたちをkillして、CLIP STUDIO PAINTを起動してみる。
スペースキーが手のひらになった。本当にGoogleにキーバインドが取られてたのか？

KeepAlive設定なのか間もなくGoogle日本語入力ツールは復帰する。
スペースキーも使えてる。バンザイ...!?
でもお絵描き前にいちいちkillするのは面倒くさい。

Launchファイルが今、/Library/LaunchAgentsにあるので、これを自分のhomeに移動すればうまくいくかも？ なんとなく。
```
$ sudo mv /Library/LaunchAgents/com.google.inputmethod.Japanese.* ~/Library/LaunchAagents/
```
再起動。
CLIP STUDIO PAINT起動
スペースキー手のひらツール OK!

これでちょっと様子をみよう。
MacにHomebrewで入れたboot2dockerとDockerをバージョンアップする

```shell-session
brew update
brew upgrade docker boot2docker
```

で一発。ではない。

```shell-session
brew update
brew upgrade docker boot2docker

boot2docker delete
boot2docker download
boot2docker init
boot2docker up
```

brewからのupgradeだけだとboot2docker(VirtualBox)上のdockerは更新されないので、``` boot2docker download```でboot2dockerの最新イメージを落としてきてinitし直す必要がある。

```shell-session
docker version

Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.3
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
```

```docker version```でClient version(Mac側)とServer version(boot2docker側)の両方のバージョンが上がっていればバージョンアップ成功

> 参考
[[小ネタ]Boot2dockerで実行するDocker VMのバージョンアップ](http://dev.classmethod.jp/tool/versionup-boot2docker-dockervm/)

### 追記

久しぶりにdockerをupdateしてstartしようとしたら下記のように言われた。おそらく1.3？から追加されたパラメータ。

```shell-session
To connect the Docker client to the Docker daemon, please set:
    export DOCKER_CERT_PATH=/Users/****/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
    export DOCKER_HOST=tcp://XXX.XXX.XXX.XXX:XXX
```

DOCKER_HOSTと同様にDOCKER_CERT_PATHとDOCKER_TLS_VERIFYを追加(コピペ)してやれば問題なく接続出来た。

```shell-session
docker version
Client version: 1.3.1
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 4e9bbfa
OS/Arch (client): darwin/amd64
Server version: 1.3.1
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 4e9bbfa
```
WindowsのMinGW＋msys環境でgit/hgコマンド補完を使う

git/mercurial便利ですよね。
最近都合でWindows開発環境なんですが、Linuxのbashでは自然に入ってたコマンド補完がmsysで効かない。
コマンドは特にブランチ名とか補完がないとめんどくて打ってられない。
でもGit for Windowsに付属のgitbash（実体はmsys）なら効く。
そこで手持ちmsys補完を効かせるためのあれこれ設定メモ。

# Git/Mercurial for Windowsを入れる
公式からDownload・install。
`Program File`以下に入れるとスペースがのちのち問題を起こすこともあるので、C直下にインストールがオススメ。

# msysのbashに補完機能ファイルを読み込む
msysのbashだと`~/.profile`が設定として読み込まれます。
そこでこのファイルに以下のように`source`コマンドを追加。
これで次の起動or`source ~/.profile`でgit/hgのコマンド補完やブランチ補完が効きます。

```bash:.profile
source /C/Git/etc/bash-completion.bash
source /C/Git/etc/git-prompt.sh
source /C/Mercurial/Contrib/bash_completion
```

# ついでにプロンプトにブランチ名を表示する
[このへんの記事](http://qiita.com/gab_km/items/a4267dd1566b2dacc858)を参考にプロンプトにブランチ名や変更状態も表示するように設定を足すといいです。
もちろん[このへんの記事](http://qiita.com/note109/items/2adb71024d675bc43177)にあるような`__git_ps1`も使えます。
変更やステージングを*や+でプロンプト表示してくれてまじ便利。
Mercurialはまだ`__git_ps1`的なものはないみたい(´･ω･｀)