2012年5月11日星期五

关于技术的学习方法

关于学习,时间短与效果好始终是一对矛盾的统一体。

很多时候,要想在最短的时间内完成一件事情,最好的方法就是依葫芦画瓢,但这样的话,即使完成了事情,也只是知其然而不知其所以然,长久来看,对于学习者的能力不会有多大的提高。

从长远来看,要想自己基础扎实,能力强,那就得一步一步的来,从基础知识开始,一点一点的搞懂,但这种方式需要花费很多时间,短时间内效果不明显。而且,可能效果没有预期的那么好。

那么,如果做个权衡呢?

我想,也许最好的学习方式是:先依葫芦画瓢地实践,获得一些直观感受,最好还有一些疑问。在实践完成之后,在整理自己的疑问,以及实践中涉及的知识要点,通过查阅图书或者网络资料,逐个知识点巩固,逐个解决疑问,并整理成文。这个整理总结的过程可能需要较长的时间。

这种方式的优势在于:1.能让你快速地完成事情;2.实践中用到的知识多半会在以后的实践中经常用到,掌握的就是一些最重要的东西,而不会学习一些很少使用的深奥偏门知识。

2012年5月7日星期一

给自己的几点编码建议

  1. 注意命名方式,需统一
  2. 多写良好的注释
  3. 内嵌文档注释,并利用文档自动生成工具产生项目文档
  4. 常重构,精益求精。

2012年4月20日星期五

关于指针的一道笔试题

同学找实习,遇到这样一道笔试题:
int *a[2][3];
sizeof(a) = ?
sizeof(*a) = ?
sizeof(**a) = ?
sizeof(***a) = ? 
这题还是有点小意思的。遇到这种题,脑子一定要清楚,注意分析。

对于int *a[2][3]应该这么理解:
a是个数组,有两个元素;元素也是数组,其有3个元素,每个元素是指向int类型的指针。
指针的长度固定为4个字节,C语言的int类型也是4个字节。

这样一分析,这题就简单了。
  • sizeof(a)意思是求a数组的长度,数组的长度=数组元素的个数*元素的长度,所以sizeof(a) = 2 * 3 * 4 = 24个字节
  • sizeof(*a)中的*a是指a的第一个元素,所以sizeof(*a)就是求a数组的第一个元素的长度,即sizeof(*a) = 3 * 4 = 12个字节
  • sizeof(**a)则是求a的第一个元素(也是数组)的第一个元素(是指向int类型的指针)的长度,所以sizeof(**a) = 4个字节(即为一个指针的长度)
  • sizeof(***a),因为**a是一个指针类型,那么***a即为*(**a),那为指针指向的值,这里为int类型,所以sizeof(***a) = 4个字节(int类型的长度)

2012年3月31日星期六

学习的"道"与"术"

读研以来,一直觉得自己的学习方法不够高效。试图将要学习的东西进行分类,然后以不同的方法学习之。那么该如何分类呢?我觉得以"道"与"术"区分之比较合适。


何为“道”?汉语辞典中有两条解释:1.指法则、规律;2.学术或宗教的思想体系
何为“术”?:技艺


字面理解,“术”更为具体,是完成一件事情的具体过程。而“道”者则是指导实践的思想,是能够举一反三的事物规律。

那么是否“道”比“术”更重要呢?我想未必。任何理论,任何“道”都最终来源于“术”的实践过程,也最终需要在“术”上得到实施,才能体现其价值。“道”与“术”两者相辅相成。那么在我们学习一门学问的过程中,就存在一个“道”与“术”何者为先的问题,即从“道”还是“术”入手学习?

孟岩说过这么一段话:
我主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点。对于关键理论的学习,要集中精力,速战速决。而旁枝末节和非本质性的知识内容,完全可以留给实践去零敲碎打。
原因是这样的,任何一个高级的知识内容,其中都只有一小部分是有思想创新、有重大影响的,而其它很多东西都是琐碎的、非本质的。因此,集中学习时必须把握住真正重要那部分,把其它东西留给实践。对于重点知识,只有集中学习其理论,才能确保体系性连贯性、正确性,而对于那些旁枝末节,只有边干边学能够让你了解它们的真实价值是大是小,才能让你留下更生动的印象。如果你把精力用错了地方,比如用集中大块的时间来学习那些本来只需要查查手册就可以明白的小技巧,而对于真正重要的、思想性东西放在平时零敲碎打,那么肯定是事倍功半,甚至适得其反。
虽然这段话并没有明确区分学习的“道”与“术”,以及何者为先的问题。但却大致说明了何为正确的学习方法。


