OmniAICreator/Qiita-1.07M huggingface dataset:
テスト内の無駄なhas_xxxマッチャをエラー出力する！


__2015/07/03 10:02 追記：__
本記事内でCapybaraをモンキーパッチし、件名の処理を行っていましたが
コメントでのご指摘から、以下のように記述することでも可能であることを知りました。

````test_spec.rb
expect(page.has_xxx?("Foo bar")).to be_truthy
expect(page).to have_xxx "Foo bar"
````

一応、備忘録として本記事で書いていた内容はそのままにしておきますのでご注意下さい。

@jnchitoさん、@gongoさん　ご指摘ありがとうございました！

================================================================

Capybaraを使っている方はAjaxが含まれるテスト等でhas_xxx（has_xpathやらhas_contentやら）のマッチャを使うことが多々あると思います。

ただ、このhas_xxxは実行時間がdefault_max_wait_time（またはdefault_wait_time）を超えた場合、何も出力などせずに次の処理へ移行します。

この時、最悪なパターンとしては

- has_xxxがdefault_max_wait_timeを超える
- 次の処理へ移行し、テストがパスされる
- 無駄にテスト時間が増えていく

という流れです。

これを防ぐために、default_max_wait_timeを超えた場合にはエラーを出力するようにしてみましょう！

__※書いた人はRubyistではないため、間違っている可能性があればコメント欄にて教えて頂けると幸いです。。。__

## やること
やることはすごい簡単で対象の処理に対してモンキーパッチを行います。

````spec_helper.rb
module Capybara
  module Node
    module Matchers
      def has_selector?(*args)
        assert_selector(*args)
      rescue Capybara::ExpectationNotMet
        raise Capybara::CapybaraError
      end 

      def has_no_selector?(*args)
        assert_no_selector(*args)
      rescue Capybara::ExpectationNotMet
        raise Capybara::CapybaraError
      end 

      def has_text?(*args)
        assert_text(*args)
      rescue Capybara::ExpectationNotMet
        raise Capybara::CapybaraError
      end 
      alias_method :has_content?, :has_text?

      def has_no_text?(*args)
        assert_no_text(*args)
      rescue Capybara::ExpectationNotMet
        raise Capybara::CapybaraError
      end 
      alias_method :has_no_content?, :has_no_text?
    end 
  end 
end
````

各has_xxxでcallしてるメソッドを変えてる感じっす。
こうすることでdefault_max_wait_timeを食い潰す処理があれば以下のようにエラーが出るはずです。

````console
Failures:

  1) テスト
     Failure/Error: 
     Capybara::CapybaraError:
       Capybara::CapybaraError
     # ./spec/spec_helper.rb:59:in `rescue in has_selector?'
     # ./spec/spec_helper.rb:57:in `has_selector?'
     # ./vendor/bundle/ruby/2.1.0/gems/capybara-2.4.4/lib/capybara/node/matchers.rb:201:in `has_css?'
     # ./vendor/bundle/ruby/2.1.0/gems/capybara-2.4.4/lib/capybara/session.rb:676:in `block (2 levels) in <class:Session>'
     # spec/steps/test_steps.rb:52:in `block (2 levels) in <top (required)>'
     # ./vendor/bundle/ruby/2.1.0/gems/turnip-1.2.4/lib/turnip/execute.rb:25:in `step'
     # ./spec/features/innova_blog/list_article.feature:22:in `run_step'
     # ./vendor/bundle/ruby/2.1.0/gems/turnip-1.2.4/lib/turnip/rspec.rb:44:in `instance_eval'
     # ./vendor/bundle/ruby/2.1.0/gems/turnip-1.2.4/lib/turnip/rspec.rb:44:in `run_step'
     # ./spec/features/test.feature:19:in `block (6 levels) in run'
     # ./spec/features/test.feature:18:in `each'
     # ./spec/features/test.feature:18:in `block (5 levels) in run'
     # ./spec/features/test.feature:22:in `'
````

あとは該当の処理が実際に見に行くElementなりが合っているか確認して、修正したりしましょー。
WSGIDaemonProcessでDjango動かしてるとadmin.pyが即座に反映されないメモ

Apache + WSGI + Djangoで環境構築。WSGIをDaemonProcessで動かしてDjangoをセットアップ。
管理画面を変更しようとadmin.pyを修正後、反映を確認すると更新されておらず・・。

いろいろやったけど駄目だったのでapachectl gracefulすると・・・

なぜか更新されてる・・・。

これどうにかなんないんですかね・・・。

超面倒。
数値をランダムに分配する


