Monday, September 22, 2014

Vim環境設定中

Unite の細々した設定

tabの作成をショートカット登録中。悩むな。

  • ss 画面を横分割
  • sv 画面を縦分割
  • ,ub unite bufferを開く
  • ,ud unite fileを開く
  • ,uf unite refisterを開く

vim-ref

vim上で各種言語のリファレンスを参照できるとな?

これ調べてたらいつの間にかjdei-vim。また後日。

jdei-vim

Python用のリファレンスライブラリ及び補完機能を提供する。

今使っているKaoriyaさんのVimはPython2python3両方使えるようになっている。これに関係するか分からないけど、インストール後にvim hello.pyとすると謎のエラーで落ち続けて涙目になった。

エラー:

  1. No module named site と言われて落ちる
  2. site.pyを実行しようとして落ちる

原因:

  • 1.は環境変数PYTHONPATHを適切に設定していないから。なりふり構わず以下のようにしたら通った。
PYTHONPATH=C:\Python34;C:\Python34\Lib;C:\Python34\DLLs;C:\Python34\libs;

要らないパスもあると思う。

  • 2.はjdei-vimのデフォルトの設定がpython2を見にいくため。インストールしていないpython2を使ってpython3で書かれたライブラリを実行しようとするからこける、って事なんだと思う。

.vimrcにこの一行を書けば直る。

let g:jedi#force_py_version = 3

たったこれだけのために1時間近くかかった。要領悪いなぁorz。

テキストブラウザ

Lynxw3mの2つがあるらしい。ちょっと調べた感じ

  • w3m … 日本人作者, 細かな便利機能豊富, 正式版がない. 2011年最終更新.
  • Lynx … 多分デファクト. インストール楽, 2007年が最終更新か…

という状況。どっち入れるかな。どっちもかな。

Written with StackEdit.

Friday, September 12, 2014

Eucalyputus

2014/09/12(金)にHPが買収すると発表したので知った。OSS版プライベートクラウドの古参っぽい何か。
HPはEucalyptusの社長さんをクラウド部門のトップにするとか。

サイト: https://www.eucalyptus.com

ちょっと調べてみたら、これ、Open Stackと同じIaaSに分類されるのかな。ただしOpen Stackに比べると構造がずっとシンプル。その分、インストールも楽そう。(CentOS 6.5 minimize上でcurlコマンド打つだけと公式サイトでは言っている)

だけどもOpen Stackのインターフェースが標準になりそうな今、魅力は少し薄いな…。その辺の余ったPCをかき集めて簡単なクラスタを作るくらいはできそうだが。

参考情報: http://www.slideshare.net/daisukekikuchi906/eucalyptus-23505115

  • Amazon EC2, Amazon S3互換らしい。
  • 動作環境はZenKVM

メモ

SCALRとかいう名前で複数のIaaS(Public/Private)をGUIで操作できるアプリケーションをAXLBITとかいう日本の?会社が出してるなー。みんな考えることは同じか…この辺は芽がなさそうorz

Written with StackEdit.

Monday, September 8, 2014

proxy環境下でcoreos

はまると涙目になるので一応メモ。

proxy環境下でcoreos、更にはdockerを使おうとすると、docker hub (repository)に既存のイメージー例えばredisーを取りにいくところで間違いなく失敗する。

gituhubで公開されているプログラムは、親切な人だとREADME.mdにUsage under proxyみたいな感じで対応を書いてくれるんだけど、正直あまり期待できない。外人さんたちは、あんまりproxyの下にはいないのかね。

愚痴はこれまでにしてproxyを突破する方法。

proxy回避方法

docker.serviceははじめからにcoreosに組み込まれていて、こいつの設定ファイルは以下の場所にある。

/usr/lib64/systemd/system/docker.service
## 中身 ##
Unit]
Description=Docker Application Container Engine 
Documentation=http://docs.docker.io
Requires=docker.socket

