2011年12月31日星期六

2012 resolution

每年元旦前后都会制定来年计划,可是一年到头来,回头看看履行的情况总让人心灰意冷。
晚上老婆去天坛许愿,出门前问我来年有什么愿望。
我想了想"三条腿的理论",说:长胖。

2011年12月11日星期日

我家的挂表

昨天在朝阳大悦城买的
超静音

2011年11月30日星期三

新手提车小记

用chli的话说,就这样一下回到了解放前。用工作以来的全部积蓄,买了辆小汽车。号快到期了,再加上反正也不懂,就随便买了一个。
虽然交款第二天这款车型就上了央视的每周质量报告一通批判,可我还是很开心。心想有了车以后,去看父母再也不用在公交车上浪费宝贵的时间了。
销售小李帮我把车从4S店的洗车房里开出来,放在了青年路的路边换我上去,嘱咐我说,别忘了松手刹。
离开驾校5年零9个月以来,第一次自己开车。之前1个月摸过两次朋友的车,不过都没开出去多远,一次在院子里转了转,一次在试驾路线上兜了半圈,而且都有司机在边上指挥着。
这次,说实话,很紧张。
我坐上驾驶座,等老婆坐上副驾驶座,都扣好安全带,就松手刹、给油、窜了出去。
这时销售敲车门,大声问,松手刹了吗?我踩住刹车回答,松了,然后又给油窜了出去。
刚窜出去又一脚刹车,让左边一辆残疾三轮过去。
等他过去之后,缓缓给油,慢慢开起来了。在青年路的试驾路线上开了一圈,试驾路线上几乎一辆车都没有,觉得太假了,于是回到了姚家园路,准备回家。
本来在手机上安装调试好了付费版的凯立德导航软件,下载了离线版北京地图,可是完全无心打开,只觉得周围都是车,特紧张。根本不敢分心去掏手机。
心想,嗨,我车没牌我怕谁。就顶着一张临时牌照一路。。。蜗行回家了。
按照常识最外侧车道用于右转弯或者出主路,那我就在最里侧走吧。没想到这条车道是左转弯掉头的。
汗死。
由东向西到了东三环,要右转,狠心往右并线要出主路,右侧车队死活不给空档,还挤进来一辆9XX公交挡住了我的半个屏幕。左右摇摆之际,后面喇叭声此起彼伏。
到了出口的位置,妈的老子还在直行道上打着蹦灯没拐出去呢,急了,一把转盘一脚油门挤了出去,然后一脚刹车踩死定在了9XX屁股后面。
原以为老婆在旁边吓得惊惶失措了,没想她还挺高兴的,说道:"老公,你真棒!"
汗死。
到了桥下,发现其实刚才沿着主路直行到桥下也能右转,没必要拼了命地提早挤到辅路上来。
三环上走不起来。40%时间点着刹车往前蹭,30%时间滑行,5%的时间给点油,其他时间拉上手刹开风景。
当然,看风景的心思是没有的,只有在车里瑟瑟发抖的份:紧张+不知道空调热风怎么开。
安华桥掉头,两次右转270度=负180度那种,出主路又出不来了。打着蹦灯看着漫长的辅路车队,颇有沉舟侧畔千帆过的感觉。然而不是卧在船上看,而是要扭着脖子看。因为车身已经转过了30度,这次右侧后视镜视野完全不对,看不到辅路车辆,只能回头通过后排右侧车窗观察。差不多等了一个红灯的功夫,终于没车了,转上了安华桥。
终于到家了。可是。。。噩梦才刚刚开始!
最恐怖的路段,是进小区门之后。这是一个老小区,路只有三道宽,一道是规划停车位,停满了大大小小的车,另一侧地上画着禁止停车的标志,也停满了大大小小的车。
进门保安撕条递给我,我给油冲隔离墩,没控制好,留给他一个屁股。放了3个车窗才把自己的车窗放下来,伸出头去说,我停这儿去办车证,行吗。他说,这不能停,往前去,停前头那儿。
我再想往前开,发现已经不能开了,已经快顶到前面停那儿那车上了。想那就往后倒一点吧,后面进来一辆金杯,滴滴冲我按喇叭。
我勒个去。
我就在那里踩着刹车原地打轮,不敢碰油门。
金杯按耐不住,自己往后倒了一点,噌地窜了进去。
我一着急,刹车踩成了油门,往后跳出去老远。好在后面没人,赶快一脚刹车站住了。
看来倒车的时候不仅容易分不清左右,而且也容易分不清前后啊。
稳定一下情绪,踩着脚刹靠怠速驶入小区,边爬边寻觅车位。
这时对面从饭馆开出来一辆运货的小面包,迎面驶来。怎么办,只有一条可用车道啊。千军万马过独木桥么。狭路相逢勇者胜么。桥到船头自然直么。车到山前可路在哪儿呢。
缓缓地,他往左蹭蹭,我往右蹭蹭,好在相遇点两侧都是小车。我看到我的左侧后视镜距离面包车的左侧后视镜只有12厘米到15厘米,右侧后视镜距离停那儿那辆桑塔纳的右侧后视镜只有4厘米到9厘米。
过去之后我才纳过闷来,那叫后怕。天哪,我这是怎么过来的。。
继续在小区里逡巡。
逡巡许久,终于找到了一个理想的车位。停进去。右侧有矮墙,副驾门开不开。
老婆说,那我从你那边爬出去吧。
我说,别,我往回倒点。
老婆下车后,我又把车往边上靠了靠,停稳,轮回正,拉手刹,放P档,拔了钥匙,走人。

2011年11月20日星期日

马尔代夫满月岛攻略

