Browsed by
Category: golang

My Yearly Goals

My Yearly Goals

—–BEGIN PGP MESSAGE—– Version: GnuPG v2 hQIOA2jnx9T3JM9SEAf/VSB3nCEOzyJEf9RRSI76xw4kv9VS7IJmeg80fNAcViYQ sn2PaRSYMC1X0nqOzpqOzYW5LIArSEehrr/Z085gOjNi/2rkDwSD3WGGXgUdSZRZ 10gRLoRE/CZw212CNZi0AV0GT7Zw5jizpJt4kh5Zn/RnrdxHCtSMaTJpIbOYhmca FQJfcLRp5unSUooOY1PREESA4tpaUy9kz4dgttnCPnq8DLeshkD5xMAloAFR13li TBeG/tqHKjNUZT5oLUSLxs9EXnG9LTLB+lJ4C0sdY6KW7Ad7SMzymTWSnjeYHxp+ 4FDhqGhrJwrBC3Gh63YLTLXALc2NBQ5s32trpSPV5wgAj2LKcSiiBxXh8LgjT+Em mGYIgs6drCwowBi/A6RDxA7kdnMVT9cSk6XjMIQjb0mG3JGnNYWEjRHx+5P4ZlsM tfv153RAbRaGCOSoJ8pm2NOmaGs7wgTv9yKRUGIFzROWsPOTx+Q1UGnurIFFa9LG lU42EXsIa7lzxsCgNx8vXqonTwRPinspfRUea/URgbCkIpnyVSIkFXujY+HAdRRo V8WRxq6Rm78YNMigt3lim7NLmYIk8K3CAz92+q5oRolIgCbqwN6dGHpJSDLBoKX8 7nFQQsrFOh5lSv/ZO0upjuye0JJTwU1yzcYRH7B0r2aMzxxMWu0ZB6kilq/RaDp9 nNLpAVHBo6oXX5j8+2k22F2vZVSTUl1SJgKahHOzTUQTK+rIESX5XTwJctJ0Eb/c jjaHV3GDZSGZBK6Ib+Ez+4SIqXZg26d5bnXbBS/iHL2baErZE4sFzEf8JsYbq3ZO 5Xk3eBURiLwwrl3ftu2O7/Mv6AUFyYSaWJWanYPMGm0I3NDYmaMWWIRPRD6wE32R bklG/xvktnLkp75nk0FKqVPXlci0aeAzxVYvsvd9CnkcDxeEi3WdLRlyhE5xsLRv CL4KpQzw7d6Rg2TZ0kn7gHYmS0HJHLDf7VrUndLcDMjiF/wrBfxH/ZsfIKxmfzMd LgIWYefwVWndpejO5FMlzl+7NFFy+Uc036iWUXcfScbyChujdYRGyyJy8B9zJmhf pBescXTzjpCp7yySmz11FpBUNpfA6Bg44T8t2ERlNMae4ZuL+U25y8E0QgiUJTHe guDWpdhxLESXRi7TF9D0k0DWWguUAsJlioQJZDRMZze+pLOwMa0bdgqbJFMexQQk IKs9rzobcM1a0aeIEyytCiVdDiEmcc/PEwJ7yDaZ7aQvknP92p9xDZl0flzlLbbp 6bjxHySKV13QKoE1ymmsZjqLqqLlHLDz3lOs2gb0ZEG64N/8grRimGCOhNj+U7pH rvuBR3lJMFyjI8MKmEPViupXXoYr8tDQC+f11CccT5IS65gqJ5pwNDBRU4BMkg6A 7Z7wnNvZzt5aNKW+tYYqknR//qTpEYgFCxoEp24n =CB7d —–END PGP MESSAGE—–  

Effective Go & GoFAQ 阅读笔记

Effective Go & GoFAQ 阅读笔记

Effective go: https://golang.org/doc/effective_go.html Go FAQ: https://golang.org/doc/faq 下面是对以上两篇文章内相关内容的记录与解释/总结 Interface 某一个 type “implement” 这个 interface 的话,只要实现这个interface的全部方法即可 不过这里有一些容易产生误区的地方,看下面这个例子   type T int interface Equaler { Equal(Equaler) bool } Equaler是一个interface, 下面看这两个例子 func (t T) Equal(u T) bool { return t == u } type T并没有实现Equaler interface 因为参数类型不是 Equaler 而是一个具体的类型 T 这个问题很容易理解, 试想一下其他某一个type implement了Equaler类型(假设为Q) 而 t.Equal(Q) 是不合法的 因为Q不是T类型, 所以 T 并没有实现Equaler这个interface 因为Equaler接口要求只要满足type为Equaler就都可以作为参数传递给Equal 下面这个才是T implement Equaler的例子 func (t T) Equal(u T) bool { return t == u.(T) }   interface 的 value = nil 不代表interface为nil, interface的结构为type, value两部分 下面这个代码永远会返回错误…

