10000小时的自勉

今天又读了励志文章。。说是无论任何职业,只需训练10000小时便可达到世界顶尖水平。

其实这个理论很早之前在《读者》上看到过,说是训练3000小时可达到专业水平,训练10000小时可达到世界级别。当时虽然看得热血沸腾,可惜很快就把这事情忘记了。

不管怎么说,莫名其妙的再次被点燃了。果然励志文章就是像吸毒一样有效啊。。

虽然从初中开始玩VB和TURBO C,到目前为止,总共练习过多少个小时编程呢?估计不多。上大学之前,每个月能练习几个小时就不错了。对什么都只是一知半解,并且只能在家长不在的时候偷着做些实际的coding。大学四年确实做了一些项目,不过大一大二其实还是混混为主,每天能有2小时的练习时间就差不多了。算上寒暑假之类,只能给算1小时每天。大三大四开始有加班加点干活的习惯了,并且假期的时间基本上也都慢慢利用起来了。 可以算每天工作2小时了吧。这样算来,到目前为止我在程序技能上的训练大概是2千小时左右。

所以今后什么打算呢?在北京实习的时候我发现每天工作4个小时是效率最高的。虽然在公司蹲着的时间可能要10个小时都不止,但实际上coding的时间其实差不多也就4个小时。除了自己开小差之外,还要开会,跟同事和boss交换意见汇报情况问问题或者解答问题,发邮件到其他部门询问接口变化或者bug修复情况等等等。。。总之我给自己定的要求不会太高,就是4个小时。

说实话,在学校读书这段时间,想要保持4小时工作时间还是很有困难的。毕竟白天还有课,还要应付考试和做作业。

假如白天上一整天课的话,从7点开始工作做到11点休息,是4个小时,不过考虑到开小差的情况,周末需增加工作量。也就是说,能满足每周工作28小时就可以了。根据我的课程表,一周有两天是全天课有三天是全天休息,于是工作计划定为2h 4h 4h 2h 6h 6h 6h 就差不多了。假如能坚持每天4小时工作5年的话,就能达到7000多个小时的训练量,加上大学积累的2000小时左右就能接近10000小时这个数字了。怎么样,想想就热血沸腾吧。。

不过这个目标是不可能做到的,因为这4个小时的训练,必须练习的是自己不熟悉的内容。而毕业之后进入公司,多半是重复劳动,不可能让你一直学新东西的。当然工作之余可以自己参与开源项目或者玩topcoder, 但精力有限是不可能做到足额时间的。因此这个计算要折半。假如我保持旺盛精力不断学习不断努力工作的话,10年之后就能接近10000小时的训练积累了。

接下来是内容。每天训练4个小时,做什么内容呢?五年这么长的时间是无法预计的,不过我可以考虑今年的目标。我现在手头有一个网站外包项目,一个RFID课程项目,一个uC/OS单片机移植项目,说起来都算是不熟悉的内容,在12月份之前完成,只需高密度工作就能保证训练时间了。之前的AIIDE比赛虽然结果很糟糕,但无论如何已经开始学习机器学习的知识了,接下来就是把他写成论文,先解决研究生毕业的问题,然后看看是否有其他的事情可以做,或者是否有兴趣相投的同学一道共同探讨。说到比赛,chaosBB同学成绩不错啊,这里先祝贺一下,有机会希望能跟你多交流切磋呢~

除了开发和工程的训练,另一方面就是领域知识和学科知识。帮老师做网站外包,看似只是苦力,但我认为这是了解商业领域知识的大好机会,尤其这次项目涉及到在线付款仓储物流等种种内容,能学到的东西应该不少。接下来我那个超级能忽悠的导师又接到或者正准备接好几个项目,有团购相关的,有物流平台相关的,能继续帮他做是情的话,对商务领域的知识学习一定是有帮助的。

