OmniAICreator/Qiita-1.07M huggingface dataset:
マージソート変形版オーダー考察


マージソートがO(log(N))のアルゴリズムであることはよく知られているが、これは配列を再帰的に二分してマージすることでこのオーダーは得られる。
今回はこの「1つの配列のソート」ではなく「n個の配列のソート」を考えたい。

## 問題

配列`V[1]`…`V[n]` (それぞれ長さは`L[1]`…`L[n]`)が与えられているとする。この時これらをマージする際に必要なコストを求めよ。ただし、

* 任意の値の比較に要するコストは`c` (定数時間)とみなせる

以下では最悪計算量を考えていくことにする。

## 簡単化した問題を解く

まずは2つで考えることにする。配列 N, M があり、これらをマージする。 N, M はソート済みとする。任意のステップは次のように場合分けされる。以下 n, m はそれぞれ N, M の先頭要素とする。

* S(N) = S(M) = 0 の場合終了
* S(N) = 0 の場合 M からひとつ取り (N, M-1) に対して再帰
* S(M) = 0 の場合 N からひとつ取り (N-1, M) に対して再帰
* head N < head M の場合 N から一つ取り (N-1, M) に対して再帰
* head N >= head M の場合 M から一つ取り (N, M-1) に対して再帰

これから、

* N, M 何れかの大きさが 0 になると比較は起きない
* 全体のサイズは各ステップで1減少する

ことが言える。N, Mをすべてなくすためのステップ数はN + Mで与えられるので、最悪計算量は

    O(N+M)

で与えられる。これで見る限りO(N)だし問題はなさそうだ。

## 元の問題をとく

同様に解く。最悪でも(L[1] + L[2] + … + L[n])だけ比較を行えば問題はない。今回比較にかかるコストはn個の要素中から最小値を求める問題なのでO(n)で求まることから計算量は

    O(n(L[1] + L[2] + … + L[n]))

と求まる。Σ L[i]は全データ数にほかならないのでいいとして、nの係数はログ数が多くなるといけないことになる。最悪各レコードが別のファイルに書かれてあればO(N^2)。うやー。

## 対処法(誤)
なにが間違っていたかというと、V[1]…V[n]中の最小の要素を毎回O(n)で求めるのが無駄すぎるということ。毎回のステップでたかだか1つしか要素が変化しないわけで毎回最小の要素を求めるのはコストが大きすぎる。それを適切にキャッシュするためには次のように階層的なキャッシュを用意する必要がある。

```
             [0]
             / \
            /   \
           /     \
         [1]     [2]
         ..       ..
        /           \
  [2^(k-1)-1]     [2^k-2]
      / \           / \
     /   \        ..   \
    /     \             \
[2^k-1]  [2^k]      [2^(k+1)-2]
  / \     / \           / \
 /   \   /   \         /   \
[1] [2] [3] [4]  ..  [n-1] [n]
```

そうしておけばどの要素が更新されても、更新によるキャッシュの更新はlog(n)個にしか波及しない(以下略)

## 対処法(改)
上の二分木を見てなにか気づかないだろうか？――そう, **ヒープ木**そのものですね、ヒープ木で実装しようとしたくらいですからね。ってことは、標準ライブラリでサポートされている優先度キューを使うほうが楽です。

ただ、

## 正しいN個ソースのマージソートまとめ

1. N個のソースをpriority_queueに突っ込む
2. 以下をpriority_queueがなくなるまで続ける
    1. priority_queueの最小要素を拾ってくる
    2. 空ならskipして次へ
    3. 拾った要素を結果へ突っ込む
    4. 拾ったソースをpriority_queueに突っ込む
Markdown Modeについて

# Markdownとは #

Markdownは、John Gruberによって設計された、読み書きの実用性を供えた新な記述方法である。
Markdownの設計思想、文法は以下のURLで参照することができる。

[Markdown: syntax](http://daringfireball.net/projects/markdown/syntax)

# EmacsでMarkdown Modeを有効にするには #

## Markdown Modeのインストール ##

UbuntuのEmacsのMarkdown Modeは、emacs-goodies-elパッケージとして提供されている。
Ubuntuの作法に倣って、aptコマンドでイントールを行なう。

	$ sudo apt-get install emacs-goodies-el

## Markdown Modeの有効化 ##

.emacsに以下のように記述することで、、拡張子に".md"とMarkdown Modeとを関連付けをする。
そして、.emacsの再読み込みを行なった後で、拡張子".md"のファイルを開けば、自動的にMarkdown Modeが有効な状態となる。

	;; Set up for markdown
	(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))

## Markdown Modeのキーバインディング ##

Markdown Modeにある状態で、C-c C-hをタイプすれば、Markmodeのキーバインディングの一覧を得ることできる。
この一覧は、Emacsの**descrivbe-mode(C-h m)**で参照するよりも遥かに見やすい。

キーバインディングは、機能をベースにしたプレフィクスによってグループ化さている。<br />
以下に代表例を示す。

<table>
	<tr><th>プレフィクス</th><th>説明</th></tr>
	<tr><td>C-c C-a</td><td>リンクの挿入。<br/>C-aは、HTMLの&lt;a&gt;のニーモニック。</td></tr>
	<tr><td>C-c C-t</td><td>タイトルの挿入。<br/>C-tは、titlteのニーモニック。</td></tr>
	<tr><td>M-{, M-}</td><td>パラグラフの移動。<br/>移動、シフト関連のキーバインディングは、一対の区切り文字に関連付けされる傾向にある。</td></tr>
	<tr><td>C-c &lt;, C-c &gt;</td><td>インデントの挿入。</td></tr>
</table>
ngx_add_timer を使う

nginx起動プロセス内で何か定期的に処理を実行したいときなどに使用
プロセス起動時にタイマー起動するサンプル(色々と端折っている)
ngx_xxx_handlerを定期的に実行する

```c
...

ngx_module_t
ngx_xxx_module = {
  NGX_MODULE_V1,
  &ngx_xxx_module_ctx,
  ngx_xxx_module_commands,
  NGX_HTTP_MODULE,
  NULL,
  NULL,
  ngx_xxx_init_process,
  NULL,
  NULL,
  NULL,
  NULL,
  NGX_MODULE_V1_PADDING
};

//プロセス起動時にタイマータスクをキックしておく
static ngx_int_t
ngx_xxx_init_process(ngx_cycle_t *cycle)
{
  // イベント作成
  ngx_event_t *ev = ngx_pcalloc(cycle->pool, sizeof(ngx_event_t));
  ev->handler = ngx_xxx_handler;
  ev->log = cycle->log;
  ev->timer_set = 0;
  ev->delayed = 1;
  ev->data = "何かデータを入れるかNULLを入れる";

  // 3秒後にイベントを呼び出す
  ngx_add_timer(ev, (ngx_msec_t)3000);

  return NGX_OK;
}

static void
ngx_xxx_handler(ngx_event_t *event)
{
  // 3秒後にイベントを呼び出す
  ngx_add_timer(event, (ngx_msec_t)3000);

  //何か処理をする
  ...
}

...
```
OSXにSoXをインストールする


## SoX - Sound eXchange
http://sox.sourceforge.net/

オーディオの変換ならなんでもやる賢いやつ。ピッチそのままで倍速変換等も可能

## インストール
```
brew install lame
brew install sox
```

## 使い方
mp3をピッチそのままで1.5倍速に変換する例

```
sox src.mp3 dst.mp3 tempo 1.5
```

## 参考
http://qiita.com/cuzic/items/86f012bba8c17cc98aea
http://superuser.com/questions/246918/why-isnt-sox-able-to-convert-to-mp3
一分でMacのログインシェルをzshにする

