OmniAICreator/Qiita-1.07M huggingface dataset:
KitKatでサポートしているCharsetが微妙に変わっている

Jelly Bean以前とKitKatで扱えるShift-JIS関係のCharsetが変わっていることに気付いたのでメモ。
`Charset.availableCharsets()`で使用可能なCharsetの一覧を取得してみると、Jelly Beanでは以下のCharsetを扱える事がわかる。

```
x-docomo-shift_jis-2007
x-kddi-shift_jis-2007
x-softbank-shift_jis-2007
```
しかし、KitKatでは上記のCharsetが扱えなくなり、代わりに以下のCharsetが扱えるようになっている。

```
x-docomo-shift_jis-2012
x-kddi-shift_jis-2012
x-softbank-shift_jis-2012
```

このようなCharsetがサポートされていること自体あまり知られていないのだが、何が変わったかというと、xxx-2007ではテキスト内にキャリア絵文字が含まれていた場合、Unicodeに変換するとAndroid PUAに変換されるが、
xxx-2012ではUnicode6.0絵文字に変換される。

本当かどうかを太陽の絵文字をSJISからStringに変換するテストコードで確認してみる。

```java:
// JB以前で動作する
public void testSjis2007Convert() throws UnsupportedEncodingException {
    String docomoSun = new String(toSjisBytes(0xf89f), "x-docomo-shift_jis-2007");
    String kddiSun = new String(toSjisBytes(0xf660), "x-kddi-shift_jis-2007");
    String softbankSun = new String(toSjisBytes(0xf98b), "x-softbank-shift_jis-2007");

    // すべてPUAの☀(U+FE000)になっている
    assertEquals(0xFE000, docomoSun.codePointAt(0));
    assertEquals(0xFE000, kddiSun.codePointAt(0));
    assertEquals(0xFE000, softbankSun.codePointAt(0));
}

// KitKat以降で動作する
public void testSjis2012Convert() throws UnsupportedEncodingException {
    String docomoSun = new String(toSjisBytes(0xf89f), "x-docomo-shift_jis-2012");
    String kddiSun = new String(toSjisBytes(0xf660), "x-kddi-shift_jis-2012");
    String softbankSun = new String(toSjisBytes(0xf98b), "x-softbank-shift_jis-2012");

    // すべて☀(U+2600)になっている
    assertEquals(0x2600, docomoSun.codePointAt(0));
    assertEquals(0x2600, kddiSun.codePointAt(0));
    assertEquals(0x2600, softbankSun.codePointAt(0));
}

private byte[] toSjisBytes(int code) {
    byte firstByte = (byte)(code >> 8);
    byte secondByte = (byte)(code & 0xff);
    return new byte[] { firstByte, secondByte };
}
```

これが問題となるのは標準APIを使って絵文字変換を行うようなOSSを使っている場合で、KitKat以降で正しく変換されなくなり、絵文字が文字化けを起こす場合がある。
KitKat以降では絵文字はUnicode6.0で扱ってくれ、PUAのことは忘れてくれ、ということだと思われる。
Modelのデータをtsv形式でimport/exportするRake task

# Modelのデータをtsv形式でimport/exportするRake task

```rb:Rakefile
require File.expand_path('../config/application', __FILE__)
require File.expand_path('../lib/tsv_data.rb', __FILE__)

MyApp::Application.load_tasks

task :export_data => :environment do
  export_users()
end

task :import_data => :environment do
  import_users()
end
```

```rb:lib/tsv_data.rb

require 'csv'

@files_path = "tsv_files"

def export_users
  export_tsv("#{@files_path}/users.tsv", User)
end

def import_users
  import_tsv("#{@files_path}/users.tsv", User)
end

def export_tsv( file_name, class_name )
  puts "export #{class_name.to_s}"

  File.open(file_name, "w") do |file|
	records = class_name.all
	records.each do |record|
	  file.puts record.attributes.values.join("\t")
	end
  end
end


def import_tsv( file_name, class_name )
  puts "import #{class_name.to_s}"

  quote_chars = %w(" | ~ ^ & *)
  begin
	class_name.delete_all
	CSV.foreach(file_name,  col_sep: "\t", quote_char: quote_chars.shift) do |row|
	  record = class_name.new
	  record.attributes.keys.each do |key|
		record[key] = "#{row.shift}"
	  end
	  record.save(:validate => false)
	end
  rescue CSV::MalformedCSVError
	quote_chars.empty? ? raise : retry
  end
end
```
Railsのjoinsでplaceholderを使う

#Railsのjoinsでplaceholderを使う

team_code='team_A'に所属するメンバーを取得する場合

```rb
class User < ActiveRecord::Base
  def self.join_team(team_code)
	User.joins(sanitize_sql_array(['INNER JOIN teams ON team_code = ?', team_code]))
  end
end
```

呼び出し側

```rb
User.join_team('teem_A').where('users.team_id = team.id')
```
Twitter Bootstrap Modalを移動（drag）したい

# Twitter Bootstrap Modalを移動（drag）したい

一番手軽に実現できたjQuery UIのdraggableを使います。

1.まずGemfileに追加。

    gem 'jquery-ui-rails'

2.bundle install実行。

    $ bundle install

3.app/assets/javascripts/application.jsに次の行を追加。

    //= require jquery.ui.all

4.実装

view例：

```html+erb:app/view/common/index.html.erb

    <a class="btn btn-primary" data-toggle="modal" data-target="#myModal" href="show">Show Modal</a>
    
    <div class="modal hide" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            <h4 class="modal-title" id="myModalLabel">Modal title</h4>
          </div>
          <div class="modal-body">
            loadling...
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          </div>
        </div><!-- /.modal-content -->
      </div><!-- /.modal-dialog -->
    </div><!-- /.modal -->
```

myModalのmodal-dialog全体をdraggableにする場合、次の設定を追加します。

```coffeescript:app/assets/javascripts/common.js.coffee

    $("#myModal").draggable({
        handle: ".modal-dialog"
    })
```

modal-body内にスクロールバーがつくような場合は、
さらにその内側のタグをdraggableに設定する方が良いです。

（ブラウザによってはスクロールバーの制御とdraggableの制御が競合し、
例えばスクロールバーをドラッグすると同時にmodalも移動されたりします）
プロジェクトを円滑に進めるためのGit環境構築

最近、Gitでの開発管理の活用方法をたくさん聞いたのでまとめ。

##ツール
+ Git
+ Git-Flow
+ Git-Lab

以上のツールを活用。みんなフリーで助かる。

##Git
分散型バージョン管理システム。
SVNに比べて複数人での開発で便利。ブランチ管理が高速で簡単。

##Git-Flow
Gitではブランチ管理が簡単なため誰でも好きでブランチを作成できる。
そうなってくるとルールを統一しないと管理がしずらい。
（結果としてマージ漏れや巻き戻りなど危険性が増加）
そこでGit-Flowを使うと効率的にバージョン管理できるブランチモデルが可能になる。
「A successful Git branching model」
http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html
（実際の使用法やルールは下のページを見ると理解出来ると思います）
http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html

##Git-Lab
Git-Hubの機能を持ち自分のサーバーで構築できる感じ。
たくさんのプロジェクトが進行しているとBareレポジトリは複数サーバーに分散しがちだが
これを使うと纏めて管理できる。
管理や使用もWebページから可能でエンジニア以外でもとっつきやすい。
詳しくは下のページが分かりやすいです。
http://www.slideshare.net/crooz_techblog/gitlab-web-hooks-git-flowgit

##まとめ
この3つを組み合わせて使用すればGitを安全で効率的に分かりすく管理できると思います。
今、開発に導入中ですがGit-Flowはほんとに助かります。
今までGitを有効に使えてなかったんだなと認識しました。
SourceTreeも対応してるのでコマンド使わずでも使用できます。
Railsで、同じFormで同じModelに対しての修正と登録を混在させる

# Railsで、同じFormで同じModelに対しての修正と登録を混在させる（一度のrequestでinsertとupdateを同時に行う）

既存データの一覧を表示し、まとめて編集できる表において、
行を追加して新規データも登録できるようなケースを想定します。

