用户文章存档

开战——与一个困扰我多年的游魂

给大家讲个真实的笑话。

我高中毕业那年(2006年)暑假,和两个高中的哥们去北京新东方万泉河校区上了个英语四级班。

2008年10月,我在校内网(现在的人人网)上莫名其妙地收到一个女人的留言,说我把她搞得人不人鬼不鬼的,我一看不认识,就礼貌地回了一句,“认错人了吧?”,可是这个女人开口骂人,于是我删评论,把她拖进黑名单。

与此同时,她还对和我刚分手的前女友进行漫骂,导致前女友质问我,“都分手了,你还找人来骂我,有意思么!”(大概这么个意思,原话不记得了),我和前女友解释了半天才说明白。

2009年春节前,此女铺天盖地地在我的100多位校内好友的留言板上spam,内容都是“XX(我的名字)不是什么好东西,以后不要再理他了,赶紧把他删了吧”。这次把我惹毛了,写了篇反击的文章,澄清了事实,并请校内网管理员对她进行封禁处理。

2009年春节之后,此女又通过邮件或是在一些web2.o网站(居然能找到我…)上开始对我进行各种骚扰,从她的只言片语中我得出了两个结论:

1. 她在2006年的新东方与我同班,坐在我身后,喜欢上了我。(但是新东方课上我和她一句话都没说过,对她完全没印象)

2. 她的思维很跳跃,我怀疑她的精神有点问题。

于是我尝试和她沟通,发现她只是自说自话,于是放弃。

从2009年暑假至今,她断断续续地在我的独立博客(也就是本站)上以留言的方式骚扰我,或者直接发骚扰邮件,至今已有几百条,我都没有加以理睬,全部删除。她甚至把我和她的照片PS在一起发给我,让我把饭都吐出来了。

对了,她还用短信骚扰过我的一个哥们和我的妹妹,我让他们都不要理睬。

从这些骚扰中我也捕捉到了一些信息,比如她在服用思XX和利XX这两种药品,我一查是治疗XXXX症的,她果然是有精神问题,于是我更是下定决心不理睬她的骚扰。

可是,最近出现个新情况,让我忍无可忍。她开始在我的女朋友(双霍记的博主)的博客上对我的女朋友进行骚扰。这还不算什么,更令人发指的是,她开始给我女朋友的一些博友留言污蔑我们两个人,导致有博友给我女朋友发邮件询问情况。

鉴于此女把事情做得这么恶心,我也没必要对她仁慈了,于是我决定开战。

我现在有她的姓名,照片,住址(我的大学校内),我想找到她的父母(我的大学的教工)并非难事。我相信还是有人能管住她的。

如果读者您有什么好的限制她的胡作非为的想法,请给我一些建议,谢谢!

女主角出现了,并且是假装置身事外的第三方语气…何必呢…你换来换去就是那么几个名字。
她的留言如下:
博主:你好!
我是个过路人.但是,看了你的”开战书”不忍要说几句.我对你的做法表示不满.仅从这个题目上看,就足已说明你人格上的问题(如果真像你说的”她果然是有精神问题”).
你叙述的过程,让我看到了一个深爱你多年且在几乎绝望的情况下仍非常尊重你,任何事情都在争取博得你的同意后实现.不是吗(从你的开战书中叙述的过程表明)?她并没有像一些不检点的女孩子那样找到你;缠着你等等.直到精神崩溃她没有在社会上表现出让你难堪,影响你的学习、社交等等.并且,从这个过程看出你一定是有言语过激的情况.不然,一个好端端的孩子怎么就会像你说的那样”精神问题”呢?我相信这个女孩子一定是个文静、向上的好孩子.
从你的叙述过程表明,你从没有接触过这个女孩子.这说明你根本不了解她、不承认她、不尊重她.你只想摆脱、回避直至过激伤害酿成现在的恶果.
解决办法有二:
1、找到女孩帮助她解决心理问题.
2、隐藏你所有谈对象的网上信息,也是间接的帮助一个深爱你多年的女孩子(即使你不承认,但这是现实).

我逐条回应你:
1. 你说我人格有问题,没错,被你逼的。
2. 你深爱我为什么第一次和我说话(还是在校内网上)就破口大骂。你用你的脑子想想,谁能接受一个完全不认识的人第一次说话就破口大骂的?
3. 你尊重我为什么要在我的100多位校内好友的留言板上污蔑我?校内上的好友都是我在现实世界里的朋友,你做出这样的行为也算“没有在社会上表现出让你难堪,影响你的学习、社交等等”吗?在你这么做之前,我只是把乱骂人的你拖到了黑名单里,我有言语过激也只是在你做出这种事情以后。试问谁遇到了这样的扯淡事情之后不会言语过激?
4. 你有什么资格说我的前女友/女朋友不检点?难道就因为你这么个根本不认识的人我就不能谈恋爱了?荒唐!
5. 你文静?文静的你说了多少脏话不用我提醒你吧。用不用我贴出来让大家看看?
6. 我是“根本不了解她、不承认她、不尊重她”,因为你没通过正常人的社交方式让我了解你,承认你,尊重你。你的种种行为只是让我发自内心地厌恶你这么个陌生人。就算你没有做出种种恶心的病态的行为,你一个陌生人凭什么要求进入我的生活?
7. 对于你的解决方法,我只能说,有病看病,病看好前别上网了,为你好,也为被你伤害过的人好。

