Android MVP

已经两年没怎么关注Android开发了,Android的开发方式已经从MVC转向了MVP、MVVM了,之前也看过国外大牛写的 Architecting Android…The clean way?中文版

使用MVP其中一个好处是更好地支持可测试,渐渐发现Github上开源的大多数项目都写满了测试代码,这点很值得学习,Google官方也推出了一个教程,如何写测试代码 Android Testing Codelabs

看了一下Google提供的例子,这款笔记应用,一共提供了四个界面(Activity),其中一个是统计界面,另三个就使用了MVP的模式。

一个界面由Activity、Fragment、Presenter、Contract四个部分组成,其它Activity与Fragment就是MVP中的V,Presenter就是MVP中的P,Contract则是VP交互的接口定义,另外的M就是Model了。

Contract定义了两个子接口,一个是Presenter -> View可交互的方法,另一个则是View -> Presenter的交互方法。

public interface NotesContract {
    interface View {
        void showNotes(List<Note> notes);
    }

    interface UserActionsListener {
        void loadNotes(boolean forceUpdate);
    }
}

View中的事件(生命周期的方法或按钮)去调用Presenter的loadNotes方法去请求Model获取笔记数据,然后再调用View的showNotes去显示,完成一个交互过程。

postgres

学习SQL数据库已经是几年前了,已经很久没再使用过了。

最近因为想写一个简单的应用管理平台,有一些数据库相关的,因为在Raspberry Pi上没有对应的MongoDB,又不太想用MySql,所以就装个PostgreSQL来玩玩。

https://github.com/linguofeng/rpi-postgres

$ docker volume create --name postgres-data
$ docker pull linguofeng/rpi-postgres
$ docker run --name postgres -v postgres-data:/var/lib/postgresql/data linguofeng/rpi-postgres
$ docker run -i -t --rm --link postgres --entrypoint=sh linguofeng/rpi-postgres
$ psql -h postgres -U postgres
postgres=# \h

Go开发环境配置

Go开发环境配置会与其它语言的开发环境配置有所不同,主要是要理解GOPATH变量的重要性,GOPATH可以理解为Eclipse中的Workspace

有时候我们在开发一个新项目的时候,会创建该项目的GOPATH,项目所有依赖的都相应的在该GOPATH里,当然这是一种过时的作法,现在1.5版本中新增了vendor,可以把项目的依赖下载在当前项目的vendor目录下。所以一般,我们只需要一个GOPATH变量。

> 安装GO,使用brew可以很方便地进行安装与升级,如果同时开发好几个项目,并且使用不同版本的Go,可以使用Gvm来同时安装管理多个版本的Go。
$ brew install go
$ go version
> 创建GOPATH路径
$ mkdir ~/gocode
$ echo 'export GOPATH=~/gocode' >> ~/.zshrc
$ source ~/.zshrc
> Hello
$ mkdir $GOPATH/src/github.com/linguofeng/hello
$ vim $GOPATH/src/github.com/linguofeng/hello/main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello")
}
$ go run $GOPATH/src/github.com/linguofeng/hello/main.go

Protocol Buffers

> Install

$ brew install protobuf --universal --c++11 --devel
$ brew install go
$ go get -u github.com/golang/protobuf/protoc-gen-go
$ protoc --version

> Hello

$ vim proto/hello.proto
syntax = "proto3";

package pb;

message Hello {
    string name = 1;
    int64 mobile = 2;
}
$ mkdir pb
$ protoc --proto_path proto --go_out ./pb ./proto/hello.proto
$ vim main.go
func main() {
    encode := &pb.Hello{
        Name:"林国锋",
        Mobile: 13800138000,
    }

    // 编码
    out, err := proto.Marshal(encode)
    if err != nil {
        log.Fatal("encode error!!")
    }

    // 解码
    decode := &pb.Hello{}
    if err := proto.Unmarshal(out, decode); err != nil {
        log.Fatal("decode error!!")
    }

    // 转换成json,proto3支持json
    json_str, err := json.MarshalIndent(decode, "", "  ")
    if err != nil {
        log.Fatal("encode error!!")
    }
    fmt.Println(string(json_str))
}
{
  "name": "林国锋",
  "mobile": 13800138000
}

接腾讯应用宝SDK有感

“狗日的”腾讯 http://baike.baidu.com/view/4013473.htm

正如上面的内容

应用宝SDK只能用烂得一塌糊涂来表示,一个功能,几百个版本的文档,仅是接登录功能,就看了N个版本的文档,并且提供的接口难用之极,这么大一家公司,开发出的SDK如此不优雅。

对于一开始要接应用宝SDK时,我是拒绝的。

还有配套的米大师就呵呵了,实在接不下去了。

还没用过如此难用的SDK。

最后就用“狗日的”腾讯来完结本文