[Service]
Environment="TMPDIR=/var/tmp/"
ExecStartPre=/bin/mount --make-rprivate /
LimitNOFILE=1048576
LimitNPROC=1048576
# Run docker but don't have docker automatically restart
# containers. This is a job for systemd and unit files.
ExecStart=/usr/bin/docker -d -s=btrfs -r=false -H fd://

[Install]
WantedBy=multi-user.target

当然ながらproxyなんか考慮しているはずもない。ので、/etc/systemd/system/の下にこのdocker.serviceをコピーして、proxyの設定を付け加える。幸い、coreos(systemd)さんは/etc/systemd/system/の下に同名の.serviceファイルがあると、こっちを優先してくれる模様。

さあ、[Service]の直下に以下の呪文を書き足すのです。

Environment="http_proxy=http://proxy.xxx.yyy.com:1234"

なんだかなあ…。

Written with StackEdit.

kubernetesとcoreos (船頭を連れてくる)

前回、vagrant x virtualboxの上でcoreos x 2を連結することに成功したので、今回はcore-01のほうにkubernetesをインストールしてみる。(本来ならkubernetesにcore-02もデプロイ先として認識させる必要があると思う。)

参考にしたのはcoreos本家サイトのkubernetsインストール手順part1

インストール

基本はサイトに書いてある通りでいいんだけど、微妙にタイポ?してるっぽいから改めて書き出す。

core@core-01 ~ $ sudo mkdir -p /opt/kubernetes
core@core-01 ~ $ sudo mkdir -p /opt/bin
core@core-01 ~ $ sudo chown -R core: /opt/kubernetes
core@core-01 ~ $ sudo chown -R core: /opt/bin
core@core-01 ~ $ cd /opt/kuberbetes

そんでもってkubernetsのバイナリを取得、/opt/binの下に置く。

core@core-01 /opt/kubernates $ wget https://github.com/kelseyhightower/kubernetes-coreos/releases/download/v0.0.1/kubernetes-coreos.tar.gz
...(snip)...
core@core-01 /opt/kubernates $ cd ../  
core@core-01 /opt $ tar -C bin/ -xvf kubernates/kubernetes-coreos.tar.gz
apiserver
controller-manager
kubecfg
kubelet
proxy

続いてunitの設定ファイルをgithubから引っ張ってくる。unitsディレクトリの中から必要なserviceファイルだけ/etc/systemd/system/ディレクトリ下にコピー。今回はdocker.serviceはコピーしない。動かなくなる。

core@core-01 /opt $ cd kubernates/
kubernetes-coreos.tar.gz
core@core-01 /opt/kubernates $ git clone https://github.com/kelseyhightower/kubernetes-coreos.git
...(snip)...
core@core-01 /opt/kubernates $ sudo cp kubernetes-coreos/units/apiserver.service /etc/systemd/system/
core@core-01 /opt/kubernates $ sudo cp kubernetes-coreos/units/controller-manager.service /etc/systemd/system/
core@core-01 /opt/kubernates $ sudo cp kubernetes-coreos/units/kubelet.service /etc/systemd/system/
core@core-01 /opt/kubernates $ sudo cp kubernetes-coreos/units/proxy.service /etc/systemd/system/

更にcontroller-manager.serviceがそのままで動かないので、手を加える。

変更箇所のみ抜粋。

ExecStart=/opt/bin/controller-manager \
-etcd_servers http://127.0.0.1:4001 \
-master 127.0.0.1:8080 \
--logtostderr=true

etcd_serversの設定はとりあえず動けばいいと割り切り中。もしかしたらこれhttp://172.17.8.1:4001(ホストマシン)にすべきかもしれない。

ここで一応、etcdサービス、dockerサービスの状態を確認。