女主角再次出现: 阅读更多…

七月 27th, 2010

有这样一个女孩

有这样一个女孩,她不拘一格。
有这样一个女孩,她温柔体贴。
有这样一个女孩,她嬉笑怒骂。
有这样一个女孩,她情感细腻。

她就是双霍记的博主,一个名叫霍霍的女孩。

与她的相识实在是很神奇。
最早看到她的博客时,便被她大胆的,甚至是口无遮拦的,却又充满小聪明的文字所吸引。
随后在推特上认识她,又莫名其妙地被拽进一个她加入其中的gtalk群,于是才有了与她多说两句话的机会。
再然后,一个偶然的机会,和唯音乐的博主feicun一起去TJ围观她,两天的时间让我第一次见识到那个在线上调皮搞怪没有约束的霍霍在线下确是一个很害羞的女孩。

在后来的时间里,分处两地的我们有了一段连续见面的宝贵机会,在这段时间里,我发现她温柔起来也是如此的动人,她发现我也并非那么讨厌,于是我们在一起了。

我开始同时面对线上和线下两个截然不同的她。这两个她曾在我的脑海里激烈地争论,到底哪一个才是真正的她,至今也没有分出胜负。于是,我开始接受这两个都让我非常喜欢的她的同时存在。对我来说,“双霍记”中的“双霍”并非是指两个霍字,而是指她的两面——看似对立却又和谐(请原谅我用这个俗词)地集中于她一人身上的双重性格。这就是相处半年来我对她的独特解读。

有这样一个女孩,她独一无二。

七月 22nd, 2010

留学生如何购买中美机票

首先声明,本篇文章不是软文,我不是任何旅行社或是网站的托儿。

在本周买好了去美国的机票,时间和价格都很令人满意。在买机票的过程中也进行了一些探索,粗劣地了解了一些订票行业的规则,下面是我的一些经验,不一定准确,仅供参考,希望能帮助读者买到满意的机票。

注意,本文中所说的各种价格均指含税价格。

买票的过程可以简单分为以下两步:

1. 确定行程(包括日期,航空公司,航班号,需要转机的要确定好每一段行程)

2. 确定购买途径(航空公司网站还是旅行社?)

首先,各航空公司的网站通常是可以直接购票,但是需要自己去各个网站查询,不够效率,查行程直接pass。

其次,可以通过旅行社查行程,旅行社的销售代表会根据你的需求为你找最便宜的行程。如果你害怕旅行社为你推荐利润大的行程,而不是最便宜的行程,你也可以通过以下的网站自己了解一下大致的价格,选择最便宜的行程。

中文:一起飞 http://jps.yiqifei.com/ (能够很清楚地展现各个航空公司的报价)

英文:StudentUniverse http://www.studentuniverse.com/ (以北美航空公司为主)

个人感觉上面的网站的搜索结果都不够智能,也不全面,所以还是咨询旅行社为上(反正在买票前也不用花钱)。

在确认好行程以后,怎样拿到最好的价格呢? 阅读更多…

六月 12th, 2010

中国大陆Twitter用户的“新”选择——TweetDeck

TweetDeck是一款广受用户(尤其是英文用户)喜欢的Twitter客户端,这点可以从twitstat对其用户使用的客户端的统计可以看出来,TweetDeck是除了Twitter官方网站之外第一名的来源。这份统计虽然不是官方的,但是也可以看出用户对TweetDeck这款优秀的客户端的喜爱。

当然,由于GFW的存在,在中国大陆的用户长期以来无法直接使用不能自定义API的客户端,TweetDeck也是其中之一,所以受到大陆用户的冷遇。(当然,要想在墙内使用这类客户端也是有办法的,比如通过SocksCap或者VPN,但这不是本文的重点,这里不再赘述。)

好消息是,从桌面版0.34.1开始,TweetDeck开始允许用户使用自定义的API。于是中国大陆的用户也可以无需任何的附加工具即可使用TweetDeck。设置过程非常简单,只需要进入Settings > Accounts,点击Add New Account,类型选择Twitter,输入用户名密码,然后点击Advanced Options,输入API的地址(请自行准备),即可正常使用。

也许你已经在添加Twitter账户的过程中看到了,TweetDeck 0.34.1还支持FoursquareBuzz这两款在twitter用户中很流行的服务,你也可以将账户添加进来,通过TweetDeck一个客户端使用三种服务。

剩下的我就不多说了,由您自己体验。

五月 21st, 2010

从stanford网络课程cs107学到的C语言通用类型容器设计