Read More Read More

[Docker] 新建一个Docker Image并push到dockerhub

[Docker] 新建一个Docker Image并push到dockerhub

Preface 软件开发测试过程中的环境配置一直是令人头疼的事情,Docker正是为了解决这种问题而诞生的一套工具,现在已经发展成为了一个生态,使用Docker,可以轻松的部署你的项目,并且保证不同slave机器的环境配置完全一致,当你提交一个patch(commit)之后,想要测试项目的运行的时候, 只需要docker run <your-image>就可以轻松的搭建好项目运行环境,并且访问配置好的服务器端口,就可以访问到刚刚修改后的项目了~ 同时docker结合DroneCI TravisCI等CI平台,使得软件测试也变得十分容易 NEUOJ的健壮性测试,就是在自建的私有DroneCI服务器上运行的 但是因为之前我是直接使用的centos的镜像,没有进行修改,所以之前我们每一次运行测试,都需要下载一大堆软件包,然后才开始运行代码测试, 既费时又费流量(每一次都需要安装200MB的东西) 因而自己新建一个Docker镜像包含这些所有的软件包能省去很多时间以及流量 新建一个Docker镜像 使用docker build命令可以轻松的创建Docker Image 创建docker image需要Dockerfile, Dockerfile描述了这个image要用到的base镜像, 你可以从一个已经存在的镜像开始创建, 也可以Build From Scratch Dockerfile的每一个指令的格式如下 INSTRUCTION args 常用的INSTRUCTION有 FROM: 表示镜像的base是什么,scratch的话表示无base RUN: 执行Shell命令,并将结果打包到images中 CMD: docker run images的时候执行的命令 MAINTAINER: 维护者 以下是一个示例Dockerfile # NEUOJ Test Script Ver1.0 FROM centos:7 MAINTAINER VOID001 <[email protected]> #- uname -a RUN yum install wget -y RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm RUN yum install git -y RUN yum install openssh-clients -y RUN rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm # Add php7 Source RUN yum repolist…

Read More Read More

[go]heka插件开发

[go]heka插件开发

官方文档传送门 Heka是一个用于进行DataProcessing的一个系统, 具有高度的扩展性, 官方自称为 Swiss Army Knife 型的工具 heka通过一系列插件进行工作heka支持的插件种类有 Input Splitters Decoders Filters Encoders Outputs 六种插件 , 对于不同插件的作用, 可以在官方文档内很容易的找到, 这里就不做说明了 开发一个Input插件 heka语言的插件大部分使用 golang 开发, 下面是一个使用heka实现一个input插件, 从文件读入数据的例子 使插件能够被heka识别(注册插件到heka中) 首先, go的开发要保证GOPATH配置正确, heka安装好之后, 为heka开发插件的默认GOPATH是 /path/to/your/heka-src/build/heka/ 如果不将gopath设置为这个, 就会找不到要导入的heka有关的包 为了保证我们对插件开发的可视化, 每一步开发都能看到结果是最好的, 因而我们先尝试开发一个最最简单的插件, 只让这个插件注册到heka中, 能够确定这个插件被加载即可 参考文档: [1]http://hekad.readthedocs.io/en/v0.10.0/developing/plugin.html#registering-your-plugin [2]http://hekad.readthedocs.io/en/v0.10.0/installing.html#building-hekad-with-external-plugins 首先我们在新的GOPATH下的src/github.com/下建立自己的工作区和包目录 (我这里以./VOID001/inputplug 为例) 然后我们定义一个type 这个type就是我们的Plugin的type, 这里起名为SampleInput, 其他的名字也都可以 , 这个地方对命名没有什么约束, 下面有对名字有约束的地方, 会进行说明.  然后 将这个type实现为Plugin interface(即将 Plugin 这个interface对应的全部方法实现在type上) type SampleInputPlug struct { filePath string } func (t *SampleInputPlug) Init(config interface{}) error { return nil } 这样, 就已经实现了一个最基本的Plugin ,SampleInputPlug 指针实现了Plugin这个接口, 然后通过查看 [1]…

Read More Read More