[値をランダムに分配するにはどうすればいいのか](http://qiita.com/khsk/items/4dde8384832a405e6e5d) という記事をみて、そういえば前にこんなことを考えていたなーということを思い出したので書いた。

## 背景

ゲームのユニットのパラメタをランダムに生成したいことはよくある。しかしこのやり方には注意が必要だ。
例えば10000ptを割り振りたいときに、「ランダムにパラメタを選んで1増やす。これを10000回繰り返す」とすると各パラメタの値は期待値に落ち着く。
パラメタ数が5種類なら、各パラメタは全体的に2000前後になってしまう。

## やりたいこと

各パラメタの値がそれなりに分散して欲しい。

## やり方

中学か高校の数学の「場合の数」で習ったような方法を使う。

10,000個のみかんを5人で分けたい場合、みかんを一列に並べランダムに4枚の仕切りをさして各人が区切られた区間のみかんをもらう。

この方法だと少なくともみかんの数が増えても、もらえるみかんの数が期待値に収束することは無い。

## コード

`distribute_1`が期待値に収束するやり方。`distribute_2`がしないやり方。

```ruby:random_parameter.rb
# 検証用のヘルパ関数
def sum_value(hash)
  ret = 0
  hash.each do |k, v|
    ret += v
  end
  ret
end

def distribute_1(max, params)
  ary = Array.new(params.size, 0)
  max.times do
    index = rand(ary.size)
    ary[index] += 1
  end
  params.zip(ary).to_h
end

def distribute_2(max, params)
  randoms = Array.new(params.size - 1){ rand(max) }.sort
  table = [0, *randoms, max]
  params.map.with_index { |key, index| [key, table[index + 1] - table[index]] }.to_h
end


max = 10_000
params = [:atk, :def, :dex, :mag, :lak]

puts "---- type 1"
table = distribute_1(max, params)
p table
puts "total = #{sum_value table}"

puts "---- type 2"
table = distribute_2(max, params)
p table
puts "total = #{sum_value table}"
```

```text:出力
$ ruby random_parameter.rb
---- type 1
{:atk=>1994, :def=>2009, :dex=>1969, :mag=>2017, :lak=>2011}
total = 10000
---- type 2
{:atk=>1322, :def=>2089, :dex=>465, :mag=>4966, :lak=>1158}
total = 10000
```

それなりにバラけます。
Confirmableを利用中のDevise(3.5.1)で登録完了時のwelcomeメールを送る方法


## ポイント

箇条書きをすると以下の通り

* deviseがconfirmed_atをsaveするときにメールを送る
* そのために、deviseのconfirmメソッドをオーバーライドする(※ハマリどころ: 後述)
* メール送付は ActionMailer で。

前提として、DeviseはUserモデルに紐付いているものとします。


## ActionMailerを送るための仕組み

設定、メーラクラス、テンプレートを作ります。

### development環境はとりあえずgmailを使いました

```config/environments/development.rb
SampleApplication::Application.configure do

  ・・・

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { 
    address:        'smtp.gmail.com',
    port:           587,
    domain:         'example.com',
    user_name:      'ユーザー名',
    password:       'パスワード',
    authentication: 'plain',
    enable_starttles_auto: true
  }
end
```

### メーラクラスを準備します

```app/mailers/user_mailer.rb 
class UserMailer < ActionMailer::Base
  default from: "ユーザー名@gmail.com"

  def completion_of_registration(user)
    @user = user
    mail(:subject => "登録ありがとうございました", to: user.email)
  end
end
```

### テンプレートを作ります

これがメール本文になります。

```app/views/user_mailer/completion_of_registration.text.erb
登録ありがとうございました
```





## confirmメソッドのオーバーライド

ググると、`confirm!`をオーバーライドしろっていう記事がいっぱい出てきますが、これで嵌まりました。

[GitHub](https://github.com/plataformatec/devise/blob/master/lib/devise/models/confirmable.rb#L59)を見ると、deprecatedされてるってワーニングメッセージがあるので、本体からも呼ばれていないんでしょう。(面倒なので調査してません)

```devise/lib/devise/models/confirmable.rb
def confirm!(args={})
  ActiveSupport::Deprecation.warn "confirm! is deprecated in favor of confirm"
  confirm(args)
end
```

ということで、Userモデルで、confirmメソッドをオーバーライドします。

```app/models/user.rb 
def confirm
  super
  if confirmed?
    UserMailer.completion_of_registration(self).deliver
  end
end
```
interactive-rebaseのexecを使ってコミット毎に単語を置換する

まず事前準備として、HEADで変更したファイルに対して置換処理を実行したあと、その変更をHEADに追加するスクリプトを用意する

```bash:bin/substitute-head.sh
git diff-tree --no-commit-id --name-only -r HEAD \
  | xargs git grep -l $1 \
  | xargs sed -i '' -e "s/${1}/${2}/g"
git commit -a --amend -C HEAD
```

次に変更したいコミットを含む形でinteractive-rebaseを実行する。そのときexecオプションを指定する

```bash
git rebase -i -x "bash substitute-head.sh foo bar" $(git merge-base master HEAD)
```

するとこんな感じの画面が表示される

```diff
pick 6ae3155 first
exec bash tmp-replace.sh foo bar
pick fb5cca5 second
exec bash tmp-replace.sh foo bar
pick 311b1ec third
exec bash tmp-replace.sh foo bar
```

エディタを閉じるとコミット単位でsubstitute-head.shが実行され、その結果、fooがbarに変更される。

もしおかしなことになったら、git-reflogを使って巻き戻しましょう。

### 参考

- [Git - あるコミットで変更したファイルだけの一覧を出力する - Qiita](http://qiita.com/yuku_t/items/4f039e5e8557cf1d90a1)
- [Git - 簡単にトピックブランチだけでinteractive rebaseする - Qiita](http://qiita.com/yuku_t/items/5cf770157380952e9476)
- [Git-rebaseのexecを使ってstashした内容を履歴に埋め込む - Qiita](http://qiita.com/yuku_t/items/fed530acb97385ecbeee)
AngularUI Calendar (FullCalendar) dayClick が iOS上で期待通りに呼ばれない


bowerで入れた angularUI Calendar 1.0.0, FullCalendar 2.1.1での話です。


Angular WEBアプリでカレンダーを使いたいというニーズを完璧なまでに満たす
AngularUI Calendar
http://angular-ui.github.io/ui-calendar/


ですが、月(month)表示から日セルクリックで日(agendaDay)表示に切り替えようとしてdayClickを使用した場合、なぜかiPhoneではうまく動作しません。

正確にいえば、タップではなく一秒ほど長押しするか、軽く日セルをドラッグしようとするとdayClickが呼ばれます。

**なんでどぅあぁぁぁーーーー！**

と3日ほど頭を悩ませた結果、なんとか対処できたのでおすそ分けします。
ちなみにAngularUI CalendarはFullCalendarのラッパーなので、FullCalendarで同じような問題に悩んでいる方にも効くはず....です。

# 原因
dragイベントの扱いの違いに起因しています。
dayClickはclickイベントで呼ばれていません。dragの終了を検知して呼ばれています。
iOS上のSafari(というかwebkit?)以外では、タップして指を離した瞬間に drag開始、drag終了のイベントが発生するのですが、iOSではdragするか、しばしタップし続けないとdrag終了イベントが発生しないためのようです。


どうにもならんのでタップイベントでdayClickを呼ぶようFullCalendar.jsを修正しました。


```js:FullCalendar.js

...

4038行目付近

	coordMap: null, // a GridCoordMap that converts pixel values to datetimes
	cellDuration: null, // a cell's duration. subclasses must assign this ASAP
+	isTouch : false, // separate touch and scroll.

	// Renders the grid into the `el` element.


...


4093行目付近
		this.el.on('mousedown', function(ev) {
			if (
				!$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link
				!$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one)
			) {
				_this.dayMousedown(ev);
			}
		});

+		this.el.on('touchstart', function (ev) {
+			this.isTouch = true;
+		});
+
+		this.el.on('touchmove', function (ev) {
+			this.isTouch = false;
+		});
+
+		this.el.on('touchend', function (ev) {
+				if (this.isTouch == false) {
+					//may be scroll.
+					return;
+				}
+				if (
+					!$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link
+					!$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one)
+				) {
+					_this.touchEnd(ev);
+				}
+			}
+		);

		this.bindSegHandlers(); // attach event-element-related handlers. in Grid.events.js
	},

+	touchEnd: function(ev){
+		console.log("touch end called.");
+		var _this = this;
+		var view = this.view;
+
+		this.coordMap.build();
+		var cell = _this.coordMap.getCell(ev.originalEvent.pageX, ev.originalEvent.pageY);
+		var dayEl = _this.getCellDayEl(cell);
+		view.trigger('dayClick', dayEl[0], cell.date, ev);
+	},

	// Process a mousedown on an element that represents a day. For day clicking and selecting.
	dayMousedown: function(ev) {


...



```


単にtouchendだけ捕まえるとドラックされた時に挙動がおかしくなる場合があるので、touchstart,touchmove も捕まえてドラックとタップを識別しています。

参考になれば！
cronを使いGitlabリポジトリをWEBサーバ側に反映させる

Web hookとか色々ありますが、うまくいかなかったりで悪戦苦闘していました。。
試しにcronを使ってWEBサーバの更新ができたのでメモとして残しておきます。サーバ周りは初心者です。

規模が大きいものや本番環境は、CIとかきちんと使ったほうがいいと思います。
そのへんは、これから勉強していきたいなと思います。
（今回は、静的な開発環境を想定して考えました）

今回はGitabリポジトリでソース管理をして、cronでWEBサーバも更新する仕組みを作りました。
cronは5分おきにしました。

以下のような感じになります。

![flow.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/65323512-855f-19aa-ef35-732ad224d9dc.jpeg)

# サーバー準備

* gitコマンドがインストールされている

# WEBサーバにアクセスして秘密鍵と公開鍵を作成

対象のサーバからGitlabのリポジトリをcloneできるように秘密鍵と公開鍵を作成します。

```
ssh ◯◯@hogehoge.net  // sshでログイン（ログインユーザはsudo権限が必要）
sudo -s  // rootユーザに切り替える
su - アカウント  // rootユーザからアカウントに切り替える
```

対象サーバのアカウントに切り替えたら、鍵を作成します。

```
$ cd ~/
$ mkdir .ssh (.ssh ディレクトリが作成されていない場合、作成済みの場合は cd ~/.ssh/)
$ ssh-keygen（鍵の保存先は、「.ssh/id_rsa」パスフレーズは空「Return」）
$ cat ~/.ssh/id_rsa.pub （表示されるキーをコピー）
```

# 作成した公開鍵をGitlabに登録

![deploy.jpg](https://qiita-image-store.s3.amazonaws.com/0/34020/b9cc03b7-fc89-cbe7-c463-0b6b6aa46a42.jpeg)

コピーしたキーをGitlabのリポジトリに登録をする

Setting → Deploy Keys → New Deploy Keys

# WEBサーバ側にリポジトリをcloneさせる

リポジトリ側では、ファイルをあげた状態にする（アップされたか確認するため）

まずは、リポジトリを格納するディレクトリに移動します。

自分は、公開ディレクトリではないユーザディレクトリの直下にcloneをしました。

※公開サーバへそのままcloneしてしまうと/.git/ができてしまいます。--mirrorのオプションをつけてcloneし公開ディレクトリへcheckoutする形にしました。（[参考記事通り](http://ja.katzueno.com/2015/01/3390/)）

```
$ cd [リポジトリを格納するディレクトリ]
$ git clone --mirror [リポジトリURL] [オプション：作成するリポジトリ名]
```

# WEBサーバ側にシェルスクリプトを設置する

まずは、シェルスクリプトの作成を行います。

シェルスクリプトはpre-push.shという名前で、リポジトリのhooksの中に入れました。

※作成ユーザは、WEBサーバのアカウント

```
$ cd [--mirrorで作成したリポジトリのパス]
$ vi hooks/pre-push.sh
```

``` pre-push.sh
#!/bin/sh
cd [--mirrorで作成したリポジトリのパス]
git fetch
GIT_WORK_TREE=/home/dev-ideacd git checkout -f master
```

作成したスクリプトに実行権限を与えます。

```
$ chmod +x pre-push.sh
```

# WEBサーバ側にcronを設定する

rootユーザでcrontabの設定を行います.

```
# crontab -u [WEBサーバのアカウント] -e
```

5分おきにcronが走るように設定

```
*/5 * * * * [--mirrorで作成したリポジトリのパス]/hooks/pre-push.sh
```

# 参考サイト

* [Bitbucket や GitHub で自動デプロイするためのサンプル PHP スクリプトを拾って改造してみた](http://ja.katzueno.com/2015/01/3390/)
* [git hookでサイトを更新、やってみた](http://qiita.com/fnobi/items/98bd5d1c83c010842733)
* [cron から自動で git push する](http://tm.root-n.com/unix:command:git:cron_git_push)
* [Webサーバ起動時に、自動的にGitで最新アプリケーションをデプロイする方法 /etc/rc.local or Cron](http://tech.basicinc.jp/Linux/2013/07/28/linux_autorun_script/)
* [cronの設定](http://kazmax.zpp.jp/linux/lin_cron.html)
スマホのスワイプ検知

#スマホの横スワイプをjQueryを使って検知する

ネットで拾ったコードをベースに自分用に書き直したものを公開できる形に変更してます。
mainというidを持つ要素に対して横スワイプを行うとアラートが出るものです。

```js
$(function() {
  $('#main').on('touchstart', onTouchStart); //指が触れたか検知
  $('#main').on('touchmove', onTouchMove); //指が動いたか検知
  $('#main').on('touchend', onTouchEnd); //指が離れたか検知
  var direction, position;

  //スワイプ開始時の横方向の座標を格納
  function onTouchStart(event) {
    position = getPosition(event);
    direction = ''; //一度リセットする
  }

  //スワイプの方向（left／right）を取得
  function onTouchMove(event) {
    if (position - getPosition(event) > 70) { // 70px以上移動しなければスワイプと判断しない
      direction = 'left'; //左と検知
    } else if (position - getPosition(event) < -70){  // 70px以上移動しなければスワイプと判断しない
      direction = 'right'; //右と検知
    }
  }

  function onTouchEnd(event) {
    if (direction == 'right'){
      alert('右だよ');
    } else if (direction == 'left'){
       alert('左だよ');
    }
  }
  
  //横方向の座標を取得
  function getPosition(event) {
    return event.originalEvent.touches[0].pageX;
  }
});
```
Raspberry Pi 2で温湿度・気圧センサのBME280をPythonから使う

スイッチサイエンスから温湿度・気圧センサのBME280が発売されています。同じBosch製の[BMP180](http://qiita.com/masato/items/d5c19a883b0ba3ec7d5b)に比べると湿度も計測できます。BME280一つあれば環境センサとして便利に使えそうです。残念なことにBoschからはCの[BME280_driver](https://github.com/BoschSensortec/BME280_driver)しか公開されておらず、[使い方](http://trac.switch-science.com/wiki/BME280)のページや、[The New Bosch BME280 (Temp, Humidity, BMP)](http://arduinotronics.blogspot.jp/2015/05/the-new-bosch-bme280-temp-humidity-bmp.html)のブログなどもArduinoのサンプルコードしか見つかりませんでした。Raspberry Pi用にPythonで書き換えるのは敷居が高くて困っていると、ありがたいことにスイッチサイエンスさんが速攻でPythonのライブラリを書いてくれました。


## ブレッドボード配線

[使い方](http://trac.switch-science.com/wiki/BME280)にあるArduinoの回路図をみながら、Raspberry Pi 2に以下のように配線します。確認したところ3.3Vに配線するVcoreとVioは基板上でつながっているのでどちらか片方だけでよいみたいです。

```
SDI      (BME280)  -> GPIO2 P03 (Raspberry Pi SDA1)
SCK      (BME280)  -> GPIO3 P05 (Raspberry Pi SCL1)
GND,SDO  (BME280)  -> GND  P09 (Raspberry Pi)
Vio,CSB  (BME280)  -> 3.3v P01 (Raspberry Pi)
```

![bme280-plus.png](https://qiita-image-store.s3.amazonaws.com/0/43745/c69cde57-bed9-9f43-b0dd-4040724a5028.png)



ジャンパワイヤを配線したらi2cdetectで確認します。0x76アドレスを使っています。

```bash
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
```

## サンプルコード

スイッチサイエンスの[BME280](https://github.com/SWITCHSCIENCE/BME280)のリポジトリにPythonのサンプルコードがあります。適当なディレクトリを作成してダウンロードします。


```bash
$ mkdir ~/python_apps/ss
$ cd !$
$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
```

サンプルコードを実行します。

```bash
$ sudo python bme280_sample.py
temp : 28.18  ℃
pressure :  995.69 hPa
hum :  60.62 ％
```

以下のデータが取得できました。

* 気温: 28.18 度C
* 気圧: 995.69 ヘクトパスカル
* 湿度: 60.62 ％
MODXの1つのテンプレート変数内で入力項目を動的に持つ

MODXでテンプレート変数を定義するとリソースの編集画面に1つの入力項目がでますが、沢山入力したい時にその数だけテンプレート変数を定義するのが面倒…というわけで、1つのテンプレート変数を設定してその中で複数の入力項目を用意するテストコード書きました。

![pic02.png](https://qiita-image-store.s3.amazonaws.com/0/63201/449f1993-7e50-896e-360e-b5694e3ec972.png)

これは実際に作ったテストコードのテンプレート変数の入力画面。「追加」をクリックすると入力項目が増えていく。

## 作ってみた

例によってMODXの[デモサイト](http://mng.demo.modx.jp/)で作成。

### テンプレート変数の設定

こんな感じ。ここに書いてないところは適当に設定。

* 変数名

項目増減テスト

* 入力フォーム

Custom Form

* オプション

```
@CHUNK testc
```

* プロセッサ

Custom Processor

* プロセッサの設定

```
@EVAL return str_replace("\n","<br />","[+value+]");
```

### チャンク作成

テンプレートの入力フォームをCustom Formにして、実際の入力画面のコードはチャンクにて定義。

```lang:testc
<input id="hoges" type="hidden" name="[+name+]" value="[+value+]" />
<a href="javascript:void(0);" onclick="addInput();">追加</a><br />
<script>
val=document.getElementById("hoges").value;
vals=val.split(/\n/);

function valueset(){
  i=0;
  str='';
  while( i < 100 ){
    tmp = document.getElementById("hoge"+i);
    if( tmp != null ){
      if( str != '' ){
        str = str + "\n";
      }
      str = str + tmp.value;
    }else{
      break;
    }
    i++;
  }
  document.getElementById("hoges").value=str;
//alert(str);
}
function addInput(){
  i=1;
  tmp = document.getElementById("hoge0");
  while( i < 100 ){
    pretmp = tmp;
    tmp = document.getElementById("hoge"+i);
    if( tmp == null ){
      break;
    }
    i++;
  }
  if( i == 100 ){
    alert('これ以上追加できません。');
  }else{
    var ele = document.createElement("input");
    ele.type = "text";
    ele.id = "hoge"+i;
    ele.name = "hoge"+i;
    ele.onblur = valueset;
    pretmp.parentNode.appendChild(ele);
    var cr = document.createElement("br");
    pretmp.parentNode.appendChild(cr);
  }

}

if( vals.length == 0 ){
  document.write("<input id='hoge0' type='text' name='hoge0' value='' onblur='valueset()'><br />");
}else{
  for (var i = 0; i < vals.length; i++) {
    if( vals[i] != "" ){
      document.write("<input id='hoge"+i+"' type='text' name='hoge"+i+"' value='"+vals[i]+"' onblur='valueset()'><br />");
    }
  }
}
</script>
```

## 実行

MODXのリソース編集画面にテンプレート変数が出ていて、複数項目入力できるようになっていたらOK。
本文に `[*項目増減テスト*]` って書くと入力した項目が改行区切りで表示される。

## 補足

テンプレート変数の入力フォームをカスタマイズするときに `@EVAL` も使えるのでPHPコードでごにょごにょする事もできます。
ただ実行順序が「PHPコードの実行→[+value+]変数展開」 なのでPHPの中で[+value+]の中身を好きに加工することができません。

というわけで、ここで入力項目をいじりたい時は基本、Javascriptでごにょごにょする事になります。
(MODX Evo 1.0.14j-r9現在)

あぁ、忘れてた。
増減テストということで、減にしたい場合は中身を空にするとそのテキストボックスは消されます。本当は削除ボタンまで作った方がよかったんだろうけど、JS苦手なので…サンプルコードも初心者過ぎて辛い。
windowsでvagrant-itamaeを導入しようとした時にffiでコケたのでメモ

## 状況
windows環境しか無い僕にとってVagrant便利。pluginのvagrant-itamae使うとさらに便利。
いろいろあって、再セットアップしたところffi1.9.10を入れるときにコケる。。。

## 一応ログも晒しとく
ディレクトリパスだけちょっといじってる。

    make[3]: *** [libffi.la] Error 1
    make[3]: Leaving directory `/c/Users/path/to/.vagrant.d/gems/gems/ffi-1.9.10/ext/ffi_c/libffi-i386-mingw32'
    make[2]: *** [all-recursive] Error 1
    make[2]: Leaving directory `/c/Users/path/to/.vagrant.d/gems/gems/ffi-1.9.10/ext/ffi_c/libffi-i386-mingw32'
    make[1]: *** [all] Error 2


## 試したこと
* rm -rf ~/.vagrant.d/
* vagrant 再インストール
* virtualbox再インストール

いろいろやってたboxesのバックアップ取り忘れてて(´；ω；｀)ｳｯ…

## 対応(暫定)
[githubにffiのリリース情報](https://github.com/ffi/ffi)を確認したら2015/06/27になんかリリースしてる。2015/07/01にもリリースしてる。なんか問題あったんだろうな。。。
でも、英語読めない。
versionに差異が出てうまくいかないっぽいし適当に1.9.8ぶち込むことにした。
versionの設定方法わからずめんどくさくなって下記コマンドでごりおした。絶対どっかにconfigあるはずなんだけどなぁ。。。

    # とりあえず無理やりversion指定して依存関係で入れ込まれる前にぶち込んでやる
    $ vagrant plugin install ffi --plugin-version 1.9.8
    $ vagrant plugin install vagrant-itamae

これで行けた。
重なっている要素の前面を無視して背面をクリックしたい

ツールチップを出してる時にborderで作った矢印の下にくるリンクがクリックできなくなってしまったのでメモ

```css
.base {
  z-index: 1
}

.overLay {
  z-index: 100
  pointer-events: none;
}
```

って感じで**.base**の上に**.overLay**が重なってるときに
**.overLay**を無視して**.base**のクリックできる
Railsアンチパターン<DB編>

データベースに関わるアンチパターン
=

 - 既存のmigrationを勝手に修正する

すでにリポジトリに対してcommitされた`up`メソッドを編集するべきではない。既存のmigrationを変更しても`rake db:migrate`コマンドはすでに実行したことがあるタイプスタンプ名のmigrationを適用しないため、混乱が生じる。
基本的にカラムなどの操作は新たにmigrationをまた作成するべきだ。だが、どうしても既存のmigrationを訂正しないといけないということになった場合は、`rake db:migrate:redo`
commitされたupメソッドを修正するな、混乱の元だ。
もしどうしてもやるんならrake db:migrate:redoで。これは指定ステップ前までのmigrationを取り消し、やり直してくれる。

ちなみにだが、DBのスキーマ管理について、[ridgepole](https://github.com/winebarrel/ridgepole)を使うという選択肢もある。これだと冪等性が確保されるので、このような混乱が生じることはない。

 - migration内にRubyコードを入れる。

理論上、up,downメソッドはmigraiton時に実行されるので、こういうことができる(そもそも発想がなかった)

```.rb
def self.up
  add_column :users, :jobs_count, :integer, :default => 0 
  Users.all.each do |user|
    user.jobs_count = user.jobs.size
    user.save
  end
end
```

しかしもし使ってるモデル(User)がなくなったらこのmigrationは落ちる。
SQLを直接叩くだと、DBの状態にしか依存しないので少しマシになる。
参考:[Railsのmigrationで生SQLを使う+パラメータを使う](http://techracho.bpsinc.jp/baba/2012_11_26/6414)
もしモデルを参照したい場合はmigrationの中にワンライナークラス定義を含めてしまえばよい。

```.rb
class Job < ActiveRecord::Base;end
class User < ActiveRecord::Base
has_many :jobs
end

def self.up
  add_column :users, :jobs_count, :integer, :default => 0 User.reset_column_information
  Users.all.each do |user|
    user.jobs_count = user.jobs.size
    user.save
  end
end
```

 - downメソッドを用意しない

downメソッドがないと、ロールバック時の挙動がコントロールできない。
たとえば、絶対にロールバックしたくないmigrationについてはdownメソッドに例外を仕込んでおくという技がある。こうすると他のメンバーに「このmigrationはロールバックしてはならない」という意図を伝えることができる。

アンチパターン:バリデーション関係
=
バリデーションをモデル定義にいっぱい書いてる人がいるけど、(今はそれも別クラスに分けられるとはいえ)DBの機能でなんとかできることはそっちの機能を利用したい。が、DBMSによって使える機能が全然違う。
ActiveRecordが提供している機能はだいたいDBMSの最大公約数的な機能だけなので、自分でプラグインを探してくる必要がある。
ここでは[foreigner](https://github.com/matthuhiggins/foreigner/)が紹介されていたが、Rails4.2では外部キー制約は機能に[組み込まれている](http://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_foreign_key)。たとえば自分はmysqlに`unsigned`型を追加したのに、[mysql-awesome](http://qiita.com/kamipo/items/11b55caf329210923a9a)を利用している。この辺は界隈の情報更新についていく必要がありそう。
PHPで○ヶ月前の日付を求めるプラクティス

単純に`strtotime('-1 months')`としてしまうと3月31日の場合、2月31日となってしまい正しい値が求められない。

いつも忘れてしまうので、メモしておく。末日を考慮して数ヶ月前の日付を計算する時は以下のように書く。

```php
$ts0331 = strtotime("2015-03-31");
# 1日
date('Y-m-d', strtotime('first day of previous month', $ts0331));
# 末日
date('Y-m-d', strtotime('last day of previous month', $ts0331));
```

この手の処理は何度も使って人のスキル感によってバグを起こしがちなので注意したい。

## 追記 2015/07/02
@mpywさんからご指摘頂いた通り修正させていただきました。
皆様フィードバックありがとうございますm(__)m
Droneが遅いから、dockerのstorage driverを変更して、ざっくりとビルドの速度比較をしてみた

## やりたいこと、やっていること

ossの [drone](https://github.com/drone/drone) を利用したお手軽なCI環境を構築しようとしています。

droneの中身をちょっと修正したりしながらdroneおよびdockerコンテナ、カスタムイメージまわりの検証を実施しています。

## Dockerのヴァージョンをあげると遅くなりました。。

AWS上で作成したubuntu14.04をホストにして単発で動かしたところさくさく動きました。
「おー、速い。」ということで、色気をだして、dockerのversionを1.7にあげたところ、ものすごく遅くなりました。。なぜ。。

ということで、droneのgitterで質問、および、droneの [issues #271](https://github.com/drone/drone/issues/271) を見てみました。

[@bradrydzewski](https://github.com/bradrydzewski) さんが回答してくれています。

```
Yep, that is definitely the issue. you need to run aufs instead of devicemapper. This is probably located in some Docker configuration file somewhere, but I'm not sure. aufs should be the default on Ubuntu.
```

```
Also, I believe Kernel 3.18 is going to include OverlayFS (similar to AUFS) which in my experience has performed very well. The Docker team also has experimental support for OverlayFS. So worst case scenario CoreOS can probably offer OverlayFS as an alternative to BTRFS in the near future.
```

ubuntuだったら、aufs
CoreOSだったら、OverlayFSを利用してね、
とありました。

## 簡単な動作検証

ということでいくつかのパターンで検証しました。

|*distribution*|*os version*|*instance type*|*storage driver*|*ビルド時間*|*実行場所*|*docker version*|
|:-----------|------------:|--------------:|------------:|------------:|------------:|:------------:|
|coreos|717|t2.small|overlay|5 min|remote|1.6|
|coreos|717|t2.large|overlay|3 min|remote|1.6|
|coreos|647|t2.small|btrfs|5 min|remote|1.5|
|coreos|647|t2.medium|btrfs|3 min|remote|1.5|
|ubuntu|1404|t2.small|devise mappser|5 min|remote|1.6|
|ubuntu|1404|t2.medium|devise mappser|3 min|remote|1.6|
|ubuntu|1404|t2.small|aufs|34 sec|local|1.6|
|ubuntu|1404|t2.medium|aufs|27 sec|local|1.6|
|ubuntu|1404|t2.large|aufs|13 sec|local|1.6|
|ubuntu|1404|t2.small|aufs|34 sec|remote|1.6|
|ubuntu|1404|t2.medium|aufs|27 sec|remote|1.6|
|ubuntu|1404|t2.large|aufs|22 sec|remote|1.6|


（※）「実行場所」はdroneを動かした場所が、ホストかリモートのマシンかの違いです。

## 推測

* インスタンスタイプは関係ない。
* OverlayFSは推奨されてはいたがあまり速くない。。むしろ遅いような。。

## 今後のTODO

* docker 1.8のzfsでも試してみたいです。動きが違うかもしれません。
* drone のヴァージョンアップを逐次チェック。
Evaluating JavaScript code via indirect eval call.

このエントリは、indirect eval call を使い global を取得する方法についてのメモです。

[(0, eval)('this')とは何なのか](http://qiita.com/SFPGMR/items/7a09507eead5b5db8d17) を拝見したのがこのメモを記述するきっかけです。

このイディオム(indirect eval call)に関連する記事としては、以下の3つが見つかりました。2つめは Dr.Axel さんのものですね。

1. http://pirosikick.hateblo.jp/entry/20110517/1305645797 ("global", eval)("this")
2. http://www.2ality.com/2014/01/eval.html Evaluating JavaScript code via eval() and new Function()
3. http://stackoverflow.com/questions/19357978/indirect-eval-call-in-strict-mode Indirect eval call in strict mode 

書き方としては `(0, eval)('this')` に限らず、亜種がいっぱいあるようです。
要は、一旦 eval を変数(または暗黙の変数)に入れると indirect eval call として扱われるようです。

```js
(1, eval)('...')
(eval, eval)('...')
(1 ? eval : 0)('...')
(__ = eval)('...')
var e = eval; e('...')
(function(e) { e('...') })(eval)
(function(e) { return e })(eval)('...')
(function() { arguments[0]('...') })(eval)
this.eval('...')
this['eval']('...')
[eval][0]('...')
eval.call(this, '...')
eval('eval')('...')
```


## in Babel

Babel だとどうなるのでしょうか?

indirect eval call で global が取得できるか、 [Babel の repl](https://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&code=var%20a%20%3D%20(0%2C%20eval)(%22this%22)%3B%0A%0Aconsole.log(Object.prototype.toString.call(a))%3B) で試してみた結果がこちらです。

```js
// source
var a = (0, eval)("this");

console.log(Object.prototype.toString.call(a));
```

```js
// result

"use strict";

var a = (0, eval)("this");

console.log(Object.prototype.toString.call(a)); // [object global]
```

遅延評価されることで global がとれてますね。

> なお、
> `(0, eval)("this");` と文字列にせず、
> `(0, eval)(this);` としてしまうと、
> Babel が `(0, eval)(undefined);` に変換してしまいます。

## in ESLint

ESLint で eval がどのように扱われているかも知る必要があるでしょう。

.eslintrc を用意し実行してみます。

```json
{
    "env": {
        "browser":          true,
        "node":             true
    }
}
```

`$ eslint ...`

私の環境では特に怒られませんでした。良いですね。

## vs WebModule

蛇足になりますが、uupaa さん家の WebModule では、
`var GLOBAL = GLOBAL || (this || 0).self || global;` で [global Object を求めていますね](https://github.com/uupaa/WebModule/wiki/WebModuleIdiom)。


なんだか、WebModule のやり方よりも
`var global = ("global", eval)("this");` のほうがシンプルでスッキリしている、そんな気がしてきました。

## まとめ

まとめると、`var global = ("global", eval)("this");` は、(困った事に)中々良いのではないでしょうか。

あ、そうそう初Qiita なのでお手柔らかにお願いします。
Docker × PostgreSQL


[docker_data]:https://docs.docker.com/userguide/dockervolumes/
[docker_postgresql]:https://github.com/docker-library/docs/tree/master/postgres

## やりたいこと
* Docker上にPostgreSQL Serverを構築する
* データは永続化したいためPostgreSQL Serverのコンテナとは別コンテナにする
* データ保持用のコンテナからバックアップおよびリストアする

## データ保持用コンテナの作成

参考：[Manageing data in containers][docker_data]

Dockerの公式サイトのドキュメントには、永続的なデータをコンテナ間で共有したい場合や非永続コンテナから使用したい場合、Data Volume Containerと呼ばれるコンテナを作成し、そこからデータをマウントするのが最善であると記述されています。

このベストプラクティスに従い、PostgreSQL Serverコンテナ用のデータボリュームコンテナを以下の様に作成します。

### 条件

* 最低限のOS機能のみ必要なため、ベースとするdockerイメージは __busybox__にする
* PostgreSQL ServerコンテナはPostgreSQL公式のdockerイメージを使用するためデータ格納ディレクトリは```/var/lib/postgresql/data```となり、このディレクトリをデータボリュームコンテナから可能にする

### dockerイメージの作成

上記の条件からPostgreSQL Serverコンテナ用のデータボリュームコンテナのdockerイメージを作成します。

```text:Dockerfile
FROM busybox
MAINTAINER xxx <xxx@gmail.com>

VOLUME /var/lib/postgresql/data
CMD ["/bin/true"]
```

```bash:dockerイメージの作成
$ docker build -t xxx/postgresql-storage .
```

`xxx/postgresql-storage`は作成するdockerイメージの名前で、
`.`はDockerfileのあるディレクトリになります。

### コンテナの作成

作成したdockerイメージを元にデータボリュームコンテナを作成します。

```bash:コンテナの作成
$ docker create --name postgresql-storage xxx/postgresql-storage
```

## PostgreSQL Serverコンテナの作成

参考：[PostgreSQL docker doc][docker_postgresql]

PostgreSQL公式のdockerイメージからコンテナを作成します。
コンテナ作成時に作成したデータボリュームコンテナをマウントさせます。

```bash:コンテナ作成
docker run --volumes-from postgresql-storage --name postgresql-server -p 15432:5432 -e POSTGRES_USER=xxx -e POSTGRES_PASSWORD=xxx -d postgres
```

```--volumes-from postgresql-storage```がデータボリュームコンテナのマウントを指定している部分になります。

## データのバックアップ・リストア・マイグレーション

データボリュームコンテナにある永続データの操作は以下の様に行います。

### バックアップ

```bash:バックアップ
docker run --rm --volumes-from postgresql-storage -v $(pwd):/backup xxx/postgresql-storage tar cvf /backup/backup.tar /var/lib/postgresql/data
```

```--volumes-from postgresql-storage```にバックアップ元のコンテナを指定します。

### リストア・マイグレーション

注）リストアはバックアップを作成したコンテナに対して行い、マイグレーションは異なるコンテナに対して行います。

```bash:リストア・マイグレーション
docker run --rm --volumes-from postgresql-storage -v $(pwd):/backup xxx/postgresql-storage tar xvf /backup/backup.tar
```

```--volumes-from postgresql-storage```にリストア・マイグレーション先のコンテナを指定します。
コーディング規約(Choreographe)【まとめ】

#関連記事
僕の作成した記事ですが、紹介させてもらいます。

>コーディング規約(Choreographe)【提案】
>http://qiita.com/DeveloperRyo87/items/4c36a7955016ad0c176f

前回、こちらの記事でコーディング規約を考えていく上で何ベースで開発していくかを考えてみました。

#前書き
今回は前回の記事を踏まえた上で、どのようなコーディングを行っていくと見やすくなるか、わかりやすくなるかをまとめていきます。


#まとめ
##前回のまとめ
前回の記事では5種類のベースについて話をしました。
またそれぞれに対して利点と欠点があることがわかりました。

それらを総合してどのようにアプリケーションを作ると良いかまとめていきます。

##それぞれのベースの特徴

###Dialogベース
会話を行うことに特化しており、その中でモーションをつけたり、音を流したりすることができる。

###Timelineベース
モーションを付けることよりも、レイヤーやフレームを使ってアクションを管理することができるので見やすいプロジェクトの作成が可能。

###イベントベース
発火させるタイミングを任意で制御できるため、使いドコロを謝らなければわかりやすいプロジェクトを作成できる。

###pythonベース
あまり大規模なコーディングには向かないが、APIが公開されているので、ドキュメントが読めれば比較的小回りの効いたプロジェクトが作成できる。

###Diagramベース
比較的容易にボックス群を束ねることができるので、初心者でも簡単にグルーピングができる。
また、diagramにわかりやすい名前を付けることで、概形がわかりやすいものとなる。

##Choreographeによるアプリケーション開発の指針
1. Diagramでアプリケーションの概形を作る。
2. DialogまたはTimelineベースでアプリケーションの作成
3. 細かなところはpythonを用いて制御
4. イベントはコメント付きで発火させる。

##Choreographeによるアプリケーション開発の制約
1. 1画面にボックスは10個まで。それ以上になるようであれば、TimelineかDiagramで分けること。
2. Diagramでグルーピングを行うが、階層は既存のボックスを除いて3階層まで。
3. あまりにもボックスが増えるようであれば、behaviorを作成するか、Timelineのレイヤーを作成して対応すること。
4. 画面をスクロールしなくてもすべてのボックスが見れるような配置であること。
5. Diagramを用いる場合はわかりやすいiconと名前に変更すること。
6. Timelineのレイヤー名、フレーム名をわかりやすい名前に変更すること。

###補足
上記の1,2 から10^3=1000ということでおよそ1000個のボックスが使えることとなりますが、実際には1000個ものボックスを使うと、起動時のインスタンス生成に時間がかかり大変非効率的です。なので極力ボックスの数は減らすことが望ましいと思います。

また、3の"behaviorを作成するか、Timelineのレイヤーを作成して対応すること。"ですが、レイヤーやフレームを正確に言うとBehavior Layer,Behavior Frameという名前がついております。
名前からも分かる通り、Behaviorを作成しています。

>behavior-layers
>http://doc.aldebaran.com/2-1/software/choregraphe/panels/timeline_panel.html?highlight=frame#behavior-layers



#感想
CSS だけで 空の要素に指定した background-image の高さを正しい縦横比で動的に変化させる

## やりたいこと
タイトルからだと分かりにくいですが、やりたいことはこうです。

```html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>自己紹介</title>
	</head>
	</head>
	<body>
		<section class="profile-content">
			<header>
				<h1>自己紹介</h1>
			</header>
			<div class="profile-image"></div>
			<p>僕はととろ、君はとろろ。<br>
			ごめんほんとは僕、らっしーっていうんだ。Railsエンジニアしてます。</p>
		</section>
	</body>
</html>
```
こんな HTML で、
css だけで画面を

|小さくしても縦横ぴったし|大きくしても縦横ぴったし|
|---|---|---|
|![window-small.png](https://qiita-image-store.s3.amazonaws.com/0/27500/cf850184-d276-2c6c-e8fe-0d2b2406b80d.png)|![window-big.png](https://qiita-image-store.s3.amazonaws.com/0/27500/a18f96c5-0d37-4afd-0310-6150a1327016.png)|


な感じでウィンドウ幅に合わせて縦横ちゃんと合わせて表示したいのです。
## **background-size: 100% auto;** してやればいいじゃん！は **間違い**。
一般的に`background-size: 100% auto;`とすれば指定要素の横幅一杯に背景画像がきて（100%）、高さは縦横比をた保ったまま自動で設定されます（auto）。
しかし、この100%やautoは要素に対するものです。
つまり、100%は親要素の横幅一杯にという意味で、autoは要素自身の高さになります。
要素に内容が何もないと要素自身の高さはゼロです。
だから表示されません。

```html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
	<title>自己紹介</title>
	<style type="text/css">
	  @charset "utf-8";

	  .profile-image {
	    background: url("./images/profile-image.jpg") 0 0 no-repeat;
	    background-size: 100% auto;
	  }
		</style>
	</head>
	<body>
		<section class="profile-content">
			<header>
				<h1>自己紹介</h1>
			</header>
			<div class="profile-image"></div>
			<p>僕はととろ、君はとろろ。<br>
			ごめんほんとは僕、らっしーっていうんだ。Railsエンジニアしてます。</p>
		</section>
	</body>
</html>
```

![スクリーンショット 2015-07-02 10.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/27500/0285ebc9-932c-a77e-d12c-2beddf4a2498.png)

## 方法
ではどうすれば良いか、
`padding-bottom`もしくは`padding-top`で要素の内側の余白を指定してあげれば良いです。
`calc`はcss3で導入された%やpxなどを混ぜて計算できるcssファンクションです。

指定する値は

```
ImageWidth:ImageHeight = 100%:x
x = 100%*ImageHeight/ImageWidth
```
で求まるのでcalcで計算させます。

css2以前なら自力で計算して指定してやれば良いですね。（`100%*1365/2048 = 66.65%`）



```html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>自己紹介</title>
		<style type="text/css">
		  @charset "utf-8";
		  .profile-image {
		    background: url("./images/profile-image.jpg") 0 0 no-repeat;
		    padding-bottom: calc(100%*1365/2048);/* calc(100*ImageHeight/ImageWidth)% */
		    background-size: 100% auto;
		  }
		</style>
	</head>
	</head>
	<body>
		<section class="profile-content">
			<header>
				<h1>自己紹介</h1>
			</header>
			<div class="profile-image"></div>
			<p>僕はととろ、君はとろろ。<br>
			ごめんほんとは僕、らっしーっていうんだ。Railsエンジニアしてます。</p>
		</section>
	</body>
</html>
```

## あとがき
今回の方法はあらかじめ画像の縦横の長さが（比でも良い）わかっていないとできません。
面倒臭いのでこういうのをデフォルトで指定できたりしたら嬉しいですよね。
PHPでフィボナッチ数列を再帰で解く+メモ化再帰と比較

# PHPでフィボナッチ数列を再帰で解く+メモ化再帰と比較

## コード
```php
/* 
フィボナッチ数列
 */

echo 'メモ化再帰を使わない場合のgetFib(35)を求める';
echo '<br>';
$startTime = microtime(true);
echo 'getFib(35)の答えは' . getFib(35);
$endTime = microtime(true);
$deltaTime = $endTime - $startTime;
echo('<br>処理にかかった時間は' . $deltaTime . 'ミリ秒です');
echo '<br><br>';
echo 'メモ化再帰を使った場合のgetFibByMemo(35)を求める';
echo '<br>';
$startTime = microtime(true);
echo 'getFibByMemo(35)の答えは' . getFibByMemo(35);
$endTime = microtime(true);
$deltaTime = $endTime - $startTime;
echo('<br>処理にかかった時間は' . $deltaTime . 'ミリ秒です');
echo '<br><br>';
echo 'メモ化再帰であれば$n=100もイケちゃう！！<br>';
echo 'getFibByMemo(100)の答えは' . getFibByMemo(100);

function getFib($n) {
    if ($n == 0) {
        return 1;
    }
    if ($n ==1) {
        return 2;
    }
    return getFib($n - 1) + getFib($n -2);
}

$memo = array();
function getFibByMemo($n) {
    global $memo;
        if ($n == 0) {
        return 1;
    }
    if ($n ==1) {
        return 2;
    }
    if(isset($memo[$n])) {
        return $memo[$n];
    }
    return $memo[$n] = getFibByMemo($n - 1) + getFibByMemo($n -2);
}

```

## 結果
メモ化再帰を使わない場合のgetFib(35)を求める
getFib(35)の答えは24157817
処理にかかった時間は6.0225310325623ミリ秒です

メモ化再帰を使った場合のgetFibWithMemo(35)を求める
getFibByMemo(35)の答えは24157817
処理にかかった時間は9.0837478637695E-5ミリ秒です

メモ化再帰であれば$n=100もイケちゃう！！
getFibByMemo(100)の答えは9.2737269219308E+20

##参考サイト
http://www.slideshare.net/chokudai/wap-atcoder3
Slack退会済ユーザとのDM履歴を表示する


Slackでダイレクトメッセージで会話すること良くあると思うんですが、Slackの仕様上、相手が退会(退職)してしまうとメッセージが開けなくなるので過去のメッセージをサルベージすることが出来ないです。
アーカイブ一覧にもダイレクトメッセージのは出てこないし･･･。
というので困っていて問い合わせたらハック的なサルベージ方法を教えてもらったのでまとめます。

# 手順

1. Slack admin上の[Disabled Accounts](https://my.slack.com/admin#disabled)にアクセス
2. メッセージを表示したい人のアイコンをクリック
3. ユーザ画面のArchivesボタンをクリック


![Team_Admin___nanapi_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/20074/5a80ecfd-add3-2460-83fc-0f2ffbc3531d.png "Team_Admin___nanapi_Slack.png")

![nanapi_Slack.png](https://qiita-image-store.s3.amazonaws.com/0/20074/e71da5d9-b1c9-cccc-3a50-d5b617cfef9b.png "nanapi_Slack.png")

# 注意点
Admin上のDisabled AccountsをアクセスするためにはSlackチーム内でAdmin以上の権限が必要です。
なので、Adminじゃない人が同じやり方する場合には「退会済のユーザのアカウント名を思い出して(教えてもらって)、http://my.slack.com/team/アカウント名 にアクセス」する、という必要があります。･･･かなりイケてないですね。

また、言うまでもなく「自分以外の誰かと、他の(退会済)ユーザとのDMログ」を見ることは出来ないです。
c++ builder > 範囲チェックエラー > TComboBoxにおいてItemsに空行が入っている

```txt:動作確認
C++ Builder XE4
```

アプリを実行していると「範囲チェックエラー」というエラーメッセージが表示されるようになった。

よくよく見ると、TComboBoxのItemsプロパティにて空行が入っていた。空行を消したらエラーが表示されなくなった。
特定のオブジェクトをマウスイベント対象から外す（SVG内外の両対応）


## SVG内要素の場合
バブルチャートのバブル内のテキストとか、svg内の要素に対して有効。
https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events

```
text {
    pointer-events: none;
}
```

## SVG外の要素の場合
JavaScriptを利用してこんな感じで。

```
function disableMouseEvent(element){
	element.onmousedown = function(){return false;};
	element.onmouseup = function(){return false;};
	element.onmouseover = function(){return false;};
	element.ondrag = function(){return false;};
	element.ondragstart = function(){return false;};
	element.ondragend = function(){return false;};
}

disableMouseEvent( d3.selectAll(".bubbleText") );
```
Docker × MySQL


[docker_data]:https://docs.docker.com/userguide/dockervolumes/
[docker_mysql]:https://github.com/docker-library/docs/tree/master/mysql

## やりたいこと
* Docker上にMySQL Serverを構築する
* データは永続化したいためMySQL Serverのコンテナとは別コンテナにする
* データ保持用のコンテナからバックアップおよびリストアする

## データ保持用コンテナの作成

参考：[Manageing data in containers][docker_data]

Dockerの公式サイトのドキュメントには、永続的なデータをコンテナ間で共有したい場合や非永続コンテナから使用したい場合、Data Volume Containerと呼ばれるコンテナを作成し、そこからデータをマウントするのが最善であると記述されています。

このベストプラクティスに従い、MySQL Serverコンテナ用のデータボリュームコンテナを以下の様に作成します。

### 条件

* 最低限のOS機能のみ必要なため、ベースとするdockerイメージは __busybox__にする
* MySQL ServerコンテナはMySQL公式のdockerイメージを使用するためデータ格納ディレクトリは```/var/lib/mysql```となり、このディレクトリをデータボリュームコンテナから可能にする

### dockerイメージの作成

上記の条件からMySQL Serverコンテナ用のデータボリュームコンテナのdockerイメージを作成します。

```text:Dockerfile
FROM busybox
MAINTAINER xxx <xxx@gmail.com>

VOLUME /var/lib/mysql
CMD ["/bin/true"]
```

```bash:dockerイメージの作成
$ docker build -t xxx/mysql-storage .
```

`xxx/mysql-storage`は作成するdockerイメージの名前で、
`.`はDockerfileのあるディレクトリになります。

### コンテナの作成

作成したdockerイメージを元にデータボリュームコンテナを作成します。

```bash:コンテナの作成
$ docker create --name mysql-storage xxx/mysql-storage
```

## MySQL Serverコンテナの作成

参考：[MySQL docker doc][docker_mysql]

Mysql公式のdockerイメージからコンテナを作成します。
コンテナ作成時に作成したデータボリュームコンテナをマウントさせます。

```bash:コンテナ作成
docker run --volumes-from mysql-storage --name mysql-server -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxx -e MYSQL_USER=xxx -e MYSQL_PASSWORD=xxx -e MYSQL_DATABASE=xxx -d mysql
```

```--volumes-from mysql-storage```がデータボリュームコンテナのマウントを指定している部分になります。
```-e MYSQL_ROOT_PASSWORD=xxx```以外は必須ではありません。

## データのバックアップ・リストア・マイグレーション

データボリュームコンテナにある永続データの操作は以下の様に行います。

### バックアップ

```bash:バックアップ
docker run --rm --volumes-from mysql-storage -v $(pwd):/backup xxx/mysql-storage tar cvf /backup/backup.tar /var/lib/mysql
```

```--volumes-from mysql-storage```にバックアップ元のコンテナを指定します。

### リストア・マイグレーション

注）リストアはバックアップを作成したコンテナに対して行い、マイグレーションは異なるコンテナに対して行います。

```bash:リストア・マイグレーション
docker run --rm --volumes-from mysql-storage -v $(pwd):/backup xxx/mysql-storage tar xvf /backup/backup.tar
```

```--volumes-from mysql-storage```にリストア・マイグレーション先のコンテナを指定します。

## その他

### mysqlの設定のカスタマイズ

Mysql公式のDockerイメージでは、character setが __latin1__ となっておりマルチバイト文字列の処理には適しませんので、mysqlのcharacter setに __utf8__ を使用するように設定を変更します。

通常であれば```my.cnf```というファイルに設定を記述しmysqldを再起動すればいいのですが、dockerで使用する場合にはコンテナ作成時に設定を読みこませる必要があります。

Mysql公式のDockerイメージでは```/etc/mysql/conf.d```配下にある```*.cnf```を全て読み込むようになっています。

したがって、設定変更を行う場合はホスト側に設定ファイルを```*.cnf```で用意し、そのファイルがあるディレクトリをコンテナ作成時にマウントさせればいいのです。

以下がcharacter setを変更する設定と、ディレクトリをマウントさせてコンテナ作成するときのコマンドです。（ディレクトリをマウントさせるには```-v <host_path>:<container_path>```を指定してやります。）

※以下のコマンドでは、カレントディレクトリをマウントさせています。

```text:custom.cnf
[mysqld]
character-set-server=utf8
```

```bash:コンテナ作成
docker run -v $(pwd):/etc/mysql/conf.d --volumes-from mysql-storage --name mysql-server -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxx -e MYSQL_USER=xxx -e MYSQL_PASSWORD=xxx -e MYSQL_DATABASE=xxx -d mysql
```
【MySQL】MySQL5.6ではsql_modeがSTRICT_TRANS_TABLESになる

MySQL5.6へ移行した際に以下のエラーが発生。

```sql:エラー
SQLSTATE[HY000]: General error: 1364 Field 'hogehoge' doesn't have a default value
```

ググると、このエラーはデフォルト値がないカラムに、値なしでinsertしていることを怒っているらしく、mysql5.6からsql_modeのデフォルト値がSTRICT_TRANS_TABLESになったことが原因らしい。

###STRICT_TRANS_TABLESを外す方法
sqlを直すのは手間なので、設定を変更することに。
/etc/my.cnfを変更してmysql再起動しても反映されず、いろいろ調べたら/usr/my.cnfの設定が使われていた。
複数設定ファイルがある場合は後勝ちになるらしい。ちなみに、環境はCentOS7。

参考：[my.cnfのパラメータ優先順位](http://yoku0825.blogspot.jp/2012/11/mycnf.html)

/usr/my.cnfを以下のように修正して再起動したら反映された。

```mysql:my.cnfの修正箇所
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
↓
sql_mode=''
```

```mysql:mysql再起動
service mysqld restart
```

mysqlから設定の確認。

```mysql:設定確認
mysql> SHOW VARIABLES LIKE 'sql_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
```


参考
[MySQL 5.6 で General error: 1364 Field ‘{COLUMN_NAME}’ doesn’t have a default value エラーの対処](http://tetsuwo.tumblr.com/post/69779267905/mysql-5-6-general-error-1364-field)
[MySQL5.6にしていくつかのSQLでエラーが出るようになった](http://www.seeds-std.co.jp/seedsblog/1035.html)
横スクロールな UICollectionView を作る

絶対簡単に出来るだろ？と思いつつも地味にまとまった情報が見つけにくかったので忘備録として投稿。
※要所のみ抜粋

```objc
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
[layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
[collectionView setPagingEnabled:YES];
```
erbのselectボックスにクラス指定する方法

# 概要

erbの `f.select` 的なやつにclass指定する方法。

# 解決

```erb
<%= f.select :birth_month, (1..12).map{|m| [m, m]}, {}, { :selected => @current_user.birth_month || 1, class: 'form-control' } %>
```

- 第三引数に`{}`
- 第四引数に属性を指定できる模様
祝　２日目

#とりあえず。。。。

昨日　AWSを勉強しようとドットインストールをやってみたんですが、

不具合が出て（たぶん僕がubuntuをつかってて、ドットインストールはmacの
説明だったから？）

勉強方法をchangeしました。！

昨日 @understeer さんに教えていただいた、サイトを勉強していきます。
それがこちら！！！！

[AWS]http://aws.amazon.com/jp/aws-jp-introduction/

こちらがとても勉強やすくインプットには最適です。

以下のことをやりました。

1.EC2の立ち上げ！！（昨日はドットインストールでできなかったのですが、
今日はうまくいきました！！）
使ったのはwindows server2012！
　スライドのままやっただけなのにとても分かりやすかったです。
（でもやっぱりmacのほうがいいなと後悔）

2. windows web server のセットアップ
3. EC2からAMIを作成
4.AMIを利用して新たなインスタンスを作る

僕のような右も左もよくわかっていない、windows　userはとてもためになります。
参考までにリンクshareします。
[silideshare]http://www.slideshare.net/AmazonWebServicesJapan/aws-windows-14943091

みなさんも僕みたいなダメなやつに何かアドバイスをいただけるとうれしいですし、
すぐに実践してこのブログに書きますのでお助けを＾＾

感謝です。
.form内の一部inputだけinlineで表示する

Bootstrapだと `.form-inline` 以外の `.form-` は `input` がブロック要素になってしまう。
従って、 `.form-horizontal` 内の一部 `input` だけinlineにしたい場合、少し工夫が必要になる。

### 必要になるシーン

生年月日や姓名で別のフォームに入力させるときなど。

# 実装

解決方法として、 `.form-group` 内でインラインフォームをまとめる要素に `.form-inline` を指定する。

```html
<form class="form-horizontal">
  <div class="form-group">
    <label class="col-sm-3 control-label">ラベル</label>
    <div class="col-sm-9 form-inline">
      <label>姓</label><input type="text" class="form-control" />&nbsp;
      <label>名</label><input type="text" class="form-control" />
    </div>
  </div>
</form>
```

これでいけるはずです。
SQLの脆弱性を軽く調べてみた

今週はSQLを書くことが多く、書き方にも脆弱性を引き起こすポイントがあることを指摘されたので、いくつか調べてみた。
参考になったページの一覧

[Wikipedia](https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)
▲お決まり

[なぜPHPアプリにセキュリティーホールが多いのか？](http://gihyo.jp/dev/serial/01/php-security/0005)
▲これわかりやすかった

[Webアプリにおける11の脆弱性の常識と対策](http://www.atmarkit.co.jp/ait/articles/0909/01/news158.html)
▲Webアプリを開発するなら知っておいたほうがよい基本的なことがつまってる


簡単すぎるけど、とりあえずここまで。
情報管理は信頼と直結なのできちんと勉強しないと・・・
同一システム上でPython複数環境の構築

Mac OSXには最初からPythonがインストールされていますが、同一システム上で、色んなシチュエーションでヴァージョンやパッケージを使い分けたいとなったときのやり方手順メモ。

- 同一システム上で、複数ヴァージョンを使い分けたい。
- プロジェクトごとにヴァージョン及びパッケージのセットを使い分けたい。
- 使い分けたいが切り替えの手間を軽減したい。
- 新しいパッケージやソフトを試す際に既存の環境を汚したくない。

といった要望をクリアすることを目標にします。Pythonにおけるヴァージョン管理システムは、pyenv、virtualenv、direnvなどがあります。評価できるほど経験がないのですが、pyenvにはvirtualenv機能のプラグインもあるので、pyenvで構築することにします。また個別にパッケージを管理するのも煩雑なのでAnacondaを利用することにします。

> AnacondaはPythonの数値計算環境を構築するために様々なパッケージをまとめた無料のディストリビューションです。 インストールを行うことで、NumPy，SciPy，matplotlibはもちろん、機械学習ライブラリscikit-learn等のパッケージをインストールできます。
> http://morimori2008.web.fc2.com/contents/PCprograming/python/pythonAnaconda.html

以下の構成を前提としています。
- OS: Mac OSX
- パッケージ管理システム : Homebrew
- Python自体のヴァージョン管理とパッケージ管理 : pyenv
- ライブラリパッケージ : Anaconda

## Homebrewのインストール

Terminal.appを立ち上げて、以下のコマンドをコピペして実行します。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以下Homebrewの機能を利用して、インストールなどしていきます。冒頭にbrewとあるコマンドがこの機能を利用したものです。

## pyenvのインストール

Homebrewの仕組みを利用してpyenvをインストールします。

```
$ brew install pyenv
```


## pyenv-virtualenvのインストール

Homebrewの仕組みを利用してpyenv-virtualenvをインストールします。

```
$ brew install pyenv-virtualenv
```

##  システムのシェルの起動スクリプトに、パスを通す

（bashの場合）bash_profileへpyenv関連のパスを通します。
viは操作がわかりづらいですが、Terminal.appから 

```
$  open ~/.bash_profile 
```

と打つと、テキストエディタでbash_profileが開きますので、慣れた操作感でファイル編集ができます。以下のように記載します。

```
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

設定を反映させるため、Terminal.appを再起動させるか、以下のコマンドを実行します。

```
$ source ~/.bash_profile
```



## pyenvでインストールできるヴァージョンの確認
Terminal.appにて以下のコマンドで一覧を表示します。

```
$ pyenv install -l
```

こんな感じでリストされます。

```
Available versions:
  2.1.3
  2.2.3
  ...
  ...
```

## 環境構築の手順

1. 必要なヴァージョンのPythonをダウンロード
2. pyenv virtualenvコマンドでインストールヴァージョンにバージョン指定識別子をつける
3. 特定のディレクトリ配下とバージョン指定識別子を関連づける
4. 追加で必要なパッケージのインストールはglobalかlocal（バージョン指定識別子を利用）を指定して行う。

## 必要なヴァージョンのPythonをダウンロード

Anaconda（Python version2系統）をインストールする例

```
$ pyenv install anaconda-2.1.0
```

Anaconda（Python version3系統）をインストールする例

```
$ pyenv install anaconda3-2.1.0
```

Python version2系統をインストールする例

```
$ pyenv install 2.7.9
```

Python version3系統をインストールする例

```
$ pyenv install 3.4.2
```

## pyenv virtualenvコマンドでインストールヴァージョンにバージョン指定識別子をつける

こんな感じで指定します。バージョン番号は正確に指定する必要がありますが、バージョン指定識別子は任意の名称を自作してください。

```
$ pyenv virtualenv バージョン番号 バージョン指定識別子
```

anaconda3-2.1.0を使って、condaanalyse1というバージョン指定識別子をつける場合はこうなります。

```
$ pyenv virtualenv anaconda3-2.1.0 condaanalyse1
```

## 特定のディレクトリとバージョン指定識別子を関連づける
1.特定ディレクトリ配下へ移動

```
$ cd specific_prj
```

2.ディレクトリとバージョン指定識別子を関連づけます

```
$ pyenv local condaanalyse1
```

3.このディレクトリ配下であれば指定したヴァージョンのPythonが自動的に選択されます。



## pyenvの主なコマンド
```
$ pyenv install -l //インストール可能なバージョン一覧を表示
$ pyenv install <バージョン番号> //インストール
$ pyenv uninstall <バージョン番号> //アンインストール

$ pyenv version //現在のバージョンを表示
$ pyenv versions //インストール済みバージョン一覧を表示

$ pyenv local <バージョン番号> //カレントディレクトリーでのバージョン切替
$ pyenv global <バージョン番号> //システム全体でのバージョン切替
```

## Anacondaが持つヴァージョン管理システムとの使い分け

Anacondaにもヴァージョン管理システム（conda）があります。penvはAnacondaを含む同一システム全体上でのヴァージョン管理、condaはAnacondaが提供するパッケージ内での管理と、管理のレイヤーが異なるので適宜使い分けます。
日本語ドメインについて

日本語ドメインについて調べる機会があったのでメモ

## 日本語ドメインとは

広くは[国際化ドメイン](https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D)(IDN:Internationalized Domain Name)と呼ばれる。

## エンコード/デコード

ASCIIとUnicodeの相互変換ができるようになっている。

- Unicode : お名前.com
- ASCII : xn--t8jx73hngb.com

ASCIIの方は、[Punycode](https://ja.wikipedia.org/wiki/Punycode)(ぴゅにこーど)と呼ばれる。

## 試してみる

```scala
scala> java.net.IDN.toASCII("お名前.com")
res1: String = xn--t8jx73hngb.com

scala> java.net.IDN.toUnicode("xn--t8jx73hngb.com")
res2: String = お名前.com
```

HTTPクライアントの[Dispatch](http://dispatch.databinder.net/Dispatch.html)で日本語ドメインは一度ASCIIに変換しないと上手く動作しなかったという背景がありますた。
【Monaca】端末IDの取得方法【勉強中】

# 端末IDの取得方法
Monacaでは、アプリの初回起動時に端末ごとにユニークな端末IDを生成する。
以下のようなコードで実装が確認出来ました。

```html
<!DOCTYPE HTML>
<html>
    <head>
        <!-- css等読込 -->    
        <script>
            ons.bootstrap();
            ons.ready(function() {
                monaca.getDeviceId(function(id){
                    alert('Device ID: ' + id);
                });
            });
        </script>
    </head>
    
    <body>
        <ons-page>
            <ons-toolbar>
                <div class="center">Navigator</div>
            </ons-toolbar>
            <div style="text-align: center">
                <br>
                デバイスIDを表示
            </div>
        </ons-page>
    </body>
</html>
```

・SC-02C (Ver.4.0.3)
・iPhone6 (iOS 8.3)
・iPad mini3
の実機デバイスにて確認出来ました。

この公式ドキュメントにある「アプリの初回起動時に」という文言が引っ掛かったのですが、アプリ毎に変わるのかどうかを調べてみましたが、同じIDでした。

端末単位でのユニークIDなのであれば、色々とユーザー管理等で使えるんじゃないでしょうか。

## あとがき
今回、自社開発アプリの開発担当になりました。
自社初のアプリ開発という事で誰にもノウハウが無い中、どうにか、という事で四苦八苦をしている、という現状・・・。

元は、XCode, Android Studio で作る予定だったのですが、
急にMonacaで作るようになり、XCodeで出来る事と同じ事が出来るかどうかがまだ良くわかっていないような現状・・。

どちらにしても、[Monacaの公式ドキュメント](http://docs.monaca.mobi/cur/ja/ "Monacaの公式ドキュメント")様様です・・・。

Monacaドキュメントにもあるのですが、私なりに勉強して分かった事も自分の復習のため、投稿していこうかと。
いつも、本当に色々な方のブログにお世話になっているので、誰かのお役に立てれば幸いです。
HTMLに&#65279が表示されて困った時のメモ

WordPressで要素間に変なスキマができていた。
よくみたら、要素テキストに「&#65279」という文字が表示されていた。
ChromeのDeveloper toolでみるとこんな感じだ
![image](https://qiita-image-store.s3.amazonaws.com/0/75209/506c3a0c-1735-3b4b-52e3-95f88e7d2fb7.png)

調査したところ、これはBOMであり、windowsのメモ帳で編集しちゃうと、BOMがつくらしい。
いろいろなサイトで、テキストエディタで「UTF-8 without BOM」に変換すれば消えると書いてあるのだが、消えなかった。
ちなみに使用したのはNotepad++
編集したファイルはheader.php

いろいろ調べてみると、バイナリエディタで削除してもOKらしい。
&#65279は、バイナリにすると「EF BB BF」だ。

#Notepad++のHex Editorプラグインを使って削除
Notepad++にHex Editorというバイナリ編集ができるプラグインがあるので、
これをインストールして、該当のファイルを開いて、「EF BB BF」を検索
確かにあった
![image](https://qiita-image-store.s3.amazonaws.com/0/75209/772f18a6-1699-8806-34af-b892933d81a9.png)

これを選択して、右クリックで削除して保存。ちなみに3箇所もあった。

再度Chromeで見てみると・・
![image](https://qiita-image-store.s3.amazonaws.com/0/75209/1ec0d158-2add-1fac-d1ff-97b8188850fa.png)

おお！消えた。

こんなことで小一時間要してしまいました。
しかしいつこのモジコードが入ったのか不明。
Windowsのメモ帳を使ったとは思えないのだが。。
MongoError: BSONObj size is invalid error

# 問題
Mongodbを使っていると、なんらかの理由で、以下のようなエラーが起きることがあります。

```
MongoError: exception: BSONObj size: -286331154 (0xEEEEEEEE) is invalid. Size must be between 0 and 16793600(16MB) First element: _id: ObjectId('hoge’)
```

# 解決策
私の場合はMacOSが不正にシャットダウンしてしまった後に起きましたが、以下の方法で修復できました。

1. dbフォルダをバックアップ
2. 以下のコマンドでデータを修復

`$mongod —repair —dbpath ~/.db`


# 参考
- http://docs.mongodb.org/manual/reference/command/repairDatabase/