-
保证你现在和未来不失业的十种关键技术
2007-06-18 08:04:18
作者/iamsohappy在当今的IT就业市场,有人欢喜有人忧。有人对目前的工作和薪水很满意,有人目前正面临着下岗,或者已经下岗……
可能你是公司里唯一谙熟某项关键技术的高手,缺了你,公司便玩不转了;也可能你所在的公司对你现有的专业技能高枕无忧,认为你在任期内足以胜任公司给你的开发任务(当然就不会再花银子去培训你啦)。
不要告诉我你们公司对原来用VB3开发的业务处理系统很满意,而你呢,也认为自己除了用C语言开发程序以外,不会再去做别的什么事情。
你是不是对.NET和Java为争夺开发工具市场撕破脸皮而熟视无睹,你是不是对XML将要取代关系数据库而无动于衷以及不屑一顾。你是不是认为你能用汇编或C开发任何东西,所以觉得其它开发工具都不再重要……
如果真是这样,那么你离失业的日子不远了,
俗话说--未雨绸缪……- 想一想如果你现在失业没有工作会怎么样,
- 想一想现在还有如此之多的弟兄们为了找一个饭碗而四处奔波。
- 想一想如果现在你们公司为了抢占市场,突然要进行技术转向,你该怎么办?
- 想一想你现在为了自己的前途,突然需要改变技术领域,你该怎么办?或者你不满足于现在自己的知识结构,想要再充实一下,但又不知选择那些内容来学习。那么继续往下看,并一起参加讨论吧,相信会有收获的。
本文列出了当今计算机软件开发和应用领域最重要十种关键技术排名,如果你想保证你现在以及未来的几年不失业,那么你最好跟上这些技术的发展。虽然你不必对这十种技术样样精通,但至少应该对它们非常熟悉。
一、XML
在十种技术中,最重要的一种技术我想应该非XML莫属。这里不仅仅指XML规范本身,还包括一系列有关的基于XML的语言:主要有XHTML,XSLT,XSL,DTDs,XML Schema(XSD),XPath,XQuery和SOAP。如果你现在还对XML一无所知,那么赶快狂补吧。XML是包含类似于HTML标签的一个文本文件,在这个文件中定义了一个树型结构来描述它所保存的数据。
XML最大的优点是你既可以在这个文本文件中存储结构化数据,也可以在其中存储非结构化数据——也就是说,它能包含和描述"粗糙的"文档数据,就象它描述"规则的"表格数据一样。- XHTML是目前编写HTML的首选方法;因为XHTML本身就是格式良好的XML,与通常畸形的HTML文档相比, XHTML格式文档更容易处理。
- XSLT和XSL是对XML文档进行转换的语言。它们可以将XML文档转换成各种格式,比如另一个文本文件、PDF文件、HTML文件、逗号分割的文件,或者转换成其它的XML文档。
- DTDs 和XML Schema用来描述XML文件所包含的数据内容的类型,使你不用编写定制的代码就能对XML文档的内容进行"有效性"检查,使内容强行遵守给出的规则。
- XPath 和 XQuery是查询语言,用它们可以从XML文档中吸取单个的数据项或者数据项列表。XQuery的功能特别强大,因为它对XPath查询进行了扩展。实际上,XQuery和XML的关系就像SQL之于关系数据库一样。
- SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节,但是你应该熟悉其常用规则及其工作原理,这样你才能使用它。
Web服务是XML流行后的直接产物。因为XML可以描述数据和对象,XML大纲可以保证XML文档数据的有效性,因为XML的基于文本的规范,因而XML文 档极其适合于作为一种跨平台通讯标准的基本格式。如果你还没有接触过Web服务,那么过不了多久你肯定会碰到它,所以必须熟练掌握Web服务,最好是精通 它,因为它是迄今为止应用程序间跨不同种类机器、语言、平台和位置通讯的最简单的一种方式。不管你需不需要它,Web服务都会是将来互用性的主要趋势。
XML工作组的John Bosak曾说过:"XML使得Java有事可做",那么,我们也可以说,Web服务使得所有语言都有事可做。Web服务让运行在大型机上的COBOL应用程序与运行在手持设备上的应用程序相互沟通;让Java小应用与.NET服务器相互通讯,让桌面应用与Web服务器进行无缝交互,不但为商业数据处理,同时也为商业功能提供了方便的实现——并且这种实现与语言、平台、和位置无关。
三、面向对象编程
许多程序员仍然认为OOP乃技术的象牙之塔,但是细细想一下过去十年里在面向对象领域里占据过统治地位的开发语言之后,你就不会这么认为了,OOP理念从Smalltalk开始,然后蔓延到C++和Pascal(Delphi),到Java成为真正的主流,几年之后,VB.NET 和 C#的出现可以说是OOP发展到了登峰造极的地步。虽然使用这些语言不必了解OOP的概念,但如果你缺乏一些OOP的基本知识和方法,我想你很难在逐渐疲软的就业市场中找到工作。
四、Java, C++, C#, VB.NET
如果你热衷于技术,并且热爱编程,那么我想你应该轻松玩转这些高级语言,我说的玩转并不一定要你成为超级编程高手。而是能看懂用这些语言编写的代码即可。 如果你还有精力用它们编码那就更好了。其实这种机会甚少。但是看代码的机会很多,学习编程的最有效的一种方式就是看源代码——浩如烟海的源代码中很多都不 是用你所钟爱的开发语言编写的。
在过去的几年里,各个语言功能的发展基本上都差不多。现在你完全可以用VB.NET来写Windows服务、Web应用或者命令行程序。即使你只用其中的 一种语言写程序。我认为也完全有必要学习另外一种语言,使自己能阅读和理解它们现有的例子代码,并且能将一种语言编写的代码转换成你首选的编程语言代 码。这里列出的四种语言可谓是一个强大的开发语言工具箱,如果你掌握了它们,毫无疑问你一定是一个众人仰慕的高手。这里我要声明一下:那就是我并没有要忽 略和排除其它的高级语言,如:FORTRAN、COBOL、APL、ADA、Perl和Lisp等等,根据你所从事的领域不同,应该选择适合的语言和工 具。
五、Javascrīpt
Java 和Javascrīpt两者的名字尽管很类似,但它们之间并没有什么关系。为什么一种脚本语言会如此重要,以至于将它列入十种关键技术之一呢?仔细想一下就知道了,目前所有主流的浏览器都使用Javascrīpt。如果你要编写Web应用程序,那么Javascrīpt不可或缺。此外,Javascrīpt还能作为一种服务器端的脚本语言,如将它嵌入在ASP、ASP.NET中,或者嵌入XSLT来扩展功能。目前Javascrīpt在Mozilla/Netscape中是激活基于XUL界面的首选语言,它派生出了Actionscrīpt,成为Flash MX应用的编程语言。还有就是Javascrīpt极有可能成为未来新设备的脚本语言以及主流应用的宏语言。
相比之下,VBscrīpt虽然在微软的产品中得到很好的支持,但从长远来看,没有迹象表明它会有美好前途。微软自己都趋向于用Javascrīpt(或者用由Javascrīpt派生的Jscrīpt)来编写其客户端脚本代码。因此,如果你要选择脚本语言,非Javascrīpt莫属。
六、Regular Expressions
从所周知,关系数据库的查询使用SQL,搜索XML文档用XPath 和XQuery,而正则表达式则用来搜索纯文本。例如,你可以用一个命令来查找或删除HTML格式文件中的注释内容。大家都用过"IndexOf"、"InStr"以及"Like"这些内建在Javascrīpt或VB中的文本搜索函数,这些函数虽然很容易使用,但是它们的功能却无法与正则表达式同日而语——现在每一种主流的开发语言都提供对正则表达式的存取。尽管有人认为正则表达式本身的读写艰涩难懂,但毕竟它的功能强大,使用它的领域也越来越多。
七、Design Patterns
就像OOP通过创建和分类对象来简化编程一样,设计模式将普通的对象交互分类成指定的模型,这是一个从一般到具体的过程。OOP的成分使用得越多,设计模式就显得越有用武之地。所以你必须理解它们,跟上其总体理论的发展。
八、Flash MX
当你需要比HTML和CSS所能提供的更多的客户端图形和编程能力时,Flash是最佳选择。在Flash中编程比用Java小应用或者.NET代码来得快得多,也容易得多。
在最新版本中(MX),Flash不仅可以画图和进行动画打包,它还是个高度的可编程应用环境。具备强大的与SOAP Web服务沟通的能力,可以调用运行在远端服务器上的ColdFusion、Java或.NET代码。可以说Flash几乎无处不在,包括手持设备、置顶盒、甚至是新的平板电脑,你到处都可以见到它的身影,所以使用它实际上可以扩展和延伸你的应用程序使用领域。
> 九、Linux/Windows
这是当今PCs机操作系统的两大阵容,如果你想在计算机行业里混,就一定要熟悉它们。对于Linux,最好能自己安装,配置,下载它的图形用户界面以及一些应用程序。自己安装Apache并会编写Web应用程序。要清醒地认识到这个世界除了Windows之外,还有Linux的存在。并且这种局面将会长期存在。反过来,如果你是一个死忠的Linux开发者,不要再继续对Windows的憎恶,要相互学习,取长补短,看看Windows有什么好的东东可以采纳。记住Windows仍然是桌面之王。
谁也说不准你们公司什么时候会决定从Linux转向Windows,或者从Windows转向Linux。谁也说不准什么时候你会跳槽跑到另外一个使用不同平台的公司上班——或者即便不跳槽,也有可能在不同平台上开始另外一个杀手级项目——所以最好在每个平台上都积累一些经验,而不要在一棵树上吊死。
十、SQL
尽管SQL在当今众多的技术中已不是什么新东西,而且在未来的十年里它的作用很有可能被削弱,甚至整个被淘汰,但它仍然是一种基本技能——别看它是一种基 本技能,至今仍有许多开发人员不懂什么是SQL或对它了解不多。不要指望基于图形用户界面的SQL构造器会帮你的忙,还是自己亲手写SQL查询吧,确定你 掌握了SQL的基本语法。现在理解了SQL,不仅对以后学习XQuery有所裨益,而且可以使你很快找到简化或改进当前开发项目的途径。
尾声:培养对技术的好奇心
其实,不管技术的发展趋势如何,每个人最重要的一个技能是好奇心。敢于面对挑战,在你目前或未来的工作中,新语言或新技术可能很重要,也可能不怎么重要, 你所学习的东西并不一定非要针对你的工作。不要怕失败,任何新的技术对初学者来说都是困难的。大多数的失败都可以归咎于本身急功近利,希望速成。俗话说 ——千里之行,始于足下,应该脚踏实地,一步一个脚印地往前走。不要让时间来左右你行动,而是要利用时间来关注、研究、测试新的开发技术和工具。
本文的用意不在于要让你成为任何一种技术的专家——只是想借VCKBAE这块宝地抛砖引玉,和大家畅谈现在和未来哪些技术是我们要密切关注的,讨论今后 IT行业就业的知识结构,思考自己今后应该在哪些方面需要多花些功夫。因为每一个人的情况各有不同,应该根据具体情况来构筑自己的知识层面。但有一点无庸 置疑——那就是保持良好的好奇心始终会使你充实和睿智。
-
取客户端信息的两种方法
2007-08-14 09:34:10
1、 USERENV(OPTION)
返回当前的会话信息.
OPTION='ISDBA'若当前是DBA角色,则为TRUE,否则FALSE.
OPTION='LANGUAGE'返回数据库的字符集.
OPTION='SESSIONID'为当前会话标识符.
OPTION='ENTRYID'返回可审计的会话标识符.
OPTION='LANG'返回会话语言名称的ISO简记.
OPTION='INSTANCE'返回当前的实例.
PTION='terminal'返回当前计算机名
SELECT USERENV('LANGUAGE') FROM DUAL;
2、sys_context
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual -
使用chkntfs控制windows开机的磁盘扫描
2007-07-07 09:42:48
Chkntfs 是一种实用工具,系统管理员可使用它来将卷排除在 autochk 程序执行的检查范围之外。该实用工具在命令提示符下运行,并具有以下命令行选项:
chkntfs drive: [...]chkntfs /dchkntfs /x drive: [...]chkntfs /c drive: [...]drive:指定驱动器号。/D 将计算机还原为默认状态,启动时检查所有驱动器并对有问题的驱动器执行chkdsk 命令。这将取消 /X 选项的效果。/X 排除默认启动时检查的驱动器。上次执行此命令排除的驱动器此时无效。/C 如果已经设置了非正常位,则安排在下一次重新启动时运行 chkdsk。 如果没有指定任何开关,chkntfs 将显示每台驱动器的非正常位状态。
示例:
chkntfs /x c: 此命令禁止 chkdsk 在驱动器 C: 上运行
chkntfs /x d:e:此命令禁止 chkdsk 在驱动器 D: 和 E: 上运行
chkntfs /x 命令不是累积性的,该命令会覆盖以前建立的任何驱动器排除项。在上面的示例中,chkntfs 命令只禁止 chkdsk 在驱动器 D 和 E 上进行检查,不检查驱动器 C 是否存在非正常位。
Chkntfs 实用工具是通过修改系统注册表中的 BootExcecute 值来工作的。BootExecute 值可以在下面的注册表项中找到:
HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\Session Manager
默认值为:
BootExecute:REG_MULTI_SZ:autocheck autochk *
Chkntfs /x 在星号前添加了 /k 参数。/k 参数将禁止检查卷上是否存在非正常位。
例如,命令
chkntfs /x D:
将此注册表项修改为自动检查 autochk /k:d *
通过在驱动器上设置非正常位,Chkdsk /f 安排在下一次重新启动时自行运行。Chkdsk /x 禁止检查此非正常位。Chkdsk /f 永远不能在那些被排除在 chkntfs 执行的非正常位检查的范围之外的卷上运行。
为了在 chkntfs 实用工具已经排除的驱动器上运行 chkdsk /f,必须运行 chkntfs /d 选项以将系统返回到正常状态,或者编辑注册表中的 BootExecute 值并从 /k 参数中删除适用的驱动器号。
警告:注册表编辑器使用不当可能导致严重问题,可能需要重新安装操作系统。Microsoft 不能保证您可以解决因注册表编辑器使用不当而导致的问题。使用注册表编辑器需要您自担风险。
Chkdsk /f /r 可让 chkdsk 在物理磁盘上对卷进行文件系统错误和坏扇区的检查。通过向 BootExecute 值中添加一项,Chkdsk /f /r 可安排在下一次系统重新启动时自行运行。例如,
chkdsk c:/f /r
将下面的项添加到 BootExecute 值:
autocheck autochk /r \??\C: 因为此项实际上位于注册表中,所以 chkdsk /f /r 不受任何 chkntfs 命令的影响。禁用 chkdsk /f /r 的唯一方法是从引用这个命令的 BootExecute 值中删除该命令行。
Chkntfs.exe 实用工具将所有驱动器视为节点的本地驱动器。这包括在共享驱动器阵列中的 Microsoft Cluster Server (MSCS) 物理磁盘资源。使用 Chkntfs.exe 来排除群集中的共享驱动器时,必须在每个节点上运行排除命令。必须这样做才能确保每个节点的注册表都拥有正确的项。您只能运行节点所拥有的共享驱动器的命令。如果该节点不具有物理磁盘资源,您将收到一条错误信息。 -
猎豹夕阳
2007-06-21 23:28:01
---很小的时候喜欢的一片文章,现在仍记忆犹新。
我第一次见到它,是在风雪的夜里。我不会抱怨这种天气,因为我是个优秀的登山探险者,我必须在这种天气下工作。我的帐篷扎在海拔三千多米处雪峰的腰上。冷 极了。它从帐篷外面进来,一对冷傲的眼藐视着我。我惊呆了:它是一只多么优秀的猎豹!棱角分明的头颅、光洁柔软的皮毛、强壮发达的肌肉、稍稍卷曲的鞭尾, 这些使它混身上下透出一股逼人的精气和孤独。天啊,在它身上也许集中了猎豹家族所有的优点!可,它是怎么到这来的?又是什么原因使它到这来呢?这个原因竟 能使它暂时抛开对异类的藐视而同我呆在一个帐篷里!我由衷地对它产生了敬畏,也很想知道关于它的一切。我拨了拨火盆,炭火很旺地燃烧着。我想它不会伤害 我,因为它不屑;更使我惊异的是,这只猎豹连怕火这种动物共有的本能都抛弃了。它一眼也不看我,卧下来凝视火盆,一动不动,像一尊冰雕。但,这是一只猎 豹!我偷偷打量它,它的眼里忽然有了些暖意,好像在笑,不知道它在想什么。我知道我是无法理解它的,也许连它的同类也不会理解它。何况,想在这个地方生存 下去是不可能的,可怜的猎豹,它到底要干什么?
次日醒来,发现猎豹正用冷森森的眼光看着我。见我醒了,它一转身出了帐篷。我追到帐篷口,掀起了帐帘。雪地里,它以猎豹家族最优美的姿势向上跳跃攀爬。通 常,猎豹是以这种姿势捕猎的。我见过那情景:几十只猎物飞逃而去,卷起滚滚尘烟。猎豹弓起腰,撑开四腿,闪电般刺入尘烟中,从猎物群中从容选定它胜利的祭 品------它从不打伏击:不,它不会干那种卑劣的事。现在,那只猎豹就是以这种捕猎的姿势向上奔着。我回身时,发现火盆上放着一只已烤熟了的山鸡。一 定是它弄的。为这只山鸡,它一定很早就出去,跑了很远的路,而且打到后撕掉猎物的毛,剖开它的腹,为我准备了早点。我不敢想象它是怎么不停地在火盆上翻转 山鸡的,作为一只动物,它竟不肯欠人的一丝恩惠,而且居然有这样的胆量和灵性!我收拾好了行囊,也开始向上爬。我抛开了原先设想的登山路线。我不必担心前方会有什么不测,因为只要顺着猎豹的足迹走就不会有危险。——不知为什么 我会这么信赖一只次于人的动物,但我是这样地坚决!我一定要在天黑之前登上山顶,否则我会被冻死。因为向上的坡度越来越爱猫扑.爱生活把帐篷背上去,上面 也不会有让我扎帐篷的地方,更要命的是,山顶的夜风有足够的力量把我在十几秒内冻僵,登山服根本挡不住那寒气。我一边爬着一边还得检查我的登山服的纽扣、 带子、拉链。到了中午,峭壁已经陡得使我看不见山顶了。这时候,我第二次看到了那只猎豹。
它剧烈地喘息着,紧张地盯着我,足有十秒钟,然后掉头上了另一条路。我不知道上面发生了什么事让它折回来看我,但我知道必须跟着它,因为它长久地在自然中 搏杀,感觉比人要灵敏得多。它一定察觉了什么危险而来阻止我——一定的!我必须快些,不然风越来越大,时间久了,雪会掩住猎豹的足迹,这会使我迷路,而且 探险计划会搁浅。
我大概上了山的另一边。这个鬼地方,正是风口上,雪几乎糊住了我的登山帽,我需要不断地清理它才行,风雪不断抽打在我身上,冰冷和孤独几乎窒息了我,但我 无暇去想了,我必须快!我看着它的背影,目送它再次远去。因为陡的缘故,它已经不能跳跃奔跑,它把爪甲深深地抠进雪中或是岩缝里,身子紧紧贴着峭壁,向上 滑进,像一只爬墙的壁虎那样灵捷和谨慎。我浑身忽然异样地充满了一股激情,这激情使我在一瞬间忘记了一切,我知道这是被猎豹所吸引着的!
不久,我突然感到峭壁猛地震动了一下。凭经验,我知道另一边发生了雪崩。在这么高的地方,居然发生了雪崩!一般说,这里常年的厚雪早被风凝住了,又 没有意外冲击,根本不可能雪崩的。上帝,要不是那只猎豹,我一定死了,伴着永远的雪峰,而且真与天地同在了,直到地球毁灭的那一天!
临近黄昏的时侯,我终于到达了山顶。我第三次看到了猎豹。它迎着轰响如雷的厉风,蹲在这山顶亘古不化的积雪中。它身上均匀地撒着金色的阳光,像一尊金塑的雕像。这情景是那样凝重,那样庄严,连上帝也会被感动。它就这么一动不动看着远方。天地都在沉默,惟有风在鸣。
这就是我们脚下的一切:云霞含着千峰万岭,吞吐着万象气息,在斜阳余辉映照之下,它们变换着橙红色的光华,从远天一直流到我们的头上;流云在疾风骤行中如 千军万马,轰鸣驰过我们的头顶。五色的霞光泄出如遥远天边的玫瑰,点染得群山俱羞,唤来薄薄的雾遮住曾经伟岸的身躯。夕阳尽情挥洒天地间的风云,叱咤着万 种豪迈与温柔;缤纷绚丽的光环交织着光与火的诗篇,燃烧天宇之外的恢宏;纤柔如指的光线弹奏着血色的交响,咏颂苍穹无限的壮美。一曲未毕,天边的霞光已如 点点的涟漪,散如落花,垂至心头,积成弯弯的彩虹,久久也不褪散------
我忘记了人和动物的界限,和猎豹一起熔进这部不朽的天作之中。我忘情地把手搭在它的头上。它用尽全身力气,向太阳长啸一声,长啸声中迸发出冲天的激情,一直奔射到夕阳之外,拥抱天宇中的一切!我们都被凝固了,很久很久------不是风雪,而是此时此地。
天快黑了,我们必须下山了,我推了推猎豹,它不动,再推,还不动。这时我才发觉它已经被冻得僵硬了。可怜的猎豹,它不惜以生命为代价,竟是为了看一次这样 的美景!我回想着昨晚的情景,终于明白它为什么会钻到我的帐篷里:未达心志,它不愿死,它必须取暖藉以保持生命的延续!现在它真的如愿了,并报以生命中最 后一声长啸。在它不瞑的笑目中,是否留下了永久的心境?它与天地同在了,而且永远,直到地球毁灭的那一天。它的心境永远比我的要壮美,因为它付出了它的生 命。我应该记录下这一孤独伟大的精灵。我终于想起了我的照相机,并为它拍了张遗照。我知道我没有权利再占有猎豹的一切,我下了山。
我把这个故事说给别人听,但没人相信。没人相信猎豹会出现在那种地方,更没人相信猎豹会欣赏夕阳。我辞去了登山的差使,因为想起那只猎豹,我便自惭形秽, 加上这次登山没能完成我的主顾给我的任务。但,我一生中这最后一次登山已经嵌入了我的生命。我惟一的遗憾是关于那张照片。照片洗不出来了,那地方太冷,即 使防冻相机的快门也冻住了,胶片根本没曝光。这故事,只有永远说给我一个人听了。
-
初次写windows GUI程序就遭遇到[STAThread]问题
2007-06-21 15:32:03
曝光一下俺搞GUI以来遭遇的第一个编译错误
:
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.
手边没有中文的参考资料,查了半天也找不到问题所在,差一点没了学C#的信心。
多亏了baidu,加个[STAThread]就解决了,嘿嘿!:
[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元 若为多线程单元则是 [MTAThread] COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。
Q. When I create a c# project from scratch in VS.NET, the generated code always have a [STAThread] attribute above the main routine. What does the STAThread attribute really do? Can I change it to MTAThread instead? I have searched website and books, no one seems to explain this well.
Asked by anon. Answered by the Wonk on February 17, 2003
A.
The STAThreadAttribute marks a thread to use the Single-Threaded COM Apartment if COM is needed. By default, .NET won't initialize COM at all. It's only when COM is needed, like when a COM object or COM Control is created or when drag 'n' drop is needed, that COM is initialized. When that happens, .NET calls the underlying CoInitializeEx function, which takes a flag indicating whether to join the thread to a multi-threaded or single-threaded apartment.
A multi-threaded apartment (MTA) in COM is more efficient, since any of a number of RPC threads from a pool can be used to handle a request. However, an object on the MTA thread needs to protect itself from multiple threads accessing it at the same time, so that efficiency comes at a cost.
The single-thread apartment (STA) in COM is inherently single-threaded and therefore no additional thread synchronization is needed. The STA is implemented using the thread's Windows message queue, which is how requests to objects on an STA are serialized. Because of how the STA thread is implemented, calls to objects on that thread are serialized with Windows message handling on that thread, making sure that everything, both the COM objects and the underlying windowing objects, e.g. HWNDs, are all synchronized. This is necessary for UI-oriented COM objects, like controls and drag 'n' drop, which must also be synchronized together with the UI.
When COM is needed .NET will call CoInitializeEx, picking the MTA by default because it's more efficient. However, to get the synchronization needed for controls, windows and drag 'n' drop, you need to mark a thread's entry point with the STAThreadAttribute to let .NET know to initialize the UI thread on the STA. All of the VS.NET project templates put that attribute in to make sure you don't forget:
[STAThread]
static void Main() {...}
Be very careful to leave that STAThreadAttribute just where it is, or things can go all wacky and you won't know why.
-
Linux Shell常用总结
2007-06-13 13:43:49
一、用户登陆进入系统后的系统环境变量
$HOME 使用者自己的目录
$PATH 执行命令时所搜寻的目录
$TZ 时区
$MAILCHECK 每隔多少秒检查是否有新的信件
$PS1 在命令列时的提示号
$PS2 当命令尚未打完时,Shell 要求再输入时的提示号
$MANPATH man 指令的搜寻路径
二、特殊变量
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1..9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个指令的PID
$? 执行上一个指令的返回值
三、shell中的变元
* 任意字符串
? 一个任意字符
[abc] a, b, c三者中之一
[a-n] 从a到n的任一字符
四、几个特殊字符表示
\b 退回
\c 打印一行时没有换行符 这个我们经常会用到
\f 换页
\r 回车
\t 制表
\v 垂直制表
\\ 反斜线本身
五、判断文件的属性
格式:-操作符 filename
-e 文件存在返回1, 否则返回0
-r 文件可读返回1,否则返回0
-w 文件可写返回1,否则返回0
-x 文件可执行返回1,否则返回0
-o 文件属于用户本人返回1, 否则返回0
-z 文件长度为0返回1, 否则返回0.
-f 文件为普通文件返回1, 否则返回0
-d 文件为目录文件时返回1, 否则返回0
六、测试字符串
字符串1 = 字符串2 当两个字串相等时为真
字符串1 != 字符串2 当两个字串不等时为真
-n 字符串 当字符串的长度大于0时为真
-z 字符串 当字符串的长度为0时为真
字符串 当串字符串为非空时为真
七、测试两个整数关系
数字1 -eq 数字2 两数相等为真
数字1 -ne 数字2 两数不等为真
数字1 -gt 数字2 数字1大于数字2为真
数字1 -ge 数字2 数字1大于等于数字2为真
数字1 -lt 数字2 数字1小于数字2为真
数字1 -le 数字2 数字1小于等于数字2为真
八、逻辑测试
-a 与
-o 或
!非
shell中的特殊字符有
1、$ 美元符
2、\ 反斜杠
3、` 反引号
4、" 双引号
5、< ,>,*,?,[,]
下面我一一举列说明
一、$符号
1、echo $? 显示的是上一条指令退出状态
2、echo "$?" 效果同上
3、echo '$?' 显示的是$?
4、echo \$? 显示的是$?
5、echo "\$?" 显示的是$?
大家可能已经看出 $符号在双引号中具有特殊意义 双引号对$符号不起作用而单引号可以将特殊字符的的特殊意义屏蔽掉,使其能显示为字符本身,反斜杠也可以将特殊字符的特殊含义屏蔽掉,使特殊字符失去特殊含义。
二、\ 反斜杠
反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符
A=1234
echo \$A 显示为$A 如果不加\将显示为1234
echo \` 显示为`
echo \" 显示为双引号
echo \\ 显示为\
三、` 反引号
反引号的功能是命令替换,将反引号中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量
A=`date`
echo $A 显示的不是date而是当时的时间串
比如有一文件A的内容如下
ABCDEFG
1234456
abcdefg
B=`cat A|grep 234` # 检索文件A中含有字符串234的行
echo $B 将显示为1234456
echo "$B" 将显示为什么?
echo "\$B" 将显示为什么?读者自己试试
四、" 双引号
在系统中有些特殊字符,为避免引用这些特殊字符 往往用双引号或单引号将这些特殊字符引起来,使其不具有特殊含义。
但有一部分特殊字符在引号中还是具有特殊含义,用双引号引起来是不起作用的。本文中所列的前四个特殊字符在双引号中还是特殊字符。为了使其不具有特殊含义一是用单引号引进来二是用\反斜线使其失去作用。
比如我们想原样输出这些特殊字符
echo """
echo "$"
echo "\"
echo "`"
以上不是你所期望的结果,因为双引号对它们不起作用,你只能这样才能输出这些特殊字符的原形
echo '"'
echo '$'
echo '\'
echo '`'
或
echo "\""
echo "\$"
echo "\\"
echo "\`"
将分别显示为 " $ \ `
五、其它特殊字符
大家注意到,除了前四个特殊字符外,我将其它的特殊字符都放在一块,这是因为前四个特殊字符在双引号中还是具有特殊含义,所以单独拿出来讲,除此以外的特殊字符如果你要输出这些特殊字符的原形,你就可以用双引号或单引号引起来使其失去特殊含义。
< ,>,*,?,[,]对shell有特殊含义 但你可以用双引号引起来输入这些原形
一、if 条件语句
格式:
if 条件表达式
then #当条件为真时执行以下语句
命令列表
else #为假时执行以下语句
命令列表
fi
if 语句也可以嵌套使用
if 条件表达式1
then
if 条件表达式2
then
命令列表
else
if 条件表达式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi
你可以进行多层嵌套 一个if语句一定要跟一个fi 表示该层条件结束否则会造成语法错误结合前面讲的 举例如下:
这里先讲一个条件语句中用到的命令test 表示测试test后面的条件是否为真
if test -f "$1"
then
lpr $1
else
if test -d "$1"
then
cd $1
lpr $1
else
echo "$1不是文件或目录"
fi
fi
以上的例子还可以改成如下所示
if test -f "$1"
then
lpr $1
elif test -d "$1" #elif 同else if
then
(cd $1;lpr $1)
else
echo "$1不是文件或目录"
fi
以上的例子不知您是否看懂是什么意思吗?
假如我们现在将这个例子保存为prfile
chmod +x prfile
执行刚才的程序
./prfile aaa
这个例子是检查你的输入的参数是否是一个文件 如果是就打印 如果是一个目录 先转目录再打印 如果即不是文件也不是目录给出提示
二、多重条件测试语句case
格式:
case 字串 in
模式) 命令列表;;
模式) 命令列表;;
....
esac
多重条件语句是以case 开始以esac结束 中间可以有多个条件列表 功能是测试字串和和里面的模式有没有匹配的,有就执行里面的命令列表 模式也可以是*号 表示任意字串,每个模式里面的最后要心;;双引号结束,否则会发生语法错误。
现举例如下:
case $1 in
*.c)
cc $1
;;
*.txt)
lpr $1
;;
*)
echo "未知的类型"
esac
假如将以上内容保存在文件abc中
chmod +x abc
执行 ./abc a.c 将会对文件a.c进行编译
执行 ./abc readme.txt 将会把文件通过打印机
假如我将以上内容改一下,你是否会知道它的执行结果?
case $1 in
*)
cc $1
;;
*.txt)
lpr $1
;;
*.c)
echo "未知的类型"
esac
一. while 循环
while 命令格式
while 条件表
do
命令表
done
执行过程
Shell首先执行条件表,如果条件表的最后一条语句的退出状态为零,则执行盾环体内的命令表,执行完后,再检查条件表,如果退出状态为零将继续执行,如此循环往复直到条件表的最后一条语句的退出状态非零. 退出状态为零就是条件为真True.
举例说明 假如shell文件的内容如下:
Sum=0
i=0
while true #true是系统的关键词 表示真
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
if [ $i = "100" ]
then
break;
fi
done
echo $i $Sum
最后这个程序显示的是 100 5050
这个程序的运算就是将1到100加起来
下面将这个程序再改动一下
Sum=0
i=0
while [ $i != "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
改动后的程序运算结果和上面是一样 但程序比上面的要简练
在这个循环中还可以以until做为测试条件 它正好与while测试的条件相反,也就是当条件为假时将继续执行循环体内的语句,否则就退出循环体,下面还用这个例子.
Sum=0
i=0
until [ $i = "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
当i不等于100时循环 就是当条件为假时循环,否则就退出,而第一个例子是当i不等于100
时循环,也就是测试条件为真时循环.
二.for 循环
命令格式:
for 变量 in 名字列表
do
命令列表
done
这里的名字列表是一个由空格分隔的字符串列表,shell在执行for循环时每次依次从名字表中取出一个字符串赋给循环变量作为变量的值.
在写for语句时,也可以省略in 名字列表部分,这表示用当前的位置参数来代替这时的名字列表.
面举个例子,比如在你的电脑中有两个目录,一个是aa,一个是bb在这两个目录中有5个相同的文件,但其中一个目录中的一个或多个文件刚刚修改过,现在我忘记刚才改的是那几个文件 了,那么我靠已知的序码查找。
程序如下:
for File in a1 a2 a3 a4 a5
do
diff aa/$File bb/$File
done
下面再举一个不带名字列表的例子
for File
do
echo $Filw
done
文件内容保存在a.sh中 并可执行
我们在执行这个shell程序时命令行如下:
a.sh a1 a2 a3 a4 a5
执行结果如下:
a1
a2
a3
a4
a5
大家从这个例子中可以看到命令行的参数被逐一读入一次
三.循环控制语句
break 命令不执行当前循环体内break下面的语句从当前循环退出.
continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行.
-
windows进程信息库-查找木马的好帮手
2007-05-31 23:26:42
-
笔记本常用问题
2007-05-31 14:47:05
刚接触笔记本电脑的朋友会有很多问题,这里有一些常见的问题。供大家参考(转贴)
CPU篇
Q1:“迅弛”到底是什么,用奔腾-M处理器的就是迅弛吗?
答:“迅弛”并不是简单地只指处理器,它是一个包括处理器、芯片组、无线网卡的系统总称。严格意义上来说,“迅弛”这个系统中的处理器只能是奔腾-M处理器,不包括赛扬-M处理器。因此只有采用“奔腾-M处理器+Intel 855/915芯片组+无线网卡”配置的机型才能称为“迅弛”。消费者可以通过笔记本电脑上的蝴蝶标志来辨认“迅弛”机型。
Q2: 奔腾-M处理器与赛扬-M处理器的有什么区别?
答:奔腾-M与赛扬-M处理器的核心、构架上都是相同的,区别主要有两个:奔腾-M支持自动降频节电的Intel SpeedStep技术,可以带来更长的电池使用时间,而赛扬-M则不支持该技术;奔腾-M比同核心的赛扬M处理器的二级缓存高出一倍,比如采用Banias核心的奔腾-M的二级缓存为1M,而赛扬-M仅为512K。
Q3:奔腾M处理器与赛扬M处理器性能差别大吗?
答:和台机上赛扬处理器与奔腾处理器性能的巨大差距不同,赛扬M处理器的性能比同频率的奔腾M处理器仅低10%左右。
Q4:为什么有的赛扬-M处理器能自动降频?
答:个别机型采用了相关软件对赛扬M处理器进行了降频,与奔腾M处理器采用降低倍频达到降频的原理不同,塞扬M是通过降低外频来实现频率的下降,这样会导致系统性能下降。对台机熟悉的朋友知道,外频的频繁更换对一些设备会有不良的影响。
Q5:AMD的处理器能自动降频吗?
答:AMD的处理器都支持类似SpeedStep的“PowerNow!”技术,能够自动降频,但效果与Speedstep还有一定的差距。
Q6:赛扬M处理器能无线上网吗?
答:能不能无线上网只与机型是否配备无线网卡有关,而与处理器没有任何关系。比如Apple的iBook G4系列,虽然没采用奔腾M处理器,但能通过AirPort Extreme无线网卡进行无线上网。
显卡篇
Q1:独立显卡和集成显卡的区别是什么,各自的特点是什么?
答:集成显卡的显示芯片是集成在主板上,没有显存,只能是靠共享一定的内存作为显存;独立显卡的显示芯片并不集成在主板上,显存是独立的,不需要占用内存。
集成显卡的特点是性能一般,但基本能满足一些日常应用,发热量和耗电量相对于独立显卡来说较低,需要占用内存。独立显卡的性能虽强,但发热量和功耗比较高,不占用内存。
Q2:目前的独立显卡型号有哪些?性能如何?
答:ATI的 MOBILITY Radeon系列:9200、9600、9700(9700se)、X300、X600、X700;nVidia的 GeForce Go 系列:6200TC、6600。
性能上的比较(同为64M显存的情况下):
X700(128bit)>6600>X700(64bit)>9700>X600>9600>6200TC>X300>9700se>9200
Q3:为什么用电池测试显卡的时候分数很低?
答:在使用电池的环境下,显卡会降低显示芯片的频率,自然测出来的分数不高。
Q4:集成显卡的显存可以更改吗?
答:集成显卡的显存容量可以在BIOS里面设置,而最大的显存容量要看芯片组的支持程度。比如Intel 855GM/GME最大只支持64M,而915GM可以支持到128M。
Q5:笔记本的显卡能升级吗?
答:不管是独立显卡还是集成显卡,目前而言基本上无法升级(排除采用特殊接口的独立显卡)。因此选购的之前一定要想好,根据自己的需要来购买。
内存篇
Q1:我现在的机型上用的是DDR内存,能升级到DDR2吗?
答:不能。最主要的原因就是两者在金手指上的缺口不同,造成了无法兼容。而笔记本的内存插槽是固定在主板上的,所以更换插槽基本上是无法实现。
Q2:内存怎么少了?
答:集成显卡占用了一定的内存。此外如果选购nVidia的 GeForce Go 6200TC显卡,6200虽然为独立显卡,但它支持“TurboCache”技术,允许分配一定的内存来提高性能。
Q3:怎么才能打开双通道?
答:首先明确支持双通道的只有Intel的915GM/PM芯片组,对与855系列芯片组来说是没有这项技术的。其次915芯片组只支持DDR2内存的双通道,意味着DDR内存是无法打开双通道的。最后双通道在BIOS里面打开。
Q4:AMD的机型支持双通道吗?
答:AMD的机型是否支持双通道关键是看AMD的处理器是否支持,与芯片组是否支持无关。不过现在发布的AMD移动处理器都不支持双通道。
Q5:升级内存后,原配内存要保留吗?
答:最好保留,因为有些品牌对保修有比较严格的要求,如果更换内存可能会失去保修的权利。(当然这也不是绝对的,有些品牌在维修的时候仅仅是对消费者自行更换的内存不予保修。)
屏幕篇
Q1:亮点、暗点、坏点各指什么?
答:亮点就是我们俗称的彩点,暗点则是在屏幕全白时出现的黑点。坏点则包括了亮点和暗点。坏点在液晶屏制造时产生,是不可修复的。关于液晶屏的坏点的国家标准很低,12个坏点都算合格。
Q2:什么是可视角度?
答:可视角度大小决定了用户可视范围的大小以及最佳观赏角度。如果太小,用户稍微偏离屏幕正面,画面就会失色。一般用户可以以120度的可视角度来作为选择标准。
Q3:笔记本液晶屏的响应时间大概是多少?
答:一般来说响应时间越短越好。响应时间越短,在看高速移动的画面时就不会感到“拖影”的痕迹。按照人眼的反应时间,响应时间如果超过40ms,就会出现运动图像的迟滞现象。如今大多数的笔记本所采用液晶屏响应时间都在25~30ms左右。
Q4:笔记本液晶屏的亮度足够吗?
答:如今一般的笔记本液晶屏亮度在150流明左右,对于日常应用已经足够。采用高亮设计的液晶屏亮度在250流明,而采用WSSV技术的NEC的液晶屏达到了320流明的高亮度。
Q5:液晶屏使用时有哪些需要注意的问题?
答:液晶屏是很脆弱的部件,如果顶盖硬度不够,注意不要让重物压在上面;对于液晶屏的表面注意不要划伤,最好能贴上保护膜;笔记本空闲时,最好关掉液晶屏以延长寿命。
重量篇
Q1:什么是机身重量?
答:不包括电池和电源适配器时笔记本的重量,又称为裸机重量。
Q2:什么是旅行重量?
答:机身重量、电池重量、电源适配器重量的总和。如果是外置光驱机型,则不包括光驱的重量。
Q3:电池的重量有多少?电源适配器呢?
答:电池的重量与电芯的数目有关。3芯电池重量在0.2Kg左右,6芯电池重量在0.3~0.4Kg之间,12芯电池重量则达到0.6Kg。而电源适配器的重量一般在0.4~0.5kg之间。
Q4:什么是带旅行匣的重量?
答:为了更方便携带,可抽取式光驱可以换成旅行匣,重量可以减轻0.4Kg左右。
电池篇
Q1:平常所说的3芯、6芯电池指的什么?与电池容量有关吗?
答:3芯、6芯是指电池中的电芯数目。电芯越多电池的容量越大,使用时间也就越长。
Q2:笔记本的电池有哪些类型?
答:主要有镍铬电池,镍氢电池,锂电池,它们一般表示为:镍镉Ni-Cd、镍氢Ni-MH、锂电Li。最近几年,在笔记本领域还出现了一种燃料电池。如今的笔记本一般采用锂电池,但少数机型还再使用淘汰掉的镍氢电池,消费者可以从电池的标记上来进行识别。
Q3:为什么厂家只对电池实行一年的保修?
答:锂电的使用寿命比较短。一般锂电的充电次数为只有400-600次,经过特殊改进的产品也不过800多次,使用2年左右就报废了。
Q4:电池为什么用不到厂商标称的时间?
答:测试的条件不一样。有的厂商是用8芯电池进行测试,而给用户的却是6芯电池;有的厂商采用关掉所有程序、调低液晶屏亮度、禁用耗电的接口等手段测出使用时间,而在日常应用中根本不可能达到;有的厂商仅用软件测试,软件可能导致误差。
Q5:电池的使用和保存要注意什么?
答:使用时注意这些问题:开始的几次充电一定要充满8个小时以上,充分激活锂电池;注意不要过度放电;最好不要在使用电源适配器的同时使用电池。
保存注意的问题:一个月最好拿出来充一次;保存时电池不要充满,充入40%~50%的电量为宜;放在干燥阴凉的地方。
接口篇
Q1:1394接口有什么用途?
答:1394接口分为4针和6针两种接口,主要用途是与数码摄象机连接传输影像数据。如今一般的笔记本上采用4针的接口,对于外置光驱的机型来说,一般采用6针的接口来连接光驱。当然,苹果笔记本电脑上所采用的就是6针1394接口。
Q2:S端子有什么用途?
答:S端子的主要用途是将笔记本与电视连接起来,将电脑上的画面输入到电视上。
Q3:读卡器有什么用途?
答:读卡器的主要用途是实现数码相机与笔记本电脑的影象数据传输。如今很多数码相机采用存储卡或记忆棒,读卡器可以将这些存储卡和记忆棒中的数据读出传输到笔记本电脑上。
Q4:PC卡插槽有什么用途?
答:PC卡插槽相当于台式机的PCI插槽,不同之处在于PC卡插槽可以即插即用。因此结合不同用途的PC卡,可以实现一定的功能。比如采用PC无线网卡,可以实现无线上网;采用PC电视接受卡,可以收看电视;采用PC声卡,可以增强音效等等。
Q5:USB接口分布很重要吗?
答:比较重要,直接关系到使用的舒适性。如果设计得太挤,在使用多个USB设备时会有冲突;如果只设计在左侧,鼠标使用起来不方便。因此一台好的机型,USB接口的分布也很重要。 -
解决XP操作系统无法关机的故障
2007-05-31 11:53:46
摘自《计算机应用文摘》杂志
相信使用windows XP朋友都会碰到XP无法关机的情况,虽然没有无法开机那么郁闷,但是也是很不爽的事情!
1、退出Windows时的声音文件损坏
首先你可确定“退出Windows”声音文件是否已毁坏——打开“控制面板”,打开“声音”,将“退出Windows”声音取消。如果Windows正常关闭,则问题是由退出声音文件所引起的,要解决这一问题,可以从备份中恢复声音文件或者重新安装提供声音文件的程序,也可定义“退出Windows”为无声。
2、加载程序过多
可运行“Msconfig”,把开机自动启动的程序关掉点
3、注意“高级电源管理”
此外计算机上的“高级电源管理(APM)”功能也可引起关机死机或黑屏问题。而要确定APM是否会引起关机问题,可打开“设备管理器”,打开“系统设备”。在“高级电源管理”中取消“启用电源管理”选择。如果计算机正常关机,则问题的原因可能在于APM。
4、启动即关机故障
大家经常遇到在Windows刚刚启动的时侯就显示“你可以安全地关闭计算机了”,或者启动时马上关机或关机时重新启动等故障。这类故障的原因一般来说是由于Wininit.exe或Vmm32.vxd文件的损坏所造成的。解决办法是重新从WINDOWS安装程序压缩包中调取这两个文件。放入Windowssystem子目录下,将Vmm32.vxd改名为Vmm32.XXX进行备份,然后打开“系统工具”,选择“系统信息”——“工具”里的“系统文件检查器”,选择“从安装盘提取一个文件”,输入“Wininit.exe”或“Vmm32.vxd”。重复此步骤,以替换文件Wininit.exe或Vmm32.vxd。
5、Config.sys或Autoexec.bat有问题
从安装盘提取一个文件
此外,你可检查Config.sys文件或Autoexec.bat文件中是否存在冲突。用文本编辑器察看这两个文件的内容,看是否有多余的命令,也可以用“rem”来禁止某些语句的执行,逐步排除,直到发现有冲突的命令。
6、检查CMOS设置
CMOS设置不正确一样也会引起电脑关机问题,大家在电脑启动时可进入CMOS设置页面,重点检查CPU外频、电源管理、病毒检测、IRQ中断开闭、磁盘启动顺序等选项设置是否正确。具体设置方法你可参看你的主板说明书,其上面有很详细的设置说明,如果你对其设置实在是不太懂,建议你直接用厂家出厂默认设置既可。 -
Dates and Timestamps总结
2007-05-30 10:29:41
Dates and Timestamps总结
1.Datetime Datatypes
DATE
存储日期、时间,没有时区,精确到秒,是 9i 之前唯一的 datetime datatype。
TIMESTAMP [(precision)]
除了最多精确到 billionth of a second,其他和 DATE 一样。
TIMESTAMP [(precision)] WITH TIME ZONE
TIMESTAMP 的基础上,保存时区信息。在内部存储时,Oracle 将时间转换为 UTC 格式进行保存,比如:2002-02-06 20:00:00:00.00 -5:00。
TIMESTAMP [(precision)] WITH LOCAL TIME ZONE
不保存时区信息,但会将时间转换为数据库的时区(如果是保存到数据库表的列中)或者 session 的时区(如果保存为 PL/SQL variables)。数据在不同时区间传输时,会进行转换,但不保存时区信息。
其中 precision 表示秒的小数部分保留的位数,范围为:0~9。
如何选择 Datetime Datatype
1.如果你要精确到秒的小数位,那么使用 TIMESTAMP
2.如果要保留 datetime 值的时区,那么使用 TIMESTAMP WITH TIME ZONE
3.可以用 TIMESTAMP(0) 代替 DATE,但是两者的日期算法是不同的
4.为了兼容 TIMESTAMP 出现之前的应用程序,那么使用 DATE
5.PL/SQL 代码中的类型应该和数据库表中的类型相一致,比如将 TIMESTAMP WITH TIME ZONE 的类型存放到 DATE 类型的列中,时区就会丢失
6.使用 9i 以前的版本,那么只能使用 DATE
7.将 ADD_MONTHS 这种传统操作 DATE 类型的函数应用到新的 TIMESTAMP 类型上,会产生很大的不同
2.获得现在的时间
Function Time zone Datatype returned
CURRENT_DATE Session DATE
CURRENT_TIMESTAMP Session TIMESTAMP WITH TIME ZONE
LOCALTIMESTAMP Session TIMESTAMP
SYSDATE Server DATE
SYSTIMESTAMP Server TIMESTAMP WITH TIME ZONE
注:返回的都是数据库服务器端的当时时间,单前三者会转换为 session 的时区,可以用 alter session set time_zone 改变
9i 之前只有 SYSDATE
3.Interval Datatypes
INTERVAL YEAR TO MONTH
Allows you to define an interval of time in terms of years and months.
INTERVAL YEAR [(year_precision)] TO MONTH
year_precision:year 的位数,范围:0~4,默认:2
INTERVAL DAY TO SECOND
Allows you to define an interval of time in terms of days, hours, minutes, and seconds (including fractional seconds).
INTERVAL DAY [(day_precision)] TO SECOND [(frac_sec_prec)]
day_precision:day 的位数,范围:0~9,默认:2
frac_sec_prec:秒小数部分保留的位数,范围:0~9,默认:6
Month、hour、minute、second 的精度是不用设置的,Oracle 会保证他们的范围分别在 0~11、0~23、0~59、0~59
4.Datetime Conversions
Date 范围:
4712-01-01 B.C. —— 9999-12-31 A.D.
From Strings to Datetimes
隐式:
根据 NLS_DATE_FORMAT 的格式写 String 的值,Oracle 会隐式转换,如果和 NLS_DATE_FORMAT 不匹配,不能转换。
显式(使用内建函数):
TO_DATE( string[, format_mask[, nls_language]])
TO_DATE( number[, format_mask[, nls_language]])
用数字表示 Julian date 转换为 Date 类型,此时 format_mask = 'J',number 表示从 January 1, 4712 B.C. 开始的天数,由于 Oracle 中最大日期是 December 31, 9999 A.D.,所以 number 的范围为:1 ~ 5373484
TO_TIMESTAMP( string[, format_mask[, nls_language]])
TO_TIMESTAMP_TZ( string[, format_mask[, nls_language]])
此函数用于将 string 转换为 TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE
format_mask:
默认为 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT、NLS_TIMESTAMP_TZ_FORMAT(分别对应 TO_DATE、TO_TIMESTAMP、TO_TIMESTAMP_TZ)
对于 TIMESTAMP 类型,秒的小数部分可以用 '.FF' 或者 'XFF' 表示,比如:'mm/dd/yyyy hh:mi:ss.ff AM TZD' or 'mm/dd/yyyy hh:mi:ssxff AM TZD',其中 'X' 由 NLS_NUMERIC_CHARACTERS 的第一个字符决定。
nls_language:
Optionally specifies the language to be used to interpret the names and abbreviations of both months and days in the string.
几个限制:
1.传给 TO_DATE 中的 string 长度不能超过 220 个字符。
2.format mask 中 Julian date element (J) 和 the day of year element (DDD) 不能同时出现。
3.format mask 中 date/time 的某一个部分不能重复出现,比如:'YYYY-YYY-DD-MM'
4.format mask 中 HH24 不能和 am/pm 同时出现
From Datetimes to Strings
使用 TO_CHAR,默认格式 'DD-MON-RR'(9 位),可以用 NLS_DATE_FORMAT 覆盖。
对于 TIMESTAMP 类型,秒的小数部分可以用 FF1 ~ FF9 来表示保留几位(自动四舍五入)。
不能将用于 TIMESTAMP 的 format_mask 用于 DATE 类型,否则会报 ORA-01821,反过来可以。
Working with Time Zones
明确表示某一个时区,应该联合使用 TZH TZM 或者 TZR TZD
TZH:与 UTC 之间 HOUR 的偏移
TZM:与 UTC 之间 MINUTE 的偏移
TZR:The time zone region
TZD:The abbreviated time zone name
注:后两者可以查看 V$TIMEZONE_NAMES 获得
对于时区,存入的是什么信息,显示的也是什么信息,比如用 TZH:TZM 存入和 UTC 之间的偏移,就只能显示类似 +08:00 的时区偏移,而无法显示具体哪个 time zone region
二位数年份的处理
使用 RR/RRRR 时,Oracle 自动根据现在的年份辨别输入的二位数年份:
1.如果现在是前半世纪(0~49)
如果输入的是前半世纪(0~49),那么返回本世纪的年份
如果输入的是后半世纪(50~99),那么返回上世纪的年份
2.如果现在是后半世纪(50~99)
如果输入的是前半世纪(0~49),那么返回下世纪的年份
如果输入的是后半世纪(50~99),那么返回本世纪的年份
使用 YY/YYYY 时,不管输入的是什么,都返回本世纪的年份
注:这种自动转换只适用于 String -> Date 的转换,如果是 Date -> String,那就按照 Date 存储的值来转换,此时再用 RR/RRRR 已经没有意义了,因为 Oracle 内部存储的年份是四位数的。
5.Date and Timestamp Literals
这是 9i 之后 引入的 ISO SQL standard 格式,格式是固定的,不能更改,也不受环境变量影响,因此可以作为常量来使用
DATE 'YYYY-MM-DD'
TIMESTAMP 'YYYY-MM-DD HH:MI:SS[.FFFFFFFFF] [{+|-}HH:MI]' (HH 必须是 24 小时制的,FFFFFFFFF 可选 1~9 位,也可以没有,时区也可以使用 time zone region(EST),但这只是 Oracle 提供的格式,不是 ANSI/ISO standards)
例子:
DATE '2002-02-19'
TIMESTAMP '2002-02-19 14:00:00.000000000 -5:00';
6.Interval Conversions
Numbers to Intervals
NUMTOYMINTERVAL ( n , 'char_expr' )
NUMTODSINTERVAL ( n , 'char_expr' )
char_expr:
Name Descrīption
YEAR Some number of years, ranging from 1 through 999,999,999
MONTH Some number of months, ranging from 0 through 11
DAY Some number of days, ranging from 0 to 999,999,999
HOUR Some number of hours, ranging from 0 through 23
MINUTE Some number of minutes, ranging from 0 through 59
SECOND Some number of seconds, ranging from 0 through 59.999999999
以上不区分大小写
Strings to Intervals
TO_YMINTERVAL('Y-M')
TO_DSINTERVAL('D HH:MI:SS')
格式是固定的,不能缺少任何一个部分
7.Interval Literals
语法: INTERVAL 'character_representation' start_element TO end_element
character_representation 不需要指明所有 datetime 的元素,但必须指明从 start_element 到 end_element 的所有连续元素,如果只有 start_element 只需要一个元素就行了,但 start_element 和 end_element 不能跨越 month 和 day。
注:由于 bug 的问题,在 9i Releases 1 and 2 和 10g Release 1 中在 pl/sql 中指明部分元素会出错,比如 INTERVAL '1:02' HOUR TO MINUTE,但在 SQL 中不会。
Oracle 自动会将 high-end value 规格化,比如:INTERVAL '72:15' HOUR TO MINUTE 会规格化为 +03 00:15:00.000000,但 INTERVAL '72:75' HOUR TO MINUTE 会报错,只有 high-end value(这里的 HOUR)会自动转换
8.CAST and EXTRACT
两者都是 standard SQL functions
CAST(Oracle8 开始)
语法:
CAST(var as type)
注:在 SQL 中,type 可以指定长度,比如:varchar2(40),但在 pl/sql 中不能指定长度
可以在 string、datetime(DATE、TIMESTAMP)之间互相转换
由于无法指定 format,所以取决于 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT、NLS_TIMESTAMP_TZ_FORMAT 环境变量
EXTRACT(Oracle9i 开始)
语法:
EXTRACT (component_name, FROM {datetime | interval})
component_name(不区分大小写):
Component name Return datatype
YEAR NUMBER
MONTH NUMBER
DAY NUMBER
HOUR NUMBER
MINUTE NUMBER
SECOND NUMBER
TIMEZONE_HOUR NUMBER
TIMEZONE_MINUTE NUMBER
TIMEZONE_REGION VARCHAR2
TIMEZONE_ABBR VARCHAR2
由于用 to_char 无法格式化 interval 的显示格式(格式是固定的),所以唯一的方法就是使用 EXTRACT 来格式化
9.Datetime Arithmetic
Adding and Subtracting Intervals to/from Datetimes
1.和 Intervals 做 +- 操作。在和 INTERVAL DAY TO SECOND 进行运算时,不用考虑任何问题,但和 INTERVAL YEAR TO MONTH 做运算时,由于它是直接 +- 原始 datetimes 的年和月,所以可能够产生 ORA-01839 错误,应该有相关的 exception 处理语句。
2.直接和 number 做 +- 操作。number 表示天数,可以用分数小数表示:
Value Expression Represents
1/24 1/24 One hour
1/1440 1/24/60 One minute
1/86400 1/24/60/60 One second
注:不建议进行约分等操作,这样使得程序一目了然。
3.使用 ADD_MONTHS 函数。
1.如果输入的日期是输入月份中的最后一天,那么结果也是结果月份的最后一天
比如:
add_months(Date '2006-02-28',1) --> 2006-03-31
2.如果结果月份的最后一天小于输入月份的日子,那么结果日期是结果月份的最后一天
比如:
add_months(Date '2006-03-30',-1) --> 2006-02-28
可以构建一个自定义函数,解决 1 的问题,让他不返回月份的最后一天
FUNCTION my_add_months (
date_in IN DATE, months_shift IN NUMBER)
RETURN DATE IS
date_out DATE;
day_in NUMBER;
day_out NUMBER;
BEGIN
date_out := ADD_MONTHS(date_in, months_shift);
day_in := TO_NUMBER(TO_CHAR(date_in,'DD'));
day_out := TO_NUMBER(TO_CHAR(date_out,'DD'));
IF day_out > day_in
THEN
date_out := date_out - (day_out - day_in);
END IF;
RETURN date_out;
END;
建议:
虽然以上三者 DATE TIMESTAMP 都可以操作,但建议 TIMESTAMP 使用 1,DATE 可以使用 2、3
Computing the Interval Between Two Datetimes
两个 TIMESTAMP 相减返回的永远是 INTERVAL DAY TO SECOND
两个 DATE 相减返回的是天数,如果有小数部分,意思是 hours, minutes, and seconds 转换为天的结果
MONTHS_BETWEEN 函数:
定义:
FUNCTION MONTHS_BETWEEN (date1 IN DATE, date2 IN DATE)
RETURN NUMBER
尝试了一下也可以使用 TIMESTAMP,但还是建议不使用,不知道会出现什么问题。
1.date1 > date2 返回正数,小于返回负数,相等为0
2.如果在同一年的同一月中,结果的范围是 > -1 and < 1,1 和 -1 都是不会到达的,一月按照 31 天计算,TIME 部分也要计算
3.如果 date1 date2 分别是相应月份中的第一天或者最后一天,则返回整数,且忽略 TIME 部分的值
4.如果 date1 date2 在不同的月份中,且至少有一个不是该月的第一天或者最后一天,那么返回小数。小数是基于 31 天为一个月计算的,且要计算 TIME 部分。
Mixing DATEs and TIMESTAMPs
由前面可知:TIMESTAMPs 相减返回 INTERVAL DAY TO SECOND,DATEs 相减返回 numeric value
那么:
1.如果 DATEs 相减想返回 INTERVAL DAY TO SECOND 需要用 CAST 显示地将 DATEs 转换为 TIMESTAMPs
CAST(a AS TIMESTAMP) - CAST(b AS TIMESTAMP)
2.如果 DATE 和 TIMESTAMP 混合使用,Oracle 隐式地将 DATE 转换为 TIMESTAMP,因此返回的是 INTERVAL DAY TO SECOND
Adding and Subtracting Intervals
INTERVAL 相加减必须满足类型相同:两个 INTERVAL DAY TO SECOND 相加减,或者两个 INTERVAL YEAR TO MONTH 相加减,不能混合使用。
Multiplying and Dividing Intervals
DATETIMEs 是不能进行乘除运算的,但是 Intervals 可以。进行乘除运算时,每一个元素都会进行运算,如果超过该元素的范围就往上一级元素进位,如果出现小数就将小数部分转化为下一级元素,秒除外。
Using Unconstrained INTERVAL Types
由于在函数、过程中,参数不能指定精度,因此当 INTERVAL 传入时如果精度大于默认精度:YEAR(2),DAY(2),SECOND(6),会返回错误 ORA-01873: the leading precision of the interval is too small
因此,引入两个特殊类型:
YMINTERVAL_UNCONSTRAINED
接受任何精度的 INTERVAL YEAR TO MONTH
DSINTERVAL_UNCONSTRAINED
接受任何精度的 INTERVAL DAY TO SECOND
10.Date/Time Functions
对于传统的 DATE 函数,比如 ADD_MONTHS 建议不要用于 TIMESTAMP,Oracle 会将他们隐式地转为 DATE,这样会丢失秒的小数部分,还会将时区修改为 SESSION 的时区。因此,对于 TIMESTAMP 应该使用 INTERVAL 来操作。 -
教你怎样娶比尔.盖茨的女儿
2007-05-29 09:55:40
一位优秀的商人杰克,有一天告诉他的儿子
杰克:我已经决定好了一个女孩子,我要你娶她
儿子:我自己要娶的新娘我自己会决定
杰克:但我说的这女孩可是比尔·盖茨的女儿喔
儿子:哇!那这样的话……
在一个聚会中,杰克走向比尔·盖茨
杰克:我来帮你女儿介绍个好丈夫
比尔:我女儿还没想嫁人呢
杰克:但我说的这年轻人可是世界银行的副总裁喔
比尔:哇!那这样的话……
接着,杰克去见世界银行总裁
杰克:我想介绍一位年轻人来当贵行的副总裁
总裁:我们已经有很多位副总裁,够多了
杰克:但我说的这年轻人可是比尔·盖茨的女婿喔
总裁:哇!那这样的话……
最后,杰克的儿子娶了比尔-盖茨的女儿,又当上世界银行的副总裁。知道吗,生意通常都是这样谈成的! -
一只吃掉了狼和野猪的兔子!
2007-05-29 09:54:14
一天,一只兔子在山洞前写论文, 一只狼走了过来,问:“兔子啊,你在干什么?”
兔子答曰:“写论文。”
狼又问:“什么题目?”
兔子答曰:“《浅谈兔子是怎样吃掉狼的》。”
狼哈哈大笑,表示不信,于是兔子把狼领进山洞。
过了一会,兔子独自走出山洞,继续写文章。
一只野猪走了过来,问:“兔子你在写什么?”兔子答曰:“写论文。”
野猪又问:“题目是什么?”
兔子答曰:“《浅谈兔子是如何把野猪吃掉的》。”
野猪不信,于是同样的事情再次发生。
最后,在山洞里,一只狮子在一堆白骨之间,满意的剔着牙读着兔子交给它的论文。
题目:“《一只动物,能力大小关键要看你的老板是谁》。
这只兔子有次不小心告诉了他的一只兔子朋友,这消息逐渐在森林中传播;
狮子知道后非常生气,他告诉兔子:“如果这个星期没有食物进洞,我就吃你。”
于是兔子继续在洞口写论文。
一只小鹿走过来,“兔子,你在干什么啊?”
“写论文”
“什么题目?”
“《浅谈兔子是怎样吃掉狼的》”
“哈哈,这个事情全森林都知道啊,你别胡弄我了,我是不会进洞的”
“我马上要不干了,狮子说要找个人顶替我,难道你不想这篇论文的作者由兔子变成小鹿吗?”
小鹿想了想,终于忍不住诱惑,跟随兔子走进洞里。
过了一会,兔子独自走出山洞,继续写论文。
一只小马走过来,于是同样的事情再次发生。
最后,在山洞里,一只狮子在一堆白骨之间,满意的边剔着牙边读着兔子交给它的论文。
题目是:《如何发展下线动物为老板提供食物》
时间飞快,转眼之间,兔子在森林里的名气越来越大;
因为大家都知道它有一个很历害的老板。
这只小兔开始横行霸道,欺上欺下,没有动物敢惹她。
它时时想起和乌龟赛跑的羞辱;于是它找到乌龟说:“三天之内,来见我老板!”说完后扬长而去。
乌龟难过的哭了,这时却碰到了一位猎人;乌龟把这事告诉了他。
猎人听完后哈哈大笑!
于是森林里发生了一件重大事情。
猎人披着狮子皮和乌龟一起在吃兔子火锅。
地下丢了半张纸片歪歪扭扭的写着:山外青山楼外楼,强中还有强中手啊!
在很长一段时间里森林里又恢复了往日的宁静,兔子吃狼的故事似乎快要被大家忘记了。
不过一只年轻的老虎在听说了这个故事后,被激发了灵感。
于是他抓住了一只羚羊,对羚羊说,如果你可以象以前的兔子那样为我带来食物那我就不吃你。
羚羊无奈的答应了老虎,而老虎也悠然自得的进了山洞。
可是三天过去了,也没有见羚羊领一只动物进洞。老虎实在饿坏了,出来看看情况。
羚羊早已不在了,老虎异常愤怒。正在他暴跳如雷的时候突然发现了羚羊写的一篇论文。
题目是:《想要做好老板首先要懂得怎样才能留住员工!》 -
[论坛] O'Reilly OraclePL-SQL Bookshelf
2007-05-25 11:23:22
内含7本书:
Oracle PL/SQL Programming, 2nd Edition by Steven Feuerstein & Bill Pribyl
Oracle PL/SQL: Guide to Oracle8i Features by Steven Feuerstein
Oracle Built-in Packages by Steven Feuerstein, Charles Dye & John Beresniewicz
Advanced Oracle PL/SQL Programming with Packages by Steven Feuerstein
Oracle Web Applications: PL/SQL Developer's Introduction by Andrew Odewahn
Oracle PL/SQL Language Pocket Reference by Steven Feuerstein, Bill Pribyl & Chip Dawes
Oracle PL/SQL Built-ins Pocket Reference by Steven Feuerstein, John Beresniewicz & Chip Dawes
[ 本帖最后由 fsm 于 2007-5-25 11:25 编辑 ] -
关注重听人
2007-05-17 13:50:23
聋人,是听力因先天遗传或后天药物及人为因素而受损的残疾人,也叫听力障碍者,简称听障人。根据最近的全国人口普查统计,全中国大约有2075万听障人,包括弱听、重听、老化聋等。
重听人,相对聋人来说,是存在残余的听力的人。从生理角度来定义,听力90分贝以下便是重听人,也有的从其他角度来定义,大致分类为三种定义。前面讲了两种定义,第三种定义,是生长环境角度。读普校的是重听人,这是人们区分群体最广泛最常用的办法。重听人在交流上的种种困难,使他们好象成了人群中孤独的蝙蝠,也使他们难以在社会交流中锻炼为人处世的能力。因为社会的复杂性和另一面,必须由生活的体验来感悟。而重听人虽然生活在主流群体中,但却成了被主流群体无意排斥的一分子,凡事只有自己去想,去体悟,却无法在众多纷繁的世事中得到磨砺。
还有一点,重听人因为无法完全融入主流社会,在一些公共场合下仅仅知道和自己有关的事情,而其他生活小事,只好和他无关的,他便一概不知。这样一来,会不会导致他们想事情比较倾向于自我中心?
你的身边有没有这样的人,如果有,我们一起伸出手来帮帮他们吧。
:)
-
[论坛] 简体中文 Solaris 9用户指南
2007-04-30 20:32:31
简体中文 Solaris 9用户指南
简体中文 Solaris 9用户指南.pdf
(2007-04-30 20:32:31, Size: 1.07 MB, Downloads: 139) -
[论坛] Solaris培训资料
2007-04-30 20:25:12
Fundamentals of Solaris™ 8
Operating Environment
for System Administrators
SA118_OH.pdf
(2007-04-30 20:25:12, Size: 1.74 MB, Downloads: 70) -
[论坛] Oracle性能优化技术内幕
2007-04-26 09:52:40
Oracle性能优化技术内幕
Oracle性能优化技术内幕.part1.rar
(2007-04-26 09:52:40, Size: 7.63 MB, Downloads: 5552) -
[论坛] 一本Expert系列没人发过的书-Apress.Expert.Oracle.Database.10g.Administration
2007-04-13 09:00:46
应该是没有谁提供过,至少俺的库里以前没有。
Apress.Expert.Oracle.Database.10g.Administration.Sep.2005.rar
(2007-04-13 09:00:46, Size: 7.44 MB, Downloads: 224) -
[论坛] Oracle.11i.实用全书
2007-04-03 08:51:46
Oracle.11i.实用全书
[ 本帖最后由 fsm 于 2007-4-3 08:56 编辑 ]
Oracle.11i.实用全书.part03.rar
(2007-04-03 08:53:00, Size: 6.68 MB, Downloads: 663)
Oracle.11i.实用全书.part09.rar
(2007-04-03 08:56:51, Size: 2.44 MB, Downloads: 156)
Oracle.11i.实用全书.part08.rar
(2007-04-03 08:56:25, Size: 6.68 MB, Downloads: 664)
Oracle.11i.实用全书.part07.rar
(2007-04-03 08:55:37, Size: 6.68 MB, Downloads: 748)
Oracle.11i.实用全书.part06.rar
(2007-04-03 08:55:01, Size: 6.68 MB, Downloads: 839)
Oracle.11i.实用全书.part05.rar
(2007-04-03 08:54:07, Size: 6.68 MB, Downloads: 724)
Oracle.11i.实用全书.part04.rar
(2007-04-03 08:53:41, Size: 6.68 MB, Downloads: 922)
Oracle.11i.实用全书.part02.rar
(2007-04-03 08:52:21, Size: 6.68 MB, Downloads: 896)
Oracle.11i.实用全书.part01.rar
(2007-04-03 08:51:46, Size: 6.68 MB, Downloads: 1046) -
[论坛] Oracle10g - Build J2EE Applications
2007-04-02 10:07:00
Oracle10g - Build J2EE Applications
PPTs.zip
(2007-04-02 10:07:00, Size: 3.92 MB, Downloads: 83)

