Dec 19, 2007 - IT 产业的超摩尔发展率和红移理论

Comments

几天前, 偶然看到 SUN 公司 CTO Greg PapadopoulosIT 产业红移学说. 慢慢思考, 做了很多笔记, 有几条写下来.

所谓的红移学说, 就是 IT 公司的计算能力需求是指数增长的. 这个结论没什么奇怪的, IT 产业的摩尔定律说, 每18个月微处理器的计算能力就能翻一翻了. 除此之外, 存储能力, 带宽需求等等, 都是指数增长的, 有供给就有需求,这一点原没有什么大惊小怪的.

但是仔细分析, 对计算能力需求的那些应用里, 是不是所有的需求都是同样的指数增长的呢, 不是. 那么, 有快有慢的时候, 就必然有超摩尔定律增长的和低于摩尔定律增长的. Greg 把超摩尔定律增长的定义为红移, 把低于摩尔定律增长的定义为蓝移. 并且从SUN自身角度指出, 为了让 SUN 跟上 IT 产业的发展大潮, SUN 必须找到那些超摩尔增长的子领域, 把产品销售给超摩尔的应用, SUN 才不会被摩尔定律谋杀.

Greg 的立论基于互联网带宽的超摩尔, 高性能计算需求的超摩尔和软件作为服务的超摩尔速度. 我个人的见解是, 至少目前有5+1 个领域是超 Moore 的. 第一, 复杂的关系计算的发展是超摩尔的. 比如 Netflix 的推荐系统, Google 的 AdSense 系统. 这些关系计算的增长速度, 是超过 2倍/18个月的. 处于提供这些服务的行业, 对计算能力的需求必然是超摩尔的. 因此, 他们必须购置新的 IT 设别, 更新软件效率. 第二, 海量数据的处理的发展是超摩尔的. 互联网数据目前的翻倍速度是 30%/年. 其他领域的数据也有如此的指数规律. 一般情况下来说, 这个速度是低于摩尔律的. 但是任何一家公司海量数据处理的, 都是从无到有发展起来的. 大如 Google, 也不敢说覆盖互联网所有信息. 因此在这十年中, 海量数据处理(特别是搜索, 爬虫, RSS) 将经历从无到有的过程, 其增长, 肯定是超摩尔 的. 第三, 海量带宽的发展是超摩尔的. 以 Flickr YouTube 和 Twitter 为例, 他们的带宽翻倍速度是以天为单位的. 在网络基础设施领域, 中国移动等网络服务商也曾超摩尔发展, 以此为契机很多网络设备服务商如思科华为都超摩尔发展的. 第四就是海量的交互是超摩尔发展的. 网游, 信用卡服务系统都是这方面的例子, 就不一一例举了. 第五可能不为大家熟悉, 就是海量的高性能计算. 这10年内, 世界超级计算机的发展速度是超过摩尔定律的. 在科研领域, 我们清楚的看到高性能计算的需求远远超过 Intel 每年提供的增长, 多达千个万个节点的超级计算机在美国的国家实验室已经很平常. 还有一个额外的是海量的多媒体处理, 全球的电影业, 多媒体业的发展, 横跨前面提到的五个上面, 对每个领域都有超过 摩尔律速度的需求.

这几年这几个子领域的超 Moore 发展, 造成了几个非常有意思的现象.

1 . Google 在超摩尔发展

