温故而知新,可以为师矣

十二月, 2009的内容

复习oracle中的dbms_job包

作者:admin 时间:12.26.2009 类别:oracle, plsql

oracle中的DBMS_JOB包提供了定时周期性执行job队列中的job的功能,虽然它在oracle11g中已经被DBMS_SCHEDULER所取代,但是因为很多legacy application中还是大量地用到了它,所以在这里复习一下。

DBMS_JOB.SUBMIT用来提交一个job到job队列中,用法如下所示:

1
2
3
4
5
6
7
8
9
10
11
DECLARE
    X   NUMBER;
BEGIN
    SYS.DBMS_JOB.SUBMIT (
        job         => X,
        what        => 'SYSTEM.INSERTDATE;',
        next_date   => SYSDATE,
        INTERVAL    => 'SYSDATE+0.1/(24*60)'
    );
    COMMIT;
END;

其中job是一个out类型的参数,它返回的是一个具体job的id,以后可以通过这个id来引用job对它进行进一步的操作。
what指定要执行的任务,注意它是VARCHAR2类型的,要写在单引号中,另外注意单引号中的分号。
next_date指明了当你把job submit到job队列中后这个job什么时候开始第一次执行,如果是SYSDATE,那么说明当job一被提交到job队列中就立刻开始第一次执行。
INTERVAL的类型是VARCHAR2,它在每次job将要执行之前被重新计算,计算得到的结果会被赋给next_date,指明了job下一次被执行的时间。下面是几个interval的例子:

	TRUNC(SYSDATE+1)                       每天的零点
	TRUNC(SYSDATE+7)                       每过七天后的第一个零点
	NEXT_DAY(TRUNC(SYSDATE), 'SUNDAY')     每个星期天的零点
	TRUNC(SYSDATE+1)+6/24                  每天的早上六点
	SYSDATE+30/1440                        每三十分钟
	SYSDATE+1/(24*60)                      每一分钟

如果要改变一个job的属性,可以用DBMS_JOB.CHANGE这个方法,如下所示:

1
2
3
4
5
6
7
8
9
BEGIN
    DBMS_JOB.CHANGE (
        job         => 70,
        what        => 'SYSTEM.INSERTDATE;',
        next_date   => SYSDATE,
        INTERVAL    => 'SYSDATE+0.5/(24*60)'
    );
    COMMIT;
END;

其中what, next_date, interval可以是null, 表示延用以前设定的值。

如果想让一个你设定好定时执行的时job临时停止执行,可以使用DBMS_JOB.BROKEN这个方法,它可以设定job的broken标记。如下例所示,把id为72的job的状态为broken,这个它就永远不会再执行了。

1
2
3
4
5
6
7
8
BEGIN
    DBMS_JOB.BROKEN (
        job       => 72,
        broken    => TRUE,
        next_date => SYSDATE
    );
    COMMIT;
END;

想要把一个job从job队列中移除(相当于删除它),可以用DBMS_JOB.REMOVE方法,如下所示:

1
2
3
4
BEGIN
    DBMS_JOB.REMOVE(72);
    COMMIT;
END;

如果一个job的预定执行时间还没有到,而你想让它立刻执行,那么你可以用DBMS_JOB.RUN方法,它甚至可以让状态为broken的job立刻执行,如下所示:

1
2
3
BEGIN
    DBMS_JOB.RUN(71);
END;

查询job队列中有哪些job可以用下面的语句,注意要想对dba_jobs做查询,用户要有在SYS.DBA_JOBS上SELECT的权限。

1
SELECT   * FROM dba_jobs;

同样oracle也提供了一个view可以查看有哪些job是正在运行中的,如下:

1
SELECT * FROM dba_jobs_running;

重置元素的CSS样式来解决浏览器的不兼容性

作者:admin 时间:12.21.2009 类别:CSS

我们知道,不同的浏览器显示同一个网页总会或多或少有些差异,事实上所有的浏览器都是不一样的,其实大家如果可以想到,不同的浏览器是由不同的公司,不同的人,不同的开发工具,不同的语言来写出来的,那大家都可以理解这些差异了。一个段落标记p在不同的浏览器中它的默认margin、padding和font-size分别是多少?如果你研究一下你会很吃惊的,因为不同的浏览器相差很大。要处理这些浏览器间的差异,你可以使用CSS reset style来重置HTML元素到一个统一的初始样式,然后在此基础上进行定制。
早期人们为了对付浏览器间margin、padding和border的差异,我们经常能看到下面这个CSS规则:

1
2
3
4
5
* {
    margin: 0;
    padding: 0;
    border: 0;
}

这条规则对每一个元素都要设定其样式,所以它对浏览器的性能影响比较大。随着人们进一步地研究讨论,Eric Meyer和其它一些CSS牛人创建了一套更完整,效果更好的CSS reset style:

1
2
3
4
5
6
7
8
9
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
39
40
41
42
43
44
45
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li, fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
    margin: 0;
    padding: 0;
    border: 0;
    outline: 0;
    font-weight: inherit;
    font-style: inherit;
    font-size: 100%;
    font-family: inherit;
    vertical-align: baseline;
}
/* remember to define focus styles! */
:focus {
    outline: 0;
}
body {
    line-height: 1;
    color: black;
    background: white;
}
ol, ul {
    list-style: none;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
    border-collapse: separate;
    border-spacing: 0;
}
caption, th, td {
    text-align: left;
    font-weight: normal;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: "";
}
blockquote, q {
    quotes: "" "";
}

