OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu にrbenvを使ってrubyとjrubyをインストールする方法

# Ubuntu にrbenvを使ってrubyとjrubyをインストールする方法

## 動作環境について

* Ubuntu 14.04
* [rbenv](https://github.com/sstephenson/rbenv)
* java 1.8.0_31
* [JRuby](http://jruby.org/) 1.7.19


```
lsb_release -a

Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty
```

プロキシの設定については別途まとめたのでそちらを参照のこと

* [JavaエンジニアがUbuntuで設定すべきプロキシ設定まとめ](http://qiita.com/taichi@github/items/5de87bd2f0a90ab55b45)


# git のインストール

```
sudo apt-get install git
```


# rbenv のインストール

## シェルスクリプト群のclone

rbenvはパッケージマネージャからインストールするのではなくGitHubのリポジトリをcloneして使うとよい。

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-default-gems.git  ~/.rbenv/plugins/rbenv-default-gems
git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
git clone https://github.com/rkh/rbenv-update.git ~/.rbenv/plugins/rbenv-update
```
* `ruby-build`はrvmと同じようなinstallサブコマンドでrubyをインストールできるプラグイン
    * ビルド環境の構築はやってくれないので別途作業が必要
* `rbenv-default-gems`は`~/.rbenv/default-gems`ファイルにインストールしたいgemを書いておくと新しいrubyをインストールした時、自動的にインストールしてくれるプラグイン
* `rbenv-gem-rehash`は新しいgemをインストールした時に`rbenv rehash`しなくてよくなるプラグイン
* `rbenv-update`はrbenv及びそのプラグインを`git pull`ではなく`rbenv update`で更新できるプラグイン

他のおすすめプラグインは公式サイトのWikiにあるので適宜入れると良い。

* [Approved plugins](https://github.com/sstephenson/rbenv/wiki/Plugins#approved-plugins)

default-gemsプラグインでインストールgemとしてbundlerを設定しておく。

```
echo 'bundler' >> ~/.rbenv/default-gems
```

## シェルスクリプト群の初期設定

rbenvが動作するために必要な初期化処理を追記する。後でアンインストールする際には削除を忘れない事。

```
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```
ログインしなおすか以下のコマンドを実行してシェルの初期化処理を行う。

```
source ~/.bashrc
```

# Ruby のインストール

ruby-buildではその名前の通りRubyをビルドするので依存ライブラリをインストールする。

```
sudo apt-get build-dep ruby2.0
```
うっかりruby1.9.1やjquery等がインストールされるけど細かい事は気にしないように。


```
rbenv install 2.2.0
```

# JRuby のインストール

## Java8 のインストール

[OpenJDKからjava8がリリースされる](http://openjdk.java.net/install/)までは以下のコマンドでインストールする。


```
sudo apt-get install software-properties-common
sudo -E add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
```
`add-apt-repository`コマンドを実行する際に`-E`を渡しているのは環境変数に設定したプロキシ情報を利用する為。


ライセンスのacceptを自動化するために[debconf-set-selections](http://manpages.ubuntu.com/manpages/hardy/man1/debconf-set-selections.1.html)を使う。

```
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
sudo apt-get install oracle-java8-installer
```

`jruby-launcher`をビルドするためにコンパイラ等をインストールする。
もし、ruby2.0の依存ライブラリをインストール済みなら既に入っている。

```
sudo apt-get install build-essential
```

```
rbenv install jruby-1.7.19
```


# 参考情報

* [Install Oracle Java 8 In Ubuntu Via PPA Repository [JDK8]](http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html)
Mac OS X Mavericksでnokogiriが入らないとき


いくつかの記事がpostされていますが、筆者の場合の解決法を。

##(たぶん)この記事が該当するユーザー
Mountain LionからMavericksにアップデートしたユーザー。

##brewアップデートの前に
```bash
$ brew tap homebrew/dupes
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2
$ brew link --force libxslt
```

##その後brewアップデート
```bash
$ brew doctor
$ brew update
$ brew upgrade
```

特に`brew doctor`に関しては

```
$ brew doctor
Your system is ready to brew.
```

となるまでちゃんとやっつけましょう。

##Command Line Toolsのアップデート
これがキモだったようです。
https://developer.apple.com/downloads/index.action#
で`Command Line Tools (OS X 10.9) for Xcode - Xcode 6.1.1`を入れましょう。

##最後に
```bash
$ sudo gem install nokogiri
Building native extensions.  This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
Installing ri documentation for nokogiri-1.6.6.2
Done installing documentation for nokogiri after 4 seconds
1 gem installed
```

見事に入ってくれました。
直積集合、二項演算

_GitHubに移行します_

## はじめに

この記事では直積集合、二項演算を紹介します。

## 前回の復習

[前回](http://qiita.com/t-mochizuki/items/9147ae0bd6580303035b)は集合、要素、写像、単射、全射を紹介しました。

これらは二つに分類することができます。オペランドとオペレータです。つまり、演算の対象と演算です。

集合、要素は演算の対象で、写像、単射、全射は演算です。

これから紹介する直積集合、二項演算も同じように分類することができます。直積集合は演算の対象で、二項演算は演算です。

## 直積集合

直積集合とは、集合Aの要素aと集合Bの要素bをペア (a, b) にしたモノを要素とする集合です。

馴染みがある自然数を用いて、集合Aと集合Bが自然数である直積集合を見てみましょう。

集合Aと集合Bが自然数である直積集合には、どのような要素があるでしょうか？次のような要素があります。

```
(1, 1) (1, 2), (1, 3) ...
(2, 1) (2, 2), (2, 3) ...
(3, 1) ...
...
```

ここで気を付けて欲しいところは (1, 2) と (2, 1) が別物だというところです。つまり、順番も大切だということです。

## 二項演算

次に、二項演算を紹介します。これは馴染みがあるかと思います。例えば、四則演算などがそれです。

しかし、馴染みがあることにこそ注意が必要です。

二項演算とは、集合Gと集合Gの直積集合を集合Gに変換するモノです。一見簡単そうです。

まず、二項演算にならないモノを見てみましょう。

集合Gが自然数で、二項演算が足し算の場合です。足し算が二項演算子であれば、自然数を用いた直積集合は自然数になるはずです。ちょっと確認してみましょう。

``` 変換前.txt
(1, 1) (1, 2), (1, 3) ...
(2, 1) (2, 2), (2, 3) ...
(3, 1) ...
...
```

``` 変換後.txt
2 3 4 ...
3 4 5 ...
4 ...
...
```

(1, 1)を変換すると2になります。おっと、自然数の要素1がありません。自然数を用いた直積集合を足し算で変換すると、自然数に含まれるべき要素1を含まない集合に変換されてしまいます。したがって、自然数を用いた直積集合において足し算は二項演算ではありません。

次に、二項演算になるモノを見てみましょう。足し算の代わりに掛け算を確認します。

``` 変換前.txt
(1, 1) (1, 2), (1, 3) ...
(2, 1) (2, 2), (2, 3) ...
(3, 1) ...
...
```

``` 変換後.txt
1 2 3 ...
2 4 6 ...
3 ...
...
```

これは大丈夫そうです。したがって、自然数を用いた直積集合において掛け算は二項演算です。

## あとがき

まだ定義の話なのですが、結構、難しいですよね。今回紹介した二項演算が写像であるか？単射であるか？全射であるか？それらをきちんと把握しておきたいですね。

このような感じで数学の記事をなるべく簡単な言葉で書いてみようと予定しています。

間違いに気付きましたらコメントなどで教えていただければ幸いです。

## 参考書

- [群・環・体入門](http://www.amazon.co.jp/%E7%BE%A4%E3%83%BB%E7%92%B0%E3%83%BB%E4%BD%93%E5%85%A5%E9%96%80-%E6%96%B0%E5%A6%BB-%E5%BC%98/dp/4320015959)
ゴミ箱に入れないファイル削除はShift+Delだと思ってた？ 実はちょっと違う。

エクスプローラで `Del` を押したらゴミ箱に捨てる、 `Shift`+`Del` で削除、そう思っていたことが私もありました。

正しくは

* `Del` を押したら捨てるファイルのリストアップ開始
* リストアップ完了時点で `Shift` が押されていたら削除、押されていなければゴミ箱へ移動

です。
リストアップに時間のかかる大量ファイル削除のときにあれっとなります。
地理データのKMLファイルをRubyでTSVに変換する

GoogleEarthProから書き出したKMLファイルを、取り扱いやすいTSV形式に変換するサンプルです。

## Rubyコード

```rb
require 'nokogiri'

fields = [:place, :lat, :lon]
print fields.join("\t") + "\n"

kml_file = 'export.kml'
@doc = Nokogiri::XML(File.open(kml_file))
@doc.css('Placemark').each do |placemark|
  name = placemark.css('SimpleData')
  coordinates = placemark.at_css('coordinates')
  lat,lon = coordinates.text.split(',')
  print [name.text, lat, lon].join("\t") + "\n"
end
```

## 実行結果

```bash
$ ruby kml2csv.rb
place	lat	lon
東京都豊島区池袋*丁目*-*-*	139.***0003	35.***36150000002
東京都板橋区板橋2-*-* 	139.***2622	35.***8046
東京都板橋区中丸町*‐* 	139.***2803999999	35.***14079999998
```

## サンプルファイル

今回の対象ファイルのXML構造は次の通りです。
次のような`<Placemark>`の中に元の住所と結果の緯度経度が納められています。
なお、一部`*`で伏せておりますがご了承ください。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">

...snip...

  <Folder id="layer 0">
    <name>test</name>
    <visibility>0</visibility>
    <Placemark>
      <visibility>0</visibility>
      <styleUrl>#pointStyleMap</styleUrl>
      <Style id="inline">
        <IconStyle>
          <color>ffe8e8e8</color>
          <colorMode>normal</colorMode>
          <Icon>
            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
          </Icon>
        </IconStyle>
        <LineStyle>
          <color>ffe8e8e8</color>
          <colorMode>normal</colorMode>
        </LineStyle>
        <PolyStyle>
          <color>ffe8e8e8</color>
          <colorMode>normal</colorMode>
        </PolyStyle>
      </Style>
      <ExtendedData>
        <SchemaData schemaUrl="#S_test_S">
          <SimpleData name="address">東京都豊島区池袋*丁目*-*-*</SimpleData>
        </SchemaData>
      </ExtendedData>
      <Point>
        <coordinates>139.***0003,35.*****150000002,0</coordinates>
      </Point>
    </Placemark>

...snip...
```

## 参考サイト

http://stackoverflow.com/questions/14209033/ruby-nokogiri-converting-kml-to-csv
面倒なgit tagの名前付けをdateコマンドで解決する


結構個人的には面倒だと感じるタグ打ちをお手軽に解決。
ここ最近「これ便利っすよ」って教えることが二回ぐらいあって需要ありそうなのでまとめ

```
$ git tag VERSION-`date +'%Y-%m-%d_%H_%M'`
```

で

```
$ git tag                                                                     
$ VERSION-2015-02-06_15_53
```
イエーイ。平和。

あとは必要ならshellファイルにでもすればよいと思う。

```tagging.sh
git tag VERSION-`date +'%Y-%m-%d_%H_%M'`
git push --tag
```
git pushはお好みで。


[こちらの記事](http://qiita.com/SessionIPA/items/1d079e083e8b327345ff)では日付＋採番を持ってくるということをしているようだ。
個人的にはすごいチーム規模にでもならない限り基本的に時間と分をつければまず衝突することは無いし必要十分かなあと思っている。
Jubatus で記事連動広告を表示したい話

## はじめに

そういえば今更ですが昨年の10月に Jubatus Hackathon #1 に参加してきました。

http://connpass.com/event/8233/

発表時のスライドはこちらに綺麗にまとめていただいているので、ご参考にどうぞ。

http://blog.jubat.us/2014/10/jubatus.html

１日で企画〜実装まで持っていったとは言え、色々雑だったなぁと反省しています。
なので少し補足をしようと思います。

## 作ったもの

ハッカソンの少し前に、国内最大級の広告イベントに行ってきました。それに見事に感化されて、じゃあ広告系のやつを作ろう！と同チームの後輩に言ったらすんなりOKもらったので、それを作りました。

具体的な仕様や想定は以下の通り：

- いわゆる owned media（記事）を持っていて、それにマッチする広告を表示したい
- マッチするとは、記事の内容と広告の内容が類似することをいう
- （仕事上がりで結構つらいのであまり頭を使いたくない）

特に重要なのは一番下の条件で、重みが非常に大きいです。

少し真面目に理由付けをすると、迷ったらできるだけシンプルな構成をとるという自戒があります。
なぜならば、複雑なシステムはメンテナンスコストが増大するからです。
特に機械学習を用いる場合、システムにバグ（や嬉しくない挙動）があったとして、

- ミドルウェアのバグ
- アルゴリズムによる正しい挙動
- 学習データの不足
- 特徴量が不適切
- チューニング不足
- ...

などなど、考慮しないといけないところが多いので、もうこれ以上仕事したくないからです（真面目）。
基本的にエンジニアは楽をするために自動化をするので、仕事が増えたら本末転倒なわけです（？）。

ちなみにコードはそのままだとたぶん動かないですが、github に上がってます。

https://github.com/chase0213/jubatus-hackathon-01

発表時のスライドはこちらです。

http://www.slideshare.net/chisatohasegawa370/jubatus-hackathon-1hiyoshi


## システム構築

github をご覧になった方はお気づきと思いますが、当初は Rails + Elasticsearch + Jubatus の 3サーバ構成をとろうとしていました。
ただ、Elasticsearch の部分が本質的ではなかったので棄却されました。
使いたかった。。。

リクエストの流れは大体以下の通りです。

- Railsサーバ上で owned media（記事）が掲載されている
- 広告は json形式（タイトルと広告の概要文を含む）で、jubatus上で学習
- ユーザーは適当な検索キーワードを入力して、記事を検索する
- Railsサーバは絞り込んだ記事の内容を POST でバックエンドの Jubatus（python + Django で受ける）に送信する
- リクエストを受け取った Jubatusサーバは、recommender を使用して、記事の内容に近い広告記事の id を Railsサーバに返却
- Railsサーバは Jubatusサーバから受け取った id を元に広告を取得し、ユーザーに表示

つまり結局のところ、recommender に突っ込んでるだけです。

それから、記事と広告の類似度を判定するところは、mecab + ipadic を使って形態素解析したもの Jubatus のベクトルコンバータを使って特徴量として保持しています。

http://jubat.us/ja/fv_convert.html

このコンバータが非常に優秀なので特徴量をこね回すところはほとんど何もしていません。
なのでノイズまみれになってあまり精度が出ないのですが、この件に関しては後述します。

## デモ

AWS上にデプロイしてデモをしました。
ただそれなりのスペックのマシンを使ったので、今は（金銭上の理由で）止めてしまっています。
適当にコードをいじったらローカルでも動くので適当にいじってください。

## 構想

学習という学習の部分は、広告を動的に追加できるところで、あまり学習器の旨味を出せませんでした。
普通、機械学習って言えば使われる度に賢くなるというところを想像する方が多いと思いますので、その部分について簡単に意見を書いておきます（コードは書きません、悪しからず）。

まず、広告系で学習器を使うと言えば、実際にクリックされたものとそうでないものとでインプレッション率に差を付けるところだと思います。
つまり、良くクリックされる記事と広告の組み合わせに対しては、インプレッションを多めにして、そうでないものに対しては気まぐれにたまに表示する、ということです。

実際には作っていないのですが、classifier（分類器）を使ってできそうだと思っています。  
具体的には、検索システムで絞りこまれた記事の内容と、クリックされた広告の内容の UNION をとって、クリックされたというラベル付きで classifier に突っ込んでおきます。
同様にして、クリックされなかったものに対しても記事と広告の UNION をクリックされなかったというラベルつきで保存しておくのですが、ここで 1点注意が必要です。

```
あるリンクがクリックされなかったとしても、ユーザーがそれに対して興味がないと判断するのは早計である。
なぜならば、多くの場合ユーザーは、他の多くの選択肢を提示されており、
そのリンクに対して興味がないことを能動的に示したわけではないからである。
```

なんか引用っぽくしましたが、私見です。
裏を返せば、クリックしたという情報はクリックしなかったという情報よりも強く扱われるべきです。

というわけで、この辺りを統計的にうまいことチューニングして classfier に突っ込んで 2値分類させれば、ユーザーがその組み合わせでクリックしそうかどうかを予測できます。
その値を上段（recommender）に返して、係数として上手く反映させると、たくさんクリックされる組み合わせはより多く表示されるようになります。

## 終わりに

最後の段落は机上の空論なので、落とし穴はそこら中に散らばっていると思います。
それから、上の方で「ノイズまみれ」と表現しましたが、これはある程度許容すべきです。
なぜならば、全くノイズの無い広告はユーザを退屈させるからです（広告は専門外なのであまり深く言及することは避けます）。
Jubatus で facebook への不正ログインを検知したい話(1)

前回、 [あまりにも有益でない classifier](http://chase0213.hatenablog.com/entry/2014/07/12/135747) を作ったので、もう少し使えるものを作ります。

facebook のデータダウンロード
--------------------------

[facebook](https://www.facebook.com) で、右上（2014年7月現在）にある「▼」マークをクリックして、
「設定」の項目を表示すると、「一般アカウント設定」の下の方に「Facebookデータをダウンロード」というリンクがあります。
これをクリックして認証とかを色々すると、自分の今まで facebook にあげたデータが htm形式でダウンロードできます。
軽い気持ちでこれをダウンロードしてみたんですが、正直クリティカルな情報が多すぎて若干引きました。
こんなデータを使ってレコメンダーとか作ったら、さぞかし精度の高いものができるのだろうなというのを感じています。

security
-------

それで、今回の話は、上でダウンロードしたデータの中に、「セキュリティ」という項目があり、
facebook上で誰がどこからこのアカウントにログインしたか、などがわかるので、
これを使って不正アクセスを見抜こうというものです。

使用するのは相変わらず [Jubatus](http://jubat.us/ja/index.html) です。
異常値検知のための、 [jubaanomaly](http://jubat.us/ja/api_anomaly.html) という API が用意されているので、これを使います。

configration
-----------

Jubatus server の設定ファイルはこちらです。
https://github.com/chase0213/anomal_facebook_activity/blob/master/lof.json

基本的にサンプルそのままなので、特に説明することはないです。
サンプルをそのまま流用しても、ある程度使えるものが作れるのも Jubatus の良いところです。

今回は「Jubatus で〜 (1)」 なので、(2) を公開するときにはこの辺りのチューニングをちゃんとやっていると思います。

pre-processing
-------------

facebook からダウンロードしてきたデータは、htm形式でマークアップされているので、適宜変形します。
今回は、適当に pythonスクリプトを作成して変形しました（python 2.6）。
https://github.com/chase0213/anomal_facebook_activity/blob/master/data/trim.py

（string_rules とかに書いても良いのですが、もう少しちゃんと整形する必要があったので）

anomaly detection
----------------

データの準備ができたら、それを Jubatusサーバに渡して、異常度を計算してもらいます。

```
client = jubatus.Anomaly(HOST,PORT,NAME)
```

として Jubatusサーバを起動しておいて、

```
ret = client.add(datum)
```

としてデータを追加します。
datum は、jubatus.common.Datum形式のデータです。
そうすると、ret にはそのデータの id と異常度が返ってきます。
最初はこの client.add(Datum) の返り値を見て、ちゃんと 1.0 付近にデータが分布していることを見たほうが良いです。
その中で、1.0 から明らかに離れているものがあったら、そのデータを注視してみてください。
不正アクセスの可能性があります。

それで、ある程度データを Jubatusサーバに蓄積したら、
試しに普段と全然違うデータを与えてみます。

```
anomal_datum = Datum({
    "activity": "DELETE",
    "time":     "2014年7月15日 17:59 UTC+12",
    "ip_address": "127.0.0.1",
    "brawser": "IE6",
    "cookie": "???"
})
```

データを定義したら、Jubatusサーバに異常度を計算させます。
ここでは、データを登録せずに異常かどうかだけ見て欲しいので、client.add の代わりに client.calc_score を使います。

```
anomality = client.calc_score(anomal_datum)
```

calc_score は float値を返り値として持っているので、煮るなり焼くなり好きにしてください。

「普段のデータ」も見せられたら良かったのですが、自ら anomaly access を増やすことになるので割愛します。

まとめるとこんな感じになります。
https://github.com/chase0213/anomal_facebook_activity/blob/master/anomaly.py

それで、試しに実行してみた結果がこちらです。

```
$ python anomaly.py
anomality(anomal datum): 2.33819794655
anomality(nomal datum): 0.999999880791
```

2行目が上で定義した異常なデータを与えたもの、3行目が「普段のデータ」を与えたものです。
異常なデータに関して、異常度が明らかに大きくなっています。
たぶん、統計的な検定とか閾値とか設定してアラートをあげるようにしたら良いのだと思います。

以上、前回よりも少しだけ有益な Jubatus を使ってみる話でした。
次回はこれをもう少し真面目にチューニングしたいと思います。

余談ですが、「Jubatus Anomaly」で Google検索したときに、古い API用のページがヒットしている気がします。
バージョンによって API が上手く動かなかったりする（今回しました）ので、気をつけてください。
TypeScript extendsの注意点

なれないうちは継承を利用しているとたまに下記のようなエラーをみかけることがあるかと思います。

Uncaught TypeError: Cannot read property 'prototype' of undefined

出力したJSをちゃんと眺めるとわかるのですが、ロードする順番が親より先に子をよんでしまった場合に発生します。

```test.ts
//親より先に子がロードされる。
export class childView extends Backbone.View<Backbone.Model>{
}

export class pareView<TModel extends Backbone.Model> extends Backbone.View<TModel>{
}
```

extendsで指定しているsuperClassが参照できないためprototypeの参照エラーが起きているというわけです。

上下逆の場合はわかりやすいのですが親を別ファイルに定義している場合は気づきにくいです。

別ファイルの場合は子クラスを定義したファイルの上に親ファイルを指定しないと読み込み順が保証されません。


またTypescriptはoutオプションを指定すると依存関係を解決して1ファイルに結合してくれる、というありがたいオプションがあります。

```shell-session
tsc --out result.js ./*.ts
```

上記のようにすると結合してくれます。

結合される順番が保証されていないので継承するreference pathを指定しないと
子のクラスが先に参照され、さきほどと同じエラーがでる場合があります。

reference pathを指定したほうが無難です。
（指定がなくてもbuildは通ります。）

```child.ts
/// <reference path="pare.ts" /> 
//親より先に子がロードされる。
export class childView extends Backbone.View<Backbone.Model>{
}
```

```pare.ts
/// <reference path="../../../extra/d/backbone.d.ts" />
export class pareView<TModel extends Backbone.Model> extends Backbone.View<TModel>{
}
```
Grape Swaggerでドキュメントが表示されない問題


https://github.com/tim-vandecasteele/grape-swagger
swagger_docがNot Foundだったり一部APIが表示されなかったりいくつかハマったのでメモ。


## バージョン指定してる時

http://localhost:3000/v1/swagger_doc

``` ruby
add_swagger_documentation api_version: "v1"
```

## ベースURLを変更してる時

http://localhost:3000/api/swagger_doc

``` ruby
add_swagger_documentation base_path:"/api"
```

## パラメータ付きのAPIしか表示されない時

* grapeのコードのresource "***" 以下にもformatを指定する。
* もっと良い方法があるのかも。

``` ruby
  class API < Grape::API
	format :json
	...
	...
    resource "aaa" do
	  format :json
	...
	...
	resource "bbb" do
      format :json
	...
	...

```
railsでゴールページに直接訪問されてコンバージョン増えたと喜ばないための1行

ウェブサイトを運営していて「やった、コンバージョンが爆裂した！」

と思っていたらbotがthanksページに大量に訪問していたり、コンバージョンページをブックマークしているユーザーがいてコンバージョンが増えていた事、一度はありますよね？

thanksページに直接URLに訪問された場合、他ページにリダイレクトすれば良いですが、同じURLのままエラーページを返すとGoogleAnalytics上でコンバージョンとして扱われます。

ここでは簡易的に、railsでエラーページを表示しているのにコンバージョンになる事を防ぐスクリプトを説明します。

先頭の1行がエラーでかつゴールページの判定をしている箇所です。

```html+erb

<% if response.code.to_s != "200" && (request.original_url =~ /\/thanks/) != nil %>
<!-- NOTHING -->
<% else %>
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'xxxxx', 'auto');
  ga('send', 'pageview');

</script>
<% end %>
```

ステータスコードが200（OK）以外で、さらにURLが/thanksに一致すればgoogle analyticsのタグをHTMLに含めません。

ステータスコードをto_sして"200"と文字列にそろえて比較しています。

目標到達プロセスを設定していても、ゴールページのURLでページが表示されるとコンバージョンにカウントされます。それを水際で回避するためのものです。
23分クッキング: awk のようなものを作る

https://github.com/guicho271828/awklike

`#!/usr/local/bin/ros` でそのまま通るはずと思っていたんですがそう簡単にはいかないようで。snさん今度使い方教えてください。

使用例:

```lisp:example.lisp
;; cat data | /usr/local/bin/sbcl --load example.lisp -
;; /usr/local/bin/sbcl --load example.lisp data

(ql:quickload :awklike)
(use-package :awklike)

(awk BEGIN
  (print (cdr sb-ext:*posix-argv*))
  (print "hello!"))

(awk |-data|
  (print $2))

(main (cdr sb-ext:*posix-argv*))
(exit)
```

```text:data
2010-data 100
2011-data 110
2012-data 120
2013-data 130
2014-data 140
```

```text:output
("-") 
"hello!" 
"100" 
"110" 
"120" 
"130" 
"140"
```

実装:

```lisp
#|
  This file is a part of awklike project.
  Copyright (c) 2015 Masataro Asai (guicho2.71828@gmail.com)
|#

(in-package :cl-user)
(defpackage awklike
  (:use :cl :optima :optima.ppcre :alexandria :iterate :cl-ppcre :lisp-namespace)
  (:export
   #:$0
   #:awk
   #:main
   #:BEGIN
   #:END
   #:UNBOUND-MATCHER
   #:SYMBOL-MATCHER
   #:MATCHER-BOUNDP
   #:matcher))
(in-package :awklike)

;; blah blah blah.

(define-namespace matcher (function (string list) t))

(eval-when (:compile-toplevel :load-toplevel :execute)
  ;; CLHS says CALL-ARGUMENTS-LIMIT is larger than 50
  (defvar *max-column* 50)
  (defmacro define-$-macros ()
    `(progn
       ,@(iter (for i from 1 below *max-column*)
               (for sym = (symbolicate "$" (princ-to-string i)))
               (appending
                `((define-symbol-macro ,sym
                      (nth ,(1- i) awk-arguments))
                  (export ',sym))))))
  (defmacro awk (key &body body)
    `(setf
      (symbol-matcher ',key)
      ,(match (symbol-name key)
         ((or "BEGIN" "END")
          `(lambda ($0)
             (declare (ignorable $0))
             (let ((awk-arguments (split "\\s+" $0)))
               (declare (ignorable awk-arguments))
               ,@body)))
         (regex
          `(lambda ($0)
             (declare (ignorable $0))
             (when (scan ,(format nil ".*~a.*" regex) $0)
               (let ((awk-arguments (split "\\s+" $0)))
                 (declare (ignorable awk-arguments))
                 ,@body))))))))

(define-$-macros)

(awk BEGIN)
(awk END)

(defun main (&optional (in-files '("-")))
  (iter (for in in in-files)
        (match in
          ("-"
           (read-loop *standard-input*))
          ((string)
           (with-open-file (s in)
             (read-loop s))))))

(defun read-loop (s)
  (funcall (symbol-matcher 'begin) nil)
  (iter (for line = (read-line s nil nil))
        (while line)
        (search-match line))
  (funcall (symbol-matcher 'end) nil))

(defun search-match (line)
  (iter (for (key fn) in-hashtable *matcher-table*)
        (unless (or (eq key 'begin) (eq key 'end))
          (funcall fn line))))
```
ssh してコマンド実行する definitions

作ってしまった… 

```ruby:definitions/execute_on.rb
class ::Chef
  class Definition
    # execute command on a host via ssh
    #
    # HOW TO USE:
    #
    # 1)
    #
    #     execute_on "#{name}" do
    #       host "#{host}"
    #       command "#{command}"
    #     end
    #
    # 2) notifies must specify `execute` not `execute_on`
    #
    #     cookbook_file "/tmp/foo" do
    #       source "tmp/foo"
    #       notifies :run, "execute[#{name}]"
    #     end
    #     
    #     execute_on "#{name}" do
    #       host "#{host}"
    #       command "#{command}"
    #     end
    #
    # OPTIONS:
    #
    # Other options are same with `execute` resource.
    # See https://docs.chef.io/resource_execute.html
    module ExecuteOn
      # ssh command
      def ssh_command
        @ssh_command ||= [
          'ssh -S none -T -n',
          '-o BatchMode\ yes',
          '-o ConnectTimeout\ 5',
          '-o StrictHostKeyChecking\ no',
          '-o UserKnownHostsFile\ /dev/null',
          '-o LogLevel\ ERROR',
        ].join(' ')
      end
      module_function :ssh_command

      # build ssh command
      #
      # @param [String] ssh_command Default is self.ssh_command
      # @param [String] host
      # @param [String] command
      # @return [String] built ssh command
      def build_command(ssh_command: nil, host: , command: )
        ssh_command ||= self.ssh_command
        "#{ssh_command} #{host} #{Shellwords.escape(command)}"
      end
      module_function :build_command
    end
  end
end

opts = {
  :ssh_command => ::Chef::Definition::ExecuteOn.ssh_command,
  :host => nil,
}

define :execute_on, opts do
  raise ArgumentError, "`host` is missing for execute_on" unless params[:host]
  name = params[:name]
  command = params[:command] || params[:name]
  ssh_command = params[:ssh_command]
  execute_params = params.dup.tap do |params|
    params.delete(:host)
    params.delete(:name)
    params.delete(:commond)
    params.delete(:ssh_command)
  end
  command = command.call if command.is_a?(Chef::DelayedEvaluator)
  execute_params[:command] = ::Chef::Definition::ExecuteOn.build_command(
    ssh_command: ssh_command,
    host: params[:host],
    command: command,
  )
  execute name do
    execute_params.each {|key, val| send(key, *val) }
  end
end
```

作ったものの ssh_command を作るヘルパーメソッドだけあれば definitions まではいらない気がしてきている。そもそも chef で他のサーバに入って何かするとかやるなっていう。
rsync する definitions




chef 的には cookbook_file とかでなんとかするべき

```rb:definitions/rsync.rb
class ::Chef
  class Definition
    # rsync files from a host to localhost
    #
    # HOW TO USE:
    #
    # 1)
    #
    #    rsync "#{name}" do
    #      from "#{hostname}:#{from_path}"
    #      to   "#{to_path}"
    #    end
    #    
    #    rsync "#{name}" do
    #      from "#{from_path}"
    #      to   "#{hostname}:#{to_path}"
    #    end
    #
    # 2) notifies must specify `execute` not `rsync`
    #
    #    cookbook_file "/tmp/foo" do
    #      source "tmp/foo"
    #      notifies :run, "execute[#{name}]"
    #    end
    #    
    #    rsync "#{name}" do
    #      from "#{from_path}"
    #      to   "#{hostname}:#{to_path}"
    #    end
    #
    # OPTIONS:
    #
    # * command 
    #   * rsync command with option. Default: /usr/bin/rsync -avzl --exclude=.git --delete -e ssh'
    # * from:
    #   * rsync src.
    # * to:
    #   * rsync dest.
    #
    # Other options are same with `execute` resource.
    # See https://docs.chef.io/resource_execute.html
    #
    # NOTICE:
    #
    # Chef orginally does not support to deploy files from remote hosts via rsync. 
    # That said, rsync way should be removed sooner or later, and using only built-in resouces
    # such as `remote_file`, `cookbook_file`, `template`, `remote_directory`is better. 
    module Rsync
      # default command
      def default_command
        '/usr/bin/rsync -avzl --exclude=.git --delete -e ssh'
      end
      module_function :default_command

      # build rsync command
      #
      # @param [String] command Default is self.default_command
      # @param [String] from
      # @param [String] to
      def build_command(command: nil, from: , to: )
        command ||= self.default_command
        "#{command} #{from} #{to}"
      end
      module_function :build_command
    end
  end
end

opts = {
  :command => ::Chef::Definition::Rsync.default_command,
  :from    => nil,
  :to      => nil,
}

define :rsync, opts do
  raise ArgumentError, "`to` is missing for rsync" unless params[:to]
  name = params[:name]
  from = params[:from] || params[:name] # hostname:/path/to/file
  to   = params[:to]
  from = from.call if from.is_a?(Chef::DelayedEvaluator)
  to   = to.call   if to.is_a?(Chef::DelayedEvaluator)
  rsync = ::Chef::Definition::Rsync.build_command(
    command: params[:command],
    from: from,
    to: to,
  )
  execute_params = params.dup.tap do |params|
    params.delete(:name)
    params.delete(:command)
    params.delete(:from)
    params.delete(:to)
  end
  execute_params[:command] ||= rsync
  # ToDo: find better way to achieve idempotence
  execute_params[:only_if] ||= "test $(#{rsync} -n 2>&1 | wc -l) -gt 4" # assume -v is used
  execute name do
    execute_params.each {|key, val| send(key, *val) }
  end
end
```
Mac のディスプレイに Raspberry Pi のデスクトップを表示したときに LXDE のタスクバーが表示されず、制御不能になった時の対処


#現象
新しいSDカードに raspbian の新しいイメージを焼いて、[いつものように](http://qiita.com/TakeyukiUeda/items/7cc0fc6011cb0448c070) Mac から起動したところ、下図のようになぜかタスクバーが表示されず、コンソールを開くことも何もできません。
![スクリーンショット 2015-02-05 10.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/46544/8ba2fd8e-47e4-2a5d-ee6a-9ab046e0d624.png "スクリーンショット 2015-02-05 10.58.15.png")

よく見てみると、lxsession 起動後に「Config fileがない」と言われています

```bash:
** (lxpanel:2713): WARNING **: Config files are not found.
```

#原因
ググってみると[こちら](http://www.raspberrypi.org/forums/viewtopic.php?f=91&t=28400)がみつかり raspbian のバグとの事、lxde を最初に起動したときに monitor が繋がっていなかった場合に以後、こうなってしまうとのこと

#対処
同じく[こちら](http://www.raspberrypi.org/forums/viewtopic.php?f=91&t=28400)で、以下のようにコンフィグレーションをコピーしなさいとのことなのでコピーして

```bash:
cp -rp /etc/xdg/lxpanel/profile/LXDE/* ~/.config/lxpanel/LXDE/
```
再度 lxession をスタートしたら下図のように正常にタスクバーが表示されました

![スクリーンショット 2015-02-05 10.59.55.png](https://qiita-image-store.s3.amazonaws.com/0/46544/bdd0948e-641b-9712-0997-445aee7cc4e4.png "スクリーンショット 2015-02-05 10.59.55.png")

#感想
すぐに治ってしまうバグでしょうし、条件も限定的だからこれを経験した人はレアな経験ができてラッキーだったと言えるかも。きっと良いことがありそうです
MySQLまとめ　その2

#テーブル定義変更

##列定義変更
alter table tablename add
  newdata1  int8
;
##列削除
alter table tablename drop
  newdata1
;

##テーブル名変更
alter table tablename rename to abc;

#ユーザー作成
CREATE USER user;
CREATE USER user IDENTIFIED BY [PASSWORD] 'password';

#ユーザー削除
DROP USER user;

drop user 'user'@'localhost';

#LIKE検索

##a始まりのもの
select count(*) from tablename where key1 like 'a%';
##a終わりのもの
select count(*) from tablename where key1 like '%a';

#SELECT文
##数値計算
select '123' + 4;     結果　124
##大小比較
select strcmp('123', '456');　結果 -1

#等価結合
select
  test2m.key1,
  code1,
  data1,
  data2,
  data3
from test2m, testm
where test2m.code1 = testm.key1
;
##joinを使用する場合
select
  test2m.key1,
  code1,
  data1,
  data2,
  data3
from test2m inner join testm on test2m.code1 = testm.key1
;
##複数指定する場合
select
  test2m.key1,
  ...
from (test2m inner join testm on test2m.code1 = testm.key1)
  inner join test3m on test2m.code1 = test3m.key1
;

#非等価結合
select
  test2m.key1,
  code1,
  data1,
  data2,
  data3
from test2m, testm
where test2m.code1 like concat(substring(testm.key1, 1, 2), '%')
;
SUBSTRING( 文字列, 開始位置 )
SUBSTRING( 文字列, 開始位置, 文字数 )
SUBSTRING( 文字列 FROM 開始位置 )
SUBSTRING( 文字列 FROM 開始位置 FOR 文字数 )
CONCAT( 文字列1, 文字列2, ・・・文字列N )

#外部結合
select
 test2m.key1,
 code1,
 data1,
 data2,
 data3
from test2m left join testm on test2m.code1 = testm.key1
;

#項目で結合
select * from test2m left join testm
  using (key1);

#同じ名前の列を結合
select * from test2m natural left join testm;

#集計結果の条件指定
select key1, count(*), sum(data1), avg(data1) from testm
  group by key1
  having sum(data1) > 10;

#null検索
select * from testm
  where data3 is null
  order by key1
;
#null以外のもの
select * from testm
  where not data3 is null
  order by key1
;

#複数条件検索
select * from testm
  where (data1 > 10 or data2 > 10) and key1 like 'c%'
  order by key1
;

#URL
http://www.phppro.jp/school/mysql/
一般ユーザでもjqコマンドのPATHが通せる使い方

PATHの書き換えはしなくても良いのです。
ユーザのホームディレクトリ以下にbinディレクトリを作り、バイナリを放り込むのみ。

```bash
$ mkdir ~/bin
$ wget http://stedolan.github.io/jq/download/linux64/jq -O ~/bin/jq
$ chmod +x ~/bin/jq
```

このからくりや、詳しい事については次の記事が詳しい。

* jqコマンドをsudoを使わずにインストールし、PATHを通す方法 - Y-Ken Studio<br>
http://y-ken.hatenablog.com/entry/how-to-install-jq-localy
Railsでwebページのクロールをする実装をする時、とりあえずサクッとキャッシュする方法。

### 概要
・キャッシュヒットすれば即時返却。
・ページを取得した場合相手側の負荷を抑えられるsleep(1)付き
・Herokuでの利用もOK。

```rb
# app/utils/http_utils.rb とかに配置する
class HttpUtils
  def self.get(_url)
    url = _url.strip
    Rails.cache.fetch("html_caches.#{Digest::MD5.hexdigest(url)}", expires_in: 1.day) do
      ret = open(url).read
      sleep(1)
      ret
    end
  end
end
```

使い方

```rb
HttpUtils.get('https://google.com') #=> 読み込み & sleep(1)
HttpUtils.get('https://google.com') #=> キャッシュヒット & sleep無し！
```

以上です

#### 使用上の注意
この実装で並列処理で実行すると、同一ドメインに短時間でアクセスしてしまう可能性があります。そういう要件の場合はちゃんと作りましょう！
[Contact Form 7 4.1] 確認用メールアドレスのエラーチェック(最新版対応)

Contact Form 7はWordPressでのサイト制作においてフォーム問合わせの必須プラグインかと思いますが、ところどころ痒いところに手が届かないところもあり...

掲題の件、プラグインデフォルトでは確認用メールアドレスのエラーチェックができない？らしく
自前で実装されている方がおられました。感謝。

[Contact Form 7で確認用メールアドレスの入力フォームを加える方法](http://hello.lumiere-couleur.com/smilkobuta/2010/12/02/contact-form-7%E3%81%A7%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E5%8A%A0/)

ただしこちらは少し情報が古いようで、Contact Form 7 4.1以降でも動かすためには次のように修正が必要になりました。

```functions.php
<?php
function wpcf7_text_validation_filter_extend( $result, $tag ) {
...

　//$result['reason'][$name] = '確認用のメールアドレスが一致していません';
　//上記記述を以下のように書き換えます。
　$result['reason'] = array( $name => '確認用のメールアドレスが一致していません' );

...
}
?>
```

Contact Form 7の管理画面で以下のショートコードを張り付ければOK.

```ContactForm7管理画面
<p>メールアドレス<br />
[email* your-email] </p>

<p>メールアドレス (確認用）<br />
[email* your-email_confirm] </p>
```
<br>
最近Contact Form7をアップデートしたら、確認用メールチェックがうまく動かなくなった、という方の参考になればと思います。
<br>
<br>
> 参考サイト
[contactform7.comさん](http://contactform7.com/ja/2015/01/06/contact-form-7-41-beta/)
[Contact Form 7で確認用メールアドレスの入力フォームを加える方法](http://hello.lumiere-couleur.com/smilkobuta/2010/12/02/contact-form-7%E3%81%A7%E7%A2%BA%E8%AA%8D%E7%94%A8%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E5%8A%A0/)
GCM「許可対象Androidアプリ」の登録（Windows）

# 概要

GCM (Google Cloud Messaging) を使用するにあたって、「認可対象Androidアプリ」を登録する必要があります。具体的には、下の画像のテキストエリアを埋める必要があります（「APIと認証」 > 「認証情報」のページ）。

![allowed-client.png](https://qiita-image-store.s3.amazonaws.com/0/43328/f13bc65d-cec9-6bfe-99a7-5b890e93d751.png)

本記事はテキストエリアに入力する文字列を取得する手順のメモです

# 手順

1. .jksファイルをつくる（参考：[Android Studioで APK ファイルを作成する](http://androidstudio.hatenablog.com/entry/2014/07/26/154043)）
2. PowerShellでJREのパスに移動
    * `cd [JREのパス]`
    * 自分の場合、[JREのパス]は `C:\Program Files\Java\jre1.8.0_25\bin`
3. keytool.exeを使って情報を表示する
    * `.\keytool.exe -list -v -keystore [.jksファイルのパス]`
4. 「証明書のフィンガプリント」の中の、「SHA1:」の右側にある文字列をコピー
5. テキストエリアに `[SHA1文字列];[アプリのパッケージ名]` を入力
ディレクトリ内のすべてのファイルをCRLF→LFに変換する

いつものようにgit addしたら改行コマンド周りでエラーが。

~~~
$ git add .
fatal: CRLF would be replaced by LF in (file)
~~~

そのため以下のコマンドでLFに変換した。
findコマンドで、カレントディレクトリ配下の、ディレクトリ以外のファイルを検索。
xargsでnkfコマンドにぶっ込む。

~~~
find . -type f | xargs nkf -Lu --overwrite
~~~

途中、

~~~
(file): Too many open files
~~~

といわれた。
ファイルディスクリプタの上限数に当たっているらしいが、
上限の変更がうまくいかなかったため、xargsでわたす引数の数に制限をかけることで対応した。
※コメントいただいた @syohex さんありがとうございます！！！

~~~
find . -type f | xargs -n 256 nkf -Lu --overwrite
~~~
C#で壁紙カレンダーの作成

[前回](http://qiita.com/lofttecs/items/64f4c43b2fde749e29a0)、[前々回](http://qiita.com/lofttecs/items/1e4bde0fd88060ac44c0)でwindowsのサイドバーガジェットの機能で壁紙カレンダーを作りましたが、作り始めた頃から「C#で作ればいいのでは？」という考えが頭をよぎっていたので作ってみました。

http://web.loft-net.co.jp/lofttecs/csharp_wallpaper_calendar/

タスクトレイにカレンダーのアイコンが表示されます。

右クリックで最前面に表示の切り替えができます。

スケジュール登録機能はありません。

.NET Framework 4が入っていれば動くと思います。

会社のwindows vista、7、8では正常に稼働しました。XPも.NET Framework 4をインストールすれば動きました。

スタートアップにショートカットを入れておくとログオン時に自動起動します。

GitHub:https://github.com/lofttecs/wallpaper_calendar

2015.02.10　ver. 1.1　一部修正とマウスオーバーで祝日名表示機能追加
2016.02.22　ver. 1.2　フォント設定機能追加
2016.05.12　ver. 1.3　色設定機能追加
2016.05.18　ver. 1.4　次月前月機能追加・表示の調整
qiita > 「空行」と「git」で検索したい > 「空」でもひっかかる

Qiitaの投稿の中でgitの"空行"の扱いに関する良さそうな記事があった。

どこにあったか忘れたので検索で見つけようとしたけど、余計な検索が出てきてうまく見つけられなかった。

キーワードは
"git"
"空行"
として検索したが、なぜか"空"だけのキーワード検索の結果も出てくる。

"空行"での検索は"空"や"行"でなく"空行"と記載しているものだけ絞り込みたいができないようだ。

結局、googleにて
site:qiita.com "空行" git
で検索する方が絞り込みが良い。
Docker使う前に設定すること

# Docker使う前に設定すること

## docker.ioの自動起動

`update-rc.d docker.io defaults`

## Dockerを実行するユーザーを変更する

参考
> https://docs.docker.com/installation/ubuntulinux/#giving-non-root-access

### 目的
- 毎回 sudo つけてdockerコマンド打つのが面倒くさい
	- dockerを実行するユーザーを作成しよう

### グループに追加
- 多分dockerインストールされた状態だと `docker` というグループが最初からあるけど念のため
  - `sudo groupadd docker`

- 追加
  - `sudo gpasswd -a [ユーザー名] docker`

- dockerのデーモン再起動
  - sudo service docker.io restart docker

[追記 2015/09/16]
こちらの記事見て思い出したので一部追記
http://qiita.com/matyapiro31/items/1af3e0bc09382e1b475a

dockerは何かと権限周りで気をつけなければいけないので本番環境とかでは所属させるのではなく、
newgrpで一時的に所属させると良いということが書かれてます。
[Swift]モーションセンサーからイベントを呼び出す

```import CoreMotion```するとより詳細な[加速度センサの値にアクセスできます](http://blog.miyadi.net/archives/2140)が**本体を振ってキャンセルなどの処理をさせたいだけ**の場合、```ViewController```に下記のようなコードを挿入するだけで良いようです。

```
    override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent) {
        NSLog(“Swing!")
        /* code */ 
    }
```
FRP 的に XHR を処理してみる。


現実的に FRP を実践してみるテストという事で、`XMLHttpRequest` を [Kefir.js](https://pozadi.github.io/kefir/) で処理するなら、こうすれば良いのかなーというコードを書いてみる。

使用するライブラリは下記の 2 つ。

* [lodash](https://lodash.com/)
* [Kefir.js — fast and light Reactive Programming library for JavaScript inspired by Bacon.js and RxJS](https://pozadi.github.io/kefir/)

[Bacon.js](https://baconjs.github.io/) でもほぼ同じだと思う。Kefir.js の web ページがリファレンス的で読みやすかったのと、サイズが Bacon.js よりコンパクトとの事で、こちらを選択した。


# コードを書く

まずは下記 2 つの XHR と Stream オブジェクトを定義:

```javascript
var req = new window.XMLHttpRequest(), xhr = Kefir.fromEvent(req, 'readystatechange');
```

次は XHR オブジェクト用の基礎的な処理をする関数を定義しておく:

```javascript
// リクエストパラメーター文字列をハッシュオブジェクトから生成する関数
var serialize = function (data) {
  return _(data)
    .pairs()
    .map(function (val) { return val[0] + '=' + val[1]; })
    .value()
    .join('&')
    .replace(/%20/g, '+');
};

// GET/POST リクエストを発行するカリー化された関数
var request = _.curry(function (method, uri, data) {
  switch (method) {
    case 'GET':
      req.open(method, uri + serialize(data), true);
      req.send();
      break;
    case 'POST':
      req.open(method, uri, true);
      req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      req.send(serialize(data));
      break;
  }
});

// 今回は GET でテストしてみるので前述の関数から get 関数を定義
var get = request('GET');   
```

次は XHR イベントの Stream オブジェクトからの返り値を正規化する関数を定義:

```javascript
// `readystatechange` イベント発火時に実行され値が存在する場合、常にオブジェクトを返す関数
var readystatechange = function (ev) {
  if (ev.target.DONE !== ev.target.readyState) return;
  if (200 === ev.target.status) {
    var response, ctype = ev.target.getResponseHeader('Content-Type');
    switch (ctype) {
      case 'application/json':
      case 'text/json':
        response = window.JSON.parse(ev.target.responseText);
        break;
      case 'application/xml':
      case 'text/xml':
        response = ev.target.responseXML;
        break;
      default:
        response = ev.target.responseText;
    }
    // 正常なレスポンスがある場合は、その値を格納したオブジェクトを返す
    return { 'response': response };
  } else {
    // エラー時、エラーオブジェクトを返す
    return new Error(ev.target.status + ' ' + ev.target.responseText);
  }
};
```

前述の関数をもって、実際に Stream オブジェクトに対する処理を定義し実行する:

```javascript
xhr
  .map(readystatechange)
  .filter(_.isObject)
  .log();

get('/path/to/test.json', {});
```

これで、`test.json` の値が web ブラウザのコンソールに表示されるはず。


# JSONP の場合

どっかの JSONP を返す ReST API にリクエストするなら次のような感じ:

```javascript
var jsonp = _.curry(function (uri, callback) {
  var script = document.createElement('script');
  window.___jsonp = function (data) { return callback({ 'response': data }) };
  script.setAttribute('src', uri + '&callback=___jsonp');
  document.getElementsByTagName('head')[0].appendChild(script);
});

var req = Kefir.fromCallback(jsonp('http://example.com/path/to/test'));

req.log();
```


# まとめ

FRP のポイントは、Kefir.js なり Bacon.js なりが理解できる Stream オブジェクトとして、如何に様々な非同期処理やイベントの返り値を正規化するか。という事なのかなーという理解です。

こんな感じで良いのかなぁ。
OpenVzからdockerへのデータ移行が簡単だった

ファイルを固めたらdockerでそのまま動いた。

```bash:
vzctl stop 255

cd /var/lib/vz/private
tar cf 255.tar -C 255 .
xz -v 255.tar
```

```bash:
cat 255.tar.xz | docker import - tukiyo3/openvz255

docker run -it --net=host -d tukiyo3/openvz255 /sbin/init
docker exec -it <コンテナID> /bin/bash
```

普通に動いて驚いた
【Google Test】Google C++ Testing Frameworkをビルドして使ってみた

#概要
Windowsで作ってたCUIアプリをCentOS6.6で使いたくて移植。
テスト通したかったのでGoogle testをビルドしたので手順とか載せておきます。
参考になれば幸い。

#入れたOS
CentOS6.6

#最新のGoogle Testを落とす・・・はずだった
ここから最新を落とす。

https://code.google.com/p/googletest/downloads/list

2015/02/06時点での最新は1.7.0。
(リリースを見る限りだと2013年9月から更新が無いんでしょうか・・・)

んで「最新のGoogle Testを落とす・・・はずだった」となっている理由なんだけど・・・

*1.7.0がリンクに失敗する*

多分やり方が悪いんだろうけどとりあえず試したことだけ書くので同様にはまった人が居たら何か頑張ってください！！！

とりあえず普通にREADMEに従って静的ライブラリを創りリンクすると

> undefined reference to `testing::internal::EqFailure

で失敗。
関数名的にASSERT_EQを使ってる箇所でエラーってるのかと思いきや２箇所でしかエラー出てないしそうでもない様子。
色々試したけれど原因も掴めないしぐぐっても似たような症状はあるものの、
静的ライブラリリンクすれば治るんじゃね？みたいな回答しか無くてぶっちゃけ上記エラーケース的に考えればホントそれ。一体何をリンクすればいいのやら・・・

Google Testにはサンプルが入っててそっちにはgtest_main.aというライブラリがある。WinやMacの場合このライブラリが必須なんだけど別にこれをリンクしても変わらずで、時間も無かったのもあって深追いせず諦めました。

#Google Test 1.6.0を落とす
というわけで１つ前の1.6.0で解説。

*修正がフィックスされてない古いバージョンのテストフレームワークを使うのは流石にどうなのって話はある。今回はテストができないよりはマシという方針になってるので悪しからず*
(一応補足だけど1.6.0から1.7.0が機能追加なのか修正fixなのかとかは全然確認してないのでもしかしたら問題無いかもしれない)

https://code.google.com/p/googletest/downloads/list

ここから落としてきて適当に展開しましょい。
ダウンロードにはwget使ってるので無い人は sudo yum install wget してくだし。

```bash
$ mkdir for_work
$ cd for_work
$ wget https://googletest.googlecode.com/files/gtest-1.6.0.zip
$ unzip gtest-1.6.0.zip
```

展開してもディレクトリに入る必要なし。
README見れば書いてあるけど次のようにコマンド打てばおｋ。

```bash
$ g++ -Igtest-1.6.0/include -Igtest-1.6.0 -c gtest-1.6.0/src/gtest-all.cc; ar -rv libgtest.a gtest-all.o
```

これで libgtest.a が作成されるので後はこれをリンクすれば良い。

#ビルド

ビルド時に -pthread が必要だと思う。
それ以外は単純に静的ライブラリをリンクすれば良い。
一応コンパイル例も載せてみる。

> $ g++ 任意option -pthread ソース libgtest.a -o unittest

#実行
```bash
[----------] Global test environment tear-down
[==========] 57 tests from 18 test cases ran. (736 ms total)
[  PASSED  ] 54 tests.
[  FAILED  ] 3 tests, listed below:
```

Win版では動いてもプラットフォームが異なればテスト通らないっすねー・・・
特定の条件のものだけ抽出してテーブルを再作成する

yusukeさんのデータだけデータベースからすべて取り出して、新しいテーブル`yus_point`を作成したい、と思ったときにする方法。

```postgres
hogedb=> \copy (SELECT * FROM device_point WHERE user_id = 1) TO '/tmp/yus_point';
```

こうすると`yus_point`という標準入力（stdin）が生成される。
これの中身の先頭に、

```
COPY "sample_table" FROM stdin;
```

最後に、

```
\.
```

を追加してやるとpsqlで読み込めるようになる。
そして、

```psql
psql sample_database < yus_point
```

リストアしてやればok。
NetBeans8.0.2で日本語入力をすると落ちまくる問題

NetBeans8.0.2で日本語入力をすると落ちまくる問題

[NetBeansで日本語を入力すると落ちる](http://takah.hatenablog.com/entry/2014/09/07/161546)

↑のサイトさまを参考にして、起動ショートカットのプロパティのリンク先を以下に変更したら治りました。

"C:\Program Files\NetBeans 8.0.2\bin\netbeans64.exe" --jdkhome "C:\Program Files\Java\jre8"

迂闊にJavaUpdateすると陥る問題やもしれない。
setup go-lang-idea-plugin for gae/go

[go-lang-idea-plugin](https://github.com/go-lang-plugin-org/go-lang-idea-plugin) をgae/go開発用に設定してみました。

plugin installについては、 [IntelliJ の Goプラグイン 1.0αを試す](http://qiita.com/Fq4X/items/a80108340143a777c673) を参考にしました。

# IntelliJ外の環境

IntelliJの外の環境としては以下の様な感じ

* gae/go root
  * $HOME/bin/google-cloud-sdk/platform/google_appengine/root
* gopath
  * $HOME/go
* project workspace
  * $HOME/workspace/go-endpoints-unittest-example

## goapp env

```bash
$ goapp env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/sinmetal/go:/Users/sinmetal/workspace/go-endpoints-unittest-example"
GORACE=""
GOROOT="/Users/sinmetal/bin/google-cloud-sdk/platform/google_appengine/goroot"
GOTOOLDIR="/Users/sinmetal/bin/google-cloud-sdk/platform/google_appengine/goroot/pkg/tool/darwin_amd64"
TERM="dumb"
CC="clang"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common"
CXX="clang++"
CGO_ENABLED="1"
```

# IntelliJ 設定

## Go Libraries

Preferences -> Languages & Frameworks -> Go Libraries

Global Librariesにgopathとgae/goのrootを設定。
gopathは勝手に拾ってきてくれたりもするみたいだけど、僕の場合は拾ってきてくれなかったので、自分で都合の良いように設定した。

![Screen Shot 2015-02-06 at 12.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/15640/f4bd789b-27f7-8512-d503-e601a93567a8.png)

自分のProjectの中でpackageを切っている場合は、Project Librariesに、自分のProjectのworkspaceを設定した方が良いのかもしれない。

今回の場合だと、以下を設定するようになる。

```
$HOME/workspace/go-endpoints-unittest-example
```

## Project

File -> Project Structure -> Project

gae/go gorootをSDKとして設定する

僕の場合だと、以下を設定している
```
$HOME/bin/google-cloud-sdk/platform/google_appengine/goroot
```

![Screen Shot 2015-02-06 at 12.04.16.png](https://qiita-image-store.s3.amazonaws.com/0/15640/724a5d54-7fdb-beff-8193-a14bc7bc9a8d.png)

## Platform Settings SDKs

### Classpath

gae/go gorootとgopathを設定
ここを設定しておかないと、External Librariesに出てきてくれないので、適当にソースを見たい時にめんどうだ。

![Screen Shot 2015-02-06 at 12.04.03.png](https://qiita-image-store.s3.amazonaws.com/0/15640/b1c9bd7a-c083-94ec-6f92-d29fa28b5b21.png)

### Sourcepath

gae/go gorootとgopathを設定
ここを設定しておかないと、補完が効かなかった。

![Screen Shot 2015-02-06 at 12.35.14.png](https://qiita-image-store.s3.amazonaws.com/0/15640/1cd2cb30-226e-fe42-9158-36d521d1c492.png)

# Complete

まだ設定したばかりだけど、良さそうなイメージ。
もっと楽な設定とか、良い設定がある気はしている。
設定内容を変えたら、記事も更新していくつもり。

![Screen Shot 2015-02-06 at 12.05.40.png](https://qiita-image-store.s3.amazonaws.com/0/15640/e20a0d27-b1f0-fb0e-df0d-1dc2006ef1e3.png)
ついついwindowsでlsとか叩いちゃう時って、あるじゃん？

# Linuxっぽいコマンドをbatで作ってパスを通しておくムーブ
つまるところ、全く同じ動きじゃなくても似たような動きをする物を置いておけば少なくともイラっとする事は無いじゃないという発想。

## tee

```bat:tee.bat
@echo off

set FILENAME=%~1

:LOOP
set /p INPUT=
if "%INPUT%"=="" goto END

echo %INPUT%
echo %INPUT% >> "%FILENAME%"
set INPUT=
goto LOOP

:END
exit /b 0
```

オプションとかは見ない。めんどくさい。そこまで高度じゃなくてもいい。

## ls

```bat:ls.bat
dir /s %*
```
Lazy Loadを導入してスマホからの画像アクセス負荷を下げる（所要時間５分）


# 概要
- imgタグの多いhtmlなどを読み込んだとき、一斉に画像への接続が始まるが
スマホは帯域が狭いし通信も不安定なので、httpサーバをapacheで運用していると
コネクションを掴んだままなかなか離してくれずapacheが詰まりやすい
- 読み込み完了までスマホの挙動が重くなることもありUX的にもよくない
- なので画面上にimgタグの表示領域が来たところでloadさせるようにすれば、一気に接続が走ることはなくなる
- LazyLoadというjQuery pluginを利用すれば簡単に実装できます

# 最速の使い方
- 公式から落とす
 - http://www.appelsiini.net/projects/lazyload
- 使いたいページでロード

```html
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="lazyload/jquery.lazyload.min.js"></script>
<script>
$(document).ready(function(){
    $("img.lazy").lazyload({
        effect : "fadeIn"
    });
});
</script>
```

- 適応させたいimgタグに対して以下のようにdata-originalで画像パスを指定、classをlazyにする。width,heightはcssか属性で指定しないとダメです。

```html
<img class="lazy" data-original="画像パス.jpg"  width="640" height="480">
<noscript><img src="img/example.jpg" width="640" height="480"></noscript>
```

- 以上で画像のlazy loadが成功するはずです
- effectはfadeIn以外にもあります
- どこまで画像に近づいたら読み込み始めるかも設定可能
- 画像をクリックしたら、マウスオーバーしたら読み込みなども設定可能

# まとめ
- お手軽に負荷を減らせるので、画像がたくさんあるリスト画面なんかはどんどん使ったほうがいいのではないでしょうか
lodashのfirst, last が take, takeRight にそれぞれ機能分割されてた

lodashで配列を扱う関数で ```first``` と ```last``` というのがあって、通常は配列の先頭を取り出すのが ```first```、末尾を取り出すのが ```last``` なんだけど、２番目の引数にnumberを渡すとその長さ分を先頭または末尾から取り出してくれてた。

```
var numbers = [1, 2, 3]
console.log(_.first(numbers)) // => 1
console.log(_.first(numbers, 2)) // => [1, 2]
console.log(_.last(numbers)) // => 3
console.log(_.last(numbers, 2)) // => [2, 3]
```

というのはもう過去の話！

今はこうやる

```
var numbers = [1, 2, 3]
console.log(_.take(numbers, 2)) // => [1, 2]
console.log(_.takeRight(numbers, 2)) // => [2, 3]
```

わかりやすい名前になってた
Homebrewとpossibly undefined macro: AM_PATH_XML2とHTTP/2

# はじめに

OSXでHomebrew使っている環境で、HTTP/2を試そうとすると
遭遇すかもしれないのが

```shell
possibly undefined macro: AM_PATH_XML2
```

最近はDockerでなんでも動かせるから、あんまりこの記事の需要は無い
とは思うが。物忘れのひどい自分用に


# 回避策

```
export ACLOCAL_PATH=/usr/local/Cellar/libxml2/2.9.2/share/aclocal/
```

# その先の未来予想

```
export PKG_CONFIG_PATH=/usr/local/Cellar/openssl/1.0.2/lib/pkgconfig:/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig/
```

# 似ていると思った投稿

- [mac で spdylay の build もしくは homebrew と pkg-config - Qiita](http://qiita.com/Jxck_/items/d329aa5c9b50519dcfaf)
 
# 関連記事

- [Windows 10でMSVCでnghttp2のサンプルを動かす](http://abrakatabura.hatenablog.com/entry/2017/01/14/072846)
mysqldump definer削除コマンドとか

error: SQLSTATE[HY000]: General error: 1449 The user specified as a definer
============================================================================

■mysqldumpしながらDEFINERを削除
mysqldump -uUSER -p DBNAME | sed -e "s/DEFINER=[^*]*\*/\*/" | gzip > database_nodefiner.sql.gz


■dumpしたsqlからDEFINERを削除
cat database.dump.sql | sed -e "s/DEFINER=[^*]*\*/\*/" > database_nodefiner.sql
関数のコールグラフを作る > www.mindmup.com

関数のコールグラフを自動で作成する方法はいくつかある。でも、自分が見たい情報を適宜expand/collapseしたい時には手動で作るのがいい時もある。これにはマインドマップというツールが今のところ自分に合っている。

マインドマップはastah thinkというのをしばらく使ってみたが、インストールが必要なので異なるPCでの作業時面倒くさかった。

webベースのものならPC依存でないのでいいかと思い調べたところ、www.mindmup.com を見つけた。

このサイトで自分が使っている機能としては以下がある。

1. ローカルに保存できる
  一次時なファイルはこれで対応。

2. googleドライブに保存できる
  異なるPCで共有したい時に使う。
  **(2018-07-30 追記: 2018-12-11にGoogle DriveのRealtime API提供廃止によりGoogle Drive上での使用には制限がでてきます(*1)。例として、書込みできなくなる、など。)**

3. ノードを検索できる
  コールグラフにて、ある関数をどこで使っているか見つけたい時に使う。

4. 同じ階層のものはEnterでどんどん入力し、子階層はTabを押して入力できる。
　キーボードだけで手短に作れる。

*1)  [Google Drive > 3rd パーティへのRealtime API capabilities の停止 (2018-12-11)](https://qiita.com/7of9/items/a328fd0f331f9f1feaa2)
logcatにでてきたエラー

```
ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams

```
1.パスが通っていない
2.クラス名のスペルミス
3.そもそもクラスファイル(.class)が存在していない


この時は結局activity_main.xmlの下記の挿入場所が異なっていたのが原因

```
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="#ffff3e34">
```
Enumerable内での各要素出現数をカウントする

Ruby 2.2 で追加されたメソッドまとめをみてた。
[New Methods in Ruby 2.2](http://www.sitepoint.com/new-methods-ruby-2-2/?utm_source=rubyweekly&utm_medium=email)

`Enumerable#slice_when`のユースケースでEnumerable内での各要素出現数をカウントするのがステキだったので、2.2以前も含めてどう書けるパターンあるんだっけ？をメモ。

## カウント対象のArrayを生成

```rb
labels = ["aaa", "bbb", "ccc"]
ary = Array.new(20) { labels.sample }
puts ary.join ", "
# bbb, aaa, bbb, bbb, bbb, aaa, ccc, aaa, aaa, bbb, ccc, ccc, bbb, bbb, aaa, aaa, ccc, bbb, aaa, aaa
```

## 2.2以前

### `Enumerable#inject`を利用

```rb
r1 = ary.inject(Hash.new(0)) {|h, e| h.tap {|h| h[e] += 1} }
puts r1
# {"bbb"=>8, "aaa"=>8, "ccc"=>4}
```

## 2.2から

### `Enumerable#slice_when`を利用

あえて出力結果を Hash に寄せてみる。

```rb
r2 = ary.sort.slice_when(&:!=).map {|x| [x.first, x.size] }
puts Hash[r2]
# {"aaa"=>8, "bbb"=>8, "ccc"=>4}
```

### `Enumerable#group_by` + `Object#itself` でもイケるな

```rb
r3 = ary.group_by(&:itself).map {|k, v| [k, v.size] }
puts Hash[r3]
# {"bbb"=>8, "aaa"=>8, "ccc"=>4}
```

## メモ

- `Enumerable#inject`は副作用ベースな書き方なのでいつも一瞬「うっ」ってなってる
- `Enumerable#slice_when`は`#sort`しないといけないね
- 要素数が大きくなった場合に計算量とメモリ使用量の観点で効率的なのはどれだろう？
- 富豪的な実装でもいいから簡単に書きたい時もあるよね、使い分けたい

## コード全体

```rb
labels = ["aaa", "bbb", "ccc"]
ary = Array.new(20) { labels.sample }
puts ary.join ", "

r1 = ary.inject(Hash.new(0)) {|h, e| h.tap {|h| h[e] += 1} }
puts r1

r2 = ary.sort.slice_when(&:!=).map {|x| [x.first, x.size] }
puts Hash[r2]

r3 = ary.group_by(&:itself).map {|k, v| [k, v.size] }
puts Hash[r3]
```
innerText(textContent)/innerHTMLを使わずJavaScriptでHTMLエスケープ

## 元になった記事

> innerHTMLは"をエスケープしてくれるとは限らない
-- <cite>[innerText(textContent)/innerHTMLを使ったHTMLエスケープは充分でないので今すぐやめろ、お前たちはもう終わりだ - TODESKING](http://www.todesking.com/blog/2015-02-05-html-escape-with-innertext-and-innerhtml-is-not-enough/)</cite>

## String#replaceは引数にfunctionを渡せる
functionの[第一引数はマッチした部分文字列そのものを保持](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)するので、マッピングテーブルオブジェクトに渡して変換するこんな感じでどうだろう。なんかオシャレな気がするので。

```js
function escapeHtml(content) {
  var TABLE_FOR_ESCAPE_HTML = {
    "&": "&amp;",
    "\"": "&quot;",
    "<": "&lt;",
    ">": "&gt;"
  };
  return content.replace(/[&"<>]/g, function(match) {
    return TABLE_FOR_ESCAPE_HTML[match];
  });
}
```

ブラウザの対応状況とかは調べてないけど、たぶんモダンブラウザなら動くと思う。

## 参考

[ruby/util.rb at trunk · ruby/ruby](https://github.com/ruby/ruby/blob/trunk/lib/cgi/util.rb#L33)