OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby | Guard gem | guard show コマンドで plugin と option を確認する

# Ruby | Guard gem | guard show コマンドで plugin と option を確認する

## 概要
guard show コマンドで plugin と option を確認する

## サンプル
rspec, rubocop の plugin をインストール済みの状態で *show* コマンドを実行してみます

~~~bash
$ guard show
  +---------+---------+----------------+---------------------------------+
  | Group   | Plugin  | Option         | Value                           |
  +---------+---------+----------------+---------------------------------+
  | Default | Rubocop | all_on_start   | true                            |
  |         |         | cli            | nil                             |
  |         |         | keep_failed    | true                            |
  |         |         | notification   | :failed                         |
  +---------+---------+----------------+---------------------------------+
  | Default | RSpec   | all_after_pass | false                           |
  |         |         | all_on_start   | false                           |
  |         |         | cmd            | "rspec"                         |
  |         |         | failed_mode    | :focus                          |
  |         |         | launchy        | nil                             |
  |         |         | notification   | true                            |
  |         |         | run_all        | {:message=>"Running all specs"} |
  |         |         | spec_paths     | ["spec"]                        |
  +---------+---------+----------------+---------------------------------+
~~~

## 参照
https://github.com/guard/guard

## Guard まとめ記事
http://qiita.com/tbpgr/items/7905535aa0a1d9131688
Ruby | Guard gem | guard list コマンドで plugin の一覧を確認する

# Ruby | Guard gem | guard list コマンドで plugin の一覧を確認する

## 概要
guard list コマンドで plugin の一覧を確認する

## サンプル
rspec, rubocop の plugin をインストール済みの状態で *list* コマンドを実行してみます

~~~bash
$ guard list
  +---------+-----------+
  | Plugin  | Guardfile |
  +---------+-----------+
  | Rspec   | ✔         |
  | Rubocop | ✔         |
  +---------+-----------+
~~~

## 参照
https://github.com/guard/guard

## Guard まとめ記事
http://qiita.com/tbpgr/items/7905535aa0a1d9131688
Ruby | GuardでRSpec/RuboCopを自動実行して結果をGrowlに表示する

# Ruby | GuardでRSpec/RuboCopを自動実行して結果をGrowlに表示する

## 概要
GuardでRSpec/RuboCopを自動実行して結果をGrowlに表示する

## 補足
RSpec: Ruby の BDDツール
RuboCop: Ruby の 静的解析ツール
Growl: ポップアップ通知システム

## 前提
* Windows7 環境にて試行
* guard gem はインストール済みとします。
* guard-rubocop gem はインストール済みとします。
* guard-rspec gem はインストール済みとします。
* Growl for Windows はインストール済みとします。

http://www.growlforwindows.com/gfw/default.aspx

## gem i ruby_gntp gem のインストール

~~~bash
$ gem install ruby_gntp --no-ri --no-doc
~~~

## 設定ファイル（Guardfile）の生成
RuboCop 対応のひな形を生成します。

~~~bash
$ guard init rubocop
~~~

下記のようなテンプレートが生成されます

~~~ruby:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard :rubocop do
  watch(%r{.+\.rb$})
  watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end
notification :gntp
~~~

## guardを起動します

~~~bash
$ guard start
~~~

## プログラムのひな型を生成します

自作 gem の rspec_piccolo を利用します。
rspec_piccoloはプロダクトコードとテストコードのひな形を生成する CLI ツールです。

詳しくは
https://github.com/tbpgr/rspec_piccolo
を参照。

~~~bash
$ piccolo e Hoge hoge hoge -p
~~~

これで、プロダクトコードと、テストコードが生成されます。
中身については略。

## 自動生成されたファイルを検知して、 *guard* が実行されます
*rspec_piccolo* を作成した当初は *RuboCop* 対応を加味していなかったため、
複数の警告が発生しています。

コンソースの出力内容は略。
以下、 growl の警告

![growl_alert.png](https://qiita-image-store.s3.amazonaws.com/0/43480/01c40262-6b65-71ff-b610-ec55ba6e6ad5.png)

## 次に、rspec も一緒に実行させてみます。 *Guardfile* ファイルに rspec の呼び出し設定を追加します。

~~~ruby:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard :rubocop do
  watch(%r{.+\.rb$})
  watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end

guard :rspec do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }
end

notification :gntp
~~~

## テストがエラーになるように設定後、ファイルを保存して *guard* を実行します

![growl_alert_double.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b6f0af14-3eff-f357-19dc-40598955e6e0.png)

## 参照
http://www.growlforwindows.com/gfw/default.aspx
https://github.com/snaka/ruby_gntp
https://rubygems.org/gems/ruby_gntp

## Guard まとめ記事
http://qiita.com/tbpgr/items/7905535aa0a1d9131688
プリペアドクエリで Null かもしれないパラメータを渡す

プリペアドクエリ（パラメータクエリ）を作る際、該当のカラムに Null が入っているかもしれず、また、渡すパラメータも Null で有るかもしれない場合、...

```sql
SELECT * FROM theTable WHERE theColumn = null
```

... といった構文が許されないため、パラメータの内容を確認してから ...

```sql
SELECT * FROM theTable WHERE theColumn IS null
```

... などのようにパラメータが Null かそれ以外かの二つのプリペアドクエリを用意しなければならない。しかしパラメータが増えてくるともうダメ。

いっそ開き直って ...

```sql:Oracle
SELECT * FROM theTable
WHERE Nvl(theColumn, '-null-') = Nvl(?, '-null-')
```

はっきり言って実行速度は遅いだろう。しかし、クエリを書き換えることに労力を使うより良い場合があるだろう。

