OmniAICreator/Qiita-1.07M huggingface dataset:
rbenv-communal-gems を使うと GEM_HOME が無視される

Gem をローカルディレクトリにインストールしたくて次のように実行した：

```bash
export GEM_HOME=$PWD/local-gems
gem install $gem_name
```

ところが gem は環境変数 `GEM_HOME` で指定したディレクトリではなくデフォルトのディレクトリ（`gem environment gemdir` で表示される場所）にインストールされてしまった。

`GEM_HOME` に適当な値をセットして `gem environment` を実行すると、 INSTALLATION DIRECTORY に `GEM_HOME` の値が反映されていないことが分かった：

```bash
GEM_HOME=xxx gem environment
```

```text:出力
RubyGems Environment:
  - RUBYGEMS VERSION: 2.4.5
  - RUBY VERSION: 2.2.0 (2014-12-25 patchlevel 0) [x86_64-darwin14]
  - INSTALLATION DIRECTORY: /Users/uasi/.rbenv/gems/2.2.0
（略）
  - SYSTEM CONFIGURATION DIRECTORY: /Users/uasi/.rbenv/versions/2.2.0/etc
（略）
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
     - "install" => "--env-shebang"
     - "gemhome" => "/Users/uasi/.rbenv/gems/2.2.0"
     - :benchmark => false
     - "gem" => "--no-document"
（略）
```

`GEM CONFIGURATION` を見ると `- "gemhome" => "/Users/uasi/.rbenv/gems/2.2.0"` という行がある。環境変数よりもここの設定が優先されているようだ。 `~/.gemrc` ではそんな設定はしていないので `SYSTEM CONFIGURATION DIRECTORY` 内の gemrc に書かれているのだろう。見てみると：

```yaml:/Users/uasi/.rbenv/versions/2.2.0/etc/gemrc
# added by rbenv communize
install: "--env-shebang"
gemhome: "/Users/uasi/.rbenv/gems/2.2.0"
```