从“道”与“术”的角度来理解,那关键的,核心的,创新的部分即为“道”,“大道”。而那细节的则是“术”的部分,是需要长时间的实践的,也许只有在实践中遇到的细节才是有意义的。


但那“具备基础之后”的“基础”是什么呢?我想应该是:1.明确问题是什么。这一点是再怎么强调都不为过的。要解决一个问题却没有真正明确问题到底是什么,那你努力多半是白费的。2.这东西是用来干什么用的,是用来解决什么问题的?对于工科学生来说,学习新东西的时候,这一点是需要首先明确的,只有明确了“干什么用的”,才能抓住学习的重点,提高学习的效率。3. 与以前的类似的东西相比,其区别是什么?一样东西,一种理论其价值往往在于对前人的突破,这突破的地方才是我们真正要掌握的。在学习一样东西之前,不妨多问问自己为什么要学这个,这东西对自己有多大的提升?不断地重复学习类似的东西,多半是没有意义的。


具备了基础之后,对于关键理论的学习,是不是只要抱着书本,理论对理论的学习就行呢?我想这是万万不可的。特别是对于着重于实践性的学问,比如编程,理论对理论地学习,只会让你吃力不讨好。绝大多数的创新理论,核心理论,都不是一下子就能理解的,特别是当你对这一领域的学问并不熟悉的情况下,它需要在反复的实践中逐步地加深理解。


那么对于关键内容的学习,我觉得这样学习会比较合适:先快速地,在尽可能短的时间内把关键内容浑沦吞枣地过一遍,能理解多少是多少,目的是为了获得一个理论的一个Big Picture,明确理论的各个部分之间的大致关系。然后对于每个部分,以及部分之间的关系,逐个地通过实践来验证你的理解,但这个实践过程并不属于“术”,因为它不是为了技艺,而只是为了验证自己对理论的理解。这一验证过程结束之后,你应该就能够对关键理论有个整体的正确的理解了。


然后,你就放开手去干吧,去解决那些现实中的问题!


也许,你会说,不用这么复杂吧?是的,如果你只是为了解决一个实际的问题,而这个问题也存在相近的解决方案,你不想也不需要弄懂这个问题,好吧,那你就直接去找解决方案吧。但你解决这个问题之后,你学到了什么呢?当你再次遇到一个本质上一样的问题的时候,你还是能快速地解决么?没有真正弄懂问题,没有弄懂问题背后的知识,那你就准备着为类似的问题重复地去寻找解决方案吧。恩,看起来有点傻哦。

2012年2月21日星期二

Python学习路线(针对具备一定编程经验者)

相比C,C++,JAVA等编程语言,P​ython​是易学的。但要想深入地理解​Python,并熟练地编写Python风格的Python代码。我想还是有一长段路程要走的。下面即是我的一点经验总结,主要是为了整理自己学习的思路。


1. 花1-2天的时间阅读一本好的Python入门书籍,并在亲手实践书中的代码。推荐入门书籍:《A byte of Python》(中文翻译《简明Python教程》)或《Practical Programming:An Introduction to Computer Science Using Python》(中文翻译《Python实践教程》)或者其他的比较薄的入门书籍。


2. 抛开书籍,用Python去写一切你想写的程序。这时最好的参考文档即为:1.Python命令解释器中的help(),dir()辅助方法;2.Python官网文档:http://docs.python.org/ 。遇到不清楚的地方就用这两个方法查,再不行就去google一下。


3. 两三个月之后,积累一点的代码量,再重新找本讲解比较详细的书,重新梳理一下自己对Python的理解,纠正自己实践中一些不好的方式。推荐书籍:《Beginning Python: From Novice to Professional》(中文翻译《Python基础教程》),《Learning Python》(中文翻译《Python学习手册》),《Dive into Python》,《Core Python Programming》等。另外,也应该在编码的过程中重复地去查阅Python标准函数库,标准库里已有模块实现的功能就不要自己实现。