11月15日
早上9点从T2航站楼出发,这个周二早高峰时间路面上的机场巴士不靠谱,于是7点半在北三环上打了个车,去三元桥换机场快轨。8点5分到机场柜台,被告知再有五分钟通道就关闭了,真悬!下午2点多到马累机场,出飞机差点被热死。老子还穿着秋裤,在赤道上忍了2个多小时才到房间。坐船到满月岛,前台交400$押金。喝了一种非常好喝的饮料,填了张表格。
先住沙滩屋,洗澡的地方是上半露天的,洗的慢了会晒伤。还有个阳台,阳台外有个水龙头可冲脚,因为从沙滩回来通常脚上都是沙子。傍晚到海滩走了走,订了第二天的海豚巡游。
16日
5点多起来看了个日出的尾巴,趁太阳不太猛,到处走走拍拍。金色的朝阳暖暖地打在沙滩上。
吃完早餐就回房睡觉。下午下海游了会儿泳,又睡了。
傍晚出海去看海豚巡游。没有见到海豚。日落很美,浪很大。
17日
搬家到水屋,有车接。水屋特别好,洗澡的地方有270°的视野看海景。从阳台可以直接下水。中饭后,我们就下海试了装备。
累了就回房睡觉,或者在阳台的躺椅上吹海风,吃苹果。
18日
又看了个日出的尾巴。上午在浅滩看到了小鲨鱼,还有上千条小鱼。
中午继续在阳台晒太阳,忽然想到一句词"海空凭栏阔",不知出处。后来才知道是杜撰出来的,没有这样的说法。如果把"凭"和"栏"断开,把前者解释为"是因为",那么这句词就有了含义:觉得海面空旷,是因为阳台宽敞。
下午在近海浮潜,拍水下小鱼。拍到了一些。
晚饭去吃了烛光晚餐。
19日
什么也没做,上午睡了个懒觉,中午交了房就坐船回机场了。

心得:
自始至终没觉得是出国,到处是中国人。还以为是到了三亚。
满月岛貌似由喜来登托管,国际化做的不错,几乎所有服务都有中文。那些不懂英语的富二代到了岛上也不会饿死。
自助餐貌似不用给小费。烛光晚餐和出海看海豚巡游直接记账就好,不用给现金。账单上已经包括了消费。
早餐相当丰盛,一坐下就有人来给你倒咖啡、橙汁。豆奶很好喝。各种面包点心粥。各种鸡蛋的做法:煎蛋、水煮蛋、蛋卷。各种果酱和水果。
浮潜装备因人而异,本人因为视力不好,带上面罩水下什么也看不见,只好换带度数的泳镜。气管的塑料味和海水的咸味让我恶心,在嘴里咬了一会儿就扔一边了。穿着救生衣,很难潜到水下太深的地方。大陆架很长,水也不深。脚蹼很好用,没有它基本上游的速度是0。光脚下水很危险,水下珊瑚轧脚。
水屋柱子上有一种奇怪的螺,不小心靠近柱子的时候碰到,手被剌出一个口子,直流血。
岛上只有一个地方可以免费上wifi,在Lobby旁边的网吧。
我们搭乘的是海航的飞机,往返各含两餐,一顿正餐有热米饭,一顿落地餐是三明治。回到北京是凌晨2点半,公共交通工具不要想了,直接打的回家。
自己带了一箱子吃的,因为酒店管4顿早餐,2顿晚餐,所以另外还有6顿饭要自己解决。
不用带水,房间里有瓶装水,还可以烧开水。
防晒霜不能省,我们每次下海前都抹,仍然会晒黑,不过不会晒伤。
不要为整天介睡觉而懊丧,心情好精神好是最重要的。这就是马尔代夫度假的意义。
如果平时苦日子过惯了,开始一两天会无法进入状态,适应不了这么慵懒并且奢靡的生活。带着一点批判去享受它,慢慢就好了。回到北京之后,你会忽然发现,哇塞自己的执行力好强。

2011年11月12日星期六

测试MathJax

下面的欧拉公式可以在网页上自动渲染。
$$e^{2\pi i}=1$$
这是因为我在Blog模板的<head>中加入了公式渲染引擎

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"> </script>

还可以使用inline的公式渲染。例如$\frac{\partial^2 \phi}{\partial x \partial y} = \frac{\partial^2 \phi}{\partial y \partial x}$呵呵。
只需要加一行 <script type="text/x-mathjax-config"> MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$']]}}); </script>

2011年11月11日星期五

2-SAT

总算release了,释放一下,找个简单的问题自娱自乐一把。
n个变量组成m个子句的句子,其中每个子句中恰有两个变量用或连接,每个变量可以替换成他自身的取反,子句之间用且连接。
给一个这样的句子s,求一组真值分配。

算法:
如果存在一个不成立的子句,就反转其中一个变量。
反复为之,直至超过循环的最大次数。

(听到一个声音说:这叫什么狗屁算法,这不就是在瞎蒙么!)

实现:
import random, re

sentence = lambda n, m: " and ".join(["(%sx%d or %sx%d)" % (
                random.choice(["not ", ""]), random.randint(1, n),
                random.choice(["not ", ""]), random.randint(1, n)) for i in xrange(m)])

def detect_self_contradict(sub):
        (i, j) = re.match(".*?(\d+).*?(\d+)", sub).groups()
        ret = i == j and sub.count("not") == 1
        if ret: print i
        return ret

def solve(s, a):
        for _i in xrange(10000):
                print _i, a
                exec(";".join(["x%d=%s" % (i+1, a[i]) for i in xrange(len(a))]))
                if eval(s): return a
                for sub in s.split("and"):
                        if not eval(sub):
                                i = int(random.choice(re.match(".*?(\d+).*?(\d+)", sub).groups())) - 1
                                a[i] = not a[i]
                                break
        return "failed to solve %s" % s

a=[True]*20
s=sentence(len(a), 24)
if any([detect_self_contradict(sub) for sub in s.split("and")]):
        print "no way! %s" % s
        exit()
print s
print solve(s,a)

