OmniAICreator/Qiita-1.07M huggingface dataset:
labelのforの対象は後から追加されても有効

`label`要素の`for`属性で、対象となる`input`要素の`id`属性を指定した時、その対象は後からDOMツリーに差し込まれたものでも有効になります。

こんなんで検証しました。

```html:label-for.html
<!doctype html>
<button onclick="removeInput()">Remove input</button>
<button onclick="insertInput()">Insert input</button>

<label for="input">label</label>
<input id="input">

<script>
inputs = document.getElementsByTagName("input");
function removeInput() {
    console.info(inputs.length, inputs);
    for (var l = inputs.length, i = l - 1; i >= 0; i--) {
        var input = inputs[i];
        input.parentNode.removeChild(input);
    }
}
function insertInput() {
    console.info(inputs);
    var input = document.createElement("input");
    input.id = "input";
    document.body.appendChild(input);
}
</script>
```

「Remove input」ボタンを押して`input`を削除した後に「Insert input」ボタンを押してDOMツリーに挿入しても、`label`をクリックすると追加された`input`にフォーカスが当たります。

でなんなの、便利でよかったね？　という話に見えるかも知れませんが、**カスタムエレメントを作る時に気を付けることが増えます。**似たようなインターフェイスの要素を作る時は、（`MutationObserver`とかで）DOMツリーを監視して、後から追加される要素にも対応できるようにしておいた方が、ユーザー（タグを書く人）の期待に沿うことが多いでしょう。

もちろん、こういう監視がたくさん生まれてるとパフォーマンスが心配になってきますね。だから、現実的には「後から追加された要素にも対応する」フラグの属性を定義して、デフォルトでオフにしておくのがいいかも知れません。

---

余談ですが、このような「後からの追加を監視するか否か」という状態を両方持つ物を僕達はよく知っています。DOMの`NodeList`です。

`Node.chideNodes`や`Document.getElementsByTagName()`なんかで取得した`NodeList`は後からの追加を監視しているので、DOMツリーの変更に応じて動的に内容が変わります（なので削除しながら順に処理する場合なんかは最初じゃなくて最後から処理する必要があったりする）。
一方で`Document.querySelectorAll()`で返す`NodeList`は監視しません。例えば`var divs = document.querySelector("div")`と`NodeList`を取得した後に、`div`を足したり追加したりしても、`divs`変数の内容は変わりません。

そしてこの二つ、区別するAPIがありません……おっと愚痴になってしまいました。

のでまあ、後から監視しなくても「完全に期待に反している」わけではないのでまあいいかなと思います。

`NodeList`の「後からのDOMツリーの変更への対応」はliveコレクションか否か、ということで例えばMDNに載っています：https://developer.mozilla.org/ja/docs/Web/API/NodeList
railsを起動しようとしたら「Internal Server Error」が表示されたときの対処方法

## エラー内容

