星期二, 十一月 28, 2006
在经过一个多月的封锁之后beta.blogger.com和www.blogspot.com终于可以直接访问了,其实在这期间我的blog并没有停止更新。更新方式当然不是通过blogger的控制面板而是通过email来进行publish的。突然才觉得通过email来进行发布有很多很多的问题,包括无法进行label,无法贴图....或许是email的功能还不够强大?
改天有时间对比一下目前的这些email,也是web2.0的一大特征。正好对比yahoo、gmail和livemail
这篇blog发自docs.google.com,最近发现docs支持了blogger的beta发布,但是仍然存在一些问题。上次发布的时候发现utf-8的字符变成了乱码,当然那篇文档里面有图片。不知道这篇文章会怎样?
星期六, 十一月 25, 2006
ruby命令行命令列表
D:\tools\ruby\bin>dir *.bat"
驱动器 D 中的卷是 working
卷的序列号是 49EF-1F09
D:\tools\ruby\bin 的目录
2006-08-26 14:17 4,191 erb.bat
2006-08-29 13:41 623 fxri.bat
2006-08-29 13:41 737 gem.bat
2006-10-10 23:35 33 gemhelp.bat
2006-08-29 13:41 1,397 gemwhich.bat
2006-08-29 13:41 1,814 gem_mirror.bat
2006-08-29 13:41 10,910 gem_server.bat
2006-08-29 13:41 563 irb.bat
2006-08-29 13:08 592 rake.bat
2006-08-26 14:17 1,776 rdoc.bat
2006-08-26 14:17 1,708 ri.bat
2006-08-26 14:17 326 testrb.bat
2006-08-29 13:41 685 update_rubygems.bat
13 个文件 25,355 字节
0 个目录 10,619,871,232 可用字节
D:\tools\ruby\bin>
erb是一种ruby(eRuby)的渲染方式,可以在html中定义变量进行集成,但是很多人评测的结果是速度非常缓慢。目前有其它的实现,比如eruby等,但是由于eruby是c的实现,同rails的结合存在一些问题。Erubis, 宣称有Erb3倍的速度并和eruby比肩,而且还是纯ruby的,这个应该是比较值得期望的。 erb.bat是对erb的脚本。
fxri.bat是一个GUI的ri实现,可以对ruby中的内建的类和方法查看帮助,但是运行起来很缓慢的样子,很多时候还是ri比较方便。
gem.bat是gem的安装脚本,可以通过gem来安装很多其它的ruby gems
gemhelp.bat,gemwhich.bat,gem_mirror.bat,gem_server.bat都是同gem相关的一些脚本。从名字上面就可以看的出来其用处,gemhelp:显示gem的用法; gemwhich.bat进行查询已经安装的gem包;gem_mirror.bat...gem_server.bat会启动一个小的webrick的应用(默认端口为8808),可以通过浏览器查看本地已经安装的gem的包
irb.bat是一个ruby的命令解释器,可以在其中书写自己的ruby代码并进行执行
rake.bat,是make的ruby实现,与类unix下面的c的make命令,java下面的ant命令功效类似
rdoc.bat,生成ruby的帮助的文档,与java的javadoc类似
ri.bat 命令行的执行语句,可以传入类或者方法的名称查询该命令或者方法的相关rdoc
testrb.bat ruby的执行测试脚本,与junit功能相当
shebang
You can also use the Unix "shebang" notation as the first line of the program file.2"
#!/usr/local/bin/ruby -w
puts "Hello, world!"
读programming ruby 2nd里面有shebang,不明所以,猜想应该是对 #! 的描述,在POSIX的操作系统上面的shell脚本都需要在shell脚本的第一行的注释注明该脚本要使用什么解释方式来解释shell脚本进行执行。通常情况下有bash,cshell以及perl,python等值。如果你的机器上面安装了ruby的话也可以使用
#!/usr/local/bin/ruby -w
来定义使用ruby命令来执行该脚本。
到google和baidu上面查询以后才明确,shebang是对#的描述,类unix系统上面的shell脚本中使用#放在首行进行注释。
"
在Unix命令解释程序(用户界面)用户中,shebang指"#"符号,脚本行必须以这个字符作为开始。在音乐符号中,"#"称为升半音(sharp),惊叹号"!"有时称轰声(bang)。因而,shebang变成较短的sharp-bang。Elizabeth Castro的Perl and CGI for the World Wide Web提到了这个术语。"
from: http://www.cnpaf.net/Class/s/05102612050617672888.htm
"
shebang: /sh@・bang/, n.
The character sequence "#!" that frequently begins executable shell scripts under Unix. Probably derived from "shell bang" under the influence of American slang "the whole shebang" (everything, the works).
"
星期五, 十一月 24, 2006
动态类型
动态类型
Java具有静态类型。开发人员可以声明每个变量的类型,然后在编译过程中,如果使用类型错误的变量,就会出现错误信息。另一方面,Ruby具有动态类型:不必声明变量或者函数的类型;只有在运行时,才会出现类型检查;如果调用的方法并不存在,就会出现错误。即便这样,Ruby也并不在乎对象的类,只关心它拥有的方法是不是含有方法调用里面所用的名字。正因为如此,动态方法得到了鸭子类型(duck typing)的名称:"如果它走起来像鸭子、叫起来像鸭子,那么它就是鸭子。"
代码片段1,鸭子类型:
class ADuck
def quack()
puts "quack A";
end
end
class BDuck
def quack()
puts "quack B";
end
end
# quack_it并不在乎变量duck的类型,只要它含有名为quack的方法。类A和类了没有继承关系。
def quack_it(duck)
duck.quack
end
a = ADuck.new
b = BDuck.new
quack_it(a)
quack_it(b)
Java还可以让开发人员使用反射(reflection)对动态类型进行归档,不过这种笨拙而繁琐的变通方法会带来让人混淆的异常,譬如NoSuchMethodError和InvocationTargetException,实际上,这些异常往往会出现在反射的Java代码中,其出现频率远超过反射的Ruby代码。
即便是在非反射性的Java代码中,往往也会丢失静态类型信息。譬如说,命令设计模式里面的 execute()方法在Java 5之前的代码里面返回的是"对象",而不是特定类型,结果导致ClassCastExceptions。同样,如果签名在编译时和运行时发生变化,运行时错误就会随之而来。实际上,无论是Java还是Ruby,这类错误很少会导致出现严重的字段错误。可靠的单元测试套件通常可以及时发现这些错误。
Ruby的动态类型意味着不必重复:如果使用Java,开发人员经常不得不需要为"XMLPersistence xmlPersistence = (XMLPersistence)persistenceManager.getPersistence();?"等行编写冗长的代码。而Ruby不需要类型声明和类型转换(也不需要圆括号和分号):典型的Ruby代码是"xmlPersistence = persistence_manager.persistence"。
Ruby的动态类型并不意味着弱类型――Ruby总是要求传递正确类型的对象。实际上,Java实施类型比Ruby还要弱。譬如说,Java将"4" + 2求值为"42",把整数和字符串强制起来,而Ruby会抛出"类型错误",告诉开发人员"无法把长整数转换成字符串"。同样,Java为了求速度而牺牲了正确性,它会悄悄导致整数运算溢出,从而带来莫名其妙的问题,譬如Integer.MAX_VALUE + 1,这相当于Integer.MIN_VALUE ,而Ruby只是在需要时才扩展整数。
尽管Ruby具有优点,但Java的静态类型的确为它提供了一项功能,使它成为大规模项目的优先选择:Java工具在开发时明白代码。集成开发环境(IDE)能够跟踪类与类的依赖关系、找到方法和类的使用、自动完成识别符、并且帮助开发人员重构代码。虽然也有类似的Ruby工具,但功能有限,而且缺乏类型信息,所以无法执行所有这些任务。
星期三, 十一月 22, 2006
修改表的表空间和索引的表空间
移动表的表空间:
select
'ALERT TABLE '|| owner||'.'||segment_name||chr(10)
||' MOVE TABLESPACE DEV4_LCC;'
from dba_segments where segment_type = 'TABLE' and owner='DEV4_LCC_SC'
将表移动到新的表空间
重建一个用户所有的索引:
SELECT
'ALTER INDEX ' || owner || '.' || segment_name || chr(10)
||'REBUILD ' || chr(10)
||'TABLESPACE '|| tablespace_name || chr(10) ';'
FROM dba_segments
WHERE
segment_type = 'INDEX'
AND
owner = 'user_name'
ORDER BY owner, bytes DESC;
如果需要移动到别的表空间的话则将tablespace_name替换成为自己的tablespace,用户名称替换成自己想要的用户名
星期一, 十一月 06, 2006
使用xfire提供webservice
在以下接口中定义lcc访问接口函数:
package com.lenovo.lcc.serviceportal.webservice;
public interface ServerManagerIfc {
public String getTime();
}
在以下类中实现访问接口:
package com.lenovo.lcc.serviceportal.webservice.impl;
import java.util.Date;
import com.lenovo.lcc.serviceportal.webservice.ServerManagerIfc ;
public class ServerManagerImpl implements ServerManagerIfc {
public String getTime() {
Date date = new Date();
String time = date.toLocaleString();
return time;
}
}
在以下配置文件services.xml中定义接口:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>LccService</name>
<namespace> http://localhost:7001/lcc_serviceportal_ws/services/lccservice</namespace>
<serviceClass>com.lenovo.lcc.serviceportal.webservice.ServerManagerIfc </serviceClass>
<implementationClass>com.lenovo.lcc.serviceportal.webservice.impl.ServerManagerImpl</implementationClass>
</service>
</beans>
该配置文件放在:webroot/WEB-INF/classes/META-INF/xfire/services.xml
需要修改配置文件web.xml,增加:
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
以上配置使得所有lcc_serviceportal_ws应用services路经下的所有访问都交由XFireConfigurableServlet处理。
通过访问http://serveraddress:portal/lcc_serviceportal_ws/services/ LccService?wsdl,可以获得LCC WebService的wsdl文件。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
Fwd: [xfire-user] Calling existing webservice by XFire
Forwarded Conversation
Subject: Calling existing webservice by XFire
------------------------
From: Layout Layout <skyloper@gmail.com>
Cause of requirements changed,we have to intergrate with some other system in one of my projects. And the best way of integration is web service. After reviewwing serval SOAP framework,we think XFire is our best choice. But there are still some questions bothering us. 1.Does Client API(http: //xfire.codehaus.org/Client+API) method only run under JDK5 ? Our development Env. and delopyment Env are both jdk1.4. What should we do to make sure that the calling can be done under jdk1.4 ? 2.Can dynamic client method(http://xfire.codehaus.org/Dynamic+Client ) deal with the complex type like POJO ? We have made some test, it seems no. After calling the GeoIP(at http://www.webservicex.net), it returned a xml document. How should I make it works with complex type ? |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
Hi On 10/31/06, Layout Layout <skyloper@gmail.com> wrote: > Cause of requirements changed,we have to intergrate with some other system > in one of my projects. > And the best way of integration is web service. > After reviewwing serval SOAP framework,we think XFire is our best choice. I agree ;) > But there are still some questions bothering us. > 1.Does Client API(http: //xfire.codehaus.org/Client+API) > method only run under JDK5 ? No, Client api works on java 1.4 also. Only generated clients ( http://xfire.codehaus.org/Client+and+Server+Stub+Generation+from+WSDL ) works only on java 5 ( but you can use Retrotranslator to make it java 1.4 compatibile ). > Our development Env. and delopyment Env are both jdk1.4. What should we do > to make > sure that the calling can be done under jdk1.4 ? > > 2.Can dynamic client > method( http://xfire.codehaus.org/Dynamic+Client) > deal with the complex type like POJO ? We have made some test, it seems no. > After calling the GeoIP(at http://www.webservicex.net), it returned a xml > document. > How should I make it works with complex type ? Currently dynamic client doesn't work well with complex types, but as i heard it should change in near future. > -- ----- When one of our products stops working, we'll blame another vendor within 24 hours. --------------------------------------------------------------------- To unsubscribe from this list please visit: http://xircles.codehaus.org/manage_email |
--------
From: Layout Layout <skyloper@gmail.com>
Thanks for your helpful repy. It encourage me a lot. I read the xfire documentation in the disctribution and it says that xfire can run well under jdk1.4. Well,my next question is how to generate or create the client api without the wsgen tools (task)? Let me clear it : " First you need to create a Service like you do on your server. This provides the metadata about how the service is structured: Next, you'll need to create a proxy for your service: " these words are quoted from http://xfire.codehaus.org/Client+API, and who can tell me how to create the interface YourService.class ? and how about the input/output parameter ? Can complex type can be supported by client api method ? [Quoted text hidden] |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
You use Client Api when you have access to service java interface and all classes used by it ( params and results ). So.. if you have service MyServiceImpl which implements MyService interface and one of its methods use MyPojoParam class as parameter you have to have MyService and MyPojoParam on client if you want to use this API. [Quoted text hidden] --[Quoted text hidden] |
--------
From: Layout Layout <skyloper@gmail.com>
OK,I see. Does that mean if I am going to call a web service I have to have the server side API ? But our client web service maybe was write by domino and C++,is that possible for me to call it using XFire ? for example,there is one webservice and the wsdl,how can I call it by xfire ?(without the wsgen) http://www.webservicex.net/MortgageIndex.asmx?WSDL and we maybe do not know the web service besides the WSDL. Can I write the client api myself ? [Quoted text hidden] |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
On 10/31/06, Layout Layout <skyloper@gmail.com> wrote: > > OK,I see. > Does that mean if I am going to call a web service I have to have the server > side API ? > > But our client web service maybe was write by domino and C++,is that > possible for me to call it using XFire ? > > for example,there is one webservice and the wsdl,how can I call it by xfire > ?(without the wsgen) > http://www.webservicex.net/MortgageIndex.asmx?WSDL If you want to use client based only on service wsdl you must generate client code ( using wsgen ). This code will work only on 1.5, but as mentioned earlier, you can convert this to java 1.4 with retrotranslator. [Quoted text hidden] --[Quoted text hidden] |
--------
From: Layout Layout <skyloper@gmail.com>
thank you very much. I tried to write a service class by hand and call the web service ,but I failed.It always report that emply SOAPAction can not be recogenize by the server.(I am using .net web service)。 I like xfire,but it seems that I have to use some other framework to calling the existing web service which created in C++(because having no java APIs). I can use xfire to create web service well. [Quoted text hidden] |
--------
From: Skyloper Dan <skyloper@gmail.com>
After discussing with Tomek Sztelak,I write a script to generate the stubs for WSDL,and translate to jdk1.4. But unluckly,I can not run the testCase in eclipse . It reported that : java.lang.UnsupportedClassVersionError : org/codehaus/xfire/annotations/jsr181/Jsr181WebAnnotations (Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:539) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) at java.net.URLClassLoader.access$100(URLClassLoader.java:55) at java.net.URLClassLoader$1.run (URLClassLoader.java:194) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:187) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) at net.webservicex.geoip.GeoIPServiceClient.create0 (GeoIPServiceClient.java:57) at net.webservicex.geoip.GeoIPServiceClient.<init>(GeoIPServiceClient.java:26) at org.layout.xfire.client.GeoIPClient.testGetGeoIP(GeoIPClient.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke (Method.java:324) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected (TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run (TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:196) And here is my ant script and testcase. build.xml ----------------------------------------------------------------- <?xml version="1.0" encoding="gb2312"?> <project name="wsdl_gen" default="main" basedir="."> <property environment="env"/> <property file="build.properties" /> <path id=" compile.classpath"> <fileset dir="${basedir}/lib" includes="*.jar" /> </path> <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" > <classpath refid="compile.classpath"/> </taskdef> <taskdef name="translator" classname="net.sf.retrotranslator.transformer.RetrotranslatorTask"> <classpath refid=" compile.classpath"/> </taskdef> <target name="init"> <delete dir="${dir.target}" /> <mkdir dir="${dir.target}" /> </target> <target name="main" depends="init"> <wsgen outputDirectory="${dir.target}" wsdl="${dir.wsdl}/${source.wsdl.name}" package="${target.package.name}" overwrite="true"/> <antcall target="compile.java " inheritall="true"/> <antcall target=" compile.jar" inheritall="true"/> <antcall target="translate.jar"/> <antcall target="clean"/> </target> <target name="compile.java" description="compile the java sources and copy associated resource files"> <delete dir="${dir.build}"/> <mkdir dir="${ dir.build}"/> <javac srcdir = "${ dir.source}" destdir = "${dir.build}" debug = "${compile.debug}" deprecation = "${compile.deprecation}" optimize = "${ compile.optimize }"> <classpath refid="compile.classpath"/> </javac> </target> <target name="compile.jar"> <mkdir dir="${dir.dest}"/> <mkdir dir="${ dir.build}/META-INF/"/> <copy todir="${dir.build}/META-INF"> <fileset dir="${dir.source}/META-INF" /> </copy> <jar destfile="${dir.dest}/${ target.jar.name}"> <fileset dir="${dir.build}" /> </jar> </target> <target name="clean"> <delete dir="${dir.build}"/> <delete dir="${ dir.source}"/> </target> <target name="translate.jar"> <translator srcjar="${dir.dest}/${ target.jar.name}" destjar="${ dir.dest}/${target.1.4.jar.name}" verify="true" > <classpath location="${java14_home}/jre/lib/rt.jar"/> <classpath refid=" compile.classpath"/> </translator> </target> </project> ---------------------------------------------------------------------- test case --------------------------------------------------------------------- package org.layout.xfire.client; import net.webservicex.geoip.GeoIPServiceClient; import net.webservicex.geoip.GeoIPServiceSoap ; import junit.framework.TestCase; public class GeoIPClient extends TestCase { public void testGetGeoIP() { GeoIPServiceClient service = new GeoIPServiceClient(); GeoIPServiceSoap geoIPClient = service.getGeoIPServiceSoap (); System.out.println("The country is: " + geoIPClient.getGeoIP("216.73.126.120").getCountryName()); } } ---------------------------------------------------------------------------------------------- Who can tell me ho to run it ? [Quoted text hidden] |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
As i understand, retrotranslator converts only generated classes, but xfire annotation jar still use java5. So you probably need to translate also xfire-annotation.jar. [Quoted text hidden] --[Quoted text hidden] |
--------
From: Andres Bernasconi <andres.bernasconi@gmail.com>
I am using XFire with 1.4 and don't have any problems. I don't even care what the web service implementation is. I just "invent" a Java Interface in my client that adheres to the WSDL contract. I also create any necessary objects, (unless I can reuse some of my existing objects, which I did some times). For all this I am integrating XFire with Spring and using Aegis mapping, because I HATE generated classes and cumbersome steps in my builds. I do have complex types, including Map's and Array's of Map's. Everything is working perfectly, although I do not know if it will work with .net (because of the SoapAction thing, I belive .NET does not implement the specification correctly in that case. I've seen a similar post on this forums some time ago) Best of Lucks, Andres Bernasconi [Quoted text hidden] |
--------
From: Skyloper Dan <skyloper@gmail.com>
To Tomek Sztelak: I tried to translate the jar you said,but it can not be translated.Many depences can not be found. To Andres Bernasconi: Yes,the all the web services but .NET. I "invent" the client api according to the examples in the XFire1.2.2 distrubution,and it can run fine with 1.4,but when calling the web service(.NET),It reported the SOAPAction is empty. I have to use axis1(wsdl2java) to generate stub and call the service,and it works fine. btw,I think axis2 has many problems,even the documentation. [Quoted text hidden] |
--------
From: Taras Puchko <taras.puchko@gmail.com>
Hi! To make generated XFire client work on JRE 1.4 all modules can be translated with Retrotranslator to fully eliminate Java 5 API usages. The module dependencies should be provided via -classpath ONLY if verification is enabled, since they are not used during the translation. Setting -Djava.class.version=49.0 property when running client can also help in case of problems with type mapping. I am the author of Retrotranslator. Regards, Taras [Quoted text hidden] |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
Hi Taras Did run translated XFire client succesuly ? If so, maybe you can write few words what must be done ? :) [Quoted text hidden] ------- When one of our products stops working, we'll blame another vendor within 24 hours. --------------------------------------------------------------------- [Quoted text hidden] |
--------
From: Taras Puchko <taras.puchko@gmail.com>
I did it almost half a year ago, but AFAIR I had successfully run both a Java 5 server and a generated Java 5 client on JRE 1.4. Both of them were using annotations and generics. I translated them along with XFire, like this: java -jar retrotranslator-transformer-1.0.9.jar -srcjar server.jar -srcjar client.jar -srcjar xfire-all-1.2.2.jar And at runtime I specified -Djava.class.version=49.0 both for the client and the server: java -Djava.class.version=49.0 -jar client.jar This was needed especially on the server for generic collections to be correctly exposed via autogenerated WSDL, since XFire sometimes does not use generics and annotations if this option is 48.0. [Quoted text hidden] |
--------
From: Andres Bernasconi <andres.bernasconi@gmail.com>
Tomek, going back to the .NET issue, is there any way to configure XFire to be able to talk to .NET services? Even if it does not follow the spec, I believe being able to connect to .NET will give a bigger user-base to XFire, something we will all benefit from. Regards¿ AB [Quoted text hidden] |
--------
From: Tomek Sztelak <tsztelak@gmail.com>
Yes, it possible and lot of ppl do it :) But you must use client which use annotations, so XFire will be able to fill SOAPAction field. [Quoted text hidden] ------- When one of our products stops working, we'll blame another vendor within 24 hours. --------------------------------------------------------------------- [Quoted text hidden] |
--------
From: Andres Bernasconi <andres.bernasconi@gmail.com>
Oh, i see... pitty me :) [Quoted text hidden] |
--------
WCAG 的几个引用
http://wiki.moztw.org/index.php/�Y���W�热萦H和力���t_2.0
对WCAG1.0的中文翻译
http://www.junchenwu.com/WAI/wai-pageauth.html
w3c的规范原文(WCAG2.0的指南)
http://www.w3.org/TR/WCAG20/complete.html
感觉WCAG标准在国内推行的还不够,绝大多数网站对指南执行的不是很彻底,当然如果完全按照标准走的话也是存在问题的。对于开发人员来说,要完全按照这个指南去做的话会花费大量的工作量在于页面的调整上面。目前的开发团队很多都是按照传统的使用table布局,image的替代什么的都很少。要完全按照div+css布局都会是一件很困难的事情。
LCC项目的客户方是美国人,由于section 508 强调每个人(包括残疾人)都拥有对web网页访问的权利,应用系统应当增加对这些人士访问的支持。所以客户方也提出这些标准,当作项目开发的一个标准,但是给定的UI却又不是按照标准来做,也就是让开发人员来确定自己的系统是否符合这些标准。
美国人在人权方面考虑得确实比国内的企业要多,足可以证明美国确实在人权方面有更多的法律规定和标准。
目前国内在大肆推行web2.0, 看了不少网站,发现web2.0在规范的遵守方面确实比以前的传统门户要做的好。可能是目前web2.0都是技术人员搞出来的有一定的关系。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
fwd: WCAG &Section 508
WC3 关于可访问性的说法
为了帮助将此讨论正式化,1999 年 WC3 官方成立了 Web Accessibility Initiative (WAI),这是分配了为残疾人提高 Web 站点可用性这一任务的一个团体。WAI 的第一个行动是发布了 Web Content Accessibility Guidelines (WCAG)。WCAG 提供了一个包括 14 条准则的列表,以便设计易于访问的 Web 站点。
准则本身并没有详细说明为使一个 Web 站点更加易于访问应采取的操作。确切地说,它们是对如何确保可访问性提供解释的高级别声明。举例来说,准则 1 是"对听觉和视觉内容提供等同的替代内容。"每一条准则都附带一组检查点。检查点详细说明了为确保满足可访问性准则而可采取的操作。每一个检查点被给予下列优先级值之一:
•优先级 1 — Web 开发者必须 满足这一检查点,否则一个或多个用户组将不能访问此内容。
•优先级 2 — Web 开发者应该 满足这一检查点,否则一个或多个用户组将发现难于访问此内容。
•优先级 3 — Web 开发者可以 满足这一检查点,否则一个或多个用户组在访问此内容时可能有困难。
除了列出这 14 条准则及其关联的、设置优先级的检查点之外,WCAG 还为 Web 站点的可访问性提供了三级分类等级。实现所有优先级 1 检查点的站点被评定为符合 A 级。实现所有优先级 1 和优先级 2 检查点的站点被评定为双 A 级,而实现所有检查点的站点被评定为三 A 级。WCAG 提供了一组很好的操作以便执行,这样确保了不同的可访问性级别。
对 WCAG 的详尽讨论超出了本文的范围。下面列出的是 WCAG 的 14 条高级别准则。每条准则的检查点及其关联的优先级可以在官方的 Web Content Accessibility Guidelines 1.0 specification 中找到。
1. 对听觉和视觉内容提供等同的替代内容。
2. 不要仅依靠颜色。
3. 适当地使用标记和样式表。
4. 阐明自然语言的使用。
5. 创建正常转换的表格。
6. 确保以新技术为特性的页面转换正常。
7. 确保用户对时间敏感内容更改的控制。
8. 确保嵌入式用户界面的直接可访问性。
9. 进行与设备无关的设计。
10. 使用过渡解决方案。
11. 使用 W3C 技术和准则。
12. 提供上下文和定向信息。
13. 提供简洁的导航机制。
14. 确保文档清楚简单。
美国政府的可访问性准则
在1998 年,美国政府修改了康复法案 (Rehabilitation Act),制定了由联邦政府维护的电子和在线内容的可访问性规则。这些规则通常被称为"Section 508 规则",这就是详细说明可访问性要求的康复法案的 Section 508。
注Section 508 的完整文本以及 FAQ、留言板和培训信息都可在 www.Section508.gov 上在线找到。其他关于 Section 508 的信息可在 www.access-board.gov/508.htm 上获得。
对于 Web 站点的可访问性,联邦政府有 16 条规则。前 11 条是来自 WCAG 的检查点,后 5 条是针对 Section 508 的,而不是 WCAG 的组成部分。这些规则可在 Section 508 的 1194.22 条款中找到,为了完整说明在这里重复一下:
1. 对每一个非文本元素都应该提供一个等同的文本。
2. 任何多媒体演示的等同替代内容都应该与该演示同步。
3. Web 页应该经过设计,以便所有通过颜色传达的信息无需颜色也可获得,比如通过上下文或者标记获得。
4. 文档应该经过组织,这样它们无需关联的样式表也可阅读。
5. 应该为服务器端图像映射的每个活动区域都提供冗余的文本链接。
6. 应该提供客户端图像映射而非服务器端图像映射,除非区域不能使用可用的几何图形来定义。
7. 应该为数据表标识行和列标题。
8. 对于具有两个或多个逻辑层次的行或列标题的数据表,应该使用标记为这些数据标关联数据单元格和标题单元格。
9. 应该使用有助于框架标识和导航的文本来为框架加上标题。
10. 页面应该经过设计,以避免在频率大于 2 Hz 并小于 55 Hz 的情况下导致屏幕闪烁。
11. 当以任何其他方法都无法达到符合性时,应该提供一个有等同信息或功能的纯文本页以使 Web 站点符合这部分的规定。只要主页面更改,纯文本页的内容就应该更新。
12. 当页面使用脚本语言来显示内容或创建界面元素时,由脚本提供的信息应与辅助技术可以阅读的功能文本一致。
13. 当 Web 页要求客户端系统上有小程序、插件或其他应用程序来解释页面内容时,该页必须提供一个到插件或小程序的链接。
14. 当电子表单设计为在线完成时,该表单应该允许用户使用辅助技术来访问完成并提交表单所需的信息、字段元素和功能,包括所有的说明和提示。
15. 应该提供一个方法允许用户跳过重复的导航链接。
16. 当需要一个定时响应时,应该警告用户并给予其充分的时间以表示需要更多的时间。
这 16 条规则是由美国政府精心制定的,并只命令联邦机构的 Intranet 和 Internet Web 站点执行。但是,在命令政府机构的 Web 站点执行可访问性准则方面,美国并不是独一无二的。澳大利亚、加拿大、法国、德国、日本和英国等国家/地区也都有类似的法律。如需按国家/地区列出的可访问性政策的列表,请访问 WAI 的 Policies Relating to Web Accessibility 页。
检查是否符合可访问性
通过使用免费的 Bobby Online Portal,您可以快速确定一个给定的 Web 页是否符合 WCAG 或 Section 508。在此 Web 站点中,您可以输入一个 Web 页的 URL,选择检查或是符合 WCAG 或是符合 Section 508,然后查看列出符合性级别的报告。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
星期六, 十一月 04, 2006
fwd:oracle的备份与恢复
1.导出/导入(EXP/IMP)
2.热备份
3.冷备份
(注意导出备件是一种逻辑备份,冷备份和热备份是物理备份)
一、 导出/导入(Export/Import)
利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。
1、 简单导出数据(Export)和导入数据(Import)
Oracle支持三种方式类型的输出:
(1)表方式(T方式),将指定表的数据导出。
(2)用户方式(U方式),将指定用户的所有对象及数据导出。
(3)全库方式(Full方式),将数据库中的所有对象导出。
数据导入(Import)的过程是数据导出(Export)的逆过程,分别将数据文件导入数据库和将数据库数据导出到数据文件。
2、 增量导出/导入
增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作为SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用的文件名。
增量导出包括三种类型:
(1)"完全"增量导出(Complete)
即备份三个数据库,比如:
exp system/manager inctype=complete file=040731.dmp
(2)"增量型"增量导出
备份上一次备份后改变的数据,比如:
exp system/manager inctype=incremental file=040731.dmp
(3)"累积型"增量导出
累计型导出方式是导出自上次"完全"导出之后数据库中变化了的信息。比如:
exp system/manager inctype=cumulative file=040731.dmp
数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效的完成。
比如数据库的被封任务可以做如下安排:
星期一:完全备份(A)
星期二:增量导出(B)
星期三:增量导出(C)
星期四:增量导出(D)
星期五:累计导出(E)
星期六:增量导出(F)
星期日:增量导出(G)
如果在星期日,数据库遭到意外破坏,数据库管理员可按一下步骤来回复数据库:
第一步:用命令CREATE DATABASE重新生成数据库结构;
第二步:创建一个足够大的附加回滚。
第三步:完全增量导入A:
imp system/manager inctype=RESTORE FULL=y FILE=A
第四步:累计增量导入E:
imp system/manager inctype=RESTORE FULL=Y FILE=E
第五步:最近增量导入F:
imp system/manager inctype=RESTORE FULL=Y FILE=F
二、 冷备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言,冷备份时最快和最安全的方法。冷备份的优点是:
1、 是非常快速的备份方法(只需拷文件)
2、 容易归档(简单拷贝即可)
3、 容易恢复到某个时间点上(只需将文件再拷贝回去)
4、 能与归档方法相结合,做数据库"最佳状态"的恢复。
5、 低度维护,高度安全。
但冷备份也有如下不足:
1、 单独使用时,只能提供到"某一时间点上"的恢复。
2、 再实施备份的全过程中,数据库必须要作备份而不能作其他工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
3、 若磁盘空间有限,只能拷贝到磁带等其他外部存储设备上,速度会很慢。
4、 不能按表或按用户恢复。
如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须拷贝的文件包括:
1、 所有数据文件
2、 所有控制文件
3、所有联机REDO LOG文件
4、 Init.ora文件(可选)
值得注意的使冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的。
下面是作冷备份的完整例子。
(1) 关闭数据库
sqlplus /nolog
sql>connect /as sysdba
sql>shutdown normal;
(2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件
sql>cp
(3) 重启Oracle数据库
sql>startup
三、 热备份
热备份是在数据库运行的情况下,采用archivelog mode方式备份数据库的方法。所以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作,并需要大量的档案空间。一旦数据库运行在archivelog状态下,就可以做备份了。热备份的命令文件由三部分组成:
1. 数据文件一个表空间一个表空间的备份。
(1) 设置表空间为备份状态
(2) 备份表空间的数据文件
(3) 回复表空间为正常状态
2. 备份归档log文件
(1) 临时停止归档进程
(2) log下那些在archive rede log目标目录中的文件
(3) 重新启动archive进程
(4) 备份归档的redo log文件
3. 用alter database bachup controlfile命令来备份控制文件
热备份的优点是:
1. 可在表空间或数据库文件级备份,备份的时间短。
2. 备份时数据库仍可使用。
3. 可达到秒级恢复(恢复到某一时间点上)。
4. 可对几乎所有数据库实体做恢复
5. 恢复是快速的,在大多数情况下爱数据库仍工作时恢复。
热备份的不足是:
1. 不能出错,否则后果严重
2. 若热备份不成功,所得结果不可用于时间点的恢复
3. 因难于维护,所以要特别仔细小心,不允许"以失败告终"。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
fwd:Oracle和MS SQL Server常用函数比较
数学函数
1.绝对值
S:select abs(-1) value
O:select abs(-1) value from dual
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from dual
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from dual
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from dual
5.四舍五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from dual 1.2346
6.e为底的幂
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from dual 2.71828182
7.取e为底的对数
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from dual; 1
8.取10为底对数
S:select log10(10) value 1
O:select log(10,10) value from dual; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from dual 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from dual 2
11.求任意数为底的幂
S:select power(3,4) value 81
O:select power(3,4) value from dual 81
12.取随机数
S:select rand() value
O:select sys.dbms_random.value(0,1) value from dual;
13.取符号
S:select sign(-8) value -1
O:select sign(-8) value from dual -1
14.圆周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 参数都以弧度为单位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互换(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
数值间比较
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from dual
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from dual
20.如何处理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
21.求字符序号
S:select ascii('a') value
O:select ascii('a') value from dual
22.从序号求字符
S:select char(97) value
O:select chr(97) value from dual
23.连接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from dual
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from dual
23.模糊子串的位置 --返回2,参数去掉中间%则返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle没发现,但是instr可以通过第四个参数控制出现次数
select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from dual
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual
26.子串全部替换
S:没发现
O:select Translate('fasdbfasegas','fa','我' ) value from dual
27.长度
S:len,datalength
O:length
28.大小写转换 lower,upper
29.单词首字母大写
S:没发现
O:select INITCAP('abcd dsaf df') value from dual
30.左补空格(LPAD的第一个参数为空格则同space函数)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from dual
31.右补空格(RPAD 的第一个参数为空格则同space函数)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from dual
32.删除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重复字符串
S:select REPLICATE('abcd',2) value
O:没发现
34.发音相似性比较(这两个单词返回值一样,发音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
返回0-4,4为同音,1最高
日期函数
35.系统时间
S:select getdate() value
O:select sysdate value from dual
36.前后几日
直接与整数相加减
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd') value from dual
38.求时间
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from dual
39.取日期时间的其他部分
S:DATEPART 和 DATENAME 函数 (第一个参数决定)
O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星期)
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
40.当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from dual
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字符串转时间
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求两日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同时区时间
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt-------
AST ADT 大西洋标准时间
BST BDT 白令海标准时间
CST CDT 中部标准时间
EST EDT 东部标准时间
GMT 格林尼治标准时间
HST HDT 阿拉斯加?夏威夷标准时间
MST MDT 山区标准时间
NST 纽芬兰标准时间
PST PDT 太平洋标准时间
YST YDT YUKON标准时间
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
fwd:Oracle10的闪回表
闪回表
使用 Oracle Database 10g 中的闪回表特性,可以毫不费力地恢复被意外删除的表
以下是一个不该发生却经常发生的情况:用户删除了一个非常重要的表 ― 当然是意外地删除 ― 并需要尽快地恢复。(在某些时候,这个不幸的用户可能就是 DBA!)
Oracle9i Database 推出了闪回查询选项的概念,以便检索过去某个时间点的数据,但它不能闪回 DDL 操作,如删除表的操作。唯一的恢复方法是在另一个数据库中使用表空间的时间点恢复,然后使用导出/导入或其他方法,在当前数据库中重新创建表。这一过程需要 DBA 进行大量工作并且耗费宝贵的时间,更不用说还要使用另一个数据库进行克隆。
请使用 Oracle Database 10g 中的闪回表特性,它使得被删除表的恢复过程如同执行几条语句一样简单。让我们来看该特性是如何工作的。
删除那个表!
首先,让我们查看当前模式中的表。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------ ------- ----------
RECYCLETEST TABLE
现在,我们意外地删除了该表:
SQL> drop table recycletest;
Table dropped.
现在让我们来查看该表的状态。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE
表 RECYCLETEST 已不存在,但是请注意出现新表 BIN$04LhcpndanfgMAAAAAANPw==$0。这就是所发生的事情:被删除的表 RECYCLETEST 并没有完全消失,而是重命名为一个由系统定义的名称。它存在于同一个表空间中,具有与原始表相同的结构。如果在该表上定义了索引或触发器,则它们也被重命名,使用与表相同的命名规则。任何相关源(如过程)都失效;原始表的触发器和索引被改为放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被删除表的完整对象结构。
表及其相关对象被放置在一个称为"回收站"的逻辑容器中,它类似于您 PC 机中的回收站。但是,对象并没有从它们原先所在的表空间中删除;它们仍然占用那里的空间。回收站只是一个列出被删除对象目录的逻辑结构。在 SQL*Plus 提示符处使用以下命令来查看其内容(您需要使用 SQL*Plus 10.1 来进行此操作):
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ ------------------
RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31
结果显示了表的原始名称 RECYCLETEST,并显示了回收站中的新名称,该名称与我们看到的删除后所创建的新表名称相同。(注意:确切的名称可能因平台不同而不同。)为恢复该表,您所需要做的就是使用 FLASHBACK TABLE 命令:
SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;
FLASHBACK COMPLETE.
SQL> SELECT * FROM TAB;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
RECYCLETEST TABLE
瞧!表毫不费力地恢复了。如果现在查看回收站,它将是空的。
记住,将表放在回收站里并不在原始表空间中释放空间。要释放空间,您需要使用以下命令清空回收站:
PURGE RECYCLEBIN;
但是如果您希望完全删除该表而不需要使用闪回特性,该怎么办?在这种情况下,可以使用以下命令永久删除该表:
DROP TABLE RECYCLETEST PURGE;
此命令不会将表重命名为回收站中的名称,而是永久删除该表,就象 10g 之前的版本一样。
管理回收站
如果在该过程中没有实际删除表 ― 因而没有释放表空间 ― 那么当被删除的对象占用了所有空间时,会发生什么事?
答案很简单:这种情况根本不会出现。当表空间被回收站数据完全占满,以至于必须扩展数据文件来容纳更多数据时,可以说表空间处于"空间压力"情况下。此时,对象以先进先出的方式从回收站中自动清除。在删除表之前,相关对象(如索引)被删除。
同样,空间压力可能由特定表空间定义的用户限额而引起。表空间可能有足够的空余空间,但用户可能将其在该表空间中所分配的部分用完了。在这种情况下,Oracle 自动清除该表空间中属于该用户的对象。
此外,有几种方法可以手动控制回收站。如果在删除名为 TEST 的特定表之后需要从回收站中清除它,可以执行
PURGE TABLE TEST;
或者使用其回收站中的名称:
PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
此命令将从回收站中删除表 TEST 及所有相关对象,如索引、约束等,从而节省了空间。但是,如果要从回收站中永久删除索引,则可以使用以下命令来完成工作:
purge index in_test1_01;
此命令将仅仅删除索引,而将表的拷贝留在回收站中。
有时在更高级别上进行清除可能会有用。例如,您可能希望清除表空间 USERS 的回收站中的所有对象。可以执行:
PURGE TABLESPACE USERS;
您也许希望只为该表空间中特定用户清空回收站。在数据仓库类型的环境中,用户创建和删除许多临时表,此时这种方法可能会有用。您可以更改上述命令,限定只清除特定的用户:
PURGE TABLESPACE USERS USER SCOTT;
诸如 SCOTT 等用户可以使用以下命令来清空自己的回收站
PURGE RECYCLEBIN;
DBA 可以使用以下命令清除任何表空间中的所有对象
PURGE DBA_RECYCLEBIN;
可以看到,可以通过多种不同方法来管理回收站,以满足特定的需要。
表版本和闪回功能
用户可能会经常多次创建和删除同一个表,如:
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (1);
commit;
DROP TABLE TEST;
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (2);
commit;
DROP TABLE TEST;
CREATE TABLE TEST (COL1 NUMBER);
INSERT INTO TEST VALUES (3);
commit;
DROP TABLE TEST;
此时,如果您要对表 TEST 执行闪回操作,那么列 COL1 的值应该是什么?常规想法可能认为从回收站取回表的第一个版本,列 COL1 的值是 1。实际上,取回的是表的第三个版本,而不是第一个。因此列 COL1 的值为 3,而不是 1。
此时您还可以取回被删除表的其他版本。但是,表 TEST 的存在不允许出现这种情况。您有两种选择:
使用重命名选项:
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;
这些语句将表的第一个版本恢复到 TEST1,将第二个版本恢复到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值将分别是 1 和 2。或者,
使用表的特定回收站名称进行恢复。为此,首先要识别表的回收站名称,然后执行:
FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;
FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1;
这些语句将恢复被删除表的两个版本。
警告……
取消删除特性使表恢复其原始名称,但是索引和触发器等相关对象并没有恢复原始名称,它们仍然使用回收站的名称。在表上定义的源(如视图和过程)没有重新编译,仍然保持无效状态。必须手动得到这些原有名称并应用到闪回表。
信息保留在名为 USER_RECYCLEBIN 的视图中。在对表进行闪回操作前,请使用以下查询来检索原有名称。
SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE
FROM USER_RECYCLEBIN
WHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBIN
WHERE ORIGINAL_NAME = 'RECYCLETEST')
AND ORIGINAL_NAME != 'RECYCLETEST';
OBJECT_NAME ORIGINAL_N TYPE
------------------------------ ---------- --------
BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01 INDEX
BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER
在表进行闪回操作后,表 RECYCLETEST 上的索引和触发器将按照 OBJECT_NAME 列中所示进行命名。根据以上查询,可以使用原始名称重新命名对象,如下所示:
ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;
ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
一个值得注意的例外情况是位图索引。当删除位图索引时,它们并不放置在回收站中 ― 因此无法检索它们。约束名称也无法从视图中检索。必须从其他来源对它们进行重命名。
闪回表的其他用途
闪回删除表功能不仅限于恢复表的删除操作。与闪回查询类似,您还可以使用它将表恢复到不同的时间点,利用表的"过去"版本来替代整个表。例如,以下语句将表恢复到系统更改号 (SCN) 2202666520。
FLASHBACK TABLE RECYCLETEST TO SCN 2202666520;
此特性使用 Oracle 数据泵技术来创建不同的表,使用闪回功能将该 SCN 处的数据版本填充到表中,然后用新表替代原始表。为找出能够在何种程度上对表进行闪回操作,可以使用 Oracle Database 10g 的版本控制特性。(更多详细信息请参见本系列第 1 周的内容。)在闪回子句中也可以指定时间戳记而不是指定 SCN。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
Oracle不同字符集间的imp/exp问题
在导入数据库的时候总是报告部分列的内容超过最大值,看了一下,也不是所谓的clob或者blob造成的。初步分析以后发现应该是utf8里面的一个汉字占用三个字节的宽度,在gbk里面占用则为两个字节。也就是对于相同长度的汉字在gbk字符集下面比在utf8下面占用的长度较小。但是由于在imp和exp的过程中并不会修改表里面的列的长度,因此在从gbk的数据库里面到出来的数据无法导入导utf8里面去。
解决办法有两个:
1、修改字符集,将utf8的字符集数据库修改成为gbk。这个办法看似简单实则不然,因为utf8字符集本身是gbk的超集,想要将其修改为子集,oracle是不允许的。因此只能够删掉数据库重新创建数据库,对于一个新的数据库来说可能开销不大,但是如果是一个运行了较长时间有一定数据的数据库来说就有点惨了。这个办法还有一个缺点,因为utf8的目标是存储所有的utf字节,也就是说可以存储诸如日文,韩文和中文等多字节的文字,但是如果将字符集修改成为了gbk的话就只能存储中文字符和单字节的字符了,这对于国际化来说并不是什么好事。
2、修改表结构。将表结构中的varchar2或者char等数据类型的列都适当的扩展,长度扩展为3/2或者2倍即可。这个办法是个好办法,但是对于数据库表较多的情况来说也是相当麻烦的一件事情。不过幸好可以写一些程序来统一处理这样的问题,可以先通过plsq或者toad或者类似的工具将表结构导出(没有数据)成为纯文本的sql脚本,然后将其中的会受到国际化影响的数据库字段类型的长度进行相应的扩充。
当然,由于我是新建的数据库,而且暂时不用考虑到国际化的问题,因此我选用了第一种办法。
在查找资料的过程中也找到一些相关修改数据库字符集的资料:
三、用dblink在10G中做create table ..as select * from ..varchar2()的column宽度变成3倍
问题描述:例如:varchar2(255)==>varchar(765)
测试:1. 环境: 两台机器都装的10G的数据库
2. 测试步骤和结果:
SQL> conn test1/test1@db10G_server1
SQL> create database link link_server2
connect to test1 identified by test1
using 'db10G_server2'
SQL> conn test1/test1@db10G_server2
SQL> create table test1_t1 as select * from all_objects
where rownum<=3000;
SQL> desc test1_t1;
Name Null? Type
---------------------------------------------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
SQL> conn test1/test1@db10G_server1
SQL> create table test1_linkt1 as
select * from test1_t1@link _server2;
SQL> desc test1_linkt1
Name Null? Type
----------------------------------------- -------- ----------------
OWNER VARCHAR2(60)
OBJECT_NAME VARCHAR2(60)
SUBOBJECT_NAME VARCHAR2(60)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(38)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(38)
STATUS VARCHAR2(14)
TEMPORARY VARCHAR2(2)
GENERATED VARCHAR2(2)
SECONDARY VARCHAR2(2)
表结构一样,但是列的长度确实变了, 通过dblink创建的表的varchar2列的长度是原表的两倍
再来看看字符集
1.Server1上的数据库字符集
SQL> column value format A20
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
value
--------------
ZHS16GBK
2. Server2上的数据库字符集
SQL> conn test1/test1@db10G_server2
SQL> column value format A20
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
value
--------------
AL32UTF8
结论: 与数据库字符集不同有关系.
中科院一篇讨论oracle字符集的文章:
http://www.csdb.cn/viewPaper.jsp?tipid=1148536745101
修改oracle数据库字符集的方法:
http://www.cg163.net/ithtm/id.aspid=17738.htm
<我从utf8修改到gbk失败,因为oracle报告错误说只能修改成为超集:ORA-12712: 新字符集必须为旧字符集的超集>
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
HTML解析器
一段时间makefire一直在和我讨论关于html解析的话题,但是一直没有怎么用心去看看有没有三方的开源项目可以实现.窃以为就和xml解析的过程差不多,但是可能会灵活一些,毕竟html的语法不如xml那么强制规范,所以遇到不规范的书写就不知道该怎么解析了.
今天在google和sourceforge.net上面找了找,发现有人确实有心,做了一个html parser的开源项目,jericho-html而且已经到了1.5版本了,看样子也应该比较成熟了,于是下载看看能否适应我的需求.发现一共只有50个类左右(大部分都是数据bean,比如emlment,tag之类的),不依赖于其他三方的lib,所以可以直接就使用了.看了一下使用的sample:
import au.id.jericho.lib.html.*;
import java.util.*;
import java.io.*;
import java.net.*;
public class DisplayAllElements {
public static void main(String[] args) throws Exception {
String sourceUrlString="data/test.html" ;
if (args.length==0)
System.err.println("Using default argument of \""+sourceUrlString+'"');
else
sourceUrlString=args[0];
if (sourceUrlString.indexOf(':')==-1) sourceUrlString="file:"+sourceUrlString;
URL sourceUrl=new URL(sourceUrlString);
String htmlText=Util.getString(new InputStreamReader(sourceUrl.openStream()));
Source source= new Source(htmlText);
source.setLogWriter(new OutputStreamWriter(System.err));
// send log messages to stderr
for (Iterator i=source.findAllElements().iterator(); i.hasNext(); )
{
Element element=(Element)i.next();
System.out.println("---------------------------------"
+"----------------------------------------------");
System.out.println(element.getDebugInfo());
System.out.println(element);
}
}
}
有一个Util类从给如的uri中得出所有的htmlstr,然后再对这个str转换成为一个html的source,source可以设置logwriter,这样子一来就可以注入log4j的工具和其结合起来,如果放到一个aop的框架里面也会和其他的lib造成依赖和耦合关系.Tag类中静态定义了一大批的字符串变量,代表各种html的标签,而source中有方法遍历(iterate)和查找(findAllStartTags),找到则可以显示其内容和属性.
同时这个项目还提供了对jsp,asp,php等脚本语言的支持,可以对jsp或者php的源码进行分析.项目的实际意义可以在于网页搜索工具,比如做一个baidu或者google类似的搜索工具,只需要对我库中已经注册过的网站(url)定点的进行页面分析,分析关键字并且存在数据库中,则搜索的速度可以大大提高.
不知道google的实现方式是文本搜索,全文索引还是其他方式?
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
Spring与weblogic jndi集成
虽然spring本身是可以直接使用jndi来进行获取一些对象,但是在和weblogic集成的时候往往还是容易出现问题(在web应用的时候出现问题的可能性不大,因为container已经做了很多事情了.)但是在ide或者其他的应用环境下(不同的jvm的时候),通常找不到provider_url等属性造成无法找到jndi.
修改配置文件如下:
<!-- 通过jndi的方式来调用datasource,即使不一定是在j2ee环境中也可以正常使用默认情况下,如果没有指定,"java:comp/env/"将放在后面jndi名称前面
-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/myDatasource</value>
</property>
<!-- 如果你不想使用 'java:comp/env/'前缀的话请设置下面的值为true, 默认值为false -->
<property name="resourceRef">
<value>false</value>
</property>
<property name="jndiEnvironment">
<props>
<!-- The value of Context.PROVIDER_URL -->
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory
</prop>
</props>
</property>
</bean>
注意在设置的时候由于不在同一个jvm里面,所以一定要设置provider.url和factory.initial的属性值 ,否则会出现NoInitialContextException的异常出现.
此外如果和其他的应用服务器集成的话可能不只是要设置上面的两个属性,还要设置相关的其他属性。详细情况参考:javax.naming.Context类的说明文档。http://java.sun.com/j2se/1.4.2/docs/api/javax/naming/Context.html
其中设置的:
<property name="jndiEnvironment">
<props>
<!-- The value of Context.PROVIDER_URL -->
<prop key="java.naming.provider.url">t3://localhost:7001</prop>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory
</prop>
</props>
</property> 实际上就是设置Context初始化的时候设置的Properties属性。
--
----------------------------------
你的支持 我的坚持
Lead to The IT Future
----------------------------------
修改lomboz的ant执行计划
首先把三方的包都分类存放在一个公共的目录下面,比如我的文件夹就叫做third_lib的一个目录,里面存放各种开源的或者driver等三方jar。存放的时候不同的版本需要的包存放在不同的目录下面,比如hibernate2.1.6和hibernate3分开目录存放,毕竟不是所有的包都可以协同工作的。放好了以后的目录结构类似
%third_lib%\
+-spring
+--spring-aop.jar
+--spring-context.jar
+-hibernate2
+- hibernate2.jar
+struts....
然后在build.properties中添加一个几个变量:
third_lib=E:/java/third_lib
include_jars=spring;hibernate2;struts;...
其中third_lib指向你的三方jar存放的目录(也可以使用环境变量的方式在编译的时候指定或者获取系统变量),include_jars是用来指定当前项目需要的三方的依赖包(这里使用目录名称作为三方依赖框架名称)。 这样一来ant编译的时候就可以从build.properties中获取到项目的依赖包的关系了,从而进行拷贝操作。现在剩下的工作就是在ant的build.xml中写入一个任务并把deploy的depends加上新加的任务了。
<target name="copyjars" depends="init">
<script language="javascript">
<![CDATA[
importClass(java.io.File);
third_lib=project.getProperty("third_lib");
msg=project.getProperty("include_jars");
todir=project.getProperty("basedir")+"/"+project.getProperty("dist")+"/web-inf/lib";
copy = webmodulebuilder.createTask("copy");
copyjars.addTask(copy);
copy.setTodir(new File(todir));
copy.setVerbose(true);
arrMsg = msg.split(";");
for(var i=0;i< arrMsg.length;i++)
{
file_set = project.createDataType("fileset");
file_set.setDir(new File(third_lib+"/"+arrMsg[i]));
file_set.setIncludes("*.jar");
copy.addFileset (file_set);
}
]]>
</script>
</target>
其中使用到了script调用javascript,是ant的一个可选任务,需要下载几个依赖的jar放在ant\lib里面。
js.jar http://gd.tuwien.ac.at/infosys/browsers/mozilla.org/js/rhino15R3.zip 解压后取其中的js.jar,使ant支持javascript脚本
bsf.jar http://cvs.apache.org/dist/jakarta/bsf/v2.3.0rc1/bin/bsf-bin-2.3.0.tar.gz下载解压取其中的bsf.jar,使ant支持多种script
下载完毕以后使用ant lomboz的web应用,直接部署到tomcat上面,再也没有classnotdefexception了。。
还没完,那不是每次都要拷贝一遍脚本任务来做?岂不麻烦?到eclipse的plugin里面找到lomboz的web模板修改对应的文件即可。plugins\com.objectlearn.jdt.j2ee_3.0.1\lomboz.jar\com\objectlearn\jdt\j2ee\templates\web下 面的build.properties和build.xml修改即可。到此为止,都完成了,不用每次拷贝了。
参考文章:
1.Script Ant http://layout.blog.com/124611/ Lasse Koskela Accenture Technology Solutions Copyright © 2003 Lasse Koskela.
2.Using javascript with ant http://layout.blog.com/124607/ Diane Holt (holtdl[at]yahoo.com) on 25 Sep 2001
3.ant的帮助文档