core@core-01 /opt/kubernates $ sudo systemctl status etcd
 etcd.service - etcd
   Loaded: loaded (/usr/lib64/systemd/system/etcd.service; disabled)
  Drop-In: /run/systemd/system/etcd.service.d
           └─20-cloudinit.conf
   Active: active (running) since Mon 2014-09-08 11:05:07 UTC; 15min ago
 Main PID: 554 (etcd)
 ...(snip)...
 core@core-01 /opt/kubernates $ sudo systemctl status docker
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib64/systemd/system/docker.service; disabled)
   Active: inactive (dead)
     Docs: http://docs.docker.io

よし、動いているぞ。先ほどコピーしたkubernetesのサービスを順次起動していく。

core@core-01 /opt/kubernates $ sudo systemctl daemon-reload
core@core-01 /opt/kubernates $ sudo systemctl start apiserver
core@core-01 /opt/kubernates $ sudo systemctl start controller-manager
core@core-01 /opt/kubernates $ sudo systemctl start kubelet
core@core-01 /opt/kubernates $ sudo systemctl start controller-proxy

各サービスのステータスを確認。

core@core-01 /opt/kubernates $ sudo systemctl status apiserver
core@core-01 /opt/kubernates $ sudo systemctl status controller-manager
core@core-01 /opt/kubernates $ sudo systemctl status kubelet
core@core-01 /opt/kubernates $ sudo systemctl status controller-proxy

全部「Active: active (running)」にはなった。

それではさっそくredisのサービスを立ち上げちゃうんだからね!

core@core-01 /opt/kubernates $ mkdir kubernetes-coreos/pods
core@core-01 /opt/kubernates $ vim kubernetes-coreos/pods/redis.json
# redis.jsonをコピペ
core@core-01 /opt/kubernates $ kubecfg -h http://127.0.0.1:8080 -c kubernetes-coreos/pods/redis.json create /pods

Name                Image(s)            Host                Labels
----------          ----------          ----------          ----------
redis               dockerfile/redis    /                   name=redis

redis.jsonは公式サイトの例をまるまるコピー。dockerへのデプロイが終わるまで、ちょっと時間がかかる。なんか動いたっぽい…。

起動したコンテナのIPアドレスを確認。

core@core-01 /opt/kubernates $ ip a show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 10.1.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link 
       valid_lft forever preferred_lft forever

redis-cliで10.1.42.1にアクセスできれば動いてるってことになりそうだな。

core@core-01 /opt/kubernates $ docker run -t -i dockerfile/redis /usr/local/bin/redis-cli -h 10.1.42.1
10.1.42.1:6379> set yukaary craft
OK
10.1.42.1:6379> get yukaary
"craft"
10.1.42.1:6379> quit

やったぜ。最後に立ち上げたpodsっていうのか?を消して今回はここでおしまい。

core@core-01 /opt/kubernates $ kubecfg -h http://127.0.0.1:8080 delete /pods/redisStatus
----------
success

まとめ

  • 次回はcore-02も認識させてマルチホストにしたいな。
    • 公式サイトのブログのpart2がそれにあたると期待したい。
  • jourtnalctlみるとetcdが警告とかエラーとかが結構あるんだが、大丈夫なのか…?
  • この環境にfigも入れたい。入るのかなあ。

Sunday, September 7, 2014

Go tour #48

#48 Cube rootの計算。

package main

import (
    "fmt"
    "math/cmplx"
)

func Cbrt(x complex128) complex128 {
    var z complex128 = x

    // なんとz,xが参照できる件w
    f := func() complex128 {
        //fmt.Println("z=", z, "x=", x)
        for i := 0; i < 20; i++ {
            z = z - ((z*z*z - x)/(3*z*z))
        }
        return z
    }
    return f()
}

func main() {
    fmt.Println(Cbrt(2))
    fmt.Println(cmplx.Pow(2, 1.0/3))
}

なんとなく関数の中に関数を定義してみた。理由はない。

Written with StackEdit.

Go tour #41 #44

