一步一步教你用 GitHub+Slack+TravisCI 构建 Go 的自动化持续集成

本文是基于 gitfeed 项目来教你如何一步一步的用 Github+Slack+TravisCI 构建自动化持续集成。


欢迎大家使用 gitfeed 项目,有什么意见或想法都可以提 Issue 给我,更欢迎大家提 PR。

什么是持续集成?

持续集成(英语:Continuous integration,缩写为 CI),一种软件工程流程,将所有工程师对于软件的工作复本,每天集成数次到共用主线(mainline)上。 摘自维基百科。

(图片来源于网络)

持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。

持续集成的好处主要有两个:

(1)快速发现错误。每完成一些更新,就可以集成到主干,可以快速发现错误,定位错误也比较容易。

(2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

Martin Fowler 说过,”持续集成并不能消除 Bug,而是让它们非常容易发现和改正。”与持续集成相关的,还有两个概念,分别是持续交付和持续部署,本文暂未涉及,以后有机会再进行探讨和实践。

Jaeger 分布式链路跟踪系统

本文是一篇 Jaeger 入门级指南。


以下是一篇转发

前言

  随着公司的发展,业务不断的增加,模块的不断拆分,系统间业务调用就变得越复杂,对定位线上故障带来很大困难。整个调用链不透明,犹如系统被蒙上一块黑纱,当线上遇到故障时,整个技术部就陷入痛苦的漩涡。这时候分布式追踪系统应运而生,如揭开了黑纱,让阳光照进黑暗。

分布式系统调用过程

image

opentracing 协议

 opentracing是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。

image

简单理解opentracing

一个完整的opentracing调用链包含 Trace + span + 无限极分类

  • Trace:追踪对象,一个Trace代表了一个服务或者流程在系统中的执行过程,如:test.com,redis,mysql等执行过程。一个Trace由多个span组成
  • span:记录Trace在执行过程中的信息,如:查询的sql,请求的HTTP地址,RPC调用,开始、结束、间隔时间等。
  • 无限极分类:服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来。

基于 Docker 构建 ElasticSearch

本文是一篇基于 Docker 构建 ElasticSearch 的入门级指南。


其实用 Docker 来构建真的很简单,这里就给大家贴我的实际配置和运行命令吧。

。。。

检查 ElasticSearch 状态

curl -XGET http://localhost:9200/_cluster/health?pretty

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "cluster_name" : "docker-cluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 1,
  "active_shards" : 1,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 1,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 50.0
}

增删改查

增加

1
2
3
4
5
6
7
curl -XPUT 'localhost:9200/twitter/tweet/1?pretty' -H 'Content-Type: application/json' -d'
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
'

执行结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "_index" : "twitter",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

查询

curl -XGET 'http://localhost:9200/twitter/tweet/1'

执行结果:

1
2
3
4
5
6
7
{"_index":"twitter","_type":"tweet","_id":"1","_version":1,"found":true,"_source":
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
}

https://github.com/olivere/elastic/issues/312 https://github.com/olivere/elastic/wiki/Connection-Problems#how-to-figure-out-connection-problems

dep 入门指南

本文是一篇 dep 的入门级指南。 dep 参考资料 茶歇驿站 一个可以让你停下来看一看,在茶歇之余给你帮助的小站。 这里的内容主要是后端技术,个人管理,团队管理

基于 Docker 构建 Wordpress

本文是一篇基于 Docker 构建 Wordpress 的入门级指南。


Docker 的安装以及 Docker 基本命令,都可以参考官网了解和学习,我这里只是简单介绍一下如何构建 Wordpress:

基本准备之一安装 Docker

见官网。

常用的命令:

  • docker --version
  • docker-compose --version
  • docker-machine --version
  • docker ps
  • docker ps -a
  • docker run hello-world # 如果能显示:“”,则表示docker安装成功了。
    • Hello from Docker! This message shows that your installation appears to be working correctly.
  • docker run -it -rm ubuntu:latest bash # 启动一个ubuntu,并且进入bash命令行
  • docker run -d -p 80:80 --name webserver nginx # 启动一个Nginx