単純にsubmitすると次のエラーが発生します。

    expected Hash (got Array) for param `samples'

これはParameterに対し、既存データはidをキーとしたハッシュで格納され、
新規データはidがないのでハッシュの配列で格納されるためです。

既存データ例：

    "comments"=>{
      "1"=>{"id"=>"1", "title"=>"a", "content"=>"aa"}, 
      "2"=>{"id"=>"2", "title"=>"b", "content"=>"bb"}, 
      "3"=>{"id"=>"3", "title"=>"c", "content"=>"cc"}, 
      "4"=>{"id"=>"4", "title"=>"d", "content"=>"dd"}, 
      "5"=>{"id"=>"5", "title"=>"e", "content"=>"ee"}, 
      "6"=>{"id"=>"6", "title"=>"f", "content"=>"ff"}
    }

新規データ例：

    "comments"=>[
      {"id"=>"", "title"=>"a", "content"=>"aa"}, 
      {"id"=>"", "title"=>"b", "content"=>"bb"}, 
      {"id"=>"", "title"=>"c", "content"=>"cc"}, 
      {"id"=>"", "title"=>"d", "content"=>"dd"}, 
      {"id"=>"", "title"=>"e", "content"=>"ee"}, 
      {"id"=>"", "title"=>"f", "content"=>"ff"}
    ]

回避策として、新規データにダミーidを割り振り
受け取ったときにidの有無を見て新規作成と更新を切り分けます。

View例:

```html+erb
<table> 
  <tr>  
	<th>title</th>
	<th>content</th>
  </tr>
<% (0..5).each do |i| %>
  <% if @comments.present? && @comments[i].present? %>
	<!-- 既存データ -->
	<%= f.fields_for 'comments[]', @comments[i], index: @comments[i].id || "x#{i}" do |c| %>
	  <tr id="comment<%=i+1%>">
		<%= c.hidden_field :id, :id => "id#{i+1}", :value => @comments[i].id %>       
		<td>
		<%= c.text_field :title, :id => "title#{i+1}", :value => @comments[i].title %>
		</td>
		<td>
		<%= c.text_field :content, :id => "content#{i+1}", :value => @comments[i].content %>
		</td>
	  </tr>
	<% end %>
  <% else %>
	<!-- 新規データ -->
	<tr id="comment<%=i+1%>">
	  <input id="id<%=i+1%>" name="user[comments][x<%=i+1%>][id]" type="hidden"/>   
	  <td>
	  <input id="title<%=i+1%>" name="user[comments][x<%=i+1%>][title]" />
	  </td>
	  <td>
	  <input id="content<%=i+1%>" name="user[comments][x<%=i+1%>][content]" />        
	  </td>
	</tr>
  <% end %>
<% end %>
</table>
```

Parameters例：

（次の例では2つが既存データでidのない2つが新規データ）

    "comments"=>{
      "1"=>{"id"=>"1", "title"=>"a", "content"=>"aa"}, 
      "2"=>{"id"=>"2", "title"=>"b", "content"=>"bb"}, 
      "x3"=>{"id"=>"", "title"=>"c", "content"=>"cc"}, 
      "x4"=>{"id"=>"", "title"=>"d", "content"=>"dd"}, 
    }

Controller側で、idの中身を見て更新と新規登録を切り分けます。

--

動作確認用サンプルソースはGitHubにアップしています。

https://github.com/t-oginogin/nshgrb_20140726/tree/master/create_update_sample
Selenium WebDriverのwait条件をカスタマイズ

Ajaxによる描画が終わるまで待つWaitですが
通常visibilityOfElementLocatedなどHTML上の状態で終了判定するところを
JavaScriptの変数で判定するようにしてみました。
Functionというインタフェースを無名クラスで実装することで実現できます。


```java

import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.google.common.base.Function;

@Test
public void test() throws Exception {
    driver.get(baseUrl + "/test/"); // 開く
    Wait<WebDriver> wait = new WebDriverWait(driver, 30);
    
    // JavaScriptの変数が入るまで待つ
    wait.until(
            new Function<WebDriver, Boolean>(){
                public Boolean apply(WebDriver d) {
                    JavascriptExecutor js = (JavascriptExecutor) driver;
                    String jsVar = (String) js.executeScript("return jsvar;");
                    return !(jsVar == null || jsVar.length() > 0);
                }
            });
    }
