OmniAICreator/Qiita-1.07M huggingface dataset:
SSH鍵認証の方法


鍵の名前は適当にユーザ名などに変更しておく。デフォルトはid_rsaになるので、ログイン元のPC内の.ssh配下でかぶってなければそれでOK。

基本的には名前を変えた方が無難。

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/<home>/<foo>/.ssh/<foo>_rsa): /<home>/<foo>/.ssh/<foo>_rsa
```

パスワード聞かれるので空でよし。

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

そうすると/<home>/<foo>/.ssh/の下に

・\<foo\>_rsa
・\<foo\>_rsa.pub

が出来ているはず。

その後、ログイン先のサーバで一般ユーザを作成する。パスワード設定は必要ない。

```
# useradd <foo>
```

作成したユーザに変更する。

```
# su <foo>
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
```

PCで作成した\<foo\>_rsa.pubをログイン先のサーバに対してSCPでコピーする。

```
$ scp /<home>/<foo>/.ssh/<foo>_rsa.pub <foo>@<IP Address>:~/.ssh/authorized_keys
```

サーバにてauthorized_keysの所有権変更。

```
$ chmod 600 ~/.ssh/authorized_keys
```

その後、rootに戻り、/etc/ssh/sshd_configを編集。

```
#Port22 
→Port**** 
  
#PermitRootLogin yes 
→PermitRootLogin no 
  
PasswordAuthentication yes 
→PasswordAuthentication no
```

sshdを再起動。

```
# service sshd restart
```

ログインしてみる。

```
ssh -p <PortNumber> -i ~/.ssh/<foo>_rsa <foo>@<IP Address>
```

いちいち秘密鍵や、変更したポート番号を指定したりするのがめんどくさいので、PC内の~/.ssh/configを作成しログイン先のサーバをHostとして登録しておく。

```
Host <myServerName> → (任意)
	HostName <IP Address>
	User <foo>
	IdentityFile ~/.ssh/<foo>_rsa
	Port <PortNumber>
```

下記のコマンドでログインできるはず。

```
$ ssh <myServerName>
```
condpを利用したFizzBuzz

```clj
(defn fizzbuzz [x]
  (condp #(= (mod %2 %1) 0) x
    15 "FizzBuzz"
    3 "Fizz"
    5 "Buzz"
    x))
```
condの各条件の中で使用する変数が共通の場合、condpが便利。
'%1'には引数x、'%2'には場合分けの15,3,5がそれぞれ対応する。
Smartyで配列のキーにハイフンが使えない理由

【Smarty】配列のキーにハイフンを使ったらアウトらしい
http://qiita.com/seihowlow24/items/713e12c459fa47df7eb1

こういう記事がありました。
Smartyでは連想配列のキーに-を使用できないという問題です。

では何故使えないのかというのを少し調べてみたので記載。
使用したバージョンはSmarty3.1.19。

まあ言ってしまうとマイナスと区別が付かないからです。

```php:index.php
<?php
	$hoge = [
		'a'=>10,
		'a-1'=>5,
	];
	$smarty->assign('hoge', $hoge);
	$smarty->display('index.html');
```

```php:index.html
	{$hoge.a-1}
