博客改版

最近把博客从 textile 改成了 markdown 格式了,算是一次小改动,代码高亮使用了 highlightjs 这个插件,方便很多。

以后会保持每周更新的习惯,前段时间把记录都乱记的,有时候想找还忘记在哪里记了,博客的好处就是可以很方便地找出来。

hello kotlin

很早之前已经听说了一种运行在jvm上的类似swift的语言,kotlin。

最近在接Android第三方平台的时候,就试用了一下,后来一发不可收拾。

首先Kotlin是由JetBrains公司开发,并且Android Studio也是基于JetBrains公司的IDEA,所以kotlin支持是属于官方支持级别的,IDE特别友好。

提供的gradle插件也很好用,官方也有一篇开发Android的教程,https://kotlinlang.org/docs/tutorials/kotlin-android.html

可以与Java很好地进行混合编程,无痛使用现有的jar库。


> Hello Kotlin

首先给Android Studio安装Kotlin插件。通过插件管理界面即可安装。

也可以在线体验,http://try.kotlinlang.org/

创建Kotlin工程,hello。

fun main(args: Array<String>) {
    println("Hello")
}

> Standard

https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/util/Standard.kt

标准库提供了几个非常好用的方法

> apply

开发过程中,对于Bean的属性赋值过程如果属性特别多的时候,代码会很长并不是很优雅

class Bean {
    private String a;
    // ...
    private String z;

    public void setA(String a) {
        this.a = a;
    }

    // ...

    public void setZ(String z) {
        this.z = z;
    }
}
val b = "b"
val bean = Bean().apply {
    a = "a"
    this.b = b // 使用this
    // ...
    z = "z"
}

通过使用 apply 可以使代码变成这样,看起来感觉更舒服。

osx install bind9

由于工作开发过程中使用了Git,Jenkins,Wiki,还有各种web服务,用端口访问的方式太不友好了,所以就利用现有的一台Mac Mini服务器搭了一个域名服务器 miniserver.io

$ brew install bind
$ vim /usr/local/etc/named.conf

...

zone "miniserver.io" IN {
    type master;
    file "miniserver.io.zone";
    allow-update { none; };
};

zone "10.168.192.in-addr.arpa" IN {
    type master;
    file "miniserver.io.local";
    allow-update { none; };
};

...

$ cd /usr/local/var/named
$ cat << 'EOF' > miniserver.io.zone
$TTL    604800
@                   IN SOA      ns.miniserver.io. root.miniserver.io. (
                                      1       ; Serial
                                      3h      ; Refresh
                                      1h      ; Retry
                                      1w      ; Expire
                                      1h )    ; Minimum
;
miniserver.io.      IN NS       ns.miniserver.io.
miniserver.io.      IN A        192.168.10.100
ns                  IN A        192.168.10.100
www                 IN CNAME    miniserver.io.
EOF
$ cat << 'EOF' > miniserver.io.local
$TTL    604800
@       IN      SOA     ns.miniserver.io. root.miniserver.io.  (
                                      1       ; Serial
                                      3h      ; Refresh
                                      1h      ; Retry
                                      1w      ; Expire
                                      1h )    ; Minimum
;
        IN      NS      ns.

1       IN      PTR     ns.miniserver.io.
EOF
$ sudo named -f -c /usr/local/etc/named.conf

vsphere and docker

很早之前买了台HP Gen8小型服务器,装了ESXi6.0,发现竟然没有Mac下管理前端,只有Windows的前端,甚是不便。

虽然有VMware VCSA (vCenter Server appliance) ,但服务器只有10G内存(2G+8G),内存耗不起。

启用ESXi的SSH管理,可以通过CMD来管理,只需要熟悉几个工具即可。

Docker与ESXi

在ESXi中布署docker

通过docker-machine可以很方便地在ESXi中安装docker并在本地管理

# 安装docker与docker-machine
$ brew update
$ brew cask install docker-machine

# https://github.com/docker/machine/issues/2279
$ cd .docker/machine
$ wget https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso

# vmwarevsphere驱动依赖govc
$ go get github.com/vmware/govmomi/govc
$ PATH=$PATH:$GOPATH/bin

