Let Me Be Me

大道無門千差有路。透得此關乾坤獨歩。

Packer, Docker, Veewee, Vagrant, Chef...

今更ながら、この辺の仮想環境を構築したり、コンフィギュレーションを行うツールが多すぎてよくわからなくなってきたので、なげやりな感じでまとめてみる。

Vagrant

f:id:junsumida:20140414001758j:plain

言わずと知れたVagrant。2010年、Mitchell Hashimoto氏によってスタートした。*1 最初の頃は、VirtualBoxCLIインターフェースという感じだったが、最近はVmware, AWSもサポートしてる。*2 Disposableな開発環境を提供してくれる。

Packer

f:id:junsumida:20140414000214j:plain

Vagrantの作者のMitchell Hashimoto氏が作成した、単一のconfigurationファイルで複数のプラットフォーム向けに同一のイメージを作成することを目的としたツール。*3 Vagrant向けの機能は実装されているが、Vagrantとは完全に独立している。*4 Vagrant上に構築した開発環境とAWS環境上に用意したStaging, Production環境を限りなく同一に近づける、みたいなことができる。

Veewee

jedi4ever氏による、VM用イメージ作成ツール。Vagrantだけでなく、VMWare, KVMなどに対応している。各Linuxディストリビューションが配布しているイメージを使用して、ゼロからVMイメージを作成/設定することができる。publicで配布されているVagrant boxをそのまま使うのが信用できない場合に使う。*5 (個人で作成して公開しているboxなんかは怖くてよく使えるなあと思ってしまう。)


Docker

f:id:junsumida:20140414003412j:plain

LXCの低レイヤなkernelの機能の土台の上に、Dockerは、いくつものパワフルな高レイヤのツールを提供している。 On top of this low-level foundation of kernel features, Docker offers a high-level tool with several powerful functionalities: What does Docker add to just plain LXC? - Stack Overflow

f:id:junsumida:20140414004615j:plain

コンテナと呼ばれるsandbox環境をHost OS上に作って、その中でアプリケーションを動かすことができる。*6 0.9.0でlibcontainerがデフォルトのdriverになり、LXC依存ではなくなった。*5

Vagrantで構築したVM上でDocker使うこともできる。Dockerの設定は、通常Dockerfileという設定ファイルで行う*7が、Packerを使うと、Dockerfileを使わずにprovisioningを行うことができる。つまり、Chefのようなツールを使ってDockerの環境を構築することができる。*8

Puppet vs. Chef vs. Ansible vs. Salt

configuration & orchestration tools まともに使ったことがあるのが、Chefだけなので、違いが全然わかってないのだけど、PuppetとChefは開発者向け。AnsibleとSaltはシステム管理者向けらしい。Review: Puppet vs. Chef vs. Ansible vs. Salt | Data Center - InfoWorld

この辺、気が向いたらちゃんと書く。

XubuntuにDockerを入れる

基本的にはDockerをインストールする - Qiitaの記事に書かれているとおりに進める。

sudo apt-get install libssl-dev curl
mkdir .rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 2.1.0
rbenv global 2.1.0
rbenv rehash

curl -s https://get.docker.io/ubuntu/ | sudo sh

xubuntuでのsambaの設定

前回Xubnutuを入れたけど、当初の目的はSambaNAS化することだったので、ようやくそれをやった。

基本的に、Samba/SambaServerGuide - Community Help Wikiの通りにやれば何も問題ない。そんなことより、デフォルトでVimが入ってないことに驚いた...。

sudo apt-get update
sudo apt-get install samba vim
service samba status
# smbd, nmbdが走っていればOK

sudo vim /etc/samba/smb.conf
# [homes]の直下のコメントを解除して、`readonly = no`も解除する

# Samba用のユーザーを追加する
sudo adduser sharedfiles
sudo smbpasswd -a sharedfiles
sudo service samba reload