如果你想要进一步了解Eric Meyer的CSS reset style,可以点击这里

利用Google的jsapi确定客户端所在的位置

作者:admin 时间:12.20.2009 类别:Javascript

Google的jsapi提供了许多有用的功能,其中有一个就是对客户端的检测,用很简单的几句Javascript就可以确定浏览者的地理位置,从而可以进一步做有针对性的处理。下面是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>Google API Test</title>
</head>
<body>

<script src="http://www.google.com/jsapi" language="javascript"></script>
<script language="javascript">
    if (google.loader.ClientLocation != null) {
        document.write("您的位置是: " + google.loader.ClientLocation.address.city
        + "," + google.loader.ClientLocation.address.region);
    } else {
        document.write("Google无法确定你的位置");
    }
</script>
</body>
</html>

打开上面的网页,我得到的结果是:
您的位置是: Xi'an,Shaanxi

使用jQuery提升链接在IE中的显示效果

作者:admin 时间:12.18.2009 类别:Javascript, jQuery

在平时浏览网页时,我们免不了要天天点击链接,在点击链接时我想大家都能看到在链接周围那条点点组成的边框吧,如果你点了这个链接而这个链接把你带到了另外一个页面还好,如果它只是想触发一个事件而不把你带到另外一个页面,那么这个点点连成的四四方方的边框就一直显示在那里,看上去真是好丑。当然如果你很幸运地一直在使用一个对CSS支持的比较好的浏览器(比如我天天在用的Firefox),那么你可以用很简单的一条CSS规则就可以去掉这个难看的框框:

1
2
3
a:focus, a:active {
    outline:none;
}

如果你因为各种原因很不幸地还在使用IE 6或者更早的浏览器(有这样的人么?),那么你可以利用jQuery轻松地帮你解决这个问题:

1
2
3
$("a").click(function() {
    $(this).blur();
});

上面的代码会在你点击链接之后移除那个框框,当然在你点击链接的时候这个框框还是会出现的,如果你想要在点击的时候这个框框也不出现,那么你可以稍微修改一下上面的代码,把click事件变成focus事件,如下:

1
2
3
$("a").focus(function() {
    $(this).blur();
});

希望这个对您有用:-)

Ruby语言中的Enumerable::inject方法

作者:admin 时间:12.18.2009 类别:Ruby & Rails

在使用一组数据的过程中(比如说数组),我们可能经常需要遍历其中的每一个元素,拿着每一个元素做些计算并收集这些计算结果,比如像下面这个数组:

1
nums = [1, 3, 5, 7]

如果你想计算数组中所有元素的和,那么我们可以使用each方法,像下面这样:

1
2
sum = 0
nums.each { |n| sum += n }

这样子做是可以正常工作的,但是ruby提供了更灵活的inject方法,点这里查看(Enumerable::inject

1
sum = nums.inject(0) { |x,n| x+n }

上面这做对代码也可以计算出同样的值,但是它是用inject方法。Inject是通过一个accumulator来完成收集值的过程的,在上面代码中accumulator是x。inject的每一步中,上一次block执行的结果会被赋值给下一次block执行时的accumulator。在这里我们是把accumulator的初始值设定成了0,每一步中当前遍历的元素的值被加到了accumulator上。

如果省略了inject方法的参数,那么accumulator的初始值则是数组中的第一个元素,紧接着的遍历过程则从数组中第二个元素开始(下标为1),比如:

1
sum = nums.inject { |x,n| x+n }

它和下面代码完成的事情是一样的:

1
2
sum = nums[0]
nums[1..-1].each { |n| sum += n }

我们再看一个例子,假设我们有五个名子组成的数组:

1
names = ["edde", "rita", "guapo", "andy", "ash"]

下面的代码:

1
string = names.inject("") { |x,n| x << "#{n} " }

将会输出:

1
"edde rita guapo andy ash "

当然你也可以通过这样的代码来得到同样的结果:

1
2
string = ""
names.each { |n| string << "#{n} "}

这里有一点请大家记住,在inject的每一步里你可以做任何事情,或者说的更明确些你可以做非常复杂的事情,比如让我们上面的例子变得稍微复杂一些,我们想让每个人名首字母大写,后面接着一个逗号,人名和人名之间用空格分开,当然最后一个人名之后不需要再加任何字符,用我们熟悉的each方法,我们可以这样做:

1
2
3
4
5
string = ""
names.each do |n|
    name = n.length > 4 ? n.capitalize : n
    n == names.last ? string << name : string << "#{name}, "
end

如果用inject方法,可以像下面这样:

1
2
3
4
string = names.inject("") do |x,n|
  name = n.length > 4 ? n.capitalize : n
  n == names.last ? x << name : x << "#{name}, "
end

上面两段代码都会输入相同的结果:

1
"Edde, Rita, Guapo, Andy, Ash"