posts - 30,  comments - 3,  trackbacks - 0
 

linux 下的iconv命令可以把Windows默认GBK编码的文件转成Linux下用的UTF-8编码。

 Example: $ iconv -f GBK -t UTF-8 file_name -o file_name



         1. 安装命令行版的texlive: sudo apt-get install texlive-full

          2. 安装一个比较有帮助性的编辑器: sudo apt-get install texmaker

          3. 安装中文环境: sudo apt-get install latex-cjk-all

  

         A useful webiste http://chixi.an.blog.163.com/blog/static/29359272201262952120729/


    To install/upgrade to TeX Live 2012:

  1. Open a terminal with Ctrl+Alt+T
  2. Add the texlive-backports PPA by typing the below (enter your password when prompted):

    sudo apt-add-repository ppa:texlive-backports/ppa 
  3. Then type:

    sudo apt-get update 
  4. Installation:

    • If you are installing TeX Live for the first time, type:

      sudo apt-get install texlive 
    • If you already have TeX Live installed and are upgrading, type:

      sudo apt-get upgrade 

      Warning: this will also upgrade all other packages on your Ubuntu system for which upgrades are available. If you do not wish to do this, please use the previous sudo apt-get install texliveinstead.

      转自:
      http://blog.csdn.net/lsg32/article/details/8058491

posted @ 2013-02-02 15:27 Seraphi 阅读(278) | 评论 (0)编辑 收藏
在新版本的UBUNTU里不支持WINDOWS的wubi安装,要用如下方式:
Ubuntu 12.04 wubi的安装
 
一、在12.04里,在Windows内安装那个选项被禁用了,只能通过以下指令开启,X为光驱盘符:
代码:
X:\wubi.exe --force-wubi
posted @ 2013-02-01 12:27 Seraphi 阅读(245) | 评论 (0)编辑 收藏
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}]
@="Internet Explorer"
"InfoTip"="@C:\\WINDOWS\\system32\\zh-CN\\ieframe.dll.mui,-881"
"LocalizedString"="@C:\\WINDOWS\\system32\\zh-CN\\ieframe.dll.mui,-880"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\DefaultIcon]
@="C:\\Program Files\\Internet Explorer\\iexplore.exe,-32528"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\NoAddOns]
@="在没有加载项的情况下启动"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\NoAddOns\Command]
@="C:\\Program Files\\Internet Explorer\\iexplore.exe about:NoAdd-ons"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\Open]
@="打开(O)"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\Open\Command]
@="C:\\Program Files\\Internet Explorer\\iexplore.exe"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\属性(R)]
@=""
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\Shell\属性(R)\Command]
@="Rundll32.exe Shell32.dll,Control_RunDLL Inetcpl.cpl"
[HKEY_CLASSES_ROOT\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}\ShellFolder]
@=""
"Attributes"=dword:00000010
"HideFolderVerbs"=""
"WantsParseDisplayName"=""
"HideOnDesktopPerUser"=""
@="C:\\WINDOWS\\system32\\ieframe.dll,-190"
"HideAsDeletePerUser"=""
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}]
@="Internet Explorer"
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{B416D21B-3B22-B6D4-BBD3-BBD452DB3D5B}]
@="Windows Media"
posted @ 2013-01-06 15:13 Seraphi 阅读(170) | 评论 (0)编辑 收藏
set tags=tags;
set backspace=indent,eol,start
set shiftwidth=4 
set tabstop=4
set expandtab
set encoding=utf8
set fileencodings=utf8,gbk
set nocompatible "去掉讨厌的有关vim一致性模式,避免以前版本的一些bug和局限.
set number "显示行号.
set background=dark "背景颜色暗色.(我觉得不错,保护眼睛.)
syntax on "语法高亮显示.(这个肯定是要的.)
set history=50 "设置命令历史记录为50条.
set autoindent "使用自动对起,也就是把当前行的对起格式应用到下一行.
set smartindent "依据上面的对起格式,智能的选择对起方式,对于类似C语言编.
set tabstop=4 "设置tab键为4个空格.
set shiftwidth=4 "设置当行之间交错时使用4个空格
set showmatch "设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set incsearch "搜索选项.(比如,键入"/bo",光标自动找到第一个"bo"所在的位置.)
hi Comment ctermfg=darkmagenta
hi String ctermfg=darkred
hi Number ctermfg=darkblue
"是否生成一个备份文件.(备份的文件名为原文件名加“~“后缀
"(我不喜欢这个备份设置,一般注释掉.)
"if has(“vms.
" set nobackup
"else
" set backup
"endif


关于注释字体颜色的修改,可以参考:http://blog.csdn.net/a670449625/article/details/48051249
posted @ 2012-11-09 19:44 Seraphi 阅读(184) | 评论 (0)编辑 收藏
http://www.coli.uni-saarland.de/~csporled/page.php?id=tools

这个站点列举出了几乎所有NLP和IR领域能够直接使用的好用的工具包~
posted @ 2012-10-29 10:25 Seraphi 阅读(298) | 评论 (0)编辑 收藏

转载自:cool shell,作者:陈皓
From:http://coolshell.cn/articles/7992.html 

先说明一下,我不希望本文变成语言争论贴。希望下面的文章能让我们客观理性地了解C++这个语言。(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价值。我们应该多看看技术是怎么演进的,怎么取舍的。)

事由

周五的时候,我在我的微博上发了一个贴说了一下一个网友给我发来的C++程序的规范和内存管理写的不是很好(后来我删除了,因为当事人要求),我并非批判,只是想说明其实程序员是需要一些“疫苗”的,并以此想开一个“程序员疫苗的网站”,结果,@简悦云风同学直接回复到:“不要用 C++ 直接用 C , 就没那么多坑了。”就把这个事带入了语言之争。

我又发了一条微博

@左耳朵耗子 新浪个人认证 : 说C++比C的坑更多的人我可以理解,但理性地思考一下。C语言的坑也不少啊,如果说C语言有90个坑,那么C++就是100个坑(另,我看很多人都把C语言上的坑也归到了C++上来),但是C++你得到的东西更多,封装,多态,继承扩展,泛型编程,智能指针,……,你得到了500%东西,但却只多了10%的坑,多值啊

结果引来了更多的回复(只节选了一些言论):

  • @淘宝褚霸也在微博里说:“自从5年前果断扔掉C++,改用了ansi c后,我的生活质量大大提升,没有各种坑坑我。
  • @Laruence在其微博里说: “我确实用不到, C语言灵活运用struct, 可以很好的满足这些需求.//@左耳朵耗子: 封装,继承,多态,模板,智能指针,这也用不到?这也学院派?//@Laruence: 问题是, 这些东西我都用不到… C语言是工程师搞的, C++是学院派搞的

那么,C++的坑真的多么?我还请大家理性地思考一下

