博文

 拥有“自我”(2006-07-15 22:31:00)

摘要:                      拥有“自我” -----       哲学家们常常教导我们,要“认识你自己”,“成为你自己”。的确,人活在世上,应该活出自己的本色。然而,“自我”是一个复杂的概念,哲学家们自己尚且争论不清。
一个人怎样才算拥有“自我”呢?我认为有两个可靠的标志。
    一是看他有没有自己的真兴趣,亦即自己安身立命的事业,他能够全身心地投入其中,并感到内在的愉快和充实。如果有,便表明他正在实现“自我”,这个“自我”是指他的个性,每个人独特的生命价值。
    二是看他有没有自己的真信念,亦即自己处世做人的原则,那是他的精神上的坐标轴,使他在俗世中不随波逐流。如果有,便表明他拥有“自我”,这个“自我”是指他的灵魂,一个坚定的精神核心。
    这两种意义上的“自我”都不是每个人一出生就拥有的,而是在人生过程中不断选择和创造的结果。正因为此,每个人都要为自己成为怎样的人负责。
                         解读“性格就是命运”       古希腊哲人赫拉克利特说:“一个人的性格就是他的命运。”这句话包含两层意思:一,对于每一个人来说,性格是与生俱来、伴随终身的,永远不可摆脱,如同不可摆脱命运一样;二,性格决定了一个人在此生此世的命运。
    那么,能否由此得出结论,说一个人命运的好坏是由天赋性格的好坏决定的呢?我认为不能,因为天性无所谓好坏,因此由之决定的命运也无所谓好坏。明确了这一点,可知赫拉克利特的名言的真正含义是:一个人应该认清......

阅读全文(2238) | 评论:0

大学生应该学习哪些电子知识(2006-07-02 19:19:00)

摘要:http://www.mcufan.com/xinshou/daxueshengyingxue.htm 有不少的在校的大学生写信给我,问在学校里应该学习什么电子知识.就业形势越来越严峻,不光是在中国,全球都一样,全球经济的发展速度放慢,至少会持续几年的时间.半导体产业目前进入低潮,很多公司裁员和亏损.但是技术还是在不断进步,摩尔定律还在起作用,半导体产品的集成度,速度,价格都按摩尔定律在发展.在大学里只是混混日子的大学生不少,但也有一些比较努力的学生,想掌握更多的知识,
希望能够在毕业之后找到好的工作,或者想创造一番事业,对于这些学生,我是赞赏的.我相信一分辛劳一分收获,你的努力是不会白费的.这个世界是适者生存,不适者淘汰的社会.像华为公司,进进出出的人不计其数,能适应的,留,不适应的,走.
  有网友问我,你在大学里是怎么度过的?我是一个对电子有浓厚兴趣的人,在高中的时候就开始抓电烙铁,把家里的电器搞的乱七八糟(拆了,就不知道怎么装回去,当然现在不会这样了). 在大学里,我对电子很感兴趣,自己也买一些器件(我在广州中山大学读书,广州是一个很好的市场,元器件容易买,不管是旧的,还是新的,开始的时候,自己兜里没有多少钱,就买一些旧的元器件),然后自己组装音响,一开始问题真是多,搞了一个学期才搞定,由于问题多,所以经常到图书馆去查资料,去书店看(没有钱买书的时候就抄一段回来),学到很多模拟电路方面的知识.后来就组装逆变器(学校里晚上要关灯,没有电),逆变器可以在关灯了的时候提供电,别的宿舍都停电了,我宿舍就不会停(有逆变器供电),一到关了灯,同学们都跑到我们宿舍来聊天(别的宿舍都一片黑),也是其乐熔融,还有半夜三更看球赛.还组装了CD,VCD,录像机,我们宿舍成为了娱乐中心,可以卡拉OK,可以看电视,看录像,整个物理系,就我们宿舍是最齐全的娱乐设施.也不知道看过多少张VCD,很多同学是广州,从家里拿来好多VCD(还有一些同学的老爸是抓走私的,收缴了好多VCD,也拿过来看),每到下午6点,就开始放VCD,很多人看. 通过这些组装,学习了很多关于模拟电路和数字电路方面的知识,虽然我别的课程学的不好,但是电路的课程是一流的.
  单片机和fpga方面的知识,在大学学的不多,因为学校的东西太落后,都是到公司才学的.
我认为对于搞电子来说,兴趣是最好的......

阅读全文(2658) | 评论:1

关于动态规划算法的研究(2006-05-19 22:22:00)

