OmniAICreator/Qiita-1.07M huggingface dataset:
centos6 に varnish 4.x install

centos6 に varnish をいれます。

```shell-session
#wget http://dl.fedoraproject.org/pub/epel/6/x86_64/jemalloc-3.6.0-1.el6.x86_64.rpm
#rpm -ivh jemalloc-3.6.0-1.el6.x86_64.rpm
#rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
#yum install varnish
```

✧＼\ ٩( `v' )و /／✧
SublimeText3でPythonでGOTO


## 目標
*virtualenvのPackageの定義にGOTO*


## 手元の環境
SublimeのPackageのAnacondaを使う。

* OS X @ 10.9.4
* Python @ 2.7.8
* ST3 @ Build 3065
* Anaconda @ 1.3.1


## 想定

* Djangoで開発をしてる
* virtualenvは`/path/to/venv/bin/python`
* プロジェクトは`/path/to/project/`
* Djangoのappは`/path/to/project/apps`に隔離している

## やり方
SublimeのProjectからAnacondaにvirtualenvのPathと追加Path教える。

```json:example.sublime-project
{
	"folders":
	[
		{
			"follow_symlinks": true,
			"path": "."
		}
	]
	"settings":
	{
		"extra_paths":
		[
			"/path/to/project/apps"
		],
		"python_interpreter": "/path/to/venv/bin/python"
	}
}
```


### キーバインドはお好みで
個人的にデフォルトのキーが打ちにくいので

```json:Default.sublime-keymap(User)
[
    {"command":"anaconda_goto","keys":["super+1"]}
]
```
とかしておくと良いかも。あとは定義を見たいところで指定のキーを打つだけ。

## おまけ
マイAnacondaセッテイ

```json:Anaconda.sublime-settings(User)
{
    "auto_complete_triggers": [
        {"selector": "source.py - string - comment - constant.numeric", "characters": "."}
    ],
    "pep8_max_line_length": 100,
    "python_interpreter": "/usr/local/bin/python",
    "anaconda_linter_mark_style": "none"
}
```

Anacondaはpep8のチェックもしてくれるんだけど、デフォルトだとハイライトが強烈すぎるのと、一行80字設定で割りと引っかかってうざいので、その辺適宜設定しておく。
FacebookとのOAuthをmockするgemを作ってみた

## 概要

[Facebookとの通信をmockするgemを作ってみた](http://qiita.com/ogawatti/items/caecc36e9cb14345635e)の続き。
FacebookとのOAuthをMockする[facemock-oauth](https://github.com/ogawatti/facemock-oauth)というgemを作ったので紹介。


## 背景・目的

device + omniauth (omniauth-facebook)でやっているOAuthをMockに差し替えられるようにしたかった。
具体的には、

* devise, omniauthの処理を通過しない
* [facemock](https://github.com/ogawatti/facemock)を使って事前にユーザ登録をしておき、そのユーザでログイン出来る

ようにしたい。


## 要素技術

 * ruby (2.1.1, 2.1.0, 2.0.0, 1.9.3)
 * gem (versionはそれぞれ最新を使用)
  * rspec
  * simplecov
  * rack


## 方針

omniauth, deviseが処理する前にmockでhookして処理させる。
Facebookのログイン画面に相当する画面をmockで返し、認証させる。

deviseとomniauthを使ったFacebookとのOAuthの詳細は多数記事があると思うので詳細は割愛。

#### ざっくりとした流れ

1. WebアプリからFacebookログイン画面へリダイレクトさせる
2. Facebookログイン画面が返る
2. Facebookで認証・認可する
3. WebアプリへCallbackされる
3. Callbackで受け取ったAuthorization Codeからアクセストークンを取得する
4. アクセストークンを使ってユーザ情報を取得
5. ユーザ情報からAuthHashを生成し、ヘッダに載せてCallback用のWebアプリのメソッドを呼ぶ

#### mockでの流れ

1. WebアプリからFacebookログイン画面へのリダイレクトをhookして、mockのログイン画面へリダイレクトさせる
2. mockのログイン画面を返す
2. mockで認証する
3. mockでAuthorization Codeを発行・付与して、WebアプリへCallbackさせる
4. CallbackをhookしてAuthorizaton Codeを元にアクセストークンを取得する
5. アクセストークンを使ってユーザ情報を取得
6. ユーザ情報からAuthHashを生成し、ヘッダに載せてCallback用のWebアプリのメソッドを呼ぶ


## 実現方法

4つのRackミドルウェアを作成して実現する。

1. ログイン画面へのリダイレクトをhookしてmockに流すRackミドルウェア
2. ログイン画面を返すRackミドルウェア
3. 認証・WebアプリへのCallbackを実現するRackミドルウェア
4. WebアプリへのCallbackをhookするRackミドルウェア

## やったこと

* [rack middlewareをざっくり触ってみた](http://qiita.com/ogawatti/items/06d0d822b65138bf6301)
* [rack middlewareのテストをrspecで書いてみた](http://qiita.com/ogawatti/items/4db6dbdfb2405342e0da)


## 作ったもの

* **facemock-oauth**
 * [github](https://github.com/ogawatti/facemock-oauth)
 * [rubygems](http://rubygems.org/gems/facemock-oauth)

## 使い方

[READMEを参照](https://github.com/ogawatti/facemock-oauth#usage)


## 付けたバッジ

facemockと同じ。

 * [Travis Ci](https://travis-ci.org/) : CI
 * [Coveralls](https://coveralls.io/) : カバレッジ計測
 * [Gemnasium](https://gemnasium.com/) : 依存gemの更新状況通知
 * [Code Climate](https://codeclimate.com/) : コード品質計測
 * [Version Badge](http://badge.fury.io/) : バージョン表示


## 参考

* [開発環境でのみ、リクエスト毎になんか処理をフックしたい in Ruby](http://nekogata.hatenablog.com/entry/2014/08/22/162243)
* [Rackミドルウェアの作り方を勉強した](http://shokai.org/blog/archives/8233)
* [HTTP Request Headerがどういう感じでRackのenvに変換されるか](http://qiita.com/udzura/items/b558baffcd1421773d97)
* [How to read POST data in rack request?](http://stackoverflow.com/questions/15458334/how-to-read-post-data-in-rack-request)
* [Rack MiddlewareのGemに対するRspecの書き方](http://a-newcomer.com/32)
Windows コマンドプロンプトでzipファイルの結合

Windowsのコマンドプロンプトを使用して、
分割されたzipファイルを結合します。

bunkatsu.zip.001
bunkatsu.zip.002
bunkatsu.zip.003

と、zipが分割されている場合、

Windowsの "copy \b" コマンドを使用することで結合できます。

「きっとコマンドプロンプトでできるはず！」
変なソフト入れるのもやだなーと方法を探していて知りました＾＾

copy \b は、バイナリファイルを結合する！ というコマンドです。

copy \b bunkatsu.zip.001+bunkatsu.zip.002+bunkatsu.zip.003 ketsugou.zip

といったふうに、
「結合したいファイル名を+演算子でつなぐ && 最後に結合後ファイル名指定

で実現できます。
TitaniumからGenymotionを使ってみてわかったこと



Andoridをエミュレータで今まで開発したことがなかったのですが、
Genymotionを使うと爆速と聞いたので使ってみました。流行に圧倒的に乗り遅れてますね。
わかったことをメモしていきます。


## WebViewを使った時のローカルホストの指定

http://localhost では接続できません。
 ↓ 
http://192.168.56.1 こっちですね。

## ti build（CLI）からgenymotionを選択する方法

genymotionを入れたからといって、エミュレータで勝手に「Genymotion」が立ち上がってくれるわけではありません。

こちらの記事では
titaniumを綺麗にして、ビルドして、adbコマンドで「Genymotion」に転送というやり方が紹介されていましたが、ti buildコマンドで転送できる方法をご紹介します。 また、buildのスクリプトを書き換える方法も紹介しています。
まだTitanium 3.1の頃の記事です。
> http://qiita.com/sngmr/items/d7c244114d7242c681c5


```
$ titanium clean
$ titanium build --platform=android --build-only
$ adb -s 192.168.56.100:5555 install -r build/android/bin/app.apk
```


Titanium 3.2からGenymotionを一応サポートしているので、
少し便利に使えるようになりました。
こちらの記事をご参照してください。

> http://www.appcelerator.com/blog/2013/12/using-genymotion-with-titanium-3-2/

### エミュレータ設定&確認 

設定

```
ti config genymotion.enabled true
```

確認

```
ti info -t android 
```

Genymotionで追加した設定が出てきます。

```
Genymotion Emulators
  Sony Xperia Tablet Z - 4.1.1 - API 16 - 1920x1200
    SDK Version               = 4.1.1
    ABI                       = x86
    Genymotion Version        = 2.2.2
    Display                   = 1920x1200-16
    DPI                       = 320
    OpenGL Acceleration       = yes
    Google APIs               = unknown, emulator not running
  Google Nexus 5 - 4.4.2 - API 19 - 1080x1920
    SDK Version               = 4.4.2 (android-19)
    ABI                       = x86
    Genymotion Version        = 2.2.2
    Display                   = 1080x1920-16
    DPI                       = 480
    OpenGL Acceleration       = yes
    Google APIs               = unknown, emulator not running
```

### ビルドコマンド

先ほど確認した「Genymotion Emulators」の名前を指定してあげることで、
Genymotionでビルドすることができます。

```
ti build -p android --device "Google Nexus 5 - 4.4.2 - API 19 - 1080x1920"
```


## 使ってみた感想

ぬるぬるですね。


ほんとにすごい。びっくりしました。
これからAndoridでわくわくエミュレータ開発ライフが待っていますね。
Python - Check type of values


Ref:
[1] - [Stackoverflow - What's the canonical way to check for type in python?](http://stackoverflow.com/questions/152580/whats-the-canonical-way-to-check-for-type-in-python)


#### Exact type

```python
if type(o) is str:
  print "this is a string"
```

#### Instance of type or instance of the subclass

```python
if isinstance(o, str):
  print "this is a string or a instance of subclass of string"
```


There are more patterns in the reference to deal with more complex usecases.
iOS8でTTTAttributedLabelを使ったときにlinkAttributesが反映されない場合の対処法



```objective-c:iOS7まで
myLabel.linkAttributes = @{NSForegroundColorAttributeName : [UIColor blueColor]};
```

```objective-c:iOS8
myLabel.linkAttributes = @{(NSString *)kCTForegroundColorAttributeName : [UIColor blueColor]};
```

iOS8のやり方で、iOS7にも正常に反映されるのでiOS8のやり方がいいかも。
Office文書にMS風の人形アイコンを入れたい

WordやPowerPointの【オンライン画像】で検索ワード「 **頭 アバター** 」を指定するとMS風人形アイコンがすべて出てきます。
![avatar.png](https://qiita-image-store.s3.amazonaws.com/0/2852/a557ca61-5a79-6b21-f959-0929c19ed613.png)
sec_error_unknown_issuerへの一つの対応方法


https://support.mozilla.org/ja/kb/Secure%20Connection%20Failed#w_ojauaeagekosuiaiageuekcaaiauaaauaiauadaeaeaeaaaaaeagekosuiaglaakaiauaaauaeaa
>発行者の証明書への認証パスが提供されていないためこの証明書は信頼されません。
(サイト名) が不正なセキュリティ証明書を使用しています。この証明書は、発行者の証明書への認証パスが提供されていないため信頼されません。 (エラーコード: sec_error_unknown_issuer)
>
コンピュータにインストールされた ESET や BitDefender などのセキュリティソフトウェアで SSL スキャン機能が有効になっている可能性があります。これらのオプションを無効にしてみてください。 

セキュリティソフトウェアとか関係なかったです。

GoDaddyのSSLを使っているのですが、
サインアップページの方はSSLを使っていても問題無し。

アプリページの方だけエラーが出ていました。

ApacheのSSLの設定は同じ。

違いは、
サインアップページの方は **Standard SSL**
アプリページの方は **Wildcard SSL**

設定を弄くり回していてようやく判明。

ServerAliasの方にSSLの **Common Name** が書いてあった。

ServerNameと逆にしてapachectl restartしたら、Firefoxでもアクセスできた。

具体的にはこんな感じ.

```Apache:httpd.conf
#  ServerName genieframeapp.com
#  ServerAlias *.genieframeapp.com
  ServerName *.genieframeapp.com
  ServerAlias genieframeapp.com
```

SafariやChromeでは問題ないのになぜ？
しかも1,2ヶ月前にはそんなエラー出てなかったのに。。。
CakePHP 3.0(beta)のStringTemplateTraitを試してみた

# StringTemplateTrait

## 前提条件

* CakePHP 3.0(beta1)を利用(2014/09/11)

Cake3ではHelper等がレンダリングするHtmlを**StringTemplateTrait**という機能を使うことで実現しています。  
この機能をうまく使うことで出力されるHtmlを自由に修正することが出来ます。  
※例) ページャーやformののHtml等

テンプレートの書き換え自体は**StringTemplate**,**InstanceConfigTrait**が行います。

## 使い方1
　テンプレートの書き換えはconfigメソッドで行います。  
　以下の場合はSetFlashのテンプレートを書き換えます。  

``` PHP
<?php $this->Session->config('templates.flash', '<div>真テンプレート</div>'); ?>
<?= $this->Session->flash(); ?>
```

## 使い方2
　中カッコ({})を2個重ねることで変数が展開されます。
　以下の場合は$messageが展開されます。

``` PHP
<?php $this->Session->config('templates.flash', '<div>{{message}}</div>'); ?>
<?= $this->Session->flash('flash', ['message'=>'ここの変数が展開される']); ?>
```

## 継承
　毎回configで指定するのは手間なので継承して、**$this->templater()->config()**で書き換えおくと便利かもしれません

``` PHP
class FormHelper extends \Cake\View\Helper\FormHelper {
    public function __construct(\Cake\View\View $View, array $config = []) {
        parent::__construct($View, $config);

        // テンプレートの書き換え
        $this->templater()->config('error', '<div class="error-message">エラーです！＝＞{{content}}</div>');
    }
}
```

## テンプレート外出し
　configで指定するテンプレート自体を外出しすることもできます。

``` PHP
// ctpファイル
// templatesに外出しするテンプレートファイル名を指定する
<?= $this->Form->create($account, ['templates'=>'template']); ?>

//App/Config/template.php
$config = [
    'button' => '<button{{attrs}}>{{text}}</button>',
    'checkbox' => '<input type="checkbox" name="{{name}}" value="{{value}}"{{attrs}}>',
    'checkboxContainer' => '<div class="checkbox">{{input}}{{label}}</div>',
    'dateWidget' => '{{year}}{{month}}{{day}}{{hour}}{{minute}}{{second}}{{meridian}}',
    'error' => '<div class="error-message">エラーです！=>{{content}}</div>',
    'errorList' => '<ul>{{content}}</ul>',
    'errorItem' => '<li>{{text}}</li>',
    'file' => '<input type="file" name="{{name}}"{{attrs}}>',
    'fieldset' => '<fieldset>{{content}}</fieldset>',
    'formstart' => '<form{{attrs}}>',
    'formend' => '</form>',
    'hiddenblock' => '<div style="display:none;">{{content}}</div>',
    'input' => '<input type="{{type}}" name="{{name}}"{{attrs}}>',
    'inputsubmit' => '<input type="{{type}}"{{attrs}}>',
    'label' => '<label{{attrs}}>{{text}}</label>',
    'legend' => '<legend>{{text}}</legend>',
    'option' => '<option value="{{value}}"{{attrs}}>{{text}}</option>',
    'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
    'select' => '<select name="{{name}}"{{attrs}}>{{content}}</select>',
    'selectMultiple' => '<select name="{{name}}[]" multiple="multiple"{{attrs}}>{{content}}</select>',
    'radio' => '<input type="radio" name="{{name}}" value="{{value}}"{{attrs}}>',
    'radioContainer' => '{{input}}{{label}}',
    'textarea' => '<textarea name="{{name}}"{{attrs}}>{{value}}</textarea>',
    'formGroup' => '{{label}}{{input}}',
    'checkboxFormGroup' => '{{input}}{{label}}',
    'groupContainer' => '<div class="input {{type}}{{required}}">{{content}}</div>',
    'groupContainerError' => '<div class="input {{type}}{{required}} error">{{content}}{{error}}</div>',
    'submitContainer' => '<div class="submit">{{content}}</div>',
];
```
s3cmd で日本語ファイルを ダウンロード、アップロードしたい

s3cmd で 日本語が含まれるディレクトリ、ファイルをアップロード、ダウンロードしようとすると、  
↓のようなエラーがでます。

```
[root@localhost ~]# s3cmd --config=/s3cmd/.s3cfg get s3://meister-staging-webroot-published/Account/1/footer_image2/フッタ.gif /tmp/

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please report the following lines to:
   s3tools-bugs@lists.sourceforge.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Problem: UnicodeEncodeError: 'ascii' codec can't encode characters in position 63-65: ordinal not in range(128)
S3cmd:   1.0.0

Traceback (most recent call last):
  File "/usr/bin/s3cmd", line 2006, in <module>
    main()
  File "/usr/bin/s3cmd", line 1950, in main
    cmd_func(args)
  File "/usr/bin/s3cmd", line 439, in cmd_object_get
    remote_list = fetch_remote_list(args, require_attribs = False)
  File "/usr/bin/s3cmd", line 281, in fetch_remote_list
    uri_str = str(uri)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 63-65: ordinal not in range(128)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
    Please report the above lines to:
   s3tools-bugs@lists.sourceforge.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
```

これは、

* s3cmd → Pythonで書かれている
* Pythonのデフォルトエンコーディング → ASCII

というのが原因の模様。

なので以下のような作業を行い、UTF-8 を扱えるようにすれば、日本語のファイルを扱うことができます。

```
[root@localhost ~]# cp -ra /usr/bin/s3cmd /usr/bin/s3cmd.orig
[root@localhost ~]# vim /usr/bin/s3cmd
#!/usr/bin/python

## Amazon S3 manager
## Author: Michal Ludvig <michal@logix.cz>
##         http://www.logix.cz/michal
## License: GPL Version 2

import sys
reload(sys)
sys.setdefaultencoding("UTF-8")
[root@localhost ~]# diff /usr/bin/s3cmd /usr/bin/s3cmd.orig
9,10d8
< reload(sys)
< sys.setdefaultencoding("UTF-8")
```
CakePHP の webroot 以下のリダイレクトをなんとかしたい

参照： http://blog.fusic.co.jp/archives/1459  
  
http://example.com/test にアクセスすると  
http://example.com/app/webroot/test/ にリダイレクトするのを何とかしたい。

~/app/webroot/.htaccess を改修する。

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
```

↓ 改変

```
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]
</IfModule>
```
LaunchyでEclipseのworkspaceを使い分け

Eclipseの複数workspaceを使い分ける必要が出てきて、毎回Eclipseを起動してswitch workspaceするのが面倒になったので、Launchyから1コマンドで起動できるようにした。

1. AppleScript Editorを開く
2. ↓のようにしてworkspaceを指定してEclipseを起動するスクリプトを書く
```
do shell script "/Applications/Eclipse -data /path/to/workspace"
```
3. スクリプトを保存
4. スクリプトをApplicationとしてエクスポート

あとはLaunchyのindexを更新すればOK。
だいぶ楽になった。
Using Metaprogramming to refactor code


If you have some methods whose definitons are similar, only different by the method name. You can use `meta programming` to simple the things.

###Bad code:

```ruby
	class User < ActiveRecord::Base
		validate_inclusion_of :activation_state, :in => ["pending", "active"]

		def self.pending_users
			find :all, :conditions => {:activation_state => 'pending'}
		end

		def self.active_users
			find :all, :conditions => {:activation_state => 'active'}
		end

		def pending?
			self.activation_state == 'pending'
		end

		def active?
			self.activation_state == 'active'
		end
	end
```

In this example, we have similar methods definitions of `pending_users`, `active_users`, `pending`, `active`. We can simplify the codes by using meta programming

###Refactor:

```ruby
	class User < ActiveRecord::Base
		STATES = ['pending', 'active']
		validate_inclusion_of :activation_state, :in => STATES

		class <<self
			STATES.each do |state|
				define_method "#{state}_users" do
					find :all, :conditions => {:activation_state => state}
				end
			end
		end

		STATES.each do |state|
			define_method "#{state}?" do
				self.activation_state == state
			end
		end
	end
```
Googleアカウントのパスワードが流出しているか確認


とりあえず大丈夫だったが、二段階認証は重要だと感じた。

## 流出しているか確認できるサイト

* [Is leaked?](https://isleaked.com/results/en)

## 大丈夫な場合

![スクリーンショット 2014-09-11 9.02.27.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a922d617-e383-8a91-3166-087af3cdac66.png "スクリーンショット 2014-09-11 9.02.27.png")


## ダメな場合

![スクリーンショット 2014-09-11 9.08.05.png](https://qiita-image-store.s3.amazonaws.com/0/25728/afc6a7f0-5b66-3a3f-3a0f-292bc8711a09.png)

* アスタリスクが使えます。

## 参考

* [Gmailのパスワード大量流出ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!急げ！！！！](http://viper.2ch.sc/test/read.cgi/news4vip/1410373128/)
* [5 Million Online Passwords Leaked, Check Yours Now [Updated]](http://lifehacker.com/5-million-gmail-passwords-leaked-check-yours-now-1632983265)
go getでgithubからライブラリをimportしてみた


# go getの準備

```bash:GOPATH用フォルダ作成
mkdir ~/gocode
```

```diff:$HOME/.bashrc
+ export GOPATH=$HOME/gocode
```

```bash:設定反映
source $HOME/.bashrc
```

# go get実行

```bash:go&nbsp;get実行
go get github.com/mgutz/ansi
```

# import文の書き方

```golang:import文の書き方
import {
	"fmt"
	"github.com/mgutz/ansi"
}
```
Goで外部コマンドを実行して出力をリアルタイム表示するサンプル

# はじめに

外部コマンドを実行して出力をリアルタイム表示するサンプルコマンドを作ってみました。

サンプルコマンドに-vを指定した時は冗長モードでリアルタイム表示しつつ、外部コマンド終了時に標準出力と標準エラー出力の結果を文字列で取得します。

-vを指定しない時は、外部コマンド実行中のリアルタイム表示は無しで、外部コマンド終了時に標準出力と標準エラー出力の結果を文字列で取得するほうだけを行います。

# スクリーンショット

![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/3227/25215cbf-b7ce-16fe-8b82-0540d9687e31.gif)

# 実装メモ

ソース: https://github.com/hnakamur/execcommandexample

コマンドを実行して出力を読み取るサンプルは[exec.Cmd.StdoutPipe()]( http://golang.org/pkg/os/exec/#Cmd.StdoutPipe )のExampleにコード例があります。

標準出力と標準エラー出力を両方リアルタイムに呼び出したいので、StdoutPipe()とStderrPipe()を取得して、2つのgoroutineでそれぞれ読みだして出力するようにしました。
https://github.com/hnakamur/execcommandexample/blob/master/main.go#L53-L54

また、最終的な結果を取るために[io.TeeReader]( http://golang.org/pkg/io/#TeeReader )を使ってBufferにも保存しています。
https://github.com/hnakamur/execcommandexample/blob/master/main.go#L45-L47

TeeReaderを使った関係で、verbose=falseのときもReaderからは読み取っておく必要があります。
https://github.com/hnakamur/execcommandexample/blob/3f4f3a2c659323d3ada722961b0439c22bf77467/main.go#L74

カラー表示用の文字列生成は [github.com/mgutz/ansi]( https://github.com/mgutz/ansi )を使いました。
yesコマンドでnoを出力させる

yesコマンドはy/n入力を省略するために使いますが、オプションがあることに気がついた。

```bash:引数に出力させたい文字を指定する
$ yes no
no
no
no
no
```

```bash:日本語もいける
$ yes "進捗だめです"
進捗だめです
進捗だめです
進捗だめです
進捗だめです
```

```bash:man
$ man yes                                                                                                                                                                         [master]

YES(1)                    BSD General Commands Manual                   YES(1)

NAME
     yes -- be repetitively affirmative

SYNOPSIS
     yes [expletive]

DESCRIPTION
     yes outputs expletive, or, by default, ``y'', forever.

HISTORY
     The yes command appeared in 4.0BSD.

4th Berkeley Distribution        June 6, 1993        4th Berkeley Distribution
```
Spring for Apache HadoopのHbaseTemplateをGroovy DSLで設定する

JavaでHBaseを操作したい時hbase-clientライブラリを直接利用してもよいのですが、Spring for Apache HadoopのHbaseTemplateクラスを利用するとコネクションやHTableの管理をよろしくやってくれるので便利です。
Spring for Apache Hadoopの公式ドキュメントに設定方法が記載されています。

http://docs.spring.io/spring-hadoop/docs/2.0.2.RELEASE/reference/html/hbase.html

```xml
// default HBase configuration
<hdp:hbase-configuration/>

// wire hbase configuration (using default name 'hbaseConfiguration') into the template 
<bean id="htemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate" p:configuration-ref="hbaseConfiguration"/>
```

これはSpringのXML設定ファイルの一部を抜粋したもので、実際には以下のようなXMLファイルになります。

```xml:spring-hbase.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:hdp="http://www.springframework.org/schema/hadoop"
    xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/hadoop http://www.springframework.org/schema/hadoop/spring-hadoop.xsd">
        
  <hdp:hbase-configuration/>
  <bean id="htemplate" class="org.springframework.data.hadoop.hbase.HbaseTemplate" p:configuration-ref="hbaseConfiguration"/>
</beans>
```

XMLだとやはり冗長になってしまいます。公式ドキュメントにはXMLでの設定方法しか書かれていないのですが、Groovy DSLによる設定を使えばより簡潔に書けます。

```groovy:spring-hbase.groovy
import org.springframework.data.hadoop.hbase.HbaseTemplate

beans {
    xmlns([hdp:'http://www.springframework.org/schema/hadoop'])
    hdp.'hbase-configuration'()
    htemplate(HbaseTemplate, hbaseConfiguration) {
    }
}
```

hbase-configurationに何も指定しないとクラスパス上のhbase-site.xmlの設定を使用します。Springの設定ファイルでHBaseの設定値を記述することもできます。例えばZookeeperのホストを設定する場合は

```groovy:spring-hbase.groovy
import org.springframework.data.hadoop.hbase.HbaseTemplate

beans {
    xmlns([hdp:'http://www.springframework.org/schema/hadoop'])
    hdp.'hbase-configuration'(
        'zk-quorum': 'host1,host2,host3'
    )
    htemplate(HbaseTemplate, hbaseConfiguration) {
    }
}
```

などとします。後はGenericGroovyApplicationContextで上記ファイルを読み込めばHbaseTemplateが使えます。

```java
public static void main(String[] args) {
    ApplicationContext context = new GenericGroovyApplicationContext("classpath:/spring-hbase.groovy");
    HbaseTemplate template = context.getBean("htemplate", HbaseTemplate.class);
    ...
}
```
dump_darts


https://github.com/naoyat/dump_darts
## これは何
[Darts (Double-ARray Trie System) データ構造](http://chasen.org/~taku/software/darts/)のトライ木 (Trie) の全単語をダンプするツール

## あるいは
_mkdarts した元の単語ファイルを失くしてしまった残念な人を救済するツール_

## インストールに必要なもの

- [Darts 0.32](http://chasen.org/~taku/software/darts/)

実際に必要なのは`darts.h`だけです。

## インストール

`darts.h` が /usr/local/include にインストールされていることを前提としています。
そうでない場合は Makefile をいじってください。

`darts.h` にパッチをあてて使っています。

```
$ make dump_darts
$ sudo make install
```

## 使い方

```
$ dump_darts <darts-file>
```


## 開発動機

Darts を [DAWG](http://dawg.readthedocs.org/) で置き換えたかったのだけれど、mkdarts した元の単語ファイルを失くしてしまったのですよ…

これを書いたおかげで double-array で Trie がどう実装されているのか自分なりに理解できたのが不幸中の幸い。

## 実装

darts.h の `DArray::DoubleArrayImpl` クラスに `dump_all_keys()` メソッドを追加する形で実装しています。

```darts.h
namespace Darts {

  ...

  class DoubleArrayImpl {

    ...

    void dump_all_keys(bool show_pos=false) {
      std::vector<size_t> rev(size_);
      std::vector<size_t> goals;

      for (size_t i=0; i<size_; ++i) {
        array_type_ base = array_[i].base;

        if (base == 0) {
          continue;
        } else if (base < 0) {
          goals.push_back(i);
          continue;
        }

        if (array_[i].check == 0) continue;

        rev[base] = i;
      }

      for (size_t i=0, sz=goals.size(); i<sz; ++i) {
        array_type_ goal = array_[goals[i]].base;  // goal < 0
        array_u_type_ check = array_[goals[i]].check;
        size_t here = rev[check];

        std::vector<unsigned char> way;

        while (true) {
          array_u_type_ check = array_[here].check;
          if (check == 0) break;  // root

          way.push_back(here - check - 1);
          here = rev[check];
        }

        if (show_pos) printf("%d\t", -goal-1);

        for (int i=way.size()-1; i>=0; --i) putchar(way[i]);
        printf("\n");
      }
    }

    ...

  };

  ...

}
```

```dump_darts.cc
#include <stdio.h>
#include "darts.h"

int main(int argc, char *argv[]) {
  Darts::DoubleArray da;

  if (argc != 2) {
    printf("usage: %s <darts-file>\n", argv[0]);
    return 0;
  }

  da.open(argv[1]);
  da.dump_all_keys();

  return 0;
}
```

やっている事は、array_[] を走査して base < 0 なノード（単語の終端。-base-1 でその単語が何番目のエントリなのかが分かる）から check を逆行し、array_[] 内の位置と check の値から文字コードを復号しつつ、Trie の根本までさかのぼっているだけです。

Trieの葉から根の方向へ１文字分遡る計算量を O(1) にするために、最初に array_[] の check の逆引き辞書を作っています。
全体の計算量は単語数を N、単語の平均長を L とすると O(NL) ですかね。

根に近づけば近づくほど多くの単語のプレフィックスが重複しているはずなので、復号した文字をキャッシュしておくなり何なりすれば O(NlogL) とかになるのかもですが、現状の実装で元の単語ファイルの復元という目的を果たしてしまったので放置します。

## ライセンス

dump_darts はフリーソフトウェアです．

元の Darts に従い、LGPL(Lesser GNU General Public License) または BSD ライセンスに従って本ソフトウェアを使用、再配布することができるものとします。

詳細は COPYING, LGPL, BSD 各ファイルを参照して下さい。

## 作者

- naoya_t
Boost Concept Check Library (BCCL)でインターフェイスを実装する

[前回](http://qiita.com/termoshtt/items/259bee52df93c00b3da8)述べたように、BCCLを用いればある型のシグネチャを制限する事ができる。
つまりある型`T`のインスタンス`var`が

```cpp
std::sort(var.begin(), var.end());
int N = var.size();
```

のような"使い方"(signature)が可能である事を明示的に要請する事ができる。
これはソートが安全に実行できる事を保証するのではなく、
`.begin()`や`.end()`なるメンバーを持っていて、
`std::sort`の引数の型として適切な型を返す事を保証する。
つまり型演算だけを実行する。

今回はごく簡単なシグネチャを要請するコンセプトチェッククラスを作成する。

たとえばある値を参照でもらって中身を書き換える関数を考えよう。
そのものを書き換える場合(inplace)と、
元のをそのままに別のインスタンスへ変更したものを書き換える場合(outplace)
の両方が実装していてほしいとする。

```cpp
T val1, val2;
f(val1); // inplace
f(val1, val2); // outplace
```

みたいに使えると *仮定して* 、
このシグネチャを利用したコードを実装するとしよう。
この仮定を`f`に要請するにはどうすればいいか？


## 純粋仮想関数を使用する
まずはコンセプト使わずにOOPのインターフェイスを利用する。

```cpp
template <class Val> struct TwoWayFunc {
  virtual void operator()(Val &) = 0;
  virtual void operator()(const Val &, Val &) = 0;
};
```

このインターフェイスクラスを`f`に継承させればいい。

確かに`f`を自分が定義するならば問題ない。
しかしジェネリックなライブラリを作成する場合、
この`f`は一般にライブラリの外部でライブラリのユーザーが定義する関数である。
また複数の別個のシグネチャを仮定する事ができない。


## コンセプトを使用する
コンセプトチェッククラスを定義する

```cpp
template <class Func, class Var> struct TwoWayFunc{
private:
  Func f; // 実際にインスタンス化する必要はない
  Var v; // 同上
  static const Var &cv; // constの引数にする場合

public:
  BOOST_CONCEPT_USAGE(TwoWayFunc) {
    f(v);
    f(cv, v);
  }
};
```

これだけで十分である。
このクラスを用いて、ジェネリックなアルゴリズムを実装する際に、

```cpp
template<class Func, class Var>
void generic_algorithm(){
  BOOST_CONCEPT_ASSERT((TwoWayFunc<Func, Var>));

  Func f(...);
  Var var;
  ...
}
```

のように`BOOST_CONCEPT_ASSERT`を用いて要請すればいい。
これで上述したシグネチャが使えない場合、コンパイル時に`BOOST_CONCEPT_ASSERT`の所でエラーとなる。
実際のアルゴリズムの最中でエラーとなるわでないので、
ライブラリの使用者に（ライブラリの実装ミスでなく）`Func`の型が問題なのだと報せられる。
コレクションを強化したStream


# Streamでなんでもできちゃうんじゃないかな

java8にはコレクションを処理するためにStreamという仕組みが新たに取り入れられました。javaにはjava5で取り入れられた拡張for文がありますが、そんなの比較にならないくらい便利になりました。
まずは基本の`forEach`から。

```java:ForEach.java
Arrays.asList("a", "b", "c").stream().forEach(s -> System.out.println(s));
```

Listに`stream()`というメソッドが追加されました。これはリストに対するStreamを返すメソッドで、List<T>にdefaultで実装されています。
forEachはStreamの全要素に対して引数の関数を適用しています。引数の無名関数は`println`を呼ぶだけのラッパーで、実行するとコンソールに`a b c`と表示されます。
さて、これだけだと何も便利になった感じがしないですね。むしろ拡張for文の方がわかりやすいです。

# java.util.stream.Stream<T>

[Stream](http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)インターフェイスにはforEach以外にも色々なメソッドが実装されています。ここでは例として`mapToInt`と`filter`を使ってみます。

```java:Sum.java
List<String> nums = asList("1", "2", "3");

int sum = nums.stream()
            .mapToInt(Integer::parseInt)
            .filter(i -> i % 2 == 1)
            .sum();
```

mapToIntはstreamの要素を引数にしてintを返す関数を引数に取ります。この例だと、streamはString型なので、`mapToInt`は`int xxx(String s)`という関数を引数に受け取ります。`mapToInt`はstreamの要素１つ１つに引数で受け取った関数を適用していきます。つまり数字文字列のリストが数値リストに変換されます。
次に`filter`が実行されます。filterはstreamの要素を受け取ってbooleanを返す関数を受け取ります。そして関数の結果が`true`である要素だけを収集します。この例では奇数だけが収集されて、`2`は捨てられます。
最後にstreamの要素すべてを加算します。
結果は４になります。
絵で書くとこんな感じです。

```java:Sum2.java
元のリスト           mapToInt    filter    sum
["1", "2", "3"] -> [1, 2, 3] -> [1, 3] -> 4
```

これと同じ処理をjava7で書くと

```java.SumJava7.java
int total = 0;
for (String i : nums) {
    int num = Integer.parseInt(i);
    if (num % 2 == 1) {
        total += num;
    }
}
```

こんな感じになります。
java8では「数値に変換して」「奇数を集めて」「足し込む」とここの小さい処理をくっつけて大きな処理を作る事ができます。


Streamには他にも以下のようなメソッドが用意されています。

|メソッド|動き|
|:--:|:--:|
|allMatch|streamの全要素が指定の条件（関数）を満たすかどうかをチェックする|
|anyMatch|streamの要素のうち１つでも指定の条件（関数）を満たすかどうかをチェックする|
|concat|２つのstreamを結合する|
|count|List.size()的なもの|
|distinct|equalsを使用して、streamから重複データを省く|
|filter|指定した条件に合致する要素のみを収集する|
|map|要素を別の値に変換する関数A->Bを渡してStream\<A\>からStream\<B\>を作成する|
|forEach|指定した関数を全要素に対して実行していく|
|max, min|比較関数を渡して、要素内の最大値や最小値を取得する|
|reduce|２つの要素を１つにまとめる関数を引数にとって、全要素を１つの要素に集約する|

これらは「この中から最大値を取得する」みたいな大枠の動作しか提供しません。コレクションの中で「何を最大値とするか？」といった実際の処理は引数で渡します。実際の処理を外部から与えられるので、すごく柔軟に大きな処理を組み立てられるようになっています。
Rubyのメソッド・ブロック・ラムダまとめ まめちしき篇


ひまがあったら書く。

## 正格評価と遅延評価

Rubyのプログラムは上から下に実行されるのが基本だ。

```ruby
puts("foo")
puts("bar")
```

このコードには、「foo」と「bar」を出力する命令(メソッド呼び出し)が記述され、その順番通りに出力される。

では、次の場合はどうか。

```ruby
if (1 == 2)
then
  puts("foo")
else
  puts("bar")
end
```

「foo」と「bar」を出力する命令を順に記述した。しかし実際には「bar」とだけ出力される。

次の例。

```ruby
def foo
  puts("foo")
end

def bar
  puts("bar")
end

bar()
foo()
```

このコードにおいても、たしかに「foo」と「bar」を出力する命令を順に記述した。だが現実には「bar」「foo」の順番に出力される。

なにを当然のことを… とおっしゃるかもしれない。
しかし、ふだん当然のように認識してることでも、実際やってみると奇妙に見えるものだ。

その「当然」は錯覚かもしれない。

ところで、実はRubyではユーザーが`if`文のようなメソッドを定義することもできる。

```ruby:if.rb
def If (cond, then: nil, else: nil)
  binding.local_variable_get(cond ? :then : :else)
end

p If (1 == 1),
then:
  "foo",
else:
  "bar"
#=> "foo"
p If (1 == 2),
then:
  "foo",
else:
  "bar"
#=> "bar"
```

なるほど、これは上手く動くようだ。しかし、次の例はどうだろう。

```ruby
If (1 == 1),
then:
  puts("foo"),
else:
  puts("bar")
#=>
# foo
# bar
If (1 == 2),
then:
  puts("foo"),
else:
  puts("bar")
#=>
# foo
# bar
```

なんと、どちらも「foo」と「bar」の順番で表示されるではないか。

これが「遅延されずに順番通り実行される」、つまりは **正格評価される** といふことだ。

このことから、Rubyの構文(今回紹介したのは`if`, `def`)には、評価の順番をねぢまげる、特別な能力があることがわかった。

## まとめ

人類の役に立たないプログラミングについて解説しました。
String.substring〜の使い方

```swift
let str = "substring"
str.substringToIndex(3)
```
このコードはコンパイルエラーになる。

substringToIndex の引数は String.Index なので、
NSString の substringToIndex を使うか、
advance() で String.Index を作るか、
次のどちらかの方法をとる。

```swift
let str = "substring"
(str as NSString).substringToIndex(3)
str.substringToIndex(advance(str.startIndex, 3))
```
Groongaでの全文検索コマンドの使い方(groonga-httpd編)

# Groongaでの全文検索コマンドの使い方(groonga-httpd編)
[Groongaでの全文検索コマンドの使い方(groongaコマンド編)](http://qiita.com/tamano/items/15cfc956e5123632d9a0)のHTTPサーバを利用したバージョンです。

## 準備
[前の記事](http://qiita.com/tamano/items/15cfc956e5123632d9a0)と同じなので割愛します。

## HTTPリクエストで実行する。

```bash:HTTPリクエストでの実行
# 通常の検索(artist_nameが「音楽家１」のレコードの、_key, name, album_name, artist_nameを出力
$ ruby -e 'require "cgi"; puts CGI.escape("artist_name==\"音楽家１\"");'
artist_name%3D%3D%22%E9%9F%B3%E6%A5%BD%E5%AE%B6%EF%BC%91%22
$ curl "http://localhost:10041/d/select.json?table=SearchTrack&query=artist_name%3A%E9%9F%B3%E6%A5%BD%E5%AE%B6%EF%BC%91&output_columns=_key,name,album_name,artist_name"
[
  [0,1410366124.13972,0.000102996826171875],
  [
    [
      [2],
      [
        ["_key","UInt32"],
        ["name","ShortText"],
        ["album_name","ShortText"],
        ["artist_name","ShortText"]
      ],
      [1,"曲名１","原盤１","音楽家１"],
      [2,"曲名２","原盤１","音楽家１"]
    ]
  ]
]


# 全文検索(artist_nameが「家１」を含むレコードの、_key, name, album_name, artist_nameを出力
$ ruby -e 'require "cgi"; puts CGI.escape("家１");'
%E5%AE%B6%EF%BC%91
$ curl "http://localhost:10041/d/select.json?table=SearchTrack&match_columns=artist_name&query=%E5%AE%B6%EF%BC%91&output_columns=_key,name,album_name,artist_name"
[
  [0,1410366359.34207,0.000776052474975586],
  [
    [
      [2],
      [
        ["_key","UInt32"],
        ["name","ShortText"],
        ["album_name","ShortText"],
        ["artist_name","ShortText"]
      ],
      [1,"曲名１","原盤１","音楽家１"],
      [2,"曲名２","原盤１","音楽家１"]
    ]
  ]
]

# 全文検索(album_nameが「原」と「２」を含むレコードの、_key, name, album_name, artist_nameを出力
$ ruby -e 'require "cgi"; puts CGI.escape("原盤 ２");'
%E5%8E%9F%E7%9B%A4+%EF%BC%92
$ curl "http://localhost:10041/d/select.json?table=SearchTrack&match_columns=album_name&query=%E5%8E%9F%E7%9B%A4+%EF%BC%92&output_columns=_key,name,album_name,artist_name"
[
  [0,1410366492.51681,0.000367164611816406],
  [
    [
      [1],
      [
        ["_key","UInt32"],
        ["name","ShortText"],
        ["album_name","ShortText"],
        ["artist_name","ShortText"]
      ],
      [3,"曲名３","原盤２","音楽家２"]
    ]
  ]
]

# 全文検索(artist_nameかartist_name_kanaかartist_name_enのいずれかに「ち」を含むレコードの、_key, name, album_name, artist_nameを出力
> select SearchTrack --match_columns artist_name||artist_name_kana||artist_name_en --query 'ち' --output_columns '_key, name, album_name, artist_name'

$ ruby -e 'require "cgi"; puts CGI.escape("ち");'
%E3%81%A1
$ruby -e 'require "cgi"; puts CGI.escape("||");'
%7C%7C
$ curl "http://localhost:10041/d/select.json?table=SearchTrack&match_columns=artist_name%7C%7Cartist_name_kana%7C%7Cartist_name_en&query=%E3%81%A1&output_columns=_key,name,album_name,artist_name"
[
  [0,1410366613.42943,0.000104904174804688],
  [
    [
      [2],
      [
        ["_key","UInt32"],
        ["name","ShortText"],
        ["album_name","ShortText"],
        ["artist_name","ShortText"]
      ],
      [1,"曲名１","原盤１","音楽家１"],
      [2,"曲名２","原盤１","音楽家１"]
    ]
  ]
]

```

[前の記事](http://qiita.com/tamano/items/15cfc956e5123632d9a0)と比較すると、基本的にgroongaコマンドを呼び出す時のパラメータを、そのままGETで渡せばOKだという事がわかります。

## メモ
- load等でのデータ書き込みも出来てしまうため、させたくない場合はNginx側で制御が必要。
Slickで共通のクエリを定義する方法


## 概要

Slickで特定、もしくは複数のテーブルにおける共通のクエリを定義する方法です。

クラスにマップせず、できるだけ`Query`の状態で引き回すことでFRMとしての特性を最大限引き出すことが可能になります。

公式に上がっている[プレゼン資料](http://slick.typesafe.com/talks/2013-12-03_Scala-eXchange/2013-12-03_Patterns-for-Slick-database-applications-Scala-eXchange.pdf)を参考にしましたので、より詳しく知りたい方はこちらもお読み下さい。

## 解説

### 複数のテーブルに共通のクエリを用意する

例えば全てのテーブルに`id`を定義し、`table.filter(_.id === id)`といった形でアクセスしたい場合、まずは以下の様な`trait`を用意します。

```scala:WithId.scala

trait WithId {

  def id = column[Int]("id", O.PrimaryKey)
}

```

そして`Table`クラスを作成する際にこの`WithId`をミックスインします。

```scala:Coffee.scala

class Coffees(tag: Tag) extends Table[Coffee](tag, "coffees") with WithId {

  def name = column[String]("coffee_name")

  def * = (id, name) <> (Coffee.tuppled, Coffee.unapply)
}

```

さらに、以下の様な`implicit class`を定義してやることで、全てのテーブルクラスに対して`findById`でアクセスできるようになります。

```scala:QueryExtensions.scala

implicit class QueryExtensions[T <: WithId, E, _](val q: Query[T, E, _]) {

  def findById(id: column[Int]) = q.filter(_.id === id)
}

```

### 特定のテーブルに固有のクエリを用意する

例えば、`Coffees`テーブルを`coffee_name`の値でフィルターしたい場合は、以下の様にします。

```scala:CoffeesExtensions.scala

implicit class CoffeesExtensions(val q: Query[Coffees, Coffee, _]) {

  def findByName(name: column[String]) = q.filter(_.name === name)
}

```

これで、`Coffees`のテーブルに`findByName`でアクセスできるようになります。

### どうやって利用するか

サンプルなどにあるCakeパターンを利用するのもいいですし、以下の用に`trait`を用意して使いたい場所でミックスインすることもできます。

```CoffeesComponent.scala

trait CoffeesComponent {

  val coffees = TableQuery[Coffees]

  implicit class CoffeesExtensions...
}

```

また、これらの`Query`はそれぞれ利用先でチェーンしたり、他のテーブルと`join`することもできます。
さらには、`join`そのものも他の`Query`を引数に取るメソッドを先ほどの`QueryExtension`で定義することで共通化することができます。
pure属性

`pure`属性は、関数へ指定する属性の一つで、[共通部分式除去](https://ja.wikipedia.org/wiki/%E5%85%B1%E9%80%9A%E9%83%A8%E5%88%86%E5%BC%8F%E9%99%A4%E5%8E%BB)や[ループ最適化](https://en.wikipedia.org/wiki/Loop_optimization)などのコンパイラ最適化へのヒントだそうだ。

関数が返り値以外に副作用を持たず、その返り値も引数とグローバル変数によってのみ決まる場合に、この属性を指定しておくとコンパイラが最適化してくれる。

もし間違えて指定しても単に無視するだけだろうか？

参考

* [Function Attributes - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)
[Rails] Webサイト最適化Bundit Algorithmsを簡単導入


# Bundit Algorithmsとは

詳細は下記詳しいですが、簡単に言うとABテストのように複数のパターンをテストしながらも最適なパターンを選択していく最適化手法です。

参考：[A/Bテストよりすごい？バンディットアルゴリズムとは一体何者か](http://qiita.com/yuku_t/items/6844aac6008911401b19)

# splitとは

ABテストのためのgemです。redisを使って非常にカンタンにABテストを組み込む事ができます。導入方法は下記などを参考に。

参考：[RailsにA/BテストツールのSplitを導入する](http://qiita.com/nantekkotai/items/4f0836a858fdf301be18)

# splitのABテストアルゴリズムにBunditAlgorithmsを適用する

前の節の参考URLを参考にsplitを導入後、initializersでAlgorithmsの指定をしてあげるだけ。

```config/initializers/split.rb
Split.configure do |config|
  config.algorithm = Split::Algorithms::Whiplash
end
```

参考：[andrew/split #algorithms](https://github.com/andrew/split#algorithms)


カンタン！
Webサイトの最適化が捗りますね。
VirtualBoxのディスクイメージをKVM用に変換するコマンド

# Linux上で下記のコマンドを実行する(要qemu)
```shell-session:コマンド
$ qemu-img convert -O raw [Virtualboxイメージ(.vdi)] [KVMイメージの出力先(.img)]

# 実行例
$ qemu-img convert -O raw FC20-ASW.vdi /var/hdd1/libvirt/FC20-ASW.img
```



## ★KVMマシンの設定に注意！！
KVMマシンの新規作成時、ディスクの詳細オプションを

* SATA
* raw

に変更してください。でないとエラーになります。

# どういう時に使うのか？
私は、外部のネットワークからアクセスして

* テストを実施したい時や
* 先行公開で特定の人に見せたい時

リバースプロキシを設定して公開するのですが、
外部アクセス可能なサーバ類はすべてKVM上で動かしているので、
その時はディスクイメージを変換すると楽チンです。
CSVファイルをINPUTにしたSpockのデータ駆動テスト


前回の記事の内容（[Geb自動キャプチャ](http://qiita.com/nyasba/items/edf102578bde7edf0d4f)）を会社の新人くんに伝授し、ツールを作ってもらっていたところ、「Spockのデータ駆動テストでINPUTにしてるパラメータをCSVファイルにしたいです」と相談されてやってみたことのメモ。意外にはまりました。


#### 1. 単純にファイルを読み込んで1行まるっと渡してみる

```
where :
	parameter <<　new File(“input.csv”).getText().split( “\r\n” ) 
```

ダメ。


よくよく調べるとわかりますが

http://www.metabolics.co.jp/Members/masaki/2009/0912/spockinjapanese/parameterizations

> 自前のデータ・プロバイダを書くのはとても簡単で, 二つのメソッド next() と hasNext() (java.lang.Iterable で定義されている), size() と close() (こっちはなくてもいい) を実装するだけでOK!

とのこと。Iterableじゃないとダメなようです。

---

ということでGroovyCSVを試してみました。

#### 2. [GroovyCSV](http://xlson.com/groovycsv/)を使う

build.gradleのdependencyに追加。

```
testCompile "com.xlson.groovycsv:groovycsv:1.0"
```


先日のソースをCSVインプットにするよう改良。
sample.csvをINPUTに自動キャプチャを実行します。

```input/sample.csv
geb,groovy
spock,junit
```


```CsvSampleSearchGeb.groovy
package geb.nyasba.sample.story

import com.xlson.groovycsv.CsvParser
import geb.nyasba.sample.page.TopPage
import geb.spock.GebReportingSpec
import spock.lang.Unroll

@Unroll
class CsvSampleSearchGeb extends GebReportingSpec{

    def "#csvRecord.val1と#csvRecord.val2でBIGLOBE検索を行う"( def csvRecord ){
		
		expect:
            // TopPage にアクセスする
			to TopPage

            // TopPage にアクセスできたことを確認
            at TopPage

            // 検索キーワードにkeywordを入力
            searchKeyword.value( csvRecord.val1 + " " + csvRecord.val2 )

            // TOP画面をキャプチャにとる
            report("検索画面")

            // 検索ボタンをクリック
            searchButton.click()

            // 終了（この時点のキャプチャも自動的に取られている）

		where :
            // expectの処理を以下のパラメータ(keyword)で何度も繰り返す。複数定義も可能
            // input/sample.csvを読み込む。先頭行も取得する。カラムはval1,val2とする
			csvRecord << new CsvParser().parse( 
								new FileReader("input/sample.csv"),
								readFirstLine: true,
								columnNames:["val1", "val2"]
						 	)
	}
}
```

試したソースはこちらを参照ください。
https://github.com/nyasba/gebsample
Angular/Railsシングルページアプリケーション(SPA)をHerokuにデプロイする


## 概要

手順は基本的には下記の内容に従って、いくつか不足している箇所があったので補足していきます。

http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/

まず、今回デプロイしようとしているアプリケーションが、いままでのトラディショナルなRailsアプリケーションとどのような構造の違いがあるのかを説明します。

デプロイしようとしているアプリケーションは、

1. Railsアプリケーションと同じリポジトリで管理してclientという名前のディレクトリにすべてのクライアントサイドのコードをいれています
1. また、クライアントサイドのコードはRailsのアセットパイプラインの外に配置しています

```
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
├── bin
├── client <-すべてのクライアントサイドのコードはここ
├── config
├── config.ru
├── db
├── doc
├── lib
├── log
├── public
├── spec
├── tmp
└── vendor
```

下記のURLと同じような構成になっています。

http://qiita.com/zoetro/items/46d2a8b57f2645bb5033

ローカルでの開発時には、

1. APIだけを担うRailsサーバをたちあげます
1. クライアントサイドのコードはgrunt serveを立ち上げて実装していきます


プロダクション環境では1.だけを立ち上げて、2.はコンパイルされたファイルを1.のサーバで配信するかたちになるので、通常のRailsアプリケーションとは異なり工夫が必要になってきます。

## 実際の手順

それでは、具体的にHerokuにデプロイするために必要な手順をご紹介します。

まず、通常のRailsアプリケーションをデプロイするbuildpackとクライアントサイドのコードをコンパイルするためのbuildpackが必要になります。

複数のbuildpackを扱えるようにHerokuの設定に下記を追加します。

```sh
$ heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
```

さらに、プロジェクトディレクトリの直下に`.buildpacks`というファイルを作成して下記の内容にします。

```
https://github.com/getgamba/heroku-buildpack-nodejs-grunt-compass.git
https://github.com/heroku/heroku-buildpack-ruby.git
```

クライアントサイドのコードをコンパイルするためのbuildpack用に環境変数を追加します。

```
$ heroku config:set NODE_ENV=production
```

heroku上でクライアントサイドのコードをコンパイルするために必要なパッケージを`client/package.json`に記述します。

```
// client/package.json
 
{
  "name": "gamba",
  "version": "0.0.0",
  "description": "gamba is great communication tool for team.",
  "dependencies": {
    "source-map": "^0.1.37",
    "load-grunt-tasks": "^0.6.0",
    "time-grunt": "^0.3.1",
    "grunt": "^0.4.1",
    "grunt-autoprefixer": "^0.7.3",
    "grunt-concurrent": "^0.5.0",
    "grunt-connect-proxy": "^0.1.10",
    "grunt-contrib-clean": "^0.5.0",
    "grunt-contrib-compass": "^0.7.2",
    "grunt-contrib-concat": "^0.4.0",
    "grunt-contrib-connect": "^0.7.1",
    "grunt-contrib-copy": "^0.5.0",
    "grunt-contrib-cssmin": "^0.9.0",
    "grunt-contrib-htmlmin": "^0.3.0",
    "grunt-contrib-imagemin": "^0.7.0",
    "grunt-contrib-jshint": "^0.10.0",
    "grunt-contrib-uglify": "^0.4.0",
    "grunt-contrib-watch": "^0.6.1",
    "grunt-filerev": "^0.2.1",
    "grunt-google-cdn": "^0.4.0",
    "grunt-newer": "^0.7.0",
    "grunt-ngmin": "^0.0.3",
    "grunt-protractor-runner": "^1.1.0",
    "grunt-rails-server": "^0.1.0",
    "grunt-shell-spawn": "^0.3.0",
    "grunt-svgmin": "^0.4.0",
    "grunt-usemin": "^2.1.1",
    "grunt-wiredep": "^1.7.0",
    "jshint-stylish": "^0.2.0"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "scripts": {
    "test": "grunt test"
  }
}
```

`client/Gruntfile.coffee`にbuildpackから呼ばれるタスクを登録します。今回のプロジェクトではbuildというタスクにクライアントサイドのコードをコンパイルする内容を登録しています。

```coffee
grunt.registerTask "heroku:production", [
 "build"
]
```

これでpushしてherokuにデプロイします。

```
$ git push heroku master
```

bowerやnpmで必要なパッケージをいれてクライアントサイドのコードがコンパイルされ、アセットコンパイルなどRailsアプリケーション側の一連の処理がされ、デプロイが完了します。

以上です。
ProcessingのIDEで補完を効かせる方法

ProcessingのIDEで補完効かなくて萎えてしまっている方々、朗報です。
Processing2.0.2以上ならば、Processingに新たなモードを追加することで補完を効かせられるようになります。

## PDE X ##
PDE Xは、Processingのモードの一つで、これを導入すると、
- コード補完機能
- コードのアウトライン表示
- importを必要とするメソッドを書いた際の自動import
- デバッグ機能
などなどの欲しかった機能がすべて使えるようになります。

### 導入方法 ###
1. まず、Processingを起動します。
2. 右上のモード選択ボタンを押し、そこから"Add Mode"を選択します。
3. 選択肢の中から"PDE X"を選び、"install"を押します。
4. インストールが終わったら、Processingを再起動し、モードをPDE Xにしてみましょう。右上のモードが"PDE X"となっていれば成功です。

試しにrect()を呼んでみましょう。
![PDE_X_sample.png](https://qiita-image-store.s3.amazonaws.com/0/52234/cc01d750-9143-dbd5-9df3-d9391e5af4b7.png)

"re"と打った段階でrectがサジェストされてきましたね。
これであの補完の効かないIDEとはおさらばです！

このサイトが非常に参考になったので、参考にしてみてください。
[http://blog.livedoor.jp/reona396/archives/54621615.html](http://blog.livedoor.jp/reona396/archives/54621615.html)

あと、これは補完ではないのですが、もうひとつおすすめしたいモードがあります。
## Tweak Mode ##
これは、sketchを実行しながら、値を自在に動かせるというモードです。
つまり、実際に描画されている様子を見ながら、半径、座標、さらには色合いも調節することができます。
これの導入方法は以下の通りです。
### 導入方法 ###
1. PDE Xと同様に"Add Mode"から"Tweak Mode"を選択し、インストールします。
2. このモードはライブラリも追加する必要があるため、"Sketch→Import Library→Add Library"から、検索フィールドに"oscP5"と入力しインストールします。
3. 終わったら再起動し、"Sketch→Import Library→Contributed"の中にある"oscp5"を選択しインポートします。すると、2つのimport文がでてくるはずです。


では実際にやってみましょう。
![tweak_sample.png](https://qiita-image-store.s3.amazonaws.com/0/52234/b6966926-2791-d580-09e9-1ce806b5a737.png)

色合いを変えたいときは、コードの横に出ている四角をクリックすると左下の画面が出てくるので、そこから選びます。
また、半径等の数値を変えたくなったら、数値の上にカーソルを持っていくとカーソルが双方向の矢印に変わるので、そこからドラッグ&ドロップで左右に動かしてください。
コード内の値が上下すると同時に実行中の画面もリアルタイムで変わっていくはずです。

これもうSublime Textよりも便利なんじゃないかって思うくらいの機能ですね。
他にもこんな機能があるとかありましたら教えてください。
Slickで自分で定義したcase classにマップする方法


## 概要
Slickで特定のカラム型を自分で定義したクラスにマッピングする方法です。

## 解説

### カラムとクラスを一対一でマップする

単一のカラムであれば、以下の様に`MappedTo`を使うことで通常のカラム型と一対一で紐づけることができます。

```scala:Coffee.scala

case class CoffeeId(value: Int) extends MappedTo[Int]

case class Coffee(coffeeId: CoffeeId, coffeeName: String)

class Coffees(tag: Tag) extends Table[Coffee](tag, "coffees") {

  def coffeeId = column[CoffeeId]("coffee_id", O.PrimaryKey)

  def coffeeName = column[String]("coffee_name")

  def * = (coffeeId, coffeeName) <> (Coffee.tuppled, Coffee.unapply)
}

```

### 複数のカラムを一つのクラスにマップする

複数のカラムを一つのクラスにマップする場合は、以下の様に`<>`を使って`*`の場合と同様に定義します。

```scala:Coffee2.scala

case class CoffeeId(value: Int) extends MappedTo[Int]

case class CoffeeName(japanese: String, english: String)

case class Coffee(coffeeId: CoffeeId, coffeeName: CoffeeName)

class Coffees(tag: Tag) extends Table[Coffee](tag, "coffees") {

  def coffeeId = column[CoffeeId]("coffee_id", O.PrimaryKey)

  def japaneseName = column[String]("japanese_name")

  def englishName = column[String]("english_name")

  def coffeeName = (japaneseName, englishName) <> (CoffeeName.tuppled, CoffeeName.unapply)

  def * = (coffeeId, coffeeName) <> (Coffee.tuppled, Coffee.unapply)
}
```

### 自分で変換処理を書きたい場合

自分で変換処理を書きたい場合は、以下の様に`MappedColumnType`を使用することでエンコード、デコードの処理を記述できます。

```
implicit val dateTimeColumnType = MappedColumnType.base[org.joda.time.DateTime, java.sql.Timestamp](
  { dt => new java.sql.Timestamp(dt.getMillis) },
  { ts => new org.joda.time.DateTime(ts) }
)
```
Qiita新着投稿100件のタグをd3.jsのForceレイアウトで表示してみた

QiitaAPIで新着投稿100件を取得して、d3.jsのForceレイアウトを使ってタグの関係性を表示してみた。

http://bl.ocks.org/tag1216/4817fdf092634270bbbf

![qiita-tag-force.png](https://qiita-image-store.s3.amazonaws.com/0/35192/5a24b672-7a63-0641-be60-f63f54f7b165.png)

各投稿に付けられたタグを調べて、同時に使用されていたタグ同士をリンクとして表している。

新着100件だと半日～1日程度のデータなので、見るタイミングによってけっこう流動的にリンクが変わってしまうのでちょっと微妙。。。



## 参考にしたサンプル
  
http://bl.ocks.org/mbostock/4062045
Reveal.js を利用した内部公開スライドサーバーでスライドの自動デプロイを行う

# Reveal.js を利用した内部公開スライドサーバーでスライドの自動デプロイを行う

## 概要
Reveal.js を利用した内部公開スライドサーバーでスライド自動デプロイを行います。

## 構成
* GitLab : GitHub Clone 。Git リポジトリの管理
* Hubot  : ボット開発・実行フレームワーク
* Kandan : HipChat Clone. チャットツール
* スライドサーバー (node.js / reveal.js / connect )

## 構成図

![slide_structures.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6e4dc340-18c0-e665-1e35-dc275a718f69.png)

## 処理の流れ
* ローカル環境で、Reveal.js のスライドを編集し、 GitLab サーバーに push
* GitLab サーバーは WebHooks を利用して Hubot へ push を通知
* Hubot は node.js の `child_process` を利用してシステムコマンドからスライドサーバーデプロイ用の bash を呼び出し、デプロイを実行
* Hubot は push の内容を Kandan のチャットに通知

## 前提
* スライドサーバーの初期構築は済んでいる前提
* Hubot サーバーからスライドサーバーへの 公開鍵による ssh 接続設定を済ませておく

## サンプルコード

### デプロイ用の bash

スライドサーバーに公開鍵で ssh 接続し、
対象ディレクトリに移動後、 git pull します。
静的サイトにつき、 git pull のみで最新化完了。

Hubot プロジェクト直下に shells ディレクトリを作成し、
そこに、 deploy_slide.bash として保存します。
※ディレクトリ構成や bash のファイルについて、命名や配置は自由

~~~bash
#!/bin/bash
cat << EOF > /tmp/CMD.txt
cd /home/some_user/slides/
git pull
EOF
CMD=`cat /tmp/CMD.txt`
rm /tmp/CMD.txt
ssh some_user@ip_or_name -i /home/some_user/.ssh/keyname "$CMD"
~~~

### Hubot Script

GitLab の WebHooks に Hubot Server を登録し、
スライドショーのリポジトリに対して、 push があればHubot に通知する。

Hubot は、push の通知に対して

* push 内容を Kandan に Chat
* システムコマンドを呼び出し、スライドサーバーにリモート接続してデプロイを実行

の2つのタスクを行う。

~~~coffeescript
# Description
#   Deploy slide server(trigger is GitLab push event)
#
# Dependencies:
#   None
#
# Configuration:
#   None
child_process = require 'child_process'

module.exports = (robot) ->
  say = (message) ->
    user = {
      room :
        id : 11 # Slide
    }

    robot.send user, message

  robot.router.post "/gitlab/hook/slides", (req, res) ->
    json  = req.body
    say "New Slide Added or Updated"
    say "json['repository.name'] = #{json['repository']['name']}"
    say "json['commits'][0]['message'] = #{json['commits'][0]['message']}"
    child_process.exec ". /path/to/hubot_project/shells/deploy_slide.bash", (error, stdout, stderr) ->
      if !error
        say "http://ip_or_domain:your_port/index.html"
      else
        say "error"
    res.send 200
~~~

## 結果確認
### 実行前 スライド確認

![before_deploy.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b24bbbe5-9755-e9d9-13da-24bd8e620e5d.png)

### 変更内容

* 変更前

~~~markdown
##  Let's Publish Slideshow!
~~~

* 変更後

~~~markdown
##  さぁ、スライド作るべさ
~~~

### 変更適用

~~~bash
$ git add -A
$ git commit -m "日本語にしたべさ（検証中）"
$ git push origin master
~~~

### 実行後 スライド確認

![after_deploy.png](https://qiita-image-store.s3.amazonaws.com/0/43480/feaa6286-8180-89e2-d3ec-62b7ca12d427.png)

### 実行後 Kandan チャット確認

![after_deploy_kandan.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0e9f99c3-ae65-480c-f2f5-ec6e2233007f.png)
Hubot で外部コマンドを実行する

# Hubot で外部コマンドを実行する

## 概要
Hubot で外部コマンドを実行します。
検証はWindows環境で行います。

node.js の child_process を利用します。

## サンプルコード

Windows の date コマンドの結果を取得してみます

~~~coffeescript
# Description
#   Output external command
#
# Dependencies:
#   None
#
# Configuration:
#   None
child_process = require 'child_process'

module.exports = (robot) ->
  say = (message) ->
    user = {
      room :
        id : 6 # Other
    }

    robot.send user, message

  robot.respond /date/i, (msg) ->
    child_process.exec "date \/T", (error, stdout, stderr) ->
      if !error
        output = stdout+''
        say output
      else
        say "error"
~~~

## 出力
shell adapter で確認

~~~bash
Hubot> hubot date
Hubot> 2014/09/10
~~~

## 補足
今のところ、 npm で公開したりする予定はないので適当にGitHubに突っ込んでおきます。
https://github.com/tbpgr/hubot_scripts