```

`{$hoge.a-1}`は`$hoge['a-1']`ではなく`$hoge['a']-1`と解釈され、結果は「9」になります。

実際コンパイル後のファイルは

```php
<?php echo $_smarty_tpl->tpl_vars['hoge']->value['a']-1;?>`
```
となっています。
これはSmartyが[演算をサポートする](http://www.smarty.net/docs/ja/language.math.tpl)かぎりどうしようもないですね。

PHPの配列キーには他の演算子や記号や日本語なども大概入れられますが、Smartyテンプレートでは大半が使用できません。
$など使っただけでFatal errorが発生します。

```php:index.php
<?php
	$hoge = [ 'some-key'=>'val' ];
	$smarty->assign('hoge', $hoge);
	$smarty->display('index.html');
```

```php:index.html
	{$hoge.some-key}
```

コンパイル後。

```php
<?php echo $_smarty_tpl->tpl_vars['hoge']->value['some']-'key';?>
```
`$_smarty_tpl->tpl_vars['hoge']->value['some']`は未定義なので`NULL - 'key'`というよくわからない演算となり、結果は「0」となります。
当然Undefined indexのNoticeも発生します。

おっと、[参考サイト](http://babie.hatenablog.com/entry/20060306/p2)と何故か結果が違ってますね。
参考サイトは『`{$hoge['some-key']}`と書けない』とか言ってるので、古いバージョンだと思われます。
最近のバージョンでは`{$hoge['some-key']}`と問題なく書くことが可能です。
こちらであれば記号や日本語などの配列キーもそのまま使えるので、常にこちらの記法で書くとか決めてしまってもいいかもしれません。

ちなみに構文解析の実体は`SMARTY_SYSPLUGINS_DIR.smarty_internal_templatelexer.php`あたりにありますが、

`preg_match('/\G(\{\})|\G(\{\*([\S\s]*?)\*\})|\G(\{\s*strip\s*\})|\G(\{\s*\/strip\s*\})|\G(\{\s*literal\s*\})|\G(\{\s*(if|elseif|else if|while)\s+)|\G(\{\s*for\s+)|\G(\{\s*foreach(?![^\s]))|\G(\{\s*setfilter\s+)|\G(\{\s*\/)|\G(\{\s*)|\G(<\?(?:php\w+|=|[a-zA-Z]+)?)|\G(\?>)|\G(\s*\})|\G(<%)|\G(%>)|\G([\S\s])/iS', $contents);`

うん、これ読むの無理。
これとかSmarty_Internal_Templateparserはいったい何なのか誰か教えて下さい。
JavaScriptでちょっと勘違い

色々言語触ってて覚え違いしてることって多いけど、最近の衝撃は、JavaScriptでも三項演算子が使えたってことだな。

わざわざ下みたいに書いてたわ。。。

```js
var isOk = function(obj){
  console.log({'true':'いいじゃーないの～','false':'ダメよ～ダメダメ'}[!!obj]);
}
```

ついでに定番かもしれないJavaScript真理表（並びに特に意味はありません）

```js
var isOk = function(obj){
  console.log(obj?'いいじゃーないの～':'ダメよ～ダメダメ');
}
   true                          |  false                               |
isOk(true)                       |  isOk(false)                         |
isOk([])                         |  isOk(null)                          |
isOk({})                         |  isOk(undefined)                     |
isOk(new Object())               |  isOk(!(new Boolean(false) == false))|
isOk(new Boolean(false))         |  isOk(new Boolean(false) != false)   |
isOk(new Boolean(false) == false)|  isOk(new Boolean(false) === false)  |
isOk(1)                          |  isOk(0)                             |
isOk(-1)                         |  isOk('')                            |
isOk(1/0)                        |  isOk(NaN)
```
ボタン専用CSSフレームワークの"Buttons"がいい感じ

# やりたかったこと

以前、[Bootstrap以外のCSSフレームワークを探してみた](
http://qiita.com/seihowlow24/items/05dc8d2b672cebe0e265)で、CSSフレームワークを取り上げました。
ただ、もうサイトが出来上がっている場合は、全体にフレームワークを使う必要はありません。どちらかというと、一部のパーツだけに適用したい場合が多いと思います。

例えば、ボタンとか。

そんな時に役立つのが、ボタン制作のための"Buttons"です。


# Buttons とは

Buttons
http://alexwolfe.github.io/Buttons/

こんなカラフルなボタンが、簡単に作れます。

![スクリーンショット 2014-07-25 20.47.11.png](https://qiita-image-store.s3.amazonaws.com/0/32771/e98361fc-c233-df6f-f133-5d509b41a75c.png)

これは一例で、他にも3Dボタンや、ドロップダウン、アイコン付きボタンなど、計8ジャンルのボタンが使えます。
この真ん丸のボタンに一目惚れしました。

# 使い方

## ダウンロード
[Buttons]
(http://alexwolfe.github.io/Buttons/)からダウンロードします。
ファイル構成は、css, js, saas。

## css, js の読み込み

```index.html
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" href="css/buttons.css">
 
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="js/buttons.js"></script>
```

## class 指定をする
```index.html
<a href="#" class="button button-circle button-flat-primary">press me</a>
```
これで、上の画像にある、真ん丸のボタンを作れます！

詳しくは[公式ドキュメント]
(http://alexwolfe.github.io/Buttons/)をご覧下さい。

# 他には?

- [Sassy Buttons](http://jaredhardy.com/sassy-buttons/)
- [CSS patterned buttons](http://red-team-design.com/css3-patterned-buttons/)

など、いろいろあるみたいですが、Buttons ほどバリエーションがあり、ドキュメントが見やすいものはなかなか見つかりませんでした。

中には、こんな変わり種も。

- [CSS3 GitHub Buttons](http://necolas.github.io/css3-github-buttons/)
Github に使われているボタンを再現出来る

パーツに使える、おすすめのフレームワークなどがあれば、ぜひ教えてください。

# 参考
[ボタン作りの手間を削減！CSSボタンデザインジェネレーターまとめ](
http://w3q.jp/t/4182)
SkinnyFrameworkのテストで自動ロールバックさせる

SkinnyFrameworkでDB関連のテストをする場合には、標準ではScalikeJDBCの
scalikejdbc.scalatest.AutoRollbackを使うことになります。
ですが、scalikejdbcのAutoRollbackはDBSessionをimplicitで渡しまわすことで実現しているため、セッションを渡せなくなった時点で機能になくなります。

一方、Skinny内ではAutoSessionFeature#autoSessionによって、スレッドローカルのDBSessionオブジェクトを取得する機能があります。
そこで、autoSessionを利用している限りはセッションを共有できるようにする機能を作ってみました。


```scala
package test

import org.scalatest.{Suite, BeforeAndAfter}
import scalikejdbc.{ConnectionPool, ThreadLocalDB}

trait EasyAutoRollback extends BeforeAndAfter { self: Suite =>

  before {
    Option(ThreadLocalDB.load()).getOrElse {
      ThreadLocalDB.create(ConnectionPool.borrow())
    }.beginIfNotYet()
  }

  after {
    ThreadLocalDB.load().rollbackIfActive()
  }

}
```
iOSで識別子を作りたいとき Swift,Objective-C

知ってる人は知っている。知らない人は知らない。そういうこと、いっぱいあります。

さてiOSである程度開発になれてきてデータ管理にCoreDataなどを使おうとして、データ定義をしているとモデルを管理する識別子、IDが欲しくなってきます。というかだいたい必要なんじゃないかと思います。

データの名前で管理しようとしたり（2年前の俺）、日付を秒数まで文字列で取得してID代わりに使ってみようとしたり（1年半前の俺）と、知っておくべきことを知らないでいると「何を言っているか分からねーと思うが、、、」な実装をしてしまいます。

先人たちは[UUID](http://ja.wikipedia.org/wiki/UUID)という便利なものを用意してくれてCocoaにもしっかりと用意されているので、iOS、Objective-C、Swiftで識別子を作りたいときはこれを使いましょう

Objective-Cで書くと、こう。

```objc
NSString *uuid = [[NSUUID UUID] UUIDString];
```

Swiftで書くと、こう。

```swift
let uuid: NSString = NSUUID().UUIDString
```

XcodeのSnippetとかに登録しておくと便利です。

ちなみにモデルの識別子のプロパティ名を`id`とかObjective-Cでやるのはナンセンスなので`identifier`とかにしましょう。

ターミナルからは`uuidgen`。

```shell-session
$ uuidgen
```

別に日付と時間からでも生成できないことはないけど、NSUUIDなら一行で済むからそんな無茶しなくていいと思います。
MinHashによる類似度の算出

MinHashによる類似度の計算のサンプルを実装してみた.

参考 [b-Bit MinHashによる高速かつ省スペースな類似度判定](http://developer.smartnews.be/blog/2013/08/05/efficient-similarity-estimation-using-b-bit-minhash/)

上記文献に従って, ハッシュの計算には[MurmurHash3](https://code.google.com/p/smhasher/)(の[python wrapper]( https://pypi.python.org/pypi/mmh3/))を使った.

```py:minhash.py
# -*- coding: utf-8


import mmh3


MIN_HASH_VALUE = 2 ** 128


def min_hash(words, seed):
    min_hash_word = None
    min_hash_value = MIN_HASH_VALUE

    for word in words:
        hash_ = mmh3.hash128(word, seed)
        if hash_ < min_hash_value:
            min_hash_word = word
            min_hash_value = hash_

    return min_hash_word


def get_score(s1, s2, k):
    """Get the similarity between s1 and s2 using min-hash algorithm

    k: the number of hash functions
    """
    num_match = 0

    for seed in xrange(k):
        if min_hash(s1, seed) == min_hash(s2, seed):
            num_match += 1

    return float(num_match) / k


def main():
    s1 = ['a', 'b']
    s2 = ['a']
    s3 = ['b']
    # a-z
    s4 = [chr(ascii) for ascii in xrange(97, 123)]

    k = 2 ** 10

    # Should be ~0.074
    print get_score(s1, s4, k)
    # Should be ~0.370
    print get_score(s2, s4, k)
    # Should be ~0.370
    print get_score(s3, s4, k)


if __name__ == '__main__':
    main()
```

```
[yamaneko]$ time python min_hash.py 
0.078125
0.046875
0.03125

real    0m0.112s
user    0m0.076s
sys     0m0.015s
```

kの値を大きくした場合, 値が収束したが計算時間は増えた.

次はb-bit MinHashを実装したい.
RuboCop | 任意の警告に対応するRuboCopのソースコードを爆速で表示する方法

# RuboCop | 任意の警告に対応するRuboCopのソースコードを爆速で表示する方法

## 概要
任意の警告に対応するRuboCopのソースコードを爆速で表示する方法について。

RuboCopの警告ですが、一つ一つの警告に対して細かなサンプルつきドキュメントなどがないため
警告がどのようなものか調べたい場合があります。
その場合、対象警告のソースコードとテストコードを確認するのが手っ取り早いです。
そこで、警告に対応するコードを素早く表示する方法を紹介します。

## 対象コード

~~~ruby
hoge = nil
~~~

## 手順
* 現在の警告を知るために、 todo ファイルを出力します

~~~bash
$ rubocop --auto-gen-config
$ cat rubocop-todo.yml
# This configuration was generated by `rubocop --auto-gen-config`
# on 2014-07-25 22:30:24 +0900 using RuboCop version 0.21.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

# Offense count: 1
UselessAssignment:
  Enabled: false
~~~

* 警告名 *UselessAssignment* をクリップボードにコピーします
* ブラウザを起動して、Googleを表示します。
* 「 *rubocop* *github* 」 で検索を実行します

![find_rubocop0.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e4838ebb-dc21-ac54-3ece-d832d9db4868.png)

* 検索結果の先頭に rubocop のGitHubリポジトリが表示されます

![find_rubocop1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/12a92c1b-4783-562b-a5a8-1ec28e54e7c4.png)

* TAB => Enter でRuboCopのGitHubトップページに移動します

![find_rubocop2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/60a2ce9a-5ff9-a203-ad5c-2af1d200bc96.png)

![find_rubocop3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5fe24c0e-1e68-2404-907e-e85ae5dd1eb9.png)

* T キーを押下し、検索モードにします

![find_rubocop4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ae445323-3c41-1583-388c-15d940085039.png)

* クリップボードに保存しておいた、 *UselessAssignment* を貼り付けると対象のプロダクトコードとテストコードがフィルタされます

![find_rubocop5.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6c552e98-2b58-20ef-5936-5d258aafc712.png)

* 矢印の下キー=>Ctrl + Enterでそれぞれを新たなタブに表示します

* あとは好きなだけ中身を確認してください

## 補足
この方法は別途下記記事でも紹介している内容をRuboCop向けにしたものです。

[GitHub | ショートカットを駆使して爆速で目的のソースコードを表示する](http://qiita.com/tbpgr/items/fd0661212c64a5ed24bb)
RuboCop | Style/SingleLineMethods

# RuboCop | Style/SingleLineMethods

## 概要

RuboCopの「Style/SingleLineMethods」警告について。

1行で書かれたメソッドがあるかどうかをチェックします。
デフォルトでは空実装の場合のみ1行での記述を許容します。
これは、ダックタイピング用に空メソッドを定義したい場合などに
すっきりとした記述ができるため許容しているものと思われます。

## SingleLineMethods

### 検証プログラム

~~~ruby:single_line_methods.rb
def hoge; print :hoge; end

def hige; end
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
SingleLineMethods:
  AllowIfMethodIsEmpty: true
~~~

~~~bash
$ rubocop single_line_methods.rb
Inspecting 1 file
C

Offenses:

single_line_methods.rb:1:1: C: Avoid single-line method definitions.
def hoge; print :hoge; end
^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 false に設定します

~~~yaml:.rubocop.yml
SingleLineMethods:
  AllowIfMethodIsEmpty: false
~~~

~~~bash
$rubocop single_line_methods.rb
Inspecting 1 file
C

Offenses:

single_line_methods.rb:1:1: C: Avoid single-line method definitions.
def hoge; print :hoge; end
^^^^^^^^^^^^^^^^^^^^^^^^^^
single_line_methods.rb:3:1: C: Avoid single-line method definitions.
def hige; end
^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Elasticsearch で percentile 計算

Elasticsearch 1.3 が出たと聞いて、そういえば percentile に対応するらしいって前に聞いたのを思い出してググったら 1.1 (2014年3月) で既に対応済みでした。(Experimental ですけどね)

[Percentiles Aggregation](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-percentile-aggregation.html)

ということなので早速試してみます。

データは [Kibana](http://www.elasticsearch.org/overview/kibana/) 用にインデックス済みなのでこいつを使います。ウェブサービスのレスポンタイムのパーセンタイル値欲しいですよね。

まずは上記のドキュメントに書いてあるサンプルをひとつ。だたし、対象となったドキュメントの内容は不要なので `size: 0` を指定しています。

```json:query1.json
{
  "aggs": {
    "load_time_outlier": {
      "percentiles": {
        "field": "responseTime",
        "percents": [
          95,
          99,
          99.9
        ]
      }
    }
  },
  "size": 0
}
```

```
$ curl -s -X POST -d @query1.json \
    http://elasticsearch:9200/accesslog-2014.07.25/_search?pretty
```

```json:response
{
  "took" : 121,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 390458,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "load_time_outlier" : {
      "values" : {
        "95.0" : 274762.7526741865,
        "99.0" : 683982.277012403,
        "99.9" : 2122798.5229873355
      }
    }
  }
}
```

とっても簡単！！そして速い。でもこれだと、インデックス全体が対象となってしまうので5分単位、10分単位とか1時間単位で出したいですよね。
そこで、次のように range フィルターで時間を絞りましょう。

```json:query2.json
{
  "aggs": {
    "load_time_outlier": {
      "percentiles": {
        "field": "responseTime",
        "percents": [
          95,
          99,
          99.9
        ]
      }
    }
  },
  "filter": {
    "range": {
      "@timestamp": {
        "to": 1406250000000,
        "from": 1406246400000
      }
    }
  },
  "size": 0
}
```

1時間おきならこの結果を [HRForecast](https://github.com/kazeburo/HRForecast) に突っ込めばいつでも参照できますね（私はまだ使ったことないですけど）。5分とかなら [InfluxDB](http://influxdb.com/) でも PostgreSQL でも MySQL にでも突っ込んで好きな時に参照できるようにすると良いですね。

でもまだ HTTP の status code は 200 に限定したいとか、画像などの静的ファイルは除外したいとかありますね。

```json:query3.json
{
  "aggs": {
    "load_time_outlier": {
      "percentiles": {
        "field": "responseTime",
        "percents": [
          95,
          99,
          99.9
        ]
      }
    }
  },
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "status:200 AND NOT uri:/.*\\.(png|gif|jpeg|jpg|css|js)/ AND NOT uri:/.*\\.(png|gif|jpeg|jpg|css|js)?.*/"
        }
      },
      "filter": {
        "range": {
          "@timestamp": {
            "to": 1406250000000,
            "from": 1406246400000
          }
        }
      }
    }
  },
  "size": 0
}
```

こんな感じでしょうか。なんか美しくないけど...
`uri` には Apache の LogConfig での `%U%q` が入っているものとします。

便利です。
DOMイベントのキャプチャ/バブリングを整理する 〜 JSおくのほそ道 #017

こんにちは、ほそ道です。

今回はDOMネタです。
イベントのキャプチャとバブリングについて覚書をまとめて参ります。

また今回はv8での検証であり、レガシーなIEは対象外です。
レガシーなIEはイベント設定メソッド自体が違いますのでご注意くださいませ。

[目次はこちら](http://qiita.com/setzz/items/ad9a9c99a4fda041a563)

# 入れ子なDOMのイベント発生順序制御

DOMが入れ子構造になっていてそれぞれにイベント(例えばClickイベント)が設定されていた場合
「このように動いてほしい」という期待はケースバイケースであると思います。
期待通りの処理になるようカッチリ制御しちゃいましょう。

## addEventListenerの第三引数「useCapture」

例えば下記の様なHTMLがあったとします。
body内にdivが入れ子になっておりそれぞれにClickイベントが登録されています。

```html:キャプチャとバブリング
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>event</title>
    <style>
        #outer {
            width: 150px; height: 150px;
            background: #00AAFF;
            padding-top: 50px; padding-left: 50px;
        }
        #inner {
            width:100px; height: 100px;
            background: #EEFF00
        }
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner" align="center"></div>
    </div>
    <script>
        function out(s) {return function() {console.log(s);}}
        document.getElementById('outer').addEventListener('click', out('outer'), true);
        document.getElementById('inner').addEventListener('click', out('inner'));
    </script>
</body>
</html>
```

外側のdiv要素のaddEventListenerには第三引数にtrueをセットしています。
第三引数は内部的には`useCapture`という名のフラグです。
このuseCaptureは省略可能でデフォルトはfalseとなっています。

## 内側要素クリック時の挙動

- outerのuseCaptureをtrueにした場合

![スクリーンショット 2014-07-16 22.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/39330/e3eb6c1b-aaa6-6bfc-d7d4-52e6ab874e77.png)←outerが先

- outerのuseCaptureをfalseまたは省略した場合

![スクリーンショット 2014-07-16 22.18.45.png](https://qiita-image-store.s3.amazonaws.com/0/39330/7a1dbdc5-4671-695b-4607-afdbc7781d91.png)←innerが先

**そう、useCaptureフラグの値によってイベントが発生する順序が逆になるのです！**

## イベントフェーズとは？

イベントが発生すると下記の流れでイベント伝播が発生します。

- (**キャプチャフェーズ**) DOMツリーをたどってルート要素から発生要素を探しに行く
- (**ターゲットフェーズ**) 発生要素を検出する
- (**バブリングフェーズ**) 今度はルート要素まで遡る

[W3C](http://www.w3.org/TR/DOM-Level-3-Events/)のドキュメントに載っていた図がわかりやすいので拝借します。
![eventflow.png](https://qiita-image-store.s3.amazonaws.com/0/39330/32be6719-9e30-1f84-6e81-140c2c06bc6a.png)

親要素が同種のイベント(今回はClickイベント)を持っていた場合、
キャプチャフェーズでイベントを発生させてしまうよう設定するのがuseCapture=trueという事です。
逆にuseCaptureをfalseまたは省略すると親要素のイベントはバブリングフェーズで実行されます。

# 内側をクリックしたときに外側のイベントを発生させない

さて、もうひとつまとめておきます。
**そもそも、イベント伝播実行自体やめてくれー**
というケースは結構あると思います。
内側要素クリック時は内側要素のイベントだけ動けばええんや。。
というケースでは、最初のHTML例のscript部分を下記のようにします。

```html
<script>
  function out(s) {
    return function(e) {
      e.stopPropagation();
      console.log(s);
    }
  }
  document.getElementById('outer').addEventListener('click', out('outer'));
  document.getElementById('inner').addEventListener('click', out('inner'));
</script>
```

変更ポイントは下記です。

- イベント関数に引数eを渡し、e.stopPropagation();を実行している
- 親要素のaddEventListenerのuseCaptureは省略(バブリングフェーズ実行)している


## イベントオブジェクト
イベントで実行される関数は暗黙的に引数に**イベントオブジェクト**を受け取ります。

## event.stopPropagationメソッド
イベントオブジェクトが持つ`stopPropagation()`メソッドを実行すると**イベント伝播が停止されます。**
つまりバブリングフェーズで外側要素のイベントが発生しなくなるという事ですね。

ちなみに外側要素のuseCaptureをtrueにしてしまうと
キャプチャフェーズで外側要素のイベントが実行され、そこでイベント伝播を止めてしまいます。
ターゲットフェーズで本来クリックされた要素のイベントが発生されなくなる事にご注意下さい。

---

アチラコチラにイベントをセットしていったら伝播しまくりでパニック！なんて事にはならないよう
イベントフェーズはしっかり意識しておきたいなと思います。

今回は以上です。
JavaScriptでProduct Advertising APIの認証が失敗する

[HMAC-SHA256を計算し結果をbase64エンコード - AjaxTower](http://www.ajaxtower.jp/ecs/signature/index5.html)
ここを見てJavaScriptでProduct Advertising APIを使おうと思ったのだけど、どうしても認証失敗する。
おかしいなぁ、おかしいなぁ、やだなぁこわいなぁって思ってたんですよ。
結果として、上記サイトで使用している[jssha256](http://point-at-infinity.org/jssha256/)の仕様が変わったのか、求めるHMAC-SHA256を吐き出さなくなっていました。

そこで代替案。jsSHAを使用する。
[Caligatio/jsSHA](https://github.com/Caligatio/jsSHA)

`sha.js` と `sha256.js` を読み込んでいる状態で

```js:JavaScript
var sha = new jsSHA("Data", "TEXT");
var signature = sha.getHMAC("SecretKey", "TEXT", "SHA-256", "B64");
```

これで`Data`の署名が完成したぞ！やったね！
Windowsでgccなどを利用できるMSYS2の環境設定など

windowsでgccなどのlinux用コマンドが使える環境としてMsysがありますが、最近はMsys2と呼ばれるものが出てきて、だいぶ安定して実用できる感じになってきました。
日本語もちゃんと認識できるところがいいですね。
(ただしコード表現はUTF-8ですが)

環境設定して、いろいろコンパイルできるようになったので、とりあえず環境設定のやり方などを書いていこうと思います。

##インストール

http://sourceforge.net/projects/msys2/files/Base/
より、環境にあったものをダウンロードしてください。
64BitOSならば64bit版を落としておきましょう。
(64Bit→x86_64、32Bit→i686です)

その後インストーラよりインストールすると、c:\にフォルダができてます。(64Bitならmsys64になります)

その中にあるmsys2_shell.batを動かしてシェルが動けばＯＫです。
一旦閉じてもう一度msys2_shell.batを動かしてから

```shell:
$ pacman -Suy

```
としてシステム全体を更新しておきましょう。

なお、ホームディレクトリ(/home/ユーザ名)は、msys\home\以下にあります。


##初期設定など

後はお好みで．．．と言ったところですが、デフォルトでは必要最小限しか入ってないので、、

```shell:
$ pacman -S vim gcc git gcc-libs openssh

```
くらいは入れておけばよいかと思います。

###各種設定

MSYS2のvimは互換モードで動いてしまいとにかく使いにくいので、最低限.vimrcは設定しておきましょう。

```vim:.vimrc

set nocompatible
set number
set title
set ruler
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set noexpandtab
set backspace=indent,eol,start
set mouse=a

```

あと、.inputrcはデフォルトでも入力に問題がありませんでしたが、一応、`Allow 8-bit input/output`とか書いてある箇所に以下を追記しておきます。

```vim:.inputrc

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

```

##ハマったこととか

msysフォルダにある mingw32_shell.bat などでシェルを動かして、これらのgccでコンパイルすると、何故かコマンドラインの引数だけがShift-JISのまま引き渡されるようになってました。

不思議なのが、cinやscanfで取ってきた標準入力からの文字列は双方ちゃんとUTF-8のまま入ってるという点です。。

これはなかなか気が付きにくいですが、いろいろ調べてみると、動かすgccやライブラリも変わってくるのが原因かなといったところでした。
(mingwxxは他のmingwプロジェクトとの互換性を重視しているから？)

msys2_shellで動かした場合、gccは`/usr/bin/gcc`のものを使います。
mingw32_shellで動かすと`/mingw32/bin/gcc`のものを使います。

なので、よほどのことがない限り、shellはmsys2_shellで動かしたほうが良さそうです。

もし、mingw系のシェルでやる場合は、次のようにiconvを使うような変換用のコードを入れておくと良い感じになります。

```cpp:
#include <string>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string.h>
#include <iconv.h>

// MSYS-MINGWの場合、なぜかコマンドラインだけはSJISのままなのでUTF8にコンバートする
void convargv(char *src,std::string &dest)
{
	iconv_t ic = iconv_open("UTF-8", "SJIS");
	char *pin=src;
	char *pou;
	size_t ilen = strlen(src);
	// 半角かなの変換にUTF8は3オクテット必要
	size_t olen = ilen*6+10;

	dest.resize(olen);
	pou = &dest[0];
	
	iconv(ic,&pin,&ilen,&pou,&olen);
	*pou = '\0';
	
	iconv_close(ic);
}


using namespace std;
int main(int argc,char *argv[])
{
	string outstr;
	string instr;
	string xstr;
	
	convargv(argv[1],xstr);
	cout << xstr << endl;
	
	
	outstr = "てすとん";
	cout << outstr << endl;
	cout << "何か入力してください" << endl;
	
	cin >> instr;
	cout << "結果" << endl;
	cout << instr << endl;
	
	return 0;
}

```

gccなどでコンパイルするときは、`-liconv`をオプションに追加しないとエラーになります。

それにしても江添さんも仰せの通り、iconvの関数仕様がけっこうあれなので、できればiconvは使いたくないところですね。。

本の虫：iconvがクソすぎる
http://cpplover.blogspot.jp/2012/04/iconv.html


##参考文献

MSYS2でMinGW環境整備(2)
http://arithmeticoverflow.blog.fc2.com/blog-entry-33.html
【OGP】prefix?xmlns?どっちを入れればいいのか。

## OGPの設定の際に

prefixもxmlnsも入れてくださいという紹介の仕方をされているサイトを最初に見てしまって、混乱してしまいました。それ以降もprefixが書いてあったり、xmlnsが書いてあったり・・・いったいどっちなんだろうと。

```html:prefix
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
```

```html:xmlns
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://ogp.me/ns/fb#" lang="ja">
```

気持ち悪かったのでぐぐってみたところ。

## 結論

xmlnsはXML用！
prefixはhtml5用！
prefixを使おう！でした。

そもそもOGP本家には、prefixの記載しかなかったです。

http://ogp.me/

どこからxmlnsがわいてきたのだろう。

## 参考サイト

* [The Open Graph protocol](http://ogp.me/)
* [HTML5でOGPの設定をする時にhtmlタグにxmlnsは不要](http://dtp.jdash.info/archives/51947560.html)
* [HTML5でOGP設定する際に注意したいxmlns属性とprefix属性 | ごすてっぷ](http://05step.com/2012/11/25/ogp-html5/)
* [OGPの記述は、結局「xmlns」か「prefix」かどっちなの | Sunday In The Park](http://snowadays.jp/2013/08/1762)
Module#refine


## Module#refine ってなんぞ?

```
引数 klass で指定したクラスだけに対して、ブロックで指定した機能を提供で きるモジュールを定義します。定義した機能は Module#refine を使用せずに直 接 klass に対して変更を行う場合と異なり、限られた範囲のみ有効にできます。 そのため、既存の機能を局所的に修正したい場合などに用いる事ができます。 
```

```
定義した機能は main.using を実行した場合のみ有効になります。
```

## 要は?

モンキーパッチを適用する範囲を限定できて便利

## モンキーパッチ?


```
オリジナルのソースコードを変更することなく、実行時に動的言語(例えばSmalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, など)のコードを拡張したり、変更したりする方法である
```

- [モンキーパッチ - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81)

## 具体例

文字列を装飾する class

```text_decorator.rb
class TextDecorator
  def initialize(str)
    @base_str = str
  end

  def decorate
    gsub_space_to_atmark(surround_quote(@base_str))
  end

  private

  def surround_quote(str)
    "'#{str}'"
  end

  def gsub_space_to_atmark(str)
    str.gsub(' ', "@")
  end
end

puts TextDecorator.new("abc def").decorate #-> "abc@def"
```


surround_quoteとか、gsub_space_to_atmark は文字列を弄っているだけだから、String を拡張したら、こんなふうにかけるのに....

```string.rb
class String
  def surround_quote
    "'#{self}'"
  end

  def gsub_space_to_atmark
    self.gsub(' ', "@")
  end
end

class TextDecorator
  # String を拡張することで、メソッドチェインが実現
  def decorate
    @base_str.surround_quote.gsub_space_to_atmark
  end
end
```

とは言え、TextDecorator でしか使わないメソッドなのに、 String 全体に影響を与えてしまうのはよろしくない

- 誰かが別の所で同じメソッドで、String を拡張するかも...?
- 他の所で思わぬ影響を与えるかも...?

### そこで Refinements ですよ

```mutable_string.rb

# module MutableString を using している所だけで、下記モンキーパッチが適用される
module MutableString
  refine String do
    def surround_quote
      "'#{self}'"
    end

    def gsub_space_to_atmark
      self.gsub(' ', "@")
    end
  end
end

class TextDecorator
  def initialize(str)
    @base_str = str
  end

  using MutableString

  # String を拡張することで、メソッドチェインが実現
  def decorate
    @base_str.surround_quote.gsub_space_to_atmark
  end
end

# undefined method `gsub_space_to_atmark' for "abc def":String (NoMethodError)
"abc def".gsub_space_to_atmark

```

これなら安心!!

## 参考

- [instance method Module#refine](http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/refine.html)
- [Ruby 2.1 の新機能 Refinements でクラス拡張をしてみよう (フェンリル | デベロッパーズブログ)](http://blog.fenrir-inc.com/jp/2014/07/refine.html)
【AndroidStudio】Failed to complete Gradle Execution

AndroidStudio v0.8.2

アプリが実行できなくなった。
下記メッセージが表示される。

>Failed to complete Gradle execution
Cause:
A fatal exception has occurred. Program will exit

[ここ](https://code.google.com/p/android/issues/detail?id=67946) の通りにGradleの設定を変更したら直った。
File -> Settings -> Gradle
"Gradle VM options:"に`-XX:MaxHeapSize=256m -Xmx256m`と入力する。
配列とポインタに関することまとめ


## 概要
このまとめは個人的に C++ における配列とポインタの扱いについて忘れていた部分や新たに知ったことについてまとめたいと思います。

## 1. char型のアドレスの出力
ある変数のアドレスを取得したい時は基本的に変数名の前にアンパサンド'&'をかけば、その変数のアドレスを出力することが出来ます。

```cpp:code
int x = 2014;
cout << "Address: " << &x << endl;
```

```cpp:Result
Address: 0x7fff5c34998c
```

ところが、char型の場合単純にアンパサンドをつけても、

```cpp:code
char ch = 'c';
cout << "Address: " << &ch << endl;
```
```cpp:Result
Address: c?i?T?
```

うまく表示されません。これは、char型のアドレスを表示しようとすると文字列を表示しようとしてしまうのが原因だと考えられます。文字列を表示するときもcharの先頭アドレスを与えてあげる必要があるので、それと間違ってしまうんですね。なので、

```cpp:code
char ch = 'c';
cout << "Address: " << (void*) &ch << endl;
```

```cpp:Result
Address: 0x7fff5337498f
```

出力する際に(void*)にキャストしてあげることでうまく表示させることが出来ます。

## 2. 文字列リテラルとポインタ
文字列リテラルはダブルコーテーション""で囲むことにより利用することが出来ます。そして、この表現によって文字列の先頭アドレスを取得することが出来ます。

```cpp:code
const char *ch = "literal";
cout << "Address: " << (void*) &ch << endl;
```
```cpp:Result
Address: 0x7fff5fbff888
```

文字列リテラルが文字列の先頭アドレスを返すということはポインタのような操作ももちろん可能です。つまり、

```cpp:code
cout << "ABCの二つ目の文字は: " << *("ABC" + 1) << endl;
```
```cpp:Result
ABCの二つ目の文字は: B
```

こんな直接的な書き方も出来てしまいます。

## 3. ポインタの配列
ポインタの配列に関して少しややこしいと思った部分があったのでまとめます。
ポインタの配列は宣言するとき注意する必要があります。ちょっとした違いが意味の違うポインタの宣言をしてしまいます。

```cpp:declare
int *p[5]; // int型へのポインタの要素数５の配列
int (*p2)[5]; // 要素数５の配列へのポインタ    
```
```cpp
// p はint型へのポインタを５つ格納できる配列
int values[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    p[i] = &values[i];
}
    
cout << "---------- p: output -------------" << endl;
for (int i = 0; i < 5; i++) {
    cout << *p[i] << " ";
}
cout << endl;
    
// p2 は２次元配列
int (*p2)[5];

int array[3][5] = {
    {11, 12, 13, 14, 15},
    {21, 22, 23, 24, 25},
    {31, 32, 33, 34, 35}
};
p2 = &array[0]; // 要素数５の配列のアドレスを格納できる
cout << "---------- p2: output -------------" << endl;
for (int i = 0; i < 5; i++) {
    cout << (*p2)[i] << " ";
}
cout << endl;
```
```cpp:Result
---------- p: output -------------
1 2 3 4 5 
---------- p2: output -------------
11 12 13 14 15 
```

*や[]の演算子の優先順位の関係で、宣言する際に括弧を付けるつけないでポインタの意味が変わってしまうので気をつけましょう。
ここに詳しく書いてあるので参考までに -> [２次元配列とポインタ](http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_04.html)
新しい攻撃手法・DNSサーバーを踏み台とした2段階DDos攻撃

新しい攻撃手法の情報を得たの_〆(・ω・｀ )ｶｷｶｷ

#資料

[日本国内のオープン・リゾルバを踏み台とした DDoS 攻撃発生
に起因すると考えられるパケットの増加について|警察庁 - http://www.npa.go.jp/cyberpolice/detect/pdf/20140723.pdf](http://www.npa.go.jp/cyberpolice/detect/pdf/20140723.pdf)
[オープンリゾルバー～正規キャッシュDNSサーバー経由の2段階DDoS攻撃か？ -INTERNET Watch http://internet.watch.impress.co.jp/docs/news/20140724_659433.html](http://internet.watch.impress.co.jp/docs/news/20140724_659433.html)


#中身

読んでる感じDNSキャッシュポイズニングに似てる感じな気がする。が従来とは違うらしい。

##DNSリフレクション
- Aというサーバーに向けて攻撃をしたい場合BというDNSサーバーに向けて自分の発信元をAと偽装してDNS要求を送るとAに回答が送信される。DNSやNTPは要求と回答の幅(amp)が大きいのでよく利用される
- 参考
 - [情報セキュリティの勉強部屋 http://sc.ipsecdh.net/entry/248](http://sc.ipsecdh.net/entry/248)
 - [■技術解説:「DNS Reflector Attacks(DNSリフレクター攻撃)」について](http://jprs.jp/tech/notice/2013-04-18-reflector-attacks.html)

##DNSキャッシュポイズニング

- DNSキャッシュサーバーにニセのIP⇔hostsのテーブルを送りつける
- 参考
    - [インターネット10分講座：DNSキャッシュポイズニング](https://www.nic.ad.jp/ja/newsletter/No40/0800.html)

##今回の手法

- オープンリゾルバを踏み台としたDDos攻撃
データ量が多くなった時のredisのkeyの探り方

## 概要

redisをproductionで使ってて、データ量が多くなってきたときのkeyのアクセスの仕方について
全てのkeyに
http://redis.io/commands/expire
設定しとけば、いいんですが、できない場合とかやってなかった場合とかでデータ量増えた状態で
特定のkeyの中身を見たいとき

## keyを特定する

### keys

#### 全件 *

これで検索すると、多分、出力が返ってこないので、データが多い時はやめましょう
```
keys *
```

#### 特定のkey

keyが全部わからないけども、途中までわかってて、keysする
データの容量にもよりますが、出力の結果は数秒して返ってきますが、redisで数秒待つとか...

@は変数
```
keys "@アクション名:@id:@イベント名:*"
```

ということで、データの容量が多い時はkeys使うのはやめましょう。

## 計算量を気にする

keysを使うのをやめるという理由に計算量があります。

### 計算量

http://d.hatena.ne.jp/nowokay/20090106


| No. | アルゴリズム | 説明 |
|:-----------|------------:|:------------:|
| 1   | O(1)       | 計算時間がO(1)のアルゴリズムは、処理が入力の量によらない場合です。  |
| 2   | O(log n)   | 計算時間がO(log n)になるアルゴリズムは、処理をひとつ行うたびに入力を何割か減らせるようなアルゴリズムです。入力が増えても計算時間がほとんど増えません。|
| 3   | O(n)       | 計算時間がO(n)になるアルゴリズムは、入力の量だけ時間がかかるアルゴリズムです |
| 4   | O(n log n) | 計算時間がO(n log n)になるアルゴリズムは、そのほとんどがソートを前処理として行います。 |
| 5   | O(n^2)     | 計算時間がO(n^2)になるアルゴリズムは、要素からすべての組み合わせのペアについて調べるようなアルゴリズムです。|
| 6   | O(2^n)     | 計算時間がO(2 ^ n)になるアルゴリズムは、要素を取り出すときのすべての組み合わせについて調べるようなアルゴリズムです。|
| 7   | O(n!)      | 計算時間がO(n!)になるアルゴリズムは、要素の順番のすべての組み合わせを調べるようなアルゴリズムです。| 

### 例えば

http://redis.io/commands/keys
 O(N) 
入力の量(データ量)だけ時間がかかるアルゴリズムです。


## じゃあ、どうするのか

僕の場合ですが、typeしてます

### type

http://redis.io/commands/type
 O(1)
どんなにデータが増えても時間は変わらない

でも、プログラムを見るなりして、keyはわかってる必要があります。

type "hoge_action:478348:hoge_event"

なければ、 none が返ってきます。

### typeが分かってからの値の全取得方法

#### string
 
http://redis.io/commands/get

```
get $redis_key
```

#### hash

http://redis.io/commands/hgetall

```
hgetall $redis_key
```

fieldまでわかるなら
http://redis.io/commands/hget

#### list
  
http://redis.io/commands/lrange
          
```
lrange $redis_key 0 -1
```

#### set

http://redis.io/commands/smembers

```
smembers $redis_key
```

#### sorted_set (zset)

http://redis.io/commands/zrange

```
zrange $redis_key 0 -1
```
Facebook/twitter ボタン設置方法

#Facebook

##コードをゲット

↓↓
https://developers.facebook.com/docs/plugins/like-button
↑↑

URL、レイアウト等を選択して、get codeを押すと
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/5f67219f-82a8-1455-7262-2f43b665704b.png)

こちらのコードをコピペ
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/99a54675-7bf8-fc85-a756-9b13bade5cc3.png)

## app idの取得方法

https://developers.facebook.com/apps

create new appを押す
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/1d6e1ddb-a8a5-f9ac-4ab4-cfa67e0e6aab.png)

サイトの名前を入力してカテゴリを選択してアプリケーションを作成ボタンを押す。
![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/a571ff03-cddb-f801-0964-2667d940b064.png)

セキュリティチェック
![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/3eb524f8-a414-11f3-89da-ebaeb7ac0e42.png)




# twitter
##コードをゲット
↓↓
https://about.twitter.com/ja/resources/buttons#tweet
↑↑

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/518e06cd-b1b7-afee-01b2-517b640df972.png)


#サンプル

```
<html lang="ja">
<meta charset="UTF-8">
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
<title>tea concierge</title>
<meta name="viewport" content="width=device-width">
<meta property="og:title" content="タイトル">
<meta property="og:type" content="website">
<meta property="og:url" content="ツイートしたいURL">
<meta property="og:description" content="サイトの説明">
<meta property="og:site_name" content="サイトタイトル">
<meta property="og:image" content="いめーじ">
<meta property="fb:app_id" content="facebookで取得する" />
</head>
<body>

<!-- 共有 -->
<div class="like clearfix">
<div class="wp_social_bookmarking_light">
<div>
<div class="fb-like" data-href="https://developers.facebook.com/docs/plugins/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
</div>
<div>
<a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</div>
</div><br class="wp_social_bookmarking_light_clear">
</div>
<!-- 共有 END-->

<!-- facebook area -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<!-- facebook area END-->

</body>
</html>

```
Sql2oでアンダースコアが含まれたカラム名とPOJOのマッピング方法

Sql2oで、update_at のようにアンダースコアが含まれたカラム名をPOJOの updateAt のようなプロパティ名にマッピングするには、2通りの方法がある。

## 方法1 #addColumnMapping(String, String)

Query#addColumnMapping(String, String) メソッドを使って、カラム名とPOJOのプロパティ名をマッピングする。

```java
try (Connection con = sql2o.open()) {
  List<Foo> foos = con.createQuery(sql)
    // 第1引数はカラム名、第2引数はプロパティ名
    .addColumnMapping("update_at", "updateAt")
    .executeAndFetch(Foo.class);
}
```

カラム名の規約が統一されているのならば、Sql2oオブジェクトにあらかじめマッピングを登録しておける Sql2o#setDefaultColumnMappings(Map<String,String>) メソッドで指定しておけば、より楽かもしれない。

```java
// PostgreSQLの場合
sql2o =  new Sql2o(datasource, new PostgresQuirks());

// あらかじめ定義しておきたいマッピング
Map<String, String> colMaps = new HashMap<String,String>();
colMaps.put("update_at", "updateAt");

// マッピングの設定
sql2o.setDefaultColumnMappings(colMaps);
```

## 方法2 #setAutoDeriveColumnNames(boolean)

Query#setAutoDeriveColumnNames(boolean)メソッドを使うと、自動的にアンダースコアを考慮してマッピングしてくれる。

```java
try (Connection con = sql2o.open()) {
  List<Foo> foos = con.createQuery(sql)
    .setAutoDeriveColumnNames(true)
    .executeAndFetch(Foo.class);
}
```

アンダースコアの考慮は[UnderscoreToCamelCase.class](https://github.com/aaberg/sql2o/blob/sql2o-1.5.1/core/src/main/java/org/sql2o/tools/UnderscoreToCamelCase.java)のconvertメソッドで処理されている。

いちいちマッピング書かなくて楽なんだけど、Sql2oオブジェクトであらかじめ設定しておけるメソッドがないのは何でだろう？

## 参考文献
- [Column name mappings](https://groups.google.com/forum/#!searchin/sql2o/ignore/sql2o/3H4XJIv-i04/hhfDMJJ84ZsJ)
- [Sql2o:Column mappings](https://github.com/aaberg/sql2o/wiki/Column-mappings)
[mean] Mac OSX Yosemite に mean stack 環境を構築

# 前置き

ちょっとしたアプリ作りたくなったのですが、
JavaScriptでいろいろしたかったこともあり、
MongoDB + Express + Angular.js + Node.js の mean stack 環境でやってみることにしました。

# 構築

[公式サイト](http://mean.io/#!/docs
)を見ればすぐできそうな雰囲気を得られました。

```shell-session
$ sudo npm install -g meanio@latest  // Get the mean cmdline
$ mean init myApp                    // create your first app
$ cd myApp && npm install            // Install dependencies
$ grunt                              // Launch mean
```

![Screen Shot 2014-07-25 at 15.42.49.png](https://qiita-image-store.s3.amazonaws.com/0/18705/d5197ef7-6807-0f0a-7a32-9a0ed44b1280.png)


ブラウザで
localhost:3000
をチェックします。

うまくいってれば、以下の画面が表示されます。

![Screen Shot 2014-07-25 at 17.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/18705/04960127-f730-beed-165b-7c6f10414649.png)


私の場合はMacにMongoDBを入れていなかったので、怒られました。
![Screen Shot 2014-07-25 at 15.46.31.png](https://qiita-image-store.s3.amazonaws.com/0/18705/d614a328-d88a-1553-a5a8-d34c713a46ce.png)



# 前提条件
## Node.js
入っていない場合にはインストール。
http://nodejs.org/ 

## NPM
Node.js のパッケージマネージャーです。
Node.js をインストールしたら、だいたい一緒に入ります。

## MongoDB 
デフォルトのポートが 27017 で動く NoSQL です。
以下からインストールしてください。
http://www.mongodb.org/downloads

homebrewからインストールできます。

### Yosemite では Homebrew が使えない (2014/7/25)

トラップでした。Yosemite では Homebrew が使えなくなっていました。
rubyのバージョンの問題のようで。

```shell-session
$ brew
/usr/local/bin/brew: /usr/local/Library/brew.rb: /Users/alex/.rvm/rubies/ruby-1.9.3-p448/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 26: /usr/local/Library/brew.rb: Undefined error: 0
```

[brew を使えるようにする方法](http://jcvangent.com/fixing-homebrew-os-x-10-10-yosemite/)もある様です。

### 今回はMongoDBをマニュアルでインストールすることにしました。

```shell-session
$ curl -O http://downloads.mongodb.org/osx/mongodb-osx-x86_64-2.6.3.tgz
$ tar -zxvf mongodb-osx-x86_64-2.6.3.tgz
$ mkdir -p /usr/local/mongodb
$ cp -R -n mongodb-osx-x86_64-2.6.3/ /usr/local/mongodb
````

### コマンドを使える様にするために、以下の行を追記します。

```vim
$ vim ~/.zshrc
----

### MongoDB
export PATH=$PATH:/usr/local/mongodb/bin
````

### MongoDBの動作に必要な/data/dbとログディレクトリを作ります。

```shell-session
$ mkdir -p /usr/local/mobgodb/data
$ mkdir -p /usr/local/mongodb/data/db
$ mkdir /usr/local/mongodb/logs
```

### 起動コマンド

```rb
$ /usr/local/mongodb/bin/mongod --dbpath /usr/local/mongodb/data/db

#バックグラウンドで起動
$ /usr/local/mongodb/bin/mongod --fork --logpath /usr/local/mongodb/logs/mongodb.log --logappend --dbpath /usr/local/mongodb/data/db
```

## Bower
npmでインストールできます。

```shell-session
$ npm i -g bower
```

# 参考

http://mean.io/#!/docs
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/
http://tweeeety.hateblo.jp/entry/20140213/1392301261
[C#]ちょっとしたストレスを解消してくれるExtensions

# ちょっとした面倒くささ

C#は良い言語です。強い型付けを持ちつつ、型推論で何も考えずにかける強さが、良い所。
しかし、そんなC#ですが、
コード書いていて、たまにストレス感じるところがあります。

例えば、

```csharp
var value = "hoge"; 
if(String.IsNullOrEmpty(value))
  value = "empty";
```

や

```csharp
var dict = new Dictionary<string, int>() { 
 { "1", 1 },
 { "2", 2 },
 { "3", 3 },
};
var value = 0;
dict.TryGetValue("0", out value);
```

のようなやつ。

よく書くものなだけに、ちょっとしたストレスが、容赦なく作業効率を落としてくれやがります(´・ω・｀)
こういうちょっとしたストレスは、C#3から対応されている、__「拡張メソッド」__を使って、解消することができます。
今回は、積極的に拡張メソッドにするといいよ、というお話。

## 拡張メソッドを作る
最初の例では、こんなものを作って対応します

```csharp
public static class StringExtensions {

  public static bool IsNullOrEmpty(this string source) {
    return String.IsNullOrEmpty(soruce);
  }
}
```

このような拡張を、usingしてあげると、このように書けるようになります。

```csharp

var value = "hoge";
hoge.IsNullOrEmpry();

// もちろん直接もいける
"hoge".IsNullOrEmpty();
```

拡張メソッドを書くときは必ず、
__staticなクラスに__、__staticなメソッド__、且つ、最初の引数に__this__をくっつけて書く
必要があります。

くっつけた__this__。このthisがくっついている引数は、
拡張メソッドを呼び出したインスタンスを、暗黙的にバインドする動きをします。
つまり、呼び出したインスタンスそのものが、拡張メソッドの第1引数にあてがわれて動作するわけです。

この特性を使って、ちょっとしたストレスを感じるコードを、ガンガン拡張メソッドに切り出していく。
そうすると、メソッドチェーンで気持よ〜〜〜く書けるようになります。らくちん。


## あるとオススメ

便利な拡張メソッドは、大量にあるのですべて紹介できませんが、
自分がよく使うものだけ、少しだけ紹介します。


### Dictionary.TryGetValue
TryGetValue()をラップするものです。outが気持ち悪いので、拡張メソッドでラップしてあげます。

```csharp
public static class DictionaryExtensions {
 
  public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> source, TKey key
  ) {
    if(source == null || source.Count == 0)
      return default(TValue);

    TValue result;
    if(source.TryGetValue(key, out result))
      return result;
    return default(TValue);
  }
}
```

```csharp
var dict = new Dictionary<string, int>() { 
 { "1", 1 },
 { "2", 2 },
 { "3", 3 },
};

// これが、
var value = 0;
dict.TryGetValue("0", out value);

// こう書ける
dict.GetValueOrDefault("0")
```

スッキリ!!


### String.Formats

文字列操作は、出力に、ログに、いろんな場所で使います。
頻度が高い文、毎度毎度、__String.Format()__を書くのが面倒です。
とにかく面倒なので、拡張メソッドにしてしまいます。

```csharp
public static class StringExtensions {

  public static string Formats(this string format, params object[] values) {
    return String.Format(format, values);
  }
}
```

```csharp
Console.WriteLine("write {0}.".Formats(1));
```

スッキリ!!


##おわりに
拡張メソッドを使って、スッキリ、コーディング楽しみましょう。
sed - マッチした文字列を再利用する - 行末に文字列を追加する

ほんとよく忘れるのでメモしておきます。


## sed ##

- マッチした文字列を再利用する
  - \\(対象文字列\\) とするとマッチした文字列は \1 \2.. と指定すると再利用できる

```test.txt
aaaa
bbbb
```

```bash
sed -i -e "s/\(^bb.*$\)/\1 add a postscript/g" test.txt
```

sed実行後

```test.txt
aaaa
bbbb add a postscript

```
備忘録Lua

# etc

* はじめて代入を行う前の変数の値は nil

* 関数の仮引数はローカル関数の一種

* Luaの文法では、文字列1つだけを与えて関数を呼び出す時は、()を省略できる
    * ``require "common.lua"`` のように書ける
    * ``print testprint .. "OK"`` のようなものは駄目。
        * 文字列を連結したりする時は、``print( testprint .. "OK" )`` のように、()でくくる必要がある


# ゼロ埋め

「ゼロパディング」「ゼロサプライ」などと呼ばれているもので、
数値の表記桁数を揃えるのに 0 を書き加える。

    string.format( "%04d", num )

↑で num = 53 の時 0053 と出力する。


# 入門Luaから覚え書き

## 文字列は '' "" [[]] で囲む

* '' "" でのエスケープ文字は \
* [[]] は、文字列中に ' や " が入っている時などに用いると便利
    * [[]] では、エスケープ文字が無効
    * [[]] 内で途中改行をすると、途中改行も含む


## ; は行末を表す
1行に複数のコマンドが書ける

## インクリメントは x = x + 1
* Ruby のように ``x += 1`` とは書けない
* C のように ``x++`` とは書けない

## for ループ変数 = 初期値,最終値,増分値 do
* 増分値は負も可能
* ループ変数は、forループ内のみで使えるローカル変数

## テーブルには関数を入れられる
table.maxn は、maxnがテーブルtableの1要素になる、ということ。

## Luaではfalseとnil以外はすべて真
-1も0も真。

## or を使ったデフォルト値の代入

    a = a or 10

a が nil か false の時、10が代入される

## local を宣言していない変数は、すべてグローバル変数になる

## 計算や結合で強制変換されるのは数値と文字列だけ
テーブルなどは ``tonumber()`` や ``tostring()`` で変換する

## #は長さオペレータ
* #配列名 で、配列の要素数を返す
    * ``table.maxn(配列名)`` と書かなくても良い
* #文字列変数名 で、文字列の長さを返す
    * ``string.len(文字列変数名)`` と書くのと同じ

## テーブルは番号とフィールド名を混在できる
``{ 123, 45, score={5,6}, date="2014-01-03" }`` は
``{ [1]=123, [2]=45, score={5,6}, date="2014-01-03" }`` と同じ。

## テーブルそのものを比較する
テーブルの中身が同一だとしても「別のテーブル」と認識されて、
別ものと判定される。

## 名前なし関数が作れる
テーブルの1フィールドで作ったりできる。
しかし、名前なし関数は、まず使わないとは思う。

## 引数が可変個の関数が作れる
function f(...) のように、 ... は可変個を表す。
関数内で local arg = { ... } とすることで、引数を全部受け取れる。

## 複数の値を返すのに、スタックが用いられている
* i,j=test() で、test内でreturn 1,2 とすると、i=1,j=2になる
* x,y=1,2 だと、x=1,y=2になる
* a,b=b,a で、変数間の値入れ替えができる

## 新しいデータ型を作る
* XY(1,2) のように作れる
* テーブルかCのuserdata型で作ることができる
* 入門Luaでは、メタテーブルを作るのに、メタメソッドとコンストラクタを用意している

## 代入文の結果は値として使えない
Luaの = による代入は、1つの実行単位でしかない。


# プログラミング言語Lua公式解説書から覚え書き

## table.maxn(a) と #a は異なる
* maxn は最大インデックスを返す
* #a は入っている個数を返す

## 文字列の比較演算は、アルファベット順に比較
"acai" < "acorde" のような比較ができる。

## 複数の変数に値を代入する際は a,b,c=0,0,0 とする
a,b,c=0 は a=0;b=nil;c=nil になる。

## pairs() forループでフィールドをすべて検査
    for i in pairs(test) do print(i) end

## ipairs() forループでテーブルを順に検査
    for i,v in ipairs(test) do print(v) end
UIImageViewでUIViewContentModeScaleAspectFillを設定した時に画像が領域外にはみ出てしまう問題

これたぶん常識で今まで知らなかった自分がおかしいのかもなのですが、

プログラム上でUIImageViewを生成した時に、画像をなるべく大きく表示するためにcontentMode = UIViewContentModeScaleAspectFillにするとUIImageViewの領域外に画像がはみ出てしまうことがあります。

![20130828214159.png](https://qiita-image-store.s3.amazonaws.com/0/46923/2f10709a-27b8-3460-6998-d13603eba757.png)
ざっくり図にするとこんな感じ。

長方形の画像を正方形で表示させたい時とかその場合には都度UIImageを正方形にトリミングしてUIImageViewに突っ込むみたいなダルイこ
とをしていたのですが、UIImageViewにありました、綺麗に表示させる方法が・・・。

```objc:
UIImageView *imageView = [UIImageView alloc] init];
imageView.frame = CGRectMake(0,0,100,100);
imageView.contentMode = UIViewContentModeScaleAspectFill;
[imageView setClipsToBounds:YES];
[self.view addSubView:imageView];
```
という感じでsetClipsToBoundsをYESにすれば勝手にやってくれるようです。
なんでこれデフォルトでYESになっていないのか・・・。

ちなみに大量に行うとメモリ的にあまりよろしくないらしいので、可能であればきっちり切り取った元画像を用意しておいた方が良いようです。


参考リンク : [ios - UIViewContentModeScaleAspectFill not clipping - Stack Overflow](http://stackoverflow.com/questions/6638623/uiviewcontentmodescaleaspectfill-not-clipping)
【jQuery】inputにfocusされた時と外れた時の処理

jQueryのメモ。
focusされたときは`.focus`メソッドを使い、focusが外れたときは`.blur`メソッドを使う。

```jquery.js
$(function(){
  $("input").focus(function(){
    $(this).css("background","#b3eaef");
  }).blur(function(){
    $(this).css("background","#fff");
  });
});
```
備忘録Mindtouch

# ページを丸々取り込む

長くなるページは、ページを分けた方がいい。
1ページに収めたいなら、↓のようにして取り込むと良い。

    {{wiki.page{path: "(ページのパス)"};}}

逆に、長いページからセクションのみを取り込むことも可能。

    {{wiki.page{path: "(ページのパス)", section: "(セクション名)" }; }}


# リンク

リンクのURLに #セクション名 を後ろに付けると、セクションへのリンクになる。

日本語が入っている場合は、色々都合が悪い。
``wiki.toc`` で表示させたヘッダリストのリンクをコピーすると確実。


# 自分が見やすい見た目にする

Mindtouch は H2,H3,H4(実際のタグはH3,H4,H5)が見た目の違いが少なく、
章立てしてあるのがわかりにくい。
しかしスタイルシートは管理者しかいじれない。

そこで、スタイルシートの中身を変更できる
Firefox のアドオン Stylish を用いる。
例のスタイルシートは以下の通り。

    @namespace url(http://www.w3.org/1999/xhtml);
    
    @-moz-document domain("wiki-name1"),
                   domain("wiki-name2")
    {
        h3 {
            background-color: #bbbbff;
            padding: 0px 0px 0px 6px;
            border-left: solid 5px #0000ff;
            border-bottom: solid 1px #0000ff;
        }
        h4 {
            background-color: #d8d8ff;
            padding: 0px 0px 0px 8px;
            border-left: solid 3px #8888ff;
            border-bottom: solid 1px #8888ff;
            
        }
        h5 {
            background-color: #e8e8ff;
            padding: 0px 0px 0px 11px;
            border-bottom: solid 1px #8888ff;
        }
    /*    ul li li {
            background-color: #ffffaa;
        }
        ul li li li {
            background-color: #ffffcc;
        }*/
    }


# Firefox だと挙動が変で使いにくい

* ブロック表示にすると、かなりまし
* リストを使っている時に、カーソルを動かすと、勝手に改行が入る時がある
* IE はもっと酷い。Chrome がもっともましな挙動
* Mindtouch のバージョンによって、挙動が異なる
    * 古い方が Firefox で使いやすい
OSXにてrsyncで古いウォークマンとiTunes同期する


誰の役に立つかわからないけれど残しておきます

## 前提
- [古いウォークマン](http://www.sony.jp/walkman/products/NW-A850_series/)をいまだに使っているのだけれど  
  MacOS用の音楽同期アプリケーションが用意されていない  
  MacOSと同期するためには`/MUSIC`フォルダ以下に音楽ファイルをコピーしてくださいとのこと
- つまりディレクトリとハードディスク間の同期をしたい
- めんどうなのでコマンド一発で同期したい

## rsyncインストールする

OSXはデフォルトで`rsync`コマンド使えるのですが
後述する`--iconv`オプションが何故か上手く動かないので
homebrewでrsyncインストールします

```
brew tap homebrew/dupes
brew install rsync
```

## 同期する

以下のコマンドで同期

```
rsync -rv --iconv=UTF-8-MAC,UTF-8 --ignore-existing [コピー元] [コピー先]
```

参考までに私の環境では以下でした

```
rsync -rv --iconv=UTF-8-MAC,UTF-8 --ignore-existing $HOME/Music/iTunes/iTunes\ Media/Music/ /Volumes/WALKMAN/MUSIC
```

以下オプションの説明

|option||
|:--|:--|
|-r|再帰的にコピーする|
|-v|処理中のファイル名を表示|
|--iconv=UTF-8-MAC,UTF-8|文字コードをMacOS標準フォーマットからUTF-8に変換する(これを指定しないと文字化けすることがある)|
|--ignore-existing|すでに存在しているファイルについては無視する|
備忘録サクラエディタ

# Ruby用設定
Rubyに限らず、プログラミング言語向けの各種設定ファイルはあるのに、
本体に設定されていない場合がある。
インストールフォルダの keyword フォルダに、
それぞれの言語ごとの設定方法が *-readme.txt に書かれてあるので、
そちらを参照すること。

# 外部コマンド実行のキーマクロ

    S_ExecCommand('バッチファイルのフルパス', 513, 'バッチファイルが置いてあるフォルダ');

バッチファイルを起動するのに便利。
複数のバッチファイルを続けて起動したい場合は、2つ続けて書く。

引数2つ目の 513 は、
バッチ実行中の文字をサクラエディタの別窓に表示する、などを指定している。
実行動作が気に入らない場合は、
実際にキーマクロ記録してみて、自分に合った動作を確認すること。

また、''の中に円マークを記入する際は、
2つ続けて書くこと(円マークがエスケープシーケンスになっている為)。

複数のバッチファイルを続けて起動させたい場合は…

    S_ExecCommand('test1.bat', 513, 'c:\\temp');
    S_ExecCommand('test2.bat', 513, 'c:\\temp');
    S_ExecCommand('test3.bat', 513, 'c:\\temp');

これを [共通設定]→[マクロ] に登録して、
[共通設定]→[キー割り当て] でキー登録しておくと、至極便利。


# 同梱ヘルプが古い場合がある

例えば、キーマクロの S_ExecCommand は、
新しい引数が追加されて3個になっているのに、昔の2個のまま。
S_ExecCommand は、キーマクロを記録した方が確実。


# 改行で置換する

置換ダイアログで正規表現にチェックを入れ、置換後に\nを記入。
正規表現で検索したくなくても、正規表現にチェックを入れる必要があるようだ。


# 選択行をコメントアウト

http://d.hatena.ne.jp/yatemmma/20110925/p1


# タグジャンプ

共通関数を作る人は重要。
詳細はサクラエディタのヘルプで。

いちいち関数名に function を付けて Grep しなくてもよいので、便利！