探访唐家岭,反思“蚁族”

2009/11/22 | 20:37 | 分类:生活空间 | 标签: | 1,662次阅读

  不能不说《蚁族》一书拉动了唐家岭小月河等地的旅游业。当然,这种所谓的“旅游”对大多数游客来说只是“想看一看”而已,对当地的经济基本没有正面作用,反而增加了交通的压力。今天,我与 Jeepidealee 同学慕名探访了唐家岭,参观了新时代知识青年的实现生活环境。

  我们从中关村软件园沿唐家岭路走向唐家岭村。住在唐家岭的外来人口很多在上地、软件园一带工作,所以这条路成为唐家岭对外最重要的通道。很窄的双行道,公交开行密度却很大,但也难以满足上下班人群的需求,来往的车辆均塞满了人。安全起见,行人和自行车往往要走在柏油路外侧的土路上。
探访唐家岭,反思“蚁族”

  唐家岭村口,和一般的乡村也差不多,但拱门上的标语既不是“欢迎来到”也不是“建设和谐”,而是强调该村是“全天候电子监控区域”,居民要“严格自律”、“注重行为规范”。这显然是写给外来人口看的,给人以压抑感。
探访唐家岭,反思“蚁族”

  村里最热闹的路段还是那一条唐家岭路,路边密集地排布着各种商店、餐馆、网吧、理发店、澡堂、诊所以及中介公司,一片繁荣景象。公共厕所也不少有当街的,臭味直冲对面的店铺。路过的房屋中介公司里都排着长队,门外有人把风,我没有敢拍照。
探访唐家岭,反思“蚁族”

  路边也见到几个综合治理办公室岗亭,周围有一些穿军大衣的人出没,不知道他们是不是所谓收“水费”的“治安员”。可惜我们来的不是时候,没有赶上收“水费”,没能收藏到传说中的“外来人口缴纳卫生费、水费凭证”。
探访唐家岭,反思“蚁族”

  繁华的唐家岭路背后,更多的则是像这样狭窄的无名小路。路面晴天是土雨天是泥,冬天还要小心高处落下的冰柱。小路两侧是二层以上的建筑,绝大多数都是面向外来人口的寄居场所。其中有较大规模的集体公寓,也有民房改建的、按间或按床位出租的出租屋。遍天的电线、电话线、网线也衬映了这里居民的文化构成。
探访唐家岭,反思“蚁族”

  村里最常见的广告当然是房屋招租了,从这种大广告牌,到院墙上随处可见的小广告。可见这早已成为唐家岭村的主要经济支柱,同时也让人慨叹一个农村的畸形流经发展模式。很多出租屋美其名曰“白领公寓”,也可见北京的高学历和白领职业早已泛滥,像 IT 民工这行当与普通外来务工人员的差异正在日益缩小。
探访唐家岭,反思“蚁族”

  这是一栋在建的小楼。尽管是寒冬,但整个村子里的建设氛围却没有受到影响。据说这里的很多建筑都是违章的,即使是合法的建筑,其质量也不敢恭维。估计当城市化的蔓延到唐家岭时,这些建筑的拆迁又会成为村民致富的另一条途径。
探访唐家岭,反思“蚁族”

  像这样的小楼,主体结构完成后外表不用装修,安装一个简易的金属楼梯就可以对外出租了。空调等设备也能够配备,当然需要租房者自行承担相应费用。10 平方米的单间算是奢侈,4 到 8 个人挤一间的床位房是刚刚毕业的大学生的经济选择。
探访唐家岭,反思“蚁族”

  这是一条水泥铺成的“自建路”,在我们走过的线路中是比较罕见的。墙上告示中一句“后果自负”显示出修路者那种“此路是我开”的霸气。在这条路的尽头,我们看到了几座民房。农具、大白菜、板车、看门狗,终于有了一些农村的生活气息。
探访唐家岭,反思“蚁族”

  在返回村口时,我们有幸遇到了中国政法大学法律援助中心和海淀区劳动争议调解中心在做劳动者维权方面的法律宣传。这又一次提醒我们,这里是北京城八区之一的海淀,还没有出“城”呢。政法大学的研究生们冒着寒风向过往的行人发放《劳动者维权实用手册》并接受群众的法律咨询,只是在我们路过的那阵子似乎没有多少人响应。
