OmniAICreator/Qiita-1.07M huggingface dataset:
開発・テスト用DB環境の管理と自動テストの考察

ここではSQLSERVER,ORACLEといったサーバーを構築するタイプのデータベースを使用した開発やテスト環境の作成・管理と自動テストについての考察を行う。
SQLITEやACCESSといったファイルベースのものは対象外とする。

#作業者に与える環境について
作業者にあたえるデータベースの環境をどうするべきか？

最善の方針は１作業者が１つのデータベースのインスタンスを扱えるようにすることである。
インスタンスが困難なら、スキーマーで分離するのも手である。

もっとも不味いのは、１つの環境で複数の作業者が、開発やテストを行うことになることだ。
これは、開発者がおこなったテストが別の開発者に影響をあたえる可能性があるからだ。
このことは余計なリスクを作成する。

##作業者のローカルPCにデータベースをいれるかどうか？
作業者のローカルPCにデータベースをインストールすべきかどうかは議論が出る。
作業のしやすさでいったら、ローカルPCに置いた方が良い。

これには少人数で管理が行き届く場合に限る。
なぜならば、管理が行き届かない場合、必ず古い環境で開発を続行し続けるという人間がでる。
これは余計なリスクを作ることになる。

作業者の力量が信用できるなら、ローカルで構築させたほうが間違いなく大きな成果がでるだろう。
しかし、力量が足りないなら、１つのデータベースのサーバで、管理者が、すべての作業者の環境を用意してやるほうがよい。

##環境の同期
作業者毎に環境を用意した場合、問題になるのはDatabaseの同期である。

ストアドプロシージャーやファンクションの管理については、スクリプトをテキストとして管理したほうがよい。
これを通常の構成管理(SubversionやGit)で管理する。そこからダウンロードしてきて、データベースに適用すればよい。
それ用のバッチファイルなりシェルスクリプトを記述して配布する。

適用するタイミングはどうするか？

開発者に対してのデータベースなら、自分でやらせればいいだろう。
これは他のソースコードの同期と同じだ。

テスト用のデータベースは少し考えたほうがよい。
テスト中はどのバージョンでテストしているかを明確にするため、更新は避けるべきだ。
テストの区切りがついたタイミングで同期を行うといいだろう。

あと確実に問題になるのは、データベースに最新のプロシージャがあたっているかどうかのチェックが問題になると思われる。
ストアドプロシージャはデータベースの特定のテーブルに格納されているので、それを抜き出してきて比較してやればよい。
SQLSERVERの時は以下のGetSpMd5.wsfで各ストアドをmd5の値にして、それを比較してチェックをおこなえる。
https://github.com/mima3/SqlServerScript


テーブルの構成などが変わった場合の更新は難しい。
テストデータを初期化していいなら、スクリプトを流すだけでいいだろう。
しかし、テストデータを保持したい場合は、状況に合わせた臨機応変な対応を求められる。
場合によっては更新用のスクリプトを書く必要もある。


#データベースに関係するテストの自動化
データベースを使った自動テストについて考察する。自動テストは３段階にわかれる。

１　テスト環境の準備
２．テストの実行
３．結果の検証。

