OmniAICreator/Qiita-1.07M huggingface dataset:
facebook/flowファーストインプレッション

前々から出すよ出すよ詐欺してたflowがやっと出た。大雑把にはfacebook製のTypeScriptだと思っていれば良いです。


まだnpmで提供されてなくて、 [Flow | Getting started with Flow](http://flowtype.org/docs/getting-started.html#_ "Flow | Getting started with Flow")
で実行バイナリが配られてる。

 npmで提供されてない理由は、たぶんocamlで書かれてるから。Future Planにjs_of_ocamlでコンパイルされたものが提供されると書いてあった。


DLして適当なパス通った場所に置いてつかう。

```
cp ~/Downloads/flow/flow ~/bin
```

## TypeScriptとの比較

思想はTypeScriptと同じなので、大枠は一緒だといってよい。
ぱっと見気になったのは、Nullableの書式が違うのとかあるけど、もっと大きな違いもたくさんある。

### FlowとTypeScriptにあるもの

- declareキーワードによるアノテーション
- ES6 classes
- Generics

ここらへんは共通

### Flowにあるもの

- 高速なオンラインコンパイラ
- Union Type
- type aliases
- React JSX連携
- jsdocコメントが読める


とくに一番大きな差はunion types

```
/* @flow */
var x: number | string = 0;
```

とはいえこれはtypescript1.4でも入る予定だった気がする。

Type Alias

```
/* @flow */
type T = number;
var x: T = 0;
```

こういうやつ。

たぶん組み合わせて


```
type T = number | string
```

とかけると思うしGADTSっぽい何かができるのでは。



### Flowにないもの

- ES6 module
- npm package

つまり現時点でTypeScriptとFlowは互換ではない。とくにES6 moduleの差は大きいようにみえる。typescriptのコードはmodule使わずに書かれていないものはほぼないので。



## 名前空間解決

TypeScript は `///<reference path='' />` で参照するコードを指定していたけどFlowの名前空間は commonjs requireで require('path/to/file') した先の型を読んでる模様。browserify/node.jsフレンドリー。node派には嬉しい。

## Future Plan

気になったもの抜粋

- TypeScriptのd.tsの変換ツール
- js_of_ocamlでコンパイルしたjsの提供(npm install flowとかするため)
- エディタ連携
- ErrorTraceを賢く
- ES6 module

## 雑感

TypeScriptはは常にまるごとコンパイルするが、ファイル単体が変更されたときに依存性を解析してそのファイルをコンパイルする。これが大きな違い。

TypeScriptは名前空間がグローバルベースでcommonjs requireベースで解決する運用が苦手だった印象があるが(-m commonjs時とその他の互換がなかったりとか)、Flowはそこが強い印象。

基本的にTypeScriptとの互換はないものと考えたほうが良い。将来的にFeatureがそろって(とくにmodule)相互運用するにしても、相当な縛りがないと動かないはず。

自分は最近Atom Shell環境で生きてるんでflow使おうかなって気になってる。
MacのSSHクライアントで接続したサーバから切断されないようにするために、Moshをインストールしてみた


## 背景

[MacのSSHクライアントで接続したサーバから切断されないようにする](http://qiita.com/yuji0602/items/7dd1a1d05dcafa165992)というエントリーを書いたのですが、[@yuzuemon](https://twitter.com/yuzuemon)さんにMoshは如何ですかとおすすめして頂いたのでメモ。

## 調査

Macを使っているので「mosh mac」で検索すると、[SSHより速い！モバイル環境向けリモートログインツールのMosh - Macとかの雑記帳](http://tukaikta.blog135.fc2.com/blog-entry-210.html)というところにたどり着き、手順に従ってみました。


```
Mosh（Mobile Shellの略）は、Wi-Fiや3G回線等のモバイル環境に適応した、SSHのようなソフトです。「ローミング可」「接続が断続的であってもOK」「高速なローカルエコー」といった特徴を持っています。

回線の切断や長時間のスリープ後でもセッションが切れることが無く、すぐに作業を再開できます。また、入力が早くてもスクリーンが固まったりしません。
```

素敵ですね。

## Moshのインストール

### Mac側

Homebrewでインストールします。

```
$ brew install mobile-shell
```

### Ubuntu側

apt-getでインストールします。

```
$ sudo apt-get install mosh
```

また、60000~61000のUDPポートを許可します。

```
$ sudo ufw allow 60000:61000/udp
```

## MacからUbuntuに接続

sshを使うような感じで接続します。

```
$ mosh サーバ側のアカウント名@サーバのアドレス
```

## 使ってみた感想

夜に家からmoshでサーバに接続した状態でMacをスリープ状態にし、次の日に出社してMacを開いたのですがそのまま接続状態となっていました。
[@yuzuemon](https://twitter.com/yuzuemon)さん、ありがとうございます！

## 参考にしたサイト

* [SSHより速い！モバイル環境向けリモートログインツールのMosh - Macとかの雑記帳](http://tukaikta.blog135.fc2.com/blog-entry-210.html)
* [Mosh](https://mosh.mit.edu/)
gnuplot でおっぱい

# 発端
twitter を眺めていたら以下のツイートを発見しました．

<blockquote class="twitter-tweet" lang="en"><p>某工大の叡智の結集 <a href="http://t.co/TBhRfTsNrn">pic.twitter.com/TBhRfTsNrn</a></p>&mdash; T s u z u k i (@ttzux19) <a href="https://twitter.com/ttzux19/status/529556914342871040">November 4, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

`Mathematica` で美しいおっぱいを再現したもので大変素晴らしい完成度です．しかし，このままではこの素晴らしいおっぱいを堪能するために `Mathematica` が必要です．`Mathematica` は大変素晴らしいソフトですが高価でもあります．おっぱいを堪能するために `Mathematica` を購入するわけにはいかないでしょう．この素晴らしいおっぱいをより多くの方に堪能してもらうため，このプロットを `gnuplot` で再現することを決めました．

# おっぱいプロットの作成
幸いなことに発端となったツイートの画像には数式とプロットすべき範囲が記述してありました．そこで，この式をそのまま使わせてもらうことにしました．しかしながら，`Mathematica` では surface のライティングを設定できるのに対して僕が使用する `gnuplot-4.6` にはそのような機能はついていません．そこで palette を微調整して z 方向の高さで色を付けることにしました．そうして作成したスクリプトがこちらです．

````gnuplot:oppai.gp
#!/usr/local/bin/gnuplot -persist
set terminal wxt 0 enhanced font ",24"
unset key
set view 53, 317, 1, 1
set isosamples 60, 60
set title "{/Symbol p} in gnuplot" 
set title  offset character 0, 0, 0 font "" norotate
set xrange [ -2.5 : 2.5 ]
set yrange [ -2.5 : 2.5 ]
set xtics format ""
set ytics format ""
set ztics format ""
set cbtics format ""
set palette define (-1 '#d66939', 0.4 '#eecdc0', 0.6 "#f4dfcf", 1 'red')
set hidden3d
func(x,y) = 1./8.*( \
  3./2.*exp(-exp(10)*(4*y**2/9.+(2*abs(x)/3.-1)**2)**2) \
  + exp(-(exp(1)*(4*y**2/9.+(2*abs(x)/3.-1)**2)**2)) \
  + 8*exp(-1./9.*4*y**2-1./3.*(2*y/3.+0.5)**3 - (2*abs(x)/3.-1)**2) \
  + 5*y/3. - 16*x**4/81. )
splot func(x,y) w pm3d t "{/Symbol p}"
#    EOF
````

このスクリプトは Ubuntu 14.04 でコンパイルした `gnuplot-4.6 patch 6` で実行することを念頭に入れて作成しました．もしかしたら palette に与えている詳細なパラメタは環境に依存してしまうかもしれません．

![pi.png](https://qiita-image-store.s3.amazonaws.com/0/46396/84295240-27e9-c5b7-9e00-f63822795823.png)

WXT terminal での 3D プロットなので自在に動かすこともできます． gif 動画をはてなフォトライフにアップロードしたので参考にしてください．

- [おっぱい.gif - はてなフォトライフ](http://f.hatena.ne.jp/xr0038/20141104210327)


# 参考資料
- [T s u z u k i on Twitter: "某工大の叡智の結集 http://t.co/TBhRfTsNrn"](https://twitter.com/ttzux19/status/529556914342871040)
- [どせい on Twitter: "全力を尽くした http://t.co/HnaW8wW8Ix"](https://twitter.com/xr0038/status/529599383856111616/)
- [個別「全力を尽くした」の写真、画像、動画 - xr0038's fotolife](http://f.hatena.ne.jp/xr0038/20141104210327)
Objective-cプロジェクトをswiftで書き直すことに②


今回は、storyboardの使います。既存のプロジェクトでは、すべてxibを使って実装していましたが、
いい機会なので、storyboardを使うことにします。

結構凝った画面遷移を実現するため、すべてをstroyboardで実現するのは無理があるので、
１画面、1storyboardで実装していきます。

この方法、共同開発の場合に画面ごとに担当すれば、
storyboardのコンフリクトを防げるため、一石二鳥です。

##storyboardの新規作成
まずは、storyboardを新規作成します。
ここに、ViewControllerをドラックアンドドロップします。

テストように、UILabelを１つ追加してみました。


![スクリーンショット 2014-11-11 22.50.24.png](https://qiita-image-store.s3.amazonaws.com/0/25562/cb792fe2-47f9-f80e-a86b-d3c57888050d.png "スクリーンショット 2014-11-11 22.50.24.png")


で、ここで重要なのが、 `is initial view controller` です。
これをつけることで、このviewControllerがstoryboardの初期のviewだよって教えてあげます。
これをつけると、viewControllerの右に矢印が付いたのがわかるとおもいます。

![スクリーンショット 2014-11-11 22.52.42.png](https://qiita-image-store.s3.amazonaws.com/0/25562/1c951461-ba1e-4d9a-b8bf-c2b563d90a72.png "スクリーンショット 2014-11-11 22.52.42.png")


## 実装

実装は簡単でした。まだ、引数の引き渡しなどはなにも行っていません。
遷移したいviewに、


```swift
var story = UIStoryboard(name: "HogeViewController", bundle:nil);
let view:AnyObject = story.instantiateInitialViewController();
self.presentViewController(view as UIViewController, animated: true, completion: nil)
```

`HogeViewController`というのは、ストーリーボードのファイル名です。

ちょっとはまったのが、
`story.instantiateInitialViewController();`がAnyObjectという方で返してきます。
これを、`presentViewController`の第一引数に渡さないといけないのですが、
第一引数の方はもちろん、`UIViewController`です。
なので、キャストしてあげました。

もっといいやり方をご存知でしたら、教えてください。

##実行

無事表示されました☆*:.｡. o(≧▽≦)o .｡.:*☆
vimでペーストする際に、自動でpaste modeにする方法のメモ

vimでpasteを行うと、自動的にインデントがかかり、盛大に崩れてしまってしまう事がある。

そんな時は、都度autoindentを無効にしたり

```
:set noautoindent
```

都度paste mode にしたり

```
:set paste
```

:a! を使う方法があるらしいです。

```
":a!"
ペースト
エスケープキー
```

とはいえ、都度キーを打つのは面倒なので、自動化したいです。

## 自動化の方法
### .vimrcに直接書くパターン
```
if &term =~ "xterm"
    let &t_ti .= "\e[?2004h"
    let &t_te .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    noremap <special> <expr> <Esc>[200~ XTermPasteBegin("0i")
    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
    cnoremap <special> <Esc>[200~ <nop>
    cnoremap <special> <Esc>[201~ <nop>
endif
```

### pluginのパターン
* [ConradIrwin/vim-bracketed-paste](https://github.com/ConradIrwin/vim-bracketed-paste)

```
cd ~/.vim/bundle
git clone https://github.com/ConradIrwin/vim-bracketed-paste

or

NeoBundle 'ConradIrwin/vim-bracketed-paste'
```

どちらの場合も、bracketed paste modeに対応しているターミナルである必要があるみたいです。

>You need to be using a modern xterm-compatible terminal emulator that supports bracketed paste mode. xterm, urxvt, iTerm2, gnome-terminal (and other terminals using libvte) are known to work.



### 参考
* [vimでペーストするときインデントさせない - Qiita](http://qiita.com/quwa/items/019250dbca167985fe32)
* [vimで貼付け時に自動でpasteモードにする - Qiita](http://qiita.com/ringo/items/bb9cf61a3ccfe6183c7b)
* [ConradIrwin/vim-bracketed-paste](https://github.com/ConradIrwin/vim-bracketed-paste)
AngularJSでCookieに有効期限(expires)を設定する

AngularJSの標準の$cookiesでは有効期限(expires)を設定できないので、代わりにjquery.cookieを使って設定します。

```html:index.html
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script>
```

jquery.cookieのラッパークラスを作りました。これで、[モジュール名].Cookie.getで使用できるようになります。

```js:Cookie.ts
/// <reference path="../../reference.ts" />
module [モジュール名] {
    /**
     * jquryを使ったCookieラッパークラス
     */
    export class Cookie {
        /**
         * 取得する
         * @param key キー
         * @returns string 値
         */
        public static get(key:string):string {
            return $.cookie(key);
        }

        /**
         * 設定する
         * @param key    キー
         * @param value  値
         * @param expire 有効期間(日数)
         */
        public static set(key:string, value:string, expire:number = 0):void {
            $.cookie(key, value, { expires: expire });
        }
    }
}
```

使用例としてはこんな感じです

```js:app.ts
var locale = [モジュール名].Cookie.get("locale");
if(locale == undefined) {
    locale = "ja_JP";
    [モジュール名].Cookie.set("locale", locale, 36500);
}
```

※[モジュール名]は適宜変更してください
 WATCH の開発ツール WatchKit が公開されました

<img width="550" src="https://qiita-image-store.s3.amazonaws.com/0/10941/9622eef1-5b10-93a5-65ee-75f0a8998674.png">

## [Apple Watch](https://www.apple.com/jp/watch/) とは

- [9月のイベント](http://www.apple.com/live/2014-sept-event/)で発表された Apple 製ウェアラブルデバイス

- 競合は、[Moto 360](https://moto360.motorola.com) などの [Android Wear](http://www.android.com/wear/) 端末

## 注意点

-  WATCH は、単体では使えません
	- 母艦として iPhone などが必要です
	- Android Wear と一緒
-  WATCH アプリは、単体アプリとしては開発できません
	- 既存 iOS アプリにバンドルされる Extension としての扱いになります
	- Android Wear アプリと一緒

## Watch アプリの構成要素

Watch App / Glance / Notification の３つの構成要素があります。

![スクリーンショット 2014-11-19 午前7.51.56.png](https://qiita-image-store.s3.amazonaws.com/0/10941/db271874-66b3-42fb-5a54-5e78bc0e056c.png "スクリーンショット 2014-11-19 午前7.51.56.png")

### Watch App
  - Apple Watch のホーム画面に追加させるアプリ本体
  - 専用の UI を持たせることができます

### Glance
  - Read-Only の１画面の情報表示用 UI
  - optional

### Custom Notification
  - インタラクティブな Notifiation
  - optional

## Architecture & Lifecycle

![スクリーンショット 2014-11-19 午前7.56.35.png](https://qiita-image-store.s3.amazonaws.com/0/10941/ec0c5b9f-5b55-8db3-ece8-b933c3f2d51e.png "スクリーンショット 2014-11-19 午前7.56.35.png")

![スクリーンショット 2014-11-19 午前8.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/10941/8f170484-daa7-5772-2617-2d5d70b40ede.png "スクリーンショット 2014-11-19 午前8.01.59.png")


## 実際につくってみよう

### 必要なもの

- [Xcode 6.2 Beta](https://developer.apple.com/xcode/downloads/) が必要です

### ターゲットの追加

iOS 8 の Today Widget と同じように、既存アプリの別 target として追加します。

![スクリーンショット 2014-11-19 午前7.09.50.png](https://qiita-image-store.s3.amazonaws.com/0/10941/4a9e1b92-5d26-e0ae-4e79-15a3d8dfbc12.png "スクリーンショット 2014-11-19 午前7.09.50.png")

![スクリーンショット 2014-11-19 午前7.18.27.png](https://qiita-image-store.s3.amazonaws.com/0/10941/10aa3b04-a4b0-ff02-c895-2257632ed9ea.png "スクリーンショット 2014-11-19 午前7.18.27.png")

Watch App のシミュレーターは、iOS Simulator > Hardware > External Displays > Apple Watch を選択することで表示できます。

![スクリーンショット 2014-11-19 午後0.36.25.png](https://qiita-image-store.s3.amazonaws.com/0/10941/a4fcd871-d278-bc24-cec0-da0cbd67dc26.png)


### 本体アプリとのデータ・コードの共有

別ターゲットとして追加された Watch App と、本体アプリの間では、データやコードが共有されません。

データを共有するには Today Widget と同じように、App Group を使って共有された NSUserDefaults を介する必要があってなかなか厄介です。

クラスを共有したい場合は、共通して使いたいクラスを切り出して [Framework](https://developer.apple.com/videos/wwdc/2014/#416) にする必要があります。


### See Also

WatchKit Programming Guide
https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/index.html#//apple_ref/doc/uid/TP40014969-CH8-SW1


## おわりに

Apple Watch も Android Wear も、「スマートフォンのユーザー体験を延長（Extend）する」という設計思想が見てとれます。

ウェアラブル端末では、情報を小さな塊にして適切なタイミングで通知し、そこから先の操作はアプリに誘導するという使い方になると思います。

市場として捉えられるようになるのはまだまだ先だと思いますが、こういう未来は常にキャッチアップしていきたいですね。
Octaveでmatrix内の行をrandomに並び替える方法

```
>>P = [1,2;3,4;5,6;7,8;9,10]
P =

    1    2
    3    4
    5    6
    7    8
    9   10


>>iP = randperm(length(P))
iP =

   4   2   5   1   3


>>P(iP,:)
ans =

    7    8
    3    4
    9   10
    1    2
    5    6

```
オブジェクト指向3ナイ運動

はじめに
---

昔、3ない運動といって、高校生はバイクを買わせない、乗らせない、免許取らせない、ということになっていました。まあそんなの関係なく乗ってるヤツは乗ってましたけどね。まあよくある、老害による余計なお世話ってやつです。

というわけで、オブジェクト指向の3ない運動を始めてみました。しょせん老害の戯言なので、若い子は無視してヒャッハーしてください。

1.  オブジェクトのメソッドを呼び出さない
---

オブジェクトのメソッドを外部から勝手に呼び出すことは、誰かの手足を握って無理やり動かして仕事させるのと同じぐらいダメダメです。オブジェクトにはメッセージを投げて「お願い」をしましょう。そしたらそのオブジェクトがそのメッセージに対応するメソッドを持っていたらたぶんそのメソッドを使ってメッセージを処理してくれるし、なかったらなかったで、何かしらのことをしてくれます。「わかりません」と答えるとか。そしたら頼んだ人が「じゃいいです」と言って別のこと始めるかもしれないし、「こうやれ」とか言ってそのメッセージを処理する具体的な「方法」を教えてあげるかもしれません。

個々のオブジェクトは1個のアイデンティティを持つオブジェクトとして尊重されます。基本的オブジェクト権です。勝手に脳みその中のアドレスにjmpしないでください。

はい、単なる言葉尻の問題です。でも言葉尻は大事です。投げ斧を持ったヒャッハーな人が草原で手頃な距離にまーるいお尻を見つけたらどうします？斧を投げるに決まっているでしょう。そういうことです。

2. クラスを型と呼ばない
---

これも言葉尻の問題です。以下同文。

クラスって、具体的な型に左右されなきゃならないほど不自由なものじゃないし、逆に型も具体的なクラスに左右されなきゃならないほど不自由なものじゃないと思うのですよ。もちろんクラス型を持つ言語とかありますよ。でも、そういうのが前面に出て意識しないといけないのって、ぶっちゃけ不自由じゃん。(個人の感想です。人により効果が異なります。）

クラスはクラス。型は型でちゃんと概念として区別しましょうよ。なんとなく。このクラスはこの型が約束している性質を満たすことにします、とか、この型ではこのクラスとこのクラスを前提にします、とかはアリだと思うけどね。

そんな都合のいい言語あるかって？作ってクレクレ。

3. オブジェクト型を提供しているからといってオブジェクト指向と言わない
---

お約束ですが、言葉尻で以下同文です。

オブジェクト指向という言葉の定義によるんだけど、オレ的には A Personal Computer for Children of All Ages [日本語試訳](http://swikis.ddo.jp/abee/74) [原文](http://www.mprove.de/diplom/gui/kay72.html) に描かれている世界を実現しようという技術的指向というか方向性をオブジェクト指向と呼びたいなあと思ってます。

オブジェクトとかオブジェクト型とかは、各言語の設計者さんが決めればいいと思うのですよ。これがこの言語でいうオブジェクトですとか、オブジェクト型です、とか。でも、ほとんどの文脈で使われている言語機能としての「オブジェクト指向」は、実際には「オブジェクト型」だったり「オブジェクト」だったり、メソッド呼び出…じゃなくてメッセージ送信の機能だったりします。精密に言葉を選べば、「オブジェクト指向」という単語を使わないほうがより正確に記述できると思うのですよ。

まとめ
---

以上、お尻を3つ並べました。

参考資料
---
[1] Alan C. Kay, A Personal Computer for Children of All Ages. In Proceedings of the ACM annual conference - Volume 1 (ACM '72), Vol. 1. ACM, 2011, 日本語試訳 http://swikis.ddo.jp/abee/74, 原文 http://www.mprove.de/diplom/gui/kay72.html

[2] 阿部 和広, 簡単だけど奥深い！Scratchプログラミングの魅力 第1回　オブジェクト指向プログラミング, ITPro, http://itpro.nikkeibp.co.jp/article/COLUMN/20111019/371081/

[3] sumim, オブジェクト指向の概念の発明者は誰ですか, http://d.hatena.ne.jp/sumim/20040525/p1

[4] tomooda, オブジェクト指向って何？, http://tomostavern.blogspot.jp/2011/09/blog-post_17.html
Dropbox使用時にディスク使用率が100%になる問題の回避

環境:
Windows 8.1 Pro (64bit)

事象発生:
2014年9月中ごろから

症状：
ディスク使用率が100%になった状態が30分以上続く。

具体的な症状発生の手順：
「システム起動時にDropboxを開始」にチェックがはいった状態でPCを起動する。PCが起動してから30分以上、ディスク使用率が100%の状態が続く。
Dropbox関連のプロセスを切ると症状が出なくなるので、Dropboxの問題のようである。

対応策:
「システム起動時にDropboxを開始」のチェックをはずし、PC起動時にDropboxを起動させるのをやめる。PCが起動してからDropboxを手動で起動すると、ディスク100%状態はせいぜい2分程度となるようだ。

備考：
dropboxのサポートに連絡してもCPU100%の症状と勘違いされ、具体的な対応策が掲示されなかった。自分で気づいたので、ここに記す。
Datadogの検索窓

Datadogのサイトにログインするとまず最初に表示されるのが、イベントストリームのページなる。このページには、Datadogでモニタリングしているインフラに関連する各種イベントが時系列に表示されている。この状態で、左側の各項目をクリックしてもらいたい。例えばDockerのIntegrationをインストールしているなら、`Docker`と書かれている文字列をクリックすると、"sources:docker"と検索用の窓に表示されて、docker関連のイベントのみのが時系列に表示されるはずだ。

これらの左側メニューのボタンは、イベントストリームに表示するイベントの検索設定用の文字列を検索窓に挿入しているだけの機能しかない。

![docker_Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/53101/8193e578-1b3c-e236-8706-71d06f91d6aa.png)

左側の項目で入力された文字列を、`×`マークをクリックして削除し、検索例に表示されているようにに"user:◯◯◯◯"と記述すると、その◯◯◯◯ユーザに関連したイベントが表示される。(それ以外の事例も、是非試してもらいたい)

これは、使えそうと感じてもらえたに違いないと思う!　素晴らしいことに、この検索窓はDatadogのダッシュボードのいたるところに配置されている。従って使い方を覚えておくと後々便利である。 

もう少し探訪したいので`"More search help"`となっているリンクをクリックし、詳細な解説がポップアップ表示されるはずである。

![Screen Shot 2014-11-18 at 13.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/53101/eed1db52-535c-6334-cfe1-82d90da94f02.png)

**英語で書かれている内容を要約してみると:**

- イベントとイベントに付されたコメントのフルテキストサーチ
- 特定のイベントプロパティー
    - ユーザー(`user:jay@datadoghq.com`)
    - ソース(`sources:github,chef`)
    - タグ(`tags:env-prod,db`)
    - ホスト(`hosts:db1.myapp.com,db2.myapp2.com`)
    - ステータス(`status:error`)
    - 優先度(`priority:low`)
    - インシデント(`incident:claimed`)
- それぞれの検索要素を組み合わせて高度な検索をすることもできる。

高度な検索の例:

nagiosとchefに関連し、errorステータスで、cassandraの文字列を含むイベントは、
``sources:nagios,chef`` ``status:error`` ``cassandra``

この検索窓の操作を、是非トライしてもらいた。なぜならばこの操作は、Datadogのダッシュボード上でのドリルダウンには必要不可欠な知識なのだ。

---

**最後に、もしもこの投稿を読んでDatadogの本当の魅力について知りたいと思うなら、[signup](https://app.datadoghq.com/signup)ページからフリートライアルに申し込んでみてほしい。**
MacOS 10.10 + tmuxでコマンドラインでatomを実行できない件の対応方法


- reattach-to-user-namespaceをインストール

```
brew install reattach-to-user-namespace
```

- .tmux.confを設定する

```
set-option -g default-command "which reattach-to-user-namespace > /dev/null && reattach-to-user-namespace -l $SHELL || $SHELL"
```

- tmuxを再起動したら動きました

## 参考リンク
https://github.com/atom/atom/issues/3093
TDD入門自分用メモ-20141119


# Part 1-3

## Value Object

* Dollar実装で使用しているパターン
* オブジェクトを値として使用する
* インスタンス変数の値をコンストラクタ内で設定した後は変化させないという制約
* 別名参照のバグを防ぐ
* Dollar5が別のDollar5オブジェクトと等価であることを示すためにequals()を実装する必要がある
* equals()実装に合わせてhashCode()の実装も必要

``` TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
equals()
hashCode()
```

* 新しいテスト

``` DollarTest.java

public void testEquality() {
  assertTrue(new Dollar(5).equals(new Dollar(5)));
}

```

* 仮実装

``` Dollar.java

public void equals(Object object) {
  return true;
}

```

* テストパターンを増やす

``` DollarTest.java

public void testEquality() {
  assertTrue(new Dollar(5).equals(new Dollar(5)));
  assertFalse(new Dollar(5).equals(new Dollar(6)));
}

```

``` Dollar.java

public void equals(Object object) {
  Dollar dollar = (Dollar) object;
  return amount == dollar.amount;
}

```

* nullやその他オブジェクトとの比較をどうするかという問題がでてきたのでTODOListに加えておく

``` TODOList.md
レートが2:1の場合、$5+10CHF=$10
amountのプライベート化
Moneyの丸め処理
hashCode()
nullとの等価性
オブジェクトとの等価性
```

*三角測量云々の話がよく理解できてない...*

## この章で行ったこと

1. 操作に対するテスト

1. 操作の実装

1. テストとリファクタリング

# Part 1-4

## 変数のプライベート化

* テストの修正

``` DollarTest.java

public void testMultiplication() {
  Dollar five = new Dollar(5);
  assertEquals(new Dollar(10), five.times(2));
  assertEquals(new Dollar(15), five.times(3));
}

```

* これでインスタンス変数をプライベートにすることができるようになった

``` Dollar.java

private int amount;

```

## この章で行ったこと

1. テストの改善

1. テストとコードの結合度を削減
Amazon SESでバージニア・リージョン以外からメール送信

# はじめに

http://aws.amazon.com/jp/ses/

Amazon SES は, サーバの構築なしで手軽にメール送信できるサービスである.
下記の[リージョン](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)で利用できる. (2014/11時点)

- 米国東部 (バージニア北部)
- 米国西部 (オレゴン)
- 欧州 (アイルランド)


# メール送信

[Amazon Simple Email Service Scripts](http://aws.amazon.com/developertools/Amazon-SES/8945574369528337)を使えば, EC2上からコマンドでメール送信できる.
バージニア・リージョンから送信する場合, コマンドは下記のとおり.

```sh
$ ./ses-send-email.pl -s $title -f $from_adress $to_adress < $message_file
```

または,

```sh
$ perl -I/path/to/ses /path/to/ses/ses-send-email.pl -s $title -f $from_adress $to_adress < $message_file
```

しかし, バージニア・リージョン以外から送信する場合は,
下記のように`-e`オプションでエンドポイントURLを指定する必要があるので,
注意 (下記はリージョンがオレゴンの場合).

```sh
$ ./ses-send-email.pl -e 'https://email.us-west-2.amazonaws.com/' -s $title -f $from_adress $to_adress < $message_file
```

実は, `-e`オプションなしのときは, デフォルトが
バージニアのエンドポイントURL (https://email.us-east-1.amazonaws.com/)
となっていただけである (コマンドのヘルプに記載あり).

SESが使うサーバはリージョン毎に異なるので, このように適切なエンドポイントを指定する必要がある.
なお, 各リージョンのエンドポイントURLは[Regions and Amazon SES](http://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html)に載っている.


# 参考

https://www.infoscoop.org/blogjp/2014/07/04/aws%E3%81%AEses%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1/

http://pocketstudio.jp/log3/2011/02/14/amazon-ses/
ディレクトリ内のすべてのEmacs Lispファイルを一発でバイトコンパイル

# はじめに
ディレクトリ内のEmacs Lispファイルを一発でバイトコンパイルするには,
Emacsから下記を実行すれば良い.

> C-u 0 M-x byte-recompile-directory

しかし, 再帰的には適用されないため,
第2階層以降のディレクトリ内にあるファイルはバイトコンパイルできない.

# 対応策

そこで, Emacs内からでなく, 下記のようにコマンドラインからバイトコンパイルできることを利用する.

```console
$ emacs -batch -f batch-byte-compile /path/to/*.el
```

したがって, 下記のようにすれば, ディレクトリ内のファイルを再帰的にバイトコンパイルできる.

```console
$ find /path/to -name '*.el' | xargs emacs -batch -f batch-byte-compile
```

なお, Zshでは簡潔に, 下記でバイトコンパイルできる.

```console
$ emacs -batch -f batch-byte-compile /path/to/**/*.el
```

# 参考
https://www.gnu.org/software/emacs/manual/html_node/elisp/Compilation-Functions.html
19 Google Play Store Alternatives

Google Play Store Alternatives

There are several countries that ban Google and subsequently the Google Play Store. Additionally, there are countries which is able to use it, but they are limited to free apps and games.

You have simply developed an excellent Android app and you are prepared to generate money from
it. The most popular strategy is most likely to pay $25 to get it listed on Google Play. But, there are lots of alternatives to Google Play, each with their particular audience that can generate more downloads.

Many of these app stores are focused to a smaller audience whereas others tend to be more localized. The majority of them don't charge a fee for listing your app on their store. It can subsequently pay off to submit your app in many app stores.


Best alternative Android app stores are below

http://unity3diy.blogspot.com/2014/11/19-google-play-store-alternatives.html

![Google playstore alternatives.jpg](https://qiita-image-store.s3.amazonaws.com/0/59898/7883b220-5160-4dd3-f206-eee873feaca2.jpeg)
ActiveRecord::Enumで陥りがちなミスを避ける

ActiveRecord::Enumという機能がRails4.1から入りました。
気軽に使えるので、割りと積極的に使っているのですがその中である問題が発生しました。

**ActiveRecord::Enumの提供してくれる標準で提供してくれるインターフェイスだけでは*1、whereの引数で指定する値は実際にSQLのWHERE句に指定されるものが渡すため本来は文字列が使えないが、何となく使えそうなので渡してみると、値が0として動作してしまう**、という問題です :cold_sweat: 

以下、例です。NotifyEndpointというPush通知の送り先を永続化するテーブルについて考えた場合、platformとしてiPhone用のAPNSとAndroid用のGCMなどのプラットフォームをenumで指定してみます。

```rb
class NotifyEndpoint
  enum platform: [:apns, :gcm]
end
```

```rb
# OK: newやcreateでは渡せる
endpoint = NotifyEndpoint.new(platform: :apns)

# OK: platform=メソッドにも渡せる
endpoint.platform = :gcm

# OK: apnsというスコープは定義されている
endpoints = NotifyEndpoint.apns

# NG: whereに文字列やシンボルを渡しても正しく動作しない
#     しかしエラーが出ずに0としてSELECTされる!!
endpoints = NotifyEndpoint.where(platform: :gcm)
#=> SELECT * FROM notify_endoints WHERE platform = 0;

# OK: NotifyEndpoint.platformsから、enumの序数を取得してwhereで指定する
endpoints = NotifyEndpoint.where(platform: NotifyEndpoint.platforms[:gcm])
#=> SELECT * FROM notify_endoints WHERE platform = 1;
```

というように、基本的には文字列シンボルでenumを扱うことが出来るんですが、標準で定義されるスコープ以外で、SELECTしたいときは要注意です。whereにはenumの要素の名前を受け付けてくれないのですがエラーが出ないのでやっかいです。正常ケースのテストが1個目の要素しかテストしてないと普通に通るのでうっかりバグを入れてしまいます :imp: 

かと言って、毎回`NotifyEndpoint.where(platform: NotifyEndpoint.platforms[:gcm])`のような記述方法をするのはクラス名2回書かなきゃならないし、enumの序数についていちいち意識しなきゃいけないのは、面倒くさいです。

↑の問題を回避しつつ、面倒くさくない記法が出来るようenum名でscopeを生やしてくれるパッチを書きました :tada: `lib/active_record/enum/scoping.rb`などに置いてconfig/initializers/*.rbのどこかでrequireしておけば使えるかと思います。

```rb
if defined?(ActiveRecord) &&  defined?(::ActiveRecord::Enum)
  module ActiveRecord
    module Enum
      module Scoping
        def self.extended(base)
          ::ActiveRecord::Enum.alias_method_chain(:enum, :scoping)
        end
      end

      def enum_with_scoping(definitions)
        enum_without_scoping(definitions)
        define_scoping_method(definitions)
      end

      private
      def define_scoping_method(definitions)
        definitions.each do |name, values|
          scoping_method_name =  "#{name}_as".to_sym
          scope(scoping_method_name, - > (item) { enum_scope(name, item) }})
        end
      end
    end

    def enum_scope(enum_name, item_name)
      query_hash =  {}
      query_hash[enum_name.to_sym] =  send(enum_name.to_s.pluralize)[item_name]
      where(query_hash)
    end
  end

  ::ActiveRecord::Base.extend(::ActiveRecord::Enum::Scoping)
end
```

これを導入すると以下のように、`<enum_name>_as`というスコープが定義されるので、文字列・シンボルを渡しても動作するようになりましたし、いちいちクラスメソッドで値を変換したり、自前で毎回スコープを定義したりせず済むようになりました :ok_hand:

```rb
endpoints = NotifyEndpoint.platform_as(:gcm)
#=> SELECT * FROM notify_endpoints WHERE platform = 1;
```

需要があればgemにしてみます。

* *1（実装はそんなに長くないので読んでみることをおすすめします
 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/enum.rb)
Ansibleでタグを使ってみる



## タグのつけ方

### includeの際につける

```
- include: prod.yml tags=prod
- include: stg.yml tags=stg
```

### rolesの際につける

```
- hosts: ws
  sudo: yes
  roles:
    - role: nginx
      tags: nginx
    - role: php
      tags: php
    - role: deploy
      tags: deploy
```

## 使い方

### 指定したタグのついたタスクのみ実行

```bash
$ ansible-playbook example.yml --tags "configuration,packages"
```

### 指定のタグのついたタスクをスキップして実行

```bash
$ ansible-playbook example.yml --skip-tags "notification"
```


## 参考

* [Ansible Docs - Tags](http://docs.ansible.com/playbooks_tags.html)
* [ansibleで実行対象を切り替える方法](http://tdoc.info/blog/2014/05/30/ansible_target_switching.html)
AWSでロードバランサーを使ってみる



## ELBを追加する

[AWS - EC2 Management Console - Load Balancers](https://us-west-2.console.aws.amazon.com/ec2/v2/home?region=us-west-2#LoadBalancers:)でELBを追加する。
Create Load Balancerを選択する。

### 最初の設定画面

* Load Balancer name に適当に名前を設定する
* その他は特に設定しない

### ヘルスチェックを設定

* デフォルトから変更せず

### セキュリティグループを指定

* EC2インスタンスを登録しているセキュリティグループを選択する

### EC2インスタンスを追加する

* 追加するEC2インスタンスをチェックして次へ

### タグの設定

* 特に何も設定しない

### 作成

* Createをして少し待つとELBが立ち上がる


## 参考

* [AWS ELBを用いたサーバーの冗長化を行う方法](http://www.checksite.jp/aws-elb-multi-server/)
QiitaやTeamでチェックボックスを活用出来そう

Qiitaにいつの間にか搭載されてたチェックボックス(タスクリスト)、[1ヶ月前には使えるようになってて](http://blog.qiita.com/post/100466976909/task-list-is-now-available)、さらに[Kobito2.1の新機能](http://blog.qiita.com/post/102576728409/kobito-2-1)の一つだったんですね。以前からGitHubでは使えたので、これの存在を知っておられた方も多いのでは？

Qiitaにはタスクリストに関する記事も見当たらなかったしBlog見てなかった方は気付かれて無さそう(自分がその一人でした…)


 - [x] Qiitaでは先月からタスクリストが利用できるようになってたらしい!
    - [ ] QiitaBlogに書かれているように、ToDoリストやメモがてらにも便利ですよね :smile: 
    - [ ] 例えばTeamやQiitaで作業の進捗を共有するのにも便利です！
    - [x] チェックの変更は作成者と共同編集者だけが出来る(?)
    - [x] 変更すると即時にリビジョンが更新され、公開されます。
        - [x] どのタイミングでチェックを付けたかだって分かるし安心ですね :clap: 
        - [x] :heavy_check_mark: Qiitaで自分用の(あるいは公開するのにふさわしくない)メモとして使う際は限定公開にしましょうね！
    - [x] GitHubのReadmeやWiki、PR、Gistなんかでも同様に活用(enhancementとか)されていますね。
とりあえずうまく使えば便利な機能、ってことです。

ところでこのリスト書いてるとリストが数回思わぬずれ方したけどバグなの…?
Jadeでmissing space before textが出てしまう

#Jadeでコンパイル時にmissing space before textが出るので消す
##原因
文章部分にインデント当ててたから

```jade:example.jade
  section
    文章
  br
    文章
```

##対処

インデント消して改行はちゃんと|いれる

```jade:example.jade
   section 
     | 文章
     br
     | 文章
```
Unity Admob Plugin free download

AdMob is a mobile advertising company founded by Omar Hamoui.that helps app developers monetize and promote their mobile and tablet apps with ads. The name AdMob is a portmanteau for "advertising on mobile". It was incorporated in 2006 and is based in San Mateo, California.

AdMob Unity plugin samples page (Android | iOS). 
Please post any questions or general feedback to this forum. You can also follow Google+ page to stay up to date on all of Google's ads products.

http://unity3diy.blogspot.com/2014/03/free-admob-plugin-for-unity3d-by-google.html
Railsでユニットテストを実行しました

Railsのユニットテストを実行しました。

rakeコマンドで実行するようです。

```bash
rake test:units ファイル名
```
実際にはこんな感じでした。

```bash
bundle exec rake test:units test/controllers/search_controller_test.rb
```

Railsでユニットテストを実行するのはじめてです(☝ ՞ਊ ՞)
LookRotation2D

スプライトをQuaternion.LookRotationした時にねじれないようにする関数です。
LookRotation2D

```
static public Quaternion LookRotation2D(Vector2 _vec,Vector2 _up){
	float tmpAng = (Mathf.Atan2(_vec.y, _vec.x)-Mathf.Atan2(_up.y, _up.x)) * Mathf.Rad2Deg;
	Quaternion rot = Quaternion.AngleAxis(tmpAng, Vector3.forward);
	return rot;
}
```
substとsublis

# はじめに
　最近、実用Common Lispを読んでます。なるほどと思う情報が多いので、非常に勉強になってます。この中でsubstとsublisについて書かれていたので、忘れないようにメモしておこうと思います。

# substとsublisとは
　この2つの関数はツリーに対する処理を行う関数です。ツリーとは入れ子になったリストです。
　substとsublisは、ツリー内の要素の置換を行います。substは単一の要素、sublisは複数の要素の置換を一気に行うことができます。下に例を示します。

```cl:sample.lisp
(subst 'new 'old '(old (a b) ((old))))
;=> (NEW (A B) ((NEW)))
(sublis '((old . new) (b . a)) '(old (a b) ((old))))
;=> (NEW (A A) ((NEW)))
```

　sublisは置換前と置換後の連想リストを引数として渡しています。
　実用Common Lispではsubstとsublisの、newとoldの順番の違いについて触れていました。確かに渡す引数の順番に一貫性がないと、混乱してしまいます。

　一貫性のあるようにするには、substの引数の順番を変更したマクロを定義する方法と、sublisの引数の連想リストを、キーと値を入れ替える関数を挟んで渡すように展開するマクロを定義する方法があると思いました。

# 実装

下に前者のマクロの定義を示します。

```cl:my-subst.lisp
(defmacro my-subst (old new tree &rest rest)
  `(subst ,new ,old ,tree ,@rest))

(my-subst 'old 'new '(old (a b) ((old))))
;=> (NEW (A B) ((NEW)))
```

　次に後者のマクロの定義を示します。連想リストのキーと値を入れ替える関数を、ループと再帰で書いたので両方とも書いておきます。

```cl:swap-key-value.lisp
;;; ループ版
(defun swap-key-value (alist)
  (let ((result nil))
    (dolist (elem alist)
      (push (cons (cdr elem) (car elem)) result))
    (nreverse result)))

;;; 再帰版
(defun swap-key-value (alist)
  (swap-key-value-rec alist nil))

(defun swap-key-value-rec (alist acc)
  (if (null alist)
      (nreverse acc)
      (swap-key-value-rec
       (rest alist)
       (push (cons (cdr (first alist)) (car (first alist))) acc))))

(swap-key-value '((a . key) (b . value) (c . subst) (d . sublis)))
;=> ((KEY . A) (VALUE . B) (SUBST . C) (SUBLIS . D))
```

```cl:my-sublis.lisp
(defmacro my-sublis (alist tree &rest rest)
  `(sublis (swap-key-value ,alist) ,tree ,@rest))

(my-sublis '((new . old) (a . b)) '(old (a b) ((old))))
;=> (NEW (A A) ((NEW)))
```

# おわりに
　Common Lispの関数は、引数の順番に一貫性がなかったり、関数の名前が中途半端に短くしている(個人的な意見として例えばclrhash)があったりします。この時に我慢して標準の関数を使うのか、新たに自分でマクロを定義するのか迷うところです。どちらの方法にも長所と短所があるのですが、標準で用意されているもの関数はそれを使う方がいいのかもしれません。
　ですがLispという自由度が非常に大きい言語を使うと自分の好みに合うように変更したい気持ちもあります。他の人のソースコードを読む負担が激増してしまいそうですが、自分が気持よくプログラムを書くこともそれと同じくらい重要だと思っています。
yield returnを使わずにIEnumerable<T>を生成する

## やりたいこと
`yield return` を使わずに、かつなるべく楽して `IEnumerable<T>` を返すメソッドを実装したい

## 本題

C#、で、例えばこんな感じの拡張メソッドを定義すると、これをLinq to Objectのメソッドチェーンの中で利用することができる。

```csharp:linqex.cs
/// <summary>
/// シーケンスから、同一のキーを持つ要素の重複を取り除く
/// </summary>
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
{
    var done = new HashSet<TKey>();
    foreach (var item in source)
    {
        if (done.Add(keySelector(item)))
            yield return item;
    }
}
```

これと同じことを `yield return` を使わずに実現しようと思うと、正攻法では `IEnumerable<T>` と `IEnumerator<T>` を実装したクラスをそれぞれ用意して、という感じで結構面倒くさい。

だったらこんな感じにすればいいんじゃないの？と思ってやってみると、

```csharp:linqex.cs
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
{
    var done = new HashSet<TKey>();
    return source.Where(x => done.Add(keySelector(x)));
}
```

一見うまくいくんだけど、下の例みたいに生成された `IEnumerable<T>` を複数回列挙すると２回目以降の結果がおかしくなる。
こういう使い方をするのはレアなケースではあるのだけれど。

```csharp:test.cs
[Test]
public void EnumerateTwice()
{
    var ret = new [] {1, 2, 3, 1, 2}.DistinctBy(x => x);
    Assert.That(ret.ToArray(), Is.EqualTo(new [] {1, 2, 3}));  // PASS
    Assert.That(ret.ToArray(), Is.EqualTo(new [] {1, 2, 3}));  // FAIL ret.ToArray() は空の配列になる
}
```

要は初期化(この場合はHashSetの生成)処理をメソッドチェーンの外でやってるのが問題なので、これをメソッドチェーンに埋め込んでしまえばいい訳で、こんな感じに変えてやると意図したとおりに動くようになる。

```csharp:linqex.cs
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
{
    return new[] { source }.SelectMany(s =>
        {
            var done = new HashSet<TKey>();
            return s.Where(x => done.Add(keySelector(x)));
        });
}
```

別の例

```csharp:linqex.cs
/// <summary>
/// シーケンスを指定されたサイズごとに分割する.
/// [1, 2, 3, 4, 5, 6, 7].EachSlice(3) -> [1, 2, 3], [4, 5, 6], [7]
/// </summary>
public static IEnumerable<T[]> EachSlice<T>(this IEnumerable<T> source, int size)
{
    return new[] { source }.SelectMany(s =>
        {
            var r = Enumerable.Repeat(s.GetEnumerator(), size).ToArray();
            return Enumerable.Repeat(0, int.MaxValue)
                             .Select(_ => r.TakeWhile(e => e.MoveNext()).Select(e => e.Current).ToArray())
                             .TakeWhile(arr => arr.Length > 0);
        });
}
```

## おとなしくyield使えばいいんじゃないの？
ﾃﾞｽﾖﾈｰ
Visual Studio 2010でVBを書くとかそういう縛りプレイを強いられてる時にはそれなりに役に立つ気がする。
C#なら、まあyield使いますよね。はい。
FacebookApiへのアクセス数を1/50に削減する方法


facebookのapiを調べてたら、graph apiへのアクセスを1/50に減らせる方法があることが分かったので共有しま〜す！！

##api仕様
facebookのdeveloperサイトの以下のページに詳細が記載されています。
https://developers.facebook.com/docs/graph-api/making-multiple-requests/


##rbファイルで書いてみる

今回はシンプルにurlのlike数を返してくれるapiを使って、
一気に50個のurlをapiに投げてみます。

引数にurlの配列urlsを渡す場合を書いてみます。

```get_like_count.rb
  def self.get_like_counts(urls)
    batch_data = []
    urls.each do |url|
      batch_data << { 'method' => 'GET', 'relative_url' => "?ids=#{url}" }
    end
    uri = URI(#{FACEBOOK_GRAPH_API_URL})
    timeout = 60
    https = Net::HTTP.new(uri.hostname, uri.port)
    https.use_ssl = true

    res = https.start do |h|
      h.open_timeout = timeout
      h.read_timeout = timeout
      req = Net::HTTP::Post.new(uri)
      req.form_data = {
        'access_token' => #{APP_ACCESS_TOKEN}, ※なくてもいい
        'batch'        => batch_data.to_json
      }
      h.request req
    end
  end
```

※このbatch_dataの配列に入れるmethodとrelative_urlの組み合わせで、どんなapiも50回までまとめて送れます。

実際に実行してみます。

```console
  urls = [
    "http://job-share.net/",
    "http://atrae.co.jp/"
  ]
  GetLikeCount.get_like_counts(urls)
```

と実行すればOKです。


##50個分のデータが配列として一回で返ってくる

```
ActiveSupport::JSON.decode(res.body).each_with_index do |content,index|
	p content
end

===
"body" : [{
   "http://job-share.net": {
      "id": "http://job-share.net",
      "shares": 1083
   },
   "http://atrae.co.jp": {
      "id": "http://atrae.co.jp",
      "shares": 259
   },
   …(50個分が配列で返ってくる)
   ]
}

```

##感想
ちょ〜便利〜！！
オーバーヘッドが1/50になって早ぇ〜
APIのアクセス数が制限されて拒否られる可能性も減る〜

ということで、facebook app developerの方で知らなかった〜って方は即導入してみてください！
MySQLのユーザ管理

普段MySQLを使うとき、何気なくユーザ名とパスワードを入力してMySQLを使用していますが、ふとMySQLのユーザについて考えてみたのでいろいろやってみることにしました。今回はユーザへのパスワード設定とユーザ追加・削除についてまとめました。

<h3>パスワード設定</h3>
初期状態では

```
$ mysql -u root
```

とするだけでMySQLに入れますが、このrootユーザにパスワードをつけようと思います。

まず

```
$ mysql -u root
```

でMySQLに入ります。次に

```
> use mysql;
```

を実行し、

```
set password for root@localhost=PASSWORD('this_password');
```

を実行します。
* this_passwordをお好きなパスワードに変えて実行してください。

「Query OK」が出たらパスワード設定成功です。次からは -p(パスワードオプション)つきでMySQLに入れます。


ちなみに、this_passwordを空欄('')のまま実行すると、パスワードなしの状態に戻ります。
<br /><br />


<h3>ユーザ追加</h3>
次に新しくMySQLを使用するユーザを作成してみました。

MySQLに入り、以下を実行します。

```
mysql> grant all privileges on *.* to newuser@localhost identified by 'new' with grant option;
```

上記はall privileges(全ての実行権限)を全てのDB上の全てのテーブル上で持つ、パスワード「new」が設定されたユーザ「newuser」を作成します、という意味になります。

特定の実行権限だけを渡すこともできます。
例えば、selectのみを許可する場合は all privilegesの部分を「select」に変えてください。
同様に、updateのみの場合は all privilegesの部分を「update」に変えてください。
複数指定もできます。selectとupdate権限を渡す場合は、「select, update」のようにカンマで区切って実行することで複数の実行権限を渡すことができます。

<h3>権限確認</h3>
ユーザが保持する権限を確認する場合は以下を実行してください。以下は先ほど作成したnewuserの権限を確認するものです。

```
mysql> show grants for newuser@localhost ¥G
```

を実行すると

```
*************************** 1. row ***************************
Grants for newuser@localhost: GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' IDENTIFIED BY PASSWORD '*6FE2B845E049CDA9EFED8CFAF265CD29622FD852' WITH GRANT OPTION
1 row in set (0.00 sec)
```

のように権限の状況が表示されます。

<h3>権限を剥奪する</h3>
ユーザから権限を奪う場合は以下を実行します。

```
revoke 権限 on DB.テーブル from ユーザ名@ホスト名;
```

例：以下はnewuser@localhostのselect実行権限を剥奪するものです。

```
revoke select on *.* from newuser@localhost;
```

全ての権限を奪いたいときは上記の「select」を「all privileges」に変えて実行してください。


<h3>権限追加</h3>

逆にユーザに権限を追加する場合は

```
grant 与えたい権限 on DB.テーブル to ユーザ名@ホスト名;
```

を実行してください。下記の例は上記はnewuser@localhostに全てのDB上でのCREATE文の実行権限を与える、という意味になります。

```
grant create on *.* to newuser@localhost;
```

<h3>ユーザ削除</h3>

ユーザ削除するには以下を実行します。

```
delete from mysql.user where user='ユーザ名' AND host='ホスト名';
```

newuser@localhostを削除するには

```
delete from mysql.user where user='newuser' AND host='localhost';
```

を実行します。
SwipeRefreshLayout r21はListViewじゃないとうまく動かない

悩まされたのでメモ。
 

----

この記事は[Qiita](http://qiita.com/kimama1997/items/dc7b688fc9fc2412ae24)と[ブログ](http://wp.me/p4ODjt-8A)のクロスポストです。愚痴が続くので結論から読むべきかも()

----

## SwipeRefreshLayout

Google公式のsupport libraryにはr19(API19:Kitkat)からSwipeRefreshLayoutが入っています。いわゆる『引っ張って更新』を実装してくれるViewです。

<a href="https://qiita-image-store.s3.amazonaws.com/0/23997/835fc0b1-89cc-dc1c-abc3-200ada2ec688.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/23997/835fc0b1-89cc-dc1c-abc3-200ada2ec688.png"  class="alignnone" /></a>

このViewの内側には基本的にListViewやRecycleViewを入れます。

あるいは、それ以外のViewでも内包することが出来ます。

例えばその実装例としてGoogleの公式サンプルがあります。

[SwipeRefreshMultipleViews | Android Developers](http://developer.android.com/intl/ja/samples/SwipeRefreshMultipleViews/index.html)

----

さて、ここまでSuppprt Librarry v4:r19の時の話でした。

## r21

r21ではMaterial Desiginに合わせ、装い新たに生まれ変わりました。
GmailやGopgle+アプリで使われてますね。

<a href="https://qiita-image-store.s3.amazonaws.com/0/23997/67f9a5c4-4d0d-c74b-97fe-5216e1621eea.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/23997/67f9a5c4-4d0d-c74b-97fe-5216e1621eea.png"  class="alignnone" /></a>

さて、私はここで、「SwipeRefreshLayoutの内側で好きなViewが使える」この前例を信じ、r21でテキトーに作ってビルドしました。

### 結果、

ちゃんとリフレッシュメソッドは動いてるのに、あのぐるぐるが出てこない！！

これだけのことに私は散々悩まされました。数日間(長過ぎる)。コードがどこかおかしいのだろう、と。

ぐぐってみるとoffsetがどうのとかいったissueもあったけど関係ない話でした。
一瞬だけれども正しい位置に白い円が現れるのですから。

また、試しに内側のViewをListViewに差し替えてみたら、ちゃんとぐるぐるが現れました。これはもしや...

### 公式サンプルも...
ここで先程の公式サンプルの出番です。実は最初にこのサンプルのビルドを試みていたのですが、うまくいかず諦めていました。

今一度試行錯誤した結果、やっと動くようになりその検証ができました。　

まずr19のままでビルド。これはサンプルの意図した通りに動作していることが確認出来ました。

つづけてr21に替えたところ、なんということでしょう、先程と同様の問題が発生するではありませんか。

<a href="https://qiita-image-store.s3.amazonaws.com/0/23997/18f8426a-8e53-cabb-8080-ec84e3073958.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/23997/18f8426a-8e53-cabb-8080-ec84e3073958.png"  class="alignnone" /></a>
(もちろん同様に引っ張ってる状態ですよ！)

なるほど。

**これ、ライブラリの問題じゃないか！**

しょうもないことで悩んでた私は心が折れました...

とりあえずListViewを使えばいいと判明したので、今回は渋々それ用に書き換えることにしました...

## 結論

**Android Support Library v4 r21のSwipeRefreshLayoutの子にはListView系Viewを使う必要がある！**

これがバグか仕様かは知らないけれど仕様だと思って我慢します...

当該の使い方をしたい場合は旧バージョンを利用するか他ライブラリを利用するのが懸命っぽいですね。

それっぽいIssueあるけど結局よくわからない… [Issue 78062 - android - SwipeRefreshLayout doesn't go away when fragment is changed while refreshing - Android Open Source Project - Issue Tracker - Google Project Hosting](https://code.google.com/p/android/issues/detail?id=78062)

何か知ってる人、あるいはいい案あったら是非教えてください！

--

ところでQiitaってチェックリスト使えるようになってたんですね！

- [x] SwipeRefreshViewを使う
- [ ] Twitter4jを使う
[Spider]Swiftと似た?を使ったチェーンのメモ


## 参考公式ドキュメント

http://spiderlang.org/

## SpiderはSwiftと似ている?

Spiderは、 **Swiftからも着想を得て** 開発されています。

そのため、しばしばSwiftと似たシンタックスが登場します。

例えば、Swiftで特徴的なシンタックスのひとつとして、optionalがありますよね。


```swift
var name:String?
```


のように。

クラスとかなら、

``` swift
class Animal {
	func name()->Void{
		println("animal")
	}
}

var animal:Animal?

animal = Animal()

animal?.name()
```


みたいな。


実は、Spiderでもこの ?チェーン のようなものが
搭載されているので、それを紹介します。

## Spiderでの?チェーン

Spiderでは、下記のように?をつけることで

undefinedのTypeErrorをさけることができます。



```spider
func Animal() {
    this.name = () -> {
        return "Dog"
    }
}

var animal = new Animal()
animal.name()

var name = animal.name?() // "Dog"
var age = animal.age?()   // undefined
```


もちろん、Swiftと比べると別物ではありますが ;^_^A


もうわざわざif文でチェックする必要がないですね！

これは良機能だと思います！
Elixir | Mix | run でプログラムを実行 #elixir

# Elixir | Mix | run でプログラムを実行
## 概要
Elixir に付属している CLI Tool の Mix でプログラムを実行します

## 事前準備

~~~
$ mix new run_test
$ tree
.
|-- _build
|   |-- dev
|   |   `-- lib
|   |       `-- run_test
|   |           `-- ebin
|   |               |-- Elixir.RunTest.beam
|   |               `-- run_test.app
|   `-- test
|       `-- lib
|           `-- run_test
|               `-- ebin
|                   |-- Elixir.RunTest.beam
|                   `-- run_test.app
|-- config
|   `-- config.exs
|-- lib
|   `-- run_test.ex
|-- mix.exs
|-- README.md
`-- test
    |-- run_test_test.exs
    `-- test_helper.exs
~~~

## サンプルコード

~~~elixir:./lib/run_test.ex
defmodule RunTest do
  def run(msg) do
    String.upcase(msg)
  end
end
~~~

## 実行

~~~bash
$ mix run -e 'IO.puts RunTest.run("hogehoge")'
HOGEHOGE
~~~

## Help

~~~bash
$ mix help run
                                    mix run

Runs the given file or expression in the context of the application.

Before running the code, it invokes the app.start task which compiles and loads
your project.

It is the goal of this task to provide a subset of the functionality existent
in the elixir executable, including setting up the System.argv:

x mix run -e Hello.world
x mix run my_script.exs arg1 arg2 arg3

Many command line options need to be passed to the elixir executable directly,
which can be done as follows:

x elixir --sname hello -S mix run -e "My.code"

Command line options

  ~ --config, -c  - loads the given configuration file
  ~ --eval, -e    - evaluate the given code
  ~ --require, -r - require pattern before running the command
  ~ --parallel-require, -pr
    x               - requires pattern in parallel

  ~ --no-compile    - do not compile even if files require compilation
  ~ --no-deps-check - do not check dependencies
  ~ --no-halt       - do not halt the system after running the command
  ~ --no-start      - do not start applications after compilation
~~~
Unity free assets sites 

Every indie game developer love to hear about Websites To Download Game Assets like 3d models, Textures, Shaders, complete source etc.

On various sites you can buy your own assets like 3d models, package etc.
Here we are giving you same amazing websites to download Free assets, Textures, Sounds, 3Dmodels and more,  Some websites have both free and paid you just need to do advance search for free only.

check out the 54 unity free assets here
http://unity3diy.blogspot.com/2014/06/54-website-to-download-game-assets.html

![unity-free-assets-download.jpg](https://qiita-image-store.s3.amazonaws.com/0/59898/65d7c3b7-2162-a06b-cdec-1b3db488ed3b.jpeg)



https://dl.dropboxusercontent.com/s/xtzqacnv1h6wjk2/Google%20playstore%20alternatives.html


https://dl.dropboxusercontent.com/s/g0mu91lwr6wgkjg/Free%20Unity%20Game%20Assets.html
Wercker | ビルド結果を Slack に通知する #wercker #slack

# Wercker | ビルド結果を Slack に通知する

## 概要
Wercker のビルド結果を Slack に通知します
## 手順
### wercker.yml の編集
* `after-steps:` を追加する

~~~yml
box: wercker/ruby
build:
    steps:
        - bundle-install
    after-steps:
        - sherzberg/slack-notify:
            subdomain: sub_domain
            token: $SLACK_TOKEN
            username: wercker
            channel: "#wercker"
~~~

* sub_domain に Slack のサブドメインを設定
* username に 通知アカウントのユーザー名を設定
* channel に 通知先の channel 名を設定 ※シャープが必要

### Slack の Incoming WebHooks を追加
* Slack にログイン
* Integrations メニューを選択
* Incoming WebHooks の Add を選択

![wercker_slack0.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c70e75f3-87f2-a247-2158-8e1a613c5cb9.png)

* Post to Channel に任意の Channel を設定
* Webhook URL の末尾のトークンをクリップボードにコピーしておく
* Save Settings を押下

### Wercker の管理画面から環境変数 SLACK_TOKEN の設定
* Wercker にログイン
* Apps => Settings を開く
* PIPELINE を追加
    * Environment variable を `SLACK_TOKEN` に設定
    * Text に Slack の Incoming WebHooks の設定時にコピーしておいたトークンをペースト
    * Protected にチェックをする

![wercker_slack1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/af9b25ae-86cf-28ad-9fc2-d451b636606f.png)

### 動作確認
* 対象リポジトリを適当に編集して push

~~~bash
$ git push origin master
~~~

* Slack の wercker Channel で結果の確認

![wercker_slack2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/77369081-5b8a-c2e2-e939-bea65964909f.png)

* 通知チャットメッセージ中の build リンクを押下すると、 Wercker の該当結果ページに移動

![wercker_slack3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8692fd04-d178-f774-8071-4ae984bd8d3a.png)

## 参照
[wercker blog | Slack Notifications!](http://blog.wercker.com/2013/11/27/Slack-Notifications.html)
Swiftで画像をURLから非同期で読み込む


## はじめに

UITableViewなどにネットワーク上の画像を表示する場合には、ユーザの操作をブロックしないように画像を非同期で読み込むのが普通だと思います。

筆者はSwiftではhttp系のライブラリとしてAlamofireを使っていますが、同じ作者がObjective-Cで書いたAFNetworkingとは異なり画像の非同期読み込みをまだサポートしていません。[参考](https://github.com/Alamofire/Alamofire#when-should-i-use-afnetworking)

Swiftで書く場合はライブラリもSwift製にしたいと思いますので、ここではiOS標準のNSURLConnectionを使って画像の非同期読み込みを記述してみます。

## 画像の非同期読み込み


```Swift
let url = NSURL(string:"http://画像のURL")
let req = NSURLRequest(URL:url!)

NSURLConnection.sendAsynchronousRequest(req, queue:NSOperationQueue.mainQueue()){(res, data, err) in
	let image = UIImage(data:data)
	// 画像に対する処理 (UcellのUIImageViewに表示する等)
}
```

Swiftならこのようにシンプルに記述できます。


- 型を省略して[Trailing Closure](https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-XID_160)を使って短く書いた例です。

- エラー処理は省略しています。
PostgreSQLでは識別子に大文字を使ってはいけない

タイトルの通り、PostgreSQLではテーブル名、カラム名など識別子に英大文字を使うべきではありません。

PostgreSQLは命令中の識別子を読み取るとき、二重引用符でくくられていなければ大文字を小文字に正規化します。その上で大文字小文字を区別して認識します。

その結果、

1. PgAdminで<code>Users</code>テーブルを作る
2. ツールはちゃんと二重引用符でくくるのでそのままの名前でテーブルができる
3. コード内で`select id, name from Users`などと書くと、`select id, name from users`と解釈されてしまいテーブルが見つからない

などという馬鹿馬鹿しい事故が起こることになります。
手書きでSQLを書くならまだしも、O/Rマッパーが絡んだりするとや闇要素でてきますね。

（本人のブログ記事 http://cs.hatenablog.jp/entry/2014/05/31/125239 の再掲）
目標にすべき表示速度

# 表示速度で働くユーザーの心理

[Response Times: The 3 Important Limits](http://www.nngroup.com/articles/response-times-3-important-limits/)より、表示速度で働くユーザーの心理は以下のとおりである。

* 0.1秒  
  タスクに対して、即時の応答があるように感じられる限度
* 1.0秒  
  遅延を感じるが、連続的なタスクへの集中力は妨げられない限度
* 10秒  
  処理中のアプリケーションに関心を向けていられる限度

アプリケーションやWebサイトのレスポンスについて、
ユーザーが集中力を保ちながら回遊するためには
**常に１秒以内**にページが表示される事が理想的な目標ラインになります。

この基準は、対象がデスクトップアプリケーションだろうとWebアプリケーションだろうと変わらない普遍的なものです。
test-kitchenで複数のドライバを利用する場合の設定


test-kitchenを使ってごにょごにょ開発環境を作っている時に複数のドライバを使いたい場合ってありますよね。

たとえば、kitchen-ec2使ってubuntu動かしてテストしているときとかかな？  
でも、ec2だとお金かかるし、そもそもkitchen-vagrantだったり、kitchen-docker使って最終的な確認だけをkitchen-ec2使いたい場合とかですかね。


まあそんな感じで僕は両方のドライバを使いたくなったのでこんな感じに`kitchen.yml`書いてみました。


``` kitchen.yml
---
provisioner:
  name: chef_solo

platforms:
  - name: ubuntu-ec2
    driver:
      name: ec2
      aws_access_key_id: <%= ENV["AWS_ACCESS_KEY"] %>
      aws_seret_access_key: <%= ENV["AWS_SECRET_KEY"] %>
      aws_ssh_key_id: <%= ENV["AWS_KEY_PAIR"] %>
      ssh_key: <%= File.expand_path("#{ENV['AWS_KEY_PATH']}") %>
      security_group_ids: ["グループID"]
      region: ap-northeast-1
      availability_zone: ap-northeast-1a
      require_chef_omnibus: true
      ebs_volume_size: 4
      ebs_device_name: 'true'
      ebs_device_name: '/dev/sda'
      flavor_id: 't2.micro'
      tags:
        Name: test-kitchen
      image_id: ami-e74b60e6
      username: ubuntu
  - name: ubuntu-vagrant
    driver:
      name: vagrant
      box: ubuntu/trusty64

suites:

```

platformsでそれぞのドライバ設定できたんですね。  
driver_configとdriverの違いとかいまいちよくわかってないんですが、とりあえずこれで行けるぽいです。

ただ、chef社の[kitchen.yml](https://docs.getchef.com/config_yml_kitchen.html)を見ている感じだと、やっぱ`driver_plugin`と`driver_config`を指定したほうがいいのかなぁーと思います。

おしまい。
AngularJSのDirectiveを切り出す


みんなだいすきAngularJSですが、無駄に学習コストが高いです。

[ AngularJSリファレンス | Amazon](http://www.amazon.co.jp/gp/product/4844336681/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4844336681&linkCode=as2&tag=tempws0b-22)

この本をじっくり読めば大抵の機能は載っています。めちゃんこ便利です。

# 本題
## Directiveってなんじゃらほい
AngularJSではngなんちゃらとか独自のタグとか要素をHTMLのDOMに追加することができます。これをDirectiveと呼ばれる機能で全て統括しています。

Directiveは主にHTMLのパーツを小分けにしたり、特定のタグを上書きして動作を変更したりすることができます。
代表的なのは`ng-form`ですが、`a`も使用しています。
(`a`はhrefが空の時、ブラウザの標準動作を抑止するため)

### 命名規則的な何か
`ng-bind`等の標準のモジュールも同じような方法でDOMに追加されているため、後から読み込まれるであろう、君のコード内で`ng-xxx`をDirectiveを通して追加すれば名前を衝突して、標準の動作を上書きしてしまいます。
かと言って`text`等の安易な名前を指定してしまうと、将来的にHTMLの仕様に追加された際に名前が衝突してしまったり、他のライブラリと衝突してしまう可能性があります。

命名は自分のアプリの名前を先頭に付ければユニークなものとなり確実でしょう。
ライブラリ等に切り出して他で使う際も問題は起きにくいと推測されます。

例: `mb-board` `air-main-menu`

### 実装方法
JavaScript上では`camelCase`で記述して、HTML上では`lower-case`で参照します。

```CoffeeScript
angular.module "ChatBoard", []
  .directive "mainParts", ->
    return {
      templateUrl: "/template/board_main.html"
    }
```

尚、標準では属性のみでDOMに登録されるため、これを使用する場合は

```HTML
<main-parts></main-parts>
```
といった呼び出し方に制限されてしまいます。
`ng-bind`等のように要素として呼び出したり、その両方で登録することもできます。

```CoffeeScript
restrict: 'A'  # 属性のみ
restrict: 'E'  # 要素のみ
restrict: 'AE' # 属性または要素
```

## Directiveを外部のライブラリに切り出す
これが今回の肝です。
AngularJSではMockの注入やngResouces等を使用して、疎結合に設計することが重視されています。
しかし、JavaScriptで記述されたロジックの疎結合は完璧なのに、Viewの部分はハードコーディング　なんて事にはなっていないでしょうか。

そんな時に使用できるかもしれません。
また、ライブラリとして公開するときにも使えると思います。

### 記述方法
先ほどのサンプルコードと同じで構いません。
これを他のファイル名で保存して、ブラウザ上で読み込み、

```CoffeeScript
angular.module "Test", ["ngRoute", "ChatBoard"]
```

と読み込んでやれば完璧です。

お疲れ様でした。