探访唐家岭,反思“蚁族”

  此外,村北气派的村委会大院、人满为患的唐家岭北公交车站也给我们留下了深刻的印象。但这两个地方把风的人都比较多,我也不方便拍照。也有人说只有走进那些出租屋看看,甚至住一两个月才能真正体会唐家岭外来人口的艰辛生活。我们这一次没有做此类计划,《蚁族》已经告诉我们了许多,下次有机会再和有相关经验的人去参观出租屋吧,地点可以在小月河之类。

  同样都是大学毕业生,我们的确比唐家岭的新知识青年们幸运一些。目前的体制和政策是有不当之处,需要决策者改进,但“蚁族”自身有没有深入地反思过自己的选择?“蚁”字赞扬了这一人群的高智商、锲而不舍精神和聚沙成塔的力量,但同时也反映了这一人群与社会性动物类似的特点——群体行为。陷入“蚁族”的生活究竟是真的无奈还是一种被动的跟风?除了做“蚁族”真的没有别的选择了吗?都说高中教育磨灭个性,把所有学生塑造成了同一个样子,那么大学教育呢?也许只是有限的 N 个样子吧!“蚁族”们在公司里要装扮得体体面面,对家乡父老要表现出事业有成,自己却要忍受着经济压力苟且偷生。原本是奋斗者的心态,在群体行为的高压同化下变得麻木并盲目了。就业和住房的压力,政府是有责任,但其中有多少比例是自己给自己强加,甚至是自己给社会输出的呢?中国不仅仅是由北京、上海等几个大城市构成的,IT 业也并非只能在中关村、张江等地方发展,更不用说那些高学历人群从事的低起点行业了。当然,选择的权利始终在你自己手里,但不要忘记了,你还有思考的权利,不要让群体思维覆盖了自己的思维。

  而对于暂时还没有遇到生活压力的我们——身在福中要知福。

基于手机遥控的远程打印

2009/11/19 | 23:23 | 分类:Web与移动平台 | 标签: | 657次阅读

  场景:假设实验室的打印机距离你的工位比较远,现需要打印一些文章,但不知道打印机里有没有放纸、是不是合适的纸(A4/B5;新纸/旧纸反面)。贸然打印有可能造成浪费,而如果把合适的纸拿过去放进打印机再回来发送打印命令则需要跑两个来回,中途别人还有可能发送打印命令把你的纸给用了。懒人有懒道,要是能在打印机旁遥控电脑就好了!想想用什么做遥控器呢?身边最好找的远程通信器件应该是手机了。于是,我们来实现基于手机遥控的远程打印(以 Windows 环境为例)——
  我的手机可以使用语音、短信、红外、蓝牙、GPRS 等通信手段,软件支持 Email、MSN、Gtalk、Fetion 等应用。考虑到成本,排除语音和短信;考虑到距离,排除红外和蓝牙;Email 没有实时性,也排除;剩下三个 IM,其中基于 Jabber 的 Gtalk 由于其简单性和开放性,成为了我的首选。
  接着考虑如何操作应用程序进行打印。对于 Windows GUI 的自动化操作,AutoHotkey (AHK) 大神当然是不二之选。
  现在可以动手了。首先建立一个 Jabber Message Handler 来接收手机 Gtalk 客户端发来的消息。如果收到事先定义好的某个消息,则通知特定的应用程序执行打印操作。这种简易的 Handler 用 Python + xmpppy 实现即可,代码如下(gthandler.py):

  1. import os
  2. import xmpp
  3.  
  4. def msgHndl(clnt, mess):
  5.     text = mess.getBody()
  6.     user = mess.getFrom()
  7.     if user.getNode() == 'xxx' and user.getDomain() == 'linjian.org' and text.startswith('p'):
  8.         os.system('doprint.ahk')
  9.  
  10. if __name__ == '__main__':
  11.     login = 'yyy'
  12.     pwd = 'zzz'
  13.     clnt = xmpp.Client('linjian.org')
  14.     clnt.connect(server = ('talk.google.com', 5223))
  15.     clnt.auth(login, pwd, 'botty')
  16.     clnt.RegisterHandler('message', msgHndl)
  17.     clnt.sendInitPresence()
  18.     while clnt.Process(1):
  19.         pass

  这段代码很好理解。Handler 端使用“yyy@linjian.org”账号登录 Gtalk,如果收到来自手机端联系人“xxx@linjian.org”发来的“p”消息,则执行 doprint.ahk 脚本。该 AHK 脚本负责向应用程序发出打印命令(这里是以 Microsoft Word 为例的,向 Word 发送 Ctrl-P 并回车,即可使用默认打印机来打印文档),内容如下:

  1. IfWinExist MyDoc.doc
  2. {
  3.     WinActivate
  4.     Send ^{p}{Enter}
  5. }

  好了,现在打开 MyDoc.doc,再运行 gthandler.py,然后在手机上登录 Gtalk,从“xxx@linjian.org”向“yyy@linjian.org”发送一个“p”,看看有没有效果?当然,实验时可以先用 Ctrl-G 之类不浪费纸的命令做测试。
  这就是程序员,本来可以通过内线电话或免费的 VPMN、利用社会工程学手段解决的问题,也要设法把它程序化了。这到底是折腾呢,还是不折腾呢?但至少有一点是肯定的:脚本的优点是一劳永逸。

