页希's profileI am who I amPhotosBlogListsMore ![]() | Help |
|
|
20 March MSRA初窥来MSRA已经几天了,正在逐渐熟悉中。我要做的东西是分布式数据挖掘。由于刚来,这几天的主要任务还是阅读文档,有不少新东西需要学习。 MSRA 的环境相当好,无论是硬件还是软件。从软件上来说,这里有世界顶级的researcher,最好的programer,最全面的研究资料,每天都有一些世界各地的研究者来做讲座。从硬件上来说,这里的计算机设施也是一流的,这个就不用多说了。每层楼还有打印室以及取文具的地方。此外还有很多工作之外的配套设施,比如说水房,大家可以到里面随意取饮料喝,包括各种瓶装饮料、各种茶、牛奶、朱古力以及现磨咖啡这些。每层楼还有一个活动室,可以玩桌球和桌上足球之类(我还没去过)。 前天去mentor的办公室讨论,意外发现旁边的办公室就是许峰雄的(不认识他至少知道战胜国际象棋大师的深蓝电脑吧)。今天讲座的张益肇博士是以前语音组的老大,做出过相当出色的工作。感觉MSRA牛人 这里的人工作都很努力,实习生也是这样。到了晚上11点都还有一些人在持续工作,我扛不 住他们,为了顾及身体我一般不会晚于11点走。这里偶尔还有人熬通宵,我们那一圈就有人熬过。不过这里的工作时间很弹性,晚上走太晚了第二 天早上可以晚些来。 刚来不久,还有很多东西不熟悉,很多活动也都还没有参加过。如果有空,以后会继续写一些感受。 13 March 解决关于DLL一些疑惑通过询问sandro师兄和Forrest,解决了一个关于DLL中类的疑惑,非常感谢这两位不厌其烦的解答! 要引入一个库,有三样相关的东西,dll文件,lib文件以及头文件。这里的lib文件不是单纯的lib文件,而是dll的lib文件,与通常的lib文件不同的是相对于一般的包含obj的lib文件它里面只包含有符号表。 如果我们要在一个工程中使用dll库,可以有几种方法。(以visual stuidio 2008为例)
把库的头文件和lib文件放到工程目录里面,放在什么地方自己定,然后在工程属性的C/C++->Additional Include Directories里面设置头文件的存放目录以及在Linker->Input里面的Additional Dependences里面设置lib文件的位置。注意dll文件要放在exe同一个文件夹里面(或者%windows%\system32下面或者PATH路径指定的地方),否则程序会因为找不到dll文件而出错。当然,在vs环境下因为当前目录是工程目录,所以dll文件即使放在工程目录里这个问题还不会体现出来,一旦程序release过后,没有了工程文件,自然就找不到dll文件了。
用动态方法lib就是多余的了,与(二)的方法一样,但是想用动态方法得到类是比较困难的。而且操作比较麻烦。一般不提倡这样用。具体方法可以参看: (Using classes exported from a DLL using LoadLibrary,http://www.codeproject.com/KB/DLL/classesexportedusingLL.aspx) 它的中文翻译可以在这里找到http://waterlin78.gjjblog.com/archives/1053556/。 如果没有使用lib二直接根据头文件的信息来生成类的话,那么会出现这个链接错误。 unresolved external symbol "public: int __thiscall TestClass::add(int,int)" (?add@TestClass@@QAEHHH@Z) referenced in function _main
二、如果只用头文件和dll文件,那么就只有动态方法了。 使用动态方法不需要lib文件,程序直接通过LoadLibrary来加载动态链接库,然后通过GetProcAddress来获取函数入口地址,进行操作。比如dll文件中有一个int add(int a, int b)这样的函数,那么我们可以定义一个这样的函数指针类型typedef int(*func)(int, int)来获取函数。func addFunc = (func)GetProcAddress(hInst, "add"),其中hInst是实例句柄,add是dll中函数的名字。之后我们通过addFunc(int, int)来操作了。 参考文献: (Using classes exported from a DLL using LoadLibrary,http://www.codeproject.com/KB/DLL/classesexportedusingLL.aspx)。 使用LoadLibrary调用DLL中输出的class,http://waterlin78.gjjblog.com/archives/1053556/。 如何做才能从dll中导出类,http://magichere.bokee.com/viewdiary.13373439.html。 VC++中Dll的调用与Dll的调试, http://www.mxjava.com/blog/article.asp?id=223 04 February 编程能力有待进一步加强无意间访问了一位从UESTC出去的仁兄的blog,发现这位仁兄正在学校饱受由于编程能力有限而无法很好完成project之苦,不管是做学术还是做工程这项能力都是必不可少的啊,无论在纸上推公式推得多么优美,最终还是要验证的。希望他通过这几个月的奋起能够大大提升实力。 想到自己,不免倒吸一口凉气。赶快继续加油吧,和这位仁兄一同进步。
01 February 由搭建Infrastructure of Machine Learning所想到的这一段时间和唐良师兄一起做一些Machine Learning的基础工作,准备把目前一些最基本的算法用C++实现做成库,方便以后实验室做实验。同时他的观点和我一直所想的一些观点一致,现在正好借此机会写出来。 这个工作看起来非常的没意思,只是做一些前人早就已经完成的工作,相当的没有创造性,也不能够有所成果。其实不然,这样做是有很多好处的。而且对于实验室对于个人来说都有好处。 首先对于实验室。我想做过论文实验的人很多都有这样的体会,那就是做一个对比试验需要做很多重复性的工作,把别人的文章中的数据结构和算法重新实现一遍,然后和自己的做比较。这样是很耗费精力的,因为每次做实验都要多写很多的重复性程序,其实真正有价值的只是自己那个,其他的只是“绿叶”而已。可是不这样做不行,因为在很多情况下对比实验是必须的,没有的话自己的数据结构或者算法会显得相当没有说服力。因此大家通常有两条途径获得对比程序,第一是直接找原作者找现成的代码,第二是自己实现,两种方法各有利弊。 对于第一种而言,这种方法很省力,而且得到的代码也是由原作者亲自写的,既能够完全反映原作者的想法又有权威性。但是它有一个缺点,那就是当时的程序所处的环境也许和你现在的环境不一样,或者使用的程序语言不一样,和自己的程序不具有可比性,不能够拿来做对比试验。另外,原作者的测试数据与自己的测试数据也可能类型不同,这样原作者的程序也不能拿来直接用。总而言之,使用原作者现成的程序的局限性很大。 对于第二种方法来说,自己写程序确实能够完全满足自己订立的规约,能够很好的用到自己设计的实验当中,而且自己写的程序具有很好的可比性,能够做到各个程序在完全相同的环境下运行,做出的实验比较公正真实。然而这样做的时间成本很高,而且经常是做的重复性工作,往往做一个对比实验需要若干个其他同类型的程序,全部自己从头一个个写相当耗费时间,而且一些程序还需要其他的基础,比如使用其他的更基础的数据结构和算法,这样下来我们又需要实现那些程序,这样是相当漫长而痛苦的一个过程。 因此,如果对自己所有的实验订立一个统一的标准的话,那么以往做实验时做过的工作就可以重用,从而大大减少实验准备时间。当然,对于一个实验室或者一个group而言,大家可以共同订立一个规约,从而可以共享以往的实验资源,这样对大家都有好处。国外很多的实验室都有自己的一套体系,都具有积累了多年的实验资源。这样,如果需要做一个新的实验,只需要简单的使用以前的资源,节省了大量的时间,同时减少了出现错误的几率。然而国内的情况并不是这么理想,有相当大一部分实验室是单兵作战,或者是一个非延续性的团体。大家做实验都是“自己做原材料,从原始社会开始工作”,这样是很难达到很高的水平的,这不是因为我们达不到高水平,而是因为从最基础的开始做起达到高水平时间成本太高了,一般人承受不了。我们国人的科研能力应该说是相当强的,不然顶级会议上不会出现这么多华裔人的面孔。 现在来说说对于个人的好处,这个就不细讲了。无非就是可以让自己快速的熟悉这个领域,其次就是提高自己的动手能力。对于前者,有些人会说,看专著读综述可以更快的了解。这个确实没错,但是这样只是被动的接收知识,很难以牢固的掌握。俗话说百闻不如一见,同样,百见不如一练,只有自己亲手做过的事情自己才有印象。也许有人有这个经历,上课总觉得不如自己看书效果来得好,一上课就犯困,但是自己看书就不会困。这是因为我们的注意力没法集中的原因,主动接收信息和被动接收信息无论从强度还是持续性来说差别都是很大的。可能大家也有这样的感觉,那就是看过的书学过的内容过了一段时间就会遗忘。这是很正常的现象,而且印象越浅的东西遗忘得越快,另外就是别人的东西比自己的东西遗忘的快,这些都是客观规律。如果我们要想遗忘的慢些,那么自己动手重复前人的最基础的工作就是一种很好的方法了。这样学到的知识是扎扎实实的,而不是仅仅浮于纸面上。纸面上的东西学的再好,即使倒背如流,那始终是别人的东西,只是能够用来考考试。只有把纸面上的东西消化了,那才能够真正达到融会贯通的程度,才能源于他人,超越他人,也才能算得上是熟悉了这个领域,如果自己不投身进来,那永远是个门外汉。 对于提高动手能力这一点,这一点也显而易见。对于我们这个以应试教育为主的国家来说,现在有很多学生具有很强的考试能力,然而在真正决定生产力的实际动手能力上来说是欠缺很多的。虽然这个问题在近几年开始有所改善,但是依然问题严重。总体来说,我们学生的实际动手能力普遍不足,能力高的人可谓凤毛麟角,而理论与实践能力均强者更是寥寥无几。这种情况与国外有着很大的差距,据我所知,国外CS本科生的很多课都有课程设计,比如如果学数据库的话就很可能把所有选课的人分成若干小组,每个小组独立开发出一个具有基本功能的小型数据库来,然后再进行评比。当然,我们也有课程设计课,但是含金量怎么样呢,这个我们就心知肚明了,似乎写一个B树或者B+树的就算很好的了,写一个独立存在的数据库就不用考虑了。也许有人会认为这些都是别人已经做过的事情,我们不用去重做。那好,这个观点很正确,前面我也提过,重复工作不用去做。但是有一个前提,那就是如果让我们去实现一个很基础的东西,比如B树,我们能够很容易的搞定,那么我们就确实不需要考虑这些基础的东西了。但是如果我们连基础都不能够深入理解的话就不要去架构空中楼阁了。那是不牢靠的。总而言之,无论是做工程还是做理论(做纯计算理论者除外),动手能力都必不可少。做工程的不必多说,动手能力不强没法做出来。对于做理论的来说,没有扎实的功底来实现实验,那么再绝妙的idea都是没有说服力的。 以上就是我的一些看法,可能不完全正确,不对之处请提出。 07 September 用C++新编译器遇到的问题 直到最近我都还一直用的VC++6.0,这两天觉得新学期应该有新气象,决定安装个VS2005来适应新时代。折腾了一天后(下载,清理硬盘空间-_-b,安装),一个崭新的界面终于呈现在我眼前。恩,看起来是不错,界面感觉比6.0的现代化多了。 随即打开以前写的一个工程看看运行效果,谁知弹出一堆编译错误。不对啊,以前这个程序明明是调试通过了的,怎么可能...不会是RPWT吧.TT。没办法,一个个改吧... 看了看第一个错误是“warning C4346: 'BinSearchTree<T>::tree_node' : dependent name is not a type”。报错的地方是在27行,而我之前定义了个tree_node结构。 19 struct tree_node 20 { 21 T item; 22 tree_node *parent, *left, *right; 23 bool isHeader; 24 tree_node(){} 25 //tree_node(Iterator it){} 26 }; 27 typedef BinSearchTree<T>::tree_node* Link; 这里看起来没有任何错误 ,而且 错误确实只是针对这一行的,没有涉及后面的地方。这个错误也是我以前没有碰到过的,至少6.0没有报过这种错误。于是在网上查了一下。这一查也增长了见 识,原来这一句话是有歧义的。因为对于编译器来说,它并不知道什么是BinSearchTree<T>::tree_node,事实上 tree_node是一个嵌套依赖名字(nested dependent name),更准确的说是一个涉及到type类型的 嵌套依赖名字。也许现在说得还不是很明白,但看了下面一个例子就会知道了。 假设我们这样定义两个类: class Dummy { public: static int subOne; struct subIterator { T item; ……blablabla…… }; }; //另一个文件 template<class C> class Another { public: C& container; ……blablabla…… void visitDummy(const C& co); }; void Another<C>::visitDummy(const C& co) { C::subIterator *c; ……blablabla…… } 第一个类里面有两个成员,一个静态成员变量subOne,一个嵌套的结构体subIterator,其中包含一个成员变量。如果这时我们要在 visitDummy方法中得到subIterator,我们可能会采取上面看到的方法"C::subIterator *c;",咋一看,合情合理,在VC++6.0里面确实也没有问题,然而在2005里面这个会被看成是模棱两可的代码。这是为什么呢?因为我们编程的时候 总是按照自己的思路去思考,而不是按照编译器的方式去解释代码。对于人来说,这句话显而易见的变量申明。但是对编译器来说,它要考虑的问题就不仅仅是这点 代码了,它必须考虑到所有的情况。 而一种可能的情况就是,如果subIterator是一个静态数据成员,而恰巧c是一个全局变量,那么这行代码就表示的是乘法运算!这样,在单个文件中, 编译器就没法排除这样的可能性,它不知道C类型的具体情况,也就是说编译器不能区分这个是一个变量申明还是一个单纯的乘法问题!这看起来是一个愚蠢的问 题,但是编译器必须要考虑到所有的情况,哪怕是荒谬的,这就是它的严密性(可见2005的编译器比6.0严密)。 现在问题是发现了,怎么解决呢?当然是消除这种模棱两可的状况,我们要明确的告诉编译器这是一个类型而不是一个变量,这里我们就要把typename这个关键词紧挨着放在类型前面。 void Another<C>::visitDummy(const C& co) { typename C::subIterator *c; ……blablabla…… } 这样问题就消除了。同理,在返回值,typedef定义时也需要这个关键词。比如在我的代码中: 27 typedef typename BinSearchTree<T>::tree_node* Link; 522 typename BinSearchTree<T>::Iterator BinSearchTree<T>::Iterator::operator--() 523 { 524 ……blablabla…… 525 } 当然,这个规则也有例外。那就是typename不必前置于一个基类列表(list of base classes)中或者在一个成员初始化列表(member initialization)中作为一个基类标识符(base classes identifier)的嵌套依赖类型名(nested dependent type name)。比如 : tamplate<typename T> class Derived: public Base<T>::Nested //基类列表不需要typename { public: explicit Derived(int x) :Base<T>::Nested(x) //成员初始化列表不需要typename { typename Base<T>::Nested temp; //变量申明需要typename ……blablabla…… } }; 一些编译器接受必需 typename 时它却缺失的代码;一些编译器接受不许 typename 时它却存在的代码;还有少数的(通常是老旧的)会拒绝 typename 出现在它必需出现的地方。这就意味着 typename 和 nested dependent type names(嵌套依赖类型名)的交互作用会导致一些轻微的可移植性问题。 解决了第一个问题后,后面的相关问题也就自动消失了。 参考网页: http://blog.csdn.net/fatalerror99/archive/2005/12/04/543630.aspx 26 May 考完了 考试顺利通过,不过没有什么经验可谈...因为本身考试难度就不大,基本上通过率在80%+... 考试中令我头痛的主要是第一部分和最后一部分,考后看结果错了一大半...没办法,自我考试以来,凡是概念题我都没辙,这次也不例外-_-b 不过好在中间三个部分基本没错,不然就亏大了。 认证考试,大部分说服力不是很大,只要认真学了一般没问题。不过靠后隔了很长一段时间是否能够充分利用学习的内容就要看自己的水平了。对我来说,认证一个 就够了。其实不想考的,只是去年申请IBM实习生被BS后得到消息说没有考IBM认证的一概不要(去年可是因为得了IBM比赛的奖而被允许直接参加面试 的,结果被不守信用了)。现在有一个认证也就够了,至少不会因为这个被reject了。 对于技术,我觉得学会并使用就行了,至于认证那个东西有一个就行。即表示有能力取得也不至于为认证而认证。就如同考试一样,除非来个满分,否则没法说明你 对这门学科达到精通的程度,顶多是熟悉。就如我们专业,把概念这些记个滚瓜烂熟考了个很高的分但是课程设计都做不来那像什么...我就遇到过这种人... 感觉扯远了,总的来说过了就是好事。 25 May 要考试了 明天是IBM XML 142考试,刚刚又把内容复习了一遍,感觉差不多就这个样子了。前几天在往上看资料看得两眼发直,身体不适,希望明天的考试有一个回报吧。 好久没考试了,不知道能否找到以往的感觉(虽然以往考试技巧也不咋的),尽量发挥。 一个老同学说XML就是标签,在认真学习以前,我差不多也这么认为。但现在不这么想了,XML体系还是挺庞大的。DTD,Schema,XPath, XForm,XLink,XPointer,XQuery,XSL这些东西虽然都不复杂,但还是有那么多要学,此外XHTML,CSS,脚本语言这些东西 也和它有不小的关系,所以啊,要有比较广博的基础才能够对其融会贯通,紧紧是学到基本技术是不行的,无非只是形而无神。如果能够从宏观着眼,把握住了上述所有技术的来龙去脉与相互联系,那么水平就到家了。 PS:还是更喜欢课程设计这种检验方式,更能够让我充分发挥,这次的毕业设计我也融入了XML技术,算是一个实践吧。 16 May 千疮百孔... 前天把毕业设计的初稿写完了,昨天就收到了唐老师的批改,给与的评价是写得还不错...不过当我看了他的批改后就不这么认为了...-_-b 虽然唐老师仅仅是修改了标题和摘要部分,但我就已经发觉整篇文章到处都是红色了,短短的两三页里到处都是批改的符号...大概有四五十个地方吧,另外还附 送一大段评语,介绍英文摘要应该写.还好英文功底还算过得去,没有出现什么严重的错误,只是内容方面需要稍加修改. 照这个密度修改下去的话,整篇文章大概会出现好五六百处修改...真可以用千疮百孔来形容啊.这是我写得第一篇正式的论文,要好好阅读评语以及修改意见才行,为以后写文章打下基础. 龙星计划笔记(The road from research to good paper)author: Qiang Yang (HKUST) homepage: http://www.cse.ust.hk/~qyang If you read "self-motivation books" in an airport bookstore... a. Walk your right walk. - check out the path to success. b. Set your goal, make your plan. c. Be critical, but do not talk negative to others. d. Be motivated and persistant. e. Be friend to the right persons. 1.How: How do they do it? FIgure out how do they do it. - Who is the five most famous people in your field. Find out how they do it. PS: Book - "The pleasure of find things out" As a freshman. MSc student phD conference paper(1+) conference paper(2+) journal paper(1*) journal paper(1+) 2.What: What topic to work on? a.Obviously useful. b.Not clear how to do it yet. c.Apparently new. d.Can apply divide and conquer - sub problem. e.Available data(UCI data) 3.Where:Where do you get research ideas? a.Attend last conferences, read lateast proceedings and journals: think critically. - Meet and chat with people. - Relax: walk on the beach, drink some beer. - You cannot stop new ideas coming out! b.Check if the idea has been done before. - If so, find out what has been done and that has not been done. c.Make a plan. d.Return to a. PS: Finding research ideas 1.Reading a conference paper 1-2 hours, 30% on understand, 70% on critical thinking. 2.Taking notes on new idea Get ideas from reading Ask: What is the problem? How would I do it? What is wrong? What else? Why not other method? How to do it better? 4.When:When to write a paper? Conference deadline driven. PS: What makes a good paper Good paper = focused + content + good writing skill - writing a paper a.Logic thinking b.Thorough review of previews work c.After giving the solution d.Give full support to your word 5.Why:Why they reject any paper. a.Lack of thorough evaluation - did not compare to obvious baseline - did not motivate the significance of the work well enough - did not compare to obvious competition b.Lack of thorogh related c.Lack of detail 30 January 2007年1月30日会议记录关于不同干涉手段对出生缺陷的影响。
1.项目周期为2年,项目经费约50万。 2.项目内容为不同干预手段对出生缺陷的影响。主要观察大样本(发生率),用传统方法分析
20年的数据。 3.目前已有2年的数据,今后会陆续得到20年的数据。
4.目的(针对本科生和部分硕士生),实现一个灵活的系统。
4.1对基本数据的分析 4.2探索性的分析(多因素干涉的分析) 时间安排: 2007年6月前对目前数据进行处理,6月后对陆续到来的数据进行处理。
数据来源: 医院出生缺陷检测数据、社会出生缺陷检测数据 30 December 第二次会议 今天是关于毕业设计的第二次会议。自从上次接到这个初定课题时,到时就给我说我的这个部分是全组最难的一个...正常的话,两年应该完成...
想想也确实是这样,没想到第一个做的科研项目就是国家十一五攻关项目,老天真是太看重我了。这下子可得加足马力啊,不亢奋不行咯。我做的课题,不光包含数据挖掘的内容,还有GIS的内容。好歹地理信息系统也算是一个单独的学科了嘛,而且从来没有接触过,唯一的了解就是以前教C++和WINAPI的老师是搞那个的。
今天导师发给我的资料中居然还有一个ppt做的电子贺年卡,真是意外!看来这就是德高望重吧。虽然这份贺年卡并没有什么特别之处,但是对人产生的作用确实挺大的,让人感到很温暖,觉得自己是这个集体中的一员,愿意为这个集体尽自己的一份力量。也许这就是唐老师的魅力所在吧,专心于学术,不摆架子,和蔼可亲,对学生负责,有问题都尽量解答。实在是难得一见的好老师啊!能够跟从这样一位导师学习真是有幸,有幸啊!
不过感叹之余,还是想想自己现在的处境吧,数据挖掘入门级别都算不上,GIS认识为0,要想在未来的半年内把这个课题搞定,真的是有点mission impossible,不过我这人向来喜欢有难度的东西,这样才有意思。
时间不早了,该睡觉咯,到图书馆借了不少书,元旦期间好好看看吧。 |
|
|