[あそこ](http://mollifier.hatenablog.com/entry/2013/02/22/025415)とか[ここ](http://qiita.com/harapeko_wktk/items/47aee77e6e7f7800fa03)とかにMacのログインシェルをzshに変更する方法が書いてありますがSystemのzsh(+その他シェル)でよければGUIで変えられることを知っている人が意外と少なのかもしれません。 (chshを使った方法やhomebrewのバージョン導入はいくつもヒットしますね)

てなわけでn番煎じかもしれませんが怖じけずに書きます。

1. システム環境設定を開く
![screencapture 2014-12-04 2.20.40.png](https://qiita-image-store.s3.amazonaws.com/0/17249/bab415fa-f92d-bdda-5d02-c711c72e05c4.png)

2. ユーザとグループを選ぶ
![screencapture 2014-12-04 2.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/17249/ae434f91-a376-6670-ebf9-80861680159e.png)

3. 左下の鍵をクリック
![screencapture 2014-12-04 2.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/17249/0438969b-1c2e-cb9e-dae6-e720749b1ddc.png)

4. パスワードを入力する
![screencapture 2014-12-04 2.21.45.png](https://qiita-image-store.s3.amazonaws.com/0/17249/d70c564f-e3ba-a676-d326-5bd06d614c34.png)

5. 自分のアカウントを右クリック→詳細オプション
![screencapture 2014-12-04 2.21.45.png](https://qiita-image-store.s3.amazonaws.com/0/17249/302ade70-fcd3-3de3-1178-3a8621205e77.png)

6. ログインシェルで"/bin/zsh"を選択
![screencapture 2014-12-04 2.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/17249/4f6e5b4b-8236-70fa-7580-66f85422dcca.png)

7. OKをクリック

8. 最後に鍵をかけて終わり

ね、簡単でしょう？
3分で試す h2o

# h2o の詳しいことや、その内部構造やら

多分他の日の誰かが書いてくれると思いますので、私はユーザ目線でまったり触ってみる系のエントリを書きます。

# h2o を一般的なリバースプロキシ、静的ファイル配信サーバとして使いたい

これをお読みの方の多くは Nginx や Apache を使っているかなと思います。
h2o を使ってみようかなと考えるとき、まず考える用途はこれを置き換えることでしょう。
よくあるユースケースとして “静的ファイルを h2o でホストし、アプリケーションをバックエンドの app サーバに投げる” という設定をやってみます。

## h2o をすぐ試したい

h2o の性能を余す所なく体験するには、オーバーヘッドのない環境でビルドして動かすのが一番ですが、まずは運用に乗るかどうか設定や取り回しを検証するのをやりたいと思うのは当然の所かと思います。
そんなわけで、 h2o をすぐお使いいただける Docker image を用意しました。
Docker をお使いの方は下記コマンドですぐに h2o を起動させることができます。

```
$ docker run -d -p 8080:8080 myfinder/docker-h2o /path/to/h2o.conf
```

## h2o の config 例

```
listen: 8080
hosts:
  default:
    paths:
      /static:
        file.dir: /path/to/docroot
      /:
        proxy.reverse.url: http://127.0.0.1:5000/
    access-log: /dev/stdout

```

# バックエンドのアプリケーションを用意する

今回は動作を見るだけなので、下記のようなワンライナーで良いでしょう。

```
$ plackup -e "sub { [ 200, ['Content-Type' => 'text/plain'], [ ‘Hello h2o World' ], ]; }"
```

# アクセスしてみる

## バックエンド

![スクリーンショット 2014-12-04 2.16.14.png](https://qiita-image-store.s3.amazonaws.com/0/6835/7a065598-e38a-44c4-4abf-e3fa342fd9f1.png)

## 静的ファイル

![スクリーンショット 2014-12-04 2.16.24.png](https://qiita-image-store.s3.amazonaws.com/0/6835/896da401-8578-e48b-f459-a820ac38f9cb.png)


* 設定通り / はバックエンドに、 /static は静的ファイルにアクセスできましたね :)

# まとめ

本エントリでは h2o をリバースプロキシ&静的ファイルホスティングサーバとして使うための基本的な設定例を示しました。
一般的なリバースプロキシとしての利用ならば、それほど苦労なく使えるので試験できる環境がある方はこういったやり方で試していく事ができます。
Vagrant + VirtualBoxでLAMP環境構築(Windows版)

##経緯

Windows8.1上で、Vagrant + VirtualBoxで仮想環境を構築した。
LAMP環境を作っていく。

##環境構築

### Chef

Chefで環境構築する

#### vagrant-omnibusインストール

Chefが入ってなかった、インストールしてくれるPlugin。
以下、リンクのREADMEにしたがってインストール。

https://github.com/opscode/vagrant-omnibus

```
C:\dev>vagrant plugin install vagrant-omnibus
Installing the 'vagrant-omnibus' plugin. This can take a few minutes...
Installed the plugin 'vagrant-omnibus (1.4.1)'!
```

#### レシピ作成
フォルダを作っておく

```
C:\dev>mkdir cookbooks\httpd\recipes
C:\dev>mkdir cookbooks\mysql\recipes
C:\dev>mkdir cookbooks\php\recipes
C:\dev>mkdir cookbooks\remi\recipes
```

以下を作成

```rb:defaut.rb
yum_package "httpd" do
  action :install
end

service "httpd" do
  action :start
end
```

```rb:defaut.rb
yum_package "mysql-server" do
  action :install
end

service "mysqld" do
  action :start
end
```

```rb:defaut.rb
%w[
  php
  php-pdo
  php-mbstring
  php-mysqlnd
].each do |pkg|
  package "#{pkg}" do
    action :install
    options '--enablerepo=remi-php55'
  end
end
```

```rb:defaut.rb
remote_file "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm" do
  source "http://rpms.famillecollet.com/enterprise/remi-release-6.rpm"
  action :create
end
rpm_package "remi-release-6" do
  source "#{Chef::Config[:file_cache_path]}/remi-release-6.rpm"
  action :install
end
```

#### Vagrantfile編集

```rb:Vagrantfile
config.omnibus.chef_version = :latest
config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = "./site-cookbooks"
  chef.add_recipe "remi"
  chef.add_recipe "httpd"
  chef.add_recipe "mysql"
  chef.add_recipe "php"
end
```

####起動

一度VMを壊す。

```
C:\dev>vagrant destroy
```

再度立ち上げ

```
C:\dev>vagrant up
```

###確認

念のためバージョン確認しておく。

```
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Oct 16 2014 14:48:21

$ mysql -V
mysql  Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1

$ php -v
PHP 5.5.19 (cli) (built: Nov 16 2014 09:53:48)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
```
Scalastyle の導入

1ヶ月ほどまえからギョーム外で Scala のコードベースに触れ始めまして、まず何かできることが無いかと探してコーディングスタイルをととのえることに着手することにしました。というのも、普段 Ruby で仕事をしており、RuboCop というコーディングスタイルのチェックをしてくれるツールが共同作業をする上でとても役に立っていたからです。

というわけで、Scala のコーディングスタイルチェッカーである Scalastyle の導入手順について書きたいと思います。

# コーディングスタイルはツールに任せよう

コーディングスタイルを統一した方がよいのは説明不要かと思います。わざわざツールを利用するのは、次のような理由があるからだと思っています(雑に挙げます)。

 * コーディングスタイルを文書にしておいても腐る
 * 新規参加メンバーにコーディングスタイルの指摘をするコストが高い
 * 人がコーディングスタイルのチェックをすると漏れがある
 * 人がコーディングスタイルのチェックをするとお金がかかる

# Scalastyle の導入手順

では Scalastyle の導入手順です。
sbt plugin の scalastyle-sbt-plugin を利用した方法が簡単だと思いますので、以降はこれを使って説明します。
といっても基本的には[公式サイト](http://www.scalastyle.org/sbt.html)に載っているとおりで、

1. `project/plugins.sbt` に数行追加
2. `sbt scalastyleGenerateConfig` を実行して設定ファイルを作成
3. `sbt scalastyle` で実行

で完了です。

しかし、この通りに導入すると、ある程度の規模のプロジェクトでは warning が 1000 以上表示されると思います。無理です。心が折れます。
ですので、上の手順を終えた後は次の手順で実行していくのがよいと思います。

## 1. チェックしないようにする
まず、全てのコーディングスタイルルールのチェックを実行しないようにします。

config ファイル(`scalastyle-config.xml`)内の `check` 要素の `enabled` attribute を全て `false` にすることで、コーディングスタイルのチェックを止めることができます。

 * sed を使って変更する場合はこちら
   * `sed -i -e 's/enabled="true"/enabled="false"/' scalastyle-config.xml`

## 2. ひとつずつ有効にする

ひとつずつコーディングスタイルのルールを有効にしていきます。

 1. config ファイル内の `check` 要素の `enabled` attribute を `true` にすることで、コーディングスタイルを有効にします
  * コーディングスタイルにはパラメータを設定できるものがあります。例えば1行あたりの文字数をいくつまでに制限するか、といったものです。パラメータの詳細は[こちら](http://www.scalastyle.org/rules-0.6.0.html)にありますので、プロジェクトに合わせて設定してください
 2. `sbt scalastyle` を実行します
 3. コーディングスタイルに違反している行があれば訂正します
 4. (バージョン管理ツールを利用しているなら config ファイルと一緒に変更点をコミットします)

これを繰り返すことでプロジェクトに合ったコーディングスタイルを設定ファイルに落とし込めると思います。

## 3. コーディングスタイルに違反した場合にエラーになるようにする 

以上の手順で、コーディングスタイルを定義し、そのスタイルに違反したものを発見できるようになりました。

しかし、定期的に Scalastyle が実行されるようになっていないと意味がありません。Jenkins など CI ツールでチェックしたいところです。

しかし、デフォルトの設定ではコーディングスタイルに違反しても `sbt scalastyle` の exit status は 0 になっています。これでは CI するとき不便です。

これを解決するためには2つの方法があります。

1つ目は、`scalastyle` の実行時に `w` オプションを渡す方法です。アンドキュメンテッドのようですが、[ここらへん](https://github.com/scalastyle/scalastyle-sbt-plugin/blob/c500b08d4baf080d9baaf1464950320ee9c351f8/src/main/scala/org/scalastyle/sbt/Plugin.scala#L160-170)に書いてあるように、`sbt "scalastyle w"` と実行することで、コーディングスタイルに違反があった場合に exit status が 1 になります。

2つ目は、すこし強引ですが warning となっているルールを error に変更する方法です。
つまり config ファイル内の `check` 要素の `level` attribute を全て `error` にしてしまう方法です。これにより、`sbt scalastyle` を実行して、コーディングスタイルに違反があった場合に exit status が 1 になります。

 * sed を使って変更する場合はこちら
   * `sed -i -e 's/level="warning"/level="error"/' scalastyle-config.xml`

どちらかの方法を利用して CI を回してチェックし続けましょう :cyclone: 


# まとめ :confetti_ball:

ざっくりですが、心の折れない Scalastyle の導入手順を紹介しました。

# リンク :link: 

 * 公式サイト: http://www.scalastyle.org/
 * GitHub: https://github.com/scalastyle
お題「見ているサイトのソースを別タブで表示する」をできるだけ短いJSスクリプトで書く

```js
javascript:
(function() {
  var key = "$$$KEY$$$";
  var html = document.documentElement.outerHTML;
  sessionStorage.setItem(key, html);
  var source = "javascript:" +
    "(function() {" +
    "  var html = sessionStorage.getItem('" + key + "');" +
    "  var node = document.createTextNode(html);" +
    "  document.body.appendChild(node);" +
    "})();";
  open(source);
})();
```

# 改行とスペース イラネ
```js
javascript:(function(){var key="$$$KEY$$$";var html=document.documentElement.outerHTML;sessionStorage.setItem(key,html);var source="javascript:(function(){var html=sessionStorage.getItem('"+key+"');var node=document.createTextNode(html);document.body.appendChild(node);})();";open(source);})();
```

# var イラネ
```js
javascript:(function(){key="$$$KEY$$$";html=document.documentElement.outerHTML;sessionStorage.setItem(key,html);source="javascript:(function(){html=sessionStorage.getItem('"+key+"');node=document.createTextNode(html);document.body.appendChild(node);})();";open(source);})();
```

# 変数名は1文字
```js
javascript:(function(){k="$$$KEY$$$";h=document.documentElement.outerHTML;sessionStorage.setItem(k,h);s="javascript:(function(){h=sessionStorage.getItem('"+k+"');n=document.createTextNode(h);document.body.appendChild(n);})();";open(s);})();
```

# 変数イラネ
```js
javascript:(function(){sessionStorage.setItem('$$$KEY$$$',document.documentElement.outerHTML);open("javascript:(function(){document.body.appendChild(document.createTextNode(sessionStorage.getItem('$$$KEY$$$')));})();");})();
```

# セミコロン イラネ
```js
javascript:(function(){sessionStorage.setItem('$$$KEY$$$',document.documentElement.outerHTML);open("javascript:(function(){document.body.appendChild(document.createTextNode(sessionStorage.getItem('$$$KEY$$$')))})()")})()
```

# function() イラネ
```js
javascript:sessionStorage.setItem('$$$KEY$$$',document.documentElement.outerHTML);open("javascript:document.body.appendChild(document.createTextNode(sessionStorage.getItem('$$$KEY$$$')))")
```

# sessionStorage に入れる key は 1 文字
```js
javascript:sessionStorage.setItem('_',document.documentElement.outerHTML);open("javascript:document.body.appendChild(document.createTextNode(sessionStorage.getItem('_')))")
```

# key イラネ
```js
javascript:sessionStorage.setItem('',document.documentElement.outerHTML);open("javascript:document.body.appendChild(document.createTextNode(sessionStorage.getItem('')))")
```

170 文字。


# 【追記】sessionStorage イラネ
open って開いた window のオブジェクトを返すのな。

```js
javascript:open("javascript:setTimeout('document.body.appendChild(document.createTextNode(s))')").s=document.documentElement.outerHTML
```

134文字。
２台のサーバのホームページ領域をリアルタイム同期

WordPressを冗長化するために
CentOS6.6にrsync + lsyncでApacheのDOCUMENT ROOTを冗長化した時の設定

###Slave側
rsyncはすでにインストールされていたのだけど
CentOSではxinetd経由で起動するのでxinetd をインストール

```
# yum -y install xinetd
```

rsyncd.confを設定

```
# vi /etc/rsyncd.conf
--------------------------
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

#任意の名前、Maseter側で使う
[wordpress]
#同期したいフォルダ
path = /var/www/html
#Master側のIP
hosts allow = 192.168.10.1
hosts deny = *
list = true
uid = root
gid = root
read only = false
--------------------------
```

xinetdスタート

```
# /etc/rc.d/init.d/xinetd start
```
自動起動にセット

```
# chkconfig xinetd on
```

###Master側
lsyncをインストールするのにyumリポジトリにrpmforgeを追加

```
# rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
```
インストール

```
# yum install rsync lsyncd --enablerepo=rpmforge
```
lsyncd.conf設定

```
# vi /etc/lsyncd.conf
--------------------------
settings = {
        logfile    = "/var/log/lsyncd/lsyncd.log",
        statusFile = "/tmp/lsyncd.stat",
        statusInterval = 1,
}

sync{
        default.rsync,
        source = "/var/www/html/",
        target = "192.168.10.2::wordpress",
        excludeFrom = "/etc/rsync_exclude.lst",
}
--------------------------
```
target = "192.168.10.2::homepage" 
Slave側のIPと[ ] に書いた名称

excludeFromは除外したいファイルを設定する。

除外リストrsync_exclude.lstを作成

```
# vi /etc/rsync_exclude.lst
--------------------------
/wordpress/wp-config.php
--------------------------
```
相対パスで、ファイル名またはフォルダ名

lsyncdスタート

```
# /etc/rc.d/init.d/lsyncd start
```

自動起動設定

```
# chkconfig lsyncd on
```

tailコマンドでログを見ながらFTPでMaster側にファイルをアップロードしてみましょう。

初回起動時はSlave側に一気にファイルを送る場合があるのでサーバ負荷に注意しましょう。先にSlave側もFTPでファイルをアップロードしておいたほうがいいかも。

この設定のままだとSlave側はrootユーザーでファイルがアップロードされてしまうのでrsyncd.confのuid/gidをapacheユーザにするほうがいいかも。
ただしapacheユーザーでSlave側にSSH接続できないとダメ？（未確認）
Lightning Componentにおけるコンテンツセキュリティポリシー

[Salesforce1 Lightning Advent Calendar 2014](http://qiita.com/advent-calendar/2014/lightning) 12月4日の投稿です。

Lightning Componentでは、コンテンツセキュリティポリシー (CSP) を使用して、ページに読み込むコンテンツのソースを制御しています。
この制御によって、StaticResourceにあるJavaScriptしかロードできなくなっています。VisualforceページではJavaScriptをCDNから読み込むことができましたが、Lightning Componentでは読み込めなくなっています。

## JavaScriptファイル

### JavaScriptをStaticResourceに登録した場合
```html:SampleApp.app
<aura:application>
	<script src="/resource/jquery" type="text/javascript"></script> 
	<script type="text/javascript">
	$(document).ready(function(){
		console.log("jQuery loaded.");
	});
	</script>
</aura:application>
```

### ZipファイルをStaticResourceに登録した場合
```html:SampleApp.app
<aura:application>
	<script src="/resource/zip/jquery.js" type="text/javascript"></script> 
	<script type="text/javascript">
	$(document).ready(function(){
		console.log("jQuery loaded.");
	});
	</script>
</aura:application>
```

### CDNなどの外部サイトを指定するとエラーになる
```HTML:SampleApp.app
<aura:application>
	<script src="http://code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script> 
	<script type="text/javascript">
	$(document).ready(function(){
		console.log("jQuery loaded.");
	});
	</script>
</aura:application>
```
## CSS、画像など
HTTPS URL を使用する必要があります。 

```HTML:SampleApp.app
<aura:application>
	￼<link rel="stylesheet" type="text/css"
href="https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"/>
</aura:application>
```

とLightningコンポーネント開発者ガイドに書いてありますが、HTTPS接続でもChromeで開くと下記のようにCSPの制限にひっかかってしまうようです。

```
Refused to load the stylesheet 'https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css' because it violates the following Content Security Policy directive: "style-src 'self' chrome-extension: 'unsafe-inline'".
```

う〜ん。。。
Laravelの環境構築に当たって詰んだ点

#環境構築して詰んだ点を雑に記録。

新しいフレームワークにも関わらず日本語ドキュメントが豊富なので書く必要ないと思ったが、少し詰んだのでそこだけに記録。

##詰んだ点1.
configure: error: Cannot find OpenSSL's <evp.h>
homebrewでphp55をインストール時に発生

###対処
X-codeのコマンドラインツールをいれた。

が実際MAMP使うのであればやんなくてよかったかも。


##詰んだ点2.
[Composer\Repository\RepositorySecurityException]
パッケージの署名がマッチしないからセキュリティ上危険があるとエラー
エラーメッセージスクショとりわすれたけどこれと同じ。
http://stackoverflow.com/questions/18977581/composer-update-man-in-the-middle-attack-error

###対処
先のStackOverflowのやつは試してもだめだった。
が、composerのアップデートしてプロキシの自動設定を外して何回か試したらできた。

```
$ composer self-update
```

解決の原因がまだ特定できてない。
と思ったらgithubにissueがあった
https://github.com/composer/composer/issues/1431

##詰んだ点3.
Laravel requires the Mcrypt PHP extension.
Mcryptがエラー

```
$ php -m | grep mcrypt

```

で確認。何も出てこない。
Mcrypt拡張が適用されてなかった。

###対処
ここと同じ
http://stackoverflow.com/questions/16830405/laravel-requires-the-mcrypt-php-extension

MAMP使う場合は

```

export PATH=/Applications/MAMP/bin/php/php5.5.19/bin:$PATH

```
を
~/.bash_profile
に書き込む

その後ターミナル再起動したらできた。
Dartでゲームプログラミングする時に使えるパッケージ

「Dart Advent Calendar 2014」 4日目として私zukkunが担当します。

Dartでゲームを作るときに使えそうなパッケージをまとめてみました。

## game_loop

- [game_loop 0.9.4 | Pub Package Manager](https://pub.dartlang.org/packages/game_loop)

まずは「game_loop」。その名の通りゲームのメインプールを支える機能を提供するパッケージです。

ループ中での入力まわりの機能も提供されています。

パッケージ説明にある機能一覧は以下のようになっています。

- Main loop optimized for games.
- Keyboard input.
- Mouse input.
- Fullscreen management.
- Pointer lock management.
- Timers.

## play_phaser

- [play_phaser 0.12.1 | Pub Package Manager](https://pub.dartlang.org/packages/play_phaser)

続いて「play_phaser」です。

こちらはJavaScript向けの[Phaser](http://phaser.io/)というライブラリのDart移植になっており、主に2Dゲーム向けのゲームエンジンです。

元のPhaser自体がレンダリングエンジンとして[Pixi.js](http://www.pixijs.com/)というライブラリを採用しており、Dartのplay_phaserについても、Pixi.jsの移植として[play_pixi](https://pub.dartlang.org/packages/play_pixi)というパッケージが作られており、play_phaserもレンダリングエンジンとしてplay_pixiが使用されています。

個人的におすすめのパッケージで、ゲーム開発に関わる以下のような様々な機能が提供されています。

- WebGL and Canvas
- Preloader
- Sprites
- Groups
- Particles
- Camera
- Sound
- Device Scaling
- Mobile Browser

こちらのパッケージの導入記事を過去に書きました。

- [Dartでplay_phaserを使ってゲームプログラミング - Qiita](http://qiita.com/zukkun/items/49cf0ad5b517616edc66)

## StageXL

- [StageXL for Dart](http://www.stagexl.org/)
- [stagexl 0.10.2 | Pub Package Manager](https://pub.dartlang.org/packages/stagexl)

次は「StageXL」です。

こちらはFlashライクなAPIを利用できるパッケージです。

ActionScriptでFlash開発をしていた人にとっては、おなじみのAPIを利用することができます。

- BitmapData
- EventDispatcher
- DisplayObject
- Bitmap
- Shape
- SimpleButton
- TextField
- MovieClip
- Stage
- Sprite

触ったことはないですが、個人的には「Flash APIなんて忘れてもっと未来に生きようぜ」な感じなので、あまりおすすめではありません。

## Ranger-Dart

- [wdevore/Ranger-Dart](https://github.com/wdevore/Ranger-Dart)

こちらはまだ[pub.dartlang.org](pub.dartlang.org)に登録されていないパッケージで、私自身もまだ触ったことがないものなんですが、Cocos2d-xの仕組みとAPIをベースにしている、という点で気になっています。

機能一覧は以下のようになっています。

- Scene Graph
- Animation
- Message System
- Pooling
- Sprites and sprite sheets
- Particle System
- HTML5 Canvas
- Design Resolution that is independent of device resolution
- Scene transitions
- Optional Updates-per-second for slower devices

むしろ、Cocos2d-xにDartVMが載ってスクリプトとしてDartが使えるようにならないかなとか夢見てます。

## three.dart

- [three.dart - Dart 3D library](http://threedart.github.io/three.dart/)
- [three 0.2.5+1 | Pub Package Manager](https://pub.dartlang.org/packages/three)

最後は、ゲームエンジンではなく3Dライブラリです。

WebGL向けライブラリとして[Three.js](http://threejs.org/)が有名ですが、それのDart移植になります。

このパッケージで簡単な立方体を表示するまでの記事を過去に書きました。

- [Three.dartで簡単に3Dプログラミングを始める方法 - Qiita](http://qiita.com/zukkun/items/2b0d3219e615a0493ab4)

## 総括

Dartもゲーム向けパッケージが充実してきましたが、まだまだ発展途上という印象もあります。

これから色々使って試して、改善要望を出したり、バグを報告したり、できればPull Requestを出したりと、色々していきたいなと思っています。

明日はTsuguyaさんです。
Jenkinsでアクセス制御を設定してみる



## 概要

管理者ユーザを追加して、管理者ユーザ以外には何もできないようにする。
インストール直後の綺麗な Jenkins を想定。

### バージョン

* CentOS 6.6 (Final)
* Jenkins 1.580.1


## サインアップを可能にする

1. [Jenkinsの管理] > [グローバルセキュリティの設定] を選択する
2. [セキュリティを有効化] をチェック
3. [アクセス制御] > [ユーザ情報] で [Jenkinsのユーザデータベース] をチェック
4. [ユーザにサインアップを許可] をチェック
5. [保存] を選択する


## サインアップする

1. 画面右上の [サインアップ] を選択する
2. 情報を入力して [サインアップ] を選択する


## サインアップしたユーザ以外のアクセスを禁止する

1. [Jenkinsの管理] > [グローバルセキュリティの設定] を選択する
2. [アクセス制御] > [ユーザ情報] > [Jenkinsのユーザデータベース] の [ユーザにサインアップを許可] のチェックを外す
3. [アクセス制御] > [権限管理] で [行列による権限設定] をチェック
4. [追加するユーザー/グループ] に追加したユーザを入力して [追加] を選択する
5. 追加したユーザについて、権限を全てチェックする
6. 匿名ユーザについて、権限のチェックを全て外す
7. [保存] を選択する
変数を使って四則演算をしてみる


こんにちは、[@Solpha](https://twitter.com/solpha)です。2回目の投稿です。

Go言語のお勉強（超初心者）ということで、今回は四則演算をするプログラムなんぞを書いてみたいと思います。

#概要
varで2つの変数を宣言（ここでは固定の整数値）し、2つの値をそれぞれ四則演算（＋、−、×、÷）した結果を表示する。

```var宣言書式
var "変数名" "型"
```


#コード
```go:variable.go
package main

import "fmt"

func main() {
	var x int = 4
	var y int = 2

	fmt.Println("x + y =", x+y)
	fmt.Println("x - y =", x-y)
	fmt.Println("x × y =", x*y)
	fmt.Println("x ÷ y =", x/y)

}
```

ここでは、var宣言でxとyという変数に、それぞれ整数（int）の”4”と”2”を代入することを定義しています。

あとは、定義したx,yを元にPrintln関数で四則演算した結果を1行ずつ表示させています。

```実行結果
$ go run variable.go
x + y = 6
x - y = 2
x × y = 8
x ÷ y = 2
```

いい感じに結果が表示されましたね。

ちなみに、上記のコードで変数を宣言している、

```
var x int = 4
var y int = 2
```

という部分がありますが、ここは以下のように省略して書くことができます。

```
x := 4
y := 2
```

型宣言をしている「int」を省きましたが、Go言語は素敵なことに「型推論」によってxとyがint型であるということを認識してくれます。

細かいことは分かりませんが、私は「xに”4”という数字を入れるから、これは整数（int）だな」とGoが判断するのだろうと解釈しています。

#所感
変数xとyを固定値にしていますが、自分で好きな値を入れられるようにしてたいので、そこを次の課題にしようと思います。

これだけのプログラムでも、ちゃんと動くと嬉しいものですね。

内容について、「間違って覚えてるよー」なんてところがあれば、ご指摘いただけると幸いです。
Mac OS Xに**env管理ツールのanyenvをインストール


# はじめに
開発環境のバージョン管理ツールにrbenvやpyenvなんかがあります。
便利なんですが、**envが増えると`.bash_profile`あたりがごちゃごちゃしたり個別に管理しないといけなかったり、面倒です。

[anyenv](https://github.com/riywo/anyenv)は**envを一括してインストール&管理してこの辺りを解決してくれます。

というわけでMacOSXにanyenvをインストールしてみます。

# anyenvインストール
anyenvの[README.md](https://github.com/riywo/anyenv/blob/master/README.md)通りにインストールします。


```bash
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshenv
$ echo 'eval "$(anyenv init -)"' >> ~/.zshenv
$ exec $SHELL -l
$ anyenv help
Usage: anyenv <command> [<args>]

Some useful anyenv commands are:
   commands            List all available anyenv commands
   local               Show the local application-specific Any version
   global              Show the global Any version
   install             Install a **env
   version             Show the current Any version and its origin
   versions            List all Any versions available to **env

See `anyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/riywo/anyenv#readme
```

# anyenv-updateインストール
たまにruby-buildのバージョンが古くて最新のRubyをインストールできないことがあります。
その辺りをよろしくやってくれる[anyenv-update](https://github.com/znz/anyenv-update)もインストールしておきます。

```bash
$ mkdir ~/.anyenv/plugins
$ git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
```

使うときは、

```bash
$ anyenv update
```

です。

# なんかインストール
なんか適当にインストールしてみます。

## インストールできる**envのリスト
```bash
$ anyenv install -l
Available **envs:
  denv
  goenv
  jenv
  luaenv
  ndenv
  phpenv
  plenv
  pyenv
  rbenv
  scalaenv
```

## pyenvインストール
```bash
$ anyenv install pyenv
/var/folders/cx/93p9j67n1lb9m18x2t3jbnx80000gn/T/pyenv.20141204003951.5152 ~
Cloning https://github.com/yyuu/pyenv.git...
Cloning into 'pyenv'...
remote: Counting objects: 7977, done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 7977 (delta 3), reused 3 (delta 1)
Receiving objects: 100% (7977/7977), 1.42 MiB | 463.00 KiB/s, done.
Resolving deltas: 100% (5856/5856), done.
Checking connectivity... done.
~

Install pyenv succeeded!
Please reload your profile (exec $SHELL -l) or open a new session.
$ exec $SHELL -l
```

## pythonインストール
anyenvでインストールしたpyenvでpythonをインストールしてみます。

```bash
$ pyenv install 3.4.2
$ pyenv global 3.4.2
$ python --version
Python 3.4.2
```

## anyenvで確認
anyenvからも現在使用しているバージョンやバージョン一覧を確認できます。

```bash
$ anyenv version
pyenv: 3.4.2 (set by /Users/nownabe/.anyenv/envs/pyenv/version)
$ anyenv versions
pyenv:
  system
* 3.4.2 (set by /Users/nownabe/.anyenv/envs/pyenv/version)
```

# おわりに
anyenvひとつインストールすればいいので、環境構築がだいぶ楽になりました！
AWS Lambda を CoffeeScript で書いてみた


# きっかけ
とあるアプリをLambdaで書こうとしたんですが、素のJSだと文字列代入とか非常に面倒臭い。
あといちいち funciton(){}; とか書きたくないでござる...
というわけで、CoffeeScriptで書く事にしました。

# HelloWorld for Lambda in CoffeeScript
例えばこれが

```
console.log('Loading event');

exports.handler = function(event, context) {
    console.log('value1 = ' + event.key1);
    console.log('value2 = ' + event.key2);
    console.log('value3 = ' + event.key3);
    context.done(null, 'Hello World');  // SUCCESS with message
};
```

こうなって

```
~/work/lambda$ cat helloworld.coffee
console.log 'Loading event'

exports.handler = (event, context) ->
  console.log "value1 = #{event.key1}"
  console.log "value2 = #{event.key2}"
  console.log "value3 = #{event.key3}"
  context.done null, 'Hello World'  # SUCCESS with message
```

こうじゃ

```
~/work/lambda$ coffee -p helloworld.coffee
(function() {
  console.log('Loading event');

  exports.handler = function(event, context) {
    console.log("value1 = " + event.key1);
    console.log("value2 = " + event.key2);
    console.log("value3 = " + event.key3);
    return context.done(null, 'Hello World');
  };

}).call(this);
```

# 実際にアプリケーションを書いてみよう
作ったアプリは [lambdacast.coffee](https://gist.github.com/j3tm0t0/723e73db8017b3f3bb8b) に置きました。
S3 bucket にメディアファイルを置いたら、自動的にpodcast用のRSSフィードを作成・更新するアプリです。

下記に引用したXML生成の際に、ヒアドキュメントやインラインでの変数展開を使用したかったのが、CoffeeScriptで書いた理由です。

```
        for item in items when item.Key isnt "rss"
          xml+="""
  <item>
    <title>#{item.Key}</title>
    <link>http://#{bucket}.s3.amazonaws.com/#{item.Key}</link>
    <description>#{item.Size} Bytes</description>
    <enclosure url="http://#{bucket}.s3.amazonaws.com/#{item.Key}" type="audio/mpeg"/>
    <pubDate>#{item.LastModified}</pubDate>
  </item>

"""
```

# デモ
lambda scriptをイベントに設定して、mp3やmp4ファイルを置きます。
そうすると、同じbucketにrssファイルが出来るので、それをiTunesでURLを指定して購読します。
![iTunes](http://g.s3w.jp/ab82b353.png "iTunes")

bucketにメディアファイルを追加でアップロードしてみます。
![s3 upload](http://g.s3w.jp/ab82b328.png "s3 upload")

自動的にファイルの追加を検知してlambda functionが実行されます。
![cw logs](http://g.s3w.jp/ab82b00d.png "cw logs")

Podcastを更新すると、
![iTunes](http://g.s3w.jp/ab82b2ff.png "iTunes")
新しく追加したファイルが配信されました。

非常に簡単にpodcastが作れてしまう事に驚きです。

# おわりに
s3を使用したstatic web serverと、JS SDKと、lambdaを組み合わせたら、もっともっと面白いものがお手軽に作れそうですね。

Enjoy!
「Sublime Text 2」のインストールについてのメモ

エディタは普段[サクラエディタ](http://sakura-editor.sourceforge.net/download.html)を使っているのですが、Windows環境のみというのが少々不便です。[vim](http://www.vim.org/)や[emacs](http://www.gnu.org/software/emacs/)でもいいですが、習得に時間がかかってしまいます。何かいいエディタはないかと探したところ「Sublime Text」がよさげなのでインストールすることにしました。Windowsだけではなく**MacやLinuxでも利用できる**ところが良い所ですね。

[こちらの公式サイト](http://www.sublimetext.com/)からダウンロードできます。「Sublime Text 2」と「Sublime Text 3」がありますが、正式なリリース版は「Sublime Text 2」なのでこちらをインストールします。サイト自体はとてもシンプルなのであまり迷わないと思います。ちなみに正式には有償だそうですが、評価版でも特に機能制限はない模様です。だったら「Donate」と書いて欲しいところですが。

* * *
![SublimeText.JPG](https://qiita-image-store.s3.amazonaws.com/0/60328/14abf082-5564-76c3-ff29-2db473b88482.jpeg)
* * *

「Sublime Text」の真髄は豊富なプラグインにあります。プラグインを簡単に適用するために「Package Control」をインストールします。詳細は以下の記事を参考にしてください。

[参考：テキストエディター「Sublime Text」の導入](http://www.buildinsider.net/small/sublimetext/01)

上記の作業を終えたら手始めに以下のプラグインをインストールします。
* ConvertToUTF8
文字コードがUTF-8のみの対応となっているため、他の文字コード(SJIS)が扱えるようにするためのプラグインです。表示時にUTF-8→SJIS、保存時にSJIS→UTF-8といった変換をかけてくれるプラグインです。
* IMESupport
IMEのインライン入力を可能にするプラグイン

様々なプラグインが用意されているので、自分の気に入ったものを都度追加していってください。
なお、メニューの日本語化が可能な「sublimetext_japanize」というパッケージがありますが、完全に日本語化されるわけではないので英語のままのほうがいいと思います。

あとは触っていく内に覚えると思います。特徴的な機能は[公式サイト](http://www.sublimetext.com/)の動画を見ればなんとなく分かります。また以下の記事も参考になります。

[参考：”恋に落ちるエディタ”「Sublime Text」 完全入門ガイド！](http://liginc.co.jp/designer/archives/6774)

以上
マクロと変数

## Hygienicなにそれ美味しいの

マクロ内部と呼び出し側で共通の変数を使うためのメモ。

本来Elixirのマクロは"Hygienic"（衛生的）で、マクロ側で作った変数は呼び出し側の変数に影響を与えない。逆も然り。同じ名前の変数を作っても他方が上書きされることはない、汚染することはない、という意味で衛生的。

```ex
defmacro my_macro do
  quote do
    a = 1
  end
end

a = 2
my_macro()
IO.puts a #=> 2
```

以下、衛生的でないことを書く。

### 読み

そのまま変数与えて読む場合。めっちゃ普通。

```ex
defmacro read(var) do
  quote do
    v = unquote(var)
    IO.inspect v
  end
end

foo = 1
read(foo) #=> 1
```

アトム与えて、対応する変数の中身を読む場合。`Macro.var/2`使う。

```ex
defmacro read(name) when is_atom(name) do
  quote do
    v = unquote(Macro.var name, nil)
    IO.inspect v
  end
end

foo = 2
read(:foo) #=> 2
```

デフォルトでは`hoge`を読むけど、明示されたらそっち読む場合。

```ex
defmacro read(var \\ Macro.var(:hoge, nil)) do
  quote do
    v = unquote(var)
    IO.inspect v
  end
end

hoge = 3
fuga = 4
read()     #=> 3
read(fuga) #=> 4
```

### 書き

引数に変数与えて、中身が書き換わって返ってくるやつ。

```ex
defmacro bind(var, value) do
  quote do
    unquote(var) = unquote(value)
  end
end

bind(foo, 5)
foo #=> 5
```

アトム与えて、対応する変数をつくりたい場合。既存の変数名を与えると上書きされる。

```ex
defmacro bind(name, value) when is_atom(name) do
  quote do
    unquote(Macro.var name, nil) = unquote(value)
  end
end

bind(:bar, 6)
bar #=> 6
```

## 是非

ドキュメントに書いてあろうとも、勝手に変数の中身を上書きするのは決してお行儀が良いとは言えないので、書き換えは行うべきでないと思う。特定の名前の変数があることを前提にそれを読むライブラリは存在していて、例えば[plug_test_helpers](https://github.com/xavier/plug_test_helpers)。Plugのコネクションは変数`conn`に入れるのが慣習になっているので、それを規約としている。

```ex
# plug_test_helpersのREADMEから引用

test "headers" do
  conn = conn(:get, "/image.jpg")
  conn = MyPlug.call(conn, @opts)

  assert_header "content_type"
  assert_header "content_type", "image/jpg"
  assert_header_match "content_type", ~r/\Aimage\/jpe?g\Z/
end
```

`conn`は用意しているけれど、アサーションマクロには渡していないのがわかる。マクロは勝手に`conn`を読んでテストする。これは良く言えばCoCなのだけれど、渡していない変数が使われているということには若干の気持ち悪さがある。個人的には、アサーションは第一引数に`conn`を取り、戻り値として`conn`を返す、というのが良いと思った。そうすれば、パイプで以下のように書ける。

```ex
test "headers" do
  conn(:get, "/image.jpg")
  |> MyPlug.call(@opts)
  |> assert_header("content_type")
  |> assert_header("content_type", "image/jpg")
  |> assert_header_match("content_type", ~r/\Aimage\/jpe?g\Z/)
end
```

やっぱり渡した変数を使ってくれたほうが読みやすいと思う。もちろん読みやすさ以上に優先すべき利点があると判断されるなら、特定の変数の存在を規約とするのも悪ではない。

なんか結局、そのときどきに考えろみたいになってしまった。
zshでもbashと同じようなカーソル移動を行う

zsh のコマンドライン編集機能のキーマップを bash に揃えておくと捗るかもよというお話しです。

# はじめに

多くのシステムにおいてまだ標準となっていない zsh をあえて使う身としては、bash で出来たことが出来ないと歯がゆいものです。

とくにコマンド入力におけるカーソル移動のインターフェースについてそれは強く感じます。

# bashでのカーソル移動

bash でのカーソル移動は GNU readline ライブラリによって提供されていて、emacs ユーザにとってはお馴染みのものです。

|キー  |readlineコマンド名    |内容                                   |
|:-----|:---------------------|:--------------------------------------|
|`C-a` |`beginning-of-line`   |カーソルを行の先頭に移動               |
|`C-e` |`end-of-line`         |カーソルを行の末尾に移動               |
|`C-f` |`forward-char`        |カーソルを1文字分順方向（右）に移動    |
|`C-b` |`backward-char`       |カーソルを1文字分逆方向（左）に移動    |
|`M-f` |`forward-word`        |カーソルを1単語分文字順方向（右）に移動|
|`M-b` |`backward-word`       |カーソルを1単語分文字逆方向（左）に移動|
※`C-a` は `Ctrl` と `a` を同時に押すこと、`M-f` は `ESC`(または `Ctrl-[`) を押したあとに `f` を押すことを意味します

上記は zsh でも `bindkey -e` として emacs キーマップを選択することで使用可能です。

しかし長いコマンドラインを編集している場合には途中にある特定の箇所にカーソルを移動したい事があり vi の f/F に相当する機能が欲しくなります。


# viのf/Fに相当するカーソル移動

bash では次のような readline コマンドが定義されています。

|キー    |readlineコマンド名          |内容                                             |
|:-------|:---------------------------|:------------------------------------------------|
|`C-]`   |`character-search`          |入力文字が次に現れる場所にカーソルを移動(viの`f`)|
|`M-C-]` |`character-search-backward` |入力文字が前に現れる場所にカーソルを移動(viの`F`)|
* [Bash Reference Manual: Miscellaneous Commands](http://www.gnu.org/software/bash/manual/html_node/Miscellaneous-Commands.html#index-character_002dsearch-_0028C_002d_005d_0029)

個人的にこれをよく使うのですが、zsh の emacs キーマップでは定義が異なっているため混乱します。

|キー割り当て |ウィジェット         |内容    |
|:------------|:--------------------|:-------|
|`C-x` `C-f`  |`vi-find-next-char`  |viの`f` |
|なし         |`vi-find-prev-char`  |viの`F` |

# zshでのキーマップをbashと同じにする

そこで次のように bash と同じキーマップを定義しておくと、今実行しているシェルが bash か zsh であるかを気にせずカーソル移動ができるのでオススメです。

```zsh
bindkey '^]'   vi-find-next-char
bindkey '^[^]' vi-find-prev-char
```

# おわりに

vi と emacs の両方のいいとこ取りの zsh、まさに最強のシェルです。

ちなみに今回の bash のキーバインドについては今年 9月の JPOUG のイベントで話した時に整理したのですが、そのときは zsh のマッピングが分からず不便でした。最近になってこの設定をすることで zsh のコマンド入力におけるストレスが解消しました。

 * [JPOUG> SET EVENTS 20140907 で話してきました - Keep It Simple, Stupid](http://yskwkzhr.blogspot.jp/2014/09/jpoug-set-events-20140907.html)
Re:人力ソート【Python】

前にこんなのやりました。

[【車輪の再発明】人力トーナメントソート【Python】](http://qiita.com/ssh0/items/b37748f41f236172f2c0)

アルゴリズム考えたり検証したりするのは確かに勉強になったし楽しかったけど、あまりにもバカバカしくなったので、ちゃんとソートの呼び出し関数を変更するだけのスマートな方法も載せておく。

__参考にしたもの:__
[entertainment-lab: Pythonで独自ソートの実装:](http://entertainment-lab.blogspot.jp/2012/09/python_21.html)

#コード全体

肝心かなめのソートの部分をPython純正のsortに任せるので、当然のことながらすごく短くなる。

```python:ranking_sort.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, December 2014.

description = """
              自己分析用ランク付けインターフェース。
              このアプリケーションでは
              与えたリストをもとに比較質問を作成し、
              ユーザーがそれに答えていくとランキングが完成する。
              """

import argparse
import sys

def human_cmp(a, b):
    print '\nwhich ones do you like?'
    print '  [j]: %s, [k]: %s. [=]:eq' % (a, b)
    key_input = raw_input(">>> ")
    if key_input == 'j':
        ans = -1
    elif key_input == 'k':
        ans = 1
    elif key_input == '=':
        ans = 0
    else:
        raise ValueError('please select by "j", "k" or "=".')
    return ans


if __name__ == '__main__':

    parse = argparse.ArgumentParser(description=description)
    parse.add_argument('-l', '--list',
                       dest='objects',
                       nargs='*',
                       type=str,
                       help='list of some objects',
                       default=argparse.SUPPRESS
                       )
    args = parse.parse_args()
    data = args.objects
    data.sort(cmp=human_cmp)
    print data
```

human_cmpとしたのがsort関数に渡す関数。気をつけるのはその関数の返す値だけ。二つの引数を比べて、第1引数が第2引数より小さければ負、同じなら0、大きければ正の値を返すようにする。

#実行例

```shell-session
➤ python ranking_sort.py -l 3 1 4 8 5 2 6 7

which ones do you like?
  [j]: 1, [k]: 3. [=]:eq
>>> j

which ones do you like?
  [j]: 4, [k]: 1. [=]:eq
>>> k

which ones do you like?
  [j]: 4, [k]: 3. [=]:eq
>>> k

which ones do you like?
  [j]: 8, [k]: 3. [=]:eq
>>> k

which ones do you like?
  [j]: 8, [k]: 4. [=]:eq
>>> k

which ones do you like?
  [j]: 5, [k]: 4. [=]:eq
>>> k

which ones do you like?
  [j]: 5, [k]: 8. [=]:eq
>>> j

which ones do you like?
  [j]: 2, [k]: 4. [=]:eq
>>> j

which ones do you like?
  [j]: 2, [k]: 3. [=]:eq
>>> j

which ones do you like?
  [j]: 2, [k]: 1. [=]:eq
>>> k

which ones do you like?
  [j]: 6, [k]: 4. [=]:eq
>>> k

which ones do you like?
  [j]: 6, [k]: 8. [=]:eq
>>> j

which ones do you like?
  [j]: 6, [k]: 5. [=]:eq
>>> k

which ones do you like?
  [j]: 7, [k]: 4. [=]:eq
>>> k

which ones do you like?
  [j]: 7, [k]: 6. [=]:eq
>>> k

which ones do you like?
  [j]: 7, [k]: 8. [=]:eq
>>> j
['1', '2', '3', '4', '5', '6', '7', '8']
```

これは人力だけど、もちろん参考元みたいに自分で何らかの関数を定義してもいい。

#あとがき

この前の時間はいったい・・・。楽しかったから良かったのよ。そう言い聞かせるしかないのよ・・・。というか、気づいてみれば書くまでもないことだった。
ExtJS5で扱いが変わったClassたち


この記事は、 [Sencha Advent Calendar 2014](http://www.adventar.org/calendars/490) の4日目の記事です。

ExtJS5を使い始めて少し時間がたちました。 
ExtJS4から変わったこと、変わらなかったこと、いろいろありますが、
4のときにお世話になった２つのクラスが利用できなくなったので記事とします。


## Ext.grid.plugin.BufferedRenderer

#### ExtJS4まで

ExtJS4でのGridは、Storeに持っているデータを全て行として描画するため、 
ページングのないGridでは膨大なDom要素を描画することになり、パフォーマンスに影響がでることがありました。

それを防ぐために使われていたのが、*Ext.grid.plugin.BufferedRenderer* でした。
このプラグインは、Storeのデータのうち一度に描画する件数を絞り込めるもので、ページングを利用しないGridではほぼ必須と言えるものです。

    Ext.create({
        xtype: 'grid',
        plugins: {
        	ptype: 'bufferedrenderer'
        },
        ...
    });

#### ExtJS5から

ExtJS5になると、このプラグインはデフォルトで有効になっています。
*Ext.grid.plugin.BufferedRenderer* はprivateクラスとして扱われており、単体では利用しません。
Gridに*bufferedRenderer*コンフィグが追加され、有効/無効の切り替えができるようになっています。

    Ext.create({
        xtype: 'grid',
        bufferedRenderer: false,
        ...
    });

## Ext.form.field.Trigger

#### ExtJS4まで

*Ext.form.field.Trigger* は TextFieldのラッパークラスで、トリガーボタンつきのTextFieldを生成するクラスでした。

    xtype: 'triggerfield',
    onTriggerClick: function() {
        Ext.Msg.alert('Status', 'You clicked my trigger!');
    },        
    fieldLabel: 'Sample Trigger',
    emptyText: 'click the trigger'

トリガーボタンのクリックによって、onTriggerClickメソッドが呼ばれます。


#### ExtJS5から

ExtJS5からは、このクラスはDPRECATEDとなりました。
トリガーボタンの設置は、*Ext.form.field.Text* の コンフィグによって追加することができます。

    xtype: 'textfield',
    fieldLabel: 'Sample Trigger',
    triggers: {
         mytrigger: {
           handler: function() {
                Ext.Msg.alert('Status', 'You clicked my trigger!');
            }
         }
    },
    emptyText: 'click the trigger'

#### まとめ

どちらのクラスもExtJS4まではよく利用していました。
デフォルトのコンフィグに組み込まれたので、なくなったというよりは **昇格** でしょうか。
使いやすくなったことは、間違いないですね。

明日の [Sencha Advent Calendar 2014](http://www.adventar.org/calendars/490) は @tnker さんです。
tmlibでオブジェクトをタッチに反応させる

#tmlib.js Advent Calendar 12/4分
以前引っ掛かって結構な時間悩んだ挙句に、phiさんに質問したら速攻回答頂いた件があるので覚書。
しょぼくて申し訳ありません（汗）

##本題
tmlibでゲーム作ってると、オブジェクトをタッチした時になんらかの処理をさせたくなる時があります。
そういう時は…

```lang:javascript
app.currentScene.ontouchstart = function(e) {
    for (var i = 0; i < obj.length; i++) {
        if (obj[i].isHitPoint(e.pointing.x, e.pointing.y)) {
            //タッチしたので良い感じの処理
            obj[i].hogehoge();
        }
    }
}
```
という面倒な処理を書きがちです（少なくとも私は）

全部配列に保存しなきゃだしめんどいなーと思ってたら、tmlibにはオブジェクトをタッチした時にイベント発火させる機能がありました。

```lang:javascript
var obj = tm.display.RoundRectangleShape(width, height, param).addChildTo(this);
obj.interactive = true;
obj.boundingType = "circle";
obj.checkHierarchy = true;
obj.on("pointingstart", hogehoge);
```

`interactive`フラグを`true`にするとタッチした時にイベント発火する様になります。
判定の種類（矩形、円形等）は`boundingType`で指定。

`click`イベントを使用した場合`checkHierarchy`を`true`にすると反応しなくなるので`touchstart`、`touchmove`、`touchend`等を使用した方が良いらしいです（ここがハマったポイント）

親を持つ場合は`checkHierarchy`フラグを`true`にしないと階層構造を考慮した判定が行われないので注意が必要です。

これでいちいちオブジェクトを配列に保存しなくてもタッチ判定が可能に！

##サンプル(runstant)
http://goo.gl/OW6C5H

runstant超便利
Ruboty | 西暦年から十二支を出力する ruboty-eto を作成しました #ruboty

# Ruboty | 西暦年から十二支を出力する ruboty-eto を作成しました #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
西暦年から十二支を出力する ruboty-eto を作成しました

## <i class="fa fa-cube" style="font-size:1em;"></i> 用途
西暦年から十二支を知りたい時に利用します。

## <i class="fa fa-cube" style="font-size:1em;"></i> Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruboty-eto'
```

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install ruboty-eto

## <i class="fa fa-terminal" style="font-size:1em;"></i> Commands

|Command|Pattern|Description|
|:--|:--|:--|
|names|/eto names\z/|get eto names|
|name|/eto name (?&lt;year&gt;\d\{4\})\z/|get eto name from year|
|emoji|/eto emoji (?&lt;year&gt;\d\{4\})\z/|get eto emoji from year|

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Usage
### names
* get eto names

~~~
>ruboty eto names
>子丑寅卯辰巳午未申酉戌亥
~~~

### name
* get eto name from year

~~~
>ruboty eto name 1977
>巳
~~~

### emoji
* get eto emoji from year

~~~
>ruboty eto emoji 1977
>:snake:
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i> ENV

|Name|Description|
|:--|:--|
|--|--|

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Dependency

|Name|Description|
|:--|:--|
|eto gem|<i class="fa fa-github-square" style="font-size:1em;"></i> [eto gem](https://github.com/tbpgr/eto)|

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [eto GitHub](https://github.com/tbpgr/eto)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [eto RubyGems](http://rubygems.org/gems/eto)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-eto GitHub](https://github.com/tbpgr/ruboty-eto)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-eto RubyGems](http://rubygems.org/gems/ruboty-eto)
Scheme in Clojure

## 初めに

この記事は [「つくって学ぶプログラミング言語 RubyによるScheme処理系の実装」](http://tatsu-zine.com/books/scheme-in-ruby)(以降 Scheme in Ruby)をClojureで試した際のメモです.

RubyでもClojureでも基本部分は共通ですが, 別の言語でとなると異なる部分もあります.
そこで, Scheme in Ruby の中で自分が引っかかったこと, RubyからClojureに変更する上でのことをまとめていきます.


## 前提として

RnRS準拠というような本格的な実装を目指したものではなく, あくまでも作って学ぶためのごく簡単なものです.
文法も自由ですし, そもそも字句解析(?)を行いません.  

仮に

```clojure
(+ 2 3)
```
というSchemeの式があったとして, 本来なら

```clojure
"(+ 2 3)"  ;;java.lang.String
```
という文字列をパースして

```clojure
[+ 2 3]  ;;clojure.lang.PersistentVector
```
というClojureが解釈できるデータに落としこむ手順が必要になります

ところがこの処理の実装はそれだけでかなりの労力が必要となる上に, Schemeの実装そのものとは別分野になってしまいます. 
そこで, どう下位の言語で処理するか, という部分に焦点を絞って, 解釈したデータを実行する部分のみを実装します.
つまり, Clojureのデータ構造で表現された言語を評価する関数をClojureで書くだけです.

### 長い、3行で
省エネ仕様
学習には最適
関数書くだけ    

## Clojureでのモデル
あくまでも一例です. もっと綺麗な方法はたくさんあると思います.

### 構文
Rubyでは配列とシンボルで表現されていますが, Clojureではベクタとキーワードで表現します.
リストでもいいのですが, Clojureと別言語であることを明確にするためあえてベクタにします.

例  

```clojure
[:+ 2 3] 
```

```clojure
[:+ :x :y] 
```
```clojure
[[:lambda [:x  :y] [:+ :x :y]] 3 2]
```
```clojure
[:let [[:fact [:lambda [:n] [:if [:< :n 1] 1 [:* :n [:fact [:- :n 1]]]]]]] [:fact 5]]
```

###環境モデル
マップのベクタで表現します.
マップではなくマップのベクタなのは, lambda等を実装する上で複数の環境を考える必要があるためです.

```clojure
[{:x 5 :y 7}, {}, ...]
```


###実行モデル
```clojure
(-eval Expression Environment)
```
例  

```clojure
(-eval [:+ 2 3] [{}])
=> 5
```
```clojure
(-eval [:+ :x :y] [{:x 5 :y 7}])
=> 12
```
```clojure
(-eval [[:lambda [:x  :y] [:+ :x :y]] 3 2] [{:x 5 :y 7}])
=> 5
```
```clojure
(-eval [:let [[:fact [:lambda [:n] [:if [:< :n 1] 1 [:* :n [:fact [:- :n 1]]]]]]]
        [:fact 5]] [{}])
=> 120
```

## ソースコード
[GitHub](https://github.com/ak1t0/Clms)
Scheme in Ruby の第3章までClojureで書いたソースコードです.
コメント込みで100〜200行くらいになりました.

## 最後に
ここまでお付き合いいただきありがとうございました.
何かあったらコメントしていただけると幸いです.
openFrameworks for iOSがXcode6でビルド出来ない問題を修正


ofrubyをXcode6でビルドしようとしたら変なリンクエラーが出た。

```
ld: warning: ignoring file ../../../libs/FreeImage/lib/ios/freeimage.a, missing required architecture i386 in file ../../../libs/FreeImage/lib/ios/freeimage.a (2 slices)
ld: warning: ignoring file ../../../libs/glu/lib/ios/glu-ios.a, missing required architecture i386 in file ../../../libs/glu/lib/ios/glu-ios.a (2 slices)
Undefined symbols for architecture i386:
  "_fwrite$UNIX2003", referenced from:
      _WriteProc(void*, unsigned int, unsigned int, void*) in freeimage.a(FreeImageIO.o-i386)
      LibRaw::dcraw_thumb_writer(char const*) in freeimage.a(libraw_cxx.o-i386)
      _opj_image_create in freeimage.a(image.o-i386)
      _png_default_write_data in freeimage.a(pngwio.o-i386)
      LibRaw::ppm_thumb() in freeimage.a(dcraw_common.o-i386)
      LibRaw::jpeg_thumb_writer(__sFILE*, char*, int) in freeimage.a(dcraw_common.o-i386)
      LibRaw::write_ppm_tiff() in freeimage.a(dcraw_common.o-i386)
      ...
  "_mktime$UNIX2003", referenced from:
      LibRaw::get_timestamp(int) in freeimage.a(dcraw_common.o-i386)
      LibRaw::parse_rollei() in freeimage.a(dcraw_common.o-i386)
      LibRaw::parse_riff() in freeimage.a(dcraw_common.o-i386)
  "_strerror$UNIX2003", referenced from:
      Iex::throwErrnoExc(std::string const&, int) in freeimage.a(IexThrowErrnoExc.o-i386)
  "_strtod$UNIX2003", referenced from:
      _png_handle_sCAL in freeimage.a(pngrutil.o-i386)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

```

`_fwrite$UNIX2003`ってなんだ・・・ :sweat: 検索してみた。

[FreeImage has undefined symbols for i386 for Xcode 6 beta 6 + iOS Simulator · Issue #3178](https://github.com/openframeworks/openFrameworks/issues/3178)

```c
extern "C" {
    size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
    {
        return fwrite(a, b, c, d);
    }
    char* strerror$UNIX2003( int errnum )
    {
        return strerror(errnum);
    }
    time_t mktime$UNIX2003(struct tm * a)
    {
        return mktime(a);
    }
    double strtod$UNIX2003(const char * a, char ** b) {
        return strtod(a, b);
    }
}
```

上のようにダミーの関数定義を追加すればよいらしい。ofrubyの`main.mm`に関数を追加したら動くようになった。

[8ee9073 · ongaeshi/ofruby-ios](https://github.com/ongaeshi/ofruby-ios/commit/8ee9073b9a2bb75fc846503851597c0c5755bea0)

これでiOS8でもofrubyが動きそうだ。
Edisonで顔認識


顔認識と言えば，[OpenCV](http://opencv.jp/)ですねっ！！

# USBカメラのドライバを組み込む
　[昨日の記事](http://qiita.com/yoneken/items/88165cebbadcc8d6878c)を参考に，LinuxのカーネルにUSBカメラのドライバを組み込んでください．
![カーネルにUSBカメラのドライバを組み込む](https://pbs.twimg.com/media/B31mbbqCEAAhu7u.png "カーネルにUSBカメラのドライバを組み込む")

　数時間差で，[にゅーらるさんが手順を一から詳しく説明した記事](http://neuralassembly.blogspot.jp/2014/12/intel-edisonwebmjpg-streamer.html?spref=tw)を書いてくれているので，もっと詳しく知りたい人は、そっちもチェック！

# OpenCVのインストール
　OpenCVは，opkgにパッケージがあります．

\# opkg install opencv python-opencv

# コードを書く
```python:detectface.py
import cv2
import sys

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

video_capture = cv2.VideoCapture(0)

# Capture frame-by-frame
ret, frame = video_capture.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)

# Draw a rectangle around the faces
for (x, y, w, h) in faces:
    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

# Save the resulting frame
cv2.imwrite('face.png', frame)


# When everything is done, release the capture
video_capture.release()

```

　スパっと[こちら](https://realpython.com/blog/python/face-detection-in-python-using-a-webcam/)のコードに手を加えました．
　ありがとうございます．

# 結果
　このOpenCVは，Haar Cascadesという顔のかたちの明暗ライブラリを使用するので，どっかOpenCVをインストールしたコンピュータから持って来てください（適当）．Ubuntuの場合は， */usr/share/opencv/haacascades/haacascade_frontalface_alt.xml* にあります．これを使って，

\# python ./detectface.py ./haacascade_frontalface_alt.xml

とすると，同一ディレクトリ内にface.pngという認識結果のファイルが生成されます．

![Edisonで顔認識](https://pbs.twimg.com/media/B311wFaCYAAP-WI.png "Edisonで顔認識")