一次试验:
python 2sat.py 
(x19 or x6) and (not x1 or x20) and (x5 or not x20) and (x14 or not x20) and (x4 or x2) and (not x19 or x2) and (not x15 or not x6) and (x8 or not x15) and (x9 or not x17) and (not x11 or x4) and (not x16 or not x4) and (not x17 or not x11) and (x20 or x20) and (not x12 or not x16) and (x13 or not x10) and (x3 or not x17) and (x17 or x14) and (not x10 or not x6) and (not x13 or x19) and (x3 or x1) and (not x5 or x8) and (x15 or not x3) and (x1 or x1) and (x3 or x4)
0 [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
1 [True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
2 [True, True, True, False, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
3 [True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, True, True, True, True, True]
4 [True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, False, True, True, True, True]
[True, True, True, False, True, False, True, True, True, True, False, True, True, True, True, False, True, True, True, True]

我试验了很多次,发现凡是有解的时候,都不需要迭代很多次。

再分析:
如果存在一个满足句子s的真值分配A,那么令当前分配X[k]与A相同的变量个数为f(A, X[k])。
每次循环,至少有一半的概率f(A,X[k+1])=f(A, X[k]) + 1

为了证明这一点,假设一个当前未满足的子句X或Y,A以概率p取T,T,以1-p的概率取T,F或F,T。当前取值X[k]显然为F,F,那么f(A,X[k+1])=f(A, X[k]) + 1的概率依全概率公式得
p*1+(1-p)*0.5=0.5+0.5p>=0.5
证毕

f(A,X[k+1])=n时,我们就求得了一个真值分配。


这个试验告诉我们一个道理:如果你相信存在一个真理,并且在实践中发现每次尝试的试错概率不超过一半,并且每次尝试成功都可以向真理靠近一个常数距离,那么,你就大胆地去不断尝试吧!(听到一个声音说:这叫什么狗屁道理。。。)


2011年10月24日星期一

1977

1977年什么也没有发生。今天,2011-10-24,也不是什么特殊的日子。
但是当混用python和awk时,神奇的事情就这样发生了。

os.system("awk '{print %s}' a.txt" % str(datetime.date.today()))

输出
1977

坑爹啊。。。

2011年10月16日星期日

Fwd: 分析笑话:数学系有三个班

“数学系有三个班”是真的,可我从来没听过这样有趣的对话:
先分析一下原版的吧,说来惭愧,还是老婆给我讲明白的呢。

数学系一共3个班。
男生:你是3班的么?
女生:原来你是2班的啊!
男生:你是1班的啊!


初始:
男生知道自己是2班的,男生知道女生不是自己班的,所以男生知道女生是1班或3班的
女生知道自己是1班的,女生知道男生不是自己班的,所以女生知道男生是2班或3班的
第一句话:
男生问女生是不是3班的,相当于宣布自己不是3班的,因为如果男生是3班的,他就不用问这个问题了。这里假设这两个人认识自己班的所有人,并且彼此知道这一点。
所以女生知道男生是2班的了。
第二句话:
女生说“原来你是2班的啊”,相当于宣布自己之前不知道男生是2班的,现在得到足够的信息知道了。
第三句话:
男生是如何推断出女生是1班的呢?
假设女生是3班的,那么女生只能知道男生是1班或2班的。那么男生告诉女生自己不是3班的并没有给女生提供任何新的信息。那样的话,女生就不足以推断出男生是2班的。这和第二句话不符。
所以女生只能是1班的。



趁老婆还在玩iCloud没去睡,再分析一个鬼谷子版的吧

一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓, 把这两个数
的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。第二天, 庞涓很有自信的
对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知 道。随后,孙膑说:
那我知道了。庞涓说:那我也知道了。

这其实就是YaoQiZhi老师课上讲的Mr. S & Mr. M的故事,当时觉得好难啊,现在学了点python,觉得暴力破解法很直接,code也不过一屏。


from itertools import product
from collections import defaultdict
n=552
a0 = set([p for p in product(range(2,n), range(2,n)) if p[0]<p[1]])
print len(a0)
s=defaultdict(set)
m=defaultdict(set)
for (x,y) in a0:
        s[x+y].add((x,y))
        m[x*y].add((x,y))
print len(s)
print len(m)
#I don't know, you don't know
a2=set([(x,y) for (x,y) in a0 if len(s[x+y])>=2 and len(m[x*y])>=2])
print len(a2)
#I know you don't know
a3=set([(x,y) for (x,y) in a2 if all([len(m[p*q])>=2 for (p,q) in s[x+y]])])
print len(a3)
#you know
a4=set([(x,y) for (x,y) in a3 if len(a3 & m[x*y])==1])
print len(a4)
#I know
a5=set([(x,y) for (x,y) in a4 if len(a4 & s[x+y])==1])
print a5


ytwang$ time python v.py
150975
1097
77432
105205
4753
2058
set([(4, 13)])

real     0m18.002s
user     0m17.919s
sys     0m0.079s



计算复杂度的瓶颈在求a3,也就是“我知道你不知道”这句话蕴含了绝大多数信息量。




2011年10月10日星期一

Fwd: 内省+变长参数的lambda表达式

最近看某同事写的python代码写的很漂亮,不禁羡慕。
恰好另一个同事买了本python教程,便拿来学学。
写了个练习。

From Evernote:

内省+变长参数的lambda表达式

class Client:
    def __init__(self, endpoint):
        self.endpoint = endpoint
    def wget(self, query):
        url = "http://%s/%s" % (self.endpoint, query)
        import urllib
        #todo wget and return response
        return url
    def __getattr__(self, attr):
        return lambda **kargs : self.wget(attr + "?" + "&".join(["%s=%s" % (k, kargs[k]) for k in kargs]))
   
   
if __name__ == '__main__':
    a = Client("baidu.com")
    print(a.q(keyword = "s"))
    print(a.q(keyword = "s", charset = "UTF-8"))



结果


2011年10月6日星期四

滑雪板理论

我假设你滑的是双板。
当你倒在雪地里,发现两个雪板都不见了,那是最开心的。你可以立刻起身,东张西望,去捡你的雪板。你可以先捡左脚的雪板,再捡右脚的雪板,也可以先捡右脚的雪板,再捡左脚的雪板。你可以在雪地上自由行走,比穿着雪板的时候自由得多。只要不被后面失速的其他人再次撞到就好。
当你倒在雪地里,发现左脚的雪板不见了,右脚的雪板还在脚上,是很郁闷的。你的右脚别在那里,不仅不能发力,而且不能提供合适摩擦力。单靠左腿的力量又不足以起身。你有两种选择,要么等人来拉你一把,当然这意味这你将命运交给了运气和泊松过程,要么你用撑杆把右脚的雪板脱掉,如果你的撑杆没扔出去的话。如果选择后者,相当于你把问题规约成了两个雪板都不见了的情形。你可能知道这个问题解起来更容易,也可能是歪打正着。
当你倒在雪地里,发现左脚得雪板还在脚上,右脚得雪板却不见了,也是很郁闷的。你右腿的力量可能强些,因为你踢足球,但是单凭右腿起身仍有些费力。你无非多一种选择:拼了命地站起来。虽然教练不是这样教你的。
当你倒在雪地里,发现两只雪板都TM还在脚上,你可以像个婴儿一样哭了。你觉得很亏,因为不仅要费力把两只雪板一只只脱掉,从这白茫茫的斜坡上站起来,还要把这双雪板摆成平行于等高线的角度,小心穿进去。你觉得委屈,因为这比掉了一只雪板还要费事,却在外人眼里看来还挺幸运的。

然而,倒在雪地里,还是很舒服的,至少它是一个稳态。
滑雪最不舒服的时候,是你发现自己已经超速,失去了对身体平衡和速度的控制的时候。
你喜欢一切尽在掌控,你后悔干嘛要跑到中级道上来吃饱了撑的没事找罪受。
你感到身体正在向左倾斜,同时向右旋转,你努力回忆教学视频上的内容,大脑却一片空白。
你感受到梯度下降,同时感受到无法忽略的水平位移。
你盼望着奇迹发生,身体赶快恢复平衡,严格按梯度下降,然后安全地在紧支集外面着陆。
但是力不从心,你知道你坚持不到平地了,你重心在下沉,心里盼望着赶快进入另一种稳态,哪怕摔得很难看。
你盼望着摔得两只雪板都不见了才好,如果不能,摔得两只雪板都在脚上也行,无非费点事,脱掉爬起来再穿上。
你想赶快结束这个痛苦的"要摔还没摔,没摔就要摔"的该死状态。
你开始破罐破摔,给自己捣乱,右脚外脚掌向里扣,想引入一个扰动,把自己弄倒。
然而速度太快了,这点扰动简直蚍蜉撼树,无济于事。
你重心继续下沉,两腿僵硬,死盯着雪板的前尖,越来越害怕,心里除了念着"wo cao wo cao"就已经没有了任何建设性意见。
就在这时,你发现你已经开始减速了。抬头看看。是的,恭喜你,你已经到平地了。
这时你腿一软,pia,摔那儿了。

这不是看辛普森。

2011年10月4日星期二

上帝存在,帕斯卡说的

“我们既不知道上帝的存在,也不知道上帝的本质。然而我们将倾向于哪一边呢?……,这里进行的是一场赌博,…… 让我们来权衡一下在上帝存在的赌注中的得失。让我们估计这两种可能性,如果你赢了,你赢得所有;如果你输了,你却一无所失。因此,你就不必迟疑去赌上帝的存在吧。”
这是帕斯卡在他的《思想录》中说的。
这其实是说一个条件期望。在相信上帝存在的条件下,期望收益是正的。在不相信上帝存在的条件下,期望收益是0。中国民间关于鬼神等无法实证的事物是否存在,流传着一句神似的说法:宁可信其有。

在那个年代,不奇怪,帕斯卡身边有个和他一样对古典概率论痴迷的神经质,比如费马。
一个周日的下午,帕斯卡和费马在巴黎的一个咖啡馆觉得无聊,于是玩抛硬币。正面费马得一分,背面帕斯卡得一分,谁先得到10分谁赢,输的买单。
15次后,费马得8分,帕斯卡得7分。这时他们玩烦了,决定提前结束这个无聊的游戏。他们不是中国人,不会争着去买单。也不是美国人,不会evenly share the bill。
他们太无聊了,决定用一种他们认为公平的方式来结束这个周末。
于是帕斯卡管邻桌的教授借来了笔和纸。帕斯卡和费马在几轮争论后,最终接受了费马的解法:
游戏将在至多4轮后结束,只需要将2^4种可能的序列枚举出来即可。h表示正面,t表示背面,*表示费马赢。
h h h h * h h h t * h h t h * h h t t *
h t h h * h t h t * h t t h * h t t t
t h h h * t h h t * t h t h * t h t t
t t h h * t t h t t t t h t t t t

显然这16种序列出现的可能性相同,所以11/16的概率是帕斯卡买单了。因此,公平起见,帕斯卡付账单的11/16,费马付剩下的。

帕斯卡当时不会想到,这其实是金融工程中经典的风险资产定价问题。
假设账单价格为1法郎,对于帕斯卡来说,他收益是一杯咖啡,成本有两种可能,一种是自己请客,也就是赌输了,支付1法郎,另一种是费马请客,自己一分钱不掏。前者的概率为11/16。帕斯卡可以选择一路赌下去,碰碰运气,不过他选择了无风险投资,避免自己全盘皆输,因为局势已经不利于自己了。费马也同意这个无风险的方案,因为他可以立即套现,什么也没有做就立即赚到1/2-5/16=3/16法郎,落袋为安。
为什么帕斯卡此时必须支付11/16法郎?
如果帕斯卡支付的少于11/16法郎,那么费马将选择继续赌下去,因为他可以算出来,在当前情形下,赌下去期望的花费更少。
如果帕斯卡支付的多于11/16法郎,那么帕斯卡还不如赌下去。
所以帕斯卡没有其他选择,只能支付他的条件期望。
当然,这里假设帕斯卡和费马都是风险中性的投资者。要是其中一个或者两个是风险厌恶型或风险偏好型,就另当别论了。

2011年9月2日星期五

“我正在说的这句话是谎话”的三种等价说法

什么是真理?
真理就是永远正确的。
什么是永远正确的?
没有什么是永远正确的。

我可以满足你三个愿望。
太好了,我的第一个愿望是:你可以满足我1000个愿望。
对不起,这是一个元愿望,我不能满足元愿望。现在你还有两个愿望。
好吧,我的第二个愿望是:你能够满足元愿望。
对不起,这是一个元元愿望,即使我能够满足元愿望,我也不能满足元元愿望。顺便提一句,我不能满足任意阶的元愿望,你懂我的意思,请珍惜你的最后一个愿望。
谢谢。让我来告诉你我的最后一个愿望:我希望我的愿望不被满足。

我:你为什么不高兴?
老婆:(摇头)
我:是因为男主角死掉了么?
老婆:(摇头)
我:是因为我不关心你么?
老婆:(点头)
我:我哪儿不关心你了?
老婆:(摇头)
我:是因为我老加班么?
老婆:(点头)
我:可是我现在不是正在关心你么?
老婆:(摇头)
我:你现在是在摇头么?
老婆:(顿了两秒钟,忽然转过来朝我就打)

2011年8月28日星期日

修改注册表防止sftpdrive试用版过期

sftpdirve只能试用45天,到期后卸载重装仍然提示过期不能使用。断言有残留注册表项记录了软件过期状态。

解决方案:
1、卸载sftpdrive
2、创建一个t.vbs的文本文件,粘贴如下内容并双击该文件运行
WScript.CreateObject("WScript.Shell").RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\SftpDrive\")
WScript.Echo("Done!")
3、重新安装sftpdrive
Enjoy~

2011年8月14日星期日

期权定价

读研的时候,很多同学都在研究期权定价,后来去了金融、保险、证券之类的地方,挣得不少,当然喝酒是免不了的。
最近迫于某些方面的压力,想换份工作,自然想到这些同学当年学的东西,便也弄了本书来看。还挺有趣的。

第一章中一个漂亮的结论:
在一个简单的模型中,期权的价格与股票上涨或下跌的概率无关。

假设:
银行存款利率确定并且已知为a>0,即今天存入1元,明天可以取出1+a元
世界上仅有一只股票,收益率随机:今天买1元的股票,明天卖得1+u元的概率为p,卖得1+d元的概率为1-p,d<u,0<p<1,别无它价
存款和股票的交易量可以为任意实数:连续、无界、可负(卖空)。
市场不允许没有初始投资的五风险利润--无套利原则--不存在空手套白狼的投资方案。
今天花c元买1份执行价为1+s的看涨期权,d<s<u,明天得到u-s元的概率为p,什么也得不到的概率为1-p。

定理:
c=x+y
其中(x, y)是如下方程组的解
x(1+a)+y(1+u)=u-s
x(1+a)+y(1+d)=0
证明:
首先方程组的解存在唯一,因为矩阵
1+a, 1+u
1+a, 1+d
的行列式=(1+a)(d-u)<0
其次,
若c>x+y,则今日卖空1份期权,套现c元以(x, y)投资银行和股市,剩下c-x-y>0落入腰包。明日若股市上涨,则兑现期权付出u-s元,在银行和股市的资产x(1+a)+y(1+u)恰好可以填平这个窟窿,若明日股市下跌,则在银行和股市的资产x(1+a)+y(1+d)=0亦无需兑现期权。总之无本净赚c-x-y。
若c<x+y,则今日以(-x, -y)卖空银行和股市套现以买入1份期权,剩下x+y-c>0落入腰包。若明日股市上涨,则期权收入u-s元,恰好用来还清在银行和股市的负债x(1+a)+y(1+u),若明日股市下跌,则在银行和股市的资产x(1+a)+y(1+d)=0亦无需兑现期权。总之无本净赚x+y-c

2011年5月21日星期六

自反+反向传递=>完全

今天终于证明了这样一个定理:偏序是全序,当且仅当可反向传递。藉此可以理偏序和全序的本质差异。

回忆
偏序=传递+反对称+自反
全序=传递+反对称+完全

E是一个集合,≤是E上的一个二元关系,称
自反:a≤a,对于任意a∈E
完全:a≤b或b≤a,对于任意a, b∈E(显然完全蕴含自反)
反对称:若a≤b且b≤a,则a=b
反向传递:a≤b不成立且b≤c不成立,则a≤c也不成立,对于任意a, b, c∈E

求证,若≤自反和反向传递,则≤完全
证明:假设不然,即存在a, b∈E,使得a≤b不成立且b≤a不成立,则由反向传递,得a≤a不成立,与≤自反矛盾

求证:若≤完全、反对称、传递,则≤反向传递
证明:对于任意a, b∈E,若a≤b不成立且b≤c不成立,
由≤完全,有b≤a且c≤b,
由≤传递,有c≤a
假设a≤c成立,则
由≤反对称,有a=c,
代入b≤a且c≤b,得到b≤a≤b,
由≤b反对称,有a=b
代入a≤b不成立,得到a≤a不成立
与自反矛盾,故而假设不成立

2011年4月15日星期五

也发美国商务签证面经

公司给约了中午11点15的面签,三个同事一起去的,临出门前听说还要一张51mm×51mm的B1签证专用相片,惊慌失措,没有!
后来又听说如果网上提交的电子版照片足够清晰的话,没有纸板相片也可以,就直接去了。
上午十点从公司打车过去,不到半个小时。美国大使馆门前有很多人,所以下车后看哪里人多就好了。司机、咨询机构的服务员和路边的清洁工都知道。我们傻呵呵的还差点进了马来西亚驻京办。在没风的天气里,马来西亚国旗和美国国旗很难分辨。
排队5分钟后,院子大门口警卫会检查护照和确认页。
再排队10分钟进建筑物的门,建筑物门前的工作人员会每次放进去约10个人,门前有垃圾桶,可以扔路边被塞的小广告。
进去之后第一道关卡,出示护照和确认页。
往里走第二道关卡,安检,存手机,他会给你个牌。
再往里走第三关,检查材料:护照、确认页、邀请函。确认页个人信息旁边要用中文写名字、电码、公司地址、公司名称。
这关比较有趣,每个时刻会随机出现若干可以服务的窗口,其他窗口不服务,但是可以把你重定向到某个可服务的窗口。每个窗口服务6个人之后,会停止服务,然后把这6个人编成一队。注意如果你所在的窗口服务3、4个人(包括你)之后,这个窗口没人来了,而其他某个窗口排了队,你可以去叫几个人过来,(人肉优化),这样可以加速你所在的窗口编队,尽早进入下一关。队长会领到一个有颜色的牌子。完成编队的窗口会恢复服务,如果他不是去忙别的的话。这关的窗口都是中国人在服务。大约耗时15分钟。
第四关:按手印。跟队去按手印,左手三个手指、右手三个手指、两个大拇指,如果没按清楚他会提示你重新按。这个窗口是美国人服务,但是会讲中文。你不用说什么话,照他说的做就好了。排队等候大约15分钟。
第五关:面谈。排队等候大约70分钟。典型的单队列多窗口服务,效率已经很高了。因为到了中午吃饭时间,窗口可能会随时突然关闭,这时你将被重定向到其他窗口而不用像火车站一样重新排70分钟的队。问题内容因人而异,他可能会对你的公司业务感兴趣,问得很具体,我准备了一些面签常见问题,不过没想到他问:你们公司是如何帮助客户挣钱的?哇塞,就Business Model那个Page没好好看,太失败了。只好凭着印象胡扯了一通,不过他只在我打奔儿的时候盯着我看了一会儿,真正等我扯上了,他就一边点头一边忙别的去了。然后还问了家里的很多事情,你爸干什么的,在哪里,你妈干什么的,在哪里,你有没有移民倾向。问得很直接:你是否打算移民。直接回答否就好了。面试官是美国人,但是会讲中文,我前面的几个人一直说中文,也可以,但是如果是去留学就必须说英文。我因为之前背了一些面签常见问题都是用英文准备的,所以就赶上背过的问题就用英文,赶上没背过的问题就用中文,中英文夹杂着糊弄过去了。面试官似乎对此毫不介意。如果读过工程物理或空间科学的,可能会被Check,好像怎么解释也不行,被Check就是一审不过,回去等消息,可能过,也可能要重申。简历有可能会被看,不过我的没被看。51mm×51mm的相片这一路也没人找我要过。
出来拿牌子取手机。
第六关:去邮局办快递或自取。自取可以多个人一起取,比较便宜。可能是因为已经到了中午一点,几乎没用排队。
出来就是亮马桥地铁口,我们饿得眼冒金星没看见,又打了个的,回公司了。



2011年3月6日星期日

2011推荐系统高峰论坛――参后感

最近家事繁多,好久没更新Blog了。
今天参加
http://www.resysforum.org/
2011推荐系统高峰论坛,说来小有周折。消息刚放出来不久,同事zhangyifei就组织我们几个FreeWheeler报名了,结果被拒了。然后前几天我忽然收到resys内部人士邀请,让我去了。猜着可能是看在我是resys第一次线下活动的speaker之一的面子上吧。总之作为已经成为resys领域outer的我很是喜出望外,今天一大早,就背着小板凳去了。想必像我这样"走后门"进去的,顶多是张站票罢。不料竟然还有地方坐,让我很是Happy。在我之后进来的一些人,站在会场后面,让我很如坐针毡,很想把小板凳掏出来给他们,可是给谁不给谁呢,都不认识,再招他们互相谦让得打起架来就不好了,而且做小板凳上恐怕就看不见大屏幕了。算了,还是悄悄坐在我自己的位子上吧。


据谷文栋说,今天地大这场是resys第五次线下活动了,有1000多人报名,而第一次活动只有30来个人。第一次绝大多数是热心搞算法的草根或学生。这次,世界顶级学者、搞工程的、搞产品设计的、搞系统运维的,"啥都有"。

Koren介绍了Y!的一些最新研究,是今天最好的一个lecture。
分析了一下Netflix样本方差来源,超过一半无法用模型解释,可解释的成分中,"公认怎么样+个体打分松紧程度"占了一大部分。
推荐系统现在的发展,越来越多的和用户研究掺和在一起了。User Research原本是一个独立的功能机构,一提它,大多数人的第一反应是眼动仪和心理学专家。现在推荐系统揉进去,不仅多了一些统计学习的东西,而且日益工程化了。
用户研究,很直接的一个手段就是问卷调查。如果受某些限制只能问K个形如"你喜欢item i吗"这样问题,那么这K个item如何选取?Koren给出了一个cost function,使得给定的推荐算法在这组item上均方根误差最小,也就是说,当前模型能够较为准确刻画这组item,这样问用户,才能较为准确的理解用户的喜好。
另一个方法是决策树,它每次只问用户一个选择题,等用户选择完以后,根据用户的回答再问第二个问题,这样更为有效。
这两个办法都无法回避的问题是:用户可以回答"没听说过",这样你就没办法知道用户的喜不喜欢,就白问了。所以不能轻易问太小众的item。
推荐系统应用到"问答社区",就是把好问题推送给能高质量回答它的人。
另外,它提出置信度作为评价推荐系统的一个指标,可以改善推荐质量,例如可以对置信度低的预测点给予一定的"高斯模糊"。而置信度的计算,其实每一种模型都有给出,可惜人们往往无视他存在的意义。


淘宝作为spnsor有两场lecture,第一场比较概括,有三点引起了我的思考。
1、淘宝在推自动化数据运行,逐步替代人肉管理商品目录。随着广告市场的发展,我认为以后ad trafficker也有自动化的趋势,一些智能工具的价值将得到凸显。
2、数据可视化和交互是数据挖掘的重要手段。我认为,他不仅是数据探索的工具,更是结果表示的方法。
3、淘宝今年成立了研究院。没搜到,不知为何物,关注中。

淘宝第二场
1、推荐与广告的关系:掐。推荐系统是营销部做的,旨在提高更多long tail卖家的关注度,改善消费者的购物流程,优化整站生态。广告是广告部做的,是拿卖家钱,就要像狗一样给卖家效力,处处为给钱的人着想。
2、用户在不同阶段有不同的推荐需求,按时间顺序是发散、收敛、再发散的过程
四处闲逛阶段:各种大跨度的试探性推荐,揣测闲逛者的消费意图
精益求精阶段:发现用户开始货比三家,猎物相似了,那就要把推荐的范围逐渐缩小了,加速消费者下订单、支付的进程,说,嗨哥们儿别犹豫了,就它了!这时候再给他推荐一些天马行空的东西,没准人家一走神点走了,就不买这个了,去东逛逛西逛逛,一拍大腿啊呀三个小时过去了,人家说我得干点正事了,得,把浏览器关了。
意犹未尽阶段:这时候再开展你"啤酒=>尿布"的数据挖掘伎俩,推荐些哪怕看似不想关,却在统计数字上有关联的商品,即使推荐的莫名其妙,也无伤大雅,反正最坏情况就是就此打住,没准弄好了还能神奇的再下一城。
3、实时训练与预测。在燕莎、在双安、在大悦城,好的导购能通过消费者嘴角一个0.13秒的翕动,在0.013秒内判断其消费意图并推荐合适的商品,电子商务的推荐算法必须要向这样的导购一样。慢了,消费者就把tab关了,或者已经买完走了玩别的去了。

百度,大纲级
很适合我的口味,讲了很多我很有兴趣的学术界研究的课题,比如Learning to Rank。
演讲者高屋建瓴地将机器学习的问题归为三个:回归、分类和密度估计。听着很像统计学习的口吻,不知道工业界搞商业智能的兄弟们知不知道密度估计有什么应用,反正孤陋寡闻的我是闻所未闻。
五个成分:数据、机器表示、目标函数、cost function和evaluator
现实世界中的学习,几乎都是PU learning(partial learning),大量数据缺失,大量未标定数据。
一个我不太熟悉的模型:Prob Latent Topic。好像是十年前特别火的一个模型,读研时看文献综述的时候一坨一坨这玩意儿,但是在netflix price中表现很差,也可能是我当时实现的不好,又没机器去没日没夜的调参。总之,玩不转。三个方法:EM/Gibbs Sampling/梯度下降。
Learning to Rank三个方法:SVM、Boost和NN。可惜因为空间复杂度太高,没什么工业应用。
一个观点:ReSys以后将成为互联网应用的基础设施。哇塞,太牛了,听的让我热血沸腾,我以前只听说有人争论推荐系统究竟是个feature还是个product。基础设施是什么?在我脑海中就是磁盘阵列、路由器之类能被会计算作固定资产的东西。以后推荐系统也是,太牛了。
好的推荐系统的四要素:UI/UX占40%(难怪PM有饭吃),Data占30%,领域知识占20%,算法占10%。听的在坐的学生们心灰意冷,纷纷微博上墙感慨人生。
推荐系统研究的未来发展方向:领域专家系统、迁移学习和Temporal-bias。
还提到了Behavior Targeting:把恰当的广告推荐给对他最有用的用户。在我刚踏出校门的时候,我觉得这简直太美妙了。现在的我觉得,这想法太前卫了。

前Google研究员
将MapReduce在机器学习中的应用,比较工程。对于一个C++程序员来说,听的非常实在,没有一句话是飘在空中的,都是code。
学到一点:用BDB的B+树做外排,太毁硬盘了,因为要频繁读写一个Block。应该用内排加外部merge sort。

Hulu
这个之前聊过,很多都听过了。只记了一些新鲜的。
Hulu没有Live Sport。
内容分两种,On air show和lib show,On air show在Hulu上只能放最近5集,因为之后DVD上市,要是还在Hulu上能看到,谁还去买?
Seasonality是时间序列分析的重要话题,Hulu的Seasonality特征鲜明:暑期、圣诞是On air show的两个波谷。连续剧每周出一集。
Catch-up效应:show的日访问量关于days after release基本上是负指数曲线。
广告效果评估:Brand recall。奇怪FreeWheel研发这边怎么没人提过这个,估计美国那边在弄吧。
预测匿名流量的Demograph info,用于Demographic targeting。
Demographic targeting是广告主最容易接受的targeting方式,其次是Geo, daypart, category。。。
Behavior targeting的逻辑:请第三方来证明Hulu存在用户群A,具有购买商品P的习惯。然后Hulu通过某种方式,将用户群A具象化到一个形式化的targeting范围T里。向商品P的卖家或品牌广告商推荐:将广告targeting在T上吧!
在场有人质疑:品牌广告商需要支付更高的CPM来通过Behavior targeting保持现有用户群吗?以我对广告商的理解,是需要的,因为以他们的非理性程度和对人性深刻的把握,足以做出任何在常人看来是蠢事的事。





2011年2月20日星期日

2011年1月11日星期二

马尔科夫链蒙特卡洛(二)

马尔科夫链蒙特卡洛(二)

来,做一道书后习题:用MCMC生成服从Poisson分布的随机数。

习题嘛,瞎折腾,本来R就有现成的函数:rpois
​既然MCMC,首先要构造一个转移规则。考虑射线上的随机游动。从0出发,必然走到1,从k出发(k>0),一半的概率向左右一半的概率向右走。

计算接受概率:

其中

其中k>1。边界0和1处需要稍微特殊处理一下。注意到,概率密度函数求比值之后,我们再也不用算指数和阶乘了。剩下的事情,就是不停地走,走每一步时只需要回答:

1)往哪边走?---用随机游动的trial distribution:一半的概率向左右一半的概率向右走

2)真的要走到那里去吗?---使用上面算的接受概率(MCMC的核心)

下面是R源代码


p=function(s){
    runif(1) <= s
}
#pi_rate(k,lambda)=pi(k,lambda)/pi(k+1,lambda)
pi_rate=function(k,lambda){
    (k+1)/lambda
}
accept_walk_left_from=function(k,lambda){
    if (k==1)
        min(1, 2 / lambda)
    else
        min(1, pi_rate(k - 1, lambda))
}
accept_walk_right_from=function(k, lambda){
    if (k==0)
        min(1, lambda / 2)
    else
        min(1, 1 / pi_rate(k, lambda))
}
transition_from=function(k, lambda){
    if (k==0){
        if (p(accept_walk_right_from(k, lambda)))
            1
        else
            0
    }
    else{
        if (p(0.5)){
            if (p(accept_walk_right_from(k, lambda)))
                k + 1
            else
                k
        }else{
            if (p(accept_walk_left_from(k, lambda)))
                k - 1
            else
                k
        }
    }
}
mcmc_poisson=function(n,lambda){
    f=0
    for(i in 1:n){
        f[i+1]=transition_from(f[i], lambda)
    }
    f
}

samples=tail(mcmc_poisson(20000, 5), 10000)
hist(samples)


下面是一次实验结果的直方图,看起来和Poisson分布很像吧




2011年1月8日星期六

马尔科夫链蒙特卡洛(一)

马尔科夫链蒙特卡洛(一)

传统的马尔科夫链研究,是给定转移规则,关注平稳分布,而马尔科夫链蒙特卡洛研究中,我们知道想要的平稳分布,任务是构造有效的转移规则,使得它的平稳分布就是想要的那个。

为目标平稳分布。Matropolis-Hastings算法的一般框架是:寻找一个函数T(x, y)满足T(x,y)>0当且仅当T(y,x)>0,

1)​给定当前第t步的状态x[t],依照分布T(x[t], y)随机采y