Google 是一个及其有野心的企业. 首先, 它站在这个时代最快的超摩尔的领域, 海量数据的处理. 它同时还拥有复杂关系计算[Orkut, AdSense], 海量带宽处理 [YouTube] 和海量交互处理 [Talk, Gmail, Google Maps] 三个方面. 这个方阵中的每一个模块, 都是行业的翘楚. 各位读者应该在最近的三个月内都用过Google的不少服务, 而且使用Google 各项服务的总次数相比一年半前肯定是翻倍了. Google 的超摩尔发展和它的策略, 即整合人类所有信息并使之可用 是分不开的. Google 的心大, 舞台就大, 现在爬虫能爬到的信息, 远在人类可用信息之下. 因此, Google 为了完成目标, 必须远快于信息生产速度. 总有一天, Google 抓完了互联网, 增长速度和网络信息的速度一样了, 那Google 也就变为今天的微软了. 20年前或许一人一台计算机是最大的幻想, 谁能想到20年后整合人类信息是不是一定达不到呢. 不过 Google 是善于开创和培育新领域的公司, 因此至少在10年内, Google 依然会超摩尔发展下去.

2 . 超摩尔企业控制了整个产业的需求, 联盟的瓦解和重新结合是常态.

摩尔定律既规定了半导体企业的光明前途, 又是半导体企业的魔咒. 因为半导体的速度提高速度太快, 如果耗用半导体的应用没有发展起来, 或者在18个月内需求量没有更新一倍, 那么, 半导体和硬件制造企业就不会喜欢这样的公司. 想当年 Windows 如日中天的时候, 平均三年就推出一个新版本, 而且每推出一个版本, 能支持前一个版本的硬件都几乎不能完美支持后一个版本. 因此, 操作系统和应用软件在超摩尔发展, 反过来拉着 Intel 超摩尔发展. 而 XP 以降, 微软花了 5 年时间才更新到 Vista, 而且消费者还不喜欢. 个人计算机的增长速度和操作系统的需求速度已经慢于摩尔率. 这时候, Wintel 联盟的瓦解早就是预料中的事情了. 这时候 Intel 和其他硬件制造商, 不需要依靠微软, 也能存活. 为什么呢? 原因是, 他们在 IT 产业链中, 发现了除了软件企业以外的其他的超摩尔的东西, 这个东西, 就是上面说到的5+1, 而最重要的, 是网络计算.

3 . 传统软件企业被摩尔律超过

在解释网络计算之前, 我先解释一下为什么传统的软件企业被摩尔律超过. 一个产业, 如果不是新兴产业, 那么正常的发展速度应该是和国家的 GNP 发展速度相当的. 即使在发展速度最快的中国, 目前也只能做到 120% / 18 月. 这一点, 是摩尔律所不能容忍的. 软件产业, 和其他信息产业一样, 都是社会服务业. 其终极形态, 应当是和 GNP 发展等速的. 简单的说, 有多大的经济需求, 就有多大的软件服务需求. 但是, 产业从来就不是均等的. 当一项新的需求被发现的时候, 因为没有现存的应用, 巨大的需求缺口会拉着原本应该正常发展的产业超速发展. 比如中国的移动电话, 石油产业等等, 都是如此的例子. 在 70-90 年代, 所有的行业都在走信息化的道路. Office, 电算, 电子商务, ERP, CRM 等耳熟能详. 他们的需求缺口相比于产业所能提供的, 都是几个数量级的高. 这种所谓的蓝海让任何跳进去的公司都能发财, 而且发展速度都超过摩尔律. 在此情况下, 硬件企业作为市场的支撑, 也在蓬勃的发展. 到了1999年左右的时候, 互联网的第一次泡沫前, SUN, HP, IBM 等公司靠出售硬件, 大赚了一笔.

然而, 好景不长, 2000年问题解决以后, 发达国家原来轰轰烈烈信息化的公司基本上已经完成基础设施建设了, 软件的需求一下子放缓了. 电子消费品的出现使得个人电脑发展开始放缓, 各大公司因为网络泡沫的破碎也开始紧缩 IT 投资. 软件企业的需求在源头上被紧缩. 另一个致命的打击来自开源软件. 1999 年的互联网泡沫客观上促使了一样东西的普及, 就是开放源代码软件. 传统的软件企业的定价策略是一台计算机安装算一个价钱. 在互联网泡沫时候, 网站需要以超过摩尔律的速度购买计算机, 但是这样就会同样把指数级别的投资送给微软和 Oracle. 因此, 很多公司在购置硬件的同时, 缩减软件投资, 采用免费的开放源代码的软件. 这样, 软件的需求就是一个常数, 这一点一下子拉开了硬件商和软件商地位上的差距. 虽然互联网产业发展了, 软件公司却没有跟着超摩尔发展. 等到微软和 Oracle 等传统软件公司回过神来的时候, 超摩尔的互联网已经把他们扔在了车轮之后. 那么, 应对开源大潮和超摩尔的网络计算, 硬件公司在做什么呢?