Hadoop in China 2009 云计算大会

2009/11/16 | 23:45 | 分类:学科活动 | 标签: | 898次阅读

  Hadoop in China 2009 云计算大会昨天在我所成功举行。这个大会是由我们网络科学与技术重点实验室主办,并得到了 Yahoo! 等企业的支持与赞助。我作为会议的志愿者——并且幸运地是场内志愿者,听完了一层报告厅的所有演讲。
  参会的企业和研究机构都是国内外云计算领域的领先力量。尽管有的企业和 Hadoop 没有太大关系,但纷纷赶在这个机会来宣传自己在云计算相关方面的产品与成果。这也好,让一个偏专业的主题峰会变得更贴近 IT 企业和普通用户了。这也是本次大会敢于超越,并成功超越前两次 Hadoop in China Salon 规模的重要原因。
  徐老师在这次大会上一方面强调了开源软件和开源社区对于国内 IT 产业发展的重要意义;另一方面,也重申了他在第五届“大学计算机课程报告论坛”上对于现阶段计算机产业、计算机教育发展的期望与担忧
  包括我们实验室和清华大学在内的几个单位也在活动现场进行了产品与技术展示。不过这种场合下大家都善于把握好一个尺度,适当地把自己的实力笼罩在云里雾里,还要努力探测对手的虚实。

Hadoop in China 2009 云计算大会
鲁博士讲解云计算的秘密

  媒体方面,科学网对这次会议进行了在线文字直播。我坐在几位工作人员身后,赞叹速录和编辑人员娴熟的配合,更佩服其中那位向速录员进行同声传译的翻译。可惜科学网并不是那种擅长炒作的媒体,今天 google 并百度了一下,发现 Hadoop in China 2009 的风头全被其它转载的媒体抢去了;而科学网首页上昨天也不怎么显眼的链接今天则直接被其它“刷屏”的新闻淹没了。

Hadoop in China 2009 云计算大会
速录 MM 在会议之余不忘上 SNS 偷菜

  比较成功的宣传要算中国移动了,移动研究院黄晓庆院长有关启动“大云”的文章今天被各大网站转载。其实“大云”早在今年九月就已经低调发布了,但这套东西主要还是移动内部使用的,究竟是会给用户带来应用价值,还是会进一步巩固移动的垄断地位,还不好说。
  在会后的晚宴上,从西邮 Linux 出来的 VIP rhlei 大大据说认出了我,我可是他的 Blog 的长期订户呵,可惜当时没有交流。
  最后来秀一下 Yahoo! 提供的纪念品吧。布袋、马克杯、雨伞、大本、小本,还有 Logo 贴纸,看上去就差一瓶“这样紫啊”。这给新成立的 Yahoo! 北京全球研发中心做足了广告。

Hadoop in China 2009 云计算大会
Yahoo! ——杯中要是斟上“这样紫啊”就完美了

一道 C 语言指针访存题目的引申

