vim 插件机制

VIM中有一个rtp变量,可以通过set rtp 来查看,这个变量写的可能是多个目录,如果要加载一个filetype=go 的文件,则vim会搜索rtp中指定的路径,在这些路径(权且用xxx标识)下,搜索xxx/syntax/go.vim 来加载语法文件,搜索 xxx/indent/go.vim 来查找缩进方式文件,等等

outlook 如何更新密码

如果你使用的是outlook,如果邮箱密码变更了,一般情况下outlook会提示你重新输入密码,但是有时候不会(可能已转为脱机工作模式),这时候,想找到那个修改邮箱密码的地方是很难的,下面是我发现的一种方法,点击下图中的“脱机工作”图标,就会染出重新输入密码的对话框,输入新密码就OK了

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 的函数就已经被处理的外部不可见了