C++真的比C差吗?

我们先来看一个图——《各种程序员的嘴脏的对比》,从这个图上看,C程序员比C++的程序员在注释中使用fuck的字眼多一倍。这说明了什么?我个人觉得这说明C程序员没有C++程序员淡定

Google Code 中程序语言出现 fuck 一词的比率

不要太纠结上图,只是轻松一下,我没那么无聊,让我们来看点真正的论据。

相信用过C++的程序员知道,C++的很多特性主要就是解决C语言中的各种不完美和缺陷:(注:C89、C99中许多的改进正是从C++中所引进的

  • 用namespace解决了很C函数重名的问题。
  • 用const/inline/template代替了宏,解决了C语言中宏的各种坑。
  • 用const的类型解决了很多C语言中变量值莫名改变的问题。
  • 用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。
  • 用强类型检查和四种转型,解决了C语言中乱转型的各种坑。
  • 用封装(构造,析构,拷贝构造,赋值重载)解决了C语言中各种复制一个结构体(struct)或是一个数据结构(link, hashtable, list, array等)中浅拷贝的内存问题的各种坑。
  • 用封装让你可以在成员变量加入getter/setter,而不会像C一样只有文件级的封装。
  • 用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。
  • 用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。
  • 用RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。
  • 用OO和GP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。
  • 用STL解决了C语言中算法和数据结构的N多种坑。
(注意:上面我没有提重载运算符和异常,前者写出来的代码并不易读和易维护(参看《恐怖的C++语言》后面的那个示例),坑也多,后者并不成熟(相对于Java的异常),但是我们需要知道try-catch这种方式比传统的不断地判断函数返回值和errno形成的大量的if-else在代码可读性上要好很多)

上述的这些东西填了不知有多少的C语言编程和维护的坑。少用指针,多用引用,试试autoptr,用用封装,继承,多态和函数重载…… 你面对的坑只会比C少,不会多。

C++的坑有多少?

C++的坑真的不多,如果你能花两到三周的时候读一下《Effecitve C++》里的那50多个条款,你就知道C++里的坑并不多,而且,有很多条款告诉我们C++是怎么解决C的坑的。然后,你可以读读《Exceptional C++》和《More Exceptional C++》,你可以了解一下C++各种问题的解决方法和一些常见的经典错误。

当然,C++在解决了很多C语的坑的同时,也因为OO和泛型又引入了一些坑。消一些,加一些,我个人感觉上总体上只比C多10%左右吧。但是你有了开发速度更快,代码更易读,更易维护的500%的利益。

另外,不可否认的是,C++中的代码出了错误,有时候很难搞,而且似乎用C++的人会觉得C++更容易出错?我觉得主要是下面几个原因:

  • C和C++都没学好,大多数人用C++写C,所以,C的坑和C++的坑合并了。
  • C++太灵活了,想怎么搞就怎么搞,所以,各种不经意地滥用和乱搞。

另外,C++的编译对标准C++的实现各异,支持地也千差万别,所以会有一些比较奇怪的问题,但是如果你一般用用C++的封装,继承,多态,以及namespace,const, refernece,  inline, templete, overloap, autoptr,还有一些OO 模式,并不会出现奇怪的问题。

而对于STL中的各种坑,我觉得是程序员们还对GP(泛型编程)理解得还不够,STL是泛型编程的顶级实践!属于是大师级的作品,一般人很难理解。必需承认STL写出来的代码和编译错误的确相当复杂晦涩,太难懂了。这也是C++的一个诟病。

这和Linus说的一样 —— “C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。注意我飘红了“很多不合格的程序员”!

我觉得C++并不适合初级程序员使用,C++只适合高级程序员使用(参看《21天学好C++》和《C++学习自信心曲线》),正如《Why C++》中说的,C++适合那些对开发维护效率和系统性能同时关注的高级程序员使用。

这就好像飞机一样,开飞机很难,开飞机要注意的东西太多太多,对驾驶员的要求很高,但你不能说飞机这个工具很烂,开飞机的坑太多。(注:我这里并不是说C++是飞机,C是汽车,C++和C的差距,比飞机到汽车的差距少太多太多,这里主要是类比,我们对待C++语言的心态!)

C++的初衷

理解C++设计的最佳读本是《C++演化和设计》,在这本书中Stroustrup说了些事:

1)Stroustrup对C是非常欣赏,实际上早期C++许多的工作是对于C的强化和净化,并把完全兼容C作为强制性要求。C89、C99中许多的改进正是从C++中所引进。可见,Stroustrup对C语言的贡献非常之大。今天不管你对C++怎么看,C++的确扩展和进化了C,对C造成了深远的影响

2)Stroustrup对于C的抱怨主要来源于两个方面——在C++兼容C的过程中遇到了不少设计实现上的麻烦;以及守旧的K&R C程序员对Stroustrup的批评。很多人说C++的恶梦就是要去兼容于C,这并不无道理(Java就干的比C++彻底得多,但这并不是Stroustrup考虑的,Stroustrup一边在使尽浑身解数来兼容C,另一方面在拼命地优化C。

3)Stroustrup在书中直接说,C++最大的竞争对手正是C,他的目的就是——C能做到的,C++也必须做到,而且要做的更好。大家觉得是不是做到了?有多少做到了,有多少还没有做到?

4)对于同时关注的运行效率和开发效率的程序员,Stroustrup多次强调C++的目标是——“在保证效率与C语言相当的情况下,加强程序的组织性;能保证同样功能的程序,C++更短小”,这正是浅封装的核心思想。而不是过渡设计的OO。(参看:面向对象是个骗局

5)这本书中举了很多例子来回应那些批评C++有运行性能问题的人。C++在其第二个版本中,引入了虚函数机制,这是C++效率最大的瓶颈了,但我个人认为虚函数就是多了一次加法运算,但让我们的代码能有更好的组织,极大增加了程序的阅读和降底了维护成本。(注:Lippman的《深入探索C++对象模型》也说明了C++不比C的程序在运行性能低。Bruce的《Think in C++》也说C++和C的性能相差只有5%)

6)这本书中还讲了一些C++的痛苦的取舍,印象最深的就是多重继承,提出,拿掉,再被提出,反复很多次,大家在得与失中不断地辩论和取舍。这个过程让我最大的收获是——a) 对于任何一种设计都有好有坏,都只能偏重一方,b) 完全否定式的批评是不好的心态,好的心态应该是建设性地批评

我对C++的感情

我先说说我学C++的经历。

我毕业时,是直接从C跳过C++学Java的,但是学Java的时候,不知道为什么Java要设计成这样,只好回头看C++,结果学C++的时候又有很多不懂,又只得回头看C最后发现,C -> C++ -> Java的过程,就是C++填C的坑,Java填C++的坑的过程

