技术
Adobe AIR和他的对手们
0转载自:http://www.k-zone.cn/zblog/post/adobe-air-silveright-javafx-prism.html
一切权力归著作人所有
本来很久之前就想写一篇这样的文章,但是一直没有时间,今天在“机缘巧合”下,就把把这篇文章成稿了:)
自从Adobe AIR在08年露出端倪以后,Adobe的野心也就“昭然若揭”了,正如我在08年,应RIAMeeting邀请,做了一篇关于Adobe AIR的演讲上面说的那样,Adobe不安心、也不甘心做浏览器的“第一公民”,而是要做操作系统的第一公民,因此Adobe AIR应运而生。
而本篇文章不是悉数Adobe AIR的,而是想说一下他的对手们。既然说到对手,就要先来说一下Adobe AIR的特性。总结如下:
1、离线处理功能(可以利用SQLLite进行离线处理)
2、Flex → AIR,几乎可以无缝转换的特征。
3、无需浏览器而单独运行。
okay,上面几点就是Adobe AIR的一些比较显著的特质了,那么我们再说一下Adobe AIR的对手们。
1、Silverlight 3.0版本
“据说”(已经被证实)在这个3.0版本里面增加了“OUT OF BROWSER”功能,即可以“让用户将他们喜欢的SILVERLIGHT程序直接放到他们的桌面或开始菜单中,而不用去下载任何运行环境和打开浏览器程序”。
也就是说,第三版的Silverlight已经具有了Adobe AIR的第三个特性。同样,也具有第二个特性,但是惟独在这个版本中没有集成Adobe AIR的第一个特性。
结论:无须质疑,在Silverlight 3.0与Adobe AIR的“对局”中已经败下阵来。
2、Ajax
如果要说RIA的话,除了Flex外,就要数Ajax的资格老了,不仅他的资格老,而且内容也“老”,“无非就是”JavaScript而已:)但是千万不要小看这个JavaScript,在TIOBE程式語言最新排名-2009年5月版的排行版上,也是前十名的选手(要知道ActionScript 3.0的排行才是区区23名而已)
如果要比较一下Ajax的话,我想与AIR是没有办法相比了,因为Ajax虽然属于RIA范畴,但是他的对手也仅仅是Flex、或者说是Silverlight 3.0以上的版本(不包含3.0版本)。
结论:还未比较就败下阵来。但是大家千万不要觉得JavaScript就无法与Adobe AIR相提并论了,其他他的实力还是蛮强大的,这点我会在下面的内容中陈述的。
3、JavaFX
自从Sun推出了自己的RIA概念的编程语言:JavaFX,Kenshin认为RIA这个圈是越来越好玩了,相继Adobe、Microsoft、Oracle都纷纷加入这个战团。这样才真的有意思嘛,否则就Adobe自己玩,想玩都玩不大。
Sun的JavaFX,有他先天的优势 – Java,别忘记虽然Java的霸主地位被一再的侵蚀,但是“瘦死的骆驼比马大”,更何况他还没有“死”,在TIOBE程式語言最新排名-2009年5月版的排行版上仍然是一副老大的嘴脸。现在到了Oracle手里,我希望Oracle给可以赋予Java、赋予JavaFX更强大的战斗力。
总结:但是JavaFX现在还它弱小了,因此JavaFX最大的竞争对手是Flex、Ajax、Silverlight 3.0以上版本,他连AIR的边都没靠,估计就得“挂”了:)不过我倒是认为JavaFX就从Sun对他的命名上面,就可以知道,Sun不会再犯JSP时代的错误了。
以上就是Adobe AIR正统的对手们,通过一些了解可以得知,除了“犹抱琵琶半遮面”的Silverlight 3.0似乎可以与之抗衡一下,其他诸如Ajax、JavaFX均不在一个数量级上,充其量就能与Flex“过过招”,但基本上也是完败与Flex的。
那么说完了“正统”的对手,让我们在来看一下,“明修栈道暗渡陈仓”的Adobe AIR的非正统的对手们。
1、Prism(三棱镜)
说到Prism,估计没有太多的人认识他,同时说到Mozilla,相比也没有太多的人了解,但是说到“鼎鼎大名”的FireFox(中文名:火狐),估计就是无人不知,无人不晓的了。而Prism正是系出名门(Mozilla)旗下FireFox的“同门小师弟”。
但是Prism与Adobe AIR有什么关系吗?
其实道理很简单,Adobe AIR的特性我已经在上面叙述了,但是在这里再总结一下:
可以将web Application无缝等转移到桌面上面,同时具有desk Application的一些特征:可以使用OS API、不依赖于浏览器等等。
说完了Adobe AIR的特征,让我们来了解一下Prism能做些什么?
关于Prism的功能,我早在07年的时候(请注意一下这个时间),就在这个博客上面介绍过,详细请看这里:http://www.k-zone.cn/zblog/post/prism.html
其中关于Prism的定义如下:
Prism可以将用户在浏览器中的Web程序(例如Google Docs、Google Canlendar等)分离出来,并直接在桌面(Window、Liunx、Mac OS X)上面运行。
因此Prism在某种意义上说可以约等于Adobe的AIR项目和微软的WPF、Silverlight项目,同属与RIA范畴的软件,因此在这一领域将直接面对Adobe和Micosoft的挑战。
在让我们看一下Prism实际中的运行图:(我分别运行了Gmail、Tasks、Facebook、FriendFeed)在我的桌面上面。

