先罗列下我的需求,有两台机器,一台windows 7,另一台mac,现在想在这两个机器间自动同步文件。两台机器位于不同的私有子网段,也就是说,躲在两个不同的路由器后面接入公网。因为nat的存在,使得两台机器间直接建立tcp连接成为不可能,想了几个方案:第一,通过一台有公网ip的机器中转,两台机器同时跟这台服务器建立tcp连接,定时交换文件时间戳并相应的更新。这种方案存在巨大的弊端,我的服务器在美国,两台挨在一起的机器,传送数据居然需要绕过层层路由跨过海底光缆传送到大洋彼端然后再传回来,速度慢,占带宽,太折腾。第二种就是udp打洞了,假设两台机器分别为A和B,中转机器为S,这样A和B都可以向S发送UDP数据包了,S可以得到NAT转换后的ip和端口号,由于UDP不是面向连接的,任何主机都可以向这个ip和端口号发送数据。理论上讲,只要S把这些信息告诉A和B,这两台机器就可以直接通信了。但是因为安全性的考虑,如果这个数据包的ip和端口号不是先前发给S的那个地址,就会被路由器丢弃。如何取得路由器的信任,是打洞最需要解决的问题。一个简单的想法是,A向B的NAT转换后的地址发送一个udp包,这样A的NAT对于B的这个地址就是敞开的了,如果B能发出具有这样地址的包,二者之间的连接就能建立起来。今天花了一个下午编写调试相应的代码,A和B之间的数据包始终不能成功接收,后来才意识到,A向B再次发送数据包...

最近想买辆车,相关的东西大致都看或者了解了下,以前对机械相关的专业了解的不多,甚至有些偏见。机械是个成熟复杂的领域,积累了很多研究理论,大量的极具巧思的器件。单单是对这些相关的器件的理解,足以对大脑的思考模式产生重大影响。举一个简单的例子,汽车在行进当中进行转弯的话,内侧和外侧的轮子的速度是不同的,这时候发动机的输出就要对不同的轮子进行适当调整,如何动态的做到?方法有很多种,最简单的方法,只用一个轮子作为驱动轮,这样其他轮子就只在地上滚动了,早期汽车用的就是这种方法,这种方法其实是在逃避问题,一个轮子驱动有很多弊端。现在的汽车都使用一种叫做差速器的简单装置,可以巧妙的处理这个问题,具体细节用文字解释起来比较麻烦,感兴趣的话可以到youtube上看相关的视频解说。现代的发动机是个复杂的装置,通过厂商鼓吹的一些技术特点,比如涡轮增压,可变气门正时,缸内直喷等,我们就可以猜测它里面的复杂性了,要通过经年累月的技术积累,不断的调整演化,才能成为一项成熟的产品技术,这也是国产发动机跟国外有很大的技术差距的原因。我们创造的任何事物和技术都处在不断的长期演变进化当中,其中有一些已经趋于稳定,比如剪刀,钳子,它们拥有简单的结构,材料结构的调整已基本最优,更多的变化空间已不大,但是我们仍然有各种针对特殊需求的剪刀设计出来,他们并没有停滞,只是稳定下来了而已。另一些还处于剧烈的变革当中,比如电视机,手...

在linode买了台vps,加州fremont机房,1G内存,24G硬盘,xeon L5520 cpu,ping值在180ms左右,性能速度尚可。有个公网ip的机器还是很有用的,比如开一些服务,可以在任何地方连上去,或者开vpn绕开长城。以前在一个叫cyberultra的新加坡运营商那里买了虚拟主机,一年下来几百块前,基本还算稳定。用了三年,下个月到期,想想还是换下吧,在一个地方耗的太久,因循守旧,就像人生,总是觉得乏味。今天在vps上装了个apache和mysql,整了整wordpress,把以前的数据导入,算是差不多搭了起来,换了个新的主题,尝试改变下。罗列一下遇到几个小问题,一个是permlink改变成非?打头的话,会导致404错误,找不到页面。仔细找了下,是.htaccess文件里的重写规则没有生效,在apache的配置文件的Directory项里,AllowOverride None会把这个选项关闭,改成AllowOverride All就可以打开了。另外还要注意看下apache的rewrite模块有没有打开。另一个是theme的问题,右边的widget里都有一个Click to view/hide的头,看起来很不协调。懒得去慢慢看代码修改了,先将就着,改天再换个主题用吧。自从眼睛出问题以来,心情精力严重下降,没有当初巨细靡遗的折腾劲了。现在微博微信大行其道,博客开始变得...

今天是3.14,所谓的Pi Day,借机发一下一直思考着的几个相关问题吧。我的高中数学老师给出了一个有趣的问题, 咋一看是如此的简单以至于可以作为小学生的填空题: 1和0.9循环哪个大?很多人会不假思索的认为1要大那么一点点, 而事实上这两个值是严格的相等。可以这么证明:1/3=0.3333..... 三分之一等与0.3循环,这个是我们都认为正确的结果,然后等号两边都乘以33 * 1/3 = 3 * 0.333333...... 就得出1 = 0.999999......这是一个让人惊讶的事实,跟我们的直觉不相符,但我们很容易接受推导过程。推导过程中有一个小陷阱,就是把乘法自然而然的推广到了无穷项并且不认为有什么不妥。为什么无穷项的表现总是让人觉得匪夷所思?我们对数字以及相应的操作法则,必定源于大脑的思维模型,绝不仅仅是后天得到的知识那么简单,应该牵涉到了大脑的某种本质的先天性的结构相关的东西,数学是对这些基础法则的抽象表达和推导。如果有一系列的个体,挨个排开,我们对每一个不同的个体用一个标记来代表它,比如第一个就是符号1,第二个符号就是2,这样我们就得到一个序列1 2 3 4 5 6 7 ........我们说自然数序列是什么呢,就是无穷个体的一系列标签,我们对这个群体的若干操作,就是对物理世界若干个体的不同操作,被抽象出来加减乘除等法则。比如,大街上站着一个人,我们看到并认为...

最近在调一个性能问题,过程中惊讶的发现,cpu竟然能够在一个时钟周期里执行多条指令。仔细google后发现还是我土了,这是cpu早就支持的一项技术,叫做superscalar,超标量。其实上学时计算机组成原理就翻来覆去的说这个概念,我一直理解为,超标量就是一条指令可以操作多条数据,进而达到一个时钟周期内达到几条指令的效果,而这其实是SIMD所实现的功能。写了个测试程序仔细研究了下。一个for循环在编译器不开优化选项的情况下,大致翻译成六条指令[code] for(unsigned i=0; i<0xffffffff; ++i);00FC1040 mov dword ptr [i],0 00FC1047 jmp test_cpu+42h (0FC1052h) 00FC1049 mov eax,dword ptr [i] 00FC104C add eax,1 00FC104F mov dword ptr [i],eax 00FC1052 cmp dword ptr [i],0FFFFFFFFh 00FC1056 jae test_cpu+4Ah (0FC105Ah) 00FC1058 jmp test_cpu+39h (0F...

2012年最后一天了这一年,工作,生活,都是惨不忍睹,健康问题更是每日折磨。不多总结了,总之,这一年是人生谷底,希望明年会好一些。