OmniAICreator/Qiita-1.07M huggingface dataset:
Windows(64ビット環境)でvimprocをコンパイルしてみよう

## 概説

[Windows(32ビット環境)でvimprocをコンパイルしてみよう](http://qiita.com/akase244/items/08f35b2973fdd4937852)に続き、64ビット環境でのvimprocのコンパイル方法のまとめです。


## コンパイル(make)するために、GNU on Windowsをインストール

[32ビット環境での手順](http://qiita.com/akase244/items/08f35b2973fdd4937852)と同様にGNU on Windowsをインストールします。

1. https://github.com/bmatzelle/gow/wiki にアクセス。
2. [Download Installer](https://github.com/bmatzelle/gow/releases) のリンクをクリック。
3. [Gow-0.8.0.exe](https://github.com/bmatzelle/gow/releases/download/v0.8.0/Gow-0.8.0.exe)をダウンロードしてインストール。
4. 環境変数「Path」に「;C:\Program Files\Gow\bin」を通す。（インストール先については、インストール時の環境に応じて読み替えてください。）
5. なお、Gow-0.8.0.exeのようなインストーラー形式ではなく、 https://github.com/bmatzelle/gow の「[Download ZIP](https://github.com/bmatzelle/gow/archive/master.zip)」からバイナリファイル形式をダウンロードし、解凍後のbinディレクトリに対して環境変数を設定する方法でもOKです。

## MinGWをインストール

[32ビット環境での手順](http://qiita.com/akase244/items/08f35b2973fdd4937852)でMinGWをインストールするとgccが32ビット環境用となるため、ここでは64ビット環境用のMinGWのインストール手順を示します。

1. http://sourceforge.net/projects/mingw-w64/ にアクセス。
2. [Browse All Files](http://sourceforge.net/projects/mingw-w64/files/) をクリック。
3. [Toolchains targetting Win64](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/) をクリック。
4. [Personal Builds](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/) をクリック。
5. [sezero_4.5_20111101](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/) をクリック。
5. [mingw-w64-bin_i686-mingw_20111101_sezero.zip](http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/sezero_4.5_20111101/mingw-w64-bin_i686-mingw_20111101_sezero.zip/download) をダウンロード。
6. ダウンロードしたmingw-w64-bin_i686-mingw_20111101_sezero.zipを、適当な場所に解凍します。※ここでは「C:\」直下に解凍することとします。
7. ~~解凍後、「C:\mingw64\bin」配下の「x86_64-w64-mingw32-gcc.exe」を「gcc.exe」にリネームします。~~
7. 環境変数「Path」に「;C:\mingw64\bin」を通す。（インストール先については、インストール時の環境に応じて読み替えてください。）

## vimprocをコンパイル

コマンドプロンプトを起動して、以下のコマンドを実行することで、「C:\Users\ユーザー名\\.vim\bundle\vimproc\autoload」配下に「vimproc_win64.dll」が作成されます。
※vimprocのダウンロードはNeoBundle等経由でも構いません。

```コマンドプロンプト:コマンドプロンプト
>cd C:\Users\ユーザー名\.vim\bundle
>git clone https://github.com/Shougo/vimproc.vim.git vimproc
>cd vimproc
>make -f make_mingw64.mak
```

 - 参考URL
  - [Windows 64bit でvimprocをコンパイルする](http://www.karakaram.com/vimproc64)
DockerでRuby 2.1のRPM(el6.x86_64)を作成

* Ruby 2.1のRPMが欲しくなったので、どうせならとDockerでRPMビルド環境を作り、簡単にRPMを作成できるようにしてみました。
* なお、[Dockerを使って任意のrubyバージョンのrpmを作成する](http://blog.restartr.com/2014/05/11/build-rpm-on-docker-container/) で使用されている[ReSTARTR/ruby-rpmbuild-container](https://github.com/ReSTARTR/ruby-rpmbuild-container)が2.0用なので、こちらをForkして2.1向けに少し修正して作成しています(その他、ゲストOSをUbuntuからCoreOSに変更もしたり...)。
* 今回用意した2.1用のソースは[wadahiro/ruby-rpmbuild-container](https://github.com/wadahiro/ruby-rpmbuild-container)にあります。

# 必要なもの
下記ソフトウェアが必要ですので事前にインストールしておくこと。

* [VirtualBox](http://www.virtualbox.org/)
* [Vagrant](http://www.vagrantup.com/)

# 仕組み
* VagrantでCoreOSをゲストOSとして起動しつつ、Dockerfile、RPMビルド用のファイル(SPECファイルとrpmbuildを実行するちょっとしたシェルスクリプト)を[VagrantのFile Provisioner](http://docs.vagrantup.com/v2/provisioning/file.html)にてゲストOSの`/tmp/rpmbuild`に転送します。
* 後はゲストOSにSSHでログインし、Dockerのコマンドを実行してイメージの作成＆シェルスクリプト実行によりRPMビルドを行います。
* なお、ビルド環境となるDockerのベースイメージには、[Docker Hubのcentos:centos6](https://registry.hub.docker.com/_/centos/)を使用しています。
* また、SPECファイルは[hansode/ruby-2.1.x-rpm](https://github.com/hansode/ruby-2.1.x-rpm)を使用しています。

# RPMビルド方法
1. [wadahiro/ruby-rpmbuild-container](https://github.com/wadahiro/ruby-rpmbuild-container)を`git clone`します。

    ```bash
    $ git clone https://github.com/wadahiro/ruby-rpmbuild-container.git
    ```

2. VagrantでゲストOS(CoreOS)を起動し、SSHで接続します。なお、Windowsの場合は標準でSSHが使えませんので、GitBashから実行するか、TeraTermなどでポート2222にユーザ:core、SSH Key:`C:\Users\ユーザ名\.vagrant.d\insecure_private_key`を指定して接続します。

    ```bash
    $ cd ruby-rpmbuild-container
    $ vagrant up
    $ vagrant ssh
    ```

3. Dockerコンテナをビルドします。

    ```bash
    $ cd /tmp/rpmbuild
    $ sudo docker build -t <USERNAME>/rubybuild .
    ```

4. 作成したDockerコンテナ上でRPMビルドを行います。`--rm`オプションでビルド完了後はコンテナを破棄しています。`<CONTAINER_ID>`には、`docker build`でビルドした際に最後に表示されたコンテナIDを指定します。

    ```bash
    $ sudo docker run --rm -v $PWD:/shared:rw -it <CONTAINER_ID> /bin/sh ./rubybuild.sh
    ```

5. ビルドが成功すれば、ゲストOSのカレントディレクトリにRPMができています。

    ```bash
    $ ls *.rpm
    ruby-2.1.2-2.el6.x86_64.rpm
    ```
NYAGOS なら Unicode ファイル名にも自信が持てます

# NYAGOS とは

Go 言語で **作成中** の Windows向けの Unicode 対応 UNIX風コマンドラインシェルです。知る人ぞ知る、NYAOS シリーズのバージョン「4」に相当します（今年でなんと18年目となります）

そして、ぼちぼちと、このNYAGOSも「使えなくもないかなー」レベルにまでなってきたので、ここいらで宣伝記事を書かせていただきます。

> ちなみに「1」は OS/2 向け、「2」は DOS・Windows・OS/2向け、「3」は「2」をベースに Windows+OS/2 向けに絞って、Lua による拡張機能を付けたもの。だが、基本的に Double Byte Charactor System が大前提だったため、Unicodeに対応するには「また」スクラッチから作り直す必要があった

* ソース：https://github.com/zetamatta/nyagos
* バイナリ：http://www.nyaos.org/index.cgi?p=NYAGOS
* ドキュメント：<br /><del>https://github.com/zetamatta/nyagos/blob/master/nyagos_ja.mkd</del><br /><ins>https://github.com/zetamatta/nyagos/tree/master/Doc/</ins>

# 特徴

* NYAOS シリーズ伝統のUNIX風コマンドラインを Windows に提供するネイティブシェル
   * UNIX風１行入力編集
   * エイリアス・ヒストリ
   * 内蔵カラーls、カラープロンプト
* 今回、Go 1.3 にて開発
   * 従来の NYAOS より開発効率が大幅にアップした。
   * 外部のライブラリも積極的に活用
* 設定とカスタマイズは Lua 5.2 で記述
   * まだ、alias と setenv しかないけど。
   * ポリシーとしては go で作成する本体はできるだけ必要最小限な構成とし、Lua で機能を作り込む / 改造できるようにする。
* Unicode対応
   * 内蔵 ls にて、Unicodeファイル名を表示できる
   * 「`echo ☑ > ☑`」などというコマンドも正常に機能する。
        * ただし、ファイル「`☑`」の中身は UTF8 の`☑`
* 従来の NYAOS だと、環境変数設定バッチをうまく実行できないという問題があり、`cmdsource.lua` という外部Luaライブラリで解決していた。今回、本体側で対応し、`source バッチファイル名` でそういったバッチファイルによる環境変数変更を取り込めるようになった。
* ソースは Github にて「BSDライセンス」にて公開中。


# 残念なお知らせ

## 悪いな、のび太。 NYAGOS はまだ Shift-JIS には対応してないんだ。

これから実装する予定の逆クォートとか、文字コード変換どうするんだ？更に、Lua の文字列は基本バイト列だろ…

でも、chcp とかしなくてもいいんだぜ（go言語が UTF16 のAPIを使ってくれているおかげ）。

## 当初は mruby をカスタマイズ言語にしたかったんだ。

でもな、mruby には LuaBinaries みたいな Windows 向けのバイナリパッケージないだろ…（DLLを作るパッケージはあったが、最新mruby に追随できておらず、goの仕様上、一筋縄で組み込めない）。本当は ShiftJIS と UTF8 の架け橋をmrubyに担って欲しかったんだ…。

## まだ、バージョン 1 じゃない

機能も NYAOS-3000 に全く及ばない。

* 上にも書いたが、逆クォートも「まだ」ない。
* 一行入力は「まだ」完全じゃない。
* Lua で（カレントディレクトリや環境変数を操作できるような）内蔵コマンドも「まだ」作れない。

今のところ、最新ソースと、時々のスナップショットのバイナリを公開しているという状況で、ただちに NYAOS-3000 からリプレースできるようなものにはなっていません。今後に乞うご期待というところです。ということで、応援よろしくお願いいたします。

# その他

## 使用させていただいているライブラリ

* http://github.com/mattn/go-runewidth
* http://github.com/shiena/ansicolor
* http://github.com/atotto/clipboard

さらに @mattn_jp さんと @nocd5 さんには度々アドバイスをいただいております。この場を借りてお礼申し上げます。
Windows(32ビット環境)でvimprocをコンパイルしてみよう

## 概説

WindowsのgVimで[The Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher)を使いたくて仕方なかったんですが、目の前に立ちふさがるvimproc.dllのインストール。

[暗黒美夢王が配布してくれているDLL](https://github.com/Shougo/vimproc.vim/downloads)があるんですが、[使っちゃダメ](https://twitter.com/akase244/status/463389743175061506)と言われたので、頑張ってWindows環境でコンパイルしてみました。これはその時のメモです。


## コンパイル(make)するために、GNU on Windowsをインストール

色んなサイトでコンパイルするには「msys」をインストールするように説明されていますが、ここではGNU on Windowsをインストールします。もちろんmsysをインストールしてもコンパイルは可能です。

1. https://github.com/bmatzelle/gow/wiki にアクセス。
2. [Download Installer](https://github.com/bmatzelle/gow/releases) のリンクをクリック。
3. [Gow-0.8.0.exe](https://github.com/bmatzelle/gow/releases/download/v0.8.0/Gow-0.8.0.exe)をダウンロードしてインストール。
4. 環境変数「Path」に「;C:\Program Files\Gow\bin」を通す。（インストール先については、インストール時の環境に応じて読み替えてください。）
5. なお、Gow-0.8.0.exeのようなインストーラー形式ではなく、 https://github.com/bmatzelle/gow の「[Download ZIP](https://github.com/bmatzelle/gow/archive/master.zip)」からバイナリファイル形式をダウンロードし、解凍後のbinディレクトリに対して環境変数を設定する方法でもOKです。

## MinGWをインストール

gccを使えるようにするために、MinGW(Minimalist GNU for Windows)をインストールします。
なお、GNU on Windowsのmakeではなく、msys収録のmakeを利用したい場合は、MinGW経由でmsysをインストールすることが可能です。

1. http://sourceforge.net/projects/mingw/ にアクセス。
2. [Browse All Files](http://sourceforge.net/projects/mingw/files/) をクリック。
3. [Installer](http://sourceforge.net/projects/mingw/files/Installer/) をクリック。
4. [mingw-get-setup.exe](http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download) をダウンロード。
5. mingw-get-setup.exeをダブルクリックし、セットアップを開始する。
6. 「Install」をクリックする。
![mingw1.png](https://qiita-image-store.s3.amazonaws.com/0/23093/280f5041-6155-32ba-ac01-b7d76ee7487b.png)
7. デフォルト設定のまま、「Continue」をクリックする。
![mingw2.png](https://qiita-image-store.s3.amazonaws.com/0/23093/3997567f-6bca-7f75-7602-aac4d8437b1f.png)
8. 「mingw32-base」を右クリックし「Mark for Installation」を選択後、左上の「Installation」から「Apply Change」を選択する。GNU on Windowsのmakeを利用しない場合はここで同時に「msys-base」も選択しておく。
![mingw4.png](https://qiita-image-store.s3.amazonaws.com/0/23093/bcdb06f6-3ae9-7f8c-196f-d47109245b47.png)
9. 環境変数「Path」に「;C:\MinGW\bin」を通す。（インストール先については、インストール時の環境に応じて読み替えてください。）
10. msysのmakeを利用する場合は、「;C:\MinGW\msys\1.0\bin」にもパスを通してください。

## vimprocをコンパイル

コマンドプロンプトを起動して、以下のコマンドを実行することで、「C:\Users\ユーザー名\\.vim\bundle\vimproc\autoload」配下に「vimproc_win32.dll」が作成されます。
※vimprocのダウンロードはNeoBundle等経由でも構いません。

```コマンドプロンプト:コマンドプロンプト
>cd C:\Users\ユーザー名\.vim\bundle
>git clone https://github.com/Shougo/vimproc.vim.git vimproc
>cd vimproc
>make -f make_mingw32.mak
```

 - 参考URL
  - [Windows 32bit でvimprocをコンパイルする](http://www.karakaram.com/vimproc32)
Ruby | Ruby で Java の列挙型(Enum)を使いたい場合

# Ruby | Ruby で Java の列挙型(Enum)を使いたい場合

## 概要
Ruby で Java の列挙型(Enum)を使いたい場合について。

Javaで、特定の概念の定数の集まりを扱う場合 *Enum* が便利です。
例えば、信号に係る赤・青・黄の色を管理する場合、バラバラの定数として扱うよりも
*Enum* として利用した方が意図が伝わる上に不正な値を受け付けなくなります。

~~~java:sample.java
enum SignalColors { RED, GREEN, YELLOW; }
~~~

Rubyは組み込みでJavaの列挙型（Enum）のようなものは用意されていないので
別の方法で代替する必要があります。

## モジュールを利用した擬似Enum
この方法が王道なのかわかりませんがある程度似たような実装ができます。

~~~ruby
require 'tbpgr_utils'
require 'forwardable'

module Enum
  def values
    constants.map{ |e| const_get(e) }
  end
  
  def keys
    constants
  end
end

module Janken
  extend Enum
  extend Forwardable

  GU = 0
  CHOKI = 1
  PA = 2

  def_delegators :keys, :values
end

bulk_puts_eval binding, <<-EOS
Janken::GU
Janken::CHOKI
Janken::PA
Janken.keys
Janken.values
EOS

# 不正値の検出
begin
  Janken::SUPER
rescue => e
  puts e
end

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
~~~

出力

~~~ruby
Janken::GU    # => 0
Janken::CHOKI # => 1
Janken::PA    # => 2
Janken.keys   # => [:GU, :CHOKI, :PA]
Janken.values # => [0, 1, 2]
uninitialized constant Janken::SUPER
~~~
地下街地図の表示(Yahoo! iOSマップSDK)

http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/iphonesdk/tutorial3a.html

上記のサイトを参考に、地図の表示を実装した上で
map.mapType = YMKMapTypeChika;

のコードを書いたのですが、地下街地図収録エリアに行っても反映されません(新宿駅、東京駅等)

地下街地図を表示するには何か別の設定も必要なのでしょうか。
よろしくお願いします。
iOSアプリバージョンについて

CFBundleVersion と CFBundleShortVersionString と iTunes Connect での申請時に設定すべき値について調べた結果を書く。
単に調べた結果の独自解釈です。Apple公式の情報ではありません。

## 用途

[アプリケーションの配布に関するガイド (TP40012582 0.0.0) - AppDistributionGuide.pdf](https://developer.apple.com/jp/devcenter/ios/library/documentation/AppDistributionGuide.pdf) の [版番号とビルド文字列を設定する](https://developer.apple.com/jp/devcenter/ios/library/documentation/AppDistributionGuide.pdf#//apple_ref/doc/uid/TP40012582-CH28-SW18) に全て書いてあった...
以下よりは、「アプリケーションの配布に関するガイド」を読んだ方が正確。

### CFBundleVersion

* 内部部管理バージョン
* バンドルのリリースの繰り返しの識別。
* ピリオドで区切られた3つの数字推奨。
* リリースを問わないBundleのバージョン。
* Bundleは実行ファイルという解釈でいいか。
* リソースファイル(Info.plist)中に記述。
* エンドユーザからは全く見えない。（どこにも表示されない。）
* AppStore登録時に適切に更新されていないとエラー。

### CFBundleShortVersionString

* 表記用バージョン
* アプリケーションのリリースの繰り返しの識別。ピリオドで区切られた3つの数字推奨。
* ローカライズ可能とあったので表記用と思われます
* リソースファイル(Info.plist)中に記述（Apple社では使っていない。)

### AppStore登録のバージョン（iTunesConnect Version）

* iTunes Store, iTunes等で表記
* 表記のみ、アップル社として機能なし。

2014-05-02 時点で最新の「iTunes Connectデベロッパガイド」によると（昨年末に変更された？）

> 重要: バージョン番号がバンドルに設定されているバージョン番号と一致することを確認します。一致しない場合、以降の更新でアップロードエラーが発生する可能性があります。

## 推奨値

３つの数値をピリオドで区切った値。例、1.0.0
これは、CFBundleVersion と CFBundleShortVersionString の両方が対象。

CFBundleVersion は、

> メジャーリビジョン、マイナリビジョン、メインテナンスリリース

とある一方で、CFBundleShortVersionString については各値の定義についての記述は見当たらなかった。経過日数.その日のリリース回数.総ビルド番号とか、yyyymmdd.ビルド番号.0とかが考えられる？ リリースの度に確実に上がるものなら何でもいいのか。

参考
* [CoreOS Release Notes](https://coreos.com/releases/)
* [Semantic Versioning 2.0.0](http://semver.org/)

## 申請時とアプリのバージョン

申請時のバージョンの比較は、CFBundleVersion と CFBundleShortVersionString で空白でない方と。両方とも空白でない場合、どっちが優先されるんだっけ？（ソースが見当たらない）。
アプリのバージョンアップの大小判定は CFBundleShortVersionString で行われるんだっけ？（「アプリケーションの配布に関するガイド」によるとこれで正しいみたい）

## 参考

* [iPhoneアプリ申請時，Version Mismatch - CFBundleVersionや，CFBundleShortVersionStringとはなんぞや． - yappynoppyの日記](http://d.hatena.ne.jp/yappynoppy/20131016/1381935988 "iPhoneアプリ申請時，Version Mismatch - CFBundleVersionや，CFBundleShortVersionStringとはなんぞや． - yappynoppyの日記")
 Appleからのメール...

* [Version Number (iTunes Connect) と Bundle version (CFBundleVersion) — MOL](http://t32k.me/mol/log/cfbundleversion/)
 ビルド番号が最後に付加されるらしい
ANSI Escape Sequenceの削除

Cucumberの出力するスニペットから、エスケープシーケンスを削除するための、正規表現を書いたのでメモ。

* Ruby

```rb
gsub /\x1B\[[0-9]{1,3}[mK]/, ''
```
```rb
gsub /\e\[\d{1,3}[mK]/, '' #こっちのほうが良さげ
```


* Vimでも。

```vim
s/\%x1B\[[0-9]\{1,3}[mK]//g
```

```vim
s/\e\[\d\{1,3}[mK]//g
```

```vim:.vimrc
" DeleteAnsiEsc
command! -range=% DeleteAnsiEsc :<line1>,<line2>rubydo gsub /\e\[\d{1,3}[mK]/, ''
nnoremap <Leader>da :<C-u>DeleteAnsiEsc<CR>
vnoremap <Leader>da :DeleteAnsiEsc<CR>
```

Vimの設定でエスケープシーケンスをyankしないようにできないかなと思ったけど、よくわからなかった。

参照サイト：
[ANSI escape code (Wikipedia)](http://en.wikipedia.org/wiki/ANSI_escape_code)
[Remove color codes (special characters) with sed](http://www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed)
[In Vim, how to keep characters concealed even when cursor enters that line (Stack Overflow)](http://stackoverflow.com/questions/9604011/in-vim-how-to-keep-characters-concealed-even-when-cursor-enters-that-line)
RuboCop | Style/RegexpLiteral

# RuboCop | Style/RegexpLiteral

## 概要

RuboCopの「Style/RegexpLiteral」警告について。

正規表現に任意の数のスラッシュが含まれる場合に、

~~~ruby
/reg\/\/exp/
~~~

の記法を使わずに、

~~~ruby
%r{reg//exp}
~~~

を利用するように警告を出す。
逆に、スラッシュが任意の数になっていないにも関わらず
 %r 記法を利用していると警告をうけます。
デフォルトはスラッシュを2個以上使っていると警告を出す。

## bundlerでgemのテンプレートを作っている場合

bundlerでgemのテンプレートを作っている場合, bundlerが生成する gemspec の中で

~~~ruby
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
~~~

のように、スラッシュ1個の正規表現に対して %r 記法を利用しているため
RuboCop警告を受けることになってしまいます。

## RegexpLiteral

各設定値での検証結果をまとめます。

### 検証プログラム

~~~ruby:raise_args
hoge = 'hoge'
print hoge =~ /hoge/
print hoge =~ /ho\/ge/
print hoge =~ /ho\/\/ge/
print hoge =~ %r{hoge}
print hoge =~ %r{ho/ge}
print hoge =~ %r{ho//ge}
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
RegexpLiteral:
  MaxSlashes: 1
~~~

~~~bash
$rubocop regexp_literal.rb
Inspecting 1 file
C

Offenses:

regexp_literal.rb:4:15: C: Use %r for regular expressions matching more than 1 '/' character.
print hoge =~ /ho\/\/ge/
              ^^^^^^^^^^
regexp_literal.rb:5:15: C: Use %r only for regular expressions matching more than 1 '/' character.
print hoge =~ %r{hoge}
              ^^^^^^^^
regexp_literal.rb:6:15: C: Use %r only for regular expressions matching more than 1 '/' character.
print hoge =~ %r{ho/ge}
              ^^^^^^^^^

1 file inspected, 3 offenses detected
~~~

### 実行結果 compact を設定にします

~~~yaml:.rubocop.yml
RegexpLiteral:
  MaxSlashes: 0
~~~

~~~bash
$rubocop regexp_literal.rb
Inspecting 1 file
C

Offenses:

regexp_literal.rb:3:15: C: Use %r for regular expressions matching more than 0 '/' characters.
print hoge =~ /ho\/ge/
              ^^^^^^^^
regexp_literal.rb:4:15: C: Use %r for regular expressions matching more than 0 '/' characters.
print hoge =~ /ho\/\/ge/
              ^^^^^^^^^^
regexp_literal.rb:5:15: C: Use %r only for regular expressions matching more than 0 '/' characters.
print hoge =~ %r{hoge}
              ^^^^^^^^

1 file inspected, 3 offenses detected
~~~

## RuboCopまとめ記事
http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Golangのstrconvパッケージについて

strconvパッケージは、文字列と基本データ型の双方向変換を実装している。

## 文字列を数値に変換する
よく使いそうなのは
**func Atoi(s string) (i int, err os.Error)**
だろう。
**ParseInt(s, 10, 0)**
の省略系でもある。

```golang

a, _ := strconv.Atoi("135")
fmt.Println(a) // => 135

b, _ := strconv.ParseInt("135", 10, 0)
fmt.Println(b) // => 135

```

[Package strconv](http://golang.org/pkg/strconv/#Atoi)

内容薄すぎ。
追記予定です。
Postgresql 9.3.2 インストール（OS X Mavericks）

環境：OS X Mavericks (10.9.4)

1. インストール 
-------------------------------
`$ brew install postgresql`

2. UTF-8で初期化
-------------------------------
`$ initdb /usr/local/var/postgres -E utf8`

3. 手動で起動
-------------------------------
`$ postgres -D /usr/local/var/postgres`

4. データベース一覧で確認
-------------------------------
`$ psql -l`

5. 環境変数PGDATAを設定。.zshrcに以下を記述
-------------------------------
`$export PGDATA=/usr/local/var/postgres`

6. バージョン確認
-------------------------------
`$ psql -V`

7. 自動起動を設定。
-------------------------------
`$ cp /usr/local/Cellar/postgresql/9.3.2/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/`
`$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist`
L2TPメモ

## 試行結果

調べたリンク先を元に設定して試した。だが、証明書による接続が Mac でどうしてもできなかった。Windows、Mac に対応するためにパスワード認証での運用に。けれども、 Linux の OpenSWAN、xl2tp はCPU負荷が高くってそれが解決できずL2TPでのVPNをあきらめることになった。

2013年12月くらいに試した結果だけど、これでアウトプットして終わり。

#### 参考

1. [VPNプロトコル比較表　PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN](http://jp.giganews.com/vyprvpn/compare-vpn-protocols.html "VPNプロトコル比較表　PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN")

## サーバー

サーバー側の証明書の設定も２通りあるみたいで、ファイル名指定と名前指定？それも随分試行錯誤した結果わかった。

#### 参考

1. [EZ-NET： CentOS 6.0 で L2TP-VPN サーバを構築する](http://network.station.ez-net.jp/server/remote/Linux/l2tp.asp "EZ-NET： CentOS 6.0 で L2TP-VPN サーバを構築する")
1. [Windows Vista および Windows Server 2008 で、NAT-T デバイス配下にある L2TP/IPsec サーバーを構成する方法](http://support.microsoft.com/kb/926179/ja "Windows Vista および Windows Server 2008 で、NAT-T デバイス配下にある L2TP/IPsec サーバーを構成する方法")
1. [DSAS開発者の部屋:AndroidからL2TP/IPsec CRT VPNに接続する](http://dsas.blog.klab.org/archives/52019396.html)

## クライアント

### Windows

レジストリを手動で設定する必要があったもののパスワード認証も、証明書による認証も割とすんなり接続できた。

#### 参考

1. [EZ-NET： L2TP-VPN に Windows 7 で接続する](http://network.station.ez-net.jp/client/remote/vpn/l2tp-win7.asp "EZ-NET： L2TP-VPN に Windows 7 で接続する")
1. [Giganews VyprVPNユーザーの為の向けL2TP/IPsec Windows 8セットアップインストラクション](http://jp.giganews.com/support/vyprvpn/vpn-setup/windows-8/l2tp.html "Giganews VyprVPNユーザーの為の向けL2TP/IPsec Windows 8セットアップインストラクション")

### Mac

パスワード認証だと簡単。ただし証明書による認証は出来そうで出来ず。Mac は色々調べて参考になるリンクもあったのだけれども、それらのどの設定も接続できなかったのでリンクなし。
Exercise: Fibonacci closure



```go
package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a := 0
    b := 1
    return func() int {
        a, b = b, a+b
        return a
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}
```

## フィボナッチ数

フィボナッチ数というのは，

　　1，1，2，3，5，8，13，21，34，55…

となる数です。

http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0

http://www.gakuto.co.jp/w/suugaku/su_daizai03-2.htm
「第23回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
くねくね増加列

5*5のマス目から単調増加列を全て取り出した場合、最も長いものを探す。

```php
<?php
	
	class SNAKEMOINC{
	
		/**
		* くねくね増加列
		* @param String 「01224/82925/69076/32298/21065」みたいな文字列
		* @return int 「6」みたいな数値
		*/
		public function get($input){
			$input = str_replace('/', '', $input);
			
			$tmp=[];
			for($i=0;$i<strlen($input);$i++){
				// 各升スタートでの最大長を取得
				$tmp[] = $this->getMax($input, $i, 1);
			}
			// 一番長かった枝
			return max($tmp);
		}
		
		/**
		* 最長ルートを取得
		* @param  String input
		* @param  int 開始位置
		* @param  int 現在のルート長
		* @return int 最大ルート長
		*/
		private function getMax($input, $pos, $loop){
			$tmp=[$loop];
			foreach($this->getLargeAdjacent($input, $pos) as $val){
				$tmp[] = $this->getMax($input, $val, $loop+1);
			}
			return max($tmp);
		}
		
		/**
		* 隣接4箇所のうち、自分より大きいところがあれば取得
		* @param  String input
		* @param  int 現在位置
		* @return []  隣接位置
		*/
		private function getLargeAdjacent($input, $pos){
			$ret = [];
			foreach($this->getAdjacent($pos) as $val){
				if($input[$pos] < $input[$val]){
					$ret[] = $val;
				}
			}
			return $ret;
		}
		
		/**
		* 隣接4箇所の位置を取得
		* @param  int 現在位置
		* @return []  隣接位置
		*/
		private function getAdjacent($pos){
			if($pos>=5){ $ret[] = $pos-5; } // 上
			if($pos<20){ $ret[] = $pos+5; } // 下
			if($pos%5!==0){ $ret[] = $pos-1; } // 左
			if($pos%5!==4){ $ret[] = $pos+1; } // 右
			return $ret;
		}
		
	}
	
	// テスト
	$test = [
		['01224/82925/69076/32298/21065', '6'],
		/* 省略 */
	];

	$snakemoinc = new SNAKEMOINC();
	foreach($test as $key=>$data){
		$answer = $snakemoinc->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
```

極めてふつーに、伸ばせるところに手を伸ばしているだけです。
メモ化すら行っていないという手抜きっぷり。
まあ計算量が問題になるサイズではないからいいでしょう。
かかった時間は50分くらい。

ところで概ね毎回のことなんだが、他人の回答例を見てみても全く理解できぬ。
gulp.js その2 gulp-webserverでWebサーバー/ライブリロード


[gulp-webserver](https://www.npmjs.org/package/gulp-webserver)プラグインは、開発用のWebサーバーを簡単に立ち上げることができるgulpプラグイン。[gulp-connect](https://www.npmjs.org/package/gulp-connect)(すでにdeprecated)を書き直したものである

ライブリロード機能も付いてるので [gulp-livereload](https://www.npmjs.org/package/gulp-livereload) などは不要。ブラウザで表示確認しながら作業に専念することができる

node.jsのサーバーなのでPHPは動かない。PHPを動かしたい場合はApache(MacならMAMPにも含む)やnginxを使うこと


インストール・使い方
============================================================

gulpがインストールされていることが前提

### gulp-webserver プラグインのインストール

npmで開発用としてインストール
`npm install --save-dev gulp-webserver`
(今回はプロジェクトディレクトリに入れる。-g オプションでグローバルに(ホームディレクトリ直下))


### gulpfile.js サンプル

```
//サンプルのディレクトリ構成
test
 |`gulpfile.js
 |`app
 |  `index.html
 |  `about.html
 |`node_modules
 |   `gulp-webserver(上記でインストールしたもの)
```


```gulpfile.js
var gulp = require('gulp'),
  webserver = require('gulp-webserver');

//Webサーバー
gulp.task('webserver', function() {
  gulp.src('app') //Webサーバーで表示するサイトのルートディレクトリを指定
    .pipe(webserver({
      livereload: true, //ライブリロードを有効に
      //directoryListing: true //ディレクトリ一覧を表示するか。オプションもあり
    }));
});


/**
 * デフォルトタスク
 *
 * コマンド'gulp'で実行される
 */
gulp.task('default', ['webserver']);
```

### 実行

ターミナルで `gulp`
Webサーバーが立ち上がる (終了は Control + c)

```
[10:24:25] Using gulpfile ~/Desktop/gulp_webserver/gulpfile.js
[10:24:25] Starting 'webserver'...
[10:24:25] Webserver started at http://localhost:8000
[10:24:25] Finished 'webserver' after 14 ms
[10:24:25] Starting 'default'...
[10:24:25] Finished 'default' after 8.64 μs
```



### 結果
ブラウザで http://localhost:8000 にアクセスすると、index.html が表示される
http://localhost:8000/about.html にアクセスすると、about.html が表示される
存在しないファイルにアクセスすると"Cannot GET /ファイル名"と表示（オプションで404ページ設定可）

ブラウザを見ながら、エディタでファイルを変更保存すると、ライブリロードが機能していることが確認できる。




## 参考サイト

* [gulp-webserver - npm](https://www.npmjs.org/package/gulp-webserver)
* [schickling/gulp-webserver - Github](https://github.com/schickling/gulp-webserver)
GitHubでWebページを公開する方法


自分で作ったWebページをリポジトリとして公開して、なおかつそのページをGitHub Pagesで表示させる方法です。やってみれば簡単だけどそもそもGitHubほとんど使ったことなかったので時間かかってしまいましたorz

##1.ローカルでWebページの作成

公開したいwebページを作ってください。

##2.GitHubにリポジトリ作成

GitHubのユーザーページに行って好きな名前でリポジトリを作成してください。

##3.ローカルでファイルを追加してadd→commit→push

* まずは作成したリポジトリをローカルにクローンします；

  `git clone https://github.com/ユーザー名/リポジトリ名.git`

* クローンしたリポジトリのディレクトリに移動してください；

  `cd リポジトリ名`

* 作成したhtmlファイル等をディレクトリ内にコピーしてください。
  cssやらjsやらimagesやらがあればそのまままとめてコピーしてください；

  `cp -r コピー元ディレクトリ/* ./`


* ファイルをaddします；

  `git add *`

* ファイルをコミットします。コメントは適当に変えてください；

  `git commit -m 'first commit'`

* pushしてGitHubのリポジトリに反映させてください；

  `git push origin master`

  この段階でGitHubのリポジトリページを見るとファイルがアップされているはずです。

##4.gh-pagesブランチを切る

リポジトリの管理画面からgh-pagesブランチを作成してください。  

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/30850/93ad2fdf-3d56-c3ce-b7d1-de3b6e66c0eb.png "ss.png")


##5.gh-pagesブランチに移動

ブランチを切ったら同じところをクリックして"gh-pages"を選んでください。gh-pagesブランチのページへ移動するはずです。

##6.必要ならファイルのリネーム

作成したhtmlファイルの名前がindex.html以外の場合は、そのファイルを選んで"Edit"からファイル名を"index.html"に変更してください。すでに"index.html"の場合は何もしなくて良いです。

##7.座して待つ

`ユーザー名.github.io/リポジトリ名`にアクセスすると作成したページが表示されるはずです。公式ページ曰く反映されるまで10分くらいかかることがあるらしいので、もし表示されない場合は少し間をおいてみてください。

##おまけ

ここでの話はWebページをリポジトリに登録した場合に限らず、すべてのリポジトリに対してもそのWebページをつくることができます。なのでライブラリなんかをGitHubで公開する場合もそのデモページとかをつくることができます。やることは上に書いたように"gh-pages"というブランチをつくってそこにindex.html等々のファイルを置いておくだけです。


##参考ページ
[Web - Githubを使って3分でHPを公開する。 - Qiita](http://qiita.com/budougumi0617/items/221bb946d1c90d6769e9)
[Creating Project Pages manually &middot; GitHub Help](https://help.github.com/articles/creating-project-pages-manually)
.bashrcとか設定ファイル


なんだかOSXでは　.bashrcからロードされないので.bash_profileから読む。

```.bash_profile

	ログイン時のみ実行される。主に環境変数を設定する。
	（exportする変数）に使用。

# .bashrcをロード
source ~/.bashrc
# 続いて　2>/dev/null と書くと、よく見る標準エラー出力を捨てる記述だが今回はコメントアウト。一応。
```

```/etc/pacth

	OSXでhomebrewのコマンドを優先させるために、/etc/pacthをいじる。

/usr/local/bin
/usr/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin

に変更する。
```




``` .bashrc

	対話モードのbashを起動する時に毎回実行される。主に、
		・環境変数でない変数を設定する (exportしない変数)
		・エイリアスを定義する
		・シェル関数を定義する
		・コマンドライン補完の設定をする
	bashを起動する度に毎回設定する必要がある。
	とりあえず自分用にこんな感じ。

# lsでカラー表示させる
alias ls="ls -G"
alias ll="ls -l"

# viの代わりに macvimをコマンドラインで呼ぶ
alias vi="/Applications/MacVim.app/Contents/MacOS/Vim"
# gvim でコンソールからMacVim.appを起動する
alias gvim="/Applications/MacVim.app/Contents/MacOS/mvim"
 
```

```.vimrc

	vimのカスタマイズ。Vundleの書き方が変わってた。インストール前にmkdirすること。

" Vundleの設定
set nocompatible              " be iMproved, required
filetype off                  " required

" おまじない
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" Vundle本体
Plugin 'gmarik/Vundle.vim'

" Pluginを書く
Plugin 'altercation/vim-colors-solarized'

" おまじない
call vundle#end()            " required
filetype plugin indent on    " required

" ここから.vimrc
syntax enable
set background=dark
colorscheme solarized
[連載] javascriptで作るシューティングゲーム的な何か(おまけ)


#つい出来心で……#

##はじめに##
本稿は javascript を用いて[ シューティングゲーム的な何か ]を作ろうという試みについて解説した連載の、おまけテキストです。

[javascriptで作るシューティングゲーム的な何か(1)](http://qiita.com/doxas/items/9debec7e1f0c19bc8daa)
[javascriptで作るシューティングゲーム的な何か(2)](http://qiita.com/doxas/items/08558890288779a0beaa)
[javascriptで作るシューティングゲーム的な何か(3)](http://qiita.com/doxas/items/2cfebe1610cee6ef8740)
[javascriptで作るシューティングゲーム的な何か(4)](http://qiita.com/doxas/items/3aede5613881dc0272ef)
[javascriptで作るシューティングゲーム的な何か(5)](http://qiita.com/doxas/items/f2bd193e23711781cc17)
[javascriptで作るシューティングゲーム的な何か(6)](http://qiita.com/doxas/items/72e58ee2f32708ddea0b)
[javascriptで作るシューティングゲーム的な何か(7)](http://qiita.com/doxas/items/bcb2a236abaeb29e4602)
[javascriptで作るシューティングゲーム的な何か(8)](http://qiita.com/doxas/items/caf47422419cddb03da9)
[javascriptで作るシューティングゲーム的な何か(9)](http://qiita.com/doxas/items/570aabbc3e5f57a3eb6a)
[javascriptで作るシューティングゲーム的な何か(最終回)](http://qiita.com/doxas/items/8a7cd33463d9f44849c3)


##書いてる人##
書いてる人は[doxas](https://twitter.com/h_doxas)という人です。
こんな[企画](http://wgld.org/o/jsstg/)もやってますので、少しでも javascript でシューティングゲームを作成することに興味がわいたら、ぜひ参加してください。待ってますよ！！

また、今回紹介するおまけについては中身を解説しませんので、知りたい人は個別に、気軽に質問してください。


#3D化する魔法をかけましょ#

今回はあくまでも、おまけです。
中身でなにをやってるのかは、先述の通り解説しません。

![sample_012.jpg](https://qiita-image-store.s3.amazonaws.com/0/39638/dc3534a1-bb32-f00c-d301-1a23be5d872b.jpeg)


前回の、最終回に付属したサンプルにいくつか簡単な修正を加えるだけで、なぜか描画結果が 3D によるレンダリング(WebGL)になるという謎技術をお届けします。

まず、index.html からは追加でふたつ、新たにライブラリを読み込むようにします。

```HTML:index.html
<!DOCTYPE html>
<html>
	<head>
		<script src="common.js"></script>
		<script src="character.js"></script>
		<script src="boss.js"></script>
		<script src="minMatrixb.js"></script>
		<script src="wgldCanvas2D.js"></script>
		<script src="main.js"></script>
		
		<style>canvas {border: 1px solid gray;}</style>
	</head>
	<body>
		<canvas id="screen"></canvas>
		<p id="info"></p>
	</body>
</html>
```

minMatrixb.js は、著者のサイトで配布している完全フリーライセンスの行列演算などを補助するライブラリです。wgld.org 内からダウンロードすることができます。
その下、wgldCanvas2D.js は今回の謎技術を支える **即席の** ライブラリなので、リファレンスはどこにもありませんが、要は canvas 周りのメソッド名をそのまま使えるようにしつつ、実際には裏で **怪しい黒魔術** を使うためのライブラリです。

##main.js 修正個所##

修正する箇所は多くありません。

canvas2d のコンテキストを初期化しているところを、以下のように修正します。

```js:main.js
// 2dコンテキスト
// ctx = screenCanvas.getContext('2d'); ← もともとはこうなってる
ctx = new WC2D(screenCanvas);
```

上記の一行を修正したら、あとはもともと`ctx.arc`となっていた部分、これはいくつかあると思いますが、その周辺をちょっとだけ変更します。
具体的には、`arc`メソッドが呼ばれるよりも前に、かならず`fillStyle`プロパティに値を設定するようにするだけです。
もともとの canvas2d の仕組みでは、本連載内でも解説したように、まずパスを設定して、色を設定して、まとめて描画、という流れでしたが、黒魔術を使う場合には先に色の指定をしてから`arc`を呼ぶようにします。


##ドローコールを追加する##

それと、黒魔術を使ったレンダリングを行うために、再帰する直前のあたりにドローコールのためのメソッドを呼び出す箇所を追記します。

```js:main.js
// 追記
ctx.draw();

// フラグにより再帰呼び出し
if(run){setTimeout(arguments.callee, fps);}
```

これだけです。修正個所はそんなに多くないですね。
簡単ですね。
これで、前回までのシューティングゲームがなぜか 3D になります。不思議ですね。

##注意点とサンプル##

今回の wgldCanvas2D.js ですが、汎用的なつくりにはなってません。
ライセンスはもちろんフリーですが、即席で作ったものなので参考にする程度にしておいてください。

あと、中身を見て理解するにはある程度 WebGL や OpenGL などの 3D のプログラミングに関する理解も必要だと思います。知りたい人は、調べるなり著者あてに問い合わせるなりしてみてください。

質問は随時受け付け中です！

[オンラインサンプル.11](http://wgld.org/o/jsstg/11/)は実際にこの謎の技術を体感できるサンプルです。WebGL 対応ブラウザで動作させることができると思います。

※Chrome for Android でも動いてました。
Rで度数分布なCSVからヒストグラムを得る

`rep` の存在をすっかり忘れるほどRから遠ざかっていたのでメモ。

***

以下のような度数分布的なCSVをもらった。
中身がこんな感じのファイルからヒストグラムを得たいらしい。

```bash
$ head freqency.csv
var,freq
0,22516
1,199
2,178
3,453
4,175
5,261
6,177
7,196
8,199
```

変数ごとの頻度がもうすでにあるのでそのまま `plot` してあげればいいと思いきや、

```bash
$ tail freqency.csv
7790,1
7779,1
3834194,1
7688,1
15450,1
38837,1
7726,1
7720,1
30848,1
23264,1
```

全然ソートされてない上に割と要素数も多い。
ソートぐらいだったら前処理としてやってあげてもよいのだけれどせっかくなので生データをそのまま使う方向で書いてみた。

```r
freq.vec <- function(csv, xs = 0, xe = 0) {
  # 与えられた度数分布のCSVからhist関数に与えるベクトルを取得する
  # 引数:
  #   csv: 1カラム目が変数、2カラム目が頻度となるCSVファイル
  #   xs, xe: それぞれ変数の下限と上限（与えなかった場合は変数の最小値と最大値を利用する）
  # 返り値:
  #   変数値が頻度の数だけ繰り返されたベクトル
  d <- read.csv(csv)
  vars <- d[[1]]
  xs <- ifelse(xs == 0, min(vars), xs)
  xe <- ifelse(xe == 0, max(vars), xe)
  d.ext <- d[vars >= xs & vars <= xe, ]
  rep(d.ext[[1]], d.ext[[2]])
}
```

今回は外れ値がとてつもなく多かったため変数の幅を狭めるようなことしたけどそうでもなければ
ぶっちゃけこんな関数書くほどでもなく普通に `rep` すればよいだけ。
実際使うとこんな感じ。

```r
> freq1 <- freq.vec("frequency.csv", xs = 1, xe = 1000)
> hist(freq1, col = "#0000ff40", border = "#0000ff", labels = T, breaks = 20)
```

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/34880/5ed34b16-c30e-bb50-e003-4415eadb242a.png)

`hist` で引数 `breaks` を調節することでいい感じに出力してくれるのはホントありがたいですね。
「アセンブリ参照が不足しています。」の解決方法

使いたいクラスがあるのに，自動で競合問題を解決してくれない！！
そんなときの解決方法．


メニュー＞プロジェクト＞参照の追加
＞フォームから追加したいアセンブリを検索＞OKボタン

使いたいクラスのアセンブリはmsdnなどで調べる．
MQTT の golang クライアントで TLS 接続を試す

# 概要

golang の MQTT クライアントを使って test.mosquitto.org に対して TLS での接続を試します。

認証を使う場合は TLS は必須なので、最低限の確認をしておきます。

# 準備

- 証明書を用意します。
    - http://test.mosquitto.org/ にダウンロードする URL が書いてあります。

```
$ curl -O http://test.mosquitto.org/ssl/mosquitto.org.crt
$ cat mosquitto.org.crt
-----BEGIN CERTIFICATE-----
MIIC8DCCAlmgAwIBAgIJAOD63PlXjJi8MA0GCSqGSIb3DQEBBQUAMIGQMQswCQYD
VQQGEwJHQjEXMBUGA1UECAwOVW5pdGVkIEtpbmdkb20xDjAMBgNVBAcMBURlcmJ5
MRIwEAYDVQQKDAlNb3NxdWl0dG8xCzAJBgNVBAsMAkNBMRYwFAYDVQQDDA1tb3Nx
dWl0dG8ub3JnMR8wHQYJKoZIhvcNAQkBFhByb2dlckBhdGNob28ub3JnMB4XDTEy
MDYyOTIyMTE1OVoXDTIyMDYyNzIyMTE1OVowgZAxCzAJBgNVBAYTAkdCMRcwFQYD
VQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwGA1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1v
c3F1aXR0bzELMAkGA1UECwwCQ0ExFjAUBgNVBAMMDW1vc3F1aXR0by5vcmcxHzAd
BgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hvby5vcmcwgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBAMYkLmX7SqOT/jJCZoQ1NWdCrr/pq47m3xxyXcI+FLEmwbE3R9vM
rE6sRbP2S89pfrCt7iuITXPKycpUcIU0mtcT1OqxGBV2lb6RaOT2gC5pxyGaFJ+h
A+GIbdYKO3JprPxSBoRponZJvDGEZuM3N7p3S/lRoi7G5wG5mvUmaE5RAgMBAAGj
UDBOMB0GA1UdDgQWBBTad2QneVztIPQzRRGj6ZHKqJTv5jAfBgNVHSMEGDAWgBTa
d2QneVztIPQzRRGj6ZHKqJTv5jAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA
A4GBAAqw1rK4NlRUCUBLhEFUQasjP7xfFqlVbE2cRy0Rs4o3KS0JwzQVBwG85xge
REyPOFdGdhBY2P1FNRy0MDr6xr+D2ZOwxs63dG1nnAnWZg7qwoLgpZ4fESPD3PkA
1ZgKJc2zbSQ9fCPxt2W3mdVav66c6fsb7els2W2Iz7gERJSX
-----END CERTIFICATE-----
```

# インストール

go getすればいいので特に必要ありません。

# コード

```
package main

import (
	"crypto/tls"
	"crypto/x509"
	"io/ioutil"
	"log"

	MQTT "git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git"
)

func GetCertPool(pemPath string) (*x509.CertPool, error) {
	certs := x509.NewCertPool()

	pemData, err := ioutil.ReadFile(pemPath)
	if err != nil {
		return nil, err
	}
	certs.AppendCertsFromPEM(pemData)
	return certs, nil
}

// Connect connects MQTT broker with tls
func Connect(brokerUri string, clientId string, crtFile string) (*MQTT.MqttClient, error) {
	opts := MQTT.NewClientOptions()

	opts.AddBroker(brokerUri)
	opts.SetClientId(clientId)

	certPool, err := GetCertPool(crtFile)
	if err != nil {
		return nil, err
	}
	tlsConfig := &tls.Config{
		RootCAs: certPool,
	}
	opts.SetTlsConfig(tlsConfig)

	client := MQTT.NewClient(opts)
	_, err = client.Start()
	if err != nil {
		return nil, err
	}
	return client, nil
}

// Publish publish message
func Publish(client *MQTT.MqttClient, topic string, payload []byte){
	mqttmsg := MQTT.NewMessage(payload)
	receipt := client.PublishMessage(topic, mqttmsg)
	<-receipt
}

func main() {
	cli, err := Connect("ssl://test.mosquitto.org:8883", "tlstest", "mosquitto.org.crt")
	if err != nil{
		log.Fatal(err)
	}
	Publish(cli, "/test/tls", []byte("test"))
}
```

# 解説

- Connectの時に"ssl://"を指定する
- SetTlsConfigでtlsConfigを設定する。
  - tsl.Configはgolangの標準なのでHTTPSなどと同じように使えます。

# 参考

- http://qiita.com/voluntas/items/76f013acdc42fb492b0c
gulp使いはじめる前にハマった

gulp使ってサイトつくろうと思ったんだけどうまく動かなかったのでメモ
ubuntu使ってるのでaptでnodejsとnpmをインストール

```
#nodejsをインストール
sudo aptitude install nodejs
#npmをインストール
sudo aptitude install npm
#gulpをグローバルにインストール
sudo npm install -g gulp
#gulpをローカルにインストール
npm install -save-dev gulp

#適当なgulpfile作って実行
gulp
```

ここでnodeが存在しないというエラーが出るのでgulp.jsを読んだところ、一行目に

```
#!/usr/bin/env node
```

との記述があった
モジュールを動かすために使ってるのが`nodejs`コマンドではなく`node`コマンドらしい
ここの`node`を`nodejs`に変えたら問題なく動いたので、とりあえずnodeからnodejsにシンボリックリンク貼ってるけど何かもっといい方法が知りたい
Surface Pro 3 の TypeCover3 で Windows ボタンを Fn 代わりにする方法（そして断念。。。）

##はじめに
すいません。この記事を参考にしてもうまくいきません。
失敗に至るまでの試行錯誤をまとめておきます。
あと、キー配列についてはあくまでの僕の主観ですので。。。

## Surface Pro 3 を買いました。
良いです。とってもキュートです。
たまに熱暴走するのかお茶目な挙動をすることもありますが、まぁかわいいですよ。
TypeCoverとかまじ全然キーボードですし。
メインマシンとしてばりばり使いますし、外付けマウスとかキーボードを繋いだりとか邪道なこともするつもりないです。

## だが、Fnキー。
お前はダメだ。Mac Book とかと同じなのかな、矢印キーの左にある。悲しい。
そうじゃないだろ、と。
Fnキーの位置は左Ctrlキーの右、ということでやっと世間的にも認知されてきたと思っていたんですが。。。
Fnキー＋矢印キーでHome、End、PgUp、PgDnってあんまり使わないのかしら。
Ctrl + Home、とかCtrl + Shift + End とかとっても便利なのに。

## AutoHotKey を使う。
しょうがないのでキー配列をいじってしまおう。
TypeCover のキーをべりっと付け替えるのは無理げな感じがするので、あとあとシールでも貼るとして。

方針としてはこんな感じ。
- 左Windowsキーを無変換キーに（使ってないし）
- 左AltキーをWindowsキーに
- 無変換キーをAltキーに
- 無変換 + 矢印キーでHome、End、PgUp、PgDnを実現

Windowsキーと無変換キーを入れ替えていっこずつずらしてあげた感じ。
やたー、できたよー。

## 転
Surfaceペンの頭クリックでOneNote起動、ダブルクリックでスクリーンキャプチャができるはずなんだけど、効かない。さらに、Surfaceの物理ボタン（Windowsボタン）も効かない。
左Windowsキーを無変換キーに割り当てなおしたため、効かなくなってしまったみたい（キーコードを飛ばしてるだけなんかい！）。
さすがにこれではSurface 3のうまみゼロ。残念。

## 方針2
Windowsキーの割り当てを変えるのは不可。ということで、左から Ctrl、Windowsキー、Windowsキー、Altキーが並ぶ変則的な形にしてみた。

```
LWin & Left::Send, {Blind}{Home}
LWin & Right::Send, {Blind}{End}
LWin & Up::Send, {Blind}{PgUp}
LWin & Down::Send, {Blind}{PgDn}
```

これが、なぜかWindowsキー＋←だけ効かない。しかもCtrl + Windowsキー + ←とかってすると効く。Key History をみても変なコードが飛んでるようには見えない。お手上げ。

## 結局
キーの割り当て変更はせずに、無変換キー + 矢印キーのホットキー設定だけ追加しました。

```
sc07B & Left::Send, {Blind}{Home}
sc07B & Right::Send, {Blind}{End}
sc07B & Up::Send, {Blind}{PgUp}
sc07B & Down::Send, {Blind}{PgDn}
```

これで慣れるしかないなー。

## 追記

Surface Pro 4 が発売されましたね。
しれっとキー配列が変わっていて、`Ctrl`、`Fn`、`Windows`、`Alt`の順になっています。これですよ僕が求めていたのは。それにしても、この件について言及している記事がまったくないのはどういうこと？打鍵感がどーのこーのといっていますが、キー配列の方が重要だと思うんだけどなぁ。
僕的には、これ買いです。Type Coverだけでも買おうかしら。
【Ruby】住所から都道府県を正規表現で取り出す【正規表現】

住所から都道府県を取り出したい時ってありますよね！

そういう時はコレで。

```rb
address.match(/.*[都道府県]/)
```

例えば苫小牧高専なら…

```rb
tnct_address = "北海道苫小牧市字錦岡443番地" #我らが苫小牧高専の住所！
tnct_prefecture = tnct_address.match(/.*[都道府県]/).to_s
#=> "北海道"
```

[都道府県] って感じでグループ化してやることによって、'都'、'道'、'府'、'県'どれかでで終わる文字列を検索することができます。
べんり。
WindowsVista以降でコマンドプロンプトからtelnetする


会社の方針から普段使っているPCがWIndowsXPからWindows7に移行して
ネットワークエンジニアが直面するコマンドプロンプトにtelnet無い問題。

![Win81_000238_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/3f3692da-b4ff-da14-0401-588bc1d438b7.png)

Windowsはこれからこれが標準になるらしく
Windows8でも有効になっていない。
どうもVista以降、サーバ系OSでは2008以降はtelnetクライアントは
インストールされていない模様。

コマンドプロンプトからtelnetを使用したい場合は
telnetクライアントの機能を有効にしてあげる必要がある。
ちなみに画像はWindows8.1。ほかのWindowsもたぶんだいたい同じだと思う。

-----

(1) コントロールパネルから「プログラムと機能」を選択

![Win81_000239_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/2b9f53bc-a8d3-8ec3-12c7-022fd6dd7991.png)

(2) 「Windowsの機能の有効化または無効化」を選択

![Win81_000240_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/2c428081-e9eb-f160-9335-3cac2676be27.png)

(3) 「Telnetクライアント」の項目にチェックを入れ、「OK」をクリック

![Win81_000241_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/55640dd7-1bf1-0384-bebb-bb717efd3fef.png)

(4) 必要な変更が完了しました、の表示を確認

![Win81_000243_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/2c4bb4fa-d143-1718-ca0e-46d83b025cff.png)

これでtelnetが使えます。

![Win81_000244_1.png](https://qiita-image-store.s3.amazonaws.com/0/45890/18a5ffc8-5879-5506-7673-5565ea0ee2b0.png)

まあ、NWエンジニアがteratermが入ってないPCを作業に
使っていることは考えづらいので大概代用は利きますが
有効にしておくに越したことはないかと思います。

-----

サーバ系OSは手順が違いらしいけど、持ってなかったので試せてない。
オフィシャルの情報はこちら。

http://technet.microsoft.com/ja-jp/library/cc771275(v=ws.10).aspx
ReViewで生成したPDFの目次の文字色を変える


ReViewについてくるreview-pdfmakerを使ってPDF生成を行うと、目次から各セクションにハイパーリンクが張られて便利です。
しかし目次の文字色が赤色になってしまうので、これをこのまま本文スミ指定で印刷所に持ち込むのにはちょっと勇気が入りました。

ReViewでは、PDF内のハイパーリンクの生成にはHyperrefというパッケージが使われています。
ですから、Hyperrefの設定をどこかでできれば良いことになります。

ReViewのconfig.ymlには、TeXのスタイルファイルを指定できる設定があります。サンプル等をそのまま使うと、"reviewmacro"という名前になっています。
Hyperrefのリンク文字色を設定するには、このファイルを編集します。

```config.yml
texstyle: reviewmacro
```

設定は非常に単純で、\hypersetupという関数を使い、その引数として、linkcolor=blackを渡すだけです。blackが嫌な場合も、colorパッケージで定義されている文字列にすればその色に変わります。

```tex
\hypersetup{%
linkcolor=black%
}%
```
Python3でのtwitter投稿など

#Python3でもtwitterを使いたい

tweepyがpython3.xでは使えなくなっている。
tweepy作者がもうお手上げしているので他のライブラリを使わないといけない。
ここではある程度メジャーだと思われる sixohsix氏のライブラリを使う
(bear氏メインのpython-twitterというのもあるようだが、どちらでも使用感は大差無さそうと判断しました)

#はじめに
https://apps.twitter.com/
にて、アプリの登録, consumer key , consumer secret keyなどは取得しておいて下さい。
これがないとそもそもtwitter apiは叩けないので。consumer key & consumer secret keyが何かは本稿では振れないです。

#インストール

```shell-session:install.sh
pip install twitter
```

#使い方
https://github.com/sixohsix/twitter
に書いてあることが本当に全部...全部なのだが、多分初心者には厳しい。


順番に説明する。
スクリプトで叩くのであれば、oauth tokenなどを拾ってくる必要がある筈。
コマンドラインなどでauth_tokenを拾ってくるための簡単なapiが用意されている。


```py3:token.py
import os
from twitter import *

#consumer key, consumer secret key from https://apps.twitter.com/
CONSUMER_KEY = "YOUR_CONSUMER_KEYAAAAAAAA"
CONSUMER_SECRET="YOUR_CONSUMER_SECRETAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

MY_TWITTER_CREDS = os.path.expanduser('~/.my_app_credentials')
if not os.path.exists(MY_TWITTER_CREDS):
    oauth_dance("My App Name", CONSUMER_KEY, CONSUMER_SECRET, MY_TWITTER_CREDS)

oauth_token, oauth_secret = read_token_file(MY_TWITTER_CREDS)

twitter = Twitter(auth=OAuth(oauth_token, oauth_secret, CONSUMER_KEY, CONSUMER_SECRET))

# Now work with Twitter
twitter.statuses.update(status='Hello, world!')
```

これで ~/.my_app_credintialsというファイルにtoken, secretが保存される。
ファイルがすでに存在していればファイルから読んでくるコードになっているので、これをおまじない程度に書いておけばとりあえずコマンドラインだとtoken取れる

##twitter apiへのアクセス
https://github.com/sixohsix/twitter#the-twitter-class
ここに全部書いてあるのだが,,,要は「Twitterクラスのinstanceを作成して、REST APIのurlに応じてそれっぽい変数名、関数名で叩けや!!」と書いてある。
ソースを読めばわかるのですが、作者の意図としては「だってそうとしか書きようがない」という事なので、決して不親切ではないです。

「...何を言っているのかわからないと()」と思った人にはもう少し詳しく書きます。
上記URLの参考例と、[REST APIの説明](https://developer.twitter.com/en/docs/api-reference-index)を見ながらこちらを読んで下さい。

###タイムラインの取得例
```py3:home_timeline.py
# Get your "home" timeline
t.statuses.home_timeline()
```
これで、 /statuses/home_timeline の結果が帰ってきます。

###埋め込み形式ステータスの取得
```py3:oembed.py
# to pass in the GET/POST parameter `id` you need to use `_id`
t.statuses.oembed(_id=1234567890)
```
これだと /statuses/oembedに idを渡した結果が帰ってきます。

###投稿するとき
```py3:updata.py
# Update your status
t.statuses.update(
    status="Using @sixohsix's sweet Python Twitter Tools.")
```
みんながやりたい投稿であればこんな感じ

#中身についての解説
内部処理としてはTwitterクラスのプロパティを取得しようとすると、 __getattr__ にて、中でmethodが走り、それぞれのプロパティはTwitterCallというclassのinstanceになっているため、 callableになっているので"()"をつければさらに __call__で定義されたmethodが走るようになっている。

__getattr__や__call__については[Dive Into Python3](http://diveintopython3-ja.rdy.jp/special-method-names.html)でも見てください。

apiに渡したい変数名は名前付きでそのまま渡せば良いようになってますが、"id"は予約語とかぶるために"_id"で指定するようになってます。

###応用例-screen_nameの取得
というわけで応用として

```py3:screen_name.py
print(twitter.account.settings()["screen_name"])
```

参考例には書いていないけど、自分のscreen_nameを取得するならこういう感じで取れる。

何故かと言うとREST APIに [account/settings](https://dev.twitter.com/docs/api/1.1/get/account/settings)というものがあり、戻りのjsonに screen_nameという変数があるから。

###応用例-block_listの取得

```py3:block_list.py
print(twitter.blocks.list())
```
こうすれば[/blocks/list](https://dev.twitter.com/docs/api/1.1/get/blocks/list)とかも取れる。


なので、このライブラリには「searchをするためにはこの関数を呼べ」「friends一覧を取るにはこの関数を呼べ」みたいな物がないのです。

伝わりました？
説明がわかりにくかったらもう少し詳しく書きます。
Swiftでファンシーなコードを書いてみた

Swiftでは、日本語や絵文字を含むほぼどんな文字でも変数名に使用可能です。
これを利用して、ファンシーなコードで簡単な占いアプリを作ってみました。

![スクリーンショット 2014-07-21 18.50.27.png](https://qiita-image-store.s3.amazonaws.com/0/35297/959354e2-7cdd-7943-3274-5ada992a95c5.png)

機種依存文字を使用しているため画像で表示します。

実用性はともかく、子供向け、あるいは入門用としてこういうコードを書くのもありかなと思います。

ただ、Swiftでは厳密に同じ型でないと四則演算ができないようで、型変換が少々面倒くさいですね。

ダウンロードは以下からどうぞ。
https://github.com/yukinaga/FortunetellingWithSwift

また、同じコードをObjective-Cでも書いてみました。比較のためにどうぞ。
https://github.com/yukinaga/FortunetellingWithObjC
[FuelPHP]ORMのwhere句を活用したModelのfind方法の工夫


#概要
1. ある条件に当てはまるイベント情報をviewに表示したい
2. 条件は"公開が許可されているか"、"期限範囲内か"、"特定のイベントタイプ"
3. この"特定のイベントタイプ"を複数にしたいときにどうするか

以下にORMモデルのコントローラーの例

```controllerファイル

$events = Model_Event::find("all",array(
	"related" => array("eventtype"),
		"where" => array(
			array("is_available","1"),
			array("is_public","1") ,
			array("event_type_id","3")
        ),
     'order_by' => array('orders' => 'asc'),
     ));

```


##方法　①foreachやfor文で処理

* 条件を自由に指定出来る
* ループ数が増えるほど読み込みが遅くなる
* コードの行数が多く分かり辛い

```controller①

$events = Model_Event::find("all",array(
	"related" => array("eventtype"),
		"where" => array(
			array("is_available","1"),
			array("is_public","1")
        ),
     'order_by' => array('orders' => 'asc'),
     ));

	//イベントIDが1のものを除外する処理
	foreach ($events as $key => $value) {
		if($events[$key]->event_type_id == 1) {
			unset($events[$key]);
		}
	}

```


##方法　②ORMマッピングのwhere句を活用（オススメ）
* 余計なコードを書かなくて済む
* 複雑な条件指定は出来なそう（まだ使い尽くしてないのでなんとも）

```controller②

$events = Model_Event::find("all",array(
	"related" => array("eventtype"),
		"where" => array(
			array("is_available","1"),
			array("is_public","1")
			array("event_type_id","3"),
			//指定したい別のIDを"or"で指定
			"or" => array("event_type_id","4"),
        ),
     'order_by' => array('orders' => 'asc'),
     ));

```
こちらのほうが見た目も条件も割とスマートですね。


##おまけ　全然条件を変えたいときは"or_where"なども使える
検索条件1と2を大きく変えたいときは

```controller②

$events = Model_Event::find("all",array(
	"related" => array("eventtype"),
		"where" => array(
			array("is_available","1"),
			array("is_public","1")
			array("event_type_id","3"),
        ),
		"or_where" => array(
			//ここに条件を記載
		),
     'order_by' => array('orders' => 'asc'),
     ));

```

みたいな書き方も出来るみたいです。
リファレンスはこの辺。

[公式リファレンス]

[fuelPHPのOrm Modelでfindするときのwhere句の書き方]

[fuelPHPのOrm Modelでfindするときのwhere句の書き方]:http://yskmanabe.blogspot.jp/2013/02/fuelphporm-modelfindwhere.html

[公式リファレンス]:http://fuelphp.jp/docs/1.7/packages/orm/crud.html
avahiとmDNS

# Linuxで[hogehoge.local]の名前解決を可能にする

##Avahaiのインストール
※CentOSなどではディフォルトでインストールされている

```bash:コマンド
yum install avahi avahi-tools
```

##ファイアウォール(iptables)を開放する

```bash:/etc/sysconfig/iptables
-A INPUT -p udp --dport 5353 -j ACCEPT　#追記
```

[LinuxからmDNSで名前解決(正引き)をするには「nss-mdns」が必要](http://ameblo.jp/hetarelog/entry-10373389519.html)


```bash:コマンド
yum install nss-mdns
```


##名前解決の優先順位を変更する

```bash:/etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
```


## 動作確認
```bash:コマンド
ping hogehoge.local
PING hogehoge.local (192.168.100.53) 56(84) bytes of data.
64 bytes from hogehoge.local (192.168.100.53): icmp_seq=1 ttl=64 time=0.229 ms
64 bytes from hogehoge.local (192.168.100.53): icmp_seq=2 ttl=64 time=0.272 ms
```
[JAWS-UG CLI] OSX Mavericks(v10.9)上でAWS CLI環境を整備する

AWS CLIハンズオンのための環境構築手順(OSX Mavericks版)です。
適宜更新していきます。


# 前提条件

* [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。



# 1. AWS CLIのインストール

## PIPのインストール

```bash:コマンド:
sudo easy_install pip
```

note::

  今どきは http://pip.readthedocs.org/en/latest/installing.html らしい。

```bash:コマンド:
sudo python get-pip.py
```


## AWS CLIのインストール

```bash:コマンド:
sudo pip install awscli
```


参考: http://aws.amazon.com/jp/cli/


## バージョン確認

```bash:コマンド:
aws --version
```


```text:結果:
aws-cli/1.3.23 Python/2.6.9 Linux/3.10.42-52.145.amzn1.x86_64
```



## 参考: AWS CLIのアップグレード

AWS CLIはバージョンアップが頻繁に行なわれるので、更新方法は覚えておきましょう。

```bash:コマンド:
sudo pip install -U awscli
```



## 参考: AWS CLIのデグレード

1.3.16に戻す例:

```bash:コマンド:
AWS_CLI_VERSION=1.3.16
sudo pip install awscli==${AWS_CLI_VERSION}
```

# 2. npmのインストール

JSON Lintをインストールするために、npmコマンドを導入しておく必要があります。


```bash:コマンド(MacPortsの場合):
sudo /opt/local/bin/port selfup
sudo /opt/local/bin/port install npm
```

バイナリダウンロード: https://nodejs.org/en/download/


# 3. JSON Lintのインストール

JSONフォーマットが壊れていないかどうか確認できます。JAWS-UG CLI必須のツール。

http://qiita.com/tt2004d/items/2ea1af8bfd324585dd07

```bash:コマンド
sudo npm install -g jsonlint
```

gオプションは、システム全体共有のディレクトリにインストールすることを指示します。(デフォルトはカレントプロジェクトのディレクトリ)

```text:結果:
/opt/local/bin/jsonlint -> /opt/local/lib/node_modules/jsonlint/lib/cli.js
jsonlint@1.6.2 /opt/local/lib/node_modules/jsonlint
├── JSV@4.0.2
```

### jsonlintコマンドのテスト (正常サンプル)

```bash:コマンド:
echo '{"key":"value"}' | jsonlint 
```

```text:結果:
{
  "key": "value"
}
```

### jsonlintコマンドのテスト (異常サンプル)

```bash:コマンド:
echo '{"key"}' | jsonlint 
```

```text:結果:
[Error: Parse error on line 1:
{"key"}
------^
Expecting ':', got '}']
```


# 完了
爆速テンプレートエンジンなECT ＆ express4をよく使うのでひな形をGithub公開してみた。


ectを使ってexpress開発することが多いけどexpressジェネレーターでectテンプレートの生成が直接出来ないのでひな形を用意しました。(割と自分用)

https://github.com/n0bisuke/ex4ect

こうするといい! とかプルリクとか貰えると喜びます。使い方はreadme or ↓に書いてあります。
ectを最初から使いたいけど若干めんどいって思ってる人向けですね。

#経緯など
##expressコマンドでひな形作る時にectオプションが無い問題
[公式wiki](https://github.com/visionmedia/express/wiki#template-engines)でオプションを見るとectは無いみたいです。
なので、とりあえずectテンプレートでひな形を作ってからectに変更します。

##ect

この記事や公式ページを見ると分かるけど、他のテンプレートエンジンに比べて爆速かつ、書き方もejsとほぼほぼ変わらないのでオススメです。

* [Node.js - 【爆速テンプレートエンジン】Express3 以降で layout.ejs が使えなくなった代わりに ECT - Qiita - ](http://go.shr.lc/1jQfkwi)
* [ectの公式ページ](http://ectjs.com/)

##express4
* 3系からバージョンアップして結構構成が変わってるイメージ
* 3系からデフォルトのテンプレートエンジンはjade
* 2系のときはejsだった気がする
* ↑のリンクではいづれもexpress3系 (やってみたら4系でも3系でも導入手順は同じだったけど←)

#使い方
基本的にcloneしてnpm installするいつもの流れです。

任意ですが、packege.jsonとbin/wwwにex4ectの名前が残ってるところを任意のアプリ名に変更した方が良いとも思います。

```
$ git clone git@github.com:n0bisuke/ex4ect.git
$ cd ex4ect

$ vim package.json
L2 "name": "ex4ect",
↓
L2 "name": "myappname",

$ vim .bin/www

L2 var debug = require('debug')('ex4ect');
↓
L2 var debug = require('debug')('myappname');

$ npm install

$ DEBUG=myappname ./bin/www
  myappname Express server listening on port 4444 +0ms
```

#おまけ 実際に作業した手順
すぐ使いたい人は読み飛ばしましょう。
##app.jsの変更
###express4ひな形作成

```
$ express -e test
$ cd test
$ npm install
$ npm install ect --save
$ npm uninstall ejs --save
```

###2行追加
```
var ECT = require('ect');
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext : '.ect' });
```

###2行編集
```
app.engine('ect', ectRenderer.render);
app.set('view engine', 'ect');
```

###まとめるとこんな感じに

```app.js
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var ECT = require('ect'); //追加
var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext : '.ect' }); //追加

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
// app.set('views', path.join(__dirname, 'views')); 削除
// app.set('view engine', 'ejs'); 削除
app.engine('ect', ectRenderer.render);
app.set('view engine', 'ect');
/*... 以下省略*/
```

##ビューファイル変更
###下準備
* views/error.ejs
* views/index.ejs

という二つのファイルがデフォルトで出来てると思います。

* viwes/error.ect
* viwes/index.ect

に拡張子変更します。
更に共通レイアウトを分離するためにlayout.ectというファイルも新規で作りましょう。

* views/layout.ect

###ファイルを編集
ejsでは`<%= title %>`という形でしたが、ectでは@を変数に付けて、`<%= @title %>`という形になります。

```index.ect
<% extend 'layout' %>
<h1><%= @title %><h1>
<p>Welcome to <%= @title %> by ECT</p>
```

```layout.ect
<!DOCTYPE html>
<html>
  <head>
    <title>Express4 + ECT</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
  <% content %>
  </body>
</html>
```

```error.ect
<h1><%= @message %></h1>
<h2><%= @error.status %></h2>
<pre><%= @error.stack %></pre>
```