作者归档:mzh

Golang--新的方向?

![go-11-is-released_gopherbiplane5](/2014/12/go-11-is-
released_gopherbiplane5.jpg)

很早就听说了Golang的大名,只是远观(当时觉得太难了= =)
刚到公司的时候,研究过一段时间的coreos—-大部分都是Golang写的,还是觉得语法很啰嗦……
几个月之前,老大就跟我谈过新系统可能用Golang来写,弥补我司只有Python这条技术线的弊端。
所以买了个app学Golang,但是没有开始上手做东西,只是跟着教程了解了一些特性,然后就荒废了。

由于最近开始研究Python性能提升的可能,异步库gevent,直接的epoll,非拷贝的meoryview各种黑科技都用上,但是并发10K
rps实在是没办法跨过的一道坎,索性,反正都是epoll/kevent,直接换Golang试试。

写了3天之后,我发现要接触一门新的语言,还是直接写小项目来得快,我之前看的教程在这个时候虽然有帮助,但是还是没有自己写过记忆来得深。
越写越爽,直接写了一个玩具级的多聊天室的聊天程序。
github.com/mengzhuo/go-chatroom

几点感触:

  • Golang真的是侧重于服务端编程的语言,大部分语言哪个语法层面支持协程?
  • 有静态语言的优点,又有动态语言的编译速度和灵活度(和Python比)
  • 没了显形的OOP,我竟然很喜欢,原来很讨厌的特性之一,但是接触时间长了,Golang才是KISS,减少了多重继承导致的不确定性
  • 动态语言经常会在函数内部更改实参,静态不允许这个,逻辑上出错的概率降低了
  • share memory by communication用得好的话,能最大程度简化竞态(当然渣的话,就悲剧了),不过有race detector(太方便了!)
  • err起初真的很讨厌,但是后来发现,这里面就是KISS,如果和JS、Python这样,从中间直接raise,那么处理异常的函数就会特别复杂……还不如果简单地在边上就处理了~
  • 随便就用一个环境变量GOMAXPROCS就解决了利用CPU多核的问题,我们Python程序员各种泪目啊

Golang语言是真的为我们服务端程序员量身定制的!

2014年终总结

2014年 —- 变

职业上处于转型做游戏服务端的时期 感觉下来,Web服务端和游戏服务端最大的不同就是状态的维持和在线用户之间数据的共享和广播。

虽然学习了很多游戏服务端相关的知识,转型期还是有代价的,钱就不说了,web端学习到的很多知识基本就荒废了,特别是javascript相关的。
接触下来,我发现用什么语言并不是很重要了,毕竟后面的思路,算法,基本上是一样的。
书,基本没有看,但是我认为这不代表不学习,因为大部分时间都花在了学习读博客/文章/问答,写代码上了。

语言方面,没有进一步发掘Python的性能了,因为再深入,就是C了。学习了Golang,现在算是个初学者了吧。

还上线了一个"一次性邮箱" https://34nm.com 为啥叫这个奇怪的名字?
是因为@符号正好在34之前,nm正好在".“之前,就是这么简单的原因。 目前发送了451封邮件,阻止了893封,用户数166
作为一个小工具,我觉得达到了我当初100个用户的期望

同时,通过这个网站,学习到了很多TLS,加密相关的知识,SMTP指令相关的知识。
Github上记录的commit有149个,不过大部分都是给其他程序修修补补。

工具方面,换成了Mac,效率提升了不是一个档次。

今年你所完成的最重要的事情是什么? 完了……我觉得没有 今年你所学到的最有用的是什么? 花了3个星期学个Golang,太值当了

满分10分,你在这一年对自己的满意度有几分?

今年不及格,4分,应该花更多的时间来学习和整理知识,不能老是说各种借口的 你明年想要实现什么,要不要来个前所未有最棒的一年?
做一个手机App游戏,自娱自乐一下:)

#年终总结

Python标准库小窥[2]: memoryview

要讲memoryview,就要讲它的主要应用场合—-缓冲区(buffer)
要讲buffer前就要讲讲Python的字符处理:Python中的字符是不能修改的 例如
当你需要收集从socket.recv上来的代码时,大部分的人都选择了拼接字符串

while not self.sock.closed:
data = ''
while len(data) < 1024:
d = self.sock.recv(12)
if not d: return;
data += d

