cyg-fastの紹介とknife soloの実行環境の作り方

apt-cygの代わりとなるcyg-fastを紹介しようと思います。それだけでは寂しいので、knife soloの実行環境を作り、vagrantと一緒に使って遊んでみることを目標にしていろいろ書いてみます。

# cyg-fastの導入

cygwinで遊んでいて何かをインストールしたい！と思ったときにsetup.exeを使うのは面倒なのでapt-cygを導入しましょう。ということを[以前](http://qiita.com/d9magai@github/items/b988f4c881cfa1261512)に書きましたが、apt-cygを改良したcyg-fastというものがありますので今度からはこちらを使うようにしましょう。
どういった部分が良くなったのかは[こちら](http://lambdalice.blogspot.jp/2014/05/apt-cyg-2.html)に詳しく書いてあります。
fastという名前からわかる通り速くなっているようですね。

## 導入方法

* wget
* aria2

以上をsetup.exeでいれます。

```
wget https://raw.githubusercontent.com/lambdalice/cyg-fast/master/cyg-fast -P /usr/bin
chmod +x /usr/bin/cyg-fast
cyg-fast -m ftp://ftp.iij.ad.jp/pub/cygwin/ update
```

ミラーサイトを国内のサーバにしておきます。

# knife-soloをインストールするまでの長い道のり

knife soloの実行環境にはrubyが必要です。rbenvを使って入れます。

## 必要そうなものをインストール

その前に、要らないのも混じってるかもしれないですが必要そうなものをまとめて入れてしまいます。

```
cyg-fast install gcc-core gcc-g++ make zlib-devel autoconf libiconv-devel libiconv-devel rsync patch openssh openssl-devel libxml2-devel libxslt-devel libffi-devel libgdbm-devel
```

## rubyのインストール

それではrubyをインストールしましょう。

```
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
```
rubyは2.1.0を入れます。私がやってみたときは1.9.0～2.2.0-devまでいろいろ試してはみましたが、2.1.0ならトラブルもなく行けました。ただ、別のバージョンでもいけるのかもしれないです。
インストール後はgem updateもします。

```
rbenv install 2.1.0
rbenv global 2.1.0
rbenv rehash
gem update
```

このへんは時間がかかりますので珈琲でも飲みながら待ちましょう。

## --no-ri --no-rdocをデフォルトに

私はgem installするときは、ドキュメントいらないので--no-ri --no-rdocを付けるようにしてます。ですが、たまに付け忘れてドキュメントのインストールがはじまってぐはぁってなります。なので、gemrcを設定して--no-ri --no-rdocをデフォルトにします。
`echo 'gem: --no-ri --no-rdoc' > ~/.gemrc`

# dep-selector-libgecodeをgem install

いくつか難所があるのですが、まずはこいつです。
http://qiita.com/yositani2002/items/6e9b765452676a40a2ef
http://qiita.com/DQNEO/items/207a2e7f6f32e8cc2f7f
こちらを参考にして入れました。

手順をまとめるとこんな感じです。以下はコピペです。

```
# gcc48.exe, g++48.exeという名前のシムリンクを作成
ln -s gcc.exe /usr/bin/gcc48.exe
ln -s g++.exe /usr/bin/g++48.exe

# gecode 3.7.3 を取得して解凍
wget "http://pkgs.fedoraproject.org/repo/pkgs/gecode/gecode-3.7.3.tar.gz/7a5cb9945e0bb48f222992f2106130ac/gecode-3.7.3.tar.gz"
tar xvfz gecode-3.7.3.tar.gz
cd gecode-3.7.3

# コンパイル
./configure CC="gcc48"  --disable-doc-dot --disable-doc-search --disable-doc-tagfile --disable-doc-chm --disable-doc-docset --disable-qt --disable-examples --disable-flatzinc
make -j4
make install
# ライブラリを手動で配置
cp libgecode* /lib/
cp -r gecode/* /usr/include/

# dep-selector-libgecodeのインストール
USE_SYSTEM_GECODE=1 gem install dep-selector-libgecode
```


# ffiをgem install

次の難所はffiです。
https://github.com/ffi/ffi/issues/284#issuecomment-33752957
http://qiita.com/DQNEO/items/207a2e7f6f32e8cc2f7f

こちらを参考にして入れました。

```
cyg-fast install libffi6 libffi-devel pkg-config
export PKG_CONFIG_PATH="/lib/pkgconfig"
gem install ffi
```


# nokogiriをgem install

その次の難所がこいつです。難所と言ってもgem install nokogiriで入るのですが、インストール時にこんなメッセージが表示され、とても時間がかかってしまいます。

```
Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following patches applied:
        - 0001-Fix-parser-local-buffers-size-problems.patch
        - 0002-Fix-entities-local-buffers-size-problems.patch
        - 0003-Fix-an-error-in-previous-commit.patch
        - 0004-Fix-potential-out-of-bound-access.patch
        - 0005-Detect-excessive-entities-expansion-upon-replacement.patch
        - 0006-Do-not-fetch-external-parsed-entities.patch
        - 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
        - 0008-Improve-handling-of-xmlStopParser.patch
        - 0009-Fix-a-couple-of-return-without-value.patch
        - 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
        - 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxml2.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

However, note that nokogiri does not necessarily support all versions
of libxml2.

For example, libxml2-2.9.0 and higher are currently known to be broken
and thus unsupported by nokogiri, due to compatibility problems and
XPath optimization bugs.
************************************************************************
Building libxslt-1.1.28 for nokogiri with the following patches applied:
        - 0001-Adding-doc-update-related-to-1.1.28.patch
        - 0002-Fix-a-couple-of-places-where-f-printf-parameters-wer.patch
        - 0003-Initialize-pseudo-random-number-generator-with-curre.patch
        - 0004-EXSLT-function-str-replace-is-broken-as-is.patch
        - 0006-Fix-str-padding-to-work-with-UTF-8-strings.patch
        - 0007-Separate-function-for-predicate-matching-in-patterns.patch
        - 0008-Fix-direct-pattern-matching.patch
        - 0009-Fix-certain-patterns-with-predicates.patch
        - 0010-Fix-handling-of-UTF-8-strings-in-EXSLT-crypto-module.patch
        - 0013-Memory-leak-in-xsltCompileIdKeyPattern-error-path.patch
        - 0014-Fix-for-bug-436589.patch
        - 0015-Fix-mkdir-for-mingw.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxslt.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install
************************************************************************
```

installに時間がかかる理由ですが、nokogiriはlibxml2,libxsltを同梱して、環境に合わせてビルドするからです。なので、gem install nokogiriの時にライブラリが無いため止まってしまう、ということは起きません。
このライブラリのビルドを回避するためには以下のコマンドでいけます。

```
gem install nokogiri -- --use-system-libraries
```

ですが、最新のlibxml2にはバグがあるため、これを回避するためにgem install時にlibxmlバージョン2.8.0をビルドするようにしているみたいなんですね。
https://github.com/sparklemotion/nokogiri/issues/829

なので素直にgem innstall nokogiriのときには、--use-system-librariesは付けずに、libxml 2.8.0をビルドしてもらったほうがいいのかもしれません。紅茶でも飲みながら待ちましょう。

# bundlerをインストール

以上3つを入れたら満を持してbundlerをインストールします。

```
gem install bundler
rbenv rehash
```

# knife-soloをインストール

knife-soloにはサブモジュールが含まれていますので、--recursiveをつけて一緒にcloneします。その前にgettextをインストールしておきましょう。

## knife-soloリポジトリのclone

```
cyg-fast install gettext 
git clone --recursive git@github.com:matschaffer/knife-solo.git 
```

gettextがないと、以下のようなエラーが出てサブモジュールのcloneに失敗してしますので気を付けましょう。

```
/usr/lib/git-core/git.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory
```

## knife-soloをビルドしてインストール

```
cd knife-solo
bundle && bundle exec rake install
rbenv rehash
```

この辺も時間がかかりますのでドクターペッパーでも飲みながら待ちましょう。

# できた!

```
% knife -v
Chef: 11.6.2
```

長かった・・・。かかった時間はだいたい2時間かそれくらいでしょうか。
最初に立てた目標がまだ達成できないですが、さすがに長くなったのでここで一度切ろうと思います。