注,下面这些东西可以看到Java在填C/C++坑:

  • Java彻底废弃了指针(指针这个东西,绝对让这个社会有几百亿的损失),使用引用。
  • Java用GC解决了C++的各种内存问题的诟病,当然也带来了GC的问题,不过功大于过。
  • Java对异常的支持比C++更严格,让编程更方便了。
  • Java没有像C++那样的template/macro/函数对象/操作符重载,泛型太晦涩,用OO更容易一些。
  • Java改进了C++的构造、析构、拷贝构造、赋值。
  • Java对完全抛弃了C/C++这种面向过程的编程方式,并废弃了多重继承,更OO(如:用接口来代替多重继承)
  • Java比较彻底地解决了C/C++自称多年的跨平台技术。
  • Java的反射机制把这个语言提升了一个高度,在这个上面可以构建各种高级用法。
  • C/C++没有一些比较好的类库,比如UI,线程 ,I/O,字符串处理等。(C++0x补充了一些)
  • 等等……

当然时代还在前进,这个演变的过程还在C#和Go上体现着。不过我学习了C -> C++  -> Java这个填坑演进的过程,让我明白了很多东西:

  • 我明白了OO是怎么一回事,重要的是明白了OO的封装,继承,和多态是怎么实现的。(参看我以前写过的《C++虚函数表解析》和《C++对象内存布局》)
  • 我明白了STL的泛型编程和Java的各种花哨的技术是怎么一回事,以及那些很花哨的编程方法和技术。
  • 我明白了C,C++,Java的各中坑,这就好像玩火一样,我知道怎么玩火不会烧身了。

我从这个学习过程中得到的最大的收获不是语言本身,而是各式各样的编程技术和方法,和技术的演进的过程,这比语言本身更重要在这个角度上学习,你看到的不是一个又一个的坑,你看到的是——各式各样让你可以爬得更高的梯子

我对C++的感情有三个过程:先是喜欢地要死,然后是恨地要死,现在的又爱又恨,爱的是这个语言,恨的是很多不合格的人在滥用和凌辱它。

C++的未来

C++语言发展大概可以分为三个阶段(摘自Wikipedia):

  • 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借著接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
  • 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程式库的出现,泛型程式设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
  • 第三阶段从2000年至今,由于以Loki、MPL等程式库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程式设计语言中最复杂的一员。

在《Why C++? 王者归来》中说了 ,性能主要就是要省电,省电就是省钱,在数据中心还不明显,在手机上就更明显了,这就是为什么Android 支持C++的原因。所以,在NB的电池或是能源出现之前,如果你需要注重程序的运行性能和开发效率,并更关注程序的运性能,那么,应该首选 C++。这就是iOS开发也支持C++的原因。