気が向いた時にぼちぼち進めているけど、進みが遅いんじゃ~。なんか変なウイルスにかかって調子悪いし仕方ないね。(まさかデングなんとかじゃないよね…;ω;)

tour #41

Word Count関数。mapの使い方のおさらいだね。しかし、このmapの定義、違和感が凄いんだけど…いや、いいけどさ。

package main

import (
    "strings"
    "code.google.com/p/go-tour/wc"
)

func WordCount(s string) map[string]int {
    m := make(map[string]int)

    for _, value := range strings.Fields(s) {
        m[value] = m[value] + 1
    }

    return m
}

func main() {
    wc.Test(WordCount)
}

toue #44

フィボナッチ数列~。関数はクロージャだってことのおさらい。

package main

import "fmt"

func fibonacci() func() int {
    var f0, f1 int = 0, 1
    return func() int {
        fn := f0 + f1
        f0 = f1
        f1 = fn
        return fn
    }
}

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

関数を返り値として返す。返される関数は関数外の変数(上のf0, f1)とバインドしている。新たにfibonacci()により関数を取得しても既存の関数にバインドした変数とは被らない。

…よく出来てるなと思った。確かjavascriptでもこんな書き方したな。あっちは変数の扱いどうだったかな…。

Friday, September 5, 2014

coreos x fleet x etcd (艦隊を組むぞ!)

みんな、丸太は持ったか!?
あのホラー系コメディ漫画、おわっちゃった件。

