OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryでoffsetを指定するただ一つだけの方法

##はじめに##

BigQueryでOffsetを指定する方法を紹介します。

公式のリファレンスにはOffsetに関する記載がありません。
https://cloud.google.com/bigquery/query-reference

##解決方法##

```lang:bigquery
SELECT
  repository.url
FROM
  [publicdata:samples.github_nested]
WHERE
  repository.url is NOT NULL
GROUP BY
  repository.url
ORDER BY
  repository.url
LIMIT 100
```

例えば上記のように100件ずつ取得したい場合

これだけで終了です。

```lang:bigquery
SELECT
  repository.url
FROM
  [publicdata:samples.github_nested]
WHERE
  repository.url is NOT NULL
GROUP BY
  repository.url
ORDER BY
  repository.url
LIMIT 100
OFFSET 100
```

そうです`offset`を普通に指定できるのです…

なんで公式のリファレンスには書いてないんでしょうね…

##検証##

以下は検証結果です。

```lang:bigquery
SELECT
  repository.url
FROM
  [publicdata:samples.github_nested]
WHERE
  repository.url is NOT NULL
GROUP BY
  repository.url
ORDER BY
  repository.url
limit 100
offset 0
```
の結果の100番目は
`https://github.com/0x76/opensn0w`

```lang:bigquery
SELECT
  repository.url
FROM
  [publicdata:samples.github_nested]
WHERE
  repository.url is NOT NULL
GROUP BY
  repository.url
ORDER BY
  repository.url
limit 100
offset 99
```
の1番目の結果が
`https://github.com/0x76/opensn0w`

ということでこの指定方法で問題なさそうです。


##追記##

6/16 追記

OFFSETが100万件を超え辺りで

> Query Failed
> Error: Response too large to return. Consider setting allowLargeResults to true in your job configuration. For more details, see https://cloud.google.com/bigquery/querying-data#largequeryresults

というエラーが出る場合があります。

そんな時は、必要がなくても
`GROUP EACH BY` を利用し取得したいカラムを`GROUP BY`することでエラーを回避できます。