2)​下一步状态x[t+1]以概率r(x[t],y)等于y(接受,转移),以剩余的概率等于x[t](拒绝,留下)

其中,里面的分子是某个对称函数。

则第t步从状态x转移到y的概率

由分子的对称性得到


这说明上述算法的得到的转移轨迹是可逆的,或者说具备微观平衡的性质,下面证明,这个马尔科夫链以为​不变分布。

也就是说,如果这一时刻的状态分布是,那么下一时刻的状态分布还是

由经典马尔科夫链理论,既然它是非周期正常返的,而且以为不变分布,那么它必然收敛与,即成为平稳分布。​

于是我们得到了采样方法:从某一步开始(即预热后),状态序列x[n].x[n+1],...就是我们需要的样本序列。​

通常取

特别地,当T(x,y)也是对称函数时,它进一步退化成

如果你还记得重要性采样,是不是觉得这个接受概率的式子很​眼熟?

目标分布不好算,但是两个状态的概率之比好算,就交给接受概率好了。这是蒙特卡洛的基本初衷:好算就算,不好算就狂试。


注意MCMC得到的样本的​两个弱点:

1、​方差大

2、不独立





2011年1月7日星期五

遍历trie

当时在网络所实习的时候,还没有学过数据结构,觉得trie是一种很神奇的东西。现在想来,tree作为用来查找的结构,要求元素构成全序即可,而trie还要求元素构成字典序。
http://en.wikipedia.org/wiki/Trie

