go debug

 

点点滴滴

  1. 官方下载的二进制的GO是在 /usr/local/go 下编译出来的,所以调试的时候runtime的一些源代码会去这下面找,如果你把下载到的go放到了 ~/go 下面则会找不到,影响调试,可以做一个软连接,如: ln -s ~/go /usr/local/go

Memcached协议

缘起

Memcache 协议我们经常见到和用到的基本是基于tcp的文本协议了,如:

但是该文本协议无法直接套用到udp上,如:

 

但是,我们可以通过如下方式使用udp协议:(参考资料: http://www.cnblogs.com/kevintian/articles/1197681.html

首先,从数据上来看,既有二进制的数据,也有文本的数据; 从协议上来看,是UDP的,这应该算是文本协议for udp;

官方资料: https://github.com/memcached/memcached/blob/master/doc/protocol.txt   (页面中搜udp)

tcp不支持该写法:

 

二进制协议

对于memcached的二进制协议: https://code.google.com/p/memcached/wiki/BinaryProtocolRevamped

但是,对于UDP而言,目前Memcached还不支持多个数据包的UDP请求的

 


总结

文本协议: https://github.com/memcached/memcached/blob/master/doc/protocol.txt

二进制协议:  https://code.google.com/p/memcached/wiki/BinaryProtocolRevamped

阅读memcached的源代码得知: 文本协议和二进制协议都可以用于tcp或udp

对于UDP而言,在上述协议的基础上 添加了8字节的udp header,文本协议和二进制协议都如此; 于是导致了文本协议在udp传输时携带了部分非文本的数据

参看: memcached.c 中的 drive_machine() ; 对于udp而言,是在 try_read_udp(conn *c) 时处理完了 8字节的udp头后返回协议数据的,然后 try_read_command(conn *c) 中判断是否二进制协议时,已经是去掉了udp的8字节header了的

git 记住用户名密码

缘起

git push的时候总是提示输入用户名密码是一件非常影响工作效率,也非常影响心情的事情,下面介绍一下如何免去这种无聊的操作。

解决办法:

如果git仓库支持ssh的话(如github.com),可以通过add ssh-key的方式来实现: https://help.github.com/articles/generating-ssh-keys/

如果git 客户端版本够高的话 (git version >= 1.7.10 ),可以设置 credential.helper ,参考: https://help.github.com/articles/caching-your-github-password-in-git/#platform-linux

如果git版本太低的话:参考:   http://stackoverflow.com/questions/5343068/is-there-a-way-to-skip-password-typing-when-using-https-github

try in golang

上面这样写的try,基本实现了try..catch.. 的功能,但是,如果要在catch中提前return,就不那么方便了,虽然也能做,且看下面这个版本, 我们不妨实现try、try..catch.. 两个函数,需要立即返回的时候,使用try更方便些:

 

memcache源码阅读笔记

二进制协议对于udp的情况,如果需要分包,则包头只有一个;但是没有看到是如何保证多个数据包的顺序的

add_msghdr 是做啥的? msghdr 是sendmsg() 需要的,定义如下:

 

多个包的顺序大概可以通过 sendmsg() 来实现; 然后再了解一下recvmsg吧,或许可以解决顺序问题的

 

libmemcached/udp.hpp 中有如下定义,但是memcached中却没发现类似定义:

 

Memcached中发送UDP数据包使用的是sendmsg(…) 接收UDP数据包使用的是 recvfrom(…)  ; 为啥不是recvmsg(…) ?

C语言中的static关键字

下面验证我昨天问你的一个问题:

1.c 中调用了 2.c 中的一个static函数;

这里完全可以, gcc –o test 1.c    ; 2.c 是多余的,因为1.c中include了2.c了

 

可能是我哪里错了;

把2.c 编译成一个动态的so文件,改so文件依然导出了这个static的a函数

):

  1. 定义和声明是两个概念
    1. 如果包含了定义的文件,则可以使用static 定义的函数的
    2. 如果包含的是声明的文件(就是都文件),则编译的时候必然需要找到一个外部的该符号
    3. 如果使用static定义的,则,不管编译成 .o 文件还是 .so 文件,该符号是不导出的,外部就是没法用的
  2. 一般来讲
    1. .c 文件和 .h 文件对应出现,.h 中声明外部可以使用的函数,显然不会把static的函数写到.h 中的
    2. 每个 .c 文件都单独编译成一个.o 文件,此时 static 的函数就已经被处理的外部不可见了

Intelij 14注册码生成器

保存为:KeyGen.java

 

 

 

然后:

javac KeyGen.java

java -classpath . KeyGen

输入用户名后,回车可生成注册码