OmniAICreator/Qiita-1.07M huggingface dataset:
RedshiftのDATEDIFFをPostgreSQLでテストする場合

# Redshift DATEDIFFとPostgreSQLの互換
Redshiftで時間の差分を取得する場合、DATEDIFF関数を利用する。
PostgreSQLにはDATEDIFF関数がない。

## Redshit DATEDIFF関数
``` SQL:Redshift
DATEDIFF ( datepart, expression1, expression2)
```

datepartには、年、月、日、時、分、秒などの特定の粒度を指定し、expression1, expression2には日付の列、または、`timestamp`の式を指定する。
DATEDIFFの結果は、`expression2 - expression1`の結果が返る。
* expression2 > expression1 ⇒ 正
* expression2 < expression1 ⇒ 負

## PostgreSQL で日付データの差分を取得する方法
そもそもPostgreSQLDATEDIFF関数はない。
しかし、PostgreSQLでは、`timestamp`の式の差を求めることで差分を知ることができる。
`timestamp1 - timestamp2`

## テストでの対応
本番では、RedshiftのSQLではDATEDIFFを使用していて、テストなどでローカル環境にRedshiftと同じスキーマでテストを実行したい場合、
RedshiftのDATEDIFF関数部分をtimestampの引き算で置き換える処理が必要になる。

今ひとつな対応に思えるので、違うアプローチを持っている方がいれば、教えて下さい！
HipChatの最低限の操作をキーボードだけでするぜ

# はじめに

現場でHipChatを使ってます。

コーディング作業中にHipChatを確認したりレスを返したりするんですが指をキーボードから離したくない。

ということで、最低限の操作をキーボードだけでするためのショートカットを勘で見つけたので共有します。
まぁ、HipChatのサイトにあるでしょうけど。。

アプリ版限定でmacのキーバインドで説明します。

# Room移動

* option + command + ↑（ctrl + shift + tab）
* option + command + ↓（ctrl + tab）

# Chatビュースクロール

* ctrl + ↑
* ctrl + ↓

# その他

* 常にメッセージ入力のところにフォーカスがあたっているのでそのままメッセージ送れます。

# 最後に

快適なHipChatライフをお送りください。
Nginxにオレオレ証明書を設定する


とりあえず開発用にSSLを通したかったので、その設定をした時のメモ書きです。

## 証明書作成

適当にオレオレ証明書作ります。

```実行イメージ
[root@nginx-test-1 nginx]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
..+++
...................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:←適当なパスフレーズ入れる
Verifying - Enter pass phrase for server.key:←上記のパスフレーズを再入力
[root@nginx-test-1 nginx]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:←先ほど設定したパスフレーズ入れる
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

-----↓情報も適当に入れておく
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shibuyaku
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@nginx-test-1 nginx]# cp server.key server.key.org
[root@nginx-test-1 nginx]# openssl rsa -in server.key.org -out server.key ←パスフレーズを解除する
Enter pass phrase for server.key.org:←先ほど設定したパスフレーズ入れる
writing RSA key
[root@nginx-test-1 nginx]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Shibuyaku/O=Default Company Ltd
Getting Private key
```

## nginx.confの設定
先程作成した鍵をNginxに設定します。

```nginx.conf
中略...
    server {
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;
中略...
    }
```

Nginxをリスタートすると、443ポートでSSL通信ができます。
※ セキュリティ警告は出ますが、まぁ開発用なので気にしないということで。

設定簡単ですね。
Vagrant上のUbuntuにScipy+Matplotlibを入れてX11 Forwardingでグラフを表示する


#環境

* ホストOS : Mac OSX Yosemite
* ゲストOS : Ubuntu 14.04.1 LTS

#手順
## XQuartzをインストール
Macにこれをインストール
http://xquartz.macosforge.org/landing/

## Vagrantfile編集
```ruby:Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.ssh.forward_x11 = true    # これを追加
end
```

## UbuntuにX11, Matplotlib, NumPy, SciPy, IPythonをインストール
```bash:
$ vagrant up
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install -y xorg python-matplotlib python-numpy python-scipy ipython
```

## Ubuntuを再起動してグラフ表示
```bash:
$ vagrant reload
$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ ipython --pylab
In [1]: import matplotlib.pyplot as plot
In [2]: import scipy as sp
In [3]: x = sp.arange(1,100)
In [4]: plot.scatter(x, x**2)
```

![Screen Shot 2014-11-20 at 8.37.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/38151/6bd8c831-0ce8-f352-6e46-4c76e8ae6ace.png "Screen Shot 2014-11-20 at 8.37.51 PM.png")

## X11 Forwardingがうまくいかないとき
`vagrant ssh`したときに

```
/home/vagrant/.Xauthority not writable, changes will be ignored
```
と出たら、`~/.Xauthority*`を削除してログインし直してみてください。
UIActivityにLINEActivityを追加して、アイコンをカラーにする


