我的2016-成长之年

type summary struct { Time time.Time // 2016.12.31 Author string // sheepbao Location string // shenzhen } func SayHelloTo2017() { println(` we try hard . cos we are creating the world . hello world !. hello 2017 ! `) } 说点啥 其实是看到挺多人写2016的总结,自己心痒也想写一个,当作记录吧,不写的话,很有可能以后就忘了,主要说说自己在2016的感受。 感谢的话 感谢的有很多人,父母兄弟姐妹,亲戚好友都是很感谢的,木有他们也木有现在的我,2016大部分时间是在深圳,遇到不少人和不少事,最亲爱的Lavinia,以前listome的同事,现在sewise的同事,都很感谢。感谢Lavinia,给我的生活带来不一样的色彩,遇到你是我最大的幸运。感谢啊汪,牛逼的大学室友,虽然最后离我而去(离开深圳),说要上天,但还是很感谢。感谢徐总、陈哥和雯姐,我才有另一个机会,以不同的人生轨迹步入深圳,虽然我最后离开了,但是我也衷心希望listome越来越好。感谢肖大哥,教我很多互联网和编程知识,和你聊互联网历史很开心。感谢Richard和Eric,让我进入现在的公司,带领着我们前进,也认识很多优秀的同事,和他们学习了很多知识和技能,让我成长,特别是Kinov,总是孜孜不倦的教我,非常感谢,希望来年能更多的参与公司的项目,贡献自己的力量。 补基础 万丈高楼平地起,知识结构也是一样的,基础的重要不言而喻,特别作为一个非科班出身的我,很多基础知识要补: 看了个linux网络编程,内容很详细,由浅入深,可以学到linux下网络的编程是怎样的,也认识了很多底层的系统接口。 看了个go网络编程,很好的一本书,而且是中英文双语版,讲了go很多基础的网络编程,对http协议也讲的比较详细,这本书我几乎是在火车上看完的(深圳 往返 厦门)。 看了个The Go Programming Language,也叫go语言圣经,非常好的一本书,主要是例子超多,几乎整本书都在讲各种例子,而学习各种例子可以加深理解语言的特性。 看了个go并发编程实战,也是非常好的一本书,郝大写的,明年会出第二版,现在这个版本内容很多,虽然很详细,但有些内容还是有赘述且例子比较少。不过看完这本书完全可以用go写项目了。 看了个docker源码分析,内容很浅显,讲了docker的基本架构,源码分析的其实比较少,并没有深入,有点坑。 看了个计算机网络,感觉和大学的时候看的计算机网络 谢希仁版知识点重合,复习了一遍。 看了个数据结构,教授讲的很好,学习了基础的List、Queue、Stack、Tree和Graph,基本的排序和排序算法的复杂度,基本的遍历方法BFS和DFS。 看了个TML+CSS基础课程,我只想说真的好基础,离我自己写个网页还好大距离。 看了个JS实现人机大战之五子棋,业余时间按着课程写的小游戏,后来用go写了后台,用socket.io和前端通信,实现了双人在线版,也把自己电脑映射到公网,和异地朋友玩了一下。后来又写了个多人在线画画,前端js,后端go,通信用websocket。 2016写了几篇博客sheepbao,写博客确实是个好习惯,整理思路,加深自己的理解,有错的话,别人还会帮你提出来,多好,希望来年多写写。 实战和项目 作为一枚码农,实战和项目是最能提高和锻炼自身水平的。2016的项目并不多,来到新公司,学习了很多流媒体的知识,一个领域就有其领域的专业知识,对于我,学习这些是必须的,今年主要学习各种流媒体应用层协议,来年要学学编解码和播放器的知识。 写了个gomitmproxy,但并没有写完,主要学习了http和https协议,现在来看,代码应该重构了,终端的输出也要用TermUI写过。 go写了个消息系统 [Read More]
Life 

Golang 字符串连接性能探究

Golang 字符串连接性能探究 为何探究 几乎所有的软件项目,不管是什么语言,都会用到处理字符串,而拼接字符是最基本,也最常用的。一般连接字符串都有好几种方式,不同的方式适合不同的场景,此次仅探究如果快速动态连接大量的字符串。 相关问题 https://gocn.io/question/265&sort_key=agree_count&sort=DESC http://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go/23857998 探究的代码 还是代码最明了 package main import ( "bytes" "fmt" "strings" "time" ) var way map[int]string func benchmarkStringFunction(n int, index int) (d time.Duration) { v := "ni shuo wo shi bu shi tai wu liao le a?" var s string var buf bytes.Buffer t0 := time.Now() for i := 0; i < n; i++ { switch index { case 0: // fmt.Sprintf s = fmt. [Read More]
Go 

golang开启GODEBUG=gctrace=1 显示信息的含义

golang开启GODEBUG gctrace =1 显示信息的含义 如何开启打印gc信息 只要在程序执行之前加上环境变量GODEBUG=gctrace=1 ,如: GODEBUG=gctrace=1 ./xxxx.exe or GODEBUG=gctrace=1 go run main.go 程序将会显示gc信息,如下 gc 1 @2.104s 0%: 0.018+1.3+0.076 ms clock, 0.054+0.35/1.0/3.0+0.23 ms cpu, 4->4->3 MB, 5 MB goal, 4 P gc 2 @2.241s 0%: 0.019+2.4+0.077 ms clock, 0.079+0/2.4/6.4+0.30 ms cpu, 5->6->5 MB, 6 MB goal, 4 P gc 3 @2.510s 0%: 0.011+3.2+0.063 ms clock, 0.047+0.10/2.9/9.0+0.25 ms cpu, 11->11->10 MB, 12 MB goal, 4 P gc 4 @3.021s 0%: 0. [Read More]
Go 

RTMP协议学习笔记

RTMP协议笔记 请用电脑或者手机横屏查看,不然会格式乱。 RTMP的背景和应用 每项技术都有起来源,RTMP也不例外,RTMP是Adobe公司公布的一项协议,Adobe是一家世界领先数字媒体和在线营销方案的供应商。在H5崛起之前,几乎所有的浏览器都用Flash player播放多媒体资源,而服务端和浏览器之间就是用RTMP协议或者在RTMP协议变种后的协议进行通信的。 RTMP协议概览 握手、消息块概念 握手的目的是为了确认对端RTMP的Version和确认对端能互相通信。 消息块就是消息的载体,是RTMP协议最重要的载体,这个载体是有一定格式的,如果把Client和Server端当作铁路的两个站点,那这个消息块就是火车,它负责运输货物。正如火车有火车头、车厢一样,消息块也有基本头,消息头和消息负载。RTMP协议当中,除了握手协议,其他的数据都是以消息块的方式发送的,发送一个消息时,当块大小比需要发送的消息的字节数更大时,一个消息块就相当于一个消息,否则消息需要分成多个消息块。 握手 +-+-+-+-+-+-+ +-+-+-+-+-+-+ | Client | | Server | +-+-+-+-+-+-+ +-+-+-+-+-+-+ |-------- C0C1 -------->| |<------ S0S1S2 --------| |--------- C2 --------->| C0和S0的格式(1 byte) +-+-+-+-+-+-+-+-+ | version | +-+-+-+-+-+-+-+-+ C1和S1的格式 +-+-+-+-+-+-+-+-+-+-+ | time (4 bytes) | +-+-+-+-+-+-+-+-+-+-+ | zero (4 bytes) | +-+-+-+-+-+-+-+-+-+-+ | random bytes | +-+-+-+-+-+-+-+-+-+-+ |random bytes(cont) | | .... | +-+-+-+-+-+-+-+-+-+-+ time: 4 字节 本字段包含时间戳。该时间戳应该是发送这个数据块的端点的后续块的时间起始点。可以是 0 ,或其他的任何值。为了同步多个流,端点可能发送其块流的当前值。 zero: 4 字节 本字段必须是全零。 random bytes: 1528 字节。 本字段可以包含任何值。因为每个端点必须用自己初始化的握手和对端初始化的 [Read More]
RTMP 

golang 后端开发思维导图

golang 后端开发思维导图

自己画的golang后台开发思维导图,当作笔记。 转载请注明原作者。 输入图片说明
by sheepbao.

Go 

深入理解go的slice和到底什么时候该用slice

深入理解go的slice和到底什么时候该用slice 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 先了解一下slice的特性 定义一个slice s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 slice的扩容 s := []int{1,2,3,4,5} s = append(s, 6) fmt.Println(s) // [1 2 3 4 5 6] 内置append函数在现有数组的长度 < 1024 时 cap 增长是翻倍的,再往上的增长率则是 1.25,至于为何后面会说。 slice的切割 s := []int{1,2,3,4,5,6} s1 := s[0:2] fmt.Println(s1) // [1 2] s2 := s[4:] fmt.Println(s2) // [5 6] s3 := s[:4] fmt.Println(s3) // [1 2 3 4] slice作为函数参数 [Read More]
Go 

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢go语言,如果有空能安静写写自己喜欢的代码,是多么的幸福。想好了就实践,Let’s do it,当然凡事都有个从简到繁的过程,下面的特性慢慢增加。 特性 特性,也可以说功能,以下是实现或者将要实现的特性 http代理 http请求响应的抓取 修改http请求 重复请求 同时监听多端口 支持socks5、websocket、https协议 界面支持终端和网页两种形式 安装 git clone https://github.com/zboya/gomitmproxy.git cd gomitmproxy go build 使用 http代理 gomimtproxy 不带任何参数,表示http代理,默认端口8080,更改端口用 -port http抓包 gomimtproxy -m 加 -m 参数,表示抓取http请求和响应 http代理科学上网 首先你得有个墙外的服务器,如阿里香港的服务器,为图中的Server,假设其ip地址为:22.222.222.222 在Server执行: gomitmproxy -port 8888 在你自己电脑执行: gomitmproxy -port 8080 -raddr 22.222.222.222:8888 然后浏览器设置代理,ip为localhost,端口为8080,即可实现科学上网 源码简析 对于网络编程,Anything is a socket! 实现http代理并不难,简单地说就是用代理服务器代替客户端去请求web服务,然后在把请求的结果返回给客户端。 先来个示意图: 1. 客户端发起一个到gomitmproxy的连接,并且提交了HTTP CONNECT请求。 2. [Read More]
Go 

使用gops轻松监控golang程序和性能分析 什么是gops gops是google开发的一个在你系统上列出和分析golang程序的工具。它也是一个golang的库,当你集成这个库以后,分析golang程序会变得很简单。 安装 go get -u github.com/google/gops 在你的程序中启动gops的agent package main import ( "log" "time" "github.com/google/gops/agent" ) func main() { if err := agent.Listen(agent.Options{ Addr: "listen tcp address", // 你想监听的地址,不填的话系统会自动分配一个端口给它用。 }); err != nil { log.Fatal(err) } time.Sleep(time.Hour) } gops使用 当你的程序嵌入了gops的agent,那么你就可以对你的golang程序进行诊断了。 除了诊断golang程序,gops程序也可以列出当前系统的golang程序和其系统,即时那些golang程序没有嵌入gops的agent。 注意的是只有程序嵌入了gops的agent才可以进行程序的分析,包括程序的堆、内存信息、cpu性能分析等 列出所有golang程序 $ gops 983 980 uplink-soecks go1.9 /usr/local/bin/uplink-soecks 52697 52695 gops go1.10 /Users/jbd/bin/gops 4132 4130 foops * go1.9 /Users/jbd/bin/foops 51130 51128 gocode go1.9.2 /Users/jbd/bin/gocode $ gops tree . [Read More]