OmniAICreator/Qiita-1.07M huggingface dataset:
VimperatorでTEXTAREAモード時のキーマップを変更する方法

# 経緯
VimperatorにはTEXTAREAモードという、Vimには存在しないモードがあります。
これは複数行に渡る入力フォーム上で、Vimのノーマルモードのようにカーソルを移動させたい時に用いることが出来ます。

ただ、僕は普段Dvorak配列を使っているので、Vimのようにキーの位置が重要なアプリではキーマップを変更する必要がありました。ですので、TEXTAREAモード時のキーマップを変更するプラグインを書きました。

# ブツ
以下の記事をまるパクリしました。
http://vimperator.g.hatena.ne.jp/nokturnalmortum/20120802/1343915409

```js
(function () {
	function textareaMap (lhs, rhs) {
		let noremap = true,
		silent = true,
		urls = void 0;

		rhs = mappings._expandLeader(rhs);

		mappings.addUserMap(
			[modes.TEXTAREA],
			[lhs],
			"User defined mapping",
			function (count) {
				events.feedkeys((count || "") + rhs, noremap, silent);
			},
			{
				count: true,
				rhs: events.canonicalKeys(rhs),
				noremap: !!noremap,
				silent: silent,
				matchingUrls: urls
			}
		);
	}

	// for Dvorak
	textareaMap("t", "j");
	textareaMap("n", "k");
	textareaMap("s", "l");
}());
```
Mojoliciousのセッションの話 2013年年末版

すき焼きの食材を買って帰ったはいいものの突然修正しなくてはいけないコードが降ってきまして〜 自炊する時間がなくてしょうがなく **最高のラーメン** を食べたゆーすけべーです。

今回はMojoliciousのセッションについてのお話。もともと備わっているMojoliciousのセッションを使うにはこのような操作をします。

```perl
#!/usr/bin/env perl
use Mojolicious::Lite;

app->secret('passphrase');

get '/' => sub {
    my $self = shift;
    $self->session->{count}++;
    $self->stash->{count} = $self->session->{count};
    $self->render('index');
};

app->start();
__DATA__

@@ index.html.ep
Count: <%= $count %>
```

アクセスする度にカウントの数字が1増えます。簡単でしょ？ただ、ご存知かもしれませんが、Mojoliciousのセッションは…「keyとvalueのハッシュ構造をJSONにした文字列と `secret` で設定したパスフレーズとをあわせたものをBase64にしてcookieぶっこんでいる」という仕様になっています。つまり

* ストア先はブラウザのcookieの値そのものに
* ブラウザcookieの値の長さ制限がある場合はそれに依存する
* `secret` が分かると中身が見れちゃう

ちょっとしたMojolicious::Liteを使ったアプリではこれでいかもですが、僕としては

* セッションIDだけをcookieとして保持
* 実際のデータストアはmemcachedとかredisに置きたい

という要望が出てきました。その際にわりと決定版な策は PSGI経由で立ち上げて **Plack::Middleware::Session::Simple** を使う方法です。従来まではPlack::Middleware::Sessionを使ってたり、独自にセッションマネージャを実装していましたが、<del>Plack::Middleware::Sessionの場合CHIというちょっとファットなモジュールを介さないとmemcachedが使えなかったり、</del> 自分でつくるとめんどかったりで一長一短でした。kazeburoさんが最近リリースしたPlack::Middleware::Session::Simpleは名前の通り実装がシンプルで依存関係も少ないのでオススメ。

上記の例をPlack::Middleware::Session::Simpleを使って書くなら `helper` で `psession` ってのを定義してこんな具合。

```perl
use Mojolicious::Lite;
use Plack::Builder;
use Cache::Memcached::Fast;

helper psession => sub {
    my $self = shift;
    my $env = $self->req->env;
    return $env->{'psgix.session'};
};

get '/' => sub {
    my $self = shift;
    $self->psession->{count}++;
    $self->stash->{count} = $self->psession->{count};
    $self->render('index');
};

builder {
    enable 'Session::Simple',
        store =>
            Cache::Memcached::Fast->new( { servers => [qw/127.0.0.1:11211/] } ),
                    cookie_name => 'myapp_session';
    app->start();
};

__DATA__

@@ index.html.ep
Count: <%= $count %>
```

いい感じ〜 ちなみにPlack::Middlware::Session::Simpleのデータストアには「get/set/remove」メソッドが実装されているものならなんでもイケるのでredisとかへのラッパーを書けば他のデータストアも使えますねぇ〜

### 追記

kazeburoさんから指摘を受けて、Plack::Middleware::Sessionでもget/set/removeを実装すればCHI介さないで使えるとのこと。確かにCacheのインターフェスですからね。ってことで修正。ようは、よく出来たPlack::Middleware::*のセッション管理を使ってそれをMojoliciousでゴニョるってのがよいよーって話でした。
設定、プラグイン導入した後にこれだけはやっとけってやつ


はい。`Advent Calendar 2013`だよ。

## オススメの設定は沢山あるけど、最終的には個人の使い方によって変わってくる

### でも、1つだけ上げるとしたら他のアプリ実行とか



- IntelliJ IDEAから他のアプリを実行できる
- ショートカットキーで実行・起動できる


## 設定手順

### `Preference...` -> `Settings`を開いて、`External Tools`を選択