１はテーブルの作成、ストアドの作成、初期データの作成などを行う。
この工程はスクリプトを記述しておいたほうがよい。
既存にデータベースが存在する場合でも、これらのスクリプトは現在の状態から作成できる機能があるはずだ。
(仮になくても、これらの情報はすべてシステムテーブルに書き込まれているので、自分でつくれるはず）

２　テストの実行は、まずテストデータを作成した後に、テスト対象の処理を実行する。

テストデータをCSVでもつか、SQL文のスクリプトで管理するか議論があるだろう。

可能なら、CSVでもって、テスト時になんらかの処理でSQLに変換したほうがよい。
CSVならExcelを使用してテストデータを作成できるので、楽である。
ここまではすべてスクリプトに記述できる処理である。

テスト対象の処理の実行が自動化できるかどうかは、その処理次第だろう。
ただ、仮にGUIであったとしてもUWSCなどでやろうと思えばやれる。この辺りは費用対効果で考えた方が良い。

３　テスト結果の検証。
基本的にはテスト対象の処理を実行した後に、テーブルの内容がどのように変わるか、あるいはテスト対象が出力したファイルなりが、期待通りであるかをチェックする。

テーブルの内容がどう変わったかチェックするのは、スクリプトで出来るだろう。期待値を外部ファイルなりに保持しておき、それと現在の内容をつき合わせて確認する。
期待値もテストデータと同様CSVでもてば、Excelで編集できる。

一つ注意しないといけないのは、実行のたびに変わるデータの扱いだ。たとえば、更新日や更新者などは実行のたびに変わるだろう。

これは比較の対象から外しておいた方がいいだろう。
もし、更新日時の確認をどうしてもしたい場合、単純なdiffでなく、更新日時がテスト実行開始〜終了の間に収まっているかどうかチェックする。

あるいは期待値用のデータに特定の文字列を入力しておけばいい。たとえば、「@USER」ならば現在ユーザに変換してからチェックする。

このように、実行のたびに変わるデータの扱いは多少工夫が必要だろう。



更新ロックがかかっているかどうかの試験も、自動でやろうと思えばできる。
これは、別プロセスでロック用のスクリプトを実行して指定のテーブルに更新ロックを掛けてコミット、ロールバックせずに待機する。
その間にテスト対象の処理を実行して例外がかえってくることを確認する。
テストがおわったらロック用のスクリプトを終了してやって、再度、テスト対象を実行して今度は正常に動作することを確認すればよい。

テスト用のスクリプトを書く際にはどの環境でも、動くようにを記述することが重要だ。
まちがっても、絶対パスでファイルの場所などを書いてはいけない。
また、ユーザ名などはテスト共通のユーザを使ったほうが楽だろう。

##懸案事項
DBのテストの最大の問題は時間がかかることだ。
コミット時の自動テストには不適切な速度になる可能性が高い。
なので、テストには必ずやる重要項目と、それ以外にわけておき、オプションですべてテストするかどうかを指定できるようにしたほうがのぞましい。

また、本番環境で実行されないようにする工夫が必要だ。
本番環境とテスト環境のログインユーザーなどが同じにしておくと、本番データを吹き飛ばす可能性があって危険だ。テストデータをスクリプトで管理していると、それをまちがって本番に流しかねないリスクがある。

可能なら、テストデータのスクリプトの先頭に想定以外のDBではテストを中断するなどのロジックが必要かもしれない。
`when` で `register` が skip されなくてつらい


したのような playbook を書いて実行した時、

```yml
- name:  debug
  hosts: all
  connection: local
  gather_facts: false

  tasks:
    - shell: echo 'foo'
      register: result
      when: true

    - shell: echo 'bar'
      register: result
      when: false

    - debug: var=result
```

`debug`の結果を

```sh
TASK: [debug var=result] ******************************************************
ok: [localhost] => {
    "result": {
        "changed": true,
        "cmd": "echo 'foo' ",
        "delta": "0:00:00.004067",
        "end": "2014-07-17 23:30:29.543649",
        "invocation": {
            "module_args": "echo 'foo'",
            "module_name": "shell"
        },
        "rc": 0,
        "start": "2014-07-17 23:30:29.539582",
        "stderr": "",
        "stdout": "foo",
        "stdout_lines": [
            "foo"
        ]
    }
}
```
↑こういうのだと期待してたのに、実際のところ

```sh
PLAY [debug] ******************************************************************

TASK: [shell echo 'foo'] ******************************************************
changed: [localhost]

TASK: [shell echo 'bar'] ******************************************************
skipping: [localhost]

TASK: [debug var=result] ******************************************************
ok: [localhost] => {
    "result": {
        "changed": false,
        "skipped": true
    }
}
```

こうなってしまう。

いや、`register`ごとskipしてほしいんですけど。
ある変数に`register`するactionの実行を条件によって分岐させたいんだけどいいやりかたないかなぁ。
JBOSSにおけるコネクションのバリデーション

# JBossにおけるコネクションのバリデーション
JBossを起動したままDBセッションを強制切断してみたら、コネクションプールを自動で再接続してくれなかった。
JBossの再起動は運用上やりたくないので色々と調べてみた。

## どんな機能か
コネクションプール中のアイドル状態のコネクションに対して、定期的、もしくはアプリケーションスレッドのコネクション取得直前のタイミングで、コネクションの有効性検証（バリデーション）を行うことができる。
アプリケーションスレッドからのリクエストによってアイドルコネクションを貸し出すんだけど、貸し出す直前にコネクションの有効性チェックを行ってくれる便利機能。
無効になってたら、そのコネクションを破棄して再接続を行ってくれる。

## コネクションが無効になるケース
* JBossは稼働したまま、DBだけ再起動した場合
* 一定時間そのコネクションを使用しなかった場合
* KILL文でコネクションを切断した場合

## 設定例
```xml:standalone.xml
<validation>
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
<validate-on-match>true</validate-on-match>
</validation>
```

### check-valid-connection-sql
バリデーションの際に実行するSQLを指定する。
上記の設定例の場合、プールからコネクションを取得する際に「SELECT 1」というSQL文をDBに発行するようになり、コネクションが無効になってた場合に検知できるようになる。
無効の場合はコネクションを破棄して再接続を行うため、アプリケーション側には例外が発生しない。

### validate-on-match
アプリケーションのコネクション取得時にバリデーションを実行するか否かを指定する。
デフォルトはfalse.

## その他のパラメータ

### valid-connection-checker
バリデーションを行うためのクラス名を指定する。
バリデーションを行うには、このパラメータか上述のcheck-valid-connection-sqlのいずれかを指定する。同時に指定した場合、このパラメータが優先される。

### background-validation
アプリケーションのコネクション取得時ではなく、バックグラウンドで定期的にバリデーションを実行するか否かを指定する。
デフォルトはfalse.

### background-validation-minutes
バックグラウンドのバリデーションを行う時間の間隔を分で指定。
millisでミリ秒にもできる。

### use-fast-fail
バリデーションエラーが発生した場合の新たなコネクションの生成方法（他のコネクションをどう扱うか）を制御する。validate-on-matchをtrueにセットした場合に使用するオプション。
本属性でtrueを指定した場合、新たなコネクションを生成する際に他のコネクションはプール中に残存する。例えばデータベースを再起動したときなど、プール内のコネクションが全て使えなくなっている、というときに再接続を早く行える。プール内の他のコネクションはノータッチなので、使えないコネクションはプールに残ったままになる。
falseの場合、プール中のコネクションを全て使えないものと判断し、全て破棄してから再生成する。デフォルトはfalse.


## 一般的なバリデーション方式
この機能は、データソースの障害検知において有用なので、プロダクション環境ではよく利用されている。アプリケーションの取得時にバリデーションを行ったほうが、DB再起動・待機系DB切り替え・ネットワーク障害が起きた場合、有効なコネクションを取得できる可能性が高くなる。use-fast-failは特に理由がない限り、デフォルト(false)で良い。

## パフォーマンスの懸念
バリデーションを行うと、パフォーマンスに影響が及びますが、検証用SQL文(SELECT 1)そのものは素早く実行されるため、パフォーマンス上の全体的な影響は最低限に保たれる。更に、このSQLが実行されるのは、コネクションが成立した場合においてのみ。よって、ずっとコネクションが保たれていれば、何度も何度も検証用SQL文が投げられることはない。超大規模なアプリの場合は、パフォーマンスの影響を評価してから実装したほうがいいかもしれない。

## 検証用SQL文の種類
|DB|検証用SQL文|
|---|---|
|MySQL|select 1|
|SQL Server|select 1|
|Oracle|select 1 from dual|
|PostgreSQL|select version();|

## 参考情報
[redhat カスタマーポータル](https://access.redhat.com/documentation/ja-JP/JBoss_Enterprise_Application_Platform/6/html/Administration_and_Configuration_Guide/sect-Datasource_Configuration.html#Topic2772-validation)
[JBossのMySQL設定](http://open-groove.net/jboss/configuration-jboss-mysql/)
[JBoss構築・運用パーフェクトガイド](http://www.amazon.co.jp/dp/4774157945)
【感想】AWSサミット Tokyo 2014 Day1

# 背景
* http://www.awssummittokyo.com/
* 初めて、AWSサミットに参加する
* その他のAWS活動に参加したことがある、特にJAWS-UG

# 経過
### キーノート
* まだいろいろな事例(--)!
    * プログラマーにメリットが少ないな
    * NTT
    * HIS
    * https://www.airbnb.jp/
        * 1300台サーバーの運用者は、５人
* 新サービス発表された
    * http://aws.amazon.com/jp/cognito/
    * http://aws.amazon.com/jp/zocalo/
* 私は、初めて理解したAWS構成
    * インフラ
        * Regions, AZ, CDN
    * Foundation Services
        * Compute: EC2, AS, ELB
        * Storage: Object, Block, Archive
        * Security and Access Controll
        * Networking
    * Platform Services
        * DB, Analytics, App Service, Deployment&Managment
    * 今後は、新しいPlatform Servicesがどんどん作成されるそう

### Amazon CloudFront, RedshiftなどAWSが支える動画広告
* コストが、一番重要
    * AWSを使った前に、1本が５円だった
    * CDNにより転送量が安価に
        * CloudFrontを利用して、やすくなるそう
* 分析
    * S3, EMR, Redshiftを利用して、5分間ぐらい分析を完成できる
* 大きい仕事、小さいチーム
    * Dennooは、Dev:2人、Ops: 1人

### 信州大学のクラウド化戦略
* インフラは、プロジェクトが大きくなって、運用コストも大きくなる
* AWSを使うと、インフラの運用がいらない

### NoSQL Strategy on AWS
* クラウドデータベースアーキテクチャ
    * 集中する読み込み
        * Cache
    * 高スケールな問い合わせ
        * NoSQL
    * 複雑なクエリとトランザクション
        * RDBMS
    * 分析
        * Data Warehouse
    * ログ記録
        * Blob Store
    * リッチな検索
        * Search
* その中に
    * elastic cache
        * インメモリキャッシュサービス
        * デプロイ、操作、スケール簡単
    * Dynamodb 
        * NoSQLデータベースサービス
        * 保証されたパフォーマンスとスケーラビリティ

### AWS OpsWorks
* 使用可能サービスとか、言語とか
* ライフサイクル
* Chefを使う
* 複数環境移行

### クラウド時代の運用
* コスト減る
* 特に、属人的な部分
* 自動化

# 感想
* コスト
    * 事例が多い、コスト減ることの説明も多い
    * コスト = インフラ料金 + 人件費（運用者）
    * システムが大きくなるけど、人件費がそのまま
        * これは、AWSの一番メリットけど、運用者の技術力に、要求がある
* 技術
    * AWSを使うために、必要な技術が難しくない
    * 開発者と運用者に対して、技術の範囲が広くならないと行けない
    * クラウド時代は、５人の運用チームが大きいチームだと思う
Surface Pro 3 が届いてやったことまとめ

Surface Pro 3 512GB Core i7 モデルと Type Cover が届いたのでとりあえずセットアップした備忘録。
完全に個人の趣味のメモ書きなので、その辺ご了承ください。
プログラミング知識でもなんでもないけど環境構築編的なあれ。

# Windows セットアップ

* PC名をつける（うちは果物系なので Blueberry にしてみた）
* Wifi 接続
* Microsoft アカウントの登録
* 待つ。

付属のペンはなんかうまくペアリングできなかった。。
7秒間押せってのはちょっと長くないか。後でやるつもり。

# Capslock → Ctrl

とにもかくにも、まずこれをやらないと作業効率が落ちて仕方がない。
いつも Change Key を使ってます。

\# ちなみに Type Cover の右クリックはパッドの右下あたりを普通に押しこむか指二本タッチで。（管理者権限で起動すんのどうすんべ……って２分くらい固まった）

# アプリ（ストアまたはブラウザから叩く系）

再起動してごりごりインスコするお仕事。

* Aristea (Twitter クライアント)
* Google Chrome (IEはこれでお役御免)
* Google IME
* Chocolatey
* Visual Studio 2013

# アプリ（Chocolatey で入れる系）

コマンドプロンプトは管理者権限で起動しておくと楽。
ただし、 dropbox なんかは管理者権限でインスコしない方がいいよとか言われるので注意。

```
> cinst winrar
> cinst sakuraeditor
> cinst Devbox-Clink
> cinst git
> cinst ruby
> cinst python2
> cinst virtualbox
> cinst vagrant
> cinst winscp
> cinst putty
> cinst dropbox
```

# その他

* ピクチャパスワードの設定

とりあえずこんなもんかな。
明日には dropbox の同期も終わって、基本的に不自由なく使えるはず。
IPython Notebookでグラフ描画

## IPython Notebookのインストール

環境: Ubuntu 14.04LTS

IPython Notebookのインストール

```
$ sudo apt-get install ipython-notebook
```

数値計算ライブラリや、グラフ描画ライブラリのインストール

```
$ sudo apt-get install python-matplotlib python-scipy python-pandas python-sympy python-nose
```

## IPython Notebookの起動

```
$ ipython notebook
```

とコマンドを打つと、IPython Notebookがブラウザ上で起動する

![ipython_new.png](https://qiita-image-store.s3.amazonaws.com/0/34365/7d0ccb3e-2149-8316-fda1-a9367f680d9a.png)

## 例：3Dバブルチャートを描画する

```py
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')
colors = ('r', 'g', 'b', 'k')
for c in colors:
    x = np.random.sample(30)
    y = np.random.sample(30)
    ax.scatter(x, y, 0, zdir='y', c=c)

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 1)

plt.show()
```
![ipython_notebook.png](https://qiita-image-store.s3.amazonaws.com/0/34365/9a296d99-c360-fa6c-a38a-0e66ce8355c6.png)
GitLab CI 関連記事まとめ

# GitLab CI 関連記事まとめ

更新日: 2014/07/29 21:56:22

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[GiLab CI  GiLab CI Runner のインストール](http://qiita.com/tbpgr/items/b5c527207e4e141656a3)|2014/07/17 21:45:07|2|
|2|[GiLab CI  GiLab CI で branch ごとに build 内容を切り替える](http://qiita.com/tbpgr/items/f40be590686d8a7f4fc0)|2014/07/29 21:55:45|0|
|3|[GiLab CI  GiLab CI でCIを実行するまで](http://qiita.com/tbpgr/items/ebdbb802e315e38f68eb)|2014/07/17 21:50:54|4|
|4|[GiLab CI  GiLab CI のインストール](http://qiita.com/tbpgr/items/8f0db62f3f9179f488e6)|2014/07/17 21:41:00|3|
|5|[GiLab CI  GiLab CI のビルドスクリプト内で使用可能な環境変数について](http://qiita.com/tbpgr/items/7017a0ed5def79cd12e0)|2014/07/29 21:53:26|0|
|6|[GitLab CIとは？](http://qiita.com/tbpgr/items/a655ad5e017d28f8982e)|2014/06/30 22:07:08|8|
RailsテストCucumber+Capybara+Poltergeistでスクリーンショット画像ファイル保存

# PhantomJSのインストール

環境: Ubuntu 14.04LTS

```
$ sudo apt-get install phantomjs
```

# Capybara + Poltergeist + Cucumberのインストール

以下のGemをインストールする。

```
$ gem install capybara capybara-webkit poltergeist headless cucumber rspec --no-ri --no-rdoc
```

# Railsプロジェクトのテスト構造構築

Railsプロジェクトに以下のような構造のDirectoryとFileを作成します。

```
test/
├── Rakefile
└── features
    ├── screen_shot.feature
    └── step_definitions
        └── steps_ja.rb
```

# Rakefile

Rakefileには以下のように記述します。

```rb
require 'rubygems'
require 'headless'
require 'cucumber'
require 'cucumber/rake/task'

headless = Headless.new(display:99)
headless.start
Cucumber::Rake::Task.new(:features) do |t|
  t.cucumber_opts = "features --format pretty --format html -o features.html"
end
```

# screen_shot.feature

screen_shot.featureには以下のように記述します。

```
# language:ja

機能: 指定したURLのスクリーンショットを保存
  シナリオ: 画面表示をしてスクリーンショットを保存する
    もし "http://qiita.com/ryosy383/"を表示
    ならば スクリーンショットを撮って"screen_shot.png"に保存

```

# steps_ja.rb

steps_ja.rbには以下のように記述します。

```rb
#coding: utf-8
require 'capybara-webkit'
require 'capybara/poltergeist'
Capybara.default_driver = :poltergeist
include Capybara::DSL

もし /\"(.+)\"を表示/ do |url|
  visit(url)
end
ならば /スクリーンショットを撮って\"(.+)\"に保存/ do |filename|
  page.save_screenshot "./#{filename}"
end

```

# Cucumberの実行

testディレクトリ配下でCucumberを実行します。

```
$ cucumber
```

そうするとシナリオ通りにテストが実行されて、
screen_shot.pngが生成されます。

■screen_shot.png

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/34365/bc68bfe9-0c20-258c-a17a-15107157b1ce.png)

■GitHubリンク
自動スクリーンショットスクリプト
https://github.com/ryosy383/AutoScreenCaputure
GiLab CI | GiLab CI でCIを実行するまで

# GiLab CI | GiLab CI でCIを実行するまで
## 概要
GiLab CI でCIを実行します

## 前提
* GitLab サーバーはインストール済
* GitLab CI サーバーはインストール済
* GitLab CI Runner サーバーはインストール済
* テスト対象は自作 gem プロジェクトの gottani を使います

    https://github.com/tbpgr/gottani

## 手順
* テスト対象の git リポジトリを GitLab サーバーに追加します
* GitLab CIサーバーのトップページで Sync now ボタンをクリックします

![try1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/76fb162e-8763-59e7-a462-3cee9f71d0fd.png)

* 対象プロジェクトが表示されたのを確認後、Add ボタンをクリックします。

![try2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2294d8bb-973e-bb46-cc9e-23260bdcc7ca.png)

* プロジェクトが登録されます

![try3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/96da2f54-8d59-e340-9c44-676bd53bc53e.png)

* Settings メニューを選択し、Build Steps を編集します。今回は bundle install と rspec の実行のみ行います

![try4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ca0dc991-c9b1-195a-dd99-d4601619a104.png)

* 画面最下部の Save Changes を選択し、設定を反映します。

![try5.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3d525b9e-a3a7-8b14-d468-bd80946d92b1.png)

* GitLab の Service メニューを確認すると GitLab CI との連携が有効になっていることを確認できます。

![try6.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a56de063-2b01-bb35-2466-a9ba3ca56c47.png)

* 一回 GitLab に適当な更新内容を push してCIを実行します
* GitLab CIのトップページを確認すると、CIが成功していることが確認できます。

![try7.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f75901f4-7a93-c25e-f590-c1e8d7aacc18.png)

* GitLab CIで gottani のプロジェクトページを表示後、Builds の master タブを選択し、 Status Badge ボタンを選択します
* READMEなどにバッジを張り付けるためのスクリプトが表示されるので、Markdown か HTML のうち必要なほうをコピーします。

![try8.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5f3071d9-9f6b-1f42-aa2e-e41fee3e00a2.png)

* gottani の README.md にコピーした内容を貼り付けます。

~~~markdown
# Gottani

[![build status](http://gitlab_ci_server_path/projects/2/status.png?ref=master)](http://gitlab_ci_server_path/projects/2?ref=master)
Gottani is coverter for indent-style text.

:
: その他の内容
~~~

* commit, push します。

~~~
git add README.md
git commit -m "Add GitLab CI badge link to README.md."
git push origin master
~~~

* READMEに GitLab CIのビルド結果のバッジが埋め込まれました

![try9.png](https://qiita-image-store.s3.amazonaws.com/0/43480/90c5beeb-3bb1-98e4-21ad-26e0d9d1f654.png)
jQuery で dataTransfer が見つからないよ

備忘録です．
jQuery で dataTransfer を使おうと思ったけど見つからないよと言われたので調べた時のメモです．

# サンプルコード

```js:sample.js
$("#sample").on("dragover", function(e) {
  e.preventDefault();
})
.on("drop", function(e) {
  e.preventDefault();

  // ないよー
  e.dataTransfer.items[0].getAsString(function(url) {
    console.log(url);
  }, false);
});
```

# 原因
jQuery’s event system normalizes the event object according to W3C standards. The event object is guaranteed to be passed to the event handler. Most properties from the original event are copied over and normalized to the new event object. 
... http://api.jquery.com/category/events/event-object/

ドキュメントの文章を読んで分かる通り，
jQueryで定義したイベントハンドラを通じて取得したイベントオブジェクトは，
元のイベントオブジェクトの持つプロパティのうち，「ほとんど」をコピーした新しいイベントオブジェクトになっています．
つまり，この「ほとんど」の中に dataTransfer が入っていないことが原因でした．

# 解決法
その1 jQueryのイベントオブジェクトのプロパティにdataTransferを追加しちゃう．
`jQuery.event.props.push("dataTransfer");`

その2 originalEventプロパティを使って呼び出す．
`e.originalEvent.dataTransfer.うんたらかんたら`

# ひとこと
全部ドキュメントに書いてました，ちゃんと読みます．
GiLab CI | GiLab CI Runner のインストール

# GiLab CI | GiLab CI Runner のインストール
## 概要
GiLab CI Runner をインストールします

## 前提
OS: Ubuntu14.04 LTS
GitLab CI は別サーバーにインストール済

## 手順
基本は公式サイトの手順通り

https://gitlab.com/gitlab-org/gitlab-ci-runner/blob/master/README.md

## セットアップ完了後、GitLab CIのRunners画面にRunnerが追加されていることを確認します

![gitlab_ci_runners.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ee0257d2-44ee-94a5-b09e-35196a200ef3.png)

## 補足
2014/07/17に、手順を実施した際にRubyのインストールでエラーになった。

エラーメッセージの情報に従い下記の C のコードを編集

~~~bash
sudo vi /tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
~~~

* 修正前

~~~c:/tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
rl_pre_input_hook = (Function *)readline_pre_input_hook;
~~~

* 修正後

~~~c:/tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
rl_pre_input_hook = (rl_hook_func_t *)readline_pre_input_hook;
~~~

* 修正後、 sudo make install を再実行

~~~bash
sudo make install
~~~
[tmlib.js]グラデーション


# HTML5 Canvasのグラデーションをtmlib.jsで

tmlib.jsでグラデーションを使う時に便利なクラスを紹介します。

## 線形グラデーション

**tm.graphics.LinearGradient** を使います。

~~~js
var gradation = tm.graphics.LinearGradient(0, 0, 100, 100)
    .addColorStopList([
        { offset: 0.0, color: "hsl(  0, 80%, 80%)" },
        { offset: 1.0, color: "hsl(200, 80%, 80%)" },
    ])
    .toStyle();

tm.display.RectangleShape(500, 500, {
    fillStyle: gradation
});
~~~

カラーストップ情報を配列で追加できる **.addColorStopList()** メソッドが便利です。
このメソッドは自分自身を返すので、チェーンメソッド連結できます。

単一のカラーストップを追加する **.addColorStop()** メソッドも使えます。

最後に **.toStyle()** メソッドでCanvasGradientオブジェクトに変換し、Canvas描画のスタイルとして適用します。

配列で指定できるので、こんな書き方もできますね。

~~~js
var gradation = tm.graphics.LinearGradient(0, 0, 500, 500)
    .addColorStopList(Array.range(0, 20).map(function(i) {
        return {
            offset: i / 20,
            color: "hsl({0}, 80%, 80%)".format(360 * i / 20),
        };
    }))
    .toStyle();
~~~

![ss0.png](https://qiita-image-store.s3.amazonaws.com/0/30568/04b1a9a3-a3fe-dc0f-84a9-9d66f74b3167.png)

[動作サンプル](http://jsdo.it/daishi.hmr/1y14)

## 放射グラデーション

放射グラデーションの **tm.graphics.RadialGradient** クラスも同様の使い方ができます。

~~~js
var gradation = tm.graphics.RadialGradient(250, 250, 0, 250, 250, 250)
    .addColorStopList(Array.range(0, 20).map(function(i) {
        return {
            offset: i / 20,
            color: "hsla({0}, 80%, 80%, {1})".format(360 * i / 20, 1 - i / 20),
        };
    }))
    .toStyle();
~~~

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/30568/dd4a67bd-f7a3-6dbe-f723-06388c8dfc71.png)

[動作サンプル](http://jsdo.it/daishi.hmr/b7Rk)
GiLab CI | GiLab CI のインストール

# GiLab CI | GiLab CI のインストール
## 概要
GiLab CI をインストールします

## 前提
OS: Ubuntu14.04 LTS

## 手順
基本は公式サイトの手順通り

https://github.com/gitlabhq/gitlab-ci/blob/master/doc/install/installation.md

※GitLab CI Runnerのインストールについては別途

## セットアップ完了後、該当URLにアクセス

無事トップページを確認できました

![gitlab_ci_setup_complete.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f4d7c6dc-23bf-0441-1806-d03b0e57e55e.png)

## 補足
2014/07/16に、手順を実施した際にRubyのインストールでエラーになった。

エラーメッセージの情報に従い下記の C のコードを編集

~~~bash
sudo vi /tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
~~~

* 修正前

~~~c:/tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
rl_pre_input_hook = (Function *)readline_pre_input_hook;
~~~

* 修正後

~~~c:/tmp/ruby/ruby-2.0.0-p353/ext/readline/readline.c
rl_pre_input_hook = (rl_hook_func_t *)readline_pre_input_hook;
~~~

* 修正後、 sudo make install を再実行

~~~bash
sudo make install
~~~
RuboCop | Style/ParenthesesAroundCondition

# RuboCop | Style/ParenthesesAroundCondition

## 概要

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

if や while などの条件文を括弧で囲っていると警告を出します。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-----|:---|:---|:---:|
|AllowSafeAssignment|true|イコールで終わるメソッド（=,==,===)の場合には警告を出さない|○|
|AllowSafeAssignment|false|イコールで終わるメソッド（=,==,===)の場合も警告を出す|--|

## ParenthesesAroundCondition

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

### 検証プログラム

~~~ruby:parentheses_around_condition
msg = 'hoge'
if (msg > 'hoge')
  puts 'hoge!'
  puts 'hoge!'
end

if (msg = 'hige')
  puts 'hoge!'
  puts 'hoge!'
end

if msg == 'hoge'
  puts 'hige!'
  puts 'hige!'
end
~~~

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

~~~yaml:.rubocop.yml
ParenthesesAroundCondition:
  AllowSafeAssignment: true
~~~

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

Offenses:

parentheses_around_condition.rb:2:4: C: Don't use parentheses around the condition of an if.
if (msg > 'hoge')
   ^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

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

~~~yaml:.rubocop.yml
ParenthesesAroundCondition:
  AllowSafeAssignment: false
~~~

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

Offenses:

parentheses_around_condition.rb:2:4: C: Don't use parentheses around the condition of an if.
if (msg > 'hoge')
   ^^^^^^^^^^^^^^
parentheses_around_condition.rb:7:4: C: Don't use parentheses around the condition of an if.
if (msg = 'hige')
   ^^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
ubuntu キーボード設定

初期状態の日本語キーボードはタイプがしにくいので変更したので、その方法をメモっておきます。

xmodmapを使って、keycodeの定義fileを読み込ませることで、キーボードを好きな配置に変更できる。
keycodeは、xeveを使うことで調べることができる。
<pre>
xeve |grep keycode #keycodeを調べる
xmodmap .Xmodmap #keycodeの設定file(.Xmodmap)を読み込ませる
</pre>
これで、キーボードを好きな配置に変更できる。
自分のオススメ設定
return->alt
かな->return
英数->esc
fn->tab
VC++ で何もコンパイルできなくなった際の原因と解決

cl.exeが見つからないとか、iostreamが見つからない等、通常ありえないエラーが発生したため、そのときの原因と解決法を記します。

##原因
実行可能ファイルディレクトリや、インクルードパスディレクトリの設定が間違っていました。これは、VS2013と、それより前のVS2010やVS2012がインストールされている環境で、**グローバルプロパティシートを考えなしに弄った**ためです。
VS2012以前のバージョンでは、 \$(VCInstallDir)includeという設定は、VS2013では \$(VC_IncludePath)に変更になりました。ここでは例として１つのみ書きましたが、当然、ライブラリディレクトリや実行可能ファイルディレクトリも同様に変更されています。そして、VS2010、VS2012、VS2013のグローバルプロパティシートは共通のものを使用しているため、冒頭のような問題が発生します。

##解決法
**インクルードパスディレクトリや、ライブラリディレクトリの設定はプロジェクトごとに行ってください。**上の問題が起きなくても、例えばコードの公開をしたときに、そのコードをダウンロードした人の手間が増えることになります。
上記の解決案が面倒に感じた方で、かつ、「グローバルプロパティシートの設定は作者に合わせるべき」という考えの方は、[複数バージョンのVisualStudioを共存させる](http://www.rainyman.net/nest/?p=759)の対策を使用することで回避ができると思われます。
スマートフォンで数字キーボードに変更する（2015/01版)

##自動で数字キーボードに変更する&lt;input&gt;

<追記 date="2015/01/27">
2015/01/19の発表で、[iOS6以前のバージョンシェアが3%](http://link-man.net/apple/news/55863/)となっています。
iOS6以下をサポートしないのならば、以下のコードのみで大丈夫です。
Android 5(Nexus 6)検証済み。

```html:数字
<input type="number" pattern="\d*">
```
</追記>
　
　

郵便番号の入力フィールドを作成していました。
最終的にはこんなコードになりました。

```html:数字
iOS6以下：<input type="text" pattern="\d*">
Android, iOS7以降：<input type="number" pattern="\d*">
```
※サーバサイド/JavaScriptで切り替える想定


##type="number"はブラウザ・バージョンごとに挙動が違う

数字を入力する項目にはtype="number"を使えばよさそうですがiOSで問題があります。
iOS6以下では**数字**ではなく**数値**の属性として使用するよう設計されてるようです。

●iOS5以下
**1000**を入力する ⇒ カンマが入った**1,000**になる
（pattern="\d" を設定することで回避可能？）

●iOS6以下
**0123**を入力する ⇒ 先頭の0が削られた**123**になる

これでは郵便番号の入力には使えません。
（type="tel"は本来の対象と違いますし、ブラウザ側の仕様が変わる可能性があるので使いません）

[iOS7のバージョンシェアが90%に達した](http://iphone-mania.jp/news-36321/)とはいえ、iOS6以下が10%もあるならば対応したいところです。

##pattern="\d*"で数字キーボード以外に切り替えさせない

iOSでtype="number"のみの設定だと、フリックモードの数字キーボードが表示されます。
numberを設定してもキーボードを切り替えることでアルファベットやかなが入力できてしまいます。

**pattern="\d*"**または**pattern="[0-9]*"**を&lt;input&gt;タグに追加することで、
数字以外の入力を防ぐことができます。
（[Safari Developer Library - Supported Input Values](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/InputTypes.html)）

| pattern属性あり | pattern属性なし |
|:------------:|:------------:|
| ![__ 1.JPG](https://qiita-image-store.s3.amazonaws.com/0/45865/65eb2b4b-521a-2b38-9476-76864d0a6fd8.jpeg) | ![__ 2.JPG](https://qiita-image-store.s3.amazonaws.com/0/45865/295879a1-dec5-50a3-fd3a-5a2305116c4a.jpeg) |

ちなみにAndroidではpattern属性は無視します。
（Galaxsy SII/AQUOS PHONE 303 SHで確認)


##HTML5.1では入力モードが選択できるかも？
策定中のHTML5.1でキーボードの入力モードを指定する[inputmode属性](http://www.w3.org/TR/2014/WD-html51-20140617/forms.html#input-modalities:-the-inputmode-attribute)が使えるようになる可能性があります。
AppleやGoogleには2016年の正式勧告までに見切りで実装してほしい属性ですね。

```html:inputmode
<!--数字のみのキーボード-->
<input type="number" inputmode="numeric">

<!--半角アルファベット/数字入力のみ-->
<input type="text" inputmode="verbatim">

<!--電話番号のキーボード-->
<input type="text" inputmode="tel">
```

##注意点
[QuirksModeのtype="number"の項](http://www.quirksmode.org/html5/inputs_mobile.html#t04)を見ていると、Androidのいくつかでバグがあるようです。
・HTC Legend (2.1)で数字キーボードが起動しない
・Android 3.2で数字キーボードは起動するが、-(ハイフン)やe(べき乗)が入力できない
Travis CI で goxc を使うとなぜかgo1.3のときだけビルドがこける

理由がよく分からないのでメモ．

どうやら plan9 とか freebsd のビルドがこけるようだ．でも同じ設定で動かしてる go1.2 ではちゃんとビルドできてるのに・・・．

手元の計算機(mac)で go1.3 環境で goxc でビルドしてみたがこちらは上手くいっている．linux がダメなのかな．

とりあえず，ターゲットを `-bc "linux,!arm windows,darwin"` して，linux, windwos, darwin にして回避した．何か情報あれば教えて欲しいです :weary:
【Git】ブランチの切り替えとかプルとか出来ないときの対処法


gitでブランチを切り替えようとcheckoutしたら、こんなエラーがでることがあります。

```
error: Your local changes to the following files would be overwritten by checkout:
	ファイル名
	ファイル名
Please, commit your changes or stash them before you can switch branches.
error: The following untracked working tree files would be overwritten by checkout:
	ファイル名
Please move or remove them before you can switch branches.
Aborting

```

ブランチを切り替える前に変更をコミットしてね。
作業ツリーに知らないファイルがあるので、追加してね。
というエラーがでます。

##解決策その1：作業を一時退避
現在行っている作業を一時退避させます。
以下のコマンドで退避することができ、ブランチの切り替えを行うことができます。

```
git stash
```

`stash`の使い方いろいろ

```
git stash pop //一時退避を元にもどす
git stash list //一時退避の確認
git stash clear//一時退避の消去
```

##解決策その2：作業を取り消しちゃう
エラーで表示されているファイルの変更は、別にリセットされてもいいし。
というのであれば、すべてを取り消してしまえばOK。
`git status`でステータスを確認し、`Changes not staged for commit:`というメッセージで表示されているファイルは、以下のコマンドでコミットを取り消すことができます。

```
git checkout file_name //特定のファイル
git checkout . //すべて
```


`Untracked files:`というメッセージで表示されているファイルは、以下のコマンドで取り消せます。

```
git clean -f
```

Untracked filesのほうは残しておいてもブランチ切り替えはできるので残しておいてもOKです。
C++のテンプレートでObserverパターンを実装する


# テンプレートの実装
C++のテンプレートを勉強し始めたので何か作ってみたいと思い、[こちら](http://www.codeproject.com/Articles/3267/Implementing-a-Subject-Observer-pattern-with-templ)を参考にしてテンプレートで[Observerパターン](http://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)を実装してみました。

記事のコードでは1種類の通知しかできませんが、キーを使うことで複数種類の通知ができるようにしてみました。
コードは以下です。

````cpp
#include <vector>

namespace mylib {
    // private base class
    template <class T>
    class observerBase {
    private:
        virtual bool shouldNotify(const std::string& key) = 0;
        virtual void update(T* sender, const std::string& key) = 0;
        
        template <class F>
        friend class observable;
    };
    
    // observer
    template <class T, const std::string&... keys>
    class observer : public observerBase<T> {
    public:
        virtual void update(T* sender, const std::string& key) = 0;
        
    private:
        std::vector<std::string> observeKeys = { keys... };
        bool shouldNotify(const std::string& key) {
            return (std::find(observeKeys.begin(), observeKeys.end(), key) != observeKeys.end());
        }
    };
    
    // observable
    template <class T>
    class observable {
    public:
        void addObserver(observerBase<T> *observer) {
            m_observers.push_back(observer);
        }
        
        void removeObserver(observerBase<T> *observer) {
            auto it = std::find(m_observers.begin(), m_observers.end(), observer);
            if (it != m_observers.end())
                m_observers.erase(it);
        }
        
        void notify(const std::string& key) {
            for (const auto& o : m_observers) {
                if (o->shouldNotify(key))
                    o->update(static_cast<T*>(this), key);
            }
        }
        
    private:
        std::vector<observerBase<T>*> m_observers;
    };
}

````

# 使い方
使い方の例です。継承を使います。

````cpp
#include <iostream>
#include "observable.h"

// 通知を送るクラス
struct Sender : public mylib::observable<Sender>
{
	// Senderはkey1とkey2の2種類の通知をする
    static const std::string key1;
    static const std::string key2;

	// doSomething()で通知
    void doSomething() {
        notify(key1);
        notify(key2);
    }
};

const std::string Sender::key1 = "key1";
const std::string Sender::key2 = "key2";

// 通知を受け取るクラス
struct Observer : public mylib::observer<Sender, Sender::key1>
{
    Observer() {
        auto sender = new Sender();
        sender->addObserver(this); // Observer登録
        sender->doSomething();
    }
    
	// 通知を受け取ると呼ばれる
    void update(Sender* sender, const std::string& key) override {
        std::cout << "received!" << std::endl;
    }
};

int main(int argc, const char * argv[])
{
    Observer();
    return 0;
}
````

これでreceived!と表示されます。

# おわりに
cocos2d-xを触っていて、EventDispatcherみたいにグローバルにブロードキャストするような通知を多用するのもなんだかなと思いつつ、std::functionに代入すると1対1の通知しかできないので、サクッとObserverパターンを適用できたら便利ではと思い試行錯誤していたところ記事を発見し、テンプレートと継承を組み合わせるのが面白いな〜と感じたので真似してみました。

若干トリッキーなのにもかかわらず、「どのクラスの何を監視するか」が見やすいのがいいですね。
まだC++歴が浅いのでツッコミしてもらえるとありがたいです！
Android Studioで"Out of memory"エラー


##症状
Android Studioで急にこんなエラーが出ました。
![kobito.1405591201.227850.png](https://qiita-image-store.s3.amazonaws.com/0/29775/e8e043b4-fb0e-a633-cb55-7d89bd8a2218.png "kobito.1405591201.227850.png")


ダイアログに表示されてる通り、設定増やしても解消しません。
Android Studioを一からインストールし直しても解消しません。汗汗汗

##解決方法
色々調べたところ以下の方法で解消するケースが多いようです。


 "File > Invalidate Caches / Restart "

![kobito.1405591370.235851.png](https://qiita-image-store.s3.amazonaws.com/0/29775/9f093de6-5d9c-3771-2b17-e81af644326d.png "kobito.1405591370.235851.png")
D3.js をラップするライブラリを使う

[昨日](http://qiita.com/ynakayama/items/362049808223c191d252)は D3.js に触れてみましたが、昨日書いた通り D3.js はレイヤーが低く自由度が高い代わりに何でもできてしまいドメイン固有の用途には若干使いづらい部分があります。

というわけで今日は D3.js をラップして使いやすくするライブラリを紹介します。

# D3.js を利用したラッパーライブラリ

## Rickshaw

Rickshaw
http://code.shutterstock.com/rickshaw/

レンダラー、レジェンド、ホバーなどインタラクティブなグラフを作成するために必要なエレメントを追加するライブラリです。

詳細は[チュートリアル](http://code.shutterstock.com/rickshaw/tutorial/introduction.html)を見ると良いでしょう。

メソッドチェーンだらけの JQuery ライクな生の D3.js 用コードを書くのに比較するとだいぶ読みやすく使いやすくなることがわかるかと思います。

あわせて[デモ](http://code.shutterstock.com/rickshaw/examples/)も豊富に用意されています。インタラクティブな操作が可能なグラフを描くのなら Rickshaw は便利です。

## NVD3

NVD3
http://nvd3.org/

[ノーバスパートナーズ](https://www.novus.com/)のフロントエンドエンジニアらによって保守されている D3.js のみに依存したライブラリです。

執筆時点でバージョン 2.0 に向けて大幅な内部リファクタリングを伴う移行中です。

専用の [CSS](https://raw.githubusercontent.com/novus/nvd3/master/src/nv.d3.css) が用意されていて、これを忘れると表示がおかしくなってしまいます。

試しに公式のサンプルにある Line Plus Bar Chart を描くとこんな感じです。

```js
d3.json("linePlusBarData.json",function(error,data) {
  nv.addGraph(function() {
      var chart = nv.models.linePlusBarChart()
            .margin({top: 30, right: 60, bottom: 50, left: 70})
            .x(function(d,i) { return i })
            .y(function(d,i) {return d[1] })
            ;
      chart.xAxis.tickFormat(function(d) {
        var dx = data[0].values[d] && data[0].values[d][0] || 0;
        return d3.time.format('%x')(new Date(dx))
      });
      chart.y1Axis
          .tickFormat(d3.format(',f'));
      chart.y2Axis
          .tickFormat(function(d) { return '$' + d3.format(',f')(d) });

      chart.bars.forceY([0]);
      d3.select('#chart svg')
        .datum(data)
        .transition()
        .duration(0)
        .call(chart);
      nv.utils.windowResize(chart.update);
      return chart;
  });
});
```

これがこうなります。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/51b412b9-3aa7-37bd-6131-5358247a4810.png)

上は画像を貼っただけですが実際にはインタラクティブな操作が加えられています。

NVD3 はメソッドチェーンが健在で Rickshaw よりラップが薄い感じがします。

## まとめ

インタラクションを実装するにあたり、まず適切なラッパーライブラリを選択して、少しレイヤーを上げて実装しやすくすると良いでしょう。
自動入力補完APIのサンプルコードを作りました。

![ss.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/4e800a73-7481-9838-1376-5f32e9e38104.gif)

https://github.com/ShingoFukuyama/FFFGoogleSearchAutoCompleteTextFieldSample

GoogleおよびDuckDuckGoの自動補完機能を使ったiOSサンプルコードです。

改良点など指摘していただけたら幸いです。

参考にした情報などは[ブログの方](http://fukuyama.co/ios-googleautocomplete)に記載しています。
PHPでcron記法をparse

朝出掛けにcronの設定したらうっかり毎分実行のタスクとかを作ってしまったので自戒のためメモ。

## まちがわないために

https://github.com/mtdowling/cron-expression

mtdowlingがcron parserを作ってくれているのでそれを使ってチェックすればいける。


## サンプル

composer.json

```
{
    "require": {
        "mtdowling/cron-expression": "1.0.*",
        "phpunit/phpunit": "*"
    }
}
```


```php
<?php
require_once 'vendor/autoload.php';
date_default_timezone_set("Asia/Tokyo");

class CronTest extends PHPUnit_Framework_TestCase {
        // ヒャッハー
	public static $cron = "* * * * * /usr/bin/php /path/to/batch.php\n";

	public function testCronExpression()
	{
		$content = $this->getCronContent();
		$base = strtotime(date("Y-m-d H:i:00")) + 60;

		foreach (explode("\n", $content) as $line) {
			$cron = Cron\CronExpression::factory(substr($line, 0, $this->seekOffset($line)));
			// 今の時間から3回分の実行予定時刻を得る
                        //実際はもっとナイスに書かないといけないけどこれでテストきる
			$dates = $cron->getMultipleRunDates(3);
			foreach ($dates as $date) {
				$next = $date->format("Y-m-d H:i:s");
				$this->assertEquals(date("Y-m-d H:i:s", $base), $next);
				$base += 60;
			}
		}
	}

	public function seekOffset($line)
	{
		$line = trim($line);
		$length = strlen($line);
		$count = 0;
		if ($line[0] == '@') {
			// てきとーに
			return strpos($line, " ");
		} else {
			for ($i = 0; $i < $length; $i++) {
				if ($line[$i] == " ") {
					$count++;
				}
				if ($count == 5) {
					return $i+1;
				}
			}
		}

		throw new InvalidArgumentException("passed valued doesn't contain cron expression");
	}

	public function getCronContent()
	{
		return trim(self::$cron);
	}
}
```

## というか

出掛けにcron設定するとかどうよ、ワタシ(ヽ'ω`)
Windows Server 2008 R2 でGitをホスティングしたいけど無理っぽい

諸般の事情により、社内のLinuxサーバーが淘汰される運びとなり、諸々の環境をWindows Server上に構築する必要が出てきた。当然、GitのリモートリポジトリもWindows Server上に置かねばならなくなったが…これが苦難の道程。

## 環境
[サーバー]Windows Server 2008 R2
[クライアント]Windows7 64bit

## Gitblit GOを試す
まずは[Gitblit Go](http://gitblit.com/)を入れてみた。試したバージョンは1.6.0。導入はすごく簡単だった。公式ページの手順に従うだけですんなり構築完了した。インターフェースも日本語化され、なかなかいい感じかと思われたが…。リモートとの通信が死ぬほど遅い。httpで通信してpushやpullが３分前後かかる。意味がわからない。ちょっと実用に耐えるとは言い難い。

## IIS7 に Bonobo Git Serverを入れてみる
[Bonobo Git Server](http://bonobogitserver.com/)というものを見つけたので、試してみた。こちらも導入はわりと簡単で、まっさらな状態だったのでIISインストールから行ったが公式のインストールページに従うだけでセットアップできた。が！こちらも死ぬほど遅い…。push/pullがGitBlitより時間かかる印象。うーむ。

## 次は…
もはや仮想環境に適当なLinux突っ込むしかない…のか？IPアドレスの衝突も無い、ファイアーウォールによる影響でもない、PINGは1msで返ってくる。管理者にも確認してもらったが、ネットワークの問題でも無さそうだ。Windows上にリモートリポジトリを置くとこんなもんなのだろうか？そんなこんなで現在対応を考え中。

## その後
コメントで情報を頂いたGitBucketを試してみました。Tomcatが入っていれば導入は非常に簡単でした。しかし、通信速度に変化は見られず…。これはどうやらホスティングアプリケーションのせいでは無さそうだぞ…。
同じサーバー上に設置したSubversionはHTTPで問題なく動作している。ファイルサーバーとしても問題なく動作している。どうやらGitだけが様子がおかしいようだ。引き続き調査だ。

## Gitクライアントを疑ってみる
サーバーでないならクライアントか？ということでGitクライアントを幾つか試してみる。ひとまず、msysGitも最新版(1.9.4)にしてみた上で試すことにした。

### SourceTree
Gitクライアントといえばコレ。バージョンは1.5.2.0。最初から使っていたので、今回の構成でも使い続ける予定だったが本件が発生。ちょっと別のを試すことに。

### TortoiseGit
Subversion時代はお世話になったTortoiseのGit版。バージョンは1.8.9.0。pushはうまく動作したけど、pullでコケた。pullでエラーさえ発生しなければコレでいい気がする。

### Git Bash
msysGitについてくるアレです。こちらは何事も無く動作した。とりあえずコア部分であるGitが機能する事が確認できた。


## まとめると
よくわからんというのが正直なところ。こんなに苦労してまでGitを使うかどうかの判断を迫られているところまで来た感じ。業務にならないのでは導入を強く推すこともできない…。Subversionに逆戻りか…。
cocos2d-x v3における、Zオーダーとオートバッチの関係


cocos2d-x v3から、ドローコールのオートバッチ機能が追加されました。
これによりSpriteBatchNodeを使わなくてもドローコールを纏められるようになり、
ドローコールを意識しなくてもパフォーマンスが良くなるようになりました。
そのため、ヒエラルキーに制限が生じてしまうSpriteBatchNodeを使うことは非推奨となりました。

しかしながら、このオートバッチの仕組みを知らないとドローが増えることに直結します。
特にスマホでは、数十程度のドローに抑えないとパフォーマンスが悪化します。

そこでcocos2d-x v3における、ドローコールの発行の流れ、オートバッチの仕組み、そしてZオーダーとの関係について説明したいと思います。
（質問・ツッコミ大歓迎です）

## ドローコール発行の流れ

ドローコールが発行されるまでに以下のような流れになります。

1. Sceneから子を深さ優先で探索する
1. 各Nodeでドローコールを発行するコマンドをレンダラーキューに貯める
1. レンダラーキューを、後述するグローバルZに従ってソートする
1. 前後のドローコールでオートバッチを試みる
1. ドローコール発行してドロー

2系までは(2)の時点でドローコールが発行されてたので、オートバッチ機能のために一旦溜めるようになった形だと思います。

そして、肝になるのは、(3)のソートの方法と、(4)のオートバッチされるために必要な条件です。

## オートバッチに必要な条件

ドローコールがバッチされるためには、おおまかに以下の条件を満たす必要があります。

* テクスチャが同一
* BlendFuncが同一

他にも若干細かい話がありますが、基本的には上の条件を満たしてるドローコールが連続していればバッチされます。

## 2種類のZオーダーと描画順

あとはオートバッチされるべきドローコールを、いかに連続して送り込むかです。
ここでは、レンダラーがキューを以下にソートするかについて説明します。

まず、v3からは既存のローカルZの他にグローバルZという概念が導入されました。
グローバルZのおかげでエフェクトなどをヒエラルキーに依存しないで描画順を指定できるようになりました。

しかしながら逆にZオーダーの指定方法が2種類あるために、実際の描画順が分かりづらくなっています。
そこでまず、グローバルZと描画順の関係について解説したあと、ローカルZと描画順の関係について解説します。

### レンダラーキューにおけるソート

ローカルZとグローバルZが混在するなかで、レンダラーキューは以下のようにドローコールをソートします。
（前提として、それぞれのZはデフォルト0です）

1. ドローコールのグローバルZが負、0、正の3つグループに分ける
1. グローバルZが負と正のグループについては、昇順にソートする
1. グローバルZが0のグループについては、ソートしない（デフォルトはこれ）
1. グローバルZが負、0、正の順に結合（したように見せる）

このように、グローバルZを指定したNodeについては、ヒエラルキーに関係なく、（グループ分けがあるものの）小さい順に描画されます。

### ローカルZとドローコールの発行順の関係

前述のように、グローバルZが0、つまりデフォルトの指定ではドローコールはソートされません。
つまりレンダラーキューに追加された順にドローコールが溜まっています。

それではどういう順番でドローコールがキューに追加されているかというと、これまた最初に説明した通り深さ優先探索ですが、若干説明を端折っていますのでここで詳しく説明します。

まずSceneオブジェクトをルートとし、そこから深さ優先探索しますが、探索順序に関してはローカルZが深く影響していきます。

まず、ドローコールをキューに追加しているのは`Node::visit`メソッドですが、これは以下のようなアルゴリズムになっています。

1. （必要に応じて）自身の子をローカルZの昇順でソートする。（ローカルZが同じ場合は、子に追加した順）
1. ローカルZが負のものについて、値が小さいものから`visit`を呼ぶ
1. 自身のドローコールを発行する
1. ローカルZが0以上の子について、順に`visit`を呼ぶ

ローカルZが負の場合が若干ややこしいですが、基本的には深さ優先探索と思って構わないと思います。

### ポイント

* グローバルZが0以外のドローコールは昇順ソートだが、破壊的なので同じグローバルZの場合のドローコールの発行順は不透明
 * オートバッチの条件を満たさないドローコールを同じグローバルZで指定すると、ドローが増える可能性あり
* デフォルトはグローバルZが0なので、ソートされない
 * ヒエラルキーとローカルZが大事
 * ローカルZが負のNodeが、自身のドローコールより優先されるのに注意

## オートバッチの対象外となるNode

幾つかの特殊ノードについては、オートバッチの対象とならずに、独自のドローを行います。
これらを使う際は、Zオーダーやヒエラルキーに注意しましょう。

* LayerColor
* TextureAtlas
 * Label
* ProgressTimer
* DrawNode
* MotionStreak
* ClippingNode
* …

### 例

#### 例1
同じテクスチャのSpriteであるAとBの間に、同じテクスチャのProgressTimerであるCを挟んだ。
↓
AとBはバッチされません。

#### 例2
同じテクスチャのLabelを並べた。
↓
バッチされません。（回避不可能）

## 簡単な問題

ここで簡単な問題を出してみたいと思います。

### 問題

![cocos2d-x_Zorder_problem.png](https://qiita-image-store.s3.amazonaws.com/0/42503/7f6ba8f6-6efd-d3a7-3eab-4fa117847286.png "cocos2d-x_Zorder_problem.png")


### 解

(汚くてすいません・・・)
![cocos2d-x_Zorder_answer.png](https://qiita-image-store.s3.amazonaws.com/0/42503/c13e15a5-9418-8557-64c2-85b68e3b8ca9.png "cocos2d-x_Zorder_answer.png")

## 余談

将来的にレンダラーはマルチスレッドになる計画です。

## 参考

* [本家Wiki](http://www.cocos2d-x.org/wiki/Cocos2d_v30_renderer_pipeline_roadmap)
* ソース
たまーに使うGitコマンドのメモ

# GitHubからリポジトリ取得

## 変更部分を取得
```vim
$ git fetch
````

#### ログを見る場合
```vim
$ git log FETCH_HEAD
````

#### ログを見る場合
```vim
$ git diff FETCH_HEAD
````

#### サーバーに反映
```vim
$ git merge FETCH_HEAD
````

# Gitの管理対象を外す

#### 特定のファイルだけ
```vim
$ git rm <ファイル名>
````

#### フォルダごと管理から外す
```vim
$ git rm -r --cached <フォルダ名>
````

# リジェクトした時

`Please, commit your changes or stash them before you can merge.`
これが出た時。

#### いまの作業ディレクトリの変更を退避
```vim
$ git stash save
````

#### 最新の状態を持ってきてマージ
```vim
$ git pull
````

#### 退避させた作業ディレクトリの変更を削除
```vim
$ git stash clear
````

上記はcommitしてない中途半端な修正を打ち消して、最新の状態に保つ方法。
OSXにvagrant-bash-completionを導入する

vagrantを頻繁にupしたりdestroyしたりbox addとかbox removeとかなんやかんやしていると毎度毎度コマンドをフルで実行するのが面倒になってくる。
ということで、導入した。

https://github.com/kura/vagrant-bash-completion
こちらのREADMEの通りに実行する。
※homebrewのインストールは割愛

```
$ brew tap homebrew/completions
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-completions'...
remote: Reusing existing pack: 72, done.
remote: Total 72 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (72/72), done.
Checking connectivity... done.
Tapped 11 formulae

$ brew install vagrant-completion
==> Downloading https://raw.githubusercontent.com/mitchellh/vagrant/v1.6.2/contrib/bash/completion.sh
######################################################################## 100.0%
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
?  /usr/local/Cellar/vagrant-completion/1.6.2: 2 files, 12K, built in 2 seconds
```

インストール実行後は、.bashrcか.bash_profileに下記を記載する。

```
$ vim .bash_profile
 
if [ -f `brew --prefix`/etc/bash_completion.d/vagrant ]; then
    source `brew --prefix`/etc/bash_completion.d/vagrant
fi

$ source $HOME/.bash_profile
```

これでvagrant のあとのコマンドがタブ補完で出てくるのでだいぶ楽になった。
Remoteのmasterを以前のコミットに戻すコマンド

git branch master_backup ①headのブランチをバックアップ
git reset --hard SHAの値 ②戻したいコミットのSHAをセットし戻す
git push -f origin master:master ③リモートのマスターにプッシュする

master:masterは各リポジトリ名に変更してください。
ex. test:test
超高速 WordPress AMI 網元を使ったサイト構築

AWSでWordPressを立ち上げる場合、[超高速 WordPress AMI 網元](http://ja.megumi-cloud.com/)を使うのが個人的には手っ取り早いので、最近はもっぱらこちらを利用しています。

# 網元AMIとは？
一応前提として、網元AMIの説明。

### 以下サイトより引用
> 網元AMIはWordPressを動作させるための環境（Linux,Nginx,PHP,MySQL)をワンクリックで構> 築可能です。
> これらは全てWordPressに最適化/チューニングされた状態で提供されますので起動後すぐにWordPressを利用することが出来ます。
> レンタルサーバ感覚で、WordPressをクラウドで運用したい！そんな、希望を叶えました。
それが、“網元AMI”です。

# 手順
既にAWSの契約をしており、「Security Group」と「Key Pair」をそれぞれ作成してある前提で話を進めます。

## 1.超高速 WordPress AMI 網元サイト経由で登録

[超高速 WordPress AMI 網元](http://ja.megumi-cloud.com/)サイトから`超高速 AMI 網元を今すぐ試す！`ボタンがあるのでそちらをクリック

![AWS___Nginx___WordPress___超高速_WordPress_AMI_網元.png](https://qiita-image-store.s3.amazonaws.com/0/26931/58477c61-8ab0-0c92-60ba-ce1921812f07.png)

## 2.AMIMOTOのセキュリティグループやKey Pairを選択
いくつか設定を行う必要はあるが、基本的にはデフォルトのままでOK。
Instance Typeは最近microが無くなったのでm3.mediumで。
Security GroupとKey Pairは作成してあるものを選択する。

![AWS_Marketplace__WordPress_powered_by_AMIMOTO_by_DigitalCube_Co__Ltd_.png](https://qiita-image-store.s3.amazonaws.com/0/26931/f13492ae-dd6a-f595-5524-1a41b3c7480d.png)

最後に`Launch with 1-Click`を押下すれば2〜3分でEC2上にInstanceが形成される。
![AWS_Marketplace__Your_Software.png](https://qiita-image-store.s3.amazonaws.com/0/26931/914aaf7f-7bea-9233-ff72-338cdc8622b0.png)

## 3.AWSのコンソール上にInstanceが出来ている事を確認
左メニューの`Instance`から今作ったInstanceが確認出来る。
![AWS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/26931/83186bf6-f85d-5887-6482-7e273d8f9834.png)

## 4.sshで接続
右側の`Public IP`のIPを控えておいて、ターミナルから下記を実行してssh接続

```vim
$ sudo ssh -i [Key Pairまでのパス] ec2-user@[控えたIP]
````

これが出て接続。

```vim
      ___         _            __
     / _ | __ _  (_)_ _  ___  / /____
    / __ |/  ' \/ /  ' \/ _ \/ __/ _ \
   /_/ |_/_/_/_/_/_/_/_/\___/\__/\___/

  
Amazon Linux AMI release 2014.03
    Nginx 1.4 + PHP 5.4 + Percona 5.5

  amimoto     http://ja.megumi-cloud.com/
  digitalcube http://www.digitalcube.jp/
````

## 5.マルチサイトの場合

AMIMOTOではマルチサイト対応が簡単。
先ず`default.backend.conf `の15行目暗いにある`include /etc/nginx/wp-singlesite`をコメントアウトし、`include /etc/nginx/wp-multisite-subdir`のコメントアウトを外す。

```vim
$ vi /etc/nginx/conf.d/default.backend.conf

~中略~
#include /etc/nginx/wp-singlesite;
include /etc/nginx/wp-multisite-subdir;
````

続いて、`wp-config.php`の途中にある`Multisite Settings`より下記をコメントアウト
`www.example.com`の箇所は利用するドメインへ変更

```php
/**
* Multisite Settings
*/
define ('WP_ALLOW_MULTISITE', true);
//
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'www.example.com'); 
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
````

最後にNginxを再起動

```vim
$ sudo /etc/init.d/nginx restart
````

これでマルチサイトの利用が出来るようになる。
静的ページを作るときに助かるJadeでtemplateに変数を渡す方法

Jadeを使う場合はexpress.jsのテンプレートエンジンとして
使うことがほとんどだと思いますが。

静的ページ作成にも速攻で作れるのでとても便利です。

ただ静的ページを作る場合gulpとかで
localsで各ページ共通の変数を渡すのはいいんですが

各ページごとに変数を変えたい場合どうすればいいんだろうなと思い調べました。

```jade:layout.jade
//- headやbodyは省略してます。
doctype html
block vars
meta(charset="UTF-8")
title= title
h1= title
block contents
```

```jade:cheese.jade
extends layout

block vars
  - var title = "Cheese Official Page"

block contents
  p Welcome to Cheese Paradise!!
```

```jade:corgi.jade
extends layout

block vars
  - var title = "Corgi Official Page"

block contents
  p Welcome to Corgi Paradise!!
```

blockを作り継承先のjadeのblockに変数を入れてあげればいいみたいです。
PHPのTestでheader関数によるエラーを回避する


# まとめ

`header`関数を使っている関数などをテストする際には、テストを走らせる前に
`ob_start()`と書きましょう

# 問題

PHPでテストしようとして、何故か[SimpleTest - Unit Testing for PHP](http://simpletest.sourceforge.net/)を利用した

テストを実行すると`header()`によるエラーが出た

>E_WARNING: Cannot modify header information - headers already sent by (output started at ...

よくある感じのエラーで、header関数によってheaderを設定しているが、その前にすでに`echo`や`print_r`などで標準出力されている場合に出力されるエラーです
テストモジュール自体が標準出力しているために、テストしたい場所で`header()`を読んでも時既に遅し、的な感じ

なお、SimpleTest以外で同様のエラーが出るかどうかは知らない

# エラーの出るテストコード例

```php:test.php
<?php
mb_internal_encoding('UTF-8');

require_once('simpletest/unit_tester.php');
require_once('simpletest/reporter.php');

class TestParameter extends UnitTestCase {
  public function __construct() {
  }

  public function testVar() {
    header("Content-Type: text/xml; charset=utf-8");
    $this->assertEqual("1", "1");
  }
}
$test = new TestParameter();
$test -> run(new TextReporter());

?>
```

これを走らすと...

```sh
$ php test.php
TestParameter
E_WARNING: Cannot modify header information - headers already sent by (output started at {PATH}/simpletest/repoter.php) in {PATH}/test.php on line 12
Exception 1!
Unexpected PHP error [Cannot modify header information - headers already sent by (output started at {PATH}/simpletest/reporter.php:213)] severity [2] in [{PATH}/test.php line 12]
        in testVar
FAILURES!!!
Test cases run: 1/1, Passes: 1, Failures: 0, Exceptions: 1
```

というエラーが出てしまう

# エラーの出ないテストコード例

まとめにも書いたように、テストの前に`ob_start()`と書けばよい

```php:test.php
<?php
mb_internal_encoding('UTF-8');

require_once('simpletest/unit_tester.php');
require_once('simpletest/reporter.php');

class TestParameter extends UnitTestCase {
  public function __construct() {
  }

  public function testVar() {
    header("Content-Type: text/xml; charset=utf-8");
    $this->assertEqual("1", "1");
  }
}
ob_start();  // これ
$test = new TestParameter();
$test -> run(new TextReporter());

?>
```

これで

```sh
$ php test.php
TestParameter
OK
Test cases run: 1/1, Passes: 1, Failures: 0, Exceptions: 0
```

となって一安心

`ob_start()`は標準出力自体を取得するための準備であるため、これを呼んでおくと標準出力が内部のバッファに保存されて、`header()`と干渉しなくなったと思われる
travis setup releases で Validation Failed になるときの解消法

情報が不確かなので自分用メモです．

api_key が欲しくて，`travis setup releases` したときに `Balidation Failed` してしまうとき．

```bash:travis
% travis setup releases                                             
Username: ikawaha
Password for ikawaha: ******************************
Validation Failed
for a full error report, run travis report --org
```

GitHub の設定から `Applications` → `Personal access tokens` で temporary token というのが出来ているので，これを消す．

![temporary_token.png](https://qiita-image-store.s3.amazonaws.com/0/44487/5cf0b66d-58ea-5973-b326-4ae666b95c21.png)

とりあえずこれでいけました．でも，ホントにこれでいいかは微妙．情報求む．

出典：

* https://github.com/travis-ci/travis.rb/issues/199
CloudFrontのエラーキャッシュのTTLを変更する

CloudFrontを使ってるとオリジンサーバで404などのエラーレスポンスが発生すると、暫くの間（デフォルトは5分間）CloudFrontは裏にリクエストを投げなくなります。その暫くの間ユーザには常にエラーページが返されます。

# よくある光景

このデフォルトの挙動は、

> 1回エラーになっちゃったけどもう裏は正常化してるのにまだエラーが返ってくる。もぅヤダァ…早く元に戻ってよぉ……。

っていう経験を産み、その体感時間はとても長く感じて心臓に悪いです。ていうか数分レベルなんで実際長いです。

# 解決！

で、この時間を短くするにはどうすればいいんだろう？裏で404の時もCache-Controlヘッダーとか投げたら効いてくれるのかな？などと悩んでみましたが、実はコレ `Custom Error Response` で出来ました！

僕は `Custom Error Response` って、てっきり独自デザインのエラーページを返すための機能だと思ってたんですが違いました。これ実は __カスタムページのパスは必須じゃなかった__ んですね！単にエラーになったときの __復帰までのTTLをカスタムするだけの用途__ でも使えたということに遅まきながら気がついた(^^;

なので例えば↓こんな設定をしておけば、例えファイルを置く前に間違えてアクセスして404をキャッシュされちゃったとしても10秒ですぐにオリジンを確認してもらえるようになります。

![Kw6jKM-h5v4a-7fgYX6xUt_1MwJbiUkJDRPgIjP5u34.png](https://qiita-image-store.s3.amazonaws.com/0/18726/4181ba0f-3a3d-fbc7-6689-54621426803a.png)

ヤッター、めでたしめでたし。