殊不知,由于Python字符串的特点,这实际上是将data复制一份,然后于d进行拼接,然后再赋值给data。
当字符大小有1M左右的时候,这种复制的效率会下降10%左右(其他大小没有测试过,但是应该是字符越大,复制的效率就越低,毕竟要重新分配内存区域并填满是很费事的)
而且网络传输有个特点,就是客户端想传多大都可以,所以就会出现只传输部分数据的情况,这时,socket.recv循环次数增多,导致字符缓冲区复制的操作次数增多。
所以,对于已知缓冲区大小下,可以先分配大小的缓冲区,然后依次写入相应数据即可(不需要复制了)。 改装上面的栗子,我们假定已知缓冲区应该有1KB

buf = bytearray(1024)
mv = memoryview(buf)
i = 0
while i < 1024:
i = self.sock.recv_into(mv)
if not i: return; # remote closed
if i < 1024:
mv = mv[i:1024]
i += i

即可

OpenSSL TLS cipher性能横向对比

使用的是Python的SSL/TLS库(反正也是用OpenSSL的)

  • Ubuntu 14.10 Python 2.7.8/Gevent 1.0.1
  • OpenSSl 1.0.1j
  • CPU: 双核I5
  • 内存:4G
  • 网络:1000Mbps网卡
  • 没有使用特殊的加速硬件

  • 交换算法:ECDSA虐哭了RSA
  • 加密算法:
    • RC4-MD5完胜其他(但是不安全),
    • DES系的性能集体阵亡
    • AES还是有不错的性能

详情就看图吧(数值越低越好)

屏幕快照 2014-11-23 21.28.45

加密传输次数增加 对于 总完成时间影响

屏幕快照 2014-11-28 21.58.43

加密数据总量增加 对于 总完成时间影响

屏幕快照 2014-11-28 21.59.08

并发数 对于 总完成时间影响

[具体数据表格在这里](https://docs.google.com/spreadsheets/d/1kvt8NOHFZR0yNhl9pUxm-
Lgn5EnHVmRBTvYQGCHTcso/edit?usp=sharing)

OpenSSL 笔记

2014-11-17

准备知识
  • 私钥/公钥签名算法 之后要说的RSA、ECC(椭圆曲线加密算法)都是其中的一种。
  • 迪菲-赫尔曼密钥交换 简写就是DH
  • ECDH 椭圆曲线DH 使用椭圆曲线签名算法用来进行密钥交换
  • SHA 1-N 、MD5 都是摘要算法,运算出的值进行校验
  • AES DES 3DES RC4 都是加密算法,用来加密传输用的数据

所以ECDH-ECDSA-AES256-GCM-SHA384 意思是: 使用ECDH协议交换以ECDSA为加密算法的公钥,
AES256-GCM加密算法加密传输数据 SHA算法384位强度进行校验

证书制作流程

一般流程是:

  1. 生成自己的私钥
  2. 用私钥生成csr(Certificate Signing Request 验证签名申请)
  3. 将csr提交CA(Certificate authority 验证管理局)
  4. CA发回一个crt(Certificate 验证文件)
  5. 将CA发回的crt和CA公开的crt进行叠加(先后顺序不能颠倒)
  6. 在应用程序中设置keyfile为自己的私钥
  7. 在应用程序中设置certfile为叠加后的crt文件

+-----+ +-----+
| You | | CA |
+-----+ +-----+
-------------------------------\ | |
| Generate private key and CSR |-| |
|------------------------------| | |
| |
| give CSR |
|------------>|
| | ------------\
| |-| check CSR |
| | |-----------|
| |
| give CRT |
|< ------------|
-------------------------------\ | |
| Set your CRT and private key |-| |
|------------------------------| | |
| |

自签名流程:

  1. 生成自己的私钥
  2. 用自己的私钥生成CA crt
  3. 如果需要自签署其他csr,需要执行命令
命令cheatsheat

生成RSA私钥:

openssl genrsa -out myrsa.key 2048

解释: genrsa (generate rsa), 2048是位数 生成ECC私钥:

openssl ecparam -name secp256k1 -genkey -noout -out myecdsa.private.key

解释: secp256k1是曲线的名称 可以用openssl ecparam -list_curves找想要的曲线 生成csr文件:

openssl req -new -sha256 -key [私钥地址] -out [想要csr的地址]

解释: sha256是之前说的摘要算法,默认的sha1已经不再安全了 生成自签名crt文件:

openssl req -new -nodes -x509 -key [私钥地址] -out [想要的crt的地址] -days [想要的天数]

自签名csr文件:

openssl x509 -req -in [CSR地址] -signkey [签署用的私钥] -out [想要的CRT地址] -days [想要的天数]

验证签名文件信息:

openssl x509 -in [CRT文件] -text -noout