windows側に戻って、[マイコンピュータ] => [ネットワークドライブの追加]を選択、\\192.168.xxx.xxx\sharedfilesを設定すればOK

Xubuntuを入れて、VNCで使う

 自宅のNAS用途の物理サーバーにCUIだけのfedoraを入れていたのだけれど、GUI用途で使いたくなったので、気まぐれにXubuntuを入れた。

Xubuntuのインストール

 まず、xubuntuの公式サイトからisoを取ってきて、次にImage Writerを落としてきた。(インストーラ不要なのが良い。)

 Image WriterでUSBメモリにイメージを焼いてインストール。インストール自体は、順調に終わったので問題なし、ただ言語設定を英語にしたせいか、日本語がUIに表示されず、歯抜けになっているのが気持ち悪い。(あとで置き換えればよさそう)

 あと、マウスが無かったので、Xubuntuのメインメニューを開くalt+F1ショートカットが地味に役に立つ。

VNC Server (Vino) の設定

 次にVNC Serverを入れる。Ubuntu(系?)にはvinoというやつが入ってるらしい。

sudo apt-get install vino
vino-preferences

 vinoの設定を開いたら、Allow other users to view your desktopAllow other users to control your desktopのチェックを入れ、You must confirm each access to this machineのチェックを外す。

 [Settings Manager] => [Session and Startup] => [Application Autostart]から新規で追加し、/usr/lib/vino/vino-serverを設定してやると、起動時にvinoが立ち上がるようになる。

VNC Client (RealVNC) の設定

 これが定番なのかイマイチわからなかったのだけれど、クライアントにはRealVNCを使った。接続先を192.168.xxx.xxx:0のように自分のサーバーへの接続先を指定するとつながる。コロンの後は、port番号ではなく、セッション番号的なやつ。

 繋ぐとこんな感じに表示される、1GB程度しかRAMを使ってないので、すこぶる快適な感じ。

f:id:junsumida:20140407001207j:plain

※この設定で外からアクセスしちゃだめだよ ><

[追記:2014-04-21]

Ubuntu 14.04 LTSにアップデートしたらUnable to connect to VNC Server using your chosen security setting. Either upgrade VNC Server to a more recent version from RealVNC, or select a weaker level of encryption.と言われるようになってしまったので、解決策を探っていたら、見つかった。

server側でencryptionが有効になっているのが原因らしいのでオフにした。LAN内で使用しているので、特に問題ない。

gsettings set org.gnome.Vino require-encryption false https://bbs.archlinux.org/viewtopic.php?id=165952

References

Ruby Style Guideの Prefer hogehoge over mogemoge

bbatsov/rubocop · GitHubという、rubyのコードがコミュ二ティベースのコーディングガイドラインに従っているかどうかをチェックできるツールがあります。

その中で、

Prefer reduce over inject.

という指摘があって、どうしてinjectは駄目でreduceは良いのかわからなかったのですが、

上記のコーディングガイドラインによると、

Prefer map over collect, find over detect, select over find_all, reduce over inject and size over length. This is not a hard requirement; if the use of the alias enhances readability, it's ok to use it. The rhyming methods are inherited from Smalltalk and are not common in other programming languages. The reason the use of select is encouraged over find_all is that it goes together nicely with reject and its name is pretty self-explanatory.

ということらしいです。

 つまり、collect, detectやinjectなどはsmalltalk由来のメソッドで、他の言語ではあまりメジャーなメソッド名ではないから、reduceを使えってことなんですかね。ここで終わっても良かったのですいが、気になったので全部調べようと思ったら、全部wikipediaに載ってましたね...。

Fold (higher-order function) - Wikipedia, the free encyclopedia

(foldrが無い言語もあるので、foldlだけ。reduceとかfoldとか入ってれば全部カウントしてる。重複有。)

fold 13 reduce 11 inject 3

 ということで、foldとreduceがメジャーなようですね。