至于学科知识,这就要靠个人修为了。本来打算在浙大这两年把zoj的题好好刷一刷,谁知道一进校门项目就这么紧,并且在校时间缩短成不到一年,估计是没时间练习了。不过技术文章一直都在看,对算法的理解慢慢在深化。我越来越发现,其实真正重要的不是掌握很多花哨的算法和数据结构,而是要对算法的基本常识理解得更加深入,对一些最基本最简单的算法要有更深刻的理解和认识。最初学算法的时候,我对线性结构和顺序访问不屑一顾。觉得二叉树啦堆啦快排啦什么的多牛逼(嗤之以鼻的同学请自行替换成线段树、斐波那契堆、哈希等等更高级物。。。),为何还要看这些几乎算不上算法的算法。可是经过几年时间慢慢熟悉了这些东西,最初那种对高级算法的新奇劲过去了,才发现其实朴素才是美。所谓kiss才是真。归根结底,真正常用、强大而有效的数据结构只有三种,数组,链表和堆栈。而数组又是基本的基本。很多高深的算法,其实只是更加高效的利用数组;很多神奇的数据结构,无非也是以某种顺序存储在数组里。这也是更多小时的训练带来的效果吧。以此而论即使没有更多的时间去刷zoj,能把对算法的理解领悟一点一点用到工程中去并且不断精雕细琢的话,算法的修为一定能有长进的吧。实习期间做的恰好是性能分析,感觉对复杂度、性能瓶颈等问题的嗅觉更敏感了,也写了一些小工具去分析代码质量。以后继续保持严谨的开发习惯的话,这些技能的提高应该能继续吧。

前一节讲的是算法,学科知识当然不只这个了,只不过这个是基础。此外必修课当然是操作系统和网络,好在学嵌入式学单片机学驱动开发学物联网,这些知识在校在职应该都会慢慢接触。至于机器学习作为我的研究兴趣点,在可预见的两三年内应该也会继续钻研。另外保持大量阅读技术类的新闻的话,也会磨砺自己的技能吧。因此每天花在reader上的2小时,绝不算是白费呢。

最后说说英文吧。假期里下载了一堆futurama,没有字幕,完全是裸看的。一开始很难熬,一集要反复看两三遍才看明白什么意思,才尴尬的找到已经笑不出的笑点。。。然慢慢看了几季之后,已经可以几乎不费力的理解大部分内容,并且确切知道生词出现在什么位置。甚至可以边看边给弟弟做翻译。。后来打星际,上战网看贴,感觉已经没有以前读英文的那种畏难情绪了。慢慢熟悉之后感觉读英文并不比读中文累多少,当然速度还比不上中文啦,毕竟有生词这个障碍。这就是更多小时的训练的反馈吧。以此作为激励,其他的事情也是一样的,只要坚持努力,一定会有好结果的~

Chrome同步…桌面同步

大学时期有过一个同步桌面的想法,就是说他能做到同步桌面主题,你安装的程序,你的文档,等等,反正就是做到你用两台不同的机器,只要装有一个客户端,他就帮你把两台机器搞成同样的软件环境。当然啦,那个时候只是想法。毕竟尤其是应用程序这一步,很难做到同步,正版软件获得不到权限当然是最主要的问题,除此之外一方面是存储和传输的成本,另一方面则是安装和配置的复杂度。(例如数据库之类,很难做到自动安装配置)

然而今天才看到chrome的同步已经远远超出书签的范围,包含了扩展、配置信息、主题,全部。我才明白这个桌面同步的想法,在本地操作系统时代无法解决,在云系统阶段,就迎刃而解了。想想看chrome就是一个操作系统,那么扩展就是应用程序,书签就是文档,主题、配置信息不一而足。有了这些轻量化的信息,两个系统就可以变成完全相同的设置。甚至可以做到,同一部硬件,谁登录就变成什么样子。两个不同的帐号使用看上去完全不同。

未来果然还是值得期待啊。

google social circle

you can always find google trying new things… challenging the fields they are not good at…
and this time I just find there social circle idea~ seemed cool as a search instruction

as you search, they try to find what your friends said about it on twitter or there blog…(ok this time it’s me myself…=_=)