***
#### 追記：MySQL の場合
MySQL の場合は便利な演算子があるようです!
[プレースホルダで「= ?」と「IS NULL」に同時に対応する方法](http://qiita.com/mpyw/items/cb7ca19284afc4e2969d)
Ruby | Guard gem を利用してファイルの変更を検出し、rubocopを自動実行する

# Ruby | Guard gem を利用してファイルの変更を検出し、rubocopを自動実行する

## 概要
Guard gem を利用してファイルの変更を検出し、rubocopを自動実行します

## 前提
* guard gem はインストール済みとします。
* rubocop gem はインストール済みとします。

## guard-rubocop gem のインストール

~~~bash
$ gem install guard-rubocop --no-ri --no-doc
~~~

## 設定ファイル（Guardfile）の生成
RuboCop 対応のひな形を生成します。

~~~bash
$ guard init rubocop
~~~

下記のようなテンプレートが生成されます

~~~ruby:Guardfile
# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard :rubocop do
  watch(%r{.+\.rb$})
  watch(%r{(?:.+/)?\.rubocop\.yml$}) { |m| File.dirname(m[0]) }
end
~~~

## guardを起動します

~~~bash
$ guard start
~~~

## プログラムのひな型を生成します

自作 gem の rspec_piccolo を利用します。
rspec_piccoloはプロダクトコードとテストコードのひな形を生成する CLI ツールです。

詳しくは
https://github.com/tbpgr/rspec_piccolo
を参照。

~~~bash
$ piccolo e Hoge hoge hoge -p
~~~

これで、以下のファイルが生成されます。

~~~ruby:lib/hoge.rb
# encoding: utf-8


class Hoge
  def hoge
    # TODO: implement your code
  end
end
~~~

~~~ruby:spec/hoge_spec.rb
# encoding: utf-8
require "spec_helper"
require "hoge"

describe Hoge do

  context :hoge do
    cases = [
      {
        case_no: 1,
        case_title: "case_title",
        expected: "expected",
      },
    ]

    cases.each do |c|
      it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
        begin
          case_before c

          # -- given --
          hoge = Hoge.new

          # -- when --
          # TODO: implement execute code
          # actual = hoge.hoge

          # -- then --
          # TODO: implement assertion code
          # expect(actual).to eq(c[:expected])
        ensure
          case_after c
        end
      end

      def case_before(c)
        # implement each case before
      end

      def case_after(c)
        # implement each case after
      end
    end
  end
end
~~~

## 自動生成されたファイルを検知して、 *guard* が実行されます
*rspec_piccolo* を作成した当初は *RuboCop* 対応を加味していなかったため、
複数の警告が発生しています。

~~~bash
[1] guard(main)>
23:07:23 - INFO - Inspecting Ruby code style: lib/hoge.rb spec/hoge_spec.rb
Inspecting 2 files
CW

Offenses:

lib/hoge.rb:3:1: C: Extra blank line detected.

# :
# 中略
# :

spec/hoge_spec.rb:40:22: W: Unused method argument - c. If it's necessary, use _ or _c as an argument name to indicate that it won't be used. You can also write as case_after(*) if you want the method to accept any arguments but don't care about them.
      def case_after(c)
                     ^

2 files inspected, 12 offenses detected
~~~

## RuboCopの設定ファイルを作成し、現状の警告を todo 化することで警告をなくします

~~~bash
$ rubocop --auto-gen-config
$ echo 'inherit_from: .rubocop_todo.yml' > .rubocop.yml
~~~

## .rubocop.yml の作成を検知して、 *guard* が実行されます
*.rubocop_todo.yml* ファイルの設定により、現状の警告が抑止されたことを確認できます。

~~~bash
[1] guard(main)>
23:13:06 - INFO - Inspecting Ruby code style: .
Inspecting 2 files
..

2 files inspected, no offenses detected
~~~


## 参照
http://rubygems.org/gems/guard-rubocop
https://github.com/yujinakayama/guard-rubocop

## Guard まとめ記事
http://qiita.com/tbpgr/items/7905535aa0a1d9131688
zsh で emacs の init-loader 的なことしてみる

僕は emacs で init-loader.el を使って設定(初期化？)ファイルを管理してます。
これと同じことが zsh でもできないかなーとか思って適当に書いてみました。

```zsh
function init-loader(){
    init_dir=${1:?"You have to specify a directory"}
    for config_file in $init_dir/*.zsh; do
        if [ ! -r $config_file.zwc ]; then
            zcompile $config_file
        elif [ $config_file -nt $config_file.zwc ]; then
            zcompile $config_file
        fi
        source $config_file
    done
    return
}
```

この関数を書いて、

```zsh
init-loader $ZDOTDIR/inits
```

とか書けばいいです。
zsh の起動時に設定ファイルを自動でコンパイルします。ぶっちゃけいらんかも。
GitLab | GitLab API で既存プロジェクトを別グループの新プロジェクトに移動する

# GitLab | GitLab API で既存プロジェクトを別グループの新プロジェクトに移動する

## 概要
GitLab API で既存プロジェクトを別グループの新プロジェクトに移動します。

## 仕様
移動前プロジェクト: before
移動後プロジェクト: after

## サンプルコード

~~~ruby:move_project_group.rb
require 'gitlab'
require 'pp'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'some token'
end

old_group = 'before'
new_group = 'after'
base_dir = 'some_working_directory_path' # git clone するための作業ディレクトリ。どこでもいい
old_git_url = 'git@some_path:before/%s.git'
new_git_url = 'git@some_path:after/%s.git'
target_repositoies = %w{project1 project2 project3}

Dir.chdir(base_dir)
target_repositoies.each do |repository|
  clone_code = format("git clone #{old_git_url}", repository)
  # 旧プロジェクトをクローン
  system(clone_code)
  Dir.chdir("./#{repository}")
  # リポジトリの remote の設定を削除
  system("git remote rm origin")
  old_project = Gitlab.projects(per_page: 100).find { |e|e.name == repository }
  description = old_project.description
  # 新プロジェクトの作成
  Gitlab.create_project(repository, description: description, namespace_id: Gitlab.groups.find { |g|g.name == new_group }.id)
  # リポジトリの remote の設定を新プロジェクトにする
  remote_add_code = format("git remote add origin #{new_git_url}", repository)
  system(remote_add_code)
  # 新プロジェクトに旧プロジェクトの内容をpush
  system('git push origin master')
  # 旧プロジェクトを削除
  Gitlab.delete_project(old_project.id)
  Dir.chdir('../')
end
~~~

## GitLab API まとめ
http://qiita.com/tbpgr/items/4f301f8e7788cfbd5ace
テーブルのカラムを増やす際に末尾に追加するのではなく、カラムの並び順を変更したい

テーブル設計をする際に「プライマリーキーは上のほうに」「同じ種類の情報はまとめて」と、なんとなく暗黙のルールに則っていると安心するし、保守性も上がる。
そして保守期間に入りテーブルのカラムを増やす必要が出たときも同じようにしたいと思うのは、ごく自然な欲求だろう。

MySQL などは After 句があるので、任意の場所に新しいカラムを追加できるが、それがない RDBMS の場合は次のような手順を踏む必要がある。

・最終的に理想とするテーブルを、新しい別名テーブルとして作成する。
・古いテーブルをリネームする。
・作成した別名テーブルを、古いテーブルの元の名前にリネームする。
・他のテーブルから古いテーブルを参照している制約などを外す。
・作成したテーブルに主キー、外部キー、コメントなどを付与する。
・古いテーブルから新しいテーブルに Insert & Select を使ってデータを移す。
・古いテーブルを参照していた制約を付け直す。
・動作確認が終わったら古いテーブルを削除する。

などなど。意外と、とても手間がかかる。


カラムの順序は RDBMS において、なんら影響はなく、Select 文で任意の順に取り出すことができるし、Insert も Update も同様である。そのため、「このような手間をかける意味は何もない」という人もいる。

しかしながら RDBMS や、それを使ったシステムは長い時間と多くの人手をかけて保守されていくものだ。そのときカラムの順序が「なんとなく」でもルールに則っていると、設計者の意図やシステムの構造を理解するのに敷居が低くなることは確実だ。手間をかける意味は十分にあると私は考える。時間が許せばという条件はつくが。

「ドキュメントがあればよい」という人もいるかもしれないが、残念ながら有用なドキュメントが残っているシステムを担当する幸運には、ついぞ恵まれたことがない。しかし経験上、良いドキュメントよりも良いシステム構造の方が、エンジニアにはうれしい。

その他気を付けるべきことは、"Select * ..." や "Insert Into ... Select * ..." などとして利用している場合に、思わぬ副作用が出るかもしれないということだが、そもそもカラムを増やす時点でそれは当然調査しておくべきことなので、あまり大きな問題ではないかもしれない。
GitLab | GitLab API でプロジェクトを削除する

# GitLab | GitLab API でプロジェクトを削除する

## 概要
GitLab API でプロジェクトを削除します。

## シグネチャ

~~~ruby
delete_project(id)
~~~

## 仕様
移動前プロジェクト: before
移動後プロジェクト: after

## サンプルコード

~~~ruby:move_project_group.rb
require 'gitlab'
require 'pp'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'some token'
end

project = Gitlab.projects(per_page: 100).find { |e|e.name == 'ProjectName' }
Gitlab.delete_project(project.id)
~~~

## 参照

* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab

## GitLab API まとめ
http://qiita.com/tbpgr/items/4f301f8e7788cfbd5ace
RuboCop | Style/PredicateName

# RuboCop | Style/PredicateName

## 概要

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

has_, is_, have_ など,特定の文字列で始まるメソッド名をチェックします。

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|NamePrefixBlacklist|is_|is_で始まっていたら警告|○|
|NamePrefixBlacklist|has_|has_で始まっていたら警告|○|
|NamePrefixBlacklist|have_|have_で始まっていたら警告|○|

## PredicateName

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

### 検証プログラム

~~~ruby:predicate_name.rb
def is_head?
  true
end

def has_head?
  true
end

def have_head?
  true
end

def hoge_head?
  true
end
~~~

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

~~~yaml:.rubocop.yml
PredicateName:
  NamePrefixBlacklist:
    - is_
    - has_
    - have_
~~~

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

Offenses:

predicate_name.rb:1:5: C: Rename is_head? to head?.
def is_head?
    ^^^^^^^^
predicate_name.rb:5:5: C: Rename has_head? to head?.
def has_head?
    ^^^^^^^^^
predicate_name.rb:9:5: C: Rename have_head? to head?.
def have_head?
    ^^^^^^^^^^

1 file inspected, 3 offenses detected
~~~

### 実行結果 独自定義で _hoge を追加, is_/has_/have_ は無効にします

~~~yaml:.rubocop.yml
PredicateName:
  NamePrefixBlacklist:
    - hoge_
~~~

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

Offenses:

predicate_name.rb:13:5: C: Rename hoge_head? to head?.
def hoge_head?
    ^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## RuboCopまとめ記事
http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
VoiceText Web API の Haskell 用ライブラリを作った

[VoiceText Web API](https://cloud.voicetext.jp/webapi)をHaskellから呼び出すためのライブラリを作った。

* GitHub: [Network.VoiceText](https://github.com/zaneli/network-voicetext)

備忘のために作成手順などを書いておく。

# 作成手順

## cabal パッケージ雛形の作成

```
> mkdir network-voicetext
> cd network-voicetext
> cabal sandbox init
> cabal init
```

対話でパッケージの設定を聞かれるので、パッケージ名やライセンスなどを入力する。
全ての項目入力完了後、 `cabal check` を実行して設定をチェックする。
source-repository セクションがないよ、という警告が出たので network-voicetext.cabal ファイルを直接編集してセクションを追加する。

## 依存ライブラリの追加
必要なものを network-voicetext.cabal の build-depends に追加し、`cabal install --only-dependencies`でインストールする。
少し嵌ったのが、http-conduit をインストールしたかったが依存しているconduitがインストール中のビルドフェーズで失敗してしまった。

> Data/Conduit/Internal.hs:394:4:
>      error: invalid preprocessing directive
>      #-}

conduitのissue[124](https://github.com/snoyberg/conduit/issues/124),[147](https://github.com/snoyberg/conduit/issues/147) などを参考に、以下のように解決。

```
> curl -O https://www.haskell.org/platform/ghc-clang-wrapper
> mv ghc-clang-wrapper /usr/local/bin/
> chmod +x /usr/local/bin/ghc-clang-wrapper

> vi /Library/Frameworks/GHC.framework/Versions/Current/usr/lib/ghc-7.6.3/settings

("C compiler command", "/usr/bin/gcc”),　と書かれた行を　("C compiler command", "/usr/local/bin/ghc-clang-wrapper”),　に変更。
```

## Web API ポストリクエストを送信するコードの作成

[network-qiita](http://qiita.com/jabaraster/items/a0e4d1a105b12467850f)を参考にさせていただいた。
パラメータは `ByteString` にして `Network.HTTP.Conduit.urlEncodedBody` に設定するため `Data.ByteString.Char8.pack` を使っていたが、マルチバイト文字が正しく扱えていないようで作成される音声ファイルが入力と異なるテキストになっていたので、 `Data.ByteString.UTF8.fromString` を使うようにしてみた。

## パッケージの作成・確認

```
> cabal clean
> cabal sdist
> cd dist
> tar zxvf network-voicetext-0.0.0.1.tar.gz
> cabal sandbox init --sandbox ../../.cabal-sandbox
> cabal test
```

一応、他のディレクトリに別のsandbox環境を作り、インストールして実行できるか確認。

```
> mkdir network-voicetext-test
> cd network-voicetext-test
> cabal sandbox init
> cabal init
> cabal install network-voicetext-0.0.0.1.tar.gz
```

以下のような実行ファイルを作成する。

```hs:Main.hs
import Network.VoiceText

main = do
  let b = basicAuth "basic_auth_username" ""
  let p = ttsParams "Hello, world." Show
  ttsToFile "./test.wav" b p
```

`cabal run` を実行し、test.wav が作成されることを確認する。
~~が…作成された音声ファイルが壊れていて実行できない…。
以下のように `cabal repl` で同じ事をすると正しい音声ファイルができるのだが、両者の違いが分からない…。~~

```
Prelude Main> import Network.VoiceText
Prelude Network.VoiceText Main> let b = basicAuth "basic_auth_username" ""
Prelude Network.VoiceText Main> let p = ttsParams "Hello, world." Show
Prelude Network.VoiceText Main> ttsToFile "./test.wav" b p
Right ()
```

`toStrict`を呼んで遅延ByteStringを正格ByteStringにしてから書き込むことで、Main.hsを `cabal run`しても正しい音声ファイルが作成されることが確認できた。

# TODO
* ~~`cabal repl` だと上手くいって `cabal run` だと駄目な原因究明。(同じ事をやっているつもりだけど、そもそも Main.hs の書き方が間違っているのだろうか？)~~
* emotion_levelは1または2, pitchは50～200など各パラメータには設定可能は数値の範囲がある。これを型で表現できないか検討。
* 単体テストを書いて、Travis CI で回す。
データ整形まわりで必要な Python の細かいテクニック (1)

# データを分析のために整形する

データの下準備・計算・可視化については実際のところ、人々の注目や関心がだいたい 1:4:5 くらいなのに対し、実務における比率はといえば 6:2:2 くらいなのが現実かと思います。これはあくまで体感ですが、分析のほとんどはデータを計算可能な状態にお膳立てするための下準備と言っても差し支えないのでしょうか。そんなわけで今日は日頃グルー言語としての使い勝手を強調している Python でよく使うテクニックを書き連ねてみます。

## JSON オブジェクトのロードとアンロード

内容に特に真新しさは無いのですが JSON フォーマットの変換は事前処理としてよくやることです。忘れないようにメモ代わりに残します。

Python では JSON 形式のデータ構造は import json することで扱えるようになります。ロード時は辞書 (他の言語で言うハッシュ) 型のデータ形式となり、これをまた JSON 形式にすることもできます。

### CSV ファイルからの JSON データのロード

キー、値で区切られた CSV ファイルを想定します。値の部分には他のシステムでシリアライズされた JSON 形式のテキストデータが格納されているとします。これを読み込むには次のようにデリミタを指定して文字列を分割、 json.load メソッドで JSON を辞書型のオブジェクトとしてロードできます。

```py3
import json

file = open(self.filename, 'r')
for line in file:
    key, value = line.rstrip().split(",")
    dic = json.loads(value)
```

### JSON オブジェクトをファイルに書き出す

反対に辞書型のオブジェクトを JSON 形式でファイルや標準出力に書き出すときは次のように json.dumps を利用します。

```py3
import json

json_obj = json.dumps(dic)
print(json_obj)
```

簡単ですね。

## 引数とインスタンス変数の利用

Python スクリプトに渡した引数は sys.argv に格納されます。

```py3
import sys

if __name__ == '__main__':
    argsmin = 1
    if len(sys.argv) > argsmin:
        some_instance = SomeClass(sys.argv)
        some_instance.some_method()
```

インスタンスの初期化時に渡しておけば、インスタンス変数に引数を格納して利用できます。

```py3
class SomeClass:
    def __init__(self, args):
        self.filename = args[1]
```

## プライベートメソッド

Python では習慣的にメソッドの頭に _ をひとつ付けることによってプライベートメソッドであるとします。

```py3
    def self._some_method(self):
        ...
```

確かにこれなら some_instance.some_method として呼ぶことはできません。しかし実は明示的に some_instance._some_method とすれば呼ぶことができます。習慣的なものであって機能的にプライベートになっているわけではありません。

機能的に呼ばれないようにするには __ をふたつにします。

```py3
    def self.__some_method(self):
        ...
```

ただしこれでも裏技的に呼び出す方法がある上、プライベートメソッドのテスタビリティが下がることになるのであまりオススメしません。プライベートメソッドを呼び出すことができてしまうのは、言い換えればテストの時は逆にラクをできることになります。

## テスティングフレームワーク

Python のテスティングフレームワークは様々なものがありますが [nose](https://nose.readthedocs.org) が比較的使いやすいです。まずは以下のような動作をするメソッドを考えてみます。

```py3
import factorial
factorial.factorial(10)
#=> 3628800
```

### テスト対象のコード

この Python コードは factorial.py という名前であるとし、メソッドの実装はこのような感じとします。

```py3
def factorial(n):
    if n==1:
        return 1
    else:
        return n * factorial(n-1)
```

### テストコード

これをテストするには test_factorial.py という名前のファイルを作成しテストコードを以下のように記述します。

```py3
from nose.tools import * # テスティングフレームワークの読み込み
from factorial import *  # テスト対象のコードの読み込み

def test_factorial(): # factorial メソッドのテスト
    i=10
    e=3628800
    eq_(e,factorial(i)) # 検証
```

上記は eq_(3628800 ,factorial(10)) をしているのと等価です eq_ メソッドで値が等しいかを検証しています。

### テストの実行

テストコードが実装できたらシェルから nosetests コマンドを発行します。

```
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s

OK
```

## まとめ

地道なデータの準備作業にたくさんの時間を費やすことはありがちです。今回はそんな作業でよく使うテクニックについて備忘録的にまとめました。
rspec で be_~~ 系のメソッドが無いと言われた時の対処


備忘録的にメモ

`undefined local variable or method 'be_nil'`
とか言われた時の対処法

should のテストケースを describe や context ブロックに書いてしまっているとこのようなエラーが出る。

it ブロックに書けばエラーは出ない。


参考
[The default RSpec::Matchers are not available in model specs in rails3 (master). #93](https://github.com/rspec/rspec-rails/issues/93)
[RoR: Testing: undefined local variable or method `be_nil'… but… I included RSpec, spec/spec_helper, spec/matchers, etc](http://stackoverflow.com/questions/7366187/ror-testing-undefined-local-variable-or-method-be-nil-but-i-included-rspec)
rails generate model 時の複数形と単数形について



rails にて
`rails generate model ~~~`

を実行する際に、モデル名として単数形と複数形を指定した時に、生成されるモデルクラスのクラス名が異なる。

### 単数形指定

```
% rails generate model test
      invoke  active_record
      create    db/migrate/20140718110429_create_tests.rb
      create    app/models/test.rb
      invoke    test_unit
      create      test/models/test_test.rb
      create      test/fixtures/tests.yml
```

### 複数形指定

```
% rails generate model tests
      invoke  active_record
      create    db/migrate/20140718110452_create_tests.rb
      create    app/models/tests.rb
      invoke    test_unit
      create      test/models/tests_test.rb
      create      test/fixtures/tests.yml

```

上記のように、生成されるモデル名が複数形か単数形かで異なる。

微妙な違いだが、モデル名が想定と違っており、少しハマったのでので注意したい。

個人的にはモデルの生成は全て単数形でやるのが面倒がなくて良いかと。


作業中に気になって調べたので、備忘録的に書き残す。
git reset --soft の使い方

`git reset —soft`
の使い方がいまいちわからなかったけど、理解できたのでメモ。


`git reset —soft`
はコミットをやり直したいときに使う。


例えば、2つ以上前のコミットまで遡ってやり直したいときに使用する。
`git reset —soft`

を使用すればリポジトリのソースコードなどの状態はそのままにコミットの情報のみが消える。
なので、pushする前にコミットをまとめたりしたい時は便利。
**注:リモートリポジトリに対してpush済みのコミットを編集すると色々めんどくさいコンフリクトが起こるのでやめましょう**


一つ前のコミットのみをやり直したい時は
`git commit —amend`
を
ソースコードも全て破棄してやり直したい場合は
`git reset --hard`
を使用する。
便乗してコナミコマンドのjQueryプラグインつくった。

## コナミコマンドとは

  1. ↑
  2. ↑
  3. ↓
  4. ↓
  5. ←
  6. →
  7. ←
  8. →
  9. B
  10. A

の順番で入力するとなんかが起きるコマンド。
グラディウスのやつが有名。

## どんなものか

  + コナミコマンドの入力に成功すると、animate()に対応したアクションを起こすことができる
  + 単純にanimate()を呼び出す条件みたいのをつけてるだけなので、引数そのままで置換すればよい

```before.js
$("#foo").animate({"height": "100px"}, 100);
```

これを

```after.js
$("#foo").konami({"height": "100px"}, 100);
```

こうっ！

## なかみ
```konami.js
;(function($){
	$.fn.konami = (function(styles, duration, easing, callback){
		var $this = $(this),
			input = [],
			command = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];
		input = command.slice(0);

		$(window).on("keyup", function(e){
			var key = e.keyCode;

			if (key == input[0]) {
				input.shift();

				if (input.length == 0) {
					return $this.animate(styles, duration, easing, callback);
				}
			} else {
				input = command.slice(0);
			}
		});
	});
})(jQuery);
```

## なぜつくったのか

  + たまたまQiita開いたらトップに他の方が作ったものがあがってたから。
  + んで、その中のアルゴリズムとは別のアプローチを思いついたから。
  + んでんで、その実装が10分もかからなそうだと判断したから。

## 課題

 + メソッドチェーンしようとするとエラー処理をいれないといけない
   * success/errorでいれたい
   * でもいいエラー条件が思い浮かばない
 + animate()以外のものも使えるようにしたい
 + コマンドを拡張できるようにしたい
   * デフォをコナミ仕様にして、引数で受け取るべきかな？


## おねがい
例によってGitHubにあげました。
助言やらツッコミやらpull requestやらお願いします！！

[GitHub tattin/konami](https://github.com/tattin/konami/ "GitHub tattin/konami")
jQueryで特定の文字列を内包したタグの指定

備忘録

```js:

$("div:contains('foo')").addClass("bar");
     //fooという文字列を内包したdivにclass"bar"を追加

```

## 変数を使いたいとき

```js:日付の文字列を内包した要素にクラスを追加
$(function() {
now = new Date();
 
year = now.getFullYear();
 
month = now.getMonth() + 1;
 
day = now.getDate();
 
hour = now.getHours();
 
min = now.getMinutes();
 
sec = now.getSeconds();

$("div:contains('"+day+"')").addClass('today');

});
```
リンクをタップしたときのハイライトを非表示にする

スマートフォンでリンクをタップしたときのハイライトの消し方をよく忘れる上に、なかなか検索できないのでメモ。

```css
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
tap-highlight-color: rgba(0, 0, 0, 0);
```
超絶簡単！？Zend Framework 1.xインストール方法 

#### ここではZendフレームワークのインストール方法をご紹介しちゃいます！
#### 超絶簡単！？なのでペロッとインストールしちゃってください（＾ω＾）ﾍﾟﾛﾍﾟﾛ


## ①下記URLからZendフレームワークのダウンロード（1.x推奨）
http://framework.zend.com/downloads/latest  
![スクリーンショット 2014-07-18 10.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/49347/90a1f43c-8a19-cf9e-d420-85c9f4e73dd9.png)


## ②ダウンロードしたZendFramework-【バージョン名】の中にある「library」ディレクトリを「/usr/share」に配置
![スクリーンショット 2014-07-18 10.23.34.png](https://qiita-image-store.s3.amazonaws.com/0/49347/13e5a994-52d0-f0de-1ea9-fdf282d6da64.png)


![スクリーンショット 2014-07-18 17.52.12.png](https://qiita-image-store.s3.amazonaws.com/0/49347/f16ed025-d610-6d81-60ee-8076311d5406.png)


## ③「/etc/php.ini」ファイルに「include_path = ".:/usr/share/library"」を新規入力
![スクリーンショット 2014-07-18 18.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/49347/769aaecf-30e5-f88b-2a63-3195cb49eaf5.png)



## ④apacheの再起動！！
「service httpd restart」コマンドでapacheの再起動。




## ⑤PHPファイル作成＆PHPファイルにソースを入力
①「Vi ファイル名.php」でPHPファイル作成（ディレクトリは実行出来ればどこでもおｋ！）
②作成したPHPファイルに下記ソースを記入

<?php
    require_once 'Zend/Version.php';
    echo 'Hello, Zend Framework! Ver ' . Zend_Version::VERSION;

③保存！！


## ⑥実行！！(「php ファイル名.php」コマンドで実行できます)
「Hello, Zend Framework! Ver バージョン名」が出れば大成功！！
インストール完了です！！


注意：これで出来ない場合は権限が問題があるかもしれません。
ubuntu へ mongo 2.6 ソースからインストールする

####環境
Ubuntu 14.04 LTS (GNU/Linux 3.13.0-30-generic x86_64)
mongo 2.6.3

  
#####http://www.mongodb.org/downloads
上記から該当のurlを持ってくる
  

  
<pre>
%mkdir src
%cd src
%wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.3.tgz
%tar xzf mongodb-linux-x86_64-2.6.3.tgz
%cd mongodb-linux-x86_64-2.6.3
%ls
GNU-AGPL-3.0  README  THIRD-PARTY-NOTICES  bin
%cd bin
%ls
bsondump  mongo  mongod  mongodump  mongoexport  mongofiles  mongoimport  mongooplog  mongoperf  mongorestore  mongos  mongostat  mongotop
</pre>

> 今回のurlはコンパイル済みのものである.
https://fastdl.mongodb.org/src/mongodb-src-r2.4.10.tar.gz　
上記のようなurlの中に ` src` と入ってるものはソースコンパイルが必要である。

`wget` して展開した中に binディレクトリがあり、その中にコンパイル済みである `実行できるコマンド(言い方が分からない)` があるので、それらを `/usr/local/bin/ ` など、普段用いる場所へコピーした。
TeXエンジンが Abort trap 6 で落ちる

最近のTeXエンジンは，-shell-escape が有効な状態のときに，

```tex
\input|"command args" % plain TeX
\@@input|"command args" % LaTeX
```

とすることで，外部コマンドの標準出力をそのままソースに流し込むことができます。

この機能を用いてTeXソースをコンパイルしている最中に，TeXエンジン（コンパイラ）が Abort trap 6 で落ちるという，比較的珍しいエラーに遭遇しました。
「問題が再現する最小限のソース」まで切り詰めてみたところ，次のソースに至りました。plain TeX documentです。

```tex:sample.tex
\input|"echo '\string\openin0.'"
\input|""
\bye
```

このソースを

```sh
$ ptex -shell-escape sample
```

でコンパイルしようとすると，次のように Abort trap 6 で落ちます（TeX Live 2014 on Mac OS X 10.9 で確認）。

```
This is pTeX, Version 3.14159265-p3.5 (utf8.euc) (TeX Live 2014) (preloaded format=ptex)
 \write18 enabled.
(./sample.tex (./sample.tex)Assertion failed: (s != 0), function maketexstring, file ../../../texk/web2c/lib/texmfmp.c, line 2558.
Abort trap: 6
```

pTeX系列の (e)(u)pTeX の4種類のエンジン，および XeTeX でも再現しました。
一方，pdfTeX や LuaTeX では発生しませんでした。

なお，LaTeXでも同様です。

```tex:sample2.tex
\documentclass{article}
\begin{document}
\makeatletter
\@@input|"echo '\string\openin0.'"
\@@input|""
\end{document}
```

```
$ platex -shell-escape sample2
This is e-pTeX, Version 3.14159265-p3.5-130605-2.6 (utf8.euc) (TeX Live 2014) (preloaded format=platex)
 \write18 enabled.
entering extended mode
(./sample2.tex
pLaTeX2e <2006/11/10> (based on LaTeX2e <2014/05/01> patch level 0)
Babel <3.9k> and hyphenation patterns for 79 languages loaded.
(/Applications/TeXLive/texlive/2014/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/Applications/TeXLive/texlive/2014/texmf-dist/tex/latex/base/size10.clo))
(./sample2.aux) (./sample2.aux)Assertion failed: (s != 0), function maketexstring, file ../../../texk/web2c/lib/texmfmp.c, line 2558.
Abort trap: 6
```

この現象の原因はよく分かりませんが，普通はこんなことはあまりしないので，実害は少ないでしょう。

#追記 (2014/07/19)
問題の texmfmp.c を角藤先生が[改修してくださいました](https://www.tug.org/svn/texlive/trunk/Build/source/texk/web2c/lib/texmfmp.c?r1=34617&r2=34659)。次の TeX Live 2015 では修正されるはずです。

#追記 (2015/09/10)

同様の案件を[もう一件見つけました](http://qiita.com/doraTeX/items/7c28b93969a558b3e2a5)。
ibtoolを使ってXibファイル内のクラス名を一括変更する


ibtoolはローカライズで使用するシーンを良く見かけますが、Xibファイル内のクラス名を一括変更したいという話を聞きまして、どうも手作業でやろうとしていたのでそんなことしなくてももっと良い方法あるんじゃないの？と思い、ちょっと調べてみました。

で、ibtoolのconvertオプションです。

引用元:[ibtool(1) Mac OS X Developer Tools Manual Page](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/ibtool.1.html)
>
 --convert old-new
              Rename  the  class  named  'old'  to 'new'. If 'old' ends with an '*', then rename all classes
              beginning with 'old' to instead begin with 'new'. This Updates all outlet types, class  names,
              custom classes, as well as actual instances.

convertオプションを指定してその後に置換対象の文字列と置換する文字列をハイフン(-)でつないで置換ルールを指定します。
ちなみにXibファイルですとワイルドカードが使えるようです。

> ibtool --convert Old*-New file

例では指定していませんが、実際に使用するときは``--write``オプションで出力先ファイルを指定しないと変換後のファイルが出力されないようなので注意しましょう。
RailsでMysqlのユーザー変数を利用する方法

Rails4でMysql2を利用している前提で。

```rb
class MyModel < ActiveRecord::Base

  def get_client
    params = ActiveRecord::Base.configurations[Rails.env.to_s].symbolize_keys
    return Mysql2::Client.new(params)
  end

  def test_query
    query =<<SQL
set @p=200;
set @c=0;
select @p, @c;
SQL
 
    client = get_client

    # client.query("set @p=200; set @c=0; select @p, @c")とすると構文エラーになってしまうため、１行ずつ実行する
    queries = query.split(/;/)
    queries.each do |line|
       result = client.query(line)
    end

    result.first # {"@p"=>200, "@c"=>0} 
  end
end
```

参考
http://stackoverflow.com/questions/7480579/how-to-get-output-parameters-from-mysql-stored-procedure-in-rails
VBAでのエスケープ処理

通信を行なう際に、JavaScriptのescape関数は英数字以外の記号や日本語を％21とか％u3044というコードに変換してくれる。

以下のページでは、VBAでesacape処理を行うサンプルを示している。
http://www.xtremevbtalk.com/showthread.php?t=152882

残念なことに、このサンプルは日本語などのUNICODEについては考慮されていない。そこで、上記のサンプルを元に日本語対応したものを以下に示す。

```vbnet
Option Explicit

'*
'* 特殊文字をエスケープする
'* 参考：
'* http://www.xtremevbtalk.com/showthread.php?t=152882
'* @param[in] StringToEncode 文字
'* @return エスケープした文字 Unicodeの場合は%u
'*
Public Function escape(ByVal StringToEncode As String) As String
    Dim i As Integer
    Dim acode As Integer
    Dim char As String
 
    escape = StringToEncode
 
    For i = Len(escape) To 1 Step -1
        acode = AscW(Mid$(escape, i, 1))
        Select Case acode
            Case 48 To 57, 65 To 90, 97 To 122
                ' don't touch alphanumeric chars
 
            Case 32
                ' replace space
                escape = Left$(escape, i - 1) & "%20" & Mid$(escape, i + 1)
 
            Case Else
                ' replace punctuation chars with "%hex"
                char = Hex$(acode)
                If Len(char) > 2 Then
                    If Len(char) = 3 Then
                        char = "0" & char
                    End If
                    escape = Left$(escape, i - 1) & "%u" & char & Mid$(escape, i + 1)
                Else
                    If Len(char) = 1 Then
                        char = "0" & char
                    End If
                    escape = Left$(escape, i - 1) & "%" & char & Mid$(escape, i + 1)
                End If
        End Select
    Next
End Function
'* http://www.xtremevbtalk.com/showthread.php?t=152882
Public Function unescape(ByVal StringToDecode As String) As String
    Dim i As Long
    Dim acode As Integer, sTmp As String
    unescape = StringToDecode
 
    If InStr(1, unescape, "%") = 0 Then
         Exit Function
    End If
    For i = Len(unescape) To 1 Step -1
        acode = Asc(Mid$(unescape, i, 1))
        Select Case acode
            Case 48 To 57, 65 To 90, 97 To 122
                ' don't touch alphanumeric chars
                DoEvents
 
            Case 37: ' Decode % value
                If Mid$(unescape, i + 1, 1) = "u" Then
                    sTmp = CStr(CLng("&H" & Mid$(unescape, i + 2, 4)))
                    If IsNumeric(sTmp) Then
                        unescape = Left$(unescape, i - 1) & ChrW$(CInt("&H" & Mid$(unescape, i + 2, 4))) & Mid$(unescape, i + 6)
                    End If
                Else
                    sTmp = CStr(CLng("&H" & Mid$(unescape, i + 1, 2)))
                    If IsNumeric(sTmp) Then
                        unescape = Left$(unescape, i - 1) & ChrW$(CInt("&H" & Mid$(unescape, i + 1, 2))) & Mid$(unescape, i + 3)
                    End If
                End If
        End Select
    Next
End Function

```


実行例:

```
?escape("あたしはかこめabcdefg%#?<>*+[]<>/\'""")
%u3042%u305F%u3057%u306F%u304B%u3053%u3081abcdefg%25%23%3F%3C%3E%2A%2B%5B%5D%3C%3E%2F%5C%27%22

?unescape("%u3042%u305F%u3057%u306F%u304B%u3053%u3081abcdefg%25%23%3F%3C%3E%2A%2B%5B%5D%3C%3E%2F%5C%27%22")
あたしはかこめabcdefg%#?<>*+[]<>/\'"
```
新規eclipseプロジェクトをGitHubにPUSHする手順

## ローカルリポジトリ作成
1. プロジェクト右クリック -> チーム -> プロジェクトの共用
1. リポジトリタイプにGitを選択し、次へ
1. プロジェクトの親フォルダー内のリポジトリーを仕様または作成にチェック
1. リポジトリーの作成を押下
1. 完了ボタン押下

## ソースコミット
1. コミット

## リモートリポジトリにPUSH
1. GitHub側でリポジトリを作成しておく
1. プロジェクト右クリック -> チーム -> リモート -> プッシュ

# 参考リンク
[Django v1.0 documentation](http://djangoproject.jp/doc/ja/1.0/intro/)
cocos2d-iPhoneとSpriteBuilderでゲームを1週間で作ろう

SpriteBuilderのグラフィカルなインターフェースを使って簡単に1週間でFlappyBirdっぽいアプリを作ります。

![Untitled83.gif](https://qiita-image-store.s3.amazonaws.com/0/6688/a1329fc4-4828-29a3-a93b-6f93d44bcbab.gif)


iPhoneアプリでゲームを作るにはコードをガリガリ書かなければいけないわけですが、SpriteBuilderを使うことで、ほとんどプログラミングをせずにゲームを完成させることができます。

[1日目][ソフトをインストール。背景画像を設置](http://www.hugkey.com/402/)
[2日目][主人公をつくる](http://www.hugkey.com/426/)
[3日目][物理演算を導入する](http://www.hugkey.com/448/)
[4日目][主人公と背景を動かす](http://www.hugkey.com/478/)
[5日目][主人公を飛ばす](http://www.hugkey.com/515/)
[6日目][障害物を設置する](http://www.hugkey.com/547/)
[7日目][当たり判定、リスタートを実装して、完成！](http://www.hugkey.com/602/)



![82b26f191701049404273749fdecfca9-1024x676.png](https://qiita-image-store.s3.amazonaws.com/0/6688/00346171-85c4-e399-d66c-a976aa08208c.png)
↑SpriteBuilderの画面
Chart.jsの棒グラフで色分けする方法

## Chart.jsの棒グラフは色分けできない＼(^o^)／

Chart.jsはcanvasを使ったグラフ描画ライブラリです。
ここに来るということはChart.jsをすでにご存知で、棒グラフで色分けする方法を知りたい人なはず（確信
ソースコードを改変したらできたので、改変場所を教えます。

## 完成プレビュー

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/29861/641022c6-6283-119e-fa49-b4e37982b85d.png)

## やり方

改良前

```js:Chart.js
1163       ctx.beginPath();
1164       ctx.fillStyle = this.fillColor;
1165       ctx.strokeStyle = this.strokeColor;
1166       ctx.lineWidth = this.strokeWidth;
|
2002               fillColor : dataset.fillColor,
2004               highlightFill : dataset.highlightFill || dataset.fillColor,
2005               highlightStroke : dataset.highlightStroke || dataset.strokeColor
```

改変後コード

```js:Chart.js
1163       ctx.beginPath();
+- 1164    ctx.fillStyle = this.fillColor[this.index];
+- 1165    ctx.strokeStyle = this.strokeColor[this.index];
1166       ctx.lineWidth = this.strokeWidth;
|
2002               fillColor : dataset.fillColor,
+ 2003             index : index,
2004               highlightFill : dataset.highlightFill || dataset.fillColor,
2005               highlightStroke : dataset.highlightStroke || dataset.strokeColor
```

棒の色指定方法

```js:xxx.js
var ctx = document.getElementById("chart").getContext("2d");
var data = {
      labels : ["January","February","March","April","May","June","July"],
      datasets : [
        {
          fillColor   : [
            "rgba(131,185,206,0.5)",
            "rgba(131,185,206,0.5)",
            "rgba(131,185,206,0.5)",
            "rgba(131,185,206,0.5)",
            "rgba(246,133,124,0.5)",
            "rgba(246,133,124,0.5)",
            "rgba(206,195,73,0.5)"
          ],
          strokeColor : [
            "rgba(131,185,206,1)",
            "rgba(131,185,206,1)",
            "rgba(131,185,206,1)",
            "rgba(131,185,206,1)",
            "rgba(246,133,124,1)",
            "rgba(246,133,124,1)",
            "rgba(206,195,73,1)"
          ],
          data : [65,59,90,81,56,55,40]
        }
      ]
}
chart = new Chart(ctx).Bar(data);
```

## 終わりに

最初からその機能ちょうだい
pip + peco + ${キミの好きなエディタ} で今使っているeggの詳細を見る


inspired by: http://qiita.com/udzura/items/53d51af129b400fd2b45


僕の求めてた便利最高があったけど普段書くのはPythonなのでpip版をつくった

```zsh

function peco-installed-pip-open() {
  PIP_MODULE=$(pip freeze | peco | sed -e "s/==.\+$//g")
  if [ "$PIP_MODULE" = "" ]; then
    return 1
  fi

  PKG_LOCATION=$(pip show ${PIP_MODULE} | grep '^Location:\s' | sed -e "s/^Location:\s//g")
  if [ "$PKG_LOCATION" = "" ]; then
    return 1
  fi

  PATH_TO_PKG_DIR="${PKG_LOCATION}/${PIP_MODULE}"
  if [ -e ${PATH_TO_PKG_DIR} ]; then
    BUFFER="${EDITOR} ${PATH_TO_PKG_DIR}"
  else
    BUFFER="${EDITOR} ${PATH_TO_PKG_DIR}.py"
  fi
  zle accept-line
}

zle -N peco-installed-pip-open
bindkey '^[;p' peco-installed-pip-open  # Meta-; p

```

これで多い日も安心ですね。

`pip show --files`はbundleのやつみたいに便利じゃないので適当にあれしてます。
あと僕は`zle clear-screen`したくないのでしたい場合の人は適当にあれするといいとおもいます。

atomのプロジェクト検索便利そうだけど、ひとまず僕はvimしてます。
vimの人は、ディレクトリを開いたときにVimFilerが開くようにとかしておくと便利が発生するのでいいとおもいます。


[pecoからCodicひくやつ](http://hachibeechan.hateblo.jp/entry/2014/07/09/peco%E3%81%8B%E3%82%89Codic%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%A4%89%E6%95%B0%E5%90%8D%E3%81%A8%E3%81%8B%E8%80%83%E3%81%88%E3%82%8B) とかも作ったけど結構便利してるので、みんなもpecoをアレするといいですね。おしまい。
Railsでストアドプロシージャを定義する例

Migration中に記述する例

```bash
rails generate migration AAAProcedure
```

```rb

clas AAAProcedure < ActiveREcord::Migration
  def self.up
    execute <<-SQL
CREATE PROCEDURE my_procedure (IN in_param INTEGER, OUT out_param INTEGER)
BEGIN
  set @local=100;
  select ほにゃらら;
END
SQL

  def self.down
    execute "DROP PROCEDURE my_procedure;"
  end
end
```

```bash
rake db:migrate
```

ハマった点

- DELIMITER は不要。
- 文末の;は必須
- selectで出力変数に値を出力する際は、列の末尾に指定する必要がある(?)
ggplot2で散布図を書いて各点の頻度で色を変える


# 散布図で各点の頻度を色で示す
## 基本的な書き方

```r
g <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width))
g <- g + stat_bin2d(bins=75)
g <- g + scale_fill_gradientn(colours=c("green","black","magenta"),limits=c(0,5))
```
プロットの頻度を色で示すには`stat_bin2d`を使う。もしくは`stat_binhex()`を使って六角形のプロットにすることもできる。`stat_bin2d`の引数`bins`で大きさを調整できる。

`scale_fill_gradientn`で色合いなどを決められる。右から最小、真ん中、最大を`colors`で設定。最大値と最小値を`limits`で設定する。

## 任意に中央値を決める
中央に指定した色を中央値からずらして任意の値にしたいときは`values`とscalesパッケージの`rescale`を使って`scale_fill_gradientn`のオプションに以下のように追加する。

```r
library("scales")
g <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width))
g <- g + stat_bin2d(bins=75)
g <- g + scale_fill_gradientn(colours=c("green","black","magenta"),limits=c(0,5),values=rescale(c(0,1,5))
```

## フォントとか設定する（Theme）
あとは目盛のフォントサイズなどを整えて出来上がり。

```r
g <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width))
g <- g + stat_bin2d(bins=75)
g <- g + g <- g + scale_fill_gradientn(colours=c("green","black","magenta"),limits=c(0,5),values=rescale(c(0,1,5))
g <- g + xlab("Sepal length") + ylab("Sepal width")
g <- g + theme(axis.title.x = element_text(size=16), axis.title.y = element_text(size=16), axis.text.x = element_text(size=14),axis.text.y = element_text(size=14),legend.title=element_text(size=14),legend.text=element_text(size=14))
```

## 出来上がりサンプル
中央色を中央値として使用した散布図
![iris_width_length1.png](https://qiita-image-store.s3.amazonaws.com/0/43054/38b7cf65-2e75-6fb1-8071-096e986c9431.png "iris_width_length1.png")

中央色の値を1に設定した散布図
![iris_width_length2.png](https://qiita-image-store.s3.amazonaws.com/0/43054/6738dea0-2683-0ea9-c4f3-553cc3695adb.png "iris_width_length2.png")
ChromeAppとかExtensionsでVue.jsを使うために

セキュリティのため普通にVue.jsを読み込んで `v-on="click:...` とか使おうと思うと。

```
Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "default-src 'self' chrome-extension-resource:". Note that 'script-src' was not explicitly set, so 'default-src' is used as a fallback
```

と言った感じに怒られるので。

manifest.jsonにsandboxを追加してあげます。

```json:manifest.json
{
  "manifest_version":2,
  ...

  "sandbox":{
    "pages":[
      "index.html"
    ]
  },

  ...
}
```
scikit-learnによる多クラスSVM

# scikit-learnによる多クラスSVM

## 目的
scikit-learnのSVM（SVC）は，多クラス分類を行うとき，one-versus-oneで分類する．
しかし，one-versus-the-restの方が識別性能がいい場合がある（多い，という報告を見かける）ので，
sklearn.multiclassのOneVsRestClassifierを使った
**one-versus-the-restでの多クラスSVM分類**の仕方をメモしておく．
（注）ただし，LinearSVCはデフォルトでone-versus-the-restを採用している．

## One-versus-the-restとOne-versus-one
$K$クラス分類問題を考える．

### One-versus-the-rest
ある特定のクラスに入るか，他の$K-1$個のクラスのどれかに入るかの2クラス分類問題を解く分類器を$K$個利用する．

### One-versus-one
ある特定のクラスに入るか，また別の特定のクラスに入るかの2クラス分類問題を解く分類器を$K(K-1)/2$個利用する．

## 多クラスSVM

digitsデータセットを使い，手書き文字の10クラス分類をRBFカーネルのSVMで行う．

### パッケージのインポート
```python:
from sklearn.datasets import load_digits
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score
```

### データの読み込み

```python:
digits = load_digits()
train_x, test_x, train_y, test_y  = train_test_split(digits.data, digits.target)
```

### ハイパーパラメータの設定

```python:
C = 1.
kernel = 'rbf'
gamma  = 0.01
```

### One-versus-the-restによる識別

```python:
estimator = SVC(C=C, kernel=kernel, gamma=gamma)
classifier = OneVsRestClassifier(estimator)
classifier.fit(train_x, train_y)
pred_y = classifier.predict(test_x)
```

### one-versus-the-oneによる識別（デフォルト）

```python:
classifier2 = SVC(C=C, kernel=kernel, gamma=gamma)
classifier2.fit(train_x, train_y)
pred_y2 = classifier2.predict(test_x)
```

### 識別結果

```python:
print 'One-versus-the-rest: {:.5f}'.format(accuracy_score(test_y, pred_y))
print 'One-versus-one: {:.5f}'.format(accuracy_score(test_y, pred_y2))
```

One-versus-the-rest: 0.95333
One-versus-one: 0.79111

One-versus-the-restの方が高い識別性能を示している．


## 関連リンク
[pylearn2.models.svm](https://github.com/lisa-lab/pylearn2/blob/master/pylearn2/models/svm.py)（sklearnのwraper）
[sklearn.multiclass.OneVsRestClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html)
[Ex. sklearn.multiclass.OneVsRestClassifier](http://scikit-learn.org/stable/auto_examples/plot_multilabel.html#example-plot-multilabel-py)
[sklearn.svm](http://scikit-learn.org/stable/modules/svm.html)
MSTestでのテストクラスの継承とTestInitialize/TestCleanup

テストクラスを継承した場合、Initialize/Cleanup系がどのように動作するのか調べてみた。


# まとめ
* 基底クラスで定義されたものはTestInitialize/TestCleanupのみ呼ばれる。
* 基底クラスではTestInitializeAttributeがついたメソッドは複数定義可能だが、実体側ではひとつのみ定義可能(Exception)。

表にすると次の通り。

|種類                  | 基底クラス | 派生クラス(実体) |
|:---------------------|:----------:|:----------:|
| AssemblyInitialize   |  ×        |     ○     |
| ClassInitialize      |  ×        |     ○     |
| TestInitialize       |  ○        |     ○     |
| TestCleanup          |  ○        |     ○     |
| ClassCleanup         |  ×        |     ○     |
| AssemblyInitialize   |  ×        |     ○     |

# コード

```csharp
public class MyTestClassBase
{
    [AssemblyInitialize]
    public static void BaseAssemblyIntiialize()
    {
        System.Diagnostics.Trace.WriteLine("BaseAssemblyIntiialize");
    }

    [ClassInitialize]
    public static void BaseClassInitialize()
    {
        System.Diagnostics.Trace.WriteLine("BaseClassInitialize");
    }

    [TestInitialize]
    public void BaseTestInitialize()
    {
        System.Diagnostics.Trace.WriteLine("BaseTestInitialize");
    }

    [TestInitialize]
    public void BaseTestInitialize2()
    {
        System.Diagnostics.Trace.WriteLine("BaseTestInitialize2");
    }

    [TestCleanup]
    public void BaseTestCleanup()
    {
        System.Diagnostics.Trace.WriteLine("BaseTestCleanup");
    }

    [ClassCleanup]
    public static void BaseCleanup()
    {
        System.Diagnostics.Trace.WriteLine("BaseCleanup");
    }

    [AssemblyCleanup]
    public static void BaseAssemblyCleanup()
    {
        System.Diagnostics.Trace.WriteLine("BaseAssemblyCleanup");
    }
}

[TestClass]
public class MyTestClass : MyTestClassBase
{
    [AssemblyInitialize]
    public static void AssemblyIntiialize(TestContext testContext)
    {
        System.Diagnostics.Trace.WriteLine("AssemblyIntiialize");
    }

    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
        System.Diagnostics.Trace.WriteLine("ClassInitialize");
    }

    [TestInitialize]
    public void TestInitialize()
    {
        System.Diagnostics.Trace.WriteLine("TestInitialize");
    }

    /* -> Exception!!
    [TestInitialize]
    public void TestInitialize2()
    {
        System.Diagnostics.Trace.WriteLine("TestInitialize2");
    }*/

    [TestCleanup]
    public void TestCleanup()
    {
        System.Diagnostics.Trace.WriteLine("TestCleanup");
    }

    [ClassCleanup]
    public static void ClassCleanup()
    {
        System.Diagnostics.Trace.WriteLine("TestClassCleanup");
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
        System.Diagnostics.Trace.WriteLine("AssemblyCleanup");
    }

    [TestMethod]
    public void TestMethod()
    {
        System.Diagnostics.Trace.WriteLine("TestMethod");
    }
```

# 結果
```
ClassInitialize
BaseTestInitialize2
BaseTestInitialize
TestInitialize
TestMethod
TestCleanup
BaseTestCleanup
TestClassCleanup
```
プリインストールのzshからHomebrewのzshに移行した


#Why?
なんかよさげだったから（ｺﾅﾐｶﾝ
バージョンが上だし
アップデートもしやすそうだし
みんなそれでやってるっぽいから（結論）

#実際にやってみる
とりあえず`brew info zsh`してみる

```zsh:Terminal
$ brew info zsh
zsh: stable 5.0.5 (bottled)
http://www.zsh.org/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/zsh.rb
==> Dependencies
Required: gdbm ✔, pcre ✔
==> Options
--disable-etcdir
	Disable the reading of Zsh rc files in /etc
==> Caveats
Add the following to your zshrc to access the online help:
  unalias run-help
  autoload run-help
  HELPDIR=/usr/local/share/zsh/helpfiles
```

なるほど。デフォルトのzshが`5.0.2`だったから`5.0.5`でちょっと新しくなっている。
それから`--disable-etcdir`でデフォルトの設定を無効にできるらしい。思ったよりも簡単に出来そうだ。

#いざインストール！！

```zsh:Terminal
$ brew install --disable-etcdir zsh
==> Downloading https://downloads.sourceforge.net/project/zsh/zsh/5.0.5/zsh-5.0.5.tar.bz2
Already downloaded: /Library/Caches/Homebrew/zsh-5.0.5.tar.bz2
==> ./configure --prefix=/usr/local/Cellar/zsh/5.0.5 --enable-fndir=/usr/local/Cellar/zsh/5.0.5/share/zsh/functions --enable-scriptdir=/usr/local/Cellar/zsh/5.0.5/share/zsh/scripts 
==> make install
==> make install.info
==> Caveats
Add the following to your zshrc to access the online help:
  unalias run-help
  autoload run-help
  HELPDIR=/usr/local/share/zsh/helpfiles
==> Summary
?  /usr/local/Cellar/zsh/5.0.5: 1070 files, 10M, built in 92 seconds
```

よしきた（一回試しにやったのがバレたかな）
次に、デフォルトのシェルのパスを変更する。
なんでもいいけど`sudo vi /etc/shells`みたいな感じで`/etc/shells`に`/usr/local/bin/zsh`を追記する
\*ロックがかかっているので`sudo`で

試しにターミナルに再起動をかけると、、

```zsh:Terminal
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses --- 
```

設定ファイルがないよーという旨のメッセージが出てくる。

実際にはあるんだけど読み込まれなくなっている。これは`brew install`するときにつけた`--disable-etcdir`というオプションが効いている証拠ですね。(`/etc/zshenv`で`$ZDOTDIR`を設定していたのが読み込まれなくなっている)

なので元々あった設定を引き継ぎます
`$ sudo mv /etc/zshenv ~/.zshenv`

これで元々の設定で動くようになりました。

意外と楽に移行できたかも？
railsプロジェクトで個人的によく使う便利メソッド集


よく使う便利なメソッドをまとめてみた。

## pluck
``map``でもいいけど``pluck``のほうがselectするカラムを指定するので、効率がよい。

```rb
pry(main)> User.where(id: 100).map(&:id)
SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
=> [100]
```

```rb
pry(main)> User.where(id: 100).pluck(:id)
SELECT `users`.`id` FROM `users` WHERE `users`.`id` = 100
=> [100]
```

参考 : http://blog.livedoor.jp/sasata299/archives/51847390.html
参考url読むとわかるが、実はselectの絞り込みの分だけではなく、
ActiveRecordオブジェクトを生成しないかららしい。

## each_with_object
「初期化して、eachして値を格納してその値を返す」という処理は、
そのまま書けば下記のように書く(最後のobjとか忘れがち)

```rb
def test(array)
  obj = []
  array.each do |value|
    obj << {value: value}
  end
  obj
end
```

しかし``each_with_object``を使えばもっと簡潔に書ける

```rb
def test(array)
  array.each_with_object([]) do |value, obj|
    obj << {value: value}
  end
end
```

## first_or_create
そのままの意味。
あったら引っ張ってきて、なかったら作る

```rb
Book.where(title: "初めてのruby").first_or_create
```

## find_each

``each``だと全データをメモリ展開してしまうので、
たくさんのデータを対象にした処理とかはメモリから溢れてしまうかもしれない…
なので``find_each``で少しずつ展開する方が良い。

```rb
User.where(push_flag: true).find_each do |user|
  push_method(user)
end
```

ちなみにデフォルトは1000件だが、下記のようにまとめる量を指定することもできる。
``find_each(batch_size: 500)``

参考 : http://blog.livedoor.jp/sasata299/archives/51882704.html

## to_sql
吐き出されるqueryが確認できる。

```rb
pry(main)> User.where(id: 100).to_sql
=> "SELECT `users`.* FROM `users`  WHERE `users`.`id` = 100"
```

## explain
EXPLAINの出力を確認できる。
参考のurlとかを見ながらチューニングしてる

```rb
pry(main) > puts User.where(id: 100).explain
User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
EXPLAIN (0.2ms)  EXPLAIN SELECT `users`.* FROM `users` WHERE `users`.`id` = 100
EXPLAIN for: SELECT `users`.* FROM `users`  WHERE `users`.`id` = 100
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | users | const | PRIMARY       | PRIMARY | 4       | const |    1 |       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
```

参考 : http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html

## まとめ
まだまだ色々ありますが、便利なメソッドはつかっていきたい！