OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] たった1行で音声合成をする

音声合成ライブラリ「AquesTalk」のiOS版には、xcodeで使えるフレームワークが含まれています。
これを用いれば、次のような1行で簡単に音声合成できます。

`AquesTalk.play("ゆっくりしていってね？")`

#導入方法
フレームワークの追加とimportという通常のフレームワークの導入方法は必要ですが、それ以外はplayメソッド1行で音声合成できます。

###**1. フレームワークをプロジェクトに追加**
AquesTalk iOSをダウンロードして、このzipファイルを展開しておきます。
ダウンロードしたパッケージ内のAquesTalk.frameworkを、
プロジェクトSetting画面＞Generalタブ＞Embedded Binariesに追加します。
この時、Copy items if neededをチェックし、フレームワークをプロジェクトにコピーする方が簡単です。

###**2. import**
使用するクラスの先頭でAquesTalkフレームワークをimportします

```swift:ViewController.swift
import UIKit
import AquesTalk
```
###**3. playメソッドをコール**
あとは、任意の場所にplayメソッドを記述するだけです。
引数の文字列には、漢字の文字列を記述できません。
かな表記の読み記号とアクセントなどで記述した[音声記号列](http://www.a-quest.com/download/manual/siyo_onseikigou.pdf)を指定します。

```swift:ViewController.swift
@IBAction func onPlayButton(sender: AnyObject) {
   AquesTalk.play("こんにちわ")
}
```

#その他の機能
###**1. 話速を変える**
引数speedに50から200までの値を指定して話す速度を変更できます。値を小さくすると遅くなります。デフォルトは100で省略できます。

'AquesTalk.play("ゆっく'り/はっせーしま'す", speed: 50)'

###**2. 発声を止める**
メソッドstop()の呼び出しで、発声の途中で終了することができます。

###**3. 発声の終了タイミングを知る**
引数notificationにNSNotificationを指定すると、発声終了のタイミングでそのNotificationが発生します。これにより、発声終了時に何か処理を行うことができます。
次のコードは、発声開始時にラベルを"Playing..."にし、発声終了後"Done"にする例です。

```swift
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        // Notificationの登録　発声終了を検知しなければ不要 selector(メソッド名)やnameは任意で
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.daDone(_:)), name: "AquesTalkDaDoneNotify", object: nil)
    }
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    @IBAction func play(sender: AnyObject) {
        //終了通知イベントの作成　name部分はNSNotificationCenterに登録した値に合わせる
        let myNotifi: NSNotification = NSNotification(name: "AquesTalkDaDoneNotify", object: self, userInfo: nil)
        onPlayLabel.text = "Playing..."
        AquesTalk.play("こんにちわ、こんばんわ", notification:myNotifi)
    }

    // 発声終了後に呼ばれる
    func daDone(notification: NSNotification) {
        onPlayLabel.text = "Done"
    }
    
    @IBOutlet weak var onPlayLabel: UILabel!

```

###**4. その他**
他には、発声中の有無を返すisPlay()メソッドや、音声再生せずにNSDataにwavフォーマットのデータを返すsynthe()メソッドがあります。

#AquesTalk2 iOS
AquesTalkの兄弟分のAquesTalk2も同様の方法で使用できます。
AquesTalk2.frameworkでは、引数にphontnameというものが追加されており、ここに声種を指定すれば異なる声の種類で発声できます。例えば次の例では男声で発声します。

`AquesTalk2.play("これわて'すとです", phontname: "aq_m5")`

phontnameに指定できる種類は、AquesTalk2.framework内のphont.bundleを覗くとわかります。

#Links
[AquesTalk iOS 評価版ダウンロード](http://www.a-quest.com/download/index.html)
評価版は、ナ行、マ行がヌになる制限があります。個人が非営利で使う場合など、アクエストの個人利用の規定に従えば登録料のみで製品版のライブラリが入手できます。詳細はライセンスのページを参照。

[音声記号列仕様書](http://www.a-quest.com/download/manual/siyo_onseikigou.pdf)
playメソッドで読み上げる文字列（音声記号列）の書き方はここに規定されています。
Excelでヒストグラムを作る


度数分布を計算するには配列数式を使います。

（例）A2からA7のセルの度数を２０刻みで集計する
　1. 範囲データのセット。B2からB5に区分上限値を記入。
　2. 範囲データより一つ多いセル(C2からC6)を選択して、
　　　`=Frequency(A2:A7,B2:B5)`を入力後、
　　　windowsなら`Control + Shift+Enter` 
　　　Macなら`⌘+Enter`を入力する。

| |A|B|C|
|--:|--:|:--:|:--:|
|1|Data|Range|Frequency|
|2|12|20|3|
|3|23|40|10|
|4|85|60|15|
|5|51|80|7|
|6|55||2|
|7|70|||

配列数式の入力や修正はちょっとクセがあります。
※　windowsのキーを訂正しました。

gnuplotについては、iwiwiさんの記事が参考になりますね。
Redisのeval/lua scriptをnode.jsで利用してみた


# 前提条件
* Redis 3.2-rc3
* Node.js 5.9.1
* npm
	* node_redis 2.6.0-0

# ソースコード

```javascript
'use strict'

let redis = require("redis")
  , client = redis.createClient()
  ;

let script = 'return redis.call("INCR", KEYS[1])';
client.eval(script, 1, 'foo', function (err, reply) {
    console.log(reply.toString());
});

client.script('load', script, function (err, reply) {
    let sha1 = reply.toString();
    console.log(sha1);
    client.evalsha(sha1, 1, 'foo', function (err2, reply2) {
        console.log(reply2.toString());
        client.quit();
    });
});
```

# 実行結果

```
1
f793247de6e1e3c553cd42d39c812df499e679e4
2
```

# 参考資料
* http://rest-term.com/archives/3038/
Ubuntu Server 14.04 のApacheでSuEXECを使う


デフォルトではインストールされていないので、`SuexecUserGroup`を使おうとすると、

```
AH00526: Syntax error on line 31 of /etc/apache2/sites-enabled/000-default.conf:
Invalid command 'SuexecUserGroup', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
```

のようなエラーが出る。

以下の手順で使えるようになった。

```
$ sudo apt-get install apache2-suexec
$ sudo a2enmod suexec
$ sudo service apache2 restart
```

参照: http://d.hatena.ne.jp/vividcode/20100923/1285265944
sublime で gem にも ctags を適用させる

Gem のメソッドを調べるのが手間だったので、Gem のメソッドも ctags で飛べるようにしました。

# やる事

コンソールを開いて、Gem の Path を取得して、ctags を実行するだけ

```rb
paths = Bundler.load.specs.map(&:full_gem_path)
system("ctags -R -f .gemtags #{paths.join(' ')}")
```

以上！簡単！

試しに `create_with` 調べたらちゃんと ActiveRecord のファイルに飛んだ

```rb
module ActiveRecord
  module QueryMethods
    ...

    def create_with(value)
      spawn.create_with!(value)
    end
```

んーこんな簡単ならもっと早くやっておけば良かった。

ちなみに、`.gemtags` が tag の検索対象になっていない方は CTags.sublime-settings で

```
"extra_tag_files": [".gemtags"],
```

として下さい。
C > time.h > 1970年1月1日からの経過秒数を"年月日時分"文字列に変換する

参考 http://www1.cts.ne.jp/~clab/hsample/Time/Time5.html

<font color=red>
(追記 2016/03/28)
workdt.tm_mon = mm;は間違いのようです。
workdt.tm_mon = mm - 1; // 月（ 1月＝0 ）
</font>

## code v0.1

http://ideone.com/urqGYm

```
#include <stdio.h>
#include <time.h> // 試験用の秒を得るために使用. 開発環境には存在しない

time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn){
	struct tm workdt;
	workdt.tm_isdst = -1; // summer time flag
	workdt.tm_year = yyyy - 1900;
	workdt.tm_mon = mm;
	workdt.tm_mday = dd;
	workdt.tm_hour = hh;
	workdt.tm_min = nn;
	workdt.tm_sec = 0;
	return mktime(&workdt);
}

void getDateTimeString(time_t srcdt, char *dstPtr)
{
	if (dstPtr == NULL) {
		return; // error
	}
	struct tm *workdt;
	workdt = localtime(&srcdt);	
		workdt->tm_year = workdt->tm_year + 1900;
	sprintf(dstPtr, "%04d/%02d/%02d %02d:%02d", workdt->tm_year, workdt->tm_mon, workdt->tm_mday, 
		workdt->tm_hour, workdt->tm_min);
}

int main(void) {
	time_t sec;
	char szBuf[100];
	
	sec = getElapsedSecond(2016, 3, 27, 18, 36);
	printf("%u\n", sec);
	
	getDateTimeString(sec, szBuf);
	printf("%s\n", szBuf);

	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2288 signal:0
1461782160
2016/03/27 18:36
```

## code v0.2 > strftime()使用

strftime()を使ってみた。

http://ideone.com/OvVLEs

以下を追加。

```
void getDateTimeStringUsingStrftime(time_t srcdt, char *dstPtr)
{
	if (dstPtr == NULL) {
		return; // error
	}
	struct tm *workdt;
	
	workdt = localtime(&srcdt);
	strftime(dstPtr, 100, "%Y/%m/%d %H:%M", workdt);
}
```

コード全部は以下。

```
#include <stdio.h>
#include <time.h> // 試験用の秒を得るために使用. 開発環境には存在しない

time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn){
	struct tm workdt;
	workdt.tm_isdst = -1; // summer time flag
	workdt.tm_year = yyyy - 1900;
	workdt.tm_mon = mm;
	workdt.tm_mday = dd;
	workdt.tm_hour = hh;
	workdt.tm_min = nn;
	workdt.tm_sec = 0;
	return mktime(&workdt);
}

void getDateTimeString(time_t srcdt, char *dstPtr)
{
	if (dstPtr == NULL) {
		return; // error
	}
	struct tm *workdt;
	workdt = localtime(&srcdt);	
		workdt->tm_year = workdt->tm_year + 1900;
	sprintf(dstPtr, "%04d/%02d/%02d %02d:%02d", workdt->tm_year, workdt->tm_mon, workdt->tm_mday, 
		workdt->tm_hour, workdt->tm_min);
}

void getDateTimeStringUsingStrftime(time_t srcdt, char *dstPtr)
{
	if (dstPtr == NULL) {
		return; // error
	}
	struct tm *workdt;
	
	workdt = localtime(&srcdt);
	strftime(dstPtr, 100, "%Y/%m/%d %H:%M", workdt);
}

int main(void) {
	time_t sec;
	char szBuf[100];
	struct tm *timeptr;
	
	sec = getElapsedSecond(2016, 3, 27, 18, 36);
	printf("%u\n", sec);
	
	getDateTimeString(sec, szBuf);
	printf("%s\n", szBuf);
	
	getDateTimeStringUsingStrftime(sec, szBuf);
	printf("%s\n", szBuf);

	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2292 signal:0
1461782160
2016/03/27 18:36
2016/04/27 18:36
```

なぜか月が１つずれている。
http://www.c-tipsref.com/reference/time/strftime.html
によると

> %m	月(01 ～ 12)

 struct tmに値を入れる部分が間違っていることに気づいた。
http://www1.cts.ne.jp/~clab/hsample/Time/Time5.html
> int tm_mon;        // 月（ 1月＝0 ）
C > time.h > 1970 年1月1日からの経過秒数の取得

参考 http://www1.cts.ne.jp/~clab/hsample/Time/Time5.html
> 西暦 1970 年1月1日からの経過秒数に変換します。

## したいこと

ある年月日時分の文字列から秒数を取得したい。

## code

<font color=red>
(追記 2016/03/31)
workdt.tm_mon = mm;は間違いのようです。
workdt.tm_mon = mm - 1; // 月（ 1月＝0 ）
</font>

http://ideone.com/3q1Syd

```
#include <stdio.h>
#include <time.h> // 試験用の秒を得るために使用. 開発環境には存在しない

time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn){
	struct tm workdt;
	workdt.tm_isdst = -1; // summer time flag
	workdt.tm_year = yyyy - 1900;
	workdt.tm_mon = mm;
	workdt.tm_mday = dd;
	workdt.tm_hour = hh;
	workdt.tm_min = nn;
	workdt.tm_sec = 0;
	return mktime(&workdt);
}

int main(void) {
	time_t sec;
	
	sec = getElapsedSecond(2016, 3, 27, 18, 36);
	printf("%u\n", sec);

	return 0;
}
```

```txt:結果
Success	time: 0 memory: 2244 signal:0
1461782160
```
Debian で Dropbox が動かない。Please run "echo fs.inotify.max_user_watches=100000…" 云々と言われた

# TL;DR

Debian や、Ubuntu ベースである KDE neon などで Dropbox の同期がうまくいかない場合で、CLI から `dropbox start` を実行した際に、下記のようなエラーメッセージが表示される場合の対処法について記述する。

> Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.

1. /etc/sysctl.d/ 以下に、拡張子が .conf のファイルを作成し、その中に `fs.inotify.max_user_watches=100000` と記述する。
2. `sudo sysctl --system` を実行する
3. Dropbox を再起動する。

コマンドで表現すると下記のようになる。

```bash
$ echo "fs.inotify.max_user_watches=100000" | sudo tee /etc/sysctl.d/dropbox.conf
$ sudo sysctl --system
$ dropbox stop
$ dropbox start
```

# 詳細

Debian に Dropbox をインストールしたのだが、どうも同期がうまくいっていないように見える。
※2020/09/20追記: Ubuntu ベースである KDE neon でも同様の問題が発生した。Ubuntu や、Red Hat 系その他のディストリビューションでも同様の状況が発生しているのかもしれない。

一旦停止して再度コンソールから起動してみた。

```bash
$ dropbox stop
Dropbox daemon stopped.
$ dropbox start
Starting Dropbox...Done!

Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.
```

出力されたエラーメッセージを見る限り、/etc/sysctl.conf に `fs.inotify.max_user_watches=100000` という行を追加した後、`sudo sysctl -p` を実行せよ、とある。

まず、`fs.inotify.max_user_watches` は `inotify` なるライブラリーの設定のようだ。[man を見ると、](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/inotify.7.html)これは はファイルやディレクトリーの変更を監視するためのライブラリー。恐らく Dropbox はこれを用いてファイルの変更を検知しているのだろう。

`fs.inotify.max_user_watches` は、どうやら監視対象にできるファイル数の上限を示しているようだ。つまり、Dropbox に入っているファイル数が多すぎる、ということか。
現在の値は

```shell-session
$ cat /proc/sys/fs/inotify/max_user_watches
```
で見れるようで、私の環境では 8192 だった。

/etc/sysctl.conf はカーネルパラメーターを記述するためのファイルで、ここに

```
fs.inotify.max_user_watches=100000
```

と記述することで、監視対象にできるファイル数の上限を100,000に設定できる。
ファイルを編集した後、`sudo sysctl -p` を実行して /etc/sysctl.conf を読み込み直すことができる。その後 Dropbox を再起動すれば問題が解消しているはずだ。

尚、個人的には /etc/sysctl.conf を直接編集せず、/etc/sysctl.d/ 以下に別途 *.conf ファイルを作成し、上記の設定を記述する方が好みである。(TL;DR に記述したコマンドでもそのようにしてある。)
その場合、`sudo sysctl -p` ではなく `sudo sysctl --system` を実行しなければ設定が読み込まれないため注意されたい。

尚、Linux に不慣れで、`sysctl -p` や `sysctl --system` を実行することに不安があれば、/etc/sysctl.conf または /etc/sysctl.d/*.conf を編集し保存した後、単に OS を再起動しても良い。
VisualStudioでAngularJSとASP.NETを使って Routing

目的：VisualStudioでAngularJSとASP.NETを使い、Routingを実装する。
理由：VisualStudioでWebSiteを構築しようとすると、情報が多く複雑すぎるため初心者には難しい。
初心者が理解しやすいように必要最低限な情報で構成した。

実行方法：
1.<a html="https://github.com/redpeaks33/AngularJS_VisualStudio_Routing.git">AngularJS_VisualStudio_Routing.git</a>のサイトからZipダウンロードして解凍
2.ソリューション（.slnファイル）をクリック　して VisualStudio起動
3.実行（Ctrl ＋ F5）

概略
![Routing.png](https://qiita-image-store.s3.amazonaws.com/0/118025/81c0619f-ccde-e41a-6e16-92fb9590d012.png)

フォルダ構成
![Tree.png](https://qiita-image-store.s3.amazonaws.com/0/118025/677d3e4d-c75f-f318-d255-aff5d824e4fe.png)

1.Global.asaxにRoutingを設定

```global.asax
        public class MyHttpControllerRouteHandler : HttpControllerRouteHandler
        {
            protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                return new MyHttpControllerHandler(requestContext.RouteData);
            }
        }

        public class MyHttpControllerHandler : HttpControllerHandler, IRequiresSessionState
        {
            public MyHttpControllerHandler(RouteData routeData)
                : base(routeData)
            {
            }
        }
        public static void RegisterRoutes(RouteCollection routes)
        {
            var route = routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = System.Web.Http.RouteParameter.Optional }
            );
            route.RouteHandler = new MyHttpControllerRouteHandler();
        }
```
2.$http.getを使ってURL送信

```controller.js
    $scope.GetStart = function () {
        $http.get("api/Contents/1").success(function (data, status, headers, config) {
            $scope.Message += ':' + data;
        }).error(function (data, status, headers, config) {
            alert('error');
        });
    };
```

3.URLに応じて値を返す

```ContentsController.cs
    public class ContentsController : ApiController 
    {
        public string GetContents(int id)
        {
            return "Value form Server Controller";
        }
        
        public void PutContents(object data)
        {
            Console.WriteLine(data);
        }   
    }
```


おしまい
Web APIのロギング: リクエスト毎にUUIDを生成しX-Request-IDで返す

RubyでWeb APIサーバ(非Rails)を作った際のロギングに関するメモ。

リクエスト毎にユニークなrequest idを発行し、そのリクエストに関わる処理に関してrequest idをつけてロギングしたい。またレスポンスヘッダには`X-Request-Id: <request id>`をつけてクライアントに返したい。

request idでgrepすればログ調査しやすくなり、ログの中で処理全体を通してトラッキングできる。またクライアントに`X-Request-Id:`でidを返すことでクライアント側からの問い合わせに対して調査しやすくなる。

[rack-request-id](https://github.com/anveo/rack-request-id)というrack middlewareで都度idを発行し、[request_store](https://github.com/steveklabnik/request_store)を経由してidをloggerに渡すようにしてみた。

# 実装

**config.ru**

```rb
# config.ru
use RequestStore::Middleware
use Rack::RequestId, storage: RequestStore
```

**logger**

```rb
# アプリのコードのlogger作成のところ。フォーマッタでrequest_idを埋め込む
log = Logger.new('log/app.log').tap do |logger|
  logger.formatter = proc{|severity, datetime, progname, message|
    "time:#{datetime.strftime("%FT%T%z")}\tlevel:#{severity}\trequest_id:#{RequestStore[:request_id] || '-'}\tprog:#{progname}\tmessage:#{message}\n"
}
end

log.warn "Hi!!!"
=> "time:2016-03-24T12:30:02+0900  
    level:WARN      request_id:e68d8328e4ea46137147728414b613f7
    prog:   message:Hi!!!"
```

`use Rack::RequestId`することで、リクエスト受信時にSecureRandomを使ってidを発行するようになる。発行したidは内部的にはデフォルトでは`Thread.current[:request_id]`に保存されるが、保存先は`storage:`オプションで`#[]`, `#[]=`メソッドを実装した任意のオブジェクトに変更可能([rack-request-id/#4](https://github.com/anveo/rack-request-id/pull/4)。

上のコードではRequestStore経由へ保存するようにしている。ロガークラスで`Thread.current[:request_id]`を直接参照させるよりも、実装を隠してRequestStoreを経由させることにした。

また`use RequestStore::Middleware`するとレスポンス処理の最後に保存されていたrequest idを消してくれる。同一のスレッド(もしくはプロセス)で続きざまにリクエストを処理する場合、前のリクエストのrequest idが残っていると問題になる可能性があるので、レスポンス処理最後に消す。

# 参考
[リクエスト単位でグローバルな参照を持たせてAuditログをスッキリ実装したい](http://qiita.com/ainame/items/823b396d560d82194d48)
jqPlotでブラウザが落ちる場合の対応


jqPlotでグラフを描画しています。
セレクトボックスの値が切り替わったら、グラフを再描画しています。
セレクトボックスを数回変更したら、ブラウザが落ちてしまいました。

原因はメモリリークのようで、destroyメソッドを実行したら解決しました。

# コード
```js
document.getElementById("selectbox").onchange = drawChart;

function drawChart() {
 //グラフ描画処理
 $.jqPlot("chartArea", ...);
};
```

```js
var chartObject; //グラフオブジェクト(グローバル変数)
document.getElementById("selectbox").onchange = drawChart;

function drawChart() {
 if (chartObject != null) {
   chartObject.destroy();
 }
 //グラフ描画処理
 chartObject = $.jqPlot("chartArea", ...);
};

```

# 参考サイト

http://www.jqplot.com/docs/files/jqplot-core-js.html#jqPlot.destroy
http://stackoverflow.com/questions/6380016/what-to-do-with-jqplot-memory-leak
Redis3.2から追加予定のGeo hashing APIをnode.jsで利用してみた


# 前提条件
* Redis 3.2-rc3
* Node.js 5.9.1
* npm
	* node_redis 2.6.0-0

# ソースコード

```javascript
'use strict'

let redis = require("redis")
  , client = redis.createClient()
  ;

client.geoadd('Sicily', 13.361389, 38.115556, 'Palermo', 15.087269, 37.502669, 'Catania');

client.geodist('Sicily', 'Palermo', 'Catania', function (err, reply) {
    console.log(reply.toString());
});

client.georadius('Sicily', 15, 37, 100, 'km', function (err, reply) {
    console.log(reply.toString());
});

client.georadius('Sicily', 15, 37, 200, 'km', function (err, reply) {
    console.log(reply.toString());
});

client.quit();
```

# 実行結果

```
166274.15156960033
Catania
Palermo,Catania
```

# 参考資料
* http://redis.io/commands/geoadd
「請求とコスト管理」コンソールにアクセスできるIAMアカウントを作成する

# 概要

IAMアカウントで「請求とコスト管理」にアクセスできるようにする設定のまとめです。
下記に引用したとおりデフォルトではIAMアカウントでは「請求とコスト管理」にはアクセスできません。

> デフォルトでは、IAM ユーザーは AWS 請求およびコスト管理コンソールにアクセスできません。所有者またはアカウント管理者がユーザーにアクセスを許可する必要があります。これを行うには、IAM 管理ポリシーをユーザーにアタッチするか、カスタムポリシーを作成して、AWS ウェブサイトへのアクセスをアクティベートします。IAM ポリシーは、1 人のユーザーにアタッチすることもユーザーグループにアタッチすることもできます。
[請求の情報およびツールへのアクセス許可] (https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html)


**参考**

* [請求の情報およびツールへのアクセス許可] (https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/grantaccess.html)
* [Billing and Cost Managementの権限リファレンス] (https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-permissions-ref.html)


## 手順

この記事で説明するアクセスポリシーの適用は

* アクセスポリシーを持つグループを作成
* そのグループに「請求とコスト管理」にアクセスできるカスタムポリシーを設定
* IAMアカウントをそのグループに追加

という方法で行います。

### IAMアクセスのアクティブ化

ルートアカウントでログインし、図のメニューよりアカウント設定ページへ移動します。

![aws_op01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/bd6031bf-c812-6590-8eb9-e0c906dce2ef.png)

アカウント設定ページの中ほどにある「請求情報に対するIAMユーザーアクセス」欄で「IAMアクセスのアクティブ化」にチェックを入れて更新ボタンをクリックします。

![aws_op2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/692301d8-c967-5fe4-8d82-5cf1d5d066ee.png)


### ポリシーの作成

Identity and Access Managementページへ移動して「請求とコスト管理」にアクセスできるポリシーを持つグループを作成します。
ポリシーのアタッチではなにもせず次へ進みグループを作成します。

![aws_op3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e19c58e3-ce4b-2e3d-8190-3bbe50d48140.png)

新しく作成したグループのアクセス許可でインラインポリシーを設定します。

![aws_op4.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ac40a52f-5c8a-3eab-0ce4-e8ff154ac54e.png)

カスタムポリシーを選択します。

![aws_op5.png](https://qiita-image-store.s3.amazonaws.com/0/22772/57d1bd68-c57a-f633-58d2-e0ed8c970fec.png)

ポリシーエディターで下記の設定を入力し「ポリシーの検証」ボタンを押して間違いがないか確認します。
ポリシーが有効であることを確認できたら「ポリシーの適用」ボタンを押してポリシーを作成します。

**ポリシー名**

ViewBilling

**ポリシードキュメント**

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "aws-portal:ViewUsage",
                "aws-portal:ViewBilling"
            ],
            "Resource": "*"
        }
    ]
}
```

### IAMアカウントにポリシーを適用する

IAMアカウントへポリシーを適用するには上記で作成したグループにIAMアカウントを追加します。
ポリシーを適用したいIAMアカウントのグループで「グループにユーザーを追加」ボタンをクリックします。

![aws_op6.png](https://qiita-image-store.s3.amazonaws.com/0/22772/cb2bff3d-5b2e-a17f-fbbd-e16f79a164da.png)

追加するグループを選択します。

![aws_op7.png](https://qiita-image-store.s3.amazonaws.com/0/22772/48b495bc-02b0-e6ee-e2b0-f4ba1d135457.png)

あとは、ポリシーを適用したIAMアカウントで「請求とコスト管理」コンソールへアクセスができることを確認します。
なお、このポリシーだけを適用したIAMアカウントでは他のコンソール（例えばEC2）の情報は表示できません。

![aws_op8.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d3bab5d8-7888-20b4-1416-036985c4a9e7.png)
[Unity]WebGLのカスタムテンプレートを追加してみた

「[WebGL テンプレートの使用](http://docs.unity3d.com/ja/current/Manual/webgl-templates.html)」ページにあるWebGLのカスタムテンプレートの追加及び設定方法について分かったことをメモ



#  デフォルトで用意されているテンプレートについて

![WebGLTemplate.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/38b018a2-d75f-49c2-d4e2-2c677cfae25a.jpeg)


デフォルトのテンプレートはDefaultとMinimalの2種類が用意されており、こちらのテンプレートはWindows環境であれば下記の場所にある模様。


 ```
 (Unityのインストールフォルダ)\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates
 ```



# カスタムテンプレートを追加
 
## カスタムテンプレートの用意 
 
 今回はテストとしてデフォルトで用意されているテンプレートの中の[Default]の方をコピーして追加してみたいと思います。

![WebGLTemplate2.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/fbb261cf-7239-3892-d3f0-0014edf3448c.jpeg)


※そのままそっくりコピーして追加すると分かり難いので以下の変更を加えます。

* フォルダ名を"Test"に変更
* PlayerSettingsに表示されるサムネイルを下記の物に差し替え

![thumbnail.png](https://qiita-image-store.s3.amazonaws.com/0/80207/8ffef0a2-b1b6-5c86-a925-337d5886aea6.png)


## Unityプロジェクトにカスタムテンプレートを追加

プロジェクトのAssets以下に"WebGLTemplates"フォルダを追加
→更にその下に先ほど作成したカスタムテンプレートを追加

こうする事でPlayerSettingsにカスタムテンプレートが追加されます。

※WebGLTemplates以下にあるサブフォルダ名がPlayerSettingsに表示される名前になる模様

![WebGLTemplate3.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/f87dd7f3-4631-4f9c-bf74-cdea93eb1831.jpeg)

後は追加したテンプレートを選択してビルドする事でカスタムテンプレートが適用されます。
現在時刻を動的に変更してJUnit実行したい場合の方法

# 背景
1. 現在時刻を使った処理のJUnitテストを書きたい
2. ファイルに時刻が埋まっているなど、チェックしたい時刻の変更が面倒
3. 現在時刻から1分以内の処理時間かどうかを判定したい
4. 判定対象となる時刻はファイルに記載されている

この状態では、テストケースでファイルを用意してもその瞬間しか使えない。またファイル自体は自動生成するのはコストが高すぎる。

例えば、、、以下はStorm UI REST APIでアクセスできる情報。このcomponentErrors内にあるtimeを現在時刻と比較するようなJUnitの場合、色々と面倒。

```
{
  "executors": 1,
  "componentErrors": [
    {
      "time": 1458203307000,
      "errorHost": "hostname",
      "errorPort": 6701,
      "errorWorkerLogLink": "http:\/\/hostname:8000\/log?file=worker-6701.log",
      "errorLapsedSecs": 612537,
      "error": "java.lang.RuntimeException: 
  :
  :
  :
```

- 現在時刻をいじる？　->　**システム時刻の変更は何かと危険、できれば避けたい。**
- テストデータ読み込み時にtime要素だけ書き換えてファイル上書きする？あるいはテンプレート的に用意しておいて、テスト実施前に埋め込むコードを書く？　->　**その仕組みを用意するだけでコストかかりそう。**
- そもそもファイル読み込みを諦めてJacksonとかに変換したものを使う？　->　**本来やりたいことから逃げてるだけ**

とまあ、色々考えました。

# 解消方法
Java 8以上の実行環境であれば、java.time.Clockを利用する。

# 実装例
[テスト対象のコード]
Clockを現在時刻を扱うメソッドに引き渡すことで実現可能。この書き方に慣れていない自分は若干気持ち悪い実装に感じましたが、これがClockの使い方らしい。
※以下の例では「currentTimeClock」がClockオブジェクト

```
// ファイルからターゲットとなる時刻のlong値を既に取得済み。
for (Map<String, Object> componentError : componentErrorList)
{
    Long targetTime = (Long) componentError.get("time");
    if (targetTime == null)
    {
        continue;
    }

    long currentTime = currentTimeClock.millis();
    if (targetTime <= currentTime && currentTime - targetTime < BORDER_TIME_DIFF)
    {
        resultChecking = "Failed";
    }
}
```

通常は

```
Clock.systemDefaultZone()
```

でインスタンスを生成する。
テスト時は

```
Clock clock = Clock.fixed(ZonedDateTime.of(2016, 03, 17, 17, 29, 25, 0, ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault());
```

などの手法でfixed関数を使うと、現在時刻を取得するタイミングでもfixedで指定された時刻が返るようになる。実装例ではmillis()メソッドを利用しているが、以下のように書いてもOK。というか下記の方が一般的な書き方らしい。

```
LocalDateTime.now(clock);
```
webdriver.jsでブラウザ側の例外をキャッチする

# はじめに
自分の趣味プロジェクトではseleniumを動かすために[webdriver.js](https://www.npmjs.com/package/selenium-webdriver)を使っていますが、ブラウザ側の例外もキャッチできたら便利だなーと思いました。以外とそのやり方があまり載っていなかったので、忘備録も兼ねてまとめてみました。

# やり方

まずはクライアントのhtmlに以下のコードを追加します。

```js
window.jsErrors = [];
window.onerror = function(errorMessage) {
　　　　window.jsErrors.push(errorMessage);
}
```

次にテストコード側に以下のコードを追加します。

```js
driver.executeScript(function(){
  return window.jsErrors;
}).then(function(jsErrors) {
  if(jsErrors.length > 0) {
    throw new Error(jsErrors);
  }
})
```

元ネタはここです。
https://mguillem.wordpress.com/2011/10/11/webdriver-capture-js-errors-while-running-tests/

# 解説
(1)クライアントに追加したコード

```js
window.jsErrors
```
上記コードで、例外を入れておく変数を宣言しています。もっとクールなやり方はあると思いますが、これはグローバル変数で定義しています。

```js
window.onerror = function(errorMessage) {
　　　　window.jsErrors.push(errorMessage);
}
```
window.onerrorとは例外が発生した際に実行される処理です。この中で先ほどグローバル変数に定義したjsErrorsにエラーメッセージを格納しています。

(2)テストに追加したコード
webdriver.jsでは基本的にPromiseを使っています。Promiseについては[この記事](http://techblog.yahoo.co.jp/programming/jquery-deferred/)がわかりやすいです。

```js
driver.executeScript(function(){
  // ここにブラウザで実行するjavascriptを書く
  // return すればブラウザ側の変数をテストコードに持ってくることができる
});
```
executeScriptでブラウザ側のエラーを取得しています。

```js
}).then(function(jsErrors) {
  if(jsErrors.length > 0) {
    throw new Error(jsErrors);
  }
})
```
jsErrorsは例外が起こるたびにエラーメッセージが入る配列です。なので、配列の長さが0より大きいということは、エラーが1回でも発生したという意味になります。``` throw new Error('エラーメッセージ') ```でテストフレームワークにエラーを伝えています。

# ソースコードとか
手前味噌で申し訳ありませんが、自作ゲームで実装してみた例です。

変更を加えた箇所は、こんな感じ。
https://github.com/kaidouji85/gbraver/commit/b06f9f248338d3c574157ce4c4662837dc118fe9

プロジェクト全体はここです。
https://github.com/kaidouji85/gbraver/tree/b06f9f248338d3c574157ce4c4662837dc118fe9
letとvarの違い

一言で言うと、変数のスコープがブロックスコープか関数スコープかの違いです。

`let`を使った場合、ブロックレベルで変数のスコープが定義されるため、以下の例のように`1,2,1`と表示されます。

```js
function f() {
  let x = 1;
  console.log(x);
  {
    let x = 2;
    console.log(x);
  }
  console.log(x);
}
f()
// 1
// 2
// 1
```

`var`は関数でのスコープのため、以下のように`1,2,2`と表示されます。

```js
function f() {
  var x = 1;
  console.log(x);
  {
    var x = 2;
    console.log(x);
  }
  console.log(x);
}
f()
// 1
// 2
// 2
```

ES6からはletが使えるため、今後は`var`ではなく好んで`let`が使われるようになるかと思います。


> 参考
> [パーフェクトJavaScript](http://gihyo.jp/book/2011/978-4-7741-4813-7) ｜Part2　JavaScript言語仕様 - 6章　関数とクロージャ - 6-4　スコープ - 6-4-3　letとブロックスコープ
BigQueryの分析

下記サイトの意訳です。
https://cloud.google.com/blog/big-data/2016/01/anatomy-of-a-bigquery-query

Google BigQueryは高速な分析データベースである。しかし本当に速い？そのスピードを達成するためには何が必要なのか？公開されているbigquery-samples:wikipedia_benchmarkのデータセット(特にWiki100Bテーブル)を使用して検証する。このテーブルは1000億行、7TBのサイズ。

以下のクエリを実行すると30秒以下で実行されていることを確認できる。詳細は公式ページを参照。

```
SELECT language, SUM(views) as views FROM [bigquery-samples:wikipedia_benchmark.Wiki100B] WHERE REGEXP_MATCH(title,G.*o.*o.*g) GROUP BY language ORDER BY views desc;
```

この処理でBigQueryは以下のことをしている。
- 1TBのデータを読み込み、それが解凍され4TB（圧縮するとだいたい1/4）になる
- 1000億の正規表現（３つのワイルドカードを使用した）を実行する 
- 1.25TBのデータをネットワークを跨いで分配する。 

分散した分析エンジンは、同じ量のリソースを扱い、クエリは完全に並列化される。
- 1TBのデータ読み込みに330個の専用ハードドライブ(100MB/sec)を使用
- 1.25TBのデータをシャッフルするのに、330ギガビットネットワークを使用
- 1TBのデータを解凍するのに3300コアを使用　1000億の正規表現を処理する　1マイクロ秒毎に

このジョブを実行するためにBigQueryは多くのリソースを数秒の間使用している。
BigQueryこの巨大にスケールする分析技術をユーザに意識させることなく使えるようにしている。
ソフトウェアのデプロイや仮想マシンの準備などする必要は何もない。
[Android] InstrumentationTest 一歩目

#はじめに
最近Androidのテストを書くことになりそうなのでテストに慣れるためにもサンプルを実行しながら学習をすすめることにしました。
その備忘録になります。
#InstrumentationTest(インストルメンテーションテスト)ってなに
「実機やエミュレータで実際に動かす」テストという意味ととると良さそうです。
[Android会の議論](https://groups.google.com/forum/#!topic/android-group-japan/039y59HOC4A)を読むと参考になりました。
Instrumentation単語を調べてみたところ「計装と測定」が一番それらしい意味。

#Googleのサンプルを動かしてみる
Google公式のサンプルがあるのでそれをまずは動かしてみます。
##サンプルの概要
アプリ部分とテスト部分に分かれてます。

- アプリの概要
 - スピナーで選択した値を保存して、Activityが再起動しても前回選択された位置設定するアプリ
- テストの概要
 - アプリを起動してスピナーに値を設定、再起動して先ほどの値がスピナーに保存されいるか確認を２回繰り返す、間違っていればエラー

##Sampleを開く
サンプルを早速起動してみます。
1. AndroidStudioからInport an Android code sampleを選択
<img width="250" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/34084/cd855cf4-205c-32c9-2fc2-5be324611627.png">
2. Activity Instrumentationを選択して開く
<img width="350" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/34084/c57194df-7597-08d0-6bf0-9ff306340271.png">
3. まずは普通にRunしてアプリが動くことを確かめる
実機をつなぐかエミュレータを立ち上げてRunしてください。
コード見て触ってみて動作を確認します。
<img width="350" alt="スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/34084/8434fee7-cf9a-2ab7-7927-413fb54f4781.png">
##AndroidStudioからテスト実行
1 ビルドの選択のEdit Configurationsを選択
<img width="292" alt="スクリーンショット 2016-03-26 18.25.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/34084/bc428d6b-a0f5-97d9-917f-8966e8c657bf.png">

2 左上の+を押しAndroidTestsを選択
<img width="681" alt="スクリーンショット 2016-03-26 18.25.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/34084/58c7833b-30fd-12da-3922-9b0d7f0153c8.png">

3 Nameを適当に変えて、ModuleをApplicationに選択→ok
<img width="789" alt="スクリーンショット 2016-03-26 18.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/34084/ddc0091f-190d-e5f5-26c1-54734bd1a520.png">

4 実行
![スクリーンショット 2016-03-27 16.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/34084/50783d74-b3ef-d77b-d036-a817a1596ff0.png)

5 確認
Run画面にSuccessがでたら成功
![スクリーンショット 2016-03-27 16.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/34084/ecf9341f-c151-cf31-5c8e-4a2c1030ae3c.png)

##コンソールからテスト実行
コンソールからもプロジェクトの直下で以下のコマンドを入力することでテスト実行できます。

```zsh
./gradlew connectedAndroidTest
```

#テストコードを見てみる
・ ```ActivityInstrumentationTestCase2```クラスを継承
・ ```Activity activity = getActivity();``` でMainActivityの起動作成
・ Activityからspinnerを取得しUIスレッドでフォーカスをあてて、選択状態を設定する。

```java 
activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                spinner1.requestFocus();
                spinner1.setSelection(TEST_SPINNER_POSITION_1);
            }
        });
```

・```activity.finish(); setActivity(null);```でActivityの終了

・```assertEquals()```で取得した値と想定した値が同じか判定 ※assertEqualsはJunitのメソッドです。

#テストを失敗するようにしてみる
SampleTestsクラスの94行目

```java
assertEquals(TEST_SPINNER_POSITION_1, currentPosition);
```
を

```
assertEquals(MainActivity.WEATHER_RAIN, currentPosition);
```
等に変えて実行し
```junit.framework.AssertionFailedError```がでることを確認

以上です。
JavaScriptでの変数のスコープと巻き上げ

```js
var x = 1;
function f() {
  console.log('x = ' + x);
  var x = 2;
  console.log('x = ' + x);
}
```
というコードで、関数`f`を実行すると

```js
x = undefined
x = 2
```

という結果が返されます。

![スクリーンショット 2016-03-27 16.16.28.png](https://qiita-image-store.s3.amazonaws.com/0/90682/8c1da34c-12a6-6c7b-a5bc-918f7c518c56.png)

一見、

```js
x = 1
x = 2
```

のようになると感じるかもしれませんが、これはJavsScriptの変数のスコープが原因で、ローカル変数`x`のスコープは関数`f`内のため`x = 1`となりません。

では、なぜ`undefined`なのか？というと、先ほどのコードは以下のコードと等しいと考えると納得出来るかと思います。

```js
var x = 1;
function f() {
  var x;
  console.log('x = ' + x);
  x = 2;
  console.log('x = ' + x);
}
```

これが俗に言う「変数の巻き上げ」です。この理由から、JavaScriptにおいて変数は関数の先頭でまとめて宣言するとよい、と言われたりします。

しかし、今後（ES6）は`var`ではなく`let`が使えるようになるため、これまでのベストプラクティスが通じなくなるかもしれません。

[letとvarの違い](http://qiita.com/y-temp4/items/289686fbdde896d22b5e)

> 参考
> [パーフェクトJavaScript](http://gihyo.jp/book/2011/978-4-7741-4813-7) ｜Part2　JavaScript言語仕様 - 6章　関数とクロージャ - 6-4　スコープ
テーブルに連番の値をINSERTする方法

再帰ありのWITH句で実現できます。
テスト用テーブルの作成などに便利です。

# コード

```sql:create_table.sql
create table A (
 id bigint,
 name text,
 primary key(id)
 );
```

```sql:insert_data.sql
/* 1～100の連番テーブル */
 WITH RECURSIVE serical_table(n) AS /* 変数n */
(
 SELECT 1 /* 初期値1 */
 UNION ALL
 SELECT n + 1 FROM serical_table
 WHERE n < 100 /* n+1なので条件に100を含まない */
)
INSERT INTO A(id, name)
  SELECT n, 'test'||n 
  FROM serical_table
 ;
```

# 感想
今まではExcelを使って、以下のようにデータを作っていました。
1. オートフィルで連番の列を作成
2. INSERT文を文字列結合で生成
でも、単純な連番データならこっちの方が便利です。

もう少し複雑な場合は、ストアドプロシージャでのループの方が便利かもしれませんね。


# 参考サイト
https://www.postgresql.jp/document/9.5/html/queries-with.html
http://kagamihoge.hatenablog.com/entry/20131111/1384160073
http://stackoverflow.com/questions/3764001/how-to-use-a-sql-for-loop-to-insert-rows-into-database
どでかいアコーディオンを含むページにアンカー付きで別ページか遷移した場合にピッタリあわせる

どでかいアコーディオンを含むページに
別ページからアンカー付きでブーンととんでくると
位置がずれる

アコーディオンはページロード後に非表示処理をするタイプ

# コード

```js
$(window).on('load.top', function(){
  /* ================================
    アンカーリンク付きでページヘ遷移
  ================================ */
  var hash = location.hash;
  if (hash) {
    $('.js-acd').removeClass("is-open");
    var $hash = $(hash).find('.js-acd').addClass("is-open");

    setTimeout(function(){
      // アコーディオン開閉後に再度スクロール
      var position = $hash.offset().top;
      $('body,html').animate({scrollTop:position}, 0, 'swing');
    }, 50);

  }

  /* ================================
    アコーディオン
  ================================ */
  $('.js-acd').each(function(){
    var $self = $(this);
    var $target = $($self.data('target'));

    if (!$self.hasClass('is-open')) {
      $target.hide();
    }

    $self.on('click.acd', function(){
      if ($self.hasClass('is-open')) {
        $target.slideUp();
        $self.removeClass('is-open');

      } else {
        $target.slideDown();
          $self.addClass('is-open');
      }
    });
  });
});
```

# 解説

1. ページ読み込み時にハッシュ付きURLだったら
2. 該当するアコーディオンを展開し
3. JSでページをスクロールして位置調整

`setTimeout` でスクロールのタイミングをずらしてるのが味噌  
いろいろな処理が発生後にスクロールするようにし、中途半端な位置に移動するのを防ぐため
[Swift] Arrayの中身をLLDBで確認する（map関数で）


タイトルでピンときた方は、たぶんそれ以上の事は書かれていませんので読まなくても大丈夫かと思います。

# 結論
```swift
po array.map { "\($0.name)" }
```
という感じで、`map`関数で各要素を文字列に変換すると楽です。

# 事前知識（と`struct`と`class`の挙動の違い）
以下のようなコードがあったとします。

```swift
struct Dog {
    let name: String
    let age: Int
    let type: String
}
let array: [Dog] = [
    Dog(name: "ポチ", age: 3, type: "柴犬"),
    Dog(name: "ジョン", age: 4, type: "ゴールデンレトリバー"),
    Dog(name: "エレナ", age: 2, type: "プードル"),
]
print(array) // ここでbreak!
```

上記を`po array`すると以下のように出力されます。
![Kobito.HDvbw3.png](https://qiita-image-store.s3.amazonaws.com/0/29653/f402b547-43a7-40df-6911-5232fef13dd1.png "Kobito.HDvbw3.png")

まぁ悪くはありません。

ちなみに`Dog`が`CustomDebugStringConvertible`に準拠していないにも関わらず、このように中身が（箇条書きで）出力されるのは`struct`で宣言している為です。

これが`class`で宣言した場合は、以下のとおりです。

```
(lldb) po array
▿ 3 elements
  ▿ [0] : <(Dog #1): 0x7fcd7240fa40>
  ▿ [1] : <(Dog #1): 0x7fcd7240fa90>
  ▿ [2] : <(Dog #1): 0x7fcd7240fae0>
```

`CustomDebugStringConvertible`に準拠すれば以下のように実装した文字列で出力されます。

```swift
class Dog : CustomDebugStringConvertible {
	...
    var debugDescription: String {
        return "\(name): \(age)"}
    }
}
```

```
(lldb) po array
▿ 3 elements
  ▿ [0] : ポチ: 3
  ▿ [1] : ジョン: 4
  ▿ [2] : エレナ: 2
```

ちなみに`struct`で準拠した場合は、前述の出力に **加えて** `debugDescription`の内容が出力されます。

```
(lldb) po array
▿ 3 elements
  ▿ [0] : ポチ: 3　★ここの出力が追加されてる★
    - name : "ポチ"
    - age : 3
    - type : "柴犬"
  ▿ [1] : ジョン: 4
    - name : "ジョン"
    - age : 4
    - type : "ゴールデンレトリバー"
  ▿ [2] : エレナ: 2
    - name : "エレナ"
    - age : 2
    - type : "プードル"
```

このように`class`と`struct`で少し挙動は違いますが、`CustomDebugStringConvertible`に準拠すれば、任意の文字列でArrayの中身を出力することが出来ます。

# いつ（map関数を）利用するか？

さて、（多くの記事で書かれていることですが）`CustomDebugStringConvertible`に準拠すれば（というよりも`debugDescription`を実装すれば）、独自の型でも自由な文字列で出力できることが分かりました。

そうするとタイトルと冒頭で書いたような、map関数を利用するモチベーションは無いように感じるかもしれません。

ただし、`debugDescription`によるデバッグの場合、以下の点が不便に感じます。

- 出力内容を変えたい場合にコードを変更して再ビルドが必要になる。
- `struct`の場合、箇条書きで出力されてしまうので要素数が多い場合にやたら長くなる。

そこでLLDBでpoする時にmap関数を利用して、その場で必要な文字列を組み立てるようにすれば、再ビルドは不要で、その場で必要な情報だけを出力できるようになります。

```swift:種類と名前だけを列挙する
(lldb) po array.map{ "[\($0.type)] \($0.name)" }
▿ 3 elements
  - [0] : "[柴犬] ポチ"
  - [1] : "[ゴールデンレトリバー] ジョン"
  - [2] : "[プードル] エレナ"
```

```swift:structでdebugDescriptionの内容だけを出力する
(lldb) po array.map{ String($0) }
▿ 3 elements
  - [0] : "ポチ: 3"
  - [1] : "ジョン: 4" { ... }
  - [2] : "エレナ: 2"
```

これはビルド時間がかかる巨大なプロジェクト、`struct`で多数のプロパティが定義されている場合などに特に有効かと思います。

# まとめ

`CustomDebugStringConvertible`に準拠、すなわち`debugDescription`を実装するテクニックは開発時のほとんど多くの場面で有効です。一度実装してしまえば、 **あなた以外もこの恩恵を受けることができる** というのは重要な点です。

一方で、 **デバッグ時に必要な情報は時と場合によって異なる** という事実もあります。あるケースでは有効なデバッグ出力について別のケースではノイズにもなりえますし、その逆も然りです。

そうした場合にmap関数を利用して、 **その場で必要なデバッグ情報を出力する** というアイディアが活用できることもあるのでは無いでしょうか？

# P.S.
以下の記事を読ませていただいて、（重複する部分があるとは思いつつも）自分なりのデバッグ手法も書いてみました。

初級者から中級者にレベルアップするためのXcodeデバッグ術
http://himaratsu.hatenablog.com/entry/xcodedebug
hadoop上で動作する分散グラフ分析器 sotera/distributed-graph-analytics を動かしてみる

# 概要
Hadoopなどの分散処理基盤でlouvain法を実行するためのソースコードをあさっていたところ、Sotera defence社のdistributed-graph-analyticsというのを見つけたので、調査する。
https://github.com/Sotera/distributed-graph-analytics

## 用語
distributed-graph-analytics(以下dga)：Sotera defence社の分散グラフ分析フレームワークで、GiraphやGraphXなどの分散グラフ分析フレームワークを使用してlouvain法やページランクなどのアルゴリズムを実行できる。

Giraph: Hadoop上でグラフ分析を行うためのフレームワーク
GraphX：Spark上でグラフ分析を行うためのフレームワーク
louvain法：高速なグラフクラスタリング手法。分散処理も可能。

# 環境
| OS/ライブラリなど |バージョン  | 
|:-----------|------------:|
| CentOS       |  7.0 |
| sotera/distributed-graph-analytics       |  0.0.1 |
| Java       |   1.8.0_45|
| Gradle     |   2.12 |
| CDH        |   5.0 |

# 導入手順
giraph-dga(hadoop使用)とgraphx-dga(spark使用)の2つがある。
自分が所属してる会社でsparkが利用できたか不明なので、
hadoop上で処理を行うgiraph-dgaを動かしてみることにする。

## CDH5のインストール
下記を参考にして疑似分散環境のhadoopをインストールした。
http://www.task-notes.com/entry/20150608/1433732400
Zookeeperが入らなかったのでyumでインストールして起動した。
（Zookeeperが無いとgiraph-dgaのジョブを走らせても0%で止まってしまう・・・）

## ビルドツールのインストール
gradleというビルドツールを使用しているようなので、インストールしてビルドする。
https://services.gradle.org/distributions/gradle-2.12-bin.zip

```bash
git clone https://github.com/Sotera/distributed-graph-analytics.git
cd distributed-graph-analytics
gradle clean dist
cp -r dga-giraph/build/dist /var/lib/hadoop-hdfs
```

## ジョブの実行
下記hdfsユーザで実行。example.csvをダウンロードする。

```bash
wget http://sotera.github.io/distributed-graph-analytics/data/example.csv 
cat example.csv
1,2
1,3
1,4
1,5
1,6
2,3
2,4
・・・
#入力ファイルの形式は
#srcノード番号 destノード番号
#・・・
```

hdfsにputして、ジョブを実行。

```bash
hadoop fs -put example.csv /user/hdfs/input
hadoop fs -chmod 777 /user/hdfs
# org.apache.hadoop.security.AccessControlException: Permission denied:になったのでやっつけで回避・・・
cd /var/lib/hadoop-hdfs/dist
bin/dga-yarn-giraph louvain "/user/hdfs/input/example.csv" "/user/hdfs/output"
```
完了すると/user/hdfs/outputに結果が出力される。

```bash
hadoop fs -cat /user/hdfs/output/giraph_0/part-m-00001
10      12      0       12:1,6:1
12      12      0       12:1
15      17      0       17:1,19:1
17      17      0       17:1
19      19      0       17:1,19:1
1       2       0       2:4,6:1
2       2       0       2:4
3       2       0       2:4,19:1
4       2       0       2:4
5       2       0       2:4
6       6       0       2:1,6:1
8       6       0       12:1,6:1
20      19      0       2:1,19:1

#出力フォーマット
#ノードのid	communityId	internalWeight	communityEdgeList
#参考→　https://github.com/Sotera/distributed-graph-analytics/blob/fa2a72e3bcee1c6e5db2551d2258b94d85e16a60/dga-giraph/src/main/java/com/soteradefense/dga/io/formats/LouvainVertexOutputFormat.java
```

# その他
なんかサンプルのコンフィグファイル（dist/conf/dga-config.xml）にzookeeperのホストを指定する部分があって、ジョブのコンフィグになんでzookeeperのホストのリストが必要なんだろう・・・<del>って思ったけど、なくても動くぽい・・・。</del>
ローカルで動かすときは不要なんだけど、分散環境で実行してみると、やっぱり設定されて無いと動かなかった。分散環境で動かすときにいくつかハマったポイントがあったので、あとでまとめる。
App Analytics Weekly Summary Emailとは

半月ほど前にApp Analytics Weekly Summary Emailという機能が追加されたのでそれについて書いてみます。

# 概要

<img width="828" alt="スクリーンショット 2016-03-11 12.25.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/7d27f689-43b6-1710-5b19-a7dabaa8ba27.png">

自分が出しているトップ20のアプリがどれくらいのパフォーマンスを出しているかのサマリーをお届けしてくれます。

# 設定方法

iTunesConnect内のUsers and Rolesページ内に設定フォームがあります。
Appアナリティクス週次メールサマリのプルダウンで「週次サマリを送信する」を選択して保存すれば設定完了です。
<img width="876" alt="スクリーンショット 2016-03-11 12.30.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/100736/9a22c6ac-00ea-f3e6-5696-1a208716d3f6.png">
opt-inの機能であると書かれていたので自分で「送信する」にしないと届かいないのかと思いましたが私の場合デフォルトで「送信する」になっていました(ちなみに私のRoleはReports, Sales, Technicalでした)。

# 送信されるタイミング

公式には`each Tuesday, PST`と書かれています。
日本の場合は「水曜日の朝メールチェックをしたら届いている」くらいの感覚です。

# 実物

![スクリーンショット 2016-03-27 15.10.10.png](https://qiita-image-store.s3.amazonaws.com/0/100736/a34340f4-6436-6be0-6275-c7002ece6351.png)
arduinoでマルチタスク

#概要
arduino megaでマルチタスクやってみた。
#写真
![task.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ed060525-065b-7986-170a-8c5f12573ec1.jpeg)

#サンプルコード
```
volatile int t = 0;
ISR(TIMER3_COMPA_vect)
{
	t |= _BV(1);
}
ISR(TIMER3_COMPB_vect)
{
	t |= _BV(2);
}
ISR(TIMER3_COMPC_vect)
{
	t |= _BV(3);
}
ISR(TIMER4_COMPA_vect)
{
	t |= _BV(4);
}
ISR(TIMER4_COMPB_vect)
{
	t |= _BV(5);
}
ISR(TIMER4_COMPC_vect)
{
	t |= _BV(6);
}
ISR(TIMER5_COMPA_vect)
{
	t |= _BV(7);
}
ISR(TIMER5_COMPB_vect)
{
	t |= _BV(8);
}
ISR(TIMER5_COMPC_vect)
{
	t |= _BV(9);
}
void setup()
{
	Serial.begin(115200);
	while (!Serial) delay(250);
	Serial.print("ok");
	Serial.println();
	TCCR3A = 0;
	TCCR3B = _BV(CS31);
	TCNT3 = 0;
	TIMSK3 = _BV(OCIE3A) | _BV(OCIE3B) | _BV(OCIE3C);
	TCCR4A = 0;
	TCCR4B = _BV(CS42);
	TCNT4 = 0;
	TIMSK4 = _BV(OCIE4A) | _BV(OCIE4B) | _BV(OCIE4C);
	TCCR5A = 0;
	TCCR5B = _BV(CS52) | _BV(CS50);
	TCNT5 = 0;
	TIMSK5 = _BV(OCIE5A) | _BV(OCIE5B) | _BV(OCIE5C);
}
void loop()
{
	if (t >> 0 & 0x1) Serial.print("task0 ");
	if (t >> 1 & 0x1) Serial.print("task1 ");
	if (t >> 2 & 0x1) Serial.print("task2 ");
	if (t >> 3 & 0x1) Serial.print("task3 ");
	if (t >> 4 & 0x1) Serial.print("task4 ");
	if (t >> 5 & 0x1) Serial.print("task5 ");
	if (t >> 6 & 0x1) Serial.print("task6 ");
	if (t >> 7 & 0x1) Serial.print("task7 ");
	if (t >> 8 & 0x1) Serial.print("task8 ");
	if (t >> 9 & 0x1) Serial.print("task9 ");
	t = 0;
	Serial.println(" ");
	delay(400);
}

```
Nodistインストール時に参考にしたサイト

##◇　Nodistインストール時に参考にしたサイト　◇

[nodistでNode.jsをバージョン管理](http://qiita.com/satoyan419/items/56e0b5f35912b9374305)

[node.js インストール備忘録（windows7）](http://qiita.com/yokoh9/items/20d6bdc6030a3a861189)

[nodistによるNode.Jsのバージョン管理 ](http://anojin.com/%E5%82%99%E5%BF%98/post-80)

[node.jsのバージョン管理(mac/win)](http://hatobane.github.io/uncategorized/node-version/)

[windows7でnode.js、npmを使いたいので、nodistをインストールする](http://motomichi-works.hatenablog.com/entry/2015/03/31/131309)


##◇　Nodist Github サイト　◇

[Nodist Github サイト](https://github.com/marcelklehr/nodist)

[Nodist Github ダウンロードページ](https://github.com/marcelklehr/nodist/releases/)
ログアウトしてもバックグラウンドでジョブを実行する

いまさらな感じだけど、ハマったので。

ssh接続→ジョブをバックグラウンドで実行し続けたいのに、ログアウトしたらkillされちゃったー。ということにならないための方法。

そういう時は、nohupを使いましょう。

その1　普通に実行
`$nohup ./hoge.sh &`
標準出力、標準エラー出力に送られたデータはプログラムを実行したディレクトリに nohup.out というファイル名で保存される。

その2 標準出力及び標準エラー出力を指定(実際にはこんな感じで使う）
`$nohup ./hoge.sh > out.log 2>error.log < /dev/null &
`
NAO（Pepper）でsqlite3を使う

NAOでデータを保存したいなーと思っていたら、意外とあっさり出来ました。

##環境
OS X El Capitan 10.11.3
Choregraphe 2.1.3.3
SQLite version 3.8.10.2

##Python Script
ボックスはデフォルトのままでOKです。

```python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        #put initialization code here
        pass

    def onUnload(self):
        #put clean-up code here
        pass

    def onInput_onStart(self):
        import sqlite3
        
        appId = self.packageUid()
        qi.path.setWritablePath("/Users/{ユーザ名}/Desktop/dev/nao/data_files") #任意の場所を指定

        dbpath = qi.path.userWritableDataPath(appId, "sample.db")
        self.logger.info(dbpath)

        conn = sqlite3.connect(dbpath)
        c = conn.cursor()
        c.execute('''CREATE TABLE shop (id INTEGER PRIMARY KEY, name TEXT , price INTEGER)''')
        c.execute("INSERT INTO shop (name, price) VALUES ('hogehoge',100)")
        conn.commit()
        conn.close()
                    
        self.onStopped()
        
    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped

```

##確認

```
$ pwd
/Users/{ユーザ名}/Desktop/dev/nao/data_files/data/.lastUploadedChoregrapheBehavior

$ sqlite3 sample.db
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite> .table
shop
sqlite> select * from shop;
1|hogehoge|100
```
登録できました。


※sqliteでエラーになるときは、`.lastUploadedChoregrapheBehavior`を`chmod 777`にするといけました。

##その他
CSVパッケージ、JSONパッケージ、ElementTreeパッケージも使えるみたいです。
bundle config --local

# bundle config問題

例えば今だと、Mac EI Capitan(10.11.4), XCode 7.3 でlibv8がインストール出来ないからwith-system-v8を使いましょう、みたいな話題があって、こんな感じでやればインストールできるよ、というようなノウハウが回っている。

```
brew tap homebrew/versions
brew uninstall v8
brew install v8-315
bundle config build.libv8 --with-system-v8
bundle config build.therubyracer --with-v8-dir=$(brew --prefix v8-315)
bundle update
```
http://qiita.com/mogya/items/82bc0f9e8a95742d1225

これはこれでいい(仕方ない)んだけど、たぶん数ヶ月すると、libv8のバージョンが上がって、今度はwith-system-v8はしないほうがいいというノウハウが出まわることが予想される。

OS X El Capitanでlibv8 / therubyracerのbundle installに失敗する問題の解決方法
http://qiita.com/ganta/items/53f616b48e94d989952f

でもってその時今やっているプロジェクトがリリースの佳境でライブラリのバージョンをおいそれと変えられないのに、内職しているプロジェクトの方で別途bundle installしようとすると、どっちかは動くんだけどどっちかは動かなくなる問題が予想される。そういう問題を起こさないためのbundlerじゃなかったの！

# bundle config --localのご提案

bundle configで設定した値は、~/.bundle/config に保存される。場所から想像がつくとおり、この設定はユーザーについて回るから、プロジェクトAでもBでも同じ設定が適用される。libv8のバージョンなんてプロジェクト依存するものをグローバルに扱おうとしているのがおかしい。

bundlerの設定はプロジェクト単位でも保存できるんだから、libv8の設定なんかは、プロジェクト単位に保存した方がいいはず。そういう設定はきっとあるはず...


> Executing bundle config --local <name> <value> will set that configuration to the local application. The configuration will be stored in app/.bundle/config.
> 
> [man bundle-config](http://bundler.io/v1.3/man/bundle-config.1.html)

ということで、bunder config でlibv8の設定をあれこれいじるときは、bundle config --localを使ったほうが良さそうです。
IE10での範囲選択の検証(Table要素関係)

# 背景
仕事でIE10対象のWEBシステムを作っています。
「ボタンを押したらTable要素が範囲選択されて、Excelにコピペできるよ～」という機能があるのですが、ちょっとハマったので、まとめてみました。

# 問題
Table要素を範囲選択すると、「SCRIPT606: エラー 800a025e のため操作を完了できませんでした。」というエラーが発生します。

# コード

```js:test.js
/**
 * 対象の要素を範囲選択する。(IE10用)
 */
function selectRange(elm) {
  if (typeof elm === "string") {elm = document.getElementById(elm);}
  var range = document.selection.createRange();
  range.moveToElementText(elm);
//「SCRIPT606: エラー 800a025e のため操作を完了できませんでした。」というエラーの発生箇所
  range.select();  
}
```

```html:test.html
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<script src="test.js"></script>
</head>
<body>
<div id="sampleDiv">
 Inner DIV
<table id="sampleTable">
  <thead id="sampleTHead">
    <tr id="sampleHeadRow">
      <th id="sampleHeadCell">ID</th>
      <th>Name</th>
    </tr>
  </thead>
  <tbody id="sampleTBody">
    <tr id="sampleBodyRow">
      <td id="sampleBodyCell">1</td>
      <td>Taro</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Jiro</td>
    </tr>
  </tbody>
</table>
</div>
<span id="sampleText">Sample Text</span>
</body>
</html>
```

# 結果
選択対象によって成功するときと失敗するときがあります。
それをまとめました。

| 選択対象 | 実行した処理 | 成功/失敗 |
|:-----------|:------------|:------------|
| Table要素を囲むDiv要素 |`selectRange("sampleDiv");` | 成功 |
| Table要素 |`selectRange("sampleTable");` | 失敗 |
| TBody要素 |`selectRange("sampleTBody");` | 失敗 |
| THead要素 |`selectRange("sampleTHead");` | 失敗 |
| THead内のtr要素 |`selectRange("sampleHeadRow");` | 失敗 |
| THead内のth要素 |`selectRange("sampleHeadCell");` | 成功 |
| TBody内のtr要素 |`selectRange("sampleBodyRow");` | 失敗 |
| TBody内のtd要素 |`selectRange("sampleBodyCell");` | 成功 |

失敗するときは、`  range.select();  `の処理で、「SCRIPT606: エラー 800a025e のため操作を完了できませんでした。」というエラーが発生します。

# 考察
Table要素を囲むDIV要素を選択対象にしたら、解決できました。

td/th要素なら選択できましたが、tr/tbody/thead/table要素は選択できませんでした。
規則性はよく分かりません。

そもそもFirefoxやIE11なら、このような問題は発生しないので、調査はここまでにします。
早く対象ブラウザをIE11にして～

# 参考サイト
https://teratail.com/questions/30270
http://stackoverflow.com/questions/22914075/javascript-error-800a025e-using-range-selector
CentOSでPDOのPostgreSQLを使用する（Vagrant）

PDOでPostgreSQLを使用しようとしたところ，以下のようなエラーが出ました．

```
PHP Fatal error:  Uncaught exception 'PDOException' with message 'could not find driver' in /var/www/html/test/postgis_test.php:8
Stack trace:
#0 /var/www/html/test/postgis_test.php(8): PDO->__construct('pgsql:host=133....', 'postgres', 'TYoshino45!!')
#1 {main}
  thrown in /var/www/html/test/postgis_test.php on line 8
```

バージョン一覧
- Vagrant: 1.8.1
- CentOS: CentOS release 6.7 (Final)
- PHP: PHP 5.6.12 (cli) (built: Feb 17 2016 03:38:02)

自分はVagrant上で動かしているので，その上でのコマンドになります．
管理者で実行している前提です．

```
$ vagrant ssh
# sudo su
```

PECL上の最新版は1.0.2なので，これをインストールします．
[PECL :: Package :: PDO_PGSQL](https://pecl.php.net/package/PDO_PGSQL)
/usr/local/src/の中にインストールします．

```
# cd /usr/local/src/
# wget http://pecl.php.net/get/PDO_PGSQL-1.0.2.tgz
# tar -xf PDO_PGSQL-1.0.2.tgz
# cd PDO_PGSQL-1.0.2
```

makeします．

```
# phpize
# ./configure --with-pdo-pgsql
# make
# make install
```

php.iniを変更します．
php.iniの場所は以下のコマンドで確認できます．

```
# php -i | grep php.ini
```

modulesの下にpdo_pgsql.soというファイルが追加されているはずなので，これをphp.iniに追加します．

```
# vi php.ini
```

```php.ini
; PostgreSQL
extension_dir = /usr/local/src/PDO_PGSQL-1.0.2/modules/
extension = pdo_pgsql.so
```

apacheを再起動

```
# /etc/init.d/httpd restart
```

参考
[phpenv で入れた PHP に pdo_pgsql をインストール LANCARD.LAB｜ランカードコムのスタッフブログ](http://www.lancard.com/blog/2014/08/23/phpenv-%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F-php-%E3%81%AB-pdo_pgsql-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
[ソースコンパイルしたPHPに後からpdo_pgsqlをインストールする - 知識の引き出し](http://catnapper-mar.hatenablog.com/entry/2015/09/10/013742)
Firefox でローカルファイルに直接保存しながらCSSコーディングする方法

[chromeデベロッパー・ツールでローカルファイルに直接保存しながらCSSコーディングする方法](http://buchineko.website/chrome-devtools-cording/) を読んで、「それ Firefox でもできるよ」と思ったので。

## スタイルエディタ

Firefox の開発ツールには「[スタイルエディタ](https://developer.mozilla.org/ja/docs/Tools/Style_Editor)」という機能があります。CSS をここで編集すると、変更がダイレクトに反映されます。

[![スタイルエディタの解説ビデオ](http://img.youtube.com/vi/7839qc55r7o/0.jpg)](http://www.youtube.com/watch?v=7839qc55r7o)

## スタイルファイルの編集

Chrome はいろいろ設定しなくてはいけないようですが、Firefox ではスタイルエディタに表示されているファイルのリストから、編集するファイルを選ぶだけで編集できるようになります。

前述した通り、編集内容はすぐに表示結果へ反映されるので、効果を目で確認しながら編集ができます。

保存は、ファイル名前の横に「保存」と書かれたリンクがあるので、それをクリックします。

## スタイルファイルの新規作成

また既存のスタイルだけでなく、新規にファイルを作成することもできます。手順は以下の通りです：

1. ツールバーに「新規作成」ボタンがあるので、それを押します。
2. スタイルを書きます
3. 「保存」をクリックして、保存先を選び、保存されます

## 調整するなら Firefox

Chrome の開発ツールも素晴らしいですが、結果を確認しながらページを調整するなら Firefox の方が便利だと感じています。選択肢の一つに加われば幸いです。