'''
Selenium WebDriverでJavaScriptの変数を取得する


```java
    @Test
    public void test() throws Exception {
        driver.get(baseUrl + "/test/"); // 開く
        Wait<WebDriver> wait = new WebDriverWait(driver, 30);
        
        JavascriptExecutor js = (JavascriptExecutor) driver;
        String jsVar = (String) js.executeScript("return jsvariable;");
    }
```

実行するJavaScriptの中で取りたい変数をreturnすると取れます。

String jsVar = (String) js.executeScript( __"return jsvariable;"__ ); 

古いバージョンで動作するかわかりません。
試したのはバージョン2.41.0です。
Bootstrap3 のTooltipが動かない時


tooltip()を最初に呼び出す必要がある。

``` html
<a rel="tooltip" data-toggle="tooltip" data-placement="left"  data-container="body" title="ツールチップに表示するコメント">表示のコメント</a>


<script type="text/javascript">

    $(function(){
        $("[rel=tooltip]").tooltip();
    });

 </script>
```




popover　も同様のようです。

``` html

……

<script type="text/javascript">

    $(function(){
        $("[rel=popover]").popover();
    });

 </script>
```
ImageMagickで文字画像作成

# ImageMagickで文字画像作成

大量のダミー画像が必要になった時とかにシェルスクリプトで回すと便利かもしれない。

## 要点

* フォント指定する
* captionで書くと適当に幅に合わせて改行してくれる

```bash:bash
convert \
  -size 640x854  \
  -background "#C0C0C0"  \
  -fill "#FFFF00"  \
  -font aquafont.ttf \
  caption:"サンプル\n改行も\nできます" \
  output.png
```

ちなみに、出力に標準出力を指定する事もできる。
その場合は、ファイル名の前にフォーマット指定が必要。

```bash:bash
convert \
  -font aquafont.ttf \
  caption:"てすと" \
  png:-
```

### Data URI scheme で出力してみたり

```bash:bash
echo "data:image/png;base64,"$(convert -font aquafont.ttf caption:"てすと"  png:- | base64)
```
bashでCtrl+wでパス文字列を/ごとに削除する

# 求める挙動
```bash
$ cd /home/me/test/a_dir/    # Ctrl+w
$ cd /home/me/test/          # Ctrl+w
$ cd /home/me/               # ...
```

# 設定

``` bash
stty werase undef
bind '\C-w:unix-filename-rubout'
```
1行目で既存の`Ctrl-w`の割当てを削除し，2行目で改めて機能を割り当てています．

# 参考サイト
設定はこちらから引用させて頂いています．
http://unix.stackexchange.com/questions/27927/is-it-possible-to-configure-ctrl-w-delete-word

タイトルはこちらから頂きました
http://qiita.com/isaoshimizu/items/3d69e8a847266a0d598e
「ant -version」で「Unable to locate tools.jar」が出たとき

WindowsでCordovaをインストールするとき
antをダウンロードしてパスを通しますが、
うまくパスが通っていないと

```
ant -version
```

でバージョン確認をしたときに、

```
Unable to locate tools.ja
```

と出力されることがあります。

その対処法として、
環境変数に
JAVA_HOMEを追加してJDKのホームを指定します

```
C:\Program Files\Java\jdkバージョン
```

このとき、JDKのホームをC:\Program Files\Java\jdkバージョン\binのディレクトリまでしていしてはいけません。

次に、環境変数のPathに

```
%JAVA_HOME%\bin;
```

を追加します。

その後に、antのパスを通します。

```
C:\apache-ant-バージョン\bin;
```

「%JAVA_HOME%\bin;」より先にantのパスを通すとうまく動かないことがあります。

後は、以下のコマンド郡でエミュレーターにapkがインストールされればOK

```
cordova create testapp com.example.testapp TestApp
cd testapp
cordova platform add android
cordova emulate android -d
```
__super__の実装してみる

何千番煎じか分からんけど、こんなんを定義する。

```js
Function.prototype.extend = function (Class){
  var f = function (){};
  f.prototype = Class.prototype;
  this.prototype = new f()
  this.prototype.__super__ = Class.prototype;
  this.prototype.__super__.constructor = Class;
  this.prototype.constructor = this;
};
```

こんな感じで使う。

```js
var BaseClass = function(){
  this.init.apply(this, arguments);
};
BaseClass.prototype.init = function(){
  console.log("base init");
};

var ExClass = function(){
  this.init.apply(this, arguments);
};
ExClass.extend(BaseClass);//継承する
ExClass.prototype.init = function(){
  this.__super__.init();
  console.log("ex init");
};

//
new ExClass();
```

やってることは継承というかmixinか。
Stateパターンとかやる場合重宝する。
画像をマウスで掴んで伸縮

# 画像をマウスで掴んで伸縮

画像内のどこクリックしても同じような挙動だったり、
高速でマウス動かしたときにイベントが追い付かないとはみ出してしまったり、
まぁもっといろいろやりようはある気がするけど。

マウスクリック時のイベントと幅と高さをhtml要素にくっ付けて保持しておいて、
マウスが動いたらそれらから差分取って幅と高さの調整。
マウスボタンが離されたら解除。
マウスが画像からはみ出しても解除。

```html:html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="chrome=1" />
  <title>img resize</title>

</head>
<body>

<div>
    <img id="img" src="img.png" />
</div>

<script type="text/javascript">
window.addEventListener("load", function() {
    var img = document.getElementById("img");

    img.onmousemove = function(e) {
        if(e.target.dragStartEvent) {
            e.target.width  = e.target.dragStartWidth - e.target.dragStartEvent.x + e.x;
            e.target.height = e.target.dragStartHeight - e.target.dragStartEvent.y + e.y;
        }
        e.preventDefault();
        e.stopPropagation();
    };
    img.onmouseout = function(e) {
        delete e.target.dragStartEvent;
    };
    img.onmousedown = function(e) {
        e.target.dragStartEvent = e;
        e.target.dragStartWidth = e.target.width;
        e.target.dragStartHeight = e.target.height;
    };
    img.onmouseup = function(e) {
        delete e.target.dragStartEvent;
    };

}, false);

</script>

</body>
</html>
```
空きサーバで分散暗号通貨Quarkを掘る(基礎編)

ビットコイン(Bitcoin)の採掘は、専用ASICが開発されてしまって多大なコストが掛かるようになりましたが、ハッシュに別のアルゴリズムを使った分散暗号通貨ではまだCPUによる採掘が可能です。

ここでは、[Quark](http://www.qrk.cc/)(単位QRK)と呼ばれる分散暗号通貨を、すでに動いているサーバの空き領域を使って採掘する方法を説明します。


電子財布の用意
-------------

分散暗号通貨すべてに共通するのですが、まず暗号通貨を保管する財布（ウォレット）を準備する必要があります。

[Quark](http://www.qrk.cc/)のサイトより`Quark-QT`を自分の環境Windows/MacOS/ANDROID版に合わせてダウンロード＆インストールしてください。
ネットからブロックチェイン（と呼ばれる取引台帳）を延々とダウンロードしますので起動したまま放置（12時間位かかる)


### 受け取りアドレスの作成

この財布に採掘したQuarkが入るように設定します。（放置中にも設定可能)

受け取りアドレスの作成は、下のスクリーンキャプチャを御覧ください。ここで作成した`Q`から始まるAddressがこの財布に入るユニークな口座番号になります。

![Quark-QT](https://www.evernote.com/shard/s1/sh/06940727-5d20-4b77-b98c-ee3511f3348e/205d4e1165423a2437be79e7293948d7/deep/0/New-receiving-address-と-Quark---Wallet.png)


採掘
----

開いているサーバにマイナーをインストールします。

以下CentOS6.5での例です。


```
sudo yum upgrade
sudo yum install gcc make curl-devel git screen
git clone https://github.com/Neisklar/quarkcoin-cpuminer.git
cd quarkcoin-cpuminer/
./autogen.sh 
./configure CFLAGS="-O3"
make
sudo make install
```

実際に採掘するには、インストールされた`minerd`というコマンドを利用します。
他の用途のじゃまにならないよう優先度を下げて起動します。

```
nice -n 19 minerd -a quark -t 13 -o http://p2pool.org:8372 -u QNpzc8AZAb1DmyfU7CVFE1JtYqUvuoBYmE -p x
```

`QNpzc8AZAb1DmyfU7CVFE1JtYqUvuoBYmE`の部分は、上で作成した受け取りアドレスに変えてください。
このままだと私の財布に入ります（それはそれで歓迎します）

`-t`はthreadの数なので、サーバに割り当てられているCPUのコア数を入れてください。

`p2pool.org`ってなんだ？とか思われるかもしれないのですが、幾つかある共同採掘所の一つだと思ってください。
報酬は共同採掘所から支払われますが、`PPLNS`という方式を使っているため最初の数時間徐々に報酬額が上がっていきます。


この用途で専用に動いている仮想サーバで、OSを含めたメモリ消費は388MByte程度になりましたので、空きサーバの選定の目安にしてください。


Quarkって何に使うの？
----------------------

発掘したQuarkは、あなたの物です。有効期限もないのでもちろんそのまま持っていても問題ありません。

Quarkを直接使える先は非常に少ないのですが、幾つかご紹介します。

### ビットコインと交換する

一番ポピュラーな方法としては、ビットコインに替えることです。

[Cryptsy](https://www.cryptsy.com/users/register?refid=200361)という取引所では、たくさんの種類の分散暗号通貨の交換を行っています。ここに登録してビットコインに交換することができます。現時点の相場は`1QRK=0.00005300BTC`です。

### オンラインショッピング

以下にリストされているお店で利用できるようです

> http://www.qrk.cc/merchants/

また、[ユニットホスティング](http://www.unit-hosting.com)ではQuarkを利用してサーバを借りることができます。（自社宣伝m(_ _)m）

本編は基礎編ということで細かい説明を端折りましたのでご容赦くださいませ。
ローカル環境で、エラー管理Webアプリ「Errbit」を構築してみた


## 経緯
これまでメールでのエラー管理をしてきたが、24時間365日、
私が確認できる訳ではないので、別の方法を模索してきた。

サーバの監視にZabbixを利用しており、Zabbix_senderを利用できるのでは！？とも思いつつ、
いろいろなツールを探してきたところ、ErrbitというWebアプリを見つけた。

"Errbit"で検索すると、herokuでのインストール方法ばかりだが、
ローカルインストールも可能と公式に載ってたので、まずはサーバのインストールを試してみた。

## 環境
OS X 10.9.2 / vagrant ( Debian-wheezy ) \#OSのバージョンが違うので、修正。
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

[Errbit](http://errbit.github.io/errbit/) http://errbit.github.io/errbit/

## インストール

```
$ sudo apt-get update
$ sudo apt-get install mongodb
```

```
$ sudo apt-get install libxml2 libxml2-dev libxslt-dev libcurl4-openssl-dev
```

```
$ sudo gem install bundler
```

と、ここまでは公式ドキュメントどおり。
次の箇所でこけた。

```
$ bundle install
(中略)
An error occurred while installing therubyracer (0.12.0), and Bundler cannot
continue.
Make sure that `gem install therubyracer -v '0.12.0'` succeeds before bundling.
```

`gem update`してなかった(忘れてた)からなのか不明ですが、
`therubyracer -v '0.12.0'`を入れろ、と怒られた。

```
$ sudo gem install therubyracer
```

としたら、今度は`g++`がなくて、makeができない！と＞＜

```
$ sudo apt-get install g++
$ sudo gem install therubyracer
$ bundle install
```

よし、通った。

```
$ bundle exec rake errbit:bootstrap
Copying example config files...
-- Copying config/config.example.yml to config/config.yml
-- Copying config/deploy.example.rb to config/deploy.rb
-- Copying config/mongoid.example.yml to config/mongoid.yml

Seeding database
-------------------------------
Creating an initial admin user:
-- email:    ****@*******
-- password: ******

Be sure to change these credentials ASAP!
```

すると、emailとpasswordが表示されます。
ログイン時に必要なので、メモをしておいて下さい。

```
$ bundle exec script/rails server
=> Booting WEBrick
=> Rails 3.2.17 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
```

これで、IP:3000でアクセスすればWebから操作が可能になります。

## WEBrickエラーの対応
ちょっとWebで操作をしていたら、ターミナルに以下のエラーがたくさんw

```
WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
```

調べたところ、Ruby 1.9.3で出るエラーとのこと。
[Ruby1.9.3のWebrickで出るCould not determine content-length...エラーを消す方法(2.0.0では解決済)](http://d.hatena.ne.jp/kk_Ataka/20130903/1378214760)

パッチを当てれば直るようですが、取り敢えず今回は放置で。

## プラグイン
・[flippa/errbit-php](https://github.com/flippa/errbit-php)
・[emgiezet/errbitPHP](https://github.com/emgiezet/errbitPHP)

こちらはこれから要検証。これが使えたら幅が広がるな。
同一apache内でモジュール版phpとcgi版phpを共存させる

# 同一apache内でモジュール版phpとcgi版phpを共存させる

apache版モジュールのphpを動かしつつ、
特定のディレクトリではcgi版の別のphpを動かす設定。

apache2.22 の場合だけど、2系ならたぶん同じような感じじゃないかな。

## apacheモジュール版php

`yum` でも `apt-get` でも `brew` でもいいからとりあえずパッケージ入れたらモジュール版になると思う。

ソースからビルドしたければ以下のオプションつける。

```bsdh:bash
./configure --with-apxs2 
```
で、ビルドしてインストール。`make && make install`

これでapache内で特に指定しない場合のphpはこれで動くようになるはず。

## cgi版php

### phpのビルド

適宜読み替えてください。

ex) php-5.3.28 をソースから入れる場合。

とりあえずソースは `/usr/local/src/php-5.3.28` に置くとして、
インストールディレクトリも分けておきたい。

そのために最低限必要なオプションはこんな感じ。

```bash:bash
./configure  \
  --prefix=/usr/local/lib/php-5.3.28  \
  --with-config-file-path=/usr/local/lib/php-5.3.28
```

`--with-config-file-path` で`php.ini`を読みにいく場所も指定しておくとよさげ。

で、ビルドしてインストール。`make && make install`

### apacheの設定

#### cgi版phpの準備

apacheのconfで
`ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"`
ってなってる場合。

デフォルトだと `ScriptAlias` で指定してある場所でないとcgi動かないので、
そちらにcgi版phpをコピーする。

`cp /usr/local/lib/php-5.3.28/bin/php-cgi /usr/local/apache2/cgi-bin/php53-cgi`

cgi-binの設定が

```lang:httpd.conf
<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
+    Options +FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>
```
とかシンボリックリンク辿る設定になってれば、シンボリックリンクでもいい。

#### confの設定

最後に、phpを特定のcgi版で動かしたい場合のconfの設定。

```lang:httpd.conf
<Directory /Users/local/apache2/htdocs/php53>
    Options Indexes FollowSymLinks
    AllowOverride All

+    Action php53 /cgi-bin/php53-cgi
+    AddHandler php53 .php

    Order allow,deny
    Allow from all
</Directory>
```

もしくは

```lang:httpd.conf
<VirtualHost *:80>
    DocumentRoot "/Users/local/apache2/htdocs"
+    Action php53 /cgi-bin/php53-cgi
+    AddHandler php53 .php
</VirtualHost>
```

`VirtualHost`ディレクティブにも`Directory`ディレクティブにも書けるので、お好きなように。

`Action php53 /cgi-bin/php53-cgi`で`php53`って名前のActionを定義して、
`AddHandler php53 .php`で拡張子を関連づける。

ここで書いた設定はモジュール版phpよりも優先される。
他にも同居するバージョン増やしたければ同じやり方でおｋ。

### 追記@2014/04/21

#### ソースから入れたphpにエクステンションを入れる場合の例

##### peclの場合

各バージョンのphpにpecl付属してるので、これでおｋ。

```bash:bash
/usr/local/lib/php-5.3.28/bin/pecl install redis
```

##### ソースから入れる場合

`phpize`と`./configure`に一手間必要なのでちょっとめんどくさい。

```bash:bash
cd /usr/local/src/memcached-2.0.0b2
/usr/local/lib/php-5.3.28/bin/phpize
./configure --with-php-config=/usr/local/lib/php-5.3.28/bin/php-config
```
Elixirで直接SQLを書いて実行する

PythonのORMの一種であるElixirを使っているとき、直接SQLを書く必要に迫られた時の方法を残します。

※ここではORMを使っているのに直接SQLを書く時の是非は議論しません。

## コード

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

from elixir import *

days = 10

metadata.bind = "mysql://userid:password@127.0.0.1/test"
setup_all()

sql   = """ 
SELECT DATE_FORMAT( NOW() - INTERVAL %(days)s DAY, '%%Y-%%m-%%d' ) date,
       DATE_FORMAT( NOW(), '%%Y-%%m-%%d' ) today
  FROM DUAL
"""
conn   = metadata.bind.engine.connect()
result = conn.execute( sql, { "days": days } ) 

for row in result:
    print "%sの%d日前: %s" % ( row.today, days, row.date )
```

実行結果は次の通り。

```
2014-04-18の10日前: 2014-04-08
```

## 補足

実態は、ElixirがラップしているSQLAlchemyのAPIを叩いていることになります。

一昔前のプレースホルダーを使ったSQLの実行方法を知っていると、使いやすいかも知れません。

## 参考資料

- [SQL Statements and Expressions API — SQLAlchemy Documentation](http://docs.sqlalchemy.org/en/latest/core/expression_api.html)
GitHubリポジトリのミラー


GitHubというかGHEの同期の方法です.

GHEのインストールされてるホスト`ghe1`,`ghe2`があるとします.
常に`ghe1`から`ghe2`へミラーを送る手順を説明します.

## 事前準備

まずローカルに`ghe1`のミラーを作成と
リモートリポジトリに`ghe2`を追加します.

```bash
git clone --bare git@ghe1:foo/bar.git
cd web.git/
git remote add ghe2 git@ghe2:foo/bar.git
```

## 同期

同期方法は`git-fetch`で`origin`の`ghe1`の変更を取り込みます.

次に`git-push`で`ghe2`へ向けてpushします.

以上終わり.

```bash
git fetch --prune origin 'refs/heads/*:refs/heads/*'
git push ghe2 --mirror
```

## 参考

* [Moving a repository from GitHub.com to GitHub Enterprise](https://enterprise.github.com/help/articles/moving-a-repository-from-github-com-to-github-enterprise)
CentOS 6.5 で OpenLDAP（4）クライアント環境設定

## 必要パッケージインストール
```shell-session
yum -y install authconfig openldap-clients nss-pam-ldapd
```

## OpenLDAPクライアント設定
```shell-session
authconfig \
 --enableldap \
 --enableldapauth \
 --ldapserver="ldap://192.168.0.10/" \
 --ldapbasedn="dc=example,dc=com" \
 --enablemkhomedir \
 --update
chkconfig nslcd on
```

## /etc/ssh/ldap.conf 確認
```text:/etc/ssh/ldap.conf
uri ldap://192.168.0.10/
base dc=example,dc=com
host 192.168.0.10
ssl no
```

## /etc/pam_ldap.conf 確認
```text:/etc/pam_ldap.conf
uri ldap://192.168.0.10/
base dc=example,dc=com
host 192.168.0.10
ssl no
```

## /etc/nslcd.conf 確認
```text:/etc/nslcd.conf
uid nslcd
gid ldap
uri ldap://192.168.0.10/
base dc=example,dc=com
ssl no
```

## /etc/openldap/ldap.conf 確認
```text:/etc/openldap/ldap.conf
URI ldap://192.168.0.10/
BASE dc=example,dc=com
```

| オプション名 | 説明 |
|---|---|
| --enableldap | LDAPを有効にする |
| --enableldapauth | LDAP認証を有効にする |
| --ldapserver | LDAPサーバーを指定する |
| --ldapbasedn | LDAP検索のベースを指定する |
| --enablemkhomedir | ホームディレクトリを自動的に作成する |

## クライアント確認
```shell-session
id takahiko.takeda
```
>
```shell-session
uid=1001(takahiko.takeda) gid=1000(system) 所属グループ=1000(system)
```

## SSH確認
| ユーザーID | パスワード |
|---|---|
| takahiko.takeda | 5k9eC2H5 |
| shinya.yokoyama | QaEiE46y |
| osamu.inoue | 6ofgjZDu |
| naoki.ishikawa | QBe6pGUV |
| kazuo.tamura | 4PM8nGuX |

上記、それぞれSSHにてログイン出来るか確認する
Smarty 3.1.13 のテンプレート内で生php実行

Smarty3系列だとデフォルトで{php}タグが使えない
==========================================
ググってみたらやたらと allow_php_tag な情報ばかり見つかるので真似してみたけど、そんなプロパティ無いって怒られる。Smarty 3.1.13 の時点では allow_php_tag は obsolete になってました。

エラー例
=======
テンプレートファイル
-----------------
```
<html>
{php}
$a = 10;
echo $a;
{/php}
</html>
```

Smartyエンジン呼び出し部分
-----------------------
```php
require_once('..../smarty/libs/Smarty.class.php');
$smarty = new Smarty();
....
$smarty->display('..../hoge.tpl');
```

エラーログ
---------
```
PHP Fatal error:  Uncaught exception 'SmartyCompilerException' with message 'Syntax Error in template .... &quot;{php}&quot; unknown tag &quot;php&quot;' in /..../smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php:665
```
unknown tag、といわれましても。

対処
====
Smartyエンジン呼び出し部分を変更
-----------------------------
Smarty ではなく SmartyBC を使い、php_handling に Smarty::PHP_ALLOW を設定。

```php
require_once('..../smarty/libs/SmartyBC.class.php');
$smarty = new SmartyBC();
$smarty->php_handling = Smarty::PHP_ALLOW;
....
$smarty->display('..../hoge.tpl');
```
sed | sed -> sed -e '' -e ''

```bash
$ echo a | sed 's/a/b/' | sed 's/b/c/'
c
```

```bash
$ echo a | sed -e 's/a/b/' -e 's/b/c/'
c
```

下の方が好みなんだけど、動作が微妙に違ったりとかするのかな。多分、変わらないと思うんだけど。
ssh-copy-idをmacで使う方法

<b>ssh-copy-id：自身の公開鍵を指定ホストに登録</b>

Linuxでよく使ったてたのでMacでも使いたくなった。

適当なLinuxサーバーに入ってシェルスクリプトをコピーする。

```
$ ssh user@host
$ which ssh-copy-id
$ cat シェルスクリプトパス
```

Macの/usr/local/bin/に同じシェルスクリプト作成。

```
$ vi /usr/loca/bin/ssh-copy-id
$ さっきコピーしたものを貼付け
```
Docker で CUDA を使う.


漢なら docker コンテナで CUDA を使いたいですね!
CUDA を使えるようにしましょう.

## セットアップ

ホスト OS に CUDA とドライバ一式をいれておきます.
今回は 

* Centos6.5
* CUDA 6.0(driver 331.67)
* /usr/local/cuda に nvcc やら toolkit をインストール

にしました.

## コンテナ内で CUDA プログラムを動かす.

privileded つきで, libcuda.so と /usr/local/cuda を container に expose(volume mount)します.

サンプルコードを /media にマウントします.

```
$ docker run --privileged -v /usr/lib64/libcuda.so:/usr/lib64/libcuda.so -v /usr/lib64/libcuda.so.1:/usr/lib64/libcuda.so.1 -v /usr/local/cuda:/usr/local/cuda -v /home/syoyo/NVIDIA_CUDA-6.0_Samples:/media -i -t syoyo/centos-gcc48 /bin/bash
```

Container 内で サンプルを実行してみます.

```
# cd /media/0_Simple/vectorAdd
# ./vectorAdd 
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED

# cd /media/0_Simple/vectorAddDrv
# ./vectorAddDrv 
Vector Addition (Driver API)
> Using Device 0: "GeForce GTX 680" with Compute 3.0 capability
> findModulePath found file at <./vectorAdd_kernel64.ptx>
> initCUDA loading module: <./vectorAdd_kernel64.ptx>
> PTX JIT log:

Result = PASS
```

Cool!

HPC 仮想化みたいなことに一歩近づきましたね!

## Todo

* libcuda.so のマウントをより簡略化する.
* CUDA リソース(GPU)をコンテナ間でうまく共有できるかな?
* OpenGL との連携
Maven プロジェクトで依存ライブラリの最新バージョンを調べる

versions プラグインのコマンドを実行します。Maven 2, 3 ともに標準で使えます。

```sh
mvn versions:display-dependency-updates
````

これ、何度か打ってるとソラで入力できるようになりますが、慣れるまではよく間違えますw どこが複数形だったっけ・・みたいな。

実行すると、しばらく時間がかかりますが、結果がこんな感じに出力されます。

```
[INFO] The following dependencies in Dependencies have newer versions:
[INFO]   cglib:cglib ............................................. 2.2.2 -> 3.1
[INFO]   ch.qos.logback:logback-classic ........................ 1.1.1 -> 1.1.2
[INFO]   com.amazonaws:aws-java-sdk ............................ 1.7.2 -> 1.7.6
[INFO]   com.fasterxml.jackson.core:jackson-annotations ........ 2.3.1 -> 2.3.3
[INFO]   com.fasterxml.jackson.core:jackson-core ............... 2.3.1 -> 2.3.3
[INFO]   org.apache.commons:commons-lang3 ...................... 3.2.1 -> 3.3.2
[INFO]   org.hibernate:hibernate-validator ......... 4.3.1.Final -> 5.1.0.Final
[INFO]   org.slf4j:jcl-over-slf4j .............................. 1.7.6 -> 1.7.7
[INFO]   org.slf4j:jul-to-slf4j ................................ 1.7.6 -> 1.7.7
[INFO]   org.slf4j:log4j-over-slf4j ............................ 1.7.6 -> 1.7.7
[INFO]   org.slf4j:slf4j-api ................................... 1.7.6 -> 1.7.7
[INFO]   org.springframework:spring-aop ........ 4.0.2.RELEASE -> 4.0.3.RELEASE
[INFO]   org.springframework:spring-beans ...... 4.0.2.RELEASE -> 4.0.3.RELEASE
[INFO]   org.springframework:spring-context .... 4.0.2.RELEASE -> 4.0.3.RELEASE
[INFO]   org.springframework:spring-context-support ...
[INFO]                                           4.0.2.RELEASE -> 4.0.3.RELEASE
[INFO]   org.springframework:spring-core ....... 4.0.2.RELEASE -> 4.0.3.RELEASE
```

repositories 設定で参照している Maven リポジトリを全部なめて最新版を探すので、設定によって結果は変わることがあります。
Facebookユーザー名からFacebookユーザー情報（IDとかその辺）を調べる

Facebookと連携しているアプリで、ユーザーのFacebookIDを知りたい状況が発生。

```php
https://www.facebook.com/profile.php?id=012345678901234567890
```

↑の様なURLのユーザーならそのままid=以下を取ればいい。

でも

```php
https://www.facebook.com/{USERNAME}
```

↑の様なURLを設定しているユーザーだと工夫が必要。

例えば、Mark ZuckerbergのURLは↓な感じ。
本人のタイムラインページへ行くとURL欄に出てくる。

```php
https://www.facebook.com/zuck
```

このURLのwwwの部分をgraphに変える。

```php
https://graph.facebook.com/zuck
```

これをブラウザでアクセスしたり、curlでアクセスしたりすると、JSONでレスが返ってくる。

```json
{
  id: "4",
  name: "Mark Zuckerberg",
  first_name: "Mark",
  last_name: "Zuckerberg",
  link: "https://www.facebook.com/zuck",
  username: "zuck",
  gender: "male",
  locale: "en_US"
}
```

↑の様に個人情報が見れちゃう。
このidの部分がFacebookのUserIdになっている。
大文字/小文字のString文字列からEnumの要素を取得する


[args4j](https://github.com/kohsuke/args4j)というのを知って、なんでだろうと思ってたら、[こんな実装](https://github.com/kohsuke/args4j/blob/master/args4j/src/org/kohsuke/args4j/spi/EnumOptionHandler.java)をしてた。
勉強になりました。

```
import org.junit.Test;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public class EnumTest {

    @Test
    public void test() throws Exception {
        String val = "local";
        Class<ENV> clazz = ENV.class;
        ENV target = null;
        for (ENV env : clazz.getEnumConstants()) {
            if(env.name().equalsIgnoreCase(val)){
                target = env;
                break;
            }
        }
        assertThat(target, is(ENV.LOCAL));
    }

    private static enum ENV {
        LOCAL,
        PRODUCTION;
    }
}
```
Macでパスワードをコピペで入力できないとき自動で入力させる (AppleScript)


たまに、パスワード欄にコピペでズルして入力できないソフトがあったりします。
AppleScriptを使えばキーボード入力をエミュレートできるので、コピペ不可でも自動入力できます。
(色んな意味で自己責任でお願いします！)

# 準備
「AppleScriptエディタ」の設定画面で「メニューバーにスクリプトメニューを表示」を有効にしておきます。
(ついでに、「コンピュータスクリプトを表示」を無効にしてます。)
![スクリーンショット 2014-04-18 14.54.14.png](https://qiita-image-store.s3.amazonaws.com/0/18902/3ad1f7a4-f79f-800e-acaf-0559437dcd30.png "スクリーンショット 2014-04-18 14.54.14.png")

右上にスクリプトメニューが表示されます。
![スクリーンショット 2014-04-18 14.55.10.png](https://qiita-image-store.s3.amazonaws.com/0/18902/27ac0f58-53f9-a218-7e3a-0630f2381a0d.png "スクリーンショット 2014-04-18 14.55.10.png")

「スクリプトフォルダを開く」をクリックし、開いたフォルダの中にAppleScriptを保存すれば、上の画像の「input_pass」みたいに表示され、クリックするだけで即実行可能になります。

# スクリプト作成

AppleScriptエディタを開き、以下のスクリプトをコピペしてスクリプトフォルダに保存します。

```applescript:input_pass.scpt
set strOfClip to clipboard info for string

if strOfClip is not {} then -- クリップボードの中身が文字列であれば実行
	set clip to get the clipboard
	
	if clip contains " " then
		display alert "スペースを含む文字列は入力できません。"
	else
		tell application "System Events"
			key code 102 -- 英数にしておく (USキーボードでも可能らしい)
			
			set chars to characters of clip
			
			repeat with char in chars
				delay 0.1
				keystroke char
			end repeat
			
			beep
		end tell
	end if
end if
```

# 実行
パスワードをコピーし、入力したいテキストボックスに移動した後、スクリプトメニューからこのスクリプトを実行するだけで自動入力されます。

試しに以下の文字列をコピーしてテキストエディタとかに自動入力させてみましょう。
`Kmsbw@m;,2MU$dzyQX=amry43jqc29`
(自動生成しましたが使ってない全く意味のない文字列です)

## 注意
バックスラッシュは「¥」と入力されます。

スペースを含む文字列だとなぜかことえりの日本語入力がONになってしまうのではじいてます。
普通にキーボードからスペースを入力しても、日本語入力にはならないのに、なぜ。
パスワードにスペース使わないと思うので大丈夫かと思いますけど。
`keystroke space`ってやっても同じ結果でした。(当たり前か)

あと、日本語が含まれてると"a"が入力されるみたいです。
とりあえず自分がやりたかったことは出来たので、エラーチェックとかはしてません。
テキストエディタ等で試してから使いましょう。

なんかマズいとこあったら指摘していただけるとありがたいです！

あと、Virtual Boxで使おうとすると、記号とか含んでなくてもなぜかカーソルがあらぬところへ移動します。
原因は分かりません。(誰か教えてください。)

# その他のやり方
文字列を選択してクリックしたまましばらく待つとカーソルが矢印に変わります。
そうすると文字列をドラッグアンドドロップでコピーできるので、目的のテキストボックスにコピーできることがあります。
(何か忘れたけどこれでいけたソフトがあった)

# 参考
[サンプルのページ](http://www.asahi-net.or.jp/~va5n-okmt/factory/applescript/sample_code/pages/sample.html#gettheclipboard)
[GUIスクリプティングで使いたくなる道具 - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20100118/1263805168)
[わかばマークのMacの備忘録 : Quicksilver/ 「英数」入力でQSを呼び出す](http://wakabamac.blog95.fc2.com/blog-entry-571.html)
[display dialogとdisplay alertの違い - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20110622/display_dialog_vs_alert)
Heartbleed以後の対策の1つで希望の光「Forward Secrecy」をnginxに設定する巻

# 背景

[「Heartbleed以後」のインターネットを守るために重要な「Forward Secrecy」とは](http://ascii.jp/elem/000/000/885/885871/) という記事を見て、どうやらHeartbleedの様な致命的なバグに対して効果を発揮するForward Secrecy（Perfect Forward Secrecy : PFS）といった対策方法があるらしい。

#### 関連記事
* [Lavabit 事件とその余波、そして Forward Secrecy](http://negi.hatenablog.com/entry/2013/11/05/093606) - NSAのスノーデン事件のあたりで有名になった話。Foward Secrecyについての導入状況（2013年11月時点？）で書かれている。

# Nginxへの導入方法

参考にしたのは、

* [nginx ssl config with forward secrecy enabled](https://coderwall.com/p/ebl2qa)
* [Setting up Perfect Forward Secrecy for nginx or stud](http://baudehlo.com/2013/06/24/setting-up-perfect-forward-secrecy-for-nginx-or-stud/)

前提：既にSSLが設定されているとして`/etc/nginx/nginx.conf`あたりのssl設定されているconfに追加してreloadするのみ。

```nginx:/etc/nginx/nginx.conf
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+RC4:EDH+aRSA:EECDH:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
```

簡単に設定できるとあって、本当か？と思ったけど本当だった…（所要時間5分もない）
![nginx_ssl_.png](https://qiita-image-store.s3.amazonaws.com/0/39825/6424824d-ea53-0e1b-748f-f7e1e1433d3a.png)
カーネル関数

パラメトリックな線形モデルの多くは同値の双対表現の形に表すことができます。予測も訓練データ点を中心として定義される **カーネル関数 (kernel function)** の線形結合を用いて行われます。

あらかじめ定義された非線型の **特徴空間 (feature space)** への写像 Φ(x) に基づくモデルにおけるカーネル関数は次の関係になります。

```math
k(x, x') = \phi(x)^T \phi(x')
```

[以前のサポートベクトルマシンの話](http://qiita.com/ynakayama/items/afa2212cf561f2067606)ではグリッドサーチで最適なカーネル関数を導出しました。カーネル関数には多くの種類があります。このうち引数の差のみに注目したのは **不変カーネル (stationary kernel)** と言われます。これに対し 2 つのベクトルの距離にのみ依存するのは **均一カーネル (homogeneous kernel)** と言われます。

カーネル関数の制約
* 共分散行列が正定値である
* グラム行列が半正定値である
(シグモイドカーネルについては例外的です)

## ガウシアンカーネル

ガウスカーネルに対応する特徴ベクトルは無限次元であり、カーネル置換を用いることで変換できます。

```math
k(x, x') = \exp(-\frac {||x - x'||^2} {2\sigma^2} )
```

元の空間上で孤立した点は、カーネル特徴空間上では原点付近に分布します。

## 生成モデルとフィッシャーカーネル

確率的生成モデルからカーネル関数を構成する方法があり、生成モデルを分類に用いることができるようになります。これに対し識別モデルでは分類問題において性能が優れることが知られています。生成モデルでカーネルを定義、このカーネルを用いて識別アプローチを取るといった方法は、これら 2 つのアプローチを組み合わせる方法のひとつです。

パラメータベクトル θ を持つパラメトリックな生成モデル p(x|θ) において、生成モデルから 2 つの入力ベクトル x と x' の間の類似度を測るカーネルを見つける方法があります。

```math
k(x, x') = g(\theta, x)^TF^{-1}g(\theta,x')
```

ここで F は[フィッシャー情報量行列](http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC%E6%83%85%E5%A0%B1%E9%87%8F)です。

実際の利用においてはフィッシャースコアの共分散行列を利用し、不変ではなくなるもののより簡単に次のように定義します。

```math
k(x, x') = g(\theta, x)^Tg(\theta,x')
```

## シグモイドカーネル

[シグモイドカーネル](http://ibisforest.org/index.php?%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB)の[グラム行列](http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%A0%E8%A1%8C%E5%88%97)は必ずしも[半正定値](http://ja.wikipedia.org/wiki/%E5%9B%BA%E6%9C%89%E5%80%A4#.E6.AD.A3.E5.AE.9A.E5.80.A4.E3.81.A8.E5.8D.8A.E6.AD.A3.E5.AE.9A.E5.80.A4)にはなりません。しかしこのカーネル関数を利用したサポートベクトルマシンはニューラルネットワークと表層的に類似したものになります。

```math
k(x, x') = \tanh(ax^Tx' + b)
```

なお、基底関数が無限にある場合、適当な事前分布を持つベイズニューラルネットワークはガウス過程に一致すると言われています。

## まとめ

カーネル関数についてざっくりと説明しました。
次回は RBF ネットワークとガウス過程を取り上げたいと思います。

## 参考

パターン認識と機械学習 下 (ベイズ理論による統計的予測) 
http://www.amazon.co.jp/dp/4621061240/
VisualVM + Visual GC pluginでGCを可視化


JVMのHeap tuningをする時にHeap領域 & GCを可視化したいと思って探したToolの備忘録です。

# Prerequisite
----
- VisualVM
 - http://visualvm.java.net/
 - Oracle Java JDKにも同梱されている
- Visual GC plugin
 - VisualVMのツール->プラグインからInstallする
- jstatd (monitoring対象のserver)
 - Oracle Java JDKに同梱されてる

Oracle Java JDKを使っていれば全部揃ってます。

# jstatd起動
----
可視化したい対象serverで`all.policy`ファイルを作成し、`jstatd`を起動します。

```all.policy
grant {
    permission java.security.AllPermission;
};
```

```shell
$ jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.hostname=<host ip> &
```

# VisualVM起動 & GCを見る
----
VisualVMを起動してリモートに対象serverを登録すると自動的にjstatdへ接続され、Visual GCでHeap領域とGCの様子が見えます。

※VisualVMではJMXを通じたmonitoringもできますが、Visual GCはjstatdでないと利用できませんでした。
[一日一Vim](その5)選択した文字列をペーストで置き換えると、次にペーストされる文字は置き換え前の文字になるのをどうにかしたい。

# どうにかしたいこと
以下のようなテキストがあったとして

```
var1 = "こんにちは Qiita!!";
var2 = "Hello Qiita!!";
```

文字列の中身を"hogehoge" で置き換えたい!って時に
すでに"hogehoge"がヤンクされているとして
一個目の文字列を`vi"`で選択して`p`で置き換え
ニ個目の文字列に移動して`vi"`で選択して`p`で置き換え
ってすると、ニ個目は"こんにちは Qiita!!"がペーストされます。

置換でやればいいんですが、今回は別の方法ということで...

# vim-operator-replace

[その2](http://qiita.com/bamchoh/items/7683f39bef15b9ba8c9f) で @X___MOON___X さんが教えてくださった[サイト](http://d.hatena.ne.jp/osyo-manga/20140307/1394204974)に
vim-operator-replace というプラグインが紹介されていました。
その説明に「レジスタを汚さないでテキストオブジェクトをヤンクしたテキストに置き換える」
とあります。ほうほう。早速入れてみました。
インストール時に参考にしたのは[こちらのサイト](http://kazuph.hateblo.jp/entry/2013/01/04/005030)

# 使ってみた
さっきの例でいうと。まず"hogehoge"をヤンクしておきます。
そして一つ目の文字列を選択して`Ri"`。
二つ目を選択して`Ri"`。

期待通りの結果になりました。便利！

# ただ。。。
これを使うと、どこからどこまでが置換範囲なのかよくわからないということが難点です。
`"0p`をどこかのキーにバインドして(例えば`P`)、`vi"` -> `P` とする方が私の要望に
あっているのかもしれません。
fortran: 構造体(type)


下記のように，構造体の中にallocatable変数を用意して，その構造体の配列を作れば，異なる長さの配列の配列が作れる．結構便利と思う．

```F90:test.F90
program test
  implicit none
  type mytype
    integer:: larr
    real(8),allocatable:: arr(:)
  end type mytype

  integer:: i
  type(mytype):: mt(2)

  mt(1)%larr= 2
  mt(2)%larr= 3

  allocate(mt(1)%arr(at(1)%larr),&
       mt(2)%arr(at(2)%larr))

  print*, (mt(1)%arr(i),i=1,mt(1)%larr)
  print*, (mt(2)%arr(i),i=1,mt(2)%larr)
  
end program test
```

上のプログラムを実行すると，

```Bash
$ g95 test.F90
$ ./a.out
 0. 0.
 0. 0. 0.
```

となり，一応ちゃんと長さの異なる配列を持つ配列ができている．


### 参考webサイト
* http://www7b.biglobe.ne.jp/~fortran/education/fortran90/sec9.html
Solrで緯度経度検索をする

![solr.png](https://qiita-image-store.s3.amazonaws.com/0/5669/4a56fd05-2368-0977-6836-f7f17e861005.png)

Solrで緯度経度検索をする場合にはSpatial Searchを使います
検索項目に位置情報のフィルタリングを追加することで、検索の可能性を広げることができます

## Spatial Searchで必要な設定
- JTS(JTS Topology Suite)のインストール
- 緯度経度検索をするフィールドタイプを追加
- 追加したフィールドタイプのフィールドを定義

JTSはJavaのライブラリで、地理空間情報処理のためのジオメトリエンジンです

### JTS(JTS Topology Suite)のインストール

位置情報検索をするためのライブラリをSolrのlibディレクトリに配置します

JTSをダウンロードして解凍します

```
$ http://sourceforge.net/projects/jts-topo-suite/files/latest/download
$ unzip jts-1.13.zip
```

```
drwxr-xr-x 2 user user 4096 12月 10  2012 bin
drwxr-xr-x 3 user user 4096 12月 11  2012 doc
drwxr-xr-x 5 user user 4096 12月 13  2012 jtsio
drwxr-xr-x 2 user user 4096 12月 13  2012 lib
drwxr-xr-x 3 user user 4096 12月 13  2012 src
drwxr-xr-x 8 user user 4096  2月  8  2010 testxml
```

以下の２ファイルを`$SOLR_HOME/lib`にコピーします
```
$ cp lib/jts-1.13.jar /usr/local/tomcat/webapps/solr/WEB-INF/lib/
$ cp lib/jtsio-1.13.jar /usr/local/tomcat/webapps/solr/WEB-INF/lib/
```

### 緯度経度検索をするフィールドタイプを追加

位置情報検索用のフィールドタイプを追加します

```schema.xml
    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
    spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory"
    distErrPct="0.025"
    maxDistErr="0.000009"
    units="degrees" />
```

### 追加したフィールドタイプのフィールドを定義

緯度経度検索をするフィールドを、追加したフィールドタイプで定義します

```schema.xml
  <field name="prefecture"            type="pint"          indexed="false" stored="true"   multiValued="false"/>
```

設定が完了したらTomcatを再起動してインデクシングします。

今回はMySQLのgeometry型で緯度経度を保持している想定で作ったため、DataImportHandlerでデータを取得する再には以下のように取り込める状態に変換しました

```
concat(CAST(X(TKL.point) AS CHAR),' ',CAST(Y(TKL.point) AS CHAR)) AS point

※緯度経度の間にスペースがはいる以下の書式で取り込めます
35.01423 135.748218
```

データとしてはテスト用に以下のものを用意しました

検索地点：
京都駅 = 緯度：34.985458 経度：135.757755

検索対象データ：
二条城 = 緯度：35.01423 経度：135.748218
金閣寺 = 緯度：35.03937 経度：135.729243

まずは京都駅から半径10km圏内ということで以下のクエリをなげてみたところ、金閣寺と二条城両方が該当しました

```
{!geofilt point=distance sfield=point pt=34.985458,135.757755 d=10
}
```

![スクリーンショット 2014-04-18 12.35.30.png](https://qiita-image-store.s3.amazonaws.com/0/5669/64403572-e2f7-2e83-1215-9856c1168d54.png)

距離は以下のように２つとも10km以内なので、期待した結果が返ってきました

金閣寺 <-> 京都駅 約6.5km
二条城 <-> 京都駅 約3.3km

次は、半径4km以内で検索してみました

```
{!geofilt point=distance sfield=point pt=34.985458,135.757755 d=4
}
```

![スクリーンショット 2014-04-18 12.35.48.png](https://qiita-image-store.s3.amazonaws.com/0/5669/d44a97b9-f031-c831-eff5-bdd26b08ac11.png)

今度は6kmはなれた金閣寺が出てこなかったので、これも期待した結果です

二条城が3km離れているので、2kmで検索してみました

次は、半径4km以内で検索してみました

```
{!geofilt point=distance sfield=point pt=34.985458,135.757755 d=2
}
```

![スクリーンショット 2014-04-18 12.36.23.png](https://qiita-image-store.s3.amazonaws.com/0/5669/85702886-2048-0b2c-b46d-11e4ea6835c4.png)

次は両方とも該当しないという結果となりました。

テストとしては上記のデータではまだ不十分ですが、とりあえず機能を実装するといところまでは以上です。

## 参考ページ
- https://wiki.apache.org/solr/SpatialSearch
- https://cwiki.apache.org/confluence/display/solr/Spatial+Search
祝！Ubuntu 14.04 LTSリリース！さっそくVagrantでいじってみる


昨日Ubuntu 14.04 LTSがリリースされました。
さっそく色々いじくりまわすべく、Vagrant環境で使えるようにしたいと思います。

## Vagrant boxのインストール

実はUbuntu公式のVagrant boxが公開されています。
下記のコマンドでインストールしましょう。

```
vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

## ゲストの初期化・起動

適当なディレクトリーで下記のコマンドを実行すれば、ゲストが起動できます。

```
vagrant init trusty64
vagrant up
```

ChefとPuppetがインストール済みのようです。いろいろいじってみましょう！

## 備考

boxをカスタマイズしたい向きには[Ubuntu 14.04 を Vagrant に準備する](http://qiita.com/seizans/items/ef220c98fde6dbfbee32)にPackerを使った手順があります。
veewee のインストール


veewee とはオリジナルの Vagrant用 Box を作るツールです。
veewee のインストール方法はいくつかあるのですが、今回は`vagrant plugin install veewee`をしてエラーが発生したのでそのメモを残します。

## libxml-ruby のインストール失敗

環境によっては以下の様なエラーが発生します。

``` console
$ vagrant plugin install veewee
Installing the 'veewee' plugin. This can take a few minutes...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing libxml-ruby (2.7.0), and Bundler cannot continue.
Make sure that `gem install libxml-ruby -v '2.7.0'` succeeds before bundling.
```

これは、libxml のヘッダーファイルが見つからないため。

以下で解決。

``` console
$ sudo apt-get install libxml2-dev
```

`vagrant plugin install --verbose veewee` すればわかったかもしれないがすでにインストール済みなので未確認。

### 追記
この形でインストールすると、`~/.vagrant.d/gems/bin` 以下にいストールされるだけの模様。（vagrant 自体のコマンドが拡張されたりはしない）
sbt plugin が依存する不要な dependency を exclude する

例えばこういうのですね。実際には Jetty 9 しか使わないのに sbt の初回起動時に Jetty 6 とか Tomcat とかをダウンロードしないといけないのを抑止したい。

https://github.com/earldouglas/xsbt-web-plugin/blob/master/project/Build.scala

xsbt-web-plugin がこうなっているのは、利用する側が sbt プラグインのための libraryDepenencies を自分で追加しなくても単に build 設定の方に必要な container scope を指定するだけでよいという利点はあるのかなとは思います（推測ですが）。

ですが、ivy が jar ファイルをサチる＆ダウンロードする速度は遅い上に直列化されているので、少しでも jar ファイルのダウンロードは可能な限り減らしたいのが人情です。

Twitter でぼそっとつぶやいたら、賢者の声が。

<blockquote class="twitter-tweet" lang="en"><p>sbt plugin が依存していて絶対使わない libraryDependencies を exclude できたら相当嬉しいのだが、やり方がわからない。ドキュメント見た限りできなさそうな。</p>&mdash; Kazuhiro Sera (@seratch_ja) <a href="https://twitter.com/seratch_ja/statuses/456783848940924928">April 17, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/xuwei_k">@xuwei_k</a> 具体的にはこれとか Jetty の一つのバージョンしか使わないのに全部ダウンロードせざるを得なくて、そういうのを使う側で exclude(...) と同じように無視できたら嬉しいなと。 <a href="https://t.co/isBQkdWDQc">https://t.co/isBQkdWDQc</a></p>&mdash; Kazuhiro Sera (@seratch_ja) <a href="https://twitter.com/seratch_ja/statuses/456785122537136128">April 17, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/seratch_ja">@seratch_ja</a> <a href="https://t.co/l3RrNxFnaw">https://t.co/l3RrNxFnaw</a> addSbtPluginというのは結局libraryDependencies追加してるだけだから、Build.scalaで書くのと同じようにplugin.sbtでexclude書いたらうまくいかないですかね？</p>&mdash; Kenji Yoshida (@xuwei_k) <a href="https://twitter.com/xuwei_k/statuses/456786525619884032">April 17, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで

```scala
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0" excludeAll(
  ExclusionRule(organization = "org.mortbay.jetty"),
  ExclusionRule(organization = "org.apache.tomcat.embed")
))
```

のように普通に exclude/excludeAll を書くだけでよかったのでした。
ローカルのRailsアプリがOpenGraphやTwitter Cardに対応しているか確認する


もっとラクにできる方法があれば教えて下さい。

## やりたいこと

- ローカルのRailsアプリを、FacebookのOpen GraphやTwitterのTwitter Cardに対応させたい。

- 対応状況を[Card Validator | Twitter Developers](https://dev.twitter.com/docs/cards/validation/validator)とか、[デバッガー](https://developers.facebook.com/tools/debug/)を使って確認したい。

- ただローカルにあるのでいちいちHerokuとかでアプリを立ちあげて確認しないといけない。

## 解決策

[ProxyLocal](http://proxylocal.com/)を使って、ローカルのRailsアプリを外部からアクセスできるようにして確認しました。

### やり方


```bash:
$ rails s
```

で、``http://localhost:3000``にローカルのRailsアプリを起動する。

```bash:
$ proxylocal 3000 --host hoge
```

``http://hoge.proxylocal.com/``にアクセスすることができます。

``--host``での指定がないとサブドメインがランダムで表示されます。

その後、[Card Validator | Twitter Developers](https://dev.twitter.com/docs/cards/validation/validator)とか、[デバッガー](https://developers.facebook.com/tools/debug/)で確認する。


## 参考

- [Facebook OpengraphAPIのローカルテスト方法 | KonifarPod](http://konifar.com/1195)

- [ローカルのWebサーバーを簡単にネットからアクセス可能にするproxylocalが便利 - komagata](http://docs.komagata.org/4789)
[Rails][CentOS]データ分析サービスTreasureDataを導入


##TreasureDataとは
データの収集、保存、分析のためのワンストップクラウドデータサービスだそうです。
http://www.treasuredata.com/jp/

AWSとかだと自前でS3にfluentdでログ収集してElasticMapReduceやRedshift構築してやっと分析！ってなるのを
ログ収集の設定とGem入れるだけでログが収集されていつでもHiveクエリーで分析できるよ！っていう素敵なサービス。

しかもスタートアップのWebサービスとかだと割と無料範囲でいけるんじゃないかなぁ。
ログを収集する程度によるけど。

##今回は
CentOSにRubyonRails(Ruby1.9.3p286, Rils3.2.13)環境で説明します。
バージョンによっての違いはあまり無いようです。

※まとめてる途中で気づいたんですが、TreasureDataのサイト上で全く別のやり方も書いてありました。今回は僕がやった方法を記載しますね。yumとか使ってたからそっちのほうが楽かも。

##TreasureDataに登録
http://www.treasuredata.com/jp/products/try-it-now.php
このへんから登録してください。
無料版なら登録はメールアドレスとか入力するだけだからすぐですー。

##CentOS側の設定

1.rpmをダウンロード

```
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
```

2.デーモンが起動するか確認

```
$ /etc/init.d/td-agent start 
Starting td-agent: [  OK  ]
```

いつもどおりこれらが対応してるみたい

```
$ /etc/init.d/td-agent start
$ /etc/init.d/td-agent stop
$ /etc/init.d/td-agent restart
$ /etc/init.d/td-agent status
```

3.設定ファイルの確認

```
$ sudo vi /etc/td-agent/td-agent.conf
```

`apikey YOUR_API_KEY`となっているのでTreasureDataのサイト上で取得できる自分のAPIKeyを入力する

変更したら

```
$ sudo /etc/init.d/td-agent restart
```
を忘れずに。

4.データが入るかテストする

```
$ curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
```

`/var/log/td-agent/td-agent.log`を確認して、`{"json":"message"}`っぽいログが出ていることを確認する。

##Rails側の設定
1.Gemをインストールする

```Gemfile
gem 'td', "~> 0.10.6"
```

2.confit/treasure_data.ymlの作成

```treasure_data.yml
production:
  agent: "localhost:24224"
  tag: td.production_database_name
  debug_mode: false

development:
  agent: "localhost:24224"
  tag: td.development_database_name
  debug_mode: false

test:
```

tagのデータベースの名前は適宜変更する。
td.の後ろね。
これがTreasureData上でもデータベース名として表示されます。

3.コードを埋め込む

```
# Example1: login event
TD.event.post('login', {:uid=>123})

# Example2: follow event
TD.event.post('follow', {:uid=>123, :from=>'TD', :to=>'Heroku'})

# Example3: pay event
TD.event.post('pay',
              {:uid=>123, :item_name=>'Stone of Jordan',
               :category=>'ring', :price=>100, :count=>1})
```

※上記はTreasureDataのHP上でサンプルとして書かれているコードです。
こちらも適宜変更してください。

4.実行してログが取得できているか確認する

```
$ td tables
```
でテーブルを確認。

・・・とやると怒られた。
先にアカウント情報をセットしないといけないらしい

```
$ td account
```
でTreasureDataに登録したメールアドレスとパスワードを設定。

そしたら次にDBを作ってと言われたので作成

```
$ td db:create production_database_name
```
※production_database_nameは`treasure_data.yml`に設定したDBの名前にしてください

さらにテーブルも作成するようなので作成

```
$ td table:create production_database_name login
$ td table:create production_database_name follow
$ td table:create production_database_name pay
```

login, follow, payというのは
`TD.event.post('login', {:uid=>123})`
のイベント名のところ。
これがテーブルの名前になるみたい。

もろもろ設定完了したらまた実行したりして

```
$ td tables
```
とやってログが出力されているか確認できる

##TreasureData上にもログが飛んできていることを確認
コンソールにログインして、Databasesのところから見れる。
さっき設定したDBやテーブルがあって、ログが出力されていればOK。

##まとめ
この出力したログをHiveとかPigとかのクエリーを使ってデータ抽出できるみたい。
まだデータ溜めてる状態なのでこれから。
またわかったこととかあったらまとめます。