## 参考記事
[UIActivityで追加したアイテムのアイコンをカラーにするPrivate API](http://qiita.com/wakinchan@github/items/e010d6e92399b1556522)

## 環境

* Xcode 6.1
* LINEActivity 0.2.0
* iOS7.1.2, iOS8.1

### iOS8でのカラーアイコン

LINEActivityにはモノクロームのLINEアイコンが同梱されていますが、iOS8のUIActivityは、カラーのアイコンがそのまま利用できます。

LINEActivityをCocoaPodsで利用していても、自分のアプリのアセットカタログに同名（LINEActivityIcon）のアイコンを登録しておけば、こちらが参照されます。

![line-icon-ios8-n.png](https://qiita-image-store.s3.amazonaws.com/0/24161/54053b31-903b-a172-5f2b-4bc64122cece.png "line-icon-ios8-n.png")

### iOS7でのカラーアイコン

iOS8のみなら、これで解決なんですが、iOS7では、アイコンはカラー化されません。

この実装を、iOS7で動作させると以下のようなアイコンになってしまいます。

![line-icon-ios7-1-2.png](https://qiita-image-store.s3.amazonaws.com/0/24161/819202db-b1eb-0186-d7c8-6ae312b64afe.png "line-icon-ios7-1-2.png")


iOS7でカラーアイコンを表示させるには、参考記事の方法を採用せざるえないようです。

参考記事に従って、以下のメソッドを追加してやると、iOS7では、カラーアイコンが表示されます。

```
- (UIImage *)_activityImage
{
  return [UIImage imageNamed:@"LINEActivityIcon.png"];
}
```

しかし、この方法はiOS8では副作用があるようで、以下のように小さなアイコンになってしまいます。

参考記事では、以下のメソッドを利用されていましたが、どれも同じ結果でしたので、ここでは簡単にUIImageで生成しています。

```
+ (id)_activityGenericImage:(id)arg1;
+ (id)_activityImageForApplication:(id)arg1;
+ (id)_activityFunctionImage:(id)arg1;
```

_activityImageForApplicationぐらいは動作するかなと思ったのですが…

![line-icon-ios8-s.png](https://qiita-image-store.s3.amazonaws.com/0/24161/1d0951ef-73da-14f5-dfcb-e7d3799e899f.png "line-icon-ios8-s.png")

iOS7,iOS8対応のアプリとなると、どのように切り替えればいいのかと思案につきています。

これでもいいかとあきらめかけましたが、
とりあえず、iOS7なら、アイコンはモノクロームでアクションカテゴリに配置し、iOS8なら、シェアカテゴリにカラーで表示するというアドホックな方法で逃げています。

Objective-Cには動的にメソッドを追加する機能があるようですが、OSのバージョンを判定して、iOS7なら、_activityImageメソッドを追加すればいいかなと考えていますが、swiftということもあり、いまいち方法がわかっていないのが正直なところです。

どなたか指南いただけると幸いです。

### アイコンの置き場所

アイコンの置き場所を指定する方法も載せておきます。
参考記事でも記述されていますが、アイコンの置き場所はactivityCategoryメソッドで指定できます。UIActivityCategoryShareを返せば、上の段（シェアカテゴリ）へ配置されます。
しかし、順番までは指定できないようです。

```objective-c:activityCategory

+ (UIActivityCategory)activityCategory
{
  // デフォルトはUIActivityCategoryAction（アクションカテゴリー）
  return UIActivityCategoryShare;
}

```

順番は、UIActivityのシェアカテゴリのその他を選択すると、以下のような設定画面が表示されるので、ユーザーがドラッグして順序を変更できます。

![line-icon-other.png](https://qiita-image-store.s3.amazonaws.com/0/24161/bbe4466c-5745-1059-7725-4b7f85a901a6.png "line-icon-other.png")

追加コードは、直接、LINEActivityのソースコードへ追加してもよいですが、Objective-Cのカテゴリでアプリ側のソースコードに置いておくことができます。

```objective-c:LINEAcitivity+.m
#import <LINEActivity/LINEActivity.h>

@interface LINEActivity (Private)
+ (UIActivityCategory)activityCategory;
@end

@implementation LINEActivity (Private)

+ (UIActivityCategory)activityCategory
{
  return UIActivityCategoryShare;
}

@end

```

私はswiftでコーディングしていますが、このようにObjective-Cのファイルも含めることができます。

こうしておけば、LINEActivityのソースやリソースは一切さわることなく、実装できます。

少し消化不良ですが、何かの参考になれば、幸いです。
vue.jsでバインディング済みのオブジェクトや配列を書き換えるときの注意点

## はじめに

vue.jsでバインディング済みオブジェクトや配列を書き換える際に，（ビューに反映させるために）状況によってはvue.jsが用意する拡張メソッドを利用する必要があります。

結論としては「`Object.$add`なり`Array.$set`なり使えよ」ということになるのですが，どういうケースでこれらのメソッドを呼ぶ必要があるのかが（わたしのような）初心者にはすぐに理解できなかったので，サンプルを交えつつ紹介したいと思います。

## 前提コード

まず次のようなコードを考えます。

```html
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/0.11.0/vue.min.js"></script>
<div id="container">
  <div>
    0: {{array[0].name}}, {{array[0].prop}}
  </div>
  <div v-repeat="array" v-show="$index > 0">
    {{$index}}: {{name}}, {{prop}}
  </div>
</div>
<script>
  var app = new Vue({
    el: "#container",
    ready: function() {
      var self = this
      setTimeout(function() {
        self.array[0].prop = true
        self.array[1].prop = true
        self.array[2].prop = true
      }, 1000)
    },
    data: {
      array: [
        { name: "a" },
        { name: "b" },
        { name: "c" }
      ]
    }
  })
</script>
```

ページがレンダリングされてから1秒後に`app.$data.array`が書き換えられ，最終的には次のような結果になることを期待したコードです。

```text
0: a, true
1: b, true
2: c, true
```

しかしながら，実際に上記のコードを実行してみると，次のように`prop`への変更が反映されません。

```text
0: a,
1: b,
2: c,
```

## プロパティを追加するために`$add`を呼ぶ

配列の各要素となるオブジェクトに対して，元々存在しなかった`prop`というプロパティを追加している点に注目してください。このようなケースでは，ViewModelにオブジェクトのプロパティが追加されたことを知らせるために，`$add`を呼んであげる必要があります。

サンプルコードの`setTimeout`呼び出し部分を次のコードに置き換えます。

```js
setTimeout(function() {
  self.array[0].$add("prop", true)
  self.array[1].$add("prop", true)
  self.array[2].$add("prop", true)
}, 1000)
```

結果は次のようになりました。

```text
0: a,
1: b, true
2: c, true
```

`v-repeat`を使わずに直接参照している部分がうまく動いていませんね。どのようにすれば思い通りの結果が得られるでしょうか？

## 配列の要素を書き換えるために`$set`を呼ぶ

先ほどは直接配列の要素を参照している部分がうまく動きませんでした。どうやら，配列の特定の要素が書き換えられていることをvue.jsに教えてあげる必要がありそうです。

サンプルコードの`setTimeout`呼び出し部分を，更に次のように書き換えます。

```js
setTimeout(function() {
  var f = function(i) {
    var o = self.array[i]
    o.$add("prop", true)
    self.array.$set(i, o)
  }
  f(0)
  f(1)
  f(2)
}, 1000)
```

結果は次のようになりました。

```text
0: a, true
1: b, true
2: c, true
```

うまく動きました！

## おわりに

今回のケースでは，`$add`と`$set`の両方を呼ばないと思い通りの結果を得ることができませんでした。

vue.jsでバインディング済みの配列やオブジェクトの書き換えをする場合には，これらの拡張メソッドを呼ぶ必要がないかどうか，注意を払う必要がありそうです。拡張メソッドには他の種類もあるので，詳しくは関連リンクの本家ドキュメントを読んでみてください。

動作確認環境は下記の通りです。

| 使用ライブラリ・ソフト | バージョン     |
|:---------------------|:--------------|
| vue.js               | 0.11.0        |
| Google Chrome        | 38.0.2125.122 |
| Mozilla Firefox      | 33.1.1        |

どうしてこんな面倒なメソッド呼び出しが必要なのか，ということについては，関連リンクのてっく煮ブログさんに書かれているので引用します。

>こんな面倒なことになっているのも、Vue.js が ECMAScript 5 の世界で頑張っているからです。
>
>ECMAScript に提案されている Object.observe() が使える世界になれば、Object や Array の置き換えも不要になるし、Vue.js の設計もシンプルになることでしょう。

## 関連リンク

- [Augmented Methods / Displaying a List - vue.js](http://vuejs.org/guide/list.html#Augmented_Methods)
- [Vue.js が data に渡した値を激しく書き換える件について - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2014/06/30/vue-js-hook/)
Quay.IO での自動ビルドの経過を Slack に通知する


## 概要
Quay.IO という SaaS 型 Docker Registry (Docker Hub の競合だと思って良い）の自動ビルドのスタートやビルド結果を Slack に通知する。 GitHub に push, CI の開始等をチャットツールに通知するやつの Docker 版。

## Slack で token を取得する

![スクリーンショット_2014-11-20_18_38_02.png](https://qiita-image-store.s3.amazonaws.com/0/20833/6fa2b910-63cd-cf89-1457-42a1e634cc17.png "スクリーンショット_2014-11-20_18_38_02.png")

通知するチャネルを選んで

![スクリーンショット_2014-11-20_18_40_12.png](https://qiita-image-store.s3.amazonaws.com/0/20833/18c9c2eb-aebb-3105-7541-664b9eac3998.png "スクリーンショット_2014-11-20_18_40_12.png")

Webhook URL を調べる

```
https://hooks.slack.com/services/XXXXXXXX/YYYYYYYYYY/ZZZZZZZZZZZZZZZZZ
```


![スクリーンショット_2014-11-20_19_33_33.png](https://qiita-image-store.s3.amazonaws.com/0/20833/582339bc-643b-1f15-4c77-cd8e1bc87ce8.png "スクリーンショット_2014-11-20_19_33_33.png")


## Quay の方で通知設定する
![スクリーンショット_2014-11-20_18_06_57.png](https://qiita-image-store.s3.amazonaws.com/0/20833/ea2b0191-95a1-c69c-d015-8c618de3dd4c.png "スクリーンショット_2014-11-20_18_06_57.png")

新規の通知設定を追加

![スクリーンショット_2014-11-20_18_13_26.png](https://qiita-image-store.s3.amazonaws.com/0/20833/8bf421c2-c324-b40b-15eb-b60db641a722.png "スクリーンショット_2014-11-20_18_13_26.png")

先ほど取得した WebHook URL を入力する
![スクリーンショット_2014-12-25_15_00_07.png](https://qiita-image-store.s3.amazonaws.com/0/20833/9fb8d2e8-80d1-69cb-dab3-1482fcd2c302.png "スクリーンショット_2014-12-25_15_00_07.png")


通知テストもできる

![スクリーンショット_2014-11-20_19_35_42.png](https://qiita-image-store.s3.amazonaws.com/0/20833/1abef4c8-5791-42bc-6ddb-4dada5eec7fd.png "スクリーンショット_2014-11-20_19_35_42.png")

この要領で、

* docker push
* build ジョブがキューに入った
* build ジョブが開始した
* build が成功した
* build が失敗した

の 5 つを Slack に通知する

![スクリーンショット 2014-11-20 19.59.10.png](https://qiita-image-store.s3.amazonaws.com/0/20833/85c2b1be-9349-90fa-d307-5d8b19708640.png "スクリーンショット 2014-11-20 19.59.10.png")


## GitHub の push をトリガーに自動ビルドして経過を Slack に通知する

buildpack-deps という GitHub リポジトリの `14.04` というタグが push されたときに自動ビルドが起きるよう設定した

![スクリーンショット_2014-11-20_19_53_04.png](https://qiita-image-store.s3.amazonaws.com/0/20833/f4cc7cba-e8c1-43ef-a59d-722e81cbcaf6.png "スクリーンショット_2014-11-20_19_53_04.png")

push

```bash
$ git tag 14.04
$ git push origin 14.04
Total 0 (delta 0), reused 0 (delta 0)
To ssh://git@github.com/wantedly/buildpack-deps
 * [new tag]         14.04 -> 14.04
```

これでこんな感じで Slack に通知されるようになる

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/20833/6e9e3ca6-52cc-d79b-acd5-bc57f8c42cb8.png "Slack.png")

## メモと感想
### 何をトリガーにビルドするか
Quay では、git の指定ブランチまたはタグをトリガーにして自動ビルドを仕込む事ができる。自分たちは、悩んだ結果タグを使ってみることにした。

前提として例えば ubuntu の buildpack-deps イメージであれば、

* `14.04`
* `12.04`

という 2 つの Docker タグを持つイメージを作りたいとする。このとき Git のリポジトリには

* `14.04/Dockerfile`
* `12.04/Dockerfile` 

のように、複数 `Dockerfile` を含ませる。（これは Docker, Inc 公式のリポジトリの形に習っている。）

こうしたとき、

* master ブランチ
* 14.04 ブランチ --> `14.04` タグを付けるビルドトリガー
* 12.04 ブランチ --> `12.04` タグを付けるビルドトリガー

とするか

* master ブランチ
* master ブランチ上の 14.04 タグ --> `14.04` タグを付けるビルドトリガー
* master ブランチ上の 12.04 タグ --> `12.04` タグを付けるビルドトリガー

を選択肢として考えた。どちらもさほど大差ないけどとりあえずやってみてみる。
Codeception を使ってみた


モダンな PHP テスティングフレームワーク、Codeception を使ってみました。

##環境
- MacOSX 10.8.5
- PHP 5.4.35

##インストール
Phar または Composer または Git から入手できます。
今回は Git を使ってみます。

```bash
git clone git@github.com:Codeception/Codeception.git
```
Codeception 2.0 は PHP 5.4 以上が必要です。
5.3 以下は Codeception 1.8.x を使えとのこと。

###Composer
```bash
cd Codeception
curl -s http://getcomposer.org/installer | php
php composer.phar install
```
依存する輩がいろいろと入ります。

###bootstrap
```bash
php codecept bootstrap /project
```
bootstrap の後に生成先のディレクトリを指定できるようです。

```
Initializing Codeception in /project

File codeception.yml created       <- global configuration
tests/unit created                 <- unit tests
tests/unit.suite.yml written       <- unit tests suite configuration
tests/functional created           <- functional tests
tests/functional.suite.yml written <- functional tests suite configuration
tests/acceptance created           <- acceptance tests
tests/acceptance.suite.yml written <- acceptance tests suite configuration
tests/_output was added to .gitignore
tests/_bootstrap.php written <- global bootstrap file
Building initial Tester classes
Building Actor classes for suites: acceptance, functional, unit
\AcceptanceTester includes modules: PhpBrowser, AcceptanceHelper
AcceptanceTester.php generated successfully. 48 methods added
\FunctionalTester includes modules: Filesystem, FunctionalHelper
FunctionalTester.php generated successfully. 13 methods added
\UnitTester includes modules: Asserts, UnitHelper
UnitTester.php generated successfully. 17 methods added

Bootstrap is done. Check out /project/tests directory
```
ひな形できたっぽい。

##一旦テスト実行
```bash
php codecept run -c /project
```

```
Codeception PHP Testing Framework v2.0.8
Powered by PHPUnit 4.3.5 by Sebastian Bergmann.

Acceptance Tests (0) ------------------------
---------------------------------------------

Functional Tests (0) ------------------------
---------------------------------------------

Unit Tests (0) ------------------------------
---------------------------------------------


Time: 101 ms, Memory: 6.50Mb
```
まだテスト書いて無いですけどね。とりあえずは実行できる模様。

テストに使ったコマンドをまるごと `alias` にしとくと楽ですね。
.bashrc に

```.bashrc
alias t='php codecept run -c /project'
```
と書いて

```bash
source ~/.bashrc
```

以降は `t` と叩けばテスト実行ですね。

次回以降で実際のテストを書いていきます。今日はおしまい。
UITextField(UITextView)を使用したときのキーボードのViewを取得する


UITextFieldなどを使っているとキーボードに対して制御したいときが出てきます。

そのときにキーボードのインスタンスを取得する方法です。

```objectivec:キーボードのインスタンスを取得する

@property (weak, nonatomic) UIView *keyboardView;

//キーボードが表示されるタイミングをハンドリングするためにObserverを追加する
- (void)registerForNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didReceiveKeyboardDidShowNotification:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];
}


//キーボードが表示されたときの通知を受け取る
- (void)didReceiveKeyboardDidShowNotification:(NSNotification *)notification
{
    self.keyboardView = self.textView.inputAccessoryView.superview;
    NSLog(@"%@",self.keyboardView);
    //<UIInputSetHostView: 0x7ffb796197f0; frame = (0 344; 320 224); layer = <CALayer: 0x7ffb79619ac0>>
}
```
クラメールの連関係数の計算

Pythonでクラメールの連関係数を計算するモジュールが見当たらなかったので自作しました．
計算方法は[こちら](http://rikanet2.jst.go.jp/contents/cp0530/contents/06-01-10.html)を参考にしました．

```python:cramerV.py
# -*- coding: utf-8 -*-

import numpy as np


def cramersV(x, y):
    """
    Calc Cramer's V.

    Parameters
    ----------
    x : {numpy.ndarray, pandas.Series}
    y : {numpy.ndarray, pandas.Series}
    """
    table = np.array(pd.crosstab(x, y)).astype(np.float32)
    n = table.sum()
    colsum = table.sum(axis=0)
    rowsum = table.sum(axis=1)
    expect = np.outer(rowsum, colsum) / n
    chisq = np.sum((table - expect) ** 2 / expect)
    return np.sqrt(chisq / (n * (np.min(table.shape) - 1)))


if __name__ == "__main__":
    import pandas as pd
    data = pd.DataFrame(
        {'science': ['like', 'like', 'like', 'like', 'like', 'like', 'like',
                     'like', 'like', 'like', 'like', 'like', 'like', 'like',
                     'like', 'like', 'like', 'like', 'like', 'like', 'like',
                     'like', 'like', 'like', 'like', 'like', 'like', 'like',
                     'like', 'like', 'like', 'dislike', 'dislike', 'dislike',
                     'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
                     'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
                     'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
                     'dislike'],
         'math': ['like', 'like', 'like', 'like', 'like', 'like', 'like',
                  'like', 'like', 'like', 'like', 'like', 'like', 'like',
                  'like', 'like', 'like', 'like', 'like', 'like', 'like',
                  'like', 'like', 'like', 'dislike', 'dislike', 'dislike',
                  'dislike', 'dislike', 'dislike', 'dislike', 'like', 'like',
                  'like', 'like', 'like', 'like', 'dislike', 'dislike',
                  'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
                  'dislike', 'dislike', 'dislike', 'dislike', 'dislike',
                  'dislike']})
    print cramersV(data['science'], data['math'])

```
Railsで月単位で値を抽出する


Railsで月単位で値を抽出したい時は、 
ActiveSupportのTime拡張を使えば簡単にできます
[by_star](https://github.com/radar/by_star)を使いましょう！


ActiveSupportのTime拡張でやった場合、MySQLの「BETWEEN2014/11/1 AND 2014/11/21」なら 21未満の値をとります。よって、以下コード最終日が取れないので間違っていました！

こんな感じでやると、年と月指定ができました＼(^o^)／

```ruby:
Model.by_year(Time.zone.year, field: :created_at)by_month(Time.zone.month, field: :created_at)
```

by_starすごい！簡単！便利！
Windows で Flow を触ってみる

**追記: 2014/11/21 19:34**
こんなページが出来てました。
http://www.ocamlpro.com/pub/ocpwin/flow-builds/
更にバージョンアップしているようです。

----

今巷で話題の flow を触ろうと思ったのに Windows 版が無い！と嘆いてたら、こんなコメントが投稿されてた。  

https://github.com/facebook/flow/issues/6#issuecomment-63693766

Windows 用にビルドしてくれているみたいなので早速試してみる。
まずはファイルをダウンロード
http://www.ocamlpro.com/pub/ocpwin/flow-builds/flow-simple-windows-20141119.zip

zip を解凍すると中身はこんな感じ

```
.
├── flow32.exe
├── flow64.exe
├── lib
│   ├── bom.js
│   ├── core.js
│   ├── dom.js
│   └── react.js
└── Readme.txt
```

次に環境変数 FLOWLIB に lib ディレクトリのパスを指定しておく。

Cygwin:

```sh
$ export FLOWLIB=c:/cygwin/home/user/flow-simple-windows/lib
```

Cmd:

```
$ set FLOWLIB=c:/cygwin/home/user/flow-simple-windows/lib
```

後は実行するだけ。

とりあえず、以下のサンプルから 01_HelloWorld を試す。
https://github.com/facebook/flow/tree/master/examples

まずは失敗例

```hello.js
/* @flow */

function foo(x) {
  return x*10;
}

foo("Hello, world!");
```

```
{ 01_HelloWorld }  » ~/flow-simple-windows/flow64.exe single .

C:\Users\hoge\.babun\cygwin\home\hoge\flow-master\examples\01_HelloWorld\./hello.js:7:5,19: string
This type is incompatible with
  C:\Users\hoge\.babun\cygwin\home\hoge\flow-master\examples\01_HelloWorld\./hello.js:4:10,13: number

Found 1 error

```

次に成功例

```hello.js
/* @flow */

function foo(x) {
  return x*10;
}

// This is fine, because we're passing a number now
foo(10);
```

```
{ 01_HelloWorld }  » ~/flow-simple-windows/flow64.exe single .

Found 0 errors
```

ちゃんと動いているっぽい。

興味のある方は試してみては。
※ただし自己責任でお願いします。

元記事: [Windows で Flow を触ってみる - 2noの日記](http://2no.hatenablog.com/entry/2014/11/20/170900)
node.jsとpm2とgitでHerokuみたくgit pushでデプロイする

そんな大層なもんじゃ無いです。
ダウンタイムとか考えてないですし。

# git pushでデプロイするには

gitのhooksの中でpost-updateを使います。
中身を、

```bash:post-update
BRANCH=$(git rev-parse --symbolic --abbrev-ref $1)
case $BRANCH in
  "master" )
    if [ "$USER" == "mainuser" ]; then
      pm2 stop all
      cd /sites/mainsite
      git --git-dir=.git checkout $BRANCH
      git --git-dir=.git pull origin $BRANCH
      npm install
      pm2 start bin/www
    fi
  ;;
esac
```

1. ブランチ名とってきて
2. ブランチ名がmasterなら
3. 現在のユーザーを調べてmainuserなら
4. pm2で処理をすべて終わらせ、
5. サイトのディレクトリに移動し、
6. 取得
7. 再起動

何も難しい事してませんな。
あ、bashでないと動かないので、それ以外の方は適宜修正してください。
非同期JSロードを考慮した Load イベントの記述方法

JavaScript でページが表示されるタイミングで何かしらの処理を行いたい場合、諸事情で jQuery などが使えない環境なら `addEventListener()`, `document.onload` あたりを使用すると思います。

```js
document.addEventListener(
  "DOMContentLoaded", function(){/* 初期化処理 */}, false);
```

しかし、表示高速化のために HTML 側でスクリプトの読み込みを非同期で行うよう記述してしまうと、スクリプトが実行している時点で既に DOM の生成やページの読み込みが終わっていてイベントが起動しなくなります (正確にはごくまれにするが)。

```html
<script type="text/javascript" src="x.js" async defer></script>
```

これは JavaScript の非同期ロードを止めるか (パフォーマンスを犠牲にできる場合)、あるいは以下のように既にロード済みであればイベントハンドラを直接呼び出すこと (微細な不確実さが許容できる場合) で対応することができます。汎用性が必要な JavaScript ライブラリを実装しているのであれば考慮しておくと良いですね。

```js
function handler(){/* 初期化処理 */}

if(document.readyState == "interactive"
|| document.readyState == "complete"){
  handler();
} else {
  document.addEventListener(
    "DOMContentLoaded", handler, false);
}
```

jQuery の場合も既に DOM がロード済みなら `jQuery.ready()` は即時実行してくれますが、`$(document).load()` はそこまで面倒見てくれないみたいですね。ページロードのイベントハンドラが突然実行されなくなった時の考慮点として思い出すか、あるいは検索でこのページが引っかけられると良いかなと思います。
モーダルを表示したときに背景部分はスクロールできないようにする


モーダルを表示させたとき、何も考えずにコーディングするとモーダルをスクロールしたいのに背景までスクロールされちゃう、
なんてことに陥りがち。
(モーダルの上端・下端を超えるスクロールをしたときや、モーダル外にカーソルを置いてスクロールしたとき等)
これを防ぐには、モーダルが表示されているときは背景要素をfixedにするのが良さげ。

```index.html
<div id="wrapper">
	<p class="open">
		<button>open modal</button>
	</p>
</div>
<section id="modal">
	<!--modal content -->
</section>
```


```main.js

// include jQuery

var current_scrollY;

// OPEN MODAL
$( '.open button' ).on( 'click', function(){
  current_scrollY = $( window ).scrollTop(); 

  $( '#wrapper' ).css( {
    position: 'fixed',
    width: '100%',
    top: -1 * current_scrollY
  } );

  $( '#modal' ).show();

} );

// CLOSE
$( '#modal' ).on( 'click', function( e ){
  if ( e.target.tagName.toLowerCase() === 'section' ){
    $( '#wrapper' ).attr( { style: '' } );
    $( 'html, body' ).prop( { scrollTop: current_scrollY } );

    $( this ).hide();
  }
} );
```

wrapperをposition: fixed; に変えたとき、
何もしないと上端が0に戻ってしまうので、
現状のスクロール位置をスタイルのtopプロパティにあてることで
背景の位置を維持させます。

また、モーダルを閉じる際には、style指定をリセットすることでfixedを解除させます。
更に、スクロール位置が0に戻ってしまっているので、開くタイミングで保持しておいた値まで移動させましょう。

気をつけるべき点としては、背景要素とモーダル要素を兄弟関係に配置することです。
親子にしてしまうと、モーダルまでfixedされてしまうので。
画面に四角形を敷き詰める

C++初心者が頑張って色々覚えたのでメモ

## クラス Tile を作る
x座標、y座標、幅、高さのプロパティを持ったTileクラスを作る。

```Tile.h
#include "ofMain.h"

class Tile {
public:
    Tile(float x = 0, float y = 0, float w = 0, float h = 0);
    ~Tile();
    void draw();
    
    ofPoint pos;
    float w;
    float h;
};
```

```Tile.cpp
#include "Tile.h"

Tile::Tile(float _x, float _y, float _w, float _h) {
    pos.x = _x;
    pos.y = _y;
    w = _w;
    h = _h;
}

void Tile::draw() {
    ofSetColor(255, 0, 0);
    ofRect(pos.x, pos.y, w, h);
}
```

あとはTileクラスのインスタンスを作って並べれば良いのだが、ここで2次元配列を用意する必要がある。

## vector型の2次元配列
ここがハマりポイントだった。まず、変数の宣言。

```ofApp.h
vector < vector<Tile *> > tiles;
```

vectorの中にTileクラスを格納するvector型のtiles、という意味（たぶん）

使用するときはx座標用とy座標用でforをループさせれば良いと思いきや

```
for (int x=0; x<100; x++) {
    for (int y=0; y<100; y++) {
        tiles[x][y] = new Tile(x*w, y*h, w, h);
    }
}
```

上記だとエラーになった。
調べても原因が不明だったが、Google先生が示したページではforループさせる前にresizeメソッドを実行していたので、同じようにやると

```
tiles.resize(100); //追加
for (int x=0; x<100; x++) {
	tiles[x].resize(100); //追加
    for (int y=0; y<100; y++) {
        tiles[x][y] = new Tile(x*w, y*h, w, h);
    }
}
```

うまくいきました。
~~動的配列なのにサイズを明示的に指定してあげなきゃいけないのはなぜなんだろう。~~
解決しました。コメント欄を参照ください。

## 四角形の大きさを求める
ひとまず動いたので良しとして、あとは分割数を設定し、画面サイズを取得して1つあたりの四角形の大きさを計算して画面に配置してやればOK。

```
四角形の幅 = ウインドウ幅 / 分割数
四角形の高さ = ウインドウ高さ / 分割数
```

```ofApp.cpp
#include "ofApp.h"
void ofApp::setup(){
    
    ofBackground(0);
    
	//ウインドウサイズ
    stageWidth = ofGetWidth();
    stageHeight = ofGetHeight();

	//分割数
    sprit = 300;
    
	//四角形のサイズを計算
    rectWidth = stageWidth / sprit;
    rectHeight = stageHeight / sprit;
    
    tiles.resize(sprit);
    for (int x=0; x<sprit; x++) {
        tiles[x].resize(sprit);
        for (int y=0; y<sprit; y++) {
            tiles[x][y] = new Tile(x*rectWidth, y*rectHeight, rectWidth, rectHeight);
        }
    }
}

void ofApp::draw(){
    for (int x=0; x<sprit; x++) {
        for (int y=0; y<sprit; y++) {
            tiles[x][y]->draw();
        }
    }
}
```

ただし、ウインドウサイズを大きくすると大きくした分だけ隙間ができてしまうので、windowResizedメソッドで各プロパティを変更して再描画すればOK。
【Git, Github】初めてのGithubリポジトリの作り方


## 前提
Githubのアカウントは既に作っているという想定で書いています。

## Githubへのリポジトリの作り方

### Githubへアクセス
GitHubへアクセスすると下記のようなログイン後画面が表示されます。

![Github_createRepository_01.png](https://qiita-image-store.s3.amazonaws.com/0/18615/398830c4-1746-4b18-f6c0-ce4f6cb4d356.png "Github_createRepository_01.png")


### NewRepositoryの作成
右下にグリーンの「+New Repository」というボタンがあるので、それをクリックして新しいリポジトリを作成する画面へ遷移します。

![Github_createRepository_02.png](https://qiita-image-store.s3.amazonaws.com/0/18615/4b9d9297-b01c-0d1c-4236-5ca3c8af5c1b.png "Github_createRepository_02.png")


### Repository名などの基本情報を登録
リポジトリを作成するために、「リポジトリ名(Repository Name)」「リポジトリに関する説明(Description)」を登録します(Descriptionは任意入力項目です)。

![Github_createRepository_03.png](https://qiita-image-store.s3.amazonaws.com/0/18615/d1298fc8-97a5-9989-13a8-8d53050f355c.png "Github_createRepository_03.png")


### Repositoryを作成
リポジトリに最低限の名前を設定すると、下部の「Create repository」ボタンが押せるようになるので、ボタンを押してリポジトリを作成します。

![Github_createRepository_04.png](https://qiita-image-store.s3.amazonaws.com/0/18615/aed7ae0f-86b0-67e2-c350-d8b0b0a7a687.png "Github_createRepository_04.png")


### 作成したリポジトリの情報を確認
リポジトリを作成すると下記のような画面が表示され、GithubのRemoteリポジトリを使うための方法が記述されています。
上部にHTTPSとSSHという２つの通信方式でのリモートリポジトリとのやり取りの方法が選択できるようになっていますが、下記はHTTPSを選択している時の画面です。
![Github_createRepository_05.png](https://qiita-image-store.s3.amazonaws.com/0/18615/30adbfd9-597d-5c06-8c74-fa164fdbaf67.png "Github_createRepository_05.png")



### SSHでの接続情報を確認
上部メニューからSSHを選択すると、下記のように表示が変更されます。

![Github_createRepository_06.png](https://qiita-image-store.s3.amazonaws.com/0/18615/19cb3a62-b2cd-ba80-9c0e-b33c511dec2f.png "Github_createRepository_06.png")


## まとめ
上記でGithubに新規リポジトリを作る方法は以上です。
次回別記事では、ローカルにリポジトリを作成し、Github上のリモートリポジトリとやり取りができるようにしていきます。
enchant.js の開発環境を構築（CoffeeScript Yeoman を利用）


ふと [enchant.js](http://enchantjs.com/ja/) の開発環境を Yeoman で作り、CoffeeScript で書いてみようという衝動に駆られたので、やってみました。

ちなみに enchant.js のソースは、GitHub にあります。
⇒ https://github.com/uei/enchant.js-builds

> https://github.com/wise9/enchant.js は古いもの？

今回は Yeoman の [webapp](https://github.com/yeoman/generator-webapp) ジェネレータを利用しました。ジェネレータを利用した理由としては、CoffeeScript で書くための環境を、お手軽に作りたかったからです。

> Yeomanの ジェネレータを利用すると Grunt/Bower まわりの環境がある程度そろうので楽です。

## 環境構築

### 前提

- 手元の OS：`Mac OS X 10.9.5 (Mavericks)`
- Yeoman、Grunt、Bower を使います。もしまだインストールしていない場合、こちらの投稿を参考にインストールしてください。
	- [Mac で Yeoman の環境を構築する手順](http://qiita.com/hkusu/items/0d2ed38c47b73201f4c2)
- webapp ジェネレータをインストールしていない場合は、次のようにインストール。

	```shell:
	$ npm install -g generator-webapp
	```

- 結果的に今回、利用したツール/ライブラリ郡のバージョンは次のとおり。
	- Yeoman：`1.3.2`
	- Yeoman の generator-webapp：`0.5.1`
	- enchant.js：`0.8.2`

### 手順

- ジェネレータを起動します。この際、`--coffee` を付与します。

	```shell:
	$ yo webapp --coffee
	```

	![スクリーンショット 2014-11-20 14.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/35733/f9185102-916f-99a4-a0ce-1eaaa59402ca.png "スクリーンショット 2014-11-20 14.59.24.png")

	選択できるオプションは全て外します。

- 雛型の生成がおわったら、本命の enchant.js を Bower でインストールします。

	```shell:
	$ bower install enchant.js-builds --save
	```

- 次のようにファイルが展開されました。

	![スクリーンショット 2014-11-20 16.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/35733/0833725f-8e06-101f-f5d8-666a265790a8.png "スクリーンショット 2014-11-20 16.09.02.png")


- ここで一旦、動作確認します。

	```shell:
	$ grunt serve
	```

	![スクリーンショット 2014-11-20 15.10.50.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d60334fb-6631-c181-f547-e444b0b2a344.png "スクリーンショット 2014-11-20 15.10.50.png")

## enchant.js を動かす

といっても、enchant.js の開発知識が無いので^^; [公式ページのトップ](http://enchantjs.com/ja/) にあるソースと同じことをやってみます。

まず `index.htm` で enchant.js を読み込みます。

```html:app/index.html
〜
<!-- build:js(.) scripts/vendor.js -->
<!-- bower:js -->
<script src="bower_components/jquery/dist/jquery.js"></script>
<!-- endbower -->
<script src="bower_components/enchant.js-builds/build/enchant.js"></script>
<!-- endbuild -->
〜
```

スクリプトを CofeeScript で書きます。

```coffeescript:app/scripts/main.cofee
$ ->

  enchant()

  game = new Core(320, 320)

  game.preload "images/chara1.png"
  game.fps = 20

  game.onload = ->
    bear = new Sprite(32, 32)
    bear.image = game.assets["images/chara1.png"]
    game.rootScene.addChild bear
    bear.frame = [
      6
      6
      7
      7
    ]

    bear.tl.moveBy(288, 0, 10)
    .scaleTo(-1, 1, 10)
    .moveBy(-288, 0, 90)
    .scaleTo(1, 1, 10)
    .loop

    return

  game.start()

  return
```

メソッドチェーンで、キャラクターの動きを順番につけれるようですね。`chara1.png` はライブラリ中のフォルダに入っているので、`app/images/` 配下にコピーしておきます。

`$ grunt serve` で動かしてみます。

![スクリーンショット 2014-11-20 16.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/35733/5820aab1-6235-0f21-610a-4ce050a9c77a.png "スクリーンショット 2014-11-20 16.19.59.png")

デモはこちらに置きました（GitHub Pages）。
⇒ http://hkusu.github.io/enchant.js_demo/dist/

## おわりに

今回のソースは GitHub にも置きました。
⇒ https://github.com/hkusu/enchant.js_demo
手元で再現する場合は、次のようにしてください。

```shell:
$ cd enchant.js_demo
$ npm install
$ bower install
```
Mac で ActiveDirectory アカウントでログインして chsh できないとき

デフォルトのシェルを `zsh` などに変更するときは、通常 `chsh` コマンドを使用することでしょう。

ですが、Mac に ActiveDirectory のアカウントでログインしていると、`chsh` コマンドはうまく使えません。

```
$ chsh -s /usr/local/bin/zsh
Changing shell for yuya.
Password for yuya:
chsh: no changes made
```

そういうときは以下のページを参考に設定しましょう。

[Mac OS X 10.6 Server Admin: Active Directory ユーザアカウントの UNIX シェルを設定する](http://support.apple.com/kb/PH9288?viewlocale=ja_JP)

![Capture](http://i.gyazo.com/a1d2292949f737dd669e33e07f63d189.png)
SourceKitService Crashed

![SS 2014-11-20 16.04.12.png](https://qiita-image-store.s3.amazonaws.com/0/7823/a609cb44-57f1-c466-94ee-bce3d776b8cf.png)

Xcode を使っていると時々こんなメッセージがでてきて補完が効かなくなり、家に帰りたくなります。

```
SourceKitService Crashed
Crashlog generated in ~/Library/logs/DiagnosticReports

Editor functionality temporarily limited.
```

# 解決方法
Xcode を終了し、`~/Library/Developer/Xcode/DerivedData` 配下のフォルダを全て削除すると解決します。
原因は不明・・・。

# 参考
[ios - Swift SourceKitService Crashed - Stack Overflow](http://stackoverflow.com/questions/26230440/swift-sourcekitservice-crashed)
Railsでtypeが予約後でエラーでたからついでにActiveRecordの規約調べてみた。（ActiveRecord::SubclassNotFound:   Invalid single-table inheritance type）

# Railsで以下のエラー

```
ActiveRecord::SubclassNotFound: Invalid single-table inheritance type
```

# 結果

```type``` は予約後でした。。。

# ついでに(ActiveRecord命名規約とスキーマ規約)

## 命名規約

### モデルクラス

キャメルケース(PostAuthor)

### テーブル、スキーマ

スネークケース(post_author)

## スキーマ規約

### 外部キー
(単数形テーブル名)_id(例: item_id、order_id)

### 主キー

デフォルトでは自動生成されるid
変更もできる。

```rb:migration_file
def change
  create_table :author, id: false do |t|
  ...  
end
```

```rb:model
self.primary_key = :name
```

### created_at
作成時に現在の日時を取得して登録

### updated_at
更新時に現在の日時を取得して登録・更新

### lock_version
楽観的ロックをかける
(ユーザAとユーザBが編集画面を開いていて、ユーザAが先に更新していた場合、ユーザBの更新は失敗する。)

### type

単一テーブル継承
(同じような機能のテーブルは１つのテーブルで実現しよう、それでtypeを使って分類すればいいよねってやつ)

### (関連名)_type

ポリモーフィック関連
(違う親を持つけど、どっちもあるテーブルこれを使ってるって場合！例えば、companyとuserで同じimageテーブルを使うとか...typeでcompany_idを指すか、user_idを指すかを決めようねってやつ)

### (テーブル名)_count

関連付けられたオブジェクトの数をキャッシュ。

# 参考

Activeレコードの基本 | Rails日本語ドキュメント | Ruby STUDIO
http://ruby.studio-kingdom.com/rails/guides/active_record_basics
Rails4 - Railsで規約に沿わない古いデータを扱う - Qiita
http://qiita.com/k-shogo/items/884498ad512c0e6eb303
ActiveRecordによる楽観的ロック | Ruby on Rails 備忘録 - Ride On Rails
http://rubyonrails.gachinko.org/3-2/lock_optimistically/
【Rails】ActiveRecord：単一テーブル継承(sti)とポリモーフィック関連を未だにぱっと思い出せないのでまとめ。 - 記すに足らず。
http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173742
Why Web Scraping

Data extraction has many benefits. It keeps you abreast with the latest prices that are being offered for the products of your domain and the list of the vendors that are offering the same. You can then study the same and set your prices accordingly, based on competition and brand proposition. It also helps by informing you when the product description changes so even if you miss out on something, you can always bring yourself up to speed. Extraction gives you valuable insights about your competition and grants you unprecedented market knowledge, which are the two most essential tools to help you become market leaders in your industry.


If you wish to <a href="http://www.loginworks.com/our-services/web-scraping/">extract data from website</a>, you have two options. You can choose to do it in-house or you could hire a company to do the same for you, which includes outsourcing.
boost::variantでポリモーフィズムっぽい変なことをする

変な動的分岐をします
visitorでtemplateを使うことがポイントです

```
#include <iostream>
#include <string>
#include <boost/variant.hpp>

class TypeA {
public:
  std::string toString() const {
    return "TypeA";
  }
};

class TypeB {
public:
  std::string toString() const {
    return "TypeB";
  }
};

class VariantType {
public:
  template <class T>
  VariantType &operator=(const T &value) {
    _value = value;
    return *this;
  }

  struct ToStringVisitor : public boost::static_visitor<std::string> {
    template <class T>
    std::string operator()(const T &arg) const {
      return arg.toString();
    }
  };
  std::string toString() const {
    return boost::apply_visitor(ToStringVisitor(), _value);
  }

private:
  boost::variant<TypeA, TypeB> _value;
};

int main(int argc, const char *argv[]) {
  VariantType v1;
  VariantType v2;

  v1 = TypeA();
  v2 = TypeB();

  std::cout << v1.toString() << std::endl;
  std::cout << v2.toString() << std::endl;

  return 0;
}
```

出力：
TypeA
TypeB
Facebook Flow で Hello, world!

Facebook Flow 出ましたねー♪

とりあえず, [公式サイト](http://flowtype.org/)にある[Five simple examples](http://flowtype.org/docs/five-simple-examples.html#_) ってやつをやって,
ちゃんとチェック出来るんだよアピールを一通り受けたのでスタートアップ環境作ってみました.

Github で公開してます. check したり compile したりできます.

[hello-flow](https://github.com/phi-jp/hello-flow)

![flow-logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/7756/9ac96f9a-a888-7738-f4dc-c2bab4c54dc9.jpeg)


## flow って何？

ざっくり言うと Facebook 製の TypeScript って感じですかね？
とはいえちゃんとしたコンパイラを提供しているわけではないので, JSLint みたいな
code checker 的な位置づけなのだろうか？ 今のところ.

見た感じだと AltJS によくある機能は一通り入ってて
ちょっと型に強いって印象です.

[Top](http://flowtype.org/) にあるように

```js
/* @flow */
function foo(x) {
  return x * 10;
}
foo('Hello, world!');
```

は foo 内で * 演算子を使っているのできっと引数 x は数値だろうと
判定して, 文字列を渡して実行するとエラーを吐いてくれます.

とはいえ型に強いわりには型による関数オーバーロードサポートしてなかったりするので
型否定派の自分にはおそらく刺さらないだろうなぁw


## flow をインストールしよう

zip ダウンロードしてパス通す方法もありますが,
自分は Homebrew でインストールしました.

```bash
$brew install flow
```

これで `flow` コマンド使えるようになります.


## flow でチェック

コードの頭に

```js
/* @flow */
```

と書くと flow のコードとして認識します.

`flow` を使ってコードチェックできます.
文法的に間違えてたり定義していない変数使ってたりするとエラー出してくれます.

```bash
flow check
```

カレントディレクトリにある .flowconfig を見てチェックしてくれるみたいです.
詳しくはこちら -> [Link](http://flowtype.org/docs/advanced-configuration.html#_)

hello-flow の

```bash
$./check.sh
```

で試せます.

## flow のコードをコンパイル

今今は react-tools 使ってやるみたいです.
npm でグローバルインストールしちゃいましょう.

```bash
$npm install -g react-tools
```

これで `jsx` コマンドが使えるようになります.(Adobe や DeNA の jsx じゃないよw)

下記のコマンドは src フォルダにある flow のファイルをコンパイルして build に出力する例です.

```bash
$jsx --strip-types --harmony src/ build/
```

hello-flow の

```bash
$./build.sh
```

で試せます.

## flow を触ってみて

まだ動かしてみてざっくり見てみただけなので
下手なことは書かないですmm

詳しくは [@mizchi](http://qiita.com/mizchi/items/d50fbdd8c2dcd01c38f9) san や [@vvakame](http://qiita.com/vvakame/items/53a464681920e6c55b31) san が書いてるのでそちらへ♪

自分は, [runstant](http://phi-jp.github.io/runstant/release/alpha/) で flow 動かせるようにしたいので js runtime が出るのを気長に待つのみです...
AndroidのWebViewのバージョンをCrashlyticsに投げる

## Android 5.0（Lollipop）以降のWebView
Android 4.4 （KitKat）までは、WebViewがOSに組み込まれていたので、
Chromiumのバグがあった場合、その修正や機能追加などは、
OS自体のアップデートをする必要がありました。
Android 5.0（Lollipop）以降では、[ここ](http://developer.android.com/about/versions/lollipop.html?utm_source=ausdroid.net#WebView)にもあるとおり、
WebViewがOSから切り離され、Google Play ストア経由で
「Android System WebView」としてアップデートできるようになりました。

## クラッシュレポート
今までWebViewを使っているアプリでは、
```デバイス　✕　OSのバージョン```
上記のパターンでバグの再現条件の調査を行うことができましたが、今後は
```デバイス　✕　OSのバージョン　✕　Chromiumのバージョン```
上記のようにChromiumのバージョンも考慮しなければならない可能性があります。

Androidアプリのクラッシュレポートを取得するサービスとして有名な[Crashlytics](https://crashlytics.com/)では、
標準でデバイスやOSのバージョンなどを取得することはできますが、
WebViewで用いられているChromiumのバージョンを取得することはできません。

Crashlyticsは[カスタムキーを設定してログを残すことができる](http://support.crashlytics.com/knowledgebase/articles/120055-how-do-i-use-custom-keys-)ので、これを使って
クラッシュ時にWebViewのUserAgentを合わせてCrashlyticsに投げるようにします。

## 実装
WebViewのUserAgentをパースするために、
gradleを使って導入できたので、[Woothee](https://github.com/woothee/woothee-java)を使います。
準備はbuild.gradleのdependenciesに
```compile 'is.tagomor.woothee:woothee-java:1.0.0'```
を追加してbuildするだけです。

たとえば下記のようなクラスを用意して、

```java:CrashlyticsUtils.java
package com.example.log;

import com.crashlytics.android.Crashlytics;
import java.util.Map;
import is.tagomor.woothee.Classifier;

public class CrashlyticsUtils {
    public CrashlyticsUtils() {
        throw new AssertionError();
    }

    private static final String NAME       = "name";
    private static final String OS_VERSION = "os_version";
    private static final String CATEGORY   = "category";
    private static final String OS         = "os";
    private static final String VENDOR     = "vendor";
    private static final String VERSION    = "version";

    public static void setUserAgent(final String userAgentString) {
        Map<String, String> userAgent = Classifier.parse(userAgentString);
        Crashlytics.setString(NAME, userAgent.get(NAME));
        Crashlytics.setString(OS_VERSION, userAgent.get(OS_VERSION));
        Crashlytics.setString(CATEGORY, userAgent.get(CATEGORY));
        Crashlytics.setString(OS, userAgent.get(OS));
        Crashlytics.setString(VENDOR, userAgent.get(VENDOR));
        Crashlytics.setString(VERSION, userAgent.get(VERSION));
    }
}
```

それをWebViewをもつクラスから実行すれば、クラッシュした際に
WebViewのUserAgentを合わせて取得することができます。

```java:MainActivity.java
String userAgentString = webView.getSettings().getUserAgentString();
CrashlyticsUtils.setUserAgent(userAgentString);
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/13302/767c5a55-04fd-4d9b-a860-b8c7b26e86e4.png)
Web Scraping Facts

<a href="http://www.loginworks.com/our-services/web-scraping/">Web scraping</a> has become one of the web data harvesting services commonly used by businessmen and individuals. Many people have not yet understood much about this service. This article explores the true facts about web scraping service and about our services at loginworks. In this article we have defined all about web scraping and further have detailed what why web scraping is important in eve![uploading smallor big data needs.png...]()
ry sector in the economy and welfare. We have also gone further to clear the fluff about the legality of web scraping services.

<b>Web scraping Defined</b>

web scraping can be simply is regarded as data harvesting from web pages. We can therefore define it has a technique that is both programmable and manual collection of data from targeted websites for a wide variety of uses. With our web scraping services it the collected data can be used for a number of purposes. The internet has been regarded as the single largest source of data and therefore the technique of harvesting this data should be left to professionals so as the client to reap the full benefits that can be accrued from such information. Web scraping is commonly used to collect data from websites which do not offer RSS or open API. With our web scraping service we are able to work even on password protected web page.
Advantages of Web Scraping 

Web scraping is a method of extracting information from various websites. Web scraping is also known as web harvesting. Web scraping implements low level HTTP for its process. It is an alternative to human being exploration to various sites. It is somewhat similar to web harvesting. The only difference is, in web harvesting bots are used to extract informa![abstract.jpg](https://qiita-image-store.s3.amazonaws.com/0/60094/83c40815-05e7-aa85-7594-4954e0b63486.jpeg)
tion from various sites. Bots perform task quite fast. There is no such bots in web scraping.
In fact, for web harvesting, efficient web browsers like Mozilla Firefox and Internet Explorer can be used to extract the information. But these are just the alternative and are not widely used. On wider scale, bots are used to extract the information rather than going for the website explorer.
Enumerator.each_sliceはArrayのEnumeratorなのでメモリに注意

ログファイルの処理をしていて，メモリに載せるのがまずいからEnumeratorを使うことがよくある．けれどeach_sliceを不用意に使ったせいでメモリオーバーしてしまったのでメモ．

起きた問題
===========

ちゃんと意識すれば当たり前なのだが

``` 
pry(main)> (1..100000000000000000000000000).each_slice(1000000000000000000){|slice| slice.each{|item| p item} }
NoMemoryError: failed to allocate memory
```
こうなる．classをチェックすると

```
pry(main)> (1..100).each_slice(10).class
=> Enumerator
pry(main)> p (1..100).each_slice(10).map(&:class)
=> [Array, Array, Array, Array, Array, Array, Array, Array, Array, Array]
```
なので，各sliceはメモリ上に展開されることがわかる．メモリに制約がある状況ではEnumeratorのEnumeratorであってほしい．ということで雑だけど以下のコード

解決策
==========
Enumerator::LazyのメソッドとしてEnumeratorのEnumeratorを返すslicesメソッドを作ってみる

 **注意: 以下の実装は使い方次第で無限ループに入る**

```rb
class Enumerator::Lazy
  def slices(size)
    Enumerator.new do |parent_yielder|
      begin
        while true
          parent_yielder << Enumerator.new do |child_yielder|
            (0...size).each do |_|
              child_yielder << self.next
            end
          end
        end
      rescue StopIteration
      end
    end
  end
end
```

これで大きなサイズのsliceも扱える

```
pry(main)>(1..100000000000000000000000000).lazy.slices(1000000000000000000).each{|slice| slice.each{|item| p item} }
=>
1
2
3
...
```

この実装の問題
==============

### 下位のEnumeratorの評価に上位のEnumeratorに依存するので，上位だけ評価すると無限ループ

```
(1..100).lazy.slices(10).each{|slice| p slice }
=> おわらない
```

これは，下位のExceptionを使って止めるんじゃなくて，上位でも独自にサイズをカウントすればまぁ防げる．ただし２重に評価するので2倍時間かかる

### 下位のEnumerator同士も評価順によって値が変わる

```
source = (1..100).map.slices(10)
child1 = source.next
child2 = source.next

p child1.next
=> 1
p child1.next
=> 2
p child2.next
=> 3
```

### どうすりゃいいんだろう…

状態を保ったままEnumeratorをdupすることができれば，親側で消費しながら子を作ってくことができるので解決するが，Enumerator.dupは禁止されている．

```
(0..size).each{|_| self.next()}
child = self.dup
parent << child
# ↑できない
```
YAMLならDBのテストデータ作成はこんなに簡単！ with FuelPHP

こんにちは！　テストコード書いてますかー！

ボクらのサービス[「アプリヘルプ」](http://www.applihelp.com/)、[「ファイナルアイズ」](http://finaleyes.flexfirm.jp/)ではFuelPHPを使ってテストコードをガシガシ書いているのですが、テストのためのデータベースのデータを用意するのって面倒ですよね。

その際によく使われるのは昔ながらのDBUnit系のツールでしょうか。最近のフレームワークを使っているのであれば、便利なテキストフォーマット変換のクラスが用意されているので、それを活用すると簡単にテストデータを記述することができちゃいます。

## Format クラスを活用

FuelPHP の Format クラスを使うと JSON や YAML、XML、php array などに相互変換できます。これを利用して YAML でテストデータを定義してDBへインサートすることが可能です。

なぜ YAML かって？ 記述が楽だからです。XMLみたいにタグもいらないですし、JSONのようにクォーテーションの記述も不要です。

参考）FuelPHP の Formatクラス
http://fuelphp.jp/docs/1.7/classes/format.html

### YAMLのデータ定義

YAMLでのデータ定義のサンプルです。とってもシンプル。

```yaml:sample.yml
company:
	- id: 1
	  name: 海山商事
	  address: 東京都渋谷区渋谷1-1-1
	  tel: 03-1111-1111
	  created_user: 99

employee:
	- id: 1
	  company_id: 1
	  name: 磯山マスオ
	  age: 30
	  created_user: 99

	- id: 2
	  company_id: 1
	  name: 磯山サザエ
	  age: 30
	  created_user: 99
```

### TestCaseを拡張

TestCase を拡張して YAML をインサートするメソッドを用意しましょう。

```php:テストクラスの親クラス
use Fuel\Core\DB;
use Fuel\Core\TestCase;
use Fuel\Core\Format;

class UnitTestCase extends TestCase {

	public function setUp() {
		DB::start_transaction();
	}

	public function tearDown() {
		DB::rollback_transaction();
	}

	/**
	 * 指定したファイルのデータをデータベースへ登録します。
	 *
	 * @param string $yaml_filepath yamlフォーマットで記載したデータファイル名
	 */
	public static function initializeData($yaml_filepath) {
		$data = file_get_contents($yaml_filepath);
		$tables = Format::forge($data, 'yaml')->to_array();

		// データの挿入
		foreach (array_keys($tables) as $table_name) {
			$rows = $tables[$table_name];

			foreach ($rows as $row) {
				try {
					DB::insert($table_name)->set($row)->execute();
				}
				catch (Exception $e) {
					DB::rollback_transaction();
					throw $e;
				}
			}
		}
	}
}
```

### テストクラス

こちらが実際にテストを記述するテストクラス。

```php:テストクラス

class SampleUnitTest extends UnitTestCase {


	public function setUp() {
		parent::setUp();

		// テストデータ登録。YAMLファイルをフルパスで指定。
		parent::initializeData(APPPATH . '/sample.yml');
	}

	/**
	 * @test
	 */
	public function hoge() {
		// テストコード
	}
}

```

これで、さらにガシガシテストが書けますね！
tmuxのwindow名をカレントディレクトリにする

zsh限定.

add-zsh-hookを使って `tmux rename-window` する．

```zsh:.zshrc
autoload -Uz add-zsh-hook

function rename_tmux_window() {
   if [ $TERM = "screen" ]; then
       local current_path=`pwd | sed -e s/\ /_/g`
       local current_dir=`basename $current_path`
       tmux rename-window $current_dir
   fi
}

add-zsh-hook precmd rename_tmux_window
```
rbenvのバージョンリストを更新する


最近Rubyの2.1.5がリリースされたので、
インストールしようと思ったのですが、
rbenvのインストールリストを見ても2.1.5がでなかったので、
対応方法をメモしておきます。


```
cd ~/.rbenv/plugins/ruby-build
git pull
```

これだけです。
これでバージョンリストが更新され、2.1.5がインストールできるようになりました。

```
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.8.7-p371
  1.8.7-p374
  1.8.7-p375
  1.9.1-p378
  1.9.1-p430
  1.9.2-p0
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.2-p326
  1.9.2-p330
  1.9.3-dev
  1.9.3-preview1
  1.9.3-rc1
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-p327
  1.9.3-p362
  1.9.3-p374
  1.9.3-p385
  1.9.3-p392
  1.9.3-p429
  1.9.3-p448
  1.9.3-p484
  1.9.3-p545
  1.9.3-p547
  1.9.3-p550
  1.9.3-p551
  2.0.0-dev
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.0.0-p0
  2.0.0-p195
  2.0.0-p247
  2.0.0-p353
  2.0.0-p451
  2.0.0-p481
  2.0.0-p576
  2.0.0-p594
  2.0.0-p598
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.0
  2.1.1
  2.1.2
  2.1.3
  2.1.4
  2.1.5
  2.2.0-dev
  2.2.0-preview1
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.6.8
  jruby-1.7.0-preview1
  jruby-1.7.0-preview2
  jruby-1.7.0-rc1
  jruby-1.7.0-rc2
  jruby-1.7.0
  jruby-1.7.1
  jruby-1.7.2
  jruby-1.7.3
  jruby-1.7.4
  jruby-1.7.5
  jruby-1.7.6
  jruby-1.7.7
  jruby-1.7.8
  jruby-1.7.9
  jruby-1.7.10
  jruby-1.7.11
  jruby-1.7.12
  jruby-1.7.13
  jruby-1.7.14
  jruby-1.7.15
  jruby-1.7.16
  jruby-1.7.16.1
  jruby-9.0.0.0-dev
  jruby-9.0.0.0+graal-dev
  jruby-9000-dev
  jruby-9000+graal-dev
  maglev-1.0.0
  maglev-1.1.0-dev
  maglev-2.0.0-dev
  mruby-dev
  mruby-1.0.0
  rbx-1.2.4
  rbx-2.0.0-dev
  rbx-2.0.0-rc1
  rbx-2.0.0
  rbx-2.1.0
  rbx-2.1.1
  rbx-2.2.0
  rbx-2.2.1
  rbx-2.2.2
  rbx-2.2.3
  rbx-2.2.4
  rbx-2.2.5
  rbx-2.2.6
  rbx-2.2.7
  rbx-2.2.9
  rbx-2.2.10
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev
```