関連書籍
[BigQueryではじめるSQLデータ分析](https://amzn.to/3MjQcP4)
[SQL入門 Google BigQueryではじめるビジネスデータ分析](https://amzn.to/3T9PqYO)
await Task.Delay() は Thread.Sleep() よりレスポンスが悪い

注意：ただし場合による。（追記を参照）

以下本文

------------------------

とは言っても普通の用途で await Task.Delay() を使用していて困ることはないと思います。

結論から言いますと、**15ms以下の短い時間を待機したい場合は、 Thread.Sleep() を使用したほうが良い**と思います。（ただし、無闇にこの2つを組み合わせ無い方がいいかも？）

私の環境では await Task.Delay(1) から処理が返ってくるのに 15ms くらい掛かったのに対し、 Thread.Sleep(1) ではほぼ 1ms で処理が返ってきました。await は、タスク作成のオーバーヘッドが少ない、後続のプログラムを元と同じスレッドで実行するのが容易などのメリットがありますが、その代わりに応答性が悪くなってしまうようです。もしかしたら環境によっても異なるかもしれません。
もっとも、C#を使うべきでない、というのもあるかもしれませんが。


以下のコードは、スレッドを1ms待機させるプログラムを、これらの2つの方法で書いたものです。**await Task.Delay() の方が若干時間が掛かっている**ことがわかります。


環境は Windows 7 SP1, CPU は Core 2 Quad Q9650, .Net Framework 4.5 です。

```csharp:C#
int delayms = 1;  // ミリ秒

Task.Run(async () =>
{
    int n;
    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
    s.Start();

    for (n = 0; s.ElapsedMilliseconds < 3000; n++ )
    {
        Thread.Sleep(delayms);
    }

    s.Stop();

    Console.WriteLine("Thread.Sleep(" + delayms + ") の場合");
    Console.WriteLine("  count: " + n + ", interval: " + s.ElapsedMilliseconds / (double)n + "ms");

    s.Restart();

    for (n = 0; s.ElapsedMilliseconds < 3000; n++)
    {
        await Task.Delay(delayms);
    }

    s.Stop();

    Console.WriteLine("await Task.Delay(" + delayms + ") の場合");
    Console.WriteLine("  count: " + n + ", interval: " + s.ElapsedMilliseconds / (double)n + "ms");
}).Wait();
```

```text:Windows7&nbsp;(.NET)&nbsp;での実行結果(1)
Thread.Sleep(1) の場合
  count: 2999, interval: 1.00033344448149ms
await Task.Delay(1) の場合
  count: 193, interval: 15.6010362694301ms
```

```text:Windows7&nbsp;(.NET)&nbsp;での実行結果(2)
Thread.Sleep(50) の場合
  count: 60, interval: 50.0166666666667ms
await Task.Delay(50) の場合
  count: 49, interval: 62.1632653061224ms
```

##追記
完全に環境によるようです・・・。

```text:rextester.com&nbsp;(.NET&nbsp;4.0)&nbsp;での実行結果(1)
Thread.Sleep(1) の場合
  count: 193, interval: 15.6010362694301ms
await Task.Delay(1) の場合
  count: 193, interval: 15.5958549222798ms
```

```text:rextester.com&nbsp;(.NET&nbsp;4.0)&nbsp;での実行結果(2)
Thread.Sleep(15) の場合
  count: 191, interval: 15.7853403141361ms
await Task.Delay(15) の場合
  count: 161, interval: 18.6894409937888ms
```

こちらでは逆転してawaitの方が高速でした・・・。

```text:ideone.com&nbsp;(Mono)&nbsp;での実行結果(1)
Success	time: 3.06 memory: 30512 signal:0
Thread.Sleep(1) の場合
  count: 1498, interval: 2.00333778371162ms
await Task.Delay(1) の場合
  count: 2920, interval: 1.02739726027397ms
```

```text:ideone.com&nbsp;(Mono)&nbsp;での実行結果(2)
Success	time: 0.11 memory: 30512 signal:0
Thread.Sleep(15) の場合
  count: 188, interval: 16.0212765957447ms
await Task.Delay(15) の場合
  count: 199, interval: 15.1306532663317ms
```
icheckとjQuery-Validation-Engineを組み合わせて使う方法

手間取ったので、メモを残します。

#方法

`icheck`の`ifChanged`発火時に`validationEngine('validate')`を実行します。


````sample.js
$(function(){
  $('input.with-icheck').on('ifChanged', function(event){
    $(this).validationEngine('validate')
  }).iCheck({
    checkboxClass: 'icheckbox_flat-yellow',
    radioClass: 'iradio_flat-yellow'
  })
}
````


これで期待通り動作しました。
問題があれば指摘して頂けると嬉しいです。

#参考
https://github.com/fronteed/iCheck/issues/68
http://qiita.com/seihowlow24/items/06d399cba07e6b74cfaf
http://shoheik.hatenablog.com/entry/2013/08/18/112037
https://github.com/posabsolute/jQuery-Validation-Engine
http://studio-key.com/1139.html
goproxy で basic auth

goproxy に basic auth が付属してて、それを使うだけ

```go
package main

import (
	"flag"
	"github.com/elazarl/goproxy"
	"github.com/elazarl/goproxy/ext/auth"
	"log"
	"net/http"
)

var portNumber = flag.String("port", "9090", "port number.")
var basicAuthUser = flag.String("user", "", "basic auth user name")
var basicAuthPass = flag.String("pass", "", "basic auth user pass")

func main() {
	flag.Parse()
	proxy := goproxy.NewProxyHttpServer()
	proxy.Verbose = true
	if *basicAuthUser != "" && *basicAuthPass != "" {
		log.Println("auth basic")
		auth.ProxyBasic(proxy, "RELM", func(user, pass string) bool {
			log.Println("auth basic do")
			return user == *basicAuthUser && pass == *basicAuthPass
		})
	}

	log.Println("listen:" + *portNumber)
	log.Fatal(http.ListenAndServe(":"+*portNumber, proxy))
}
```

✧＼\ g( 'ω' )o /／✧
JavaScriptのシングルクォーテーションとダブルクォーテーション


    シングルクォーテーションとダブルクォーテーションの使い方の違いって何ですか？

JavaScriptのプログラミングを教えている方から質問を受けました。確かにネットで調べたり本で読んだりしてもいろんな人がいろんな書き方をしていて困りますよね。

JavaScriptではシングルクォーテーションもダブルクオーテーションも機能としては同じです。どちらも文字列を表現するのに使います。
PHPではダブルクオーテーションを使う場合のみ`$myValue`のような変数名を値に置き換える処理が行われますが、JavaScriptではそのようなことは起こりません。

極端な話、どっちでもいいのです。

ただ実際にはプログラミングの都合上ある程度の使い分けが行われます。

## 文字列として`'`,`"`が必要な場合

```js:ダブルクオーテーションを使う場合
var myVar = "I'm fine.";
console.log(myVar);
```

```js:シングルクォーテーションを使う場合
var myVar = 'I\'m fine.';
console.log(myVar);
```

このように、`'`で囲っている文字列中で`'`という文字が必要な場合は、`\'`と記述する必要があります。
逆に`"`で囲っている文字列中で`"`という文字が必要な場合は、`\"`と記述する必要があります。

```js:シングルクォーテーションを使う場合
var myJson = '{"name": "Taro", "age": 18}';
var myObj = JSON.parse(myJson);
```

```js:ダブルクオーテーションを使う場合
var myJson = "{\"name\": \"Taro\", \"age\": 18}";
var myObj = JSON.parse(myJson);
```

文章中に現れるのが`'`と`"`のどちらか片方しかないのであれば、**現れない方で囲う**と読みやすくなります。

## HTML要素の`onclick`などに書く場合

スクリプトはHTML要素の属性値として記述されます。HTMLの属性値は`"`で囲うことが一般的です。
その場合、スクリプトの中の`"`は`&quot;`に置き換えるエスケープ処理が必要になりますので、シングルクォーテーションの方が見やすくなります。

```html:シングルクォーテーションを使う場合
<button onclick="alert('hello world')">Click me!</button>
```

```html:ダブルクオーテーションを使う場合
<button onclick="alert(&quot;hello world&quot;)">Click me!</button>
```

もっとも、こう書いても良いっちゃ良いのですが。

```html
<button onclick='alert("hello world")'>Click me!</button>
```

ここらへんは個人の趣味とかプロジェクトのルールによりどっちを使うか決めるので、どちらが良い悪いということはありません。どちらでも良いです。

## 入力のしやすさ

英字キーボードだと`'`の方が打ちやすい(シフトキーを使わずに入力できるので)ので、シングルクォーテーションが好まれるかもしれません。
日本語キーボードだとどちらもシフトキー使わないといけないですが、`"`の方が距離が近くて片手でも打ちやすいです。誤差の範囲かもしれませんが…

## 見た目

`'`の方がすっきりした印象のコードになるので、私は好きです。

※個人の感想です。

逆に、`"`の方が文字列っていう感じがするって思って好む人もいるかもしれません。特にJavaやってた人。私も昔はそうだったんですけどね。

※Javaでは`"`で文字列を表します。`'`は文字型というよりプリミティブな別のデータ型に使います。

## プロジェクトのルールで定まっている場合

最終的には全て。そのプロジェクト全体として文字列は`'`で書くと決まっていれば`'`を使いますし、`"`で書くと決まっていれば`"`を使います。
身近な例としてはjQueryは`"`を文字列に使っていますがthree.jsは`'`を使っています。AngularJSも`'`でした。

最近のはやりとしては`'`の方が主流かな…？
※個人の感想です。


結局のところ、**どっちでもいいんだけどTPOに応じて使い分けようね**っていう話です。
systemdのunitファイルのExecStartにスペースが含まれるとき、うまく認識されないことがある

systemdのunitファイルを書いてたのですが、どうにもうまく動かない。

``` /etc/systemd/system/consul-template.service
[Unit]
Description=consul-template
After=consul.service haproxy.service

[Service]
ExecStart=/usr/local/bin/consul-template -consul=127.0.0.1:8500 -template=/etc/haproxy/haproxy.cfg.ctmpl:/etc/haproxy/haproxy.cfg:"/bin/systemctl reload haproxy.service"
KillMode=process
Type=simple
Restart=always

[Install]
WantedBy=multi-user.target
```

ログを見るとどうも後半のhaproxyのreloadのあたりでコマンドがぶった切られている模様。

```
Jun 15 18:09:51 hogehoge systemd[1]: Starting consul-template...
Jun 15 18:09:51 hogehoge systemd[1]: Started consul-template.
Jun 15 18:09:51 hogehoge consul-template[19818]: Consul Template returned errors:
Jun 15 18:09:51 hogehoge consul-template[19818]: cli: extra argument(s): ["reload" "haproxy.service\""]
Jun 15 18:09:51 hogehoge systemd[1]: consul-template.service: main process exited, code=exited, status=14/n/a
Jun 15 18:09:51 hogehoge systemd[1]: Unit consul-template.service entered failed state.
```

スペースの前にバックスラッシュ入れたらうまく動きました。

``` /etc/systemd/system/consul-template.service
[Unit]
Description=consul-template
After=consul.service haproxy.service

[Service]
ExecStart=/usr/local/bin/consul-template -consul=127.0.0.1:8500 -template=/etc/haproxy/haproxy.cfg.ctmpl:/etc/haproxy/haproxy.cfg:"/bin/systemctl\ reload\ haproxy.service"
KillMode=process
Type=simple
Restart=always

[Install]
WantedBy=multi-user.target
```
Vimでrequireをimportに置換する

最近、gulpがbabelに対応しgulpfile.babel.jsにすればES6で書けるようになり、置換することが多くなったので。

```js
var gulp = require('gulp');
```

を

```js
import gulp from 'gulp';
```

に置換する。

```
%s/var\s\+\(\S\+\)\s\+=\s\+require(\(.\+\))/import \1 from \2/gc
```
jQueryプラグインを書くための参考サイト（資料）

jQuery

はじめてのjQueryのプラグインの作り方～5ステップ
http://yyengine.jp/blog/jquery/jquery-plugin-5step/

maepon / query_plugin_authoring_ja.md　プラグイン/作成
https://gist.github.com/maepon/4754210

Advanced Plugin Concepts
https://learn.jquery.com/plugins/advanced-plugin-concepts/
ActionMailerでHelperを呼び出すとエラーになる


```
ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
```

# 原因
ActionMailer内で、Helperを呼び出してたから

```rb
class HogeMailer < ApplicationMailer
	def hoge(foo)
	  @link = hoge_url(foo.id)
	end
end
```

# 解決
default_url_optionsのhostを指定する

```
config.action_mailer.default_url_options = { host: 'localhost:3000' }
```

hostが、`xxx_url`で指定したときに、割り当てられるホスト名になる
http://[host]/

例： 
http://localhost:3000/

# 参考
[Rails/Deviseからメールを送信しようとした際のURL指定に関するエラーの解決](http://kaorumori.hatenadiary.com/entry/20120720/1343659979)
リリースまで持っていくインターン・プログラミングスクール

[株式会社ギブリー](https://givery.co.jp/services/jphacks/)でハッカソンを研究しています五十嵐です。

ハッカソンは、殆どの成果物がリリースまで行きません。このことは、参加者側にとっても運営側側にとっても勿体ないことだと思います。もちろん多くのアイデア・プロトを作ってどんどん捨てていく方針もあると思いますが、リリースしないと聞けない顧客の声を聞いたリーン開発をしないというですので、もしかしたらダイヤの原石を捨てている可能性もあります。また、もしまだリリースを体験したこと無いハッカソン参加者が居たら、リリースを体験してほしいという気持ちも個人的にはあります。

その一方、インターンやプログラミングスクールでは以下の動きが出て来ました。このような取り組みがうまく成功することを期待しております。

[NTTドコモ：Innovation Studio 2015 Summer](http://lab.designit-tokyo.com/innovation-studio/)（2015年6月30日、申込締切）

（以下引用）
NTTドコモの技術者とチームを組んでいただき、約3ヶ月間の中で、ユーザーの洞察を得るフィールドワーク、アイデア創出、アプリケーションプロトタイプの制作などを行います。本プログラムの終わりには、正式なサービスのローンチを目指し、NTTドコモのマネジメント層に対するプレゼンテーションを行います。

[リクルート：PAAK BOOTCAMP](http://co-media.jp/programming-bootcamp/)

（以下引用）
PAAK BOOTCAMPは、ただプログラミングを学ぶだけではなく、メンターがつき、分からない事があればすぐに質問できる点が特徴だ。価格はタダ。さらには製品リリースまでやり遂げられるのも魅力だ。通常のプログラミングスクールでは、技術を学んで終わるケースも多いが、PAAK BOOTCAMPでは製品をリリースするところまで面倒を見てもらえる。

（思いついたことをメモしていくのでどんどん内容更新予定です、悪しからず）
プログレスバー

##プログレスバー

```html
<div class="progress">
    <div class="progress-bar progress-bar-success" style="width: 60%;">
        success
    </div>
</div>
<div class="progress">
    <div class="progress-bar progress-bar-info" style="width: 80%;">
        info
    </div>
</div>
<div class="progress">
    <div class="progress-bar progress-bar-warning" style="width: 30%;">
        warning
    </div>
</div>
<div class="progress">
    <div class="progress-bar progress-bar-danger" style="width: 70%;">
        danger
    </div>
</div>
```

`.progress-srtiped`クラスを追加すると、バーがストライプ模様になる。
ストライプ模様をアニメーションさせるには`active`を指定する。

```html
<div class="progress progress-striped">
    <div class="progress-bar" style="width: 60%;">
    </div>
</div>
<div class="progress progress-striped active">
    <div class="progress-bar" style="width: 60%;">
    </div>
</div>
```

バーを積み重ねるには下記のように指定でする。
`/progress^bar`クラスを設定したdivタグを続けて記述することで、バーが積み重なる。

```html
<div class="progress">
    <div class="progress-bar" style="width: 20%;">
    </div>
    <div class="progress-bar progress-bar-success" style="width: 20%;">
    </div>
    <div class="progress-bar progress-bar-info" style="width: 20%;">
    </div>
    <div class="progress-bar progress-bar-warning" style="width: 20%;">
    </div>
    <div class="progress-bar progress-bar-danger" style="width: 20%;">
    </div>
</div>
```
Yahooショッピングの注文詳細APIのリターンがほぼ空欄で返ってきます。。

担当者様

お世話になります。

Yahooショッピングの注文詳細APIを利用しているのですが、結果が想定通りに返ってきません。


注文のステータスなどは返ってきますが、商品情報、顧客情報が空欄で返ってくる状態です。

一部の情報は返ってくるのでリクエストそのものには問題がないかと考えています。

注文が特定のステータスの場合など、何か取得できない条件などがあるのでしょうか？

ご回答いただけますと幸いです。

よろしくお願いいたします。
モーダル・ドロップダウン・タブ

##ドロップダウン
`.dropdown`クラスを設定したタグで、ドロップダウンの表示を切り替えるリンク（またはボタン）およびメニューで括る。
表示を切り替えるリンク・ボタンには`data-toggle="dropdown"`を設定する。
メニューは`.dropdown-menu`を設定したulタグで作成する。
各メニュー項目はaタグで括る。
`.divider`クラスを設定したliタグを挟むことで区切り線を設けることができる。
`.dropdown-header`クラスを設定したliで、メニューにヘッダーラベルを追加できる。
liタグに`.disabled`クラスを設定された項目は選択できなくなる。

```
<div class="dropdown">
    <a data-toggle="dropdown" href="#">Dropdown Link</a>
    <ul class="dropdown-menu">
        <li class="dropdown-header">メニューヘッダ</li>
        <li ><a href="#">リスト１</a></li>
        <li ><a href="#">リスト２</a></li>
        <li class="divider"></li>
        <li ><a href="#">リスト３</a></li>
        <li class="disabled"><a href="#">無効のリスト項目</a></li>
    </ul>
</div>
```

##タブ
`.nav-jasutified`クラスを追加すると、各タブの幅が親要素いっぱいに均等割になるように拡張される。

```
<ul class="nav nav-tabs">
    <li><a href="#">hoge</a></li>
    <li class="active"><a href="#">fuga</a></li>
    <li><a href="#">piyo</a></li>
</ul>
<ul class="nav nav-tabs nav-justified">
    <li><a href="#">hoge</a></li>
    <li><a href="#">fuga</a></li>
    <li><a href="#">piyo</a></li>
</ul>
```

```
<ul class="nav nav-tabs">
<li class="active"><a href="#tab1" data-toggle="tab">タブ1</a></li>
<li><a href="#tab2" data-toggle="tab">タブ2</a></li>
</ul>
<!-- / タブ-->
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade in active" id="tab1">
    <p>コンテンツ1</p>
</div>
<div class="tab-pane fade" id="tab2">
    <p>コンテンツ2</p>
</div>
</div>
```

##モーダル

```
<button class="btn btn-primary" data-toggle="modal" data-target="#myModal">
    モーダル画面表示
</button>
<div id="myModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">モーダルタイトル</h4>
            </div>
            <div class="modal-body">
                モーダルボディ部分
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
                <button type="button" class="btn btn-primary">確認</button>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">$(document).ready(function(){
    //モーダル表示
    $('#myModal').modal('show');
    //Modalが閉じられたらイベント発動
    $('#myModal').on('hidden.bs.modal', function (e) {
        //アラート表示
        alert("モーダル閉じました");
    });
});
</script>
```
Node.jsドライバーでMongoDBを照会してみる

mongooseなしで照会する方法のメモです。

###MongoDBドライバーの準備
MongoDB Node.jsドライバーをインストール

```
npm install mongodb
```

###ソースコード

```js:query.js
var MongoClient = require('mongodb').MongoClient,
    assert = require('assert');

var config = require('./config.json');

MongoClient.connect(config.url, function(err, db) {
    assert.equal(err, null);
    console.log("Connected correctly to server");

    var collection = db.collection(config.collection);
    collection.find(config.query, config.options)
        .toArray(function(err, docs) {
            assert.equal(err, null);

            console.dir(docs);

            db.close();
        });
});
```

###設定ファイル

```js:config.json
{
    "dbtype": "mongodb",
    "url": "mongodb://localhost:27017/word_counter",
    "collection": "C5577d6e39e3a79041fe959d4",
    "query": {
        "$or": [
            { "pos": "名詞" },
            { "pos": "形容詞" }
        ],
        "$and": [
            { "basicForm": { "$ne": "、" } },
            { "basicForm": { "$ne": "・" } },
            { "basicForm": { "$ne": "*" } }
        ]
    },
    "options": {
        "limit": 50,
        "sort": {
            "freq": -1
        }
    }
}
```

###実行結果

```
[ { _id: { _bsontype: 'ObjectID', id: 'U~[ó%W½\u00025<\u0004\u0014' },
    wordId: 565510,
    basicForm: '皆さん',
    pos: '名詞',
    posDetail1: '一般',
    freq: 22 },
  { _id: { _bsontype: 'ObjectID', id: 'U~[ó%W½\u00025<\u00078' },
    wordId: 2521080,
    basicForm: '改革',
    pos: '名詞',
    posDetail1: 'サ変接続',
    freq: 21 },
  { _id: { _bsontype: 'ObjectID', id: 'U~[ó%W½\u00025<\u0004X' },
    wordId: 1492850,
    basicForm: '日本',
    pos: '名詞',
    posDetail1: '固有名詞',
    freq: 19 },
    
    ...

]
```
GAEでcronが動かない！？ときにチェックすること=Version

GAEではcronが実際に実行されるのは、デフォルトのバージョンのみのようです。
そのため、コンソール上でcronジョブが成功していても、実際にプログラムが走っている形跡がない場合、デフォルトでないバージョンでの挙動を想定していないか確認してください。
php-mecabがpearから入らなかったから、ソースからコンパイルした話


調べても同じエラーの人が出てこなかったので、
この記事が参考になれば。

centos6.6で、phpは5.5を使っています。

```
cat /etc/redhat-release
CentOS release 6.6 (Final)
```

```
php -v
PHP 5.5.25 (cli) (built: May 14 2015 10:02:12) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.2, Copyright (c) 2002-2015, by Derick Rethans
    with Suhosin v0.9.37.1, Copyright (c) 2007-2014, by SektionEins GmbH
```


###mecabはインストール済みとします。

##まずはpearでやってみたわけです。

```bash
$ pear channel-discover pecl.opendogs.org

$ pear remote-list -c opendogs
Channel opendogs Available packages:
====================================
Package      Version
gdextra      -n/a-
mecab        -n/a-
qr           -n/a-
tokyocabinet -n/a-
unichar      -n/a-

$ pear install opendogs/mecab-beta
downloading mecab-0.5.0.tgz ...
Starting to download mecab-0.5.0.tgz (51,723 bytes)
.............done: 51,723 bytes
could not extract the package.xml file from "/tmp/pear/download/mecab-0.5.0.tgz"
Download of "opendogs/mecab" succeeded, but it is not a valid package archive
Error: cannot download "opendogs/mecab"
Download failed
install failed
```

というわけで、エラーが発生しました。

##諦めてソースコードからいれます。

```bash:
$ wget https://github.com/rsky/php-mecab/archive/master.zip
$ unzip master.zip 
$ cd php-mecab-master/mecab/
$ ./configure --with-mecab=/usr/local/bin/mecab-config
	#これはmecabのインストール環境によって変えてください。
$ make
$ make install
$ ls /usr/lib64/php/modules/mecab.so
/usr/lib64/php/modules/mecab.so
```

入りました。
続いて、PHPのエクステンションを加えます。

```bash:
$ vi /etc/php.d/mecab.ini
```

```text:
; Enable mecab extension module
extension=mecab.so
```

それで、apacheを再起動

```bash:
$ /etc/init.d/httpd restart
```

phpinfoを作ってみましょう

```php:
<?php

  phpinfo();

```


いました！
![スクリーンショット 2015-06-15 16.42.29.png](https://qiita-image-store.s3.amazonaws.com/0/75412/6506a5b9-2bce-a2aa-01e0-4579c52b2f8e.png "スクリーンショット 2015-06-15 16.42.29.png")


###そしてお約束。。。

```
<?php

    $meCab = new MeCab_Tagger();
    echo nl2br($meCab->parse("すもももももももものうち"));
```

```html:
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

ご苦労様でした。
UINavigationControllerで遷移した先の、左上ボタンテキストを戻る等に変更したい

遷移元のviewでBarbuttonItemを設定して渡す。actionはpopViewControllerAnimatedを入れておくと、標準の戻るメソッドを利用できる。

```swift:
let backButtonItem = UIBarButtonItem(title: "戻る", style: .Plain, target: nil, action: "popViewControllerAnimated:")
navigationItem.backBarButtonItem = backButtonItem
```

遷移先でもLeftBarButtonItemで設定できるが、戻るの左に矢印が入らない。
clip-history つくった

[clip-history](https://atom.io/packages/clip-history)

過去のクリップボードの内容を貼り付けられる。
類似パッケージは結構あるが、リスト選択等がなく、ワンキーで貼り付けるシンプル操作と、貼り付け範囲のハイライトが売り。

![gif](https://raw.githubusercontent.com/t9md/t9md/2453c4abea50741938bce79b9087e4845e8b66d1/img/atom-clip-history.gif)

# 機能

* 過去のクリップボードの内容を貼り付ける。
* 貼り付けた範囲がハイライトされる。※ 複数行、複数カーソルだとどこが変わったか分からないので。
* マルチカーソルでも機能する

# 使い方

1. `clip-history:paste` で貼付け
2. 続けて `clip-history:paste` を実行すると過去のものが貼り付く。
3. (オプション) `clip-history:paste-last` で一番最後に貼り付けたものを貼り付けられる。

# コマンド

* `clip-history:paste`: 貼り付け。移動しないで、そのまま続けて実行すると過去のものが順に貼り付く。
* `clip-history:paste-last`: 最後に貼り付けたものを貼り付け。
* `clip-history:clear`: ヒストリのクリア

# キーマップ
デフォルト keymap は無し

e.g.

```coffeescript
'atom-text-editor:not([mini])':
  'ctrl-y': 'clip-history:paste'
  'ctrl-Y': 'clip-history:paste-last'
```

# 設定
* `clip-history.max`: 記憶する履歴の数。少なくして巡回しやすくするのがオススメ。デフォルトは10
* `clip-history.flashOnPaste`: 貼付け時にハイライトするか？デフォルト有効
* `clip-history.flashDurationMilliSeconds`: ハイライト時間(ms)


# 類似パッケージ

どれも実装は参考にさせてもらいました。ありがとうございます。

* [kill-ring](https://atom.io/packages/kill-ring)
* [clipboard-plus](https://atom.io/packages/clipboard-plus)
* [clipboard-history](https://atom.io/packages/clipboard-history)

# TODO

* [x] Make configurable flash duration.
* [x] Multi cursor support
* [x] Use marker instead of range to track original range in multi cursor situation.
git rm で fatal: not removing 'app/views/hoges' recursively without -r と言われる解決方法。

ディレクトリを git rm しようしたらエラーがでました。ディレクトリをrmできないみたいです。

# git rm でエラー
ディレクトリを`rm`で失敗しました。

```
git rm app/views/hoges

fatal: not removing 'app/views/hoges' recursively without -r
```

`-r`オプションなしに消すなみたいな指摘なので`-r`を付けます。

```
git rm -r app/views/hoges
```
今度は削除出来ました(☝ ՞ਊ ՞)
`<pre>`で表示幅改行する css

`<pre>`タグの中で、表示幅で改行させるcss

`<head><style></style></head>` の中に書きます。

```css:pre-wrap.css
pre {
    /* Mozilla */
    white-space: -moz-pre-wrap;
    /* Opera 4-6 */
    white-space: -pre-wrap;
    /* Opera 7 */
    white-space: -o-pre-wrap;
    /* CSS3 */
    white-space: pre-wrap;
    /* IE 5.5+ */
    word-wrap: break-word;
}
```
Skinny Controller, Fat Modelの簡単な例

某所で初心者向けRailsコースを受け持っているので、生徒さん向けのメモを書き置きします。

- 簡単なブログアプリ
	- モデルは`Post`と`Author`のみ
- `app/views/posts/index.erb`に、最新記事を５件表示させることが課題

## Skinny Controller, Fat Modelとは（ざっくり）
- 薄いコントローラー、厚いモデル
- データ加工処理はモデルに担当させる
- コントローラーをシンプルにする
	- 処理の流れがわかりやすくなる

## Viewのみで最新記事表示を実装した場合
- 一番原始的なパターンです。

### 実装方法
```ruby:app/controllers/posts_controller.rb
def index
  @posts = Post.all
end
```

```ruby:app/views/posts/index.erb
<% @posts.reverse.each_with_index do |post, index| %>
  <%# ６個目以上の記事の場合はBreak %>
  <% if index >= 5
       break
     end
  %>
  <%= link_to post.title, post_path(post) %>
<% end %>
```

### 問題点
- indexのViewが汚れる
- 仕様変更によって最新記事が他のビュー（ex.`posts/show.html.erb`）でも必要になったら、また書く必要がある

## Controllerが加工処理を受け持った場合
### 実装方法
```ruby:app/controllers/posts_controller.rb
def index
  # クエリメソッドで降順並び替え＆５件までの呼び出しとしている
  @posts = Post.order(created_at: :desc).limit(5)
end
```

```ruby:app/views/posts/index.erb
<% @posts.each do |post| %>
  <%= link_to post.title, post_path(post) %>
<% end %>
```

### 問題点
- 他のアクションやコントローラで最新5件の`@posts`が必要となった場合、コードが重複する（見通しが悪くなる）
- 最新記事が５件→１０件に仕様変更となったら、すべて書き換えとなってしまう
- コントローラーで「データ加工」はしちゃいけない

## Modelが加工処理を受け持った場合
- こっちがSkinny Controller, Fat Modelのパターン

### 実装方法
```ruby:app/models/post.rb
class Post < ActiveRecord::Base
  scope :latest, -> (limit = 5) { order(created_at: :desc).limit(limit) }
end
```

```ruby:app/controllers/posts_controller.rb
def index
  # Modelのscopeを利用する
  @posts = Post.latest
end
```

```ruby:app/views/posts/index.erb
<% @posts.each do |post| %>
  <%= link_to post.title, post_path(post) %>
<% end %>
```

## まとめ

- モデル
	- 共通処理（scope）をもたせる
- コントローラー
	- モデルの共通処理を操作する
- ビュー
	- モデルが作ったデータを参照し、ビジュアライズする
CloudWatch メトリクスのデータをローカルに落とすサンプル

CloudWatchを使っていて、データが2週間分しか保存されない仕様を不便に感じたので、データを2週間以上保存する方法はないか調べてみました。

結論としては、APIを使ってローカルにデータを落とし、そのデータを自分で加工する方法しかないようです。
プログラムを組んでcronで定期実行できれば、手軽にデータ保存はできそうです。

メトリクスデータ取得用コマンド：http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/get-metric-statistics.html


少し話が逸れますが、調べているうちにAWSからカスタムメトリクスを送信するスクリプトが提供されていることが分かったので、これを使えばメトリクスの数が増やせます。
Windows用：http://aws.amazon.com/code/7932034889155460
Linux用：http://aws.amazon.com/code/8720044071969977


#参考ページ
コマンドラインからの実行サンプル。スクリプトにするなら、CLI利用の環境変数をセットする処理が必要。
http://d.hatena.ne.jp/NowTom/20131122/1385050337

バッチのメトリクス取得サンプル。レポート生成するサンプルも用意されています。
http://a-auto50.blogspot.jp/2015/06/aws.html

Javaのメトリクス取得サンプル。APIは他にRubyやnode.jsが用意されているので、やろうと思えば言語はある程度選べます。
http://dev.classmethod.jp/server-side/java/aws-sdk_cloudwatch_get_ec2_disk_usage/
safariのカスタムcssを使ってGmailの本文を横に広げる

## before

![スクリーンショット 2015-06-15 15.22.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/71ee3e3a-b9f6-604c-0063-ff358c9af72a.png)


## after

![スクリーンショット 2015-06-15 15.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2d256b6b-bd11-4e84-ee4e-ad73f9530edb.png)

## css

```css:~/Documents/safari.css
/* gmail */
td.y3 {
  display: none;
}
```

ついでに文字をRictyにする場合

```css:~/Documents/safari.css
* {
  font-family: "Ricty for Powerline","FontAwesome","octicons","Glyphicons Halflings";
}
```

* FontAwesome : Qiita
* octicons : GitHub
* Glyphicons Halflings : munin (munstrap)
OpenStack ManilaでGlusterFS Nativeドライバを使う


manila自体のインストールは: http://qiita.com/makisyu/items/62fbd6923f91bdb7fb12
manilaの基本的な使い方に関する説明は無い。ググった方が正確。

# GlusterFSのセットアップ
インストール自体は本家のドキュメント通り。http://gluster.readthedocs.org/en/latest/
3.7のゴミ箱機能に未対応なので、3.6か3.5を使うとよい。人類には早すぎた。

GlusterFS NativeドライバはACLを効かせるためにSSLが必須なので、SSL通信用の鍵を作る。`/etc/ssl`に`glusterfs`という名前で作っておくと、自動で読み込まれる。ゴーストの囁きによるとこのディレクトリとファイルはソースコードで決め打ちらしい……。

```bash
cd /etc/ssl
openssl genrsa -out glusterfs.key 1024
openssl req -new -x509 -key glusterfs.key -subj /CN=<ホスト名> -out glusterfs.pem
cp glusterfs.pem glusterfs.ca
```

Shareの作成時に`auth.ssl-allow`の存在チェックをするので、使用予定のボリュームの`auth.ssl-allow`に何かしらの文字列を入れておく。これはイケてない。直したい。ACLの意味が無い。違う違う、そうじゃ、そうじゃない。

```bash
gluster volume set vol1 auth.ssl-allow noone
```

# manila.conf
`enabled_share_backends`にセクション名のリストを書くことで、複数のバックエンドを定義できる。空白無しのカンマ区切り。

```ini
[DEFAULT]
debug = True
verbose = True
enabled_share_protocols = NFS,CIFS,GLUSTERFS,HDFS
default_share_type = default
enabled_share_backends = GlusterFSNative
rootwrap_config = /etc/manila/rootwrap.conf

[database]
connection = mysql://<mysql user>:<mysql password>@<mysql host>/manila

[keystone_authtoken]
auth_uri = http://<keystone host>:5000/v2.0
identity_uri = http://<keystone host>:35357
admin_tenant_name = service
admin_user = <keystone admin user>
admin_password = <keystone admin user password>

[oslo_concurrency]
lock_path = /var/lib/manila/lock

[oslo_messaging_rabbit]
rabbit_host = <hostname>
rabbit_userid = <rabbitmq user>
rabbit_password = <rabbitmq password>

[GlusterFSNative]
driver_handles_share_servers = False
share_backend_name = GlusterFSNative
share_driver = manila.share.drivers.glusterfs_native.GlusterfsNativeShareDriver
glusterfs_servers = <username>@<glusterfs server hostname>
glusterfs_volume_pattern = <regexp (vol.*とか)>
glusterfs_native_server_password = <password>
```

# `share_type`の設定
`share_type`の`extra_specs`に使いたい`share_backend_name`の名前を設定する。これで`manila.conf`で追加したドライバの設定が使われるようになる。

```bash
manila type-create default False
manila type-key default set share_backend_name=GlusterFSNative
```

# manila create
glusterfsプロトコルを指定する。

```bash
manila create glusterfs 1
```

# ACL
`access-list`の追加をすると、ボリュームの`auth.ssl-allow`にホスト名が追加されて、クライアントから`mount`できるようになる。

```bash
manila access-allow <share id> cert <client_host>
```

# mount
と、その前にマウントするクライアント側でもSSLの設定が必要。サーバー側のCAをコピーしてくる。

```bash
cd /etc/ssl
openssl genrsa -out glusterfs.key 1024
openssl req -new -x509 -key glusterfs.key -subj /CN=<ホスト名> -out glusterfs.pem
cp glusterfs.key glusterfs.ca
scp <glusterfs_server>:/etc/ssl/glusterfs.ca /etc/ssl/glusterfs_server.ca
cat /etc/ssl/glusterfs_server.ca >> /etc/ssl/glusterfs.ca
```

認証にはCNのホスト名が使われる。つまりCNと`auth.ssl-allow`のホスト名が一致していなければならない。
【Node.js】スプレッドシートからJSONファイルを生成するコマンドラインツール

#<i class="fa fa-book" style="font-size:1em;"></i> はじめに

「[google-spreadsheet-to-json](http://~)」というものを使います。
このシンプルなコマンドラインツールは、Googleのスプレッドシートに書き込まれた内容をJSONファイルとしてエクスポートします。
スプレッドシートにちょいっと書き込んで、コマンド一発で出力できるので便利です。

#<i class="fa fa-book" style="font-size:1em;"></i> スプレッドシートを用意して公開する

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/67591/2aff45ca-532d-e1f8-e4b6-4643d118d8b6.png)

###spreadsheet 作成

1行目は タイトル行(JSON のキーに該当)
2行目以降は データ行

###ウェブに公開

ファイル > ウェブに公開

公開されたURLから **spreadsheet ID** を抽出して控えておく


#<i class="fa fa-book" style="font-size:1em;"></i> google-spreadsheet-to-json をインストール


```
npm install --save-dev google-spreadsheet-to-json

```


#<i class="fa fa-book" style="font-size:1em;"></i> 実行

あとは以下のコマンドを叩くだけ

```
gsjson **spreadsheet ID** data.json

```
「data.json」というファイルが生成されます。


```json:data.json

[
  {
    "id": 1,
    "page": "トップページ",
    "url": "/index.html",
    "title": "ゴルゴ13｜トップページ",
    "discription": "超一流のスナイパー（狙撃手）「ゴルゴ13」ことデューク東郷の活躍を描く",
    "template": "A"
  },
  {
    "id": 2,
    "page": "ゴルゴ13の実績",
    "url": "/case/index.html",
    "title": "ゴルゴ13の実績",
    "discription": "超一流のスナイパー（狙撃手）「ゴルゴ13」のこれまでの凄い仕事を紹介する",
    "template": "A"
  },
  {
    "id": 3,
    "page": "　└新三大ゴルゴ13の物凄い仕事 ①",
    "url": "/case/case01.html",
    "title": "新三大ゴルゴ13の物凄い仕事 ①",
    "discription": "新三大ゴルゴ13の物凄い仕事 ①",
    "template": "B"
  },
  {
    "id": 4,
    "page": "　└新三大ゴルゴ13の物凄い仕事 ②",
    "url": "/case/case02.html",
    "title": "新三大ゴルゴ13の物凄い仕事 ②",
    "discription": "新三大ゴルゴ13の物凄い仕事 ②",
    "template": "B"
  },
  {
    "id": 5,
    "page": "　└新三大ゴルゴ13の物凄い仕事 ③",
    "url": "/case/case03.html",
    "title": "新三大ゴルゴ13の物凄い仕事 ③",
    "discription": "新三大ゴルゴ13の物凄い仕事 ③",
    "template": "B"
  },
  {
    "id": 6,
    "page": "ゴルゴ13への依頼方法",
    "url": "/request/index.html",
    "title": "ゴルゴ13への依頼方法",
    "discription": "ゴルゴ13への依頼方法を紹介する。",
    "template": "A"
  },
  {
    "id": 7,
    "page": "CIAとゴルゴ13",
    "url": "/cia/index.html",
    "title": "CIAとゴルゴ13",
    "discription": "CIAとゴルゴ13の関係を紹介する。",
    "template": "A"
  }
]


```
技術英語 > the modifier > put [the modifier] at the end of the name

引用:Code Complete > Computed-Value Qualifiers in Variable Names

> put the modifier at the end of the name

the modifierとしてはTotal, Sum, Averageなど

revenueTotalとtotalRevenue
revenueSumとsumRevenue
などmodifierを後ろと前どちらにつけるのがいいか？

Code Completeでは後ろにつけることでsymmetricになるようなことが書かれていた。
> a set of names like revenueTotal, expenseTotal, revenueAverage, and expenseAverage has a pleasing symmetry.
memo:[iOS]プッシュ通知の証明書の変換(p12=>pem)

２つ一緒にはき出す場合とまとめてはき出す場合で変換時のコマンドが違うので注意。
まとめてはき出す方で覚えておくと、操作する手間が減るのでお勧め。

一緒にはき出すとき

```bash
openssl pkcs12 -nodes -clcerts -out ABCDEF.pem -in ABCDEF.p12 
```
2次元配列の2次元目の配列の値でソートをする


```php

$array = array(
	array(
		'id' => 10,
		'name' => 'hoge',
	),
	array(
		'id' => 3,
		'name' => 'fuga',
	),
	array(
		'id' => 20,
		'name' => 'foo',
	),
	array(
		'id' => 1,
		'name' => 'bar',
	),
);
```

というような2次元配列があり、2次元目のキー'id'の値でソートをしたいときがちょくちょくある。

そこで、以下の様な関数を作ってみた。

```php
function sortArrayByKey( &$array, $sortKey, $sortType = SORT_ASC ) {
	
	$tmpArray = array();
	foreach ( $array as $key => $row ) {
		$tmpArray[$key] = $row[$sortKey];
	}
	array_multisort( $tmpArray, $sortType, $array );
	unset( $tmpArray );
}
```

で、以下のように使うと、とてもいい感じになった。

```php
$array = array(
	array(
		'id' => 10,
		'name' => 'hoge',
	),
	array(
		'id' => 3,
		'name' => 'fuga',
	),
	array(
		'id' => 20,
		'name' => 'foo',
	),
	array(
		'id' => 1,
		'name' => 'bar',
	),
);

// そのまま出力
print_r( $array );

// ソート実行
sortArrayByKey( $array, 'id' );

// もう一度出力
print_r( $array );
```

```結果
Array
(
    [0] => Array
        (
            [id] => 10
            [name] => hoge
        )

    [1] => Array
        (
            [id] => 3
            [name] => fuga
        )

    [2] => Array
        (
            [id] => 20
            [name] => foo
        )

    [3] => Array
        (
            [id] => 1
            [name] => bar
        )

)
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => bar
        )

    [1] => Array
        (
            [id] => 3
            [name] => fuga
        )

    [2] => Array
        (
            [id] => 10
            [name] => hoge
        )

    [3] => Array
        (
            [id] => 20
            [name] => foo
        )

)
```
ElasticSearch indexパフォーマンス設定


SSD等高速なストレージを要している場合は以下のパラメータを変更すると良いかも

```shell
curl -XPUT 'localhost:9200/_cluster/settings' -d '

{
    "persistent" : {
        "indices.store.throttle.max_bytes_per_sec" : "100mb"
    }
}
'
```

SSDの場合は100-200mbくらい


ちなみに一時的に変更したい場合はpersistentでなくtransientの方がいいかもしれない、この辺の設定の違いは以下参照
https://www.elastic.co/guide/en/elasticsearch/reference/0.90/cluster-update-settings.html


clusterの再構築など一時的にindexingパフォーマンスを上げたい場合は以下を設定し、indexing終了後 none => mergeに変更すると良いかも

```shell
curl -XPUT 'localhost:9200/_cluster/settings' -d '

{
    "transient" : {
        "indices.store.throttle.type" : "none" 
    }
}
'
```

その他

elasticsearch.yml

```yaml
index.refresh_interval: 30
```

diskへの書き込みインターバルを大きくする



## リカバリー関連

elasticsearch.yml

```yaml
cluster.routing.allocation.node_concurrent_recoveries: 3

# Set to throttle throughput when recovering (eg. 100mb, by default 20mb):
indices.recovery.max_bytes_per_sec: 50mb

# Set to limit the number of open concurrent streams when
# recovering a shard from a peer:
indices.recovery.concurrent_streams: 5
```

参考

https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-performance.html
管理者権限の無いPCでSynthesijerを使う方法


会社のPCでSynthesijer使いたいのに、管理者権限が無いので新しいjre入れられないよーって人のための情報。

#必要なファイル
日本語版のEclipse配布ページにjre付きの配布パッケージがあります。
http://mergedoc.osdn.jp/

例えば32bit版のjre付きEclipseはこちら
http://www.vector.co.jp/download/file/winnt/prog/fh649181.html

これをダウンロードして、狙ったフォルダーにデータを展開すれば管理者権限無しでjreが使えます。

入ってなければCygwinもインストール。こちらも管理者権限不要です。

ここを見ながら作業すれば、BlinkLED.vhdが出来ました。
http://www.sigemb.jp/ESS/2014/files/IPSJ-ESS2014003-1.pdf

# 謎
```shell
$ /cygdrive/c/pleiades/java/8/bin/java -cp ../../lib/synthesijer-20150517.jar Synthesijer.Main BlinkLED.java
```
でやってみたが、BlinkLED.vhdはできるのに、BlinkLED.vはできない。謎。
Google Analytics Academy Note


Google Analytics Platform Principles

https://analyticsacademy.withgoogle.com/course02/course

動画が英語だったので、その時とったメモです。


##Unit1

###1.1

アナリティクスのプラットフォームは以下のの４つからなる。

* 収集 collection
* 構成 configration
* 処理 processing 
* レポート reporting


Google Analytics Core Reporting API　を使用すれば独自のレポートルールの作成やサードパティツールへの抽出も可能

Collectionされたデータを元に、Processincを行うがConfigrationの設定でフィルタリングなどを行なうことが出来ます。

一度設定したら後で変更は出来ないので注意が必要。

###1.2

デジタル分析ツールが採用するデータモデルの多くは、以下の３つからなる

* ユーザー Users　サイトやアプリの利用者
* セッション Sessions　ユーザーが過ごす時間
* 接点 Interactions　ユーザーの行動

関係性としては Users > Sessions > Interactions 

ユーザーとセッションには関係がある、セッションをまたいで同じユーザーを判別できる。

セッションの内の各Interactionをヒットと呼びます。ヒットには様々な種類がある.

* ページュビュー Pageviews
* イベント Events
* 取引 Transactions

##Unit2

###2.1

アナリティクスのデータ収集、送信はトラッキングコードによって行われる。
データはパッケージ化され画像リクエストとして送信される。これをヒットという

サイトとアプリではヒット生成に使用するコードが異なる。

トラッキングコードは新規、リピートユーザを区別する

データを関連付けるにはユニークなトラッキングIDとアカウントを紐付けなければならない。

###2.2

ウェブサイト、モバイルアプリ、その他デジタル環境などトラッキング対象によってアナリティクスの測定技術は異なる。

コードは</HEAD>タグの前に追加すること。読み込み完了前にユーザーが離脱しても取れる。全サイトにセットすること。

アナリティクスのJAVASCRIPTは非同期的に(ブラウザが他の処理をしている間にも)実行される。

コード実行時にはユーザーごとにIDがふられる。IDはデフォルトファーストパティCOOKIEが適用される（何故サードパティではないのか参考：http://nexal.jp/blogs/2061.html）

URLブラウザ、言語仕様デバイス、OSCARなどがページビューヒットとして送られる。

が、カスタマイズすることで更に多くの情報を収集することが可能

###2.3

モバイルアプリのデータも収集できるがウェブとは技術的な仕組みが違う。
ウェブではJapascriptのコードだったのに対し、アプリはSDKを使用する。OS毎に用意されていて、ユーザ動向,起動頻度などの情報を送る。

モバイル端末ではネットワークが接続される。が、データの送信や電池の持ちを考慮し、決められた間隔ごとにディスパッチを行なう。
その間隔は Android30分、ios2分だがカスタマイズもできる。

インストール時の匿名ユーザーIDを振る

##2.4

POSやキオスクのデータ等を取り込むときは、Measurement Protocol　なら全てのウェブ接続デバイスに対応できる。

ヒットを自動的に作成しないで手動で作成する必要があります。パラメータにヒットの作成と送信の方法を設定する。
パラメータにはトラッキングIDが必要。パラメータはドキュメントを参考にして下さい。

コードに変更を加えて更に収集することも可能。

##3.1

Processing 
1 収集データをユーザとセッションごとに分ける。標準ルールの設定があり、あとで変えられる　
2 Google AdWords/AdSense ウェブマスターツール Google以外のシステムからインポートしたデータ
3 Configrationに応じたデータの変更（追加や除外、フォーマット変更）
4 集計（aggregation）データベーステーブルに纏め、分析が必要になった時にレポートにまとめる。

##3.2

ゆーざ、セッション、接点は
IDはクッキーが削除されたりアプリが削除後に再インストールされた場合再度振られる為、新規ユーザの扱いになる。

ランダムな数字の代わりにユニークなルールも決められる

タイムアウト期間は３０分だが変えられる。３０分を超える動画や余り動かないコンテンツ
ユーザとセッションがどの様に切りだされるかを確認することで、レポートに活用できる

Configration 

##3.3
他のソースからもデータを取れる。トラッキングコード以外の入手経路は。
データはAdWords、AdsenseなどGoogleの各種サービスをアナリティクスとリンクさせて取り込める。
AdwordS

データのインポート広告、顧客商品などのデータ

やり方は２つディメンションの拡張と費用データのインポート
ディメンションの拡張はアップロードとAPI

広告キャンペーンの比較に便利

メインはトラッキングコードだけど、リンクとインポートも効果的です。

##3.4

変換と集計　Tranceration and Agrigating data

- include data
- exclude data
- modify data

Filter データの除外、追加、変更　exIP除外、URLの置換など

Goals コンバージョン、コンバージョン率、ページビュー、

Group Channnel Group と Contents Group がある。Channnel Groupは表示なのか、ソーシャルなのか、Emailなのか、有料広告なのか等のグループがある

データ処理の最終に入る前に適用される。

##4.1

集計結果をレポートやAPIを使って解析します。
APIを使うと直接データをやりとりしレポーティングできえ、社内のダッシュボードに使うことができます。
レポート画面やAPIでデータを呼び出すといい
複雑データや大量のデータをリクエストするとサンプリングが行われることがあります。
サンプリングとはトラフィック関連のデータの１部を抜き出し、その集合で検出された傾向をレポートする処理のことです。

##4.2

Dimensions & Metrics(指標) について
Analyticsのデータの表示はこの２軸を組み合わせからなる

Dimensions　= データの性質(参照元やページ名)

Metrics(指標) = デートを定量化したもの（ユーザ数やセッションあたりの閲覧ページ数等の平均値も扱う）

この組み合わせにも決まりがあり、対応範囲はユーザー、セッション、ヒット（行動)のいずれかの階層なので、レポートで組み合わせるのも同じ階層同士でなければ意味が無い。
ハンバーガーアイコンの色を変える話


ActionBarDrawerToggleがデフォルトで作ってくれるハンバーガーアイコンは黒いのですが、デザイナーさんから色を指定されてしまって、なんとかして色を変えなきゃならなくなりました。

そこで、Google先生に相談したところ、StackOverflowで、[これ](http://stackoverflow.com/questions/26434504/how-to-implement-drawerarrowtoggle-from-android-appcompat-v7-21-library)とか[これ](http://stackoverflow.com/questions/26754940/appcompatv7-v21-navigation-drawer-not-showing-hamburger-icon)とかを見つけました。

それによると、ハンバーガーアイコンのスタイルを決めているのは、

```xml
<style name="Base.Widget.AppCompat.DrawerArrowToggle" parent="">
    <item name="color">?android:attr/textColorSecondary</item>
    <item name="thickness">2dp</item>
    <item name="barSize">18dp</item>
    <item name="gapBetweenBars">3dp</item>
    <item name="topBottomBarArrowSize">11.31dp</item>
    <item name="middleBarArrowSize">16dp</item>
    <item name="drawableSize">24dp</item>
    <item name="spinBars">true</item>
</style>
```

こんな感じらしいので、

```xml
<style  name="Theme.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="drawerArrowStyle">@style/AppDrawerArrowToggle</item>
</style>

<style name="AppDrawerArrowToggle" parent="Base.Widget.AppCompat.DrawerArrowToggle">
    <item name="color">（アイコンの色）</item>
</style>

```

といった感じで、変えることができます。わかっちゃえば、簡単ですね。

当然、AndroidManifest.xmlで、applicationのandroid:themeかactivityのandroid:themに、Theme（上の例だと、@style/Theme.AppTheme）を指定する必要があります。
PHP:PEARのchannel-discoverが通らない時の対処のメモ


#背景
最近propelをインストールしようとした際に、

```bash
$ pear channel-discover pear.propelorm.org
```

このコマンドがpear.propelorm.orgサーバーの無応答でどうにもならなかったことがあった。(この記事を書いている時点でも無応答)

多分、ver2がリリースされているのでver1世代のPEARはメンテされていないんだろう。

ソースコード自体はgithubにあるので、他のインストール方法で解決することもできるのだが、上記コマンドおよびその後に続くインストールコマンドはChefで実行しているので、なるべく同じ手順で対応したい。

ということで、偽pear.propelorm.orgを立ち上げた時の作業メモ。
他のPEARチャンネルでも、似たような手順で対応可能だと思う。
　# ローカル用なので雑な手順なのはご愛嬌・・・


#目標
 
* (サーバーが死亡した)PEARチャンネルをローカルネットワークに作る
* インストールするホストでは、「pear」コマンドを変更せずに利用可能にする


#手順
##PEARパッケージを作る準備
httpdなどのWebサーバーが立ち上がっているホスト（PEARインストール対象のホストでも良い）を用意する。

そのホストで、Pirumをインストールする。

```bash
$ pear channel-discover pear.pirum-project.org
$ pear install pirum/Pirum
```

##自前のPEARチャンネルを作る
以下の手順はpropelを対象にした例。

まずはソースコードのダウンロードと解凍。

```bash
$ cd /tmp
$ wget https://github.com/propelorm/Propel/archive/1.7.1.zip
$ mv 1.7.1 Propel-1.7.1.zip
$ unzip Propel-1.7.1.zip
```

解答したパッケージのトップにpirum.xmlを作成する。

```bash
$ cd Propel-1.7.1/
$ vim pirum.xml
```

ここでのポイントは[オフィシャルのPEARインストール手順](http://propelorm.org/Propel/download.html)に合わせて **name** と **alias** を書いておくこと。
オフィシャルではこんな感じなので、

>$ pear channel-discover pear.propelorm.org
>$ sudo pear install -a propel/propel_generator
>$ sudo pear install -a propel/propel_runtime

channel-discoverのコマンドに合わせて **name** を、
installのコマンドの「 **foo**/bar 」の **foo** に合わせて **alias** を書く。

こんな感じ。

```pirum.xml
<?xml version="1.0" encoding="UTF-8" ?>
<server>
    <name>pear.propelorm.org</name>
    <summary>Local Propelorm PEAR channel</summary>
    <alias>propel</alias>
    <url>http://pear.propelorm.org/</url>
</server>
```

この例ではURLをオフィシャルに合わせているが、URLを完全に自前のものに変えても良い。
「pear install」コマンドを打った時にアクセスするURLとなる。

XMLファイルができたら、PEARパッケージ化する。

```bash
$ pirum build .
```

## チャンネルにパッケージを追加する
今は空のチャンネルになっているはず。phingでパッケージをビルドし、pirumコマンドで追加していく。
　# PropelはPEAR用XMLファイルがリポジトリに一緒に置いてあって良かった。
version=の部分は、パッケージのバージョンを入れる。

```bash
$ phing -Dversion=1.7.1 -f generator/pear/build-pear-package.xml
$ pirum add . generator/pear/build/propel_generator-1.7.1.tgz
$ phing -Dversion=1.7.1 -f runtime/pear/build-pear-package.xml
$ pirum add . runtime/pear/build/propel_runtime-1.7.1.tgz
```

確認

```bash
$ cat packages.json
```


## Webサーバーに配置
Webサーバーの設定によって色々だと思うので、以下は例。とにかく、 **pirum.xmlで書いたURLでアクセスできるように配置する。**
配置の仕方がかなり雑なのはご愛嬌。

```bash
$ sudo cp -rp /tmp/Propel-1.7.1/* /var/www/html/
```

この例だと「1Webサーバー:1PEARチャンネル」になってしまうので、VirtualHostとかVirtualDocumentRootと組み合わせるのが良いと思う。ここでは割愛。


## PEARインストールする対象ホストで確認
もし上記pirum.xmlのようにオフィシャルのURLに合わせているなら、hostsファイルを編集する。

```/etc/hosts
WebサーバーのIPアドレス  pear.propelorm.org
```

そして、上記pirum.xmlで記載したURLでアクセスできることを確認。


```bash
$ curl <pirum.xmlに書いたURL>
```

PEAR Channelの情報が出てくれば成功。


## インストールしてみる
オフィシャルのPEAR手順にしたがってコマンドを打ってみる。

```bash
$ pear channel-discover pear.propelorm.org
```

もしオリジナルなURL・・・例えば http://hoge/fuga/ を設定しているなら、以下のように入力。

```bash
$ pear channel-discover hoge/fuga
```

パッケージを入れてみる。

```bash
$ sudo pear install -a propel/propel_generator
$ sudo pear install -a propel/propel_runtime
```

OKだった。
HerokuのポスグレにpgAdminやその他ツールから接続する


メモ的に。

##接続URLを取得して読み解く
接続URLを取得する。

```
heroku config
```

`postgres://`ではじまるURLが取得できるのでURLから情報を抜く。

```
postgres://<接続ユーザー>:<パスワード>@<ホスト名>:<ポート>/<DB名>
```

各ツールの接続設定に情報を入力して完了。
もう目移り。ちょっち迷っている

#寄り道から帰ってきた
言い換えれば、もう目移り。Lua、学習コストもコミで超速いけど、やっぱり流行っていなさすぎる。孤独感ぱない。コルーチン邪魔、と思う私には、コルーチンの無い、もっとminimumなLuaでもいいのに、とも思う。真面目にオープンソースに取り組むなら、Lua界の新鋭だぜいえあ、という生き方もあるのだろうが、生憎そんな時間はない。Open Issueこんなに溜めたぜ、きゃっふー！　ってことになりかねん。

お友達ができそうなルートを再構築したい。現在の私の脳内マップでは、こんな感じでイメージされている。各言語を貶す意図はないのでご容赦。なお See [六道](http://ja.wikipedia.org/wiki/%E5%85%AD%E9%81%93)
　天道：HaskellとかCoqとかで天人になる。人間より優れた存在になれるが、解脱による出口は無い。
　人間道：やっぱりCoffeeScript on Node.jsに出戻り。人並みの暮らしをする。修行次第で仏に解脱できる。
　修羅道：敢えて修羅の道、C or C++ /w Boostに戻る。
　畜生道：GolangでGoodle様に使役される。エラー処理はGoogleの社内事情に随う羽目になる。
　餓鬼道：Lua、Moonscriptはコレ。あまりにエサがなくて辛い。
むう。どうすっかな。どれもそれなりに面白いが、出口の無い天道はまだいいや。ベンチマークを楽しみたければ多分畜生道か修羅道に墜ちるべきなのだろうが、うーん。迷う。

今のところ、人間道か修羅道か畜生道の3択。

#ただし、LUAに寄り道した収穫もあった。
静的コンテンツを各プロジェクトの pj_root/public/* から配信するための仕組みは、LUAから現在接続中のプロジェクトに訊ねて設定する（か、Redis経由で間接的に訊ねて設定する、というのがベストプラクティスに候。

そこは勉強になった。あくまでnginxスクリプトとして考えたら、LUAも入れといて間違いない。
iTerm2でCmd-Tabでアプリ切り替え

Mac Yosemiteで、ですが、
iTerm2でCmd-Tabでアプリ切り替えがうまくいかなくなっている。
以下のURLのパターンは以前は問題なかったのだけど、Yosemiteから効かないかな？
http://qiita.com/hayamiz/items/0f0b7a012ec730351678

Karabiner（旧KeyRemap4MacBook）のprivate.xmlで対処する

```lang:xml
<?xml version="1.0"?>
<root>
  <item>
    <name>iTerm2 Command-Tab</name>
    <identifier>private.iterm2_cmd_tab</identifier>
    <only>iTerm2</only>
    <autogen>--KeyToKey-- KeyCode::TAB, ModifierFlag::COMMAND_L, KeyCode::TAB, ModifierFlag::COMMAND_R</autogen>
  </item>
  <appdef>
    <appname>iTerm2</appname>
    <equal>com.googlecode.iterm2</equal>
  </appdef>
</root>
```
JavaScript つい忘れてしまう配列のソート方法

いつも忘れてググルので、ここにメモしておきます。

#1次元配列のソート
##昇順ソート
````js
var a = [5,3,9,1,10]
a.sort(function(a,b){
    	if( a < b ) return -1;
        if( a > b ) return 1;
        return 0;
});
結果:1,3,5,9,10
````


##降順ソート
````js
var a = [5,3,9,1,10]
a.sort(function(a,b){
    	if( a > b ) return -1;
        if( a < b ) return 1;
        return 0;
});
結果:10,9,5,3,1
````

#連想配列の特定のキーでソート
##昇順
````js
//フルーツの名前と価格。価格でソートする
var fruits = [
   {name:"apple",price:100},
   {name:"orange",price:98},
   {name:"banana",price:50},
   {name:"melon",price:500},
   {name:"mango",price:398}
]

fruits.sort(function(a,b){
    if(a.price<b.price) return -1;
    if(a.price > b.price) return 1;
    return 0;
});
console.log(fruits)

結果
[ { name: 'banana', price: 50 },
  { name: 'orange', price: 98 },
  { name: 'apple', price: 100 },
  { name: 'mango', price: 398 },
  { name: 'melon', price: 500 } ]
````
##降順
````js
fruits.sort(function(a,b){
    if(a.price>b.price) return -1;
    if(a.price < b.price) return 1;
    return 0;
});
console.log(fruits);
結果
[ { name: 'melon', price: 500 },
  { name: 'mango', price: 398 },
  { name: 'apple', price: 100 },
  { name: 'orange', price: 98 },
  { name: 'banana', price: 50 } ]
````

#連想配列の複数のキーでソート
````js
//フルーツの価格と重さ。
var fruits = [
   {name:"apple",price:100,weight:90},
   {name:"mango",price:500,weight:200},  
   {name:"orange",price:98,weight:150},
   {name:"apple",price:100,weight:100}, 
   {name:"banana",price:50,weight:50},
   {name:"melon",price:500,weight:500},
   {name:"mango",price:398,weight:200}
]

//重さ、価格、の順に並び替え(降順)

fruits.sort(function(a,b){
    if(a.weight>b.weight) return -1;
    if(a.weight<b.weight) return 1;
    if(a.price>b.price) return -1;
    if(a.price < b.price) return 1;
    return 0;
});

結果
[ { name: 'melon', price: 500, weight: 500 },
  { name: 'mango', price: 500, weight: 200 },
  { name: 'mango', price: 398, weight: 200 },
  { name: 'orange', price: 98, weight: 150 },
  { name: 'apple', price: 100, weight: 100 },
  { name: 'apple', price: 100, weight: 90 },
  { name: 'banana', price: 50, weight: 50 } ]
````

これであってるよね？
間違いがありましたら、ご指摘ください。

#関連リンク
[あれ？昇順てどっちだっけ？降順てどっちだっけ?](http://qiita.com/PianoScoreJP/items/f0be0cece0ee798f62d2)
docker自分用メモ

docker ps   //起動中のdockerを確認
docker ps -a    //起動履歴を表示
docker start CONTAINER ID    //選択したdockerを起動する
docker attach CONTAINER ID   //選択したdockerの中に入る
service httpd start
service sshd start
service mysqld start
cat etc/host    //docker内でinit addrを確認

ctr+p+qでdockerから抜ける
GitHub の Markdown に TOC (目次) を付けるブックマークレット

## 2017年5月10日後記
GitHub のサイト構成がここ最近で変わったらしく、本記事のスクリプト (jQuery依存) は機能しなくなりました。

@hokkun-k 氏が新しい GitHub サイト構成 (vanilla JS) に対応したスクリプトを書き直してくれたので、今後はそちらをご参照ください。

- [GitHub の Markdown に TOC (目次) を付けるブックマークレット (vanilla JS 編)](http://qiita.com/hokkun-k/items/bd3ec64fba293f4aca08)

## スクリーンショット

GitHub 上の Markdown に TOC (Table of Contents) (目次) を付ける。

![markdown.png](https://qiita-image-store.s3.amazonaws.com/0/25555/c9219b49-f9fe-a1ce-e43c-59a7a4779161.png)

## 旧スクリプト
冒頭の後記にも書いた通り、もうこのスクリプトは機能しませんが、一応記録として gist にアーカイブしておきました。

- https://gist.github.com/kobake/6e4695b981c65d6082410ce00c5430d3

## 参考
- [Javascriptでヒアドキュメント - Qiita](http://qiita.com/_shimizu/items/837b529de9f3302e315c)
BtoBに使えるオンライン決済サービスまとめ

### 1.対象
決済サービスのうち以下を満たすものを対象とする。
* API持っている
* 銀行振り込みがある
* BtoB実績がある


# 2. 各サービス手数料

## Paid
* 企業間取引で掛売できる
* 取引金額の1.9％～3.0％

[Paid導入事例 | 複雑な請求業務を一括整理！社内フローがスッキリしました](http://paid.jp/)


## BizPay
* 銀行振込　仮想口座方式
* クレジットカード決済
* 手数料不明

[キャッシュフロー改善に！法人間（BtoB）決済のBizPay](http://bizpay.paygent.co.jp/)

## Yahoo FastPay
* API有り
* 3.25%

[Yahoo!ウォレット FastPay](https://fastpay.yahoo.co.jp/)

## Paypal
* API有り
* 3.6%+40円/件

## WebPay
[WebPay: 開発者向けクレジットカード決済サービス](https://webpay.jp/#brands)
* API有り
* 3.25%
2015/2にLINEに買収された。CookPad出身のエンジニアによるクレジット決済サービス

* 簡単
* シンプル
* 手数料 2.69% / 3.25%
* 費用  9800円 / 月
* 初期費用  0円
* クレジットカード決済onlyなのでBtoC向け

## SPIKE
* 手数料 売上100万まで無料

[SPIKE（スパイク） - 決済手数料０％のオンライン決済サービス](https://spike.cc/)
[決済Webサービスの Webpay と SPIKE の比較 - ボクココ](http://bokukoko.hatenablog.com/entry/2014/09/20/%E6%B1%BA%E6%B8%88Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE_Webpay_%E3%81%A8_SPIKE_%E3%81%AE%E6%AF%94%E8%BC%83)


## Visa Business Pay
?

[Visa Business Pay│Visa News - Visaカード優待情報](http://www.visa-news.jp/businesspay/)
[JCB企業間決済サービス（BtoB Payment Service)のご案内 ｜ クレジットカードなら、JCBカード](https://www.jcb.co.jp/corporate/btob.html)
Goでファイルの内容を1行ずつ読み込む

Goでファイルの内容を1行ずつ読み込むときは、[bufio](https://golang.org/pkg/bufio/)を使います。

```go
package main

import (
    "os"
    "bufio"
    "fmt"
)

func main() {
    filename := "file.txt"

    // ファイルオープン
    fp, err := os.Open(filename)
    if err != nil {
        // エラー処理
    }
    defer fp.Close()

    scanner := bufio.NewScanner(fp)

    for scanner.Scan() {
        // ここで一行ずつ処理
        fmt.Println(scanner.Text())
    }

    if err = scanner.Err(); err != nil {
        // エラー処理
    }
}
```

1行ずつ読む必要がない場合は、[io/ioutil](https://golang.org/pkg/io/ioutil/)を使うことで簡単に読み込むことができます。

```go
package main

import (
    "io/ioutil"
    "fmt"
)

func main() {
    filename := "file.txt"

    text, err := ioutil.ReadFile(filename)
    if err != nil {
        // エラー処理
    }

    // ReadFileの返り値は[]byte型なので注意
    fmt.Println(string(text))
}
```