OmniAICreator/Qiita-1.07M huggingface dataset:
H2Oを5秒で3%速くする

#タイトルは煽りです

[H2O](https://github.com/h2o/h2o) の性能測定する時って (べつに nginx とか何でも同じだけど)、
普通は「アクセスログなんかいらねえ」ので、「ログは一切出すな」的な設定にするのが普通ですよね？

H2O だと、具体的には *.conf で

```
    access-log: /dev/null
```

出力先を `/dev/null` にしてあげるとかをよくやると思います。

ところが、こういう風に設定を書いても、「[ログをとる関数のリストをスキャンして順番に呼び出す](https://github.com/h2o/h2o/blob/master/lib/core/request.c#L201-L204)」という処理は内部的にはやらざるをえないので、ゼロ・オーバーヘッドにはならないです。

そこで、いっそのこと `access-log` の設定自体を消してやれば、`/dev/null` に投げる分の時間さえリストラできます:

```
    # access-log: /dev/null
```

`access-log: /dev/null` 「あり」と「なし」で、雑に `gprof` をとった結果は下のような感じ:

```
# access-log: /dev/null あり
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 11.11      0.35     0.35   680393     0.00     0.00  on_req_tile (tile-proxy.c:179)
  9.21      0.64     0.29   712536     0.00     0.00  handle_incoming_request (http1.c:379)
  6.98      0.86     0.22   710764     0.00     0.00  log_access (access_log.c:248)  # <== ここ
  5.08      1.02     0.16    13346     0.01     0.01  evloop_do_proceed (epoll.c.h:94)
  4.76      1.17     0.15    12932     0.01     0.23  h2o_evloop_run (evloop.c.h:482)
...(略)
  0.00      3.15     0.00        1     0.00     0.00  yoml__resolve_alias (yoml-parser.h:157)
```

```
# access-log: /dev/null なし
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 10.19      0.33     0.33   906677     0.00     0.00  on_req_tile (tile-proxy.c:179)
  8.64      0.61     0.28   108967     0.00     0.00  evloop_do_proceed (epoll.c.h:94)
  8.02      0.87     0.26   870058     0.00     0.00  flatten_headers (http1.c:555)
  7.72      1.12     0.25   961038     0.00     0.00  handle_incoming_request (http1.c:379)
  5.86      1.31     0.19   938251     0.00     0.00  phr_parse_request (picohttpparser.c:344)
...(略)
  0.00      3.24     0.00        1     0.00     0.00  yoml__resolve_alias (yoml-parser.h:157)
```

なお、煽り記事のため実験条件などは詳しく書きません。
GitHub で Fork したリポジトリを PR マージ後に削除したときの影響

プルリクエストを投げるために、自分のアカウントへ Fork したリポジトリ。

これ、マージ後にどうすれば良いのか分からなくて放置しがちだったりするのですが、今回はちゃんと消してみました。そのときにいったいどういうことが起きるの、っていう。

## プルリクエスト内の表示
元リポジトリ/ブランチ名が「unknown repository」となる。
https://github.com/cocos2d/cocos2d-x/pull/11933
![pull_and_remove.png](https://qiita-image-store.s3.amazonaws.com/0/25555/fcbea130-0c02-2a93-e288-6f5748d36151.png)

## プルリクエスト内 File Changed
当然ながら差分情報はさすがに残る。
https://github.com/cocos2d/cocos2d-x/pull/11933/files
![pull_and_remove2.png](https://qiita-image-store.s3.amazonaws.com/0/25555/a00539fc-207b-5abc-e667-4ca05df8a89a.png)

## リポジトリのコミットログ
コミットメッセージには影響ないのでこの中に元のブランチ名は残りますね。
https://github.com/cocos2d/cocos2d-x/commits/v3
![pull_and_remove3.png](https://qiita-image-store.s3.amazonaws.com/0/25555/01fcc7d5-d58a-3efc-85a6-3a40d088a6f3.png)

## 削除って怖いよね…
git の仕組み自体が割と性善説ベースだし、下手なことしてアﾞーーってなりたくなくてちょっと慎重になってしまう。今回の Fork と PR は些細な変更だったので安心して実験台にした。
PDOの管理クラス

複数のデータベースに接続するプログラムでPDOのインスタンスを一括で管理したい！という時に使用するクラスです。前回、投稿した[Singletonのデザインパターン](/tak-solder/items/ea5d1ee4b16fa795d0aa)を応用しています。

もちろん、1個のデータベースしか使用しないときにも使えます。

#メインのクラス

```php:db.php
<?php

class DB
{
    const CONFIG_PATH = PATH_TO_CONFIG_FILE;

    //PDOの配列
    private $dbs = [];

    //接続情報
    private $conf = [];

    private function __construct()
    {
        //接続情報の取得
        $this->conf = require(self::CONFIG_PATH);
    }

    //インスタンスの生成
    private function connect($name)
    {
        if(empty($this->conf[$name])){
            //接続情報がない場合
            throw new Exception('Unknown database: '.$name);
        }

        $conf = $this->conf[$name];

        $dsn = "mysql:host={$conf['host']};dbname={$conf['db']};charset={$conf['charset']};";
        $options = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ];

        $this->dbs[$name] = new PDO($dsn, $conf['user'], $conf['password'], $options);
    }

    /**
     * 外部からPDOを取得するメソッド
     * @param $name
     * @return PDO
     * @throws Exception
     */
    final public static function getDB($name)
    {
        static $instance;

        if(empty($instance)){
            $instance = new static;
        }

        if(empty($instance->dbs[$name])){
            $instance->connect($name);
        }

        return $instance->dbs[$name];
    }

    //クローンを禁止する
    final public function __clone()
    {
        throw new Exception("this instance is singleton class.");
    }

}

```

クラスの外部から呼び出せるのは`DB::getDB()`のみで、DBを指定してPDOインスタンスを取得することができます。

#接続情報

DBへの接続情報は`DB::$conf`に配列で指定します。

その配列のキー名はインスタンスを取得するときに使用するので、連想配列にしてどのDBか分かりやすい値を入れます。

接続情報はクラス内のプロパティに直接記入してもいいのですが、別に設定ファイルを作成して読み込むようにする方が管理がしやすくなると思います。

```php:config.php
<?php

return [

	'local' => [
		'host' => 'localhost',
		'db' => 'test',
		'user' => 'user',
		'password' => 'password',
		'charset' => 'utf8'
	],

	'example' => [
		'host' => 'example.com',
		'db' => 'example',
		'user' => 'user',
		'password' => 'password',
		'charset' => 'utf8'
	],
];
```

#使用例

それぞれのデータベースのテーブル一覧を取得するだけの単純なサンプルです

```php:sample.php
<?php

define('PATH_TO_CONFIG_FILE', 'config.php');
require_once('DB.php');


$local = DB::getDB('local');
$tables = $local->query('SHOW TABLES')->fetchAll();

var_dump($tables);


$example = DB::getDB('example');
$tables = $example->query('SHOW TABLES')->fetchAll();

var_dump($tables);

```
BigQuery では COUNT(DISTINCT(X)) ではなく EXACT_COUNT_DISTINCT(X) を使おう

以前、COUNT(DISTINCT(X)) の代わりに GROUP BY して COUNT(X) しようという記事を書きました。

[BigQuery で COUNT(DISTINCT(X)) を使わない方が良い理由](http://qiita.com/hakobera/items/72d5c76cf10798a4e2b3)

が、今は時代が変わりました。BigQuery にいつの間にか、`EXACT_COUNT_DISTINCT()` 関数が追加されたのです！

https://cloud.google.com/bigquery/query-reference#exact_count_distinct

> Returns the exact number of non-NULL, distinct values for the specified field. For better scalability and performance, use COUNT(DISTINCT field).

さらに non-NULL な値だけを数えてくれるという嬉しい仕様です。

というわけで、前の記事と同じく実際に publicdata:samples.github_timeline にクエリを流して試してみましょう。

まずは、EXACT_COUNT_DISTINCT を使った場合。

```sql
SELECT
  EXACT_COUNT_DISTINCT(repository_owner)
FROM
  [publicdata:samples.github_timeline]
```

![スクリーンショット 2015-05-21 22.18.17.png](https://qiita-image-store.s3.amazonaws.com/0/25774/4cd4045c-23cd-290a-d328-a3113ecd2f11.png)

次に、検証のために GROUP BY して COUNT するパターン。

```sql
SELECT COUNT(*)
FROM
(SELECT repository_owner FROM [publicdata:samples.github_timeline]
 WHERE repository_owner IS NOT NULL
 GROUP EACH BY repository_owner)
```

![スクリーンショット 2015-05-21 22.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/25774/6537a5fb-1aef-76e7-4df3-2d79a75c9a24.png)

結果が一致してます。素晴らしい！

データ増えてくると GROUP BY する方法の方がスケールする（遅くならない）ようで注意が必要ですが、クエリがシンプルに書けるようになるのでうまく使って行きたいですね。
nodejs,websocketでチャット

簡単なチャット
画面ソースがjadeなのはその時関心があったから

##### 画面
```jade
doctype html
html(lang="ja")
  head
  body
    h1 easy chat
    input(type="text",id="message")
    button(type="button",id="submit") submit
    ul(id="messageList")

```
##### サーバーjs
```js
var WebSocketServer = require('ws').Server;
var http = require('http');
var express = require('express');
var app = express();
var port = process.env.PORT || 5000;

//////////////////////
// setting http
app.use(express.static('public'));
app.set("views", "src");

app.get('/', function(req, res) {
  res.render('jade/chat.jade');
});

var server = http.createServer(app);
server.listen(port);
console.log("Node app is running at localhost:" + port);

///////////////////
// setting ws

var wss = new WebSocketServer({server:server});
console.log("websocket server created");

var connections = [];

// 接続開始
wss.on('connection', function(ws) {
  console.log('websocket connection open');

  connections.push(ws);
  /**
   * ws受信時
   * メッセージを受けたら、時間とuserIdを付与して、接続している全員にsend
   */
  ws.on('message', function(json) {
    console.log('message is ' + json);
    var data = JSON.parse(json);
    data.time = new Date();
    data.userId = connections.indexOf(ws) + 1;
    wss.clients.forEach(function(client) {
      client.send(JSON.stringify(data));
    });
  });

  // クローズ
  ws.on('close', function() {
    console.log('websocket connection close');
  });
});
```
##### フロントjs
```js
var host = location.origin.replace(/^http/, 'ws')
var ws = new WebSocket(host);
// ws受信
ws.onmessage = function(event) {
  var data = JSON.parse(event.data);
  switch (data.type) {
    // メッセージ
    case 'message':
      // 表示文字列作成
      var line = ""; 
      line += data.time;
      line += " ID:" + data.userId;
      line += " " + data.message;
      // リスト表示
      $('#messageList').append('<li>' + line + '</li>');
      break;
    default:
      break;
  }
};
// submitボタン押下
$('#submit').on('click', function() {
  var message = $('#message').val();
  if (message.length > 50) {
    return;
  }
  ws.send(JSON.stringify({
    type: 'message',
    message: message
  }));
});
```

ソースはこちら
https://github.com/yamatatsu/node-chat
zshでGitのカレントブランチ名を簡単に入力するalias

Gitを使っていると、pushするときなんかに現在のブランチ名を指定することがある。そのときにいちいち手で入力するのも面倒なので、zshのグローバルエイリアスを使って一文字で入力できるようにした。これを~/.zshrcに書いておけばOK。

```zsh
function git_current_branch_name()
{
  git branch | grep '^\*' | sed 's/^\* *//'
}
alias -g B='"$(git_current_branch_name)"'
```

使い方はこんな感じ。コマンドライン中に`B`と入力すると、それがGitのカレントブランチ名に置き換わる。

```
% git checkout develop #<= developという名前のブランチに移動する
% git push origin B    #<= git push origin developになる
```

単純なことだけどけっこう便利。
JavaScriptで数値への変換あれこれ

JavaScriptで、何かを整数に変換するときに、いくつかの方法があります。`foo`に値が入っているとして、

1. `foo-0`
2. `+foo`
3. `parseFloat(foo)`
4. `Number(foo)`

のようにして数値化したとすると、結果が違ってくるパターンはあるのでしょうか。

# ToNumber
1、2、4については、内部で行われる変換にToNumber（仕様書9.3）という名前が付いています。中身としては、

* undefined→NaN
* nullとfalse→+0
* true→1
* 数値ならそのまま
* Objectは`valueOf`、そして`toString`の順で変換を試み、得られたプリミティブを改めてToNumberにかける

## 文字列の場合（仕様書9.3.1）
文字列の場合は、前後のスペースを無視して、全体が

* 10進法の整数または小数
* `1.2e5`のような指数表記
* `0x`で始まる16進整数

のいずれかになれば、それを数値に変換します。一方、そうでなければNaNを返します。

なお、0を引き算しても、（-0という特殊な値を含めて）数値は変化しません（仕様書11.6.3）。つまり、上の1、2、4は、fooに何が入っていようが同じ結果となります。

# parseFloatの中身
`parseFloat`は、引数として文字列を取るのが前提なので、ToStringという内部操作（仕様書9.8）で文字列とした上で解釈します。なお、`parseFloat`での解釈は上のToNumberとは違って、以下のようになっています（仕様書15.1.2.3）。

* 16進数を受け付けない。
* 数字以外のものが現れたら、**そこより手前だけで**評価する。

なお、ToStringの結果は、`''.concat(foo)`で得ることができます[^1]。

# 結果が違う場合
両者で結果が違う場合を下に挙げてみます。

* null、true、false…ToStringでそれぞれの文字列になるので、`parseFloat`の結果は**NaN**です。
* 16進文字列…最初の0だけが`parseFloat`に解釈されて、**0**を返します。
* 途中に別な文字が入っている文字列…`parseFloat`は別な文字の手前までを解釈しますが、ToNumberはNaNとします。
* 数値の-0…ToStringで'0'となってしまうので、`parseFloat`の結果は**0**を返します。
* `valueOf()`と`toString()`が違う結果を返すオブジェクト…標準の`Date`がこんなオブジェクトです。

# 原典
JavaScriptのもととなっているECMAScriptの言語仕様については、[Ecmaのサイト](http://www.ecma-international.org/ecma-262/5.1/)で公開されていますし、和訳版も書籍として入手可能です。

[^1]: よく文字列化に`foo + ''`や`String(foo)`が使われますが、これらは`ToString`と結果が一致しないことがあります。
[VCR][RSpec] VCRに依存しないテストコードを書く


###環境
* ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]
* rspec 3.1.7
* vcr 2.9.3

VCRのスタンダードな使い方は、

```example_spec.rb
subject do
  VCR.use_cassette('weather_forcast') do
    # API call
  end
end
```

のように、テストコードにVCR.use_cassetteを明記するというものです。
ですが、将来的にVCRを使わないとなった場合、テストコードを修正しなければいけませんね。これは未来への負債となってしまいます。

そこで、VCRに依存しないテストコードを書くための仕掛けを考えました。

```spec/spec_helper.rb
VCR.configure do | c |
  c.around_http_request do | request |
    VCR.use_cassette(request.parsed_uri.path, &request)
  end
end
```

リクエストURLからカセットの配置場所とファイル名を決定しちゃおうぜ！大作戦です。
これを仕込んでおくとテストコードにVCR～を一切記述する必要がなくなります。

万が一、GemfileからVCRが消えてもテストコードの修正は不要ですね。
Perl : チルダ演算子を使った条件式サンプル

if文で比較演算子にチルダを使ったサンプル

- ~~（チルダチルダ）
- =~（イコールチルダ）
- !~（エクスクラメーションチルダ）

### サンプル１：文字列比較

```pl:hoge1.pl
use strict;
use warnings;
use utf8;

my $hoge = "en";
if ($hoge ~~ ["ja","en"]) {
    print "OK", "\n";
} else {
    print "NG", "\n";
}

1;
```

実行結果

```bash
$ perl hoge1.pl
OK
```

```pl
if ($hoge == "ja" || $hoge == "en")
```
と同じように使えるので便利！

### サンプル２：数値比較

```pl:hoge2.pl
use strict;
use warnings;
use utf8;

my $hoge = 1;
if ($hoge ~~ [2,3,4]) {
    print "OK", "\n";
} else {
    print "NG", "\n";
}

1;
```

実行結果

```bash
$ perl hoge2.pl
NG
```

### サンプル３：パターンマッチ

```pl:hoge3.pl
use strict;
use warnings;
use utf8;

my $hoge = "en";
if ($hoge =~ /^ja|en/) {
    print "OK", "\n";
} else {
    print "NG", "\n";
}

1;
```

実行結果

```bash
$ perl hoge3.pl
OK
```

### サンプル４：パターンマッチ（否定）

```pl:hoge4.pl
use strict;
use warnings;
use utf8;

my $hoge = "en";
if ($hoge !~ /^ja|en/) {
    print "OK", "\n";
} else {
    print "NG", "\n";
}

1;
```

実行結果

```bash
$ perl hoge4.pl
NG
```
RelativeLayoutの位置調整でハマる

# 何がしたかった？

ListViewの一部でレイアウトを変更したかった．
極端な例を挙げると，リストには文字列がひとつあり，通常はセンタリングされている．
これを，positionが偶数のリストアイテムだけ，文字列を左寄せにしたいという感じ．

## コード例

既にテキストをセンタリング済みのリストアイテム用ViewXML

```list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/rootLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:textSize="18sp" />

</RelativeLayout>
```

レイアウトファイルをInflateするAdapter

```ItemAdapter.java

  @Override
  public View getView(final int position, final View convertView, final ViewGroup parent) {

    // ViewHolder使っての前処理を省略
    final ViewHolder holder = convertView.getTag();

    if(position % 2 == 0) {
       // positionが偶数ならテキストを左寄せ
       RelateiveLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.text.getLayoutParams();
       params.leftMargin = 10;
       params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
       holder.text.setLayoutParams(params);
    } else {
       // positionが奇数ならテキストをセンタリングに戻す
       RelateiveLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.text.getLayoutParams();
       params.leftMargin = 0;
       params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
       holder.text.setLayoutParams(params);
    }
    return convertView;
  }

```

## 結果

一見うまくいったように見えたのもつかの間．
めくるとpositionが奇数・偶数に関わらず，どんどん左寄せされて，センタリングされなかった．
どうやらListViewによるconvertViewが使い回され，ALIGH_PARENT_LEFTのルールが残り続けている．

## 問題点

LayoutParams.**add**Rule の名のとおり，addRuleメソッドはルールを追加するものであり，上書きするものでは無かった．
そのため，positionが奇数時の処理において ALIGN_PANRET_LEFT のルールは残っており，その上でCENTER_HORIZONTALのルールが追加されただけだった．

## 解決

API Level 17の場合，RelativeLayout.LayoutParams.removeRule(int anchor) メソッドでルールを削除することができる．

```java:example
params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
```

API Level 17未満の場合は，以下の指定で削除を行う

```java:example
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0);
```

addRuleを呼び出し，削除したいルールを第一引数に，削除するというアンカー0を第二引数に渡す．
元々指定用AnchorでRelativeLayout.TRUEという定数は用意されているが，FALSEは無い．
JavaDocを読むと，FALSEは0を指定しろと書いてあった．

```
        /**
         * Adds a layout rule to be interpreted by the RelativeLayout. Use this for
         * verbs that take a target, such as a sibling (ALIGN_RIGHT) or a boolean
         * value (VISIBLE).
         *
         * @param verb One of the verbs defined by
         *        {@link android.widget.RelativeLayout RelativeLayout}, such as
         *         ALIGN_WITH_PARENT_LEFT.
         * @param anchor The id of another view to use as an anchor,
         *        or a boolean value(represented as {@link RelativeLayout#TRUE})
         *        for true or 0 for false).  For verbs that don't refer to another sibling
         *        (for example, ALIGN_WITH_PARENT_BOTTOM) just use -1.
         * @see #addRule(int)
         */
```

基本的に一度inflateしたViewのLayoutParamsをいじることって無いので，なかなか抜け出せず，いやーハマったハマった…
例外をつかってスクリプトをコントロールする

```py3
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time


class StopWatching(Exception):
    pass


class RepeatWatching(Exception):
    pass


class ContinueWatching(Exception):
    time.sleep(5)


class Something():
    def __init__(self):
        print('start')
    def something(self):
        is_continue = False
        while True:
            try:
                if is_continue:
                    raise KeyboardInterrupt
                time.sleep(5)
            except KeyboardInterrupt:
                try:
                    self.option_controller()
                except StopWatching:
                    break
                except RepeatWatching:
                    print('repeat!')
                    is_continue = False
                except ContinueWatching:
                    print('to be continued...')
                    is_continue = True

    def option_controller(self):
        cmd = input('\n S: stop\n R: repeat\n C: continue\nOption: ')

        def stop_watching():
            raise StopWatching

        def repeat_watching():
            raise RepeatWatching

        def continue_watching():
            raise ContinueWatching()
        option = {'s': stop_watching,
                  'r': repeat_watching,
                  'c': continue_watching
                  }
        try:
            if cmd is None or cmd not in option:
                cmd = 'c'
            option[cmd.lower()]()
        except (StopWatching, RepeatWatching, ContinueWatching) as e:
            raise e


if __name__ == '__main__':
    s = Something()
    s.something()
```
メソッド内でメソッドの引数をHashで取得する

phpだと`get_func_args`とかで引数の一覧取れたのにと思ったんですが、rubyでは無いのかなと。
一応以下の様な感じで取得できました。

```rb
def hoge(a,b:)
  args = self.method(__callee__).parameters.map do |arg_type,arg|
    [ arg, eval(arg.to_s) ]
  end.to_h
  p args
  #=> {:a=>1, :b=>2}
end

hoge(1, b: 2)
```

rubyだしもっと良い書き方ありそうですよね。
何かあればコメントください。
AndroidのMapモジュールで不可解なエラーに遭遇する

TitaniumでAndroidのアプリを作っていると、いつの間にかこのようなlifecycle関連のエラーに出くわしていることがあります。

> Sending event: exception on thread: main msg:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState; 

手がかりがなかなか見つからず途方に暮れることも多いのですが、これ、Mapモジュールに関係があるかもしれません。

例えば、こんなコード。2つのTabがあって、1つ目にはMapView、もう1つにはButtonがあって、Buttonをクリックすると新しいWindowが表示され、TabGroupが閉じます。ログアウト機能なんかでよく使われますね。

```xml
<Alloy>
  <TabGroup>
    <Tab>
      <Window>
        <Module id="mapview" module="ti.map" method="createView">
        </Module>
      </Window>
    </Tab>
    <Tab>
      <Window>
        <Button onClick="logOut">Log Out</Button>
        </Module>
      </Window>
    </Tab>
  </TabGroup>
</Alloy>
```

```js
function logOut(){
  var window = Alloy.createController('loginWindow').getView();
  window.addEventListener('open', function(e){
    $.index.close();
  });
  window.open();
}
```

現在、最新版のSDKは4.0.0.RC5ですが、上のコードはクラッシュします。でもエラーメッセージは上に載せた

> Sending event: exception on thread: main msg:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState; 

なので、まずMapのせいだと気づくことはありません。ちなみにMapを外すと正しく動作します。

ActionBarのTabはAndroidのFragmentを利用しているので、このFragmentのライフサイクルを考慮した実装が必要なのですが、Titaniumではまだうまくいっていないようです。

https://jira.appcelerator.org/browse/TIMOB-18244
https://jira.appcelerator.org/browse/TIMOB-18876

簡単な回避策はないかと調べていましたが、Mapを削除するくらいしかありませんでした。上のようにTabGroupを閉じるようなケースでは思い切ってMapを表示しているWindowを空のWindowに差し替えてしまうと正常に動作したりします。

```js
function logOut(){
  var window = Alloy.createController('loginWindow').getView();
  window.addEventListener('open', function(e){
    $.index.tabs[0].window = Ti.UI.createWindow();//ココ
    $.index.close();
  });
  window.open();
}
```

iOSと根本的に扱いの異なるAndroidの、特に過去との互換性のないActionBar絡みのところはTitanium側でも苦労しているようなので、AndroidのUIの特性を理解して対応しなければいけませんね。
ofxFaceTracker 顔のパーツの座標

いい感じのところに画像はめなきゃあかんので
顔の各箇所の座標のとりかたメモ

```cpp:faceP.cpp
ofPoint pos = tracker.getImagePoint( 下記番号 );
// pos.x  pos.y
```
![alt](http://blog.kidapu.com/wp-content/uploads/2013/12/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2013-12-16-0.55.40-277x300.png)
GitHubでWebサイトを公開する


GitHubのリポジトリにgh-pagesというブランチを作り、html,css,jsを置くと簡単にWebサイトを公開することができます。

**2016/08/18追記** masterブランチでもできるようになりました。特別な理由がないなら、masterブランチで公開したほうが簡単です。以下の記事に手順が分かりやすくまとまっています。
[2016年新機能! GitHubのmasterブランチをWebページとして公開する手順](http://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)


## リポジトリの作成
公開したいサイトを管理するリポジトリをGitHubで作成します。
リポジトリ名は何でも大丈夫ですが、URLは`http://ユーザー.github.io/リポジトリ/`になります。

## リポジトリにソースをPush

まずは先ほど作ったリポジトリをクローンします。
（先にローカルでリポジトリを作ってもできますが、ここではcloneするやり方で説明します）

```bash:
git clone git@github.com:ユーザー/リポジトリ.git
```

gh-pagesブランチを作成します。

```bash:
git checkout -b gh-pages
```

ここでhtml,css,jsを好きなように作成してコミット＆プッシュします。

```bash:
# html,css,jsを作成したものとする
git add .
git commit -m "Webサイト作成!"
git push --set-upstream origin gh-pages
```

これで完了です。`http://ユーザー.github.io/リポジトリ/`でアクセスできます。
ただし、実際にWebサイトが公開されるまで、少しタイムラグがあるかもしれません(10分くらい？)

## サイトの更新
ここまでのことができたら、ローカルでソースを更新して、pushするだけでWebサイトを更新できます。

```bash:
# html,css,jsを修正、追加、削除
git add .
git commit -m "Webサイト更新!"
git push
```


## （不要なら）masterブランチを削除

サイト公開用にgh-pagesブランチを作ったので、masterとgh-pagesの2つのブランチが存在しています。
masterブランチとgh-pagesを同期させる方法もありますが、サイトを公開するだけならgh-pagesブランチのみを管理した方が楽なので、masterブランチを削除してしまいます。

まずはgithub上でデフォルトブランチをmasterからgh-pagesに変更します。これをしないとgithub上のmasterブランチを削除できません。

![Options.png](https://qiita-image-store.s3.amazonaws.com/0/1332/023bcd16-39a2-d2a3-4bda-c7d539513aba.png "Options.png")

そして、ブランチを削除し、pushします。

```bash:
git branch -d master
git push origin :master
```
`pip install --upgrade pip` で Bad md5 hash for package とかでて泣いたけどなおった

これがでて  

```pytb

§  {@} pip install --upgrade pip
You are using pip version 6.0.8, however version 6.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip
  Using cached pip-6.1.1-py2.py3-none-any.whl
  Hash of the package https://pypi.python.org/packages/py2.py3/p/pip/pip-6.1.1-py2.py3-none-any.whl#md5=172eb5abab25a5e0
f7a7b63c7a49378d (from https://pypi.python.org/simple/pip/) (cd51a97e9efb4b5377dd2be875e21e77) doesn't match the expecte
d hash 172eb5abab25a5e0f7a7b63c7a49378d!
  Bad md5 hash for package https://pypi.python.org/packages/py2.py3/p/pip/pip-6.1.1-py2.py3-none-any.whl#md5=172eb5abab2
5a5e0f7a7b63c7a49378d (from https://pypi.python.org/simple/pip/)
```

`pip install --no-cache-dir --upgrade pip`
したらなおった

```pytb

§  {@} pip install --upgrade thefuck
Collecting thefuck
  Downloading thefuck-1.43-py2.py3-none-any.whl (160kB)
    100% |################################| 163kB 1.2MB/s
Requirement already up-to-date: psutil in c:\python34\lib\site-packages (from thefuck)
Requirement already up-to-date: colorama in c:\python34\lib\site-packages (from thefuck)
Collecting six (from thefuck)
  Downloading six-1.9.0-py2.py3-none-any.whl
Requirement already up-to-date: pathlib in c:\python34\lib\site-packages (from thefuck)
Installing collected packages: six, thefuck
  Found existing installation: thefuck 1.26
    Uninstalling thefuck-1.26:
      Successfully uninstalled thefuck-1.26
Successfully installed six-1.9.0 thefuck-1.43
```
CDN、Akamai、Google Public DNS

* CDN（Akamaiなど）はDNS問い合わせに対して、地域ごとに異なるIPアドレスを返す
* クライアントがDNSにGoogle Public DNS(8.8.8.8)を使っていると、地域に最適なIPアドレスが返されないので、CDNサイトが遅くなっていた
* しかし、2014年12月にAkamaiがGoogle Public DNSに対応したので、この問題も改善されている可能性がある
* Google Public DNSはエニーキャストを使っていて、最寄のDNSサーバが応答している（日本国内ではおそらく東京1箇所）。

参考情報
http://www.geekpage.jp/blog/?id=2011/9/22/1
http://www.geekpage.jp/blog/?id=2014/12/16/1
http://en.wikipedia.org/wiki/Google_Public_DNS
dplyr でデータベースを扱うときの情報をそろそろまとめておく #rstatsj


みんな大好き dplyr では、データソースとしてデータベースを扱うことができます。
この機能は非常に便利なんですが、私以外に使っている人を見たことないです。

みんな知らないだけかもしれないので、Web上で読める情報をここにまとめておきます。

まず使い始めたい人は本家 Hadley の書いた Vignette

- [Databases](http://cran.r-project.org/web/packages/dplyr/vignettes/databases.html)

この Vignette を日本語で解説してくれる @dichika さんの記事

- [dplyrとデータベース](http://rpubs.com/dichika/dplyr_db)

あたりを読むといいと思います。
Vignette にはなぜか CASE 式の書き方が載っていないので次の記事も読むといいです。

- [dplyr で DB にクエリを投げる時に CASE 式を使いたい ](http://qiita.com/hoxo_m/items/00a266c5bd40679fbc1b)

これで基本的なやり方はわかったはずです。
あとは DB が PostgreSQL なら環境変数を使って文字化けを防いだり接続を楽にしたりできます。

- [dplyr、PostgreSQL、Windows の組み合わせで文字化けを防ぐ](http://qiita.com/hoxo_m/items/1ef8666ab939fd68ed72)
- [dplyr で PostgreSQL への接続を簡単にする](http://qiita.com/hoxo_m/items/770d96c653f4b5e44a33)

使い慣れてくると、テーブルのロードがめんどくさくなったりします。そんなときはこれ。

- [dplyr で DB 使うとき、テーブルをいちいち読み込むのめんどくさい](http://qiita.com/hoxo_m/items/3b82c7039e6810f38559)

さらに慣れてくると、Window function を使って DB 上で移動平均や first_value を計算したくなるかもしれません。

- [R6 をハックして dplyr + PostgreSQL で移動平均を計算する](http://qiita.com/hoxo_m/items/418d94acf495d2dcf942)
- [dplyr で PostgreSQL の first_value() を使う](http://qiita.com/hoxo_m/items/87afaaa460da290d9390)

Window function についての本家の Vignette はこちらです。

- [Window functions and grouped mutate/filter](http://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html)

@dichika さんによるまとめはこちら。

- [window functionまとめ](http://d.hatena.ne.jp/dichika/20140310/p1)

そしてついには dplyr の魔改造に手を出してしまうかもしれません。

- [dplyr の filter() を魔改造する](http://qiita.com/hoxo_m/items/dc0e9a32988ccbba606a)
- [dplyr の mutate() にオリジナル関数を追加する](http://qiita.com/hoxo_m/items/e456c257022e9a565bba)
- [dplyr の summarise() にオリジナル関数を追加する](http://qiita.com/hoxo_m/items/12ddcb74ae95d07ed396)

ここまで来るとちょっとまともではないので、マネしないほうがいいです。。

私はまともではないので、上記記事で紹介した便利関数を詰め込んだパッケージを作成中です。

- [dplyrr - Utilities for comfortable use of dplyr with databases](https://github.com/hoxo-m/dplyrr)

機能要望等ありましたらこの記事のコメントまたは issue に書き込んでください(日本語でおけ)。

- [Issues · hoxo-m/dplyrr](https://github.com/hoxo-m/dplyrr/issues)

Enjoy!
AppGroup 内部にディレクトリを作る際のエラー



AppGroup の共有領域内にディレクトリを作成しようとすると下記のようなエラーが出る。

>Error: Unable to create directory: Error Domain=NSCocoaErrorDomain Code=513 "操作を完了できませんでした。（Cocoa エラー 513。）" UserInfo=0x15614530 {NSFilePath=file:/private/var/mobile/Containers/Shared/AppGroup/1C808679-78C6-4A2F-934B-0742817963BA/Directory, NSUnderlyingError=0x1562f730 "操作を完了できませんでした。Operation not permitted"}

その際に参照した解決法がこちら

[iOS8 Unable to create a folder/file under app group shared container location](http://stackoverflow.com/questions/25761499/ios8-unable-to-create-a-folder-file-under-app-group-shared-container-location)


解決はしたがなぜ、pathはよくてabsoluteString はだめなのか気になったので軽く調査。
結論を言うとパスの値が微妙に違う
absoluteString はプロトコル部分も含めてパスを渡してきているが、path の方はディレクトリパスのみを渡してきている。

path
/private/var/mobile/Containers/Shared/AppGroup/1C808679-78C6-4A2F-934B-0742817963BA

absoluteString
file:///private/var/mobile/Containers/Shared/AppGroup/1C808679-78C6-4A2F-934B-0742817963BA/
CoffeeScriptでclassをファイル分割する方法

#えとっ、えとっ

えーと、凡ミスしたくないから確認しとこ、として表題の語彙で検索したら、RequireJSの話とか出てきたのでぎょっとした。いや、そーゆー話じゃなくてだな。一番基本のやり方あるじゃんよ。分割した先にクラスを返す関数を書いて、ってやつ。たぶん、Javascriptでクラスを使うのは大変なので、なかなかそういう記事が書かれないのかも。

ってか、これで、いいんだよね？　心配になっちゃうよ。

というわけで、書いておきます。

下記例を実行すると、

```terminal:terminal
[mogemoge coffeeshop]$ coffee mainfile.coffee
---outstatic
static
---outprivate
private
---outproperty
test
---utility
thanks for using
---util2
a ri ga to u!
[mogemoge coffeeshop]$
```

こうなります。ちゃんと動いて良かった。凝ったことをやったときは知りませぬ。

#おねがい！　かんすーのなかに挿れてっ！

というわけで、ついでにCoffeeScriptで使うメソッドとかのありがちなパターンを列挙しておきました。まっじめー。とは言え、privateメソッドとか入ってないな、とかまだまだあるので、それはぐぐってね。

```coffeescript:mainfile.coffee
subfile = require('./subfile.coffee')

myclassinstance = new(subfile.myclass())

console.log '---outstatic'
subfile.myclass().outstatic()
console.log '---outprivate'
myclassinstance.outprivate()
console.log '---outproperty'
myclassinstance.outproperty()

my2ndclass = subfile.my2ndclass()

console.log '---utility'
my2ndclass.utility()
console.log '---util2'
my2ndclass.util2()
```

```coffeescript:subfile.coffee
myclass = ->
  class myclass
    _privatevar = 'private'
    @staticvar: 'static'
    
    constructor: ->
      @instanceproperty = 'test'
    
    @outstatic: ->
      console.log @staticvar
    outprivate: ->
      console.log _privatevar
    outproperty: ->
      console.log @instanceproperty

module.exports.myclass = myclass

my2ndclass = ->
  class my2ndclass
    @utility: ->
      console.log 'thanks for using'
    @util2: ->
      console.log 'a ri ga to u!'

module.exports.my2ndclass = my2ndclass
```
JavaのJSPで久しぶりにハマったこと

インフラ構成の仕様上、cdnからファイルを呼び込めなかったので、
application内にファイルを置いてそれを呼びこむ事になった時に、
ハマり、そして、”なんとなく”解決した時の話。

## やったこと
2つのcssを読み込んで、JSPを表示させたかった。

```test.jsp
<!DOCTYPE html>
<html lang="ja">
<head>
    <link rel="stylesheet" href="http://cdn.xxx.com/css/card/abtest/001.css">
    <link rel="stylesheet" href="/css/card/font-awesome/font-awesome.css">
</head>
```
この書き方でも、local環境では、001.cssもfont-awesome.cssも読み込んでくれた。(PCで確認)
しかし、本番にあげてios/Androidのそれぞれの実機で確認してみた結果、

| css  | ios | Android |
|:---------------:|:---:|:-------:|
| 001.css         | OK  | OK      |
| font-awesome.css | OK  | NG      |

…あれ？
Androidでfont-awesome.cssが読み込めない(=GETできない)。

「font-awesome Android」や「css Android」でググっても何も見つからず…

```test.jsp
<!DOCTYPE html>
<html lang="ja">
<head>
    <link rel="stylesheet" href="http://cdn.xxx.com/css/card/abtest/001.css">
    <link rel="stylesheet" href="http://ad.xxx.com/css/card/font-awesome/font-awesome.css">
</head>
```

結局フルパスで書いて解決した。

## 結論
これはOSの仕様なのか、そもそも書き方が間違っているのか？
わからぬまま解決しました。
node.jsでexportsした関数を定義したファイルから呼び出す

```js

exports.foo = function(){
  console.log("foo");
}
```

こうすることで外部ファイルからrequireすればこの関数をコールできるしくみがnode.jsにはありますが。外部ではなく内部から呼び出すのところでハマりました。

こうするようです

```js
module.exports.foo();
```

まとめてexportsする方法もあるみたいです
http://stackoverflow.com/questions/10462223/call-a-local-function-within-module-exports-from-another-function-in-module-ex
PhalconのユニットテストをCircleCIで実行する

PHPの（自称）最速フレームワークのPhalconは、PHPのエクステンションとして組み込まれるというその性質上、CircleCIでのユニットテスト実行にはテスト用ホストへのインストールが必要です。悪戦苦闘の末にインストール用の設定ファイルを整えたのでメモ。

# 実行環境

- PHP 5.5.21 （CircleCIで指定可能な5.5系の最新バージョン）
- Phalcon 1.3.5


# Composerの設定ファイル

incubatorを使うかどうかは必要に応じてですが、バージョンを合わせておいたほうが安全です。Mockeryはユニットテストでモックを使うときに利用します。

```json:composer.json
{
    "require": {
        "phalcon/incubator": "v1.3.5"
    },
    "require-dev": {
        "phpunit/phpunit": "4.*",
        "mockery/mockery": "dev-master"
    }
}
```

# CircleCIの設定ファイル

apt-getでインストール可能なphp5-phalconはPHP5.3での実行が前提になっているため、CircleCIでPHPのバージョンを指定するとインストール時にエラーが発生します。そのためGithubからソースコードを落としてきて手動でビルドしますが、sudo実行するときのphpizeとphp-configのパスが指定バージョンのPHPに向いていないため、インストールスクリプトを書き換えてから実行する必要があります。

またPHPUnitの実行時はComposerでインストールしたバイナリを指定してあげないとMockeryの名前解決ができませんでしたので、テスト実行のコマンドを上書きしています。

```yaml:circle.yml
machine:
  timezone: Asia/Tokyo
  php:
    version: 5.5.21

dependencies:
  pre:
    - sudo apt-get update
    - sudo apt-get install -y gcc libpcre3-dev
    - git clone -b 1.3.5 --depth 1 git@github.com:phalcon/cphalcon.git:
    - sed -i "s/phpize /\/home\/ubuntu\/.phpenv\/shims\/phpize /g" cphalcon/build/install
    - sed -i "s/configure /configure --with-php-config=\/home\/ubuntu\/.phpenv\/shims\/php-config /g" cphalcon/build/install
    - sudo ./install:
        pwd: cphalcon/build
    - sudo sh -c "echo 'extension=phalcon.so' > /home/ubuntu/.phpenv/versions/5.5.21/etc/conf.d/phalcon.ini"
    - sudo composer self-update

test:
  override:
    - ../vendor/phpunit/phpunit/phpunit:
        pwd: tests
```
Android4.x.x系で画像や背景がぼやける現象の簡単な解決方法

Android 4.x.x系で、画像がぼやけて（ボケて）表示されるバグに直面した時の簡単な解決方法。

##解決策
```css
:after {
    content: ".";
    display: block;
    margin-top: -1em;
    line-height: 1;
    color: transparent;
}
```
##使い方
ぼやけてしまう画像(`<img>`)の親要素に対して上記のCSSを当ててやると、正常に表示されます。
smallbasicでpost

自前のエクステンションを使います。
#サンプル
```
GraphicsWindow.BackgroundColor = "skyblue"
button = Controls.AddButton("run", 200, 100)
Controls.ButtonClicked = onclick
Sub onclick
  WC = Text.GetCharacter(34)
  CR = Text.GetCharacter(13) + Text.GetCharacter(10)
  code = ""
  code = code + "Function setup(a)" + CR 
  code = code + "url = " + WC + "http://ohisamallc.dip.jp/test21.php" + WC + CR 
  code = code + "key = " + WC + "txt=test desu2" + WC + CR
  code = code + "Set obj = CreateObject(" + WC + "MSXML2.ServerXMLHTTP" + WC + ")" + CR
  code = code + "obj.open " + WC + "POST" + WC + ", url, False" + CR
  code = code + "obj.setRequestHeader " + WC + "Content-Type" + WC + ", " + WC + " application/x-www-form-urlencoded" + WC + CR
  code = code + "obj.setRequestHeader " + WC + "Content-Length" + WC + ", " + WC + "length" + WC+ CR
  code = code + "obj.send key" + CR
  code = code + "setup = obj.responseText" + CR
  code = code + "msgbox setup" + CR
  code = code + "End Function" + CR
  a = Class1.VBSrun(code)
EndSub
```
border-radius設定時、IE11だと隣接要素との間に薄く線が入る（隙間ができる）

#これ
![IE11bug.png](https://qiita-image-store.s3.amazonaws.com/0/25650/638765a5-c9a6-ee11-7a6a-0ff9bae5daaf.png)
#概要
タイトルと上の画像がすべて。
borderを設定せずにborder-radiusを設定すると、IE11で表示した場合は隣接要素との間に線が入る。
おそらくIE11のバグで、レンダリング時に要素の辺までアンチエイリアスがかかっているように見える。
なので、薄い線に見えるのは実際は要素間の隙間。
#再現
```html:HTML
<div class="bg-radius">foo</div>
<div class="bg-radius">bar</div>
```

```css:CSS
.bg-radius {
    background-color: #ccc;
    border-radius: 4px;
}
```
https://jsfiddle.net/qmotas/w40j4ejc/

#対策
根本的な対策はない（と思う）。
ので、そもそも隣接要素とくっついた要素にborder-radiusを設定するようなCSSを書かない。
どうしてもそうする必要があるときは力技で解決することになると思う。

ちなみに、自分はタブのデザインをしていてこのバグに遭遇した。
タブと表示領域の間に線が入るので、z-indexとネガティブマージンでオーバーラップさせることで回避した。
けどやっぱり気持ち悪いのでデザインを見直した。
paizaの国際プログラミング選手権のやつ

## どれ
https://paiza.jp/poh/enshura-special

のやつですね。開始3日で最適解に到達したようです。やったことをずらずらと書きます。

## 解法
15パズルの最適解の求め方自体は割りと文献が多くて調べやすいです。時間制限なしだとPattern Databaseを使ったIDA*(反復深化A*)もしくは両側探索、ステップ数制限なしだとgreedyが良いですが、今回は時間制限ありでできるだけステップ数を短くしろということなので、
Pattern Database + 幅優先ビームサーチ
でやりました。ビームサーチだと時間制限に合わせてビーム幅を変えて調整しやすいです。
幅優先ビームサーチはビーム内に収まっている状態をすべて遷移させて、それをソートしてビーム幅分の上位をとって収めるというのを繰り返すやつです。15パズルの場合は最良優先ビームサーチより良いみたいなのがどこかに書いてありました。
Pattern Databaseはパズルを数個ずつのパーツにわけ、各パーツ+空き分の移動ステップ数を前計算しておいて、それを合計して距離とするやつです。A*の場合は距離としての制約を満たすようにしないといけないですが、ビームサーチの場合は関係無いです。

## 実装
具体的には、5+5+5のパーツに分けたものでPattern Databaseを構築(1パーツあたり16^6=2^24要素の距離配列)して、この合計をスコアとしてスコアの小さい方を優先させる幅優先ビームサーチを実装しました。同じ状態に来られると困るので、直前2ステップのみに関してHashMapをつくって除くようにしました。

高速化としては、次のようなことをしました。高速化するたびにビーム幅が広げられます。
・ビットボード化・・はデフォ。
・JavaのHashSet/HashMapは挿入のたびにEntryをつくることとboxingにより激重仕様なので、IntOpenHashSetみたいなのを適当に改造したものを使いました(http://codenav.org/code.html?project=/com/carrotsearch/hppc/0.4.3&path=/Source%20Packages/com.carrotsearch.hppc/IntOpenHashSet.java). これで1.5倍の速度に。
・状態には操作履歴を格納しますが、1手あたり2bitで十分なので小さいlong配列にパッキングしました。これで1.2倍。
・Pattern Databaseの距離の種類はそんなに多くないのでint配列からbyte配列にしました。これで1.1倍。
・同様にビーム内の状態の距離の種類もそんなに多くないのでバケツソートにしました。これでちょっぴり。

この解法の前には上1行揃えて左1列揃えて残り8個を全探索みたいなことをやってました。上の解法にかえていくらか最適化したら40を切れたので(https://twitter.com/uwitenpen/status/588969437291630593) みたいに煽ったのですが、それ以上高速化してもスコアが下がらないので若干焦ってました。

## 所感
* もっと難しい問題出してもいいのよ
* 多言語対応が大変そうだなぁと思った
* 図らずもwriterの人と会ってしまった
ログインユーザーの環境変数のままsudoする

## 動機
 - sudoで動かしたいコマンドがあったが、そのコマンド内で環境変数を参照する。
 - しかし、rootユーザーでは参照する環境変数がセットされていない(ログインユーザーの環境変数にのみ存在する)

## 解決策
大きく分けてふたつある

 - どうにかしてrootユーザーの環境変数にもログインユーザーと同じものをセットする
 - ログインユーザーの環境変数を一時的に使ってsudoする

今回は後者の方法を取った
やり方は簡単で

```bash
login-user$ sudo -E command
```

そう、 ``-E`` をつけるだけです。
How to get Random Date and Time

# 明日から1年後までの日付をランダムに得る

```rb
Random.rand(Time.zone.tomorrow..Time.zone.tomorrow.next_year)
```

## 実行結果

```bash
% rails console
[1] pry(main)> Random.rand(Time.zone.tomorrow..Time.zone.tomorrow.next_year)
=> Sun, 07 Jun 2015
```

以下を参考にしました
http://toukoudo.blogspot.jp/2014/08/ruby.html
http://railsdoc.com/references/tomorrow

# 指定した日付の時刻をランダムに得る
但し10時から20時まで10分刻みとする

```rb
Time.at(Random.rand((specified_date.beginning_of_day + 10.hours).to_i / 10.minute..(specified_date.beginning_of_day + 20.hours).to_i / 10.minute) * 10.minute)
```

## 実行結果

```bash
% rails console
[1] pry(main)> b = Time.zone.today.beginning_of_day
=> Thu, 21 May 2015 00:00:00 JST +09:00
[2] pry(main)> Time.at(Random.rand((b + 10.hours).to_i / 10.minute..(b + 20.hours).to_i / 10.minute) * 10.minute)
=> 2015-05-21 19:20:00 +0900
S3の差分更新とCloudFrontの自動invalidation

# はじめに

CloudFrontのOriginをS3にしているケースで、S3のファイルを更新し、対応するCloudFrontキャッシュをinvalidationしたいというケースがあると思います。

s3cmdを使うと、ローカルからS3へ差分アップロードを行い、かつ自動的に対象ファイルのキャッシュinvalidationを行うことが出来ます。ステキ！
s3cmdは、S3の操作を行うためのコマンドラインツールです。
http://s3tools.org/s3cmd
※今回、バージョンは1.5.2を使用しています。

# IAMユーザ作成

まず、S3とCloudFrontを操作するためのIAMユーザを作成します。

CloudFrontのinvalidationを行うために、ポリシーにはS3の基本的な操作(Delete,Get,List,Put)に加え、
S3のGetBucketWebsiteとCloudFrontのListDistributions,CreateInvalidation,GetInvalidationの権限を付与します。
対象バケットの制限等は適宜行って下さい。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt123456789",
            "Effect": "Allow",
            "Action": [
                "cloudfront:ListDistributions",
                "cloudfront:CreateInvalidation",
                "cloudfront:GetInvalidation"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Stmt123456789",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetBucketWebsite"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket"
            ]
        }
    ]
}
```

# s3cmdの設定

s3cmdのインストールはyum等で簡単に出来ます。
インストール後、以下コマンドを実行し、上で設定したIAMユーザのAccess Key,Secret Keyを設定します。
`# s3cmd --configure`

# コマンドの実行

以下コマンドを実行すると、ローカルとS3の差分をアップロードし、対応するCloudFrontキャッシュのinvalidationを行うことが出来ます。
`s3cmd sync --cf-invalidate <同期元のパス> s3://<同期先のパス>`

```
$ s3cmd sync --cf-invalidate ./test-dir/ s3://test-bucket/test-dir/
./test-dir/1.html -> s3://test-bucket/test-dir/1.html  [1 of 3]
 10 of 10   100% in    0s    45.01 B/s  done
./test-dir/2.html -> s3://test-bucket/test-dir/2.html  [2 of 3]
 15 of 15   100% in    0s    63.01 B/s  done
./test-dir/3.html -> s3://test-bucket/test-dir/3.html  [3 of 3]
 20 of 20   100% in    0s    78.65 B/s  done
Done. Uploaded 45 bytes in 1.0 seconds, 45.00 B/s. Copied 0 files saving 0 bytes transfer.
Created invalidation request for 3 paths
Check progress with: s3cmd cfinvalinfo cf://AAABBBCCCDDD/EEEFFFGGGHHH
```

ちなみに、実行後に最後の行に出力されるコマンドを実行すると、invalidationの進行状況(InProgress/Completed)を確認できます。

```
# s3cmd cfinvalinfo cf://AAABBBCCCDDD/EEEFFFGGGHHH
URI:            cf://AAABBBCCCDDD/EEEFFFGGGHHH
Status:         InProgress
Created:        2015-05-21T08:50:57.214Z
Nr of paths:    3
Reference:      E22HEU1NSKFPQ9.20150521175056.4757
```
メモ：C/C++　インスタンスの型チェック　typeid

渡された変数の型を知りたい時。

typeidを使って判別する事ができました。

```
#include "stdio.h"
#include <typeinfo>

class A {
};

int main() {
    A *a = new A();
    if (typeid(a) == typeid(A*)){
        printf("class A");
    }

    if (typeid(*a) == typeid(A)){
        printf("class A");
    }
    
    return 0;
}
```
EditorUtility.DisplayProgressBarでユーザーに処理の進捗度を伝える

エディタ上で時間のかかる処理をしている時、ユーザーに進捗を伝えるためには```EditorUtility.DisplayProgressBar```を使用する。

```csharp:
string title = "処理中";
string info = "進捗の詳細情報";
float progress = 0.7f;

EditorUtility.DisplayProgressBar (title, info, progress);
```
![progress_bar.jpg](https://qiita-image-store.s3.amazonaws.com/0/7345/e9afb4ea-621b-7266-7354-2c4309f2a856.jpeg)

進捗度を変更したいときは```EditorUtility.DisplayProgressBar```を再度呼び直す。

処理が完了したら忘れずに```EditorUtility.ClearProgressBar```を呼んでダイアログを閉じる。
（閉じるのを忘れていると、エディタの操作ができなくなってしまう）

```csharp:
EditorUtility.ClearProgressBar ();
```
Codeigniter3のMigrationでテーブル作成。

# Codeigniter3のマイグレーションでテーブルを作ってみる。

Codeigniter3はComposerでインストール済み

## データベース設定

Vagrantで試したのでポート番号追記

``` php:config/database.php
$db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'localhost',
	'username' => 'root',
	'password' => 'root',
	'database' => 'test',
	'dbdriver' => 'mysqli',
        ・・・
	'port' => 3306
);

```

### マイグレーション設定

今回はファイルに連番をつけてやる設定で。

``` php:config/migrate.php
$config['migration_enabled'] = TRUE;// 有効
$config['migration_type']    = 'sequential';// 連番 or タイムスタンプ
$config['migration_version'] = 1; // バージョン
```

### マイグレーションファイル作成

今回はバージョンを1としますのでファイル名に001を振ります。

``` php:migrations/001_add_users.php
<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Add_Users extends CI_Migration
{

    public function up()
    {
        $this->dbforge->add_field([
                                      'id'       => [
                                          'type'           => 'INT',
                                          'unsigned'       => TRUE,
                                          'auto_increment' => TRUE
                                      ],
                                      'email'    => [
                                          'type'       => 'VARCHAR',
                                          'constraint' => '255',
                                      ],
                                      'password' => [
                                          'type'       => 'VARCHAR',
                                          'constraint' => '255',
                                      ],
                                  ]);
        $this->dbforge->add_key('id', TRUE);
        $this->dbforge->create_table('users');
    }

    public function down()
    {
        $this->dbforge->drop_table('users');
    }
}
```

### マイグレーションコントローラー作成

~~~ php:application/controllers/Migrate.php
<?php

class Migrate extends CI_Controller
{

    public function index()
    {
        $this->load->library('migration');

        if ($this->migration->current() === FALSE) {
            show_error($this->migration->error_string());
        }
    }

}
~~~

### マイグレーション実行

vagrant sshでサーバーに入ります。
index.phpを設置したディレクトリに移動します。

~~~
cd public
php index.php migrate
~~~

usersテーブルが作成されました。
rootユーザと一般ユーザごとに色を変える

rootユーザと一般ユーザの色を変える方法になります。
一般的な記事は、.bashrcなどに記述する方法が多いのかなと思います。

サーバ管理している人からサーバを渡される際に、「あれ？bashrcに記述ない。」ということがあったので、メモとして残しておきます。

色々と管理する方法はあるんですね。

rootユーザと一般ユーザの色を変える方法

```
// コマンド sudoで編集またはrootでアクセス
vi /etc/profile.d/colormyprompt.sh
```

```
#!/bin/sh
lc='\[\e[1;' # lead-in character
RED=${lc}31m;
PURPLE=${lc}35m
RC=${lc}0m # reset character

if [ "$USER" = "root" ]
then
pc=$RED
else
pc=$PURPLE
fi

PS1="${pc}\]\u@\h \W\\$ ${RC}\]"
```

プログラム実行

```
source /etc/profile.d/colormyprompt.sh
```
EC2インスタンスのAMI作成中にインスタンスを起動して良いのか？

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

AWS上のサーバのバックアップを取りたいときにAMIの作成を行うことがあります。
作成のために一度停止してからAMIの作成を行うのですが、AMI作成中に対象のインスタンスを起動して良いのものなのか実は今まで悩んでいました。

progressが100％になるまで起動してAMIの作成が失敗するのが嫌だなーと思っていたのですが、
サポートに確認したところ作成中にも起動してよいという回答をいただけました。

これからは安心してバックアップのために裏側でAMI作成中にも起動することができます。

参考に教えてもらったURL
- Amazon EBS-Backed Linux AMI の作成
　http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html
es7.decorator でプロパティ validation やるとこんな感じなのだろうか

仕様: https://github.com/wycats/javascript-decorators

プロパティ自体に decorator は付か無いので、しかたなく setter を作ったけど、なんかうまくできないだろうか。
(この使い方自体が筋悪な気もするが、 decorator でやりたいのってこういうのな気がする。)

```js
// $ babel-node --optional es7.decorators index.js
class Assert {
  private(target, name, descriptor) {
    let value;
    descriptor.set = (val) => {
      value = val;
    }
    descriptor.get = () => {
      return value;
    }
  }

  required(target, name, descriptor) {
    let original = descriptor.set;
    descriptor.set = (val) => {
      console.assert(val !== undefined, `${name} is required`);
      original(val);
    }
  }

  validate(target, name, descriptor) {
    let original = descriptor.set;
    descriptor.set = (val) => {
      console.assert(val.method !== undefined, `${name}.val is required`);

      let method_list = ['get', 'post', 'put', 'delete'];
      console.assert(method_list.indexOf(val.method) > -1, `${name}.val should be one of ${method_list} but ${val.method}`);
      original(val);
    }
  }
}

var assert = new Assert();

class Fetcher {

  @assert.required
  @assert.private
  set url(val) {}

  @assert.validate
  @assert.required
  @assert.private
  set option(val) {}

  constructor(url, option) {
    this.url = url;
    this.option = option;
  }
}

var fetcher = new Fetcher('http://example.com', { method: 'get' });
console.log(fetcher);         // {}
console.log(fetcher.url);     // http://example.com
console.log(fetcher.options); // { method: 'get' }
```


追記

関数の引数を先に奪ってバリデート

```js
class Fetcher {

  @assert.required
  @assert.private
  set url(val) {}

  @assert.validate
  @assert.required
  @assert.private
  set option(val) {}

  constructor(url, option) {
    this.url = url;
    this.option = option;
  }
}

var fetcher = new Fetcher('http://example.com', { method: 'get' });
console.log(fetcher);         // {}
console.log(fetcher.url);     // http://example.com
console.log(fetcher.options); // { method: 'get' }
```

汎用の関数 wrapper を作るアノテーションを別途用意。

```js
class Fetcher {

  @assert.required
  @assert.private
  set url(val) {}

  @assert.validate
  @assert.required
  @assert.private
  set option(val) {}

  constructor(url, option) {
    this.url = url;
    this.option = option;
  }
}

var fetcher = new Fetcher('http://example.com', { method: 'get' });
console.log(fetcher);         // {}
console.log(fetcher.url);     // http://example.com
console.log(fetcher.options); // { method: 'get' }
```
AVAssetExportSessionで"Cannot Decode"エラー

# 概要
AVAssetExportSessionを使った動画出力に関するコードを書いていたところ、以下のエラーが発生した。

>  Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode" UserInfo=0x7fea915d4ed0 {NSLocalizedDescription=Cannot Decode, NSLocalizedFailureReason=The media data could not be decoded. It may be damaged.}

実機だと動くが、シミュレータだと動かない。


# やったこと
* 修正前のソースコード

```
AVAssetExportSession * session = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];
session.outputFileType = AVFileTypeMPEG4;
```

* 修正後のソースコード

```
AVAssetExportSession * session = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetPassthrough];
session.outputFileType = AVFileTypeMPEG4;
```

変更したのは、引数の``presetName``に指定する値。
エンコードしないよう、``AVAssetExportPresetPassthrough``を指定した。


# memo
Presetの値は、以下を参考にした。
https://developer.apple.com/jp/documentation/AVFoundationPG.pdf
Selenium WebDriver　IE7起動エラー "This is the initial start page for the WebDriver server."

# 環境
+ PC (OS:Windows Server 2003, x64 Edition, SP2)
+ IE (ver 7)
+ Java (1.7)
+ Selenium WebDriver (2.42.2)

# エラー

+ Selenium WebDriverを使ってIE7の画面テストを行う際に下記エラーが発生しました。

+ IE7は起動しますが、真っ白のページに下記メッセージが表示され、テスト対象のページへ遷移できません。

    ```
    This is the initial start page for the WebDriver server.
    ```

+ コンソール上にもエラーが出ます。

    ```
Exception in thread "main" org.openqa.selenium.WebDriverException: Failed to navigate to http://user01:password01@stg.allabout.co.jp/. This usually means that a call to the COM method IWebBrowser2::Navigate2() failed. (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 31 milliseconds
　　　　　：
　　　（以下省略）
    ```

# 原因

+ 下記参考ページをヒントに、テスト対象のURLがIE7でサポートしていないことが分かりました。

  + テスト対象のページにベーシック認証がかかっていて、これをスルーしたいため、下記のようなURLを使っていました。
  + http://user01:password01@test.allabout.co.jp/

# 対応

+ このようなURLをIEで開くにはレジストリに値を追加する必要があるようです。
(64bit OSの場合)

  + 左メニュー[スタート]-[ファイル名を指定して実行] で regedit と入力。

  + レジストリエディタで下記のようにツリーをたどり、[FeatureControl]を右クリックし
    [キー]->[新規]で[FEATURE_HTTP_USERNAME_PASSWORD_DISABLE]を追加。

    ```
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\
    ```

 + 追加した上記キーを選択し、右ペインで右クリック。[新規]->[DWORD 値]で下記を追加。

    ```
    [名前] iexplore.exe
    [値]   0
    ```

# 参考にしたページ
+ http://stackoverflow.com/questions/8490622/this-is-the-initial-start-page-for-the-webdriver-server-while-working-wth-web
+ http://qiita.com/reoring/items/5563e729c3e92a95c9bb