Monthly Archives: May 2016

如何在高丢包率的链路上建立低延迟连接?

这是其实通信领域的话题了,低延迟传输有上百种优化方式,上面说的那些冗余码只是很小一部分,不考虑信道容量的冗余编码系统都是在耍流氓,不用等到同信道内跑两套这样的协议你才会发现问题,一套协议再接近信道带宽容量限制时,就会出现指数上升的丢包率,所以不考虑带宽检测的冗余法就是一个残次品。 要系统的解决低延迟传输问题,需要同时在传输层,协议层,路由层,应用层几个方面着手: 传输层带外冗余:弱智重复法 设你要发送的数据为 x1-xn,你实际发送出去的包为 p1-pn,那么比如 Pn = [Xn, Xn-1, Xn-2],重复前面出现过的 1-2个数据,丢包了你可以随时恢复出来。 传输层带外冗余:异或法 每发四个包 x1-x4,你多发一个冗余包,内容为前面四个包的异或: R = x1 ^ x2 ^ x3 ^ x4,那么本组数据五个数据包(x1-x4, R)中任意丢失一个,都可以从其他四个异或得到。当然,不一定要四个包冗余一个,你可以根据情况和丢包率,两个包或者三个包冗余一个。 传输层带外冗余:解方程法 把每个数据包看成一个整数,要发送 x1-x4 四个包,并不直接发送x,而是将他们进行线性运算得到 y1-y7,然后发送出去: A1 * x1 + B1 * x2 + C1 * … Continue reading

Loading

Posted in 网络编程 | Tagged , | Leave a comment

如何在不同平台下打开新窗口运行程序?

如果可以让自己的工作效率提升一点点,那么即便花费几天来开发一些工具也是值得的。在不同操作系统下自动打开终端窗口来运行指定的命令就是这样一件能提高工作效率的事情。 就像 Visual Studio 调试命令行程序的人都对打开一个新窗口运行命令行程序的模式情有独钟。EditPlus 也提供新窗口运行程序(可惜只限windows)。 而如果你在使用 Sublime/Atom/GEdit/GVim 之类的工具,你就会发现调试程序的时候程序基本上是在下面的面板中运行的,所有输出也是输出到下面的面板中。这时如果程序长时间运行是非常不方便的,又或者程序有交互(需要输入数据),基于GUI面板的运行方式也会显得十分笨重,而Vim/GVim之流更过分,一执行程序整个GUI就定住了,没法一边看代码一边查看一些长时间运行的程序状态,虽然Windows下的GVim可以用!start来解决(见Gim !start),但十分遗憾,Linux桌面或者Mac下面的Vim都没有这个 !start功能。 同时,哪天你切换到Mac/Ubuntu下开发了,你会发现这个问题十分恶心,这时候你往往需要写一些脚本来做这件事情。而在不同的平台下正确的escape并传递参数,正确的生成中间脚本(bash,applescript,batch)并且通过管道传递又是一项比较浪费时间的事情。 所以这两天写了: https://github.com/skywind3000/terminal 这个脚本来做这些,满足了我如下需求: 在 Windows 下打开 cmd窗口执行若干命令 在 Linux 下打开 xterm/gnome-terminal 来执行若干命令 在 Mac OS X 下面打开 Terminal/iTerm 窗口来执行若干命令 不同的操作系统下提供统一的调用接口 可以方便设置:工作目录、窗口标题、窗口配置(Terminal/gnome-terminal/iterm) 新窗口内执行完程序以后可以会等待按任意键才关闭窗口 Windows 打开 Cygwin 的 Mintty窗口并执行 Cygwin命令(Windows下编辑,Cygwin下运行) … Continue reading

Loading

Posted in 随笔 | Tagged | 4 Comments

当面试官说「你之前做的项目没有什么难度」,应聘者应如何应对?

很多面试官喜欢在被面试者那里找存在,找面子,如果是这种情况,你和他辩论半天干嘛?继续驳他的面子么?非要让人家生气你才高兴么? 另一种情况是确实很简单,在这种情况下,你又何必强调难呢?非要让人觉得你水平很普通容易的事情都觉得难么? 再有一种情况只是正常压力面试的一个环节,不过技术面试少用。 不管哪种情况,你和别人抬杠都是不明智的, 所以,你得先承认: “也许这个工作在你们看来很简单,只需要xxxx” 然后说转折部分: “但是我当时从来没有接触过这一块,第一次做开始完全没有思路,也没有人可以问,查了好多资料,自己又踩了蛮多坑才弄出了一点点效果,比如其中一个坑是xxxxx,搞的的X天X夜,都没有思路,最后突然想起在哪里看过的一篇论文,心想也许可以结合一下,于是又通宵编码,重新设计了XXX,终于XXX” 技术虽然不算难,你可以突出你的学习能力和解决问题能力,然后接着要总结 “通过这个项目,我觉得写程序就应该保持不断学习的心态,就应该XXX,不能XXX,还要自己多尝试,不能光看资料,否则XXX,所以有了这次经验教训以后我在后来的XXX项目中,一开始就XXX,终于,比别人更好的做到了XXX,解决了问题,获得了公司颁发的年度XX奖” 没什么干货,可以多说你碰到挫折,和成长的经历,不能关说挫折,主要要说怎么克服挫折获得成长。当然有些面试官不可能等你说完长篇大论,他们会随时打断你,你需要很精炼的在几次对话中把意思表达清楚。 最后表达下自己的想法: “自己之前的基本上是一个人工作,一个人编码,很少能跟周围的同事一起交流,所以很低效,很孤独,就像穿着单衣走夜路一般,希望能和更多的聪明人在一起工作,一起交流讨论” 尊重他人,心诚则灵 —- 当然,上面都是瞎扯淡