0 前言
最近深感自己的coding能力太差,于是很自觉地找来了stanford的网络课程来充实自己。最近在学的是由Jerry Cain主讲的Programming Paradigm课程。该课程的内容像一锅大杂烩,涵盖了C/C++,assembly,  python等程序设计语言,以及sequential / concurrent programming,procedure-oriented / object-oriented programming等多种程序设计模式。此外,该课程还捎带了计算机体系结构,操作系统,编译原理等相关课程的知识,真是琳琅满目啊!最可贵的是,该课程的assignment各个都是经过精心设计的,不但有趣而且实用,有一定的代码量和难度,做下来一定受益匪浅!

目前我学完了前10个lecture,觉得收获最大的是学会了C语言通用类型容器的设计,本篇日志将围绕这个话题展开讨论。Hope you’ll like it :)

1 为什么要写C版本的通用容器
也许我们已经习惯了C++标准库中的多种容器,比如最常用的vector,还有map,set等等。这些容器让我们彻底舍弃了恼人的数组。而C并未为我们提供这些,如果贪恋vector的便利,那么何不自己动手写一份呢?而且,使用C版本的容器在工业界是非常有现实意义的。当我们面对有限的主存时(比如手机,PDA等),通过C++通用容器生成的汇编代码会占用大量的空间。比如,当我们声明vector<int>类型的变量时,编译器会生成一份只接纳int类型的代码,当声明vector<double>时,编译器又生成了另一份代码,以此类推… 而C语言的容器会为所有的类型使用同一份代码。虽然你需要为此牺牲类型的安全性以及使用上的便利性,但是汇编代码的巨大缩减会让你觉得这是值得的。事实上,微软,苹果,Sun的系统工程师也在使用自己编写的容器来替代C++的vector以提高系统效率。

另外,正如Jerry老师在assignment 3(C语言vector和hashset的实现)的handout中所讲,“这件事儿会让你发现C原来这么牛逼,一但你成功编写,debug,用C vector做练习,你对于指针,主存,动态分配的理解会达到顶尖水平。这是我对你们的承诺。

2 C与C++相比差了什么
抛开C与C++在标准库上的差距,我们单纯从语言特性上来看看C和C++差了什么。

首先进入我脑海的是C没有reference。没关系,Jerry老师会告诉你,reference其实只是会自动dereference的pointer。两者在功能上是无差别的。其实,pointer版的swap和reference版的swap生成的汇编代码是完全一样的。

此外,C没有Class,无法隐藏结构/类的成员。Jerry老师又告诉你了,没办法,这是C的短板,在使用C容器的时候,我们就假装结构的成员变量是不可见的,只调用配套的函数,不直接对成员变量进行操作。另外,我们无法在C的struct中定义函数,于是我们无法用’.’或’->’操作符调用成员方法,只能在struct之外定义函数,并将容器指针作为参数传入。

接下来是最要紧的,C没有Template,于是乎,我们不能告诉容器它所存储的类型,配套的函数也无法得知类型信息。怎么办呢?如果没有这方便的编程经验,恐怕会对这个问题一筹莫展。下面就是我在这门课上学到的精髓:通过传递void *类型参数,辅以容器所存储的类型的size,我们就可以对所存储的类型进行各种操作。这句话可能让你摸不着头脑,没关系,我们看看下面的例子。比如,我们想在vector中存储fraction类型,fraction的定义如下:

typedef struct {
  int num;
  int denum;
} fraction;

如果是C++,我们直接通过vector<fraction>的方式在初始化的时候告诉vector它所存储的类型,通过fraction类型参数传递/操作容器外的元素。对于C语言,我们在初始化vector时传入整形参数sizeof(fraction)以利于存储空间的动态分配,容器内元素的移动等操作;而在需要对容器外元素进行操作的时候,传入void*类型参数,并对其进行强制类型转换(fraction*),然后就可以访问fraction元素了。如下例,

VectorSomeFunc(/*some parameters*/ void *elemAddr) {
  fraction *f = (fraction *)elemAddr;
  // do something to f->num or f->denum
}
fraction f;
f.num = 22;
f.denum = 7;
VectorSomeFunc(/*some parameters*/ &f);

这里使用void *类型作为函数参数是非常精妙的,因为它可以接受任何类型的指针,当我们需要用vector存储int时,我们传入int *类型的参数,需要用vector存储char *时,我们传入char **类型的参数,再分别在函数内部做(int *),(char **)的强制转换之后就可以访问元素了。正是如此,我们才实现了“通用(generic)”这两个字。这里需要提醒一下,void *类型的参数是不能够直接deference的,也就是说,不能用对void *类型的参数进行’*'和’->’操作,强制转换以后才可以。

3 管中窥豹——stack的实现
stack的实现是在cs107的课上讲到的,明白了上面的设计想法之后,比较容易实现。这里贴出源代码,并简单讨论一下。
阅读更多…

五月 6th, 2010