I follow the link and find google just use the link submitted by the users to the google profile as the information sources… It’s just smart, and included from blog, twitter, flickr, all the way to douban and xiaonei…

as facebook beating google to become the most visited web site, google is definitely finding some way to fight back… I just enjoy the war ;->

博客访问统计

不知不觉博客也写了半年多了,统计一下大家愿意看什么样的文章,聊以自慰。。

从去年12月建立博客以来,迎来652次绝对独立访问,1422PV,最高单日PV 72次,最高单日绝对独立访问30次。平均浏览时长1min32s。

最高独立访问的标题是《chrome无敌插件-Nothing》,总计144次Unique PV,平均浏览时间1min47s。那么短的东西居然平均被看了1分多钟,很感动。。第二名就是愤青文了《谷歌撤离中国及其他》,35次独立访问,平均浏览时间4min46s。文章写得长了浪费大家时间了深表歉意。。第三名是瞎想文,《时间并不是物质》,平均浏览时间只有50s,果然写得太乏味了多数人不爱看。。独立访问31次。第四名《宅男搭讪手册》,扯淡文,30独立访问,平均浏览时间1min7s。第五名《Google pac man》,算是网络热点吧,28独立访问,平均浏览时间1min14s。这些文章之所以看的人多,都是因为有twitter啦,renren啦或者其他的什么有人分享了,然后流量就会一直有保持。那个时间物质的文章,我是自己贴到豆瓣上去公关了一把,结果引来了8个访问。。。

之所以罗罗嗦嗦写到第五名,是发现这前五名几乎包括了我喜欢写的所有类型的文章,网络、时事、猜想、趣事、扯淡。唯一不包含的就是技术类文章。果然既然不是技术牛人,技术文章只能是写给自己看而已。不过本来就是做笔记用的嘛,也是在预料之内的。

然后来看搜索关键字。搜索关键字第一名仍然是chrome nothing(我把相关类似的加在一起算了),独立访问量19,比第二名高出近一倍。第二名是lisp,看来这个还是大家关注的,并且了解的人少,所以搜到我这里来了。可惜我写的内容无关lisp实质,只是泛泛分析lisp原理,估计对大家帮助不大。独立访问量11。第三名是starcraft ai,独立访问量10。第四名图形设计心得。独立访问量7。看来技术文章虽然没有人看,但是还是有人搜的。可惜由于我讨论的问题不太靠谱,搜进来看得不耐烦就走掉了。

xubenyang.me, pushchen.com, atatstone.com, dodowoo.info, justokay.spaces.live.com 引用进来累计30多次访问,而且平均在线时间也还不错。这里应该感谢同学们对我的关注哈~~我在matrix67.com发言留了地址,引来了5次访问,尤其是page/visit比3.4,平均浏览时间1min30s,看来一者傍了大牛就是好,二者果然看matrix67的人大概兴趣爱好都差不多,所以有认真看我写的东西。。

google.com进来的访问有82次之多,而且有1.8的page/visits比和2min8s的浏览时间。我想这些访问应该是从google reader进来的。因为这些访问多数没有对应的关键字记录。。。至少说明rss全文输出仍然能得到很多访问量呢。不过不理解大家是为什么rss读过了还有点进来看呢?尤其是在我这里也没什么人写回复的情况下。。