$ docker-machine create \
    --driver vmwarevsphere \
    --vmwarevsphere-vcenter 192.168.10.209 \
    --vmwarevsphere-username root \
    --vmwarevsphere-password ****** \
    --vmwarevsphere-network 'VM Network' \
    --vmwarevsphere-datastore 'datastore1' \
    --vmwarevsphere-datacenter ha-datacenter \
    esxi-host

参考:http://qiita.com/ysaotome/items/06f9bdc762a68731f21b

GOVC cli

$ export GOVC_URL="https://root:******@192.168.10.209/sdk"
$ govc about

http://www.virtuallyghetto.com/2014/09/govmomi-vsphere-sdk-for-go-govc-cli-kubernetes-on-vsphere-part-1.html

创建Swarm

$ eval "$(docker-machine env exsi-host)"
$ docker run swarm create # 15c93e5e1662fdddfa8ab13bf1daf0a0
$ docker-machine create \
    --driver vmwarevsphere \
    --vmwarevsphere-vcenter 192.168.10.209 \
    --vmwarevsphere-username root \
    --vmwarevsphere-password **** \
    --vmwarevsphere-network 'VM Network' \
    --vmwarevsphere-datastore 'datastore1' \
    --vmwarevsphere-datacenter ha-datacenter \
    --swarm \
    --swarm-master \
    --swarm-discovery token://15c93e5e1662fdddfa8ab13bf1daf0a0 \
    swarm-master
$ docker-machine create \
    --driver vmwarevsphere \
    --vmwarevsphere-vcenter 192.168.10.209 \
    --vmwarevsphere-username root \
    --vmwarevsphere-password **** \
    --vmwarevsphere-network 'VM Network' \
    --vmwarevsphere-datastore 'datastore1' \
    --vmwarevsphere-datacenter ha-datacenter \
    --swarm \
    --swarm-discovery token://15c93e5e1662fdddfa8ab13bf1daf0a0 \
    swarm-agent-01
$ docker-machine create \
    --driver vmwarevsphere \
    --vmwarevsphere-vcenter 192.168.10.209 \
    --vmwarevsphere-username root \
    --vmwarevsphere-password **** \
    --vmwarevsphere-network 'VM Network' \
    --vmwarevsphere-datastore 'datastore1' \
    --vmwarevsphere-datacenter ha-datacenter \
    --swarm \
    --swarm-discovery token://15c93e5e1662fdddfa8ab13bf1daf0a0 \
    swarm-agent-02
$ eval "$(docker-machine env --swarm swarm-master)"
$ docker info
$ docker ps -a

https://docs.docker.com/swarm/install-w-machine

树莓派与Docker

手上的 Raspberry Pi Mobdel B+ 吃灰一年了,最近也在玩 Docker,也看到这 hypriot 这个项目,感觉太棒了,平时也只玩单机的 Docker ,现在可以组一个 Swarm 玩玩。

  


安装 hypriot OS

$ brew cask install docker
$ brew install pv axel
$ wget https://raw.githubusercontent.com/hypriot/flash/master/`uname -s`/flash
$ chmod +x flash
$ axel -n 10 http://downloads.hypriot.com/hypriot-rpi-20151115-132854.img.zip
$ ./flash --hostname pi hypriot-rpi-20151115-132854.img.zip

使用 docker-machine 管理

$ curl -o docker-machine http://downloads.hypriot.com/docker-machine_0.4.1-dev_darwin-amd64
$ chmod +x ./docker-machine
$ ./docker-machine create --driver hypriot --hypriot-ip-address=<raspberry-pi-ip> pi
$ eval "$(./docker-machine env pi)"
$ docker info

http://blog.hypriot.com/post/let-docker-swarm-all-over-your-raspberry-pi-cluster/

使用 docker volume

$ docker volume create --name web
# 查看web卷真实路径
$ docker volume inspect --format '{ { .Mountpoint } }' web
# 同步本地文件至web卷
$ docker-machine scp -r files/ pi:`docker volume inspect --format '{ { .Mountpoint } }' web`/
# 使用卷
$ docker run --rm -v web:/web ubuntu ls /web

需要注意,如果使用--rm的方式运行引用该卷,退出后会删除该卷!!