通常trie是用来查找的,怎么遍历它呢?
假设假设某个国家实行实名制上网,你要负责设计一个IP(v4)到身份证号的字典,而且被要求只能用trie,而且是定义成这样的:

struct Trie{
    Trie * left;
    Trie * right;
}

根节点指向一个Trie数组的首地址。查询时指向左孩子,如果待查询IP的二进制表示最高位是0,否则指向右孩子。如果孩子结点地址不幸指向数组件外面,则表明那不是文件地址,而是身份证号+数组的字节数,这个人拥有的IP段是他从根节点走到这里沿途收集的0-1串作为IP二进制表示的前缀的所有IP。好吧,我应该事先声明,这个国家人口稀少,以至于一个人可以拥有多个全球互联网上的IP段,而且为了方便市民记忆,身份证号也被设计的也很短。
遍历:
调用p(&data[0], "")
其中
p(Trie* node, string m)
{
  if node 指向超出数组边界:打印身份证号为((int)arr)-文件长度, 他的IP段(二进制表示)有m+(32-m.length)个'0' ~ m+(32-m.length)个'1',return
  p(node->left, m+‘0’)
  p(node->right, m+'1')
}

谨以此文献给即将用尽的IPv4地址和囤积了大量地址空间的IP黄牛们。
强烈推荐一篇用时间序列方法研究IPv4何时耗尽的论文,十分有趣:http://www.potaroo.net/tools/ipv4/#r5