主要的看客还是上海的同学们啊,有201次访问。差不多可以说每2天就会有一个上海的访问吧,平均来说的话。北京也有102次之多。可能是一些去北京实习的同学?再就是北京实习时候的同事吧。上海的page/visits比是1.5左右,北京达到2.4左右。上海平均浏览时间1min20s左右,北京平均浏览时间3min30s左右。以此而论北京那边的看客可能偏技术的比较多,所以跟我的兴趣比较相符吧。。另外南京成都深圳武汉广州等地也有超过10次的访问量。广州和韶关(佛山也在附近?)的访问想必只有5+了呵呵。。其他还有遍布祖国各地的长尾呵呵,我也用这个词吧。中国送来621次访问来自113座城市。不过里面有很多城市是重复了的,那也有100座城市左右吧。另外台北三重市居然送来45次访问。估计是实习时候的台湾室友介绍的吧。那时候我正好写了一些愤青文,可能是台湾人比较喜闻乐见了类型。。。台湾总计送来72次访问,来自13座城市。美国居然也送来了65次访问。可能里面有咱院出去读书的同学吧?不过也有可能是代理翻墙然后看我博的。尤其是加利福尼亚送来了16次访问,page/visits比1.5,平均浏览时长45s。是学长吗?是同学吗?[编辑]呜果然是代理…就是我自己…这个部分我编辑了很多次了。。一开始我我觉得这么多的访问次数肯定是我了。。不过仔细看过后发现我的代理在犹他州,貌似ga很智能,不会记录自己的IP。。估计是通过过滤登录过ga的IP或cookie来做的吧。。…[/编辑]另外纽约和密歇根也有多次访问超过1分钟的记录。可能也是中国人吧。。瑞典乌普萨拉送来了4次访问平均时长3min5s。这必然是交换的同学了。不知道是哪一位啊~~先感谢一下。

访问次数而言,有一个人超过了100次,那当然是我自己。。囧。。有13人超过50次。。感谢大家!!有52人在26次到50次之间。。再次感谢!!总计108人访问次数超过10次,大家都是好人!!热泪盈眶啦!!

从浏览器上说,chrome第一42.44%, IE第二32.28%, FF第三21.44%, 剩下4%左右是opera,opera mini,mozilla之类。
操作系统,windows第一87.70%,linux第二5.87%(52次),mac第三5.08%(45次), 后面还有百分之零点几的零头,是iphone 5次,android一次,FreeBSD一次。还有一些没设定的就没办法了。比如我的黑莓他就没有记录。

分辨率上说,访问我的最高分辨率居然是1920×1200,还访问了我18次,是同学吧?莫非是push?太吓人了!最低分辨率毫无疑问是1024×768,居然还以15.58%的比率占据排行榜第二(第一是1280×800)。为什么还有这么多人喜欢1024×768啊。。

呜有意思的事情就这么多了。。不知不觉玩了一个多小时了呢。。以后会继续写博客的吧~~

人工神经网络-ANN

最近SC AI做得差不多了,忽然想到应该写一写关于ANN和GA的科普文章呢,毕竟自己学习只是一部分,跟大家分享也很重要嘛。自己叙述一遍的话,也能考察自己掌握的程度。

ANN, artificial neural network, 即人工神经网络,是机器学习的一种模型。我学习这个其实也是读教科书,用的是卡内基梅隆大学那本machine learning。

所以先说说机器学习吧。机器学习的基本思想就是不通过编程来让计算机完全遵守人指定的死板的流程,而是通过定义一个可学习的模型,之后向这个模型不断添加<问题,答案>这样的对(正式名称是<输入样例,目标输出>),来让计算机通过经验判断下一次接收到问题的时候,应该做出怎样的回答。

其解决方案就是根据每一次的计算机回答和人指定的标准答案进行对照,假如相符,则给予鼓励;假如不相符,则给予批评(即正激励和负激励)。通过不断的训练引导计算机逐渐获得对相关知识的理解。

人工神经网络是机器学习的一个解决方案,即采取仿生的神经元结构来对计算机进行训练。由于人的神经元的复杂性,目前用于计算机研究的神经网络通常采取的是一种简化模型。他令神经元有一个输出和多个输入。神经元通过对所有的输入进行加权求和计算出结果,并以这个结果作为输出(可以想象出来,训练一个神经网络,其实就是训练他使得每一个神经元都得到正确的权值组合)。为了保持简洁性,每个神经元的输入和输出都最好保持在0~1之间。于是这里采取了一个挤压函数,将实数域映射到0~1之间的一个小集合上。通常采用的挤压函数是sigmoid函数,sigmoid(x)=1/(1+exp(-x))。当然也可使用其他有类似特点的函数变体啦。定义好神经元之后,须将神经元根据问题需要构造成神经网络。目前业界通用的较为稳定的神经网络是单向无环的结构。往往采取三层。