是不是很“吓人”呢?我可以通过Prism直接将任意web Application 转换为desk Application,而不需要什么Adobe AIR、Silverlight的支持。在Prism上面完全符合Adobe AIR这个概念的“核心”特质。为什么说核心特质呢?因为Prism其实只是可以“模拟”web Application上面的运行,而非具有离线功能、操作OS API等功能。
总结:Prism虽然好,虽然在某些程度上“暗度”了一把Adobe AIR,但是还是与Adobe AIR有些较明显的差距。
2、Google Gears
没错,就是Google Gears(这也是在07年的时候,Google发布的应用程序),这个让浏览器支持离线处理功能的工具。
关于Google Gears的介绍请看:http://baike.baidu.com/view/1037577.htm 或者 http://code.google.com/intl/zh-CN/apis/gears/
通过以上的介绍可以得知,Google Gears是离线处理的“利器”,泛泛的说,只要是支持Google Gears的网站都具有离线处理功能。例如:Google Reader、WordPress 2.6以上版本等。
同时,由于Google Gears得益于开放的API政策,因此任何人都可以利用Google Gears API编写自己的离线功能的web Application。
其实介绍了这么多,就说明一个事情:Google Gears具有Adobe AIR特征中的“离线处理”功能。
总结:Google Gears虽然具有离线处理功能,由于缺乏其他特质,因此依旧不能给Adobe AIR带来直接的威胁,同样在与Adobe AIR的对阵中也败下阵来了。
结果上面的一系列比较,无论是正统的Silverlight 3.0、Ajax、JavaFX、还是“旁门左道”的Prism,Google Gears都不是Adobe AIR的对手。难道Adobe AIR真的可以“笑傲江湖”吗?
其实不然,既然我们单独对决无一胜算,但是我们可以联合起来。假设以下的情况:
1、Google Reader(具有离线功能) + Prism,我想就变成了一个具有离线处理,同时也可以在桌面上运行、不依赖于浏览器的desk Application,而这个desk Application作为一个RSS Reader来说,我想足可以“干掉”目前市面上面所有的desk Application吧?更何况是Adobe AIR版本的Reader(目前尚不清楚是否有这种AIR Reader的存在)
2、Google Gears API + Prism + JavaScript的方式。
通过以上的组合,我们可以做到给任意web Application加上具有AIR一样的作用,我随便举几个例子来说:FriendFeed、Facebook、Twitter、Delicious等都具有以上的功能,那么将会是多么可怕的事情。
这样就可以使上面的那几个应用不局限与浏览器、网络而可以单独生存。那么我想Adobe AIR是无论如何也无法做到一些AIR版本的FriendFeed、Facebook、Twitter、Delicious吧?
最后总结一下:
个人猜测,Google Gears、Prism、JavaScript、甚至于包含HTML 5标准的浏览器、Google Chrome、FireFox都将会是Adobe AIR真正的竞争对手!
C#写的定时关机程序及一些感想
5前几天老婆想要一个自动关机的软件,这种小软件网上下载不是有广告就可能有病毒,或者觉得不好用。这么简单的软件,自己应该很容易写一个吧。首先用几分钟写出一个bat脚本。(脚本卖萌的地方,不要见笑哦)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @echo off echo 自动关机程序,献给我亲爱的老婆! echo 请输入需要关机的延迟时间。 echo 请先保存、关闭重要的程序,到时候会强制关机,不能后悔哦。 :again echo 关机时间(秒)= set /p SHUTDELAY= echo 将在 %SHUTDELAY%秒后关机,确认输入ok然后回车,取消请关闭本窗口。 echo 如果要重新输入关机时间,请按回车。 set /p AGREE= if "%AGREE%"=="ok" shutdown -f -s -t %SHUTDELAY% if not "%AGREE%"=="ok" goto again echo 老婆的命令已经生效了。请关闭本窗口。 pause>nul |
当然这样的脚本并不能充分显示老公的“手艺”,于是动手写一个窗体程序。本来可以用C++ MFC,但是想想也太没有挑战性了,顺便想体验一下高生产率的语言带来的好处(参考此文),所以用C#写了一个小工具。大家可以到我的公开SVN上下载代码。代码基于GPL协议发布。
SVN地址: http://svn.zhu.im/just-for-fun/CsharpProjs/ShutdownMyPC/
代码中依然有卖萌的地方,切勿拿来交作业什么的。:)
以下是运行界面:最小化后可以隐藏在系统托盘哦
————————————————————–
但是,这样一个东西在发布给用户(嗯,我老婆一个人)时,遇到了麻烦。原来她办公的电脑时很久很久没有更新的Windows XP,有没有.Net Framework不知道,但肯定没有.net framework 4. 于是想要制作一个安装程序,把framework集成到安装包里。结果,我没有找到任何可用的解决方法。如果按照微软标准做法,使用联机下载方式,那不联网的电脑怎么办?如果使用本地安装包,我本来数k字节的软件,瞬间变成数十M,size可是钱啊。不论时网络传输还是介质拷贝,文件一大什么方法都不优雅了。这简直就是悲剧。幸好,家里的Windows 7在我的悉心呵护下,长期保持自动更新,终于能用来给“客户”演示了。
另外一个感想就是,程序员真的需要坚持不懈的克服“程序员情结”。我写软件为了好玩,加入倒计时声音警告功能、加入了几种色彩警告,不仅没有得到“用户”好评,反而被批“弄那么麻烦干嘛”。是啊,KISS吧,你懂的。(不过我老婆会领会为另外一种意思,两者都很好)
附上exe程序,电脑中已经安装了.Net framework 4.0已经自己愿意且会安装的人可以下载来玩玩:
下次我会用C++实现尽可能少依赖性的软件了。
转载:理查德·斯托曼一直是对的
0作者: 阮一峰
日期: 2012年1月19日
所有反对SOPA的文章之中,有一篇的题目是《理查德·斯托曼一直是对的》,我印象最深。
它指出,最近几个月,美国的公民自由严重倒退。先是《国防授权法案》(NDAA)允许政府可以不经任何程序,无限期拘捕具有恐怖活动嫌疑的人;接着是参与”占领华尔街”运动的民众被污蔑成”恐怖分子”;现在又是SOPA,它企图通过控制传播渠道,来抑制信息的流通。

