![]() |
个性的鸡蛋面 · 希腊希腊超级联赛2 2022/23 ...· 1 年前 · |
![]() |
绅士的凉面 · Samsung UK | Mobile | ...· 1 年前 · |
![]() |
豪情万千的企鹅 · 《咏柳》解析- 知乎· 1 年前 · |
![]() |
玩足球的核桃 · 贵州师范大学:贵州最好的师范大学!好不好?靠 ...· 1 年前 · |
Linux系统中很多东西都是以脚本代码、配置文件的形式存在,使用Linux系统时,需经常对这些文件进行编辑。很显然,如果没有文本编辑器,江湖之路寸步难行。
我的选择是Vim。Vim是Linux系统上的最著名的文本/代码编辑器,也是早年的Vi编辑器的加强版,被誉为文本/代码编辑器之中最为优秀经典的上古神器。 它之所以会获得如此美誉,我想主要有以下原因:1.它古老而神秘,学习曲线陡峭,难以驾驭,但是一旦学会则受益匪浅。如今被看作是高手、Geek们专用的编辑器。所以尽管 Vim 已经是古董级的软件,但还是有无数新人迎着困难去学习使用。 2.轻便,无需多言,当仅仅只需要对某一文本文件(比如脚本代码、配置文件)进行简单的编辑的时候,所使用的工具当然是越轻便越好。Vim同时也是阅读文本文件的利器。 3.经典巧妙的编辑方式及强大的功能。它全程使用键盘操作,用户必须记住一堆快捷键、按键组合以及各种命令才能开始使用,一旦使用熟练则编辑效率远超其余编辑器,而且具有各种插件、语法高亮、代码补全、配色方案等极其丰富的资源以及灵活的配置;
我主要在以下情况下使用Vim: 1.用来修改服务器系统的配置文件; 很多时候, Linux 作为服务器是不会开启图形界面的,当需要远程操作时,只能利用 SSH “命令字符式”的 Shell 界面对其进行操作,这种情况下,Vim自然是首选。 2.用来阅读内核源代码和系统的脚本; 理由同上。 3.用来写简单的程序,一般都是单文件的程序,或多文件但是只有少数几个文件的项目,比如学习一门编程语言的时候做练习题,喜欢看到文件夹内干干净净,不喜欢一大堆类似 .project 的文件; 4.装B,花花绿绿的全文本字符界面,很酷。
不适合Vim使用的场景: 1.大的编程项目,大的项目还是最好使用IDE,如果要远程连接没有图形界面的服务器写大项目,最好还是在服务器上建立代码仓库;理由:VIM没有好的项目管理功能,VIM的自动补全只建立在文本匹配上,没有程序语言的语义分析功能。 2.对内容的输入要求不高,但是经常需要设置显示格式,且每个动作之间本身就有很多的停顿的工作,用其他GUI编辑器(如LibreOffice Writer)效率反而比VIM高。
有人说,Vim是“成也插件、败也插件”。Vim灵活的配置和丰富的插件极大地增强了它的功能,但是也极大地增加了我们管理Vim的难度。首先,在使用Vim之前,必须经过适当的配置,而Vim的配置又极其繁琐。所以网上有很多诸如“万能配置”、“最强配置”的文章,这些都可以参考。但是这些文章中有些存在很多错误,甚至前后内容重复、冲突,而且这些文章是“授人以鱼,而不是授人以渔”,它们给出的配置虽然可以照抄,但是经常会让人不明所以。 Vim的插件丰富,在网上不乏使用各种插件将Vim配置成强大IDE的文章,但是Vim的插件管理非常困难,因为每安装一个插件,都需要将该插件的文件分别放到Vim安装路径下的 plugin 、 autoload 、 syntax 、 doc 等目录下。好在是Vundle横空出世,它不仅解决了Vim插件在文件系 统中分散的问题,同时能够自动搜索和下载插件。
安装和配置Vim
使用Vim之前当然需要先安装,不过在Ubuntu中这都不算个事,一条 sudo aptitude install 命令就可以搞定。由于Vundle搜索和下载插件需要git,所以需要同时安装vim、gvim和git,如下:
sudo aptitude install vim sudo aptitude install gvim sudo aptitude install git
然后,在用户的主目录中建立
.vim
目录,在
.vim
目录中建立
bundle
目录,以后Vundle自动下载的插件都保存在这里。然后,进入
Bundle
目录,使用
git clone
命令下载vundle。
下面开始展示我的配置文件(主目录下的
.vimrc
文件)。我的配置不同于网上流传的“万能配置”、“最强配置”。我的配置是能够达到我想要的效果的 “最简单配置”。下图是第1到17行,这里配置了Vundle,使用Vundle来管理插件。在网上的一些配置中,常把Vundle的配置放到配置文件的最后,这是不对的。Vundle的配置必须放到最前面。(如果不用Vundle,用Pathogen插件也一样要把配置放到最前面。)这是因为,只有 Vundle插件运行以后,Vim才会到
~/.vim/bundle
目录下加载其它的插件,如果Vundle没有先运行,Vim当然找不到下载的插件了。
第18到44行,如下图,这是在GVim中截的图,顺便展示一下GVim的效果:
第45到68行:
第69到86行:
从截图中可以看出,我的配置文件很简洁,并且将各种设置初略地分了类,并进行了简单的注释。该配置文件只对Vim进行最基本的设置,不包含任何键盘映射,也不包含任何脚本代码。我把Vim和GVim使用了不同的配色方案,Vim使用经典的desert,而GVim则是网上被众多人推崇的solarized,而且该配色方案是使用Vundle自动下载的。
使用Vundle管理插件
Vundle可以自动下载和安装插件,只需要在“
My Bundles Here
”注释后面使用
Bundle
命令把所需要的插件列出来,每个插件一行,然后运行
:BundleInstall
命令即可。Vundle支持 github.com 和Vim的官网 vim.org 。前面的配置文件中,solarized配色方案就是Vundle从 github.com 上下载的插 件。下面,看看怎么从 vim.org 下载一个模拟黑客帝国的插件。如下图,在
.vimrc
中增加一行配置:
保存该配置文件,并重新启动Vim后,使用
:BundleInstall
命令,可以看到自动下载和安装插件:
输入
:Matrix
命令,可以看到如下效果:
当然,该插件纯属娱乐。娱乐过后还是删除掉比较好。要删除一个插件,首先要从配置文件中将
Bundle 'matrix.vim--Yang'
这一行删掉或注释掉,如下图:
然后保存配置文件,重新启动Vim,运行
:BundleClean
命令,如下图,删除一个插件后的效果:
怎么学习使用Vim
使用Vim之前必须得先做点功课,否则根本玩不转,Vim只会滴滴滴乱响,让人一头雾水。好在Vim有一个非常棒的帮助系统,通过该帮助系统, 可以非常方便地学习Vim。比如前面展示的配置文件,我并没有做过多的解释,因为如果想了解某条设置的作用,只需要
:help
一下即可。下面以
guioptions
设置为例,来了解该帮助系统的用法。从我的截图中可以看到,我的GVim是去掉了工具栏、状态栏、菜单、滚动条的,只保留了编辑界面,要达到该效果,需要使用
set guioptions=...
来设置。要想对
guioptions
有更深入的了解,可以使用
:help guioptions
命令,如下图:
弹出的帮助文档:
如果想对Vim进行系统的学习,可以使用不带参数的
:help
命令,如下图:
Vim的命令非常多,几乎键盘上的每一个按键都有特定的用途,学习Vim的时候一定要做笔记哦。下面,我给大家分享一个Vim的键盘布局图:
(该图片非常大,可以保存下来观看,或者在新的窗口中打开观看。)
VIM的使用技巧,看这里 http://vim.wikia.com/wiki/Vim_Tips_Wiki
使用Vim阅读Linux内核源代码
实战演示如何使用Vim阅读Linux内核源代码。工欲善其事、必先利其器,所以在开始工作前需要先安装合适的插件。我前面讲到了使用 Vundle可以自动管理插件,但是没有讲到Vim中究竟有哪些插件可用。可以到Vim的官网看看哪些插件的下载率比较靠前。地址这里:
http://www.vim.org/scripts/script_search_results.php?order_by=downloads
上图是排名前15名的插件的截图。如果只是阅读源代码的话,我觉得taglist.vim和The NERD tree这两个插件就够了,The NERD tree是浏览目录树的利器,taglist.vim是浏览代码的利器,可以非常方便地显示源代码中定义的各种类型、变量、函数等信息,也可以非常方便地在各个符号之间跳转。taglist.vim必须配合tags文件使用,Linux的内核源代码是C语言的,可以使用 ctags 命令生成tags文件。如果是想把Vim打造成强劲的IDE,还需要别的功能,比如自动补全、自动生成代码块、自动注释、自动Make、自动运行/调试等,以后需要用到相关功能的时候我再介绍相应的插件。在这里,只是Read Only,我觉得taglist.vim和The-NERD-tree足以。
首先,使用前文《
玩转Linux系统的方法论
》中介绍的方法,找到Linux的内核源代码,并安装:
然后找出它们都在文件系统的什么地方:
taglist.vim需要tags文件的支持,而tags文件需要使用tags命令生成,所以需要安装exuberant-ctags,如下图:
再然后,为Vim安装插件。从下面的图中可以看出,除了taglist.vim和The-NERD-tree,我还安装了a.vim,该插件可以方便地实现在.c文件和.h文件之间跳转。当插件名称中含有空格的时候,以“-”代替,如The NERD tree插件,在配置文件中需写成“The-NERD-tree”。配置插件如下图:
安装插件如下图:
再然后,进入Linux内核源代码包的安装目录,解压Linux内核源代码,并生成tags文件,如下图:(这两个步骤都需要有点耐心,因为解压和生成tags这两个操作都很花时间。)
阅读代码前,需要告诉Vim使用哪一个tags文件,在这里,就是刚刚使用
ctags
生成的文件,可以通过
:set tags=/usr/src/linux-source-3.13.0/tags
来设置。为了方便起见,我把该设置放到了
.vimrc
配置文件中,如下图:
最后,启动Vim,找到相应的代码进行浏览。如果编辑的是一个目录的话(如下面的
:e .
命令,表示编辑当前目录),会自动跳出The-NERD-tree的界面,在目录之间导航非常方便,如下图:
这里以Linux内核中红黑树的实现为例。使用The-NERD-tree定位到
lib
目录下的
rbtree.c
文件,按Enter键即可打开代码。输入
:TlistToggle
命令可以打开Taglist窗口,如下图:
在源文件中浏览时,使用Ctrl+]快捷键,可以非常方便地在符号的使用和定义之间跳转。上面的截图是将控制台全屏后的效果,是不是很拉风?
再看看在GVim中阅读内核代码的效果:
上图是将GVim窗口最大化后的效果,Solarized的深色主题和Ubuntu自己的紫色主题之间似乎不是很和谐,所以我在系统设置中将Ubuntu左侧的launcher隐藏了。Ubuntu不仅可以隐藏左侧的launcher,而且Gvim的菜单和系统的状态栏合并到了一起,增加了工作区域,阅读代码那是非常舒服的。
关于The NERD tree和taglist.vim这两个插件,如果想知道关于它们的更高级的用法的话,可以使用
:help NERD_tree.txt
和
:help taglist.txt
命令查看它们自己的帮助文档,如下两图:
以上截图全是图形界面下的效果。如果在全字符界面下会是什么样子的呢?
在CentOS 5.10的全字符界面下截图。如果是默认的80×25的字符界面,工作区域就太小了,经常不能完整显示一整行代码。所以我开启了Framebuffer, 在1024×768的分辨率下工作。下图的配色方案为desert,background=dark的效果:
还是很漂亮的,不是吗?这也是我曾经最喜欢的工作环境。可是现在已经很难再找到1024×768的4:3的显示器了。对于现在的高清宽屏显示器,点距太小,屏幕太大,眼睛就会很吃力。
下图是使用solarized配色方案,background=dark时的效果:
对比度比desert要更强烈一些,也还过得去。
如果在solarized配色方案中设置background=light,则根本没法看:
由此可见,solarized是一个专为GUI设计的配色方案。同一个配色方案,在图形界面下和在字符界面下,其效果是不同的。
除了经典的desert,还有一个经典的配色方案,那就是evening,效果见下图:
加入CTO俱乐部,与14000名+实名制、中高级技术管理者做朋友。
【官网申请】
【上传名片快捷加入】
CTO俱乐部 会员权益:技术交流、餐叙、个人主页、CTO周刊、折扣优惠、大会门票、人才招聘、每月赠书等 。
运营和管理团队时,怎样实现合理跟踪工作内容、实现良好协作流程至关重要。对于小团队来说,该如何选 择适合自己的团队管理协助工具?Redmine、Trello、JIRA等,类似的团队管理工具不少,都可实现团队事务 跟踪、高效协作并快速处理任务开展讨论等基本功能。本期讨论围绕团队管理工具展开,聊聊你所用过的管 理工具。
工欲善其事,必先利其器
幸或不幸,从中华文化传统看来,软件开发都 落在“工”这个领域;而从近代学科分类来看, 软件开发也属于“工程”这个领域(所谓的软 件工程学科)。无论传统文化的经验说法“工 欲善其事,必先利其器”,还是从现代软件工 程学的理论,都强调工具在软件开发中的重要 作用。同时,软件项目涉及的技术越来越广泛, 需要多个开发人员同时参与。如同建筑学一 样,软件产品将美学、人文等要求提到了和功 能性要求同等重要的地位,让软件开发不再只 是程序员的事情,而需多个工种协作来完成。
因此,对于一个软件团队,当从一个人参与变 为多人协作,由一个工种变为多方配合,团队 管理协作的“器”就变得可能比开发工具的 “器”更重要了。基于此,我们软件部门在工作 时,都在不断尝试不同的工具。分享一下其中 的部分工具使用经验,供大家参考。
需求和文档 管理类
Trello是一个轻量级的团队协作工作,形式灵 活,操作比较简便。其使用类似于在一个白板 (Board)上把团队所要做的事情都列为ToDo、 Doing、Done等列表形式来进行典型的PDCA式 管理,并可对某一任务多人进行跟帖式讨论。 当然这些列表都可以自定义,所以也可以用 Trello来做任何类似于便签式的管理。我们部分 队员就用它来做备忘录,利用其做权限控制, 在团队间分享比如服务器IP、登录账号信息等。
项目和时间管理类
这两个是使用较多的项目管理工具。Microsoft Project更多地用于项目经理进行任务拆分 (WBS),并在计算资源(包括人力)的分配和 计算上功能更全,提供项目管理的视角更全; Redmine则适合在开发工作开始后整个团队自 行进行任务进度管理和时间跟踪。
当开发人员面临同时处在多个项目或项目管理 人员有很多杂事时,时间往往会被碎片化。对 碎片化的时间,如果没有一个良好的时间跟踪 管理工具,往往容易导致效率低下。同时,如 果开发人员遇到一个困难点花费过多精力而负 责人不能及时掌握并给予帮助,也会影响项目 进度。Teamcola这个由国内团队开发的时间管 理工具,能较好地解决时间问题,而其管理粒 度为半小时,也不会过多增加管理成本。我们 还定义了一个“杂项”事件(在半小时后做了 很多事情)。如果你有很多杂项,那么要不就是你是老板,要不就是你的时间管理有问题。
质量管理和事务/Bug管理类
Redmine因其问题的字段齐全且可自定义字 段,并可利用插件从csv文件中导入导出,同时 其Web访问特性也很适合开发给用户提交问 题,所以是使用较多的Bug追踪系统。当然其完 全免费,也是一个重要考虑因素。
Git作为一个分布式代码管理工具,当我们经常 在家写代码,而公司的代码服务器被配置为局 域网访问,Git以其支持离线代码管理的功能逐 渐替代SVN成为团队的代码管理工具。当然众 多开源项目从SoureForge搬家到GitHub,也是 开发团队必须掌握Git这个代码控制的一个重要 理由。另外,GitLab本身自带简单的问题跟踪以 及Wiki系统,在小型项目可替代Redmine。
工为器所累
大家也看出来了,工具太多了!在我们的团队 使用过程中,也发现了这个问题,有队员表示 “每天处理事情的系统越来越多了”、“找个合 体的吧”。工具太多,使用不当,工具的使用成 本可能大于其提升的效率。最大的问题是工具 间太独立,不具有单点登录功能。想想开始工 作前,要在N个工具中输入可能不同的账户名 和密码,就是一件头疼的事。因此,目前这些工 具需要接入第三方且统一的用户系统的功能。
器为工所用
不想为“器”所累,在实际工作中根据不同的 项目特性,推荐采用不同的工具和工作方式, 取“器”之神而不在其形。 比如对小型移动App的开发,功能需求单一, 开发周期不长,维护周期也较短,采用Excel来 做WBS拆分和管理以及Bug跟踪已经足够。 另外,在需求沟通和Bug跟踪时,往往需要用户 参与,而让用户去学习诸如Trello、Redmine显 然行不通。这时,我们会直接选用QQ来进行需 求沟通。通常,我们会建立一个群(对长期的项 目)或者一个讨论组(对于短期项目),把相关 的人员都加入其中。QQ的即时信息、语音、截 屏、文件传送甚至远程桌面等功能,让其在我 们的开发过程中成为一个重要的协调工具。
作者简介: 熊兵 摩博科技CTO
本文来自:《程序员》电子刊2014年第4期
The most popular front-end framework for developing responsive, mobile first projects on the web.
Updated 8 hours ago
Updated 4 days ago
Updated 6 hours ago
Updated 4 days ago
Updated 9 hours ago
Updated 6 hours ago
Updated 15 hours ago
Updated 18 days ago
Updated an hour ago
Updated 25 days ago
Rank | Language | # Repositories Created |
---|---|---|
1 | JavaScript | 264131 |
2 | Ruby | 218812 |
3 | Java | 157618 |
4 | PHP | 114384 |
5 | Python | 95002 |
2011年是云计算风起云涌的一年,云计算在国内开始走下云端,落地应用。它会最终促使全球资源集中化,各种资源通过各种技术按照市场的规则被归类集中起来,从而使得资源的利用效达到最大化。
云计算会引起人们思维方式发生很大的改变,让我们学着从整体的角度来应对各种问题,用均衡的思想去处理整个系统里局部之间的关系。它对现有的软硬件厂商带来全新的创业和创新机会,要想抓住云计算,就需要把产品功能不断完善,去抓住云计算的机会。
云计算涉及的分布式、虚拟化和自动化管理等技术均不是新技术,硬件方面也是大家所熟知的产品。可以说,云计算并不是技术的创新,而是让老技术通过重新组合发挥出更大的商业价值,是一种商业模式的创新。它的市场规模巨大。以后软件慢慢地将会以服务的形式来提供,服务将通过互联网来实现。软件是服务的载体,服务是软件的表现形式,软件和服务之间的边界会慢慢变得模糊。云计算的兴起使得传统的软件外包将发生变化,外包的重心将从流程转向软件服务。
云计算不仅影响着计算机技术的发展,还对IT专业人士的就业产生了重大影响。云计算会创造一些新的就业岗位,即便是所有的后台管理和维护工作都交给了云供应商,企业也需要对基础设施建设有比较深刻的掌握和理解。云计算催生了对这方面人才需求的同时,作为IT技术人如何在这股大潮中脱颖而出? 如果想要在云计算开辟的新环境下获得成功,技术人员需要多才多艺,而且精通各种技术。并且需要与其他非技术部门共事,需要每一个人都能身兼数职。
我们需要多学习分布式理论和工程实践以及学习安全方面的知识和法规,编写软件慢慢向服务转变,能解决大规模并行计算、数据分布存储、数据实时备份、应用高度集成以及安全可靠和个性化应用等问题。能将公司的内部基础实施和外部基础设施相衔接的混合技术是很受青睐的。
在之前的PC时代和互联网时代,人们都有一些顾虑,觉得智能化新技术的到来和采用将会导致就业人数急剧减少。
但实际上,无论是PC还是互联网这样新技术的到来,其实都对就业有极大的促进作用,其中最明显的例子,莫过于电子商务。虽然现在的电子商务对实际线下的消费有所影响,但它本身所需的一整套产业链,从网站展示到支付和物流等都需要大量的从业人员,而且电子商务这种新模式也引起更多的消费。而且以美国为例,现阶段IT方面的就业情况和很多传统行业相比,应该光明很多。
首先,在我看来,新的技术将有力地促进就业:
其一,由于云计算技术到来,使得很多过去认为很艰难的事情成为可能,比如海量数据分析、物联网和移动互联网等,而这些新的发展将会导致更多专业人士得到工作;
其二,新的大型云计算中心建设和云计算相关产业链将会产生越来越多新的职位,也需要更多的专业人士投入其中。
其次,我认识云计算能使职业发展更专业化,也主要有下面这两点:
其一,由于公有云的越来越常见,将会减少那些在低效率的企业内部数据中心工作的系统管理人员,而在那些高效率的大型云计算中心则会增加一些系统管理员,而且这些系统管理员将会在大型云计算中心这样的大舞台得到更大的发挥和培养,以及长期经验的积累;
其二,由于云计算将会提供诸如PaaS这样高效率的开发模式,将使得很多企业的内部IT人员将会慢慢地将更多关注力从技术转向业务。这不仅能帮助这些IT人员得到更好的职业发展,而且将帮助企业的业务更好地与IT服务之间进行嫁接。
最后,我想和大家说,不要惧怕新浪潮的到来。因为新浪潮并不使你过去的经验一文不值,而是去适应这股新的浪潮,学习一些新的东西,并且在平时的实践中进行不断的积累,从而形成自己的核心竞争力,比如,对技术或者业务深刻的理解,也可以是人脉等。
第三种习惯 行动至上:千里之行始于足下
一、行动的意义。
如果你想寻找快乐,如果你想开发潜能,如果你想获得成功,就必须积极行动,科不已经证明,人的潜能是可以开发利用的。行动,潜能就会开发;不行动,潜能就会被埋没。
二、永不停止时刻追求进步。
一个积极的成功者的特征,就是他能永不停止随时随地的追求进步。
三、立刻行动的魔力。
克服任何一种恐惧,最好的办法就是“立刻去做”。
四、心动不如行动。
心动不如行动。希望什么,就主动去争取,去促成它的发生。不要为自己寻找借口,要从今天开始,从现在开始。如果有了目标,需要的就是马上行动。固执于细节,你将一事无成。
五、 今天的事情今天做。
如果你时时想到“现在”,就会完成许多事情;如果说你常想着还有明天或将来,那就一事无成。
六、 勇敢去尝试。
如果你不支尝试,你将永远不知道你能做些什么。的确,尝试是成功的秘诀。
七、 怎样提高自己的“行动能力”。
不管你是经营事业、推销产品、研究科学或是在公司任职,各行各业中,成功的必要条件都包括“行动的能力”,也就是做一个积极主动的人。
八、扫清持续行动的障碍。
行动贵在坚持,半途而废意味着放弃成功。坚持不懈是意志顽强的表现,为什么大部分人不能坚持到最后呢?那是因为他们没有扫清持续行动的障碍。我们应该做好面对困难的准备,坚持走自已的路。
第四种习惯 勤奋俭朴 :汗水浇灌成功之花
一、 成功的人都有勤奋的好习惯
世上成功之事,缺了勤奋就会变得不易实现,如果有了勤奋,成功也就不会太难了。一个人要勤奋,就要忌“懒”,忌“惰”。
二、 养成节俭的习惯
一个年轻人可能会有很多朋友,但他会发现没有永远的、不变的朋友,他们随时准备向他提出要求,而节俭却是不断推动他向前的朋友,它使人独立,它使年轻人有立足之地,它使他充满活力,它使他受到恰当的激励。
三、 节俭是成功的美德
节俭意味着科学地管理自己的时间与金钱,意味着最明智地利用我们一生所拥有的资源。
四、 储蓄是成功的助手
机会到处都会出现,但只能提供给那些手中有余钱的人,或是那些已经养成储蓄习惯,而且懂得运用金钱的人,因为他们在养成储蓄习惯的同时,还培养出了其他一些良好的品德。
一、一个目标
一艘没有航行目标的船,任何方向的风都是逆风
1
、你为什么是穷人,第一点就是你没有立下成为富人的目标
2
、你的人生核心目标是什么?
杰出人士与平庸之辈的根本差别并不是天赋、机遇,而在于有无目标。
3
、起跑领先一步,人生领先一大步:成功从选定目标开始
4
、贾金斯式的人永远不会成功
为什么大多数人没有成功?真正能完成自己计划的人只有
5%
,大多数人不是将自己的目标舍弃,就是沦为缺乏行动的空想
5
、如果你想在
35
岁以前成功,你一定在
25
至
30
岁之间确立好你的人生目标
6
、每日、每月、每年都要问自己:我是否达到了自己定下的目标
二、两个成功基点
站好位置,调正心态,努力冲刺,
35
岁以前成功
(
一
)
人生定位
1
、人怕入错行:你的核心竞争力是什么?
2
、成功者找方法,失败者找借口
3
、从三百六十行中选择你的最爱
人人都可以创业,但却不是人人都能创业成功
4
、寻找自己的黄金宝地
(
二
)
永恒的真理:心态决定命运,
35
岁以前的心态决定你一生的命运
1
、不满现状的人才能成为富翁
2
、敢于梦想,勇于梦想,这个世界永远属于追梦的人
3
、
35
岁以前不要怕,
35
岁以后不要悔
4
、出身贫民,并非一辈子是贫民,只要你永远保持那颗进取的心。中国成功人士大多来自小地方
5
、做一个积极的思维者
6
、不要败给悲观的自己
有的人比你富有一千倍,他们也会比你聪明一千倍么?不会,他们只是年轻时心气比你高一千倍。
人生的好多次失败,最后并不是败给别人,而是败给了悲观的自己。
7
、成功者不过是爬起来比倒下去多一次
8
、宁可去碰壁,也不要在家里面壁
克服你的失败、消极的心态
(1)
找个地方喝点酒
(2)
找个迪厅跳跳舞
(3)
找帮朋友侃侃山
(4)
积极行动起来
三:三大技巧
1
、管理时间:你的时间在哪里,你的成就就在哪里。
把一小时看成
60
分钟的人,比看作一小时的人多
60
倍
2
、你不理财,财不理你
3
、自我管理,游刃有余
(1)
创业不怕本小,脑子一定要好
(2)
可以开家特色店
(3)
做别人不愿做的生意
四:四项安身立命的理念
35
岁以前一定要形成个人风格
1
、做人优于做事
做事失败可以重来,做人失败却不能重来
(1)
做人要讲义气
(2)
永不气馁
2
、豁达的男人有财运,豁达的女人有帮夫运
35
岁以前搞定婚姻生活
3
、忠诚的原则:
35
岁以前你还没有建立起忠诚美誉,这一缺点将要困扰你的一生
4
、把小事做细,但不要耍小聪明
中国人想做大事的人太多,而愿把小事做完美的人太少
五:五分运气
比尔
·
盖茨说:人生是不公平的,习惯去接受它吧
1
、人生的确有很多运气的成人:谋事在人,成事在天:中国的古训说明各占一半
2
、机会时常意外地降临,但属于那些决不放弃的人
3
、抓住人生的每一次机会
机会就像一只小鸟,如果你不抓住,它就会飞得无影无踪
4
、智者早一步,愚者晚一步
六:六项要求
1
、智慧
(1)
别人可你以拿走你的一切,但拿不走你的智慧
(2)
巧妙运用自己的智慧
(3)
智者与愚者的区别
2
、勇气
(1)
勇气的力量有时会让你成为
“
超人
”
(2)
敢于放弃,敢于
“
舍得
”
3
、培养自己的
“
领导才能、领袖气质
”
(1)
激情感染别人
(2)“
三
·
七法则
”
实现领袖气质
(3)
拍板决断能力
(4)
人格魅力
4
、创造性:不要做循规蹈矩的人
25-35
岁是人生最有创造性的阶段,很多成功人士也都产生在这一阶段
5
、明智
(1)
知道自己的长处、短处,定向聚焦
(2)
尽量在自己的熟悉的领域努力
6
、持之以恒的行动力:在你选定行业坚持十年,你一定会成为大赢家
七:七分学习
1
、知识改变命运
2
、
35
岁以前学会你行业中必要的一切知识
a)
每天淘汰你自己
b)
在商言商
3
、太相信的书人,只能成为打工仔
4
、思考、实践、再思考、再实践
八
.
八分交际
朋友多了路好走
1
、智商很重要,情商更重要:
35
岁以前建立起人际关系网
2
、人脉即财脉:如何搞好人际关系
3
、交友有原则
4
、善于沟通:
35
岁以前要锻炼出自己的演讲才能
九:九分习惯
习惯的力量是惊人的,
35
岁以前养成的习惯决定着你的成功的大小
1
、积极思维的好习惯
2
、养成高效工作的好习惯
(1)
办公室
(2)
生活可以不拘小节,但要把工作做细
(3)
学习聆听,不打断别人说话
3
、养成锻炼身体的好习惯
4
、广泛爱好的好习惯
5
、快速行动的好习惯
十:十分自信
1
、自信是成功的精神支柱
2
、自信方能赢得别人的信任
3
、把自信建立在创造价值的基础上
4
、如何建立自信
(1)
为自己确立目标
(2)
发挥自己的长处
(3)
做事要有计划
(4)
做事不拖拉
(5)
轻易不要放弃
(6)
学会自我激励
(7)
不要让自己成为别人
十一:
11
个需要避开的成功陷阱
1
、只有功劳,没有苦劳
2
、不要
“
怀才不遇
“
,而要寻找机遇
3
、不要想发横财
4
、不要为钱而工作,而让钱为你工作
5
、盲目跟风,人云亦云,人做我也做
6
、小富即安,不思进取,知足常乐
7
、承认错误而非掩饰错误
8
、脚踏实地而非想入非非
9
、野心太大而不是信心十足
10
、反复跳槽不可取
11
、眼高手低
12
、不择手段
十二:十二分努力
没有人能随随便便成功
1
、小不是成功,大不是成功,由小变大才是成功
2
、中国社会进入微利时代:巧干
+
敢干
+
实干
=
成功
3
、努力尝试就有成功的可能
4
、做任何事情,尽最大努力
5
、把事情当成事业来做
6
、我看打工者
7
、祝你早日掘到第一桶金
http://yueguc.iteye.com/blog/806730
google对于所有的类和API,分为开放式和不开放式两种。所谓的开放式就是javadoc所包含的,并不是java中有public和private,而是跟javadoc有关系,
代码
没有关系。
在开放式的类中增加了一个变量,而又没隐藏,导致和原API的doc不一致造成的就会有错。
通过提示,有2个方法可以
解决
该问题:
1、将新增加的变量或方法加上"@hide" 的注释,注意一点,加"@hide" 不是简简单单的/*@hide */就行了,标准的javadoc要这样 /** */ 而且对于 format 变量 应该加上 { },也就是/**{@hide}*/
2、如果想在生成的doc中增加该变量或方法的话,必须输入:
make update-api
这样的话,
系统
自动
将新增加的API添加到current.xml中了。
五秒钟什么概念!让你瞬间打开世界上任何地点的主机的远程桌面。 如果你用过VNC、teamview、微软RDP(远程桌面)、logmein、QQ远程协助等等,你就知道五秒钟意味着什么了,而且还是基于穿透内网主机的远程桌面,对于图度Talk来说哪些神马远程桌面软件都是浮云。废话少说,先说下图度Talk是啥东东….
图度Talk是一个基于图度在线工作管理系统上使用的一款IM聊天工具,远程协助采用了还未发布的向日葵3.0的急速远程桌面协议( www.sunlogin.com ),通过远程协助帮助远端同事、朋友解决PC使用中所遇到的各类问题。
下载—图度talk五秒钟版(1.0正式版)地址 http://www.tudu.com/tudutalk_1.0final.exe ,各位千万注意了,这个要配套图度系统使用的,所有的账户都是由你自主建立的,完全你说了算。开通图度系统可以到 www.tudu.com 申请开通,现在开通除了可以拿到一个很好的三级域名yourname.tudu.com域名,还将获得18个用户的图度商业版的永久免费使用权。
说了白说,无图无真相,上图。
安装:没什么好说,针对现在免费软件安装包的特点,最大的优点是纯洁无暇,安装过程中没有任何地方忽悠你装垃圾插件。这个logo采用四色,包含了三原色,代表了沟通和融合,比较贴切协同IM的定位。 内容来自Linuxren.net
主界面:市面上大部分能找到的功能基本都有,换肤、透明层、签名、自定义头像、天气预报等,几个亮点支持多国语言(简、繁、英)、显示列表可以定义直板排列(gtalk样式,我喜欢)或分组排列(QQ样式),由于是协同工作用IM,可以自定义登录页面logo、查看组织构架和相关的联系人各类信息等。界面风格你喜欢不喜欢,俺说了不算,俺的评价就是简单实用而不失个性,布局结构方面有自己独特的地方,不会直接让你联想到某一款IM软件。 内容来自Linuxren.net
聊天窗口:聊天界面很简单,没有广告,也没有什么乱七八糟的东西,还集成了屏幕截图和闪屏功能。采用了比较独特的黏贴和堆叠技术(用过gtalk的人应该了解),让你有一种盖楼的冲动,人足够多的情况下可以自动盖出n栋大楼,俺的分辨率高可以一次盖出35层的楼,通过楼房跟人聊天很醒目快捷。另外每天读下签名也是我工作中的一大快乐。
聊天和远程协助:远程协助想必搞IT的兄弟都用过某软件集成的远程协助,其中的辛酸俺就不多说了。我只能说图度Talk的远程协助绝对不一般,强大的工具栏支持键盘快捷、色彩调整、分辨率调整、远程白板、粘贴板同步等功能。完全支持内网穿透,打开远程的屏幕的速度两个字—秒杀街边的各类远程桌面软件,图度Talk首个嵌入了向日葵远控3.0远程桌面加速技术(要知道3.0还没有发布呢)。
图度Talk 1.0正式版更新说明:
1. 开启远程协助按钮; 内容来自Linuxren.net
2. 支持向日葵3.0版急速远程桌面协议;
3. 支持64位windows系统虚拟显卡驱动; copyright Linuxren.net
4. 支持自定义分组和联系人拖拉;
5. 支持超长签名名片显示;
下载—图度talk五秒钟版(1.0正式版)地址 http://www.tudu.com/tudutalk_1.0final.exe ,各位千万注意了,这个要配套图度系统使用的,所有的账户都是由你自主建立的,你说了算。开通图度系统可以到 www.tudu.com 申请开通,现在开通除了可以拿到一个很好的三级域名yourname.tudu.com域名,还将获得18个用户的图度商业版的永久免费使用权。
新闻来源:未知
PMD是一款采用BSD协议发布的Java程序代码检查工具。该工具可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。该软件功能强大,扫描效率高,是Java程序员debug的好帮手。
它可以为您检查Java代码中存在的如下问题:
1、隐藏的bug,例如空的try catch,switch
2、未调用的代码,例如没有使用的局部变量、参数和私有方法
3、未优化的代码,例如String的不正确使用
4、过于复杂的表达式,没有必要的表达式循环,判断
5、重复代码
PMD支持的编辑器包括:
JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant,、Gel、JCreator和Emacs。
此次版本的主要变化:
1、修复了已有规则的一些bug
2、修改了 CPD 算法
3、JSP/JSF 解析器支持 Unicode
4、可处理 标签;
5、AST HtmlScript 节点包含内容,支持 Ecmascript 等等
Ubuntu如何备份和恢复系统 Ubuntu如何备份和恢复系统在 使用Ubuntu之前,相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后重启电脑进入备份工具提供的软件环境,在这里备份或者恢复Windows系统。Norton Ghost是备份Windows系统时经常使用的备份工具。
在备份Windows系统的时候你可能想过,我能不能把整个C盘都放到一个ZIP文件里去呢。这在Windows下是不可能的,因为在Windows中有很多文件在它们运行时是不允许拷贝或覆盖的,因此你需要专门的备份工具对Windows系统进行特殊处理。
和 备份Windows系统不同,如果你要备份Ubuntu系统(或者其它任何Linux系统),你不再需要像Ghost这类备份工具。事实上,Ghost 这类备份工具对于Linux文件系统的支持很糟糕,例如一些Ghost版本只能完善地支持Ext2文件系统,如果你用它来备份Ext3文件系统,你可能会 丢失一些宝贵的数据。
1. 备份系统
我该如何备份我的Ubuntu系统呢?很简单,就像你备份或压缩其它东西一样,使用TAR。和Windows不同,Linux不会限制root访问任何东西,你可以把分区上的所有东西都扔到一个TAR文件里去!
首先成为root用户:
$ sudo su
然后进入文件系统的根目录(当然,如果你不想备份整个文件系统,你也可以进入你想要备份的目录,包括远程目录或者移动硬盘上的目录):
# cd /
下面是我用来备份系统的完整命令:
# tar cvpzf backup.tgz –exclude=/proc –exclude=/lost+found –exclude=/backup.tgz –exclude=/mnt –exclude=/sys /
让我们来简单看一下这个命令:
“tar”当然就是我们备份系统所使用的程序了。
“cvpfz”是tar的选项,意思是“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸”。
“backup.gz”是我们将要得到的档案文件的文件名。
“/”是我们要备份的目录,在这里是整个文件系统。
在 档案文件名“backup.gz”和要备份的目录名“/”之间给出了备份时必须排除在外的目录。有些目录是无用的,例如“/proc”、“/lost+ found”、“/sys”。当然,“backup.gz”这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。如果不把“/mnt”排 除在外,那么挂载在“/mnt”上的其它分区也会被备份。另外需要确认一下“/media”上没有挂载任何东西(例如光盘、移动硬盘),如果有挂载东西, 必须把“/media”也排除在外。
有人可能会建议你把“/dev”目录排除在外,但是我认为这样做很不妥,具体原因这里就不讨论了。
执行备份命令之前请再确认一下你所键入的命令是不是你想要的。执行备份命令可能需要一段不短的时间。
备份完成后,在文件系统的根目录将生成一个名为“backup.tgz”的文件,它的尺寸有可能非常大。现在你可以把它烧录到DVD上或者放到你认为安全的地方去。
在备份命令结束时你可能会看到这样一个提示:’tar: Error exit delayed from previous errors’,多数情况下你可以忽略它。
你还可以用Bzip2来压缩文件,Bzip2比gzip的压缩率高,但是速度慢一些。如果压缩率对你来说很重要,那么你应该使用Bzip2,用“j”代替命令中的“z”,并且给档案文件一个正确的扩展名“bz2”。完整的命令如下:
# tar cvpjf backup.tar.bz2 –exclude=/proc –exclude=/lost+found –exclude=/backup.tar.bz2 –exclude=/mnt –exclude=/sys /
2. 恢复系统
在进行恢复系统的操作时一定要小心!如果你不清楚自己在做什么,那么你有可能把重要的数据弄丢,请务必小心!
接着上面的例子。切换到root用户,并把文件“backup.tgz”拷贝到分区的根目录下。
在 Linux中有一件很美妙的事情,就是你可以在一个运行的系统中恢复系统,而不需要用boot-cd来专门引导。当然,如果你的系统已经挂掉不能启动了, 你可以用Live CD来启动,效果是一样的。你还可以用一个命令把Linux系统中的所有文件干掉,当然在这里我不打算给出这个命令!
使用下面的命令来恢复系统:
# tar xvpfz backup.tgz -C /
如果你的档案文件是使用Bzip2压缩的,应该用:
# tar xvpfj backup.tar.bz2 -C /
注意:上面的命令会用档案文件中的文件覆盖分区上的所有文件。
执行恢复命令之前请再确认一下你所键入的命令是不是你想要的,执行恢复命令可能需要一段不短的时间。
恢复命令结束时,你的工作还没完成,别忘了重新创建那些在备份时被排除在外的目录:
# mkdir proc
# mkdir lost+found
# mkdir mnt
# mkdir sys
等等
当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!
世界上没有绝对安全的系统。如果想获得绝对安全的系统,只有不连接网络,不让管理员之外的人使用,刷卡管制人员进出,使用监视器监视录像,甚至于不 要开机。但是这是完全不切实际的,我们仅能寄望尽量让系统能在承担低风险的情况下工作,因为任何操作系统都不可能毫无漏洞。那么怎样才能让系统承担最低的 风险呢?回答因该是在保障系统尽量安全的基础上,做好各个系统上的数据备份工作。一旦系统遭受到毁灭性的打击,可将平时做好的备份数据及时恢复,这样才能 使被破坏的系统迅速恢复正常,以避免不必要的损失。
下面针对Linux操作系统上的数据备份方法发表一下自己的看法。
数据备份种类
总的来说,在Linux操作系统中将备份分为两类:系统备份,实现对操作系统和应用程序的备份;用户备份,实现对用户文件的备份。在下面我们会看到,系统备份和用户备份是不同的。
系统备份
系统备份就是对操作系统和应用程序的备份,进行系统备份的原因是尽量在系统崩溃以后能快速简单完全地恢复系统的运行。进行备份的最有效方法是仅仅备份那些对于系统崩溃后恢复所必需的数据。
Linux系统中很多重要的文件位于/etc目录之下,如:
/etc/group : 组用户信息;
/etc/passwd : 包含所有的用户信息,如密码,登录shell等;
/etc/fstab : 配置系统有哪些文件系统;
/etc/inittab : 配置init在不同运行级别下分别如何启动系统;
/etc/hosts : 域名解析的配置信息;
/etc/inetd.conf : 进程控制信息;
/etc/printcap:配置如何与打印机通信;
/etc/XF86Config:包含XFree86的初始配置;
上面这些重要的配置文件都需要定期的做备份。
不 同的系统可能有很多重要配置文件,可以看到/etc目录下的配置文件非常重要。当然,某些程序使用了其他目录下的一些文件,但是Linux的基本配置文件 绝大多数都位于/etc目录下。很多人曾经花费了好长时间才正确的配置了XF86Config文件,想到如果重新再做一遍,就很费时费力。再举个例子, /etc目录下的passwd文件,如果误操作,将此文件更改,或删除了,则整个系统用户无法正常登录,如果定期或及时的对其备份,遇到上面的情况后,就 可以非常快速的恢复。
如果修改了某个程序所使用的配置文件,一般不能将其搬移到其它的地方,因为程序通常在固定的地方寻找配置文件。因此记录对系统所做的修改也非常重要,无论所做的修改如何小,当系统崩溃时才能轻松的恢复系统。
用户备份
用户备份不同于系统备份,因为用户的数据变动更加频繁一些。当备份用户数据时,只是为用户提供一个虚拟的安全网络空间,合理的放置最近用户数据文件的备份,当出现任何问题,例如,误删除某些文件或者硬盘发生故障时,用户可以恢复自己的数据。
用户备份应该比系统备份更加频繁,也许每天都需要进行备份,或使用cron程序自动定期运行某个程序的方法来备份数据。
数据备份策略
不 管系统多么可靠,总会发生一些意想不到的事情,致使系统数据丢失。因此使用备份来保护数据不丢失是一种非常重要的手段,尤其在系统数据非常重要的时候。经 常进行数据备份能够减少偶然破坏造成的损失,保证系统能够从错误中恢复正常运行。备份不应该成为一个长时间痛苦的事情,但它是作为系统管理必不可少的工 作,在着手之前进行详细的考虑和计划是应该的。
在进行备份之前,首先要选择合适的备份策略,这将决定何时需要备份,以及出现故障时进行恢复的方式。通常使用的备份方式有三种:
完全备份 : 每隔一定时间就对系统进行一次全面的备份,这样在备份间隔期间出现数据丢失等问题,可以使用上一次的备份数据恢复到前次备份时数据状况。这是最基本的备份 方式,但是每次都需要备份所有的数据,并且每次备份的工作量也很大,需要大量的备份介质,因此这种备份不能进行的太频繁,只能每隔一段较长时间才进行一次 完整的备份。但是这样一旦发生数据丢失,只能恢复到上次备份的数据,这期间内更新的数据就有可能丢失。
增量备份 : 首先进行一次完全备份,然后每隔一个较短时间进行一次备份,但仅仅备份在这个期间更改的内容。当经过一个较长的时间后再重新进行一次完全备份,开始前面的 循环过程。由于只有每个备份周期进行一次完全备份,其他只进行更新数据的备份,因此工作量小,可以进行频繁的备份。例如以一个月为一个周期,一个月进行一 次完全备份,每天晚上0点进行这一天改变的数据备份。这样一旦发生数据丢失,首先恢复到前一个完全备份,然后按日期一个一个恢复每天的备份,就能恢复到前 一天的情况。这种备份方法比较经济。
累计备份 :这种备份方法与增量备份相似,首先每月进行一次完全备 份,然后每天进行一次更新数据的备份。但不同在于,增量备份是备份该天更改的数据,而累计备份是备份从上次进行完全备份后更改的全部数据文件。一旦发生数 据丢失,可以使用前一个完全备份恢复到前一个月的状态,再使用前一个累计备份恢复到前一天的情况。这样做的缺点是每次做累计备份工作的任务比增量备份的工 作量要大,但好处在于,增量备份每天都备份,因此要保存数据备份数量太多,而累计备份则不然,只需保存一个完全备份和一个累计备份就可以恢复故障以前的状 态。另外在进行恢复工作时,增量备份要顺序进行多次备份的恢复,而累计备份只需两次恢复,因此它的恢复工作相对简单。
增量备份和累计备份 都能以比较经济的方式对系统进行备份,在这些不同的策略之间进行选择不但与系统数据更新的方式相关,也依赖于管理员的习惯。通常在系统数据更新不是太频繁 的话,可以选用更新备份的方式。但是如果系统数据更新太快,使每个备份周期后的几次累计备份的数据量相当大。这时候可以考虑增量备份或混用累计备份和增量 备份的方式,或者缩短备份周期。
数据备份命令
在Linux系统中常用的备份命令通常有下面几种:
1.使用tar命令
Linux的实用程序tar最初是为了制作磁带存档而设计的(把文件和目录复制到磁带中,然后从存档中提取或恢复文件),而现在的应用中可以把它用于任何设备,它是数据备份中最常用的命令之一。
下面具体介绍tar命令的使用方法:
(1)格式:tar 参数 ......
(2)参数:
c: 创建备份(Create)
v: 表示回显模式(Verbose),将产生一系列备份的文件列表
f: 指定使用的备份文件,它后面的参数为输出的备份文件名
x: 展开备份文件
t: 显示备份文件的内容
T: 后面跟随一个文件参数,指定从这个文件中读取要备份的各个文件的路径。如果不使用T参数,那么就需要一个参数,指明进行备份文件和目录的路径
Z: 使用压缩方式创建和解开备份文件,这是GNU的新版tar的功能,需要同时安装gzip。
例如:
$ tar cvf backup.tar /etc
上 面的命令将/etc下的所有文件打包成tar存档文件backup.tar。tar的第一个参数“cvf”,是tar的命令参数,“c”告诉tar创建一 个存档文件;“v”选项迫使tar采用冗长模式,即在存档时打印每个文件名;“f”选项告诉tar下一个参数backup.tar是创建的存档文件名。
下面一行的命令将tar文件backup.tar解开并放到当前工作目录下。必须说明的是这样做是有危险的,因为在从tar文件中解开文件时,旧文件将被覆盖。
$ tar xvf backup.tar
在解开tar文件之前,知道在何处打开文件是非常重要的。例如,假设存档以下文件:/etc/hosts,/etc/group和/etc/passwd。如果用下述命令:
$ tar cvf backup.tar /etc/hosts /etc/group /etc/passwd
目录/etc会被加到每个文件名前。为了将文件展开到正确位置,需要用下述命令:
$ cd /
$ tar xvf backup.tar
这是因为文件从存档文件中抽取出路径名,如果用下述命令存档文件:
$ cd /etc
$ tar cvf hosts group passwd
这样目录名就不存在存档文件中,因此需要在展开文件之前用“cd /etc”命令进入目录etc。由此可见,tar文件的创建方式与在何处展开有很大关系。
命令:
$ tar tvf backup.tar
在解开tar文件之前显示tar文件的索引,用这种方式可以看到存档文件中与文件名有关的目录名,从而在正确位置上展开存档文件。
2.gzip和compress 命令
与MS-DOS的存档程序不同, tar在存档过程中并不压缩文件。因此,如果存储两个1MB的文件,那么tar文件大小为2MB,gzip命令用来压缩文件(被压缩的文件并不需要是tar格式)。
例如:
$ gzip -9 backup.tar
压缩backup.tar文件,产生的文件为backup.tar.gz,开关“-9”告诉gzip用最高的压缩比。gunzip命令用来解开一个gzip压缩的文件,用“gzip -d”也可以达到同样效果。
例如:
$ gunzip backup.tar.gz
$ gzip -d backup.tar.gz
3. 联合使用
介绍了这些命令之后,我们来尝试组合使用这些命令。为了压缩存储一组文件,可以用下述命令:
$ tar cvf backup.tar /etc
$ gzip -9 backup.tar
结果是形成文件backup.tar.gz。展开该文件时,用相反的命令:
$ gunzip backup.tar.gz
$ tar xvf backup.tar
tar命令还包括“z”选择项,它会自动采用gzip压缩算法来联机压缩/解压文件。例如,下列命令:
$ tar cvfz backup.tar.gz /etc
上面一行的命令等价于:
$ tar cvf backup.tar /etc
$ gzip backup.tar
而命令:
$ tar xvfz backup.tar.Z
可以用来代替下述命令:
$ uncompress backup.tar.Z
$ tar xvf backup.tar
案例实验
案例:使用tar进行备份。
选定了备份方式之后,可以使用tar、cpio、dump等备份工具软件将数据备份到磁带上。对于一般的备份,使用tar就足够了。tar能够创建备份文档,能够备份到磁带上或者产生一个文件,如:
$ tar cvf root.tar /root
将/root目录下的所有文档备份到root.tar文件中,root.tar为指定输出的备份文件,/roo t指出要做备份的目录。如果要备份到磁带上,将输出的备份文件指定为磁带设备文件即可:
$ tar cvf /dev/rmt/0h /root
如果设置了环境变量TAPE,则可以不使用选项“f”指定输出磁带设备名字:
$ TAPE=/dev/rmt/0h; export TAPE
$ tar cv /root
要进行增量备份,必须找出哪些文件在这个期间进行更新。这个任务可以由命令find来完成,例如查找过去七天更改的文件,并使用tar的“-T”参数制定进行备份的文件,命令如下:
$ find / -mtime -7 -print > /tmp/filelist
$ tar -c -T /tmp/filelist -f /dev/rmt/0h
由 于要使用find来找出需要备份的文件列表,那么就需要利用文件的修改时间进行查询,需要使用“-mtime” 参数。另一个更有用的参数是“-newer”,可以查找出所有比某个文件更新的文件,由于备份是周期进行的,因此可以在完全备份之后生成一个标记文件,那 么所有比这个文件新的文件都需要进行更新备份。
$ find / -newer full_back_tag_file -print > /tmp /filelist
进 行数据备份需要定期执行,不能完全依赖于管理员手工进行备份。备份也应该选择在系统比较空闲时进行,以免影响系统的正常处理任务。通常可以选择半夜 0:00点之后进行备份,这样更不能将这个任务由管理员手工完成了。但Linux提供了定时服务cron程序,能够在确定的时间中执行一系列任务,因此数 据备份必须和cron合作来完成,或者使用/etc下的daily,weekly,monthly文件做定时备份的操作。
昨天一同学问我,如何快速的学习Android应用程序开发? 之前的一位同事也问过我,我也只是大概的说说看哪些资料。为避免更多的人问我,所以有必要写写。
1. 开发环境搭建。自行Google。英文好的,看官方网 http://developer.android.com/ 访问不了的,可以访问它的镜像 http://androidappdocs.appspot.com/index.html
2. 在模拟器上运行 ApiDemos,全部点一遍,看看Android都提供了些什么界面效果,心里有个印象。最好把ApiDemos的代码,看它个两三遍。我到过深圳南山 书城,看了好几本国内出的Android书籍,一本书都没翻多久,就看完了,没啥看头,因为大部分内容ApiDemos都有了呀。
3. Java的学习。
Android应用程序是用Java写的,像我这样从C/C++阵营过来的,开始真的很抵触。《Thinking in Java》 ??? No! 没时间玩这东西,当做参考书还行,不懂就翻翻。宝岛台湾的林信良老师写的《Java学习笔记》,还不错。
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/JavaGossip.htm
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/JavaGossip2.htm
大约花一个礼拜的晚上时间学习,基本够用。
4. 学习资料
(1) 网站
官网 developer.android.com,英文差的同学,也要硬着头皮看,在网上搜来搜去,其实大部分东西都是从这拷贝过去的,从而浪费了大把的时间。国内的android论坛,好像就javaeye文章质量高一点,其他的不知道。我一直上国外的
http://www.anddev.org/
它有两个版面 Novice Tutorials和Code Snippets for Android,有教程,可以下载代码编译运行,初学者最喜欢这样的了。不像一些网站,下载代码还要扣积分等其他7788的,一看就没什么好感。
(2) 书籍
就只推荐三本,其他的没看过,不好评论。
Mark L. Murphy: 《The Busy Coder’s Guide to Android Development》
Chris Haseman:《Android Essentials》
高煥堂:《Android 應用框架原理與程式設計36 技》
初学者最好不要第一本书就看高的书,因为一些东西他讲起来莫名其妙,搞复杂了,一看developer.android.com英文原版的资料,噢!英文描述这么简单啊。
(3) Blogs
请参看
http://wiki.andmob.org/blogs
(4) 阅读代码
除了上面所说的ApiDemos的代码,还有SDK下提供的Samples目录下其他示例代码,还有Google公司提供的Demo代码,它们在:
http://code.google.com/p/apps-for-android/
———–
2010/6/11 补充内容:今天在网上找chrome代码阅读,看到
Venus神庙
的 Android学习入门
http://www.cnblogs.com/duguguiyu/archive/2010/01/23/1654559.html
感觉不错,也推荐给大家,Venus神庙写作水平不错,比我好N倍。
android 网络开发
Android网络应用开发
反复研究了 Android Market,总结一下,之前发在新浪微博上,但不够详细,主要是提高用户体验。
1.网络异常处理,重试机制。
上wifi常常网络断开,那就看运用程序是否健壮。可以用Android 提供的 frameworks/base/core/java/android/net/NetworkConnectivityListener.java 监控网络变化,然后做相应的处理。
2.Cache
这个是必须的。比如手机QQ的头像,不可能每一次登录,重新把头像下载一遍。可以是内存cache,也可以写入SD卡。
3. 本地数据与服务器同步机制
4.请求异步处理机制
给一个app打分,打分后,马上回到之前的界面,而不是一直在等是否把数据发送到了服务器再响应。
5. push消息通知
有软件可以更新,在状态栏提示。新浪微博在右上方显示有新数据。
6.lazyload
延时加载,比如图标,头像,分页。
7.数据交换格式:对象序列化/protobuf/json/xml。
8. 设计模式:MVC,chain。
经典语录1:
看到一篇关于
哈佛
大学学生是如何学习的文章,贴出来与大家共勉之。如果管理员觉得本文不合适放在首页,可以放在其他地方,谢谢
!
哈佛老师经常给学生这样的告诫:如果你想在进入社会后,在任何时候任何场合下都能得心应手并且得到应有的评价,那么你在哈佛的学习期间,就没有晒太阳的时间。
作为闻名于世的学府,哈佛大学培养了许多名人,他们中有33位诺贝尔奖获得者、7位美国总统以及各行各业的职业精英。究竟是什么使哈佛成为精英的摇篮?哈佛学子接受了什么样的精神和理念?这些问题吸引着成千上万的人去探知其中的答案。作为一个经常做演讲的人,我很高兴的看到CatChen在他的文章里介绍了如何做演讲。洪超大哥在MVP openday上的培训是非常好的,我没去成很可惜。
话说回来,演讲这事我一年大概搞个小100次,如果算上我的各种Cast则要更多,所以不才就在这里随便说说关于演讲的东西。
1.演讲的目的
正本清源的说,演讲这事的目的只有一个,就是让对方相信你让他相信的,赞同你提出的,反对你反对的。演讲是宣传的工具,宣传则是包装的工具,对好事我们所做的一切叫宣传,对坏事我们所做的一切叫炒作。但是本质上,两者做的是同一种事。也就是说,你演讲的目的大体只有一个,也就是宣传或者说炒作。如果你不赞同这一观点,可以参考下面的文字 《什么是炒作》
2.演讲的技巧
演讲最重要的技巧就是了解你的受众,人们只希望听见自己希望听见的话,喜欢听见自己喜欢听见的话,记住自己愿意记住的话,而其它的话,则全是废话。牢记这一点有助于你进行演讲,在开始演讲之前,你非常有必要了解你的听众,他们是谁、为什么来着、想听什么?
为了不让这个事情说的像国产教科书,我简单的把这事做如下表述“你的记忆就像一幢房子,里面是精装修,家具电器一应俱全,就是没有男主人,后来天长日久就老旧了,你选择性记忆把那些你觉的好的留下了,然后对记忆修饰一新,涂上腻子雕梁画栋,没事的时候还不断拉人来参观粉饰太平,最后你也分不清那些是原来的哪些是后弄的。简单的说,你把自己给糊弄了。”
大体上,我们在成长和衰老过程中进行着不断肯定的自我记忆修复,我们不断回忆自己做的好的往事,然后通过这一肯定让自己有继续生活的勇气,少部分人因为脑部受了损伤,总是记住自己做的坏事,然后自我否定,我们一般称呼这种病为“抑郁症”,患者都有自杀倾向,要吃百忧解才能继续生活,不幸的是,越是善于客观、理智思考的人,越不能随便忘记过失和盲目自我肯定,这也就造就了的他们早夭。人类社会千百年来没什么进步,且一茬不如一茬的根本症结就在于此。
2.1 做好自我定位
我们人类社会大体是分小圈子的,一个人的穿着打扮就说明了他的小圈子,你在演讲的时候,你和你受众必须是一个小圈子,否则一切说法就无从谈起,不信的话,你可以参考那些到处游说的职业政客,每个人走进工人的时候都是蓝领子的衬衫,走向农民的时候都是灰色尼龙绸夹克,绝对不会穿衬衫和西装。跟知识分子握手的时候则必然西装笔挺,还要带着领结。要知道,这些随着外部环境变化的形象工程是演讲成功的关键,你传的衣服,行为举止让对方感觉你不是这个圈子的,则你不用开口,就已经输了。
2.2 目标导向明确
演讲要有宣传的目的,我一开头就说了,这里再强调并非是说还要在演讲中不断的强调你的目标,刚好相反,你应该尽量回避告诉你的听众你的目标,外国PPT开头最喜欢告诉受众,我这个PPT要讲的内容是什么,然后1.2.3一列举,坦白讲,这种演讲的影响力其实很有限,因为听众会在一开头就知道,哦,原来你要讲这些啊,而且会根据内容选择性收听或者不听,因为他们想,反正我有PPT可看,还听你废话干什么。外国这么搞当然是有原因的,因为外国人是实在,来听演讲一定就是来听演讲,一定一心一意的,因为他们是自愿来的,他们对这个演讲感兴趣,但是多数情况下,来听你演讲的同胞们很多情况下完全是因为“无聊,被迫,不来听就要去干活”等等纯粹的消极因素来听演讲。所以对他们来说,PPT前面的123可以跟讲的东西完全不搭调,123是给他们一个来的理由,而他们听到的东西则决定了他们的反馈。
除了不要照本宣科以外,我还得说,演讲的诀窍之一就是把你的目的弄成简单的口号,人们对母语中有韵脚的语序有特殊的好感,大脑会选择记住他们,并且简短的东西便于口口相传,比如“不要迷恋哥,哥只是传说。”十个字,体现了很高的境界,再比如“哥抽的不是烟,燃烧的是寂寞。”11个字,体现了品位,最后比如“做人勿装B,装B被雷劈”10个字,提前了对以上所有说法的否定,如果你想让你的演讲也能深入人心,那么一定要把主题弄在10个字里,并且让他们押韵,比如…
3.演讲常见悖论
演讲需要做大量准备,反复对这镜子练习,注意观察自己的口型和神态。
凡提供这一说法的都是上过MBA课,或者被外国人忽悠了,大体上国外进口的演讲入门书籍里都这么说,这种说法很适合受众固定,内容统一的演讲,也就是说,如果你长年累月就说着一套话,那么再最开始,你应该可以通过这样准备而获得比较好的提高。但是,实际上,多说情况下,这种准备对你的帮助有限,对演讲的内容最好的准备是,在演讲之前对稿子熟练,然后扩充各种相关内容,仔细分析各种相关书籍和文章,尽量在演讲的时候说听众没想到或者没听说过的。这比口型神态什么的管用的多。
演讲需要口齿清楚,逻辑流畅,这样才能打动人。
有兴趣的人可以参加一下安利的讲座,或者跟保险推销员以及任何直销销售人员聊天,如果您有机会现场听学校辅导员老师讲课,则您更会理解我说的内容。这里就不多谈了。
演讲只是交流的手段,演讲的目的是为了交流,激荡出智力的火花。
这跟两个已经势同水火的平级领导在年会上频频碰杯,并高呼“我们是一个Team”,或者一对早就貌合神离却总在媒体前如胶似漆,还说“我们一直很恩爱”的演员伉俪一样。这种说法源于虚伪,其实更像那些想骗你钱的打电话给你推销东西的人说的一样,“我们都是为你好。”
以上是我关于演讲能想起来的大部分细节,最后还有一句老话,卖油的大爷说的“无他,手熟尔。”勤学苦练总是一个亘古不变的好方法。
下面说说题外话,面试的紧张。
任何人面试都紧张,因为要被质问,谁都不喜欢被质问,另外就是心里很想得到这个工作很怕失去这个机会,其实站在人生这个长度看问题,面试连小插曲都算不上,顶多算打一个喷嚏,既不新鲜也不有趣。任何机会如果被标上“一旦错过,永不可能”,则应该坦然让这机会走开,因为谁也不能妄论别人的生死乃至前程,世界充满未知和不确定,一份工作的得失其实微不足道,人,无论伟大或者渺小,最后都是一个终极目标,所以在这过程中尽力耍宝就好,压根用不着为了别人的评价烦恼。
看见好多人都说困难,家里困难,工作困难,等等逐日此类不一而足,我也随便说两句,我得看法,怎么解决外部环境问题,战天斗地这些我不想说了,我就想说说自己怎么调整心态吧。
其实调整心态挺简单的,就四个字,人生如戏。
人生如戏何解呢,也很简单,就是把你现在所发生的事都当一处话剧,你,你爸爸,你妈妈,你同事,你朋友,你领导,你下属,你老婆,你情人,其实都是演员,大伙兴冲冲的你方唱罢我登场,其实都是演戏,没人跟你来真的,也没有真的。你也就演这几十年,演好演坏无所谓,反正最后都是眼一闭腿一蹬,所以得想开。
当然这话说着容易做着难。首先是得知道自己演的什么角色,您在外面威风八面,回家都得演孝子贤孙,中国人讲究这个。所以记得跟你爸爸妈妈说话的时候要当孝子贤孙,所谓孝是孝敬,尊敬的程度多一点。不是孝顺,没有顺从的必要。你一完全行为能力责任人,你干什么都可以自己负责,压根不用你爸爸妈妈操心。为了避免老有人说看不懂,我再说透亮点。你爸你妈说什么,就答应什么,回头一扭脸,你演别的角色了,就完全不用管答应过他们什么了,因为那是俩角色,不能混着来,你爸你妈苦口婆心跟你说,也是他们的责任,他们作为老演员演了几十年,眼看到最后一班岗了,非得站的敬业一点才好。敬着他们,就是说什么都答应,不顺着他们,就是只捡自己觉得好的做。
角色一时一变,语言、行动也得跟着变。上班的时候你是个积极的程序员,跟你女朋友在一起的时候你就是好男朋友、好老公,这俩角色不交叉,台词也不能混着来,不信你跟你同事聊韩剧,跟女朋友聊.NET,你肯定得倒霉。好多人犯拧巴,非得一天到晚一个腔调,这就是所谓没事找抽型,活该别人不给你好脸色。
跟女朋友打完电话,你又摇身一变成积极青年了,大半夜不睡觉,你得学习新技术,这时候问你女朋友叫什么,你都不用搭理他,因为你这会不演这个角色,这个角色的台词你就不需要记得。
大部分的角色其实都挺好找的,人家一叫你,你一答应就全找到了。人家叫你儿子,你就知道你演儿子呢,人家叫你孙子,你就知道你演孙子呢,人家叫你老公,你就知道你演老公呢,人家叫你SB,你就知道,你演SB呢。前三种都知道怎么演,就最后一种好多人拿不住,人家一叫他这个他就不知道怎么办了,你想想看,一个SB没思考能力,能怎么办?这事稍微一过脑子就能明白,低等动物受到攻击怎么办,脊椎反射都知道,挨骂就骂回去挨打就打回去,不用担心什么礼貌一类,因为你在演一个SB。
诸如此类,社会角色也定义了,演也演了,好多人不满意,非要当角儿,要跟一帮演员里拔得头筹,觉得不这样不算混这一场演出。要我说这事没必要,大伙都是演这一阵,谁知道谁什么时候就下场了。为这点电光石火之间的事争长短,犯不上。
最后就是演着演着好多人谢幕了,有些老演员匆匆忙忙就谢幕了,有些提前还假装不舒服,让演医生的出来串串场,有些则干脆不打招呼就溜号了,这时候你也别太难过,这不是没有戏德的表现,实在是老演员太辛苦了,演了那么长时间,需要休息,你也别难过,没准哪天就在街上碰见了,虽然彼此都装着不认识,但是心里还是认识的。我小时候就这么想,所以姥姥姥爷走了以后不怎么难过,今天我劝大家都这么想,也许就少难过一点。(要依着我自己写,这句话就不加,但又怕说看不懂)
对于女朋友,人家漂亮姑娘肯定得赶场,档期实在排不开就不能陪你演着一阵你也更不用难过,人家跟谁不是演这一阵子啊,换句话说,你不是得找那个能跟你演一辈子的吗,所以别着急。别犯牛劲。
然后就是事业不顺,那就更看得开了。韩信跟漂母讨饭,秦琼卖马,赵匡胤跟街上摆象棋摊,哪个大人物不是从挫折戏演起的,换句话说,没有挫折戏这一出,哪能体现后面飞黄腾达的刺激呢,所以演这出戏是必由之路,一旦导演给您派了这出戏,您应该高兴,那是您要飞黄腾达的了,这会忍住以后就能吃香的喝辣的。
况且导演哪能真把您逼得绝路上,前面肯定给您安排了峰回路转的情节,无论如何都得静观其变,中途罢演那就没劲了。
最后就是希望大家都好,别管有钱没有,有吃的没有,总把这一切都当成一出戏,有演的有看的,就能乐在其中,其乐融融了。
android多线程下载详解 摘要: [转载:] http://www.ideasandroid.com/?p=328 本文将介绍在android平台下如何实现多线程下载,大家都知道,android平台使用java做为开发语言,所以java中支持的多线程下载方式在android平台下都支持,其中主要有两种方式可以实现多线程下载。 一种方式是使用很多个线程分别下载文件的不同部分,最后把所有下载完的文件合并成一个文... 阅读全文
样式是用于描述一个View或是一个窗口的显示属性的集合,样式可以指定如高度,填充,字体颜色,字体大小,背景颜色等属性。样式是从布局文件中分离出来的一个XML资源文件。Android中的样式就像Web开发中的css样式表,它使用我们的样式独立于内容进行设计开发。
例如,通过使用一个样式可以让如下的布局文件
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:typeface="monospace" android:text="@string/hello" />
<TextView style="@style/CodeFont" android:text="@string/hello" />
所有和样式有关的属性都被从布局XML文件中移动到一个叫“CodeFont”的样式定义中,然后使用一个style属性指定样式名称。你将会在以下的内容中看到如何定义一个样式。
应用于一个Activity或应用程序的样式称为主题(theme),而不是刚才说的一个View。所有在当前Activity或应用下的视图(VIEW)都会应用相同的主题样式。例如,您可以让一个Activity使用”CodeFont”主题,那么这个Activity下的所有视图的的文本都将是绿色等宽字体。
定义样式我们需要在 res/values/目录下新建一个XML文件,文件名自已随便命名,但必须以.xml为文件后缀。Xml的根节点必须为
我们用style标签来定义一个样式,用
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources>
Style标签的name属性是必须有的,
样式的继承
这里有两种方式可以实现样式继承,如上例中所示的,我们可以在定义样式时使用parent属性来继承样式,使用这种方式,我们可以继承一个我们自己定义好的样式,也可以继承一个android平台自带的样式(后文中会介绍android平台自带的所有样式)。如下所示,我们继承一个android平台默认的文本样式,并把它的字体颜色改为我们需要的颜色。
<style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style>
另一种继承的方式是使用用户自定义的样式作为前缀即可。这种方式只适用于继承用户自定义样式。如下所示:
<style name="CodeFont.Red"> <item name="android:textColor">#FF0000</item> </style>
这样,新定义的样式就会继承CodeFont样式的所有属性,然后把字体颜色变为#FF0000。我们可以这样引用新的样式: @style/CodeFont.Red
相同的方法,我们可以再继承下去,如下所示:
<style name="CodeFont.Red.Big"> <item name="android:textSize">30sp</item> </style>
这样新的样式文子的大小就和CodeFont.Red样式不同了。
到这里为止,你已经知道了如何定义一个样式,你还需要知道有多少种样式属性可以通过
最好的方法查询一个视图支持哪些样式属性的方法是查询视图类的文档中XML Attributes表格,如TextView的XML attributes如链接中所示: http://www.ideasandroid.com/android/sdk/docs/reference/android/widget/TextView.html#lattrs
如需所有可用的样式属性的,请参阅R.attr: http://www.ideasandroid.com/android/sdk/docs/reference/android/R.attr.html
不是所有的视图都支持上面的样式属性,如果遇到不支持的样式属性,您定义的属性将会被忽略。
应用样式和主题
应用样式和主题的方法很简单,在布局定义文件(layout)中,使用style属性直接引用样式资源,如下所示:
<TextView style="@style/CodeFont" android:text ="@string/hello" />
在AndroidManifest.xml文件中可以引用样式主题,可以为一个Activity定义一个主题,也可以为整个应用程序定义一个主题,如下所示:
<application android:theme="@style/CustomTheme">
<activity android:theme="@style/CustomDialogTheme">
Android平台的样式和主题
样式见:http://www.ideasandroid.com/android/sdk/styles.xml
主题见:http://www.ideasandroid.com/android/sdk/themes.xml
ListView的Adapter的作用如下图所示:
Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源?
先看看下面的代码:
public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item_icon_text, null); ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return item;怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!
我们再来看看下面的代码:
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item, null); ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return convertView;怎么样,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。
还有没有优化的方法呢? 答案是肯定的:
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = ( ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; static class ViewHolder { TextView text; ImageView icon;怎么样?会不会又给您的系统带来很大的提升呢?看看下面三种方式的性能对比图您就知道了!
本文是Google I/O 2009 Romain Guy 所讲的内容,这里只做简单介绍,相信一看代码就能看懂!有问题请留言!
Android系统搜索对话框(浮动搜索框)的使用 摘要: 当您需要在您的应用程序中提供搜索服务时,您第一个想到的是您的搜索框要放哪呢?通过使用Android的搜索框架,应用程序将显示一个自定义搜索对话框来处理用户的搜索请求。通过一个简单的搜索按钮或从您的应用程序中调用API,搜索对话框就会显示在屏幕的顶部,并会自动显示您的应用程序图标。如下图所示: 本文将教你如何为你的应用程序提供一个自定义搜索对话框。这样做,给您的用户提供一个标准化的搜索体验,并... 阅读全文Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开源项 目,贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用:
1.Android团队提供的示例项目
如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。
地址:http://code.google.com/p/apps-for-android/2.Remote Droid
RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。
地址:http://code.google.com/p/remotedroid/3.TorProxy和Shadow
TorProxy应用实现了Android手机无线电电传通讯(TOR),和Shadow应用一起使用,可以使用手机匿名上网。从该项目源代码中,可以 掌握socket连接、管理cookie等方法。
地址:http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/
http://www.cl.cam.ac.uk/research/dtg/android/tor/4、 Android SMSPopup
SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。
地址:http://code.google.com/p/android-smspopup/5、 Standup Timer
是.com的一个客户端应用,该应用主要分为两个模块API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中,可以学会如何同步、多线程、HTTP连接等技术。
Standup Timer应用用于控制站立会议时间,类似秒表倒计时,可以提醒每个人的讲话时间已到,从而保证每个与会者使用时间一样。从该项目的代码中,可以学会如何 使用时间函数。另外,这个项目的代码是采用视图view、模型model严格分离的设计思路。
地址:http://github.com/jwood/standup-timer
地址:http://code.google.com/p/foursquared/
7、 Pedometer
Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服 务等。
地址:http://code.google.com/p/pedometer/8、 OpenSudoku-android
OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据,以及如何和一个网站交互等技术。
地址:http://code.google.com/p/opensudoku-android/9、 ConnectBot
ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用 时经常需要考虑的安全问题。
地址:http://code.google.com/p/connectbot/10、 WordPress的Android应用
当然在最后不能不提WordPress的Android应用了,这是WordPress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调 用(当然还有更多的优秀内容)。
地址:http://android.svn.wordpress.org/trunk/1 Bugzilla简介
2 安装Step by Step
1.1 产生
Bugzilla是一个共享的免费的产品缺陷记录及跟踪工具。由Mozilla公司提供。创始人是Terry Weissman,开始时使用一种名为“TCL”的语言创建的,后用Perl语言实现,并作为Open source发布。
1.2 特点
Bugzilla能够为你建立一个完善的bug跟踪体系,包括报告bug、查询bug记录并产生报表、处理解决bug、管理员系统初始化和设置四部分。Bugzilla具有如下特点:
1.基于Web方式,安装简单、运行方便快捷、管理安全。
2.有利于缺陷的清楚传达。本系统使用数据库进行管理,提供全面详尽的报告输入项,产生标准化的bug报告。 提供大量的分析选项和强大的查询匹配能力,能根据各种条件组合进行bug统计。当缺陷在它的生命周期中变化时,开发人员、测试人员、及管理人员将及时获得 动态的变化信息,允许你获取历史记录,并在检查缺陷的状态时参考这一记录。
3.系统灵活,强大的可配置能力。Bugzilla工具可以对软件产品设定不同的模块,并针对不同的模块设定开发人员和测试人员。这样可以实现提交报告时 自动发给指定的责任人,并可设定不同的小组,权限也可划分。设定不同的用户对bug记录的操作权限不同,可有效控制进行管理。允许设定不同的严重程度和优 先级。可以在缺陷的生命期中管理缺陷。从最初的报告到最后的解决,确保了缺陷不会被忽略。同时可以使注意力集中在优先级和严重程度高的缺陷上。
4.自动发送Email,通知相关人员。根据设定的不同责任人,自动发送最新的动态信息,有效的帮助测试人员和开发人员进行沟通。
Bugzilla是一个基于WEB的缺陷管理系统。前台用 Perl语言实现,后台使用MySQL数据库。因为Bugzilla除了通过WEB来跟踪处理bug外,还同时通过Email来跟踪bug的处理过程。如 果不通过Email来跟踪bug的话,Email电子邮件系统并不是必要的。但是,如果要正常运行Bugzilla,必须设置一个smtp邮件发送服务 器。
安装Bugzilla需要MySQL、Perl等等配套软件。为了简化Bugzilla的安装过程,让大家少走弯路,我们把Bugzilla及其配套软件的安装包都整合到一个目录Bugzilla-2.20.1下,并以Step by Step的方式介绍安装及配置过程:
Bugzilla-2.20.1
01.mysql
02.perl
03.bugzilla
04.ReadMe
我刚刚入手UNIX系统学习,学着安装配置Bugzilla。被不少的问题折腾着浪费不少时间,查了不少资料,最终还是圆满成功了。在这作个总结,希望这篇博文能帮助初学者。欢迎各位朋友共同探讨学习。linux设备模型深探(1 摘要: linux设备模型深探(1) 2009-06-05 15:37 分类:LinuxDriver 字号: 大大 中中 小小 转自:http://blog.chinaunix.net/u1/51562/showart_1077877.html ------------------------------------------ 本文系本站原创,... 阅读全文
emial:zongguo.zhang@gmail.com
欢迎转载,请注明出处。
bugzilla安装工具 apache2+mysql5.1+perl+bugzilla3.2.2
Step by step
1.安装apache2
Ubuntu就可以直接用命令行可以安装 #sudo apt-get install apache2 系统自动安好,打开浏览器在地址栏输入http://ip (你的ip地址或者127.0.0.1)就会在 页面上出现 “ It works”则表明apache安装成功。
出了问题的话,进入/etc/apache2 目录下 用#vi httpd.conf打开文件添加ServerName 127.0.0.1:80即可.
2.安装mysql
用命令#sudo apt-get install mysql-server 系统自动安装,我装的是mysql5.1.
安装时要输入密码这是进入root的密码(建议用你ubuntu系统密码),(mysql -uroot -p密码),然后用上述命令行来登录,登录成功显示版本信息和 mysql> ,OK!
mysql 服务启动/停止/重启命令#service mysql start/stop/restart.
3.安装Bugzilla
bugzilla到官网去下载(一般为tar.gz包),这个不用我说了吧!不懂google一下,然后cd到下载目录解压包#tar -xzf bugzilla.xx.xx.tar.gz ,再改名#mv bugzilla.xx.xx bugzilla ,再移动到/var/www下面#mv bugzilla /var/www 完毕~~~~ok!
4.安装perl
先进入到bugzilla目录#cd /var/www/bugzilla,在命令行输入#./checksetup.pl命令检查一下还有哪些perl模块没有安装,因为在系统自动安转apache和mysql时就已安装一部分,
Checking perl modules...
Checking for CGI.pm (v3.33) ok: found v3.49
Checking for TimeDate (v2.21) ok: found v2.24
Checking for PathTools (v0.84) ok: found v3.31
Checking for DBI (v1.41) ok: found v1.611
Checking for Template-Toolkit (v2.15) ok: found v2.22
Checking for Email-Send (v2.00) ok: found v2.198
Checking for Email-MIME (v1.861) ok: found v1.903
Checking for Email-MIME-Modifier (v1.442) ok: found v1.903
Checking available perl DBD modules...
Checking for DBD-Pg (v1.45) not found
Checking for DBD-mysql (v4.00) ok: found v4.012
Checking for DBD-Oracle (v1.19) not found
第一组要全装,第二组就看你装的什么数据库了,这里装的是mysql就选DBD-mysql,not found表示没有安装,用下面提的COMMANDS TO INSTALL:需要什么就复制粘贴就可安装好。
到这里Buglilla所需要的组件全安装完毕,第一篇OK!
1.apache2配置
A.修改 apache 的配置文件apache2.conf:进入/etc/www/apache2目录下面 vi /apache2.conf 找到ServerRoot,修改ServerRoot 为bugzilla所在的目录“/var/www”,即如下:(注释原来的添加修改)
#ServerRoot "/etc/apache2"
ServerRoot "/var/www"
B.修改apache的配置文件apache2.conf: 设置 apache访问bugzilla的用户及用户组,本安装中将用户及用户组都设置为www-data:如下:
#User ${APACHE_RUN_USER}
#Group ${APACHE_RUN_GROUP}
User www-data
Group www-data
C.修改apache的配置文件apache2.conf:添加bugzilla所在目录:即在apache.conf文件末添加如下
Alias /bug/ "/var/www/bugzilla"
<Directory "/var/www/bugzilla">
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI +FollowSymLinks
DirectoryIndex index.cgi
AllowOverride None
Order allow,deny
Allow from all
</Directory>
D: 修改 www-data对bugzilla的访问权限
chown -R www-data:www-data /var/www/bugzilla
最后,重启apache2服务 #/etc/init.d/apache2 restart ~~~~~OK!
2.mysql配置
用#mysql -uroot -p密码 登录mysql 。
首先,创建数据库bugs mysql> create database bugs;
其次,创建用户bugs mysql> use mysql;
再次,授权 mysql> GRANT SELECT, INSERT,UPDATE, DELETE, INDEX, ALTER, CREATE, LOCK TABLES,CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.*TO bugs@localhost IDENTIFIED BY '前面root密码';
最后,mysql> FLUSH PRIVILEGES;
退出mysql:mysql>exit或quit
注:mysql命令以(;)结束,不区分大小写。
3.Bugzilla配置
先#cd /var/www/bugzilla 运行bugzilla目录下的checksetup.pl (#.checksetup.pl)自动生成loacalconfig文件(原本bugzilla目录里没有),打开文件localconfig(#vi localconfig),配置如下:
$webservergroup = 'www-data';
$db_driver = 'mysql';
$db_host = 'localhost';
$db_name = 'bugs';
$db_user = 'bugs';
$db_pass = '密码'; 注意:为了防止出错,建议所有密码都设置为ubuntu系统密码。
其它不变。
现的配置文件都设置完成,重启apache2 #/etc/init.d/apache2 restart
重启mysql #service mysql restart
重新运行checksetuo.pl #./checksetup.pl
结果会出现如下错误:
SESSION variable 'max_allowed_packet' is read only. Use SET GLOBAL to assign
the value上面错误的原因是bugzilla3.3.2对mysql5.1及以上新版本的兼容性不好。需要修改几处源码文件Bugzilla/Config/Attachment.pm和Bugzilla/Config/Common.pm等,地址:https://bug480001.bugzilla.mozilla.org/attachment.cgi?id=364818其中(-)表示删除(+)表示添加。
bugzilla的预编译和生成相应的配置信息等,如下提示:
Precompiling templates...done.
Fixing file permissions...
Initializing "Dependency Tree Changes" email_setting ...
Marking closed bug statuses as such...
Now filling the 'status_workflow' table with valid bug status transitions...
Adding foreign key: attachments.submitter_id -> profiles.userid...
Adding foreign key: bugs_activity.who -> profiles.userid...
Adding foreign key: bugs_fulltext.bug_id -> bugs.bug_id...
并且会提示输入以下信息:
Enter the e-mail address of the administrator: test@uestc.edu.cn
Enter the real name of the administrator: 用户名
Enter a password for the administrator account: password
Please retype the password to verify: password
根据以上提示输入bugzilla管理员的相关信息
成功后,在浏览器输入:http://127.0.0.1/bugzilla会出现bugzilla的管理主页面
Bugzilla网上有很多使用文档,我就不再细述。主要想说一下bugzilla发不出去邮件的问题。
配置smtp。
登录后点击administrator进行参数设置,点击parameter进入,再点击email设置。
mail_delivery_method : smtp
mailfrom : 设置成我的真实邮箱 例 me@163.com 可能有的mail server会验证邮箱的真实性以及是否属于该mail server
sendmailnow : on
smtpserver : 设置成smtp authentication服务器 例smtp.163.com
smtp_username : 我的邮箱 例 me@163.com
smtp_password : 密码
注意后两个parameters(选项)是2.22.1 debian所没有的。
但是接下来我在测试发送邮件的时候总是报
“The new value for smtp_username is invalid: Error requiring
Authen::SASL: ‘Can’t locate Authen/SASL.pm in @INC (@INC contains: .
lib c:/perl/site/lib c:/perl/lib) at (eval 84) line 3. ‘.”
这个错误要求我们安装Authen::SASL 可以回到checksetup.pl处按照提示安装,但是我在这里却出现了问题。
由于之前已经将bugzilla3.2.2文件夹的访问权限设置给了www-data组,现在无法进入到bugzilla3.2.2文件夹内执行任何操作,总报permissions access采用 sudo –s –H 并输入密码,可以以root权限进入该文件夹操作,安装好Authen::SASL后,发送邮件功能ok。
这些道理不懂,你注定就是穷打工的命 摘要: 这些道理不懂,你注定就是穷打工的命 http://kb.cnblogs.com/page/57888/ 首先声明:如果你是“愤青”或“类愤青”,对不起,请放下此书,因为文中的观点可能会伤害你的心灵(不是对“愤青”有偏见,而是“愤青”们多数都是“纯洁”得不识人间烟火... 阅读全文 Ubuntu 6.06/7.04 安装bugzilla 摘要: Ubuntu 6.06/7.04 安装bugzilla 弄了好久才安装成功,记下来备忘! 1.安装mysql sudo apt-get install mysql-server mysql -uroot create database bugzilla; 2.安装apache2 sudo apt-get in... 阅读全文下载最新版本subversion,我这里选择svn-1.4.6-setup.exe 下载 "Subversion Windows Service" 软件包 (XP以上都不需要) 下载 TortoiseSVN 下载 2.安装Subversion 服务器
由于我下载的是setup.exe版本,安装程序安装后会自动设置系统变量.如果你下载的是zip版就需要手动设置系统变量.
setup.exe版直接安装就可以了.安装到D:\Program Files\Subversion首先创建SVN储存库(repository)
svnadmin create F:\lava\svn\ 【注】创建仓库的方法也可以使用TortoiseSVN,在目的文件夹上右键->Create Repositoryrepository创建完毕后会在目录下生成若干个文件和文件夹,dav目录是提供给Apache与mod_dav_svn使用的目录,让它们存储内部数据;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号;
3.配置SVN服务器
打开svn目录中配置文件conf\svnserve.conf,修改配置参数。
例:d:\svnhome\conf\svnserve.conf去掉以下内容之前的注释符#
[general]
anon-access = none
auth-access = write
password-db = passwd
realm = My First Repositoryanon-access = none
--不允许匿名访问!这个很重要,不然谁都能访问这个代码仓库了。
auth-access = write
-- 允许提交修改
password-db = passwd
--密码文件名字
【注】如果需要控制访问的用户身份,则:
# [general]
# password-db = passwd
去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
同样打开passwd文件,将
# [users]
# harry = harryssecret
# sally = sallyssecret
这几行的开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:admin = admin888,即为系统添加一个用户名为admin,密码为admin888的用户
4.运行SVN服务器
运行SVN服务
svnserve --daemon --root F:\lava\svn
在命令行执行服务启动,--daemon可简写为-d,--root可简写为-r,可以建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务,或者在这个地址http://clanlib.org/~mbn/svnservice/下载那个svnservice.exe文件,拷贝到E:\svn\bin目录下,再从命令行下执行:
svnservice -install --daemon --root "E:\svn\Repository"
sc config svnservice start= auto
net start svnservice5、添加为系统服务 方法1(推荐):
在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 Server)本身包含了一个安装服务的工具,叫做"Service Control",也就是sc.exe。
1.安装为服务:
例:我的Subversion安装在"D:\program files\Subversion",版本库在"D:\svn_root",而我希望对应的Subversion服务名为svnservice,安装这个svn服务的命令就可以这样写:
sc create svnservice
binpath= "D:\ Program Files\Subversion\bin\svnserve.exe --service -r D:\svn_root"
displayname= "SVNService"
depend= Tcpip
请注意,因为便于察看,上面的命令分为多行,但在实际执行时应该在一行里。另外,在以前启动svnserve时会使用"-d"选项,也就是守护进程模式,在这里不能使用,会导致服务无法启动。同样,"-i"和"-t"选项也不能使用。
另外还有两点需要小心处理。首先,如果路径中包括空格,一定要用“\”处理“"”号,例如上面的例子中如果svnserve.exe在“c:\ program files\subversion\”中,则命令应该写为“binpath= "\"c:\program files\subversion\bin\svnserve.exe\"”(“”中的内容),整个命令如下,红色部分是改变部分:
sc create svnservice
binpath= "\"D:\ Program Files\Subversion\bin\svnserve.exe\" --service -r D:\svnroot"
displayname= "SVNService"
depend= Tcpip
其次,sc对选项的格式还有要求,例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是“=”前不能有空各,而后面必须有空格。
2.启动服务
在命令行窗口执行完这个命令之后,服务还没有启动,你可以继续运行"net start svnservice"启动这个服务。
3.停止服务
然后使用"net stop svnservice"停止服务。
4.删除服务
如果服务安装的有问题,你可能需要删除服务。要删除前面添加的服务,只需要运行"sc delete svnservice","svnservice"就是我们创建服务时使用的名字。
5.配置服务是自动启动
默认情况下安装的服务不会随Windows的启动而启动,为了使svn服务能够随Windows启动而启动,需要修改一下"sc create"命令(首先要删除),增加"start= auto"选项:
sc create svnservice
binpath= "D:\ Program Files\Subversion\bin\svnserve.exe --service -r D:\svn_root"
displayname= "SVNService"
depend= Tcpip
start= auto
当然你也可以使用图形化的工具修改服务的属性,你可以在“开始->运行...”中执行"services.msc",然后在界面中修改。
建立一个批处理文件并放在windows启动组中便于开机就运行SVN服务。
这个地址http://clanlib.org/~mbn/svnservice/下载那个svnservice.exe文件,拷贝到E:\svn\bin目录下,再从命令行下执行:
svnservice --install --daemon --root "E:\svn\Repository"
sc config svnservice start= auto
net start svnservice
此文件会将SVN变成windows系统的一个服务,并默认为自启动,注意:执行第三句时确保前面以命令行方式运行的SVN服务已经停止,如果没停止可在其窗口中按Ctrl+C中止运行。
轻松搭建一个Windows SVN服务器
前文所述SVN客户端使用的时候,用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效的管理。这里我就介绍一个在Windows环境下简单快速搭建SVN服务器的方法。
通常的SVN服务器是搭建在Linux等系统下,例如用Apache+SVN配置,Linux下的SVN性能会非常好,但配置有些繁琐,如果SVN服务器只有自己使用,那么可以直接把SVN服务器搭建在个人Windows环境下使用。
目前较为简单的方案是VisualSVN Server。该SVN服务器是免费的,支持Windows NT, 2000, XP and 2003等环境,安装非常简单。
安装的时候可以选择SVN走http协议还是https协议,http协议速度快一些,而https协议安全性好。两者均可以从浏览器直接访问SVN项目。
安装完成后打开,可以看到一个微软的MMS管理界面,在里面可以轻松添加设置项目。用户权限可以使用Windows的用户,也可以单独新建用户。如果原先有一个SVN数据,则可以在界面上导入原有的SVN数据。
SVN客户端依旧推荐使用Windows下的TortoiseSVN,两者搭配起来,非常好用。
1. 关键数据结构PCI 设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负责对所有PCI设备进行初始化,配置好所有的PCI设备,包括中断号以及I/O基址,并在文件/proc/pci中列出所有找到的PCI设备,以及这些设备的参数和属性。
Linux驱动程序通常使用结构(struct)来表示一种设备,而结构体中的变量则代表某一具体设备,该变量存放了与该设备相关的所有信息。好的驱动程序都应该能驱动多个同种设备,每个设备之间用次设备号进行区分,如果采用结构数据来代表所有能由该驱动程序驱动的设备,那么就可以简单地使用数组下标来表示次设备号。
在PCI驱动程序中,下面几个关键数据结构起着非常核心的作用:
pci_driver
这个数据结构在文件include/linux/pci.h里,这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的,其中最主要的是用于识别设备的id_table结构,以及用于检测设备的函数probe( )和卸载设备的函数remove( ):
struct pci_driver {
struct list_head node;
char *name;
const struct pci_device_id *id_table;
int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);
void (*remove) (struct pci_dev *dev);
int (*save_state) (struct pci_dev *dev, u32 state);
int (*suspend)(struct pci_dev *dev, u32 state);
int (*resume) (struct pci_dev *dev);
int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);
pci_dev这个数据结构也在文件include/linux/pci.h里,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等:
struct pci_dev {
struct list_head global_list;
struct list_head bus_list;
struct pci_bus *bus;
struct pci_bus *subordinate;void *sysdata;
struct proc_dir_entry *procent;unsigned int devfn;
unsigned short vendor;
unsigned short device;
unsigned short subsystem_vendor;
unsigned short subsystem_device;
unsigned int class;
u8 hdr_type;
u8 rom_base_reg;struct pci_driver *driver;
void *driver_data;
u64 dma_mask;
u32 current_state;unsigned short vendor_compatible[DEVICE_COUNT_COMPATIBLE];
unsigned short device_compatible[DEVICE_COUNT_COMPATIBLE];unsigned int irq;
struct resource resource[DEVICE_COUNT_RESOURCE];
struct resource dma_resource[DEVICE_COUNT_DMA];
struct resource irq_resource[DEVICE_COUNT_IRQ];char name[80];
char slot_name[8];
int active;
int ro;
unsigned short regs;int (*prepare)(struct pci_dev *dev);
int (*activate)(struct pci_dev *dev);
int (*deactivate)(struct pci_dev *dev);
2. 基本框架在用模块方式实现PCI设备驱动程序时,通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块。下面给出一个典型的PCI设备驱动程序的基本框架,从中不难体会到这几个关键模块是如何组织起来的。
/* 指明该驱动程序适用于哪一些PCI设备 */
static struct pci_device_id demo_pci_tbl [] __initdata = {
{PCI_VENDOR_ID_DEMO, PCI_DEVICE_ID_DEMO,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEMO},
/* 对特定PCI设备进行描述的数据结构 */
struct demo_card {
unsigned int magic;/* 使用链表保存所有同类的PCI设备 */
struct demo_card *next;/* ... */
/* 中断处理模块 */
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
/* ... */
/* 设备文件操作接口 */
static struct file_operations demo_fops = {
owner: THIS_MODULE, /* demo_fops所属的设备模块 */
read: demo_read, /* 读设备操作*/
write: demo_write, /* 写设备操作*/
ioctl: demo_ioctl, /* 控制设备操作*/
mmap: demo_mmap, /* 内存重映射操作*/
open: demo_open, /* 打开设备操作*/
release: demo_release /* 释放设备操作*/
/* ... */
/* 设备模块信息 */
static struct pci_driver demo_pci_driver = {
name: demo_MODULE_NAME, /* 设备模块名称 */
id_table: demo_pci_tbl, /* 能够驱动的设备列表 */
probe: demo_probe, /* 查找并初始化设备 */
remove: demo_remove /* 卸载设备模块 */
/* ... */
static int __init demo_init_module (void)
/* ... */
static void __exit demo_cleanup_module (void)
pci_unregister_driver(&demo_pci_driver);
/* 加载驱动程序模块入口 */
module_init(demo_init_module);/* 卸载驱动程序模块入口 */
上面这段代码给出了一个典型的PCI设备驱动程序的框架,是一种相对固定的模式。需要注意的是,同加载和卸载模块相关的函数或数据结构都要在前面加上 __init、__exit等标志符,以使同普通函数区分开来。构造出这样一个框架之后,接下去的工作就是如何完成框架内的各个功能模块了。
module_exit(demo_cleanup_module);
3. 初始化设备模块
在Linux系统下,想要完成对一个PCI设备的初始化,需要完成以下工作:
* 检查PCI总线是否被Linux内核支持;
* 检查设备是否插在总线插槽上,如果在的话则保存它所占用的插槽的位置等信息。
* 读出配置头中的信息提供给驱动程序使用。当Linux内核启动并完成对所有PCI设备进行扫描、登录和分配资源等初始化操作的同时,会建立起系统中所有PCI设备的拓扑结构,此后当PCI驱动程序需要对设备进行初始化时,一般都会调用如下的代码:
static int __init demo_init_module (void)
/* 检查系统是否支持PCI总线 */
if (!pci_present())
return -ENODEV;/* 注册硬件驱动程序 */
if (!pci_register_driver(&demo_pci_driver)) {
pci_unregister_driver(&demo_pci_driver);
return -ENODEV;
return 0;
驱动程序首先调用函数pci_present( )检查PCI总线是否已经被Linux内核支持,如果系统支持PCI总线结构,这个函数的返回值为0,如果驱动程序在调用这个函数时得到了一个非0的返回值,那么驱动程序就必须得中止自己的任务了。在2.4以前的内核中,需要手工调用pci_find_device( )函数来查找PCI设备,但在2.4以后更好的办法是调用pci_register_driver( )函数来注册PCI设备的驱动程序,此时需要提供一个pci_driver结构,在该结构中给出的probe探测例程将负责完成对硬件的检测工作。static int __init demo_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
struct demo_card *card;/* 启动PCI设备 */
if (pci_enable_device(pci_dev))
return -EIO;/* 设备DMA标识 */
if (pci_set_dma_mask(pci_dev, DEMO_DMA_MASK)) {
return -ENODEV;
/* 在内核空间中动态申请内存 */
if ((card = kmalloc(sizeof(struct demo_card), GFP_KERNEL)) == NULL) {
printk(KERN_ERR "pci_demo: out of memory\n");
return -ENOMEM;
memset(card, 0, sizeof(*card));/* 读取PCI配置信息 */
card->iobase = pci_resource_start (pci_dev, 1);
card->pci_dev = pci_dev;
card->pci_id = pci_id->device;
card->irq = pci_dev->irq;
card->next = devs;
card->magic = DEMO_CARD_MAGIC;/* 设置成总线主DMA模式 */
pci_set_master(pci_dev);/* 申请I/O资源 */
request_region(card->iobase, 64, card_names[pci_id->driver_data]);return 0;
4. 打开设备模块在这个模块里主要实现申请中断、检查读写模式以及申请对设备的控制权等。在申请控制权的时候,非阻塞方式遇忙返回,否则进程主动接受调度,进入睡眠状态,等待其它进程释放对设备的控制权。
static int demo_open(struct inode *inode, struct file *file)
/* 申请中断,注册中断处理程序 */
request_irq(card->irq, &demo_interrupt, SA_SHIRQ,
card_names[pci_id->driver_data], card)) {/* 检查读写模式 */
if(file->f_mode & FMODE_READ) {
/* ... */
if(file->f_mode & FMODE_WRITE) {/* 申请对设备的控制权 */
down(&card->open_sem);
while(card->open_mode & file->f_mode) {
if (file->f_flags & O_NONBLOCK) {
/* NONBLOCK模式,返回-EBUSY */
up(&card->open_sem);
return -EBUSY;
} else {
/* 等待调度,获得控制权 */
card->open_mode |= f_mode & (FMODE_READ | FMODE_WRITE);
up(&card->open_sem);/* 设备打开计数增1 */
MOD_INC_USE_COUNT;5. 数据读写和控制信息模块
PCI设备驱动程序可以通过demo_fops 结构中的函数demo_ioctl( ),向应用程序提供对硬件进行控制的接口。例如,通过它可以从I/O寄存器里读取一个数据,并传送到用户空间里:
static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
switch(cmd) {
6. 中断处理模块
case DEMO_RDATA:
/* 从I/O端口读取4字节的数据 */
val = inl(card->iobae + 0x10);
/* 将读取的数据传输到用户空间 */
return 0;
事实上,在demo_fops里还可以实现诸如demo_read( )、demo_mmap( )等操作,Linux内核源码中的driver目录里提供了许多设备驱动程序的源代码,找那里可以找到类似的例子。在对资源的访问方式上,除了有I/O指令以外,还有对外设I/O内存的访问。对这些内存的操作一方面可以通过把I/O内存重新映射后作为普通内存进行操作,另一方面也可以通过总线主DMA (Bus Master DMA)的方式让设备把数据通过DMA传送到系统内存中。
PC的中断资源比较有限,只有0~15的中断号,因此大部分外部设备都是以共享的形式申请中断号的。当中断发生的时候,中断处理程序首先负责对中断进行识别,然后再做进一步的处理。
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct demo_card *card = (struct demo_card *)dev_id;
u32 status;spin_lock(&card->lock);
/* 识别中断 */
status = inl(card->iobase + GLOB_STA);
if(!(status & INT_MASK))
spin_unlock(&card->lock);
return; /* not for us */
/* 告诉设备已经收到中断 */
outl(status & INT_MASK, card->iobase + GLOB_STA);
spin_unlock(&card->lock);/* 其它进一步的处理,如更新DMA缓冲区指针等 */
7. 释放设备模块
释放设备模块主要负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好与打开设备模块相反:
static int demo_release(struct inode *inode, struct file *file)
/* 释放对设备的控制权 */
card->open_mode &= (FMODE_READ | FMODE_WRITE);/* 唤醒其它等待获取控制权的进程 */
wake_up(&card->open_wait);
up(&card->open_sem);/* 释放中断 */
free_irq(card->irq, card);/* 设备打开计数增1 */
MOD_DEC_USE_COUNT;8. 卸载设备模块
调用函数pci_unregister_driver( )从Linux内核中注销设备驱动程序本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mingjie_520/archive/2009/03/27/4029695.aspx
Linux下PCI设备驱动程序开发基本框架收藏
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算 机系统中应用最为广泛,并且最为通用的总线标准。Linux的内核能较好地支持PCI总线,本文以Intel 386体系结构为主,探讨了在Linux下开发PCI设备驱动程序的基本框架。一、PCI总线系统体系结构
PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准,它在目前的计算机系统中得到了非常广泛的应用。PCI提供了一组完整的总线接口规范,其 目的是描述如何将计算机系统中的外围设备以一种结构化和可控化的方式连接在一起,同时它还刻画了外围设备在连接时的电气特性和行为规约,并且详细定义了计 算机系统中的各个不同部件之间应该如何正确地进行交互。
无论是在基于Intel芯片的PC机中,或是在基于Alpha芯片的工作 站上,PCI毫无疑问都是目前使用最广泛的一种总线接口标准。同旧式的ISA总线不同,PCI将计算机系统中的总线子系统与存储子系统完全地分开,CPU 通过一块称为PCI桥(PCI-Bridge)的设备来完成同总线子系统的交互,如图1所示。
图1 PCI子系统的体系结构
由于使用了更高的时钟频率,因此PCI总线能够获得比ISA总线更好的整体性能。PCI总线的时钟频率一般在25MHz到33MHz范围内,有些甚至能 够达到66MHz或者133MHz,而在64位系统中则最高能达到266MHz。尽管目前PCI设备大多采用32位数据总线,但PCI规范中已经给出了 64位的扩展实现,从而使PCI总线能够更好地实现平台无关性,现在PCI总线已经能够用于IA-32、Alpha、PowerPC、SPARC64和 IA-64等体系结构中。
PCI总线具有三个非常显著的优点,使得它能够完成最终取代ISA总线这一历史使命:
在计算机和外设间传输数据时具有更好的性能;
能够尽量独立于具体的平台;
可以很方便地实现即插即用。
图2是一个典型的基于PCI总线的计算机系统逻辑示意图,系统的各个部分通过PCI总线和PCI-PCI桥连接在一起。从图中不难看出,CPU和RAM 需要通过PCI桥连接到PCI总线0(即主PCI总线),而具有PCI接口的显卡则可以直接连接到主PCI总线上。PCI-PCI桥是一个特殊的PCI设 备,它负责将PCI总线0和PCI总线1(即从PCI主线)连接在一起,通常PCI总线1称为PCI-PCI桥的下游(downstream),而PCI 总线0则称为PCI-PCI桥的上游(upstream)。图中连接到从PCI总线上的是SCSI卡和以太网卡。为了兼容旧的ISA总线标准,PCI总线 还可以通过PCI-ISA桥来连接ISA总线,从而能够支持以前的ISA设备。图中ISA总线上连接着一个多功能I/O控制器,用于控制键盘、鼠标和软 驱。
图2 PCI系统示意图
在此我只对PCI总线系统体系结构作了概括性介绍,如果读者想进一步了解,David A Rusling在The Linux Kernel(http://tldp.org/LDP/tlk/dd/pci.html)中对Linux的PCI子系统有比较详细的介绍。
二、Linux驱动程序框架
Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。
1. 字符设备和块设备
Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和 I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第 一个IDE硬盘使用/dev/hda表示。每个设备文件对应有两个设备号:一个是主设备号,标识该设备的种类,也标识了该设备所使用的驱动程序;另一个是 次设备号,标识使用同一设备驱动程序的不同硬件设备。设备文件的主设备号必须与设备驱动程序在登录该设备时申请的主设备号一致,否则用户进程将无法访问到 设备驱动程序。
在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读 写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用 户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际 的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。
所有已经注册(即已经加载了驱动程序)的硬件设备的主设备号可以从/proc/devices文件中得到。使用mknod命令可以创建指定类型的设备文件,同时为其分配相应的主设备号和次设备号。例如,下面的命令:
[root@gary root]# mknod /dev/lp0 c 6 0
将建立一个主设备号为6,次设备号为0的字符设备文件/dev/lp0。当应用程序对某个设备文件进行系统调用时,Linux内核会根据该设备文件的设备 类型和主设备号调用相应的驱动程序,并从用户态进入到核心态,再由驱动程序判断该设备的次设备号,最终完成对相应硬件的操作。
2. 设备驱动程序接口
Linux中的I/O子系统向内核中的其他部分提供了一个统一的标准设备接口,这是通过include/linux/fs.h中的数据结构file_operations来完成的:
struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);};
当应用程序对设备文件进行诸如open、close、read、write等操作时,Linux内核将通过file_operations结构访问驱动程 序提供的函数。例如,当应用程序对设备文件执行读操作时,内核将调用file_operations结构中的read函数。
3. 设备驱动程序模块
Linux下的设备驱动程序可以按照两种方式进行编译,一种是直接静态编译成内核的一部分,另一种则是编译成可以动态加载的模块。如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态地卸载,不利于调试,所有推荐使用模块方式。
从本质上来讲,模块也是内核的一部分,它不同于普通的应用程序,不能调用位于用户态下的C或者C++库函数,而只能调用Linux内核提供的函数,在/proc/ksyms中可以查看到内核提供的所有函数。
在以模块方式编写驱动程序时,要实现两个必不可少的函数init_module( )和cleanup_module( ),而且至少要包含和两 个头文件。在用gcc编译内核模块时,需要加上-DMODULE -D__KERNEL__ -DLINUX这几个参数,编译生成的模块(一般为.o文件)可以使用命令insmod载入Linux内核,从而成为内核的一个组成部分,此时内核会调用 模块中的函数init_module( )。当不需要该模块时,可以使用rmmod命令进行卸载,此进内核会调用模块中的函数cleanup_module( )。任何时候都可以使用命令来lsmod查看目前已经加载的模块以及正在使用该模块的用户数。
4. 设备驱动程序结构
了解设备驱动程序的基本结构(或者称为框架),对开发人员而言是非常重要的,Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。
驱动程序的注册与注销
向系统增加一个驱动程序意味着要赋予它一个主设备号,这可以通过在驱动程序的初始化过程中调用register_chrdev( )或者register_blkdev( )来完成。而在关闭字符设备或者块设备时,则需要通过调用unregister_chrdev( )或unregister_blkdev( )从内核中注销设备,同时释放占用的主设备号。
设备的打开与释放
打开设备是通过调用file_operations结构中的函数open( )来完成的,它是驱动程序用来为今后的操作完成初始化准备工作的。在大部分驱动程序中,open( )通常需要完成下列工作:
1.检查设备相关错误,如设备尚未准备好等。
2.如果是第一次打开,则初始化硬件设备。
3.识别次设备号,如果有必要则更新读写操作的当前位置指针f_ops。
4.分配和填写要放在file->private_data里的数据结构。
5.使用计数增1。
释放设备是通过调用file_operations结构中的函数release( )来完成的,这个设备方法有时也被称为close( ),它的作用正好与open( )相反,通常要完成下列工作:
1.使用计数减1。
2.释放在file->private_data中分配的内存。
3.如果使用计算为0,则关闭设备。
设备的读写操作
字符设备的读写操作相对比较简单,直接使用函数read( )和write( )就可以了。但如果是块设备的话,则需要调用函数block_read( )和block_write( )来进行数据读写,这两个函数将向设备请求表中增加读写请求,以便Linux内核可以对请求顺序进行优化。由于是对内存缓冲区而不是直接对设备进行操作 的,因此能很大程度上加快读写速度。如果内存缓冲区中没有所要读入的数据,或者需要执行写操作将数据写入设备,那么就要执行真正的数据传输,这是通过调用 数据结构blk_dev_struct中的函数request_fn( )来完成的。
设备的控制操作
除了读写操作外,应用程序有时还需要对设备进行控制,这可以通过设备驱动程序中的函数ioctl( )来完成。ioctl( )的用法与具体设备密切关联,因此需要根据设备的实际情况进行具体分析。
设备的中断和轮询处理
对于不支持中断的硬件设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。如果设备支持中断,则可以按中断方式进行操作。
三、PCI驱动程序实现
1. 关键数据结构
PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间和PCI的配置空间。CPU可以访问PCI设备上的所有地址空间,其中I/O空间和存 储空间提供给设备驱动程序使用,而配置空间则由Linux内核中的PCI初始化代码使用。内核在启动时负责对所有PCI设备进行初始化,配置好所有的 PCI设备,包括中断号以及I/O基址,并在文件/proc/pci中列出所有找到的PCI设备,以及这些设备的参数和属性。
Linux驱动程序通常使用结构(struct)来表示一种设备,而结构体中的变量则代表某一具体设备,该变量存放了与该设备相关的所有信息。好的驱动程 序都应该能驱动多个同种设备,每个设备之间用次设备号进行区分,如果采用结构数据来代表所有能由该驱动程序驱动的设备,那么就可以简单地使用数组下标来表 示次设备号。
在PCI驱动程序中,下面几个关键数据结构起着非常核心的作用:
pci_driver
这个数据结构在文件include/linux/pci.h里,这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的,其中最主要的是用于识别设备的id_table结构,以及用于检测设备的函数probe( )和卸载设备的函数remove( ):
struct pci_driver { struct list_head node; char *name; const struct pci_device_id *id_table; int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); void (*remove) (struct pci_dev *dev); int (*save_state) (struct pci_dev *dev, u32 state); int (*suspend)(struct pci_dev *dev, u32 state); int (*resume) (struct pci_dev *dev); int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);};
pci_dev
这个数据结构也在文件include/linux/pci.h里,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等:
struct pci_dev { struct list_head global_list; struct list_head bus_list; struct pci_bus *bus; struct pci_bus *subordinate; void *sysdata; struct proc_dir_entry *procent; unsigned int devfn; unsigned short vendor; unsigned short device; unsigned short subsystem_vendor; unsigned short subsystem_device; unsigned int class; u8 hdr_type; u8 rom_base_reg; struct pci_driver *driver; void *driver_data; u64 dma_mask; u32 current_state; unsigned short vendor_compatible[DEVICE_COUNT_COMPATIBLE]; unsigned short device_compatible[DEVICE_COUNT_COMPATIBLE]; unsigned int irq; struct resource resource[DEVICE_COUNT_RESOURCE]; struct resource dma_resource[DEVICE_COUNT_DMA]; struct resource irq_resource[DEVICE_COUNT_IRQ]; char name[80]; char slot_name[8]; int active; int ro; unsigned short regs; int (*prepare)(struct pci_dev *dev); int (*activate)(struct pci_dev *dev); int (*deactivate)(struct pci_dev *dev);};
2. 基本框架
在用模块方式实现PCI设备驱动程序时,通常至少要实现以下几个部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块。下面给出一个典型的PCI设备驱动程序的基本框架,从中不难体会到这几个关键模块是如何组织起来的。
/* 指明该驱动程序适用于哪一些PCI设备 */static struct pci_device_id demo_pci_tbl [] __initdata = { {PCI_VENDOR_ID_DEMO, PCI_DEVICE_ID_DEMO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEMO}, {0,}};/* 对特定PCI设备进行描述的数据结构 */struct demo_card { unsigned int magic; /* 使用链表保存所有同类的PCI设备 */ struct demo_card *next; /* ... */}/* 中断处理模块 */static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs){ /* ... */}/* 设备文件操作接口 */static struct file_operations demo_fops = { owner: THIS_MODULE, /* demo_fops所属的设备模块 */ read: demo_read, /* 读设备操作*/ write: demo_write, /* 写设备操作*/ ioctl: demo_ioctl, /* 控制设备操作*/ mmap: demo_mmap, /* 内存重映射操作*/ open: demo_open, /* 打开设备操作*/ release: demo_release /* 释放设备操作*/ /* ... */};/* 设备模块信息 */static struct pci_driver demo_pci_driver = { name: demo_MODULE_NAME, /* 设备模块名称 */ id_table: demo_pci_tbl, /* 能够驱动的设备列表 */ probe: demo_probe, /* 查找并初始化设备 */ remove: demo_remove /* 卸载设备模块 */ /* ... */};static int __init demo_init_module (void){ /* ... */}static void __exit demo_cleanup_module (void){ pci_unregister_driver(&demo_pci_driver);}/* 加载驱动程序模块入口 */module_init(demo_init_module);/* 卸载驱动程序模块入口 */module_exit(demo_cleanup_module);
上面这段代码给出了一个典型的PCI设备驱动程序的框架,是一种相对固定的模式。需要注意的是,同加载和卸载模块相关的函数或数据结构都要在前面加上 __init、__exit等标志符,以使同普通函数区分开来。构造出这样一个框架之后,接下去的工作就是如何完成框架内的各个功能模块了。
3. 初始化设备模块
在Linux系统下,想要完成对一个PCI设备的初始化,需要完成以下工作:
检查PCI总线是否被Linux内核支持;
检查设备是否插在总线插槽上,如果在的话则保存它所占用的插槽的位置等信息。
读出配置头中的信息提供给驱动程序使用。
当Linux内核启动并完成对所有PCI设备进行扫描、登录和分配资源等初始化操作的同时,会建立起系统中所有PCI设备的拓扑结构,此后当PCI驱动程序需要对设备进行初始化时,一般都会调用如下的代码:
static int __init demo_init_module (void){ /* 检查系统是否支持PCI总线 */ if (!pci_present()) return -ENODEV; /* 注册硬件驱动程序 */ if (!pci_register_driver(&demo_pci_driver)) { pci_unregister_driver(&demo_pci_driver); return -ENODEV; } /* ... */ return 0;}
驱动程序首先调用函数pci_present( )检查PCI总线是否已经被Linux内核支持,如果系统支持PCI总线结构,这个函数的返回值为0,如果驱动程序在调用这个函数时得到了一个非0的返回 值,那么驱动程序就必须得中止自己的任务了。在2.4以前的内核中,需要手工调用pci_find_device( )函数来查找PCI设备,但在2.4以后更好的办法是调用pci_register_driver( )函数来注册PCI设备的驱动程序,此时需要提供一个pci_driver结构,在该结构中给出的probe探测例程将负责完成对硬件的检测工作。
static int __init demo_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id){ struct demo_card *card; /* 启动PCI设备 */ if (pci_enable_device(pci_dev)) return -EIO; /* 设备DMA标识 */ if (pci_set_dma_mask(pci_dev, DEMO_DMA_MASK)) { return -ENODEV; } /* 在内核空间中动态申请内存 */ if ((card = kmalloc(sizeof(struct demo_card), GFP_KERNEL)) == NULL) { printk(KERN_ERR "pci_demo: out of memory\n"); return -ENOMEM; } memset(card, 0, sizeof(*card)); /* 读取PCI配置信息 */ card->iobase = pci_resource_start (pci_dev, 1); card->pci_dev = pci_dev; card->pci_id = pci_id->device; card->irq = pci_dev->irq; card->next = devs; card->magic = DEMO_CARD_MAGIC; /* 设置成总线主DMA模式 */ pci_set_master(pci_dev); /* 申请I/O资源 */ request_region(card->iobase, 64, card_names[pci_id->driver_data]); return 0;}
4. 打开设备模块
在这个模块里主要实现申请中断、检查读写模式以及申请对设备的控制权等。在申请控制权的时候,非阻塞方式遇忙返回,否则进程主动接受调度,进入睡眠状态,等待其它进程释放对设备的控制权。
static int demo_open(struct inode *inode, struct file *file){ /* 申请中断,注册中断处理程序 */ request_irq(card->irq, &demo_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) { /* 检查读写模式 */ if(file->f_mode & FMODE_READ) { /* ... */ } if(file->f_mode & FMODE_WRITE) { /* ... */ } /* 申请对设备的控制权 */ down(&card->open_sem); while(card->open_mode & file->f_mode) { if (file->f_flags & O_NONBLOCK) { /* NONBLOCK模式,返回-EBUSY */ up(&card->open_sem); return -EBUSY; } else { /* 等待调度,获得控制权 */ card->open_mode |= f_mode & (FMODE_READ | FMODE_WRITE); up(&card->open_sem); /* 设备打开计数增1 */ MOD_INC_USE_COUNT; /* ... */ } }}
5. 数据读写和控制信息模块
PCI设备驱动程序可以通过demo_fops 结构中的函数demo_ioctl( ),向应用程序提供对硬件进行控制的接口。例如,通过它可以从I/O寄存器里读取一个数据,并传送到用户空间里:
static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){ /* ... */ switch(cmd) { case DEMO_RDATA: /* 从I/O端口读取4字节的数据 */ val = inl(card->iobae + 0x10); /* 将读取的数据传输到用户空间 */ return 0; } /* ... */}
事实上,在demo_fops里还可以实现诸如demo_read( )、demo_mmap( )等操作,Linux内核源码中的driver目录里提供了许多设备驱动程序的源代码,找那里可以找到类似的例子。在对资源的访问方式上,除了有I/O指 令以外,还有对外设I/O内存的访问。对这些内存的操作一方面可以通过把I/O内存重新映射后作为普通内存进行操作,另一方面也可以通过总线主DMA (Bus Master DMA)的方式让设备把数据通过DMA传送到系统内存中。
6. 中断处理模块
PC的中断资源比较有限,只有0~15的中断号,因此大部分外部设备都是以共享的形式申请中断号的。当中断发生的时候,中断处理程序首先负责对中断进行识别,然后再做进一步的处理。
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs){ struct demo_card *card = (struct demo_card *)dev_id; u32 status; spin_lock(&card->lock); /* 识别中断 */ status = inl(card->iobase + GLOB_STA); if(!(status & INT_MASK)) { spin_unlock(&card->lock); return; /* not for us */ } /* 告诉设备已经收到中断 */ outl(status & INT_MASK, card->iobase + GLOB_STA); spin_unlock(&card->lock); /* 其它进一步的处理,如更新DMA缓冲区指针等 */}
7. 释放设备模块
释放设备模块主要负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好与打开设备模块相反:
static int demo_release(struct inode *inode, struct file *file){ /* ... */ /* 释放对设备的控制权 */ card->open_mode &= (FMODE_READ | FMODE_WRITE); /* 唤醒其它等待获取控制权的进程 */ wake_up(&card->open_wait); up(&card->open_sem); /* 释放中断 */ free_irq(card->irq, card); /* 设备打开计数增1 */ MOD_DEC_USE_COUNT; /* ... */ }
8. 卸载设备模块
卸载设备模块与初始化设备模块是相对应的,实现起来相对比较简单,主要是调用函数pci_unregister_driver( )从Linux内核中注销设备驱动程序:
static void __exit demo_cleanup_module (void){ pci_unregister_driver(&demo_pci_driver);}
PCI总线不仅是目前应用广泛的计算机总线标准,而且是一种兼容性最强、功能最全的计算机总线。而Linux作为一种新的操作系统,其发展前景是无法估量 的,同时也为PCI总线与各种新型设备互连成为可能。由于Linux源码开放,因此给连接到PCI总线上的任何设备编写驱动程序变得相对容易。本文介绍如 何编译Linux下的PCI驱动程序,针对的内核版本是2.4。
参考资料: David A Rusling在 The Linux Kernel中对Linux的PCI子系统进行了比较详细的介绍。
Linux PCI-HOWTO是了解Linux下PCI设备的最好读物。
毛德操,胡希明,Linux内核源代码情景分析,杭州:浙江大学出版社,2001
Alessandro Rubini,,Linux Device Drivers(2nd Edition) USA:O’Reilly,2001
Tomshanley,DonAderson,PCI系统结构(第四版),北京:电子工业出版社,2000
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mingjie_520/archive/2009/03/27/4029919.aspx
由于开发环境需要,更换了一个比较新的内核,更换过程参考了附文,但文章稍显繁琐,我给大致总结一下,具体过程见原文。1、找到自己需要的内核,可以在此寻找:http://www.kernel.org/pub/linux/kernel/v2.6(当然不一定能找到最新的,我用到的2.6.30当时未能找到)。2、下载内核升级工具:(1)下载module-init-tools-3.2.tar.bz2
http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2
(2)下载mkinitrd-4.1.18-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm
(3)下载lvm2-2.00.25-1.01.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm
(4)下载device-mapper-1.00.19-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm
3、安装上述四个升级工具:(1)安装module-init-tools工具# tar jvxf module-init-tools-3.2.tar.bz2 (解压module-init-tools)
# cd module-init-tools-3.2 (由/usr/src目录进入module-init-tools目录下)
#./configure --prefix=/
# make moveold
# make all install
#./generate-modprobe.conf /etc/modprobe.conf (该步能否运行未知,多次运行均未果)(2)安装另外三个升级工具
# rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm (注意,这里一定要加入--nodeps参数,下同)
# rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm
# rpm -ivh --nodeps device-mapper-1.00.19-2.i386.rpm
4、配置编译内核解压内核源码包到linux-2.6.x# cd linux-2.6.x# make mrproper (该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (配置内核各选项,配置详情参考原文)# make dep (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage (注意大小写。这一步才是真正编译内核)
# make modules (编译可加载模块) (此步骤约半到1小时,需耐心等待)
# make modules_install (安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。
# make install (安装新内核)5、启动新内核此时我的系统中/root目录下已经有了新内核及启动项,启动配置文件(我的貌似是/root/grub/menu.lst)也已自动更改好,直接重启并在启动页面选择新内核OK。若启动项未自动更改再次参考原文。
由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。
网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。
现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!一、准备工作
首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。
启动Linux系统,并用根用户登录,进入终端模式下。1、查看Linux内核版本
# uname -a
如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。2、下载2.6内核源码
下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz23、下载内核升级工具
(1)下载module-init-tools-3.2.tar.bz2
http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2
(2)下载mkinitrd-4.1.18-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm
(3)下载lvm2-2.00.25-1.01.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm
(4)下载device-mapper-1.00.19-2.i386.rpm
http://ayo.freshrpms.net/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm
(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到http://www.piaoyang.org/guestbook 留下你的邮箱,我给你发过去)二、配置工作
好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。4、将下载好的内核源码包和4个升级工具都拷贝到/usr/src文件夹下。怎么拷贝就不用我教了吧~~~~不会拷贝的去撞墙吧!~~呵呵!5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:
# cd /usr/src (进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)
# rm –rf linux (删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)
# tar jvxf linux-2.6.18.tar.bz2 (解压新内核)
# ln -s linux-2.6.18 linux (重新生成linux文件夹)6、安装module-init-tools工具
在/usr/src目录下,依次执行下列命令:
# tar jvxf module-init-tools-3.2.tar.bz2 (解压module-init-tools)
# cd module-init-tools-3.2 (由/usr/src目录进入module-init-tools目录下)
#./configure --prefix=/
# make moveold
# make all install
#./generate-modprobe.conf /etc/modprobe.conf7、安装另外三个升级工具
回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:
# rpm -ivh --nodeps mkinitrd-4.1.18-2.i386.rpm (注意,这里一定要加入--nodeps参数,下同)
# rpm -ivh --nodeps lvm2-2.00.25-1.01.i386.rpm
# rpm -ivh --nodeps device-mapper-1.00.19-2.i386.rpm
如果不更新以上几个升级包,在后面编译内核时会提示以下错误:
mkinitrd failed
make[1]: *** [install] Error 1
make: *** [install] Error 28、配置内核选项。有点繁琐,~~希望一次成功哦~~。
# cd linux-2.6.18 (进入到/usr/src/linux-2.6.18目录下)
# make mrproper (该命令可确保源代码目录下没有不正确的.o文件)
# make menuconfig (配置内核各选项)
此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):
(1)Loadable Module support选项中,选上“Module unloading”和“Automatic kernel module loading”这两项;
(2)Device Drivers--->Block Devices中选上“Loopback device support”;
Device Drivers--->Multi-device support(RAID and LVM)处要选上“device mapper support”;
Device Drivers--->Graphics support,一定要选上“ Support for buffer devices”;
Device Drivers --->USB support --->选上“USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)
Device Drivers --->;Network device support --->Ethernet (10 or 100Mbit) ---><*> AMD PCnet32 PCI support
(3)File system--->(以下9个选项是关于ext2和ext3文件系统配置,全部选上)
Second extended fs support
Ext2 extended attributes
Ext2 POSIX Access Control Lists
Ext2 Security Labels
Ext3 journalling file system support
Ext3 extended attributes
Ext3 POSIX Access Control Lists
Ext3 Security Labels
JBB (ext3) debugging support
File system--->DOS/FAT/NT Filesystems --->选上“NTFS file system support”;
ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:
kernel panic : no init found ,try passing init = option to kernel.....
VFS:Cannot open root device "hdxy" or unknow-block(0,0)
Please append a correct "root=" boot option
kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)
mount: error 19 mounting ext3
pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed: 2
umount /initrd/proc fail: 2
Freeing unused kernel memory: 244k freed
Kernel panic – not syncing: No init found. Try passing init = option to kernel
(我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~如果依照本文做完所有步骤,当你重启Linux系统后,若不幸进不去2.6.18内核,你会发现你的出错信息就是上面三种了~~~哈!)
(4)如果你在vmware下编译内核,硬盘用的是scsi的,以下三个选项必选:
Device Drivers ---><*>SCSI device support (此项不选的话,下面两项就选择不上)
Device Drivers ---><*>SCSI device support ---><*>SCSI disk support
Device Drivers---><8>SCSI device support--->SCSI low-level drivers---><*>; BusLogic SCSI support三、编译工作
OK,繁杂的配置工作完成了,至此,编译前的准备工作都做好了!9、开始编译啦……
在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!
# make dep (建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)
# make clean (清除内核编译的目标文件。注意:如果内核从未编译过,此步可跳过)
# make bzImage (注意大小写。这一步才是真正编译内核)
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用 make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译,所以我直接用make bzImage来编译。
# make modules (编译可加载模块)
# make modules_install (安装可加载模块)
安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。
# make install (安装新内核)
make install的时候可能会出现如下错误信息:
No module BusLogic found for kernel 2.4.12
mkinitrd failed
此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。解决方式是直接将BusLogic.o文件复制过去:
# cp /usr/src/linux-2.6.18/drivers/scsi/BusLogic.o /lib/modules/2.6.18/kernel/drivers/scsi
不过别忘记,复制过后再执行一下make install。这一步若卡住了,下面的都无法进行,如果看本文档还是没有解决问题,就来我的网上留言本求助吧,进http://www.piaoyang.org ,点“留言本”即可,我会及时看到你的求助信息的。四、启动新内核
10、将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:
# cp /usr/src/linux-2.6.18/arch/i386/boot/bzImage /boot/vmlinuz-2.6.18
# cp /usr/src/linux-2.6.18/System.map /boot/System.map-2.6.18
# cd /boot (进入boot目录)
# rm –rf System.map (删除原来的连接)
# ln –s System.map-2.6.18 System.map (重新建立连接)11、修改Grub启动管理器
如果没有错误的话, 下面开始修改grub配置文件(不要告诉我你用的lilo)
在/boot目录下,执行以下命令:
# new-kernel-pkg --mkinitrd --depmod --install 2.6.18 (这时候你的/boot下会生成一个initrd-2.4.18.img,并且你的grub.conf文件也作了相应更改)
# df (查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是“/”,千万不要搞错哦。我的为 /dev/hda2)
# vi /grub/grub.conf
进入grub.conf文件,找到如下信息:
default=1
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root= LABEL=/
initrd /initrd-2.6.18.img
做两处修改:
(1) 将default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.4内核)
(2) 将kernel行的“LABEL=/”换成根目录所在的分区(上一步查看的就是)
此步很重要,修改错误将可能导致进不去系统,我把我修改后的grub.conf文件列出来,不明之处,可以对照修改:
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.6.18)
root (hd0,0)
kernel /vmlinuz-2.6.18 ro root=/dev/hda2
initrd /initrd-2.6.18.img
title Red Hat Linux (2.4.20-8)
root (hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img12,OK,大功告成!赶快重启,看看升级后的2.6内核吧~~~~Linux内核 升级和编译,老掉牙的话题了,网上相关的文章不计其数。然后,这么多的文章,却没有一篇让我顺利的升级成功。经过两天的体验,我深切的感受到,对于像我这样的新手来说,第一次升级和编译Linux内核,真是一项艰巨的任务。好在没有失去耐心,经过多篇文章的比对和自己的琢磨,一次次的修正,终于正确升级、编译成功。总结这两天的感受,那就是“痛,并快乐着”!如果你照着这些步骤一路下来的话,仍然没有成功;那么我可以告诉你两点:一是,不要怀疑我的步骤有问题,因为不光是我,我的同事照我的这篇文档也一次成功;二是,你可以到我的留言本http://www.piaoyang.org/guestbook 给我留言,我会尽力解答你的问题。以此拙作,希望能给大家带去些微的帮助。这段代码中比较繁锁的就是bus_type对应目录下的属性文件建立,为了直观的说明,将属性文件的建立统一放到一起分析从上面的代码中可以看,创建属性文件对应的属性分别为:bus_attr_uevent bus_attr_drivers_probe, bus_attr_drivers_autoprobe分别定义如下:static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);static BUS_ATTR(drivers_probe, S_IWUSR, NULL, store_drivers_probe);static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO,show_drivers_autoprobe, store_drivers_autoprobe);BUS_ATTR定义如下:#define BUS_ATTR(_name, _mode, _show, _store) \struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)#define __ATTR(_name,_mode,_show,_store) { \.attr = {.name = __stringify(_name), .mode = _mode }, \.show = _show, \.store = _store, \由此可见.上面这三个属性对应的名称为别为uevent, drivers_probe, drivers_autoprobe.也就是说,会在bus_types目录下生成三个文件,分别为uevent,probe,autoprobe.根据之前的分析,我们知道在sysfs文件系统中,对普通属性文件的读写都会回溯到kobject->ktype->sysfs_ops中.在这里,注意到有:priv->subsys.kobj.kset = bus_kset;priv->subsys.kobj.ktype = &bus_ktype;显然,读写操作就回溯到了bus_ktype中.定义如下:static struct kobj_type bus_ktype = {.sysfs_ops = &bus_sysfs_ops,static struct sysfs_ops bus_sysfs_ops = {.show = bus_attr_show,.store = bus_attr_store,Show和store函数对应的代码为:static ssize_t bus_attr_show(struct kobject *kobj, struct attribute *attr,char *buf)struct bus_attribute *bus_attr = to_bus_attr(attr);struct bus_type_private *bus_priv = to_bus(kobj);ssize_t ret = 0;if (bus_attr->show)ret = bus_attr->show(bus_priv->bus, buf);return ret;static ssize_t bus_attr_store(struct kobject *kobj, struct attribute *attr,const char *buf, size_t count)struct bus_attribute *bus_attr = to_bus_attr(attr);struct bus_type_private *bus_priv = to_bus(kobj);ssize_t ret = 0;if (bus_attr->store)ret = bus_attr->store(bus_priv->bus, buf, count);return ret;从代码可以看出.读写操作又会回溯到bus_attribute中的show和store中.在自定义结构里嵌入struct attribute,.然后再操作回溯到自定义结构中,这是一种比较高明的架构设计手法.闲言少叙.我们对应看一下上面三个文件对应的最终操作:Uevent对应的读写操作为:NULL, bus_uevent_store.对于这个文件没有读操作,只有写操作.用cat 命令去查看这个文件的时候,可能会返回”设备不存在”的错误.bus_uevent_store()代码如下:static ssize_t bus_uevent_store(struct bus_type *bus,const char *buf, size_t count)enum kobject_action action;if (kobject_action_type(buf, count, &action) == 0)kobject_uevent(&bus->p->subsys.kobj, action);return count;从这里可以看到,可以在用户空间控制事件的发生,如echo add > event就会产生一个add的事件,Probe文件对应的读写操作为:NULL store_drivers_probe.store_drivers_probe()这个函数的代码涉及到struct device.等分析完struct device可以自行回过来看下这个函数的实现.实际上,这个函数是将用户输和的设备名称对应的设备与驱动匹配一次.Autoprobe文件对应的读写操作为show_drivers_autoprobe, store_drivers_autoprobe.对应读的代码为:static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf)return sprintf(buf, "%d\n", bus->p->drivers_autoprobe);它将总线对应的drivers_autoprobe的值输出到用户空间,这个值为1时,自动将驱动与设备进行匹配.否则,反之.写操作的代码如下:static ssize_t store_drivers_autoprobe(struct bus_type *bus,const char *buf, size_t count)if (buf[0] == '0')bus->p->drivers_autoprobe = 0;bus->p->drivers_autoprobe = 1;return count;写操作就会改变bus->p->drivers_autoprobe的值.就这样,通过sysfs就可以控制总线是否要进行自动匹配了.从这里也可以看出.内核开发者的思维是何等的灵活.我们从sysfs中找个例子来印证一下:Cd / sys/bus/usb用ls命令查看:devices drivers drivers_autoprobe drivers_probe uevent与上面分析的相吻合设备的注册接口为: device_register().int device_register(struct device *dev)device_initialize(dev);return device_add(dev);Device_initialize()中有几个很重要的操作,如下:void device_initialize(struct device *dev)dev->kobj.kset = devices_kset;kobject_init(&dev->kobj, &device_ktype);klist_init(&dev->klist_children, klist_children_get,klist_children_put);INIT_LIST_HEAD(&dev->dma_pools);INIT_LIST_HEAD(&dev->node);init_MUTEX(&dev->sem);spin_lock_init(&dev->devres_lock);INIT_LIST_HEAD(&dev->devres_head);device_init_wakeup(dev, 0);set_dev_node(dev, -1);在这里,它为device的内嵌kobject指定了ktype和kset.device_kset的值如下:devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);即对应sysfs中的/sys/devicesdevice_ktype 中对属性的读写操作同bus中的类似,被回溯到了struct device_attribute中的show 和store.接着往下看device_add()的实现.这个函数比较长,分段分析如下:int device_add(struct device *dev)struct device *parent = NULL;struct class_interface *class_intf;int error;dev = get_device(dev);if (!dev || !strlen(dev->bus_id)) {error = -EINVAL;goto Done;pr_debug("device: '%s': %s\n", dev->bus_id, __FUNCTION__);parent = get_device(dev->parent);setup_parent(dev, parent);/* first, register with generic layer. */error = kobject_add(&dev->kobj, dev->kobj.parent, "%s", dev->bus_id);if (error)goto Error;如果注册device的时候,没有指定父结点,在kobject_add将会在/sys/device/下建立相同名称的目录/* notify platform of device entry */if (platform_notify)platform_notify(dev);/* notify clients of device entry (new way) */if (dev->bus)blocking_notifier_call_chain(&dev->bus->p->bus_notifier,BUS_NOTIFY_ADD_DEVICE, dev);忽略notify部份,这部份不会影响本函数的流程error = device_create_file(dev, &uevent_attr);if (error)goto attrError;if (MAJOR(dev->devt)) {error = device_create_file(dev, &devt_attr);if (error)goto ueventattrError;建立属性为uevent_attr的属性文件,如果device中指定了设备号,则建立属性为devt_attr的属性文件error = device_add_class_symlinks(dev);if (error)goto SymlinkError;error = device_add_attrs(dev);if (error)goto AttrsError;error = dpm_sysfs_add(dev);if (error)goto PMError;device_pm_add(dev);在这里,不打算讨论class的部份,dpm pm是选择编译部份,不讨论. device_add_attrs中涉及到了group的部分,暂不讨论error = bus_add_device(dev);if (error)goto BusError;kobject_uevent(&dev->kobj, KOBJ_ADD);bus_attach_device(dev);if (parent)klist_add_tail(&dev->knode_parent, &parent->klist_children);if (dev->class) {down(&dev->class->sem);/* tie the class to the device */list_add_tail(&dev->node, &dev->class->devices);/* notify any interfaces that the device is here */list_for_each_entry(class_intf, &dev->class->interfaces, node)if (class_intf->add_dev)class_intf->add_dev(dev, class_intf);up(&dev->class->sem);bus_add_device()会在对应总线代表目录的device目录下创建几个到device的链接.然后产生一个add事件,再调用bus_attach_device()去匹配已经注册到总线的驱动程序.全部做完之后,将设备挂到父结点的子链表.Done:put_device(dev);return error;BusError:device_pm_remove(dev);PMError:if (dev->bus)blocking_notifier_call_chain(&dev->bus->p->bus_notifier,BUS_NOTIFY_DEL_DEVICE, dev);device_remove_attrs(dev);AttrsError:device_remove_class_symlinks(dev);SymlinkError:if (MAJOR(dev->devt))device_remove_file(dev, &devt_attr);ueventattrError:device_remove_file(dev, &uevent_attr);attrError:kobject_uevent(&dev->kobj, KOBJ_REMOVE);kobject_del(&dev->kobj);Error:cleanup_device_parent(dev);if (parent)put_device(parent);goto Done;出错处理部份.bus_attach_device()是一个很重要的函数。它将设备自动与挂在总线上面的驱动进行匹配。代码如下:void bus_attach_device(struct device *dev)struct bus_type *bus = dev->bus;int ret = 0;if (bus) {dev->is_registered = 1;if (bus->p->drivers_autoprobe)ret = device_attach(dev);WARN_ON(ret < 0);if (ret >= 0)klist_add_tail(&dev->knode_bus, &bus->p->klist_devices);dev->is_registered = 0;从上面的代码我们可以看出。只有在bus->p->drivers_autoprobe为1的情况下,才会去自己匹配。这也就是bus目录下的drivers_probe 文件的作用.然后,将设备挂到总线的设备链表。Device_attach()代码如下:int device_attach(struct device *dev)int ret = 0;down(&dev->sem);if (dev->driver) {ret = device_bind_driver(dev);if (ret == 0)ret = 1;else {dev->driver = NULL;ret = 0;} else {ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);up(&dev->sem);return ret;对于设备自己已经指定驱动的情况,只需要将其直接和驱动绑定即可。如果没有指定驱动。就匹配总线之上的驱动。这是在bus_for_each_drv(dev->bus, NULL, dev, __device_attach);完成的。代码如下:int bus_for_each_drv(struct bus_type *bus, struct device_driver *start,void *data, int (*fn)(struct device_driver *, void *))struct klist_iter i;struct device_driver *drv;int error = 0;if (!bus)return -EINVAL;klist_iter_init_node(&bus->p->klist_drivers, &i,start ? &start->p->knode_bus : NULL);while ((drv = next_driver(&i)) && !error)error = fn(drv, data);klist_iter_exit(&i);return error;很明显,这个函数就是遍历总线之上的驱动。每遍历一个驱动就调用一次回调函数进行判断。如果回调函数返回不为0。就说明匹配已经成功了。不需要再匹配剩余的。退出。在这里调用的回调函数是__device_attach().在这里。完全了设备与驱动匹配的最核心的动作。代码如下:static int __device_attach(struct device_driver *drv, void *data)struct device *dev = data;return driver_probe_device(drv, dev);转到driver_probe_device():
int driver_probe_device(struct device_driver *drv, struct device *dev)int ret = 0;if (!device_is_registered(dev))return -ENODEV;if (drv->bus->match && !drv->bus->match(dev, drv))goto done;pr_debug("bus: '%s': %s: matched device %s with driver %s\n",drv->bus->name, __FUNCTION__, dev->bus_id, drv->name);ret = really_probe(dev, drv);done:return ret;如果设备没有注册到总线之上。即dev->is_registered不为1. 就直接返回。然后,再调用总线的match()函数进行匹配。如果match()函数返回0.说明匹配失败。那退出此函数。如果match函数返回1.说明初步的检查已经通过了。可以进入really_probe()再进行细致的检查。如果匹配成功,这个函数会返回1.此函数比较长而且比较重要,分段列出代码:static int really_probe(struct device *dev, struct device_driver *drv)int ret = 0;atomic_inc(&probe_count);pr_debug("bus: '%s': %s: probing driver %s with device %s\n",drv->bus->name, __FUNCTION__, drv->name, dev->bus_id);WARN_ON(!list_empty(&dev->devres_head));dev->driver = drv;if (driver_sysfs_add(dev)) {printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",__FUNCTION__, dev->bus_id);goto probe_failed;先假设驱动和设备是匹配的。为设备结构设置驱动成员。使其指向匹配的驱动。然后再调用driver_sysfs_add()建立几个符号链接。这几个链接分别为:1:在驱动目录下建立一个到设备的同名链接2:在设备目录下建立一个名为driver。到驱动的链接if (dev->bus->probe) {ret = dev->bus->probe(dev);if (ret)goto probe_failed;} else if (drv->probe) {ret = drv->probe(dev);if (ret)goto probe_failed;然后,再调用总线的probe函数。如果总线的此函数不存在。就会调用驱动的probe函数。如果匹配成功,返回0.如果不成功,就会跳转到probe_faileddriver_bound(dev);ret = 1;pr_debug("bus: '%s': %s: bound device %s to driver %s\n",drv->bus->name, __FUNCTION__, dev->bus_id, drv->name);goto done;到这里。设备和驱动已经匹配成功,调用driver_bound()将其关联起来。在这个函数里:会将设备加至驱动的设备链表。这在我们之前分析bus,device driver中分析到的。相关的代码如下示:klist_add_tail(&dev->knode_driver, &dev->driver->p->klist_devices);至此,这个匹配过程已经圆满结束了。返回1probe_failed:devres_release_all(dev);driver_sysfs_remove(dev);dev->driver = NULL;if (ret != -ENODEV && ret != -ENXIO) {/* driver matched but the probe failed */printk(KERN_WARNING"%s: probe of %s failed with error %d\n",drv->name, dev->bus_id, ret);* Ignore errors returned by ->probe so that the next driver can try* its luck.ret = 0;这里是匹配不成功的处理,在这里,删除之前建立的几个链接文件,然后将设备的driver域置空。done:atomic_dec(&probe_count);wake_up(&probe_waitqueue);return ret;从上面的分析可以看到,对应创建的属性文件分别为:uevent_attr devt_attr。它们的定义如下:static struct device_attribute uevent_attr =__ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent);static struct device_attribute devt_attr =__ATTR(dev, S_IRUGO, show_dev, NULL);uevent_attr对应的读写函数分别为:show_uevent store_uevent。先分析读操作。它的代码如下:static ssize_t show_uevent(struct device *dev, struct device_attribute *attr,char *buf)struct kobject *top_kobj;struct kset *kset;struct kobj_uevent_env *env = NULL;int i;size_t count = 0;int retval;/* search the kset, the device belongs to */top_kobj = &dev->kobj;while (!top_kobj->kset && top_kobj->parent)top_kobj = top_kobj->parent;if (!top_kobj->kset)goto out;kset = top_kobj->kset;if (!kset->uevent_ops || !kset->uevent_ops->uevent)goto out;/* respect filter */if (kset->uevent_ops && kset->uevent_ops->filter)if (!kset->uevent_ops->filter(kset, &dev->kobj))goto out;env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);if (!env)return -ENOMEM;/* let the kset specific function add its keys */retval = kset->uevent_ops->uevent(kset, &dev->kobj, env);if (retval)goto out;/* copy keys to file */for (i = 0; i < env->envp_idx; i++)count += sprintf(&buf[count], "%s\n", env->envp[i]);kfree(env);return count;从代码可以看出。这里会显示出由设备对应的kset.也就是由devices_kset所产生的环境变量。例如,在shell中输入如下指令:Cat /sys/devices/LNXSYSTM:00/ uevent输出结果如下:PHYSDEVBUS=acpiMODALIAS=acpi:LNXSYSTM:这就是由devices_kset所添加的环境变量写操作对应的代码如下:static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)enum kobject_action action;if (kobject_action_type(buf, count, &action) == 0) {kobject_uevent(&dev->kobj, action);goto out;dev_err(dev, "uevent: unsupported action-string; this will ""be ignored in a future kernel version\n");kobject_uevent(&dev->kobj, KOBJ_ADD);return count;从上面的代码可以看出。这个文件的作用是输入一个字符字串。如果字符不合法,就会默认产生一个add事件。devt_attr对应的读写函数为show_dev NULL.写函数为空,也就是说这个属性文件不允许写。只允许读。读操作的代码如下示:static ssize_t show_dev(struct device *dev, struct device_attribute *attr,char *buf)return print_dev_t(buf, dev->devt);也就是说,会将设备号显示出来.分析完了bus.device.再接着分析driver.这里我们要分析的最后一个元素了。耐着性子往下看,快要完了^_^驱动注册的接口为:driver_register().代码如下:int driver_register(struct device_driver *drv)int ret;if ((drv->bus->probe && drv->probe) ||(drv->bus->remove && drv->remove) ||(drv->bus->shutdown && drv->shutdown))printk(KERN_WARNING "Driver '%s' needs updating - please use ""bus_type methods\n", drv->name);ret = bus_add_driver(drv);if (ret)return ret;ret = driver_add_groups(drv, drv->groups);if (ret)bus_remove_driver(drv);return ret;如果设备与总线定义了相同的成员的函数。内核是优先使用bus中定义的.这一点我们在分析device注册的时候已经分析过。所以。这里打印出警告信息,用来提醒代码编写者。在这里,忽略有关group的东西。剩余的便只剩下bus_add_driver().代码如下:int bus_add_driver(struct device_driver *drv)struct bus_type *bus;struct driver_private *priv;int error = 0;bus = bus_get(drv->bus);if (!bus)return -EINVAL;pr_debug("bus: '%s': add driver %s\n", bus->name, drv->name);priv = kzalloc(sizeof(*priv), GFP_KERNEL);if (!priv) {error = -ENOMEM;goto out_put_bus;klist_init(&priv->klist_devices, NULL, NULL);priv->driver = drv;drv->p = priv;priv->kobj.kset = bus->p->drivers_kset;error = kobject_init_and_add(&priv->kobj, &driver_ktype, NULL,"%s", drv->name);初始化驱动的driver_private域。使其内嵌的kobject的kset指bus中的drivers_kset.这样,这个内嵌的kobject所生成的目录就会存在于bus对应目录的driver目录之下。这里还要注意的是,为内嵌kobject指定的ktype是driver_ktype.属性文件的读写操作都回回溯到struct driver_attribute中。这在之后再分析.if (error)goto out_unregister;if (drv->bus->p->drivers_autoprobe) {error = driver_attach(drv);if (error)goto out_unregister;klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);module_add_driver(drv->owner, drv);如果总线允许自动进行匹配。就会调用driver_attach()进行这个自己匹配过程。这个函数跟我们在上面分析的device自动匹配过程是一样的。请自行分析.最后,将驱动挂到bus对应的驱动链表error = driver_create_file(drv, &driver_attr_uevent);if (error) {printk(KERN_ERR "%s: uevent attr (%s) failed\n",__FUNCTION__, drv->name);生成一个属性为driver_attr_uevent的属性文件error = driver_add_attrs(bus, drv);if (error) {/* How the hell do we get out of this pickle? Give up */printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",__FUNCTION__, drv->name);为bus中的driver属性生成属性文件error = add_bind_files(drv);if (error) {/* Ditto */printk(KERN_ERR "%s: add_bind_files(%s) failed\n",__FUNCTION__, drv->name);生成属性为driver_attr_unbind和driver_attr_bind的属性文件kobject_uevent(&priv->kobj, KOBJ_ADD);生成一个add事件return error;out_unregister:kobject_put(&priv->kobj);out_put_bus:bus_put(bus);return error;总的来说,这个函数比较简单。其中涉及到的子函数大部份都在之前分析过。我们接下来分析一下。它所创建的几个属性文件的含义。如上所述。在这里会创建三个属性文件,对应属性分别为:driver_attr_uevent,driver_attr_unbind,driver_attr_bind。这几个属性的定义如下:static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store);static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);DRIVER_ATTR宏的定义如下:#define DRIVER_ATTR(_name, _mode, _show, _store) \struct driver_attribute driver_attr_##_name = \__ATTR(_name, _mode, _show, _store)对于driver_attr_uevent.它的读写函数分别为:NULL。driver_uevent_store。也就是说这个文件只允许写,不允许读操作。写操作的代码如下示:static ssize_t driver_uevent_store(struct device_driver *drv,const char *buf, size_t count)enum kobject_action action;if (kobject_action_type(buf, count, &action) == 0)kobject_uevent(&drv->p->kobj, action);return count;很明显,这是一个手动产生事件的过程。用户可间可以写事件到这个文件来产生事件。对于driver_unbind.它的读写函数分别为:NULL driver_unbind。这个文件也是不允许读的。写操作代码如下:static ssize_t driver_unbind(struct device_driver *drv,const char *buf, size_t count)struct bus_type *bus = bus_get(drv->bus);struct device *dev;int err = -ENODEV;dev = bus_find_device_by_name(bus, NULL, buf);if (dev && dev->driver == drv) {if (dev->parent) /* Needed for USB */down(&dev->parent->sem);device_release_driver(dev);if (dev->parent)up(&dev->parent->sem);err = count;put_device(dev);bus_put(bus);return err;从上面的代码可以看出。写入文件的是一个设备名称。这个函数对应操作是将这个设备与驱动的绑定分离开来。driver_attr_bind属性对应的读写函数分别为NULL。driver_attr_bind 即也是不允许写的。从字面意思和上面分析的driver_attr_unbind操作代码来看,这个属性对应的写函数应该是将写入的设备文件与此驱动绑定起来。我们来看下代码。以证实我们的猜测。代码如下:static ssize_t driver_bind(struct device_driver *drv,const char *buf, size_t count)struct bus_type *bus = bus_get(drv->bus);struct device *dev;int err = -ENODEV;dev = bus_find_device_by_name(bus, NULL, buf);if (dev && dev->driver == NULL) {if (dev->parent) /* Needed for USB */down(&dev->parent->sem);down(&dev->sem);err = driver_probe_device(drv, dev);up(&dev->sem);if (dev->parent)up(&dev->parent->sem);if (err > 0) {/* success */err = count;} else if (err == 0) {/* driver didn't accept device */err = -ENODEV;put_device(dev);bus_put(bus);return err;果然,和我们猜测的是一样的。在这一节里,分析了设备模型中的最底层的元素和他们之间的关系。也分析了它们建立的几个属性文件的含义。到这里,我们已经可以自己写驱动架构代码了.^_^编写驱动程序,首先要了解是什么类型的设备。linux下的设备分为三类,分别为:字符设备,块设备和网络设备。字符设备类型是根据是否以字符流为数据的交换方式,大部分设备都是字符设备,如键盘,串口等,块设备则是以块为单位进行管理的设备,如,磁盘。网络设备就是网卡等。
其次要了解应用程序和驱动程序的区别,两者的主要区别分为以下三点:
1入口函数的任务不相同,应用程序完成一个任务,驱动只完成初始化工作,比如中断
申请,寄存器设置,定时器设置。
2运行时的cpu模式不相同,驱动具有很高的权限,应用程序是在用户态下运行,而驱
动程序是在内核态下执行。
3 驱动程序不能调用C库函数,内核为驱动程序提供一些函数。如printk(KERN_NOTICE fmt, ##arg),第一个参数为打印级别,有如下的打印级别:
KERN_EMERG 用于紧急事件,一般是系统崩溃前的提示信息
KERN_ALERT 用于需要立即采取动作的场合
KERN_CRIT 临界状态,通常设计验证的硬件或软件操作失败
KERN_ERR 用于报告错误状态.设备驱动程序通常会用它报告来自硬件的问题
KERN_WARNING 就可能出现的问题提出警告.这些问题通常不会对系统造成严重破坏
KERN_NOTICE 有必要提示的正常情况.许多安全相关的情况用这个级别汇报
KERN_INFO 提示性信息.有很多驱动程序在启动时用这个级别打印相关信息
KERN_DEBUG 用于调试的信息
u_long copy_from_user(void *to, const void *from, u_long len),由用户态拷贝到内核态;
u_long copy_to_user(void * to, const void *from, u_long len),由内核态拷贝到用户态。
鉴于以上区别,驱动程序需要完成以下三点基本功能:
1:要对设备进行初始化和释放功能模块,就如上面的寄存器设置,中断的申请,向内核注
册驱动程序(register_chrdev()),卸载驱动程序(unregister_chrdev())。
2:能进行数据传输,在read(),write()函数里具体实现,数据传输工作。
3:能进行控制操作,给用户提供的ioctl()函数里可实现一些用户的选择性设置功能。
确定一个设备的执行函数集(结构体)
static struct file_operations myGPIO_fops = {
owner: THIS_MODULE,
write: myGPIO_write,
read: myGPIO_read,
ioctl: myGPIO_ioctl,
open: myGPIO_open,
release: myGPIO_release,
接下来是初始化工作,需要写在一个init()函数中,这个函数是独立的也是自动执行的,在这之中主要是对一些寄存器进行初始化操作。同样需要完成卸载驱动模块。
myGPIO_Major = register_chrdev(0, DRIVER_NAME, &myDriver_fops);
上面的程序完成设备号的注册,第一个参数为主设备号,一般为0,由系统来分配。
第二个参数为设备名,这需要在/dev/(/dev目录下设备名由命令 <mknod 设备名 C 主设备号 从设备号>来生成)目录下出现的设备名相符合。相反的在卸载中就取消注册
unregister_chrdev(myGPIO_Major, DRIVER_NAME);
最后将这两个模块加入到内核中,由程序段的最后两行完成。
static int __init myGPIO_init(void)
PRINTK("GPIO init\n");
myGPIO_Major = register_chrdev(0, DRIVER_NAME, &myGPIO_fops);
if(myGPIO_Major < 0)
PRINTK("register char device fail!\n");
return myGPIO_Major;
PRINTK("register myGPIO OK! Major = %d\n", myGPIO_Major);
#ifdef CONFIG_DEVFS_FS
devfs_myDriver_dir = devfs_mk_dir(NULL, "GPIO", NULL);
devfs_myDriver_raw = devfs_register(devfs_myDriver_dir, "raw0", DEVFS_FL_DEFAULT, myGPIO_Major, 0, S_IFCHR | S_IRUSR | S_IWUSR, &myGPIO_fops, NULL);
PRINTK("add dev file to devfs OK!\n");
#endif
return 0;
static void __exit myGPIO_exit(void)
/* Module exit code */
PRINTK("GPIO exit\n");
/* Driver unregister */
if(myGPIO_Major > 0)
#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_myDriver_raw);
devfs_unregister(devfs_myDriver_dir);
#endif
unregister_chrdev(myGPIO_Major, DRIVER_NAME);
return;
MODULE_AUTHOR("LiuFan");
MODULE_LICENSE("Dual BSD/GPL");
module_init(myGPIO_init);
module_exit(myGPIO_exit);
设备执行函数功能的实现将在下面完成。如结构体的函数,但并不是全都需要实现。open()函数中是执行一些设备工作前的初始化工作。rlease()则是将设备的相关寄存器恢复到原来的值。read()函数是将设备中的数据拷贝到内核,write()函数是将内核数据拷贝到对应的设备中。MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT两个宏是提供给系统对硬件资源进行控制访问的。在open()和rlease()两个函数中最基本的操作应是实现以上两个宏的操作。
static unsigned char myGPIO_Buffer[1024*1024];
/* Driver Operation Functions */
static int myGPIO_open(struct inode *inode, struct file *filp)
// int Minor = MINOR(inode->i_rdev);
// filp->private_data = 0;
MOD_INC_USE_COUNT;
PRINTK("myDriver open called!\n");
return 0;
static int myGPIO_release(struct inode *inode, struct file *filp)
// int Minor = MINOR(inode->i_rdev);
MOD_DEC_USE_COUNT;
PRINTK("myDriver release called!\n");
return 0;
static ssize_t myGPIO_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
char dat;
size_t read_size = count;
PRINTK("GPIO read called!\n");
PRINTK("\tcount=%d, pos=%d\n", count, (int)*f_pos);
/* if(*f_pos >= sizeof(myGPIO_Buffer))
PRINTK("[GPIO read]Buffer Overlap\n");
*f_pos = sizeof(myGPIO_Buffer);
return 0;
if((count + *f_pos) > sizeof(myGPIO_Buffer))
PRINTK("count + f_pos > sizeof buffer\n");
read_size = sizeof(myGPIO_Buffer) - *f_pos;
dat= GPFDAT;
copy_to_user(buf,&dat,1);
// *f_pos += read_size;
return read_size;
static ssize_t myGPIO_write(struct file *filp,const char *buf, size_t count, loff_t *f_pos)
char dat;
size_t fill_size = count;
PRINTK("myDriver write called!\n");
PRINTK("\tcount=%d, pos=%d\n", count, (int)*f_pos);
if(*f_pos >= sizeof(myGPIO_Buffer))
PRINTK("[myDriver write]Buffer Overlap\n");
*f_pos = sizeof(myGPIO_Buffer);
return 0;
if((count + *f_pos) > sizeof(myGPIO_Buffer))
PRINTK("count + f_pos > sizeof buffer\n");
fill_size = sizeof(myGPIO_Buffer) - *f_pos;
copy_from_user(&dat,buf,fill_size);
GPFDAT = dat;
// *f_pos += fill_size;
return fill_size;
控制ioctl() 函数则是提供给应用层的接口函数,功能并不是固定的,由开发者定义,一般都是对硬件的一些除过上述功能的其他操作。
static int myGPIO_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
int i;
unsigned int mask=0x01;
GPFUP = 0x00;
PRINTK("myGPIO ioctl called(%d)!\n", cmd);
switch(cmd)
case MOD_IN:
for(i=0;i<8;i++)
if((mask & arg)!=0x0)
GPFCON &=~(3<<i*2);
mask =mask << 1;
break;
case MOD_OUT:
PRINTK("IOCTRL 0 called(0x%lx)!\n", arg);
for(i=0;i<8;i++)
if((mask & arg)!=0x00)
GPFCON &= ~(3 <<( i*2));
GPFCON |=(0x01<<(i*2));
mask=mask<<1;
break;
case MOD_EXIT_INT:
PRINTK("IOCTRL 1 called(0x%lx)!\n", arg);
GPFDAT = 0xFFFFFF00;
break;
default:
break;
return 0;
USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总线,其目的是为了提供一种兼容不同速度的、可扩充的并且使用方便的外围设备接口,同时也是为了解决计算机接口的太多的弊端而设计的。一个USB系统主要有三部分组成:USB互连、USB主机、USB设备三部分组成的,其结构如图1 所示。在编写USB设备驱动程序设计时,可以分为三部分编写:主机端设备驱动程序、主机控制器驱动程序设计和设备端驱动程序三部分,在本文中重点介绍主机端驱动程序的设计。
二、USB设备驱动程序的设计
USB设备驱动程序的设计包括主机端设备驱动程序设计、主机控制器驱动程序设计和设备端驱动程序设计三部分组成。主机端设备驱动程序就是通常说的设备驱动程序,它是主机环境中为用户应用程序提供一个访问USB外设的接口。Linux为这部分驱动程序提供编程接口,驱动程序设计者只要按照需求编写驱动程序框架,通过调用操作系统提供的API接口函数可以完成对USB外设的特定访问。主机控制驱动主要是对USB主机控制器的驱动,在大多数PC环境下,主机控制器都是由操作系统提供。嵌入式设备一般都没有USB主机控制器,只是工作在 Slave模式下。如果要使USB具有主机功能,那么设备中需要选用一个带主机控制器的USB接口控制芯片,同时自己还要有实现该主机控制器的驱动程序。目前Linux内核中只提供USB主机控制器的开放主机控制器和通用主机控制器接口两种规格,而这两种规格主要用在PC架构中。USB主机端驱动程序与主机控制器的结构如图2所示。其中USB核是Linux的一个子模块,集中定义了一组USB相关的数据结构、宏以及API函数。
USB设备驱动程序是常说的设备固件程序的一部分,提供设备信息与主机的通信接口。设备端USB驱动程序设计由以下几部分处理程序组成。初始化例程:完成描述符指针、端点、配置改变等操作。数据传输例程:完成控制传输、批量传输、中断传输及同步传输等传输方式下的数据收发工作。标准设备处理请求:处理标准设备请求。厂商请求处理:处理生产商指定请求。其他操作:处理主机发出的端口复位、配置改变等操作。
1.USB设备驱动程序框架
USB驱动程序首先要向Linux内核注册自己,并告诉系统它所支持的设备类型以及它所支持的操作。这些信息通过一个usb_driver结构来传递。usb_driver结构如下:
static struct usb_driver skel_driver = {
name: "skeleton";/*驱动程序的名称*/
probe: skel_probe; /*设备列举时被调用*/
disconnect: skel_disconnect; /*设备被卸载时被调用*/
fops: &skel_fops; /*指向一个file_operation结构,内核通过它来访问驱动程序的文件操作函数,与用户程序的read、write等操作进行交互*/
minor USB_SKEL_MINOR_BASE; /*指向设备的次设备号,用于系统识别主设备号相同的设备(即一个驱动程序可以同时支持多个USB设备*/
id_table: skel_table; /*保存设备的厂商ID和产品ID,作为该设备的唯一标识,驱动程序向系统注册后,当下次插入时,系统根据这个标识查找正确的驱动程序,实现设备的即插即用*/
static struct file_operation skel_fops={
owner:THIS_MODULE,
read:skel_read,
write:skel_write,
ioctl:skel_ioctl,
open:skel_open,
release:skel_release,
(1)注册和注销
USB驱动程序注册,就是把在初始化函数中填好的use_driver结构作为参数传递给
use_register()函数即可,函数的调用方法为:result=usb_register(&skel_driver);
当要从系统卸载驱动程序时,也是将use_driver结构作为参数传递给usb_deregister 函数处理。 函数的调用格式为:
static void __exit usb_skel_exit(void)
{ /* deregister this driver with the USB subsystem */
usb_deregister(&skel_driver);
module_exit(usb_skel_exit);当USB设备插入时,为了使linux-hotplug(Linux中PCI、USB等设备热插拔支持)系统自动装载驱动程序,需要创建一个MODULE_DEVICE_TABLE。核心代码如下(这个模块仅支持某一特定设备):
/* table of devices that work with this driver */static struct usb_device_id skel_table [] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID,
USB_SKEL_PRODUCT_ID) },
{ } /* Terminating entry */
MODULE_DEVICE_TABLE (usb, skel_table);
USB_DEVICE宏利用厂商ID和产品ID提供了一个设备的唯一标识。当系统插入一个ID匹配的USB设备到USB总线时,驱动会在USB core中注册,驱动程序中probe 函数也就会被调用。usb_device 结构指针、接口号和接口ID都会被传递到函数中。
(2)probe()函数probe()函数的编写格式为:static void * skel_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);驱动程序需要确认插入的设备是否可以被接受,如果不接受,或者在初始化的过程中发生任何错误,probe()函数返回一个NULL值。否则返回一个含有设备驱动程序状态的指针,通过这个指针,就可以访问所有结构中的回调函数。
在驱动程序里,最后一点是要注册devfs(设备文件系统)。首先创建一个缓冲用来保存那些被发送给USB设备的数据和那些从设备上接受的数据,并为设备传输创建一个USB请求块(URB)以向设备写入数据,同时USB urb 被初始化,然后在devfs子系统中注册设备,允许devfs用户访问USB的设备。注册过程如下:
/* initialize the devfs node for this device and register it */
sprintf(name, "skel%d", skel->minor);
skel->devfs = devfs_register (usb_devfs_handle, name, DEVFS_FL_DEFAULT, USB_MAJOR, USB_SKEL_MINOR_BASE + skel->minor, S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH, &skel_fops, NULL);
如果devfs_register函数失败, devfs子系统会将此情况报告给用户。如果设备从USB总线拔掉,设备指针会调用disconnect 函数。驱动程序就需要清除那些被分配了的所有私有数据、关闭urbs,并且从devfs上注销调自己。调用函数的格式为:
/* remove our devfs node */
devfs_unregister(skel->devfs);
现在,skeleton驱动就已经和设备绑定上了,任何用户态程序要操作此设备都可以通过file_operations结构所定义的函数进行了。
(3)open()、write()和read()函数
首先,要打开此设备。在open()函数中MODULE_INC_USE_COUNT 宏是一个关键,它起到一个计数的作用,有一个用户态程序打开一个设备,计数器就加1。例如,以模块方式加入一个驱动,若计数器不为零,就说明仍然有用户程序在使用此驱动,这时候,就不能通过rmmod命令卸载驱动模块了。
/* increment our usage count for the module */
MOD_INC_USE_COUNT;
++skel->open_count;
/* save our object in the file's private structure */
file->private_data = skel;
当open完设备后,read()、write()函数就可以收、发数据了。
read()函数首先从open()函数中保存的fi。
Write()函数和read()函数是完成驱动对读写等操作的响应。在skel_write中,一个FILL_BULK_URB函数,就完成了urb 系统callbak和的skel_write_bulk_callback之间的联系。注意skel_write_bulkcallback是中断方式,所以要注意时间不能太久,本程序中它就只是报告一些urb的状态等。 read 函数与write 函数稍有不同在于:程序并没有用urb 将数据从设备传送到驱动程序,而是用usb_bulk_msg 函数代替,这个函数能够不需要创建urbs 和操作urb函数的情况下,来发送数据给设备,或者从设备来接收数据。调用usb_bulk_msg函数并传到一个存储空间,用来缓冲和放置驱动收到的数据,若没有收到数据表示失败并返回一个错误信息。usb_bulk_msg函数:当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当需要连续地对设备进行读/写时,应建立一个自己的urbs,同时将urbs 提交给USB子系统。
skel_disconnect函数:当释放设备文件句柄时,这个函数会被调用。
MOD_DEC_USE_COUNT宏也会被调用到(和MOD_INC_USE_COUNT刚好对应,它减少一个计数器),首先确认当前是否有其他的程序正在访问这个设备,如果是最后一个用户在使用,可以关闭任何正在发生的写,操作如下:/* decrement our usage count for the device */
--skel->open_count;
if (skel->open_count <= 0) {
/* shutdown any bulk writes that might be
going on */
usb_unlink_urb (skel->write_urb);
skel->open_count = 0;
/* decrement our usage count for the module */
MOD_DEC_USE_COUNT;
USB设备可以在任何时间点从系统中取走,即使程序目前正在访问它。USB驱动程序必须要能够很好地处理解决此问题,它需要能够切断任何当前的读写,同时通知用户空间程序:USB设备已经被取走。
2.设计实例
下面通过介绍键盘飞梭驱动程序的实例来让读者更好的理解USB驱动程序的工作原理,实现代码如下:
/*需要的头文件*/
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/kbd_ll.h>
/* 驱动程序版本信息*/
#define DRIVER_VERSION ""
#define DRIVER_AUTHOR " TGE HOTKEY "
#define DRIVER_DESC "USB HID Tge hotkey driver"
#define USB_HOTKEY_VENDOR_ID 0x07e4
#define USB_HOTKEY_PRODUCT_ID 0x9473
/*厂商和产品ID信息就是/proc/bus/usb/devices中看到的值,通过cat/proc/bus/usb/devices得到当前系统探测到的USB总线上的设备信息。它包括Vendor、ProdID、Product等*/
MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
/*此结构来自内核中drivers/usb/usbkbd.c*/
struct usb_kbd {
struct input_dev dev;struct usb_device *usbdev;
unsigned char new[8];
unsigned char old[8];
struct urb irq, led;
struct usb_ctrlrequest dr;
unsigned char leds, newleds;
char name[128];
int open;
static void usb_kbd_irq(struct urb *urb) /*urb为USB请求块*/
struct usb_kbd *kbd = urb->context;
int *new;
new = (int *) kbd->new;
if(kbd->new[0] == (char)0x01)
if(((kbd->new[1]>>4)&0x0f)!=0x7)
handle_scancode(0xe0,1);
handle_scancode(0x4b,1);
handle_scancode(0xe0,0);
handle_scancode(0x4b,0);
{ handle_scancode(0xe0,1);
handle_scancode(0x4d,1);
handle_scancode(0xe0,0);handle_scancode(0x4d,0);
printk("new=%x %x %x %x %x %x %x %x", kbd->new[0],kbd->new[1],kbd->new[2],kbd->new[3],
kbd->new[4],kbd->new[5],kbd->new[6],kbd->new[7]);
static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
struct usb_interface *iface;
struct usb_interface_descriptor *interface;
struct usb_endpoint_descriptor *endpoint;
struct usb_kbd *kbd;
int pipe, maxp;
iface = &dev->actconfig->interface[ifnum];
interface = &iface->altsetting[iface->act_altsetting];
if ((dev->descriptor.idVendor != USB_HOTKEY_VENDOR_ID) || (dev->descriptor.idProduct != USB_HOTKEY_PRODUCT_ID) || (ifnum != 1))
return NULL;
if (dev->actconfig->bNumInterfaces != 2)
return NULL;
if (interface->bNumEndpoints != 1) return NULL;
endpoint = interface->endpoint + 0;
pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
usb_set_protocol(dev, interface->bInterfaceNumber, 0);
usb_set_idle(dev, interface->bInterfaceNumber, 0, 0);
printk(KERN_INFO "GUO: Vid = %.4x, Pid = %.4x, Device = %.2x, ifnum = %.2x, bufCount = %.8x\\n", dev->descriptor.idVendor,dev->descriptor.idProduct,dev->descriptor.bcdDevice, ifnum, maxp);
if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL;
memset(kbd, 0, sizeof(struct usb_kbd));kbd->usbdev = dev;
FILL_INT_URB(&kbd->irq, dev, pipe, kbd->new, maxp > 8 ? 8 : maxp, usb_kbd_irq,kbd, endpoint->bInterval); kbd->irq.dev = kbd->usbdev;
if (dev->descriptor.iManufacturer) usb_string(dev, dev->descriptor.iManufacturer, kbd->name, 63);
if (usb_submit_urb(&kbd->irq)) {
kfree(kbd); return NULL; }
printk(KERN_INFO "input%d: %s on usb%d:%d.%d\\n", kbd->dev.number, kbd->name, dev->bus->busnum, dev->devnum, ifnum);
return kbd; }
static void usb_kbd_disconnect(struct usb_device *dev, void *ptr)
struct usb_kbd *kbd = ptr;
usb_unlink_urb(&kbd->irq);
kfree(kbd);
static struct usb_device_id usb_kbd_id_table [] = {
{ USB_DEVICE(USB_HOTKEY_VENDOR_ID, USB_HOTKEY_PRODUCT_ID) },
{ } /* Terminating entry */
MODULE_DEVICE_TABLE (usb, usb_kbd_id_table);
static struct usb_driver usb_kbd_driver = {
name: "Hotkey",
probe: usb_kbd_probe,
disconnect: usb_kbd_disconnect,
id_table: usb_kbd_id_table,
NULL,
static int __init usb_kbd_init(void)
usb_register(&usb_kbd_driver);
info(DRIVER_VERSION ":" DRIVER_DESC);
return 0;
static void __exit usb_kbd_exit(void)
usb_deregister(&usb_kbd_driver);
module_init(usb_kbd_init);
module_exit(usb_kbd_exit);USB规范是一门比较新的技术,接口使用方便,但是驱动程序的设计较复杂。上面介绍了USB设备驱动程序的设计,主要分析了主机端驱动程序的设计,并且给出了一个编写USB驱动程序的实例。
1.刘峥嵘.嵌入式Linux应用开发详界解.机械工业出版社,2004
2.周立功.ARM嵌入式Linux系统构件与驱动开发范例.北京航天航空大学出版社,2006
3.刘淼.嵌入式系统接口设计与Linux驱动程序开发.北京航天航空大学出版社,2006
经典书籍在这里集中,有些比较旧,但也值得参考,如果有朋友转载,请注明出处:小文论坛(http://www.wonyen.net/bbs/mboard.asp),并且与我们联系,尊重别人的成果,等于尊重自己,我们也感谢提供下载朋友,也希望有心的朋友提供自己的书籍,让这里成为最好的Linux书籍博物馆。1000本是目标,依靠大家支持!如果大家在这里找到好书最好跟个帖子,让我们知道辛苦的回应!
第一部分:Linux基础应用
1、《Linux从入门到精通》
http://www.gouhuo.com/study/linuxbook.zip
2、 Linux 系统安全与优化中文版
这本书的英文版“Get Acquainted with Linux Security and Optimization System”(简称LinuxSOS)是Linux文档计划(Linux Document Project)中比较新的一本指南。这本书不是Linux的入门书籍,读这本书需要有Linux或者Unix的背景知识。如果你已经安装过Linux而且能够使用一些简单的Unix命令,那么这本书会对你有很大的帮助。
http://www.linuxaid.com.cn/download/training/linuxsos-cn.pdf
3、Linux安装与配置简明手册 13-Aug-2002 16:14 20M
http://cpss.zz.ha.cn/study/linux ... %f7%ca%d6%b2%e1.zip
4、Linux编程白皮书.zip 13-Aug-2002 16:14 16M
http://cpss.zz.ha.cn/study/linux ... %d7%c6%a4%ca%e9.zip
5、Linux网站建设技术指南 13-Aug-2002 16:14 9.2M
http://cpss.zz.ha.cn/study/linux ... %f5%d6%b8%c4%cf.zip
6、Linux系统分析与高级编程 13-Aug-2002 16:14 11M
http://cpss.zz.ha.cn/study/linux ... %cc%bc%bc%ca%f5.zip
7、Linux系统管理白皮书.zip 13-Aug-2002 16:14 6.8M
http://cpss.zz.ha.cn/study/linux ... %d7%c6%a4%ca%e9.zip
8、Linux应用程序开发指南 13-Aug-2002 16:14 9.1M
http://cpss.zz.ha.cn/study/linux ... +%20Gnome%bf%e2.zip
9、Linux 24学时教程.zip 13-Aug-2002 16:14 34M
http://cpss.zz.ha.cn/study/linux ... %b1%bd%cc%b3%cc.zip
10、Red Hat Linux 6大全.zip 13-Aug-2002 16:15 33M
http://cpss.zz.ha.cn/study/linux ... 206%b4%f3%c8%ab.zip
11、Red Hat Linux 6管理工具 13-Aug-2002 16:15 13M
http://cpss.zz.ha.cn/study/linux ... %ed%b9%a4%be%df.zip
12、http://www.linuxsir.org/pdf/ebook1.rar
http://www.linuxsir.org/pdf/ebook2.rar
具体文章如下:
基础建设讨论专版:
Linux管理员手册
linux入门教程
linux指令大全
红旗版区的:
红旗桌面4正式版最新使用方法和问题解答100例
Linux shell进阶应用与shell编程
命令大集合
TCSH shell 编程
Bourne Shell及shell编程
Linux Shell简介
脚本精华欣赏
使用 Bash shell 脚本进行功能测试
Linux 发行版SuSE专题
SuSE 解决方案
13、Debian的中文FAQ 600k pdf
http://linuxdoc.51.net/download/Debian_cn_FAQ.pdf
14、Linux Kernel 核心手册(中文)552k zip
http://linuxdoc.51.net/download/Linux_Kernel_cn.zip
15、Linux + Solaris 48k pdf
http://linuxdoc.51.net/download/LinuxSolaris.pdf
16、Linux SOS 1.1 1.3M pdf
http://linuxdoc.51.net/download/linuxsos-11.pdf
17、SuSE官方汉化手册 1.4M pdf
http://linuxdoc.51.net/download/suse_guanfang_hanhua.pdf
18、Linux Kernel 1.3M pdf
http://linuxdoc.51.net/download/linux_kernel.pdf
19、Linux程序员指南 337k zip
http://linuxdoc.51.net/download/linux_program.zip
20、Linux高级技巧集 72k zip
http://linuxdoc.51.net/download/linux_gaoji_jiqiao.zip
21、OReilly Unix超级工具(第三版)
http://bbs.itebook.net/attachment.php?aid=621
http://bbs.itebook.net/attachment.php?aid=622
22、FreeBSD使用大全(Chm格式)
是王波写的一本专门介绍Freebsd的书籍,共94章,图文并茂,是不可多得的FreeBSD方面的教材。
http://www.linuxdby.com/download ... dde35e9c2&id=15
23、Redhat 9.0 官方中文安装指南
http://www.fcitx.org/flysail/rhl-ig-x86-zh_CN-9.tar.gz
Redhat 9.0 官方中文入门指南
http://www.fcitx.org/flysail/rhl-gsg-zh_CN-9.tar.gz
Redhat 9.0 官方中文定制指南
http://www.fcitx.org/flysail/rhl-cg-zh_CN-9.tar.gz
24、《Linux 新手管理员指南》
本书《Linux 新手管理员指南》是英文版LINUX NEWBIE ADMINISTRATOR GUIDE 的完整中文译本,共237页,PDF格式。
原版:http://linux-newbie.sunsite.dk/
下载:http://www.linuxdby.com/download ... dde35e9c2&id=51
25、Linux高级配置详解(PDG)
讲述在Linux*作系统下的软、硬件配置、网络应用配置、X Window系统配置以及内核的配置和编译等知识。
http://www.mycodes.net/down.asp?id=793&no=1
http://www.mycodes.net/down.asp?id=793&no=2
第二部分:Linux系统管理
1、Setting up a Local Area Network (EN)上载:5/9/2002
http://www.joyfire.net/compress/rh-lan.pdf
2、linux for mainframe (EN)上载:5/9/2002
http://www.joyfire.net/compress/linux4mainframe.zip
3、Linux Consultants Guide (EN)上载:1/9/2002
http://www.joyfire.net/compress/Consultants-Guide.html.tar.gz
4、LPI认证复习资料1 2 3 4 5 6 7 8上载:13/7/2002
http://www.joyfire.net/compress/l-lpi1.zip
http://www.joyfire.net/compress/l-lpi2.zip
http://www.joyfire.net/compress/l-lpi3.zip
http://www.joyfire.net/compress/l-lpi4.zip
http://www.joyfire.net/compress/l-lpi5.zip
http://www.joyfire.net/compress/l-lpi6.zip
http://www.joyfire.net/compress/l-lpi7.zip
http://www.joyfire.net/compress/l-lpi8.zip
5、Red Hat Network Basic User Reference Guide (EN)上载:13/7/2002
http://www.joyfire.net/compress/rhn-basic-urg-en-3.3.tgz
6、Red Hat Network Enterprise User Reference Guide (EN)上载:13/7/2002
http://www.joyfire.net/compress/rhn-enterprise-urg-en-1.1.tgz
7、Linux FAQ 在线浏览 上载:11/6/2002
http://www.joyfire.net/compress/Linux-FAQ.html.tar.gz
http://www.joyfire.net/Linux-FAQ/index.html
8、Linux系统分析与高级编程技术上载:4/5/2002
http://www.joyfire.net/compress/linux_advanced_technology.zip
9、RedHat Linux网络管理工具上载:4/5/2002
http://www.joyfire.net/compress/ ... gement_Tools_CN.zip
10、Linux管理指南上载:4/5/2002
http://www.joyfire.net/compress/Linux_Management_CN.zip
11、GNU Linux 高级网络应用服务指南上载:4/5/2002
http://www.joyfire.net/compress/ ... d_network_Guide.zip
12、inux环境数据库管理员手册上载:4/5/2002
http://www.joyfire.net/compress/Linuxdb.zip
13、Complete Linux Command Reference (EN)上载:4/5/2002
http://www.joyfire.net/compress/ ... mmand_Reference.zip
14、Bugzilla-Guide (EN) 上载:20/4/2002
http://www.joyfire.net/compress/Bugzilla-Guide.html.tar.gz
15、Llinuxcookbook (EN) 在线浏览 上载:20/4/2002
http://www.joyfire.net/compress/linuxcookbook-1.2.html.tar.gz
http://www.joyfire.net/linuxcookbook/index.html
16、Linux HOWTO (EN)(9.8M) 在线浏览 中文版和miniHOWTO (EN) 中文版上载:13/3/2002
http://www.joyfire.net/compress/Linux-html-HOWTOs.tar.gz
http://www.joyfire.net/HOWTO/HOWTO-INDEX/howtos.html
http://www.joyfire.net/compress/newhowto_cn.zip
http://www.joyfire.net/compress/ ... TOs-20020420.tar.gz
http://www.joyfire.net/compress/minihow_cn.zip
17、Advanced Bash-Scripting Guide(EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/abs-guide.html.tar.gz
http://www.joyfire.net/abs-guid/index.html
18、Securing and Optimizing Linux RedHat Edition -A Hands on Guide(EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/ ... on-v1.3.html.tar.gz
http://www.joyfire.net/solrhe/Se ... ion-v1.3/index.html
19、CVS Best Practices(EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/CVS-BestPractices.html.tar.gz
http://www.joyfire.net/CVS-BestPractices/index.html
20、The Linux System Administrators' Guide(EN) 在线浏览 中文版上载:1/1/2002。
http://www.joyfire.net/compress/sag.html.tar.gz
http://www.joyfire.net/sag/index.html
http://www.joyfire.net/compress/Linuxsys.zip
21、The Linux Network Administrator's Guide, 2e (EN) 在线浏览 上载:1/1/2002
http://www.joyfire.net/compress/nag-2.0.html.tar.gz
http://www.joyfire.net/nag2/index.html
22、Linux System Administration Made Easy (EN) 在线浏览 上载:1/1/2002
http://www.joyfire.net/compress/lame.html.tar.gz
http://www.joyfire.net/lame/index.html
23、AKA讲座 (a link)上载:1/1/2002
http://bj.aka.org.cn/Lectures/index.html
24、ORACLE for linux install handbook (EN)上载:1/1/2002
http://www.joyfire.net/compress/installguide_linux102.pdf
25、Redhat 7.2 install handbook (EN)上载:1/1/2002
http://www.joyfire.net/compress/rhl-ig-x86-en-72.tgz
26、Linux安全最大化(PDG)
介绍Linux安全基础,如何防御口令攻击和数据攻击角度来讨论Linux用户安全,Linux网络安全,各种Internet服务的安全性、防火墙、入侵检测、日志和审计跟踪以及灾难恢复等.
http://www.mycodes.net/down.asp?id=827&no=1
http://www.mycodes.net/down.asp?id=827&no=2
27、Linux高级配置详解(PDG)
讲述在Linux*作系统下的软、硬件配置、网络应用配置、X Window系统配置以及内核的配置和编译等知识。
http://www.mycodes.net/down.asp?id=793&no=1
http://www.mycodes.net/down.asp?id=793&no=2
28、Running Linux(EN)上载:23/9/2003
http://joyfire.net/compress/running_linux_4e.pdf
29、Learning Red Hat Linux(EN)上载:23/9/2003
http://joyfire.net/compress/learning_redhat_linux.pdf
30、Learning the Unix Operating System(EN)上载:23/9/2003
http://joyfire.net/compress/Learning_the%20UNIX_OS.pdf
31、Linux Programming Unleashed(EN)上载:23/9/2003
http://joyfire.net/compress/linux_programming_unleashed.pdf
第三部分:Linux代码编写
1、POSIX threads explained(EN)上载:5/9/2002
http://www.joyfire.net/compress/linuxthreads.zip
2、Emacspeak User's Guide (EN)上载:1/9/2002
http://www.joyfire.net/compress/espk-ug.html.tar.gz
3、MICO文档 (EN)上载:1/9/2002
http://www.joyfire.net/compress/mico-doc-html.tar.gz
4、GNU Autotools Guide (EN)上载:13/7/2002
http://www.joyfire.net/compress/autobook-1.3.tar.gz
5、Linux Threads FAQ 在线浏览 上载:11/6/2002
http://www.joyfire.net/compress/Threads-FAQ-html.tar.gz
http://www.joyfire.net/Threads-FAQ/index.html
6、Linux系统分析与高级编程技术上载:4/5/2002
http://www.joyfire.net/compress/linux_advanced_technology.zip
7、ELF文件格式 (EN)上载:10/5/2002
http://www.joyfire.net/compress/elf.pdf
8、Bugzilla-Guide (EN) 在线浏览 上载:20/4/2002
http://www.joyfire.net/compress/Bugzilla-Guide.html.tar.gz
9、The Linux Programmer's Guide (EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/lpg.html.tar.gz
http://www.joyfire.net/lpg/index.html
10、CVS Best Practices(EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/CVS-BestPractices.html.tar.gz
http://www.joyfire.net/CVS-BestPractices/index.html
11、Advanced Bash-Scripting Guide(EN) 在线浏览 上载:11/3/2002
http://www.joyfire.net/compress/abs-guide.html.tar.gz
http://www.joyfire.net/abs-guid/index.html
12、Linux设备驱动程序(CH)(Linux Device Drivers): 在线浏览 上载:1/3/2002
http://www.joyfire.net/lsdp/index.htm
13、The Linux Kernel Module Programming Guide (EN) 在线浏览 中文版上载:1/1/2002
http://www.joyfire.net/compress/lkmpg.html.tar.gz
http://www.joyfire.net/lkmpg/index.html
http://www.joyfire.net/compress/lkmpg_cn.rtf.zip
14、AKA讲座(a link)上载:1/1/2002
http://bj.aka.org.cn/Lectures/index.html
15、i386 Reference Programmer's Manual(EN)上载:6/10/2003
http://joyfire.net/386ASM/index.htm
http://www.joyfire.net/compress/netxiong-linux.zip
2、CML2 Language and Tools Description(EN)上载:12/ 7/2003
http://www.joyfire.net/compress/cml2.pdf
3、Z8530 Programming Guide(EN)上载:11/ 7/2003
http://www.joyfire.net/compress/z8530book.pdf
4、Synchronous PPP and Cisco HDLC Programming Guide(EN)上载:11/ 7/2003
http://www.joyfire.net/compress/wanbook.pdf
5、Video4Linux Programming(EN)上载:11/ 7/2003
http://www.joyfire.net/compress/videobook.pdf
6、The Linux 2.4 Parallel Port Subsystem(EN)上载:11/ 7/2003
http://www.joyfire.net/compress/parportbook.pdf
7、MCA Driver Programming Interface(EN)上载:11/ 7/2003
http://www.joyfire.net/compress/mcabook.pdf
8、The Linux Kernel API(EN)上载:9/ 7/2003
http://www.joyfire.net/compress/kernel-api.pdf
9、Unreliable Guide To Hacking The Linux Kernel(EN)上载:9/ 7/2003
http://www.joyfire.net/compress/kernel-hacking.pdf
10、Unreliable Guide To Locking(EN)上载:9/ 7/2003
http://www.joyfire.net/compress/kernel-locking.pdf
11、OSDesign上载:18/3/2003
http://www.joyfire.net/compress/OSDesign-0.0.6.1.zip
12、Linux Kernel 2.4 Internals(EN)上载:18/3/2003
http://www.joyfire.net/compress/lki.html.tar.gz
13、Compiling the linux kernel(EN)上载:5/9/2002
http://www.joyfire.net/compress/compile_kernel.pdf
14、OSKit项目源代码、论文和文档上载:13/7/2002
http://www.joyfire.net/compress/oskit-20020317.tar.gz
http://www.joyfire.net/compress/oskit-papers.zip
http://www.joyfire.net/compress/oskit.html.tar.gz
15、GNU Autotools Guide (EN)上载:13/7/2002
http://www.joyfire.net/compress/autobook-1.3.tar.gz
16、Compile linux kernel (EN)上载:12/7/2002
http://www.joyfire.net/compress/compilekernel.zip
17、Intel体系结构参考手册 (EN)和Intel体系结构手册 (EN)上载:16/5/2002
http://www.joyfire.net/compress/Architecture_Reference.pdf
http://www.joyfire.net/compress/Architecture.pdf
18、IA32体系结构设计手册卷一 (EN)上载:16/5/2002
http://www.joyfire.net/compress/IA32-1.pdf
19、IA32体系结构设计手册卷二 (EN)上载:16/5/2002
http://www.joyfire.net/compress/IA32-2.pdf
20、IA32体系结构设计手册卷三 (EN)上载:16/6/2002
http://www.joyfire.net/compress/IA32-3.pdf
21、ELF文件格式 (EN)上载:10/5/2002
http://www.joyfire.net/compress/elf.pdf
22、Linux系统分析与高级编程技术上载:4/5/2002
http://www.joyfire.net/compress/linux_advanced_technology.zip
23、The Linux Kernel (EN) 在线浏览 中文版上载:10/3/2002。
http://www.joyfire.net/compress/tlk.html.tar.gz
http://www.joyfire.net/tlk/tlk.html
http://www.joyfire.net/compress/Linux_Kernel_CN.zip
24、Linux From Scratch (EN) 在线浏览 上载:10/3/2002。
http://www.joyfire.net/compress/LFS-3.1.html.tar.gz
http://www.joyfire.net/lfs/index.html
25、Linux设备驱动程序(CH)(Linux Device Drivers): 在线浏览 上载:1/3/2002
http://www.joyfire.net/lsdp/index.htm
26、华中理工大学98级研究生linux系统分析报告上载:10/2/2002。
http://www.joyfire.net/compress/98_tar.tar.gz
27、华中理工大学96级本科生linux系统分析报告上载:10/2/2002。
http://www.joyfire.net/compress/96_tar.tar.gz
28、The Linux Kernel Module Programming Guide (EN) 在线浏览 中文版上载:1/1/2002
http://www.joyfire.net/compress/lkmpg.html.tar.gz
http://www.joyfire.net/lkmpg/index.html
http://www.joyfire.net/compress/lkmpg_cn.rtf.zip
29、The Linux Kernel Hackers' Guide (EN) 在线浏览 上载:1/1/2002
http://www.joyfire.net/compress/khg.html.tar.gz
http://www.joyfire.net/khg/index.html
30、AKA讲座(a link)上载:1/1/2002。
http://bj.aka.org.cn/Lectures/index.html
31、Linux内核情景分析(上),Linux内核情景分析(下)上载:6/10/2003
http://joyfire.net/compress/linuxqjfx1.pdf
http://joyfire.net/compress/linuxqjfx2.pdf
第五部分:Unix优秀电子书籍
1、莱昂氏UNIX源代码分析13-Aug-2002 16:13 13M
http://cpss.zz.ha.cn/study/unix/ ... %eb%b7%d6%ce%f6.zip
2、实践大师:UNIX awk和sed编程篇13-Aug-2002 16:13 6.7M
http://cpss.zz.ha.cn/study/unix/ ... %e0%b3%cc%c6%aa.rar
3、实践大师:unix shell编程篇13-Aug-2002 16:13 7.2M
http://cpss.zz.ha.cn/study/unix/ ... %e0%b3%cc%c6%aa.rar
4、HP-UX System and Network Fundermental 13-Aug-2002 16:13 7.4M
http://cpss.zz.ha.cn/study/unix/ ... %20Fundermental.pdf
5、LINUX与UNIX Shell编程指南13-Aug-2002 16:12 19M
http://cpss.zz.ha.cn/study/unix/ ... %cc%d6%b8%c4%cf.zip
6、UNIX环境高级编程.zip 13-Aug-2002 16:12 18M
http://cpss.zz.ha.cn/study/unix/ ... %b6%b1%e0%b3%cc.zip
7、UNIX教程网络篇.zip 13-Aug-2002 16:13 13M
http://cpss.zz.ha.cn/study/unix/ ... %f8%c2%e7%c6%aa.zip
8、UNIX系统安全工具.zip 13-Aug-2002 16:13 6.6M
http://cpss.zz.ha.cn/study/unix/ ... %ab%b9%a4%be%df.zip
9、hp-ux系统和网络管理.rar 13-Aug-2002 16:13 4.2M
http://cpss.zz.ha.cn/study/unix/ ... %e7%b9%dc%c0%ed.rar
10、scounix系统管理员宝典13-Aug-2002 16:12 21M
http://cpss.zz.ha.cn/study/unix/ ... %b1%b1%a6%b5%e4.rar
11、shell编程和unix命令.rar 13-Aug-2002 16:12 17M
http://cpss.zz.ha.cn/study/unix/ ... nix%c3%fc%c1%ee.rar之前我介绍了很多在线软件,而说到在线软件,不能不提在线操作系统(WebOS),相比起单个的在线软件,在线操作系统功能更全面,所有功能都是基于浏览器(如果你所在的地方禁用的MSN,不妨尝试使用WebOS来登录)。有人相信webOS会成为未来的主流,因为和在线软件一样,你能在任何地方连接到自己的工作平台和文件存储。这里介绍20多个WebOS,其中有不少是提供中文界面的。
1、I-Cube
提供1G的在线存储和文件共享,多媒体支持和一些常用办公工具。同时拥有一个email客户端和编程开发工具。
2、EyeOS
EyeOS是一个开源软件,可以下载使用也可以在其服务器上在线使用。拥有丰富的网络程序以及办公套件。个性化强度高。
使用了大量的Web2.0元素构造,使用了大量的AJAX和Jacascript,因此它使用起来是相当方便的,即使在没有互联网连接的情况下也可以使用。
4、Zimdesk
Zimdesk提供的应用程序可以用琳琅满目来形容,从办公应用到多媒体应用,从文件管理到网络电视,又或者从RSS订阅到聊天工具,功能可谓是很好很强大。
5、Glide OS
一个需要flash支持的在线操作系统,除了提供Web入口之外,还提供移动网络入口。提供的程序和Zimdesk大同小异,不过有点杂乱。
顾名思义,这是一个以Widget为基础构成的WebOS,由于Widget的开放性,这个OS提供功能必将会越来越强大。
7、Peepel
与其说在线操作系统,不如说Peepel是一个在线办公应用,和Zoho,Google Docs是大同小异的。相比之下,我更喜欢Zoho。
8、Xindesk
一个免费在WebOS,支持所有的文件在线存储,日程管理,联系人资料等等。有点像Vista?
9、YouOS
YouOS是一个非常优秀的WebOS,使用JavaScript来与服务器交换数据,在进行下一步操作之前,上一步的操作会被记录,方便返回。另外,YouOS在在线协同操作方面做得非常优秀。
10、Widgetop
注意,你不能使用IE来登入这个WebOS!Firefox,Safari等都没有问题。即使是iPhone的浏览器也可以。由于又是基于Widget的,其扩展性是相当强的。
11、CorneliOS
13、Appmarks
一个用于iPhone和iPod Touch的在线操作系统, 事实上从外观看来也很有“水果商”的感觉。
14、Craythur
Craythur在界面设计上花了不少功夫,直观看起来和windows非常相似。
15、Desktoptwo
Desktoptwo不但拥有华丽的界面,其可操作性也是非常强大的,和其它很多webOS不同,它的所有应用程序都是用php语言编写的,并且都支持拖曳操作。
16、Ghost
此Ghost并非彼Ghost,这个是G.ho.st,但和赛门铁克的Ghost有几分相似,因为它也是经常做“备份”的操作。G.ho.st提供的功能也是相当强大的,而且界面看起来比较舒服。
17、Orca
OK,你的确很喜欢Vista,那么orca将会非常适合你。从截图你可以看出它有多像Vista,目前Orca的所有项目已经迁移到StartFoce上去。
18、SSOE
19、Purefect
20、Goowy
以上20个WebOS介绍摘译自My10sen。
21、TomOS
不能不提的中文webOS服务,很多功能都是符合中国人的使用习惯的,因此使用起来会非常得心应手。
22、Jooce
一个基于flash的webOS,支持的语言达10多种,当然其中包括中文。使用起来非常舒服,其速度也是相当可以的。但我在使用时总出现图片出错的情况,莫非我的图片是不雅照?
Android平台介绍 http://www.loveandroid.com/
Google android介绍http://www.loveandroid.com/viewthread.php?tid=72&extra=page%3D2
http://topic.csdn.net/u/20080314/08/8eb27070-cc44-48be-af11-dc6da4023441.html
Android是什么? Android是一个针对移动设备的程序集, 其中包括一个操作系统, 一个中间件和一些关键性应用. 本文首先概览了Android SDK提供的工具和APIs, 当您在使用Java语言来开发Android平台的应用时您会用到它们.
1.程序程序框架可重用及可复写组件组成
2.针对移动设备优化过的JAVA Dalvik虚拟机,采用流行的JAVA进行应用开发
3.整合浏览器, 该浏览器基于开源的WebKit引擎开发
4.提供了优化过得图形系统, 该系统由一个自定义的2D图形库; 一个遵循OpenGL ES 1.0标准(硬件加速)的3D图形库组成
5.使用SQLite来实现结构化数据的存储
6.媒体方面对一些通用的audio, video, 和图片格式提供支持(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)
7.GSM技术(依赖硬件)
8.蓝牙, EDGE, 3G和WiFi(依赖硬件)
9.Camera, GPS, 指南针, 和加速计 (依赖硬件)
10.非常丰富的开发环境, 包括一个设备模拟器, 调适工具, 内存和效率调优工具和一个Eclipse的插件
Android的结构
下图展示了Android 操作系统的主要组件结构. 每一部分都在下面的段落有详细介绍
1.应用程序 Android会附带一些核心的应用程序, 包括一个email客户端, 短信程序, 日历, 地图, 浏览器, 通讯录等.
2.所有的应用程序都是由Java语言完成的.
3.应用程序框架 开发人员可以跟那些核心应用一样, 拥有访问框架APIs的全部权限. 应用的系结构设计简化了各组件之间的重用;任何应用都可以分发自己的组件, 任何应用也可以使用这些分发的组件(应用的使用方法需遵循框架的安全性约束)。这个机制对用户来说同样适用, 他们也可以替换组件.
隐藏在每个应用后面的是一套服务和系统, 其中包括:
1.一套表现丰富,扩展性很强的View, 通过这些View您可以创建包括list, grid, 文本框, 按钮, 甚至一个嵌入浏览器的应用
Content Providers, 通过它可以在某个应用内访问其他应用的数据(例如通讯录), 或者共享自己的数据
Resource Manager, 提供对静态资源的访问能力, 例如国际化文本和layout文件
Notification Manager, 通过该机制, 所有的应用都可以在状态栏显示自己的提醒信息
Activity Manager, 用于管理应用的生命周期, 并且提供了通用的向后导航功能
2.库 Android 包含一套C/C++库, 被用于Android 系统中的各种组件中. 这些功能通过Android 应用框架展现给开发人员. 下面列出一些核心库:
System C library - 实现了BSD-derived 的标准C系统库(libc), 用于嵌入式的基于Linux的设备
Media Libraries - 基于PacketVideo的 OpenCORE; 该库提供了对许多流行的音频和视频格式的播放回放和录制功能, 同样包括静态图片文件, 包括MPEG4, H.264, MP3, AAC, AMR, JPG, 和 PNG 等
Surface Manager - 用于管理不同应用对图形显示子系统和2D和3D图形层的访问
LibWebCore - 一个时尚的web浏览器引擎, 为Android浏览器和内嵌的web view提供实现
SGL - 隐藏的2D图形引擎
3D libraries - 基于OpenGL ES 1.0 APIs实现的库; 该库用于3D图形加速或提供高优化的3D软件光栅器
FreeType - 位图和向量模式的字体绘制
SQLite - 一个强大的, 轻量的关系型数据库引擎, 用于所有的应用
Android 运行时 Android包含一组核心库, 提供了Java语言核心库内的大部分功能.
3.每一个Android应用运行在自己的进程里, 用该应用自己的Dalvik 虚拟机实例. Dalvik 可以让一个设备高效的运行很多个VM. Dalvik 虚拟机执行Dalvik Executable (.dex)格式的文件, 该格式的文件经过优化 占用很小的内存. 该虚拟机是基于存储器的, 运行经过Java语言编译器的类, 这些类通过"dx"工具被转换成.dex格式.
4.Dalvik 虚拟机依赖Linux kernel 来实现一些潜在功能, 例如线程和底层内存管理.
5.Linux Kernel Android基于Linux version 2.6内核来提供系统的核心服务, 例如安全机制, 内存管理, 进程管理, 网络堆栈和驱动模块. 该内核还扮演着一个虚拟的中间层, 该层介于硬件和其余的软件堆栈.
成功八大资源:请在35岁前搞掂
一切成功都是“一三五八成功模式”,这是《一生的保证》这本书的核心脉络,也是我八年研究成功学得出的结论,那些成功的人没有谁离开了这模式。那么“八”是什么呢?
类的一切设想都必须基于材料来实现,成功也毫无例外需要材料。所谓实现就是转化,成功是什么东西转化来的呢?显然还是物质、能量、信息,因为这世界除此之
外再无别的东西。但是物质、能量、信息是从最基本的哲学层面来说的,它并不具备操作性。你这一辈子可操作的资源不过八种:财富资源、信息资源、能力资源、
品质资源、人际资源、健康资源、时间资源、空间资源。
一、积累财富 。金钱不是万能的,没钱是万万不能的,一句话没钱决不会成功。从你降生一刻起,从你喝第一口奶始, 物质就开始左右着你的命运。你的成长、你的教育以及人生的一切收获都是财富投资的结果。在你不能独立之前,财富决定着你,在你独立于社会后,财富影响着 你,即使是成功的人也要为此耗掉半生精力。在这个多变的职业世界里,你不会永远在一个地方工作,在一个岗位上淋漓尽致地发挥自己,当你感到无法施展时,你 会辞职或创业,如果你事先储蓄了足够的钱,将给你的成功奠定坚实的基础。
二、吸收信息 。是信息造就了我们人,当然也是信息造就了我们的成功。一切创造、认知、判断都来源于信息,成功就 是不断吸收知识信息变成积木,然后按照你的规则把它搭出来。但我们最最核心的信息是某一专业的系统信息,你必须学会本行业所需要的一切知识并有见解。每个 人在年轻时都可能有过彻夜不眠、刻苦攻读,这在20岁甚或30岁都没有问题,但到了35岁,就不应该再为学习基本技能而大伤脑筋了。35岁应该是专家了, 在学术上差不多是副教授,基本上完成信息的积累,35岁之后就应该勃发了,可惜的是,许多人到四十岁了在本行业还没入门,他们的知识太缺乏系统,缺乏深度
三、训练能力 。能力=知识+训练,这是我的一个简化公式,不是心理学上的专业名词解释。掌握知识与智力有关,不 同类型的智力遗传度在35%~96%之间,而且95%以上都是正常的,智商低于70的弱智儿童全人口只占3%,所以我们先天性地就获得巨大资源,但这还不 是一个人全部的心理资源,甚至也不是开发出来的资源。高智商的人解决问题容易一些,但不等于成功就容易一些,世上有多少事非智商180不能做呢?只要智力 正常,就足够成功了,关键有没有把知识发挥出来用到实处的能力。第四章节“十全四美”十四种能力总有某几种是你的优势,你要用得炉火纯青,所谓“样样通样 样松”“一招鲜吃遍天”。十八般武艺你总要精一样,到35岁还不知自己的长处和短处是相当麻烦的,但不管怎样基本能力如表达、沟通、收集信息等每天都要 练。各种能力都极大地依赖于后天锻练与发掘,这才是一个人真正的心理资源,它与外界一切资源一样是取之不尽的,一个人到底能干些什么,谁也不知道,即便是 爱因斯坦也只是用了他潜能的一小部分。
四、磨练品质 。也是心理资源的一部分,它渗透到外面的部分就是人格魅力。一个人能不能把八大资源吸引到自己身 上,能否承托起八大资源的负载,又能否把资源用到极至,靠的就是他的品质。俗话说大事做人,做的就是品质。年轻时犯错误,可以说是不成熟,但人家不会说你 品质有问题,当被人说品质有问题时,一辈子都完了。“1358”里的五大品质已经说过了,此不多说,再强调一点到35岁还没有形成风格魅力、人格魅力,下 半子希望不大。
五、扩大人际 。资源的配置是不平衡的,你所需要的许多资源都在别人手里,可在他手里并不当作资源,同样你身上闲 置的东西也可能是别人苦苦追寻的东西。社会分工越来越细,任何有价值的工作都不可能由一个人完成。如果到了35岁你仍未建立起牢固的人际关系网,那你就有 麻烦了。这个人际关系网包括你的朋友、亲人、同爱好、同事、行业的骄骄者、新闻媒介等,最低限度包括所有可以互相帮助的人。其中家庭是第一人际关系网,家 庭不保、情感生活不愉快的人很能有大发展。人际关系网不是一朝一夕就能建立起来的,它需要几年甚至十几年的培养,同时也需要终生的维护。臭清高是中国知识 分子的一大悲哀,至到现在还有许多人意识不到自己失败的原因。所有的资源都需要你拿出精力去获取去交换,也就是说资源背后是成本,人际成本是必须花的,甚 至还相当高昂,因为它比任何一种资源带来的回报都大。
六、保持健康。 这是支撑我们一辈子的物质和能量资源。五十岁前用健康换金钱,五十岁后用金钱换健康,这是有道理 的。只有健康资源的连续可用,我们的成功才有保证。35岁身体开始走下坡路了,可以说下半辈子都是吃老本,如果没有老本吃,那就完了。考察成功人士,一个 显要特征就是精力充沛,他们把健康资源优势发挥到最大程度。可以说每个人都有深刻的体验,一生病我们所有的愿望都萎缩了,一旦精神好转,我们理想的云帆又 高扬起来。而还有一些人,终因健康资源的断缺而成为悲剧英雄。
七、珍惜时间。 时间是老生常谈的两个字,因而也就成了视而不见的资源。一幢大楼,人们只知道它由砂、石、水泥、 钢筋砌成,却不知道还有六个月的时间也砌在里面了,如果只给你一天时间,这个世界将没有大楼。坏就坏在世上没有一天的时间,有的只是无穷无尽的时间,它不 需要再生,而是永生,所以我们不到生命的结束,意识不到它的荒废和飞逝。年轻时你还浪费得起,到35岁你还不能有效地利用时间,还在一切无聊与懒散中,还 在弥补35前的漏洞中,可真危险了。
八、扩展空间。 人是动物,动物的优势就是能自由地利用空间。但并不是每个人都能意识到空间是他的资源。以商业为 例,竞争的较量来较量去最后都到空间上来了,国际资本的全球渗透到了空前地步,如果不开放空间,哪有什么跨国公司,哪有什么连锁企业?毫无空间概念、更无 空间资源概念的人,他们在心理上已经注定是没有多少成长要求的人,他们无所谓成长,当然也就无所谓成功。不知您们相不相信,我身边一些35岁的人还没出过 省,他们都是大学毕业哦。
八种资源大致可分对应的四组,它们在同一轴上是同向增减的互动关系,成功资源图也就是成功熵势图,以总面积表示。一切资源都可以相互转化,从图示上 也是如此,增加任何一个轴,增加的都是总面积,都反应在任何一个轴上,反之亦然。但任何资源都不可以相互替代,西谚云:The trouble with being poor is taking up all your time。善哉!金钱可以买时间,但金钱绝不能替代时间,人际可以弥补才能,但决不可以替代才能。资源不是平均分布,要想总面积最大,那就是全面发展的圆 周,可以像车轮一样飞奔,而奇形怪状则很难滚动起来。很多人寄望于一种资源,那就是能力资源里的智力因素,抱有希望或每每埋怨的也都是它,以为只要有了它 就万事大吉了,即使这一种资源也可能只用了五分之一,而其它的七又五分之四资源都被白白浪费了,所以你一生中实际资源利用率是四十分之一,2.5%,这就 是你的成功概率。而成功人士,都是珍惜资源,并且把资源使用到极至的人。摘自黄怀宁《一生的保证》。
推荐几款不错的python编辑器吧。这里推荐的几个并不是像vim,emacs一类的老牌编辑器,而是主要 针对python的编辑器。在我看来,我所需要的代码编辑器的功能,包括代码折叠,语法高亮,行号显示,代码提示,当然能够你IDE一样加入调试和执行功 能就再好不过了。今晚我介绍几款,这些功能上面参差不齐,希望对有需要的朋友有所帮助。
【硬件编程咨询】C语言资料大全
◆经典C源程序100例:http://post.baidu.com/f?kz=8618367
◆时钟的驻留程序:http://post.baidu.com/f?kz=10822377
◆数据结构暨若干经典问题和算法:http://post.baidu.com/f?kz=10922856
◆LIUXUY 磁盘系统源程序:http://post.baidu.com/f?kz=12973347
◆RLE压缩:http://post.baidu.com/f?kz=12592570
◆快速排序:http://post.baidu.com/f?kz=12262349
◆全排列的递归算法:http://post.baidu.com/f?kz=12248706
◆KMP字符串搜索算法:http://post.baidu.com/f?kz=12143581
◆C高效编程四招:http://post.baidu.com/f?kz=13192245
◆无栈非递归二叉树遍历:http://post.baidu.com/f?kz=12394188
◆跟我学NETBSD内核源码:http://post.baidu.com/f?kz=12201581
◆Linux源码:http://post.baidu.com/f?kz=12692827
◆C语言中不定参数的实现http://post.baidu.com/f?kz=19232306
◆一个有关 FreeBSD 的网站:http://post.baidu.com/f?kz=14828500
◆c51系列仿真器:http://post.baidu.com/f?kz=14332652
◆brainf*ck 语言的解释器http://post.baidu.com/f?kz=15998145
◆怎样用c写游戏:http://post.baidu.com/f?kz=5417859
◆本吧游戏编程相关:http://post.baidu.com/f?kz=11867577
◆简单的病毒程序:http://post.baidu.com/f?kz=5558054
◆迷宫游戏:http://post.baidu.com/f?kz=5781985
◆QQ好友管理程序:http://post.baidu.com/f?kz=5071518
◆销售监控程序:http://post.baidu.com/f?kz=6352894
◆简单的仓储管理系统:http://post.baidu.com/f?kz=7316990
◆简单的电话储存系统:http://post.baidu.com/f?kz=7257980
◆模拟电子时钟的程序:http://post.baidu.com/f?kz=7519467
◆计算任意一天是星期几:http://post.baidu.com/f?kz=8329211
◆打印任意月份日历:http://post.baidu.com/f?kz=8880741
◆分类记事本:http://post.baidu.com/f?kz=8154266
◆TC2编程图片处理利器:http://post.baidu.com/f?kz=11163580
◆printf写的游戏:http://post.baidu.com/f?kz=11162185
◆人机对战扑克游戏:http://post.baidu.com/f?kz=11366672
◆俄罗斯方块:http://post.baidu.com/f?kz=12145169
◆俄罗斯方块:http://post.baidu.com/f?kz=16028030
◆文本加密例程:http://post.baidu.com/f?kz=11968123
◆给一行文字设置密码加解密:http://post.baidu.com/f?kz=20205053
◆破解BIOS密码:http://post.baidu.com/f?kz=12230804
◆贪吃蛇1代:http://post.baidu.com/f?kz=30512251
◆完整的贪吃蛇游戏:http://post.baidu.com/f?kz=31119717
◆贪吃蛇:http://post.baidu.com/f?kz=19624003
◆学生成绩系统(C++版) http://post.baidu.com/f?kz=6640660
◆图书馆管理系统http://post.baidu.com/f?kz=22241061
◆图书管理系统http://post.baidu.com/f?kz=17682927
◆万年历http://post.baidu.com/f?kz=17197492
◆判断闰年http://post.baidu.com/f?kz=16137615
◆万年历http://post.baidu.com/f?kz=20493202
◆变化的同心圆http://post.baidu.com/f?kz=18056765
◆通讯录 http://post.baidu.com/f?kz=22775724
◆C语言通讯录(数组):http://post.baidu.com/f?kz=37202204
◆飞机票订购系统http://post.baidu.com/f?kz=21296518
◆又一个计算器:http://post.baidu.com/f?kz=24283347
◆一个级数:http://post.baidu.com/f?kz=16708781
◆四则运算计算器http://post.baidu.com/f?kz=22279483
◆二叉树排序树上实现学生信息管理http://post.baidu.com/f?kz=21436251
◆判断回文字符串:http://post.baidu.com/f?kz=21815959
◆教小学生算术:http://post.baidu.com/f?kz=22322599
◆六籽弹小游戏http://post.baidu.com/f?kz=17637684
◆黑白棋:http://post.baidu.com/f?kz=19624178
◆十个学生的成绩统计:http://post.baidu.com/f?kz=14787745
◆某一天是这一年的第几天:http://post.baidu.com/f?kz=13772082
◆局域网聊天的程序:http://post.baidu.com/f?kz=14413292
◆C编写简单的窗口界面:http://post.baidu.com/f?kz=3388604
◆哈希表实例:http://post.baidu.com/f?kz=13350908
◆随机生成的迷宫游戏:http://post.baidu.com/f?kz=11120413
◆炸弹超人游戏c语言简版:http://post.baidu.com/f?kz=37461531
◆用栈实现的迷宫寻径演示:http://post.baidu.com/f?kz=38578844
◆计算电脑开机时间:http://post.baidu.com/f?kz=38506368
◆C++编一个成绩管理课件:http://post.baidu.com/f?kz=3889433
◆一圈人报数问题问题:http://post.baidu.com/f?kz=3833415
◆又一报数出圈http://post.baidu.com/f?kz=17789700
◆约瑟夫环循环链表 http://post.baidu.com/f?kz=13750140
◆用c编一个分数计算器程序 :http://post.baidu.com/f?kz=3831746
◆命令行计算器:http://post.baidu.com/f?kz=8465088
◆乘法表:http://post.baidu.com/f?kz=11267637
◆学生管理系统:http://post.baidu.com/f?kz=5806073
◆学生成绩管理系统:http://post.baidu.com/f?kz=37076140
◆学生成绩管理系统:http://post.baidu.com/f?kz=5972675
◆学生成绩管理程序(链表):http://post.baidu.com/f?kz=6598859
◆统计学生成绩(8pm版)http://post.baidu.com/f?kz=14787745
◆打印九九表:http://post.baidu.com/f?kz=6059385
◆水仙花数问题:http://post.baidu.com/f?kz=11510377
◆打印2004年日历:http://post.baidu.com/f?kz=6469868
◆八皇后问题:http://post.baidu.com/f?kz=4456709
◆八皇后问题(do熊版):http://post.baidu.com/f?kz=8513222
◆汉诺塔问题:http://post.baidu.com/f?kz=7402377
◆统计不同字符个数:http://post.baidu.com/f?kz=7394163
◆统计单词数行数:http://post.baidu.com/f?kz=8211273
◆查找替换字符串并统计次数:http://post.baidu.com/f?kz=7335032
◆杨辉三角:http://post.baidu.com/f?kz=9299150
◆屏幕中间输出杨辉三角http://post.baidu.com/f?kz=12054232
◆矩阵转置:http://post.baidu.com/f?kz=9882271
◆输出用*组成的三角形:http://post.baidu.com/f?kz=8465901
◆输出一个菱形:http://post.baidu.com/f?kz=11879706
◆输出菱形http://post.baidu.com/f?kz=16465168
◆手把手教你写猜数游戏:http://post.baidu.com/f?kz=11205156
◆abort函数简介:http://post.baidu.com/f?kz=8610596
◆getchar与putchar:http://post.baidu.com/f?kz=7820387
◆scanf 讨论:http://post.baidu.com/f?kz=5305522
◆C语言输入输出讨论:http://post.baidu.com/f?kz=7586045
◆时间函数clock():http://post.baidu.com/f?kz=7867779
◆在规定时段自动关机:http://post.baidu.com/f?kz=7132544
◆getch防止程序运行一闪而过:http://post.baidu.com/f?kz=7360819
◆MALLOC FREE问题:http://post.baidu.com/f?kz=4826280
◆一个连接两个字符串的函数:http://post.baidu.com/f?kz=7958354
◆同一行回显输入字符:http://post.baidu.com/f?kz=5272169
◆整点报时问题:http://post.baidu.com/f?kz=7307517
◆c语言中随机数字应用: http://post.baidu.com/f?kz=3065339
◆怎样获取文件大小:http://post.baidu.com/f?kz=4189689
◆程序得到自已的当前名称:http://post.baidu.com/f?kz=5993842
◆怎么使用清屏:http://post.baidu.com/f?kz=6087210
◆sound()函数为何没有声音:http://post.baidu.com/f?kz=30844221
◆自写trim函数:http://post.baidu.com/f?kz=14226973
◆bioskey(1)的问题:http://post.baidu.com/f?kz=14651579
http://post.baidu.com/f?kz=14536875
◆bioskey这个函数怎么用:http://post.baidu.com/f?kz=15272841
◆CHAR*转为LONG:http://post.baidu.com/f?kz=15054773
◆LONG毫秒转为CHAR*分秒的函数:http://post.baidu.com/f?kz=15140414
◆狐狸找兔子:http://post.baidu.com/f?kz=8729392
◆猴子吃桃:http://post.baidu.com/f?kz=8448705
◆猜数游戏: http://post.baidu.com/f?kz=4215306
◆二分法解方程:http://post.baidu.com/f?kz=7663955
◆同余在数值计算中的应用:http://post.baidu.com/f?kz=6924343
◆多项式相乘:http://post.baidu.com/f?kz=7441950
◆韩信点兵:http://post.baidu.com/f?kz=8203887
◆用C编写的四叶玫瑰曲线:http://post.baidu.com/f?kz=7853365
四叶玫瑰曲线的旋转动画:http://post.baidu.com/f?kz=18656216
◆求n个数的最大公约数:http://post.baidu.com/f?kz=6848849
◆寻找完数:http://post.baidu.com/f?kz=11892209
◆蛇形矩阵算法:http://post.baidu.com/f?kz=12433353
◆圆周率计算:http://post.baidu.com/f?kz=12394522
◆小球称重:http://post.baidu.com/f?kz=12648561
◆整数分解:http://post.baidu.com/f?kz=12582169
◆整数的立方=两整数的平方差:http://post.baidu.com/f?kz=15121585
◆阶乘级数:http://post.baidu.com/f?kz=14601711
◆三点坐标求三角形面积:http://post.baidu.com/f?kz=14679236
◆多项式相乘http://post.baidu.com/f?kz=17157736
◆求pi的怪异程式:http://post.baidu.com/f?kz=14832207
◆歌德巴赫猜想:http://post.baidu.com/f?kz=20011131
◆求最大公约数和最小公倍数http://post.baidu.com/f?kz=15965236
◆3个正整数的最小公倍数http://post.baidu.com/f?kz=17747110
◆求阶乘:http://post.baidu.com/f?kz=19314067
◆输出三数最大值:http://post.baidu.com/f?kz=19023855
◆10000以内的阶乘(do熊版)http://post.baidu.com/f?kz=16446002
◆算法:整数划分问题http://post.baidu.com/f?kz=12582169
◆辗转法求2个数最大公约数http://post.baidu.com/f?kz=16965299
◆算24:http://post.baidu.com/f?kz=17336190
◆100元买100只鸡:http://post.baidu.com/f?kz=14920285
◆COS X曲线http://post.baidu.com/f?kz=16633244
◆矩阵的加减乘运算演示:http://post.baidu.com/f?kz=37953154
◆狐狸找兔子:http://post.baidu.com/f?kz=8729392
◆猴子吃桃:http://post.baidu.com/f?kz=8448705
◆猜数游戏: http://post.baidu.com/f?kz=4215306
◆二分法解方程:http://post.baidu.com/f?kz=7663955
◆同余在数值计算中的应用:http://post.baidu.com/f?kz=6924343
◆多项式相乘:http://post.baidu.com/f?kz=7441950
◆韩信点兵:http://post.baidu.com/f?kz=8203887
◆用C编写的四叶玫瑰曲线:http://post.baidu.com/f?kz=7853365
四叶玫瑰曲线的旋转动画:http://post.baidu.com/f?kz=18656216
◆求n个数的最大公约数:http://post.baidu.com/f?kz=6848849
◆寻找完数:http://post.baidu.com/f?kz=11892209
◆蛇形矩阵算法:http://post.baidu.com/f?kz=12433353
◆圆周率计算:http://post.baidu.com/f?kz=12394522
◆小球称重:http://post.baidu.com/f?kz=12648561
◆整数分解:http://post.baidu.com/f?kz=12582169
◆整数的立方=两整数的平方差:http://post.baidu.com/f?kz=15121585
◆阶乘级数:http://post.baidu.com/f?kz=14601711
◆三点坐标求三角形面积:http://post.baidu.com/f?kz=14679236
◆多项式相乘http://post.baidu.com/f?kz=17157736
◆求pi的怪异程式:http://post.baidu.com/f?kz=14832207
◆歌德巴赫猜想:http://post.baidu.com/f?kz=20011131
◆求最大公约数和最小公倍数http://post.baidu.com/f?kz=15965236
◆3个正整数的最小公倍数http://post.baidu.com/f?kz=17747110
◆求阶乘:http://post.baidu.com/f?kz=19314067
◆输出三数最大值:http://post.baidu.com/f?kz=19023855
◆10000以内的阶乘(do熊版)http://post.baidu.com/f?kz=16446002
◆算法:整数划分问题http://post.baidu.com/f?kz=12582169
◆辗转法求2个数最大公约数http://post.baidu.com/f?kz=16965299
◆算24:http://post.baidu.com/f?kz=17336190
◆100元买100只鸡:http://post.baidu.com/f?kz=14920285
◆COS X曲线http://post.baidu.com/f?kz=16633244
◆矩阵的加减乘运算演示:http://post.baidu.com/f?kz=37953154
◆@ 的读音:http://post.baidu.com/f?kz=12952426
◆“&”怎么读http://post.baidu.com/f?kz=17725981
◆gcc跨平台问题:http://post.baidu.com/f?kz=5371847
◆LL型运算(64位): http://post.baidu.com/f?kz=5248192
◆正方形动画下落(不用清屏):http://post.baidu.com/f?kz=5467099
◆大数运算的免费库libgmp:http://www.swox.com/gmp/
◆大数运算10000以内阶乘:http://post.baidu.com/f?kz=2780897
◆素数搜索算法程序:http://post.baidu.com/f?kz=6221885
◆bmp文件读写: http://post.baidu.com/f?kz=5236264
◆用C显示PCX文件:http://post.baidu.com/f?kz=6059067
◆汇编语言嵌入C 程序段:http://post.baidu.com/f?kz=4038342
◆宏替换问题: http://post.baidu.com/f?kz=5327438
◆宏定义带括号的问题:http://post.baidu.com/f?kz=10001502
◆大下标数组操作:http://post.baidu.com/f?kz=4201196
◆关于数组越界:http://post.baidu.com/f?kz=13204257
◆整数数组初始化赋值:http://post.baidu.com/f?kz=8513573
◆字符数组与字符串:http://post.baidu.com/f?kz=7608560
◆字符串数组下标问题:http://post.baidu.com/f?kz=11253296
◆数组的编译和执行的效率:http://post.baidu.com/f?kz=6243463
◆C写的隐式输入密码:http://post.baidu.com/f?kz=5438409
◆又一个隐式密码输入:http://post.baidu.com/f?kz=11321460
◆C 的文本文件行操作:http://post.baidu.com/f?kz=4303211
◆链表的数据插入:http://post.baidu.com/f?kz=5851022
◆链表的合并:http://post.baidu.com/f?kz=5790984
◆双向链表的插入和删除:http://post.baidu.com/f?kz=6352819
◆谭C例题链表插入删除操作:http://post.baidu.com/f?kz=2286853
◆进制转换的几个函数:http://post.baidu.com/f?kz=5799330
◆十进制转二进制的一种方法:http://post.baidu.com/f?kz=4201639
◆鼠标事件处理:http://post.baidu.com/f?kz=5469795
◆两个鼠标函数库:http://post.baidu.com/f?kz=6952040
◆鼠标器的程序信息:http://post.baidu.com/f?kz=2728110
◆关于鼠标程序:http://post.baidu.com/f?kz=12299687
◆中断号调用:http://post.baidu.com/f?kz=5469596
◆几个中断的资料:http://post.baidu.com/f?kz=7462907
◆C语言接口与实现:http://post.baidu.com/f?kz=5979383
◆C语言的串口通信:http://post.baidu.com/f?kz=8467750
◆怎样理解递归对栈的应用:http://post.baidu.com/f?kz=9882580
◆递归求组合定值:http://post.baidu.com/f?kz=5824841
◆递归求元素和:http://post.baidu.com/f?kz=6380549
◆全排列:http://post.baidu.com/f?kz=7336872
◆擂台赛--求1000000素数:http://post.baidu.com/f?kz=6221885
◆擂台赛--大数运算:http://post.baidu.com/f?kz=6279195
◆字符串编辑时光标的控制:http://post.baidu.com/f?kz=6230397
◆在指定位置输出字符:http://post.baidu.com/f?kz=12059970
◆光盘启动菜单的问题:http://post.baidu.com/f?kz=6093143
◆NOIP复赛文件名大小写问题:http://post.baidu.com/f?kz=6270393
◆程序的带参运行 http://post.baidu.com/f?kz=3545215
◆关于main 的参数:http://post.baidu.com/f?kz=7535662
◆main 函数返回值问题:http://post.baidu.com/f?kz=11161360
◆一个主函数参数问题:http://post.baidu.com/f?kz=9495695
◆函数参数中引用别名问题:http://post.baidu.com/f?kz=9299395
◆函数调用返回多个值:http://post.baidu.com/f?kz=5536004
◆函数中参数调用的问题:http://post.baidu.com/f?kz=6035295
◆函数参数按址传送的问题:http://post.baidu.com/f?kz=5558840
◆assiss谈宏定义及条件编译:http://post.baidu.com/f?kz=6193259
◆输出格式*号控制符:http://post.baidu.com/f?kz=7149608
◆输出格式的空格问题:http://post.baidu.com/f?kz=5147346
◆输出格式中#代表什么:http://post.baidu.com/f?kz=11993035
◆程序代码的上传与下载:http://post.baidu.com/f?kz=6566895
◆++i和i++的问题:http://post.baidu.com/f?kz=6712609
◆ASCII字符输出问题:http://post.baidu.com/f?kz=6771317
◆Fdisk的源程序:http://post.baidu.com/f?kz=6790551
◆正则替换:http://post.baidu.com/f?kz=6775253
◆自我保护----“程序自杀”:http://post.baidu.com/f?kz=6682850
◆编辑框问题:http://post.baidu.com/f?kz=6953560
◆西文环境下显示汉字:http://post.baidu.com/f?kz=2144548
◆读取汉字库中的汉字:http://post.baidu.com/f?kz=7359496
◆三种排序:http://post.baidu.com/f?kz=6769579
◆far 远程指针简述:http://post.baidu.com/f?kz=7742757
◆指针悬空的危险错误:http://post.baidu.com/f?kz=7130531
◆指针作参数的问题:http://post.baidu.com/f?kz=6922977
◆判断字符串是否回文: http://post.baidu.com/f?kz=7624806
◆编程中遇到的小困扰:http://post.baidu.com/f?kz=8002835
◆UNIX下面怎么编译C程序:http://post.baidu.com/f?kz=8046512
◆C如何调用其他程序:http://post.baidu.com/f?kz=8355281
◆C游戏中控制键盘:http://post.baidu.com/f?kz=4902906
◆C语言控制应用:http://post.baidu.com/f?kz=8399030
◆C项目工程(unix下)注意事项:http://post.baidu.com/f?kz=9087043
◆make file(unix下)易错地方:http://post.baidu.com/f?kz=9362741
◆补码问题:http://post.baidu.com/f?kz=11189164
◆DOS仿多线程问题:http://post.baidu.com/f?kz=11553963
◆栈的push和pop操作:http://post.baidu.com/f?kz=10820691
◆头文件如何理解:http://post.baidu.com/f?kz=7566720
◆编程解IQ测试:http://post.baidu.com/f?kz=11359491
◆逻辑破案的编程处理:http://post.baidu.com/f?kz=11283225
◆VC++中浮点数与字符串转化:http://post.baidu.com/f?kz=12061615
◆为何VC++6.0无法运行某些C程序:http://post.baidu.com/f?kz=11123696
◆逆序输出:http://post.baidu.com/f?kz=11484218
◆scanf:floating points format not linked:http://post.baidu.com/f?kz=12999839
◆c输出到打印机:http://post.baidu.com/f?kz=12482547
◆源代码-自我产生的程序:http://post.baidu.com/f?kz=14261864
◆PC 底层系统编程:http://post.baidu.com/f?kz=14071636
◆C中怎么制作函数库:http://post.baidu.com/f?kz=14190938
◆有关 FreeBSD 的网站:http://post.baidu.com/f?kz=14828500
◆一个画图程序:http://post.baidu.com/f?kz=15165712
◆算法--贪心法:http://post.baidu.com/f?kz=15321632
◆合并排序:http://post.baidu.com/f?kz=15330626
◆射击游戏:http://post.baidu.com/f?kz=15417872
◆怎样编一个螺旋数组:http://post.baidu.com/f?kz=15384659
C中怎么制作函数库:http://post.baidu.com/f?kz=14190938
10发90环有多少种可能:http://post.baidu.com/f?kz=15878635
Dev-C++4.9.9.2下载&使用教程:http://post.baidu.com/f?kz=40893628
FinC国人开发的嵌入式编程语言:http://post.baidu.com/f?kz=41127825
C语言的通讯录:http://post.baidu.com/f?kz=41627304
炸弹超人c语言简版:http://post.baidu.com/f?kz=37461531
求因子:http://post.baidu.com/f?kz=41674487
C语言中常见错误:http://post.baidu.com/f?kz=40525835
WPS Office 2005个人版免费下载:http://post.baidu.com/f?kz=41108925
TC2使用图解:http://post.baidu.com/f?kz=40504833
[url:]http://www.yuanma.org/data/2006/1228/article_2024.htm
[转]http://www.e-gov.org.cn/wangluoanquan/shujuhuifu/200710/76868.html
介绍两个数据恢复软件:TestDisk 和 PhotoRec。其中,TestDisk 主要用来恢复损坏的分区以及拯救无法引导的磁盘;而 PhotoRec 则主要用于恢复损坏的数据文件,包括文档、图片、视频等。
TestDisk 及 PhotoRec 皆支持在 Windows、Linux、Unix、Mac OS 等系统上执行。TestDisk 还支持包括 FAT、NTFS、Ext2、Ext3、ReiserFS、RAID 等在内的广泛的文件系统。而 PhotoRec 也能够在硬盘、光盘、优盘等各种存贮介质上工作。
虽然数据恢复软件可以尽最大可能帮助我们挽回损失,但我们还是应该养成时常备份的习惯。只有真正做到有备无患,才能确保万无一失。
由于错误的使用分区工具而带来的分区丢失,硬盘磁盘分区遭到损坏的情况下,使用叫做「TestDisk」的工具可以复原已损坏的分区。下面就介绍一下如何使用TestDisk急性恢复(注)。
注:可以使用TestDisk进行复原的场合,也就是硬盘HDD上的分区(该分区有原有数据纪录)已经损坏的情形。但是如果损坏之后,重新再次做成了新分区的话,复原的可能性比较小,很困难。
TestDisk可以从http://www.cgsecurity.org/wiki/PhotoRec下在(注)。下载Fedora Core 6 对应的RPM包文件。例如、如果使用GNOME的分区管理软件「GParted」(Gnome Partition Editor)误删除了/dev/hda5分区。
注:Linux下恢复误删除的文件 中介绍了使用「PhotoRec」对误删除的文件进行恢复。
注:TestDisk是恢复分区信息的软件、针对分区表被删除以及MBR(master boot record)被修改的恢复分区信息软件:TestDisk、使用前请先确认。
对于安装和配置请参照Linux下恢复误删除的文件。
以root权限登陆,启动TestDisk。
# testdisk
首先,选择恢复操作中的log文件(testdisk.log)的纪录方式。
[Create]新建
[Append]追加
[No Log]不纪录
选择log文件的记录方式
选择了log文件的记录方式后、显示了处于连接状态的磁盘设备。然后选择要恢复的磁盘分区、选择[Proceed]。在这里选择装有Linux/Windows XP的硬盘HDD「Disk /dev/hda」。
在列出的磁盘设备中,选择要恢复的分区,然后选择磁盘分区的种类。Linux/Windows就选[Intel]。
下示画面中选择[Analyse],对分区进行分析。
LoadRunner
http://www.mercuryinteractive.com/products/loadrunner/
SilkPerformer
http://www.segue.com/products/lo ... e-testing/index.asp
QALoad
http://www.compuware.com/products/qacenter/qaload.htm
WebLoad
OpenSTA开源
Jmeter开源
自动测试工具集工具相关网址
WinRunner
http://www.mercuryinteractive.com/products/winrunner/
SilkTest
http://www.segue.com/products/fu ... esting/silktest.asp
QARun
http://www.compuware.com/products/qacenter/qarun.htm
SAFS
http://safsdev.sourceforge.net/Default.htm
Bug追踪系统工具相关网址
JIRA
http://www.atlassian.com/software/jira/
Bugzilla
http://www.bugzilla.org
TestDirector
http://www.mercuryinteractive.com/products/testdirector/
GNATS
http://www.gnu.org/software/gnats/
TestTrackPro
http://www.seapine.com/ttpro.html
类型 名称 公司 网址
测试设计工具
ALLPAIRS
http://satisfice.com/
Caliber-RBT
http://www.tbi.com
Caliber-RM
http://www.tbi.com
DARTT
http://home.t-online.de/home/bsse.info/
Datatect
http://www.datatect.com
DGL
http://www.csee.usf.edu/~maurer/
McCabe Test
http://www.mccabe.com
McCabe TestCompress
http://www.mccabe.com
Multi
http://www.testing.com/
Panorama C/C++
http://www.softwareautomation.com
Reactis Tester
http://www.reactive-systems.com
TDGEN
http://www.soft.com/Products/index.html
T-VEC Test Generation System
http://www.t-vec.com
GUI测试驱动器 Android
http://www.smith-house.org/open.html
Atesto Functional Testing Service "http://www.atesto.com/ "
AutoTester for Windows
http://www.autotester.com
AutoTester for OS/2
http://www.autotester.com
CAPBAK
http://www.soft.com/Products/index.html
Certify
http://www.worksoft.com/
CitraTest
http://www.tevron.com
e-Monitor
http://www.empirix.com/
e-Tester
http://www.empirix.com/
eValid
http://www.e-valid.com/
imbus GUI Test Case Library
http://www.imbus.de
QARunTM
http://www.compuware.com/qacenter
Panorama-2 "http://www.softwareautomation.com "
QC/Replay
http://www.centerline.com
QES/EZ for GUI
http://www.qestest.com
Monitor Master
http://www.argogroup.com
SilkTest
http://www.segue.com
Smalltalk Test Mentor
http://www.silvermark.com
Test Now
http://www.stlabs.com/
TestQuest Pro Test Automation System
http://www.testquest.com
TestRunner
http://www.qronus.com/
WinRunner Mercury Interactive
http://www.merc-int.com
xrc - X Remote Control
http://www.absol.com/
Xrunner
http://www.merc-int.com
负荷和性能工具 ANTS - Advanced .NET Testing System
http://www.red-gate.com/
Atesto Automated Load Test
http://www.atesto.com/
AutoController
http://www.autotester.com
AutoController with Virtual DirectTest
http://www.autotester.com
Benchmark FactoryTM
http://www.quest.com
Capacity Calibration
http://www.capcal.com
Chariot?
http://www.ganymedesoftware.com
CYRANO ServerPack
http://www.cyrano.com
e-Load
http://www.empirix.com/
FORECAST
http://www.facilita.co.uk
ITF - Internetworking Test Facility
http://www.acomtech.com
Load
http://www.pushtotest.com
Load Runner Product Family
http://www.merc-int.com
Microsoft Web Application Stress Tool (WAS)
http://webtool.rte.microsoft.com/
NetPressure
http://www.syntheticnets.com
PegasusTM
http://www.ganymedesoftware.com
Portent
http://www.loadtesting.com
preVue-ASCII
http://www.rational.com/products/prevue/
preVue-X
http://www.rational.com/products/prevue/
"PureLoad"
http://www.minq.se
QALoadTM
http://www.compuware.com
Rational Suite PerformanceStudio
http://www.rational.com/products/pstudio/
"Rational SiteLoad"
http://www.rational.com/products/siteload/
RemoteCog Product Family
http://www.fiveninesolutions.com
Scapa StressTest for Citrix MetaFrame
http://www.scapatech.com
SilkPerformer
http://www.segue.com/
Teleprocessing Network Simulator
http://www.networking.ibm.com/tns/tnsprod
htm
WebLoad 3.0
http://www.radview.com
Web Roller
http://webapplicationstesting.com
Webserver Stress Tool
http://www.paessler.com
WebSpray
http://www.redhillnetworks.com
非GUI测试驱动器
"AdaTEST"
http://www.qcsltd.com
ANVL
http://www.midnight.com/
AutoAdviser
http://www.autotester.com
AutoTester Client/Server for use with SAP R/3
http://www.autotester.com
Cantata
http://www.qcsltd.com
"CONVEX Integrated Test Environment (CITE)"
http://www.cirr.com/
CTA++
http://www.testwell.fi
CTB
http://www.testwell.fi
ITF - Internetworking Test Facility
http://www.acomtech.com/
OTF - An Object Testing Framework "http://www.mcgsoft.com/ "
QADirector?
http://www.compuware.com/qacenter
"QCIT"
http://www.qistest.com
QES/Architect
http://www.qestest.com
QES/EZ
http://www.qestest.com
QMTest
http://www.codesourcery.com/
SilkPilot
http://www.segue.com
SMARTS
http://www.soft.com/Products/index.html
SDTF - SNA Development Test Facility
http://www.acomtech.com
TALC2000
http://www.talc2000.com
TBGEN
http://www.testwell.fi
TEO
http://www.gako.fr
Test Manager
http://www.launchsoftware.com
Test Mentor - Java Edition
http://www.javatesting.com
Test Library Manager
http://www.autotester.com
"Test Station"
http://www.autotester.com
TestWorks
http://www.soft.com/Products/index.html
VectorCAST
http://www.vectors.com
VersaTest
http://www.softsell.com
测试实现工具 Access for DB2
http://www.princetonsoftech.com/
Aprobe
http://www.ocsystems.com
Aqtest
http://www.automatedqa.com/
BoundsChecker compuware
http://www.numega.com/
C++Test
http://www.parasoft.com
DateWise FileCompare
http://www.datewise.com/mt
dmalloc
http://www.dmalloc.com/
EXDIFF
http://www.soft.com/Products/index.html
"fakesmtpd"
http://www.jera.com/
"FREstimate"
http://www.softrel.com/
HeapAgent
http://www.microquill.com
InCtrl5
http://www.zdnet.com/downloads/stories/info/0
,77424,.html
JSUnit
http://www.edwardh.com/jsunit/
Junit
http://www.junit.org/
MDBDiff
http://jupiter.drw.net/matpie/PB
... s/retired/MDBDiff.h tml
Move for DB2
http://www.princetonsoftech.com/
mpatrol
http://www.cbmamiga.demon.co.uk/mpatrol/
"ObjectTester"
http://www.obsoft.com
Inuse
http://www.parasoft.com
Rational Purify
http://www.rational.com/products/purify_unix/index.jtmpl
Rational Test RealTime
http://www.rational.com
SilkRealizer
http://www.segue.com
WhenToStop
http://www.softrel.com/
ZeroFault
http://www.tkg.com
测试评估工具
AdaTEST95
http://www.qcsltd.com
Aonix Validator/Req
http://www.aonix.com/
C-Cover
http://www.bullseye.com
Cantata++
http://www.qcsltd.com
CodeTEST
http://www.amc.com
CTC++
http://www.testwell.fi
GlassJARToolkit
http://glassjartoolkit.com/gjtk.html
"Hindsight/TCA"http://www.integrisoft.com
Hindsight/TPA
http://www.integrisoft.com
"Insure++"http://www.parasoft.com
"Java Test Coverage"
http://www.semdesigns.com/Products/TestCoverage/index.html
LDRA Testbed
http://www.ldra.com
"LOGISCOPE toolset"
http://www.telelogic.com/
ObjectCoverage
http://www.obsoft.com
Panorama C/C++ "http://www.softwareautomation.com "
Rational PureCoverage
http://www.rational.com/products/purecoverage/index.
jtmpl
"TCMON"
http://www.testwell.fi
TCA "http://www.parasoft.com "
TCAT C/C++
http://www.soft.com/Products/index.html
TCAT for Java
http://www.soft.com/Products/index.html
TCAT-PATH
http://www.soft.com/Products/index.html
T-SCOPE
http://www.soft.com/Products/index.html
TestWorks/Coverage
http://www.soft.com/Products/index.html
静态分析工具
AccVerify SE for FrontPage
http://www.hisoftware.com/msacc/
Aivosto Project Analyzer
http://www.aivosto.com/vb.html
ASSENT
http://www.tcs.com
ccount "http://www.cs.umd.edu/users/cml/resources/cmetrics/ "
"Cleanscape lint-Plus"
http://www.cleanscape.net/stdprod/lplus/index.html
ClearMaker
http://www.balthazar.hu
"CMT++"
http://www.testwell.fi
CodeCompanion
http://www.jenssoft.com
CodeSurfer
http://www.grammatech.com
"Dependency Walker"
http://www.dependencywalker.com/
floppy/fflow
http://netlib2.cs.utk.edu/floppy/
ftnchek
http://www.dsm.fordham.edu/~ftnchek
Hindsight/SQA
http://www.integrisoft.com
Krakatau
http://www.powersoftware.com/
McCabe QA
http://www.mccabe.com
METRIC
http://www.soft.com/Products/index.html
ObjectDetail
http://www.obsoft.com
CodeWizard
http://www.parasoft.com
Jtest
http://www.parasoft.com
PC-lint/FlexeLint
http://www.gimpel.com/
PC-Metric
http://www.molalla.net/~setlabs
PolySpace Verifier
http://www.polyspace.com
Plum Hall SQS
http://www.plumhall.com
QA C
http://www.prqa.co.uk
QA C++
http://www.prqa.co.uk
"QA Fortran"
http://www.prqa.co.uk
"QStudio Java"
http://www.qa-systems.com
Safer C Toolset
http://www.oakcomp.co.uk/SoftwareProducts.html
SofAudit
http://www.soring.hu/index.html
STATIC
http://www.soft.com/Products/index.html
TestBed
http://www.easternsystems.com
TestWorks/Advisor
http://www.soft.com/Products/index.html
缺陷跟踪工具
1CR
http://www.plus-one.com/+1CR_fact_sheet.html
Aardvark
http://www.red-gate.com/
AdminiTrack
http://www.adminitrack.com
Alcea Fast BugTrack
http://www.alceatech.com/
AllChange 2000
http://www.intasoft.co.uk/intasoft/
BugAware
http://www.bugaware.com
"Bugbase 2000"
http://www.threerock.com
"Bugcentral.com"
http://www.bugcentral.com/
BugCollector Pro
http://www.nesbitt.com/
Bug/Defect Tracking Expert
http://www.bug-defect-tracking-expert.com/
"Buggit"
http://www.pb-sys.com/
Buggy
http://www.novosys.de/Buggy/Buggy.html
"Bugzero"
http://www.websina.com/bugzero/
Bugzilla
http://www.mozilla.org/projects/bugzilla/
"Census"
http://www.metaquest.com/
"ClearQuest"
http://www.rational.com/products/clearquest/
CustomerFirst
http://www.custfirst.com/products.html
Debian Bug Tracking System
http://www.chiark.greenend.org.uk/~ian/debbugs/
Defect Tracker (New Fire)
http://www.newfire.com/
Defect Tracker (Pragmatic)
http://www.Pragmaticsw.com/Pragmatic/DefectTrac
ker.asp
Defect Tracking System (DTS)
http://www.open.com.au/dts/
"defectX"
http://www.defectx.com/
DevTrack
http://www.techexcel.com/
"d-Tracker"
http://www.empirix.com/
elementool
http://elementool.com/
"ExtraView"
http://www.extraview.com/extraview_home.html
FogBUGZ
http://www.fogcreek.com/FogBUGZ/
JitterBug
http://samba.anu.edu.au/cgi-bin/jitterbug
Keystone Problem Tracking System
http://www.stonekeep.com/
NeumaPT
http://www.neuma.com/
SWBTracker
http://www.softwarewithbrains.com/swbtrack.htm
"Squish"
http://www.squishlist.com
T-Plan Incident Manager
http://www.t-plan.co.uk
TeamTrack
http://www.teamshare.com
TeamTrack Workgroup
http://www.teamshare.com
Team Tracker
http://www.hstech.com.au/TeamTracker/
TestTrack
http://www.seapine.com
"TrackWeb Defects"
http://www.soffront.com/
Trackgear
http://www.logigear.com/
TrackRecord
http://www.numega.com/devcenter/tr.shtml
"Trackwise"
http://www.sparta-systems.com/
Linux 操作系统 从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编程进行简单的介绍。串口简介
计算机串口的引脚说明
DTE→DCE DTE发送串行数据 DTE←DCE DTE 接收串行数据 DTE→DCE DTE 请求 DCE 将线路切换到发送方式 DTE←DCE DCE 告诉 DTE 线路已接通可以发送数据 数据设备准备好 DTE←DCE DCE 准备好 #i nclude <stdio.h> /*标准输入输出定义*/每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经 常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照 各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。
可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专 用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方 便查找,在WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令,“find” 命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find”命令也是了解和学习Linux文件 特点的方法。因为Linux发行版本繁多,版本升级很快,在Linux书籍上往往写明某个配置文件的所在位置,往往Linux新手按图索骥还是不能找到。 比如说REDHAT Linux 7.O和REDHAT Linux 7.1中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变,如果不学会使用“find”命令,那么在成千上万的Linux文件中要找到其中的 一个配置文件是相当困难的,笔者在没有精通“find”命令之前就吃过这样的苦头。好,下面就详细为大家介绍强大的“find”命令的全部使用方法和用
1.通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就 能方便的查找出来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名, 而不知道这个文件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个 地方也不知道,则这是可以使用如下命令:
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。
2.无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用 “find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用 “find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"Permissiondenied."(禁 止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入
这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。
在Linux系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大 型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省 很多时间了。使用find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find/etc”就是只在 etc目录下查找文件。因为“find/etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。
3.根据部分文件名查找方法:
这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中 的同类查找方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:
这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。
4.根据文件的特征查询方法:
如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查找出来,这和WINDOWS系统中的"搜索"功能是基本相同 的。在微软的"搜索"中WINDOWS中的"搜索助理"使得搜索文件和文件夹、打印机、用户以及网络中的其他计算机更加容易。它甚至使在Internet 上搜索更加容易。"搜索助理"还包括一个索引服务,该服务维护了计算机中所有文件的索引,使得搜索速度更快。使用"搜索助理"时,用户可以指定多个搜索标 准。例如,用户可以按名称、类型及大小搜索文件和文件夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。
例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询find / -size 1500c,字符 c 表明这个要查找的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查找方式来解决。例如我们输 入find/ -size +10000000c 这个命令,则标明我们指定系统在根目录中查找出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使 用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find"命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用“find"命令的方式是很多的,“ find"命令查找文件只要灵活应用,丝毫不必在WINDOWS中查找能力差。
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变状态的文件
-ctime n
查找系统中最后n*24小时被改变状态的文件
-empty
查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false
查找系统中总是错误的文件
-fstype type
查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n
查找系统中文件数字组 ID 为 n的文件
-group gname
查找系统中文件属于gnam文件组,并且指定组和ID的文件
5.Find命令的控制选项说明:
Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
选项 用途描述
-daystart .测试系统从今天开始24小时以内的文件,用法类似-amin
-depth 使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow 遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
-help 显示命令摘要
-maxdepth levels 某个层次的目录中按照递减方法查找
-mount 不在文件系统目录中查找, 用法类似 -xdev.
-noleaf 禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version 打印版本数字
使用-follow选项后,find命令则遵循通配符链接方式进行查找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。
-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样 导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令
假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在. /sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文 件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。
6.使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我们想在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查找选项链接起来组合成一个混合的查找方式。
-ls 打印同种文件格式的文件.
总结:到这里为止我们已经学习了这名多关于find命令的使用方法,也列出了很多常用的find命令的选项,如果我们能熟练掌握在Linux中find命令的使用方法,那么在Linux中查找文件也不是一件困难的事情。
网络编程,一定离不开套接口;那什么是套接口呢?在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个 和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述 符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP),当然还有原始套接口(原始套接口提供TCP套接口 和UDP套接口所不提供的功能,如构造自己的TCP或UDP分组)等,我们这里主要介绍字节流套接口和数据报套接口。
网络编程,一定离不开套接口;那什么是套接口呢?在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个 和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述 符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP),当然还有原始套接口(原始套接口提供TCP套接口 和UDP套接口所不提供的功能,如构造自己的TCP或UDP分组)等,我们这里主要介绍字节流套接口和数据报套接口。
要学习网络编程,一定离不开网络库的函数,在Linux系统下,可以用"man 函数名"来得到这个函数的帮助,不过为了照顾E文不大好的朋友,下面就将常用的网络函数和用法列出来供大家参考:
1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。
第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个 参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接 口);如果套接口类型不是原始套接口,那么第三个参数就为0。
2、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。
3、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与 16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择 一个本地IP地址。
第一个参数是socket函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。由于listen函数第二个参 数的原因,内核要维护两个队列:以完成连接队列和未完成连接队列。未完成队列中存放的是TCP连接的三路握手为完成的连接,accept函数是从以连接队 列中取连接返回给进程;当以连接队列为空时,进程将进入睡眠状态。
5、accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。
第一个参数是socket函数返回的套接口描述字;第二个和第三个参数分别是一个指向连接方的套接口地址结构和该地址结构的长度;该函数返回的是一个全新的套接口描述字;如果对客户段的信息不感兴趣,可以将第二和第三个参数置为空。
6、inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
8、fock函数:在网络服务器中,一个服务端口可以允许一定数量的客户端同时连接,这时单进程是不可能实现的,而fock就分配一个子进程和客户端会话,当然,这只是fock的一个典型应用。
TCP套接口使用TCP建立连接,建立一个TCP连接需要三次握手,基本过程是服务器先建立一个套接口并等待客户端的连接请求;当客户 端调用connect进行主动连接请求时,客户端TCP发送一个SYN,告诉服务器客户端将在连接中发送的数据的初始序列号;当服务器收到这个SYN后也 给客户端发一个SYN,里面包含了服务器将在同一连接中发送的数据的初始序列号;最后客户在确认服务器发的SYN。到此为止,一个TCP连接被建立。
下面就用一个例子来说明服务器和客户是怎么连接的
然后在一台计算机上先运行服务器程序,再在另一个终端上运行客户端就会看到结果;如果不运行服务器程序而先运行客户程序将立即提示"Connect: Connection refused",这就是TCP套接口的好处,如果是UDP套接口将会有一个延时才会得到错误信息(UDP套接口后面有介绍)。
建立一个TCP连接需要三次握手,而断开一个TCP则需要四个分节。当某个应用进程调用close(主动端)后(可以是服务器端,也可 以是客户端),这一端的TCP发送一个FIN,表示数据发送完毕;另一端(被动端)发送一个确认,当被动端待处理的应用进程都处理完毕后,发送一个FIN 到主动端,并关闭套接口,主动端接收到这个FIN后再发送一个确认,到此为止这个TCP连接被断开。
2、UDP套接口
UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播是只能使用UDP协议;其 二:由于他是无连接的,所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。
在编写UDP套接口程序时,有几点要注意:建立套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个 UDP套接口;由于UDP是无连接的,所以服务器端并不需要listen或accept函数;当UDP套接口调用connect函数时,内核只记录连接放 的IP地址和端口,并立即返回给调用进程,正因为这个特性,UDP服务器程序中并不使用fock函数,用单进程就能完成所有客户的请求。
《60分钟企业经营战略》 和《运筹帷幄-诸葛亮兵法》
《运筹帷幄-诸葛亮兵法》 :
http://www.qiouzhiniao.cn/html/d ... i/20070430/312.html
《60分钟企业经营战略》 :
http://www.qiouzhiniao.cn/html/d ... i/20070430/313.html
本人正在进行linux 的学习 希望这些资料对linux爱好者有用
linux 教材大全
ftp://down.eshuba.com/eshuba/xitongxiangguan/Linuxjcdq.rar
linux 使用大全
http://down.eshuai.cn/shuba/xito ... %C3%B4%F3%C8%AB.rar
linux 学习宝典
http://down1.cnhacker.com/booksdown/07013103050c8cb659a28f9ff.rar
linux 从入门到精通
http://www.gouhuo.com/study/linuxbook.zip
练成linux 高手
http://www.jz5u.com/download.asp?id=15590&downid=0
送给linux 初学者
ftp://211.95.73.26/hl/
送给初学Linux的穷人Linux系统指令大全.pdf
linux 系统管理
ftp://211.95.73.26/1zxhlinux.rar
linux 命令大全
http://ftpgz5.pconline.com.cn/exam/it/Linux061114.rar
linux 软件工程师
ftp://222.214.218.42/book3/20060 ... 81-4941bcee1f11.pdf
基础学习
http://www.00083.com/soft/upload ... 84b69a63c2ed2a47af3
基础教程完整版
http://download.chinaitlab.com/download.asp?id=34873
命令全集
http://down.linuxmine.com/soft/0/1/01000001.rar
使用学习教程
ftp://222.214.216.57/book2/20061 ... 16-c8b5facb0654.chm
网络安全配置
http://vip.hackbase.com/vipsoft/vipteacher/20050305linux29.rar
linux 从入门到精通
ftp://down.eshuba.com/eshuba/200601/Linux
??????.rar
http://ftpgz13.pconline.com.cn/pub/download/200205/linuxsite.rar
新手管理员手册
http://www.00083.com/soft/upload ... fc01983a9ded8943b62
安装与配置简明手册
http://cpss.zz.ha.cn/study/linux ... %f7%ca%d6%b2%e1.zip
网络实际操作 thunder://QUFodHRwOi8vZG93bmxvYWQuY2hpbmFpdGxhYi5jb20vZG93bmxvYWQuYXNwP2lkPTM3MTM3Wlo=
红旗linux 中文版初级教程
http://down.hack58.com/fzw_hack58/sohu/11-23linux.rar
linux 核心源代码分析PDG
http://www.00083.com/soft/uploadsoft/linux
核心源代码分析.rar?6103004891303x1174341082x6103009877379-15c492eb5c3033c99a07c2fba419c496
破解根用户密码
http://www.942d.com/shipin/bbs/linuxsn.rar
Red Hat Linux Fedora傻瓜书
httP://book1.ibook8.com/ibook8co ... 5/041113/fedora.rar
Linux知识宝库典藏版
ftp://222.214.218.42/book3/20060 ... 35-0c5492042030.chm
Linux程序设计
ftp://down.eshuba.com/eshuba/xitongxiangguan/Linuxcxsj.rar
Linux参考大全
httP://book1.ibook8.com/ibook8com/pc2005/701/1/521hacker-20.zip
linux编程初学者入门
ftp://222.214.216.57/book2/20061 ... 00-a603302e0466.rar
LINUX应用技术精华{面向初学Linux朋友的书籍}
http://www.linuxfans.org/nuke/software/LINUX
应用技术精华{面向初学Linux朋友的书籍}/LINUX应用技术精华{面向初学Linux朋友的书籍}.rar
redhat9从入门到精通
http://down.315safe.com:315/redhat9
从入门到精通.rar
Linux C函数库参考手册
http://cnc-http.xpbook.com:81/200506/Linux%20C
函数库参考手册.rar?6102881127298x1150968278x6102884440460-71dc8cd6d874db99d29888002914a4d5
Linux 内核完全注释
httP://book1.ibook8.com/ibook8co ... 113/linuxsystem.rar
Linux2006年9月 总第三期
http://www.linuxer.cn/magazine/linuxer3-2006-09.pdf
Linux_network_manage-3245
http://down.csdn.net/down2//2006 ... ork_manage-3245.rar
一周内学会Linux系统管理
http://download1.csdn.net/down2/2006/10/499/1zxhlinux-2605.rar
linux编程白皮书
http://download1.csdn.net/down//2006/webdown/004/Linuxbcbps.rar
linux上的c编程
http://www.cinchina.com/Soft/Sho ... lID=1&SoftID=12
linux宝典 thunder://QUFodHRwOi8vZG93bmxvYWQuY2hpbmFpdGxhYi5jb20vZG93bmxvYWQuYXNwP2lkPTM3MDk3Wlo=
《Linux内核完全注释》 V1.9.5版
http://oldlinux.qbang.org/download/clk011c-1.9.5.pdf
linux教材 thunder://QUFodHRwOi8vd3d3Lmp6NXUuY29tL2Rvd25sb2FkLmFzcD9pZD0xNDUxNSZkb3duaWQ9MFpa
linux命令全集Shell_manual
http://www.uplinux.com/php/downl ... ZWxsX21hbnVhbC56aXA
EDN电子技术
http://www.ednchina.com/
磁动力
http://www.cdle.net/bbs/
大学生电子
http://211.86.58.23/ziliao/index.asp
电子产品世界
http://www.eepw.com.cn/
电子论坛
http://www.avrw.com/learn.htm
研发网www .52rd .com
中学生的学习网站大全
http://www.cen114.com
托福考试和出国留学类网站
1 托福考试报名
http://www.bj262toefl.com.cn/
2 托福考试网上报名
http://www.bj262toefl.com.cn/
3 托福训练中心
http://www.toeflpro.com/
4 新东方托福培训
http://www.neworiental.org/class/toefl.asp
5 中青网托福考试
http://www.cycnet.com/education/chuguo/tofel/
6 IELTS网站
http://www.fronttraining.com/
7 商业托福考试
http://exam.studa.com/classhtml/sytf.html
出国留学网站
1 国家留学网
http://www.csc.edu.cn/gb/
2 无忧雅思网
http://www.51ielts.com/
3 留学澳大利亚
http://www.dyo.com.cn/australia/
4 DIY留学家园
http://www.imm-diy.com/htm/
5 滴答出国资讯
http://www.tigtag.com/community/whatsnew.asp
6 美国校园网站
http://www.uscampus.com.cn/index.asp
7 德国大学信息网
http://www.netbig.de
8 北美国际网校
http://www.summerpond.org
9 出国在线
http://www.chuguo.org.cn/
10 北美国际教育网
http://www.summerpond.org
11 星华出国网
http://www.starglory.com/
12 上海青年报社--留学指南
http://www.why.com.cn/abroad/index.asp
13 学在法国
http://www.paris-beijing.com/Cover/Education/Education.htm
14 欧览留学
http://www.ouline.com/education/
15 德国留学指南
http://www.lookinfo.com/study/default.asp
16 天津留学人才网
http://www.tjscse.com/
17 澳际出国留学
http://www.globeedu.com/index.shtml
18 国旅留学
http://www.globaledu.com.cn/
19 爱尔兰中国学生之家
http://www.kina.cc/ie/
20 环球雅思连锁学校
http://www.ielts.com.cn
21 皖华留学
http://www.ahwanhua.com/
22 贵州省出国留学服务中心
http://www.gossc.com/
23 达瑞出国
http://www.direxe.com/menu_13/index.shtml
24 新西兰留学服务中心
http://www.study-nz.com/
25 加拿大环球教育咨询中心思洋教育咨询网
http://www.education-overseas.com/
26 育路留学网
http://lx.yuloo.com
27 菲律宾留学网
http://www.phi-edu.com
28 武汉英中教育
http://www.whbc2000.com
29 武汉英中出国留学培训中心
http://www.whbc2000.cn
30 SIK留学韩国
http://www.studyinkorea.com.cn
31 你我日语综合网
http://www.youican.com
经济管理类网站
管理类、经济商业网站
帖子的作者给我们推荐了上“千个全球管理类、经济商业网站”
财务会计类
1 中国会计网
http://www.canet.com.cn/info/
2 财会教研工作室
http://www.ckjy.any2000.com
3 中国财务纵横网
http://www.172cpa.com/
4 中华会计网校
http://www.chinaacc.com/
5 中国财会网
http://www.kj2000.com/
7 应试精华财会网
http://www.yingshijh.com/
8 中国会计资讯
http://www.accinfo.net/
9 中国财经教育网
http://www.cfeenet.com/
10 中国注册会计师协会
http://www.cicpa.org.cn/
11 金融会计网
http://www.fa.net.cn/
12 东方会计网
http://www.accgo.com/
13 中国财税网
http://www.edu110.com/index0.asp
14 网络注册会计师
http://www.netcpa.com.cn/
15 中国会计视野网
http://www.esnai.com/
考研类网站
极力推荐
考研导航网
(这里有很全的比较专业的考研网站)
中国教育考试在线
http://www.eduexam.com.cn/index.jsp
BBSEE
考研共济站
http://bbs.kaoyantj.net/kaoyanshitiboo
... 9/476304ab4c56892f.html
考研论坛
http://bbs.kaoyan.com/forumdisplay.php?fid=66&page=1
亚非拉
http://www.yafeila.com/art_list.asp?cat_id=46
中国考研网
http://www.cnky.net/
考研ok网
http://www.kaoyanok.com/
考研365天
http://www.kaoyan365.com/
研路通
http://www.yanlutong.com/
51考研
http://www.51kaoyan.com.cn/
复旦考研
http://www.yikao.com/
上海考研同路人
http://club.17ky.com/index.asp?boardid=9&page=
共享天下考研
http://bbs.kaoyansky.cn/forumdisplay.php?fid=117
无忧考研
http://51ky.com/default.htm
考研教育网
http://www.cnedu.cn/
中国考研网
http://www.chinakaoyan.com/article.php/1974
qq考研
http://edu.qq.com/kaoyan/
==================================================
大量C语言、C++、C#、VC编程相关书籍下载
http://dl.njfiw.gov.cn/books/
( 很多计算机书籍,绝对经典!)
http://blog.csdn.net/lin_bei/archive/2007/05/09/1601895.aspx
http://www.openfans.net/main.html
http://dev.yesky.com/javagaoji/
http://blog.csdn.net/pongba/archive/2007/05/16/1611593.aspx
谷歌跃居大学生最理想雇主排行第一
2007年美国大学生最理想雇主排行榜出炉
谷歌打败迪斯尼跃居第一
今年调查结果显示,美国大学生择业有两个主要趋势:从事公益活动或者追求高薪,但看起来,这是互为矛盾的两种选择。
本报讯5月12日,美国著名雇主品牌管理公司优信咨询(Universum)公布了最新一期的“2007年美国大学生最理想雇主排行榜”。
前五名包括:两个政府机构———美国国务院和美国和平队(PeaceCorps美国志愿服务组织);两个高利润的科技创新公司———谷歌和苹果公司以及一个媒体巨头———迪斯尼公司。谷歌跃居第一今年的排行榜上,谷歌打败了去年第一名的迪斯尼公司,成为大学生心中最理想的雇主。
此次调查还发现,学生们没有以往那么青睐于制药产业和消费品产业。比如,以往一直居于排行榜前十位的强生公司从第8名跌至18名,而雅培实验室由第54名滑至百名之外。同时,消费品领域的公司排名也开始下滑,如宝洁公司(从14名下降到21名)和欧莱雅公司(从27名滑落到35名)。
据统计,参与此次调查的大学生人数达到44064人。当大学生列出理想雇主的名单时,他们倾向于填写能够让自己发挥潜能并且有一定成就的组织。此次调查还包括了前200名理想雇主和名次下降明显的前50名雇主,涉及文科、信息技术、工程学和工商学等领域。热衷公益组织今年调查结果显示,美国大学生择业的两个主要趋势:从事公益活动或者为高薪而工作,但看起来,这是互为矛盾的两种选择。不过,优信咨询公司的CEO克劳迪亚·塔塔内里(ClaudiaTattanelli)表示:这两者的初衷是一致的,都是为未来成功铺路的聪明之举。例如,有良好口碑的美国公共服务机构美国和平队和“为美国而教”教育项目,在2006年甚至根本没有上榜,而今年却直接闯进了前十名。
“这些非赢利组织的声誉会使简历看起来更加漂亮。”塔塔内里说。这两个组织的员工承担着一定的义务,而这常常是政府官员和雇主在招收毕业生时非常看重的一点。事实上,和“为美国而教”项目合作的许多公司会让雇员先为公益组织工作两年,再开始正式工作。(谢婷)
美国和平队(PeaceCorps)
一个联邦政府组织,美国的志愿者经训练后被派往国外帮助发展中国家人民提高技术、农业和教育水平。有过这种经历的人回归到自身的文化环境后,就具有了跨文化的工作能力。“为美国而教”(TeachforAmerica)教育项目
该项目组是由肤色各异、专业各异的美国大学生组成的。他们奔赴到城市或农村的学校,完成两年的教书工作。与中国的大学生毕业后支教西部的活动相似。
前10名最理想雇主
公司或组织投票率谷歌(google)13.37%
迪斯尼公司(Walt Disney Co.)10.03%
苹果()8.47%
美国国务院(State Dept.)6.87%
和平队(Peace Corps)6.87%
中央情报局(Central Intelligence Agency)6.72%
普华永道(Pricewaterhouse Coopers)6.44%
微软(Microsoft)6.31%
联邦调查局(Federal Bureauof Investigation)6.27%
“为美国而教”项目(Teach For America)6.26%
身为开发人员的您,准备好迎接Widows Mobile 6了吗?
http://blog.csdn.net/donggua123/archive/2007/05/21/1619405.aspx
http://www.disound.com/zblog/rss.asp?cate=3
<?xml version="1.0" encoding="UTF-8" ?>
<canvas>
<script>
function checkIt(){
if(canvas.input.inputname.name.getText()==""){
canvas.input.checkView.setText("姓名不能为空")
return 0;
}
else{
return 1;
}
}
</script>
<simplelayout axis="x" spacing="30"/>
<view name="input" x="30" y="30" width="50%" height="100%">
<simplelayout axis="y" spacing="10"/>
<view name="inputname" x="10">
<simplelayout axis="x" spacing="10"/>
<text>请输入姓名</text>
<edittext name="name"></edittext>
</view>
<view name="inputpassword" x="10">
<simplelayout axis="x" spacing="10"/>
<text>请输入密码</text>
<edittext name="password" password="true"></edittext>
</view>
<view name="inputage" x="10">
<simplelayout axis="x" spacing="10"/>
<text>请输入年龄</text>
<edittext name="age" pattern="[1,2,3,4,5,6,7,8,9,0]*" ></edittext>
</view>
<view name="inputsex" x="10">
<simplelayout axis="x" spacing="10"/>
<text>请输入性别</text>
<combobox name="sex" editable="false" defaulttext="请选择">
<textlistitem text="男" />
<textlistitem text="女" />
</combobox>
</view>
<view name="inputmail" x="10">
<simplelayout axis="x" spacing="10"/>
<text>请输入E-Mail</text>
<edittext name="mail"></edittext>
</view>
<button isdefault="true">
重置
<method event="onclick">
parent.inputname.name.setText("");
parent.inputpassword.password.setText("");
parent.inputage.age.setText("");
parent.inputsex.sex.setText("请选择");
parent.inputmail.mail.setText("");
</method>
</button>
<button isdefault="true">
提交
<method event="onclick">
if(!checkIt()){}
else{
if(canvas.look.dataView.getText != ""){
canvas.look.dataView.clearText();
}
canvas.look.dataView.addText("姓 名:" + parent.inputname.name.getText()+"\n");
canvas.look.dataView.addText("年 龄:" + parent.inputage.age.getText()+"\n");
canvas.look.dataView.addText("性 别:" + parent.inputsex.sex.getText()+"\n");
canvas.look.dataView.addText("E-Mail:" + parent.inputmail.mail.getText()+"\n");
}
</method>
</button>
<text name="checkView" multiline="true" maxlength="1000"/>
</view>
<view name="look" y="30" width="50%" height="100%">
<text name="dataView" multiline="true" maxlength="1000">
</text>
</view>
</canvas>
http://www.openria.cn/posts/list/38.page
http://www.wujianrong.com/archives/2007/02/laszlo.html
http://www.onjava.com/pub/a/onjava/2005/06/15/laszlo.html
http://blog.csdn.net/xray_gu
本人大学毕业以后被分配到医院工作,在医院做为医生工作过7年,后来应聘到外企,先后在世界著名的医药公司工作过7年,分别是:瑞士,德国,美国公司。然后出国2年,回国后在一家民营企业工作了7个月。可以说经历了个总类型的企业,包括当海龟的经历。很想在这里和朋友们分享,也给正在找工作的朋友提供一些参考。
先从国营单位说起。
国营单位人际关系比较复杂,在国营单位要想生存的舒服,能力不是主要的,人际关系,裙带关系比较关键。因为国营单位的效益增加与否,与所谓领导的political利益关系不大。也就是说,单位效益不好,不会动摇领导者的领导地位,他的既得利益不会受影响。业务能力不过是领导控制下属的一个工具,不是考核工具。因此想靠业务能力在国营单位有所发展,比较难。一个业务能力不强,但是八面玲珑的人,更容易受到重用。国企从工作量上讲,比较轻松。也不需要什么主观能动性,也没有什么激励机制,属于不费体力,但累心的单位。比较适合中年,保持混的心态的人工作。因此对于年轻人来说,在国营单位工作,要学会与人相处,学会察言观色,当然业务不能丢。这样你学会了如何与人相处,再拥有了一定的业务,你就具备了挑选自己职业生涯的能力,留下还是跳槽,就全有你选择了。如果你没有业务能力,那么你也就只能留在国营单位。因为外企和国企完全不同。那里是靠能力发展的地方。
再说说外企。
从我所工作过的外企和自己职业生涯的上升过程。个人认为,外企人际关系比较简单,特别是那种外国人作为直接老板的外企(以欧美公司为例,本人没有亚洲企业的工作经理)。外国人比较烦中国人之间复杂的人际关系,对于爱汇报别人不好的员工,外国人比较看不起。因此外国人更重视员工的工作能力。在外企一切都是拿工作业绩说话。如果你业绩不好,你再会拍马屁也没有用。因为外国老板的职位也是要靠业绩来巩固的。如果他的业绩不好,他也要失业,所以员工的业绩与他的前途密切挂钩。也许搞技术的不同,我是搞销售,市场的,所以能力的表现就显得特别重要。比如提升,一定是提拔工作业绩好的。还有一点,就是在外企,个人利益是要自己主动争取的。如果老板不给你长工资,而你的业绩做得好,你可以直接找老板谈条件。往往最终是可以达到目的的。外企如果在底层,一般没有什么political,但是做到中,高层,就会有political,当然大部分也是老外之间斗。或者是一些中国人之间斗。我的经验是,从不参加任何人的拉帮结派。做好自己的工作,拿业绩说话。同时也还是要和各部门同事之间搞好关系。这样对自己协调工作有利。在外企工作的人一定要明白自己的地位,永远不可能替代外国老板的位置。所以没有必要在同事之间树敌。只要你能拿到你希望的薪水,得到提升就可以了。但是在外企一定要有一个好的工作态度。在外企工作,老板最讨厌和公司讨价还价,斤斤计较的人,这样的人,看似可以得到眼前的小利,却会失去自己希望得到的更大的利益。比如,我在德国公司工作的时候,我们出差的标准是我们这个级别的人,可以住5星级酒店。和我一个级别的男同事们从来不肯让自己吃亏,不管离办公室多远,一定要住够档次的酒店,而我不在乎酒店的级别,我觉得不过就是睡一觉,在那里都可以,我只想住离办公室近的地方,方便上班。3星级的我也可以住。结果是我出差的费用总是比其他同事少,可是我却完成和别人一样的事情。看似我好像亏了,结果是等到提升的时候,老板提升了我,理由就是我懂得为公司节省费用,并完成了同样的事,他们认为这是作为一个管理者应该具备的财务观念。外企考核人的标准是非常注意人品的,老板从来不轻易的批评员工,但是他们比中国人更细的观察员工。因此在外企工作,绝对不能偷奸耍滑,很多外企工作的人抱怨在外企没有前途,我想与他们那种典型中国人的喜欢占小便宜的思想有关。说到年龄,我是30岁才到外企,从销售做起,到37岁离开外企出国已经是市场总监了。我想如果我不辞职,我照样可以继续干下去。所谓个人认为,外企比较适合有能力,有创意的年轻人工作。外企,特别是世界级的大公司,都非常重视培训。而这个培训是无价的。不过有一点可以告诉大家,就是越大,越有名气的公司,基础员工的工资反而并不高。因为公司的名气就是一种无形资产。也就是说,你在大公司的工作经历,可以使你很容易得找到付给你高工资的其他低一级的企业。公司非常清楚自己知名度的品牌价值。所以建议那些想进入大公司的年龄人,如果你想未来有所发展,就不要在乎起始工资,进入大公司,接受他们的培训,比什么都重要,因为这个才是你以后增值,要高价的基础。如果是世界一流的大公司,就是给500块,也要进去。如果你相信自己有能力,你就要努力干,你就能得到提升,你才有挣5万块的资本。
最后,说说民营企业。出国两年后,回国。在第一个月之内,猎头公司就知道我回来了,给我推荐了3个公司。一个是国内的药厂,一个是合资的药厂,另一个是民营企业。由于民营企业开的价格比较高,而且单位距离我家也很近,我就选择了这个单位。那年我39岁。我想他们从4个合适的人选中,最后选中我,一来是我以前在国内外企医药市场多年的经验,二来,这个企业是个所谓的高科技企业,也需要一些嘴里能蹦外国话的人来冲门面。来吸引投资人投资。然而我发现,我不能适应那里的文化。特别不能让我接受的就是,员工的素质。同事之间勾心斗角,而且男女关系混乱。特别是管理层素质很差。公司评价员工是以能喝酒,能吹牛为标准的。惩罚,奖励机制没有。作为的总经理也是投资人聘用的,以浪费投资人的钱为手段。没有看到开发出什么新产品,但是总是靠写各种投资报告吸引有资金的人投资。而且员工之间相互不懂的尊重,吵架,乱搞得很常见。因此我觉得很难融入这样“原始状态”的工作环境,因此在工作半年的时候提出辞职。对民企的感觉就是,看起来,又打卡,又计分的,其实根本没有管理概念,不但没有企业管理理念,也没有人事,财务管理理念,各项管理都比较混乱,带有很强的私营和国营杂交的特质。所有的经营都是短期概念。不适合作为长期发展的目标。也许是我没有遇到好的民营企业吧?不过对我来说,有这一次经历也就够了。我个人认为可以作为实在找不到工作暂时落脚的地方,对于年轻人切不可久留,否则不但什么都学不到,而且还会造成对职业非常错误的理念。
总结一下就是,外企是适合年轻人学东西,学本领的地方,如同一个非常好的能力培训基地。国企是个锻炼中国式人际交往的地方,也是可以通向仕途的唯一通路。民企是个暂时的收容所,不能久留。以上纯属个人意见,可供讨论
几本linux学习的书籍
本人正在进行linux 的学习 希望这些资料对linux爱好者有用
linux 教材大全
ftp://down.eshuba.com/eshuba/xitongxiangguan/Linuxjcdq.rar
linux 使用大全
http://down.eshuai.cn/shuba/xito
... %C3%B4%F3%C8%AB.rar
linux 学习宝典
http://down1.cnhacker.com/booksdown/07013103050c8cb659a28f9ff.rar
linux 从入门到精通
http://www.gouhuo.com/study/linuxbook.zip
练成linux 高手
http://www.jz5u.com/download.asp?id=15590&downid=0
送给linux 初学者
ftp://211.95.73.26/hl/
送给初学Linux的穷人Linux系统指令大全.pdf
linux 系统管理
ftp://211.95.73.26/1zxhlinux.rar
linux 命令大全
http://ftpgz5.pconline.com.cn/exam/it/Linux061114.rar
linux 软件工程师
ftp://222.214.218.42/book3/20060
... 81-4941bcee1f11.pdf
基础学习
http://www.00083.com/soft/upload
... 84b69a63c2ed2a47af3
基础教程完整版
http://download.chinaitlab.com/download.asp?id=34873
命令全集
http://down.linuxmine.com/soft/0/1/01000001.rar
使用学习教程
ftp://222.214.216.57/book2/20061
... 16-c8b5facb0654.chm
网络安全配置
http://vip.hackbase.com/vipsoft/vipteacher/20050305linux29.rar
linux 从入门到精通
ftp://down.eshuba.com/eshuba/200601/Linux
??????.rar
http://ftpgz13.pconline.com.cn/pub/download/200205/linuxsite.rar
新手管理员手册
http://www.00083.com/soft/upload
... fc01983a9ded8943b62
安装与配置简明手册
http://cpss.zz.ha.cn/study/linux
... %f7%ca%d6%b2%e1.zip
网络实际操作 thunder://QUFodHRwOi8vZG93bmxvYWQuY2hpbmFpdGxhYi5jb20vZG93bmxvYWQuYXNwP2lkPTM3MTM3Wlo=
红旗linux 中文版初级教程
http://down.hack58.com/fzw_hack58/sohu/11-23linux.rar
linux 核心源代码分析PDG
http://www.00083.com/soft/uploadsoft/linux
核心源代码分析.rar?6103004891303x1174341082x6103009877379-15c492eb5c3033c99a07c2fba419c496
破解根用户密码
http://www.942d.com/shipin/bbs/linuxsn.rar
Red Hat Linux Fedora傻瓜书
httP://book1.ibook8.com/ibook8co
... 5/041113/fedora.rar
Linux知识宝库典藏版
ftp://222.214.218.42/book3/20060
... 35-0c5492042030.chm
Linux程序设计
ftp://down.eshuba.com/eshuba/xitongxiangguan/Linuxcxsj.rar
Linux参考大全
httP://book1.ibook8.com/ibook8com/pc2005/701/1/521hacker-20.zip
linux编程初学者入门
ftp://222.214.216.57/book2/20061
... 00-a603302e0466.rar
LINUX应用技术精华{面向初学Linux朋友的书籍}
http://www.linuxfans.org/nuke/software/LINUX
应用技术精华{面向初学Linux朋友的书籍}/LINUX应用技术精华{面向初学Linux朋友的书籍}.rar
redhat9从入门到精通
http://down.315safe.com:315/redhat9
从入门到精通.rar
Linux C函数库参考手册
http://cnc-http.xpbook.com:81/200506/Linux%20C
函数库参考手册.rar?6102881127298x1150968278x6102884440460-71dc8cd6d874db99d29888002914a4d5
Linux 内核完全注释
httP://book1.ibook8.com/ibook8co
... 113/linuxsystem.rar
Linux2006年9月 总第三期
http://www.linuxer.cn/magazine/linuxer3-2006-09.pdf
Linux_network_manage-3245
http://down.csdn.net/down2//2006
... ork_manage-3245.rar
一周内学会Linux系统管理
http://download1.csdn.net/down2/2006/10/499/1zxhlinux-2605.rar
linux编程白皮书
http://download1.csdn.net/down//2006/webdown/004/Linuxbcbps.rar
linux上的c编程
http://www.cinchina.com/Soft/Sho
... lID=1&SoftID=12
linux宝典 thunder://QUFodHRwOi8vZG93bmxvYWQuY2hpbmFpdGxhYi5jb20vZG93bmxvYWQuYXNwP2lkPTM3MDk3Wlo=
《Linux内核完全注释》 V1.9.5版
http://oldlinux.qbang.org/download/clk011c-1.9.5.pdf
linux教材 thunder://QUFodHRwOi8vd3d3Lmp6NXUuY29tL2Rvd25sb2FkLmFzcD9pZD0xNDUxNSZkb3duaWQ9MFpa
linux命令全集Shell_manual
http://www.uplinux.com/php/downl
... ZWxsX21hbnVhbC56aXA
这些资源用迅雷下载可能会快一些
PDF 格式的支持在线观
一份好工作应该是自己所喜欢的工作。走自己的路,做自己喜欢的事情,选择自己感兴趣的职业,选择适合自己兴趣的职业,使自己的才知和天性得以最大程度的发挥,是每个求职者首先应该考虑的一个重要问题。切不可轻易放弃这一标准而盲目追求热门工作、进大城市或高收入等等。
Ⅱ,其次,一份好的工作应该是有利于自身发展的工作。从发展的眼光看前景,这是求职者必须加以考虑的,在选择具体单位时,任何一个单位都会有利有弊。在权衡利弊过程中也要从有利于自身发展的角度考虑,或者是能为你进一步提高自己提供条件,或者是能帮助你积累经验,或者是能使你开拓一个新领域,或者是为你深造赢得了时间等等。
Ⅲ,一份好的工作应该是你力所能及的工作。你所向往的好工作可能很多,但能不能选择一份力所能及的工作却是决定成败的一个关键。其中包含两层意思,一是指你是否能胜任这份工作,二是你是否能得到这份工作。首先要选择你能够胜任的工作。也许你有门路、有办法进入一个相当有实力的单位,但在竞争日趋激烈的今天,如果你无法胜任这份工作,即使这份工作再好,也最好不要问津,免得被工作所累,免得在激烈的竞争中被淘汰出局。再者,大学生在求职择业时普遍存在着期望值过高的倾向,不少朋友动辄非几千元月薪不去,正是由于这种不切实际的期望值,使得一次一次在求职中失败,待到认清自己的定位时,合适的工作却被别人占去了,这种教训应该认真汲取。就业是一件时效性很强的工作,只要调整好自己,把握好标准,抓住机遇,对多数朋友来说,找份好工作并不难。
文章来源: http://www.kaifulee.com/modules/bbs/viewthread.php?tid=22206
生涯规划是新时代的潮流,现代人的课题,生涯规划愈早做愈好,胜算也愈大,而且愈到老愈受用,自己不但要早做生涯规划,让自己活出快乐人生,而且要做子女、学生、员工的生涯贵人,为他们生涯点灯,协助指导他们适性发展。
生涯规划诀窍100则,系从江文雄:生涯规划一书中,摘要其重点内容供参考。如果您能将这100诀,经常阅读、反思,人生必然不断成长、精进,更为圆融、得众。愿彼此共勉之。
01. 生涯即人生、生涯即竞争,生涯规划就是个人一生的竞争策略规划。
02. 生涯要规划,更要经营,起点是自己,终点也是自己,没有人能代劳。
03. 生涯规划就是规划人生的远景,彩绘生命的蓝图,发挥自己的才能,写出人生的剧本。
04. 生涯规划包括如何成长、学习、谋生及生活,是一连串思考、选择、计划、打拼、发展的终生历程。
05. 生涯规划的目的,在于掌握住现在。看得见未来;促进自我暸解、自我定位、自我发展及自我实现。
06. 成功的人生,需要自己去经营,别再说了,莫再等了,现在就为自己的人生做好规划,为人生点亮一盏明灯,赢在人生起跑点上。
07. 人生是一趟旅行,只卖是单程票,不卖回程票。
08. 时间就是生命,人生何其短暂,请珍惜有限岁月,活出自己,活出生命。
09. 人生之路要自己走,要过怎样的人生,完全是自己的选择,只有自己才能赋予生命最佳的诠释。
10. 人生像演员,不同的场合,不同的阶段,扮演不同的角色,重要的是,无论演什么,就要像什么。
11. 人生的愿望,在于:成为自己的老板,掌握自己的命运,主宰自己的时间,创造自己的快乐,追求自己的幸福。
12. 人生的标的,在于:感觉被欣赏,人格被尊重,成就被肯定,生而能尽欢,死而能无憾。
13. 生活的目的,在于:活得实在,活得自在,活出健康,活出品味,活出快乐,活出豪气,活出尊严。
14. 人生最重的事,不是您现在站在何处,而是您今后要朝那个方向,只要方向对,找到路,就不怕路远。
15. 成功的人生,胜于成功的事业,一味追求事业的赢家,最后可能变成人生的输家。
16. 佛前的灯,不必刻意去点,最重要的是,点亮自己的心灯,知道自己的起跑点及目的地,想出最适合自己的方式,按部就班跑向目的地。
17.人的一生,是一连串决定交织而成的过程,其精华在于自己如何选择。生命的最高境界,就是选对舞台,尽情挥洒才华,走出自己的路。
18.人生成功的定义,要自己去找寻;人生快乐的感觉,要自己去诠释;千万不要迷失在别人的看法中。
19.价值观,就是我们对事物好与坏、对与错的看法,我们觉得好的、对的、重要的、应该的,都代表了我们的价值观,因人而异,系于一念之间。
20.在对人、对事方面,如果能尽量选择朝愉的方向去想,就会愈来愈感到愉快。
21.一个人只要想法愿意改变,事情就有转机,改变的意念会愈强,胜算就愈大,成功的机会,远留给拥抱变化、渴望改变的人。
22.人生是计划的过程,计划的主人是自己,计划做得具体,执行做得确实,胜算必然属于自己。
23.积极的人,充满乐观,展现活力,总是知道自己的方向,要的是什么?更清楚地知道,自己该如何去做。
24.人在高潮时,千万不可得意忘形,否则骄兵必败;人处低潮时,千万不可灰心丧志,否则郁卒自灭。
25.一个人如果心态开放,保持好奇,破除成见,不断进修,求新求变,将会使视野开阔,拥有创意人生。
26.快不快乐在自己,快乐从心起,自己求,要学习。
27.当一个人感到很知足,心不烦,身不疲,无所求,心能安的时候,快乐就在其中。
28.当一个人感到吃得下,玩得动,睡得好,没牵挂,很满足的时候,幸福就在其中。
29.快乐的源泉在于:知足、无求。尽责、无怨、宽容、感恩、舍得、放下、忘记。
30.生涯规划的步骤是:先觉知、有意愿、量己力、衡外情、订目标、找策略、重实践、善反省、再调整、重出发的循环历程。
31.生涯规划的前提在于:主角是自己,愿意改变自己,要量力适性,参考家人意见,有求好心,有企图心,有行动决心。
32.一个人就算饱学之士,如果不能暸解自己,掌握自己,就称不上是个有智慧的人。
33.知己是生涯规划的起点,唯有充分了解自己,生涯规划才能做到量力适性,人生才能过得如自己所想。
34.要暸解自己,就要勤于自我生涯对话,认清我是谁?我是怎样的一个人?我有那些生涯资产及战力?我要到那里去?我要如何达到目的?
35.目标代表个人的愿景,是心中的罗盘,人生因有目标,才会执着去追求,才会有成功的希望。
36.人生有梦,筑梦踏实,将自己的梦想,以阶段性的小目标,落实在具体的计划中,然后身体力行,积极实践,就是生涯规划最具体的表现。
37.人生是连续的过程,珍视过程,就是钟爱自己;渴望、信心及行动是圆梦三部曲。
38.人生以40岁为分水岭,前20年,为人作嫁,工作以量为中心;后20年, 为己多活,工作要以质为中心。
39.人生幸福三诀:一、不要拿自己的错误惩罚自己﹔二、不要拿自己的错误惩罚别人﹔三、不要拿别人的错误惩罚自己。
40.人生虽有终点,生命却是无涯,生活可以随便,生命却要认真,怎样安排此生,是自己的责任。
41.圆满人生的八大领域是:婚姻美满、家庭和乐、道德修养、终身学习、事业发展、身体健康、理财得法、善缘广结。
42.全方位的生涯规划,至少包括四个领域:缤纷生活路、快乐工作路、丰富学习路、职涯成功路。
43. 缤纷生活路包括:美满婚姻、和乐家庭、健康生活、休闲生活、人际关系、时间管理、消费理财等。
44.快乐工作路包括:善尽职责,纾解压力、精益求精、工作丰富、寻找乐趣、追求创新等。
45. 丰富学习路包括:修身养性、自我进修、短期进修、在职进修、学艺专精、网络学习等。
46.职涯成功路包括:终身受雇、职位晋升、专长发展、绩效创高等。
47.人生的地图,画满了各式各样的关卡,每过一关都是成长,能够过关便是幸运,经历种种关卡所累积的教训及经验,更是人生的智慧。
48.人生的关卡,成败在于自己,过关的是自己,卡住的也是自己,人生自古谁无关,只要过关就是赢家。
49.生涯警讯要觉醒,生涯危机要诊断,生涯挫败要探因,逆转危机为转机,生涯革命要进行。
50.挫败是人生必修的学分,除了勇敢面对它、接受它、处理它,没有第二绦路。
51.中年,是一个充满压力、挑战及危机的时期,如何破茧而出,在困境中突破成长,是人生的重要课题。
52.中年转折是一个危机与机会并存的时机,也是一个真真实实的转折点,只要勇敢面对,因应有方,还是能够活得像一条龙。
53.破浪扬帆全靠信心、决心、毅力,福祸无门,无一事不可转圜,一切操之在己。
54.灰心丧志是失败之源;患得患失是痛苦之源;焦虑忧愁是疾病之源;知足、感恩、善解、包容是快乐之源;健康、平安、心安是幸福之源。
55.舍得才能获得;放下才能去烦;忘记才能心宁;宽容才能得众;反求诸己,做到无念无私,就是踏实自在。
56生涯路上满布陷阱,每个人要以如履薄冰的心情,踏实的跨出每一步,坚持向前,充满自信和决心,只要行得正,走得稳,终会达成目标。
57.成功不自满,常怀企图心;改善是求进步的动力,自满是走下坡的起点;为了成功而停下脚步的人,失败就在不远处等您。
58.真正的裒退,不在白发皱纹,而是停止了学习进取,因此,抱持希望,不断学习,落实行动,是成功人生的保证。
59.现代人的工作守则:流汗不流血,卖力不卖命,做事不坐牢,争气不争功,凡事求合理,凡事求心安,过程兼结果,时效即绩效。
60.一个人的品德操守最重要,也是唯一自保之道。表现好,别人不一定肯定;表现不好,别人肯定不轻饶;那里差,别人就往那边挑;那里脏,别人就往那边扫;那里臭,别人就往那边清。
61.一个人如果忙得抽不出一点时间,常把忙碌一词成为口头禅,那就表示自己已被时间锁住,成了时间的奴隶。
62.人生有输有赢,得势顺境时,千万不要得意忘形,放纵自己;失势逆境时,千万不可消极颓唐,放弃自己;人生成功的定义,要自己去找,别迷失在别人的看法中。
63.人生如起伏波浪,唯有培养辨识障碍意识与能力,坚定面对挫折勇气与决心,设法及时反省与补救,才是在茫茫人生大海中,安稳航行的不二法门。
**.聪明人看退休:不是人生的结束,而是另一阶段的开始;不是工作的退出,而是工作的再参与;不是从此坐享清福,而是人生再定位;不是依靠别人,而是人生再出发;不足自然凋谢的过程,而是有计划的过程。
65.退休是放松自己,让自己更有时间,去做一些年轻时想做,而没时间去做的事情,来满足自我,活出精彩人生。
66.在年轻的时候,如果能尽早预筹生涯发展,先期进行生涯管理,生涯路上,必然走得实在,活得快意。
67.早备六老,愈老愈受用:老健、老伴、老本、老友、老趣、老傻。
68.老身要健,勤于运动:要活就要动,动则得救;力行生活规律,饮食适当,营养均衡,定期健检;注重休闲,保持心情愉快,便是健康保证。
69.老伴要好,爱要及时:年轻的夫妻,要及早培养默契,好为老年的生活,累积相爱相守的本钱;空巢中的老人,虽然抓不住孩子的翅膀,但别忘了劳苦功高的老伴,只要巢中有温情,永远不会空。
70.老本要保,善于理财:年轻的时候,要量入为出,懂得理财,为后半生早作准备;人老了,没钱万万不能,千万要守住老本,懂得活用,善待自己。
71.老友要交,广结善缘:老友愈陈愈香,年轻的朋友,要及早培养人脉,以便为老年的生活,营造谈天说笑的空间;人愈老愈需要朋友,借着老友的互动联谊,可排遣寂寞,打发时间。
72.老趣要多,及时培养:一个人的兴趣愈多,朋友就愈多,生活就愈有情趣,生命也就更充实,能为兴趣而活,是人生最大乐事。
73.老傻要装,涵养心性:人活得愈老,愈要装傻,与配偶、子女、媳妇、好友相处,少说两句、少批毛病、少发脾气,多让一点、多想一二、多说好话,和和乐乐,皆大欢喜。
74.装傻的最高境界在于:拿得起、放得下、看得开、不动气、知足、感恩、善解、包容。
75.临老宣言:多运动保健康,心和谐增愉快,不要委屈自己,不要为难子女,没钱万万不能,多陪伴老伴,活到老学到老,有余力多奉献,可以预立遗嘱,多做还愿还债,从容准备后事,恬然接纳死亡。
76.临老警语:不做老病号,不做老番颠,不做孤独者,不做守财奴,不做落伍者,不做依赖者,不做等死者。
77.银发族的养生秘诀:知老、认老、抗老、忘老、返老、惜老。
78.老当知老,规律自找,青春永保;老当认老,不要过劳,剔去烦恼;老当抗老,养身有道,永不嫌老;老当忘老,不停用脑,永不枯槁;抗当返老,心境要好,自乐陶陶;老当惜老,及时行乐,潇洒逍遥。
79.潇洒人生六得:来得、做得、玩得、舍得、放得、走得。
80.活到老,学到老,动到老,玩到老,乐到老,永不老。
81.悲观者抱怨风向,乐观者期待转向,聪明者调整风帆。
82.对人生的种种,要抱持「看得见、想出来、知改变、能行动」的态度,才能对自己的人生有所交待。
83.自我管理的警语:既尊己又尊人,站稳脚再冲刺,识时务知进退,存善心做好事,己不欲勿施人,有余力多助人,重修行求心安,善尽责留怀思,再卖力有批评,疼自己做自己。
84.有效工作的警语:流汗不流血,卖力不卖命,做事不坐牢,争气不争功,有始也有终,过程兼结果,时效即绩效。
85.人际关系的警语:时存五心(诚心、宽心、同理心、肋人心、感恩心);力行五好(心地好、态度好、表情好、言语好、行为好)。
86.开心生活的警语:时时开放心胸,保持乐观心情,全力冲刺目标,运动休闲兼顾,营养力求均衡,生活加点创意。
87.心灵保育的警语:常运动以健心,多静省以收心,戒酒色以清心,去物欲以养心,诵古训以警心,悟至理以明心,厉行善以爱心。
88.在人生的奋斗过程中,就像一场场的球赛,有输有赢;人生之路崎岖难行,但凭毅力、决心,勇往直前,才能战胜命运,成为生涯赢家。
89.所谓生涯赢家,就是对自己了解很清楚,知道自己想要什么,想做什么,想过怎样人生的人。
90.生涯赢家的画像:快乐风光享余年:活动自如身体健,经济独立不靠人,亲情友情乐融融,云淡风轻随己性,生活快乐不知老,退休计划做得巧,养老压力自然小。
91.赢家的相对就是输家,凡是对自己不了解,任由环境塑造,糊里胡涂生活的人,都算是人生的输家。
92.生涯输家的画像:病弱孤独度残生:插管躺卧在病榻,如影随形文明病,亲情友情渐疏离,精神空虚难自处,早未准备悔已迟,退休计划做得差,养老压力自然大。
93.人生使命宣言:家庭第一,健康至上;劲在工作,知足感恩;乐善好施, 广结善缘;信然重诺,心安理得;终身学习 回馈社会。
94.不怕计划失败,只怕不去计划,嬴家的头衔,是苦干得来,汗水换来的。
95.生涯是连续的,终生的,与成功有约,有梦的人终会摘星。
96.主角是自己,只有自己才能决定成败,掌握命运,突破困境,使美梦成真,没有人可以代劳。
97.新好父母或老师,要为孩子或学生生涯点灯:点燃心灯、智慧之灯、希望之灯。
98.新好父母或老师,要做子女或学生的生涯贵人:要做心理学家、顾问、拉拉队长、向导。
99.让孩子或学生,找到自己,掌握自己,肯定自己,走出自己的路,比什么重要。
100.快乐人生的根源,在于用心经营家庭;事业成功的人,也是家中的模范生,筑一个自己喜欢的巢,爱情及亲情就在家里.
受益终生的十大经典管理学定律
文章来源: http://www.kaifulee.com/modules/bbs/viewthread.php?tid=103922&extra=page%3D1
1、彼得原理
每个组织都是由各种不同的职位、等级或阶层的排列所组成,每个人都隶属于其中的某个等级。彼得原理是美国学者劳斯·彼得在对组织中人员晋升的相关现象研究后,得出一个结论:在各种组织中,雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为向上爬的原理。 这种现象在现实生活中无处不在:一名称职的教授被提升为大学校长后,却无法胜任;一个优秀的运动员被提升为主管体育的官员,而无所作为。对一个组织而言,一旦相当部分人员被推到其不称职的级别,就会造成组织的人浮于事,效率低下,导致平庸者出人头地,发展停滞。因此,这就要求改变单纯的根据贡献决定晋升的企业员工晋升机制,不能因某人在某个岗位上干得很出色,就推断此人一定能够胜任更高一级的职务。将一名职工晋升到一个无法很好发挥才能的岗位,不仅不是对本人的奖励,反而使其无法很好发挥才能,也给企业带来损失。
2、酒与污水定律
酒与污水定律是指把一匙酒倒进一桶污水,得到的是一桶污水;如果把一匙污水倒进一桶酒,得到的还是一桶污水。在任何组织里,几乎都存在几个难弄的人物,他们存在的目的似乎就是为了把事情搞糟。最糟糕的是,他们像果箱里的烂苹果,如果不及时处理,它会迅速传染,把果箱里其他苹果也弄烂。 烂苹果的可怕之处,在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没,而一个无德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的,是建立在相互理解、妥协和容忍的基础上的,很容易被侵害、被毒化。破坏者能力非凡的另一个重要原因在于,破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器,一头驴子一秒钟就能毁坏掉。如果一个组织里有这样的一头驴子,即使拥有再多的能工巧匠,也不会有多少像样的工作成果。如果你的组织里有这样的一头驴子,你应该马上把它清除掉,如果你无力这样做,就应该把它拴起来。
3、木桶定律
水桶定律是讲一只水桶能装多少水,这完全取决于它最短的那块木板。这就是说任何一个组织,可能面临的一个共同问题,即构成组织的各个部分往往是优劣不齐的,而劣势部分往往决定整个组织的水平。水桶定律与酒与污水定律不同,后者讨论的是组织中的破坏力量,最短的木板却是组织中有用的一个部分,只不过比其他部分差一些,你不能把它们当成烂苹果扔掉。强弱只是相对而言的,无法消除,问题在于你容忍这种弱点到什么程度,如果严重到成为阻碍工作的瓶颈,你就不得不有所动作。
4、马太效应
《新约·马太福音》中有这样一个故事:一个国王远行前,交给3个仆人每人一锭银子,吩咐道:你们去做生意,等我回来时,再来见我。国王回来时,第一个仆人说:主人,你交给我的一锭银子,我已赚了10锭。于是,国王奖励他10座城邑。第二个仆人报告:主人,你给我的一锭银子,我已赚了5锭。于是,国王奖励他5座城邑。第三仆人报告说:主人,你给我的1锭银子,我一直包在手帕里,怕丢失,一直没有拿出来。于是,国王命令将第三个仆人的1锭银子赏给第一个仆人,说:凡是少的,就连他所有的,也要夺过来。凡是多的,还要给他,叫他多多益善,这就是马太效应,反应当今社会中存在的一个普遍现象,即赢家通吃。对企业经营发展而言,马太效应告诉我们,要想在某一个领域保持优势,就必须在此领域迅速做大。当你成为某个领域的领头羊时,即便投资回报率相同,你也能更轻易地获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报。
5、零和游戏原理
零和游戏是指一项游戏中,游戏者有输有赢,一方所赢正是另一方所输,游戏的总成绩永远为零,零和游戏原理之所以广受关注,主要是因为人们在社会的方方面面都能发现与零和游戏类似的局面,胜利者的光荣后面往往隐藏着失败者的辛酸和苦涩。 20世纪,人类经历两次世界大战、经济高速增长,科技进步、全球一体化以及日益严重的环境污染,零和游戏观念正逐渐被双赢观念所取代。人们开始认识到利已不一定要建立在损人的基础上。通过有效合作皆大欢喜的结局是可能出现的。但从零和游戏走向双赢,要求各方面要有真诚合作的精神和勇气,在合作中不要小聪明,不要总想占别人的小便宜,要遵守游戏规则,否则双赢的局面就不可能出现,最终吃亏的还是合作者自己。
6、华盛顿合作规律
华盛顿合作规律说的是一个人敷衍了事,两个人互相推诿,三个人则永无成事之日。多少有点类似于我们三个和尚的故事。人与人的合作,不是人力的简单相加,而是要复杂和微妙得多。在这种合作中,假定每个人的能力都为1,那么,10个人的合作结果有时比10大得多,有时,甚至比1还要小。因为人不是静止物,而更像方向各异的能量,相互推动时,自然事半功倍,相互抵触时,则一事无成。 我们传统的管理理论中,对合作研究得并不多,最直观的反映就是,目前的大多数管理制度和行为都是致力于减少人力的无谓消耗,而非利用组织提高人的效能。换言之,不妨说管理的主要目的不是让每个人做得更好,而是避免内耗过多。
7、手表定理
手表定理是指一个人有一只表时,可以知道现在是几点钟,当他同时拥有两只表时,却无法确定。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。手表定理在企业经营管理方面,给我们一种非常直观的启发,就是对同一个人或同一个组织的管理,不能同时采用两种不同的方法,不能同时设置两个不同的目标,甚至每一个人不能由两个人同时指挥,否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于,每个人都不能同时选择两种不同的价值观,否则,你的行为将陷于混乱。
8、不值得定律
不值得定律最直观的表述是:不值得做的的事情,就不值得做好。这个定律再简单不过了,重要性却时时被人们忽视遗忘。不值得定律反映人们的一种心理,一个人如果从事的是一份自认为不值得做的事情,往往会保持冷嘲热讽,敷衍了事的态度,不仅成功率低,而且即使成功,也不觉得有多大的成就感。 因此,对个人来说,应在多种可供选择的奋斗目标及价值观中挑选一种,然后为之奋斗。选择你所爱的,爱你所选择的,才可能激发我们的斗志,也可以心安理得。而对一个企业或组织来说,则要很好地分析员工的性格特性,合理分配工作,如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作,并在其完成时,给予及时的肯定和赞扬;让依附欲较强的职工,更多地参加到某个团体*同工作;让权力欲较强的职工,担任一个与之能力相适应的主管。同时要加强员工对企业目标的认同感,让员工感觉到自己所做的工作是值得的,这样才能激发职工的热情。
9、蘑菇管理
蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。相信很多人都有过这样一段蘑菇的经历,这不一定是什么坏事,尤其是当一切刚刚开始的时候,当几天蘑菇,能够消除我们很多不切实际的幻想,让我们更加接近现实,看问题也更加实际。一个组织,一般对新进的人员都是一视同仁,从起薪到工作都不会有大的差别。无论你是多么优秀的人才,在刚开始的时候,都只能从最简单的事情做起,蘑菇的经历,对于成长中的年轻人来说,就象蚕茧,是羽化前必须经历的一步。所以,如何高效率地走过生命的这一段,从中尽可能汲取经验,成熟起来,并树立良好的值得信赖的个人形象,是每个刚入社会的年轻人必须面对的课题。
10、奥卡姆剃刀定律
12世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地剃除。他主张如无必要,勿增实体。这就是常说的奥卡姆剃刀。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反,经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。
Eclipse及其插件下载网址大全
1 Eclipse下载
EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载
http://www.eclipse.org/downloads/index.php
2 lomboz J2EE插件,开发JSP,EJB
http://forge.objectweb.org/projects/lomboz
3 MyEclipse J2EE开发插件,支持SERVLET/JSP/EJB/数据库操纵等
http://www.myeclipseide.com
4 Properties Editor 编辑java的属性文件,并可以自动存盘为Unicode格式
http://propedit.sourceforge.jp/index_en.html
5 Colorer Take 为上百种类型的文件按语法着色
http://colorer.sourceforge.net/
6 XMLBuddy 编辑xml文件
http://www.xmlbuddy.com
7 Code Folding 加入多种代码折叠功能(比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport
8 Easy Explorer 从eclipse中访问选定文件、目录所在的文件夹
http://easystruts.sourceforge.net/
9 Fat Jar 打包插件,可以方便的完成各种打包任务,可以包含外部的包等
http://fjep.sourceforge.net/
10 RegEx Test 测试正则表达式
http://brosinski.com/stephan/archives/000028.php
11 JasperAssistant 报表插件(要钱的哦~)
http://www.jasperassistant.com/
12 Jigloo GUI Builder JAVA的GUI编辑插件
http://cloudgarden.com/jigloo/
13 Profiler 性能跟踪、测量工具,能跟踪、测量B/S程序
http://sourceforge.net/projects/eclipsecolorer/
14 AdvanQas 提供对if/else等条件语句的提示和快捷帮助(自动更改结构等)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
15 Log4E Log4j插件,提供各种和Log4j相关的任务,如为方法、类添加一个logger等
http://log4e.jayefem.de/index.php/Main_Page
16 VSSPlugin VSS插件
http://sourceforge.net/projects/vssplugin
17 Implementors 提供跳转到一个方法的实现类,而不是接口的功能(实用!)
http://eclipse-tools.sourceforge.net/implementors/
18 Call Hierarchy 显示一个方法的调用层次(被哪些方法调,调了哪些方法)
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
19 EclipseTidy 检查和格式化HTML/XML文件
http://eclipsetidy.sourceforge.net/
20 Checkclipse 检查代码的风格、写法是否符合规范
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
21 Hibernate Synchronizer Hibernate插件,自动映射等
http://www.binamics.com/hibernatesync/
22 VeloEclipse Velocity插件
http://propsorter.sourceforge.net/
23 EditorList 方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
24 MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/
25 swt-designer java的GUI插件
http://www.swt-designer.com/
26 TomcatPlugin 支持Tomcat插件
http://www.sysdeo.com/eclipse/tomcatPlugin.html
27 XML Viewer
http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html
28 quantum 数据库插件
http://quantum.sourceforge.net/
29 Dbedit 数据库插件
http://sourceforge.net/projects/dbedit
30 clay.core 可视化的数据库插件
http://www.azzurri.jp/en/software/index.jsp
http://www.azzurri.jp/eclipse/plugins
31 hiberclipse hibernate插件
http://hiberclipse.sourceforge.net
http://www.binamics.com/hibernatesync
32 struts-console Struts插件
http://www.jamesholmes.com/struts/console/
33 easystruts Struts插件
http://easystruts.sourceforge.net
34 veloedit Velocity插件
http://veloedit.sourceforge.net/
35 jalopy 代码整理插件
http://jalopy.sourceforge.net/
36 JDepend 包关系分析
http://andrei.gmxhome.de/jdepend4eclipse/links.html
37 Spring IDE Spring插件
http://springide-eclip.sourceforge.net/updatesite/
38 doclipse 可以产生xdoclet 的代码提示
http://beust.com/doclipse/
39 SQLExplorer,在Eclipse 中连接各种数据库进行操作使用
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124
40 Eclipse 插件Implementors 在Eclipse 中的使用。
问题提出:
如果你想看看某个类或者方法的实现,一般是Ctrl + 鼠标左键,单击即可以打开这个类或者方法的具体实现代码。但是如果碰到接口时,只是到达接口而已,不能到达具体的实现类里。
解决方法:利用Eclipse 的Implementors 插件。
当追踪方法代码时,Eclipse 默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。
另外还有Call Hierarchy 插件: 显示一个方法的调用层次,可以从中看到它被哪些方法调用了,以及它调用了哪些方法,是代码追踪比较实用的工具。Eclipse 3.1 中已经自带有这个功能了。这个插件就不用另加介绍了。
下载地址:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=30441
或者
http://www.cjsdn.net/post/view?bid=7&id=165547&sty=1
Eclipse插件之SQLExplorer- -
本文介绍如何利用Eclipse 插件SQLExplorer 在Eclipse 中连接各种数据库进行操作使用。
Eclipse 是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
下载地址:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124
或者
http://www.cjsdn.net/post/view?bid=7&id=164702&sty=1
用links方法加载Eclipse插件
eclispe想必大家都很熟悉了,一般来说,eclipse插件都是安装在plugins目录下。不过这样一来,当安装了许多插件之后,eclipse变的很大,最主要的是不便于更新和管理众多插件。用links方式安装eclipse插件,可以解决这个问题。
当前配置XP SP1,eclipse3.0.1
现在假设我的eclipse安装目录是D:\eclipse,待安装插件目录是D:\plug-in ,我将要安装LanguagePackFeature(语言包)、emf-sdo-xsd-SDK、GEF-SDK、Lomboz这四个插件。
先把这四个插件程序全部放在D:\plug-in目录里,分别解压。如Lomboz3.0.1.zip解压成Lomboz3.0.1目录,这个目录包含一个plugins目录,要先在Lomboz3.0.1目录中新建一个子目录eclipse,然后把plugins目录移动到刚建立的eclipse目录中,即目录结构要是这样的:D:\plug-in\Lomboz3.0.1\eclipse\plugins
Eclipse 将会到指定的目录下去查找 eclipse\features 目录和eclipse\plugins 目录,看是否有合法的功能部件和(或)插件。也就是说,目标目录必须包含一个 \eclipse 目录。如果找到,附加的功能部件和插件在运行期配置是将是可用的,如果链接文件是在工作区创建之后添加的,附加的功能部件和插件会作为新的配置变更来处理。
其它压缩文件解压后若已经包含eclipse\plugins目录,则不需要建立eclipse目录。
然后在 eclipse安装目录D:\eclipse目录中建立一个子目录links,在links目录中建立一个link文件,比如 LanguagePackFeature.link,改文件内容为 path=D:/plug-in/LanguagePackFeature 即这个link文件要对应一个刚解压后的插件目录。
说明:
1. 插件可以分别安装在多个自定义的目录中
2. 一个自定义目录可以安装多个插件。
3. link文件的文件名及扩展名可以取任意名称,比如ddd.txt,myplugin都可以。
4. link文件中path=插件目录的path路径分隔要用\\或是/
5. 在links目录也可以有多个link文件,每个link文件中的path参数都将生效。
6. 插件目录可以使用相对路径。
7. 可以在links目录中建立一个子目录,转移暂时不用的插件到此子目录中,加快eclipse启动。
8. 如果安装后看不到插件,把eclipse 目录下的configuration目录删除,重启即可。
jadclips插件网站:http://jadclipse.sourceforge.net/
一、下载:
下载插件:
下载
jadclipse_3.1.0.jar
版本,该版本支持eclipse3.1M6以上
下载
jadclipse_3.2.0.jar
版本,该版本支持eclipse3.2M3和eclipse3.2M4。
下载
jadclipse_3.2.2.jar
版本,该版本支持eclipse3.2M5以上。
下载
Jad
反编译工具:
http://www.kpdus.com/jad.html#download,在该页中找到适合自己操作系统平台的jad下载。下载后解压,然后将解压后的jad.exe文件复制到%JAVA_HOME%\BIN目录下面(可以将jad.exe随便放到哪,只要记住路径就好,下面要用到)。
二、安装:
方法1、直接将jadclipse_3.1.0.jar复制到%ECLIPSE_HOME%\
plugins目录下。
方法2、使用link方式安装,建立E:\eclipse3.1plugins\jadclipse3.1.0\eclipse\plugins的目录结构,将jadclipse_3.1.0.jar放到plugins目录下面(注:其中E:\eclipse3.1plugins为你自己定义的一个专门放置插件的目录)。再在%ECLIPSE_HOME%\links目录下面建立一个jadclipse3.1.0.link文件(该文件名随便取,保证后缀为.link就OK).文件里面内容为:path=E:\\eclipse3.1plugins\\jadclipse3.1.0。
启动eclipse,打开Window->Preferences->Java->JadClipse,如果没有找到JadClipse,检查插件安装的版本是否与你安装的eclipse版本对应。我安装的eclipse是:eclipse3.1.2
三、设置参数:
启动eclipse,打开:Window->Preferences->Java->JadClipse。
1、Path to decompiler,这里设置反编译工具jad的全路径名,比如:%JAVA_HOME%\bin\jad.exe。
2、Directory for temporary files,这里设置临时文件路径。
至于Window->Preferences->Java->JadClipse目录下的Debug,Directives,Formatting,Misc目录中的参数设置,就不罗嗦。
四、
安装完成后,eclipse自动将JadClipse Class File Viewer设置成class文件的缺省打开方式。如果没有默认,可以在Eclipse的Windows--> Perference-->General->Editors->File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer”。设置完成后,双击*.class文件,eclipse将自动反编译。
注: 对于存在源代码的类,它不会强行反编译,也就是说它还是会用eclipse自带的Class File Viewer查看class文件
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=
[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
# 应用于文件回滚
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log
log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖
log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=
[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=test@sina.com.cn
log4j.appender.MAIL.SMTPHost=smtp.sina.com.cn
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=test@sina.com.cn
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于数据库
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = test@test.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
工具->选项->高级选项->IDE配置->系统->自动更新类型
在上面单击右键,选择“新建”->一般更新中心
输入一个名字,比如“javascriptAndCss”(这个自己随便写),然后确定。你会发现在自动更新类型下面多出了我们刚建立的项目,单击它,在右面的设置里面将
服务器url
里填入
http://www.liguorien.org/download/jseditor/updates.xml
关闭
工具->选项->更新中心->选中 javascriptAndCss ->下一步
过一会儿就会出现javascript和css插件,选择添加,然后下一步,接下来重启netBeans就可以使用了
企业计算(Enterprise Computing)是稍时髦较好听的名词,主要是指企业信息系统如:ERP 软件(企业资源规划)、CRM 软件(客户关系管理)、SCM 软件(供应链管理,即物流软件),银行证券软件财务软件电子商务/政务(包括各种网站),数据仓库,数据挖掘,商务智能等企业信息管理系统。
企业计算领域对人才的需求显然永远是数量最大的因为这是计算机应用最多的领域。搞这方面的好处是:
(1)人才需求量极大从事企业计算的公司在IT企业中占了大多数。除非在专业上一无特长一般在这一领域总能找到工作。
(2)这方面的入门门槛相对较低(如果你的软件功底不是很深可考虑这一领域)
(3)这方面的大公司较多大公司要赚大钱所以多将精力花在企业计算业务上.如与正规高校软件学院同学目前实习的CitiCorp、HP、IBM、SAP、NEC等公司都属这一领域的公司。如果将来想到大公司找一份相对稳定的工作,从事这方面机会要大很多。
但从事这一领域的缺点也是明显的:
由于这方面的入门门槛相对较低,虽然这方面的人才需求量是最大的,但将来竞争对手会较多。您会发现,即使他原不是学IT专业的人,也许他突击几个月后,做得照样像模像样。特别是当您年纪渐大后,您可能会发现,后面的年轻人可能很容易追上你的水平。如果您将来到国外去工作,你可能会发现从事这领域的人更多且高手如云。当然,若您在这一领域经过多年企业经验,达到较高境界(如能设计软件架构),则身价永远是高的。国内在这方面人才领域的主要问题是,有经验的高手太少,皮毛了解的人太多。
从事企业计算领域,最重要的技能型技术课程是
(1) J2EE架构与程序设计
(2) 大型数据库系统(如Oracle)
(3) 基于UML的系统分析与设计。
如果说还有什么重要的技能,还可将XML与Web Service技术包含进来,若您在这几个领域掌握较好,则不愁找不到工作。其中尤其以J2EE最为重要,目前J2EE已成为企业计算软件开发的最主要平台,也是正规高校软件学院的最重要课程之一。
尽管该课程只能作为选修课,我们希望正规高校软件学院同学无论将来想从事何种方向,都应学一下J2EE课程,至少可为将来找工作备一手关键功夫。包括想从事嵌入式或其它领域的同学,也是很有必要学一下J2EE的,毕竟J2EE是目前最重要的平台之一,即使您将来不想从事企业计算领域,了解一下J2EE也是必要的,就像一门常识课程一样。
其它与企业计算关系较密切的技能还包括: Dot Net架构与程序设计、软件测试技术、软件配置管理,该领域较高层次的技能包括数据仓库技术、构件与中间件技术、设计模式等。像通信协议分析与网络程序设计,Unix系统管理等也属有些关系的课程。02级本学期开设的企业计算课程不多,主要是J2EE、Oracle/MSSQL、UML等企业计算领域的最关键技能型技术课程都已学完了。
您应在空余时间将J2EE,DB、UML等技术再深入地钻研下去,一定要在某个领域有深入的掌握。只是跟着听课,即使学了再多课程也是没用处的,自己钻研下去才是最重要的。只一个J2EE便是博大精深的,足够你啃下去的,钻研下去,您会发现你还要学的相关知识还有很多(包括EJB、XML、Web Service、Design Pattern等)。
虽然从事企业计算的人才很多,但以下企业计算领域无论国内外都属稀缺人才:
(1) 掌握大型ERP系统,主要是SAP系统,包括SAP Basis(系统管理)或SAP ABAP(编程)或SAP功能模块实施(特别是财务模块FI的实施)。SAP顾问身价是最高的,而且非常难找。其它大型ERP系统,掌握PeopleSoft、Oracle Finacial、J.D.Edward、Siebel等大型ERP软件系统的人也很值钱。这方面的人之所以身价奇高,主要是因为这些软件很专业,特别大,很难有D版可学习,只有特大企业(如世界500强,90以上使用SAP)才用得起,而且必须有实际工作经验才能掌握。如果是一个个人人都很容易有机会接触的软件,那么这方面的人通常就不会稀缺。如果大家将来有机会接触学习这些大型ERP软件系统的机会,建议毫不犹豫地抓住,那将捧上一辈的金饭碗。
在国外,会SAP的人特别值钱。物以稀为贵,这永远是颠扑不破的真理。SAP的价值不仅是因为他是一个ERP软件, 而是其中体现的现代企业管理理念(如根据订货需求自动安排原料采购和生产计划等)。一般500强公司绝不会像国内很多企业那样,用J2EE从头设计企业的ERP系统(即将是怎样的人力投入,而且设计出来的系统怎么可能是完善的),一定都会使用SAP这样成熟的ERP软件。用不起SAP的公司可能会用J2EE设计ERP系统。
(2) 掌握IBM大型机技术的人,如S/390主机,MVS操作系统,JCL作业控制语言,COBOL程序设计语言,DB2关系数据库或IMS层次数据库,CISC中间件交易控制系统等IBM大型机专用技术。国内五大银行,以及国外绝大多数银行的后台系统使用的都是以上平台。IBM大型机号称永不宕机而且平台相对封闭(这样最安全),所以这些要求在24*7环境中连续运行的关键应用(术语叫mission critical applications)都采用IBM大型机。
这方面的人才之所以稀缺,是因为会大型机的人都是老人(90年代以前搞IT的人),全世界新毕业的IT毕业生不可能再去学IBM大型机(这是一种相对“古老“的技术)没有新人补上而银行的系统必须维持下去而且银行还要不断开发新业务(如新的存款品种)虽然对IBM大型机人才的绝对需求量不很大但相对恒定银行到哪里找这方面的新人很难找到. 若好找花旗软件也不会花那么大的代价去培训我们的实习同学了(去年培训20多个人听说公司就花了数十万元培训费). 如果您将来到国外找工作会IBM大型机可能是最好找工作的领域之一了而且保证找的都是大银行等好工作我以前教过的计算机专业90-94级的一些同学凡是毕业后从事大型机开发的现多在国外一些很好的公司工作(有几位同学在各国各公司跳来跳去简直如履平地).
其实我觉得我们最幸福的同学就是在花旗软件做IBM大型机银行软件的同学这样的机会太难得了.正规高校软件学院00级22班一位同学当初放弃保研看准在花旗软件做大型机并且非常努力还未毕业公司便派她到国外参加一个项目的开发成了项目骨干我觉得她当初选择是完全正确的,01级一位女同学刚刚也自愿放弃了保研机会去花旗做大型机,我们祝愿她将来也能有好的前景。其实像花旗软件主动安排并鼓励员工读在职研究生,这样开明的公司目前并不多的,在职读研也是一种不错的选择,又不会失去自己喜欢的实习工作机会,能兼顾)读书的最终目地还是为了工作. 如果您将来在国外找工作根本没人管您是什么文凭国外企业绝不会花冤枉钱只会招有领域工作经验能立即上手的人用最少的钱在限定的时间完成项目. 而在国内因为人力成本较低公司招聘一很多高学历的人才尽管可能根本用不到这么高的学历但国内的人力太便宜了为什么不高消费一下人才呢这样公司的门面还要好看些。
(3) 其它如掌握数据仓库技术的人在国内也很少. 目前最主流的数据仓库平台应是ORACLE的数据仓库工具. 在国外会一些特殊数据仓库的人如NCR/TEREDATA的人非常难找.
年轻人充满热情喜欢追逐一些热门技术,这当然正确的毕竟学习SAP和大型机的机会毕竟不多毕业时先能找到一份工作是重要的. 但我相信随着年纪的增长大家将来慢慢都会思考的掌握一项竞争对手较少的绝技的重要性将来如果自己到国外工作什么技术最好找工作(对搞软件的人到国外工作或移民是最容易的也许您现在不想但我相信工作多年以后很大一部分同学可能想到国外闯荡一下)你要考虑你今后一生的出路什么样的绝技是最稳定最轻松最高收入的. 搞软件的人当年纪大些时您可能更向住像搞医学人的那样能更多靠经验吃饭而不须整天像年轻人那样不得不去追逐不断出现的软件新技术这个时候也许您也许会发现如果您在SAP或大型机等方面有些绝技您会有很大优势因为这些较偏的领域其技术变化是相对很缓慢的.
我还记得在2002年时我曾在业余时间与一位德国人合作面试一些IT人才到德国去那时德方各公司发来的需求有很多是SAP和IBM大型机的我们在众多应聘者中最后也未找到一个在这方面有经验甚至是有一点经验的. 相反掌握流行技术的人因太多而不很值钱.
找工作时不仅要盯着国内市场还要有一种放眼全球的眼光,对搞软件的人您将来完全可能到其它国家去工作. 尤其是在欧美、日本、新加坡等国家,对SAP(包括IBM大型机)人才的需求是很大的。毕竟比同学见得多些提醒同学将来多留意有学习这些绝技的机会一旦有机会建议当仁不让. 国内的人才市场可访问www.51job.com,国外的IT人才需求可访问www.hotjobs.com、www.workopolis.com、www.monster.com等著名网站。应经常访问这些网站,以了解市场对人才的具体需求,早做准备。 www.uiok.net
以上对企业计算领域的观点供大家参考.虽然观点未必正确但确是直言不讳. 总之每个人的脑袋都长在自己脖子上每个人都应有自己的判断.
还要注意我以上纯粹是从将来就业的角度谈问题. 如果您将来准备到国外读书则应重视基础课像CAssemblyOOPDiscrete MathData StructureOpeating SystemDatabase PrincipleNetworkSoftware EngineeringCompilerDigital CircuitComputer GraphicsComputer Component and Architecture等基础课在国外大学IT专业中一般都能找到相同课程若国内学过到国外读书时一般可申请免修一部分. 但我也想提醒同学如果您将来毕业时万一申请国外大学不成不得不去找工作时,若只将精力花在这些IT专业学生都会的基础课上(传统IT教育模式) 未掌握一些像J2EE等技能型技术是不容易找到一份工作的我们已有同学有这样的教训。从找工作的角度讲,企业关心的不是您学过什么课程,而是关心您能做什么,有什么技能,能做什么项目。
二、关于嵌入式系统方向
嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等。特别是随着消费家电的智能化,嵌入式更显重要。像我们平常常见到的手机、PDA、电子字典、可视电话、VCD/DVD/MP3 Player、数字相机(DC)、数字摄像机(DV)、U-Disk、机顶盒(Set Top Box)、高清电视(HDTV)、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电刂葡低场⒁搅埔瞧鳌⒑教旌娇丈璞傅鹊榷际堑湫偷那度胧较低场?
嵌入式系统是软硬结合的东西,搞嵌入式开发的人有两类。
一类是学电子工程、通信工程等偏硬件专业出身的人,他们主要是搞硬件设计,有时要开发一些与硬件关系最密切的最底层软件,如BootLoader、Board Support Package(像PC的BIOS一样,往下驱动硬件,往上支持操作系统),最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂软件系统往往力不从心(例如嵌入式操作系统原理和复杂应用软件等)。
另一类是学软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。如果我们学软件的人对硬件原理和接口有较好的掌握,我们完全也可写BSP和硬件驱动程序。嵌入式硬件设计完后,各种功能就全靠软件来实现了,嵌入式设备的增值很大程度上取决于嵌入式软件,这占了嵌入式系统的最主要工作(目前有很多公司将硬件设计包给了专门的硬件公司,稍复杂的硬件都交给台湾或国外公司设计,国内的硬件设计力量很弱,很多嵌入式公司自己只负责开发软件,因为公司都知道,嵌入式产品的差异很大程度在软件上,在软件方面是最有“花头“可做的),所以我们搞软件的人完全不用担心我们在嵌入式市场上的用武之地,越是智能设备越是复杂系统,软件越起关键作用,而且这是目前的趋势。
从事嵌入式软件开发的好处是:
(1) 目前国内外这方面的人都很稀缺。一方面,是因为这一领域入门门槛较高,不仅要懂较底层软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须懂得硬件的工作原理,所以非专业IT人员很难切入这一领域另一方面,是因为这一领域较新,目前发展太快,很多软硬件技术出现时间不长或正在出现(如ARM处理器、嵌入式操作系统、MPEG技术、无线通信协议等),掌握这些新技术的人当然很找。嵌入式人才稀缺,身价自然就高,越有经验价格就越高。其实嵌入式人才稀少根本原因可能是大多数人无条件接触这需要相应的嵌入式开发板和软件另外需要有经验的人进行指导开发流程。
(2) 与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。搞企业应用软件的IT企业,这个用户的系统搞完了,又得去搞下一个用户的,而且每个用户的需求和完成时间都得按客户要求改变,往往疲于奔命,重复劳动。相比而言,搞嵌入式系统的公司,都有自己的产品计划,按自己的节奏行事。所开发的产品通常是通用的,不会因客户的不同而修改。一个产品型号开发完了,往往有较长一段空闲时间(或只是对软件进行一些小修补),有时间进行充电和休整。另外,从事嵌入式软件的每个人工作范围相对狭窄,所涉及的专业技术范围就是那些(ARM、RTOS、MPEG、802.11等),时间长了这些东西会越搞越有经验,卖卖老本,几句指导也够让那些初入道者琢磨半年的。若搞应用软件,可能下一个客户要换成一个完全不同的软件开发平台,那就苦了。
(3) 哪天若想创业,搞自已的产品,那么嵌入式是一个不错的主意,这可不像应用软件那样容易被盗版。土木学院有一个叫启明星的公司开发出一个好象叫“工程e”的掌上PDA,施工技术人员用该PDA可当场进行土木概预算和其它土木计算,据说销路特好。我认识的某大学老师,他开发的饭馆用的点菜PDA(WinCE平台,可无线连网和上网),据他说销路不错,饭馆点点PDA让客户点菜,多显派头档次。当年有一组同学在学Windows程序设计课程时用VC设计了一个功能很强的点菜系统做为课程项目,当时真想建议他们将这个软件做成PDA,估计会有些销路(上海火车站南广场的Macdonald便使用很漂亮的PDA给用户点食品,像摸像样的)。这些PDA的硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
从事嵌入式软件开发的缺点是:
(1) 入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
(2) 这方面的企业数量要远少于企业计算类企业。特别是从事嵌入式的小企业数量较多(小企业要搞自己的产品创业),知名大公司较少(搞嵌入式的大公司主要有Intel、Motorola、TI、Philip、Samsung、Sony、Futjtum、Bell-Alcatel、意法半导体、Microtek、研华、华为、中兴通信、上广电等制造类企业)。这些企业的习惯思维方式是到电子、通信等偏硬专业找人。由于正规高校软件学院以前毕业生以企业计算为主,所以正规高校软件学院与这些企业联系相对较少。正规高校软件学院正积极努力,目前已与其中部分公司建立了联系,争取今后能有正规高校软件学院同学到这些企业中实习或就业。
(3) 有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
正规高校软件学院同学若学习嵌入式,显然应偏重于嵌入式软件,特别是嵌入式操作系统方面,应是我们的强项。对于搞嵌入式软件的人,最重要的技术显然是(实际上很多公司的招聘广告上就是这样写的):
(1) 掌握主流嵌入式微处理器的结构与原理
(2) 必须掌握一个嵌入式操作系统
(3) 必须熟悉嵌入式软件开发流程并至少做过一个嵌入式软件项目。
正规高校软件学院在嵌入式软件方面最重要的课程包括:
(1) 嵌入式微处理器结构与应用:这是一门嵌入式硬件基础课程,正规高校软件学院用这门课取代了传统的“微机原理与接口”课程(目前国内已有少部分高校IT专业这样做了,因为讲x86微机原理与接口很难找到实际用处,只为教学而已)。我们说过,嵌入式是软硬件结合的技术,搞嵌入式软件的人应对ARM处理器工作原理和接口技术有充分了解,包括ARM的汇编指令系统。
若不了解处理器原理,怎么能控制硬件工作,怎么能写出节省内存又运行高速的最优代码(嵌入式软件设计特别讲究时空效率),怎么能写出驱动程序(驱动程序都是与硬件打交道的)很多公司招聘嵌入式软件人员时都要求熟悉ARM处理器,将来若同学到公司中从事嵌入式软件开发,公司都会给你一本该设备的硬件规格说明书 (xxx Specification),您必须能看懂其中的内存分布和端口使用等最基本的说明(就像x86汇编一样),否则怎么设计软件。有些同学觉得嵌入式处理器课程较枯燥,这主要是硬件课程都较抽象的原因,等我们的嵌入式实验室10月份建好后,您做了一些实验后就会觉得看得见摸得着。还有同学对ARM汇编不感兴趣,以为嵌入式开发用C语言就足够了。其实不应仅是将汇编语言当成一个程序设计语言,学汇编主要是为了掌握处理器工作原理的。一个不熟悉汇编语言的人,怎么能在该处理器写出最优的C语言代码。
在嵌入式开发的一些关键部分,有时还必须写汇编,如Bootloader等(可能还包括BSP)。特别是在对速度有极高要求的场合(如DSP处理器的高速图像采集和图像解压缩),目前主要还要靠汇编写程序(我看到过很多公司是这样做的)。当您在一个嵌入式公司工作时,在查看描述原理的手册时,可能很多都是用汇编描述的(我就遇到过),这是因为很多硬件设计人员只会写或者喜欢用汇编描述,此时您就必须看懂汇编程序,否则软硬件人员可能就无法交流。很多嵌入式职位招聘时都要求熟悉汇编。
(2) 嵌入式操作系统类课程
除了WinCE的实时性稍差外,大多数嵌入式操作系统的实时性都很强所以也可称为实时操作系统Real Time Operating System.从事嵌入式的人至少须掌握一个嵌入式操作系统(当然掌握两个更好)这在嵌入式的所有技术中是最为关键的了。目前最重要的RTOS主要包括:
第一类、传统的经典RTOS:最主要的便是 Vxworks 操作系统,以及其Tornado开发平台。Vxworks因出现稍早,实时性很强(据说可在1ms内响应外部事件请求),并且内核可极微(据说最小可8K),可靠性较高等,所以在北美,Vxworks占据了嵌入式系统的多半疆山。特别是在通信设备等实时性要求较高的系统中,几乎非Vxworks莫属。Vxworks的很多概念和技术都和Linux很类似,主要是C语言开发。像Bell-alcatel、Lucent、华为等通信企业在开发产品时,Vxworks用得很多。但Vxworks因价格很高,所以一些小公司或小产品中往往用不起。目前很多公司都在往嵌入式Linux转(听说华为目前正在这样转)。但无论如何,Vxworks在一段长时间内仍是不可动摇的。与Vxworks类似的稍有名的实时操作系统还有pSOS、QNX、Nucleus等RTOS。
第二类、嵌入式 Linux 操作系统:Linux的前途除作为服务器操作系统外,最成功的便是在嵌入式领域的应用,原因当然是免费、开源、支持软件多、呼拥者众,这样嵌入式产品成本会低。Linux本身不是一个为嵌入式设计的操作系统,不是微内核的,并且实时性不强。目前应用在嵌入式领域的Linux系统主要有两类:一类是专为嵌入式设计的已被裁减过的Linux系统,最常用的是uClinux(不带MMU功能),目前占较大应用份额,可在ARM7上跑另一类是跑在ARM 9上的,一般是将Linux 2.4.18内核移植在其上,可使用更多的Linux功能(当然uClinux更可跑在ARM 9上)。
很多人预测,嵌入式Linux预计将占嵌入式操作系统的50以上份额,非常重要。缺点是熟悉Linux的人太少,开发难度稍大。另外,目前我们能发现很多教材和很多大学都以ucOS/II为教学用实时操作系统,这主要是由于ucOS/II较简单,且开源,非常适合入门者学习实时操作系统原理,但由于ucOS/II功能有限,实用用得较少,所以正规高校软件学院不将其作为教学重点,要学习就应学直接实用的,比如 uClinux就很实用。况且熟悉了Linux开发,不仅在嵌入式领域有用,对开发Linux应用软件,对加深操作系统的认识也有帮助,可谓一举多得。据我所知,目前Intel、Philip都在大搞ARMLINUX的嵌入式开发,Fujitum则是在自己的处理器上大搞Linux开发。目前在嵌入式Linux领域,以下几个方面的人特别难找,一是能将Linux移植到某个新型号的开发版上二是能写Linux驱动程序的人三是熟悉Linux内核裁减和优化的人。正规高校软件学院在该嵌入式Linux方面的课程系列是:本科生操作系统必修课,然后是Linux程序设计选修课,最后是嵌入式Linux系统选修课。正规高校软件学院在Linux方面目前已有较强力量,魏老师和张老师熟悉Linux开发,金老师和唐老师熟悉Linux系统管理。
第三类、 Windows CE 嵌入式操作系统:Microsoft也看准了嵌入式的巨大市场,MS永远是最厉害的,WinCE出来只有几年时间,但目前已占据了很大市场份额,特别是在PDA、手机、显示仪表等界面要求较高或者要求快速开发的场合,WinCE目前已很流行(据说有一家卖工控机的公司板子卖得太好,以至来不及为客户裁减WinCE)。WinCE目前主要为4.2版(.NET),开发平台主要为WinCE Platform Builder,有时也用EVC环境开发一些较上层的应用,由于WinCE开发都是大家熟悉的VC环境,所以正规高校软件学院学过Windows程序设计课程的同学都不会有多大难度,这也是WinCE容易被人们接受的原因,开发环境方便快速,微软的强大技术支持,WinCE开发难度远低于嵌入式Linux。
对于急于完成,不想拿嵌入式Linux冒险的开发场合,WinCE是最合适了(找嵌入式Linux的人可没那么好找的),毕竟公司不能像学生学习那样试试看,保证开发成功更重要。根据不同的侧重点 ,WinCE还有两个特殊版本,一个是MS PocketPC操作系统专用于PDA上(掌上电脑),另一个是MS SmartPhone操作系统用于智能手机上(带PDA功能的手机),两者也都属于WinCE平台。
在PDA和手机市场上,除WinCE外,著名的PDA嵌入式操作系统还有Palm OS(因出现很早,很有名)、Symbian 等,但在WinCE的强劲冲击下,Palm和Symbian来日还能有多长正规高校软件学院可能是全国高校中唯一一家开设专门的“Windows CE嵌入式操作系统“课程的学校,这主要是基于以下原因:正规高校软件学院本身前面便有Windows程序设计课程,同学学过VC后再学WinCE非常方便自然,通过学习WinCE同样也可了解嵌入式软件的一般开发过程,对Linux有惧怕心理的同学也很合适。
很显然,嵌入式Linux永远不可能替代WinCE,而且将来谁占份额大还很难讲,毕竟很多人更愿意接受MS的平台,就像各国政府都在大力推LINUX已好长时间,但您能看到几个在PC机上真正使用LINUX的用户据我观察目前在嵌入式平台上LINUX是叫得最响但还是WinCE实际用得更多.嵌入式LINUX可能更多地是一些有长远产品计划的公司为降低成本而进行长远考虑 二是微软亚洲研究院对正规高校软件学院WinCE课程的支持计划,我们也很希望将来正规高校软件学院能有同学通过微软的面试去实习。WinCE和多媒体(如MPEG技术)是微软亚洲工程院目前做得较多的项目领域之一他们很需要精通WinCE的人。
总结关于嵌入式操作系统类课程,若您觉得自己功底较深且能钻研下去,则可去学嵌入式Linux若您觉得自己VC功底较好且想短平快地学嵌入式开发,则正规高校软件学院的WinCE课程是最好的选择。
(3) 嵌入式开发的其它相关软件课程
搞嵌入式若能熟悉嵌入式应用的一些主要领域,这样的人更受企业欢迎。主要的相关领域包括:
A、数字图像压缩技术:这是嵌入式最重要最热门的应用领域之一,主要是应掌握MPEG编解码算法和技术,如DVD、MP3、PDA、高精电视、机顶盒等都涉及MPEG高速解码问题。为此,正规高校软件学院已预订了一位能开设数字图像处理课程的博士。
B、通信协议及编程技术:这包括传统的TCP/IP协议和热门的无线通信协议。首先,大多数嵌入式设备都要连入局域网或Internet,所以首先应掌握TCP/IP协议及其编程,这是需首要掌握的基本技术其次,无线通信是目前的大趋势,所以掌握无线通信协议及编程也是是很重要的。无结通信协议包括无线局域网通信协议802.11系列,Bluetooth,以及移动通信(如GPRS、GSM、CDMA等)。
C、网络与信息安全技术:如加密技术,数字证书CA等。正规高校软件学院有这方面的选修课。
D、DSP技术:DSP是Digital Signal Process数字信号处理的意思,DSP处理器通过硬件实现数字信号处理算法,如高速数据采集、压缩、解压缩、通信等。数字信号处理是电子、通信等硬件专业的课程,对于搞软件的人若能了解一下最好。目前DSP人才较缺。如果有信号与系统、数字信号处理等课程基础,对于学习MPEG编解码原理会有很大帮助。
(4) 嵌入式开发的相关硬件基础
对于软件工程专业的学生,从事嵌入式软件开发,像数字电路、计算机组成原理、嵌入式微处理器结构等硬件课程是较重要的。另外,汇编语言、C/C、数据结构和算法、特别是操作系统等软件基础课也是十分重要的。我们的主要目地是能看懂硬件工作原理,但重点应是在嵌入式软件,特别操作系统级软件,那将是我们的优势。
我们的研究生里有些是学电子、通信类专业过来的,有较好的模拟电路和单片机基础,学嵌入式非常合适。嵌入式本身就是从单片机发展过来的,只是单片机不带OS,而现在很多嵌入式应用越来越复杂,以至不得不引入嵌入式操作系统。另外,为追求更高速的信号处理速度,现在在一些速度要求较高的场合,有不少公司是将一些DSP算法,如MPEG压缩解压缩算法等用硬件来实现,这就涉及到HDL数字电路设计技术及其FPGA/IP核实现技术,这方面的人目前市场上也很缺。
(5) 题外话
另外,能写驱动程序的人目前是非常紧缺的(驱动程序也可归于嵌入式范畴),包括桌面Windows中的DDK开发环境和WDM驱动程序。公司每时每刻都要推出新产品,每一个新产品出来了,要能被操作系统所使用,是必须写驱动程序的。写驱动程序就必须掌握操作系统(如Windows或Linux)的内部工作原理,还涉及到少量硬件知识,难度较大,所以这方面的人很难找。想成为高手的同学,也可从驱动程序方面获得突破。
我可说一下自己的经历,三年前我曾短暂地在一家公司写过WinCE驱动程序(正是因为知道这方面的人紧缺,所以才要做这方面的事),尽管那以前从未做过驱动程序,应聘那个职位时正是看准了公司是很难招聘到这方面的人,既然都找不到人,驱动还得有人做,这正是可能有机会切入这一领域的大好机会。面试时大讲自己写过多少万行汇编程序,对计算机工作原理如何清楚,简历中又写着我曾阅读完两本关于Windows Driver Model的两本英文原版书,写过几个小型的驱动程序练习程序(其实根本没写过,我们的同学将来千万不要像我这样,早练就些过硬功夫,就不至于沦落到我这等地步,就不用像我那样去“欺骗”公司了,我这是一个典型的反面教材),居然一切都PASS(当然最重要的是笔试和面试问题还说得过去),这只能说明这一领域找人的困难程度。公司本就未指望找到搞过驱动的人,找个有相关基础的人就算不错了。做了以后,发现也并不是怎样难的。其实搞驱动程序的工作是很舒服的,搞完一个版本就会空一段时间,只有等公司新的芯片推出或新的OS出现后,才需要再去开发新一版驱动,那时有将近一个月时间空闲着在等WinCE .NET Beta版推出,准备将驱动程序升级到CE .NET上,现在在软件学院工作整日忙,无限怀念那段悠闲时光。
很巧合,最近本人无意中再次体会到了嵌入式的迷人之处。上周我那用了3年的手机终于不能WORK了。此次更新,除要求有手机常见功能外,最好有MP3功能(现在很多英语听力都有MP3文件),最好有英汉词典,最好还能读WORD文档。最后选了个满足以上条件的最便宜的手机DOPOD 515(斩了我2.2K,但想想这也算自己对嵌入式事业的支持,这样便也想开了),算得上最低档的智能手机了。回来一查,手机的about显示,本手机Processor是ARM,其OS是MS Smartphone(即WinCE .NET 4.2),这么巧合,简直可做为学习嵌入式课程的产品案例了(等我们的WinCE课程开得有声有色后,希望能从微软研究院搞些Smartphone来开发开发)。有OS的手机果然了得,金山词霸、WORD、EXCEL、REGEDIT等居然都有smartphone版的,PC上的MP3、DOC等居然在download时都可被自动转换成smartphone格式,真是爽。完全可用Windows CE自己开发一些需要的程序download到自己的手机上。现在市面销售PDA智能手机火爆,MS总是财源滚滚。但我已发现国产的ARMLINUX手机出现在市面上,价格只1.2K。
在GOOGLE网上能搜索太多的关于嵌入式系统的讨论了,我刚发现一个http:www.embyte.com 非常不错,有很多有经验者谈自己的体会投入到其中的论坛中,你会切身感到嵌入式学习的热潮。
要么走ARMWinCE,要么走ARMLINUX,要么走ARMVXWORKS。每个搞嵌入式的人都可选一条路,条条大路通罗马。
三、关于游戏软件方向
将游戏软件人才称为数字媒体软件人才可能更好听些,包括游戏软件策划(最缺游戏策划的人)、游戏软件美术设计、游戏软件程序设计等多方面的人才,对软件学院,游戏软件程序设计当然是最合适的了。
游戏软件人才的确目前很缺,听说很多游戏软件公司苦于没新人才补充,特别是没有高手补充,不得不相互挖人才,以至将游戏软件人才身价越抬越高。网上说日本教育部刚刚批准成立了日本第一家专门培养四年制游戏软件人才的本科大学。其实国内很多大学,特别是软件学院都有搞游戏软件人才的设想,但目前很少有做成的,主要原因是找不到能上游戏软件课的教师,听说有个学校只能花很大的价钱从Korea找老师来上课,果真缺到此等地步
已有很多青少年沉湎于网游而颓废的实例,好在还不至于上升到制造精神鸦片的高度,所以开发游戏软件的人也不必每日惭悔(但开发儿童益智类游戏软件的人是不需惭悔的),如果想想这是为发展民族软件产业做贡献,那反倒是一件有意义的事情了。不过听一家游戏软件公司的老板讲,搞游戏软件开发是非常辛苦的。
若想自己创业,搞搞游戏软件是不错的主意。现在网上网站或公司都在收购游戏软件(特别是手机游戏软件,因为手机游戏用户可选从网站上download到手机上,不像网游那么复杂),按download次数分成或一次性收购的都有。我们的同学在校期间是否也可发点小财搞得好,说不定可卖到国外网站,直接挣$$$呢。
大致游戏分成以下几类:
(1) PC类游戏,包括单机和网游。这类游戏开发平台基本上都是基于VC和DitrectX(如DirectShow,DirectDraw,D3D等,DirectX资料可直接到MS网站上查)。DirectX和OpenGL是两个主要的图形标准,OpenGL跨平台(Unix/Windows上都可跑),尽管很多搞研究的人对OpenGL赞不绝口,将DirectX骂得一文不值,但事实是,在Windows平台上,DirectX是最快最方便的,所以在Windows平台上的游戏还是DirectX当家。
(2) 手机游戏:目前手机游戏主要开发平台有两类:
第一类手机游戏是 J2ME 平台(Java 2 Micro Edition),J2ME本是为嵌入式平台设计的Java,但由于Java生来就需要Java虚拟机(JVM)来解释,所以在嵌入式产品很少用J2ME(太慢太耗内存)。但在手机游戏中J2ME倒有用武之地,我想这可能主要是Java可跨OS平台的原因,因为手机的OS是千奇百怪的。我对J2ME完全外行,但上次听Square Enix 公司的人说,J2ME与我们同学学过的J2EE还是有较大差别的。据我所知,目前手机中用的较多的是KJava语言,KJava是运行在一种叫K Java Virtual Machine的解释器上(K JVM是SUN早期为演示J2ME在嵌入式系统应用而开发的一个虚拟机),所以将在K JVM上运行的J2ME叫KJava。尽管SUN说今后不保证支持K JVM,将开发新的更高性能的J2ME虚拟机取而代之,但由于KJava出现较早,很多早期的手机游戏软件都将K JVM假想成J2ME虚拟机的标准了,所以目前有大量的KJava手机游戏软件存在,而且还在用KJava继续开发。特别是日本的手机游戏软件由于开发较早(像叫什么docomi的日本最大的电信运营商手机游戏搞得很火),多是基于KJava的。所以目前市场上在招聘手机游戏软件人才时,很多要求掌握KJava。有关J2ME请到Sun的网站上找资料。
另一类手机游戏是 BREW 平台,BREW是美国高通公司(Qualcomm,CDMA核心技术都是该公司开发的,有无数移动通信技术专利)发明的,据说可编译成二进制代码,那当然快了。主要的开发语言是C/C。但迫于被指责为较封闭的压力,目前Qualcomm已推出BREW平台上的J2ME虚拟机(但可想像那将是怎样慢的速度)。Qualcomm搞定了很多手机制造商签定BREW授权许可协议,最狠的是Qualcomm与中国联通绑在一起大堆基于BREW的手机游戏,所以有些公司招聘时要求掌握BREW也就不奇怪了。
去年00级22班毕业答辩时,有一位同学讲的是在公司做的KJava游戏(那是一家日本游戏软件公司),还一位同学讲的是另一家公司做的BREW游戏,看来不同的公司有不同的选择。将来谁会更火,我估计随着手机硬件资源的不断提高,不会在乎一个JVM的开销,J2ME应更有前途,毕竟它是更开放的。
(3) 专用游戏机:如电视游戏,XBOX,PS2等。
从著名游戏公司发来的对网游和手机游戏的人才需求,很有代表性。从中我们可看出,游戏公司对人才的需求主要是以下技术:
(1) 计算机图形学,特别是3D编程与算法,包括DirectX 或 OpenGL。开发平台是 VC/DIRECTX 或 KJAVA。
(2) 公司说,手机游戏因手机资源有限,必须对图像进行压缩,所以若有一些图像压缩算法知识比较好。像若能有MPEG压缩算法较好,手机上采用的是比MPEG压缩得更狠的一些特殊算法,但触类旁通。
(3) TCP/IP Socket编程是搞网游开发的人必须掌握的。
(4) 人工智能知识:复杂游戏可能需要一些AI算法。
(5) 网络与信息安全知识: 网游要防外挂。
一般游戏公司的网游服务器是基于 Linux 平台的,所以还提出了对游戏服务器端软件工程师的技术需求(精通MSSQL、ORACLE、MYSQL等数据库,精通Linux Programming,特别是Socket编程)。还有对维护游戏、网站人才需求(ASP.NET和数据库)。注意一条,最好有自己的游戏软件作品,若您应聘时能带一个 DirectX 作品,那将有多强的竞争力,所以最重要的是现在就要行动,实践,实践,再实践。
安德烈·卡耐基是美国宾夕法尼亚州一座停车场的电信技工。一天早上,调车场的线路因为偶发的事故,陷于混乱。工具A:招聘面试的STAR原则
招聘面试是经理工作的一项重要内容,每个成功的经理人都必须具备高超的招聘面试技巧,以招聘到合适的人充实到工作团队中,使合适的人在合适的岗位上,创造岗位员工的高绩效。
所谓STAR原则,即Situation(背景)、Task(任务)、Action(行动)和Result(结果)四个英文单词的首字母组合。
在对应聘人员进行面试的时候,你不妨试试STAR原则。
STAR原则是面试过程中涉及实质性内容的谈话程序,任何有效的面试都必须遵循这个程序。
在与应聘人员交谈时,首先了解应聘人员以前的工作背景,尽可能多了解他先前供职公司的经营管理状况、所在行业的特点、该行业的市场情况,即所谓的背景调查(Situation),然后着重了解该员工具体的工作任务(Task)都是哪些,每一项工作任务都是怎么做的,都采取了哪些行动(Action),所采取行动的结果如何(Result)。通过这样四个步骤,你基本可以控制整个面试的过程,通过策略性的交谈对应聘人员的工作经历与持有的知识和技能做出判断,招聘到更为合适的人才。
SATR原则是经理招聘面试的一个很好的工具,里面蕴涵着大量的细节性的技巧,经理应该在招聘工作不断摸索,提高运用能力。
工具B:职责清晰的6W1H原则
职责清晰是管理工作的基本准则,任何的管理都是从管理职位开始的,其基本的要求就是职责清晰,权责明确。
但是,在实际管理中,职责不清,权责不明的现象还大量存在。作为一个高效的经理,必须对这个问题做出更为深入的思考,有效地加以解决,使员工都明确自己的职责所在,在其位谋其政,学会自我负责,自我管理,使经理从繁忙的事务性工作解脱出来。
要想使员工的职位说明书更加准确,职责更加清晰,经理就必须再一次复习一下6W1H这个致关重要的原则。
所谓6W1H,即是:
1. Who—工作的责任者是谁?
2. For whom—工作的服务和汇报对象是谁?
3. Why—为什么要做该项工作?
4. What—工作是什么?
5. Where—工作的地点在哪里?
6. When—工作的时间期限?
7. How—完成工作所使用的方法和程序?
只有对上述问题逐一做出了回答,员工才能对工作更加清楚,才更愿意负责,更敢于负责,在工作中不断得到锻炼和提高。进而,你也才能抽出更多的时间对规划与发展的问题做出更多的思考,占据工作的主动,使未来的工作更有前瞻性。
工具C:目标管理的SMART原则
目标管理是使经理的工作变被动为主动的一个很好的手段,实施目标管理不但是有利于员工更加明确高效地工作,更是为未来的绩效考核制定了目标和考核标准,使考核更加科学化、规范化,更能保证考核的公开、公平与公正。毕竟,没有目标你是无法考核员工的。
制定目标看似一件简单的事情,每个人都有过制定目标的经历,但是如果上升到技术的层面,经理必须学习并掌握SMART原则。
所谓SMART原则,即是:
1. 目标必须是具体的(Specific);
2. 目标必须是可以衡量的(Measurable);
3. 目标必须是可以达到的(Attainable);
4. 目标必须和其他目标具有相关性(Relevant);
5. 目标必须具有明确的截止期限(Time-based);
无论是制定团队的工作目标还是员工的绩效目标都必须符合上述原则,五个原则缺一不可。
制定的过程也是你能力不断增长的过程,经理必须和员工一起在不断制定高绩效目标的过程中共同提高绩效能力。
工具D:有效管理的PDCA原则
这是产品质量控制的一个原则,但是它不仅仅能控制产品质量管理的过程,它同样可以有效控制工作质量和管理质量。
所谓PDCA即是计划(Plan)、实施(Do)、检查(Check)、调整(Adjustment)的首字母组合。
无论哪一项工作都离不开PDCA的循环,每一项工作都需要经过计划、执行计划、检查计划、对计划进行调整并不断改善这样四个阶段。
对经理来说,这是一个有效控制管理过程和工作质量的工具。采用PDCA可以使你的管理向良性循环的方向发展,通过实施并熟练运用,经理一定能在工作中不断提高效率,更加有效地驾御工作,获得更大的成功。
工具E:经理职业化的MKASH原则
现代化的管理要求经理必须职业化,人们不会仅仅因为一纸委任书而信任你,而是更愿意因你的职业化水平而维护你的权威,接受你的领导。惟有使自己的表现不断职业化你才能不断提高管理效率,创建优秀的管理团队,创造管理高绩效的团队文化。
现代化的经理必须是职业化、高效能的经理。
所谓MKASH原则,即是:
1.动机(Motivation):动机就像一部汽车车轮的轴心,处于核心的地位,动机的大小和强弱决定了车轮的运转速度和运行状况。积极心态影响下的动机会加速车轮的运转,从而加速经理的成功;反之,消极心态影响下的动机则不但对经理的成长不利,反而可能起到很大的破坏作用。
所以你必须正确认识积极动机对成功的激励性作用,不断调整自己的心态,以积极的动机面对工作和挑战,不断激励与超越自我,在积极动机的引领下去实现所制定的目标和远景
2.知识(Knowledge):知识经济时代的经理首先必须具备从事那份工作的专业知识,而且应该比下属员工更为专业,职业化必须以专业化为基础和背景。
做任何一项工作,首先要具备的就是应对那份工作的专业知识,要做的好还得具备与其相关的其他知识,以形成完整的知识体系,支持工作的开展和拓展。
惟有不断获取专业化的知识,经理才能做到职业化,才能在激烈的竞争中得到不断得到认可,获得更多的发展机会更大发展空间。
3.技能(Skill):技能是经理赖以开展工作必要手段。
只有知识,没有技能,也是寸步难行。试想,一个经理如果不具备沟通的技能,怎么与人沟通,怎么开展工作,没有人际交往技能,怎么与同事合作,怎么和下属建立和谐的人际关系?
技能的锻炼应该提高到与知识同等的高度,高度重视,不断将知识转化为技能,转化为能力。
4.行动(Action):具备了良好的动机,专业化的知识,熟练的技能水平是不是就可以了呢?显然还不够。
高效能的经理还必须具备快速行动的能力,具备强劲的执行力。有的人方方面面都比较优秀,知识水平很高,能力很强,可就是做不出出色的工作业绩,原因就出在行动能力的欠缺上。
汤姆彼得斯说,“快速制定计划并采取行动应该成为一种修养”。要想成为一个职业化的人才,就必须改掉犹豫不觉,瞻前顾后,拖拖拉拉的办事作风,在自己认准的事情上认认真真地采取行动,用行动来证明一切,不断提高自己的执行力。
5.习惯(Habit):习惯决定命运,这句话一点都不夸张。良好的习惯给人好的印象和感觉,能在很大程度上帮助你成功。
职业化的人才必须具备良好的习惯,无论是生活还是工作,都要时刻注意自己的习惯,改掉曾经的不好的习惯,养成职业化的行为习惯,使你的一举一动都体现出你职业的风采。
关于成功者应具备的习惯,柯维先生在《高效能人士的七个习惯》有非常精彩、非常深入的论述,经理不妨拿来一读,相信收获一定不匪。
以上简单描述了一些常用的工作准则,不够深入,还需要我们继续在工作当中不断地加以强化,更加熟练地加以运用,使之成为帮助我们获取高绩效的有效工具。
如何赢取人心人际关系对事业的发展有极大帮助,公司的制度多完善,亦需要各同事配合。这句话是古希腊哲学家亚里士多德说的。如果说优秀是一种习惯,那么懒惰也是一种习惯。人出生的时候,除了脾气会因为天性而有所不同,其他的东西基本都是后天形成的,是家庭影响和教育的结果。所以,我们的一言一行都是日积月累养成的习惯。我们有的人形成了很好的习惯,有的人形成了很坏的习惯。到20岁左右的时候,我们已经有了自觉意识,已经开始明白什么样的习惯会使我们终身受益。所以我们从现在起就要把优秀变成一种习惯,使我们的优秀行为习以为常,变成我们的第二天性。让我们习惯性地去创造性思考,习惯性地去认真做事情,习惯性地对别人友好,习惯性地欣赏大自然。我的很多习惯都是在办“新东方”的这十几年中逐渐养成的,包括我对待老师和员工的态度,对很多事情的看法。你养成了优秀的习惯,在人们眼中你就会显得优秀。比如,让我们今天就学会微笑,把悲伤留给自己,把快乐带给别人。不管你是真心的还是职业性的微笑,只要你笑了,就会很美丽很好看,就会给人留下美好的印象。在西方社会,你走到很多地方人们都在微笑,尽管你知道那是职业性的,阋廊荒芨芯跽庑┪⑿Φ娜嗣呛芮浊小H绻颐恰靶露健钡脑惫っ扛鋈硕及遄帕成习啵蠹揖突岣芯跸裰舷⒘艘谎赡芪颐歉俣嗟那膊灰欢ㄔ凇靶露健备闪耍撬歉鱿不妒芷氖芘翱瘛?/FONT>
第二句 生命是一种过程
事业的结果尽管重要,但是做事情的过程更加重要,因为我们是在每一天的过程中生活,每一天都不幸福,就等于整个生命都不幸福。所以尽管我们注重事业的结果,因为结果好了我们会更加快乐,但过程使我们的生命充实。
人生命最后的结果一定是死亡,我们不能因此说我们的生命没有意义。欢乐是生命本身的渴望,人类是世界上惟一会笑的动物,但不是惟一懂得欢乐的动物。所有的动物都有欢乐的天性,这从很多小动物欢乐地奔跑和嬉戏中能够看出来。人类的生存常常必须有比维持生存更高的目标,因为人类除了物质生活,还必须要有精神生活的满足,因此人类必须比动物付出更艰辛的劳动。在物质方面,我们希望今年2000元一个月的工资,明年通过自己的努力变成3000元一个月,毕竟2000元和3000元给我们带来的生活质量是不一样的。但除此之外,我们还必须使精神生活大获全胜。
曾国藩说过:“但问耕耘,莫问收获”。他并不是说我们不要收获。曾国藩的意思很简单,把种子撒进地里,种子自然会成长,长到最后自然会有收获,但是在维护庄稼成长的过程中给它浇水和施肥更为重要。因为只有这样,庄稼才会长得健壮,收获才会更好。另外,你每天日出而作,日落而息的劳动过程是你人生最美好的体验。迎着太阳的你走向美丽的大地,看着夕阳西下,你扛着锄头回家,这种感觉难道不是很美好吗?差不多到了陶渊明的“采菊东篱下,悠然见南山”的境界了。
所以大家一定要寻求每一天的充实。世界上很少有永恒,大学生谈恋爱,每天都在信誓旦旦地说我会爱你一辈子,这实际上是不真实的,只是在表达一种愿望而已。但我们还是在说,因为至少在那一刻,我们这样的表达是真实感情的流露。追求永恒的爱是人类共同的梦想,因为人在爱中永远充实。但现实生活并不是这样的,统计数据表明,大学生谈恋爱的100对里有90对最后会分手,最后结婚了的还有一半会离婚。你说爱情能永恒吗?所以最真实的说法是:“我今天,此时此刻正在真心地爱着你。”明天也许你会失恋,失恋后我们会体验到失恋的痛苦。那我们就去体会,去体验,这种体验也是丰富你生命的一个过程。
第三句 两点之间最短的距离并不一定是直线
特别是在人与人的关系以及做事情的过程中,我们很难直截了当就把事情做好。我们有时需要等待,有时需要合作,有时需要技巧。也许飞机能够在两点之间直飞,但即使飞机飞行,如果前面有个大气流,也通常只能绕过那个大气流飞行。我们做事情会碰到很多困难和障碍,有时候我们并不一定要硬挺、硬冲,我们可以选择有困难绕过去,有障碍绕过去,也许这样做事情更加顺利。大家想一想,我们和别人说话还得想想哪句话更好听呢。尤其在中国这个比较复杂的社会中,大家要学会想办法谅解别人,要让人觉得你这个人很成熟,很不错,你才能把事情做成。
第四句 只有知道如何停止的人才知道如何加快速度
汽车的质量越高,开得就越快。比如像奔驰和宝马这一类车,它们的高质量不仅体现在发动机系统上,还体现在刹车系统上。你开这些车的时候,就敢于高速行驶,因为你知道,只要你踩刹车,车就能稳稳地停下来,不至于翻车或跑到马路外面去。但当我们开夏利车的时候,我们一定不会开得和奔驰车一样快,因为我们知道如果让它跑得太快了,就很难刹车了,说不定就会撞栏杆或者翻了。所以说,没有把握停下来的人是跑不快的人。
我在滑雪的时候,最大的体会就是停不下来。我刚开始学滑雪时没有请教练,看着别人滑雪,觉得很容易,不就是从山顶滑到山下吗?于是我穿上滑雪板,哧溜一下就滑下去了,结果我从山顶滑到山下,实际上是滚到山下,摔了很多个跟斗。我发现我根本就不知道怎么停止,怎么保持平衡。最后我反复观察别人是怎么停,怎么滑的,然后再一点点地学,反复练习怎么在雪地上、斜坡上停下来。练了一个星期,我终于学会了在任何坡上停止、滑行、再停止。这个时候我就发现自己会滑雪了,就敢从山顶高速地往山坡下冲。因为我知道只要我想停,一转身就能停下来。只要你能停下来,你就不会撞上树、撞上石头、撞上人,你就不会被撞死。因此,只有知道如何停止的人,才知道如何高速前进。
最后一句 放弃是一种智慧,缺点是一种恩惠
有一次我在一本书上读到这句话,开始不理解,但在生活和工作中,终于开始明白其中的意义。在生活中,我们最愚蠢的行为就是太执著于自己的东西,把自己的东西捏着不放,不愿意放弃。结果呢,你捏着不放,别人就不会把他的东西和你一起分享。没有放弃就没有得到,这是再明白不过的道理。我在这里给大家讲一下分享理论。当你拥有六个苹果的时候,千万不要把它们都吃掉,因为你把六个苹果全都吃掉,你也只吃到了六个苹果,只吃到了一种味道,那就是苹果的味道。如果你把六个苹果中的五个拿出来给别人吃,尽管表面上你丢了五个苹果,但实际上你却得到了其他五个人的友情和好感。以后你还能得到更多,当别人有了别的水果的时候,也一定会和你分享,你会从这个人手里得到一个橘子,那个人手里得到一个梨,最后你可能就得到了六种不同的水果,六种不同的味道,六种不同的颜色,六个人的友谊。人一定要学会用你拥有的东西去换取对你来说更加重要和丰富的东西。在人与人之间学会交换和分享,这个收获百倍于你一个人把六个苹果吃掉的收获。这是因为你放弃了五个苹果而获得的,所以大家想一想,放弃是不是一种智慧?
那什么叫“缺点是一种恩惠”呢?就像我们刚开始说的那样,如果我们是完美的,我们就没有了发展的空间。一生下来就什么都有了,这人还有什么活头?做人最大的乐趣在于通过奋斗去获得我们想要的东西。所以有缺点意味着我们可以进一步完美,有匮乏意味着我们可以进一步努力。我在美国看过一部电视片,讲的是一位富翁给后代留下了用不尽的遗产,结果他的后代全都变成了吸毒的、自杀的、进监狱的,或者精神病患者。为什么会这样呢?因为这位富翁给自己后代留下的钱太多了,以致他们不需要劳动就可以继承一大笔财产。继承一大笔财富,就几乎什么都能买到。大家都知道钱的作用在于能买到物质世界上你所需要的全部东西,但惟一买不到的就是你心灵的充实、别人的友情以及你真诚的爱情。由于这些都是买不到的,所以你越有钱,心灵就越空虚,你就会极力用钱来填补自己的空虚,最后没有办法了就只能以吸毒来代替,使自己进入一个虚幻的世界。所以我说,当一个人什么都不缺的时候,他的生存空间就被剥夺掉了。如果我们每天早上醒过来,感到自己今天缺点儿什么,感到自己还需要更加完美,感到自己还有追求,那是一件多么值得高兴的事情啊!
软件,让世界变平 摘要: 软件,让世界变平 [转贴] http://gocom.primeton.com/modules/techresource/article1075.htm ... 阅读全文1.人生是不公平的,习惯去接受它吧。
2.这个世界不会在乎你的自尊,这个世界期望你先做出成绩,再去强调自己的感受。
3.你不会一离开学校就有百万年薪,你不会马上就是副总裁,两者你都必须靠努力赚来。
4.如果你觉得你的老板很凶,等你当了老板就知道了,老板是没有工作任期保障的。
5.在速食店煎个汉堡并不是作贱自己,你的祖父母对煎汉堡有完全不同的定义。
6.如果你一事无成,不是你父母的错,所以不要只会对自己犯的错发牢骚,要从错误中去学习。
7.在你出生前,你的父母并不像现在这般无趣,他们变成这样是因为忙着付你的开销,洗你的衣服,听你吹嘘自己有多了不起,所以在你拯救被父母这代人破坏的热带雨林前,先整理一下自己的房间吧。
8.在学校里可能有赢家和输家,在人生中却还言之过早,学校可能会不断给你机会找到正确的答案,现实人生中却完全不是这么回事。
9.人生不是学期制,人生没有寒假,没有哪个雇主有兴趣协助你寻找自我,请用自己的空暇做这件事吧。
10.电视上演的并不是真实的人生,真实人生中每个人都要离开咖啡厅去上班。
|
||||
|
Java beta已经发布了,虽然离正式的FCS还有一段时间,一个朋友还是急不可耐地下载了Java6进行试用,他认为Java6将会给Java桌面开发带来革命性的变化。
最近发版的Java6(Mustang)beta是功能齐全足够稳定的版本,我下载并在第一周测试了这一版,我尤其被它的桌面功能所吸引,除了命名习惯改变了(2不再Java SE中出现),在许多新功能上都值得探索。改进总的来说分为两类:桌面开发和内核。
桌面开发改进主要体现在用户界面(UI)效率以及本地操作系统桌面集成上。核心改进主要集中在增加开发效率和Java应用管理上。Sun的Mustang开发小组对Web服务和安全改进做了很多重要的努力。
总的来说,不管你是应用开发者、系统管理员、工具提供商或者安全专家,Java6都为你提供你想要的。本文描述了一些我用过的有趣新功能。
内核功能和改进
Java内核是Java的几个部分,包括语言和工具,这些是Java其他方面的基础,从用户界面API到服务类库。下面我细分小类描述Java内核以及Java6的改进。
开发效率
新的Java编译器API允许在Java应用程序中编译Java代码。在编译的时候,应用程序能够访问格式化的类库依赖信息、警告信息、错误信息以及编译中产生的其他消息(该功能已经被netbeans6.0集成进去,实现新的Javac API,并籍此提高错误信息的提示)。尽管此项功能我不会经常用到,但是我已经发现它的新用处了。比如,用它为应用程序数据库迅速生成数据访问层。我写的代码生成并编译访问应用程序数据库的类,最终生成jar文件,这些jar文件产生、生成之后作为系统的一部分部署到Ant脚本中。在应用程序中生成并编译使得代码生成变得可以互动起来,我可以不断修改并反复生成这些类。
为使用Java的脚本功能,Java6支持了JSR223,JSR223提供脚本语言访问Java内部的框架,你可以在运行时定位并启动脚本引擎来运行你指定的脚本。另外,Web脚本框架还允许脚本在任何Servlet容器内生成Web页面。
对于调试来说,Java平台调试接口(JPDA)增强了检测死锁以及为被锁定监控对象产生堆栈跟踪的功能。此外,Java6添加了允许客户程序attach到一个正在运行的虚拟机进行诊断的功能。
应用程序管理
Java6增强了内存泄漏分析和检测,在java.lang.OutOfMemory异常中包含了所有跟踪栈的信息,并能当堆栈溢出时时产生致命错误的日志。另外,增添了一个新的虚拟机选项允许你当堆栈溢出时调用某段脚本。
JMX监控API的增强允许应用程序在MBean属性值(包括那些包含在复杂类型内的)超出临界值时发送事件消息。
对于Solaris10用户,Solaris的Hotspot JVM为Solaris的DTrace系统调试工具提供钩子来追踪和显示虚拟机内部活动,比如垃圾收集器、类加载、线程、锁等等。参加JavaOne大会时,我观看此项功能的演示,深深被DTrace工具调试的深度所吸引。应用程序运行时,DTrace允许你在任何地方中断代码的运行,查看所有加载的库(不仅仅是Java类库,还包含系统类库),跟踪到Solaris内核直至硬件!Java提供的这个令人惊讶的新工具让系统调试成为可能。我现在还记得过去经常会遇到虚拟机中报出Solaris Signal-8的错误,此新功能能帮我一探究竟。
Web服务
Java6包含了一些新的API来支持Web服务。XML数字签名API允许你对XML数据进行加密,从而安全地使用基于Java的Web服务,Java-XML Web服务(JAX-WS)2.0 API更新了以前称作JAX-RPC的接口。Java-XML绑定(JAXB)2.0的增强包括XML Schecma支持以及将类直接绑定到Schema上。最后,XML流API(STaX)提供了双向应用程序接口通过事件流来读写XML,包括跳过某些部分,只处理于文档的某些部分。
安全
Java6的安全包括GSS/Kerberos集成,LDAP认证的Java认证及授权服务(JAAS),允许Java应用程序通过多种协议请求安全证书的安全证书请求框架。
桌面功能和改进
很长一段时间内Java被认为是优秀的服务器段软件语言,而在桌面GUI应用方面被认为是次等公民。Sun的Java桌面开发小组一直致力于改变这种看法,将Java同本地操作系统更紧密的集成,结果在Java6中不仅提高了用户界面效率,还改进了Java GUI应用程序的表现。
Java6的许多新的桌面功能基于JDIC项目,JDIC项目让Java应用程序可以访问本地操作系统的许多功能,比如浏览器、email编辑器、文件类型关联、系统托盘、应用程序启动以及打印等等。下面是Java6在桌面开发上的明显改进:
启动画面支持
启动画面告诉用户等待应用程序启动。Java6甚至提供了在虚拟机启动之前展现启动画面的支持。
Java基础类(JFC)以及Swing改进
Java6调整了Windows API,使Swing既提高了运行速度,又保证了当前Windows版本的Windows外观。
国际化
Java6为某些格式支持可插拔式支持,比如日期格式化、Unicode文本标准化以及资源bundle。
Java6有可能使Java桌面应用产生革命的变化,就像java 2曾经产生的服务器端革命一样。我们最好为这场风暴做好准备,为早期投入Java桌面市场得到的报偿摆好姿态。
![]() |
豪情万千的企鹅 · 《咏柳》解析- 知乎 1 年前 |