图片来自维基百科

第一层是输入层,根据需要,要把问题转换为一个编码,并依次作为输入给各个输入曾神经元赋值。例如,用于人脸识别的神经网络,可采取一个人脸照片的32×32的缩略图作为输入,这样的话就需要1024个输入,每个输入是0~255的像素灰度信息。有比如要从今天的天气情况推算明天的天气情况(当然实际是不可行的。。),可将想要考虑的所有天气特征依次作为输入,并传输给各个神经元。
第二层是隐藏层,它的作用是增加神经网络的复杂度,从而使神经网络可以表达更复杂的函数逻辑。已经证明,任意函数可被三层单馈神经网络(一个输入层,两个隐藏层和一个输出层)以任意精度逼近。但是,更复杂的函数就需要更多的神经单元来表征。由于我们在实现神经网络之前,往往并不能确定问题的复杂度,所以隐藏层采用的神经元数量往往是要靠经验得出的。当然也有一些动态修正的方法可以在训练的过程中增加或减少隐藏层的单元数量。
第三层是输出层,输出单元一般不使用挤压函数处理,而是让他输出线性的数据,以便同实际问题相联系。输出层同样要根据实际问题来编码。例如在人脸识别的应用中,可采取两个输出,一个表示“是人脸”,一个表示“不是人脸”,这里输出还是在0~1之间的。可采取一个阈值来确定真假,例如用>0.7表示真,<0.3表示假,之间是模糊状态。之所以采用两个输出而不是自然想到的一个,是为了稳定性。当两个神经元的输出相符时(例如“是人脸”输出0.9,“不是人脸”输出0.1),可认为模型正确得出结论;而当两个输出不符时(例如均输出0.7),则表示模型无法准确判断。

建立好模型之后就是训练了。这里采取的方法称作“梯度下降的反向传播算法”。之所以称作梯度下降,是说根据人确定的正确答案和计算机通过神经网络给出的答案之间应该会有一个差距。将这个差应用到得出这个结果的输出层上,就能得出输出层的每一个权值应该向哪个方向调整。注意到神经元输出是输入的加权和,所以权值较大的那个分量对于结果的贡献越显著,因此在训练时对他的反馈也应该相应得更明显。数学上采用方差对于权值的函数形成曲面的梯度来描写这个特征。沿着梯度下降到曲面的最小值(有时只能达到局部极小值),就是训练成功了。由于梯度从概念上说是一个无穷小增量,这里只能定义一个较小的“学习速率” η 来作为每次修正权值的增量基准。η取得太大会导致无法达到曲面的最小值(总是越过他),而太小则会导致训练的迭代次数过多,同时也会使得只能达到局部极小值(无法越过局部最小值的谷底)的问题变得严重,因此也有采用变化的η值,例如逐渐减小的η(加快训练速度),又或者带有冲量的η(越过局部最小值的谷底)。这里它的取值变成了一个复杂的研究课题这里不表了。
这就解释了什么叫做“梯度下降”,再来解释反向传播。前面说到根据输出o和标准答案t可以得到一个方差,从而修正输出单元的权值,但如何修正隐藏单元的权值呢(输入单元只有一个输入,因此没有权值也无需训练)?这就是要用到反向传播的地方。既然已经得出了修正后的输出层权值,就又可将输出层的每一个输入(即隐藏层的每一个输出)的实际值和目标值,将修正“反馈”到上一层去。当然仍然需按照每一个权值贡献不同按比例反馈。反馈之后即可得到这层单元的“目标值”了,在用这个目标值在这一层做梯度下降进行训练,这样做一直反馈到输入层为止。
总之假如能够训练使得函数达到最小值,就表示训练成功了。因为它的含义是合适的权值取值,使得模型的输出结果o和标准答案t之间的方差最小。注意由于输出单元往往不止一个所以这里o和t都是向量。方差指的是每一个单元的输出方差再求和。