- [rails serverを起動する](http://qiita.com/yoshimikeisui/items/0872739e771f8a18a956#rails-server%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B-125-rails-server) を見ながら、 `$ rails s` を起動させようとしたところ、以下のような画像と表示が出た

![150222-0001.png](https://qiita-image-store.s3.amazonaws.com/0/51391/90fd06f4-9e1c-55eb-86bb-9a7d25dbf524.png)

```
You didn't set config.secret_key_base. Read the upgrade documentation to learn more about this new config option.
```

## 対処方法

- rails のバージョンが問題らしい
- `Gemfile` を開いてrailsのバージョンを `4.0.5` から `4.2.0` にした

## その後

```
$ bundle update
$ bundle install
```

**無事、以下のように表示された**

![150222-0002.png](https://qiita-image-store.s3.amazonaws.com/0/51391/aef5de5c-d96c-c524-417b-ccc6f8be6d87.png)


## 参考サイト

- [railsの実行でYou must set config.secret_key_base in your app's config.のエラーが出た時の対応](http://qiita.com/244mix/items/5b7a0496b9482921b20a)
Atomで開いてるタブを縦に並べるCSS

をみつけて最高にライフチェンジングだった。（正確にはlessだが）

[Vertical file tab list in Atom](https://gist.github.com/jasesmith/114da4e5310eda6238f0 "Vertical file tab list in Atom")

![](http://i.gyazo.com/133437d95a9946f33f1324009389cb71.png)

次のlessを ~/.atom/styles.lessに追加する。

```
atom-pane.pane {
    -webkit-flex-direction: row;
    -webkit-flex-wrap: wrap;
    &:before {
        content: 'Open Files';
        color: #787878;
        padding: 5px 10px;
        display: block;
        position: absolute;
        top: 0;
        left: 0;
    }
    .item-views {
        box-shadow: -1px 0 0 0 rgba(0,0,0,.5)
    }
}

.tab-bar {
    height: auto;
    overflow-x: hidden;
    overflow-y: auto;
    -webkit-flex-direction: column;
    padding: 0;
    margin-top: 26px;
    box-shadow: inset 0 -8px 8px -4px rgba(0, 0, 0, 0.15), 0 -1px 0 0 rgba(0,0,0,.5);
    &:after {
        display: none;
    }
    &.list-inline > li:first-child {
        padding-left: 10px;
    }
    .placeholder {
        position: relative;
        height: 1px;
        width: auto;
        margin: 0;
        box-shadow: none;
        &:after {
            display: none;
        }
    }
    .tab {
        max-width: none;
        -webkit-flex: 0 0 auto;
        margin: 0 0 0px 0;
        top: 0;
        padding: 0 20px 0 10px;
        background: rgba(255,255,255,.05);
        box-shadow: 0 -1px 0 0 rgba(0,0,0,.3) inset;
        height: auto;
        &.is-dragging {
            background: rgba(0,0,0, .65);
        }
        &:before, &:after {
            display: none;
        }
        &.is-dragging {
            box-shadow: 0 0 0 1px #484848;
        }
        &:not(.is-dragging):hover {
            background: rgba(255,255,255,.1);
            box-shadow: 0 0 6px 0 #000, 0 -1px 0 0 rgba(0,0,0,.5) inset;
        }
        &.active {
            -webkit-flex: 0 0 auto;
            width: auto;
            background: none;
            box-shadow: 0 0 6px 0 #000;
        }
        .title {
            padding-right: 10px;
        }
        .close-icon {
            right: 10px;
            line-height: 200%;
        }
        &.modified:not(:hover) {
            .close-icon {
                right: 10px;
            }
        }
    }
}

```
Ansibleでtemplateのdestに設定されている値を取得する

Ansibleでtemplateタスクを使う時、これから生成しようとするファイルが既に存在する場合、そのファイルには、どんな値が設定されているか知りたい時がある。

そこで、現在のdestの変数部分にあたる値を取得するスクリプトをざっくり書いてみた。

こんなansibleのタスクと、

```yaml:example.yml
   - template: |
       src=src.conf
       dest=dest.conf
```
こんなtemplateがあるとする。

```text:src.conf
tmp_dir={{ tmp_dir }}
```

で、既にdestにあたるファイルが存在する場合、変数部分に何の値が入っているか知りたい。この例だと/tmpにあたる。

```text:dest.conf
tmp_dir=/tmp
```

そこで、以下のスクリプトを書いてみた。

```ruby:get_dest_value.rb
delimitor="!!del!!"
template_variable_symbol=/{{.*?}}/

src_filename=ARGV[0]
dest_filename=ARGV[1]

src_file=open(src_filename).read.split("\n")
dest_file=open(dest_filename).read.split("\n")

cnt=0
src_file.each{|f|

  src_str=src_file[cnt]
  dest_str=dest_file[cnt]

  mask=src_str.gsub(template_variable_symbol,delimitor).split(delimitor)
  template_variable=src_str.scan(template_variable_symbol)

  dest_variable=[]

  (0..mask.size-1).each{|i|

    mask_preffix=""

    (0..i).each{|i|

      if i==0

        mask_preffix+=mask[i]

      else i>0

        if !dest_variable[i-1].nil?

          mask_preffix+=dest_variable[i-1]
          mask_preffix+=mask[i]

        end

      end

    }

    mask_suffix=""
    if mask[i+1].nil?
      mask_suffix="$"
    else
      mask_suffix=mask[i+1]
    end

    /#{mask_preffix}(.*?)#{mask_suffix}/ =~ dest_str

    dest_variable << $1

    print "#{template_variable[i]} : #{dest_variable[i]}\n"

  }

  cnt+=1

}
```

スクリプトを実行すると、destに設定されている値が表示される。
templateがマスクになってるイメージですかね。

```
$ ruby get_dest_value.rb src.conf dest.conf 
{{ tmp_dir }} : /tmp
```
サーバで設定ファイル直接書き換えられてる可能性がある場合や、
未知のサーバに対してtemplate適用したい際の現状調査や、
serverspecと組み合わせて、設定ファイルのテストとかできる。

ansibleのDry-runだとちょい物足りないときとか使えばいい。
最近のGoogle Mobile Ads SDK (adMob) の使い方 [7.0.0]


6前半から7.0.0にアップデートしましたが、使い方が変わってました。

## import

簡単になりました。

	@import GoogleMobileAds;

## 初期化

デバイスを判定してバナーサイズを自動変更するSmart BannerでiPhone 6やiPhone 6 Plus対応も簡単。以下は縦(Portrait)の場合。

	[[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];


## 参考

- [AdMob iOS Guides](https://developers.google.com/mobile-ads-sdk/docs/admob/ios/quick-start)
- [Banner Ad Customization](https://developers.google.com/mobile-ads-sdk/docs/admob/ios/banner)


以上
タッチパネルのモックアップ

UI/UXのイメージを固めるため、モックアップを作成する事にして、何かいいものがあった！https://www.fluidui.com/features
これ以外にももっと魅せるものもあるけど、すぅ〜とカタチにできたので(^ ^)
今回は、自分のお気に入りアプリ”Money Tree"を参考にさせてもらおうと思います。
シンプル＆使いやすいをコンセプトに！
色見本は、ここいらを
http://www.google.com/design/spec/style/color.html#
PHPのExceptionの処理で、catchしたら、どうするのがいいのか

PHPのException処理で、catchしたら、どうするのがいいのかと考えた末に、自分は、こうしています。

# 例

```php
catch (\Exception $e) {
    throw new \HogeException('error-message', 0, $e);
}
```

## ちょっと解説

今まで自分が見てきたコードでは、下記のような書き方をしているのを幾つか見ることがあった。

```php
catch (\Exception $e) {
    throw new \HogeException($e->getMessage());
}
```
ただ、これだとせっかくcatchしたexceptionのインスタンスをほぼ捨ててしまっていて、もったいない（障害等で調査するときのネタを捨ててしまっていることになる）。

最初のコードの書き方であれば、受け取ったインスタンスを捨てずに済み、障害時にも必要な情報を取得することができやすくなった気がする。。。たぶん。。。
ただの気分でMacPortsからHomebrewに乗り換えたったwww


いやまあ、MacPortsが使いづらかったのは確かなのですけれども。
乗り換えようと思ったら`Mavericks`から`Yosemite`に変更していたせいでちょっと面倒くさかったのでメモがてら。

## 手順
1. MacPortsのアンインストール
2. Homebrewのインストール

### 1. MacPortsのアンインストール

> [2.4. Uninstall](http://guide.macports.org/chunked/installing.macports.uninstalling.html)

上記を参考にしてアンインストールを実行。
アンインストールしたいのであれば、えーまずは下記コマンドを実行すべし。

```bash
$ sudo port -fp uninstall installed
```

```bash
WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
```

パスワード要求するから入力してやったのにキレやがった(意訳

```bash
Error: Current platform "darwin 14" does not match expected platform "darwin 13"
Error: If you upgraded your OS, please follow the migration instructions: https://trac.macports.org/wiki/Migration
OS platform mismatch
    while executing
"mportinit ui_options global_options global_variations"
Error: /opt/local/bin/port: Failed to initialize MacPorts, OS platform mismatch
```

お前yosemiteにして以降、MacPorts弄ってないやろ！？
バージョン違うてんぞボケコラカスぅ！！

#### 1.1. マイグレーションってなんだろう？

なんか速攻でサボったのバレたんで、とりあえず言いなりにwikiサイトを見よう。

> [Migrating a MacPorts installation](https://trac.macports.org/wiki/Migration)

マイグレーションとかいうののやり方は、以下な感じ。

1. Xcode入れ直せやボケぇ。
2. Macports base入れ直せやボケぇ。
3. ports入れ直せやボケぇ。

yosemiteにした際にXcodeは更新されていたので、１は大丈夫だろう。
２に関しては、baseを入れ直す他に、macports.confをなんか弄ってたらなんかしろって書いてあるけど長いので以下略。
３は手順が記されているのでその通りにやれば大丈夫だろう。

##### 1.1.1 MacPorts baseを再インストール

> [Installing MacPorts](https://www.macports.org/install.php)

上記の"Quickstart"の項にある"OS X 10.10 Yosemite"というリンクをクリックして、`MacPorts-2.3.3-10.10-Yosemite.pkg`をダウンロード。
ダウンロードしたpkgを`command`+`o`で開くとウィザードが開始するのでインストール。
あとは下記コマンドを入力するだけ。

```bash
$ sudo port -v selfupdate
```

### 1'. もっかいアンインストールしてみる

MacPorts自体をアンインストールしてしまうので、インストールしてあるツールをアップデートする必要はないだろう。
というわけでダメ元で手順すっとばして再度アンインストールコマンドを打ってみた。

```bash
$ sudo port -fp uninstall installed
--->  Deactivating autoconf @2.69_2
.
.
.
```

今度はうまくいった。
ので、続きのコマンドも入力しよう。
まあ、後始末って感じだろうか。
……なんかWindowsっぽいな。

```bash
$ sudo rm -rf \
  /opt/local \
  /Applications/DarwinPorts \
  /Applications/MacPorts \
  /Library/LaunchDaemons/org.macports.* \
  /Library/Receipts/DarwinPorts*.pkg \
  /Library/Receipts/MacPorts*.pkg \
  /Library/StartupItems/DarwinPortsStartup \
  /Library/Tcl/darwinports1.0 \
  /Library/Tcl/macports1.0 \
  ~/.macports
```

はい、これでMacPortsのアンインストールは完了。
個人的にはツールの類は再度必要になった都度インストールすればいいと思っているので、リストすら作らなかったわけだが、必要な人は上記マイグレーションの項のリンク先に書いてあるっぽいので参考にしてみてください。

### 2. Homebrewのインストール

Xcodeさえ入っていればこれは簡単な模様。

```bash
$ mkdir homebrew && curl -L https://github.com/Homebrew/homebrew/tarball/master | tar xz --strip 1 -C homebrew
```

これでインストール完了。
あとはパスを通すためにシンボリックリンクを`/usr/local/bin`に貼ってやれば良い。
Gem::RemoteFetcher::FetchError: SSL_connect

bundle install でエラー。これ何度もはまってる(T_T)
ruby2.3系でも同じエラーでハマった…
ここが詳しい⇒ [RubyInstallerでRuby2.1系を入れた後にRubygems証明書を入れ替えずにgemコマンドを使えるようにする](http://qiita.com/riocampos/items/ed56cd178be7506b6706)

```
>bundle install
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using rake 10.4.2
```

エラーはこれ

```
Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certific
ate verify failed (https://rubygems.org/gems/faker-1.1.2.gem)
An error occurred while installing faker (1.1.2), and Bundler cannot continue.
Make sure that `gem install faker -v '1.1.2'` succeeds before bundling.
```

```ruby:Gemfile
source 'https://rubygems.org'
# ruby '2.0.0'
ruby '1.9.3'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.5'
gem 'bootstrap-sass', '2.3.2.0'
gem 'sprockets', '2.11.0'
gem 'bcrypt-ruby', '3.1.2'
gem 'faker', '1.1.2'
```

### 解決: 正しい証明書ファイルに置き換える
※詳しい方法はこちら。
http://qiita.com/shimoju/items/394818b4989b94680aaf

概略：
 1. 以下のStep1からAddTrustExternalCARoot-2048.pemというファイルをダウンロードしてくる。
https://gist.github.com/luislavena/f064211759ee0f806c88#step-1-obtain-the-new-trust-certificate

 2.ダウンロードしたファイルをssc_certsというフォルダーにコピーする。

```
C:\RailsInstaller\Ruby2.1.0\lib\ruby\2.1.0\rubygems\ssl_certs
```
※どうやっても全然解決しないと思ったら、rubygems直下に置いていたということがあったので、パスには十分注意すること。

以上。

そうすると、以下も成功するようになるし、bundle install も成功するようになる。

```
>gem update --system
```

実はこれをやっても解決しないこともあった… ※RailsIntaller(Ruby2.2版)
そんな時には緊急避難的対処を…

### https ⇒ http に
Gemfileの1行目、`https` を `http` に変更すれば、bundle install には成功するようになる。

```:Gemfile
source 'http://rubygems.org'
```
※すぐに元に戻しておいたほうがいいと思う。

あと、ホームディレクトリの `.gemrc` に記載されている、`https://...`の行を削除すれば、gem install なども成功するようになる。

```:.gemrc
---
:backtrace: false
:bulk_threshold: 1000
:sources:
- http://rubygems.org/
- https://rubygems.org/   ← ★この行を削除
:update_sources: true
:verbose: true
install: --no-document
update: --no-document
```
※すぐに元に戻しておいたほうがいいと思う。

参考：
http://d.hatena.ne.jp/iishun/20120423/1335200728
Rubyでの||=（ダブルパイプイコール ・Double Pipe / Or Equals）について

Rubyで見かける「||=」という演算子について。

見慣れないのでどういうものかといったものですが、

```rb
a ||= b
```

の意味としては

```rb
a = a || b
```

とイコールの意味のようです。

★What Ruby’s ||= (Double Pipe / Or Equals) Really Does
　http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

「パーフェクト Ruby on Rails」の記述で以下があったので調べてました。

```rb
@current_user ||= User.find(session[:user_id])
```

確かに下のように書くよりスマートですね。

```rb
@current_user  = @current_user || User.find(session[:user_id])
```
「Could not find gem '●●' in the gems available on this machine.」と表示されたときの対処方法

## 状況

- [Ruby on Rails チュートリアル](http://railstutorial.jp/chapters/beginning?version=4.0#sec-introduction)の「1.2.4 Bundler」を見ていた
- 他にも、[生まれて初めてプログラミングをする文系人間のためのチュートリアル](http://qiita.com/yoshimikeisui/items/0872739e771f8a18a956)も見ていた

## 起こったこと
- Gemfileを設定した後、`bundle update` と `bundle install` を使用してgemをインストールしようとした
- そうしたら、以下のようなエラーが表示された

 - `Could not find gem 'turbolinks1.1.1 (>= 0) ruby' in the gems available on this machine.`

## 対処方法

- `コンマ(,)` を忘れずにつける
 - 正しくは `gem 'turbolinks', '1.1.1'` だったが、 `gem 'turbolinks' '1.1.1'` にしていた

## FYI

### 参考した記事

- [gemのインストールからデフォルトのRailsページを表示するまで](http://ruby-on-railhead.hatenablog.com/entry/2014/10/25/010727)

### 変更前のファイル

```ruby:Gemfile
source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.5'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.2'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]
```

### 正しく動作したファイル

```ruby:Gemfile
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
ruby '2.0.0'
gem 'rails', '4.0.5'
# Use sqlite3 as the database for Active Record
gem 'sqlite3', '1.3.8'
# Use SCSS for stylesheets
gem 'sass-rails', '4.0.2'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '2.1.1'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '4.0.1'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails', '3.0.4'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks', '1.1.1'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '1.0.2'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '0.3.20', require: false
```
[PhoneGap/Cordova] 古いバージョンのプラグインをインストールする方法

PhoneGapのプラグインのバージョンが変わった時、それまで動作していたものが動かなくなるケースが時々あると思います。
古いバージョンでも良いから動作させたいという時のために、PhoneGapには古いバージョンのプラグインをインストールする方法が存在します。

最新版のプラグインをインストールする方法はご存知の通り、以下のようになります。

```shell-session:install_phonegap_plugin.sh
$ cordova plugin add [プラグインのID]
```
古いバージョンのプラグインをインストールしたい場合は、以下のようにプラグインのIDの後に@を付けた後に、インストールしたいバージョンを指定します。

```shell-session:install_phonegap_plugin_with_version.sh
$ cordova plugin add [プラグインのID]@[バージョン]
```

# 参考情報

* http://stackoverflow.com/questions/21391431/can-i-install-a-previous-version-of-a-plugin-using-the-cordova-plugin-add-comman
RSpecの(describe/context/example/it)の使い分け

# 概要

なかなか使い分けする基準が理解できなかったけど、
こういうことかという考えが出てきたのでメモ。

# 使い分け方

テストの流れを端的に言うと、

1. 機能、クラス、メソッドなどの`テストの対象`に対して、
2. `特定の条件`で実行してみて、
3. 期待する`アウトプット`が返ってくるかを調べる、

ということになる。

ここで出てきた`テストの対象`と`特定の条件`と`アウトプット`に注目して、
(describe/context/example/it)の使い分けを行う。

`describe`には、`テストの対象`が何かを記述する。
`context`には、`特定の条件`が何かを記述する。
`example`と`it`には、`アウトプット`が何かを記述する。日本語で記述するときは`example`を使う。`it "is 〜`や`it { should be 〜 }`のような形で書きたい場合は`it`を使う。

```ruby:hoge_spec.rb
describe 'テストの対象' do
  context '特定の条件の内容' do
    example 'アウトプットの内容' do
      ...テスト処理...
    end
    
    it "is 〜" do ...テスト処理... end
    
    it { should_be 〜 } 
  end
end
```

例えば`FizzBuzz`クラスの`#run`メソッドをテストする場合は、以下のようになる。

```ruby:fizzbuzz_spec.rb
describe 'FizzBuzz' do
  describe '#run' do
    context '3の倍数' do
      example 'Fizzという文字列を返すこと' do
        expect(FizzBuzz.run(3)).to eq('Fizz')
        expect(FizzBuzz.run(6)).to eq('Fizz')
        expect(FizzBuzz.run(9)).to eq('Fizz')
        expect(FizzBuzz.run(12)).to eq('Fizz')
      end
    end

    context '5の倍数' do
      example 'Buzzという文字列を返すこと' do
        expect(FizzBuzz.run(5)).to eq('Buzz')
        expect(FizzBuzz.run(10)).to eq('Buzz')
      end
    end

    context '3の倍数かつ5の倍数' do
      example 'FizzBuzzという文字列を返すこと' do
        expect(FizzBuzz.run(15)).to eq('FizzBuzz')
      end
    end

    context '3の倍数ではない かつ 5の倍数ではない' do
      example 'そのままの数字を返すこと' do
        expect(FizzBuzz.run(1)).to eq(1)
        expect(FizzBuzz.run(2)).to eq(2)
        expect(FizzBuzz.run(4)).to eq(4)
      end
    end
  end
end
```

上記のように、場合によっては`describe`と`context`をネストさせることもできる。
trusterdでPOSTリクエストを処理する第一歩

# はじめに

HTTP2でもPOSTやGETがあるらしくらいしか分かってません。
中の通信はバイナリベースでも表面上はHTTP/1.1あたりと互換性が
あるらしいので、POSTメソッドもこれまでと変わらずに扱えるようです。

# POSTメソッドで渡されたパラメータを参照するには 

コールバックを有効にしてHTTP2サーバーを生成。

```rb:trusterd.conf.rb
s = HTTP2::Server.new({
…
  # callback default: false
   :callback => true,
…
})
```
set_map_to_strage_cbでコールバック内でPOSTパラメータを

```rb
s.body
```

と受け取れる。

```rb:trusterd.conf.rb
s.set_map_to_strage_cb {

if s.request.uri == "/test"
  s.set_content_cb {
    s.rputs s.unparsed_uri+"\n"
    if s.body
      s.rputs s.body+"\n"
    end
    s.rputs "hello trusterd!"
  }
end

}
```

## POSTする

一応、POSTを発行する側のHTMLも載せときます。

```html
<html>
<form method="POST" action="https://127.0.0.1:8080/test">
  <input type="text" name="text">
  <input type="submit" value="post">
</form>
</html>
```

TLS無効で動かしている場合は、httpsをhttpに。

# おわりに 

パラメータを受け取ったあとはRuby力が高ければ、簡単にハッシュや
もっと賢い入れ物に展開出来るんだろうと想像を巡らす日々です。

# 参考リンク

- http://trusterd.github.io/

# 関連投稿

- [trusterdでリクエストを受け付けてみた - Qiita](http://qiita.com/kjunichi/items/2b58fc7f7221c1c5c685)
JSでファイルを読み込んで表示する方法

貼付けたいファイルを画面に反映させる。
参考URL: https://developer.mozilla.org/ja/docs/Using_files_from_web_applications#Example.3A_Using_object_URLs_to_display_images


```js

<input type="file" id="fileSelector" multiple accept="image/*" />

<ul id="fileContentList" style="list-style-type: none;"></ul>

<script>
  $(document).ready(function(){
    $('#fileSelector').on('change', function(evt){
      showImage(evt);
    });

    function showImage(evt){
      var files = evt.target.files; 

      if (!files) {
        alert("ファイルの読み込みに失敗しました、もう一度トライして下さい");
        return;
      }

      // javascript version
      var img_element = document.createElement('img');
          img_element.src = window.URL.createObjectURL(files[0]);
          img_element.width = 100;
          img_element.style.verticalAlign = "middle";
          img_element.style.margin = "4px 4px 4px 0";
          window.URL.revokeObjectURL(this.src);

      var span_element = document.createElement('span');
          span_element.innerHTML = files[0].name;

      var li_element = document.createElement('li');
          li_element.appendChild(img_element);
          li_element.appendChild(span_element);
      document.getElementById('fileContentList').appendChild(li_element);

      // jQuery version
      var fileContent = $('#fileContentList');

      var image = $('<img>').appendTo(fileContent);
          image.css({
            width: 100,
            verticalAlign: 'middle',
            margin: '4px 4px 4px 0'
          });
          image.attr('src', window.URL.createObjectURL(files[0]));

      var span = $('span');
          span.innerHTML = files[0].name;

      var li = $('li');
          li.append(image);
          li.append(span);

      fileContent.append(li);
    }
  });
</script>


```
MacでのGo言語のインストール


2/9の[Golangチュートリアルもくもく会＠ギークハウス秋葉原](https://www.facebook.com/events/963222463695763/?ref_dashboard_filter=upcoming)にて  
基本的に[ソースからのGo言語インストール - golang.jp](http://golang.jp/install/source) [^1]に従ってインストールした。
[^1]: Go言語のバージョン1.0、1.1のときの翻訳なので、情報が古くて合わないところがある。

事前にXcodeのインストールが必要っぽい。

* １−１、Mercurialのインストール  

[Mercurial SCM](http://mercurial.selenic.com/)から.dmgファイルでインストールした。[^3]  

* １−２、Mercurialのインストール

１−１だけで十分だったっぽい？けど打った。  

>$ sudo easy_install mercurial==2.0

* ２、リポジトリからの取得

>$ hg clone -u release https://code.google.com/p/go

* ３、Go言語のインストール

少し時間がかかる。ALL TESTS PASSEDが出てくる。

>$ cd go/src
>$ ./all.bash

フルパス入力などで、パスを通さないで
実行するならそのままhello, World。

* ４、パスを通す

オプション環境変数の項を参照
私の環境がMac OS X 10.9.5の64bit OSだったので、
GOOSはdarwin（Mac OS X 10.6以降）、
GOARCHはamd64(64bit x86)になった。
GOROOTは２、リボジトリからの取得で取得されたGo言語のフォルダのパスを入力する。
私の場合は環境変数$HOME[^2]の直下に置いたので
GOROOTは$HOME/goになった。
GOPATHはgit install hogehogeでダウンロードしたgo言語のライブラリのパスになるっぽい。
PATH=$PATH:hogehogeで環境変数$PATHに追加されるのが一番重要ぽい。
$GOBINは$GOROOT/binと等価っぽい、入れなくて良さげ。
[^2]: echo_$HOMEでフルパスが出力される。
.bashrcに以下を追加した。

```shell:.bashrc
# for Golang
export GOROOT=$HOME/go
export GOARCH=amd64
export GOOS=darwin

export GOBIN=$HOME/go/bin
export GOPATH=$HOME/_go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$GOBIN
```

[^3]: homebrewからもインストールできる模様

* ５、実行またはコンパイル

実行は
>$go run hello.go

コンパイルは
>$go build hello.go

で実行ファイルが生成される。
6g, gccgo, 6l, 6c, 6aなどあるが
今回インストールしたバージョン1.4では
変更されている模様。

* ６、その他

最新リリースを保つの項を行うと
>$ cd go/src
>$ hg pull
>$ hg update release
>$ ./all.bash

コマンドファイルが移動するか消去されるので
動作しなくなる。
>$ rm runtime/*
>$ rmdir runtime

でruntimeフォルダを消去して再インストールしたら
復帰できた。
WinSCPのスクリプト実行がなかなか便利

# WinSCP 便利
[WinSCP](http://winscp.net/eng/docs/lang:jp) は便利でよくできたソフトウェアだなあとは前々から思っていたけれど、コマンドラインインターフェースがあることは最近知った。

文法もほとんどシェルスクリプトに近いので、なかなかの使い勝手。

# サンプル
## コマンドライン
```
winscp.com /script=retrieve_logs.wscp.txt /xmllog="logs/retrieve_logs.log"
```

##スクリプトファイル
```retrieve_logs.wscp.txt
option batch abort
option confirm off

# 接続
open sftp://root:password@192.0.2.1:22

# ファイル取得
get /tmp/20150221/update_database.log

# ファイル削除
rm /tmp/20150221/*

# ディレクトリ削除
rmdir /tmp/20150220
```

# 使えるコマンド
使えるコマンドは http://winscp.net/eng/docs/scripting#commands に一覧がある。

試してはいないんだけど、任意のシェルコマンドを実行する`call`コマンドがあるので、できることにはかなり自由度があるかも。
【アイデアメモ】自炊画像でライフゲームをしたけど面白くなかった（ソース無し）

諸事情あり、ソースを削除してしまったのでソースも画像もなしでメモだけ。

* 本をスキャンした画像をライフゲームにしたらどうなるかと思い立った
* この物語はライフゲームではこんな展開になった　とか見せられたら面白いかなと思った
* 早速実装してみたが、実際は100ステップ以内で収束してしまい大して面白くなかった
 * パターンはほとんど発散せず元の文字がうっすら読める程度のところで振動、固定する
 * ほとんどが[ブロック]([http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AA%E3%83%B3%E3%82%AB%E3%83%BC_(%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0))か[ブリンカー](http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AA%E3%83%B3%E3%82%AB%E3%83%BC_%28%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0%29)になっていたように見えた
* たぶん300bpiはライフゲームには解像度が高すぎたんだと思う。
* もうちょっと解像度を落として、線を抽出するなどすれば面白かったかもしれない
* ソースが消えたので心が折れて断念。
MacでFirefoxでのアカウントの切り替え

# MacでFirefoxでのアカウントの切り替え

Windowsだとショートカットに右クリックで-pオプション付けるだけだけど
Macではやったことがなかったので。
***
/Applications/Firefox.app/Contents/MacOS/の中の
firefox-bin -p オプションで実行する。

***
シェルスクリプト化する。[^1]、[^2]
[^1]: Thunderbirdの場合も、FirefoxをThunderbirdに置き換えるだけで良い（２カ所）。  
[^2]: chmod_755で実行できるようにする。よく忘れる。（アンダーバーは空白、脚注にできなかったので）

***

```shell:firefox-p.sh
#select account on firefox
cd /Applications/Firefox.app/Contents/MacOS/
./firefox-bin -p &
```
俺がmainを書いてないけど実行ファイルパスがほしい時

# 背景

共有ライブラリ側のコードのみ自分で制御できる場合、フツーにはargvが参照的ない。
でも実行ファイルのパスを知れば、lddやotool -Lで他にどんな共有ライブラリを
使っているのか実装している共有ライブラリから知ることが出来、空気を読むことができる。

# 実装方法

プロセスIDからそのプロセスの実行ファイルパスが取得できるOSが多い模様。

# 実装コード例

- - [mrubyにCで追加したメソッドで文字列を返すには - Qiita](http://qiita.com/kjunichi/items/916145653121779d1c77)の謎のサンプルコードでOSXでのUNIX風な実装
Jenkinsで定義されている環境変数を使用する(Windows)

初めての投稿をしよう
備忘録程度ですが

Windows上で稼働しているJenkinsでの環境変数の書き方について
Jenkinsで定義されている環境変数を使用する場合、記載の方法がLinuxコマンド基準のよう

例:WORKSPACE
<ul>
<li>シェルスクリプト => $WORKSPACE</li>
<li>Windwosバッチコマンドの実行 => %WORKSPACE% </li>
<li>Invoke Unity3d Editor(Unity3d plugin) => $WORKSPACE</li>
</il>
ちなみにantコマンドとかマルチビルドでユーザー定義の引数を使うとかはまだ試してないけど
この様子だとLinux風にかけばよさ気か

今までCentOSやMacでjenkinsを動かしていたから
全部Linux/Unixと同じように書いていれば問題なかったのですが
Windowsだとプラグインの実行時引数に
%WORKSPACE%を使おうとしたらちゃんと通らなかったんですよね
CakePHPのfind('list')でfieldsを3つ指定すると。

こんなデータがあったとして

【users】

| id | name               | role  |
|---:|:-------------------|:------|
| 1  | alegriaghost       | Admin |
| 2  | あれぐりあごーすと | User  |
| 3  | アレグリアゴースト | User  |

こう書くと

```php:FindList.php
$fields = array(
    'User.id',
    'User.name',
    'User.role',
);

$params = array(
    'fields' => $fields,
);

$findList = $this->User->find('list', $params);
```

こう返ってくるらしい。

```php:結果
$findList = Array(
    ['Admin'] => Array(
        [1] => 'alegriaghost',
    )

    ['User'] => Array(
        [2] => 'あれぐりあごーすと',
        [3] => 'アレグリアゴースト',
    )
)
```
Ractive.jsのデフォルトデリミタ{{hoge}}を変更する方法

# デリミタの衝突を防ぐ
SmartyやLaravel.Blade等のテンプレートエンジンとRactive.jsを併用しようとすると、
```{{ hoge }}```がサーバ側の構文解析に巻き込まれて画面から消えます。
サーバ側のデリミタを変更する方法もあるのですが、ここではRactive.js側で対処する方法を説明します。

# Ractive.defaults.delimiters
_http://docs.ractivejs.org/latest/ractive-defaults_

Ractiveコンストラクタに渡せる[全ての値](http://docs.ractivejs.org/latest/options)について、Ractive.defaultsからデフォルト値を定義出来ます。
その中に[delimiters](http://docs.ractivejs.org/latest/options#delimiters)という値があるのでこちらを変更します。

自分は```<@ @>```を利用することが多いのですが、テンプレートエンジンの種類によっては構文と衝突する可能性があります。
他にも```<% %>```や```<$ $>```も見やすくてオススメなので場合によって使い分けてください。

```js:script
Ractive.defaults.delimiters = [ '<@', '@>' ];

var ractiveObject = new Ractive({
  el: '#continer',
  template: '#template',
  data: {
    hoge: 'aaa'
  }
});
```

```html:html
<div id="continer">
  <script id="template" type="text/ractive">
    <@ hoge @>
  </script>
</div>
```
CasperJSでUTF-8以外のサイトのスクレイピングをする

CasperJSでUTF-8以外のサイトにアクセスしたとき、
どうもうまくいかない。
すべてのサイトでうまくいかないわけではない。ちゃんとaタグやformにidが振られていれば
ページ遷移はできる。でも、idがないaタグ,formタグの送信、フォームに日本語入れて送信テストとか、どうしてもできないサイトがある
capture()でスクリーンショットをとっても文字化け。

いろいろやってみたけど、ひとつの解決方法を見つけた。
それはプロキシサーバDelegateで文字コード変換プロキシを通すこと。
DelegateでCHARCODEのフィルタを使い、このプロキシを通せば、ShiftJISで記述されたサイトがCasperJS(PhantomJS)で
見るときにはUTF-8に変換されているという形になるので
いつも通りCasperJSが書ける

以下Delegateのインストール手順（CentOS6)とそのプロキシをCasperJSから利用する方法。
makeとかはできる環境の前提で

```sh
cd /usr/local/src
wget ftp://ftp.delegate.org/pub/DeleGate/delegate9.9.13.tar.gz
tar zxvf delegate9.9.13.tar.gz
cd delegate9.9.13
make
cp src/delegated /usr/local/sbin/
ln -s /usr/local/sbin/delegated /usr/sbin/
mkdir -p /var/lib/delegate/cache
chown -R nobody:nobody /var/lib/delegate
mkdir -p /etc/delegate/
```

```config:/etc/delegate/http_to_utf8.conf
#####################################
-P28080
SERVER=http
CHARCODE=UTF-8
RELIABLE="127.0.0.1,192.168.1.*"
LOGFILE="/var/log/delegate/http.log"
PROTOLOG="/var/log/delegate/access.log:%X %D"
ERRORLOG="/var/log/delegate/error.log"
#####################################
```

```sh:/etc/init.d/delegated
#!/bin/sh
#

DELEGATE=/usr/sbin/delegated
CONFDIR=/etc/delegate
DGROOT=/var/spool/delegate-nobody

mkdir -p /var/log/delegate
if [ ! -x $DELEGATE ]; then
    echo -n $"$DELEGATE does not exist."; warning; echo
    exit 0
fi

if [ ! -r $CONFDIR ]; then
    echo -n $"$CONFDIR does not exist."; warning; echo
    exit 0
fi

RETVAL=0
start() {
        echo -n $"Starting up Http DeleGate daemon: "
        for CONFIG in $CONFDIR/*.conf ; do
          #$DELEGATE -P28080 SERVER=http CHARCODE=UTF-8 LOGFILE="/var/log/delegated" DGROOT=$DGROOT +=$CONFIG
          $DELEGATE DGROOT=$DGROOT +=$CONFIG
          echo
        done
        return 0
}

stop() {
        echo -n $"Shutting down Http DeleGate daemon: "
        for CONFIG in $CONFDIR/*.conf ; do
          $DELEGATE DGROOT=$DGROOT +=$CONFIG -Fkill
          echo
        done
        return 0
}

restart() {
        stop
        start
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0
```

このプロキシをCasperJSから利用するには以下
```sh
casperjs --proxy=127.0.0.1:28080 test.casper.js --xunit=log.xml
```
Pythonを使った回帰分析の概念の解説 番外編１

### アニメーションで理解する最小二乗法###

[Pythonを使った回帰分析の概念の解説 その１](http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d)では、データに最適な直線を描くには、最小二乗法を使い、直線とデータの差（誤差）を最小にするようにパラメーターを設定することを説明しました。
ここではその番外編として、各パラメータが変わっていく様をアニメーションにしてグラフを描画してみました。こうしてみるとイメージが湧くかと思います。

グラフのタイトルにある"sum of square errors"が誤差の二乗和なので、これが最小となるところが一番良い位置になります。

#### 傾きが変わっていく様子 ####
まずは傾きが変わっていく様子を見てみます。

![regression_anim.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/bfa74350-1e8c-226a-a0f3-f4b0d7375bfc.gif)

matplotlibでアニメーションを出力するためにmatplotlib.animation.FuncAnimation関数を使っています。グラフを描画する関数を外出しして、引数にアニメーションで変化させる値をとるようにします。ここではanimate関数を作っています。このanimate関数はFuncAnimation関数内で呼ばれ、nframeに0からframesで設定した値を順番に引数に設定され呼ばれます。


```py
import numpy as np
import matplotlib.pyplot as plt
from moviepy.editor import *
from matplotlib import animation as ani

data= np.loadtxt('cars.csv',delimiter=',',skiprows=1)
data[:,1] = map(lambda x: x * 1.61, data[:,1])    # mph から km/h に変換
data[:,2] = map(lambda y: y * 0.3048, data[:,2])  # ft から  m に変換

def animate(nframe):
    plt.clf()        # clear graph canvas
    slope = 0.746606334842 * (float(nframe)/50) *2   # 引数のnframeが変わることによりslopeが変わる
    intercept = - 5.41583710407
    x = np.linspace(0,50,50)
    y = slope * x + intercept
    plt.ylim(-10,80)
    plt.xlim(0,50)
    plt.xlabel("speed(km/h)")
    plt.ylabel("distance(m)")
    plt.scatter(data[:,1],data[:,2])
    # draw errors
    se = 0
    i = 0
    for d in data:
        plt.plot([d[1],d[1]],[d[2],d[1]*slope+intercept],"k")
        se += (y[i] - d[2]) ** 2
        i += 1
    plt.title("Stopping Distances of Cars (slope=%.3f, sum of square errors=%5d)" % (slope, se))
    # based line: y = 0.74x -5
    plt.plot(x,y)


fig = plt.figure(figsize=(10,6))

anim = ani.FuncAnimation(fig, animate, frames=50, blit=True)

anim.save('regression_anim.mp4', fps=13)

clip = VideoFileClip("regression_anim.mp4")
clip.write_gif("regression_anim.gif")


```

#### 切片が変わっていく様子 ####

先ほどと変わって、切片が動きます。

![regression_anim_i.gif](https://qiita-image-store.s3.amazonaws.com/0/50670/1e243fe8-86fc-5005-e6a4-5c560bc644bf.gif)

```py

def animate(nframe):
    plt.clf()        # clear graph canvas
    slope = 0.746606334842 
    intercept = -5.41583710407 + (float(nframe-25)/50) * 50   # 引数のnframeが変わることによりinterceptが変わる
    x = np.linspace(0,50,50)
    y = slope * x + intercept
    plt.ylim(-30,80)
    plt.xlim(0,50)
    plt.xlabel("speed(km/h)")
    plt.ylabel("distance(m)")
    plt.scatter(data[:,1],data[:,2])
    # draw errors
    se = 0
    i = 0
    for d in data:
        plt.plot([d[1],d[1]],[d[2],d[1]*slope+intercept],"k")
        se += (y[i] - d[2]) ** 2
        i += 1
    plt.title("Stopping Distances of Cars (slope=%.3f, sum of square errors=%5d)" % (slope, se))
    # based line: y = 0.74x -5
    plt.plot(x,y)


fig = plt.figure(figsize=(10,6))

anim = ani.FuncAnimation(fig, animate, frames=50, blit=True)

anim.save('regression_anim_i.mp4', fps=13)

clip = VideoFileClip("regression_anim_i.mp4")
clip.write_gif("regression_anim_i.gif")

```
Objective-C クラスの依存関係を出力するXcode Pluginを作りました

## KSHObjcUML
KSHObjcUMLはObjective-C クラスの依存関係を出力するXcode Pluginです。

![Example](https://raw.githubusercontent.com/kimsungwhee/KSHObjcUML/master/KSHObjcUML.png)

## 使い方
###Step 1 - プロジェクトをシミュレーターで実行する
###Step 2 - Xcodeのメニューから Product->Objc-UML をクリック
![Screenshot](https://raw.githubusercontent.com/kimsungwhee/KSHObjcUML/master/ScreenShot.png)

## インストール
Xcode Plugin管理ツール[Alcatraz](http://alcatraz.io/)を使って「KSHObjcUML」を検索してインストールする。

OR

Githubから[KSHObjcUML](https://github.com/kimsungwhee/KSHObjcUML)をCloneしてプロジェクトを実行する。実行完了したらプラグインもうインストール済みになります。

## そのた
初めてプラグインを作りました。まだ、足りない部分がいっぱいあると思いますが、みんなさんの開発に役に立てば嬉しいです。
よろしくお願い致します。
Android入門　超基礎　幅と高さの設定　子要素重み付け(余白のコントロール)

幅と高さの設定

fill_parent, match_parent: 親要素の幅
wrap_content: 中身の幅
dp: 任意の幅
 
余白
外側の余白: layout_margin
内側の余白: padding
 
寄せ方
gravity: 内部要素の位置
layout_gravity: 自分の位置

子要素の重み付け(余白のコントロール)
android:layout_weight="1"

layout_weightを指定した場合は
Verticalならheightを0にする
Horizontalならwidthを0にする
*そうすると計算が少し早くなる
itamae-plugin-recipeをつくるとき、lib/itamae/plugin/recipe直下に置くと困る

## 前提
Itamaeのレシピプラグインをつくるときにこういう構成にしていたんです。

```
├ lib/
│  └ itamae/
│    └ plugin/
│      └ recipe/
│        └ rtn_XXXX.rb
├ Gemfile
├ Rakefile
└ itamae-plugin-recipe-rtn_XXXX.gemspec
```

## vagrant-itamaeで困る
VagrantのプロビジョニングにItamaeが使える[vagrant-itamae](https://github.com/chiastolite/vagrant-itamae)があります。
で、vagrant-itamaeでRubygemsに登録されているレシピを使うときはvagrant pluginとしてレシピをインストールするのですが……

```bash
$ vagrant install itamae-plugin-recipe-rtn_rbenv
$ vagrant
Vagrant failed to initialize at a very early stage:

The plugins failed to load properly. The error message given is
shown below.

undefined local variable or method `node' for main:Object
```

:cry: あなたのVagrantは死んでしまった！！！！

## vagrant-pluginとして読み込まれる→死！！
`vagrant plugin install` で入れたGemは全部requireされてるっぽい。
（プラグインだし当然の挙動）

そのため、先ほどの構成でレシピを作っていると、`vagrant`コマンド実行時にレシピファイルが読み込まれてしまうようだ。

itamae内以外でrequireされると困るものは `require 'gem名'` で読み込まれる場所に置いてはいけない:droplet:

## なのでこうした
- [itamae-plugin-recipe-rtn_rbenv](https://github.com/rutan/itamae-plugin-recipe-rtn_rbenv) の場合
    - もともとユーザインストールとシステムインストールでファイルが分かれていたので直下ファイルを無しにした（[thx mactkg!!](https://github.com/rutan/itamae-plugin-recipe-rtn_rbenv/pull/4)）
- [itamae-plugin-recipe-rtn_git](https://github.com/rutan/itamae-plugin-recipe-rtn_git) の場合
    - 直下に全部書いていたがフォルダを掘ってrtn_rbenv同様の形にした

Vagrantはまだまだわからないことがいっぱいである。

## 参考
- vagrant-itamaeを使っている時にitamaeのpluginがうまく使えなくて困ってる - 半空洞男女関係 http://mactkg.hateblo.jp/entry/2015/02/19/012809
- 備忘録 https://gist.github.com/gongo/231046cab84389a85a71

ありがとうございました！

## 追記：2015-03-24
- Use `default.rb` if include_recipe is called with directory path. · Issue #99 · itamae-kitchen/itamae https://github.com/itamae-kitchen/itamae/issues/99

ふと、ItamaeのIssueを見ていたらdefaultが実装されそうな予感があるので、ますます直下には置かないほうが良さそう。

## 追記：2015-08-30
1.4.5でdefault.rbが実装されました :tada:
プラグインgem化するときは特に関係ないかな？
https://github.com/itamae-kitchen/itamae/pull/156

また、WikiにBest Practiceが載っているので参考にするのがよさそうです。
https://github.com/itamae-kitchen/itamae/wiki/Best-Practice

## 追記：2015-09-26
1.5.2からはプラグインgemもdefault.rbを読み込むようになったよ。

- https://github.com/itamae-kitchen/itamae/commit/e04306b4653b502feaa64063c75afcd25b522b98
- https://github.com/itamae-kitchen/itamae/wiki/Recipe-Plugins
CentOS7.0で環境構築

ひとまずエディタ入れてnode動かすまでやります。

### まずユーザがsudo使えるようにする

```
# su - root
# visudo

```

visudoで開いたsudo設定ファイルの該当箇所にユーザを追加

```
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
username    ALL=(ALL)       ALL

```

###yumでインストールしていく
```
# sudo yum emacs wget gcc openssl-devel curl-devel expat-devel cpan gettext asciidoc xmlto
# sudo yum groupinstall "Development tools"
# sudo yum install -y bash-completion
```

###パッケージをもってきてビルドする
```
# cd /usr/local/src/
# sudo wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
# sudo tar xvzf Python-2.7.3.tgz
# cd Python-2.7.3
# sudo ./configure --prefix=/usr/local/python
# sudo make
# sudo make install
# export PATH=/usr/local/python/bin:$PATH

# cd /usr/local/src/
# sudo wget https://www.kernel.org/pub/software/scm/git/git-2.2.2.tar.gz
# sudo tar xzvf git-2.2.2.tar.gz
# cd git-2.2.2
# sudo make prefix=/usr/local all doc
# sudo make  prefix=/usr/local install install-doc install-html

# git clone git://github.com/creationix/nvm.git ~/.nvm
# echo . ~/.nvm/nvm.sh >> ~/.bashrc
# echo nvm use node
# . ~/.bashrc
#nvm install v0.12.0

```

nvmのバージョン調べるならこれで
\#nvm ls-remote


抜けがあるかもしれないけど大体こんな感じでした。

次のToDo

* ユーザの権限回りよくわかってないので(sudoがなにかすらさっきまでわかってなかったレベル)、その辺調べてちゃんと権限管理するように
* nodeで作ったファイルをLAN内の他のPCから見る
* もちょい細かいとこまで開発環境整える（フレームワークとか入れて試したり？
* DB鯖立てるかDB入れるかどっちかする

つまりWebアプリ書いて動かせるようにするってとこを目標としていきましょうってことで。




###参考にしたところ
CentOS に Python2.7, Python3.3を入れたメモ
http://qiita.com/a_yasui/items/5f453297855791ed648d

CentOS 6.5にgit 2.0.1を入れる
http://qiita.com/tarr1124/items/77c2378291029756f478

CentOS6にGit1.8をコンパイルインストールする方法
http://dqn.sakusakutto.jp/2012/10/centos6git18.html

初めてのNode.js 第１回：とりあえずインストールしてみる
http://www.sakc.jp/blog/archives/31470

CentOS 5.2 にcURL 7.21.1をインストール
http://d.hatena.ne.jp/IT7C/20100815/1281853069

nvm を利用したnode.js のインストール
http://moro-archive.hatenablog.com/entry/2014/03/01/213314

CentOSにnvmとNode.jsをインストールする
http://kohkimakimoto.hatenablog.com/entry/2012/11/01/144007

さくらVPS+CentOS：自分をsudoユーザに追加してみた
http://suin.asia/2010/10/11/sakura_vps_centos_sudo





---
随時更新する予定。
[swift] HTMLファイルを読み込んでUITextLabelに表示


画面を2つ作って「ViewController」と「secondViewController」とします。
viewControllerにダウンロードのボタンと開くボタンを設置して、ダウンロードボタンでHTMLを読み込んで保存し、開くボタンで画面遷移させ、scondViewControllerで表示させます。

````swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    //ダウンロードボタン
    @IBAction func Download(sender: AnyObject) {
                
        //青空文庫から阿呆の一生をダウンロードURL
        let newsUrlString = "http://www.aozora.gr.jp/cards/000879/files/19_14618.html"
        
        var url = NSURL(string: newsUrlString)!
        var request = NSURLRequest(URL: url)
        
        //データをダウンロードする
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse:nil, error:nil)
        var htmlString = NSString(data:data!, encoding:NSShiftJISStringEncoding)!
        
        //パスの取得
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as Array<String>
        
        //保存するファイルの名前
        let filePath = String(paths[0]) + "data.html"
        
        //保存するデータ
        let array = [htmlString]
        //.componentsJoinedByString("\n")
        
        //アーカイブしてdata.datというファイル名で保存する
        let successful = NSKeyedArchiver.archiveRootObject(array, toFile: filePath)        
    }
        
    //viewControllerのデフォルト    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
````

二つ目の画面です。UITextLabelを設置させます。

````swift:secondviewController.swift
import UIKit

class secondViewController: UIViewController {

    @IBOutlet weak var testLabel: UITextField!
    var htmlText = "" //HTMLのテキスト
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //保存したファイルの読み込み
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,
            .UserDomainMask, true) as Array<String>
        let filePath = String(paths[0]) + "data.html"
        if let array = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? Array<String>{
            htmlText = array[0]
        }
        
        //読み込んだHTMLをUITextLableに表示
        var err:NSError?
        self.testLabel.attributedText = NSAttributedString(
            data: htmlText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
            options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType],
            documentAttributes: nil,
            error: &err)
        self.testLabel.font = UIFont(name: "System", size: 14)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
````

参照:[SwiftでUILabelにHTMLを表示する方法](
http://qiita.com/satomikko94/items/31ce11a7b525552d4742)
画像表示方法&特徴

imageタグの指定可能属性

CENTER
サイズ変更せずにエリアの中央に表示

CENTER_CROP
エリアの横幅まで画像を拡大し中央に表示

FIT_CENTER
エリアの縦幅まで画像を拡大し中央に表示

FIT_END
エリアの縦幅まで画像を拡大し、右端に寄せて表示

FIT_START
エリアの縦幅まで画像を拡大し、左端に寄せて表示

FIT_XY
エリア全体に画像を拡大して表示

MATRIX
エリアより大きくても小さくてもそのまま表示
ローカルにCloud Foundry V2環境を構築する

CF nise installerを使ってローカルにCloud Foundryを構築したときの記録です。


#環境

* Ubuntu Server 14.04


#Cloud Foundryのインストール

まず、Rbenvに必要なパッケージをインストールしておきます。

```
sudo apt-get install build-essential bison libreadline6-dev curl git-core zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev autoconf libncurses5-dev
```

以下のコマンドを実行してCloud Foundryをインストールを始めます。

```
sudo bash < <(curl -s -k -B https://raw.githubusercontent.com/yudai/cf_nise_installer/${INSTALLER_BRANCH:-master}/scripts/bootstrap.sh)
```

このコマンドを実行すると、Rubyや各種モジュール、Buildpackなどがインストールされるのでしばらく待ちます。
私の環境では2時間程かかりました。

以下のメッセージが表示されたら完了です。

```
Done!
You can launch Cloud Foundry with './scripts/start.sh'
Restart your server before starting processes if you are using Ubuntu 10.04
```

メッセージにあるようにOSの再起動を行えばインストールの完了です。
（今回の環境はUbuntu 14.04ですが念のため再起動を行いました）


#Cloud Foundryを起動

以下の起動スクリプトを実行します。

```
INSTALLDIR/scripts/start.sh
```

Cloud Foundryのモジュールが起動していくのでしばらく待ちます。


#動作確認

以下のリンクからCloud FoundryのクライアントCLIツールをダウンロードして導入します。
https://github.com/cloudfoundry/cli

Cloud Foundryにログインします。

1. cf api api.IPADDRESS.xip.io --skip-ssl-validation
2. cf login
3. メールアドレス（ユーザー名）とパスワードを入力（デフォルトではadmin:c1oudc0w）
3. cf create space SPACENAME
4. cf set -o DevBox -s SPACENAME

適当なアプリケーションをCloud Foundryにデプロイします。

5. cd APPROUTE
6. cf push


#トラブルシューティング

##Blobstore error: Failed to fetch object, underlying error: #< HTTPClient::ReceiveTimeoutError: execution expired >

インストールに時間がかかるので、sudoのパスワードキャッシュが切れていることがあります。
そのときは適宜パスワードを再入力して、再度インストールを実行します。
途中でインストールが失敗しているように見えても、もう一度インストールコマンドを実行すれば止まってしまったところまでは飛ばすことができます。


##Failed setting memory limit: Permission denied

cf pushコマンドでアプリをデプロイしたときに発生しました。
以下のコマンドを実行して、OSを再起動することで解決できます。
｀｀｀
sudo perl -p -i -e 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"/g' /etc/default/grub
sudo /usr/sbin/update-grub
｀｀｀

##/var/vcap/packages/ruby/bin/bundle: そのようなファイルやディレクトリはありません

繰り返しインストールを行っていたらでなくなりました。


#よくわからない点

今回は、以下の4パターンでインストールを行いました。

* ESXi 4.1上の仮想マシン
* ESXi 5.5上の仮想マシン
* Hyper-V（Windows 8.1）上の仮想マシン
* 物理マシン

しかし、問題なく動作しているのはESXi 4.1上の仮想マシンのみでした。

ESXi 5.5上の仮想マシンと物理マシンにインストールした場合はデプロイしたアプリのレスポンスが遅いという問題が発生しました。（レスポンスが返ってくるまでに7～10秒）
これについては原因を調べていますが、まだわかっていません。

また、Hyper-V上の仮想マシンに構築した環境ではcf loginコマンドでのログインがうまくいきませんでした。


#参考情報

yudai/cf_nise_installer
https://github.com/yudai/cf_nise_installer

Application failed to stage with the error"Failed setting memory limit: Permission denied" · Issue #72 · yudai/cf_nise_installer
https://github.com/yudai/cf_nise_installer/issues/72

Debian 7.0, Ubuntu 13.04 に rbenv をインストールする - Qiita
http://qiita.com/kazoo04/items/7056704efee66f323ddb
Clangコマンドから pchファイルの生成と使用方法

1. pchファイルを生成する方法
--------------------------

```
clang -x [langage]-header test.h -o test.h.pch
```

> [langage]部分は以下が存在する。

> * *c*
> * *c++*
> *  *objective-c*

2. pchファイルを使用する方法
--------------------------

```
clang -include test.h main.c -o main.o
```
> *-include* オプションで使用するpchファイルを指定する。
> 上記の場合、test.hのpchファイルが最初に存在するかどうかclangはチェックを行う。
Rails JBuilder 入れ子・配列・部分テンプレートのサンプル

# 出力したいJSON

入れ子構造と配列を組み合わせた JSON を出力しています。

```json
{
  "companies": [
  {
    "id": 1,
    "name": "Nintendo",
    "staffs": [
    {
      "id": 1,
      "name": "Iwataさん"
    }
    ]
  },
  {
    "id": 2,
    "name": "Google",
    "staffs": [ ]
  }
  ]
}
```

# ソースコード

### json.jbuilder ファイル

```rb:app/views/companies/index.json.jbuilder
# companies.json にアクセスすると、このjbuilderが呼ばれる

# json.キー名 do ~ end を使うと、
# 入れ子構造を作ることができる
json.companies do
  # json.array!(配列) do |要素名| end を使うと、
  # 配列構造を作ることができる
  json.array!(@companies) do |company|
    # json.partial! モデル変数 を使うと、
    # 部分テンプレートを表示する
    json.partial!(company)
  end
end
```

```rb:app/views/companies/_company.json.jbuilder
# 部分テンプレート(会社)

# company 変数は、
# 部分テンプレートの呼び出し元で渡された引数。
json.id(company.id)
json.name(company.name)
# 入れ子構造を作る
json.staffs do
  # 配列構造を作る
  json.array!(company.staffs) do |staff|
    # 従業員の部分テンプレートを表示
    json.partial!(staff)
  end
end
```

```rb:app/views/staffs/_staff.json.jbuilder
# 部分テンプレート(従業員)

# staff 変数は、
# 部分テンプレートの呼び出し元で渡された引数。
json.id(staff.id)
json.name(staff.name + 'さん')
```

### Controller 
scaffold で生成したものをそのまま使っています。

```sccafold.sh
rails g scaffold company name:string
rails g scaffold staff name:string
```

### Model

```app/models/company.rb
class Company < ActiveRecord::Base
  has_many :staffs
end
```

```app/models/staff.rb
class Staff < ActiveRecord::Base
  belongs_to :company
end
```
Resqueメモ


Ruby on Railsで使う[Resque](https://github.com/resque/resque/tree/1-x-stable)の自分用メモ。

# Resqueについて

Redisを利用してバックグラウンドなjobを実行するためのライブラリ。


## 基礎

- workerという概念がある（jobとも言う）
	- 名称が複数あるとややこしいのでjobとする
- jobを一つの単位として非同期に実行できる

## 流れ

- jobクラスにqueue名を設定
- Resqueのqueueに対してjobクラスを積む
- 動作させたいqueueを名前指定して実行
	- queueに積まれているjobが順次実行される

# 前提

すでにrailsアプリケーションをインストール済みであることを前提としている。

- ruby 2.2.0
- Rails 4.2.0

# 導入

## redisのインストール

```
$ brew install redis
```

## redisのserverを起動

```
$ redis-server
```

## Gemfile

```rb:Gemfile
gem "resque"
```

```
$ bundle install
```

resqueは1.25.2がインストールされた。

#  job作成

## rakeファイルを作成

rakeについては[Rails で Rake タスク作成と rake コマンド実行の色々な方法](http://easyramble.com/ways-for-rake-tasks.html)を見るとよく分かる。

rails generatorでresqueなtaskを生成。

```
$ bundle exec rails g task resque
```

lib/tasks/resque.rakeが作られるので確認


```lib/tasks/resque.rake
namespace :resque do
end
```

これにrequire 'resque/tasks' を追記


```lib/tasks/resque.rake
require 'resque/tasks'
namespace :resque do
end
```

手順としてrails gを使ったが、結局上記のようなコードになればいい。


## job


app/workers/以下にmylogger.rbを置く


```ruby
class Mylogger
  @queue = :default # queue名を指定

  def self.perform(name)
    path = File.expand_path("log/users.log", Rails.root)
    File.open(path, 'a') do |f|
      f.puts "User: #{name}"
    end
  end

end
```

- queue名を指定
- クラスメソッドperformに実行したい処理を実装する

このクラス名はjobをキューに積む際に重要

# jobをキューに積む

job用に作ったMyloggerクラスを指定することでキューに積む。Webの画面から実行すると分かりやすいのでHomeControllerのように適当なControllerのメソッドを利用する

```ruby
class HomeController < ApplicationController
  def show
    Resque.enqueue(Mylogger, params[:name])
    render :text => params[:name]
  end
end
```

これは下記のようなURLにアクセスすることで、"User: abc"と表示させたいだけ
http://0.0.0.0:3000/home/show?name=abc


# 実行

## queueの実行

jobのqueue名を指定

```
$ QUEUE=default rake environment resque:work
```

- 根本的には rake resque:work をしたい
	- resque:workでresque.rakeを呼び出す決まりと思っておく
- environmentを呼ぶことでタスクに:environmentの引数を渡す
	- environmentを使うことでModelにアクセスできる
	- resque.rake側にenvironmentを記載してもよいがしなかったので引数として渡している

## 確認

### ログファイルを確認

```
$ tail -f log/users.log
```

### resqueの管理画面

route.rbに以下のように追記

```
mount Resque::Server.new, at: "/resque"
```

管理画面にアクセスする
http://localhost:3000/resque

- Queuesに積まれているキューの数と引数を表示


# その他

## namespaceを環境によって分ける

同一のサーバー上で複数アプリがある場合などに必要なのかも

# 参考URL

http://blog.hello-world.jp.net/ruby/895/

https://github.com/resque/resque/tree/1-x-stable