2009/11/08 | 13:41 | 分类:计算机科学与编程 | 标签: | 792次阅读

  毕业生求职的时节,非毕业生接触到各种面试、笔试题目的几率也会相应地增加。下面请看一道经典的 C 语言指针访存题目,稍有些经验的朋友应该很快可以看出这个题目考查的是字节序、内存布局等知识点。然后在大脑中略排列一下,就能够给出答案(2000000)。

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int a[5] = {1, 2, 3, 4, 5};
  6.     int *pa = (int)(&a) + 1;
  7.     printf("%x\n", *pa);
  8.     return 0;
  9. }

  不过,这个答案是否绝对正确,还要看题目所处的上下文了。如果题目明确说是在常见的 32 位 x86 平台上运行,那就无可厚非;但如果没有指明机器架构,那就要小心一点了,也许命题者真想考查一下求职者对非 x86 平台的了解程度呢。如果考虑机器架构,这个题目应当如何作答呢?粗想一下,我们需要考虑的是字长、字节序和对齐(alignment)访问规则。不过真要做实验看看,会发现这里面还是有一些花样的。如果没有实际经验,只凭教条加推测,很可能想不到其它平台上的一些细节之处。
  我们换用一段信息量更丰富的程序来进行后续的实验。在不同的平台上,均使用未加特殊参数的 gcc 来编译这段程序——

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int x;
  6.     int a[5] = {0x11121314, 0x21222324, 0x31323334, 0x41424344, 0x51525354};
  7.     for (x = 0; x < 20; x++) {
  8.         printf("%02x ", *(char *)((int)(&a) + x));
  9.     }
  10.     printf("\n");
  11.     for (x = 0; x < 8; x++) {
  12.         printf("%08x ", *(int *)((int)(&a) + x));
  13.     }
  14.     printf("\n");
  15.     return 0;
  16. }

  在 32 位 x86 下的结果不需要多解释。

  1. uname -a
  2. Linux ubuntu 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux
  3. ./a.out
  4. 14 13 12 11 24 23 22 21 34 33 32 31 44 43 42 41 54 53 52 51
  5. 11121314 24111213 23241112 22232411 21222324 34212223 33342122 32333421

  而在 64 位的 x86_64 下,由于 8 字节的指针被截断到了 4 字节的整型长度,故会引发段错误。同样的情况出现在 64 位的 Alpha 机器下。解决办法自然是把运算地址时的 int 修改成 long 或某种显式的 64 位类型。修改后的结果应该与 32 位 x86 一致。

  1. uname -a
  2. Linux ubuntu 2.6.24-22-generic #1 SMP Mon Nov 24 19:35:06 UTC 2008 x86_64 GNU/Linux
  3. ./a.out
  4. Segmentation fault
  1. uname -a
  2. NetBSD sdf 2.1.0_STABLE NetBSD 2.1.0_STABLE (sdf) #0: Fri Mar 30 02:24:32 UTC 2007  root@ol:/var/sys/arch/alpha/compile/sdf alpha
  3. ./a.out
  4. Memory fault (core dumped)

  有趣的是在 XScale(Intel 实现的 ARMv5)下,虽然同属 little-endian,但非对齐取数时出现了在字内按字节循环的移位的结果。查查 ARM 的官方文档,这确实是 ARMv5 的特性;而在 ARMv6 以后,非对齐访问则是完全支持的。

  1. uname -a
  2. Linux zaurus 2.4.18-rmk7-pxa3-embedix #1 Sat, 06 Aug 2005 12:22:55 +0000 armv5tel unknown
  3. ./a.out
  4. 14 13 12 11 24 23 22 21 34 33 32 31 44 43 42 41 54 53 52 51
  5. 11121314 14111213 13141112 12131411 21222324 24212223 23242122 22232421

  接下来看看 PowerPC,它是 big-endian 的代表,允许 32 位以内的非对齐访问,结果是容易理解的。有关 PowerPC 非对齐访问的一些细节可以参考这篇文章

  1. uname -a
  2. AIX aix 3 5 00C97AC04C00 powerpc unknown AIX
  3. ./a.out
  4. 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 51 52 53 54
  5. 11121314 12131421 13142122 14212223 21222324 22232431 23243132 24313233

  同样是 big-endium 的 SPARC 则不允许非对齐访问。它会对非对齐访问抛出 SIGBUS。

  1. uname -a
  2. SunOS t1000 5.10 Generic_118833-33 sun4v sparc SUNW,Sun-Fire-T1000 Solaris
  3. ./a.out
  4. 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 51 52 53 54
  5. Bus Error (core dumped)

  最后看看我们中科院计算所的龙芯(Loongson)2E,它是兼容 MIPS 架构的处理器。很多教科书告诉我们说通常的 MIPS 是不允许非对齐访问的(部分 MIPS 实现提供了非对齐访问指令,并申请了专利),但我们在龙芯下却得到了和 x86 相同的、允许非对齐访问的结果,这又是为什么呢?初步查到的原因是“(针对龙芯修改过的 Linux)内核里确实有一个异常处理函数负责处理 lw 访问非对齐地址引起的异常”。这也许是龙芯绕开 MIPS 专利的一种办法?我会向龙芯团队的同学求证一下,也希望熟悉 MIPS 或龙芯的朋友给我一个确切的答案。

  1. uname -a
  2. Linux Loongson-1 2.6.18.1lemote #1 Sat Jan 13 16:02:26 CST 2007 mips GNU/Linux
  3. ./a.out
  4. 14 13 12 11 24 23 22 21 34 33 32 31 44 43 42 41 54 53 52 51
  5. 11121314 24111213 23241112 22232411 21222324 34212223 33342122 32333421

  不过用心思考的朋友也许会发现上面一系列实验存在的一个疏漏:没有考虑编译器的影响。一方面,编译器可能对整型的字长有不同的规定(例如 Windows 下的某些编译器即使在 32 位 x86 上也会把 int 定义为 16 位);另一方面,编译器可以对不支持非对齐访问的处理器生成一定的指令序列、通过多次访存来模拟非对齐访问。我们看下面的例子:还是在 SPARC 平台上,改用 Solaris 自带的 Sun CC 来编译实验程序,这时就不会出现“Bus Error”,而会输出和 PowerPC 一样的结果。因为 SunCC 默认会使用“-xmemalign”参数来生成适当的访存指令序列。

  1. uname -a
  2. SunOS t1000 5.10 Generic_118833-33 sun4v sparc SUNW,Sun-Fire-T1000 Solaris
  3. cc data.c
  4. ./a.out
  5. 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 51 52 53 54
  6. 11121314 12131421 13142122 14212223 21222324 22232431 23243132 24313233

  这样看来,在不指定机器架构和编译器等上下文的情况下,要正确且完美地回答一开始的那道题目还是需要一定知识积累的。答案省略,留给大家自己求解。在面试、笔试诸如 Sun SPARC、IBM PowerPC、中科院计算所微处理器中心等部门或者做 ARM 等嵌入式开发的公司时,最好先了解清楚它们的产品常识。
  (部分实验环境来源于 Unix-Center.Net,在此致谢)