好吧这些就是理论讲解啦。当然实际应用的时候对于不同的问题会有不同的变形。无论是学习速率,挤压函数,还是权值的梯度下降算法,都可以有这样或那样的改变。这些就是一方面凭经验,另一方面也靠创造性的想象力和“尝试-失败-尝试”的方法来验证啦~

链接:
维基百科-人工神经网络 http://en.wikipedia.org/wiki/Artificial_neural_network
维基百科-反向传播算法 http://en.wikipedia.org/wiki/Backpropagation
维基百科-梯度下降算法 http://en.wikipedia.org/wiki/Gradient_descent
维基百科-机器学习 http://en.wikipedia.org/wiki/Machine_learning
图书 《机器学习》 http://www.cs.cmu.edu/~tom/mlbook.html

使用chrome下载资源

以前一直不清楚怎样方便地下载网页上的资源。假如是图片自可以另存为啦。但如何下载一个flash呢?往往只能跑到缓存里面去慢慢找,很麻烦。或者用ie和迅雷的flash感知功能配合。不过总不至于为了下载个flash就非要开ie开迅雷吧。。

今天发现chrome的审查元素功能的“资源”项非常强大。无论看得见看不见的,无论藏在网页的什么位置,无论是img, 是div背景还是嵌入的富媒体(如flash或video),只要浏览器加载了,都可轻松下载。

方法自然是先打开审查元素界面啦

打开资源界面,可以看到所有加载的资源列表。假如是流媒体的话,请开始播放流媒体,让网页将缓存加载完毕。你会发现流媒体的总大小和已传输大小都已清楚地被chrome标明。

当缓存加载完毕,这里就有个小trick啦。。要双击左边显示的资源名称。。浏览器就会开始下载这个资源啦。。
注意假如同时下载多个资源的话,可能会弹出对话框,需要确认一下才行。

希望这个对大家有帮助~~

单汇图的环的处理

最近还在搞 SC AI。

由于每个单位仅能攻击敌人,所以其攻击链类似一个树(其每一个节点都是多源单汇的,类似于树的有一个父亲但有多个儿子的情况)。唯一不同的是这个树的树根也可能攻击一个敌人,从而形成环。但是由于一个单位只能攻击一个敌人,所以在一个独立的联通分量里面,最多只有一个环。

现在我在考虑使用递归来遍历这个图,然后得出每个单位在目前情形下再有多少轮会被消灭的报告。之所以要遍历,是因为有这种情况:a攻击b。c和d都攻击a。b攻击a。c和d又各自同时被两个单位攻击。在这种情况下,表面上看a遭受的攻击最多,他应该选择撤退。但是假如考虑到c和d的血量,或许c和d会在a之前被消灭。之后a遭受的攻击就不比b多了。所以在某种情况下,a应该采取的策略是继续进攻而不是撤退。

以上是我决定计算攻击链的理由。

于是在采取递归遍历这个图的时候,关键问题是怎样避开这个环。首先是如何发现这个环,然后是如何处理他。关于发现,我现在采取了一种非常低级的办法。我使用了一个静态的数组,记录每一次递归遍历到的节点。假如下一次递归遇到了这个数组里面的节点,则表示发现了环,并开始调用处理环的函数。我相信关于发现环一定有更好的算法。可惜暂时没有时间做了,加上问题都是节点数量在20以下的,所以也没有必要做得很复杂。
至于处理环的方法,我决定在这个环上寻找最早被消灭的节点。由于仅可能有一个环,所以先把除了环之外的分支计算完毕,之后将这些分支的贡献都先计算掉。此时得出的最先被消灭的单位,在环贡献也计算的情况下一定也是最先被消灭的。因此此时可以先计算这个节点的消灭轮次,然后在这个位置将环打开,并按照无环的逻辑去计算每一个节点。

这个问题抽象出来是个很有趣的图论问题,今后应该可以继续深入思考他的意义,并跟其他图论问题做一些比较,不过暂时先放在这里吧。