Loading

Posted in 大浪淘沙 | Tagged | 1 Comment

钉钉真好用

自从用了钉钉,腰也不酸了,腿也不疼了: * 设置组织架构和通讯录,新同事根据部门自动入企业群。 * 除了部门企业群外,跟微信一样随意建立临时会话,员工离职退出所有群。 * 每个企业群配套“云盘”,可以把部门相关文档传到群的云空间里,供群成员查看。 * 详细查看未读消息,长时间未读的人可以短信提醒。 * 企业内部员工免费电话。 * 全平台:windows,mac,iphone,android * 配套企业应用:请假,公章申请,报销申请,打卡,工资信息查询 试过:泡泡,RTX,QQ企业,米聊,飞秋 以后最终发现还是钉钉最好用

Loading

Posted in 随笔 | Leave a comment

Vim异步编译工程

针对 Vim的最新版本,7.4.1769+ 写了个脚本:build.vim 来实现异步编译。 主要实现原理是利用 Python 开线程并在后台线程调用脚本(具体执行编译工作的bat/sh文件),实时把stdout/stderr输出的内容投递到队列,而前台UI线程则是使用了Vim最新版本中提供的 timer_start 功能启动一个100ms运行一次的时钟,每次运行时检测队列里面的东西并把他们取出来输出到Vim的 Quickfix窗口。 几处细节处理是避免后台任务瞬间输出上千行的内容,批量塞入Quickfix的时候把vim 给卡死掉,此处增加了一个限制,即每次时钟发生时最大只塞入Quickfix中50条信息。 如此,整个世界清静了,以前Vim一编译代码就完全无法编辑的情况可以得到很好的解决了。你可以绑定–到外部命令:job-1 job-4 这四个不同的脚本(windows下是 job-1.cmd – job-4.cmd),用来执行外部命令,每次执行前,把当前编辑的文件名等信息写入环境变量,这样后台job-n.cmd的批处理就可以根据环境变量决定需要编译的文件或者工程信息了: let $VIM_FILEPATH = expand(“%:p”) let $VIM_FILENAME = expand(“%:t”) let $VIM_FILEDIR = expand(“%:p:h”) let $VIM_FILENOEXT = expand(“%:t:r”) let $VIM_FILEEXT = “.” . expand(“%:e”) … Continue reading

Loading

Posted in 随笔 | Tagged | Leave a comment

GVim 中更好的运行程序

GVim(Windows)下面使用!运行程序是非常恶心的事情,比如调用python运行当前脚本: :!python % 你会发现,整个VIM界面被冻结了,然后弹出cmd窗口,退出cmd后,还要返回GVim中按任意键才能编辑状态。 比如你正在调试一个程序,这个程序运行起来不是一分钟能出结果的时候,你想边对照输出结果,边在 GVim 里面查看和修改你的代码,你就会发现傻逼了。正确的做法是: :!start python % 这样就不会卡住 Vim了,但是这个做法有个问题,程序结束的时候窗口马上关闭,因此还需要再进化一下: :silent !start cmd /c python % & pause 这时你会发现优雅的调用了 python 来跑当前程序,并且GVIM不会被挂起,照样可以编辑,当程序结束的时候,CMD窗口还会pause等待你按任意键一下,这就比较清爽了,你可以把这条命令map到你常用的快捷键上,和 EditPlus里面一样一键运行之。 然而还是有几处需要完善的地方,首先直接使用 % 展开当前文件名不妥当,如果文件名包含空格就会错误,需要用 shellescape 来进行处理,同时我们有时候还希望运行前跳转到文件所在的目录,运行完又跳转回来,又或者需要运行前保存一下没有保存的文件。 我写了个函数来做这个事情,放到你 .vimrc里即可使用,同时支持 GVim和终端 Vim:

Loading

Posted in 随笔 | Tagged | 1 Comment

更好的使用 Vim 标签(Tab)来切换文件

更好的使用 Vim7.0 以后推出的标签(TAB)功能,同现代编辑器一样用标签(TAB)来管理多文件,代替传统 Buffer List: 让 Minibufexplor/tabbar 这些上个世纪的插件都退场吧,直接使用标准的标签功能会更加舒服。 快捷键切换 TAB 第一件事情就是要搞定标签快速切换问题,不管是 :tabn X 还是 Xgt 都十分低效,我们需要更快速的在各个文件之间切换。最简单的是设置 0-9 来快速切换 tab(默认 leader 是反斜杠,即先按下 \ 键,再按数字键),不管终端还是 GVIM 都兼容: noremap <silent><tab>m :tabnew<cr> noremap <silent><tab>e :tabclose<cr> noremap <silent><tab>n :tabn<cr> noremap <silent><tab>p :tabp<cr> noremap <silent><leader>t :tabnew<cr> … Continue reading

Loading

Posted in 随笔 | Tagged | Leave a comment