基本准备之二

拉取镜像:

docker pull mysql

docker pull wordpress

go get 提示 io timeout 的解决之法

本文是一篇对go get不能方便拉取到代码的问题的解决方案总结。


go get -v golang.org/x/text,有一部分 google 的服务器被ZF q了,所以导致无法go get-v 是可以打印执行的过程。

失败的原因就是遇到zf q 的问题了,即便是你设置了全局代理,也是不行的。因为全局代理对命令行不生效。

我们只能对 git 进行单独设置。

1
2
git config —global http.proxy http://127.0.0.1:7777
git config —global https.proxy http://127.0.0.1:7777

可以参考:http://www.cnblogs.com/ghj1976/p/5087049.html 网络请求的 http_proxy 和 git 的 代理 都需要设置才可以。

解决 go get 的问题(写一篇总结的文章)还可以参考另外一篇文章

还需要安装一个 cow 代理软件,然后再配置好 ~/.cow/rc

1
2
listen = http://127.0.0.1:7777
proxy = socks5://127.0.0.1:1080

然后启动 cow(go get 安装到 gobin 目录下,可以直接运行的) 在运行 go get 之前,记得执行:

1
2
export http_proxy=http://127.0.0.1:7777
export https_proxy=http://127.0.0.1:7777

Go 语言反射法则 - The Laws of Reflection

本文是一篇转载文章


Go语言反射法则 - The Laws of Reflection

原文地址:http://blog.golang.org/laws-of-reflection

介绍

反射在计算机的概念里是指一段程序检查自身结构的能力,主要检查类型。它是元编程的一种形式。同样也是引起困扰的重大来源。

在这篇文章里我们试图阐明Go语言中的反射是如何工作的。每种语言的反射模型是不同的(许多语言压根不支持反射),然而本文只与Go有关,所以我们接下来所提到的“反射”都是指Go语言中的反射。

类型(types)与接口(interfaces)

由于反射是建立在类型系统(type system)上的,所以我们先来复习一下Go语言中的类型。

Go是一门静态类型的语言。每个变量都有一个静态类型,在编译时每个类型都明确并固定下来,例如:int, float32, *MyType, []byte 等。

GitChat 答疑:《BP 神经网络入门:从原理到应用》

本文主要是对于 GitChat 答疑《BP 神经网络入门:从原理到应用》的部分记录。


介绍

《BP 神经网络入门:从原理到应用》,作者:张仕超,研究生在读。 本科有过校赛培训经验,擅于清晰简明地讲解复杂的知识。本研期间获奖若干: robocup机器人中国赛亚军 类脑计算大赛二等奖 数模美赛一等奖……我的博客:http://blog.csdn.net/u014303046

QA

Q1. 文中的公式是怎么写的?

Q1. 文章都是 markdown 写的,公式是使用 latex 语法写的。

Q2. 公式都看不懂,数学基本都还给老师了,应该怎么办?

把数学都复习一下,复习建议:机器学习涉及到的数学知识主要包括:线性代数,概率统计和微积分。这些内容建议网上搜索斯坦福大学 CS229 课程(注意这里不是说的网易公开课的 CS 229 课程),课程所对应的补充资料里面都有这些内容的复习,这些内容比较精简,加起来大概 100 页不到,很适合初学者。

Go 延迟函数 defer 详解

摘要: Go 语言中延迟函数 defer 充当着 try…catch 的重任,使用起来也非常简便,但是当它和 return、返回值一起出现时,你可能会不小心掉进坑里……


Go 语言中延迟函数 defer 充当着 try…catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer、return 和返回值之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!

先来运行下面两段代码:

A. 匿名返回值的情况

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
    "fmt"
)

func main() {
    fmt.Println("a return:", a()) // 打印结果为 a return: 0
}

func a() int {
    var i int
    defer func() {
        i++
        fmt.Println("a defer2:", i) // 打印结果为 a defer2: 2
    }()
    defer func() {
        i++
        fmt.Println("a defer1:", i) // 打印结果为 a defer1: 1
    }()
    return i
}