4. 之后,根据实际需要,去了解使用一下Python的各个方面的函数库(比如http://docs.python.org/modindex.html中罗列出来的,以及matplotlib, numpy等用于科学计算,图形图像处理的),特别是诸多的Web框架(django, web2py, cherrypy, tornado等),可以先从简单的开始。如果是对Python的底层实现感兴趣,那么就该去看看Python源码,阅读一下《Python源码剖析》; 如果对文本处理感兴趣,可以阅读一下《Text processing in Python》等; 如果对网络感兴趣,可以阅读《Foundations of Python Network Programming》,尝试实现一个简单的web server ...


5. Python相关的开源函数库非常非常的多,各个方面的都有,所以学习者应该尝试着去用它们,了解它们,而不是啥都要自己来实现。因为Python擅长的就是快速开发,而且站在前人的肩膀上,我们才能站得更高,看得更远。当然如果你想加深自己对某个方面的理解,也可以尝试去实现一些简单的模块。


6. 总之一句话:学习Python的关键就是用!而且是要多用别人的。动手实践才是王道!那么多优秀的开源函数库不要浪费了!

2012年2月16日星期四

VNC简介

VNC(Vitual Network Computing) is a graphical desktop sharing system that uses the RFB protocol to remotely control another computer. It transmits the keyboard and mouse events from on computer to another, relaying the graphical screen updates back in the other direction, over a network.

VNC is platform-independent --- a VNC viewer on one operating system may connect to a VNC server on the same or any other operating system. There are clients and servers for many GUI-based operating system and for Java. Multiple clients may connect to a VNC server at the same time. Popular uses for this technology include remote technical support and accessing files on one's work computer from one's home computer, or vice versa.

A VNC system consists of a client, a server, and a communication protocol:

  • The VNC server is the program on the machine that shares its screen. The server passively allows the client to take control of it.
  • The VNC client(or viewer) is the program that watches, controls, and interacts with the server. The client controls the server.
  • The VNC protocol(RFB) is very simple, based on one graphic primitive from server to client("Put a rectangle of pixel data at the specified X,Y position") and event messages from client to server.
By default, RFB is not a secure protocol. While passwords are not sent in plain-text(as in telnet), cracking could prove successful if both the encryption key and encoded password are sniffed from a network. For this reason it is recommended that a password of at least 8 characters be used.

由于VNC系统是服务器-客户端模式的,所以先得在服务器(被控制的一方)上装上VNCserver,然后在客户端(主动控制的一方)上装上client(VNCviewer)。按照vncserver --help说明启动vncserver。服务器端有三个命令可以使用:vncconfig---配置命令,vncpasswd---设置client连接到服务器时需要的密码,vncserver启动一个server进程(对应一个Display No.),监听端口。

在服务器端的/root目录下会有个隐藏的文件夹.vnc,里面有加密过的密码文件passwd,每个vncserver进程的日志文件,以及配置文件xstartup。

服务器端启动vncserver后,即可在客户端启动vncviewer,在server一项中输入服务器的ip,后面跟一个:,以及一个Display No.,如果服务器端只启动了一个vncserver进程,那么就是1。然后直接回车,出现需要输入密码的登录框,输入服务器端设置的密码,然后直接回车即可。

2012年2月15日星期三

Linux命令习题


For each of the outputs listed below, find one sequence of commands connected by pipes that produces the output. For each problem, turn in the command sequence that you used to generate the requested output. (Do NOT turn in the output itself.)

1. A listing of all processes that you are currently running on the machine you are using, sorted by the command name in alphabetical order (i.e. a process running acroread should be listed before a process running bash). The output should consist only of the processes you are running, and nothing else (i.e. if you are running 6 processes, the output should only have 6 lines). 
ps -e --sort cmd
2. The number of words in the file /usr/share/dict/words (*) which start with the letter a.
[* Note: On some Unix/Linux systems, the dictionary has the filename /usr/dict/words]
cat /usr/share/words | grep ^a.* | wc -l
3. A "long" listing of the smallest 5 files in the /etc directory whose name contains the string ".conf", sorted by increasing file size. 
ls -lSrp | grep [^/]$ | grep [\.]conf$ | head -n 5
4. An executable file, named "echo.sh", with one sequence of commands to print hello world! on screen. 
(1) vim echo.sh and the content of echo.sh is echo hello,world! 
(2) chmod +x echo.sh
(3) ./echo.sh 

2012年1月1日星期日

2011年终-回顾与展望

    昨晚实验室聚餐,和师兄们喝醉了,明年的这个时候,我也就和他们一样将要毕业。时间,总是往前看觉得很漫长,可回过头去看看,一年也就是瞬间的事情。
2011,我从研一走向研二,2012,我将从研二走向研三,继而毕业,工作。
回顾过去一年,于我自己而言,过得很平淡,也许是大学以来最平淡的一年,只能说也许,因为对于2011,我记不得太多的事情。

这一年里,我,一个技术男,比以前更宅,话也相对少了很多,直接表现为QQ空间或者校内上的文字写得很少。很少和别人谈论自己,因为我觉得纠结于那个“小我”是件很“小青年”的事情。人与人之间不可避免的隔膜导致了个人的事情不管多大在别人眼里都是微不足道的,在别人的心里掀不起半点波澜,说过了也就忘了。所以那些关于自己的,还是放在心里比较好,毋须说些没意义的。

这一年里,我想得挺多,但真正做了或者说做好的却很少。这是件严重的事情。特别在技术上,东看西看,东学西学,眼界确实开阔很多,也养成了较为良好的技术趣味。但从技术能力上来说,真不好说,我都不知道自己有几斤几两。

这一年里,最大的收获,也许是对“学习”的重新认识,以及试图从“学知识”向“做事情”转变(这里的“做事情”特指“解决实际问题”),以前的自己太喜欢太沉迷于学东西,而忽略了自主地做事情。“生有涯,而知无涯”的无奈是必须面对的,对于有限的人生来说,知识必须对自己有用才值得学,特别是技术相关的知识,那怎么知道哪些知识对自己有用呢?得“边用边学”,需要用的时候再学。所以应多做事情,应找实际的问题,尝试去解决,在解决问题的过程中学习。解决实际问题才是根本,才是目的,而不是学习。学生时代习惯了学,习惯了边学边用,但对于研究生,对于以后的工作来说,光顾着学是没用的,而且一味的学也是非常难以深入的,要对某个方面有个深入的理解,必须通过做事情,发现问题,解决问题。
这一转变过程让我非常纠结,而且到目前为止还算不上成功。可能对于很多人来说,这个过程可能很简单,但对于我来说,好奇心强,喜欢学东西的来说,确实极其艰难的。每做一件事情,都很可能陷入学习的状态,而不会及时地适可而止。
这一过程希望在2012年有个很好的进展。
这一年里,我逐步意识到自己存在的另一个大问题---不够自信,其外在表现为和别人一起时,极其容易将自己的观点让位于别人的观点,即使我并不认为自己的观点存在什么问题,或者别人的观点比我的更正确。我只是不想凌驾于别人之上,不想让自己影响到别人。这听起来似乎不关乎自信,但我想本质上是的。“不够自信”这看起来也似乎不是什么大问题,但我想对于一个成年人,特别是一个男人,自信是非常重要的,对于事业也是件非常重要的事情。以前自己活得太谨慎,不喜欢在公共场合表现自己,觉得提高自己的内在修为才是重要的。但其实活在社会中,适时适当地表现自己,表达自己的观点,坚持自己的看法是非常重要的。有个词叫“内圣外王”,以后我得更加注重“外王”,内外兼修。
这一年里,我活得又很随性(和“活得谨慎”矛盾而共存),不太注意自己的言行,脏话口头禅也比较多,虽然在我看来,我的脏话全是在表达一种情绪,仅此而已。但我想在别人来看,其感受也许并不是这样的。我们年轻人还是要注意自己的形象的,呵呵。另外,尽量少评论别人,特别是别人的缺点。
这一年里,我很懒散,自己都有些看不过去了,“这样的日子,再好的,没有了”,我想不是件好事情。能够自我安慰点是还读了点书,整理一下:
社科文艺类:
  • 佛祖在一号线
  • 书虫小札
  • 复杂性思想导论
  • 人生
  • 给研究生的学术建议
  • 边城
  • 朱镕基答记者问
  • 窗里窗外
  • 联大八年
  • 笑谈大先生
技术类(部分是按需选取章节阅读):
  • Shell脚本学习指南
  • Linux内核设计与实现
  • 鸟哥的Linux私房菜
  • PHP和MySQL Web开发(原书第3版)
  • 分布式处理实践
  • Java Collections
  • 可爱的Python
  • 浪潮之巅 
  • CSS Web设计快速上手
  • 编程人生
  • C陷阱与缺陷
  • 调试九法
  • 黑客与画家
  • Python UNIX 和Linux 系统管理指南
  • 版本控制之道
比较而言,数量上不算少,也不算多,但主要问题还是质量上,觉得自己有些浑沦吞枣,读得太匆忙。这是以后的阅读需要注意的,克制焦躁的心理,慢慢阅读消化。
新的一年,具体来说,我需要面对的几件大事情,大致包括:
  • 小论文
  • 实习
  • 毕业论文,包括答辩
  • 找工作
  • ...
2012年底,我将要毕业了(虽然,形式上是2013年毕业),我就要工作了,这也许是和高考相当的一件大事,希望自己能够举重若轻,踏实准备,顺利应对。(再具体点是不是应该说多多coding,多做事情!哈哈)