3〜4番煎じネタだけど、くだらないところで大いにはまったので書き残しておくよ。激しく時間を浪費した(;_;

coreos-vagrant

google、pivotal、vmware、dockerと蒼々たる巨人達がコンテナ技術で提携を発表したここ最近、相変わらずdockerが盛り上がってるので、てくてく後ろを着いていこうと思った。

googleはkubernetesとかいうコンテナ用クラスタ管理システムを公開していて、こちらも興味があるんだけど、自分がこの分野に疎すぎるので、今回はもう少し基本を学べるように見えるcoreosに付属するfleetというクラスタ管理プログラムを試してみる。

fleet

公式サイトを見て、更に自分でもちょっと触ってみた感じ、etcdというKey, Valueストアを介して複数の(仮想)マシンを連結、1のマシンとして扱うことができる。

外部からデプロイコマンドを打ったらクラスタを構成するマシンのどれか一つでdockerコンテナが立ち上がるって理解でいいんだろうか。死活管理も入っているように見えるが、この辺はまだ不勉強。

ともかくクラスタを構成できないと話にならない。手元のへぼいiMacでも大丈夫そうなcoreos-vagrantで試してみる。

yukaarybox:project yukaary$ git clone https://github.com/coreos/coreos-vagrant.git
yukaarybox:project yukaary$ cd coreos-vagrant

ここでconfig.rb.sampleuser-data.sampleからコピーして、config.rbuser-dataを作る。続いて編集。

変更箇所:config.rb

$num_instances=2
$update_channel='stable'
$expose_docker_tcp=2375
$vb_gui = false
$vb_memory = 512 
$vb_cpus = 1

仮想マシンを2つ立ち上げる、coreosはstableを使用、ホストマシンからdockerコマンドを打てるようにする、仮想マシンのスペックを調整、以上。

変更箇所:user-data

discovery: http://172.17.8.1:4001/v2/keys/machines

クラスタを構成する時に照会するetcdのキー名。デフォルトでは、coreos側がご親切に照会用のetcdサーバー(https://discovery.etcd.i
o/)を立ち上げてくれており、キーを発行してそちらを見ればOK!となっているが、封権的なこの日本社会では、なかなかこれが利用できる環境にない…。

仕方がないのでvirtualboxで立ち上げるcoreosより絶対先に存在しており、かつ、ゲストマシンから間違いなくアクセス可能なホストマシン(yukaarybox/iMAC)にdiscoverly役を担ってもらうことにする。上の172.17.8.1はゲストマシンから見たホストのIPアドレス。

このetcd、coreosの構成するsystemdなどと並ぶ一大要素らしい。

公式サイト(英語)を読むと、プロセスの起動順序を制御するためにunittargetという2つの概念を利用する、この発想は既存のcloudなんとかから得ていて、coreosにとって必要な要素だけを取り出してきたとか色々書いてある。

goで実装されているのでOSXにgoをまずはインストール。インストール先。etcdをインストールするときに環境変数GOPATHがないと怒られるので、適当なディレクトリに設定しておく。

~/.bash_profile

export GOPATH=/Users/yukaary/go

etcdをインストール。

$ go get github.com/coreos/etcd

コマンドが終了するとGOPATH/bin/etcdが出来ている。そのまま./etcdとすると起動しちゃうから騙されたんだけど、まともに動いてなかったorz。これでゲストマシンx2が連結してくれず数時間はまった黒歴史。

(これだからgithubのmasterは嫌なんじゃ〜〜〜〜。)

go getしたソースコードはGOPATH/srcの中にあるので、そこでまともに動いてくれそうなブランチかタグを調べてみる。

yukaarybox:etcd yukaary$ git tag
0
v0.1.0
v0.1.1
v0.1.2
v0.2.0
v0.2.0-rc0
v0.2.0-rc1
v0.2.0-rc2
v0.2.0-rc3
v0.2.0-rc4
v0.3.0
v0.4.0
v0.4.1
v0.4.2
v0.4.3
v0.4.4
v0.4.5
v0.4.6

v0.4.6。多分これだな…。

yukaarybox:etcd yukaary$ git checkout v0.4.6
yukaarybox:etcd yukaary$ go install $ go buildもいるのかな?ちょと分からない。

これでまともに動きそうなetcdが出来た。IPアドレス:ポートを指定して起動する。

./etcd -addr 172.17.8.1:4001

別ターミナルでVagrantを起動。

yukaarybox:coreos-vagrant yukaary$ vagrant up
...

ゲストマシン起動完了後、core-01, core-02でそれぞれ。

core@core-01 ~ $ fleetctl list-machines -l
MACHINE                 IP      METADATA
b29eb20a7acb4b6fac7dd7839d15ee08    172.17.8.101    -
b2aff8b7ea5d4663a70900f560376c23    172.17.8.102    -
core@core-02 ~ $ fleetctl list-machines -l
MACHINE                 IP      METADATA
b29eb20a7acb4b6fac7dd7839d15ee08    172.17.8.101    -
b2aff8b7ea5d4663a70900f560376c23    172.17.8.102    -

やったぜ。

Written with StackEdit.

Monday, September 1, 2014

Go tour #36

気が向いた時にまずは文法覚えようとgo-tourを見ながらgoを触っている。現行の最新版は1.3.1なのかな?

触っていると感じる…凄く…C…、あなた、Cなのっ?という懐かしさ。Cに比べるとシンプルになって無駄な記法を極力減らす努力をしているように見える(; ほとんどないしっ) ポインタもいい感じに隠しているのかな?


以下、#36 Excercise: Slice のコード。

package main

import "code.google.com/p/go-tour/pic"

func Pic(dx, dy int) [][]uint8 {
     // ほんとにCライクだなこれw
     ret := make([][]uint8, dx)
     for i := range ret {
         ret[i] = make([]uint8, dy)
         for j := range ret[i] {
             ret[i][j] = uint8((i+j)/2)
         }
     }
     return ret
}

func main() {
    pic.Show(Pic)
}

昔、似たようなコードをけなげにもint **p = malloc(sizeof(int) * dx); とかやって書いてますたorz。

goだともっとシンプルに書けるかもだけど、妙に懐かしかったというお話。

外部モジュールはgo get code.google.com/p/go-tour/picで取れるけど、これどこに保存されてんだろ? npmみたいのが欲しくなるな。

Written with StackEdit.