这些对公民自由的侵犯,不禁让人联想到,30年前的1983年,有一个叫做理查德·斯托曼的程序员,声称“软件的自由,关系到人类的自由”。这个观点当时被认为荒唐偏激,但是现在来看,他担心的事情正在变成现实,他其实是对的。

很多人不赞成理查德·斯托曼,一部分原因是觉得他过于极端,是一个狂热的偏执症患者。比如,他仅有的个人电脑是一台龙芯上网本, 因为这是世界唯一的全部使用自由软件(Bios、硬件驱动、操作系统、应用软件)的电脑;他拒绝使用手机,因为手机的硬件和软件太封闭,使用某个品牌的手 机,几乎等同于接受某家公司的控制;甚至他的头发、他的胡子、他的服装,都让人们觉得这是一个怪人,大可不必理会他的观点。

“我们的社会正越来越依赖计算机,我们使用的软件对保证未来社会的自由至关重要。自由软件使我们能够控制我们使用的技术,让技术造福个人和社会,而不是让技术被商业公司或政府控制,用来限制或监视我们。”
(As our society grows more dependent on computers, the software we run is of critical importance to securing the future of a free society. Free software is about having control over the technology we use in our homes, schools and businesses, where computers work for our individual and communal benefit, not for proprietary software companies or governments who might seek to restrict and monitor us.)
很长时间内,我也认为理查德·斯托曼太极端,对他说的”软件=自由”根本没有感觉,只是觉得自由软件可以免费使用,这点很不错。我从没想过,软件与 大公司的垄断、政府的独裁有什么关系,言论自由、公民权力,这些问题怎么会涉及到编程呢?任何时候,只要自由软件能让我不花钱就用上新功能,我就心满意足 了。
但是近几年来,随着《爱国者法案》、国家防火墙、实名制、SOPA这样的事情越来越多,我逐渐意识到,我是错的,理查德·斯托曼是对的。如今,政府控制人民不再需要警察和军队了,他们只需要控制软件和硬件就行了。
电脑和网络技术,在现代社会中占据了至关重要的位置。控制了它们,就可以监视人们的一举一动、一言一行,等同于控制言论、思想、真理和权力。你或许 会说,面对面的交谈,就可以免受控制。错!想一想我们怎么安排见面?再想一想,我们身上的每一台设备都与网络相连,这意味着什么?
假设一个邪恶的政府与大资本家联手,企图剥夺人民的自由。只要自由软件存在,他们就不可能完全成功,因为代码和技术细节都是开放的,他们无法掩人耳 目,自由软件将是人民反抗的武器。反过来,如果没有自由软件,代码、协议、操作系统、硬件驱动、文件格式都是保密的,请问你怎么反抗呢?你拿什么反抗呢? 根本不需要SOPA,你的自由早就在他人的控制之下了。
这就是斯托曼一直重复的警告,可惜大多数人都忽视了他的话,只从经济角度看待代码。直到有一天,代码与我们的自由紧密相关的时候,我们才开始醒悟。自由软件是抵抗邪恶政府、捍卫自由的武器。源码包含着力量,我们必须保证,它控制在自由的人们手里。
最终来说,自由软件与商业无关,它只关系到人类的自由。GPL许可证从来不反对用软件挣钱,它只反对你通过限制他人的自由来挣钱。在理查德·斯托曼看来,专有软件剥夺用户的自由,最终将导致灾难性的后果,高度依赖计算机的社会尤其如此。
如果你想推广你的代码,让更多的人使用,那么BSD许可证效果更好。但是,如果你想保证自由从此再不会消失、而是像雪球那样越滚越大,那么GPL许可证是最好的选择。
理查德·斯托曼在30年前,就意识到这一点。他忍受各种艰难困苦,绝不妥协,到处鼓吹自由软件的合理性和必要性。今天我们已经看清楚了,30年了,他一直是对的!
必须让大家明白,软件代码不仅仅是商业产品,更重要的,它是人类自由的一部分。如果我们要保卫自由,就必须支持自由软件。你可以使用闭源软件,但是你应该支持自由软件,因为没有它,就没有我们的自由,不仅未来如此,而且现在已经如此了。
(完) (更多…)
深入理解C语言
0轉載自本站友情鏈接的coolshell,原文鏈接。
朱文昊評註:感謝Ritchie等先驅,他們的聰明才智和貢獻令人欽佩萬分。C語言的很多特性都有歷史的影子,隨著時間的流逝歷史逐漸沈積為基石。這樣,要學好用好C語言,除了可以多瞭解一下計算機科學的發展史,更應該多瞭解一些硬件相關的東西。推薦延伸閱讀資料:《C語言缺陷於陷阱》以及《C語言專家編程》
Dennis Ritchie 过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言。一门经历40多年的到今天还长盛不衰的语言,今天很多语言都受到C的影响,C++,Java,C#,Perl, PHP, Javascript, 等等。但是,你对C了解吗?相信你看过本站的《C语言的谜题》还有《谁说C语言很简单?》,这里,我再写一篇关于深入理解C语言的文章,一方面是缅怀Dennis,另一方面是告诉大家应该如何学好一门语言。(顺便注明一下,下面的一些例子来源于这个slides)
首先,我们先来看下面这个经典的代码:
1 2 3 4 5 6 7 8 9 | int main() { int a = 42; printf(“%d\n”, a); } |
从这段代码里你看到了什么问题?我们都知道,这段程序里少了一个#include <stdio.h> 还少了一个return 0;的返回语句。
不过,让我们来深入的学习一下,
- 这段代码在C++下无法编译,因为C++需要明确声明函数
- 这段代码在C的编译器下会编译通过,因为在编译期,编译器会生成一个printf的函数定义,并生成.o文件,链接时,会找到标准的链接库,所以能编译通过。
- 但是,你知道这段程序的退出码吗?在ANSI-C下,退出码是一些未定义的垃圾数。但在C89下,退出码是3,因为其取了printf的返回值。为什么printf函数返回3呢?因为其输出了’4′, ’2′,’\n’ 三个字符。而在C99下,其会返回0,也就是成功地运行了这段程序。你可以使用gcc的 -std=c89或是-std=c99来编译上面的程序看结果。
- 另外,我们还要注意main(),在C标准下,如果一个函数不要参数,应该声明成main(void),而main()其实相当于main(…),也就是说其可以有任意多的参数。
我们再来看一段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <stdio.h> void f(void) { static int a = 3; static int b; int c; ++a; ++b; ++c; printf("a=%d\n", a); printf("b=%d\n", b); printf("c=%d\n", c); } int main(void) { f(); f(); f(); } |
这个程序会输出什么?
- 我相信你对a的输出相当有把握,就分别是4,5,6,因为那个静态变量。
- 对于c呢,你应该也比较肯定,那是一堆乱数。
- 但是你可能不知道b的输出会是什么?答案是1,2,3。为什么和c不一样呢?因为,如果要初始化,每次调用函数里,编译器都要初始化函数栈空间,这太费性能了。但是c的编译器会初始化静态变量为0,因为这只是在启动程序时的动作。
- 全局变量同样会被初始化。
说到全局变量,你知道 静态全局变量和一般全局变量的差别吗?是的,对于static 的全局变量,其对链接器不可以见,也就是说,这个变量只能在当前文件中使用。
我们再来看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <stdio.h> void foo(void) { int a; printf("%d\n", a); } void bar(void) { int a = 42; } int main(void) { bar(); foo(); } |
你知道这段代码会输出什么吗?A) 一个随机值,B) 42。A 和 B都对(在“在函数外存取局部变量的一个比喻”文中的最后给过这个例子),不过,你知道为什么吗?
- 如果你使用一般的编译,会输出42,因为我们的编译器优化了函数的调用栈(重用了之前的栈),为的是更快,这没有什么副作用。反正你不初始化,他就是随机值,既然是随机值,什么都无所谓。
- 但是,如果你的编译打开了代码优化的开关,-O,这意味着,foo()函数的代码会被优化成main()里的一个inline函数,也就是说没有函数调用,就像宏定义一样。于是你会看到一个随机的垃圾数。
下面,我们再来看一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int b(void) { printf(“3”); return 3; } int c(void) { printf(“4”); return 4; } int main(void) { int a = b() + c(); printf(“%d\n”, a); } |
这段程序会输出什么?,你会说是,3,4,7。但是我想告诉你,这也有可能输出,4,3,7。为什么呢? 这是因为,在C/C++中,表达的评估次序是没有标准定义的。编译器可以正着来,也可以反着来,所以,不同的编译器会有不同的输出。你知道这个特性以后,你就知道这样的程序是没有可移植性的。
我们再来看看下面的这堆代码,他们分别输出什么呢?
1 2 3 4 5 6 7 8 9 | int a=41; a++; printf(“%d\n”, a); int a=41; a++ & printf(“%d\n”, a); int a=41; a++ && printf(“%d\n”, a); int a=41; if (a++ < 42) printf(“%d\n”, a); int a=41; a = a++; printf(“%d\n”, a); |
只有示例一,示例三,示例四输出42,而示例二和五的行为则是未定义的。关于这种未定义的东西是因为Sequence Points的影响(Sequence Points是一种规则,也就是程序执行的序列点,在两点之间的表达式只能对变量有一次修改),因为这会让编译器不知道在一个表达式顺列上如何存取变量的值。比如a = a++,a + a++,不过,在C中,这样的情况很少。
下面,再看一段代码:(假设int为4字节,char为1字节)
1 2 3 4 5 6 7 | struct X { int a; char b; int c; }; printf("%d,", sizeof(struct X)); struct Y { int a; char b; int c; char d}; printf("%d\n", sizeof(struct Y)); |
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
- 但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
- 但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
另外,再提一下,上述程序的printf中的%d并不好,因为,在64位下,sizeof的size_t是unsigned long,而32位下是 unsigned int,所以,C99引入了一个专门给size_t用的%zu。这点需要注意。在64位平台下,C/C++ 的编译需要注意很多事。你可以参看《64位平台C/C++开发注意事项》。
下面,我们再说说编译器的Warning,请看代码:
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main(void) { int a; printf("%d\n", a); } |
考虑下面两种编译代码的方式 :
- cc -Wall a.c
- cc -Wall -O a.c
前一种是不会编译出a未初化的警告信息的,而只有在-O的情况下,才会有未初始化的警告信息。这点就是为什么我们在makefile里的CFLAGS上总是需要-Wall和 -O。
最后,我们再来看一个指针问题,你看下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int main(void) { int a[5]; printf("%x\n", a); printf("%x\n", a+1); printf("%x\n", &a); printf("%x\n", &a+1); } |
假如我们的a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?
- 第一条printf语句应该没有问题,就是 bfe2e100
- 第二条printf语句你可能会以为是bfe2e101。那就错了,a+1,编译器会编译成 a+ 1*sizeof(int),int在32位下是4字节,所以是加4,也就是bfe2e104
- 第三条printf语句可能是你最头疼的,我们怎么知道a的地址?我不知道吗?可不就是bfe2e100。那岂不成了a==&a啦?这怎么可能?自己存自己的?也许很多人会觉得指针和数组是一回事,那么你就错了。如果是 int *a,那么没有问题,因为a是指针,所以 &a 是指针的地址,a 和 &a不一样。但是这是数组啊a[],所以&a其实是被编译成了 &a[0]。
- 第四条printf语句就很自然了,就是bfe2e104。还是不对,因为是&a是数组,被看成int(*)[5],所以sizeof(a)是5,也就是5*sizeof(int),也就是bfe2e114。
看过这么多,你可能会觉得C语言设计得真扯淡啊。不过我要告诉下面几点Dennis当初设计C语言的初衷:
1)相信程序员,不阻止程序员做他们想做的事。
2)保持语言的简洁,以及概念上的简单。
3)保证性能,就算牺牲移植性。
今天很多语言进化得很高级了,语法也越来越复杂和强大,但是C语言依然光芒四射,Dennis离世了,但是C语言的这些设计思路将永远不朽。
(请勿用于商业用途,转载时请注明作者和出处)
提供最新,最完整的Android源代码压缩包下载
8我的Blog里,提供了几种Android源码下载的文章是最受欢迎的了。看来真的又很多人需要打包好的Android源码。
所以我会把自己一个服务器300G的硬盘空间中的大部分拿出来存储和分享Android源代码。如果你需要Android源代码,你可以去看看http://d.zhu.im/android/
如果你要链接到我的文件,最好能再页面上放置友情链接、说句谢谢之类的,我就很开心了。
除了再2011年10月24日以前生成的文件,是我手动产生的,所以会长期保留之外,建议你不要静态链接到源码压缩包,因为硬盘空间不够的时候,旧文件会被删除。我提供了符号链接,你查找名字类似 “latest-android-’$VERSION-ID’.tar.gz”这样的文件,链接到他,可以指向最新同步好的文件。
目前提供三个版本的源码包。
如果你需要其他版本,请提供版本号。如何提供版本号?请先读一下我的自动更新脚本。
我的300G服务器是CentOS的,没法容易地repo sync.所以我写了一个脚本运行在一个Ubuntu机器上。现在地想法是每周运行一次。这个周期是否需要调整,也看各位的反馈了。
脚本如下:
(更多…)