![cap 2013-12-03 9.09.48.png](https://qiita-image-store.s3.amazonaws.com/0/9497/54a78500-2398-644d-5379-ee6dc0f5edac.png "cap 2013-12-03 9.09.48.png")


### 画面右側の左下にある`+`ボタンを押下

![2013-12-03 09-13-10 cap 2013-12-03 9.11.39.png.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/576175dc-7693-4e18-3277-4c0c473b1035.jpeg "2013-12-03 09-13-10 cap 2013-12-03 9.11.39.png.jpg")

### `Create Tool`ってウィンドウが開きます。

簡単に説明します。

![2013-12-03 09-23-37 Create Tool.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/093b4c0b-8887-f754-dcf3-6cd425d58200.jpeg "2013-12-03 09-23-37 Create Tool.jpg")

項目名|説明
-----|-----
Name|起動・実行したいアプリの名前とかを付けましょう
Group|BrowserとかEditorとかアプリの種類毎に分けると便利
Main menu|オンチェックでMain menuに表示させます
Editor menu|開いてるソースを他のエディタで開きたい時とかはオンチェック*
Project views|このソースを他のエディタで開きたい時とかはオンチェック*
Program|起動したいアプリを設定
Parameters|起動したいアプリに渡す引数（オプション）

ざっくり、こんな感じです。

\* 該当ファイルを他のアプリ（エディタとか）で開きたい場合はParametersには`$FilePath$`を指定します。


### Chromeブラウザを起動してみる

![2013-12-03 09-24-30 Edit Tool.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/21723b26-75ee-c3d3-cd23-07c578e65cc0.jpeg "2013-12-03 09-24-30 Edit Tool.jpg")

こんな感じで、設定してみます。

ブラウザなら`Live Edit`があるじゃん！と思いますがJavaScriptとか動的な処理が上手く動かないので微妙です。

`OK`でウィンドウ閉じて`Settigs`のウィンドウも`OK`で閉じます。

ここで、`Project views`で右クリックしてみると右クリックメニューに`App` -> `Chrome`があると思います、選択すると、無事、Chromeが開いたと思います。

### ショートカットキーを割り当てる

`Preference...` -> `Settings`を開いて、`Keymap`を選択

設定した（アプリ）名で検索して、`External Tools`以下にある項目が見つかります。

あとは、ショートカットキーを設定してください。

![2013-12-03 09-34-25 Settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/9497/bf188a79-d9df-20d7-0247-9c7543c15deb.jpeg "2013-12-03 09-34-25 Settings.jpg")

これで、IntelliJ IDEAでコード書いてる途中にChromeに切り替える事ができました。

画面の確認などもスピーディーに行えるので大変便利です。



-----
逆にChromeからIntelliJ IDEAをショートカットキーで開く方法もありますが、MacとWindowsでは勝手が異なるので、省きます。

## 最後に

####既に知ってる方には当たり前の設定ですが、ご存じない方は直ぐに設定した方が良いと思います。
シェルやバッチ、スクリプトの実行、今見てるソースコードをEmacsやVim、Sublime Text Nで開きたいとか、
MarkdownやReSTファイルを確認したい場合とか
IntelliJ IDEAからOS再起動とか（ダメ、絶対）何でもできちゃいます！


-----

参考：
http://confluence.jetbrains.com/display/PhpStorm/Running+External+Tools+in+PhpStorm
[Rails][RSpec] Capybaraでフォーム入力をシミュレートしてテストする




Ruby on Rails Tutorialのエッセンスを自分なりに整理してみる10

[Rails4.0] フォームの基本とStrongParametersを理解する
http://qiita.com/kidachi_/items/7c1a9b61dd1853d5a7dc
の続き。

Ruby on Rails Tutorial（chapter7）
http://railstutorial.jp/chapters/sign-up?version=4.0#code-after_save_tests


## 概要

ユーザ登録等、よくあるフォーム入力を実装した時、
いちいちブラウザから様々なパターンの値を入力してテストするのは大変。
Capybaraのシミュレート機能を使って解決する。

## 今回用いるCapybaraのメソッド

以下の2つ。

- fill_in
- change


## fill_in

フォームへの入力をシミュレートする。

例えば、

```rb
fill_in "Name", with: "Example User"
```

これでフィールド名"Name"のinput属性に"Example User"の入力をシミュレートしたことになる。

より具体的に、以下のようなユーザ情報入力フォームがあるとする。

```rb:erb
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>
      <%= f.submit "Create my account" , class: "btn btn-large btn-primary" %>

    <% end %>
```

この場合、以下のテストコードで各フィールドに対する値の入力が実現できる。

```rb
visit signup_path
fill_in "Name",         with: "Example User"
fill_in "Email",        with: "user@example.com"
fill_in "Password",     with: "foobar"
fill_in "Confirmation", with: "foobar"
```



## change

オブジェクトとそのオブジェクトが持つメソッドを指定し、
その実行によって起きる変化を観測する。

click_buttonの後、User.countが1だけ変化する事を期待する例

```rb
expect do
  click_button "Create my account"
end.to change(User, :count).by(1)
```

- オブジェクト（User）とシンボル（:count）を引数に取り、シンボルに該当する名前のメソッドを呼び出す。
- `expect do~end.to`の後ろについて、ブロック内が実行される前後での変化を比較する。

## 実際のテストコード

上記2つのメソッドを用いて、

- ユーザ登録ページ（signup）に訪れ
- フォームに何らかの値を入力し（もしくは入力しないで）、
- "Create my account"ボタンを押下

したケースをシミュレートするテストコード

```rb
require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "signup" do

    before { visit signup_path }

    let(:submit) { "Create my account" }

    # 不正な値が入力された（正確には、何も入力されていない）ケース
    describe "with invalid information" do
      it "should not create a user" do
        #click_buttonの後、User.countが変化しない事を期待
        expect { click_button submit }.not_to change(User, :count)
      end
    end

    # 正しい値が入力されたケース
    describe "with valid information" do
      before do
        fill_in "Name",         with: "Example User"
        fill_in "Email",        with: "user@example.com"
        fill_in "Password",     with: "foobar"
        fill_in "Confirmation", with: "foobar"
      end
      it "should create a user" do
        #click_buttonの後、User.countが1だけ変化する事を期待
        expect { click_button submit }.to change(User, :count).by(1)
      end
    end
  end
end
```

便利！

## 関連
RSpecの基本等については以下も参照ください。

[Rails] RSpecによるBDD（振舞駆動開発）の基本 [SporkとGuardも]
http://qiita.com/kidachi_/items/cb8910eb74e924456df9

[Rails] RSpecのリファクタリング
http://qiita.com/kidachi_/items/ec184deb106e4e5c90c3
IE8 でも box-shadow を使う

最近、案件での IE 最低ラインが 8 になってきました。とても喜ばしいことですが、8 が良いわけではなく、7 や 6 といった不良仲間で確認しなくても良くなった、というだけです。

さて、デザイン内に影がついていることはフラットデザインが流行っている今でも普通にあることで、でもどうせならその影は box-shadow で表現したいという欲求が常にあります。IE なぞ切り捨ててしまえば、Sass で一発なんですが、そうもいきません。

```sass::box-shadow.sass
@include box-shadow(0 0 3px rgb(100, 100, 100));
```

IE8 という、-ms- を付けてもダメな不良品には、box-shadow が使えません。でも画像を影付きで切り出すのは、対象となるボックス内の伸張を考えるとどうしても階層が深くなってしまうので、あまりやりたくありません。そこで、filter を使ってあげましょう。

```css::box-shadow.css
box-shadow: 0 0 5px #555;
-moz-box-shadow: 0 0 5px #555;
-o-box-shadow: 0 0 5px #555;
-ms-box-shadow: 0 0 5px #555;
filter: progid:DXImageTransform.Microsoft.Shadow(color=#aaaaaa, direction=0, strength=3, enabled=true), progid:DXImageTransform.Microsoft.Shadow(color=#aaaaaa, direction=90, strength=3, enabled=true), progid:DXImageTransform.Microsoft.Shadow(color=#aaaaaa, direction=180, strength=3, enabled=true), progid:DXImageTransform.Microsoft.Shadow(color=#aaaaaa, direction=270, strength=3, enabled=true);
```

## Chrome での影（box-shadow）
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/p/primedesignworks/20131203/20131203092727.png" alt="" title="" />

## IE8 での影（filter）
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/p/primedesignworks/20131203/20131203092728.png" alt="" title="" />


box-shadow とは異なり、4 方向に値を与えないといけない点や、filter で指定する色やぼかし範囲が違ったり、box の外側に付くわけではなく filter による影が幅や高さにプラスされるのでそれぞれ negative margin を別途与えてやる必要はありますが、これで階層を少し浅くできますね。
Phalcon Model::save メソッドのオプション引数の正体

Phalcon PHP Framework で Model を永続化させるメソッドには、謎のオプション引数が用意されています。

* `array $data`
* `array $whiteList`

こいつらはいったいなんぞやというお話です。

```php:Phalcon.Mvc.Modelより抜粋
/*
 * Inserts or updates a model instance. Returning true on success or false otherwise.
 *
 * @param array $data
 * @param array $whiteList
 * @return boolean
 */
public function save($data=null, $whiteList=null){ }
// - 以下同様 -
public function create($data=null, $whiteList=null){ }
public function update($data=null, $whiteList=null){ }
```

現在、これについてAPI リファレンスにはなにも記述がありません。
**しかしほぼ書き終えてからドキュメントを見たら...一言記載がありましたorz**

[ドキュメント:Creating Updating/Records](http://docs.phalconphp.com/en/latest/reference/models.html#creating-updating-records)

# 調べた結果

いきなり結論です。

## array $data

永続化クエリを実行する前に、Model に反映させるデータを連想配列で指定します。
クエリに用いるデータではなく、あくまでも Model に反映されるデータなので、
事前に Model のデータが変更されている場合、$data で渡したカラムの値以外も更新されます。
つまり、 `$model->assign($data)` と同じ挙動ということです。

## array $whiteList

第一引数である $data に対する、「Model にデータを反映するカラムを限定するホワイトリスト」です。
**SQLには何ら影響を及ぼしません**

```php
$user = Users::findFirst($id);    // 余談ですが findFirst には主キー値を渡すこともできます。
$user->first_name = "Foo";
$user->save(
    array(
        "first_name" => "Kenta",
        "last_name" => "Suzuki",
        "age" => "24"
    ),
    array( "age" )
);
```

つまり上記のようにした場合、永続化実行前に $user に反映されるデータは `age` だけとなります。
`first_name` については、その前に設定した `"Foo"` さんのまま、INSERT や UPDATE 文に反映されます。

# 調べた方法と内容

以降は、私が調査した内容ですので忙しい方には蛇足となります。
要するにエビデンスです。

## 実験してみた

Phalcon の O/R マッパは、常に全てのカラムを挿入・更新します。

> 追記： [Dynamic Update](http://docs.phalconphp.com/en/latest/reference/models.html#dynamic-update)を使うことで変更されたカラムのみ更新することができるようになります。

もし SQL に使用するカラムを限定できるなら、BLOB などのサイズの大きいカラムを毎回更新せずに済み、パフォーマンス向上が期待できます！

save メソッドをオーバーライドして自分で SQL を発行したりすれば対応できる問題ですが、更新カラムを限定できるインターフェイス仕様くらあってもいいんじゃないかと常々思っていました。
そんな折に、`array $whiteList` という引数がふと目に止まったので、これはもしやと思いさっそく実験してみました。

```php
$user = Users::findFirst($id);
$user->first_name = "Kenta";
$user->last_name = "Suzuki";
$user->age = "24";

// ホワイトリストで age のみの更新にできるかな...?
$user->save(null, array( "age" ));
```

発行された SQL (ログより抜粋)

```sql
UPDATE `users` SET `username` = ?, `password` = ?, `email` = null, `first_name` = ?, `last_name` = ?, `age` = ?, `created_ts` = ?, `updated_ts` = ? WHERE `id` = ?
```

見事に全てのカラムが更新されるとともに、淡い期待は打ち砕かれました。
うっかりパスワードなどの秘密情報を一時削除したエンティティを save してしまったらアウトですね。

## ソースを見てみた

C言語なのであまり見やすくはありません。
Phalcon2 からは [Zephir](https://github.com/phalcon/zephir) という専用言語で開発されるということで、待ち遠しいですね。

[model.c#3993](https://github.com/phalcon/cphalcon/blob/master/ext/mvc/model.c#L3993) で in_array (phalcon_fast_in_array) を使って attribute の存在を確認してます。
さらに見つからなかったら continue でスキップしています。

スキップされたブロックを見ると、コメントに「We check if the field has a setter」とあります。
setter を探してみつかれば　setter を使い、なければフィールドに値を格納しているようですね。

やはり、SQL は無関係でした。

ここまで書いて、ドキュメントに記載があることを見つけてしまいました...
API ばかり見ていて気づきませんでした。

ということで、以上です！
等差数列(2013.5.17の過去問)

1日1個 @nabetani さんの作った問題を解く、どう書くAdventCalendarの3日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord11arithseq/ にあります。

```hs
module Doukaku.Tousa (solve) where

import Data.Char (isDigit, ord)
import Data.List (tails)

solve :: String -> String
solve = show . maximum . map maxSeqLen . tails . parse

parse :: String -> [Int]
parse = map parse'
  where
    parse' c
      | isDigit c = ord c - ord '0'
      | otherwise = ord c - ord 'a' + 10

maxSeqLen :: [Int] -> Int
maxSeqLen [] = 0
maxSeqLen (_:[]) = 1
maxSeqLen (x:y:ys) = maximum [2 + maxSeqLen' (y + n) ys, maxSeqLen (x:ys)]
  where
    n = y - x
    maxSeqLen' next xs = if null left then 0 else 1 + maxSeqLen' (next + n) (tail left)
      where (_, left) = break (== next) xs
```

一度Haskellで解いた問題を再チャレンジしてみました。割とハマりどころがある問題のようで、今回もちょっとハマりました。`maxSeqLen`は与えたリストの先頭要素から始まる等差数列の長さを求める関数だったのですが、二番目以降の要素を飛ばすパターンを考慮してなかったのでテストが通らず、急遽再帰させて二番目以降の要素を飛ばす実装に書き換えました。

以前の自分の回答は https://gist.github.com/hiratara/5786734 にあるのですが、似た方法な上にどちらかと言えば過去に書いたものの方が洗練されていることに驚きます。人間って退化するものなのですね！

http://qiita.com/Nabetani/items/c206fbc645c255cb7de6 に他の方の回答もありますので、見ると参考になるでしょう。
【募集】技術を教え合いっこしませんか？

@puriketu99さんが、[面白い試み](http://qiita.com/puriketu99/items/7370901978887fe59a49) をされていたので・・・。

私もやってみます。

## 教えてほしいこと　（優先度順）
・大規模なプログラムや大型ツールを作る際の、高度な設計技術（GoFのデザインパターンなどは知っているので、それ以上のノウハウが知りたい）
・TypeScriptの実践的な使いこなし（基礎はできるんですが、それ以上のことが・・・）
・Railsの上級知識（高度な使い方、パフォーマンスチューニング、テストなど）
・JavaScriptのハードコアなところ
・WordPress（一般的な使用方法でなく、カスタマイズ開発など）
・Webデザイン全般
・PostgreSQL（実際の運用で必要なノウハウなど）

## 教えられること　（得意な順）
・リアルタイム３DCGの理論
・OpenGL/DirectX/WebGL/Three.js
・Ember.jsの基礎
・Javascript/Typescriptの基礎
・Railsの基礎

## 段取り
1. 教えられることと教えて欲しいことを私に伝えてもらう。
2. 軽く自己紹介＆自分の技術バックグラウンドの説明。
3. 教えあう時間帯や、やりとりの方法などを話し合う。
4. 合意ができれば、GO！

興味持たれた方は、私のTwitterアカウントまたはこの記事のコメントにてご連絡ください。

契約とか、あまり堅苦しいやり方でなく、ラフな感じでやれればと思うのですが、もっとこう・・・ちゃんとやりたいという方は、合わせます。



っていうか、こういう、「スクールに通うほどのお金はないけど、これは教えるから逆にそっち教えて系のサービスも作ってよ」的なことを以前Qiitaサポートにリクエストしたんですが、華麗にスルーされたんですよね（笑）

みんなで、この手の投稿をするのをはやらせれば、もしかしたらQiita運営も何か考えてくれるかもしれません。

というわけで、みなさんも「教えてほしいスキル」と「教えられるスキル」を晒してみよー！
1分でPAGER環境変数を設定したあとページャーを知る

しょっちゅう宗教戦争の火種になるエディタやブラウザと違って、注目されない日陰の存在。

知ったところで何かが劇的に革新されるわけではまったくないけど、世界の景色がちょっとだけ違って見える、かもしれない。

一分で知ったところで何かが実現できるかもしれないし、何も実現できないかもしれない。そんな[1分で実現できる有用な技術 Advent Calendar 2013](http://qiita.com/advent-calendar/2013/one-minute)の三日め、はじまります。

-----

### ページャーって何?

端末の画面でテキストを読むアプリケーションのこと

 * ファイルを読むこともできる
     * `less /etc/passwd`
 * 長いコマンドの実行結果をまとめて読むこともできる
     * `seq 109 10 9999 | less`
 * もちろんテキスト検索もできる

### まづどうすればいいの

好きなページャーを選んで`PAGER`環境変数に登録しよう

### 好きなページャーを探す

いろいろありまっせ。

たいていは `brew` とか `apt-get` でインストールできるので積極的にためしてみると良いですね。

 * `less`
   * ページャー界のデファクトスタンダート
 * `lv`
   * 国産のページャー
   * 日本語の文字コードに強い… らしい
   * コマンド名の短かさ押しやすさからページャー界に根強いファン層あり
 * `w3m`
   * 国産テキストブラウザとして有名だがページャーでもある
 * `most`
   * JED Editorの作者が作ったページャーです
   * 青い
 * `vimpager`
   * Homebrewでインストールできる。まじかよ…
   * Vimの標準パッケージに入ってる`less.sh`よりもずっと良い(主観)
   * それでも正直「お、おう…」って感じです
   * `emacspager`も存在する? らしい…?

### ページャーを選ぶ

実際にUNIXを利用する際、よくページャーを利用するのは`man`コマンドです。上で紹介したページャーはどれも、すくなくとも`man`は問題なく利用でき *(るように見え)*ます。

一時的に任意のページャーを使って`man`コマンドを利用するにはシェルから `PAGER=vimpager man less` のように起動します。

### それからどうするの?

 * `.bashrc`とか`.zshrc`とかで `export PAGER='lv -c'` と追記する
 * `git config --global core.pager 'lv -c'` と実行したりする
 * [.hgrcにpager設定をする](http://mercurial.selenic.com/wiki/PagerExtension)

*ほかにもあったら知りたいな!*

### もうひとつの観点

`git config --global color.ui auto` など設定すると、`git diff`や`git log`などでカラー表示されるようになります。君の選んだページャーはエスケープシーケンスに対応してるかな?

**結末はキミの目で確かめろ！** (完)

-----

ここまで1分(で読み切れる、といいなあ…)

結局のところ
------------

 * `lv`って打ちやすくね?
Corona SDK + Parse.com でプッシュ通知をする


Corona SDK と Parse.com にてプッシュ通知を試してみました。
超ざっくりですが、まとめてみます。

* [Parse](https://parse.com/)

## ライブラリがサポートされていない

まず、最初に残念なお知らせになりますが、Corona SDK 用のライブラリがサポートされていません。つまり、ライブラリを突っ込んで require して数行追加するだけで簡単プッシュ通知！とはなりません、残念ながら。

一応、サードパーティのライブラリはあるようですが、更新が 2011 年で停止しているため、信頼性に欠けるので利用するかどうかはよく考えた方が良さそうです。

* [Dotnaught/Parse-for-Corona-SDK](https://github.com/Dotnaught/Parse-for-Corona-SDK)

## API は用意されている

ライブラリはサポートされていませんが、API は用意されています。これを利用しましょう。

* [REST API | Parse](https://parse.com/docs/rest#push)

## サンプルコード

以下のリポジトリに全体のサンプルコードがあります。

* [FakeStarBaby/parse](https://github.com/FakeStarBaby/parse)

設定ファイルに `notification` の項目を記述しておきます。

```lua:config.lua
application = {
  content = {
    width = 320,
    height = 480,
    scale = "letterBox",
    fps = 30,
  },

  notification = {
    iphone = {
      types = {
        "badge", "sound", "alert"
      },
    },
  },
}
```

Parse にて提供される `Application ID` と `REST API Key` を利用して、API を発行します。

```lua:main.lua
local applicationId = "xxxxx"
local restApiKey    = "xxxxx"

require("parse")

parse.initialize(applicationId, restApiKey)

local function listener(event)
  if event.isError then
    print("Error")
  elseif event.status == "began" then
    print("Began")
  elseif event.status == "installations" then
    print("Installations")
  elseif event.status == "ended" then
    print("Ended")
  end
end
parse.installations(listener)
```

Parse ロジックを `parse.lua` に閉じ込めてライブラリ化しました。ここでは、iOS 限定のロジックにしています。

```lua:parse.lua
module(..., package.seeall)

function initialize(applicationId, restApiKey)
  params = {
    headers = {
      ["X-Parse-Application-Id"] = applicationId,
      ["X-Parse-REST-API-Key"]   = restApiKey,
      ["Content-Type"]           = "application/json",
    },
  }
end

function updateListenerStatus(status)
  if listener then
    listener{ status = status }
  end
end

function installations(listener)
  local json = require("json")

  local function notificationListener(event)
    if event.type == "remoteRegistration" then
      params.body = json.encode({
        deviceType = "ios",
        deviceToken = event.token,
      })

      local function networkListener(event)
        if event.isError then
          if listener then listener{ isError = event.isError, status = "ended" } end
        else
          if listener then listener{ status = "ended" } end
        end
      end

      network.request("https://api.parse.com/1/installations", "POST", networkListener, params)
      if listener then listener{ status = "installations" } end
    end
  end

  Runtime:addEventListener("notification", notificationListener)
  if listener then listener{ status = "began" } end
end
```

実機で動作確認をすると、プッシュ通知を受け取るか否かを選択するアラートが表示されます。許可した場合、Parse 側にデバイス情報が登録されて、以後、Parse 側からプッシュ通知をすることが可能になります。

## 追記 2014/02/13(木)

手軽に使えそうな Corona SDK + Parse.com なモジュールが公開されているようです。

* [A Parse.com Module for Corona SDK | develephant](http://www.develephant.net/a-parse-com-module-for-corona-sdk/)
VimとPowerShell


この記事は[PowerShell Advent Calendar 2013][0] : ATND 3日目の記事になります。

PowerShellをVimで書こうとする人はそういないと思いますが、
私のVimでPowerShellを書くために設定していることを紹介したいと思います。


## VimでPowerShellの開発環境を整える。

> https://github.com/PProvost/vim-ps1

このプラグインを導入すると、PowerShellのシンタックスやインデントなど設定をこれ１つでまとめてインストール出来ます。


## PowerShellをQuickRunする。

追記(2014/02/06)： QuickRunのデフォルト設定にPowerShellの設定が追加されたので、この設定は不要になりました。

> [Add PowerShell support · 376d392 · thinca/vim-quickrun ](https://github.com/thinca/vim-quickrun/commit/376d392e70567443bfa11239f6bf8b6b2df10e13)

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

Vimには[quickrun.vim][1]という、バッファ上のソースコードを実行して、その実行結果を Vim へ出力する為のプラグインがあります。
このプラグインを入れて`QuickRun`というコマンドを実行すれば、大抵はデフォルトの設定でうまく実行できるのですが、PowerShellはExecutionPolicyというものがあるので、デフォルトの設定では`QuickRun`コマンドをPowerShellコードに対して実行することができません。

この解決方法としましては、.vimrcに以下の設定を追加することで解決出来ます。

```ps1:
let g:quickrun_config['ps1'] = {
      \   'command' : 'powershell.exe',
      \   'cmdopt' : '-executionPolicy RemoteSigned',
      \   'tempfile' : '%{tempname()}.ps1',
      \   'exec' : '%c %o -F %s:p',
      \ }
```

## VimとPowerShellの環境変数PATHを共通にする。

> http://qiita.com/rbtnn/items/36e86d30c7c00d99050a

ここに書いた通りですが、Windowsで環境変数PATHを設定するのってすごく面倒なんですよね。
「システムのプロパティ」から「環境変数」に行ってあのテキストボックス1行にパスを；でつなげて入れなければならない。
この方法以外にも解決策は色々あると思いますが、よかったら使ってください。



# 終わり

以上、VimとPowerShellについてでした。
たぶん、VimmerかつPowerShellerな方は相当少ないと思うので、簡単な紹介程度にしました。


[0]: http://atnd.org/events/45107
[1]: https://github.com/thinca/vim-quickrun
GitLab内のEditor(Ace)で，Safari7.0でのカーソル表示の不具合の解消

#### あらまし
GitLabにはブラウザ上でファイルを編集する機能(Ace:Ajax.org Cloud9 Editor)が搭載されている．
便利な機能だが，Safari 7.0(OS X Mavericks)だと英字でのカーソルの位置がおかしい．その解消法を示す．

#### 症状
![gitlab.gif](https://qiita-image-store.s3.amazonaws.com/0/31166/5a285e14-0d0f-378d-519a-725087092543.gif)
GitLab内の編集画面

文字間とカーソルの位置がずれていることがわかる．

#### 解消法
ターミナル(Terminal.app)に以下のコマンドを入力，Enter．

```shell-session
$ defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2ScreenFontSubstitutionEnabled -bool YES
```

#### 結果
![gitlab_fixed.gif](https://qiita-image-store.s3.amazonaws.com/0/31166/6f60de7c-6487-4467-60b3-01cbb51c40f0.gif)
同画面

カーソルから文字が正しく出現している．

#### 参考
[Cursor mispositioned when using fractional fixed-width fonts · Issue #1534 · ajaxorg/ace · GitHub](https://github.com/ajaxorg/ace/issues/1534)
websocket-railsで簡単なPush通知を実装する


[websocket-rails](https://github.com/websocket-rails/websocket-rails)を使ってRailsでWebSocketによるPush通知を実装する話をします。

websocket-railsを使って簡単な[デモ](http://naoty-timeline.herokuapp.com/)を作ってHerokuにアップしました。Twitter Streaming APIで受け取ったデータをWebSocketでリアルタイムにクライアントへ送るものです。ソースコードも[github](https://github.com/naoty/twitter_streaming_sample)にありますので参考にどうぞ。

## セットアップ

```rb:Gemfile
gem "websocket-rails"
```

```bash
$ bundle
$ rails g websocket_rails:install
```

最後のコマンドで設定ファイルを追加し、`application.js`をクライアント側のライブラリを`require`するように変更します。

開発環境ではRack::Lockを無効にしないとエラーになるので以下のようにしておきます。

```rb:config/environments/development.rb
TwitterStreamingSample::Application.configure do
  config.middleware.delete Rack::Lock
end
```

## 実装

WebSocket接続したクライアントに対して任意のタイミングでメッセージを送りたい場合、channelというものを使うと簡単に実装できます。

```ruby:streamings_controller.rb
def create
  # ...
  WebsocketRails[:streaming].trigger "create", tweet
  head :ok
end
```

これで、"streaming"というチャネルに"create"というメッセージをtweetのデータとともに送信します。`WebSocketRails`という定数はどこからでもアクセス可能なので、任意のタイミングでチャネルにメッセージを送ることが可能です。

```coffee:streamings.js.coffee
dispatcher = new WebSocketRails("ws://#{localhost.host}/websocket")
channel = dispatcher.subscribe("streaming")
channel.bind "create", (tweet) ->
  # something
```

次にクライアント側では、まずWebSocket接続を行います。WebSocket接続はwebsocket-railsが追加する`/websocket`というパスに対してリクエストを送ります。

接続が成功するとdispatcherと呼ばれるオブジェクトを返します。このオブジェクトはWebSocketサーバーとやり取りをする中心的なオブジェクトです。`dispatcher#subscribe(チャネル名)`で特定のチャネルを購読するオブジェクトを取得できるので、あとはメッセージを受け取ったときのコールバックを設定するだけです。

### これだけ

これだけでdispatcherでsubscribeしたクライアントすべてに対してRailsからPush通知ができます。

## nginx

本番環境でnginxとともに運用する場合、nginx側の設定も必要です。nginxでWebSocketのプロキシを行うには1.3.13以降であることが必要です。

```nginx:nginx.conf
location /websocket {
	proxy_pass http://backend;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "Upgrade";
}
```

"Upgrade"というヘッダーはプロトコルをHTTPからWebSocketに変更するために必要な情報で、[RFC](http://tools.ietf.org/html/rfc6455#section-1.3)で定められています。

## Heroku

最近、HerokuがWebSocketのサポートを開始しました。ただし、まだβ版での開始なので、デフォルトのままではWebSocketを利用できません。以下のコマンドを実行するとWebSocketの機能がオンになります。

```bash
$ heroku labs:enable websockets
```

---

### 参考

- [websocket-rails/websocket-rails](https://github.com/websocket-rails/websocket-rails)
- [WebSocket proxying](http://nginx.org/en/docs/http/websocket.html)
- [Using WebSockets on Heroku with Ruby | Heroku Dev Center](https://devcenter.heroku.com/articles/ruby-websockets)
GoAndroidでʕ ◔ϖ◔ʔGo~


## はじめに
3日日担当の@ladicleです
タイトル通りAndroidのアプリ上でGoを動かそうと思います
とは言っても一から作るのではなく
[eliasnaur](https://github.com/eliasnaur)さんが書かれたパッチを使用していきます

## GoとAndroid
御存知の通り、AndroidのアプリはJavaで書かれていますので
そのままGoを動かすことはできません
というわけで、ネイティブライブラリ(.so)にしてアプリに埋め込みます

アプリじゃなくてルート取って動かせればいいよって方は[こちら](http://paradigmx.net/blog/2012/02/05/go-for-android/)。
パッチの話は[ここらへん](http://grokbase.com/t/gg/golang-nuts/136x2t7br3/go-nuts-ann-write-android-apps-in-go)参照。


## 環境
OS: Ubuntu 13.10 desktop amd64

```
昨日のRelease1.2で、OSXでもできるようになりました!!!
```


## 必要なもの
- Git
- Mercurial
- JDK7
- Ant

## 導入
##### 1 SDK
[SDK](http://developer.android.com/sdk/index.html)をDL。任意の場所に解凍してパス設定

```
export ANDROID_HOME="$HOME/Develop/Android/SDK"
```
##### 2 NDK
[NDK](http://developer.android.com/tools/sdk/ndk/index.html)をDL。任意の場所に解凍してパスを設定

```
export NDK="$HOME/Develop/Android/NDK"
```
下記のコマンドでNDKtoolchainの生成

```
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=ndk-toolchain
```

ndk-toolchainが生成されていたらパスを設定

```
export NDK_ROOT="$NDK/ndk-toolchain" 
```

##### 3 Go
適当なところで[パッチ(goandroid)](https://github.com/eliasnaur/goandroid.git)をクローン

```
git clone https://github.com/eliasnaur/goandroid.git
```
パスの設定

```
export GOPATH="$HOME/Develop/Golang"
export GOBIN="$GOPATH/bin"
```
ソースコードを持ってくる

```
hg clone https://code.google.com/p/go $GOPATH
```
パッチフォルダーをコピー

```
cp -a patches $GOPATH/.hg
```
Mercurialの設定

``` .hg/hgrc
[extensions]
mq =
codereview = !

[ui]
username = Go<Go@mail.com>
```
パッチの適用

```
cd $GOPATH/src
hg qpush -a
```
ビルド

```
CGO_ENABLED=0 GOOS=linux GOARCH=arm ./make.bash  
CC="$NDK_ROOT/bin/arm-linux-androideabi-gcc" GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=1 $GOBIN/go install -tags android -a -v std  
cd ../..
```

## 動かす
[goandroid](https://github.com/eliasnaur/goandroid.git)には

 - hello-gl2		:: Javaアリ
 - nativeactivity	:: Javaナシ

の2サンプルが入ってますが、手順はどちらも同じです

各フォルダ内の```build.sh```を実行すると.soライブラリが生成されます
(build.sh内の```../go/bin/```を```$GOBIN```に置き換え)

project.propertiesを使用するバージョンに書き換え
(今日落としたなら```target=android-19```)
Android端末を繋ぎ、下記のコマンドを実行するとインストールされます

```
ant -f android/build.xml clean debug install
```



## 書く
Javaから呼び出す関数の指定は

``` main.go
//export Java_net_goandroid_hellogl2_Engine_resize
func Java_net_goandroid_hellogl2_Engine_resize(env *C.JNIEnv, clazz C.jclass, width, height C.jint) {
        defer func() {
                if err := recover(); err != nil {
                        log.Fatalf("panic: resize: %v\n", err)
                }
        }()
        g.resize(int(width), int(height))
}
```
こんなかんじ。呼び出し元は

``` Engine.java
 static native void resize(int w, int h);
```
と、こんなかんじ。だいたい通常のJNIとcgoです

```
//export Java_(パッケージ)_(関数名)
func Java_(パッケージ)_(関数名)(env *C.JNIEnv, clazz C.jclass, ....) ... {
	return ...
}
```

変数名にC.jxxxxつけていくとだいたいうまくいきます[ʕ ◔ϖ◔ʔ](http://xdprof.sourceforge.net/doxygen/jni_8h-source.html)。

## おわり
たのしいAndroidライフを!
Safari 7.0でのOsakaフォントの不具合の解消法

#### はじめに
Safari 7.0（OS X Mavericks）でOsakaフォントでの日本語表示に不具合が生じている．個人的に気になっていたところ，たまたま解消法を発見したので書き記す．

#### 症状
![amazon.png](https://qiita-image-store.s3.amazonaws.com/0/31166/c679b9a1-b7ad-0c9f-44c8-cd83796fb411.png)
Amazon.co.jpを表示した例

#### 対処方法
ターミナルで以下のコマンドを入力，Enter．

```shell-session
$ defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2ScreenFontSubstitutionEnabled -bool YES
```

#### 対処結果
![amazon_fixed.png](https://qiita-image-store.s3.amazonaws.com/0/31166/2978d039-f13d-533a-1b52-692ae30ed74d.png "Amazon_fixed")
同一のページ例

正しく表示されていることがわかる．

#### 元に戻す場合

```shell-session
$ defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2ScreenFontSubstitutionEnabled -bool NO
```

もしくは

```shell-session
$ defaults delete com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2ScreenFontSubstitutionEnabled
```


#### 参考
[Cursor mispositioned when using fractional fixed-width fonts · Issue #1534 · ajaxorg/ace · GitHub](https://github.com/ajaxorg/ace/issues/1534)
UNIXシェルの初歩

おぼえよう。

```bash
$ cd /tmp
# cd(=Current Directory)は作業ディレクトリを変更するコマンド

$ mkdir shtest
# mkdir(=MaKe DIRectory)はディレクトリを作成するコマンド

$ cd shtest

$ pwd
/tmp/shtest
# pwd(=Print Working Directory)は現在の作業ディレクトリをプリント(標準出力)するコマンド

$ echo hoge
hoge
# echoは引数(+改行)を標準出力するコマンド
# = 標準出力されたコマンドは何事もないと画面に出てくる

$ echo hoge | wc -c
       5
# wc(=Word Count) は単語をカウントするコマンド
# = wc -c は単語数ではなく文字数だけをカウントするためのオプション
# = "hoge"+(見えない改行文字)が入力されるので結果は `5'
# |(たてぼう) はパイプと呼ばれる
# =  コマンドの標準出力を、ほかのコマンドの標準入力に渡す

$ touch myfile1
# ファイルのタイムスタンプを更新するコマンド
# = ファイルが存在しないと新規作成されるので、こちらの目的で利用されることが多い

$ echo hoge > myfile1
# > はリダイレクト
# = echo の結果をファイル `myfile1' に保存する

$ echo fuga > myfile2
# まだ存在しないファイルにリダレクトすることもできる

$ cat myfile1 myfile2
hoge
fuga
# cat(conCAT) は引数で渡されたファイルを連結して標準出力するコマンド
# = なぜ前半を略したし…

$ echo piyo | cat myfile1 - myfile2
hoge
piyo
fuga
# - の位置に標準入力された内容も連結することができる

$ echo foobar >> myfile1
# >> は追記型のリダイレクト
# = 追記とは、存在するファイルに対して追加で内容を記録すること

$ cat myfile1
hoge
foobar
# 驚くべきことに、catファイルひとつを標準出力することもできる
# = concatに由来するはずの名前に反して(!)

$ cat myfile1 | wc -l
       2
# wc -l は行数(Lines)をカウントするオプション

$ ls
myfile1 myfile2
# ls(=LiSt directory contents)はディレクトリの内容(ファイル・ディレクトリ)を出力するコマンド

$ ls > files
# lsの結果もファイルにリダイレクトすることができる
```

### 課題

 1. `files` ファイルの内容を標準出力しよう
 2. `ls` コマンドを使ってファイルの数を調べる方法を検討しよう

あとがき
--------

 * 12/3の[1分シリーズ](http://qiita.com/advent-calendar/2013/one-minute)のために書いた記事でしたが消すのはもったいないので供養
 * CとかRubyとかでファイル操作するのだるいので、標準入出力するような小さいプログラムを書く習慣を身につけるのが正義だって、私信じてる!
 * 書き始めたときのタイトルは「覚えられるだけ覚えたいUNIXシェルの基礎とawk」でしたが、いやいや一分じゃ無理だろｊｋ…
iOS 7から追加されたMKDirectionsで経路検索を試してみる


この記事は [iOS Second Stage Advent Calendar 2013](http://qiita.com/advent-calendar/2013/ios-2) 用にストックしておいたものです。すべて枠が埋まったようなので、通常記事として投稿します。

---

iOS 7 で追加された MKDirections が面白そうだったので、試しに六本木から渋谷へのルートを検索してみました。

まずは、出発点と到着点を `CLLocationCoordinate2D` で作成します。

```objc
// 六本木
CLLocationCoordinate2D fromCoordinate = CLLocationCoordinate2DMake(35.665213, 139.730011);

// 渋谷
CLLocationCoordinate2D toCoordinate = CLLocationCoordinate2DMake(35.658987, 139.702776);
```

ここで作成した `CLLocationCoordinate2D` をセットした `MKPlacemark` を生成します。

```objc
// CLLocationCoordinate2D から MKPlacemark を生成
MKPlacemark *fromPlacemark = [[MKPlacemark alloc] initWithCoordinate:fromCoordinate
                                                   addressDictionary:nil];
MKPlacemark *toPlacemark   = [[MKPlacemark alloc] initWithCoordinate:toCoordinate
                                                   addressDictionary:nil];
```

`MKPlacemark` から `MKMapItem` を生成します。

```objc
// MKPlacemark から MKMapItem を生成
MKMapItem *fromItem = [[MKMapItem alloc] initWithPlacemark:fromPlacemark];
MKMapItem *toItem   = [[MKMapItem alloc] initWithPlacemark:toPlacemark];
```

`MKMapItem` をセットして `MKDirectionsRequest` を生成します。

`requestsAlternateRoutes` に `YES` を設定すると、複数のルートを検索できるようです。

```objc
// MKMapItem をセットして MKDirectionsRequest を生成
MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
request.source = fromItem;
request.destination = toItem;
request.requestsAlternateRoutes = YES;
```

`MKDirectionsRequest` から `MKDirections` を生成します。

```objc
// MKDirectionsRequest から MKDirections を生成
MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
```

ここでようやく経路検索を実行できます。

```objc
// 経路検索を実行
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error)
 {
     if (error) return;

     if ([response.routes count] > 0)
     {
         MKRoute *route = [response.routes objectAtIndex:0];
         NSLog(@"distance: %.2f meter", route.distance);

         // 地図上にルートを描画
         [self.mapView addOverlay:route.polyline];
     }
 }];
```

ルート情報は `MKRoute` クラスで返ってくるようです。このクラスには経路情報の他、移動にかかる予測時間や距離なども含まれるようです。

最後に、地図上に表示されるルートの色や線の太さなどを設定します。

```objc
// 地図上に描画するルートの色などを指定（これを実装しないと何も表示されない）
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView
            rendererForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolyline *route = overlay;
        MKPolylineRenderer *routeRenderer = [[MKPolylineRenderer alloc] initWithPolyline:route];
        routeRenderer.lineWidth = 5.0;
        routeRenderer.strokeColor = [UIColor redColor];
        return routeRenderer;
    }
    else {
        return nil;
    }
}
```

### 実行結果
![](https://qiita-image-store.s3.amazonaws.com/0/8292/099339f3-05c6-79a9-d9d5-d889f4831c67.png "iOSシミュレータのスクリーンショット 2013.12.02 13.05.41.png")

▼こちらは複数のルートを検索してみた結果

![](https://qiita-image-store.s3.amazonaws.com/0/8292/c4a9bb1e-051c-c658-a881-51e534108ed5.png "iOSシミュレータのスクリーンショット 2013.12.02 13.35.53.png")


今回は特に指定していませんが、経路検索条件に「徒歩」や「自動車」などの指定もできるようです。

### サンプルソース

[https://github.com/koogawa/MKDirectionsSample]
複数の関数オブジェクトを1つにまとめる

同じ引数で複数の関数オブジェクトを同時に呼び出す必要があったので勉強を兼ねて作ってみました

```cpp
#include <iostream>
#include <tuple>
#include <string>


template <std::size_t... Indices>
class sequence{
public:
	using type = sequence<Indices...>;
};

template <class, class>
class concat_impl;
template <std::size_t... Left, std::size_t... Right>
class concat_impl<sequence<Left...>, sequence<Right...>>: public sequence<Left..., Right...>
{
};

template <class Left, class Right>
using concat = typename concat_impl<Left, Right>::type;

template <class, std::size_t>
class shift_impl;
template <std::size_t N, std::size_t... Indices>
class shift_impl<sequence<Indices...>, N>: public sequence<(Indices + N)...>
{
};

template <class Sequence, std::size_t N>
using shift = typename shift_impl<Sequence, N>::type;

template <std::size_t Begin, std::size_t End>
class make_sequence_impl:
	public shift< concat<
		typename make_sequence_impl<0, (End - Begin) / 2>::type,
		shift<typename make_sequence_impl<0, (End - Begin) / 2 + (End - Begin) % 2>::type, (End - Begin) / 2>
	>, Begin>
{
};

template <>
class make_sequence_impl<0, 1>: public sequence<0>
{
};

template <>
class make_sequence_impl<0, 0>: public sequence<>
{
};

template <std::size_t Begin, std::size_t End>
using make_sequence = typename make_sequence_impl<Begin, End>::type;


template <class... Functions>
class caller{ 
	std::tuple<Functions...> functions;

	template <std::size_t Head, std::size_t... Tail, class... Args>
	void call_impl(sequence<Head, Tail...>, Args... args)
	{
		std::get<Head>(functions)(args...);
		call_impl(sequence<Tail...>(), args...);
	}

	template <class... Args>
	void call_impl(sequence<>, Args...)
	{
	}

public:
	caller(Functions... funcs): functions(funcs...)
	{
	}

	template <class... Args>
	void operator()(Args... args)
	{
		call_impl(make_sequence<0, sizeof...(Functions)>(), args...);
	}
};

template <class... Functions>
caller<Functions...> make_caller(Functions... funcs)
{
	return caller<Functions...>(funcs...);
}


void function(const char *s, int a, int b)
{
	std::cout << "void function(const char *, int, int): " << s << ' ' << a << ' ' << b << std::endl;
}

class Class1{
public:
	void operator()(std::string s, int a, int b)
	{
		std::cout << "Class1::operator()(): " << s << ' ' << a << ' ' << b << std::endl;
	}
};

class Class2{
public:
	template <class Type>
	void operator()(Type s, int a, int b)
	{
		std::cout << "Class2::operator()(): " << s << ' ' << a << ' ' << b << std::endl;
	}
};

int main()
{
	make_caller()();

	auto caller = make_caller([](const char *s, int a, ...){
		std::cout << "first lambda function: " << s << ' ' << a << std::endl;
	}, [](const char *s, int a, int b){
		std::cout << "second second function: " << s << ' ' << a << ' ' << b << std::endl;
	}, function, Class1(), Class2());

	caller("string1", 0, 1);
	std::cout << std::endl;
	caller("string2", 2, 3);

	return 0;
}

```
Ruby 2.1.0-preview2で追加されたException#causeの紹介

[Ruby 2.1.0-preview2 リリース](https://www.ruby-lang.org/ja/news/2013/11/22/ruby-2-1-0-preview2-is-released/) で追加された `Exception#cause` というメソッドを紹介します。

続きは [Ruby 2.1.0の新機能のException#cause](http://blog.n-z.jp/blog/2013-12-03-ruby-exception-cause.html) で。
Cross-Zone Load Balancing を有効にしない理由がない件

# 今北産業

```text
Cross-Zone Load Balancing は
今すぐ
設定すべき
```

# kwsk

## これまで

2013年11月まで、AmazonEC2 の ELB (Elastic Load Balancing) を使うとき、こんなことに注意する必要がありました。

```
AZ (Availability Zone) 配下の EC2 インスタンス台数は均等化を推奨
```

[AWSマイスターシリーズ](http://www.slideshare.net/AmazonWebServicesJapan/20130612-aws-meisterregenerateelbpublic)にも出てくる、有名な注意点です。

推奨されていることを無視すると何が起こるかというと、アクセスの偏りが発生します。

ELB を立てると、ご存じの通り ``elbname-1234567890.ap-northeast-1.elb.amazonaws.com`` といったホスト名が振られます。その中に、ap-northeast-1a のインスタンスを1台、ap-northeast-1c のインスタンスを5台ぶら下げたとします。すると、1a のインスタンスには 1c の5倍のアクセスが集中します。

なぜかというと、``elbname-1234567890.ap-northeast-1.elb.amazonaws.com`` にアクセスした時、1a に行く確率と 1c に行く確率が同じだからです。elb のホスト名を解決する際に、DNS ラウンドロビンで、1a のロードバランサか、1c のロードバランサかのどちらかの IP 等確率で返ってきます。どちらの AZ に何台のインスタンスがあるかに関わらず、です。なので、50% の確率でインスタンスが1台しかない 1a に、50% の確率でインスタンスが5台ある 1c にアクセスが割り振られ、結果として 1a のインスタンスには5倍のアクセスが集中することになります。

##  これから

しかし、11月の神アップデートにて、このような事態に悩まされることは無くなりました。Cross-Zone Load Balancing のリリースです。

ホスト名解決の際に、どちらかのロードバランサの IP が等確率で返ってくるところは、これまでと同じです。違うのはその先で、1a のロードバランサの IP が返ってきたとしても、その先の負荷分散の対象が 1a の1台と、1c の5台全てになります。

図にするとこんな感じです（[AWSマイスターシリーズ](http://www.slideshare.net/AmazonWebServicesJapan/20130612-aws-meisterregenerateelbpublic)
のスライドを元に改変）

![CrossZoneLoadBalancing.jpg](https://qiita-image-store.s3.amazonaws.com/0/6870/a8a05c68-92e7-5ed8-aa97-fc3be26da0d4.jpeg)

設定については、AWS CLI を使ってサクッできます。

```
aws elb modify-load-balancer-attributes --load-balancer-name yourelbname --load-balancer-attributes '{"CrossZoneLoadBalancing":{"Enabled":true}}' --region ap-northeast-1
```

手持ちのロードバランサ一括設定するならこんな感じ(region設定は略)。

```bash
for lb in $(aws elb describe-load-balancers --query="LoadBalancerDescriptions[].LoadBalancerName" --output text); do
  echo $lb
  aws elb modify-load-balancer-attributes --load-balancer-name $lb --load-balancer-attributes '{"CrossZoneLoadBalancing":{"Enabled":true}}'
done
```

参考：

- [ELBのCross-Zone Load Balancingを試してみる - okochangのインフラ日誌](http://okochang.hatenablog.jp/entry/2013/11/09/233732)
- [AWS CLI のリファレンス](http://docs.aws.amazon.com/cli/latest/reference/elb/modify-load-balancer-attributes.html)

## デメリット

RDS に対する AZ 間の通信コストなどがかかるといえばかかります。

しかし、Cross-Zone Load Balancing は、そういったデメリットを補って余りある機能だと思うので、なるべく有効にしたほうがいいと思います。

## まとめ

さぁ、今すぐ Cross-Zone Load Balancing を有効にしよう！

新規で ELB を立てる時は、最初から `Enable Cross-Zone Load Balancing` にチェックが入ってるので、そのまま作れば大丈夫です。
Laravel の現状と拡張の話（読み物）

3日目ですよ。前日に引き続き [@localdisk](http://twitter.com/localdisk) が担当させていただきます。

[Laravel](http://laravel.com/) というフレームワークは欧米では人気があるんですが、ここ日本では新しもの好きが使用するという範囲に収まっておりまだまだ普及というにはほど遠いという現状です。

ただ、[@HiroKws](https://twitter.com/Hirokws) さんという強力なサポーターの存在もあって Laravel は PHP フレームワークの中で最も日本語の書籍が多いものの一つとなっています。なんと現時点で5冊。そしてもう1冊出る予定です。詳しい内容は [一日目](http://qiita.com/razokulover/items/dd81420dd257e20191ec) を読んでください。

そういうわけで、フレームワークの(一般への)普及を妨げる一番大きな障壁である「日本語での情報の少なさ」はある程度解消されており、あとは僕らが Web 上に情報を流していけばゆるやかにですが Laravel というフレームワークが広まっていくのではないかと考えています。

もうひとつ、フレームワーク等の技術の普及を加速させていく重要なものとして「強力なユーザーコミュニティ」というのがありますがこの部分はまだ未成熟です(一応 [Facebook](https://www.facebook.com/groups/laravel.jp/) と [Google+](https://plus.google.com/communities/118006056115330646882?hl=ja) にコミュニティがあります)。自分だけでどうにかなる問題でもありませんし(うまいこといけばいいなぁ…)と思う次第。

来年の Advent Calendar は盛況だといいなぁ…。

そんなわけで「日本語に翻訳された書籍」が情報として先行し、Web の情報が書籍のそれに比べてイマイチ少ないという逆転現象が起きているというのが Laravel の日本事情というわけです。で、このままだと中々でてこない情報というものがあります。それが、拡張(Package)です。

Laravel にはその機能を追加するためにパッケージという方法が用意されています。この機能を使用することによって、フレームワークに手をいれることなく機能を追加することができます。パッケージの導入は [Composer](http://getcomposer.org/) に委ねておりユーザーは作成したパッケージを [Github](http://github.com) や [Bitbucket](http://bitbucket.org) にホスティングし [Packagist](https://packagist.org/) に登録することによって、ユーザーがより手軽に利用できるよう配慮しています。いまいちピンとこない人は [Rubygems](http://rubygems.org/) を思い浮かべてください。それで大体あってます。

で、なんでパッケージの情報が書籍ではでてこないのかというと、パッケージのほとんどが個人で開発されており、その寿命は長いとは言えません。そのため、どうしても書籍で紹介するのがためらわれる分野なんですね。フレームワークのそれと比べて賞味期限(?)がすごく短いので陳腐化してしまうのが早く、1年後とかにその書籍のなかで紹介されているパッケージを使おうとしても開発が止まっているということが往々にしてありうるわけです。Ruby on Rails を使用している人のブログを見ると「大変だなぁ」と思うわけですが、他人事ではありません。かくいう僕も OpenPEAR というサイトに幾つか自作のライブラリを登録していますが、まったくメンテナンスしておりません。すいません。

Laravel のパッケージは色んな方がたくさん作っていましてそれを効率よく探すために Laravel のパッケージをまとめているサイトがあります。それが [Laravel Packages Registry](http://registry.autopergamene.eu/) です。

この Laravel Package Registry は非常に便利で、拡張ごとに tag が付けられておりその拡張の役割が一目でわかるようになっています。そして Trust と Popularity という項目で信頼性や人気がわかる仕組みになっています。Trust はテストの有無、テストが fail してない、コミットが最近あったという項目で数値が増減します。Popularity はダウンロード数、スターの数等で数値を増減させているようです。この仕組みはとても気に入っています。サイトが軽くなればもっと良いのですが。

で、本日はその中から [Ardent](http://registry.autopergamene.eu/package/laravelbook-ardent) というパッケージを紹介したいと思います。




…あの、すいません、なんか調子に乗ってたくさん書いたので Ardent 明日でいいですか。あしたも僕なので。すいません。すいません。
"select-word-style bash"の不満を解消する

この記事は [zsh Advent Calendar 2013](http://qiita.com/advent-calendar/2013/zsh)の 3日目の記事です.


"select-word-style bash"は単語移動や単語削除で `/`を区切りとする
設定です. ディレクトリパスのあるディレクトリを消そうとしたら
全部消えてしまった、みたいな問題を解消してくれます.

それでだいたいいいんですが, 不満がありました. 最近までずっと
不満を抱えながら利用していたのですが, 最近解消できたので,
それについて示します.


## 不満
前の空白まで移動したりとか前の空白まで削除したいときにそれができない
ときです. 特に長いディレクトリパスを扱うときは何度も消したり移動したりで
面倒でした.


## 解消方法
それらの目的を実現するコマンドを利用するだけです.

```zsh
bindkey '^[^B' vi-backward-blank-word
bindkey '^[^F' vi-forward-blank-word
bindkey '^[^U' backward-delete-word
bindkey '^[^K' delete-word
```

`vi-backward-black-word`は前の空白まで移動, `vi-forward-blank-word`は次の空白まで
移動, `backward-delete-word`は元々の手前の word(`/`を含む)を削除するコマンド,
`delete-word`は次の word(`/`を含む)を削除するコマンドです. これらと "select-word-style bash"の
コマンドを組み合わせでだいたいいい感じにできるようになりました.

ちなみに `^[^somekey`というのは `C-M-somekey`のバインドを意味します.
Emacsスタイルの場合それらのキーは余りまくっているので, ぜひ活用したい
ところですよね.


##おわりに
"select-word-style bash""の不満を解消する方法について示しました.
もっといい方法がある等ありましたら、ぜひ教えてください.


## 参考
[コマンドラインの単語区切りを設定する](http://d.hatena.ne.jp/sugyan/20100712/1278869962)
Delphi の紹介 (最初から) 

# はじめに

最近 Windows の最新版が出ましたが [^3]、".1" って何だよその小数は。しかも ".1" と言いながら、結構アチコチ変わってるのよね。まぁ、確かに前バージョンよりは使い易くなったとは思うのですが、次の Windows が素晴らしいデキだという噂も流れていますね。

次の Windows をあれこれ詮索しても仕方がないので、現行の Windows に Delphi をインストールしてご紹介したいと思います。

# Delphi の紹介

ハイ、コレキタ！ 最新の Windows。流行の**フラットデザイン**ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9a7b9d12-46c2-6430-a0b9-1338a2813f89.png)

**グラフィックアクセラレータ**があると 1024×768 の高解像度で作業できます…いやー広いな。え？PC-98 の 640×400？**アレはウインドウじゃなくてドア**ですよ、ドア。そういや CRT は**トリニトロン**と**ダイアモンドトロン**どっちがキレイなの？**ダンパー線**？僕は気にならないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c772400a-7d2a-c537-f093-cfd9d1edc4c3.png)

DOS/V 機なら **VL バス**用のグラフィックアクセラレータがいいんじゃないですかね？**ISA バス**より高速ですし。**サウンドブラスター**は付けてないですね、会社であまり音は鳴らしませんし、あんまりカード増設すると **IRQ がコンフリクト**しちゃいますからね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/6279335d-e64c-2b0e-a0f0-8b4cd957ddfe.png)

**チューチューマウス** ですか？マウスカーソルを見失う事があるので、僕は入れてませんね。HDD の容量はどうかな？こないだ **ICM** の外付け **SCSI HDD** 付けたから大丈夫だろう。

そして…ハイ、コレキタ！ Delphi。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/dd6f2d67-1448-45e3-be22-478e152f2ef4.png)

名前からは想像しにくいとは思いますが、言語は Pascal の派生。Turbo Pascal を進化させたようなものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/1204d20e-3723-db28-ae20-978ef899ba88.png)

**[VB]**

 - 勝手にコードを整形すんなや。
 - スクリーンエディタなんだから自由に改行させろや。なんだよそのアンダーバーは？
 - 要は N88-BASIC コンパイラみたいなもんやん？

**[MS-C]**

 - 何行書けばウィンドウ出せるん？

**[Visual C++]**

 - 文字列連結くらい直感的に書けないもんなん？
 - フォームはやっぱりリソースエディタで書くん？

とまぁ、Microsoft の開発環境は極端というかなんというか…。**「もうちょっとバランスいい開発環境はないものかね？」**という要求に応えてくれるのが Delphi です。

**[フォーム]**

 - フォームエディタでペタペタ。VB みたいにできるよ。
 - イベントハンドラも VB みたいに書けるよ。

**[コード]**

 - 自由に改行できるよ。
 - 文字列は + で連結できるよ。
 - API も自由に使えるよ。

**[コンパイラ＆IDE]**

 - コンパイラは速いよ。
 - エディタは矩形選択できるよ。
 - 変な整形もしないよ。

え？**日経バイト**で「Delphi はダメだ」「将来に不安がある」って書かれてたって？どれどれ…あ、ホントだ。しかもこれって **Delphi 発売前に書かれてる**じゃん [^1]。

ま、それはともかくとして、ヒトの話を聞いて全部知ったつもりにならずに、自分で一度試してみるといいんじゃないかな？今なら雑誌とかに **EEP (早期体験プログラム=体験版)** の CD-ROM が付属してるみたいだし [^2]。ちゃんと使ってもいないのに文句を言うのはアホのする事だよ？

ちなみに Delphi のインストールはこんな感じね。**メーターがインストールの進捗になってる**のは面白いね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/76ae9979-6276-fe8d-d1be-7db6d814a0cf.png)

さてさて、**テレホタイム**になったので、**Nifty-Serve** の **FDELPHI** でも巡回しますか…。

```
…とまぁ、1995 年に脳内タイムトリップして書いてみました。
「Delphi を最初から紹介する」 って始めに断っておきましたしね (^^;A

あれから 18 年経ちますが、Delphi は「あの時のまま」とも言えますし、
「全くの別物」とも言えます。昔 Delphi 触っていて現状を知らない方は、
ぜひ製品情報ページを読んでみてください。
```

**See also:**

 - [Delphi の製品概要 (Embarcadero)](http://www.embarcadero.com/jp/products/delphi)
 - [Delphi の製品情報 (DEKO のアヤしいお部屋)](https://ht-deko.com/Delphi/index.html)
 - [説明するのも面倒臭い事 (Delphi Forum)](https://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=904)

# おわりに

この記事だけ Qiita 外の記事だったので転載しました。

 - [Delphi の紹介 (最初から)](https://ht-deko.minim.com/delphiforum/?vasthtmlaction=viewtopic&t=1312.0#postid-1907)

[^1]: 実話です。
[^2]: 『C MAGAZINE』とかに付いていました。
[^3]: この記事を書いたのは Windows 8.1 がリリースされた頃。
Kwikを買いました。

Adobe PhotoshopのPluginであるKwikでは、デザイナーさんがプログラミングコードを一行も書くことなく、インタラクティブな絵本アプリを作ることができ、CoronaSDKのコードとして自動的に書き出してくれます。

そんなPhotoshopがブラックフライデーセール？で月額１０００円、Kwikがブラックフライデー ＋ サイバーマンデーということで４０％オフ！
Photoshopを持っていないがためにKwikを試すことが出来なかったということもあり、今回両方を買ってみました！！

ということで、コードを一行も書かないアプリ開発というのも始めてみようと思います。

※こっちのネタの方が勉強会に人が集まるような気が。。。w
DustMiteで、バグ再現最小コードを作る

D言語 Advent Calendar 2013の二日目の記事です。DustMiteに関する日本語のドキュメントが皆無だったので、DustMiteについて書きます。あと、DustMiteと検索する時は注意してください。

# バグ報告をしよう！！
D言語のコアな機能を酷使していると、たまにdmdのバグを踏むことがあります。そんな時は、ぜひバグ報告をしましょう！！

# でも、バグを再現する最小コード作るの面倒くさい
わかる。しかし、

```bash:shell
$ dmd bug.d
dmd: glue.c:1281: virtual unsigned int Type::totym(): Assertion `0' failed.
```

のように、特定のメッセージの出力とともにdmdが落ちるというバグの場合、DustMiteを使うと、それなりに簡単にバグ再現最小コードが作れます！！

[https://github.com/CyberShadow/DustMite](https://github.com/CyberShadow/DustMite)

# DustMiteってなんぞ？
DustMiteは、D言語用のコードミニマイザです。こちらが指定したテスターを使い、テストをpassする最小のコードを総当りで探してくれるツールです。たとえば、

```d:hoge.d
module hoge;

import std.stdio;

void main()
{
    int a;
    "hoge".writeln();
}
```

この、hogeと出力するだけのコードを、hogeと出力する部分のみを残して最小化したいとします。hoge.dをsrcディレクトリに入れ、DustMiteを使うと、

```bash:shell
$ cd src
$ rdmd hoge.d > ../out
$ cd ..
$ dustmite src "rdmd hoge.d 2>&1 | diff - ../out >/dev/null"
```

src.reducedディレクトリに、

```d:hoge.d
import std.stdio;

void main()
{
"hoge".writeln;
}
```

のように、最小化されたhoge.dが作成されます。きれいに`int a;`が消え去りました。

# DustMiteを使って、バグ再現性を保ちつつコードを減らす
上のような感じで、バグ再現性を保ちつつコードを減らすことが出来ます。試しに、[Issue 11622](http://d.puremagic.com/issues/show_bug.cgi?id=11622)の再現コードを減らしてみます。

```d:bug11622.d
class A(T)
{
    B!T foo()
    {
        return new B!T;
    }
}

class B(T) : T
{
}

static assert(!__traits(compiles, {
    class C : A!C  { }
}));
```

bug11622.dをsrcディレクトリに放り込み、まずはエラーメッセージを保存しておきます。

```bash:shell
$ cd src
$ rdmd bug11622.d &> ../out
$ cd ..
$ cat out
dmd: glue.c:1281: virtual unsigned int Type::totym(): Assertion `0' failed.
```

DustMiteには、終了ステータスが、正しい出力の時に0、正しくない出力の時に0以外になるコマンドをテスターとして渡します。今回は、diffを使い、予め保存しておいたエラーメッセージと、実行結果を比較するというコマンドを作り、それを渡します。

```bash:shell
$ dustmite src "rdmd bug11622.d 2>&1 | diff - ../out > /dev/null"
```

第一引数には、最小化したいソースコード群が入ったディレクトリを、第二引数にはテスターとなるコマンドの文字列表現を渡します。DustMiteは、カレントディレクトリにテスト用のディレクトリを作り、そこにソースコード群をコピーした後、そのディレクトリにcdしてテストを実行するので、bug11622.dやoutのパスには気をつけてください。減らす作業が終了すると、src.reducedディレクトリ内に

```d:bug11622.d
class A(T)
{
B!T foo()
{
return B!T;
}
}

class B(T) : T
{
}

static assert(!__traits(compiles, {
class C : A!C  { }
}));
```

減らされたbug11622.dが生成されます。どうやら、returnとnewを取り除いても同様のエラーメッセージとなるようです。

# まとめ
上のような感じで、DustMiteを使うことで、バグ再現性を維持しつつコードの量をある程度減らすことが出来ます。と言っても完璧ではないので、DustMiteが減らしたコードを人間が減らし、またDustMiteに掛ける、と言った感じで補助的にDustMiteを使うと、とてもバグ再現最小コードの作成が楽になると思います。

運悪くdmdのバグを踏み抜いてしまった時、是非DustMiteを試してみてください。