4 . SUN, IBM 等硬件提供商放下身段生产平民硬件

如果我们观察从 99年到 2007 年, 这些硬件行业的大哥大做了什么, 我们就能清晰的看到一个个放下身段的巨头. 我们知道, 超摩尔的互联网必然以超过摩尔律的速度需要硬件. 哪个硬件商能赶上此大潮, 就能做弄潮儿. Intel 芯片商要做的, 是提供更加强力的处理器; 存储商做的, 是开发大容量的存储器. 而 SUN 和 IBM 这些系统商来说, 选择就是从阳春白雪走向平民硬件. 当年的 IBM 和 SUN, 固守自己的 RISC CPU 生产线, 投入大量资金开发专有 UNIX 操作系统. 昂贵的售价使得超摩尔的企业不愿采购他们的系统. 此时, 要不固守阵地, 要不另找出路. 我们看到, 他们都开始另找了出路: 出产便宜的基于 x86 架构的硬件, 支持开源的基于服务收费的软件. 他们知道, 只有把硬件做便宜了, 超摩尔速度才能眷顾他们, 否则出路就是 SGI 和 DEC. 只有把软件开源免费送出去, 超摩尔的软件需求才能最后通过软件服务的形式让他们受益. 而一个机器一份拷贝的那种传统软件商业模式, 已经不再实用. 短短几年内, IBM SUN Novel 包括苹果, 都拥抱开源, 拥抱 x86. 我想这不是没有原因的.

5. 如何抓住超摩尔律, 投入新兴 IT 市场?

A. 硬件

硬件厂商在这场互联网浪潮当中扮演了极其重要的角色. 首先, 他们联合了新兴的开放源代码社区, 透过降低了硬件系统的总体成本. 因为此, 硬件商既不需要自己投入大量经费研发软件并把成本转嫁给新兴产业, 又能避免自己口袋中的利益流向传统软件企业. 而网络服务商, 消费类电子制造商和设备提供商, 这些年都是活在超摩尔里的. 如 CISCO, 中国移动, Apple 都是时势造就, 不发财都不行. 当然, 硬件的制造需要较大的投入,除拥有一流的技术外, 尚需要一流的设计和制造. 目前这两点在中国都不具备.

B 软件作为服务/ 软件作为基础设施

前面已经提到传统软件企业, 比如微软, 正在被硬件厂商, 软件服务商, 开源社区合力绞杀. 那么, 做软件就不赚钱了么? 非也. 既然软件已经变成基础设施和服务, 那就应该发挥基础设施和服务的作用. 软件作为服务, 如 Gmail, Facebook, 如 Amazon 的 SimpleDB, 如 Google 的 Documents, 都作为某种服务提供. 前面提到, 因为软件不能按照一台机器一台钱卖掉了, 所以落后于 摩尔律. 虽然这么说, 实际上网络应用对软件的使用需求依然是超摩尔律的. 因为超摩尔的速度造成计算机数量的增长, 系统越来越大, 很多硬件瓶颈就随之出现. 这时候, 传统的单机软件无法解决所有的问题, 必须有一个支持大系统的软件系统出现. 作为提供给网络计算系统的软件, Google 是自产自销, 自己解决基础设施问题. Amazon 和 SUN 则是提供如 EC3, SimpleDB 等工具, 以便把超摩尔的需求转化为自身产品的超摩尔发展. 开源社区也分立出很多创业公司, 提供一揽子的软件解决超摩尔的方法.