今天的C++11中不但有更多更不错的东西,而且,还填了更多原来C++的坑。(参看:C++11 WikiC++ 11的主要特性

 

总结

  • C++并不完美,但学C++必然让你受益无穷。
  • 是那些不合格的、想对编程速成的程序员让C++变得坑多。

最后,非常感谢能和“@简悦云风”,“@淘宝诸霸”,“@Laruence”一起讨论这个问题!无论你们的观点怎么样,我都和你们“在一起”,嘿嘿嘿……

(全文完)

posted @ 2012-08-06 12:58 Seraphi 阅读(413) | 评论 (0)编辑 收藏

转载Cool Shell,作者:陈皓

From:http://coolshell.cn/articles/2250.html 

下面是一个《Teach Yourself  C++ in 21 Days》的流程图,请各位程序员同仁认真领会。如果有必要,你可以查看这个图书以作参照:http://www.china-pub.com/27043

看完上面这个图片,我在想,我学习C++有12年了,好像C++也没有学得特别懂,看到STL和泛型,还是很头大。不过,我应该去考虑研究量子物理和生物化学,这样,我才能重返98年杀掉还在大学的我,然后达到21天搞定C++的目标。另外,得要特别提醒刚刚开始学习C++的朋友,第21天的时候,小心被人杀害。呵呵。

当然,上面只是一个恶搞此类图片,学习一门技术,需要你很长的时间,正如图片中的第三图和第四图所示,你需要用十年的时间去不断在尝试,并在错误中总结经验教训,以及在项目开发中通过与别人相互沟通互相学习来历练自己。你才能算得上是真正学会。

这里有篇文章叫《Teach Yourself Programming in Ten Years》,网上有人翻译了一下,不过原文已被更新了,我把网上的译文转载并更新如下:

用十年来学编程
Peter Norvig

为什么每个人都急不可耐?

走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索
pubdate: after 1992 and title: days and (title: learn or title: teach yourself)
(出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通))
我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。
结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们欣赏贝多芬或者量子物理学,甚至怎样给狗打扮。在《How to Design Programs》这本书里说“Bad programming is easy. Idiots can learn it in 21 days, even if they are dummies.” (坏的程序是很容易的,就算他们是笨蛋白痴都可以在21天内学会。)
让我们来分析一下像《Learn C++ in Three Days》(3天学会C++)这样的题目到底是什么意思:
  • 学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在C++那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing)
  • C++:在3天时间里你可以学会C++的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用C++语法写出Basic风格的程序,但你学不到C++真正的优点(和缺点)。那关键在哪里?Alan Perlis(ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点C++(更可能是javascript和Flash Flex之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。
  • 3天:不幸的是,这是不够的,正如下一节所言。

10年学编程

一些研究者(Bloom (1985)Bryan & Harter (1899)Hayes (1989)Simmon & Chase (1973))的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功——Sgt. Peppers——也要到1967年才发行。Malcolm Gladwell 研究报告称,把在伯林音乐学院学生一个班的学生按水平分成高中低,然后问他们对音乐练习花了多少工夫:

在这三个小组中的每一个人基本上都是从相同的时间开始练习的(在五岁的时候)。在开始的几年里,每个人都是每周练习2-3个小时。但是在八岁的时候,练习的强度开始显现差异。在这个班中水平最牛的人开始比别人练习得更多——在九岁的时候每周练习6个小时,十二岁的时候,每周8个小时,十四岁的时候每周16个小时,并在成长过程中练习得越来越多,到20岁的时候,其每周练习可超过30个小时。到了20岁,这些优秀者在其生命中练习音乐总共超过 10,000 小时。与之对比,其它人只平均有8,000小时,而未来只能留校当老师的人仅仅是4,000 小时。

所以,这也许需要10,000 小时,并不是十年,但这是一个magic number。Samuel Johnson(英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(Chaucer,英国诗人,1340-1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.)
下面是我在编程这个行当里获得成功的处方:
  • 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。
  • 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。
  • 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。
  • 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”, Eric Raymond,《The New Hacker’s Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件(XEmacsMozilla),甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,Xemacs和Netscape的作者)。
  • 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。
  • 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。
  • 学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。
  • 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里
  • 尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。
  • 拥有尽快从语言标准化工作中抽身的良好判断力。

抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。

Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划:

  • 尽早系统地识别出最好的设计者群体。
  • 指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。
  • 让成长中的设计师们有机会互相影响,互相激励。

这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。

所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。

(全文完)




posted @ 2012-08-06 12:56 Seraphi 阅读(325) | 评论 (0)编辑 收藏

注:如果看不到图片,请右键图片获得图片地址,然后在浏览中访问图片地址即可~

1.去下载LINUX上使用的BIN文件,去www.java.sun.com,最终会到ORACLE网站上去,因为SUN被收购了嘛,下载JDK,名称为jdk-6u22-linux-i586.bin,然后去www.eclipse.org,下载eclipse,笔者下载的是JAVA EE版的,文件名称为eclipse-jee-helios-SR1-linux-gtk.tar.gz,因为这个工具多,比较适合WEB等开发。路径

image

image

2.本人的文件目录放在/home/heroguo/下载,使用tar命令解压(这个具体可以去查找资料或者tar -help)eclipse,会生成eclipse文件夹。mv到/home文件夹。

3、安装JDK,使用终端,运行下载下来的jdk-6u22-linux-i586.bin。

第一步,将目录CD到/home/heroguo/下载。

第二步,使用命令./jdk-6u22-linux-i586.bin,等待中,直到完成。完成后,会在当前目录下生成一个JDK1.6.0_22的文件夹。

第三步,使用mv命令将JDK1.6.0_22到/home文件夹。

4.环境变量

用文本编辑器打开/etc/profile
·在profile文件末尾加入:
export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

注意:千万不要范和笔者一样的错,狂晕,写PATH的时候,前面的$PATH 没有写,导致PATH路径下所有位置被覆盖,包括写命令都得打完整路径,汗死!!路径之间用:隔开

 

这一步很重要:重启ubuntu,在终端中输入java –version,查看版本号

 

image

看到上面按要求1.6.0_22证明JDK被正确安装了

5.用终端将当前目录CD为 /home/heroguo/eclipse,使用命令./eclipse,可以看到eclipse开始运行了。

image

弹出eclipse工作目录设置,OK基本JAVA开发环境也搞定了。

image

进行WEB开发,再去下个TOMCAT,由于TOMCAT7 刚出来,所以选择了TOMCAT6,方法和WINDOWS上一样的,就不再赘述了,哈哈,休息哈去!


转贴:原文链接:

http://blog.csdn.net/guoleimail/article/details/5960244

 

posted @ 2012-05-10 12:09 Seraphi 阅读(980) | 评论 (1)编辑 收藏

怎样做研究(一)

几年前,我写了一套胶片,题目是《怎样做研究》,多次在实验室内部给学生们做报告,也曾对外讲过一次,听众反应良好。也有网友读过这套胶片,给我来信称有所收获。然而,胶片中的文字毕竟只是提纲携领,无法充分阐述我的想法,为此,借周末一点闲暇,把《怎样做研究》写成一篇文章,与师友切磋。


什么是科学


科学是分科的学问,客观地说,是起源于西方的。中国只有经验科学,典型的如中医。我的母亲是学中医的,我从小就对中医耳濡目染,生了病,妈妈就会请他的老师来,一贴小药下去,我的病就好了。因此,我对中医一直是很信服的。然而,近些年来,中医多受批评,发展也越来越缓慢,究其原因,中医不是科学,或者说只是经验科学,而非实证科学。中药的成分以及生化功效不曾用实验进行深入的分析,望闻问切的诊断方法完全凭经验而无法量化,阴阳五行的理论似是而非,祖传秘方的传承方式与知识共享的现代思维背道而驰。因此,尽管中医有诊治的整体观和方剂的个性化两大优点,但其停留于经验层面,而迟迟不能进入科学的殿堂,因此在现代社会中的发展必然步履维艰。


中医不是科学,那到底什么是科学呢?科学(自然科学)是人们用来认识和改造自然世界的思维武器,科学研究可以分为基础研究(理论研究)和应用研究(技术研发)。


基础研究


万事万物皆有其规律,掌握并且利用这些规律就能够为人类造福,这些规律是隐蔽在纷繁复杂的现象背后的,要识破大自然的奥秘,读懂上帝的天书,非要下一番深入观察和探究的功夫不可。以揭示规律为目的的研究活动属于基础研究,从事这些活动的学者是科学家。规律不是被创造出来的,而是早已存在的,人们只有认识规律的权利,而没有创造规律的可能。


从根本上讲,推动基础研究的也是人们在生产生活中的一些实际需要,但是随着基础研究的深入,理论已经成为一个庞大的体系,理论研究早已开始按照它自有的逻辑独立发展,而不必时时刻刻联系实际需要,比如著名的歌德巴赫猜想,可能在百年之后,发现其有重大的应用价值,但是目前到底有什么用,谁也说不清楚。理论的价值在今天这个非常讲求短期功利的社会中常常被忽视,现在有一种倾向认为只有产生实际经济效益的科研工作才有价值,这种极端化的观点显然是错误的,我们必须承认并高度尊重理论研究者的成就。


理论研究的直接动力是科学家的好奇心,以及他们对科学荣誉的渴望。越是单纯的科学家越有希望发现真理,他们的科学探索有点像迷宫探宝或者海边拾贝,伟大的科学家都是没有丧失童趣的人,他们在实验室里是宁静而愉快的,他们是乐此不疲的,很多在常人看来难以忍受的寂寞在他们看来却是一种幸福。越是找不到答案,越是激发探索的热情,在一次次的失败中积累着烦闷与紧张,在终于取得突破后兴奋异常。与此同时,也必须承认科学荣誉也是激励科学家们前进的重要动力,只要别把荣誉看得高于真理,货真价实的荣誉仍然是值得追求的。


理论上的突破对应用研究产生持续不断的推动力,在模式识别领域,神经网络、支持向量机、条件随机域等等机器学习技术不断出现,每当一项理论出现,应用研究者们争相将其应用于自己的研究课题中,于是基于神经网络、基于支持向量机、基于条件随机域的某某研究就成为一个标准的论文题目。首先把某项理论应用于某个实际课题的研究工作应该说还是具有一定的创新性的,毕竟用一个新的思路、新的模型去观察了一个旧的课题,HMM在语音识别上的成功应用就是一例。有人比喻说,理论工具仿佛是锤子,实际课题好比是钉子,一个新的锤子被打造出来,大家都借用过来砸一砸自己手头的钉子,确属常理。不过,需要注意的事,如果拿一个硕大无比的汽锤去砸一个纤细的大头针就荒诞可笑了,不注意思考问题与理论的适配关系而盲目跟风的事情在学术界也是司空见惯,比如我们就曾用HMM试图解决词义消歧的问题,而每个多义词的词义跟它前后一两个词并没有紧密的关系,因此词义消歧貌似和词性标注一样属于线性序列标注问题,其实是有根本差别的。


应用研究


我们是搞计算机的,计算机是一门应用科学,应用科学是由应用驱动的。时至今日,数学定理和物理学定律似乎已经被先哲们发现的差不多了,因此整个科学界中纯粹搞理论研究的人越来越少,很多大学教授都和工业界有着密切的联系,很多大企业也开办企业研究院,这些导致应用科学的研究如火如荼。最近,国家863设立了一个"中文为核心的多语言信息处理"重点项目,总经费7000万,这在多年前的大陆语言处理界完全是不可想象的。


应用驱动,也可以说是市场驱动。市场是一个精灵古怪的家伙,搞应用研究的人如果对市场的未来没有一个基本准确地判断,往往会导致选题上的偏差。二十年前,国内一些研究者开始研究汉字手写输入技术,开始人们觉得从键盘输入汉字很困难,手写输入一定有前途,但是很快,拼音输入法大面积普及,而且拼音输入的速度远比在手写板上输入汉字快得多,于是汉字手写输入套件根本卖不动,前景黯淡。有人开始犹豫,有人开始转向搞印刷体汉字识别等,但忽然有一天,集成了手写功能的商务通大量热销,人们忽然发现原来在手持设备上由于键盘太小,输入不便,给手写功能留下了很大的应用空间。一直专注于手写识别的汉王公司也借着商务通的热销而把多年的科研成果成功地产业化了。再举一个例子:5年前,我认为以图像为输入的图像检索没有什么应用价值,问这些技术的倡导者,他们也只说能够在数码相册中可以找到一些应用,但近来听了微软一些学者们的演讲,他们提到可以用手机拍下一个植物的图片,传回服务器,在大量植物图片库中检索,找到最相似的植物,并给出植物的名称,特点等。哈哈,这对于我这个五谷不分的人来说实在是太有帮助了,可见对于一项技术是否有用实在要仔细思考,不要早下断言。


技术和市场是一个互动的关系,有人认为技术严格地从用户的现实需求出发,这个观点总的来说没有错,但是忽视了技术创造需求的一面。大多数用户往往并不了解技术发展到了什么程度,他们提不出需求来,这时技术专家们需要把技术和产品做出来给人们看,刺激、引领用户的需求,比如数码相机,5年前我想大多数用户和我一样并没有淘汰胶卷相机的强烈要求,但当数码相机进入市场后,人人都意识到:原来我需要这个东东。


在市场与技术的互动中,总的来说,还是市场在引导和拉动技术的发展。市场需要的是产品,产品往往集成了多项技术,因此一项被市场接受的产品能够推动多项技术的进步。比如搜索引擎,它拉动了自然语言处理、并行计算、海量存储设备、数据挖掘等等多项技术的发展。最近中国计算机学会设立了王选奖,在中国真正有市场眼光,能够发明一项技术,拉动一个行业的计算机专家,王选是第一人。怎样根据市场选择研究方向,设计产品,调整技术形态,我在后面还有详细阐述。


科学技术的力量


科学技术的力量是巨大的,爱因斯坦给出的公式E=M*C2,C是光速啊,质量乘以光速的平方,这是多么巨大的能量啊,爱因斯坦的理论直接导致了原子能的利用与开发。基因图谱的发现以及后基因组时代对基因图谱的深入分析必将为人类征服疾病提供一条崭新的解决道路,通过对损坏的基因进行修复,将使无数患者得以康复,无数家庭重拾幸福。互联网的发明,把全世界连为一体,过不了多久,石头里也会嵌入芯片,在这个世界上有生命的、无生命的各种物质之间都可能进行通讯,人们的生活面貌已经彻底改变了。


当然,科学也是双刃剑:原子弹爆炸了,核战争始终威胁着人类;在对基因组这套上帝给出生命密码没有全面理解以前,任何盲动都可能导致基因污染,以至于玩火自焚;互联网上的虚拟生存让人们感到更加孤独。


怎样做研究(二)


研究的层次


研究是分层次的,很多大科学家在晚年登上了最高层,比如钱学森在80年代倡导思维科学,他对整个科学技术体系进行了重新分类。在中国的大学里,分为一级学科,二级学科等,我就处在计算机科学技术一级学科下面的计算机应用技术二级学科下。二级学科的带头人称为学科带头人,二级学科下面一个研究方向的带头人称为学术带头人,我就被指定为学术带头人。


我的研究方向是信息检索,信息检索下面又有子方向,比如文本检索、文本挖掘、跨语言检索、跨媒体检索等,子方向下面设立具体的科研课题,比如文本挖掘中的多文档自动文摘课题,针对一项课题又有不同的解决办法,基于事件抽取与集成的多文档文摘就是利用一种具体的解决问题的方法。


总结来说,就是6个层级:
A. 一级学科
B. 二级学科
C. 研究方向
D. 子方向
E. 课题
F. 基于某种方法对课题进行的具体研究


君子思不出其位,我是学术带头人,因此主要在思考C类的问题,也就是和信息检索相关的问题。一个学院的院长通常会思考A类的课题,学科带头人或者说是一个博士点的点长是要考虑B类问题的。一个人对相关的方向或学科有所了解,对自己的研究工作是很有好处的,只有看清了整体的学科面貌,才能知道自己处在那个位置上,自己未来的方向在哪里。我在读博士以及在微软做副研究员的时候,只看到E类问题,想到最多的是F类问题,因此你让我提一个新方向,让我对一项技术进行预测,我茫然无知。后来担任院长助理,负责学院的成果转化,需要了解学院里各个方向的发展状态,使我的视野开阔了一些。尽管我凡事不求甚解,但是喜欢总结归纳,因此对信息检索与其它学科的关系有了更多地认识,这对后来的选题很有帮助,特别是在应用研究方面,心里比较有底。


学科好比一棵大树的树根,研究方向如同树干,具体的课题就是枝叶了。和学科中各个方向都相关的研究课题是最基础的研究课题,比如在人工智能中,各类机器学习算法是图像识别、语音识别和语言理解等各个方向都离不开的,机器学习技术提高一步,好比树根抬高了一寸,各项应用技术也都跟着进步,因此越是基础的研究,越会对业界产生较大较深远的影响力。不过,基础研究的突破比较难,而在某个应用课题上不考虑一般情况,只考虑具体需要,成功的可能性大。枝叶上的课题做多了,经过合并同类项,就会发现比较共性的基础课题,比如我们在做问答系统、多文档文摘、例句检索等课题时发现复述(paraphrasing)是一个共性的问题,于是把复述单拿出来展开专门的研究,如此,可以越做越深。


学者的层次


研究有层次,学者也有层次,大致可以分为
A. 大家(剑客):提出问题
B. 专家(侠客):解决问题
C. 学徒:修修补补
D. 抄袭者:抄来抄去
E. 搞伪科学的人:弄虚作假


A类是大家,站得高,看得远,他们往往能够前瞻性地提出某个学科领域中的若干重大问题,最著名的是希尔伯特的23个问题,对数学界影响深远。提出问题其实也是解决问题的一种方式,只不过他们是在很高的层面解决问题,类似一个软件系统分析员,他把一个复杂的工程问题分解为若干个有机联系的子问题,然后宣布只要这几个子问题解决了,整个大问题也就解决了。至于这几个子问题到底怎样解决,或者说相应的子系统到底怎样开发,他就不管了。胡乱地提问题并不难,小孩子也会向大人提出各种各样有趣的问题,有的大人也答不出来,问题的关键在于在适当的时候提出适合当前学术发展阶段的关键性课题,这绝对不是一般人能够做到的,这是需要具有对整个领域全面深入的理解才行的。


B类是专家,是在某个研究方向上有专长的人,他们沿着大家指出的方向探索前进,提出全新的方法体系来解决问题。比如在机器翻译领域中,日本长尾真教授提出了基于实例的机器翻译方法,从一个全新的视角看待机器翻译问题。专家经验丰富,能够自由地驾驭课题,稳步地推动课题的进展。


C类是学徒,就是我们这些普通的研究人员了,这部分人的注意力在具体的课题上。学徒们还没有宏大的视野,没有捕捉全局战略要点的本事,也还没有在一个研究方向上提出原创性的解决之道,他们跟在拓荒者后面捡拾麦穗,他们负责对科学大厦修修补补。他们一会儿听说了一个新的机器学习方法,赶紧在自己的课题上试一下;一会儿发现了一个以前忽略了的新的特征,立即想方设法把这个特征提取出来;一会儿为了参加一个技术评测,耐心地调一调系统参数;一会儿为了发表一篇论文构造出一个试验来。我们每天的研究活动差不多都是在这样进行的,很多时候在原地打转转。


我这样描述学徒们的工作情景丝毫没有贬低的意味,在达到专家的水平,证悟研究真谛以前,跌跌撞撞、浑浑沌沌是在所难免的。只要遵守诚信之道,不抄袭,不造假,点点滴滴的贡献对科学界也是有帮助的。从更高的要求看,学徒的目标应该是成为专家,应该时常静下心来想一想,自己的工作是否有价值,是否有新意,揣摩一下大家们、专家们到底是怎样思考问题的,在不断地反思与实践中向上迈进。


D类学者根本算不上学者,他们为了评职称等目的,对别人的论文进行抄袭拼凑,他们是思想的窃贼,对学术界毫无贡献可言。


E类学者不仅仅是做贼了,他编造伪科学,毁坏科学界在公众中的形象,他们是科学界的公敌。


以上的分类也只是为了讨论的方便,在各类之间并没有明确的界限,我只是依次谈出我心中做学问的境界而已。


在人类已知的世界和未知的世界之间有一条动态边界,科学家就站在这条边界上,他们是挑战未知世界的勇士,他们每向前迈出一步,就意味着整个人类的已知世界向前拓展了一步,由此足见科学工作的艰难和科学家的伟大。


研究又好比爬山,一座座山峰如同一个个研究领域,大家已登峰造极,一览众山小,把东南西北各条山路上的沟沟坎坎,把此山与他山之间的距离关系看得清清楚楚。隔行如隔山,隔行不隔道,在一个领域做到顶尖的学者已入化境,一通百通,你把另一个领域的问题讲给他听,他往往也能够很快地抓到要害。专家已到半山腰,看不到山的全貌,但是他找到了一条通往山顶的道路,并一步一步地向上攀登着。学徒还没有进入山门,他们一会儿仰望山顶,一会儿看看山腰,在山脚下绕来绕去找不到门径,费力不少,却并没有缩短与山顶的距离。


怎样做研究(三)


怎样选题


前文曾提到科学研究的层次,并分了6个层级。此处所说的选题指的是从C到E三个层次上的选择问题,即:C. 研究方向、D. 子方向、E. 课题。选择研究方向是实验室(Lab)主任们需要重点思考的事情,选择子方向是研究小组(Group)的组长们需要重点思考的事情,选择课题是研究生们需要重点思考的事情。


选择太多,很容易让人困惑,要想理出一个头绪来,需要一些基本的原则。微软的许峰雄来访时谈到了他选择课题的三个标准:有足够的兴趣,能成为世界第一,能赚钱。(!)兴趣,这个原则是非常重要的,我赞同,获得国家最高科技奖的"黄土之父"刘东生院士是搞地球环境科学的,经常在野外作业,按常人推断,这该是多么枯燥艰苦的工作啊,但他说:"枯燥?不!因为经常有新发现,其中的乐趣难以形容"。我坚信任何一个成功的科学家的直接工作动源都是兴趣,而不是意志。(2)成为世界第一,不容易,但是应该作为一种判断标准,如果某个领域已经非常成熟,很难有什么创新了,或者大牛云集,已经打破头了,则应该有所回避。(3)赚钱,许峰雄是在工业研究院中工作,比较注重实用,因此他强调了"赚钱",我是在工科大学里工作,也比较偏重应用,因此是赞同"能赚钱"这个标准的。不过,"能赚钱"不等于立即赚钱,5年、10年,20年后能够赚钱的研究课题都是值得关注的。


谈谈我选择课题的一些体会:
1、 要有实际需求
一个课题必须有实际需求,可能是现实的需求,也可能是潜在的需求;可能是直接的需求,也可能是间接的需求,总之是的的确确被人们所需要的。据个反例,比如自动文摘,自动文摘是我的博士论文课题,但是实际应用需求始终不清楚,自动文摘的结果用于编辑出版,质量肯定无法保证,用于帮助人们快速浏览资料吧, Google提供的包含查询词的简单的Snippet就起到了这个作用,因此,至今基于全文分析的单文档自动文摘到底用到哪里,仍然不清楚,这方面的研究已经有50多年的历史了,仍然是不死不活,总是找不到应用就无法得到政府和企业界的持续性支持,以往的付出成为鸡肋。我觉得单自动文摘不是一个好课题,目前阶段多文档文摘,或者说对某个题目的自动综述分析是非常好的题目。


2、 有较大的未知空间
以手写体汉字识别为例,市场上已经大面积应用了,在研究上就不宜再展开。


3、 与自己以往的工作有关联
如果你觉得自己的研究领域太窄,或者竞争对手太多,或者自己缺乏兴趣,则可以适当扩展研究方向,但最好是相关性地扩展,比如从自然语言处理(NLP)扩展到信息检索(IR),IR要用到NLP的技术,这种扩展是从底层技术到应用系统的扩展,很自然。再比如从图片检索扩展到视频检索,只是处理对象有变化,很多原有的技术优势仍然能够发挥。如果跳跃性太大,比如搞NLP,忽然发现做数据挖掘有前途,于是单纯地转向数据库中数据挖掘,和文本处理完全脱节,这种做法一方面无法发挥既有的技术积累,另一方面也让同行感觉你不够专注,不容易得到认可。最要命的是有的人根本就没有自己的方向,什么课题都敢接,这样的人可以一时间让人觉得风风火火,经费也很充足,但过不了多久就会摔落下去,因为缺乏积累,学术形象不清,公鸡下蛋,干了自己不擅长的事情,在学术圈还怎么混?


4、 有可能得到国家的支持
对于资深学者,他选定一个课题后,可以写出立项建议,去说服政府或军方支持他的工作,从而填补国家空白,成为国内这个方向的先驱。哈工大的杨孝宗老师借鉴 CMU在wearable computing方面的研究成果,在国内率先提出穿戴计算机的概念,坚持多年,就获得了军方的认可。对于刚出道的年轻人,无力直接影响政府,那只有自己预先判定一个几年后可能成为热点的方向,先走一步,做出一些成绩来,等到大气候适宜的时候,由于他已经取得了一定的成果,也有可能被认可为这个领域的先行者,得到国家的支持。


课题的类型


对一个课题的类型要有一个判断,是研究型的还是开发型的,如果是研究型的,要组织博士生们来攻关,鼓励大家大胆尝试,提出创见;如果是开发型的,要更多地召集硕士生们来做,强调利用一切现有的技术手段把技术或系统做到实用可靠。这两者要分的比较清楚,既不能通过各种打补丁的方法,或者说一大堆小技巧来对付研究型的课题,因为那样是做不出突破性进展的,也不能在开发类课题上总是异想天开,尝试还很不成熟的技术。


如果是研究型课题,还要区别是基础研究还是应用研究,基础研究的结果不能直接被用户使用,类似重工业,应用研究的结果最终用户直接就能够用上,类似轻工业。对于基础研究,可以抛开具体应用的约束,专注于一些科学原理技术原理的突破。对于应用研究,则需要考虑用户的需求。


课题还有长期(long term)和短期(short term)之分,长期研究的课题往往难度大,研究结果难以预料,短期项目则比较好预测,可以速战速决。


怎样做研究(四)


在一个具体的题目上作研究,应该遵从怎样的程序呢?我觉得可以概括为"螺旋式深入",也就是在"阅读","思考","实验","写作",再阅读。。。这四个阶段的时间分配可以根据实际情况灵活调整,刚进入课题的研究生阅读调研花费的时间要多一些,而在一个课题上已经开展了一两年工作的人则可能增量式地阅读资料,阅读时间自然比起步时少一些。专门用于思考、设计、推演的时间可能并不多,但思考是渗透在其它三个阶段中不断进行的,因此总的思考时间并不少。实验中编程的时间应该尽可能短,用更多的时间进行实验数据的分析。写作是常常被中国的研究生忽略的环节,写作的时间要足够长。收集资料,了解别人的工作,找出问题所在,针对性地提出自己的创意,用实验验证自己创意的正确性,总结归纳,撰写论文,发现新的问题,再收集资料,如此反复,这是研究活动的大致流程。


怎样阅读资料


收集资料、阅读资料是从事研究工作的第一步,但是如何收集、阅读资料却很有学问,初学者如果没有得到足够的指导,常常走很多弯路。


1、 阅读重要的论文
目前互联网上的信息量太大了,对每一条信息的重要性、可靠性的判断是一个人采集信息的关键环节。如果判断一篇论文是否重要呢?GoogleScholar给出的引用数是一个有效指标,很多学者都引用的文章往往就是有价值的论文。有的同学觉得看中文论文容易,于是把自己能够查到的中文论文一网打尽,反复阅读,但是很多发表在三流刊物上为了评职晋级而炮制的论文完全没有阅读的价值,白白耽误了时间。即使是英文论文,国外一样有滥竽充数的文章,这样的论文引用数肯定低,用引用数可能很容易地把这样的论文淘汰掉。


计算机领域的顶级会议论文非常重要,在NLP领域有ACL在IR领域有SIGIR在机器翻译领域有MT Summit,这些顶级会议的论文质量很高,内容很新,应该高度关注。期刊上的论文是一个作者或机构一个阶段的研究成果的总结,通常质量较高,但由于审稿及编辑出版的周期很长,因此内容不够新,适当关注即可。NLP领域的CL机器翻译中的MT信息检索领域的IP&M和JASIST等都是很好的期刊。进入一个领域,必须立即了解该领域有哪些顶级的国际会议和国际期刊。


2、以作者为线索理清脉络
阅读论文一定要注意论文的作者是谁,研究机构是哪里,以作者为线索理一理就会发现全世界搞你这个方向的也就那么几个、十几个研究机构、研究者,以后就跟踪这些人的研究工作即可,还能够发现该作者的研究工作的演进脉络。如果拿到一篇文章就读,读完了也不知道作者是谁,时间长了,就会感到晕头晕脑,不知道从哪个期刊或会议上就会冒出一篇相关文章来,让你防不胜防。


3、 阅读最新的论文
学术发展很快,要集中尽力阅读近5年,特别是近3年的论文,对于5年前的论文,只看引用率最高的经典文章即可。


4、 抓住论文的要害


读完一篇论文必须了解哪些关键内容呢?我觉得应该包括以下方面:作者为什么要做这项工作?要解决的是一个什么问题?作者在解决问题时遇到了怎样的困难?为了解决他的困难他提出了什么样的解决办法?试验结果是否可能真的证明他的方法好,数据是否充分,有没有和别人的工作,别的方法进行对比?你认为他的方法是否新颖,你从中学到了什么?该方法有哪些不足,你是否立即有了新的改进方案?如果有立即记录下来。带着上述问题,抓住要点,做好记录,一篇长文就会像庖丁解牛一样轰然倒下。


5、 批判式阅读


真理越辩越明,我们读的是一篇学术论文,不是《圣经》,不能带着崇敬的心理去阅读,要像一个审稿人那样带着批判挑剔的心理阅读论文,在阅读中不断地找出论文中的问题,选题上的,方法上的,实验上的,表述上的,并不断地通过积极独立的思考给出自己认为见解。只有这样,资料才能够为你所用,而不会成为你的包袱。有的同学读资料,越读越丧失信心,发现别人做得太好了,自己的想法都被别人做完了,资料全读完了,自己也准备换课题了,这是失败的读法。


中国的研究生要有信心,不要被国外所谓的名家吓住。中国的科研水平在快速提高,科研人员的素质也在快速提高。一位美籍华裔企业家在一篇文章中写道:"可不幸的是,除了很少顶尖学校的博士外,大部分博士所做的研究课题都是陈旧或者没有意义的。"不知道顶尖高校的含义是什么,但是我觉得我们的研究生要对自己的国家有信心,对自己的学校有信心,对自己的倒是有信心,对自己有信心。只要我们掌握正确的研究方法,广泛阅读国外最新的研究成果,大胆尝试自己人为正确的方法,充分释放我们的聪明才智,我们就丝毫不用对国外的研究工作顶礼膜拜。在科学研究上,欧美人从内心里是瞧不起我们亚洲人,我们中国人的,以至于欧美归来的学者们也以欧美为样板来评估我们教育科研体制,只要和美国不一样就是大错特错了,中国高校的教师们都是在误人子弟。我奉劝每一位研究生建立不崇拜权威,不崇拜欧美,只服从真理的独立思维模式,大胆质疑大胆批判,只有这样才能不死于他人之言下,才能有活脱脱的自己。

posted @ 2012-04-13 19:08 Seraphi 阅读(328) | 评论 (0)编辑 收藏
用途:对我来说,学习HMM是为了对以后的词性或概念标注打下理论基础
符号说明:
S:表示状态集合。S=[S1,S2,S3....]。其中Si表示第i个状态(第i种状态)
Q:表示系统实际的状态序列,Q=[q1,q2,....,qT]。q1表示t=1时,系统所处的状态,如:q1=S3表示t=1时刻,系统状态为S3

1.离散马尔可夫过程
(1)定义:一个系统,在任一时刻t,可能处于N个不同状态S1,S2...SN中的某一个。系统变化服从某种统计规律。如果系统状态序列满足下列无后效的条件,则称(qt,t1)为离散的马尔可夫过程。
                                        P[qt+1=Sj|qt=Si,qt-1=Sk,...]=P[qt+1=Sj|qt=Si]
    可见系统将来的状态仅与现在所处状态有关,与过去无关,这种情况称之为“无后效”。
    如果进一步有P[qt+1=Sj|qt=Si]与时刻t无关,则称相应的马尔可夫过程是齐决的或是时齐的,引入记号:
                                        aij=P[qt+1=Sj|qt=Si],1≤i,j≤N
    注:这里有人也称aij为SiSj的发射概率,也称转移概率。

(2)初始概率分布:         
πi=P[q1=Si],   1≤i,j≤N 
    k步转移概率:
        aij(k)=P[qt+k=Sj|qt=Si]
当k=1时,aij(k)=aij(1)=aij

(3)切普曼—柯尔莫哥洛夫公式(Chapman-Kolmogorol)
            

2.隐马尔可夫模型
    当状态本身是不可观察,从而得到隐马尔可夫模型(HMM)。值得一提的是,隐马尔可夫模型(HMM)包含了双重随机过程:一是系统状态变化的过程,即前面所述的马尔可夫过程,另一个是由状态决定观察的随机过程。
举例:碗、球模型
    假设N只碗,每个碗中放着数量与比例均不同的各种色彩的球,不同的彩色球为M。先随机选一个碗,再从碗中随机拿一个球,报告球的颜色得到一个观察O1,然后将球放回到碗中,继续这个过程,得到一系列观察O=O1O2O3...OT
    在这个模型中,碗(状态)是不可观察的,只有球的颜色是可观察的。这里引入M,指不同观察值的数目 。所有不同观察值记为V={V1,V2,....VM}。
    对于第一种随机过程(选碗),时齐马尔可夫过程的转移概率矩阵:A={aij},初始分布:π=(πi)
    对于第二种随机过程,有多项分布B={bj(k)},其中
            bj(k)=P[时刻t时观察值为Vk|qt=Sj]
    给定一组N,M,A,B和π后,一个HMM即确定了,为紧缩起见,今后将用λ=(A,B,π)表示一个HMM。

3.HMM中三个基本问题
问题1:
    给定一个观察序列O=O1O2...OT和一个模型λ=(A,B,π),如何有效计算P(O|λ),即给定模型λ的条件下,观察序列O的概率。
    问题1是一个计算概率的问题,也可以看成一个评估给定的模型能否很好地拟合给定的观察的问题。

解法:
(1)前向算法:
    定义αt(i)=P(O1O2....Ot,qt=Si|λ)
    
αt可用递推算法完成计算:
    ①初始化:α1(i)= πibi(O1)
    ②递推:
    ③终止:

(2)后向算法:
    定义βt(i)=P(Ot+1,Ot+2,...,OT|qt=Si,λ)
βt可用递推算法计算:
    ①初始化:βT(i)=1
    ②递推:
    ③终止:


问题2:
    给定一个观察序列O=O1O2...OT和一个模型
λ=(A,B,π),如何选择一个相应状态Q=q1q2...qT使得在某种意义下,它能最好地说明观察序列O
两个准则:
准则1:对每个时刻t,逐个选取状态qt使
    
γt(i)=P(qt=Si|O,λ)=max
其中:

求出
γt(i)后,问题2便迎刃而解。

准则2(应用最为广泛):综合选取一个状态序列Q=q1q2....qT使P(Q|O,λ)=max
    对于P(Q|O,λ)=P(Q,O|λ)/P(O|λ)
    而分母P(O|λ)与Q无关,因此等价于P(Q,O|λ)=max。
    对于全局最优问题,使用动态规划方法,这就是Viterbi算法。
    定义
            
    基于HMM特性,
            
    因为我们同样关心q1q2...qT的序列,因此引入
            

    整个递推算法(Viterbi算法)描述如下:
    ①初始化
        δ1(i)=πibi(O1)
        φ1(i)=0
    ②递推
         
         
    ③终止
        
    ④回溯最佳路径
        qt*=φt+1(qt+1*)

    将其应用到词性自动标注中。在自动标注中,每个词是可观察的,一个词串W=w1w2....wT即相当这里的一个观察序列O=O1O2...OT。不可观察的状态相当于词性或概念标记,即状态序列Q=q1q2....qT相当于上一节中的一个标记序列。
    可以看出准则1相当于词级评价,准则2相当于句子级评价。


问题3.
    如何修正模型参数
λ=(A,B,π)使P(O| λ)=max。
    问题3是最困难的,至少也没有很好的解法。可参考的方法有基于均值修正的迭代方法等。

参考文献:
[1] 吴立德: 大规模中文文本处理[M]. 复旦大学出版社,1993.
posted @ 2012-03-07 13:56 Seraphi 阅读(1311) | 评论 (0)编辑 收藏
仅列出标题
共3页: 上一页 1 2 3 下一页