摘要:关于动态规划算法的研究 原创:怒火之袍 2003年2月25日 一、动态规划的基本思想 在比较基本的算法设计思想里,动态规划是比较难于理解,难于抽象的一种,但是却又十分重要。动态规划的实质是分治思想和解决冗余,因此它与分治法和贪心法类似,它们都是将问题的实例分解为更小的、相似的子问题,但是动态规划又有自己的特点。 贪心法的当前选择可能要依赖于已经作出的选择,但不依赖于还未做出的选择和子问题,因此它的特征是由顶向下,一步一步地做出贪心选择,但不足的是,如果当前选择可能要依赖子问题的解时,则难以通过局部的贪心策略达到全局最优解。相比而言,动态规划则可以处理不具有贪心实质的问题。 在用分治法解决问题时,由于子问题的数目往往是问题规模的指数函数,因此对时间的消耗太大。动态规划的思想在于,如果各个子问题不是独立的,不同的子问题的个数只是多项式量级,如果我们能够保存已经解决的子问题的答案,而在需要的时候再找出已求得的答案,这样就可以避免大量的重复计算。由此而来的基本思路是,用一个表记录所有已解决的子问题的答案,不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。 比较感性的说,其实动态规划的思想是对贪心算法和分治法的一种折衷,它所解决的问题往往不具有可爱的贪心实质,但是各个子问题又不是完全零散的,这时候我们用一定的空间来换取时间,就可以提高解题的效率。 二、动态规划的基本步骤 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。设计一个动态规划算法,通常可以按以下几个步骤进行: (1)找出最优解的性质,并刻画其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值时得到的信息,构造一个最优解。 其中(1)——(3)步是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤(4)可以省去。若需要求出问题的一个最优解,则必须执行步骤(4)。此时,在步骤(3)中计算最优值时,通常需记录更多的信息,以便在步骤(4)中,根据所记录的信息,快速构造出一个最优解。 三、典型的动态规划举例——矩阵连乘问题 作为经典的动态规划算法举例,矩阵连乘问......

阅读全文(7343) | 评论:0

李开复给中国IT大学生的7点建议(转)(2006-04-26 13:21:00)

摘要:很多在校的大学同学问我们:“我今年还没有到毕业班,但我很想知道,如果将来想申请Google中国工程研究院,现在应该如何让自己做好准备?”下面是Google中国总裁李开复博士和其他一些Google资深的华人工程师给广大同学的建议。