我个人看好的是作为软件咨询和软件服务的服务提供商. 机会可以在提供海量信息处理系统, 提供海量带宽处理系统, 提供海量关系处理系统等方面入手. Amazon 的经验让我们看到, 这些软件服务都是可以从系统应用中剥离分立并且产品化的. 在面向互联网的软件服务方面, 我挺看好银杏的.

结尾语: 写完这些, 突然悟到, 所谓的蓝海, 不就是一个超过行业平均水平的新兴子产业么. 想要不陷入和 GNP 一样发展速度的的红海, 就要找到超过行业发展速率的新兴子产业.

Dec 15, 2007 - Bit per Joule 比特每焦耳

Comments

I was thinking about an interesting problem:

Since energy can be seen as entropy and workable energy has smaller entropy, so who can tell me ideally, via any kind of machine, how many bit of information can be added to a system if we add one Joule to the system. For instance, in the modern computer, 1 Joule can drive the computer to output several digits of random binary bits. A programmer can take calorie everyday and write thousands lines of code. My question: what’s the ideal machine in the universe that has the most productivity? (Or there are identical, just differs in different forms? What’s the value of that constant if it’s a constant?) Or, is it the right question?

I will award 50$ for the first person who can come up with the systematic explanation to all the questions above, seriously. Send me email [youxu @t wustl.edu]

—- Chinese Edition———–

我最近突然有个很奇怪的想法, 就是怎么衡量在信息社会, 一个系统的信息生产效率. 我们都知道, 所有的可用能量输入封闭系统后, 如果全部利用后减去被系统存储的活动能, 剩余的就是熵. 按照热力学第二定律, 封闭系统的熵是不减少的.

这个能量来到系统中, 如果做功, 我们自然可以算系统的能量转化比. 假如这个能量不是用来做功, 而是生成信息呢? 比如, 人吃饭, 写字. 就是能量到信息的过程. 这个过程, 最佳转化率能达到多少? 如果信息熵和热力学熵有某种等价关系的话, 可以把系统的热力学熵也归为信息熵. 那么, 一焦耳的活动能, 最后变成了多少比特呢? 如果这个是个常数, 能否求出这个常数? 如果不是常数, 这个宇宙中”生产率”最高的系统的转化比又是多少呢?

大家踊跃想想, 这个问题很有趣. 我将给第一个系统的解决所有问题的人发50美元小奖. [youxu [@t] wustl.edu ]

Dec 4, 2007 - 我不会使用海内, 各位暂时不要给我发邀请了

Comments

昨天笑来老师给我发了海内邀请. 七七八八加起来, 我已经有14个海内加入邀请了. 我就不一一感谢了, 不过还是表明一下我的态度:

我拒绝使用任何强迫我实名的网站, 即使本人上网以来一直实名. 而且已经使用了一个 Facebook 和 一个Facebook 汉化版. 再使用另一个, 纯粹浪费时间.

我们看一下海内的功能和使用条款:

  1. 海内是一个真人网络,为用户提供个人空间,迷你博客,相册以及群组等等服务。

我有个人空间和独立博客. 我有 Linkedin 和联系人管理软件. 这些没法打动我. 我并不缺少这些构建人于人关系的基础设施.

  1. 一旦注册成为海内用户,即代表你保证:(a)你提交的个人信息是真实、准确、完整的;(b)你会不断更新个人资料,以符合及时、详尽、准确的要求;

这段话明显是翻译 Facebook 的:

(a) provide accurate, current and complete information about you as may be prompted by any registration forms on the Site (“Registration Data”); … (c) maintain and promptly update the Registration Data, and any other information you provide to Company, to keep it accurate, current and complete;