2011年1月2日星期日

两个不幸等价的随机数生成器

中午接到电话,研究生同寝的哥们儿回北京了。于是一起去平安里吃烤鱼,一边吃鱼,一边研究一个随机数生成器的问题,一个学生问他的。
随机数生成器A:1/2的概率返回1,1/2的概率返回0。
随机数生成器B:先以[a, 1-a]均匀分布生成一个p,然后以p的概率返回1,1-p的概率返回0。其中0<a<0.5。
问题是,若只能观测这两个随机数生成器的返回结果,如何区分二者?
他说,好像无法区分,因为计算发现二者返回值的分布函数相同,却不知如何证明。
我想:样本方差相同么?后验概率相同么?回家一算,发现很不幸,也都相同。
可能这个题当初是考察离散、连续混合情形下的全概率公式的使用吧,确实在推导过程中容易陷入符号上的混乱。
用分部积分公式可以将这个结论推广:如果p是连续型随机变量,分布函数为F(t),那么上面两个随机数生成器等价当且仅当F(t)在[a, 1-a]上的积分=1/2-a

给我碗儿水喝

今天元旦,晚上去工体听了崔健摇滚交响音乐会。听众已经不再年轻,但是能听出来听众的水平。能把摇滚和交响揉在一起的,恐怕只有崔健,一来崔健以后的中国摇滚缺少集体意识和时代底蕴,更没有作曲、指挥这种正统的音乐教育,二来是人脉。听众的注意力在崔健身上。我的注意力则在摇滚交响,所以我认为大可不必站起来,像听崔健个人演唱会一样――我最佩服的是,崔健和指挥背对背,怎么配合的那么好。
在《蓝色骨头》中,崔健重申了它那三条腿儿的理论,不是按优先级排序,而是"三角架有三条腿才稳定,少了任何一条都要不停的运动"。我便藉此为纲,总结并展望一下吧
"第一就是事业象我上面说的,能高高兴兴工作挣钱养活自己,有话就说有话就写而且要彻底,因为每次彻底之后才会出现美妙的空虚"
去年,计划在技术上深入学习几样东西(Linux Shell/C++/Design Pattern)并没有落实,倒是因为工作需要,启动了Monte Carlo方法的学习。不过后来也没用到,倒成了兴趣。饭否回归,是一件着实令我兴奋的事情,年底开始接触Android,拿饭否API练手,没有目标,只为了在过程中多学点东西。相反,发现工作中并不需要很Fancy的技术,公司总是结果导向。所以明年的技术重点在积累和巩固。拓展的项目仅保留2个:Monte Carlo, Android.
"第二就是身体一定要健康,因为身体要是不舒服,什么都是白给,所以我一周三次跑步加上一次游泳,在运动中想事儿是越想越起劲儿"
难怪崔叔叔都半张儿了,还能在台上那么使劲叫唤那么使劲蹦�,就仗着身子骨好。我要是他那岁数还能一口气唱下来《时代的晚上》间奏的那16个小节,就谢天谢地了。
今年本来说要增重,结果又TM瘦了。该死。明年必须把体重弄上去,不择手段!!!!年底开始了每周招呼同事一起去游泳,还不错,明年继续。
"第三当然就是一个爱情了。。。是不是我的工作太多了感情也变坏了,还是身体一独立个欲望就变野了"
想起有一次去科技园见朋友,聊天,本来答应一起吃晚饭,结果我临下楼接了家里一个电话,就赶紧走了。朋友表示理解:后院不能起火,要走就走吧。我问,你们老这么加班,家里人不急么?他说,时间长了就习惯了。我想,可能我这年头还短吧。有人说,不能总是一方迁就另一方,时间长了不行。也有人说,婚姻就是个错,长久的婚姻就是将错就错。不管怎么说,就算为了自己身体着想,我也要到点儿下班回家,到点儿上床睡觉。谁TM叫我加班熬夜我跟谁急!