(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及一些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。不妨试试Donald Knuth的Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面的功力不错了。

(2)多实战。通过编程的实战积累经验、内化知识。建议大家争取在大学四年中积累编写十万行代码的经验。

(3)求实干。不要轻视任何的实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与职业精神。

(4)不放弃数学。数学是思维的体操,数学无处不在。尤其当你对一些“数学密集型”的领域有兴趣,例如视频、图像处理等等,你需要使它成为你的利器。

(5)培养团队精神,学会与人合作。

(6)激励创新意识,不为书本和权威意见所束缚。

(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习,是你的目的。打工和找工作一样,“不要只看待遇和职衔,要挑一个你能够学习的环境,一个愿意培养员工的企业,一个重视你的专业的公司,最后,要挑一个好老板。” ......

阅读全文(2599) | 评论:0

理解typedef(2006-04-06 08:42:00)

摘要:本人学C++也有三年了,还是对typedef不太熟,今天终于弄清楚了,所以发表此帖,希望对不太清楚的朋友能有所帮助。 首先请看看下面这两句: typedef int a[10]; typedef void (*p)(void); 如果你能一眼就看出它们的意思,那请不要再往下看了。如果你不太理解,或概念还有些模糊,请继续往下看吧。 下面的东西我就直接把人家的东西粘上去吧。自己敲太慢了。呵呵。 原文(摘录): typedef用来声明一个别名,typedef后面的语法,是一个声明。本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人不在少数。罪魁祸首又是那些害人的教材。在这些教材中介绍typedef的时候通常会写出如下形式: typedef int PARA; 这种形式跟#define int PARA几乎一样,如前面几章所述,这些教材的宗旨是由浅入深,但实际做出来的行为却是以偏盖全。的确,这种形式在所有形式中是最简单的,但却没有对 typedef进一步解释,使得不少人用#define的思维来看待typedef,把int与PARA分开来看,int是一部分,PARA是另一部分,但实际上根本就不是这么一回事。int与PARA是一个整体!就象int i:声明一样是一个整体声明,只不过int i定义了一个变量,而typedef定义了一个别名。这些人由于持有这种错误的观念,就会无法理解如下一些声明: typedef int a[10]; typedef void (*p)(void); 他们会以为a[10]是int的别名,(*p)(void)是void的别名,但这样的别名看起来又似乎不是合法的名字,于是陷入困惑之中。实际上,上面的语句把a声明为具有10个int元素的数组的类型别名,p是一种函数指针的类型别名。 虽然在功能上,typedef可以看作一个跟int PARA分离的动作,但语法上typedef属于存储类声明说明符,因此严格来说,typedef int PARA整个是一个完整的声明。 定义一个函数指针类型。 比如原函数是 void func(void); 那么定义的函数指针类型就是typedef void (*Fun)(void); 然后用此类型生成一个指向函数的指针: Fun func1......

阅读全文(27406) | 评论:160

写好C程序的10条秘籍(2006-04-05 09:52:00)

摘要:神乎其技,惟C程序,功到自成,十大建议!   1、汝应频繁催动lint工具,据其语法声明修习内力,此事皆因lint之思虑决断实远在君上。   2、不可依随NULL指针,如若不然,混沌痴颠必俟君于彼岸。   3、纵有天赋大智慧,知晓其事无碍,汝亦当尽数强制挪移函数参数为原型所期之数据类型,以免一时疏忽,致使数据类型向汝讨还血债。   4、若头文件未于函数原型之中声明返回值类型,汝当亲为此事,更须谨慎再三,以防不测降临汝身。   5、汝须亲核字符串、数组操作之越界与否。古之圣人有言: 尝祈门人对答“然也”,不意门人答曰“吾了然于胸无须多虑尽请宽心他日趋庭必当重谢”——所期者短,所获者长,此于数组,实最险要处也。   6、若函数声明内提及,于异常时将返回错误代码云云,汝当谨慎校核该返回值。或有校核语句使汝之代码增大数倍,令汝之手指因敲键而痛楚莫名之事,汝亦当如此。不然,汝固以为此异常之事难得一见,上苍亦必借此惩戒汝之傲慢。   7、汝应研习库函数,不当亲笔重写之。如是,汝之代码必短小易读,汝之心境必清爽恬淡。   8、纵汝不愿,汝亦应借括号、缩进之属,使汝之代码间架清晰,可为后者借鉴。汝之大智慧施于决疑解难则可,施于敷设谜团、淆乱文体则万万不可。   9、外部标识符之前六字符当与众不同。此律法看似粗陋,和者寥寥,然其效用自能延续永远。汝若不从此言,他日,汝欲连接程序于旧作之上时,必抓耳挠腮、蓬头垢面,狼狈之相尽现矣。   10、或有族类,大言炎炎,云“普天之下,莫非VAX”。于此等异端,汝当摒弃之、断绝之、远避之。 更有异人,笃信魔道,以为纵汝所用电脑频繁换代,汝之程序亦能长久适用。汝亦不可与此类恶人来往,谨记谨记。   如何编写最烂的C 语言程序   1、重写标准库函数,把函数名改成你自己才懂得的晦涩的名字。   2、使用晦涩的,个性化的,无法移植的函数库,这样你就永远也不会离开你喜欢的平台了。   3、在所有函数调用前,使用最能精确描述函数功能的注释,比如 printf("Hello world\n");   4、记住:只有菜鸟才在代码中使用回车换行符; 只有菜鸟的徒弟才使用制表符; 高手会在代码中添加无数内嵌的汇编指令。   5、“用户界面”是给低能儿准备的,“用......

阅读全文(2718) | 评论:1

C语言中数组和指针的互操作(2006-04-05 09:47:00)

摘要:C语言中数组和指针的互操作 曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减。当然了,这是无可非议的,但是C的高效性其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有必要知道其中的基本的数据结构的比如数组,稍微有点深度的堆栈、列表、结构体等的操作和实现。指针也是C语言中的一个很优秀灵活的结构,对它的了解也是必不可少的。 我们一般都认为数组是一维的数据存储结构,因为二位数组或者说矩阵都可以看作是多个一维数组的组合结构,定义在其上的数据存储访问方式是一样的。所以一维数组是其中最基础的最重要的部分,只有理解了此类数据结构的本质才能触类旁通了。 数组(array)是若干同类变量的聚合,允许通过统一的名字饮用其中的变量。所以数组也就是一个同一类型的数据的有限集合。可以通过下表来访问数组中的某一/些数组元素。在C语言中数组都由连续的内存区域构成(有时候,不一定是这样),最低地址对应首元素,数组的下标是从0开始的,所以首元素也就是数组下标为0的元素,最高的地址对应最末的元素,即第N-1个元素(如果我们定义的数组为N元)。 数组的定义方式: 在C语言中允许在声明数组的时候同时对其进行初始化,也可以把声明和定义放在不同的位置,初始化的一般的类似于如下的表达式: type_specifier array_name[size1]...[sizeN] = {value_list}; 其中vlaue_list是由逗号(,)分隔的常量表,常量表必须和type_specifier兼容。最后由分号与下一个语句分隔。由此可见一维数组的定义方式为: type_specifier array_name[size] = {value_list}; 如下:char hello[12] = {'H','e','l','l','o',',',' ','w','o','r','l','d','\0'}; 注意:字符数组是一"'\0'"收尾的,这是C标准的一部分。因为在操作字符数组的时候是以'\0'作为结束判断的标志。当然了,如果你定义的是一个字符串那就不用加这个'\0'了。因为有机制帮助你自动添加。上面的例子的串的生命方式为:string hello ......

阅读全文(3515) | 评论:2

IPC$入侵(2006-04-05 09:40:00)

摘要:在黑客众多的入侵手段中,通过IPC$入侵已成为目前比较常见的一种方式,其攻击步骤甚至可以说已经成为经典的入侵模式,许多朋友非常想搞清楚这是怎么回事。知己知彼,方能百战不殆,基于这种考虑,我们来介绍一下这种入侵方式的基础知识。 IPC 是Internet Process Connection的缩写,也就是远程网络连接。它是Windows NT/2000/XP特有的一项功能,就是在两个计算机进程之间建立通信连接。打个比方,IPC连接就像是挖好的地道,程序可通过地道访问远程主机。默认情况下,IPC是共享的,也就是说微软已经为我们挖好了这个地道(IPC),因此,这种基于IPC的入侵也常常被简称为IPC入侵。 IPC 后面的$是共享的意思,不过是隐藏的共享,微软系统中用“$”表示隐藏的共享,比如C$就是隐藏的共享C盘。也就是说C盘是共享的,但是C盘没有那个“托手”标志。IPC$是共享“命名管道”的资源,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码!当然对方机器必须打开IPC$共享,否则你是连接不上的。而利用这个空的连接,连接者还可以得到目标主机上的用户列表。 问:建立IPC连接需要什么条件? 答:建立IPC连接要求双方都是基于NT架构的系统。Windows Me/98/95都不可以。 问:怎么才能建立IPC连接呢?需要什么黑客工具呢? 答:建立IPC连接不需要任何黑客工具,在Windows里敲命令行就行了,但需要知道远程主机的用户名和密码。打开CMD后用如下命令:net use\\ip\ipc$ "password" /user:"username"进行连接。注意,如果远程服务器没有监听139或445端口,会话是无法建立的。也就是说IPC$需要对方开启139或 445端口。 问:建立IPC$之后黑客能做什么? 答:如果黑客使用管理员权限的账号和目标连接IPC $,他就可以和对方系统做深入“交流”了。黑客可以使用各种命令行方式的工具,比如pstools系列、Win2000SrvReskit、 telnethack等获......

阅读全文(7032) | 评论:5

C语言高效编程的四大绝招(2006-04-05 09:25:00)

摘要:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。 第一招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!"); 方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 ; 使用的时候可以直接用指针来操作。 从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。 如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。该招数的变招--使用宏函数而不是函数。举例如下: 方法C: #define bwMCDR2_ADDRESS 4 #define bsMCDR2_ADDRESS 17 int BIT_MASK(int __bf) {  return ((1U ......

阅读全文(3905) | 评论:3

十招学会破解(2006-04-02 14:52:00)

摘要:1 十招教你学会破解 下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助: 1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公司继续上班,这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来,然后我们通过分析程序,找到正确的注册码。所以我们需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到crack的目的。 2. 领空:这是个非常重要的概念,但是也初学者是常常不明白的地方。我们在各种各样的破解文章里都能看到领空这个词,如果你搞不清楚到底程序的领空在哪里,那么你就不可能进入破解的大门。或许你也曾破解过某些软件,但那只是瞎猫碰到死老鼠而已(以前我就是这样的^_^,现在说起来都不好意思喔!)。所谓程序的领空,说白了就是程序自己的地方,也就是我们要破解的程序自己程序码所处的位置。也许你马上会问:我是在程序运行的时候设置的断点,为什么中断后不是在程序自己的空间呢?因为每个程序的编写都没有固定的模式,所以我们要在想要切入程序的时候中断程序,就必须不依赖具体的程序设置断点,也就是我们设置的断点应该是每个程序都会用到的东西。在DOS时代,基本上所有的程序都是工作在中断程序之上的,即几乎所有的DOS程序都会去调用各种中断来完成任务。但是到了WINDOWS时代,程序没有权力直接调用中断,WINDOWS系统提供了一个系统功能调用平台(API),就向DOS程序以中断程序为基础一样, WINDOWS程序以API为基础来实现和系统打交道,从而各种功能,所以WINDWOS下的软件破解其断......

阅读全文(2654) | 评论:0