我在 Facebook 还是 LinkedIn 还都是真实姓名, 也没人要我这么做. 至于海内么, 信不过. 况且就算我用 You XU 去注册, 海内也不让. You XU 不算实名么? Facebook 的使用条款只是说, 保持注册信息(学校, 邮箱等)准确及时更新. 海内扩展到个人资料了. 这就难过了, 难道我今天看了一个好电影也要向你海内报告么. 应当是用户主动贡献内容, 不是强迫用户贡献内容. 既然一开始就强迫, 那我走好了. 我是不合格的海内用户. 88 海内.

所有的海内过来的邮件都被自动 spam 了, 感谢各位邀请.

Dec 3, 2007 - 国家林业局还真幽默, 专门讲笑话给台湾同胞听

Comments

[下文来自我国著名官方媒体新华网]

中央电视台记者: … 还有一个问题,最近陕西镇坪县的老虎照片的事件在社会上引起了广大反响,最近有民间机构鉴定说这个照片和有关方面鉴定的结果不一样,称照片有假。请问林业局对这个事件是什么看法?谢谢。

您刚刚提的这个问题,也是近期来广大网民十分关注的一个热点问题,我每天也打开电脑查看这方面的报道。我们国家林业局已经注意到,昨天互联网上公布了华南虎照片鉴定的消息,某网站聘请了几位人士对陕西镇坪县农民周正龙拍的40张数码照片进行鉴定,并宣布了鉴定的意见,对照片也做了一个表态 … 陕西省林业厅从2006年6月到2007年的2月专门成立了调查队,对这一区域的华南虎等野生动物的资源进行了专题调查。调查中也发现了一些野生华南虎存在的痕迹,但是不足以分析它的实情。所以这次照片中老虎是真是假,是否是活体,都难以评估该地区野生华南虎的状况 …

南方都市报记者:

国家林业局是否就华南虎照片的真假予以进一步地鉴定,给予公众一个明确的说法?如果打算鉴定的话,那国家林业局将通过何种鉴定的方式?有没有明确的时间表,最后什么时候对照片的真假给予说明?第二个问题,陕西方面说这个照片是真的,请问陕西方面是通过什么样的途径、什么样的方式鉴定照片是真?当时国家林业局是否收到有关的情况?谢谢。 2007-12-04 11:02:34

曹清尧:

国家林业局的主要职责是负责野生动植物的保护、资源调查和保护区的建设,行政行为必须按照有关法律法规的要求,不能缺位,也不能越位 … 陕西省林业厅11月13日公布了野生华南虎的照片,他们经过了有关方面的论证。我们相信陕西省人民政府和陕西省林业厅会科学认真地对待公众的置疑。谢谢你!

新京报记者:

第二个问题,请问新闻发言人,您刚才讲到华南虎的问题,是我们林业部门做到不缺位、不越位。那我的理解是我们林业部门对于虎照的本身真假应该是不承担鉴定的责任的,但是陕西的林业厅却认定它是一个真的,并将它公布了。那么,陕西林业厅是否越位了?是不是即便是林业部门找到一个真的华南虎,我们也不能证明它一定是我们公布的虎照里面的虎,这个照片的真假仍然是一个谜,到底哪个部门介入调查才能对虎照的真假作出权威的解释?谢谢。

曹清尧:

关于国家林业局的职能,刚才我已经做了通报。在11月8日新闻发布会上也做了相关说明。这次调查能不能拍到真的老虎,照片中的老虎是不是真的,都不能完全说明野生华南虎在当地生存的状况。不论照片中的老虎是活体还是其他,我们和大家的心情都一样,希望野生华南虎在我们的国土上面还能够生存和繁衍下去。野生华南虎以及野生动物都是我们共同的朋友,希望它们在野外生存良好。

台湾年代电视台记者:

当时国家林业局派了十名专家到现场做了一个勘察,我相信他们秉着科学严谨的精神,因为调查范围还包括其他的动物。但我认为这个事情已经在社会中讨论相当长的时间,是不是发布照片的真伪过程中,怕担心另外一个舆论压力?我相信在整个林业局或者是其他调查单位对这张照片的真伪问题会有非常好的鉴定过程。我想问的是,不知道发布这样的照片是不是让林业局为难?谢谢。

曹清尧:

谢谢台湾媒体对这件事情的关注 … 我也希望通过你的报道,让宝岛台湾的同胞更进一步地关注,包括华南虎、大熊猫等关于我们国宝的生存状况。并且通过媒体来促进两岸野生动物保护方面的交流。关于照片的信息,国家林业局会根据调查和鉴定结果,及时发布相关信息。谢谢。

祝列克:

关于记者们的提问,让我想起了英国尼斯湖的水怪,不知道在坐的记者有没有到过尼斯湖旁的一个国家博物馆去看过,它也有很多尼斯湖水怪的照片。人们并不知道那些照片是真是假,而更关心的是水怪存不存在。

丢人丢到对岸去了, 丢吧丢吧, 全世界人都看中国的平面老虎的笑话呢! 都说谣言止于智者, 现在是谎话发于奸滑, 欲盖弥彰于傻X, 见笑于列邦.

我们国家没有监管机制, 不能成立独立调查委员会.司法渠道不畅通, 林业局又推卸责任, 民间的声音可能不久又要被和谐. 很多人寄希望于高层, 可是这个又不是 SARS 时期人命关天, 谁来监管政府公信? 靠人而不是制度能即使解决一时, 能解决以后类似的政府公信缺失么?

毛泽东说,  群众的眼睛是雪亮的.  若干年后, 某些蒙蔽真相的人, 必将被历史惩罚. 且看还能跳多久好了.

Nov 30, 2007 - How to give a program fake system time so that you can use it forever (Linux)

Comments

[Disclaim: It’s evil, don’t use it unless you are fighting with some even more evil software.]

Short Intro. [Skip it if you don’t know much about OS or aren’t interested in the technical detail ]

As you might know, every program on Linux system runs on the kernel instead of directly contacting with actual machine. For modern operation systems like Linux, BSD(Mac) and Windows, a mechanism called system call is used to request the system resources via operation system so that operation system has the full control of all programs. In brief, when user program need call a function in library, e.g. print in stdlib, library function forwards (usually library function is a light-weighed wrap of the system call) the request to operation system. Since the system is highly hierarchical and user program is built on the top of libraries and OS kernel, it’s possible to insert some layers in between program and OS to intercept the request. Don’t panic about the nerdy name. Actually this strategy is commonly used on Window platform in anti-virus software as well, because anti-virus software want to monitor every system resource usage for any program and prevent the malicious resource requests.

Here, we simply want to intercept a system call named “TIME” so that every time a program request the current time (so that it can verify whether the licence has expired), we feed the program with a fixed (fake) time. By fooling the program around, you can literally use a program forever. God, doesn’t this mean I can use all software forever? The bad news is for some OSs like Windows, it’s very hard to do system call interception as all the APIs are undocumented and software might have other ways to prevent this. The good news is lots of software on Linux and Mac are simply reading system time. Actually, only top developers and Microsoft partners know how to do system interception. However, for Linux, since the system itself is open source from bottom up, there is no way to prevent such kind of interception (Now you know why some software companies don’t like Linux :).

Approach 

On Linux, tons of methods are around. Here I just introduce three of them briefly under the assumption that you don’t have the source code of that software. [Otherwise you can just modify the source code]

**

Method 1: Intercept library call in linking time.**

Sometimes you have a library (A) that can be used as a part of your program and you want to intercept the library call of that library (A). The best way and the easiest way is to write a fake function and link it in the compile time. This method is totally harmless to your system and very neat. If you can do some modification in makefile, then this procedure is totally transparent to both developer and user.

**

Method 2: Intercept system call in the run time**