Sharp Zaurus SL-C750 (Sharp CEC SL-7500)

2009/11/05 | 23:49 | 分类:IT杂谈 | 标签: | 784次阅读

  与很多家庭具有工程背景的朋友一样,我最早接触的计算机是 Sharp PC-1500。不久前 @Sisyphusliu 师兄把他几年前折腾过的一台 Sharp Zaurus SL-C750(中国版称为 Sharp CEC SL-7500C)借给了我玩。时隔多年再次使用 Sharp 的“小电脑”,我的感觉还是比较亲切的。
Sharp Zaurus SL C750 (Sharp CEC SL 7500)
  从 Wikipedia 上的介绍看到,Zaurus 系列是 Sharp 于 1993 至 2007 年间推出的、定位于 PDA 的掌上数码产品。2003 年上市的 SL-C750 能够配置 400MHz 的 XScale 处理器和 64MB RAM + 64MB Flash,比现在的一些中低端 PDA 还要强。然而这种定位不上不下、博而不专的掌上产品在这几年似乎没有被大众市场所接纳。从当时的那些 PDA 到后来的 UMPC、MID 等,往往只是 IT 圈子里少数 Geek 的玩物,普通用户对于这类产品的最大优势——“可折腾性”并不买账。
  SL-C750 上预装了定制化的 Linux 发行版,但这台机已被师兄刷上了更加灵活的 pdaXrom embedded Linux,并更移植了不少应用上去。我曾试图重刷一个更新的系统上去,但在交叉编译屡屡出错之后,上网查阅却发现有关 Zaurus 的论坛早已冷清,很多下载链接失效。在缺乏时间和经验的情况下还是先放下了这个想法,只是实验性地交叉编译了几个简单的库和应用上去。
  我在 tweethacking 上看到有人用小 LCD 或 LED 做 twitter 显示器;还有人推荐重度用户们专门买一个迷你显示器来监视 twitter 更新。其实这种事用 SL-C750 这类掌上设备绰绰有余:只需要 Firefox 加一个自动刷新插件。不过放心,我可不是重度用户,演示一下而已,不会真这么用的。
Sharp Zaurus SL C750 (Sharp CEC SL 7500)
  最后给大家展示一个噱头:在 Sharp Zaurus SL-C750 上运行 Windows 7!呵呵,这当然是开玩笑了。具体是怎么回事,看看视频就知道了:

  (也可以直接在新浪播客Youtube 上查看)

页面存档: 上页 1 2 3 4 5 6 7 8 ...44 45 46 下页