added by rbenv communize とあるので `rbenv communize` を実行したときに書き込まれたようだ。このコマンドは rbenv のプラグイン [rbenv-communal-gems](https://github.com/tpope/rbenv-communal-gems) のもので、 rbenv が管理する複数の Ruby の gem ディレクトリを共通化するためのものだ。

共通化した gem ディレクトリを `gemhome` として書き込んでいるのだが、その設定の優先度が高いために環境変数 `GEM_HOME` が無視されるということか。

仕方がないので `GEM_PATH` と `gem install --install-dir` を組み合わせることにした：

```bash
export GEM_PATH=$PWD/local-gems:$GEM_PATH
gem install --install-dir "$PWD/local-gems" $gem_name
```
Unityのアプリで、Admobのインタースティシャル広告を連続で出す方法

*注：このトピックは、既にAdmobプラグインをUnityに組み込んでいるユーザーが対象です。*

Googleが提供している広告Admobには、AndroidやiOSだけでなく、Unity用のプラグインもあります。
https://developers.google.com/mobile-ads-sdk/docs/games

これを使うと、バナー広告やインタースティシャル広告も表示できます。
ただ、インタースティシャル広告を使用する場合、上記のURLに載っている方法で表示した場合、一回目は正常に表示されますが、その後、もう一度表示しようとしても表示されません。

その情報は、上記URLのマニュアルには載っておらず、このプラグインのリリースを知らせるGoogleの開発者ブログに載ってます。
なぜ一箇所にまとめていないのかは良く分かりませんが、この情報が意外と見当たらなかったので、備忘録代わりに残しておきます。
http://googleadsdeveloper.blogspot.jp/2014/05/google-mobile-ads-unity-plugin-21-adds.html

このブログによると、Admobのインタースティシャル広告は一回のみ表示される仕様であり、広告を閉じた時にインタースティシャル広告の情報は破棄されるようです。二回、三回と表示するためには、広告を閉じた時に走る`AdClosed`イベントで、インタースティシャル広告を呼び出すデリゲートを設定する必要があるようです。

```csharp:interstitial.cs
public InterstitialAd interstitial;

void Start () {
	RequestInterstitial();
	interstitial.AdClosed += delegate(object sender, EventArgs args)
	{
		interstitial.Destroy();
		RequestInterstitial();
	};
}


// AdMob Interstitial
public void RequestInterstitial()
{
	#if UNITY_EDITOR
	string adUnitId = "XXXXXX";
	#elif UNITY_ANDROID
	string adUnitId = "XXXXXX";
	#elif UNITY_IPHONE
	string adUnitId = "XXXXXX";
	#else
	string adUnitId = "unexpected_platform";
	#endif
	// Create an interstitial.
	interstitial = new InterstitialAd(adUnitId);
	// Create an empty ad request.
	AdRequest request = new AdRequest.Builder()
		.AddTestDevice(AdRequest.TestDeviceSimulator)       // Simulator.
			.AddTestDevice("0123456789ABCDEF0123456789ABCDEF")
			.Build();
	
	// Load the interstitial with the request.
	interstitial.LoadAd(request);
}
	
public void displayInterstitial()
{
	if (interstitial.IsLoaded())
	{
		interstitial.Show();
	}
	else
	{
		Debug.Log ("Interstitial is not ready yet.");
	}
}
```

ソース上のXXXXXXや0123456789ABCDEF0123456789ABCDEFは、適当な値なので、任意の値にしてください。

これで任意の場所で`displayInterstitial();`を実行すると、インタースティシャル広告が表示されます。
このインタースティシャル広告を閉じた時に、`AdClosed`が走り、その時にdelegateで設定された`RequestInterstitial();`が実行され、インタースティシャル広告が再度、読み込まれます。

その後、また`displayInterstitial();`を実行してやると、インタースティシャル広告が表示されます。
これで、何らかのイベントが発生するたびに、何度でもインタースティシャル広告が表示されるようになります。

ただし、Admobのインタースティシャル広告は、過剰に繰り返し表示するのは非推奨のようなので、適当な間隔を開けて表示するよう、注意してください。これが原因なのかは分かりませんが、テストの時、10秒も開けずに連続表示してみると、インタースティシャル広告が表示されない時がありました。

https://support.google.com/admob/answer/6066980?hl=ja

> **インタースティシャル広告を何度も表示（非推奨）**
> 
> インタースティシャル広告の表示は、ユーザーの迷惑にならない程度に抑えておきましょう。何度も表示すると、ユーザーの利便性が損なわれ、意図しないクリックを招く原因ともなります。ユーザーの行動（オプションの選択など）に基づいてインタースティシャル広告を表示する場合は、ユーザーが何かするたびに広告を挟むのは避けましょう。
> 
> 一定の間隔（60 秒毎など）に基づいてインタースティシャル広告を表示する場合は、広告と広告の合間の時間が短くなりすぎないように配慮します。
Drupal7のリージョン定義・追加


# 初期設定
infoファイルでリージョンを指定しないと、Drupal7では暗黙的に以下の設定となります。

- regions[header] = Header
- regions[highlighted] = Highlighted
- regions[help] = Help
- regions[content] = Content
- regions[sidebar_first] = Left sidebar
- regions[sidebar_second] = Right sidebar
- regions[footer] = Footer

# リージョンを追加する

- regions[header] = Header
- regions[highlighted] = Highlighted
- regions[help] = Help
- regions[content] = Content
- regions[sidebar_first] = Left sidebar
- regions[sidebar_second] = Right sidebar
- regions[footer_left] = Right footer
- regions[footer_right] = Left footer

あーはいはい、フッターが2つになったのね。
でも明示的にheaderなども書かかないといけないの？
そう。書かないといけない。例えば

- regions[footer_left] = Right footer
- regions[footer_right] = Left footer

これだけ書くと、フッターが2つしかレイアウトになっちゃいます。
PHPとAjaxでバイナリ？

あるところの質問に想像働かせて答えてみる。多分画像がやりたいんだろうと思ってるんだけど、こうすかね。

```:html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Download Image</title>
        <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
    	<script>
			function download(){
				var image = new Image();
				image.src = 'image.php'
				image.onload = function(){
					$('#result').append(image)						
					alert('downloaded');
					image = null;
				}
			}
		</script>

    </head>
    
    <body>
		<button onclick="download()">Download</button>
		<div id="result">
		</div>
    </body>
</html>
```

```:php
<?php
	header('Content-type: image/jpeg');
	readfile('fish.jpg'); //画像用意してね	
?>
```
ast.NodeTransformerによるコード書き換えの例

[Converterを書くのが面倒だというはなし](http://qiita.com/wonderful_panda/items/dad578ed5b2e77eb58f0) の関係でちょっと試した内容を書いておく。
Pythonでast触る機会はほとんどないので、備忘録として。

## やりたかったこと
たとえば `"v * 2"` という文字列が与えられた時に、引数vを2倍して返すようなfunctionを生成したい。
(引数の名前がvであることは既知とする)

## 実現の方針
### Single Statementの場合
上の例のように、与えられた文字列がSingle Statementの場合は非常に簡単で、単に文字列操作でlambdaにしてevalすればいい。

```py:single.py
text = "v * 2"
func = eval("lambda v:" + text)
```

### Multiple Statementsへの対応
与えられた文字列に複数の式が含まれる可能性がある場合は、上の方法は使えない。
例えば

```
from System.Windows import Thickness
Thickness(v, 0, 0, 0)
```
と指定された場合のことを考える。
とりあえずぱっと思いつくのは、同じように文字列操作でfunction defの形にして、execする方法。
(このコードだと生成されたfunctionはNoneしか返さないんだけど、その話は後で)

```py:multi.py
text = """
from System.Windows import Thickness
Thickness(v, 0, 0, 0)
"""
import re
source = "def test(v):\n" + re.sub("^", "  ", text, flags=re.M)
exec(source)
return test
```

ほとんどの場合はこれでいいんだけど、例えば以下のように、複数行リテラルが与えられた場合に、上のような正規表現による単純なインデント処理ではリテラルの中身までインデントされてしまうという問題がある。

```
"""value of v is:
{v}""".format(v=v)
```

ほとんど考慮する必要もないようなレアケースなんだけど、ダメなパターンがあるのが分かっててそのままというのもちょっと座りが悪いので、別案としてast変換でfunction def化する方針でいく。

1. まず、 `def test(v): pass` という空のfunction defに対するastを生成する。
2. 生成したastのPassノードの部分を、与えられた文字列から生成したastノードに置き換える。

という手順。

コードで書くとこんな感じ。

```py:functionize.py
import ast

class _MakeFunction(ast.NodeTransformer):
    def __init__(self, body):
        self.body = body

    def run(self):
        template_ast = ast.parse('def test(v): pass', mode='exec')
        return self.visit(template_ast)
 
    def visit_Pass(self, node):
        return ast.parse(self.body, mode='exec').body
 
if __name__ == '__main__':
    body = "from System.Windows import Thickness\nThickness(v, 0, 0, 0)"
    functionized_ast = _MakeFunction(body).run()
    exec(compile(functionized_ast, '<string>', mode='exec'))
```

### 戻り値の生成
これでfunctionにはなったけど、先に書いたようにこのままでは戻り値がない。
なのでさらにast変換を使って、Rubyのように最後に評価した式の結果が戻り値として返るように書き換える。
手順は以下の通り。

1. functionの最初に　`_retval_ = None` というコードを追加する
2. functionの最後に `return _retval_` をコード追加する
3. function中の出てくる式を、すべて結果を `_retval_` に対する代入文に書き換える。

これを実行するTransformerをコードで書くとこう。

```py:functionize.py

class _ReturnLastResult(ast.NodeTransformer):
    def visit_FunctionDef(self, node):
        self.generic_visit(node)
        retval_assign = \
                ast.Assign(targets=[ast.Name(id='_retval_', ctx=ast.Store())],
                           value=ast.NameConstant(value=None))               
        retval_return = \
                ast.Return(value=ast.Name(id='_retval_', ctx=ast.Load()))
        node.body.insert(0, retval_assign)
        node.body.append(retval_return)
        return ast.fix_missing_locations(node)

    def visit_Expr(self, node):
        target = ast.Name(id='_retval_', ctx=ast.Store())
        assign = ast.copy_location(
                    ast.Assign(targets=[target], value=node.value), node)
        return assign
```

## コード
最終的なコードはこうなった。
https://gist.github.com/wonderful-panda/8a22b74248a60cc8bb22

結局元のエントリではSingle Statementのみ考慮することにしてこれは使わなかったけど。
BigQuery をスキーマレスっぽく運用する方法

## 3行でまとめ

- 1つの列に JSON 文字列を突っ込む
- [JSON functions](https://cloud.google.com/bigquery/query-reference#jsonfunctions) を使って、必要な値を取り出す
- 要するに RDB の JSON 型みたいな感じで運用しようということ。

## どういう時に使うの？

「1時間後からログ分析するから」とぶっこまれた時。当然、スキーマは決まっていない。あとは、使い捨てのアドホックな分析とか簡易ETLツールとして使うと便利だと思う。

なお、この方法はコストもかかるし、速くもない、実際は BigQuery なので速いけど、相対的には速くないので、甘えずにスキーマはちゃんと決めるようにしよう。

## 手順

### スキーマを準備

```
$ bq mk test.json_test time:timestamp.message:string
```

![スクリーンショット 2015-02-13 22.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/25774/7dfcfb42-501f-ee60-372b-b5cb09b27427.png)

### データを投入

こんな感じで、message 列に JSON を投入。データ投入スクリプトは記事の最後を参照。

![スクリーンショット 2015-02-13 22.28.53.png](https://qiita-image-store.s3.amazonaws.com/0/25774/de7c7c81-59be-f141-b31a-c79511022ecd.png)

### [JSON functions](https://cloud.google.com/bigquery/query-reference#jsonfunctions) を使って JSON を展開する

JSON functions は JSON path が使えるので、柔軟に展開できる。
書式は `JSON_EXTRACT_SCALAR(json, json_path)`

```sql
SELECT
  time,
  message,
  JSON_EXTRACT_SCALAR(message, "$.a") AS a,
  JSON_EXTRACT_SCALAR(message, "$.b") AS b,
  JSON_EXTRACT_SCALAR(message, "$.c") AS c
FROM
  [test.json_test]
```

![スクリーンショット 2015-02-13 22.33.05.png](https://qiita-image-store.s3.amazonaws.com/0/25774/95d24277-2066-9d23-b0df-d702daa4719d.png)

無事に展開できてますね。本格的に分析したくなってきたら、スキーマを決めて、それに合わせて展開したクエリ結果をテーブルに保存するだけでOK。簡易ETLツールとしても使えますね。

## 実験に使ったソース

### ダミーデータ生成

generate.js

```js
for (var i = 0; i < 10000; ++i) {
  var t = Math.ceil(Date.now() / 1000);
  var obj = {
    a: t,
    b: "val" + i
  }
  if (i % 5 == 0) {
    obj.c = "option" + i
  }
  var log = { time: t, message: JSON.stringify(obj) };
  console.log(JSON.stringify(log));
}
```

### ロード用スクリプト

load.sh

```sh
#!/bin/bash -e

TABLE=test.json_test
INPUT_FILE=input.json
node generate.js > $INPUT_FILE

bq rm $TABLE
sleep 5s
bq mk $TABLE time:timestamp,message:string
bq insert $TABLE $INPUT_FILE
```
ObjectMapperにデシリアライズ時のコンストラクタを指定する


Jackson の ObjectMapper で、JSONからデシリアライズする際に使われるメソッドを指定する方法です。

コンストラクタまたは、static のファクトリメソッドに対して、*@JsonCreator* を付けます。
さらに、引数に *@JsonPropery({jsonのキー名})* を指定する事もできます。
以下はそのサンプルです。


## ソース

```java
public abstract class Human {
    public String name;
}

public class Ore extends Human {
    public Omae omae;

    public Ore() {
        name = "俺";
    }
}

public class Omae extends Human {
    public Daigro daigro;

    public Omae() {
        name = "おまえ";
    }

    /**
     * 今回のお題はここ！！
     */
    @JsonCreator
    public Omae(@JsonProperty("daigro") Daigro daigro) {
        System.out.println("@JsonCreator が付いてるコンストラクタが呼ばれたよ！！");
        daigro.chan = this;
        this.daigro = daigro;
    }
}

public class Daigro extends Human {
    @JsonIgnore
    public Omae chan;

    public Daigro() {
        name = "大五郎";
    }
}

```


## テストコード
```java:main.java


public static void main() throws Throwable {

    Ore ore = new Ore();
    ore.omae = new Omae();
    ore.omae.daigro = new Daigro();
    ore.omae.daigro.chan = ore.omae;

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(ore);

    System.out.println(json);
    System.out.println("デシリアライズ開始");


    Ore clone = mapper.readValue(json, Ore.class);

    System.out.println(clone.omae.daigro.chan.name);

}
```

## 結果

```test:実行結果

{"name":"俺","omae":{"daigro":{"name":"大五郎"},"name":"おまえ"}}
デシリアライズ開始
@JsonCreator が付いてるコンストラクタが呼ばれたよ！！
おまえ

```

さらに、

```
 @JsonCreator
 public Omae(@JsonProperty("daigro") Daigro daigro) {
```

の部分を


    
```
@JsonCreator
public Omae(@JsonProperty("daigro") Map<String, Object> daigro) {

```

こうやって書くこともできるので、クラスに戻せない場合は、Mapにして一個ずつセットするなんてこともできる
アプリの認証/認可どうしてるか知りたい

ネイティブアプリの認証にどういう方法があるのか調べたけど、いまいちどういう方法を取ればいいのか確信が持てない。

## ウェブの時代

ウェブサービスではメールアドレスとパスワードを使った認証が多くて、Cookieを使ってセッション管理をする方法が一般的な実装になっている。
認可という概念はあんまり意識されてなくて、セッション情報により認証されたリクエストはすべて認可されるパターンが多い。

認証(AuthN)と認可(AuthZ)の違いが理解されづらいのはたぶんこのことが原因で、明確に使い分けてなかったからだ。

![ウェブ時代のイメージ](https://qiita-image-store.s3.amazonaws.com/0/13113/cd3a1764-e207-b411-da07-af7eb5933843.png)

## なぜ使い分ける必要があるのか？

サービス間連携をカジュアルにセキュアにという気運があった。ウェブAPIをもっとオープンに利用したいしさせたい。
しかし認証情報を他人にあずけるのは好ましくないし、拒否反応を示すユーザも多いだろう。サービス側だって無用なリスクを負いたくはない。

全ての権限（認証情報）はあずけたくないが一部の権限はあずけたい。この要求を満たすには認証と認可の役割を分割し、認可情報の管理をすることで対応できそうだった。
それを標準化しようと考案されたのが`OAuth`で、後方互換性はないが次代バージョンの`OAuth2`は広く使われている。

認証の役割は小さくなり、認可を得るためのステップとなった。

![認証と認可を分離させたイメージ](https://qiita-image-store.s3.amazonaws.com/0/13113/29a3efe0-6460-c7ac-d5be-5206ad770f5c.png)


## ネイティブアプリの認証/認可

ネイティブアプリの認証/認可についてどういう実装が良いのか。

### 認証

認証にソーシャルログインを用いるサービスが増えた。Facebook/Twitter/Google+など。

Twitterを除くとメジャーなIDプロバイダは`OAuth2`が使われていて、利用するための実装はすでに多くの知見が蓄積されているので困ることはないだろう。
OAuth2は認可のためのプロトコルなので認証に利用するには十分な注意を必要とするが、その点も多分に指摘されているので触れない。

独自のサービスアカウントを作る場合は、相変わらずメールアドレスとパスワードの組み合わせが多い。
メールアドレスはユーザ名に置き換えるパターンもあるが、認証情報については今のところそう悩む必要はないように思う。
メジャーなIDプロバイダやクリティカルなデータを取り扱うサービスでは、二段階認証が導入されている。

### 認可

Cookieを使っているアプリ。恐らく旧来のセッション管理。

* Instagram
* Evernote
* MoneyForward

認可のための独自実装を考えなくてはならないが、多くのアプリはAPI提供をしていないし複雑な認可処理を必要としないので問題にならない。またOAuth2との共存が出来ないというわけじゃないので、必要となれば導入すればよい。
Cookieは洗替をアプリ側で意識することが少なくて楽だ。

OAuthやOAuth2を使ったアプリが増えてきた。公式アプリもパブリッククライアントの一種。(APIとアプリの提供者が同一)

* Pinterest
* Foursquare

OAuth2を使うとサーバを経由するブラウザ遷移型の`認可コード`による実装が、`client_secret`をアプリ内に必要としないため堅実。
`refresh_token`による`access_token`の洗替はきっと面倒くさい。

しかし認証処理のためにブラウザに遷移するのは他サービスのIDプロバイダを利用する場合ならともかく、公式アプリでやるのはどうなんだろう。

`リソースオーナーパスワードクレデンシャル`は旧来のセッション管理に近いが、このグラントで`client_id`と`client_secret`を要求する理由が分からない。認証情報を握ってしまえば、クライアントの認証など必要ないのではないのか。
いずれにしてもclient_secretが漏れる状態は気持ち悪い。

OAuth2を拡張して認証情報とaccess_token(+refresh_token)を交換するグラントを実装してしまうのが手っ取り早いかなと考えている。
認証情報はメールアドレスとパスワード、またはIDプロバイダのaccess_tokenだ。
テーブルをリネームしようとしたら「Input string is longer than NAMEDATALEN-1 (63)」が

記事タイトルのエラーメッセージは、PostgreSQLの場合ですが、mysqlでも同様のエラーは起こりうると思います。

**「テーブル名は63文字以内なのに！」**

と言った場合に起きますが、テーブル名をリネームした結果、インデックス名が63文字を超えてしまう場合等に起きるようです。

```
~/.rvm/gems/ruby-2.0.0-p353/gems/activerecord-4.0.3/lib/active_record/connection_adapters/postgresql/schema_statements.rb:426:in `rename_index'
~/.rvm/gems/ruby-2.0.0-p353/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:850:in `block in rename_table_indexes'
~/.rvm/gems/ruby-2.0.0-p353/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:847:in `each'
~/.rvm/gems/ruby-2.0.0-p353/gems/activerecord-4.0.3/lib/active_record/connection_adapters/abstract/schema_statements.rb:847:in `rename_table_indexes'
```

こんな感じ。

---

テーブル名を変更する前に、インデックス名を63文字以内に収まるようにリネームしてあげると解決するみたいなので、そうしてあげましょう

```rb
class RenameTable < ActiveRecord::Migration
  def change
    rename_index :table, :index_table_aaaaaa_id_and_bbbbbb_id_and_ccccccc_id, :index_table_columns
    rename_table :table, :long_long_long_table_name
  end
end
```
はじめてのCocoaPods Swift対応



インストール

``` sh
$ sudo gem install cocoapods --pre
```

初期設定

``` sh
$ pod setup
```

Podfile作成・編集

``` sh
$ cd xcodeprojがあるディレクトリ
$ pod init

$ vi Podfile
# Uncomment this line to define a global platform for your projec

platform :ios, '8.0'

target 'PJ名' do
  pod 'ライブラリ名'
end

target 'PJ名Tests' do
end
```

xcode起動

``` sh
$ open libtest.xcworkspace
```

enjoy!
[iOS]コードを書かずにStatus Barのスタイルを変える

コードを書いてもいいならUIViewControllerに

```swift
override func preferredStatusBarStyle() -> UIStatusBarStyle {
	return UIStatusBarStyle.BlackOpaque
}
```

的なコードを書くことになりますが、実はXcodeでプロジェクト設定を弄るだけで変更できます。

下の画像に示した、`Development Info`にある`Status Bar Style`プルダウンメニューからお好きなStatus Barのスタイルをお選び下さい（まあiOS8では`Default`と`Light`の二種類しか選べませんが）。ここでメニューの下にある`Hide Status Bar`のチェックボックスにチェックするとStatus Barが消えるようになります。

![スクリーンショット 2015-02-13 21.29.30.png](https://qiita-image-store.s3.amazonaws.com/0/3387/ed5a11bd-d8ad-9710-2e93-b02e5d1be61d.png)

実はこの設定だけではスタイルに反映されません。Infoタブの`Custom iOS Target Properties`に`View controller-based status bar appearance`というプロパティを追加し、`NO`を設定して下さい。

![スクリーンショット 2015-02-13 21.29.26.png](https://qiita-image-store.s3.amazonaws.com/0/3387/77175b5e-9f50-9557-0a48-cf6337a0fc4b.png)

最初の項目がGeneralタブから簡単に見つかるだけに、これだけで設定が終わりだと思ってしまいちょっとハマりました。流石に非直感的すぎると思います。

ちなみにコードからスタイルを設定する方法だと`UIStatusBarStyle.BlackOpaque`というスタイルが設定できるように見えますが、実際にこれを設定しても`Light`になるだけでした。
UIWebVIewをrefreshControlでリロードする(swift)

webView.scrollViewにrefreshControlをaddSubviewするだけ。

```swift

class MyViewController: UIViewController, UIWebViewDelegate {
 
    @IBOutlet weak var webView: UIWebView!

    var refreshControl:UIRefreshControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        addRefreshControl()
    }

    func pullToRefresh() {
        self.refreshControl.endRefreshing()
        self.webView.reload()
    }

    func addRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "読込み中...")
        refreshControl.addTarget(self, action: "pullToRefresh", forControlEvents:.ValueChanged)
        self.webView.scrollView.addSubview(refreshControl)
    }
}
```
Slim で html_safe してる奴wwwwwwwww

タイトルはさっきまでの僕です。

```slim
/ エスケープされる
= '<i class="fa fa-envelope-o fa-fw"></i>メール送信'

/ エスケープされない
= '<i class="fa fa-envelope-o fa-fw"></i>メール送信'.html_safe
== '<i class="fa fa-envelope-o fa-fw"></i>メール送信'
```

`==` 使えばエスケープされないおwwwwwww
Ubuntuにhhvmをインストール(vagrant+virtualbox)


hhvm+hackを実行できる環境を構築するメモ
まずは、ubuntu環境を作る

```
$ mkdir precise64
$ cd precise64
```

boxファイルのダウロード

```
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box
Successfully added box 'precise64' with provider 'virtualbox'!
```

初期化して、vagrantfile作成

```
$ vagrant init precise64
```

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise64"
  config.vm.network :private_network, ip: "192.168.33.11"
end
```

起動して、確認。

```
$ vagrant up
$ vagrant ssh
```

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"
```

パッケージの更新をしておく

```
$ sudo apt-get update
$ sudo aptitude install python-software-properties
```

hhvmのインストール。以下を参考に
https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Ubuntu-12.04

```
$ sudo add-apt-repository ppa:mapnik/boost
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
$ echo deb http://dl.hhvm.com/ubuntu precise main | sudo tee /etc/apt/sources.list.d/hhvm.list
$ sudo apt-get update
$ sudo apt-get install hhvm
```

Hello Worldのサンプルコードを記述

```hack::hello.hh
<?hh
echo 'Hello World!';
```

.hhconfig作成後に、実行

```
$ touch .hhconfig
$ hhvm hello.hh
Hello World!
```

とりあえず、ここまで。
vimgrepで、conflict起こした時の手動修正を楽にする


## 前提知識
前提知識と参考URLを以下に。

- vimgrep
http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b

- git rebase
http://qiita.com/shyamahira/items/0e457f3611167f4c3e88


## 背景
__remoteにpushする時は、親ブランチにrebaseしてからpush！__
でも親ブランチから切ってから間隔空くと、__盛大にconflict起こす__こともしばしば。
__複数ファイルでconflict__が起きたら、一つ一つのファイルを自分で開くのが面倒なので、そんな時のTips。


## 本題
1. vim起動。
`$ vim hoge.txt`
<br>

2. vimのコマンドラインモードから、vimgrep使う。
`:vim /^<\+\sHEAD$/ ./** | cw`
<br>

3. [Quickfixリスト]にconflictしたファイル一覧とその該当箇所が表示される。
<br>

4. `:cnext`, `:cprevious`でファイル間を移動して、conflictを解消していく。
<br>

何やってるかというと、vimgrepの正規表現で、
`<<<<<<< HEAD`
を検索して、Quickfixリストに入れてます。


## 終わりに
vimから出なくて良いので、楽っす。
vimrcにalias入れとくのがオススメです。
Xcodeで2点間の距離を測定するために最適な方法

ゲームなどでの2点間の距離を測る機会が多いのですが、三平方の定理を使うためのリソースが重荷になりがちです。
そこで、距離の測定にはどの方法が最適なのかを検証してみることにしました。

検証に使ったコードは以下のとおりです。

```objc:ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    CGPoint pointA = CGPointMake(100.0f, 100.0f);
    CGPoint pointB = CGPointMake(300.0f, 200.0f);
    NSArray *repeatTimes = @[@(1000),
                             @(10000),
                             @(100000),
                             @(1000000),
                             @(10000000)
                             ];
    
    for (NSNumber *num in repeatTimes) {
        NSDate *beforeDate = [NSDate date];
        for (long i=0; i<[num intValue]; i++) {
//            [self doNothing:pointA with:pointB];
            [self calcDisntaceA:pointA with:pointB];
//            [self calcDisntaceB:pointA with:pointB];
//            [self calcDisntaceC:pointA with:pointB];
        }
        NSTimeInterval interval =fabs([beforeDate timeIntervalSinceNow]);
        NSLog(@"%d times repeat took %f seconds!", num.intValue, interval);
    }
}

//何も計算しない
-(CGFloat)doNothing:(CGPoint)pointA with:(CGPoint)pointB{
    CGFloat distance;
    return distance;
}

//方法A
-(CGFloat)calcDisntaceA:(CGPoint)pointA with:(CGPoint)pointB{
    CGFloat xDistance = pointA.x - pointB.x;
    CGFloat yDistance = pointA.y - pointB.y;
    CGFloat distance = sqrtf(xDistance*xDistance + yDistance*yDistance);
    return distance;
}

//方法B
-(CGFloat)calcDisntaceB:(CGPoint)pointA with:(CGPoint)pointB{
    CGFloat xDistance = pointA.x - pointB.x;
    CGFloat yDistance = pointA.y - pointB.y;
    CGFloat distance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2));
    return distance;
}

//方法C
-(CGFloat)calcDisntaceC:(CGPoint)pointA with:(CGPoint)pointB{
    CGFloat xDistance = pointA.x - pointB.x;
    CGFloat yDistance = pointA.y - pointB.y;
    CGFloat distance = hypotf(xDistance, yDistance);
    return distance;
}
```
何も計算を行わないメソッドを用意し、他の方法の所要時間から引くためのバックグラウンドとします。
方法Aは、x軸方向、y軸方向それぞれの距離を掛け合わせて平方根をとります。
方法Bが、C言語の関数関数powfを用いて2乗の計算をします。
方法Cは、C言語の関数hypotfを用いて2つの引数のそれぞれの2条の和の平方根をとります。

なるべく同じ条件で測定できるように、測定は全てiPhone5の実機を用いて行い、ある方法で計算する場合は他の方法をコメントアウトしました。
また、再現性を得るために何度も実行して結果が変わらないことを確認しました。

結果は以下の通りです。

![２点間の距離測定の所要時間4.png](https://qiita-image-store.s3.amazonaws.com/0/35297/c288e388-2e79-a51a-7359-213c54eaabed.png)

方法Aが最も速く、方法Bが最も遅いという結果が得られました。
方法Bではpowfの指数の型が小数のため、内部で複雑な計算が行われているものと考えられます。
方法Cではmath.hのhypotf関数を用いましたが、シンプルな方法Aよりも遅いという結果になりました。これは、以下のリンクにあるように、2乗の計算結果の桁数が大きすぎて精度を損ねることを防ぐための処置が内部に記述されているためと考えられます。
http://en.wikipedia.org/wiki/Hypot

結論: 速度を重要視する場合はシンプルな方法Aが、精度を重要視する場合はC言語標準の関数を用いた方法Cを選択するのがいいかと思います。といっても距離の精度は7桁もあれば大抵の場合十分であり、方法Aは方法Cの半分の所要時間なので、大抵の場合は方法Aを用いるのがいいかと思います。
方法Bは方法Aの10倍弱所要時間がかかるので問題外です。powf関数は距離の測定には用いないほうがいいようです。

2点間の距離　= sqrtf(x軸方向の距離 * x軸方向の距離 + y軸方向の距離 * y軸方向の距離)
というシンプルな計算が大抵の場合はベストかという結論に落ち着きました。
vagrant環境で開発してcapistranoでデプロイするとGemefile.lockがないとか色々怒られたよ

# Gemfile.lockがないだって！？

カッコつけてキーボードを
`bundle exec cap staging deploy`
とか叩きつけると以下のように怒られちゃいます。

The --deployment flag requires a Gemfile.lock. Please make sure you
have checked your Gemfile.lock into version control before deploying.

Gemfile.lockを監視対象に入れろと言われてしまいます。
ですが.gitignoreのどこを見ても除外対象にはしていないわけです。これは困ったね。

# 原因:vagrantを使用していてリポジトリのルートとアプリのルートが一致してないかった

githubでもbitbucketでもいいですが、リポジトリを確認してみるとうっかりちゃっかりこんな感じになってませんか？

.chef
vagrant
 ├.capistrano
 ├app
 ├assets
 └......
.gitignore

アプリのルートがvagrant/であると教えてあげる必要があります。
capistrano3.1以降だとワンライナーで書けてしまうようです。

```rb
set :repo_tree, 'vagrant'
```

自分の場合dotenvを使用してrepourlを指定しているので、以下のように。

```rb
require 'dotenv'
Dotenv.load
lock '3.3.5'
set :repo_url, ENV['REPO_URL']
set :repo_tree, 'vagrant'
```

盲点タイプのハマりどころで検索しても全くヒットしないので(自分のためにも)書き記しておきます。
JavaでAWS Elastic Transcoderを使う


Elastic Transcoder自体の設定で、予めパイプラインを作成して、入力元bucket、出力先bucketなどを指定しておく必要がある。

コードは例によってGroovy Script。

```groovy
@Grab('com.amazonaws:aws-java-sdk:1.9.17')
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClient;
import com.amazonaws.services.elastictranscoder.model.CreateJobOutput;
import com.amazonaws.services.elastictranscoder.model.CreateJobRequest;
import com.amazonaws.services.elastictranscoder.model.CreateJobResult;
import com.amazonaws.services.elastictranscoder.model.JobInput;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;


// 変換用動画ファイルをS3へアップロード

AWSCredentials awsCredentials = new BasicAWSCredentials("awsAccessKey", "awsSecretAccessKey");

ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("proxyhost");
clientConfiguration.setProxyPort(80);

AmazonS3 s3Client = new AmazonS3Client(awsCredentials, clientConfiguration);

long now = new Date().getTime()
String key = "uploadtest_" + now + ".wmv";

// アップロード
s3Client.putObject("inputBucket", key, new File("sample.wmv"));


// Elastic Transcoderで変換

// 出力の設定
CreateJobOutput output = new CreateJobOutput();
output.setPresetId("1351620000001-100070"); // Web PresetId
output.setKey("output_" + now + ".mp4");

// 入力の設定
JobInput input = new JobInput();
input.setKey(key);

// 変換リクエストを作成
CreateJobRequest request = new CreateJobRequest();
request.setPipelineId("your pipelineId"); // パイプライン名ではなく、右の形式のもの ^\d{13}-\w{6}$
request.setInput(input);
request.setOutput(output);

AmazonElasticTranscoderClient amazonElasticTranscoderClient = new AmazonElasticTranscoderClient(awsCredentials, clientConfiguration);
Region region = Region.getRegion(Regions.AP_NORTHEAST_1);
amazonElasticTranscoderClient.setRegion(region);

// 変換
CreateJobResult createJobResult = amazonElasticTranscoderClient.createJob(request);

println createJobResult.getJob().getId(); // 変換依頼したジョブのid表示

```
ADX2 LEを使おう その１

ゲームでサウンドは非常に重要であるが、最適な機能を提供している環境はほぼない。

CRI ADX2はあらゆるプラットフォームで動作し、サウンドの最適な機能を提供するミドルウェアで
非常に便利であるため、私は７年程使用している。
私は今まで培ってきたゲームサウンドのノウハウを可能な限り語るつもりだが
その量はかなり多いため、記事をいくつかに分けて説明していく。
まずは、前提として必要な情報を記載しよう。

##最適とは何か
私が考える汎用的なゲームサウンドの最適とは

* ストリーミング再生をサポートしている
* オンメモリ再生をサポートしている
* データとプレイヤーが分かれている
* ファイル容量が少ない
* ファイルパッキングをサポートしている

ADX2はこれらを全てサポートしている。

##サウンドの種類について
ゲームで使用するサウンドは大きく分けて以下の３つのカテゴリに分かれる。

* BGM
* SE
* VOICE

###BGMについて
BGMとは「Back Ground Music」のことで、裏で流れ続ける音のことである。
この音はある程度長い時間が求められるため、**ストリーミング**での再生を推奨する。

###SEについて
SEとは「Sound Effect」のことで、カーソル移動や決定、キャンセルなどの効果音のことである。
ヒット音や爆発音などもSEに該当する。SEは長さが短く、即時に再生が求められるため
**オンメモリ**での再生を推奨する。

###VOICEについて
VOICEとは音声のことで、ゲームのキャラクターの話す音のことである。
ボイスは即時に再生する必要がある場合とない場合があるため**ストリーミング**と**オンメモリ**を
使い分ける必要がある。

##ストリーミングとオンメモリについて
ここではストリーミングとオンメモリの意味、メリット、デメリットについて説明する。
###ストリーミング再生とは
再生しながら読み込みを行う再生方法である。
具体的には一定時間再生分のバッファを用意してリングバッファとして扱い
そのバッファに読み込みながら再生を行います。

####メリット

* 消費メモリが少ない

####デメリット

* 再生命令を発行してからファイルを読み込みに行くため、即時再生ができない(事前に読み込み準備をしておけば即時再生可能)
* ファイルアクセス頻度が高いため、同時に他のファイルを読むことがある場合、音が途切れる可能性がある

###オンメモリ再生とは
音声データをメモリに全て読み込んで再生する方法である。

####メリット

* 再生命令を発行してから即時に再生される

####デメリット

* 全てをメモリに乗せるため、メモリ消費量が多い

##データとプレイヤーについて
データとはサウンドファイルの事であり、プレイヤーとは再生する機能のことである。
プレイヤーの数だけサウンドを同時に再生することができる。
環境によってはデータとプレイヤーが一体となっているものがあり
その場合、シューティングのショット音や撃破音など同じ音を複数同時に鳴らす時に
同じデータを複数読まなくてはいけないため無駄が生じる。


[その２](http://qiita.com/sawasaka/items/07eb3741cc486baceab1)へ続く
wslogi (A websocket logging framework for Erlang/OTP) を作った

wslogi (A websocket logging framework for Erlang/OTP) を作った
=====

歌舞伎座.tech#5の時にVoluntasさんが[Websocketを使ったログの話](https://gist.github.com/voluntas/cae671638cd104d05719)をしていたので, 今更ながら影響されて自作したので紹介する.

レポジトリ|[soranoba/wslogi](https://github.com/soranoba/wslogi)|
---|---|
バージョン|v0.1.1|
ライセンス| MIT License|

ちなみに, 英語が全然できないのでdocumentの英語はあまり信用してはいけない.

## 概要
- websocketでログを取得できる
- log levelをログ取得者が指定できる
- ログ取得者はログの収集範囲を指定できる
 - 範囲指定はアクセスパスに依存し, それ以下のパスへのログを全て取得できる
 - e.g. `/hoge/path`に対するログは `/`, `/hoge`, `/hoge/path`で取得可能
- ログ取得者はフィルターを設定できる

## 使い方
### Erlang (Server)
１. rebarで使用するライブラリに記述
２. websocketの待ちポートを指定する
   
```erlang
ok = wslogi:start(8080)
```

３. 必要に応じて headerを設定する

```erlang
ok = wslogi:set_headers([{ip, {192,168,0,1}}, {port, 80}])
```
headerは`pid/0`に紐付く為, 呼び出し元のプロセス毎に異なる.

４. ログを出力する

```erlang
_ = wslogi:info("/log", "hoge: ~p~n", ["fugo"])
```
第一引数で指定したパスより上の階層にアクセスしたclientに対してログを送る.
他のログレベルについては[ドキュメント参照](https://github.com/soranoba/wslogi/blob/master/doc/wslogi.md)

### Websocket (Client)
１．websocket用のclientを用意する (開発中は[progrium/wssh](https://github.com/progrium/wssh)を使っていた)
２．アクセスする

```bash
wssh localhost:8080/log
```
この時に指定するURLでログの収集範囲が決まる.
全て取得したい場合は`/`にアクセスすれば良い.

３．適当にコマンドを叩く
初期状態が`stop`なので`start`しないとログの収集を開始しない.

[コマンド一覧](https://github.com/soranoba/wslogi/blob/master/priv/help.md)

|コマンド|説明|
|:---|:---|
|filter add | filterを追加する. 内部的に`re`を使用している |
|filter remove | filterを削除する. 複数同時指定可能 |
|filter show | 現在のfilterを出力する |
|filter header | headerでfilterを行う |
|help | 上記のコマンド一覧を出力する |
|level list | 指定可能なlog levelを出力する |
|level show | 現在取得対象のログレベルを出力する |
|`level <number>` | ログレベルを簡単に指定する. 0が取得なし. |
|`level <level>` | `level list`で出力されたlog levelを指定可能 <br /> e.g. `level debug +info +alert` |
|start|ログ出力開始|
|stop|ログ出力停止|

ちなみに`level`の指定は`+`,`-`なしが　それのみにする, `+`が加える, `-`が除く.
`+`, `-`は`level`の左に空白なしで繋げる必要あり.


## 既知のバグ？
- 末尾呼び出しでログを書き出すと, 正しいモジュール名 / 行番号が取得できない (気がする)
- 複数ポートでwebsocketを待つことができるが, 使い分けることはできない
aws s3 sync でAmazon S3のバケット内のデータをローカルに同期する

[AWSコマンドラインインターフェイス](http://aws.amazon.com/jp/cli/)を使うと簡単にAmazon S3のバケットにファイルをアップロードしたり、逆にバケットのデータをローカルにまるごとバックアップしたりすることができます。

## 事前準備

1. 上記サイトの指示にしたがってインストールしておく。
2. IAMのアクセスキーを準備しておく。
3. `aws config`コマンドを実行してアクセスキーなど設定しておく。

詳しくは[【初心者向け】MacユーザがAWS CLIを最速で試す方法](http://dev.classmethod.jp/cloud/aws/mac-aws-cli/)とか[ドキュメント](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-set-up.html)とかを参照。

## コマンドの使い方

1. `aws s3 sync <ローカルパス> <S3パス> [options]`
2. `aws s3 sync <S3パス> <ローカルパス> [options]`
3. `aws s3 sync <S3パス> <S3パス> [options]`

の3種類パターンがあります。**左に書いた方から右に書いた方へデータをコピー**します。
オプションについては[ドキュメント参照](http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)。

## 例

次のコマンドは**ローカルからS3へのアップロード**を行います。

    aws s3 sync . s3://mybucket

ローカルに test.txt, test2.txt があるとしたら、test.txt が s3://mybucket/test.txt へ、test2.txt が s3://mybucket/test2.txt へ、それぞれアップロードされます。
ローカルファイルのサイズとS3上のオブジェクトのサイズが異なる場合、ローカルファイルの最終更新日がS3上のオブジェクトより新しい場合、S3上のオブジェクトが存在しない場合にアップロードが行われます。

---

次のコマンドは**S3からローカルへのダウンロード**を行います。

    aws s3 sync s3://mybucket .

S3上に test.txt, test2.txt があるとしたら、s3://mybucket/test.txt が test.txt へ、s3://mybucket/test2.txt が test2.txt へ、それぞれダウンロードされます。
ローカルファイルのサイズとS3上のオブジェクトのサイズが異なる場合、S3上のオブジェクトの最終更新日がローカルファイルより新しい場合、ローカルファイルが存在しない場合にダウンロードが行われます。

---

次のコマンドはS3バケット間でオブジェクトをコピーします。

    aws s3 sync s3://mybucket s3://mybucket2

この結果、s3://mybucket/test.txt が s3://mybucket2/test.txt へ、s3://mybucket/test2.txt が s3://mybucket2/test2.txt へ、それぞれコピーされます。

---

ここまでのそれぞれのコマンドは、ファイルを削除することはできません。
`--delete` オプションを付けると、コピー元からいなくなった宛先にのみ存在するファイル・オブジェクトを削除します。

    aws s3 sync . s3://mybucket --delete

`--exclude` オプションを付けると、該当するパスをsync処理の対象外とします。
例えばJPEG画像はコピーしたくない場合は次のようにします。

    aws s3 sync . s3://mybucket --exclude "*.jpg"

例えば次のようにすると、*another/* を含むパスはコピーしません。

    aws s3 sync s3://mybucket/ . --exclude "*another/*"

詳しくは[ドキュメント](http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)を読んでね。
多分正確な時刻をNTPから取る

ユーザのモバイル端末をそこそこ正確に同期したい瞬間があります。
しかしその為だけにサーバ立てるのも面倒です。

NICTがJSONサーバを建ててくださっているので、そちらを使いましょう。
一応、負荷をかける使い方はしない方がいいかと思います。

[日本標準時プロジェクト https/http を介してアクセスされる場合](http://www2.nict.go.jp/aeri/sts/tsp/PubNtp/http.html)


##ポイント

下記の３つから、レイテンシを考慮した現在時刻を計算します。

 * リクエスト送信時（クライアント）
 * サーバ時刻（JSON内）
 * レスポンス受信時（クライアント）

概ね、レイテンシは「（レスポンス受信時 - リクエスト送信時 ）/ 2」となると思われます。
そのため、現在時刻を計算するには、サーバ時刻からレイテンシ分進めてあげればいいことになります。

##ソースコード

NTPを元に現在時刻との差分を計算し、なるべく正確な時刻を表示するサンプルです。

```html
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="bower_components/superagent/superagent.js"></script>
</head>
<body>
    <p id="timeAmount"></p>
    <script>
        var request = window.superagent;
        var sendTime = new Date().getTime();
        request.get("https://ntp-a1.nict.go.jp/cgi-bin/json")
                .end(function(res){
                    var timeobj = res.body;
                    var endTime = new Date().getTime();
                    console.log("latency: " + (endTime - sendTime) / 2 + "ms");
                    var fixedTime = parseInt(timeobj.st * 1000 + (endTime - sendTime) / 2, 10);
                    var localTime = new Date().getTime()
                    var offset = fixedTime - localTime;
                    console.log("fixedTime: " + fixedTime);
                    console.log("localTime: " + localTime);
                    console.log("offset: " + offset);
                    setInterval(function(){
                        var el = document.querySelector("#timeAmount");
                        el.innerText = new Date(new Date().getTime() + offset);
                    }, 10);
                });
    </script>
</body>
</html>


```
Riot.jsで通貨コンバータを作る


[Riot.js](https://muut.com/riotjs/)を使った、シンプルな通貨コンバータです。[Browserify](http://browserify.org/)でプリコンパイルするサンプルとして作ってみました。Yahoo!からAPIで現在の通貨レートを取得して表示するだけ。インクリメンタルサーチができます。(よく考えたら、「コンバータ」ですらないですね)

※この記事は、[こちら](https://github.com/cognitom/riotjs-currency-calculator)の日本語版的な内容になります。

![Currencies.png](https://qiita-image-store.s3.amazonaws.com/0/1858/2f61a5e8-2192-5a44-ba10-12d10effb40e.png "Currencies.png")

## 試す

GitHub Pagesに置いておきました。[Riot.js Currency Calculator](http://cognitom.github.io/riotjs-currency-calculator/)にアクセスしてみてください。

## クローンとビルド

手元で試すには、次の手順でどうぞ。

0. [このリポジトリ](https://github.com/cognitom/riotjs-currency-calculator)をクローン
0. `$ npm install`
0. `$ npm start`

## Gulp と Browserify

この例では、いくつかの`gulp`タスクが定義されています。

- `clean`: 生成されたファイルを削除する
- `browserify`: `.js`, `.tag`ファイルをコンパイル
- `css`: `autoprefix`とミニファイほか
- `others`: `index.html`など、上記以外のファイルの移動

### Browserify の基本的な使い方

[riotify](https://github.com/jhthorsen/riotify)で、`.tag`ファイルのコンパイルが可能です。ちなみに、`.tag`ファイルは、riotで使うテンプレートとスクリプトが一緒になったものです。

```coffeescript
gulp.task 'browserify', ->
  browserify
    entries: [$.app]
    debug: true
  .transform riotify
  .bundle()
  .pipe source path.basename $.app
  .pipe buffer()
  .pipe gulp.dest $.dist
```

実際には、上記のほかソースマップや圧縮が必要です。詳しくは、`gulpfile.coffee`を参照。

## CSS *-processors

Riot.jsはCSSプリ/ポストプロセッサには対応していません。

- CSS プリプロセッサ: LESS or Sass
- CSS ポストプロセッサ: autoprefixer
- CSS import, compression, lint, ...ほか

ただ、下記の方法でCSSプロセッサを使うことは可能です。

- `<style>...</style>`の部分を`browserify`タスクで無視
- `<style>...</style>`の部分を`css`タスクで抽出して`style.cssに`加える

そのために使えるヘルパーがいくつかあります。

### transformify

`transformify`は、テキストを指定の関数で処理できるトランスフォームです。ここでは、`riotify`に渡す前に`<style>...</style>`を削除しています。

```coffeescript
transformify (tag) ->
  tag.replace /<style>[\s\S]*<\/style>/gm, ''`
```

### gulp-replace

`.tab`ファイルから、`<style>...</style>`の部分を抽出して、他のCSSと結合しています。

```coffeescript
replace /(^[\s\S]*<style>|<\/style>[\s\S]*$)/gm, ''`
```

## CSSをtagファイルに書く or 書かない

tagファイルに書くと、見通しが良くなります。スタイルやスクリプトが長くなって、全体像が分かりにくくなったら、おそらくコンポーネントを分割するべきです。1ファイルで、HTML, CSS, JavaScriptがわかりやすくまとまっているのが理想的だと思います。

```html
<item>

<span class="title">{ opts.title }</span>
<span class="price">{ opts.price }</span>
<span class="usd">= 1 USD</span>

<style>
  item {
    display: block;
    border-bottom: 1px dotted #ddd;
    background: white;
    line-height: 2em;
    padding: 0 7%;
  }
</style>

</item>
```

ただし、Riot.js単体では今のところ...

- CSSプロセッサが使えない
- 繰り返し要素で、同じ`<style>`が出現する

という問題を含んでいます。

なので、上記で紹介した方法をとるか、CSSについては最初から別ファイルに書くのが、しばらくは現実的でしょう。
【Javascript】2つのDateオブジェクトが同じ時間を示していることを確認する



## Dateオブジェクトで意外なところで詰まった。

```javascript
var d1 = new Date('2015-2-14 00:00:00');
var d2 = new Date('2015-2-14 00:00:00');
```

2つのDateオブジェクトがあった際に、それらが同じ時間を指していることを示したい。

```javascript
console.log(d1===d2) //false
```
ですよねー。。
ちょっとJSをかじったことがある方なら見えていた結果だと思います。

## じゃあ、どうするか考えた。

あれ？そういえば比較ならいけるよね。

同じ時間ということは、d1はd2に比べて大きくもなく小さくもなくってことだよね。（頭のなかにベン図）

じゃあ、こうだ！

```javascript
console.log(!(d1<d2||d1>d2)) //true
```

いけた！！！

## 他の方法も

数値にしてでの比較の方法も考えて、これも使えそうだなと。

```javascript
console.log(parseInt(d1)===parseInt(d2)) //true
console.log(d1/1===d2/1) //true
```

ちなみに、以上かつ以下、というこれも使えるけど、

```javascript
console.log(d1<=d2&&d1>=d2) //true
```
こちらはかなり遅い。


それぞれ100,000回実行した際の時間を書くと

```javascript
console.log(!(d1<d2||d1>d2)) //3,070ms
console.log(parseInt(d1)===parseInt(d2)) //3,754ms
console.log(d1/1===d2/1) //2,880ms
console.log(d1<=d2&&d1>=d2) //8,386ms
```

ということでした。

```javascript
console.log(!(d1<d2||d1>d2)) //3,070ms
console.log(d1/1===d2/1) //2,880ms
```

この2つはあんまり差はないので(1.07:1くらい)、あとはコードの可読性で選ぶ感じかな。

```getYear()``` とかを使い続けて文字列化して比較、は明らかに遅そうなので試してさえいないっす。


他になんか良い方法ないんすかね。
【AWSサービス紹介】AWS Resource Group と Tag Editor を使おう

沢山インスタンス立てたり、セキュリティグループ作ったり、VPC設定したり、Elastic Beanstalk使い出すと、どれが何のために立てたか訳分からなくなるという状況に落ち入った所に、**Resource Group**というものがあることを知ったので覚え書き

＞過去の自分 ちゃんとタグを使いましょう

# Resouce Group
特定のタグを付与しているサービスをひとまとめに整理できる優れもの
ちょっと気付きにくい所にあるので、場所だけスナップ

![AWS-ResourceGroup.png](https://qiita-image-store.s3.amazonaws.com/0/40983/720618f8-8d57-a5bf-16ea-5be604a93867.png)


# Tag Editor
一気にタグの編集ができる便利ツール


# 参考
* [【AWS発表】リソースグループと新しいタグ編集機能](http://aws.typepad.com/aws_japan/2014/12/resource-groups-and-tagging.html)
* [【新機能】複数のインスタンスのタグを一発で書き換える[Tag Editor]と共通タグをコレクション化する[Resource Groups]](http://dev.classmethod.jp/cloud/aws/introduce-of-tageditor-resourcegroup/)
BigQueryの課金について考えた（UNION編）

#ということで後編
すいません。時間が空いちゃいました。
**ちなみに前編を書いた後に、社内では『select *』禁止令を出しました。w**
ということで後編。JOINやUNIONについてやってみましょう。
**これ書いている最中にJOIN書くとすげぇ長くなるわ！ということでUNION編とJOIN編に分けさせて頂きます。**
実はそもそもこれを書こうと思ったきっかけは同一テーブルのUNIONでコストが変わらないことでした。どういうこと？って人も居ると思いますが、まぁやってみましょう。

##UNION編
###同一テーブルでUNION（同じところをWHERE句で指定）
まずはこんな容量のテーブルです。商品マスタが入っています。
> Table Size 2.24GB
> Number of Rows 8,477,398

あんまりコストをかけると怒られる（？）のでUNIONで出す値は商品コードだけにします。
まずはwhere句を付けないでUNIONもやらないでやるとどのぐらいか。
>Query complete (17.4s elapsed, 65.5 MB processed)

まぁ、こんなもんです。じゃ、商品名に『限定』という文字が入っているものを抜き出してみましょう。
>Query complete (2.4s elapsed, 268 MB processed)

こんな結果でした。
じゃ、文字列のところだけ『初回』に変更したSQLをUNIONしてみましょう。
これで『限定』っていう文字列が入ったマスタと『初回』って入ったマスタを抽出できます。
（※もちろんダブることもあります。それはそれで良しとします）
>Query complete (5.9s elapsed, 268 MB processed)

ほいきた！UNIONって2回SQLを回しているのかと思いきや、どうやらそうじゃないみたい。
これが始まりだったわけですよ。『時間は倍かかってるじゃん！』というツッコみもありそうですが、時間なんていつも変わるので気にしたら負けです。
###同一テーブルでUNION（違うところをWHERE句で指定）
つーことで、おまけ。
先ほどはWHERE句のところで同じカラムを指定しました。じゃ、ちがうところを指定してみましょう。
商品名を『初回』としましたが、カテゴリが『書籍』のものだけを抜き出します。
>Query complete (8.4s elapsed, 126 MB processed)

じゃ、UNIONしてみましょう。
>Query complete (16.4s elapsed, 329 MB processed)

足し算されましたね。見るところが違えば足し算されるってことですね。
至極まっとうなお答えをありがとうございました。
###違うテーブルをUNION
じゃ、違うテーブルをUNIONしてみましょうか。
先ほど使った商品マスタのテーブルに以下のような商品コードを持ったテーブルを使ってみます。
>Table Size 19.4GB
>Number of Rows 45,063,406

同様に商品名に『初回』と入ったレコードを単独でUNION無しで抜き出してみましょう。
>Query complete (7.7s elapsed, 1.40 GB processed)

レコード数が多いのでこうなりますわな。じゃ、さっきの商品マスタのテーブルとUNIONしてみましょう。
>Query complete (11.6s elapsed, 1.66 GB processed)

こちらもきれいに足し算されました。
###UNIONまとめ
**①同一テーブルで同一カラムを指定したSQLをUNIONした場合は単独でやるのとコスト一緒**
**②同一テーブルでも違うカラムを指定したSQLをUNIONした場合は足し算**
**③違うテーブルをUNIONした場合は足し算**
特に①は案外使えるかなぁと。たくさんの文字列をセットして、それぞれにヒットする商品を取ってきたいときにグルグル何回も回すのではなく、UNIONでくっつけた方がさらにコスト激安！ってことです。
Googleさんがこれを見て『あ、それも課金しなきゃですね！てへぺろ』ってのはナシでお願いしたいところです。

JOIN編に続く（と思う）
AWS CLI インストール&セットアップ メモ（Mac）

AWSコマンドラインインターフェイスのインストール方法

# インストール
## AWS CLI 本体のインストール
pipを既にインストールしている場合は下記で完了

```
$ sudo pip install awscli
```


## pipインストール（pipをインストールしていない場合）
Pythonのインストール（古いバージョンしか入ってない人だけ）

```
$ brew install python
```

パスを通す（~/.bash_profileとかに書く）

```
export PATH=$PATH:/usr/local/share/python
```

pipのインストール

```
$ easy_install pip
```

参考：http://conta.hatenablog.com/entry/2012/01/07/161026


# 接続用アカウントのセットアップとAPIキーの取得
1. [IAM Console](https://console.aws.amazon.com/iam/home?#home) に移動 
2. メニューの**Users**を選択
3. **Create New Users**を選択
    * 既に作成済みのユーザーを対象にする場合は、**User Actions**から**Manage Access Keys**でOK
4. **Generate an access key for each user**にチェックが入っていることを確認
    * デフォルトでチェックされている
    * 後は流れに沿ってユーザーを**Create**
5. **Download Credentials**で保存するか、画面の表示されている内容を自分で書き留めておく
    * Credentialsに***Access Key Id***と***Secret Access Key***が書いてある

参考: http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-set-up.html


# AWS CLIにAWSキー情報設定
下記コマンドを実行（AWS Access Key ID, AWS Secret Access Key に上記で取得した情報を入力）
Tokyoリージョンを利用する場合は、regionに`ap-northeast-1`と入力

```
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

複数アカウントの管理が必要の場合は、`--profile`オプションを利用する

```
$ aws configure --profile user2
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

`~/.aws/credentials`など、ファイルにキーを定義しておく方法もあるが、そちらの設定については下記の参考リンクを参照

参考: http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html


# 試しに使ってみる
EC2にあるインスタンスを表示してみる

```
$ aws ec2 describe-instances
```

`aws configure`で`--profile`を利用している場合は下記のようにする

```
$ aws ec2 describe-instances --profile user2
```



# 公式ドキュメント
http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html
Swiftのreturnでハマった

Swiftで行末の;を省略して書いていると、returnが想定外の動きになっていました。

メソッド(関数)の途中でreturnと書くと次の行以降は実行されず、メソッドから抜けると思っていたのですが、違いました。

```lang:test.swift
func methodA() {
    処理A
    return
    処理B
    ...
}
```
となっていて、エラーの原因を探るためにreturnの場所を変えながらデバッグしていたら、なぜか処理Bが実行されているように見えました。

```lang:test.swift
func methodA() {
    処理A
    return
    println("return")
    ...
}
```
と書いてびっくり、コンソールにreturnと出力されてる!と思いました。returnのあとにセミコロンがないと文の区切りとはみなされないので、次の行が評価されてしまいます。
引数なしのメソッドからはreturn[改行]ですぐ抜けられると勝手に思っていました。
よく考えれば、returnは値を返す文なので当たり前です。

このような場合、処理Bを実行せずに抜けるには

```lang:test.swift
func methodA() {
    処理A
    return;
    処理B
    ...
}
```

というようにセミコロンが必要なようです。

Objective-Cではセミコロンが必須だったのでこのようなミスはありませんが、Swiftでセミコロンを省略するときは文の区切りが思った通りになっているか注意が必要です。

他に方法があればどなたか教えてください。
Rails 4.2 で MySQL の外部キー制約の作成と削除

MySQL を DB に利用する場合で、外部キー制約を設定したい場合の方法。
Rails 4.2 から、標準で外部キー制約作成機能が追加された。

[Ruby on Rails 4.2 Release notes](http://edgeguides.rubyonrails.org/4_2_release_notes.html#foreign-key-support)

>2.5 Foreign Key Support
>The migration DSL now supports adding and removing foreign keys. They are dumped to schema.rb as well. At this time, only the mysql, mysql2 and postgresql adapters support foreign keys.


migration ファイルに下記のように書いてやればOK。

```
# add a foreign key to `articles.author_id` referencing `authors.id`
add_foreign_key :articles, :authors
 
# add a foreign key to `articles.author_id` referencing `users.lng_id`
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"
 
# remove the foreign key on `accounts.branch_id`
remove_foreign_key :accounts, :branches
 
# remove the foreign key on `accounts.owner_id`
remove_foreign_key :accounts, column: :owner_id
```

# ※追記
references をセットで指定するのを忘れるとエラーとなる。
まとめて定義する。
Dockerで使い捨て可能なテストコンテナを定義する

Dockerでテスト用のコンテナを作る場合、基本的にはDocker HubのUbuntuリポジトリなどを使います。

```shell-session
> sudo docker run -i -t ubuntu:trusty /bin/bash
```
ただ、これだと何かを試すときに必ず`apt-get update`などを行わなければならず、時間の無駄です。

そのため、まずは自分がテストに使うベースイメージを作っておき、毎回それをベースにしてやる感じがベターです。

```Dockerfile:Dockerfile
FROM ubuntu
MAINTAINER [メンテナーの名前]

RUN apt-get update
RUN apt-get -y upgrade
RUN apt-get -y install curl
```

そして、次のようなコマンドでイメージを作っておきます。

```shell-session
> sudo docker build -t takamichie/base .
```

こうしておけば、いざテストコンテナが欲しいときに、以下のコマンドでテストコンテナを作成してシェルに入れます。

```bash:build.sh
#!/bin/sh
sudo docker run -i -t $* takamichie/base /bin/bash
```

何度も使うと思うので、あらかじめシェルスクリプトなどを作成しておくと、疑問がわいたときにすぐコンテナを作れていい感じです。

また、`-v`オプションなどでコンテナ内で使うコンテンツをまとめたディレクトリを指定しておくと、コンテンツのテストなどがしやすくてとても良いですね。

```bash:build.sh
#!/bin/sh
sudo docker run -i -t -v [CoreOS上にある共有したいディレクトリパス]:[コンテナ上で、共有したディレクトリがマウントされるパス]:r $* takamichie/base /bin/bash
```
Play Framework：アクションアノテーションでRole制御

# 目的
複数のRoleが定義されているアプリケーションで、各APIごとに使用していいRoleの制御をしたい。

* 各APIの使用条件は複数のRoleの組み合わせ
* アクションクラスは1つにまとめたい

というわけで引数付きのアクションアノテーションで実装してみた。

## とりあえずRoleを適当に定義
ユーザ、管理者、システム、なしの4つのRoleがあるとする。

```java:Roles.java
public enum Roles {

    USER((short)0),            // ユーザ
    ADMINISRATOR((short)1),    // 管理者
    SYSTEM((short)2),          // システム
    NONE((short)99);           // なし

    private short id;

    Roles(short id) {
    	this.id = id;
    }

    public Short getId() { return id; }
}
```

## アクションアノテーションを作成する
引数で受け取ったRoleをユーザが持っているかチェックし、持っていなければ403を返し、
持っていたら元のActionへ返す処理を適当に書く。

```java:AuthRoleAction.java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import play.libs.F.Promise;
import play.mvc.Action;
import play.mvc.With;
import play.mvc.Http.Context;
import play.mvc.Result;

@With(AuthRoleAction.class)
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface AuthRole {
   Roles[] value() default Roles.NONE;
}

public class AuthRoleAction extends Action<AuthRole> {

    @Override
    public Promise<Result> call(Context ctx) throws Throwable {

        // 引数で許可されるRoleを受け取る
        Roles[] roles = configuration.value();
        
        // サインインユーザのRole情報と引数で渡されたRoleのチェック
　　　　 Boolean authResult = isAuthorizedRole(roles);

        if(authResult)
        {
            // 権限OK
            return delegate.call(ctx);
        }
        else
        {
            // 権限NG
            return F.Promise.pure((Result) unauthorized());
        }
    }
}
```

## Actionにアクションアノテーションを付ける
Controllerの各アクションに、許可するRoleを引数にして@AuthRoleアノテーションを付加する。

```java:Controller.java
public class TestAuthController extends Controller{

    // 使用していいRoleを渡す
    @AuthRole({Roles.USER, Roles.ADMINISRATOR})
    public static Result test() {

        return ok();
    }
}

```
DockerでHHVM(PHP用仮想マシン)を動かす

最後はhhvmです。hhvmとはPHPの仮想マシンで、素のPHPより早いそうです。今回はnginxと組み合わせて利用します。

hhvmは、PerlのCGIなどのようにHTTPサーバーにMIMEタイプを設定して使うのではなく、独自のサーバとして動作します。HTTPサーバーからサーバーにPHPファイルをなげて、処理をしてもらうという感じになるみたい。

hhvmのインストールに際して困ったところは特にないですが、nginxの定義ファイルについて今までどおりのCGIを使うつもりでやると、ちょっと面食らうかもしれません。

# Dockerfile

さて、関連するところだけ抜粋

```Dockerfile:Dockerfile
## apt-get
# HTTP/HTTPS
RUN apt-get -y install nginx
# PHP
RUN apt-get update
RUN apt-get install -y  wget
RUN wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | apt-key add -
RUN echo deb http://dl.hhvm.com/ubuntu trusty main | tee /etc/apt/sources.list.d/hhvm.list
RUN apt-get update
RUN apt-get install -y hhvm
・・・
## conf
# HTTP
ADD nginx/http.conf /etc/nginx/conf.d/
RUN mkdir /etc/nginx/ssl_certfile/
RUN rm /etc/nginx/sites-enabled/default
・・・
## EXPOSE
# HTTP/HTTPS
EXPOSE 80 443
```

```nginx:http.conf
server {
  listen 80;

  root /usr/share/nginx/html;
  index index.html index.htm;

  server_name [サーバ名];

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  index  index.php index.html;
  try_files $uri $uri/ /index.php?q=$1;

  location ~ /*.php$ {
    include fastcgi_params;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/$fastcgi_script_name;
  }
}
```

hhvmは今回コンテナ内で使うUbuntuのパッケージリストには含まれていないため、http://dl.hhvm.com/ubuntu をパッケージリストに追加してインストールします。

`nginx/http.conf`の`location ~ ～`は、PHPファイルを見つけたときの挙動を定義します。ここではPHPサーバー(hhvm)とnginxが同じコンテナにあるのでこれでよいですが、もし別コンテナで動かしている場合は、dockerの--linkオプションなどを利用してfastcgi_passに設定する必要があります。