If you’ve already got a execute program, then there is no way to intercept the system call in compiling time. To intercept the system call in the run time, there are two ways. The first approach is putting the target program in a designed container. Typically, a container fork/create/call the target program as child process. Since in OS, parent process has accessibility to the child process, it can intercept syscalls easily via ptrace toolset. The second method is to hack the kernel, namely, to tell the Linux kernel to response syscall in a certain way. Since now Linux supports kernel module, a very convenience approach is to compile a program as kernel module and install it on the fly. However, this method is less flexible then the previous method as now all the syscall are intercepted, even for system calls from other programs. [Sure, you can restrict the module only applicable to a certain process via a pid comparison, but then you need to feed the kernel module with PID, it’s awkward ]

In my implementation, I use ptrace/container method. I’ve tried kernel module method but failed as there were not so much well-formed documents on Linux 2.6 kernel.

Here is my code, it’s self-explanatory, have fun with hacking. [Download the C file]

/* Faketime wraps a user program and feed it with user-specified fake system time
   so that it can be used forever without any "licence expired" problem
	 
    Copyright (C) 2007 Eric You XU, Washington University ( youxu [@T] wustl.edu ) 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 

*/

#include <sys/ptrace.h>
#include <asm/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <linux/user.h>

/*
Register layout defined linux/user.h, but actually in 
 asm-$(arch)/user.h
struct user_regs_struct {
        long ebx, ecx, edx, esi, edi, ebp, eax;
        unsigned short ds, __ds, es, __es;
        unsigned short fs, __fs, gs, __gs;
        long orig_eax, eip;
        unsigned short cs, __cs;
        long eflags, esp;
        unsigned short ss, __ss;
};
*/

/* Note that EAX now is RAX in x86-64
 	we can also find the actural offset for any register
 	from <asm-$(arch)/ptrace-abi.h>
#define RAX 24
*/

#define ORIG_RAX 44
/* ORIG_RAX stores the number of syscall */

#define SYS_TIME 13
/* Machine specific syscall number is defined in 
	unistd.h */

#define back_to_future 1175737392

/* Time is stored as a long interger in C, you can get 
	current time via time(NULL). Thus, it's very easy to 
	get a long integer denoting some time in the past. 
	
	Python/Java can also be helpful in figuring this out 
	
	If you don't know how, just keep in mind that 
	Dec. 1, 2007 is about 1196476452. 
	One day interval = 60*60*24 = 86400 [Time flies fast]
*/

char* host_program = "your program name here";
char* arglist = "your program fake list here";
/* Make modifications for these two lines, then 
	compile it via
		gcc faketime.c -o faketime
	use it via 
		./faketime
*/

int main()
{   pid_t child;
    long orig_rax, eax;

	 struct user_regs_struct regs;
	 int status;
    int insyscall = ;
    child = fork();
    if(child == ) {
        ptrace(PTRACE_TRACEME, , NULL, NULL);
        execl(host_program, arglist, NULL);
          }
    else {
       while(1) {
          wait(&status);
          if(WIFEXITED(status))
              break;
          orig_rax = ptrace(PTRACE_PEEKUSER,
                     child, ORIG_RAX, NULL);

          if(orig_rax == SYS_TIME ) { /* Intercept SYS_TIME syscall */
             if(insyscall == ) { /* Syscall entry */
                insyscall = 1;
             			  }
         	 else { /* Syscall exit */
					ptrace(PTRACE_GETREGS, child, , &regs);
				   	/* We can also use ptrace(PTRACE_SETREGS, child ,RAX, &back_to_future); 
						but it doesn't work. There might be some tricky here */
					regs.eax = back_to_future;
					ptrace(PTRACE_SETREGS, child, , &regs);
            	                 }
          } // End if with SYS_TIME 
       ptrace(PTRACE_SYSCALL, child, NULL, NULL);
        }
    }
    return ;
}