Google

星期二, 四月 29, 2008

TRegExpr正则表达式

DELPHi中的REGEXPR
[ 2006-03-29 11:33:46 am | Author: Admin ]
其实这个Pascal单元我在几个论坛上面都推荐过,也是我唯一会用的DELPHI下面的正则表达式实现。
  正则表达式是个极其繁琐和强大的东西,小生才疏学浅,也不准备写正则表达式的教程,借着对这个单元的介绍,会有一些浅显且有用的例子。
  首先介绍的是这个单元的主角:TRegExpr类,这个类包括很多成员,这里仅简单的介绍一下一般匹配的过程。下面是一段在文本中提取邮件地址的代码:

Procedure GetName(TextToCheck:String;aList:TStringList);
Var
myExpr: TRegExpr;
begin
myExpr := TRegExpr.Create;
Try
myExpr.Expression := 'name="(.*?)"';
if myExpr.Exec(TextToCheck) then
repeat
aList.Add(myExpr.Match[1]);
until not MyExpr.ExecNext;
finally
myExpr.Free;
end;
end;

  下面对这段代码进行一点简要的说明.
  首先是myExpr.Expression := 'name="(.*?)"';这个语句用以匹配name="XXXXX"形式的字符串。
“.*?”是很常见的一段,表示对任意字符串的“非贪婪匹配”,代表符合匹配条件的最短字符串,关于贪婪非贪婪的问题,会在后面说明。
  括号表示对这段文字的引用,匹配中出现符合该模式的字符串将会存储在TRegExpr的Match数组中。
  接下来是if myExpr.Exec(TextToChceck)这一句,这一语句就是开始利用上文提到的正则表达式对TextToCheck进行匹配。Exec方法有三个重载:
function Exec (const AInputString : AnsiString) : boolean; //对AInputString参数进行匹配
function Exec : boolean; overload; //对InputString成员进行匹配
function Exec (AOffset: integer) : boolean; overload; //对InputString成员,从AOffset位置开始进行匹配
  该方法返回一个布尔型的值,如果为真,则表明InputString中包含表达式所匹配的模式,例如'Name="Hello.Gif"'作为参数,就会返回True。

  接下来的语句中出现的myExpr.Match[1],则用以取出本次匹配结果

  最后的ExecNext其实是使用了上面提到的第三个重载,用来对重复出现的字符串进行连续匹配,返回结果的含义同Exec相同

  接下来谈谈Match成员,其中Match[0]表示整个表达式的匹配结果,之后的数组元素则代表括号中的匹配结果,元素编号按照括号从左到右的顺序递增,嵌套括号则以从内向外的顺序递增。例如一个简单的对E-Mail地址的匹配:
Quotes From ???
输入字符串:'"dirt@sina.com","v@d2g.com"'
正则表达式:'"((.*?)@(.*?))",'
执行结果如下:
0 "dirt@sina.com",
1 dirt@sina.com
2 dirt
3 sina.com
  从中即可看出Match数组中的结果排列顺序。


  而上文中出现的.*?经常用于不很严谨的场合,例如前面用到的邮件地址提取,有人就写出几百字符的的验证表达式。其中“.”表示任意单个字符,“*” 表示前面的字符(串)至少出现一次,而'?'在这里就是非贪婪限定符,举一个简单的例子:"aaa""bbb",这样一个字符串,如果用'" (.*?)"'进行匹配,则Match[1]的内容就是'aaa',如果去掉了其中的'?',则Match[1]就变成了'aaa""bbb',这就可以 看出贪婪和非贪婪的区别。

  一个基本的匹配过程就到这里,有空会再继续写一些其他的相关内容,敬请丢砖

转自:http://www.delphibbs.com/keylife/iblog_show.asp?xid=13902
作者:coolbaby

TRegExpr是正则表达式在delphi中的一个很好的实现。
是一个单独的单元,使用时直接引用即可。还自带了几个sample。

对其中的SelfTest例子加了几行注释如下:
{ basic tests }

r := TRegExpr.Create;

r.Expression := '[A-Z]';
r.Exec ('234578923457823659GHJK38');
Check (0, 19, 1);
//?在此处表示让*处于非贪婪模式
r.Expression := '[A-Z]*?';
r.Exec ('234578923457823659ARTZU38');
Check (0, 1, 0);

r.Expression := '[A-Z]+';
r.Exec ('234578923457823659ARTZU38');
Check (0, 19, 5);
//和上面的+方式,功能一样
r.Expression := '[A-Z][A-Z]*';
r.Exec ('234578923457823659ARTZU38');
Check (0, 19, 5);
//?这里表示匹配[A-Z]0次或者一次
r.Expression := '[A-Z][A-Z]?';
r.Exec ('234578923457823659ARTZU38');
Check (0, 19, 2);
// \d代表数字,^代表非,总得来说就是一个或者多个非数字字符
r.Expression := '[^\d]+';
r.Exec ('234578923457823659ARTZU38');
Check (0, 19, 5);

半小时精通正则表达式
作者:Web应用网 来源:Web应用网

跟我学正则表达式!
想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验.
开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明

"^The": 开头一定要有"The"字符串;
"of despair$": 结尾一定要有"of despair" 的字符串;

那么,
"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配
"notice": 匹配包含notice的字符串

你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边
接着,说说 '*', '+',和 '?',
他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:
"zero or more"相当于{0,},
"one or more"相当于{1,},
"zero or one."相当于{0,1}, 这里是一些例子:

"ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等);
"ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.);
"ab?":和ab{0,1}同义,可以没有或者只有一个b;
"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
要点, '*', '+',和 '?'只管它前面那个字符.

你也可以在大括号里面限制字符出现的个数,比如

"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb");
"ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.);
"ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").

现在我们把一定几个字符放到小括号里,比如:
"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."

还有一个字符 '│', 相当于OR 操作:

"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c
的字符串;

一个点('.')可以代表所有的单一字符,不包括"\n"
如果,要匹配包括"\n"在内的所有单个字符,怎么办?
对了,用'[\n.]'这种模式.

"a.[0-9]": 一个a加一个字符再加一个0到9的数字
"^.{3}$": 三个任意字符结尾 .


中括号括住的内容只匹配一个单一的字符

"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
"^[a-zA-Z]": 匹配以大小写字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串

你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 "%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串.
要点:^用在中括号开头的时候,就表示排除括号里的字符
为了PHP能够解释,你必须在这些字符面前后加'',并且将一些字符转义.
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质 "[*\+?{}.]"匹配含有这些字符的字符串.
还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效.
看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,而且n总是小于m. 这样,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"将匹配 "pvpppppp"中的前五个p
下面说说以\开头的
\b 书上说他是用来匹配一个单词边界,就是...比如've\b',可以匹配love里的ve而不匹配very里有ve
\B 正好和上面的\b相反.例子我就不举了
.....突然想起来....可以到http://www.phpv.net/article.php/251 看看其它用\ 开头的语法

好,我们来做个应用:
如何构建一个模式来匹配 货币数量 的输入
构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式:
^[1-9][0-9]*$
这是所变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法:
^(0│[1-9][0-9]*)$
"只有0和不以0开头的数字与之匹配",我们也可以允许一个负号在数字之前:
^(0│-?[1-9][0-9]*)$
这就是: "0 或者 一个以0开头 且可能 有一个负号在前面的数字." 好了,现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分:
^[0-9]+(\.[0-9]+)?$
这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗)
^[0-9]+(\.[0-9]{2})?$
我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成:
^[0-9]+(\.[0-9]{1,2})?$
这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示:
^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$
不要忘记 '+' 可以被 '*' 替代 如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ’\’ 在php字符串中可能会出现错误 (很普遍的错误).
现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.

再来一个:
构造检查email的正则表达式
在一个完整的email地址中有三个部分:
1. 用户名 (在 '@' 左边的一切),
2.'@',
3. 服务器名(就是剩下那部分).
用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), and 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外.
现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在. 我们把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$
上面的意思就是说: "以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串."
简单化一点, 我们可以用 eregi()取代 ereg().eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:
^[a-z0-9-]+(\.[a-z0-9-]+)*$
好. 现在只需要用”@”把两部分连接:
^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

这就是完整的email认证匹配模式了,只需要调用
eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)
就可以得到是否为email了
正则表达式的其他用法
提取字符串
ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要:
ereg("([^\\/]*)$", $pathOrUrl, $regs);
echo $regs[1];
高级的代换
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:
ereg_replace("[ \n\r\t]+", ",", trim($str));
最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下.
"^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"
如果能方便的读懂,那这篇文章的目的就达到了.

JScript 和 VBScript 正则表达式 的语法规则

一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

这里有一些可能会遇到的正则表达式示例:



JScript VBScript 匹配
/^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
/\d-\d/ "\d-\d" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/<(.*)>.*<\/>/ "<(.*)>.*<\/>" 匹配一个 HTML 标记。

下表是元字符及其在正则表达式上下文中的行为的一个完整列表:

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 。
n 是一个非负整数。匹配确定的 n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o' 等价于 'o+'。'o' 则等价于 'o*'。
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o" 将匹配 "fooooood" 中的前三个 o。'o' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, , , ) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 … 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (©)。

2005-5-23 10:26:21 piao40993470 发表评论。
所有中文(不包括标点):
([\xB0-\xF7][\xA1-\xFE])+
所有GB2312-80编码
([\xA1-\xFE][\xA1-\xFE])+
所有中文空格
(\xA1\xA1)+

英文标点:[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]

2005-5-23 10:32:03 piao40993470 发表评论。
补充一下:
在delphi下使用TPerlRegEx也是不错的

http://hi.baidu.com/program8/blog/item/31800b0801b32030e824885f.html

标签: , , ,

星期一, 四月 28, 2008

什么是 Kohana? Kohana 与 CodeIgniter 的区别?

作者:沧蓝 / Fred Wu

Kohana 是一款基于 CodeIgniter 的 PHP5 框架,其与 CI 最大的区别便是 Kohana 完全采用 PHP5。

2007 年 6 月 1 日,CI 社区用户 Todd Wilson (Tido) 发布了 BlueFlame 1.0 的帖子。BlueFlame 1.0 正式发布,团队成员有九人,其中包括 Todd(原团队 lead developer)、现在 Kohana 的 lead developer、以及本人。该发布贴引起了 CI 社区用户的广泛关注。然而由于 BlueFlame 团队事前没有与 CodeIgniter 团队进行沟通,导致一些理解上的小插曲,包括 Rick (CI 的祖父)要求 BlueFlame 团队停止使用 CI 的社区资源来发布 BlueFlame 相关的信息,以及对 BlueFlame 源代码中的授权部分表示疑义。

最终通过 BlueFlame 与 CodeIgniter 团队的协调沟通,双方的小小误解很快便被解化。Rick 在此期间提到 BlueFlame 名称的潜在版权问题,于是 BlueFlame 几天后便正式更名为 Kohana,并注册了现在的官方网站:kohanaphp.com

在 BlueFlame 1.0 之后,Kohana 团队一直没有发布新的版本,之后整个项目一度处于僵化期。尽管如此,trac 上还是有更新进度。在 Todd Wilson “消失”了一阵子后,成员之一 Woody Gilk (Shadow Hand) 接下重任,担当团队 leader。

之后 Woody 联络本人,希望本人承担 Kohana 官方网站以及 logo 的设计制作。论坛上仍然可以找到当时我发的帖子(内有网站以及 logo 的草案)。可惜由于时间的因素,我最终没有将设计草案转化为 HTML。可喜的是,Geert De Deckere 之后设计了一个相当出色的方案,这也就是大家现在所见到的 Kohana 的官方网站。 :)

2007 年 11 月,经过了团队成员以及社区用户的努力,Kohana 终于发布了 2.0 版本。

下面我来翻译一下 Wikipedia 对于 Kohana 的介绍。

历史

Kohana 是基于 CodeIgniter PHP 框架开发的。

开发 Kohana 最主要的原因是 CI 对于 bug 的修复和处理用户提交的建议所需的时间过长。许多 bug 在用户报告后很久才会纳入到新版本中,甚至一些 bug 一直没有被纳入。另外,由于 EllisLab 是 CodeIgniter 唯一开发者,部分用户对于框架的开放性产生异议,他们希望框架可以更自由开放,从而使社区对框架的发展产生一定的影响。

Kohana 与 CodeIgniter 的区别


  • 严谨的 PHP5 面向对象编程。优势:可见性保护、自动类装载、超载、接口类、抽象类以及单件类。
  • 延续 CodeIgniter 的设计模式。CodeIgniter 的用户能迅速的理解 Kohana 的架构和设计模式。
  • 社区向,而非商业向。Kohana 是一款基于社区的作品。Kohana 的开发者们来自世界各地,有着各自的天赋。这使得开发速度得以提高,并在短时间内提供bug修复以及反馈用户提出的建议。
  • GET、POST、COOKIE 以及 SESSION 数组得到改进。Kohana 不对全局数据做读取限制,但依旧提供与 CodeIgniter 相同的数据过滤以及 XSS 防护。
  • 层叠式资源、模块以及类继承。控制器、数据模型、库、助手以及视图均能够在系统中的任何地方进行载入。程序的配置选项可被继承或覆盖。
  • 无命名空间的冲突。类均添加了如“_Controller”之类的后缀,从而使得用户的控制器和数据模型可被同时同地装载。
  • 真正的自动类装载。这包括库、控制器、数据模型以及助手。与 CodeIgniter 不同,Kohana 的自动装载是真正意义上的动态装载,而并非预先装载。
  • 助手为静态类,而非函数。例如,在 CI 中使用的 form_open(),在 Kohana 中为 form::open()。
  • 库驱动以及 API 的一致性。库能够使用不同的驱动来处理不同的外部 API。例如,session 的储存有数据库、cookie 和 native 几种,但它们均使用相同的接口。这使得库可以不断的添加新的驱动,但不会影响到 API 的一致性。
  • 强大的事件处理器。Kohana 的事件可被动态的添加、替换或删除。这使得用户能在 Kohana 执行的过程中动态做更改,而不影响原有的系统代码。


特性


  • 高安全性
  • 轻量级代码
  • 学习周期短
  • MVC 设计模式
  • 100% UTF-8 兼容
  • 松弛耦合架构
  • 易扩展性


技术


  • 严谨的 PHP5 面向对象编程
  • 用 SQL 助手实现简单的数据库抽象层
  • 多 session 驱动(native、数据库、cookie)
  • 动态事件处理器


==============================

最后更新:2007 年 12 月 03 日

http://codeigniter.org.cn/forums/thread-91-1-1.html

标签: , , , , , ,

Notes on Choosing a PHP Framework: A Quick Comparison of CodeIgniter and Kohana

When I was reading through my subscribed feeds I came across this post: Notes on Choosing a PHP Framework: A Comparison of CakePHP and the Zend Framework by Chad Kieffer.

Chad has done a great job comparing the two frameworks that he’s interested in. That inspired me to write something up for the frameworks that I prefer and use. :)

I began hunting for PHP frameworks ever since Ruby on Rails hit the street. Coincidentally one of the first PHP frameworks I played with was CakePHP. At that time CakePHP’s documentation was nearly non-existent so I had to seek for an alternative. I did a lot of searches, and researches, and finally I was happy to see CodeIgniter. Its user guide was what impressed me the most, I am sure many of the fellow CI users would agree with me on this one. Because of the excellent documentation, I was able to start working on projects right after I spent a few hours on the user guide! Developing apps on CI was such a breeze! Today, I develop web applications in CodeIgniter, Kohana and Zend Framework. If you want to find out how to use Zend Framework components with CI or Kohana, please read my previous blog entry: Using Zend Framework with CodeIgniter.

From version 1.2 when I first started coding on CI, to the newly released version 1.6.1 it sure is a long way. CodeIgniter has progressed well and gained many web developers’ trust, despite a few glitches. One of which was the spawn of the fork: Kohana.

CodeIgniter had some low periods where developers were all focused on pushing out new releases of ExpressionEngine, their commercial blogging/cms product. Some of the users on the CI forum got frustrated because their bug reports and feature requests were ignored. As a result of that, BlueFlame was born, and later renamed to Kohana.

Kohana is relatively unknown to the public. In fact, most of the Kohana users are ex-CI users or users that uses both CI and Kohana (like myself). According to the Kohana homepage and Wikipedia, the differences between Kohana and CodeIgniter are:

  1. Strict PHP5 OOP. Offers many benefits: visibility protection, automatic class loading, overloading, interfaces, abstracts, and singletons.
  2. Kohana has joined the GoPHP5 initiative. All releases from 2.2 on will conform with this project.
  3. Continues CodeIgniter design patterns. Anyone who has used CodeIgniter will quickly understand Kohana’s structure and design patterns.
  4. Community, not company, driven. Kohana is driven by community discussion, ideas, and code. Kohana developers are from all around the world, each with their own talents. This allows a rapid and flexible development cycle that can respond to bugs and requests within hours, instead of days or months.
  5. GET, POST, COOKIE, and SESSION arrays all work as expected. Kohana does not limit your access to global data, but offers the same filtering and XSS protection that CodeIgniter does.
  6. Cascading resources, modules, and inheritance. Controllers, models, libraries, helpers, and views can be loaded from any location within your system, application, or module paths. Configuration options are inherited and can by dynamically overwritten by each application.
  7. No namespace conflicts. Class suffixes, like _Controller, are used to prevent namespace conflicts. This allows a User’s controller and Users model to both be loaded at the same time.
  8. True auto-loading of classes. This includes libraries, controllers, models, and helpers. This is not pre-loading, but true dynamic loading of classes, as they are requested.
  9. Helpers are static classes, not functions. For example, instead of using form_open(), you would use form::open().
  10. Library drivers and API consistency. Libraries can use different “drivers” to handle different external APIs transparently. For example, multiple session storage options are available (database, cookie, and native), but the same interface is used for all of them. This allows new drivers to be developed for existing libraries, which keeps the API consistent and transparent.
  11. Powerful event handler. Kohana events can by dynamically added to, replaced, or even removed completely. This allows many changes to Kohana execution process, without modification to existing system code.

As you can see, whilst maintaining a certain level of similarity to CodeIgniter, Kohana does offer some advantages (at the same time, some disadvantages). Let’s take a look at a few quick comparisons. Grading scale: Limited <>

Feature Comparison of CodeIgniter and Kohana
Feature CodeIgniter 1.6.1 Kohana 2.1.1 Notes
License Apache/BSD-style new BSD Licenses are similar, although Kohana uses the new BSD license which is slightly more flexible than CI’s modified BSD license.
PHP compatibility 4.3.2+ and 5 5.1.3+ CodeIgniter supports PHP4 whilst Kohana is a stict PHP5 framework. If you are using PHP5 then Kohana offers more OOP and performance advantages. Start from version 2.2 (yet to be released), Kohana will only support PHP 5.2+.
Supported Databases MySQL (4.1+)
MySQLi
MS SQL
PostgreSQL
SQLite
Oracle
ODBC
MySQL
PostgreSQL
SQLite
CodeIgniter’s longer history ensures us a more widely available database support options than Kohana, although in the future Kohana is likely to support more databases too.
Community Forum
Wiki
Bug Tracker
Forum
Trac
IRC
CodeIgniter obviously has a much larger community and offers a wiki for community members to share tutorials and code snippets. Kohana on the other hand, has a smaller community, however the developers are actively online on the forum and IRC.
Documentation / User Guide Excellent Limited CodeIgniter is known for its excellent user guide. Kohana is in the process of improving its documentation.
Tutorial / Sample Availability Good Fair Tutorials are available on both of their forums. CodeIgniter has the advantage of having a wiki for easier navigation. Kohana on the other hand, has a dedicated tutorial page for some of the tutorials.
MVC Strict Strict Both frameworks use the same MVC approach.
Modular / HMVC Via 3rd party libraries Built in Kohana is built with HMVC in mind whilst CodeIgniter has some 3rd party libraries such as Matchbox and Modular HMVC to accomplish the same effect.
Conventions Flexible Flexible Unlike CakePHP, both of the frameworks offer flexible convensions. There are some defaults but most of them can be overwritten.
Configuration PHP files PHP files In my opinion Kohana is more configurable than CodeIgniter yet it is simpler (less clustered) to do so! Most of the Kohana configuration files are stored in the system folder, you only copy and paste the ones you actually need to modify, and modify them accordingly. CodeIgniter’s config files are all stored in the application folder.
Database Abstraction Modified ActiveRecord Modified ActiveRecord
ORM (optional)
Both frameworks use the modified ActiveRecord pattern. Kohana has an optional ORM module. CodeIgniter has some ORM and Rails-style ActiveRecord implementation avaliable via 3rd party libraries.
ACL Via 3rd party libraries Auth library (optional) Neither of the frameworks forces you to use a specific ACL mechanism. CodeIgniter does not have one built in, and Kohana has one available as an optional module.
Validation Good Good Both frameworks offer a good built in validtion layer. Kohana 2.2 is planned to have some significant improvements for the validation library.
Caching Limited Fair In my opinion both of the caching features are limited. Kohana offers a slightly more useful cache library that supports file, SQLite, APC, eAccelerator, memcache, and Xcache based caching, with tag support.
Session Good Excellent CodeIgniter 1.6 has improved its session library, but it’s still inferior to Kohana’s implementation. Kohana’s session library supports both encryption and storing session data in database.
Logging / Debugging Good Excellent Both frameworks offer very good logging and debugging mechanisms. Kohana is a little bit ahead thanks to PHP5’s native Exception class and its powerful event handlers.
Templating Native PHP Native PHP Templating is *very* easy for both frameworks. If you can skin Wordpress, then you’d have no problems at all skinning CI or Kohana. If you want though, you can still incorporate one of the 3rd party templating solutions such as Smarty.
Helpers Good Good Helpers are usually libraries that used for simple, repetitive tasks. Both frameworks offer a wide range of helpers for handling forms, URLs and dates, etc.
JavaScript / AJAX N/A N/A Both frameworks respect your choice of JavaScript / AJAX frameworks. Unlike CakePHP and Ruby on Rails, they don’t have built-in helpers for any of the JavaScript libraries. This offers more flexibility as well as the use of unobtrusive JavaScript.
Web Services Fair Fair I could be wrong but I don’t think either framework supports (or at least encourages) RESTful design…
Localization Limited Good CodeIgniter has limited i18n support whilst Kohana offers a bit more (timezone / full UTF8 layer, etc).
Unit Testing Limited None * CodeIgniter’s built in unit testing class is very limited. * Kohana as of version 2.1.1 does not have a unit testing class, however it is planned for version 2.2.

The Verdict

I had a hard time deciding which of these two I use. In the end, I chose to use both. Why? Because they each have its advantages and disadvantages.

CodeIgniter is great for small to medium sized projects, especially good for legacy servers which have PHP4 installed. The fantastic user guide made coding in CI very efficient.

Kohana is probably better for larger sized projects as well as projects that need more flexible extensions. PHP5 offers better (proper) OOP support as the foundation, plus Kohana’s several better feature implementation make it a strong competitor to its predecessor.

There is no right or wrong for which framework you use, everyone has its own taste. For me, CodeIgniter’s excellent documentation and Kohana’s strict PHP5 + easy to use are the primary reasons to choose them over say, CakePHP and Symfony. That said, CakePHP, Symfony and other frameworks are all excellent choices depending on your taste and experience. On one hand I envy the Ruby community because they obviously have the de facto framework to work with, on another hand, we have more options hey? :)

Feel free to share your opinion and experiences!

Update log:

[2008-02-23]
- Removed MS SQL support for Kohana (confirmed by Shadowhand)
- Updated cache driver description for Kohana (confirmed by Shadowhand)
- Edited unicode / UTF8 description for Kohana (confirmed by Shadowhand)

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • DZone
  • Furl
  • Live
  • Reddit
  • Slashdot
  • Spurl
  • StumbleUpon
  • Technorati
  • YahooMyWeb

标签: , , ,

CodeIgnitor: Query String URL Enhancement

Hi everybody,

I had a problem described in my last post:
http://codeigniter.com/forums/viewthread/68197/

This problem forced me to use query strings and the url I had to parse was as follows:
http://www.mysite.com/index.php?c=mycontroller&m=processAuth&auth_token=3c562b119bd387ec194ade6bab9832c4

I enabled query strings in my config file:
$config[’enable_query_strings’] = TRUE;
$config[’controller_trigger’] = ‘c’;
$config[’function_trigger’] = ‘m’;

I still had issues getting to the auth_token value.

In the end I changed some code in the Router.php file and wanted to submit the code here in case anyone else finds it useful. It makes query strings act pretty much the same as the regular CodeIgniter URLs. For example, if you had a controller like:

class myClass extends Controller {
function myFunction ($myValue) {
}
}

Normally, you could call myFunction with a value using a CodeIgniter URL:

www.mySite.com/index.php/myClass/myFunction/123456

With the changes I made to router.php, you can now call it with:

www.mySite.com/index.php?c=myClass&m=myFunction&value=123456

The way the changed code is written now, you only need the “controller_trigger” key in the query string. The other keys do not matter. The values will go into the segment array in the order they show up in the query string.

There are a few improvements that could be made but what’s there now is a good start.

I can’t seem to attach the changed Router.php file (renaming or zipping didn’t seem to matter). But I only changed the _set_route_mapping() function commenting out the following code at the top:

/*
// Are query strings enabled in the config file?
// If so, we're done since segment based URIs are not used with query strings.
if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
{
$this->set_class(trim($this->_filter_uri($_GET[$this->config->item('controller_trigger')])));

if (isset($_GET[$this->config->item('function_trigger')]))
{
$this->set_method(trim($this->_filter_uri($_GET[$this->config->item('function_trigger')])));
}

return;
}
*/

and adding the following code near the end of the function:

// check if query strings enabled
if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')]))
{
// at this point the uri_string is the query string
$keyValues = split('&', $this->uri_string);
foreach(
$keyValues as $keyValue) {
list($key, $value) = split('=', $keyValue, 2);

// just use the value and add in the order they come in
// at some point may want to utilize keys and ignore order

$value = trim($this->_filter_uri($value));

if (
$value != '')
$this->segments[] = $value;
}

}
else {

the code above goes just above:

// Explode the URI Segments. The individual segments will
// be stored in the $this->segments array.
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
{
// Filter segments for security
$val = trim($this->_filter_uri($val));

if (
$val != '')
$this->segments[] = $val;
}

}
// do not forget this bracket

make sure to add the closing bracket

Hope someone finds it useful.

http://codeigniter.com/forums/viewthread/68698/

标签: ,

关于IE下实现min-height跟max-height的方法

comment_edit.pngmin-height最简单的方法是用表格来设计:

favorite.gif











comment_edit.png在此基础上增加 min-width 效果
(测试请改变 id=”wh” 层的 height 和 width 值)
favorite.gif











comment_edit.png而对于max-height的设计就要难多了!下面是采用js的方法达到的!
max-height 在 IE6.0 的实现的具体思想是想办法获得可变层的高,宽,样式中使用expression()得到外层的高,宽。代码如下:(测试请改变 id=”wh” 层的 height 和 width 值)
favorite.gif







comment_edit.png不过上面的这种方法采用js的expression,涉及js的计算,对cpu的有一定的占用,不宜采用!建议采用其它方法!(此地以后添加!)

http://www.evetian.cn/?p=22

标签: ,

星期六, 四月 26, 2008

SUN即将完成JAVA语言全部开源工作

SUN公司正在加紧推动JAVA在Linux平台下的完全开源工作,JAVA平台下的最后一些版权问题将在近期解决。  

  如果JAVA能做到完全开源,那么将更容易在Linux平台下进行包装分发。为配合这项行动,SUN正在与Linux厂商进行商谈,为OpenSUSE,Ubuntu以及Fedora提供一个新版的OpenJDK。  

  OpenJDK基于J2SE,开源工作始于2006年11月,其中的一些组成部分,例如加密库,图形库和一些SNMP管理代码仍然不能提供基于GNU通用许可协议的版本。这些组建占到了总平台的4%左右。  

  据SUN表示,“在过去的一年中,我们已经解决了大部分组件的版权问题,但是JAVA的声音引擎和SNMP代码部分仍然有大量的工作要做”预计全部开源可以在今年年内完成。  

  一旦基于Linux系统的JAVA可以百分百开源,那么Ubuntu及其他Linux系统就可以提供完全开源版的JAVA开发平台。对于Linux的开发者来说,现在正缺少一个开源版的JAVA平台。

http://linux.chinaunix.net/news/2008/04/25/995589.shtml

标签: , , , , , , , ,

我的家乡,红石

Google Earth中tdr拍摄的鸡冠砬子山

http://www.redstonelake.cn/

标签:

太贵了

本来想支持一下开源事业,在shopit上买点东西。预订了2件T-Shirt,1顶帽子,2套光盘,一共是54镑不到的样子,不过一看运费40多镑,UPS,太贵了吧。订单先取消了吧。等我有钱了再去支持一下吧。

标签:

Ubuntu 8.04的活动目录:Likewise

据Canonical公司的最新消息表明,Ubuntu 8.04 LTS的进展非常顺利,正式版将于两天后如期发布。这是长久期待的结束,同时,也是另一个时代的开始。
今天,我向大家介绍Ubuntu 8.04中独有的组件:Likewise。


—–
如果你还有印象的话,你应该还记得Ubuntu 8.04中,将新增一个组件,使得系统有能力与Microsoft活动目录相连接。
这个组件是:Likewise,不过默认情况下它未安装,需要的朋友可以在终端下自行安装,分别有CLI和GUI版本可以安装:
sudo apt-get install likewise-open likewise-open-gui
安装完成后,Ubuntu 8.04会启动Likewise-open的daemon,并加入系统启动daemon中(/etc/rc2.d)。
那么,如何加入一个Microsoft的域呢?也非常简单:
命令行方法
在终端下输入以下指令,其中your.domain替代为域的名称, username则是你的用户名
sudo domainjoin-cli join your.domain username
图形方法
在终端下输入sudo domainjoin-gui,然后就会跳出一个图形对话框,相信你知道怎么使用了:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://pic.yupoo.com/tualatrix/38317570da08/0r38yvyl.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">
由于本人并没有一个Microsoft的域可供测试,所以我只能向大家展示到这个步骤了。
据国外Ubuntu用户反应,通过Likewise,他的Ubuntu不仅得以非常方便地加入Microsoft的域,而且识别出了DFS文件系统。附加SMB的话,还能设定网络打印机。更棒的是,他已经有能力让Evolution使用Exchange邮箱了。参见:
Ubuntu 8.04 Active Directory Integration w/ Likewise Open
如果有朋友能进行更深一步的测试,请让大家知道更详尽的情况。
我们很高兴地见到Ubuntu不仅越来越易用,而且支持度越来越好,无论是软件,还是硬件方面。

http://linux.chinaunix.net/news/2008/04/23/994717.shtml

标签: ,

Ubuntu下安装Avast图形界面杀毒软件图文详解

最近咖啡的洗衣店进入了旺季,开始忙碌起来了,有很多资讯很想与大家分享,但是无耐的是没有时间,今天利用一些仅余的时间将咖啡认为还不错的防毒软件介绍给大家,希望能对大家有些帮助,现在就跟著咖啡一起来安装Avast antivirus for ubuntu。



AVAST 是一个著名防毒软体公司,Avast HomeEdition是家庭与非商业用途的版本,Avast Linux版本跟WINDOWS版本的內核是一样的,如果你是安装了包含windows多系统的使用者来说,这无疑的是个很好的防毒杀毒软件,虽然 Linux不太容易中毒,但是你可以在Linux系统下杀除windows下的每个一个有害的病毒,(如果你看完所有刚上档的电影,也听完一些流行歌曲, 真的闲著找不到事情可做时,不妨将Avast拿出来扫扫看你的电脑),Avast更值得一提的是,它是个免费的软件,你只需要到网站上去注册就 可以得到安装的序号,并可无限期的下载更新病毒码。安装方法:
1.首先你必须先上avast的网站免费注册,Avast会根据你注册时用的email寄发给你安装的序号,速度很快几乎注册完成就收到信件了。
注册的网址 选择中文语言网页
http://www.avast.com/cns/home-registration.php
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image001.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">
如果是你新注册的用户,选择第一项
接着填写注册所需的相关资讯,特别要注意的是邮箱必须要正确,否则你无法收到安装序号。
如果你完成了注册,那麽便可以开始下载软件,你可以直接到官方网站下载

下载网址:
http://www.avast.com/cns/programs.html
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image002.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">
安装

sudo dpkg -i avast4workstation_1.0.7-2_i386.deb
在应用程序里显示快捷图示
cd /usr/lib/avast4workstation/share/avast/desktop
sudo ./install-desktop-entries.sh install

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image003.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">

第一次执行时,Avast会要求你输入安装序号,去收email 看看你许你的序号已经寄到了

在这里填入你的序号
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image004.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">

开启之后使用者介面如下图:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image005.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">

第一个优先要处理的那就是更新到最新的病毒库
按下 Update Database
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image006.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">


接着你就可以设置需要扫瞄的区域,如果你是包含windows的双系统,你可以选择第三项Selected Folders ,并加入windows所属的区域,如咖啡会加入 /media:/hda1 (Windows 的C盘)
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.ownlinux.cn/wp-content/uploads/2008/04/avast/image007.jpg');}" onmousewheel="return imgzoom(this);" alt="" border="0">

其它的设置那就等着你去发觉了。

http://linux.chinaunix.net/news/2008/04/18/993117.shtml

标签: ,

22项Windows或Mac不能而Linux可以的事

1. Upgrade to the newest version legally and without paying money
1。合法升级到最新版本却不花一分钱
2. Have the latest version of the operating system run faster than the previous version on the same hardware
2。同一个硬件平台上最新的操作系统却比老的更快。

3. Easily install and run different graphical interfaces if I don't like the default setup
3。如果你不喜欢默认的桌面环境,可以非常容易的自行安装其他的界面。
4. Install twenty programs with one command
4。一个命令就可以安装二十个程序。 5. Have the system automatically update all my installed programs for me.
5。让系统自动为我所安装的软件更新。
6. Install the same copy of my OS (Ubuntu) on multiple computers without worrying about license restrictions or activation keys
6。可以在N台机器上安装同一份OS拷贝而无须担心协议限制或激活码。
7. Give away copies of the operating system and other programs that run on it without breaking any laws, governmental or ethical or moral, because it was all intended to be used this way
7。可以自由分发该操作系统及其他运行其上的软件而不会违犯法律,政治或伦理道德,因为他本身就提倡这么做的。
8. Have full control over my computer hardware and know that there are no secret back doors in my software, put there by malicious software companies or governments
8。完全控制我的电脑硬件,并可知晓我的软件中没有什么被政府或者某某公司蓄意安放的秘密后门。
9. Run without using a virus scanner, adware/spyware protection, and not reboot my computer for months, even when I do keep up with all of the latest security updates
9。可以裸奔(无杀毒软件,反广告/间谍防护软件),以及可以数月不用重启机器,我甚至一直在更新着安全补丁。
10. Run my computer without needing to defragment my hard drive, ever
10。从来不用磁盘碎片整理。
11. Try out software, decide I don't like it, uninstall it, and know that it didn't leave little bits of stuff in a registry that can build up and slow down my machine
11。尝试软件,觉得不喜欢,就删掉他,而且知道他不会在什么注册表里留下一些垃圾可能导致把我的系统搞慢。
12. Make a major mistake that requires a complete reinstallation and be able to do it in less than an hour, because I put all of my data on a separate partition from the operating system and program files
12。犯了重大错误而导致全新重装系统,也不过花去了1小时不到的时间,因为我把我的数据放在了独立于操作系统和程序的分区。
13. Boot into a desktop with flash and effects as cool as Windows Vista on a three year old computer...in less than 40 seconds, including the time it takes me to type my username and password to login
13。在一台3岁的老电脑上可以有如vista那样超酷的登录效果...少于40秒,这已经是将我输入用户名和密码并登录计算在内了。
14. Customize anything I want, legally, including my favorite programs. I can even track down the software developers to ask them questions, contribute ideas, and get involved in the actual design/software writing process if I want to
14。合法自定义任何我想要的东西,包括我最喜爱的程序。我甚至可以跟踪软件开发者并向他们问问题,提意见,如果我愿意的话,也可以参与到真正的软件设计和开发进程中去。
15. Have 4+ word processor windows open working on papers, listen to music, play with flashy desktop effects, have contact with a largely happy community and have firefox, instant messaging, and email clients all open at the same time, without ever having had to beg someone for a code to make my os work, and without the system running so slow it is useless
15。超过4个的文字处理窗口,听音乐,玩超酷的桌面效果,联系一个大型的社区,并同时运行着firefox,即时通讯以及email客户端,而不必求爷爷告奶奶的要什么令我的系统可以运作的代码,而不会把系统变慢。
16. Use the command "dpkg --get-selections > pkg.list" to make a full, detailed list of all software I have installed, backup my /etc and /home directories on a separate partition, and you are able to recover your system any time, easily
16。使用"dpkg --get-selections > pkg.list"命令来获得一个完整详尽的已装软件列表,备份我的/etc和/home文件夹到一个独立分区,然后你就可以随时恢复你的系统了,而且超简单。
17. Run multiple desktops simultaneously, or even allow multiple users to log in and use the computer simultaneously
17。同时运行多个桌面,甚至可以让多用户同时登录并使用该机器。
18. Resize a hard disk partition without having to delete it and without losing the data on it
18。无损调整分区大小而不用担心会丢失数据。(译者注:应该是LVM)
19. Use the same hardware for more than 5 years before it really needs to be replaced...I have some hardware that is nearly 10 years old, running Linux, and still useful
19。硬件可以使用超过五年而无须更换...我甚至有一些硬件都超过10年的历史了,还依然健在。
20. Browse the web while the OS is being installed!
20。可以在OS安装的同时浏览网页!
21. Use almost any hardware and have a driver for it included with the operating system...eliminating the need to scour the internet to find the hardware manufacturer's website to locate one
21。使用几乎所有的硬件,因为系统已经自带了驱动...而不必再去硬件供应商的主页上去苦苦搜寻。
22. Get the source code for almost anything, including the OS kernel and most of my applications
22。可以任意获得源代码,包括OS内核以及我的大多数应用程序。

http://linux.chinaunix.net/news/2008/04/25/995585.shtml

标签: , ,

xf86-video-intel 2.3.0正式发布

Intel可能是业界开发驱动最积极的硬件厂商之一了(另外一个是nVIDIA),作为最流行的集成显卡,Intel在Win/Lin两个平台均保持比较好的驱动质量。
Linux驱动方面,据上一个里程碑2.2.0至今已有半年了,Intel不断努力,现在又一个里程碑:2.3.0已经正式发布了。


xf86-video-intel2.3.0相对于2.2版本来说,不仅在稳定性和Bug修正方面有非常大的改善,最为重要的一点是,从这个版本开 始,Intel915/945的集成显示芯片已经支持了XvMC(X-Video Motion Compensation)。
什么是XvMC呢?在Mplayer中,我们就能看到Xv的身影,即X11/Xv视频驱动,现在Intel的显卡也支持了。
另外一点是,xf86-video-intel 2.3.0将正式包含在X.Org 7.4中。
详情可见:[ANNOUNCE] xf86-video-intel 2.3.0

http://linux.chinaunix.net/news/2008/04/24/995199.shtml

标签: , , ,

TD之父李世鹤:TD即将安乐死

被誉为“TD-SCDMA之父”的原大唐移动首席科学家李世鹤近日在一个业内会议上表示,TD-SCDMA(以下简称“TD”)安乐死即将成为现实,他呼吁相关部门尽快制订发展TD的明确计划。在近日举办的一个TD专家座谈会上,李世鹤说,“TD从4月1日起开始试商用放号,可是我一点都高兴不起来,我看到的是TD快死了,有人说要让TD安乐死,这个‘伟大的理想’即将实现。”

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" border="0">



  “TD即将安乐死”

  李世鹤说,他得出TD即将安乐死这一结论的原因有二:一是,世界上没有一个国家让一个通信网试验了又试验,如果技术问题解决了,“是骡子是马,到市场 上去检验”,让最终用户去评判,“靠试验网解决问题,世界上没有先例”;二是,到目前为止,相关部门关于TD依然没有明确的计划,“到底用不用(TD), 没有一个人站出来讲,哪一个运营商会用,不知道,(相关部门)跟所有人打哑谜”,这样的后果是,一些支持TD的厂家日子很难过,“有一家TD手机芯片公司 已经到了破产的边缘。

  李世鹤在发言结束时,动情的说,“我是一个罪人,把很多人骗上了3G”,“TD现在很危险,很可能一下子就全垮掉了,我呼吁大家尽快拿出决策出来,谁上、怎么上,拿出发展计划,拿出运营商计划,不应该走一步看一步。”

  除了李世鹤外,也有其他电信专家呼吁加快TD终端的采购。一位来自高校的电信专家建议运营商大规模集采TD手机,因此这样可以弥补目前TD手机终端匮 乏的现状;另外一位来自政府部门的专家则表示,他通过调研后发现,一些手机厂商在没有明确的需求信号时,对TD手机的生产处于观望状态,因此希望运营商加 大采购量。

  “TD目前的网络状况超过我的预想”

  在本次专家座谈会上,很多专家谈到目前TD的网络状况和GSM相差太远,出现了覆盖率低、接通率低、室内无法覆盖等问题,这些也是首批试用者抱怨比较多的一些问题。

  李世鹤说,“现在的网络状况,我有发言权,包括以前的试验网在内,我都不止一次到各地去实地考察,我到过几个城市,他们的网络状况超过了我的预想,目前基本可以用。”

  李世鹤拿GSM进行对比,“中国移动的GSM网络优化了10几年,TD网络优化才不到半年,当然不能要求现在的TD网络状况和GSM一样,GSM网络 刚建成时,接通率也只有20%-30%,当时的GSM不是试验网,已经是正式的商用网,所以目前的TD网络状况是正常的,而且比正常的还要好一些”。

  知名电信专家李进良也搬出了英国刚上3G时的用户反馈情况进行对比,得出的结论是,TD目前遇到的情况并不比英国3G开通时糟糕,因此,按照国际移动网络的运营经验,3年之后TD网络可以优化到相当好的状况。

http://bbs.chinaunix.net/thread-1084541-1-1.html

标签:

Ubuntu新版Linux免费下载血战Novell

Ubuntu Server 8.04将从本周四开始让用户免费下载。这将使Canonical的Ubuntu与Red Hat Enterprise和Novell平Suse Linux Enterprise更激烈地争夺企业市场。

Ubuntu Server 8.04的支持周期为5年。它能够在Sun的服务器上运行,其中包括Sun Fire X2100 M2、X2200 M2、Sun Fire X4150。Sun负责开放源代码软件业务的经理乔治表示,Ubuntu Server 8.04面向企业市场。

Canonical首席执行官马克表示,Ubuntu Server 8.04一直面临稳定性问题困扰,我们通过更多测试提高了其可靠性。他在接受采访时说,我们将每二年推出一个新的版本。

马克表示,Sun的认证包括1、2、4路x86服务器,Ubuntu没有针对4路以上的系统对Ubuntu Server 8.04进行优化。另外,Canonical还在与惠普、IBM、戴尔就认证问题进行接触。

Ubuntu 8.04中包含Windows整合功能。通过使用第三方厂商Likewise的Likewise Enterprise产品,Ubuntu

8.04能够使用微软活动目录用户身份管理系统的服务。马克说,与Windows网络的整合非常重要。

Ubuntu 8.04还整合有Open JDK,这意味着Ubuntu首次整合了Java虚拟机,能够运行Java应用程序。另外,它还包含有开放源代码版Alfresco内容管理软件、 Bacula网络备份软件、Parallels虚拟软件、Tresys安全软件、PHP、Zimbra电子邮件。

http://linux.chinaunix.net/news/2008/04/23/994703.shtml

标签: , , , ,

Ubuntu Linux 8.04 LTS

Ubuntu Linux是一份完整的桌面Linux操作系统,它可免费获得,并带有社团及专业的支持。最新的Ubuntu 8.04 LTS今天已经发布!它已成为为全球第三大Linux发行厂商。随着它的第四个服务器版本、第二个长期技术支持(LTS)版本的发布,Ubuntu有望得到更多企业用户的青睐。"进入ChinaUnix下载频道下载 安装指南
ubuntu-8.04-desktop-i386.iso ubuntu-8.04-server-i386.iso

虽然Ubuntu 8.04 LTS 正式版还没有发布,但现在已经可以预定.Ubuntu不愧是“Linux for Human Beings ”,除了操作系统本身越来越趋方便和人性化,另外自费为全世界Ubuntu用户提供光盘更是体现了这一信念.

申请Ubuntu 8.04 LTS 的地址还是跟以前一样:


访问https://shipit.ubuntu.com/ ,然后注册一下就可以申请了。

方便自己刻录或会硬盘安装的朋友就没有必要去申请了,毕竟Canonical公司每发送一张光盘成本还是蛮高的!大概要几十欧元吧?

标签: ,

a+b=c跟c=a+b为什么不一样? C新新手问题

弹头:我要把a和b相加,然后赋值给c, 为什么我写成a+b=c就编译出错,写c=a+b就没有问题?? 这2个式子不一样么??为啥呢?谢谢

blankyao : 等号是赋值运算,不能把值赋给a+b
只能把a+b赋给c

弹头 : 我写成a+b=c出错阿,我是linux下gcc

lenovo : 哥们,有c语言教科书吗?
没有去买一本。

弹头 :
书上就说c=a+b这种,可是没说为啥?为啥a+b=c这种不行呢?

motalelf :
哥们我看好你哦。

当年我初学C,也这么问过老师,可能老师忙着去泡妞了,也没给我解释明白。

结果我C考试时也就糊里糊涂,最后不及格。


弹头: 难道说就是语法规定,没有什么为什么,必须这么写??

flw : 编程语言中借鉴了很多数学符号/概念,
但是这些符号和数学课本上的符号/概念还是有很大区别的。

就拿 = 这个符号来说,数学上把它叫做“等号”,
但是 C 语言里,它不是“等号”,而是“赋值号”,
C 语言里的“等号”是 ==,也就是两个等号连起来这样子。
== 满足交换律,c == a+b 和 a+b == c 是同一个意思,
但是 = 不满足交换律,它是有方向的,它的方向,代表了赋值的方向,
也就是数据存取的方向。

c=a 的意思是把 a 的值取出来,存入 c,
a=c 的意思是把 c 的值取出来,存入 a,
它们俩的含义显然是不同的。
反应到你的例子中,
c=a+b 就是把 a 和 b 的值取出来,进行加法运算,然后把结果存入 c,但是 a+b=c 是什么意思呢?难道是把 c 的值取出来存入 a+b 吗?
因为 a+b 不是一个变量,因此无法往里面存入值,
因此 a+b=c 是错误的。

等你后来慢慢学的深入了,就知道 a+b 其实是一个右值(right value),不是左值(left value),
因此不能往它里面存入(store)任何数据,但是 c 就是一个左值(left value),可以往里面存入(store)和它的类型相匹配的值。

一言以蔽之,计算机是“工科”,数学是“理科”,学习时要注意区别对待。计算机是实践性很强的一门科学,它不是纯理论,因此学习理论知识时,应该结合电脑硬件的基本工作流程来学习。
http://bbs.chinaunix.net/thread-1085912-1-1.html
最后:>>> 哲学问题。因为在新手眼里看起来这两个都是等式,没有什么分别。

偶要在新语言里设计符号:->和<-。分别用于赋值。 a+b->c;
c<-a+b;
至于C里常用的指针还是用pascal的^.吧。

标签:

星期三, 四月 23, 2008

Yahoo YUI简介

Yahoo!用户界面库(Yahoo! User Interface Library, YUI)提供一些在开发Web胖客户端时常用到的一些工具和UI控件。工具:拖放(Drag and Drop)操作,连接管理器(XMLHttpRequest),页面特效,浏览器事件(例如鼠标点击和键盘按键)管理。UI控件:自动补全 (AutoComple)、日历(Calendar),容器(Container)类控件包括提示(Tooltip)、面板(Panel)、对话框 (Dialog)等、菜单(Menu)、TabView、TreeView,Logger。YUI 还包括了在创建简洁,灵活的布局并能够兼容多种浏览器时所需要的CSS资源。

http://developer.yahoo.com/yui/

标签: ,

怀念海子

从明天起,和每个亲人通信
告诉他们我的幸福
那幸福的闪电告诉我的
我将告诉每个人
——摘自 海子《面朝大海 春暖花开》

星期二, 四月 22, 2008

通过css对文字的第一个字进行处理

报纸或者杂志的排版中经常把第一个字母大小,或者进行一些出来。
通过css的我们也可以在网页中实现这种效果。

CSS2定义了首字首行(first-letter和first-line)的伪类,可以对元素的首字或首行设定不同的样式。
下面看这个例子,我们在段落标记里定义文本首字尺寸为默认大小的3倍:

……


这是一个段落,这个段落的首字被放大了。




我们再定义一个首行样式的例子:

……


这是段落的第一行
这是段落的第二行
这是段落的第三行




(上例中段落的第一行为红色,第二、三行为默认颜色)

注意:首字和首行的伪类需要IE5.5以上的版本支持。
http://www.iconfans.com/thread-357-1-1.html

标签:

AVAST杀毒软件

Avast是捷克一家软件公司(ALWIL Software)的产品。ALWIL软件公司的研发机构在捷克的首都-布拉格,现在他们和世界上许多国家的安全软件机构都有良好的合作关系。早在80年 代末ALWIL公司的安全软件已经获得良好的市场占有率,但当时仅限于捷克地区。
Avast已有17年的历史,它在国外市场一直处于领先地位。Avast!的实时监控功能十分强大,它拥有七大防护模块:网络防火墙防护、标准的本地文件 读取防护、网页防护、即时通讯软件防护、邮件收发防护、P2P软件防护。这么完善的防护系统,定能让你的系统练就一副金刚不坏之身!任意开启各项保护模块 能够查杀流氓软件。

ALMIL公司是擅长于安全软件方面的研发,开发的Avast Antivirus系列是他们的拳头产品,Avast在许多重要的市场和权威评奖中都取得了骄人的成绩,同样在此后进军国际市场上也赢得了良好的增长率。

它的家庭版是免费得,只要在它的网页上填写一下资料,但是邮箱一定要写正确,这样它才能把使用KEY发给你,这你也就可以享用它14个月了,然后再注册再使用。

Avast!的实时监控功能十分强大!它拥有七大防护模块:网络防火墙防护、标准的本地文件读取防护、网页防护、即时通讯软件防护、邮件收发防护、P2P 软件防护。这么完善的防护系统,定能让你的系统练就一副金刚不坏之身!任意开启各项保护模块能够查杀流氓软件,比如3721。升级很人性化。

主要特点:

(1)高侦测的反病毒表现,多次获得过ICSA和Virus Bulletin认证,启发式强大。

(2)较低的内存占用和直观,简洁的使用界面。

(3)支持SKIN更换,完善的程序内存检测

(4)对SMTP/POP3/IMAP邮件收发监控的全面保护。

(5)支持MS OUTLOOK外挂,智能型邮件帐号分析。

(6)支持宏病毒文档修复,修复档案后自动产生病毒还原数据库(VRDB功能)。

(7)支持P2P共享下载软件和即时通讯病毒检测,保护全面。

(8)良好有效的侦测并清除病毒,如虫,广告和木马程序

(9)病毒库更新速度快,对新型病毒和木马有迅捷的反应。

功能特性如下:

*反病毒内核

*自动升级

*简单的使用界面

*病毒隔离区

*实时监控

*系统结合

*P2P和聊天软件监控保护

*病毒清除

*网络防护

*64位系统支持

*网页防护

*多国语言支持(有中文版)

*增强型用户界面

*恶意脚本屏蔽 *DOS下扫描

*扩展病毒库升级 *移除病毒备份

占用内存不到25兆,让你老机器也流畅.

AVAST具有独特的VDRB。意思也就是在文件被感染之后能修复。不管什么软件,不过之前要创建VDRB。

其模块的自定义化可以让各位用户感到十分方便。

http://baike.baidu.com/view/286272.htm

标签: ,

99%互联网地图签生死薄 Google将被重点监管

“想去哪儿,不知道怎么走,上网一查便知!”如今,互联网地图的应用已经越来越广泛,众多互联网巨头都已经在涉足这一行业.然而,随着互联网地图产业的迅猛发展,数据错误、泄漏国家机密等问题地图也时有发生.
2008年3月25日,八部委发文联手整顿互联网地图,对互联网地图管理设立市场准入限制.4月16日,来自新闻出版总署内部独家消息显示,相关整顿文件已经摆上高层案头,具体开始整顿日期定在5月底前,如果不符合市场准入制规定一律叫停.

这意味着,对99%不符合规定的互联网地图来说,5月底将成为“生死抉择”的大限,这其中,包括 Google的互联网地图——Google Earth。

互联网地图异军突起

电子地图是一个庞大而笼统的概念。按照不同应用,可以细分为三个市场:导航市场、行业应用和互联网地图。其中互联网电子地图(以下简称互联网地图)是一个较新的应用。

目前,美国NAVTEQ公司占据了电子地图市场最大的份额。2000年,NAVTEQ通过其电子地图业务成为一家明星企业,它的收入主要来自汽车导航。6年后,以互联网为基础的电子地图业务的发展速度远远超过了汽车导航的速度,并在该公司的收入中占据越来越重要的位置。

国内互联网巨头也从中嗅到了巨大商机。2005年4月12日,搜狐宣布支付930万美元现金用于收购图行天下(Go2Map),随后,百度、新浪等网站也 争先恐后地推出了地图搜索服务。首家获得审图号的互联网地图服务厂商Mapbar还通过资源置换或者部分收费的模式为其它网站提供互联网地图服务,目前 Mapbar地图联盟吸引了包括百度、MSN、雅虎等2000多家网站的加盟。

至此,互联网地图形成了一条完整的产业链。位于产业链前端的是四维图新、高德、灵图等具有测绘资质的图商,它们生产制造出来的地图,可以通过合法途径卖给 那些地图网站及合作商;MapABC、Mapbar、51ditu等专业地图运营商则位于产业链的第二级;再往下的第三级则是一些搜索类网站和行业应用网 站,这些网站通过把位置信息与自己的搜索引擎或者自有内容进行整合后实现赢利。

种种迹象表明,中国的互联网地图行业正以惊人的速度发展。随着用户的不断增加,互联网地图市场也水涨船高。据中国网络经济研究中心发布的报告显示,中国地图信息服务市场规模到2008年将突破5亿元人民币,2010年则能突破15亿元。

99%的互联网地图违规

不过,由于互联网地图具有易复制的特点,导致众多中小网站甚至个人一拥而入利用互联网地图实现盈利,其后果是,不仅造成了市场的混乱,而且造成许多地图本 身的不规范。这些不具备地图制作资质的企业,使用的是免费的“拿来主义”地图,经过自身简单标注或者修改之后,便迅速推向市场,各种形态的地图服务也相继 衍生,但所提供的信息并不准确,由此引发了市场混乱、数据错误、国家机密泄露等严重问题,也给消费者带来很大的不便。

“互联网地图市场正以惊人的速度繁荣,但现行的法规对互联网地图管理没有明确规定,99%的互联网地图都存在违法违规问题。”国家测绘局副局长闵宜仁在今年3月25日的表态可谓“一语惊人”。

2007年,国家测绘局通过采用网上搜索和重点抽查的方式,检查出登载地图的互联网站8962个,互联网地理信息服务网站有595个,99%地图大多没有依法经过国家或省级测绘行政主管部门审核批准,存在违法违规行为。

由此,监管已迫在眉睫。国家对于地图市场的监督,其实早就已经开始。2006年8月1日起施行的《地图审核管理规定》规定,在正式出版、展示、登载、以及生产的地图产品上,必须载明审图号。

《意见》成互联网地图“生死薄”

今年2月25日,一份由国家测绘局、前信息产业部、外交部、公安部和新闻出版总署等八大部门联合发布的《关于加强互联网地图和地理信息服务网站监管的意见》(简称《意见》)出现在了国家测绘局的网站上。

《意见》规定,从事互联网地图编制活动,必须经国务院测绘行政主管部门审批,并取得相应的测绘资质证书。从事互联网地图出版活动,应经国务院新闻出版部门审批,并取得互联网出版许可证。外国的组织或者个人不得在我国境内从事互联网地图编制和出版活动。

《意见》引起了业界的各种激烈反应。“对于我们这样的正规图商来说,《意见》的出台是件好事。”Mapbar市场总监潘琳娜告诉记者,《意见》将成为正规图商的“保护伞”,从而改变市场竞争格局。

“拥有正规数据来源的厂商不超过10家,今后互联网地图必须公示出版号,那么没有资质的公司需要引用地图只能和正规图商合作。”潘琳娜表示,这样一来不仅规范了互联网地图产业,也提供了准入的门槛。目前,已经有11家企业获得了相关资质。

潘琳娜表示,与Mapbar合作的企业也不会受到影响,因为这些合作企业无需自建地图平台,只需从远程调用Mapbar.com,就能获取基础地图、黄页数据、公交换乘、驾车路径等基础地图服务资源。

不过,对于目前只是跟地图运营商通过一定合作模式来提供地图服务的网站来说,它们更多感受到的是“前景难测”。“《意见》中指出要坚决制止涉密地图、高精 度坐标成果及重要地形地物属性等通过网络扩散,但对地图上的兴趣点(PIO)信息审核方面没有做出严格规定。如果将来要审核POI信息,将以怎样的方式操 作,会不会泄露我们收集来的核心资源,这都是我们的忧虑。”一家网页网站负责人忧虑地说。

据记者了解,go2map、51ditu等厂商没有获得审图号,按照规定,他们不能发布电子地图、也不能将电子地图向其合作伙伴提供,他们将面临着“生死抉择”。

一些准备涉水互联网地图的网站,也开始止步不前。“规定将越来越严了,我们还是等等再看吧。”一家有意进军互联网地图的网站负责人表示,《意见》出台后,两家VC(风险投资商)暂停了对他们的投资意向。

Google Earth将受重点监管

根据《意见》,八部委近期将在全国展开专项整治活动。整治内容涉及“严格执行互联网地图和地理信息服务活动的市场准入制度”、“进一步加强对互联网地图和 地理信息服务网站的监管”以及“严肃查处互联网地图和地理信息服务违法违规行为”等6大意见。不过,怎样操作,如何管、如何查等具体实施步骤,仍然有待相 应规章制度的进一步完善。

对于业界的这些反应,国家测绘局成果司的有关人员表示,这都在意料之中,加强互联网地图监管将成为2008年测绘局的重要工作。

4月16日,来自新闻出版总署的内部消息显示,《意见》已经摆上高层案头,具体整治日期定在了5月底。确定这个时间段的原因是,“一是因为现在出于摸查阶段,二是给那些不符合规定的互联网地图一个自行整顿,寻得生存的机会。”

对于互联网用户而言,他们更为关注的却是信息开放最多的网站,比如Google Earth。此前,由于Google Earth在中国地图上犯下的多个严重错误,网民对此声讨激烈。比如在2007年2月初,Google Earth里面沈阳地名变成了日文,Google Earth中国区新闻发言人当时对此的表态是:标识是网友自行标注而来,Google没有审核。

根据记者了解,在Google Earth采用的3D地图定位技术下,用户们不但能够在3D地图上放大或缩小Google Map上的最新卫星图片,而且可以在Google Earth社区注册并发布自己标注的地图,与他人共享。Google Earth主要通过访问2004年收购的卫星图片公司Keyhole的航天和卫星图片扩展数据库来实现这些上述功能。

因此,在国内某知名图商负责人看来,今后像类似Google Earth这样的卫星地图也将受到监管约束。“目前国内对卫星地图是没有放开的,此次监管前与有关部门的沟通会上,我们也建议相关部门能够对卫星地图的监管明确下来。”

Google Earth在中国遭遇怎样的命运呢?“可以肯定的是,Google Earth也在监管之列,并且,是重点监管。”消息人士表示。

此前,Google Earth首席技术官Michael Jones表示,即使地图产品在中国受到严格的监管,Google Earth的地图数据也不会做出太多改动。不过,在“生死抉择”关头, Google Earth也不得不做出改变,来自Google的内部消息显示:Google目前正忙于制作一个针对中国用户的数据库。

电脑报观点:准入制洗牌互联网地图市场

在产业前景日渐清晰的时候,相关部门发牌,影响巨大,意义深远,而很多厂商却将政策看出了自己的生死薄,果真如此吗?

当然,对于哪些靠“拿来主义”的互联网地图运营企业来说,政策就是自己的生死薄,上面明确地写明了自己的死期。这类企业只有从跟本上解决地图的来源问题, 重建自己的运营系统才能起死回生。那些从来没有审图号的地图服务支持网站,其处境将更为糟糕,不得不重建自己的地图运营系统,另外寻找电子地图服务的来 源。

对于获取牌照的企业来说,政策的出台无疑是个利好消息,或许会将那些靠窃取为生的厂商拒之门外。

对于广大用户而言,政策法规制订出来之后,通过对所有网站进行严格监管,规范市场,将会对位置服务以及空间地理服务产业起到巨大的推动作用。

总的来说,互联网地图准入门槛的提高,会促使那些靠“拿来主义”的厂商选择新来源或者与正规厂商合作,给那些正规厂商提供了一个公平竞争的环境,对行业发展将起到很好的促进作用。
http://bbs.chinaunix.net/viewthread.php?tid=1084542

标签: ,

微软为抵御Linux蚕噬被迫延期XP销售

近日,微软再次宣布,针对低价电脑的Windows XP家庭版的销售截止日期推迟到2010年,比主流PC延长至少两年时间。

此举被业界认为是微软一次无奈妥协,由于去年底华硕的Eee PC打开了超低价电脑市场缺口,吸引众多PC厂商争相跟进,微软停止XP销售将令Linux有机可乘。

不过,令微软为难的是,延长XP的服役时间意味着强调推广Vista的计划受阻。

微软强制升级计划受阻

为了加快Vista的普及力度,此前微软曾计划将OEM厂商预装Windows XP系统的期限定为2008年1月31日,但由于Vista配置要求高、兼容性等问题,微软把XP的期限被延长到了2008年6月30日。虽然遭受OEM 厂商以及用户反对,且反对呼声日益高涨,但微软却一直充耳不闻。按照微软的如意算盘,强制OEM厂商采用Vista,将大大增大Vista的市场占有率, 挽回Vista受市场冷遇的尴尬局面。

正当微软意图凭其在桌面操作系统的垄断地再施故伎之际,PC市场却悄然发生了变化。自去年底华硕推出超低价便携式电脑以来,市场掀起一阵“超低价电脑旋风 ”,超低价电脑冻土市场突然被打开,各大厂商开始纷纷扎堆,包括联想、方正、惠普、 DELL、ACER、富士通、三星、技嘉、微星、海尔都抛出了超低价电脑计划。业内预计,未来四年,超低价便携电脑将井喷增长,2008年的发货量将突破 1000万台,而到2009年将达到2000万。

市场的风云突变令微软束手不及。由于面临微软停止XP销售风险,各大进军超低价便携式电脑市场的PC巨头纷纷转向Linux。而为了让数以千万的桌面系操不至于落入Linux手中,微软随即宣布针对超低价电脑的Windows XP家庭版的销售截止日期将推迟。

微软表示,至少在2010年6月前,英特尔的学生笔记本电脑和华硕的Eee PC都可以安装Windows XP家庭版,同时在新一代Windows系统发布之前,XP还将在市场上销售一年时间,这意味着该系统的销售期限可能延长至2011年或者更晚。

PC厂商不买微软帐

尽管微软主动抛出“橄榄枝”,但曾受尽微软Windows升级策略折磨的PC厂商似乎并不卖帐,在微软宣布面向超低价电脑延长家庭版XP后,早已做好放弃XP心理准备的PC厂商依然力推其预装Linux系统的超低价PC产品。

超低价电脑市场“领头羊”华硕就公开表示,Linux版本拥有华硕专为Eee PC制定的独特界面,消费者在Linux版本的易PC上不仅能够得到使用更方便的界面。倾向于Linux系操的还有惠普、微星等厂商,据了解,这些厂商率 系推出的低价电脑都是Linux操作系统。

除了微软摇摆不定的升级策略外,厂商在超低价电脑市场偏爱Linux,微软的 Windows系统软件许可费高昂也是另一重要因素。据透露,PC厂商购买一个家庭版的Windows XP系统需要为微软支付至少200元人民币,这对市场售价不到3000元的超低价电脑来说,显然难以承受。

据悉,即将在5月中上市的第二代Eee PC中,华硕分别推出采用Windows XP和Linux系统的产品,售价均为3499元,配置Linux操作系统的第二代Eee PC有20GB基于闪存的存储空间,但选择Windows XP配置的用户只有12GB固态硬盘存储空间。而此前,华硕最早推出的易PC的价格仅为2999元。

“很明显,选择采用Windows XP使超低价电脑拉高了成本,这将得超低价电脑失去与普通笔记本电脑的价格优势。”一位国产PC厂商产品经理说。

Vista推广再受打击

此次微软决定保留Windows XP,目的是为防止Linux系统侵袭到该平台,然而,这一举措又为微软带来了另一个问题:XP系统的再次延期退市,或会影响Vista的进一步市场拓展。

据了解,尽管在过去一年,微软不遗余力推广Vista,但到目前为止,大部分用户对于Vista的热情并不高,而调查显示,在广州,Vista的市场占有 率在不到20%。记者在一些国内PC厂商售后维修点了解到,用户电脑的软件问题都出自已安装Vista系统的电脑上,相当数量购买预装Vista电脑的用 户,都要求重装回XP。

为了尽快普及Vista系统,微软今年初称将增加营销费用,而从目前微软的强调升级计划受阻情况来看,微软的营销预算可能要增长不少。据悉,自2006年11月发布以来,微软已投入了约5亿美元的营销费用。

“微软的处境有点两难,一方面该公司希望尽快让用户远离XP普及Vista,而另一方面又不愿看到Linux侵占其市场。”一位分析师表示。

-言论

“Vista是半成品”

微软CEO承认上市一年半Vista仍问题多

在OEM厂商与用户的压力下,微软CEO史蒂夫·鲍尔默终于首次承认Windows Vista仍需改进。“Windows Vista仍是一项正在进展中的工作。”上周四,史蒂夫·鲍尔默的言论震惊业界。此前,很多用户在微软的广告宣传吹嘘下购买了Windows Vista。

“这是一个非常重要的产品。我认为,我们做了很多正确的事情,也有很多需要学习的东西。” 鲍尔默表示。目前,Vista存在很大争议性,比如性能提升、兼容性以等,还有用户抱怨Vista比XP占用的空间大得多。鲍尔默承认,Vista占用空 间确实比XP要大,“而我只能保证它不会变得更大”。

鲍尔默这番话无疑等于向已使用Windows Vista的用户泼了一盆冷头,特别是企业用户。对于这些企业用户来说,每一次系操和更新都是一项巨大工程,“如果连微软都说Vista还有很多需要改进 的地方,那基本可以把Vista看成是一枚炸弹,可以想象那是多么可怕”。一位企业信息管理人员说,”对于如此一个存在许多问题的操作系统,我不明白微软 为何要推销给用户。”

鲍尔默说出这番话的时候正值Windows Vista操作系统处于一个关键时刻。目前,微软正力劝企业和个人用户升级使用Vista。微软于2007年1月份推出Vista,并于上个月发布了首个 主要的Vista升级服务包,其中包括大量的漏洞修复和升级程序,用于修复过去一年Windows Vista在接受市场检验中暴露的问题。

Jupiter Research的分析师迈克尔·加腾伯格表示,鲍尔默用的“正在进展中”这一说法会使用户认为这项工作尚未完成,很难想象在微软力劝企业和个人用户升级使用Vista的关键时刻鲍尔默会说出这样的话。

-业界分析

在台式电脑领域

Linux将超过Vista

费雷斯特市场研究公司(Forrester Research)报告预测,在桌面市场领域Linux将对Windows构成更大的威胁,今年随着Linux在企业市场的普及应用,其市场份额将会迅速增长。

费雷斯特市场研究公司分析师本杰明·格雷(Benjamin Gray)称:“桌面管理人员将会使Windows操作系统平台继续标准化,Linux不会成为企业桌面的首选,因此何以动摇Vista在企业操作系统的 地位?然而客户对Linux桌面需求的增长则说明,其作用会更加突出。明年,随着分销商强化对企业市场Linux的销售,其市场份额一定会进一步增长。”

格雷预计,今年Vista系统将会在北美和欧洲四分之一的企业电脑里安装。届时,企业用户会从XP平台转移到Vista上。但目前,XP系统仍是企业桌面的主流选择。

据悉,该预测是基于对北美和欧洲企业的1001名硬件决策者的调查采访而得出。这其中有43%的受访者来自规模为1000人到4999人的大型企业,有 35%的来自规模为5000到19999人的大型企业,有22%的来自规模有2万员工的以上的超大型跨国企业。这其中有近一半的受访企业表示,他们已制定 了明确安装Vista系统的具体计划,有7%则表示将于今年底开始安装Vista。有 32%的企业表示明年年底才安装使用Vista,另有17%的计划于2009年或是更晚一些来安装。

但是该报告也指出,多数人认为Vista在企业的推广非常之缓慢,有数字表明,目前只占市场的2%。自VISTA推出以来,北美和全球2000强企业中只 有不到3%安装了该系统,而欧洲企业尚未开始安装。许多企业都在等待新的SP1版本推出。微软表示,SP1版本将于明年第一季度推出。

同时该报告还指出,现在已近有9成的企业用户正在使用Windows XP,与此同时有9%的用户依然在使用Windows 2000。格雷因此表示道:“Vista的成功在很大程度上取决于XP用户是否会升级到Vista。

http://linux.chinaunix.net/news/2008/04/22/994330.shtml

标签: , , ,

FreeBSD平台上的CrossOver Games

CodeWeavers前不久推出了基于Wine的CrossOver Games模拟器,要让Windows游戏运行在非Windows平台。现在CodeWeavers的CEO Jeremy White宣布发布一个针对PC-BSD用户的CrossOver Games试验版,它应该也能在FreeBSD或DesktopBSD下运行。FreeBSD版的CrossOver Games可在此下载(需要先注册)。要注意的是如果你使用的是FreeBSD 6.x,需要先为系统打上一个补丁,FreeBSD 7.0 或更高版本不需要。
http://linux.chinaunix.net/news/2008/04/22/994329.shtml

标签: ,

How to auto-activate "marker.openInfoWindowHtml(..)" in GEvent.addListener?

Hi there,

I am new here. I just put a bus line on google map with polyline.
Each station on this bus line has a marker. It can popout a info
window if the mouse is moved over with the follow code:

GEvent.addListener(marker, "mouseover", function()
{ marker.openInfoWindowHtml(" I am here! "); });

Instead of "mouseover" mechanism, If I use a moving marker to simulate
a bus moving from a station to another station, I want this
information window popout whenever the moving marker arrives at the
station marker (lantitude, longitude). Of course, the previous
information Window from the previous station should be closed.
http://groups.google.com/group/Google-Maps-API/browse_thread/thread/db3a5ff4bc555778

标签:

星期一, 四月 21, 2008

PHP生成GUID

php下生成guid要用到class .
guid.class.php文件代码如下:

Name = $_ENV["COMPUTERNAME"];
$address->IP = $_SERVER["SERVER_ADDR"];
return $address;
}
function toString()
{
return strtolower($this->Name.'/'.$this->IP);
}
}
class Random
{
function nextLong()
{
$tmp = rand(0,1)?'-':'';
return $tmp.rand(1000, 9999).rand(1000, 9999).rand(1000, 9999).rand(100, 999).rand(100, 999);
}
}
// 三段
// 一段是微秒 一段是地址 一段是随机数
class Guid
{
var $valueBeforeMD5;
var $valueAfterMD5;
function Guid()
{
$this->getGuid();
}
//
function getGuid()
{
$address = NetAddress::getLocalHost();
$this->valueBeforeMD5 = $address->toString().':'.System::currentTimeMillis().':'.Random::nextLong();
$this->valueAfterMD5 = md5($this->valueBeforeMD5);
}
function newGuid()
{
$Guid = new Guid();
return $Guid;
}
function toString()
{
$raw = strtoupper($this->valueAfterMD5);
return substr($raw,0,8).'-'.substr($raw,8,4).'-'.substr($raw,12,4).'-'.substr($raw,16,4).'-'.substr($raw,20);
}
}
?>

guid.php文件
toString();
?>

http://blog.csdn.net/leon_founder/archive/2006/08/01/1006654.aspx

标签:

Google Maps API,中国小城市的显示办法

将http://maps.google.com/maps?.....内的maps做如下替换
http://ditu.google.com/maps?....

不晓得这么简单的东西为什么还要这么转一下。

标签:

星期六, 四月 19, 2008

多年前的TIP,网站1变n

$site_matrix = array(
"$site1" => "$path1",
"$site2" => "$path2"
);

$def_pg = "$def_path";
$server = $_SERVER["HTTP_HOST"];
$pg = $site_matrix[$server];
if($pg == "") $pg = $def_pg;
header("Location: $pg");

这样你在一个虚拟主机上就可以同时使用两个域名了.

现在居然需要搜索。

标签:

七绝招让您成为买车的高手

买车时总喜欢带位老司机帮忙去看看,参谋参谋,提提意见,就怕买回辆有问题的车,那可就是后悔不及了。而如果没有这么一位老师傅当我们的购车军师,那我们就不用买了吗?那也不必急,我现在给各位介绍下《购车宝典》中的九大绝招,保证让你受益非浅,不过购车时带位懂车的老师傅还是明智的,毕竟经验比啥绝招都厉害,呵呵!

第一第一步:看车底盘和电瓶。

各位说了,新车有啥好看?错了,新车也有漏油的!趴下身看车低下有没有机油点,底盘有没有油污;新车电瓶没啥可多看的,只看接头有否腐蚀以及小窗是否绿色就行了。注意电瓶接头一般是松的,开走前一定要拧紧。

第二步:拉出机油尺看机油颜色。

有人又要说,不都是0公里吗?有什么好看?经销商坏着那,有些车跑了许多公里,但是里程表不接,还是十几公里,愣冒充是0公里!看的时候要着车三分钟后熄火,拉出油尺用纸巾擦拭,油黑的淘汰。

第三步:远听发动机声音。

这个只能凭感觉了。操作方法是,打着两辆车,你站在中间位置,离开两车距离相等,你感觉到声音大的淘汰(是明显大于别的车),可以转个身再听,以免你两耳听力不同出错觉。

第四步:细听发动机声音。

什么车只要第一次开都应该打开前盖,用个螺丝刀一端顶在发动机上,另一端顶在耳朵上听声音,算是积累经验吧。你越认真经销商越不敢马虎你。

这里要详细说明一下,这样你才能听见发动机内部的声音是否有杂音,比如环子声、敲缸声、气门的嘀嘀声等等。好发动机只有一种‘呼噜呼噜’声,不会有其他的杂音。不过这种方法要靠平时有意识进行的经验积累,一句两句说不清楚,总之就是多听些车好了。

罗嗦一句:有人能帮忙时,要他踩油门升发动机转速你再听声音。然后要他用块什么破布堵住排气口,假如发动机声音明显变沉并几秒钟就熄火,就是好车!否则就是什么地方漏气。

第五步:检查做工,要看各个线头联接情况,是否有晃动等等,这个各位都会自己看,不多说了。

第六步:看全车外观。

有人会说,你这时候才看外观啊?当然了,这不是挑二手车,外观要是有划痕,这车也不会停那里等你挑了,经销商一早就会处理,我要你看的外观是车门的缝隙是不是均等。另外,看外观时还要注意玻璃是不是原配的,玻璃下脚有标记,以免你精心挑选的结果是辆有过事故的车(这事不是没发生过)。

补充一点,很小的剐蹭J.S基本上能处理的天衣无缝,不非常仔细的观察是看不出来的,但事故中如伤及轮胎,只要J.S不换,就没法修补,所以应该将重点放在轮胎上,如有破损,该车立即不予考虑!

第七步: 这时候才是你进驾驶仓的时候,经销商都说,一看见上来就迫不及待进驾驶舱挑车的就知道是新手!最怕那种围着机器转了半天不进驾驶舱的。这里也没什么说的, 对着说明书检查各种按钮、开关是否都有效。灯光、音响、空调、座椅、安全带、电动窗等等的调整,要不厌其烦的一个一个测试。别听经销商的,他们总告诉你“ 放心吧,都是新车!什么问题没有!

要强调的是离合和刹车的挑选,由于现在许多经销商不允许试车,几乎无法挑选,只能凭感觉了:

1、冷车时:踩住离合挂各个档位,务必要求各档都很顺畅。

2、冷车时:踩住离合挂各档,然后松开离合要求能摘档。有的档位松了离合摘的很费劲,这就是车与车之间要对比的。

3、热车时(许多经销商不允许挑车时发动机热车挂档,不管他,坚持这么做!重复1的程序。

4,热车时不挂档,狠踩刹车,务必细心体会刹车踏板能踩下去的深浅变化!要求次次深浅相同,但是不能踩到触底,否则就是要调整了。

对于转向机,确实没办法了,经销商不让试车也不让原地打方向,我的车后来发现方向打死有皮带声,一保时维修调整过,不过据说奇瑞方向打死没声的极少,也就不在乎了。

好了,假如你真的照着这些步骤做了,基本上能保证你的车没什么大问题。挑车时要注意的就是眼到、耳到、手到!多看多听多摸就好。可别是心到哟,一上来就激动的不得了,总算有自己的车了的感觉,那可就坏了

http://club.auto.sohu.com/forum/thread-1259319-1-1.html

星期五, 四月 18, 2008

闲来没事整个电脑配置(2)


游戏编程2不误

装机配置

配置品牌型号数量以前的价格现在的价格商家
合计金额:10386元

标签:

证严法师静思语录(摘)

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、人的心地是一畦田,田地没有播下好种子,也长不出好的果实。
46、有智慧才能分辩善恶邪正;能谦虚才能建立美满人生。
47、君子行事为目标,小人为目的。
48、人生不一定球球是好球,但是有经验的强打者,随时都可以挥棒。
49、人事的艰难与琢磨,就是一种考验。
50、做好事不能少我一人,做坏事不能多我一人。
51、真正的爱心,是照顾好自己的这颗心。
52、待人退一步,爱人宽一寸,就会活得很快乐。
53、能付出爱心就是福,能消除烦恼就是慧。
54、是非当教育,赞美作警惕。
55、人的眼睛长在前面,只看到别人的缺点,丝毫看不到自己的缺点。
56、闲人无乐趣,忙人无是非。
57、信心、毅力、勇气三者具备,则天下没有做不成的事。
58、改变自己是自救,影响别人的救人。
59、发脾气是短暂的发疯。
60、忘功不忘过,忘怨不忘恩。
61、有心就有福,有愿就有力,自造福田,自得福缘。
62、自己害自己,莫过于乱发脾气。
63、能善用时间的人,必能掌握自己的努力的方向。
64、犯了错应及时起忏悔心,才能清净无烦恼。
65、有多少力量就做多少事,不要心存等待,等待即会事久落空。
66、所谓“宗教”,“宗”是人生宗旨,“教”是生活的教育。
67、君子如水,随方就圆,无处不自在。
68、稻穗结得越饱满,越会往下垂,一个人越有成就,越要有谦冲的胸襟。
69、站在半路,比走到目标更辛苦。
71、不要随心所欲,要随心教育自己。
72、不好把阴影覆在心里,要散发光和热,生命才有意义。
73、虚空有尽,我愿无穹,发愿容易行愿难。
74、好事要提得起,是非要放得下,成就别人即是成就自己。
75、能干不干,不如苦干实干。
76、人要自爱,才能爱普天下的人。
77、为人处世要小心细心,但不要“小心眼”。
78、不怕事多,只怕多事。
79、人生没有所有权,只有使用权。
80、谎言像一朵盛开的鲜花,外表美丽,生命短暂。
81、一个缺口的杯子,换一个角度来看,它仍是圆的。
82、有愿放在心里,没有身体力行,正如耕田不播种,皆是空过因缘。
83、愿要大、志要坚、气要柔、心要细。
84、慈悲没有敌人,智慧不起烦恼。
85、布施如播种,以欢喜心滋润种子,才会发芽。
87、难行能行,难舍能舍,难为能为,才能升华自我的人格。
88、人要知福、惜福、再造福。
89、忏悔是心灵的告白,也可以说是精神污染的大扫除。
90、“福”要自己去造,不要去求
91、不怕一丈走不到,只怕寸步难移。
92、“福”要自己去造,不要去求人。
93、常常受到挫折,也要感谢天意的磨练。
94、人间的是非,要当作自我的教育。
95、与人相处,应能成人之美,涵养容人之德。
96、要以至诚的热心,去温暖人们心灵上的凄凉。
97、做任何事情都要专心,专心就是定。
98、有健全的家庭,才有好的社会,有好的社会才能有好的国家。
99、以慈悲喜舍之心,起救苦救难之行,与乐拔苦,缔造清新节净之慈济世界。
100、爱不要分种族,也不要分国家,只要是生命,都应该尊重,应该关怀。
101、佛心没有远近,人也愿望也没有大小,只要心诚意正,即可达到弘愿。
102、待人处事诚正信实,问心无愧,就可以皆大欢喜,身心自在。
103、学佛三心:真心、深心、大悲心。
104、以诚待人,以德服人,是最好的管理方式。
105、真正的妙法是由智慧流露出来,真正的慈悲是用智慧力量去推动。
106、有人说“心好就好”,但是徒有好心,如果不去化为行动,就不能成就好事。
107、世间没有一样很容易的事,没有逆境的事,不值得我们做为人生的登塔。
108、古德去:“佛在灵山莫远求,灵山只在汝心头,人人有个灵山塔,好向灵山塔下修”

人们常要求別人要对自己好,順自己的意;否则就埋怨、气愤,拿別人的错误来惩罚自己,这就是烦恼的来源。

常把「苦」挂在口中,终必苦不堪言;常说「幸福」,这股「願力」将带来源源不绝的欢喜心。

人生之美,美在心灵善良,美在用爱付出;用感恩心付出,打开心胸去爱,能帮助人的人最有福。

你不能决定生命的长度,但你可以控制它的宽度;你不能左右天气,但你可以改变心情,你不能改变容貌,但你可以展现笑容;你不能控制他人,但你可以掌握自己;你不能预知明天,但你可以利用今天;你不能样样顺利,但你可以事事尽力。

记住别人对我们的恩惠,洗去我们对别人的怨恨,在人生的旅途上才能自由翱翔。

以责任之心责己,以恕己之心恕人。

静中静非真静,动处静得来,才是性天之真境;乐处乐非真乐,苦中乐得来,才是心体之真机。

以善待人,以诚处世,以信为念,以明月为心,淡泊素雅,宁静致远。

有这样一个人,一想到他,只有笑,唯有乐,享有甜,他就是你可以执手一生给你幸福的人!

一切回归美好的时候却是生命到尽头的时候珍惜当下

打开心门,让阳光透进来,一定可以感受到温暖和光明。

时时与人结好缘,任何时候都要让人起欢喜心。

凡事善解才能欢喜自在,才能从人我是非中跳跃出来。

看淡脸色、看淡声音;耐得住被人磨的,则会象钻石一样发光。

想太多钻入牛角尖,将自我束缚;以简单心知足善解,将领略人间无处不美。

自在功夫,心即是佛;如来真意,明月当天。

知福才懂感恩,感恩才会付出。

要过很可爱的人生,就要自己先去爱人。

如果一个人没有苦难的感受,就不容易对他人给予同情。你要学救苦救难的精神,就得先受苦受难。

往事並非只能回忆,往事也可作为我们未来的龜鑑,尤其伟人的往事如明灯一般,不但见证着不朽的真理,更为我

们带来光明的希望。

人生三宝:腳走好路,手做好事,口说好话。

发上等愿,结中等缘,享下等福;择高处立,就平处坐,向宽处行。荣毅仁喜欢的名言

佛法无多子,长远心难得。学道如初心,作佛也有余,始终总不变,真是大丈夫。

拜佛容易敬心难,意不虔诚总是闲,五体虚悬空费力,骷髅磕破也徒然。

再大的官嫌小,再多的钱嫌少、再大的官没有朋友好,再多的钱没有身体好!

海纳百川,有容乃大,壁立千仞,无欲则刚。

http://shanlinvren2008.blog.sohu.com/78886010.html

标签:

闲来没事整个电脑配置


个人游戏(享受型)

装机配置

配置品牌型号数量以前的价格现在的价格商家
合计金额:10398元
这套电脑如何?

标签:

。。。。

困了,洗洗睡了。。。

标签:

无题

基本上靠声音吃饭的人的嘴都是歪的。。。。

标签:

Google Earth新版出炉 与微软争3D地图龙头(图)

4月17日国际报道 Google Earth有趣地方在于可像超人般的飞越虚拟地球上空,但我们毕竟是居住在地面的地球人,能从街道层次来观看也相当实用,就算是超人有时也得着陆吧。

此时出现了Google Earth 4.3,新版加入Google Maps的街景功能,提供部分地区的街景角度,并有全新的导览方式,这使得该软件变得更像第一人称的电玩游戏。

新版还可让用户观看日出或日落,你可从自己区域的角度,或整个地球角度来看;同时速度也加快了,并有更多逼真的3D图像。

Google目前极力与微软力争3D地图龙头地位。微软现在全力开发自家的Virtual Earth与Live Maps技术,上周也才刚做过重大更新。

  

http://news.csdn.net/n/20080417/115271.html

标签:

Oracle与SQL Server的“相对论”

本文的作者Sean McCown是一位资深的数据库工作者,在数据库行业摸爬滚打15年了。目前的工作是解答数据库相关的评论。以下是Sean McCown在解答评论过程中所感所悟。

  Sean McCown发表在博客中的内容如下:

  我实在对社区里的有些评论不敢苟同(有的评论的水平很差),更多的是希望快速回答,完成工作。

  我首先要说的是一件令我非常烦恼的事情。我已经在数据库行业摸爬滚打15年了。虽说不是对数据库的所有的知识都一清二楚,但是我对某些知识还是 数一数二的。因此,你们不要一而再,再而三的提醒我,“SQL”和“SQL Server”之间是有区别的。你想说的区别我已经略知一二了。诚然在网上post很长的文章的时候,最好还是能够让你的听众清楚的明白你在说什么。当我 谈到Oracle 和 SQL Server的时候,我应该可以将SQL Server简写为SQL,不用每次都写出它的全部拼写。如果有时候让你感到困惑,我对此深表歉意,但是以后你应该记住,很好的理解我所指的对象。很清楚,我不是在谈论SQL语言。甚至有一个家伙说过我应该写Microsoft SQL Server。这样诚然不错……但是,当我说到Oracle的时候,我也没有看到你们有谁感到迷惑。Oracle是一个公司的名字。他们生产了很多的产品。为什么没有人通过Email告诉我我应该称之为Oracle Database 11g呢?

  我想你们已经知道了我缩写所指吧,不用每次都写全称吧。好了,这就是我在进入正题前所要讲的,真是一吐为快啊。

  现在进入正题。你们当中有一些人给出了非常清楚、明晰、深思熟虑的评论。而其他人一些人没有说出实质性的内容,还进行漫骂。这也没有关系,我不会对后者做过多的关注。

  其中非常优秀的评论来自从事Oracle工作的人士。这就不奇怪他们写的评论很有深度。他们是一群非常聪明的群体,他们能够证明自己的观点正确,而不是漫骂。

  下面一幕是我又觉非常有意思的。如果我们在MS(微软公司的简称)平台上布置一项任务,我们就很有可能得到差不多的解决方案,这个现象得到了很 多人的同意,他们也是这么认为的。如果我们在Oracle平台上布置与MS(微软公司的简称)平台相同的任务的话,很难找到答案。并不是说这里没有该任务 的解决方案,只是不像MS平台下那么容易得到而已。

  也许有许多人认为这只是我的一家之言,因为他们在Oracle Database 9i/10g/11g上从来没有遇到寻求帮助的麻烦。也许我们都是对的。这取决于你的经历了。事实上,我身边有一群IT工作者,在自己的blog上post自己所遇到的麻烦,他们中大多数同意我的观点。这些人大多都是一些杂货店的数据库管理员。

  但是,我想要声明的是虽然有许多人不承认Oracle数据库学习资源很难找到,但是事实上就是如此,MS学习资源就是更加容易获得。

  有人或许就要问我,为什么我不去OTN(Oracle 技术网)那里呆着。事实上,我就在那里,但是,伙计,你要知道的是,我已经厌倦了坐在电脑前面,要挑选如此多的网页找到需要回答的问题。如果坐下来观看视 频的话,岂不是一件愉快的事情。我个人觉得视频资源更好。因此我喜欢视频培训。但是问题来了,几乎没有提供商来做Oracle新产品(Oracle Database 9i/10g/11g)的视频培训。事实上,到目前为止,我还不知道有任何的公司在做Oracle培训。

  拿AppDev举例子来说。他们有非常棒的培训,但是他们只是做MS公司的产品。甚至其它做视频培训的提供商对Oracle也择道而行。这是什 么原因了?这就是我一开始讨论的关键所在。难道是没有人用Oracle?我们知道这肯定是不正确的。难道是Oracle数据库管理员天生就知道 Oracle所有的知识?当让也不是。难道是由于Oracle社区的存在使得培训提供商选择离开Oracle这个产品?事实上Oracle也没有生产出比 提供商更好的培训教程。

  难道主要原因是Oracle大多用在Unix/Linux操作系统上, 因此Oracle的技术人员更加喜欢读文档而不是观看视频?这对吗?这些Oracle的技术人员都是用的命令行操作,因此不能忍受使用图形界面的软件,即 使是学习这样的事情?的确,这已经成为一种习惯,或者说是一种氛围。这个发现是从Oracle社区里找到的。另外,你所需要的相关信息在Oracle社区 里并不是没有,而是不容易发现而已。

  就拿这次我安装Data Guard的经历来说,我需要OBE(oracle示例系列)。问题是那些OBE(oracle示例系列)是在Linux环 境下使用的,而我需要的是在Windows下使用的。官方网站上的一些链接并不是跳转的很合理,如果有微小的错误存在,更本就不会有任何提示让你后退到原 来的路径。另外,有一些阅读信息必须严格执行,而一些则就很随便了,OBE(oracle示例系列)并没有给你任何引导,那种OBE(oracle示例系 列)对应哪个平台。最后,我好不容易找到了一个是适合Windows的。但是,并不是很好。因此,你也不要问我如何完成OBE(oracle示例系列)。 回过头来,该想想为什么没有对Oracle培训的一种需求,形式内容更加丰富的需求呢?

  仍然还有一些人说我很愚蠢,因为Oracle比SQL更加容易做技术支持。

  在这里我也不想找更多的例子了。只需要比较如何备份Oracle和备份SQL就知道谁的资料好找。

  另外我还要给出管理表空间(tablespace) 的例子,说到这里,肯定有人说管理表空间(tablespace)太easy了,因为他们一直就是在干这种事情,一条简单的命令就ok了。是的,对这些人 来说很简单,正好证明了我说的观点:孰能生巧。在SQL数据库中,我不用去管理表空间(tablespace)(或者文件组filegroups),因为 它们是自动增长的。唯一一次我需要管理文件组filegroups是由于我设定了增长范围,而后来增长溢出了,或者我磁盘空间不够了。在Oracle中, 如果我将块大小(Block Size)设置错误的话,那么结果就只能变得很大,我必须去管理它,因为那些表格将会比我想象的还要大。现在在11g有一个bigfile参数,最近才有的。

  数据库平台已经很明显在人们心目中形成了各自的印象,不管MS采取什么样的措施,他们不会改变些那些觉得MS是三流产品的人的看法。这已经是一 个事实了。至于说那个更好,就主要取决于你拿他们做什么了。我发现SQL更加容易组织,运行和构建应用程序。对于普通人来说,Oracle太复杂了,不但 是看看一本书,一个CD就能上手的。

  但是,但你看Oracle的 Data Guard时,它就比SQL反射法要先进很多了。

  好了,已经写了足够多了。至少我觉得是很多了。需要声明的是,我并不是说Oracle平台的坏话。但是,对于用户来说,它的确不太容易掌握。

http://news.csdn.net/n/20080417/115263.html

标签: ,

星期四, 四月 17, 2008

今天

今天生日,过得还算开心。

有很多人关心我,我关心很多人。

计划周末出游,放松一下,好好整理整理心情吧。。。。

标签:

SQLSERVER数据库全文索引示例

一个完整的SQL SERVER数据库全文索引示例。(以pubs数据库为例)

一、首先,介绍利用系统存储过程创建全文索引的具体步骤:
1) 启动数据库的全文处理功能 (sp_fulltext_database)
2) 建立全文目录 (sp_fulltext_catalog)
3) 在全文目录中注册需要全文索引的表 (sp_fulltext_table)
4) 指出表中需要全文索引的列名 (sp_fulltext_column)
5) 为表创建全文索引 (sp_fulltext_table)
6) 填充全文目录 (sp_fulltext_catalog)

二、示例,以对pubs数据库的title和notes列建立全文索引,之后使用索引查询title列或notes列中包含有datebase 或computer字符串的图书名称:
在这之前,需要安装Microsoft Search服务,启动SQL server全文搜索服务

user pubs --打开数据库
go
--检查数据库pubs是否支持全文索引,如果不支持则使用sp_fulltext_database 打开该功能
if(select databaseproperty('pubs','isfulltextenabled'))=0
execute sp_fulltext_database 'enable'

--建立全文目录FT_PUBS
execute sp_fulltext_catalog 'FT_pubs','create'

--为title表建立全文索引数据元
execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'

--设置全文索引列名
execute sp_fulltext_column 'title','title','add'
execute sp_fulltext_column 'title','notes','add'

--建立全文索引,activate,是激活表的全文检索能力,也就是在全文目录中注册该表
execute sp_fulltext_table 'title','activate'

--填充全文索引目录
execute sp_fulltext_catalog 'FT_pubs','start_full'
go

--检查全文目录填充情况
While fulltextcatalogproperty('FT_pubs','populateStatus') <>0
begin
--如果全文目录正处于填充状态,则等待30秒后再检测一次
waitfor delay '0:0:30'
end

三、全文目录填充完成后,即可使用全文目录检索

select * from title
where CONTAINS(title,'database')
or CONTAINS(title,'computer')
or CONTAINS(notes,'database')
or CONTAINS(notes,'database')


四、以下介绍一下全文操作类的系统存储过程

过程名称:sp_fulltext_service
执行权限:serveradmin或系统管理员
作 用:设置全文搜索属性

过程名称:sp_fulltext_catalog
执行权限:db_owner及更高角色成员
作 用:创建和删除一个全文目录,启动或停止一个全文目录的索引操作

过程名称:sp_fulltext_database
执行权限:db_owner角色成员
作 用:初始化全文索引或删除数据库中所有全文目录

过程名称:sp_fulltext_table
执行权限:db_ddladnmin或db_owner角色成员
作 用:将一个表标识为全文索引表或非全文索引表

过程名称:sp_fulltext_column
执行权限:db_ddladnmin角色成员
作 用:指出一个全文索引表中的那些列假如或退出全文索引

http://blog.chinaunix.net/u/10889/showart.php?id=529099

标签: ,

无题

夏来春去谢黄花
天涯何处是我家
有心欲寻凌荷雨
伴我长醉是清茶

感谢你。。。

标签:

生日

今天老欧35了,已经上了奔4快车了。

用一些证严法师的话提醒一下自己吧:

屋宽不如心宽

生气,就是拿别人的过失惩罚自己

尽多少本份,就得有多少本事

一个人的快乐,不在于他拥有多少,而在于他计较多少

看别人不顺眼,是自己修养不够

~~~~还有很多,有空再补充吧。。。。

标签:

About Project Zero

Project Zero began life as an incubator project to explore a new idea that we believed had promise. That idea was of a development and runtime environment that could revolutionize creation of dynamic web applications -- providing a powerful development and execution platform for modern Web applications while at the same time having the overall experience of being radically simple. We started this incubator because we wanted to address the complexities of modern Web applications without the chains of previous architectures, technologies, or decisions.

http://www.projectzero.org/

标签: ,

Format的用法

Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译
,让它有一个完整的概貌,以供大家查询之用:

首先看它的声明:
function Format(const Format: string; const Args: array of const): string; overload;
事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,
但并不多用,所以这里只对第一个介绍:

function Format(const Format: string; const Args: array of const): string; overload;
Format参数是一个格式字符串,用于格式化Args里面的值的。Args又是什么呢,
它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如以下例子:
Format('my name is %6s',['wind']);
返回后就是
my name is wind

现在来看Format参数的详细情况:
Format里面可以写普通的字符串,比如'my name is'
但有些格式指令字符具有特殊意义,比如"%6s"

格式指令具有以下的形式:
"%" [index ":"] ["-"] [width] ["." prec] type
它是以"%"开始,而以type结束,type表示一个具体的类型。中间是用来
格式化type类型的指令字符,是可选的。

先来看看type,type可以是以下字符:
d 十制数,表示一个整型值
u 和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时
是一个2的32次方减去这个绝对值的数
如:Format('this is %u',[-2]);
返回的是:this is 4294967294
f 对应浮点数
e 科学表示法,对应整型数和浮点数,
比如Format('this is %e',[-2.22]);
返回的是:this is -2.22000000000000E+000
等一下再说明如果将数的精度缩小
g 这个只能对应浮点型,且它会将值中多余的数去掉
比如Format('this is %g',[02.200]);
返回的是:this is 2.2
n 只能对应浮点型,将值转化为号码的形式。看一个例子就明白了
Format('this is %n',[4552.2176]);
返回的是this is 4,552.22
注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况
二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的
m 钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化
另外它只对应于浮点值
Format('this is %m',[9552.21]);
返回:this is ¥9,552.21
p 对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示
例如:
var X:integer;
p:^integer;
begin
X:=99;
p:=@X;
Edit1.Text:=Format('this is %p',[p]);
end;
Edit1的内容是:this is 0012F548
s 对应字符串类型,不用多说了吧
x 必须是一个整形值,以十六进制的形式返回
Edit1.Text:=Format('this is %X',[15]);
返回是:this is F

类型讲述完毕,下面介绍格式化Type的指令:
[index ":"] 这个要怎么表达呢,看一个例子
Format('this is %d %d',[12,13]);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候
是这样 this is 12 13

而如果你这样定义:
Format('this is %1:d %0:d',[12,13]);
那么返回的字符串就变成了
this is 13 12
现在明白了吗,[index ":"] 中的index指示Args中参数显示的
顺序

还有一种情况,如果这样Format('%d %d %d %0:d %d', [1, 2, 3, 4])
将返回1 2 3 1 2。
如果你想返回的是1 2 3 1 4,必须这样定:
Format('%d %d %d %0:d %3:d', [1, 2, 3, 4])
但用的时候要注意,索引不能超出Args中的个数,不然会引起异常
如Format('this is %2:d %0:d',[12,13]);
由于Args中只有12 13 两个数,所以Index只能是0或1,这里为2就错了
[width] 指定将被格式化的值占的宽度,看一个例子就明白了
Format('this is %4d',[12]);
输出是:this is 12
这个是比较容易,不过如果Width的值小于参数的长度,则没有效果。
如:Format('this is %1d',[12]);
输出是:this is 12
["-"] 这个指定参数向左齐,和[width]合在一起最可以看到效果:
Format('this is %-4d,yes',[12]);
输出是:this is 12 ,yes

["." prec] 指定精度,对于浮点数效果最佳:
Format('this is %.2f',['1.1234]);
输出 this is 1.12
Format('this is %.7f',['1.1234]);
输了 this is 1.1234000

而对于整型数,如果prec比如整型的位数小,则没有效果
反之比整形值的位数大,则会在整型值的前面以0补之
Format('this is %.7d',[1234]);
输出是:this is 0001234]

对于字符型,刚好和整型值相反,如果prec比字符串型的长度大
则没有效果,反之比字符串型的长度小,则会截断尾部的字符
Format('this is %.2s',['1234']);
输出是 this is 12

而上面说的这个例子:
Format('this is %e',[-2.22]);
返回的是:this is -2.22000000000000E+000
怎么去掉多余的0呢,这个就行啦
Format('this is %.2e',[-2.22]);

好了,第一个总算讲完了,应该对他的应用很熟悉了吧

///////////////////////////////////////////////////////////////
二 FormatDateTime的用法
他的声明为:
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
overload;
当然和Format一样还有一种,但这里只介绍常用的第一种
Format参数是一个格式化字符串。DateTime是时间类型。返回值是一种格式化后的
字符串

重点来看Format参数中的指令字符
c 以短时间格式显示时间,即全部是数字的表示
FormatdateTime('c',now);
输出为:2004-8-7 9:55:40
d 对应于时间中的日期,日期是一位则显示一位,两位则显示两位
FormatdateTime('d',now);
输出可能为1~31
dd 和d的意义一样,但它始终是以两位来显示的
FormatdateTime('dd',now);
输出可能为01~31
ddd 显示的是星期几
FormatdateTime('ddd',now);
输出为: 星期六
dddd 和ddd显示的是一样的。
但上面两个如果在其他国家可能不一样。
ddddd 以短时间格式显示年月日
FormatdateTime('ddddd',now);
输出为:2004-8-7
dddddd 以长时间格式显示年月日
FormatdateTime('dddddd',now);
输出为:2004年8月7日
e/ee/eee/eeee 以相应的位数显示年
FormatdateTime('ee',now);
输出为:04 (表示04年)
m/mm/mmm/mmmm 表示月
FormatdateTime('m',now);
输出为:8
FormatdateTime('mm',now);
输出为 08
FormatdateTime('mmm',now);
输出为 八月
FormatdateTime('mmmm',now);
输出为 八月
和ddd/dddd 一样,在其他国家可能不同
yy/yyyy 表示年
FormatdateTime('yy',now);
输出为 04
FormatdateTime('yyyy',now);
输出为 2004
h/hh,n/nn,s/ss,z/zzz 分别表示小时,分,秒,毫秒
t 以短时间格式显示时间
FormatdateTime('t',now);
输出为 10:17
tt 以长时间格式显示时间
FormatdateTime('tt',now);
输出为10:18:46
ampm 以长时间格式显示上午还是下午
FormatdateTime('ttampm',now);
输出为:10:22:57上午

大概如此,如果要在Format中加普通的字符串,可以用双引号隔开那些
特定义的字符,这样普通字符串中如果含特殊的字符就不会被显示为
时间格式啦:
FormatdateTime('"today is" c',now);
输出为:today is 2004-8-7 10:26:58
时间中也可以加"-"或"\"来分开日期:
FormatdateTime('"today is" yy-mm-dd',now);
FormatdateTime('"today is" yy\mm\dd',now);
输出为: today is 04-08-07
也可以用":"来分开时间
FormatdateTime('"today is" hh:nn:ss',now);
输出为:today is 10:32:23

/////////////////////////////////////////////////////////////////
三.FormatFloat的用法

常用的声明:
function FormatFloat(const Format: string; Value: Extended): string; overload;
和上面一样Format参数为格式化指令字符,Value为Extended类型
为什么是这个类型,因为它是所有浮点值中表示范围最大的,如果传入该方法的参数
比如Double或者其他,则可以保存不会超出范围。

关键是看Format参数的用法
0 这个指定相应的位数的指令。
比如:FormatFloat('000.000',22.22);
输出的就是022.220
注意一点,如果整数部分的0的个数小于Value参数中整数的位数,则没有效果
如:FormatFloat('0.00',22.22);
输出的是:22.22
但如果小数部分的0小于Value中小数的倍数,则会截去相应的小数和位数
如:FormatFloat('0.0',22.22);
输出的是:22.2

也可以在整数0中指定逗号,这个整数位数必须大于3个,才会有逗号出句
FormatFloat('0,000.0',2222.22);
输出是:2,222.2
如果这样FormatFloat('000,0.0',2222.22);
它的输出还是:2,222.2
注意它的规律

# 和0的用法一样,目前我还没有测出有什么不同。
FormatFloat('##.##',22.22);
输出是:22.00

E 科学表示法,看几个例子大概就明白了
FormatFloat('0.00E+00',2222.22);
输出是 2.22E+03
FormatFloat('0000.00E+00',2222.22);
输出是 2222.22E+00
FormatFloat('00.0E+0',2222.22);
22.2E+2
明白了吗,全靠E右边的0来支配的。

这个方法并不难,大概就是这样子了。

上面三个方法是很常用的,没有什么技巧,只要记得这些规范就行了。
我把它写出来,方便大家参考而已,没有什么特别目的

http://codegear.cn/post/2008/03/13/Formate79a84e794a8e6b395.aspx

标签: ,

关于Delphi的四舍五入

在网上常有人说Delphi的四舍五入有Bug!?
相反,我认为Borland考虑得很全面,这不是Bug!

Delphi帮助里面写得清清楚楚!

SimpleRoundTo :四舍五入(不对称算数做法)
RoundTo:四舍六入,五入单(银行家做法)
RoundTo(1.235, -2) = 1.24
RoundTo(1.245, -2) = 1.24

RoundTo是银行家的 做法,
SimpleRoundTo才是我们平时说的四舍五入!

http://codegear.cn/post/2008/03/13/delphi-roundto.aspx
对4舍5入国家有标准的。但是很多人根本不清楚。

标签:

whatever:hover

Most modern browsers support the :hover selector for any html element. This is cool, because it enables you to, for instance, apply a mouseover effect to table rows using only CSS. IE however, with a market share of > 90%, does not natively support :hover on elements other than links , rendering the entire :hover concept useless. Or does it?

IE allows you to look at the stylesheets and each individual rule with javascript. Normally, IE returns UNKNOWN for anything it does not support. This seems to sound reasonable at first, but it's not. For instance, a p:first-child would change into p:unknown, and a a[href] would altogether be molested to a capital UNKNOWN. Now why can't it just return the true selector text?

Fortunately, even though IE won't actually DO anything with a tr:hover the :hover is recognized and left alone.

http://www.xs4all.nl/~peterned/csshover.html

效果:

http://www.seoconsultants.com/css/menus/tutorial/

CSS这几年的改进真大。不过微软的IE5, IE6算是什么样的产品呢?

标签: ,

Dean Edwards, CSS2 for IE5,6

IE7 loads and parses all style sheets into a form that Explorer can understand. You can then use most CSS2/CSS3 selectors without having to resort to CSS hacks.

The lightweight script is a single-line inclusion in your HTML/XML document. No alteration of your original markup is necessary. Neither do you have to alter your CSS.

IE7 provides Microsoft Internet Explorer with support for W3C standard CSS and HTML:

  • supports the following CSS selectors:
    • namespace|selector
    • parent > child
    • adjacent + sibling
    • adjacent ~ sibling
    • [attr], [attr="value"], [attr~="value"] etc
    • .multiple.classes (fixes bug)
    • :hover, :active, :focus (for all elements)
    • :first-child, :last-child, only-child, nth-child, nth-last-child
    • :check, :disabled, :enabled
    • :root, :empty, :contains(), :not()
    • :before/:after/content:
    • :lang()
  • works with both HTML and XML documents
  • supports imported style sheets
  • preserves the cascade of the style sheet
  • does not alter the document structure
  • does not repeatedly query the DOM tree using JavaScript
  • uses pure CSS to enforce style sheet rules
  • supports the W3C box model in both standards and quirks mode
  • supports fixed positioning (flicker free)
  • supports overflow:visible
  • supports min/max-width/height
  • fixes broken (X)HTML elements (abbr, object)
  • standardies forms behavior
  • supports PNG alpha transparency
  • lightweight script (22K)
  • completely modular (add/remove fixes)
  • works for Microsoft Internet Explorer 5+ (Windows only)
http://dean.edwards.name/IE7/overview/

让Windows版本的IE5, IE6利用所有CSS2的选择器,以及来自尚未完成的CSS 3标准的许多先进器。Edward的IE7脚本让你使用选择器:before, :after, :first-child。。。。

标签: , , ,

星期三, 四月 16, 2008

三个期待````

1. Delphi for AS/400
这个消息是从范路先生这里得知的,CodeGear将发布一个专用于IBM AS/400 服务器开发的Delphi版本
2. Eclipse for Delphi
据说是 IBM 的一个新计划,具体情况不得而知.就以往的Eclipse来看,应该是会方便一下Web应用的开发,并且也不会像原本的Delphi那样拥有很多的组件.这倒底是好事还是坏事呢
3. Delphi2008/RAD Studio2008
终于能上Unicode了,等这一天不知等了多久,还有泛型之类的新特性加入,值得期待

http://hi.baidu.com/rarnu/blog/item/0f48ffed9a58864b78f05597.html

标签:

一點Delphi2008的消息

昨晚和范路先生吃了一頓晚飯,相互間也談起了各自的工作,未來等等。有意無意的也問了一些delphi2008的情況,的確是狠出乎我的意料,也許VCL2的強大程度是我所不能預料的。

delphi2008的新特性:
1. 支持Unicode,這個是眾多delphi程序員期盼已久的了,這次終於要實現了
2. 支持編譯64位的應用程序,它將成為64位系統下,效率最高的開發工具
3. for Win32 版本支持泛型,原本只是在Delphi.NET中有此功能
4. for Win32 版本支持反射,同樣的,原本只在Delphi.NET中有
5. delphi2008應當能直接編譯以前版本的源碼,並且使用FastMM作為內存管理工具

另外,會有一些新的框架面世,范路先生所說的Application Factory實在是狠吸引人
它可以讓開發人員在開發過程中就記錄下自己的知識,在更換人員時,交接將變得異常簡單
並且Application Factory可以跟據以前的程序以及定下的規則,快速的生成新代碼
這對於經常要開發同一種系統,但又需要為不同用戶定製需求時,將非常有用

另外,delphi2008也將會有 for win32和for .NET的版本

最後,也談了下delphi2008的價格,買一個授權的話,大概是在人民幣2萬到3萬元之間,但是可以批量的買
買得越多,價格也會越低,如果買1千個以上授權,也許可以降到每個授權5千以下
如果有1萬個授權批量的買,每個授權100元都是有可能的,現在在CodeGear-CN上也有人提出了此想法
就等著它實現了。

delphi2008的內測就在眼前了,等內測時,我會拿出一個詳細的測試報告,敬請期待。

http://hi.baidu.com/rarnu/blog/item/e335cd17d41fb40dc93d6dbd.html

标签:

配置 Python的wxWidgets可视开发环境

注:转载请注明出处

一、下载 Python 2.5.1
  这一步是必须做的,下载 Python 语言的 SDK
  下载地址(直接复制到迅雷):点击下载

  下载完成后安装 Python 2.5.1,注意安装路径中不要有空格,不然会引起一些问题。

二、下载 wxPython 2.8
  这将下载 Python 的可视化开发库,拥有它就可以进行可视化的开发了。
  下载地址:

    Unicode 版:点击下载
    Ansi 版:点击下载

  建议下载 Unicode 的,用 Ansi 版的话,组件标题不能写 Unicode 字符,代码包含 Unicode 字符也会出错。安装时注意,安装路径中不能有空格。
  到这一步为止,类库就齐全了,下面我们需要一个 IDE

三、下载 Boa Constructor
  Python 拥有非常多的开发环境,也就是 IDE。但是到现在为止,能完全支持可视开发的只有 Boa Constructor。使用它可以像使用 Delphi 那样,直接拖出控件进行快速的开发。
  下载地址:点击下载

  Boa Constructor 还是开源的,如果需要它的源码,可以点击下载
  注意,Boa Constructor 的安装路径也不能有空格。

四、配置 Boa Constructor
  打开 Boa Constructor,如果你是中文的系统,IDE 的语言会变成中文,你必须把它修改成英文的,在 工具->语言设置 菜单中将它换成英文。如果使用中文的 IDE,打开,保存文件时会发生错误(感谢纳米Baby提供这一信息,我自己的系统是英文的,试不出此问题)。
  点击 Tools->Python Interpreter Chooser,设置 Python.exe 的所在目录。
  关闭 Boa Constructor并重新启动它,配置即告完成。

五、一个简单的 Hello World 实例

  在工具栏中点击 wx.App 按钮,创建一个 wx 工程,这个工程将生成 2 个文件,一个是工程文件,另一个是窗体文件。

  然后将两个文件分别保存为 HelloWorld.py(工程文件) 和 Form.py(窗体文件)。在 Form.py 的显示窗口下按 F12,调出可视设计器。

  如上图所示,拖入一个 TextCtrl 和一个 Button。设置 TextCtrl 的 Name 为 txtHello,Value 为空。设置 Button 的 Name 为 btnHello,Label 为 Hello。

  然后我们要让 Button 按下时,TextCtrl 显示出 Hello World 字样。所以需要绑定 Button 的 OnButton 事件。在事件管理器中找到 OnButton,然后双击,点击 Apply 按钮。此时代码编辑器中会生成该事件相关的代码。

  如图所示,添加一行代码即可。然后运行程序,就能看到效果了。

标签: ,

TinyXML与wxWidgets

TinyXML 是一個小巧的 C++ XML parser Library,十分容易就可以整合到你的程式,而且學習曲線十分的短。

TiXmlNode

TinyXML 使用 node 的觀念來看待 XML 文件樹,TiXmlNode 就是代表著一個節點的 class。

Load and Save

TinyXML 使用 TiXmlDocument 這個 class 來載入/儲存 xml file。A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen.

TiXmlDocument doc;doc.Load( "myfile.xml" );

存取的時候,要先取得下一層的 Child Element:

TiXmlElement* element = doc.FirstChildElement();

也可以指定標籤來取得特定的 Element,如同下面的例子:

TiXmlElement* element = doc.FirstChildElement("Node");

TiXmlElement

The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes.
<foo>This is textfoo>

例如上面的片斷,我們可以使用 GetText() 取得被包起來的文字:
const char* str = fooElement->GetText();

TinyXML and wxWidgets

TinyXML 預設以 UTF-8 編碼,wxWidgets 編譯成 Unicode mode 時,傳入的參數需要轉碼,wxString 可以使用 mb_str() 轉碼,就可以與 TinyXML一起使用。

如果要轉換 UTF-8 char * 字串為 wxString,使用下列的方式:

const char* str = fooElement->GetText();wxString myString(str, wxConvUTF8);
http://www.cppblog.com/tx7do/archive/2006/04/24/6153.html

标签: , ,

星期二, 四月 15, 2008

没有时间

想做的事太多,没有时间。

还是打打游戏,浪费一下。

标签:

每天五分钟的Scrum Meeting能带给企业和个人带来什么?

by Gary Jia 上次修改时间: 2007-11-28 17:37

Scrum属于敏捷开发范畴的一种开发流程,以英式橄榄球争球队形(Scrum)为名,Scrum将软件开发团队比作橄榄球队,有明确的更高目标,具有高度自主权。紧密地沟通合作,以高度弹性解决各种挑战,确保每天、每个阶段都朝向目标有明确的推进。

Scrum的运行方式又很多种,很多公司应用起来也会有些自己的改变,一个简单的Scrum Meeting包含3个要点:

  1. 从上一次Scrum到现在你做了什么
  2. 从现在到下一次Scrum你要做什么
  3. 有什么问题无法解决的

一般如果大家坐在一起,那么每个人都说一下,可能也需要比较长的时间,不适合每天进行,但是如果通过一个多人协同交流系统(比如IRC)来进行,那 么就会迅速很多,多人可以同时发言,发言之后可以查看其他人的发言,效率大幅度提高。一般20人团队,只要没有重大问题,那么3到5分钟的时间就可以进行 完毕,非常适合在每天进行。那么有人会问,这样的几分钟的一个小流程能解决什么问题呢?对于没有亲身经历的人可能不太容易理解。可以这样说,每天的这短短 几分钟时间就能是每天的8小时的工作效率提高一大步的。为什么这样说呢,因为,虽然每个人只有3句发言,但是这3句话要说明,上一个工作周期都作了什么, 下一个工作周期要做什么,因为每天进行,所以大家很容易回忆起来你上次的报告是怎么说得,所以也就很容易的印证,你这次报告的已完成工作跟上次的要进行工 作是否匹配,也很容易知道,你的每个工作周期的工作量是否合适,我想每个人都一样,如果你自己都觉得你的这个工作周期的工作量不太够的话,那么你也一定会 认为别人都这样觉得,这是一个非常强烈的心里暗示,如果你这个工作周期的工作非常繁重,完成的状况非常好,那么你也就会非常的理直气壮了。所以因为每天的 这短短的几分钟处使你在整个工作周期都要集中经历,提高工作效率,这样每天的工作完成情况非常良好,那么也就不会产生无故的加班行为,那样你就有更多的个 人时间来进行你的个人事务,所以大家的工作效率都会非常的高,企业的整个项目进程也会相应的非常高效。这样企业也就可以赚取更多的利润,也就可以回报给员 工更多的利益。

所以我非常的不理解有些老板特别的喜欢看到员工坐在办公桌前超时工作(加班),感觉他好像榨取了更多的员工的价值一样。可是这样带来的必然是正常的 工作时间的效率低下,所以我对某些自以为很了不起的,标榜着自己的加班文化的企业很是不屑,明明可以在短时间之内完成的工作也要拖到下班再加班,可能还不 能完成。这样有什么意义呢。曾经有人跟我说过,在他的公司,如果你工作效率很高,反而得不到老板的赏识,因为老板认为你做的快说明工作没有难度,只有做得 慢了才说明难度大,才会受到重视,真不知道这是什么逻辑。

所以轻量级的迭代流程就显得非常重要了,可以在不浪费大量会议时间的情况下,对过往的流程进行快速的复查,发现问题,找到解决的办法。是提高工作效率的非常有效的手段。

就我个人而言,我是非常的反感加班的,即便有加班费我也宁愿准时回家吃饭、睡觉。

所以每天五分钟的scrum带给你的是什么呢?是高效的工作效率,更多的和家人在一起的时间。对企业来说,就是高效的完成项目进度,员工更快乐的工作,单位时间创造更多的价值。

http://blog.zenmeban.org/gary/archive/2007/11/28/five-minutes-daily-scrum

标签: ,

AgileTimes

Scrum/Agile适用?未试用过,仅引用,等有时间看看吧。

www.agiletime.com.cn

标签: ,

Scrum,敏捷?

Scrum老窝
http://www.scrumalliance.org/

RUP与Scrum的对话


文档选项

未显示需要 JavaScript 的文档选项

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 初级

Joe Krebs, 高级IT专家

2005 年 4 月 01 日

来自于 Rational Edge:本文介绍了被称为Scrum的灵活软件开发过程。作者阐述了软件开发团队在已有RUP环境中加入Scrum理念的技术。

illustration正 如你所知道的,RUP(Rational Unified Process,Rational 统一过程),是一种被广泛使用的软件过程框架。它可以很好地迎合你的软件开发过程的需要,还可以容纳其他技术。Scrum是一系列有趣的,用来包装灵活软 件项目的项目管理模式。本文介绍了Scrum的一些重要特性,并阐述了可以让你在已有RUP环境中加入Scrum理念的技术。我在工具条内提供了关于 Scrum和“灵活”的术语的词汇表,并且在下文中这些术语首次出现的地方用星号作了标记。

什么是Scrum?

Scrum 是一种灵活的软件管理过程,它可以帮助你驾驭迭代,递增的软件开发过程。Scrum于1995年由Advanced Development Methodologies,Inc提出,并在2001年“敏捷联盟(Agile Alliance)”形成后受到了更多欢迎。这个轻量的过程可以作为包装器,也就是说你可以把Scrum与其它灵活的过程框架组合起来,比如说RUP。

Scrum提供了一种经验方法,它使得团队成员能够独立地,集中地在创造性的环境下工作。它发现了软件工程的社会意义。Scrum一词来源于橄榄球运动,暗指这种情况:“在橄榄球比赛中,双方前锋站在一起紧密相连,当球在他们之间投掷时他们奋力争球。2

这 一过程是迅速,有适应性,自组织的,它代表了从顺序开发过程以来的重大变化。Scrum认为软件的开发不应使用和一般制造业相同的方法,也就是不应采用一 种反复的模式。这种重复使得输入和输出参数更加容易预测和描述,但这并不是当今软件工程的有益目标。现代软件工程的主要挑战包括上市时间,投资回报,以及 影响顾客的需要等。RUP和其他敏捷软件工程过程能够很好地迎接这些挑战。

http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/apr05/krebs/

敏捷软件开发模型--SCRUM


一 什么是Scrum?

Scrum (英式橄榄球争球队), 软件开发模型是敏捷开发的一种,在最近的一两年内逐渐流行起来。

Scrum的基本假设是:

开 发软件就像开发新产品,无法一开始就能定义软件产品最终的规程,过程中需要研发、创意、尝试错误,所以没有一种固定的流程可以保证专案成功。Scrum 将软件开发团队比拟成橄榄球队,有明确的最高目标,熟悉开发流程中所需具备的最佳典范与技术,具有高度自主权,紧密地沟通合作,以高度弹性解决各种挑战, 确保每天、每个阶段都朝向目标有明确的推进。

Scrum 开发流程通常以 30 天(或者更短的一段时间)为一个阶段,由客户提供新产品的需求规格开始,开发团队与客户于每一个阶段开始时挑选该完成的规格部分,开发团队必须尽力于 30 天后交付成果,团队每天用 15 分钟开会检查每个成员的进度与计划,了解所遭遇的困难并设法排除。


二 Scrum较传统开发模型的优点

Scrum模型的一个显著特点就是响应变化,它能够尽快地响应变化。下面的图片使用传统的软件开发模型(瀑布模型、螺旋模型或迭代模型)。随着系统因素(内部和外部因素)的复杂度增加,项目成功的可能性就迅速降低。


下图是Scrum模型和传统模型的对比:

三 Scrum模型

一) 有关Scrum的几个名词

backlog: 可以预知的所有任务, 包括功能性的和非功能性的所有任务。

sprint:一次跌代开发的时间周期,一般最多以30天为一个周期.在这段时间内,开发团队需要完成一个制定的backlog,并且最终成果是一个增量的,可以交付的产品。

sprint backlog:一个sprint周期内所需要完成的任务。

scrumMaster: 负责监督整个Scrum进程,修订计划的一个团队成员。

time-box: 一个用于开会时间段。比如每个daily scrum meeting的time-box为15分钟。

sprint planning meeting: 在启动每个sprint前召开。一般为一天时间(8小时)。该会议需要制定的任务是:产品Owner和团队成员将backlog分解成小的功能模块, 决定在即将进行的sprint里需要完成多少小功能模块,确定好这个Product Backlog的任务优先级。另外,该会议还需详细地讨论如何能够按照需求完成这些小功能模块。制定的这些模块的工作量以小时计算。

Daily Scrum meeting:开发团队成员召开,一般为15分钟。每个开发成员需要向ScrumMaster汇报三个项目:今天完成了什么? 是否遇到了障碍? 即将要做什么?通过该会议,团队成员可以相互了解项目进度。

Sprint review meeting:在每个Sprint结束后,这个Team将这个Sprint的工作成果演示给Product Owner和其他相关的人员。一般该会议为4小时。

Sprint retrospective meeting:对刚结束的Sprint进行总结。会议的参与人员为团队开发的内部人员。一般该会议为3小时。



二)实施Scrum的过程简单介绍

1) 将整个产品的backlog分解成Sprint Backlog,这个Sprint Backlog是按照目前的人力物力条件可以完成的。
2) 召开sprint planning meeting,划分,确定这个Sprint内需要完成的任务,标注任务的优先级并分配给每个成员。注意这里的任务是以小时计算的,并不是按人天计算。
3) 进入sprint开发周期,在这个周期内,每天需要召开Daily Scrum meeting。
4) 整个sprint周期结束,召开Sprint review meeting,将成果演示给Product Owner.
5) 团队成员最后召开Sprint retrospective meeting,总结问题和经验。
6) 这样周而复始,按照同样的步骤进行下一次Sprint.

整个过程如下图所示:




The diagrams in this article are all from web site: http://www.controlchaos.com. Thanks very much!

参考:
http://www.controlchaos.com/about/
http://www.microsoft.com/Taiwan/msdn/columns/200311softdev.htm

标签: , , ,

Google API地址索引

地图API
http://code.google.com/intl/zh-CN/apis/maps/documentation/index.html

Adsense API
http://code.google.com/intl/zh-CN/apis/adsense/

AJAX API集合
http://code.google.com/intl/zh-CN/apis/ajax/

Search API
http://code.google.com/intl/zh-CN/apis/ajaxsearch/

Open Social API
http://code.google.com/intl/zh-CN/apis/opensocial/docs/

Google Talk API
http://code.google.com/intl/zh-CN/apis/talk/talk_developers_home.html

Google Blog API
http://code.google.com/intl/zh-CN/apis/gdata/basics.html

这些地址留着备用。

标签:

Web开放趋势代表:无所不在的Google API

Web API(Application Interface)简单来说,便是透过开放的因特网传输协议,将提供的服务内 容以标准的界面来定义,以便进行点对点之间的服务整合。由于运行的平台是在Web架构之上,故常见的技术像是HTTP中的GET/POST、SOAP /HTTP, XML/RPC等,都是主要的组成架构,所定义的数据交换大都是属应用层以上。由于HTTP为企业对外及对内均会开放的传输协议,业已发展成熟,故以 HTTP为基础的Web API也降低了应用服务在整合上的门坎。

山「谷」之「歌」, 余音绕梁

Google
致力于网络技术研发及创新服务的提供不遗余力,从Web平台到个人桌面化服务,处处可见Google的踪迹。它在网络世界的布局已经由点(单一个别的 Google服务)展开到线(Google服务之间的彼此整合),未来将逐渐扩展到面(提供网络服务整合平台),可谓将Web 2.0的精神发挥得淋漓尽致。

延续对李开复的挖角事件,以及Google在台如同神秘般的征才流程,不管是「谷歌」还是网络上所戏称的「股沟」,Google对因特网所造成的影响已是 有目共睹,它的一举一动已经成为业界必然注目的焦点,纷纷被同业视为模仿及学习的对象,每次新服务的问世都对业界造成不小的震撼,甚至威胁到相关既有服务 的平台供货商,实在是令人又爱又恨的网络巨人。

条条大路通Google

您 会发觉Google所提供的网络服务到处都可以见到,像是使用率最高的网页搜寻引擎,桌面搜寻机制,实时通讯及电子邮件服务。就因为它友善方便的使用方 式,让使用者的接受度大大提高。加上Google技术领先的优势,提供高质量的产品及服务,更因此让使用者的忠诚度居高不下。

使用者除了 可以直接上Google的网站使用它们提供的服务之外,Google提供了这些网络服务的API配方,让许多厨师们都可以拿它来精心调制出美味的佳肴,随厨师的创意提供千变万化的网络服务,让大家都可以享受Google这个网络服务平台,使得您设计的应用程序内容更加丰富完整。

轻轻松松跟Google打交道

在Google所提出的服务精神,希望每个因特网使用者都能享受它们所提供的任何服务,当然不只是信息人员。所以在与Google服务整合上,也让使用者不会感到有相当高的门坎,也能轻松上手。

过 去大家讨论的API通常会围绕在程序代码上打转,实在太严肃,会让读者们觉得那是要会写程序的人才会用到的东西,事实上在所有Google所提供的众多服 务 中,也提供了不需要撰写程序亦可以使用的整合界面,使用的方式都是相当轻松容易的,而且其强大的功能会让您直呼不可思议呢!

就目前Google所提供的网络服务API,依其功能型态及使用时机大致上分成三大类:
  • 强化网站功能(Enhance Your Web Site)
若您已经有自己的网站或部落格,可以透过这类功能来强化您网站的机制,以及提供完整的网站分析管理功能,让经营您的网站更省事,更简单。
  • 一般使用者功能(Reach Google Users)
主要针对Google所提供的Client软件,适用于一般使用者,提供可以安装在个人计算机桌面中的小工具(Gadget)。这些以XML为主要撰写语言,让您的日常工作可以透过桌面与Google之间的密切结合更有效率。
  • 提供整合界面(Integrate with Google)
这是针对进阶使用者,尤其是具有程序撰写能力的开发人员所提供的程序界面,您可以依您所擅长的程序语言(Java, Perl, Python, PHP, Ruby及.NET等),透过标准的传输协议及开放标准来进行实作。
接下来便针对一些热门的API功能进行介绍。

Google AJAX Search API

在 所有Google的Web服务中,最常被大家使用的便是其强大的搜寻引擎功能。在一个功能完整的网站里,搜寻机制已经是基本配备,在过去这样的功能需要导 入某特定搜寻引擎的软件套件,安装在自己的机器上才能达成的理想,现在仅仅需要在Google网站上申请一组API License Key,便可以享受Google既有的搜寻功能,而不需要在自己家里搞一套搜寻引擎主机。

若您对撰写程序有很大的学习障碍,Google提供了一种懒人机制,以增加HTML及JavaScript程序代码的嵌入方式,就可以将Google的搜寻机制免费安装到你的网站中,而且还结合了最酷炫的AJAX技术,这样的搜寻机制远比自己动手写程序来得容易多了。

从 图中您便可以很清楚看到,透过这样的整合,不只是提供网页内容的搜寻,连视讯、部落格、新闻、地图等内容都可以一并呈现。这些不同性质的内容是透过 Google Gadget组件组合而成,像是Video Gadget、Map Gadget等,模块化的结构让您可以弹性变动搜寻的结果,而在这个内嵌框架的里头所使用的AJAX呈现技术,让操作方式更加友善便利。

Google Web API

当 然,除了简单的嵌入整合方式,手痒的程序开发者也可以透过Google所提供的API来将它的服务整合到自己的应用程序中,Google针对搜寻机制提供 的API十分完整,您可以透过Web Services的业界标准界面让整个操作使用更加流畅,这便需要花点心思写点程序才有办法达到的,可以依照您的需求进行客制化,整合程度更高。

这 个函式库里包括了.NET(C#), VB及Java的范例程序、WSDL描述文件、API参考手册,及Java Doc文件。由于目前的Google Web API是透过Web Services的架构,所以只要依照WSDL描述档的定义,以SOAP的方式呼叫取得搜寻结果即可,所以只要程序语言本身可以撰写出SOAP Client就可以使用。若您是采用Java为主要开发语言,Google Web API提供已经包装好的SOAP Client链接库,只花几行程序即可撰写完成,相当容易。

为了让资源能有效分享给普罗大众,Google针对每个申请者有使用上的限 制。针对每个使用授权每日仅能呼叫1000次,而且每次的查询结果仅回传前1000笔,回传则以最多10笔为一个单位,而搜寻内容则不包括图片、新闻等其 他内容,仅限于网页数据,如此设计均是为及提升执行效能所做的考虑。

当然,这样的函式库是提供研究性质之使用,而未被授权于任何与商业有关之应用。在使用之前您最好还是详读一下授权合约内容。

Google Web Toolkit (GWT)

相 信您使用了一些Google所提供的服务后,会对它在网页上呈现的AJAX动态效果印象深刻,这样的设计对于使用者经验是有正面评价的。但对AJAX这样 的技术也许对许多开发人员仍然是陌生的技术,要能及时熟练上手也许会有困难,加上AJAX本身在开发测试过程中会有一定的困难度,故贴心的Google研 发团队便将其相关的技术以Java方式来呈现,提供更广泛的Java使用者也能开发出AJAX的应用程序。

您可以将GWT视为Java软 体框架,GWT具备了动态可重用的特性,开发者只需要引用GWT提供的链接库即可设出美美的AJAX UI画面,避开了在Javascript程序撰写时不易除错的问题,所有的开发方式可以依循原有的Java开发程序,结合您所熟悉的Java IDE工具(像是Eclipse)进行开发,同时也可以与JUnit整合,将单元测试自动化以提高效率。

GWT提供了Java-to- JavaScript Compiler,可以将您结合GWT所撰写的Java程序代码转译成具备AJAX功能的JavaScript内容。在开发过程中,您可以利用Host Mode对Java程序进行测试,而不需要每次都转成JavaScript才能测试最终产生的结果。而Web Mode则是将所有的Java程序转成JavaScript后实际以Web界面执行的方式。

在GWT里已经帮您解决了AJAX对不同浏览器的支持问题,您只需要针对UI版面配置进行设计即可。GWT提供了数种Panel应用在不同的版面配置,类似AWT中的Layout Manager功能,所以你会发觉程序的写法有点像在写Swing应用程序。

Google Map API

若 您的应用程序中需要提供地理信息,包括地理行政图、地区街道明细、以及路线规划建议等, Google Map服务是个不错的选择。它提供了世界各地的地理信息,同时可以选择地图、卫星鸟瞰图、以及混合显示等呈现方式。进一步它还可以提供您设定起迄点之间的 实际距离,以及最佳路线建议等。

若您只是使用呈现地图的单纯功能,那就太小看Google Map了。为了让地图能更具可读性,在上面加注信息是免不了的。Google Map API提供了Marker(以标识符号突显某特定的地点),InfoWindow(加注说明文字于讯息框中),及Polyline(以画线方式标示路线或 范围)等注记方式。其实在技术上的整合亦十分简单,此API亦是利用HTML与JavaScript内嵌方式来达成。

此服务整合常见的应用如房屋中介(提供查询对象的所在地理信息),求职讯息(提供征才企业的所在位置),旅游情报(提供旅游景点位置及重点地标),交通路况查询(提供两地之间最佳路径)等,让仅仅只是冰冷的地址文字加上更丰富的图像信息。

美 中不足的是,目前Google Map对于台湾地区的地图信息提供仅限于卫星影像,而行政地图的部份仍然未臻完整,对于想要提供区域性网站信息的内容则稍嫌不足。而类似的服务您也可以参 考由国人开发的UrMap你的地图网(www.urmap.com),此网站服务亦提供Web API可供呼叫,使用的组件架构也十分类似Google Map的设计方式,加上其提供的台湾地图街道行政区信息较为完整,比较符合国内网站的应用需求。

Google Toolbar API

对 于Google工具列应该大家都不陌生,其方便强大的功能已经成为浏览器的必备套件。在下载安装Google工具列之后,在工具列上预设的按钮功能也许仍 然无法满足您的需要,所以Google工具列提供了API让有兴趣自行设计工具列按钮的玩家们来使用,您也可以在Google 工具列上设计自订按钮功能,将一些常用的网址连结、RSS信息提供内容放到工具列上,在使用上更为便捷。

只需要撰写简单的XML档案,引用Google工具列特定的卷标语法,就可以制作出您想要的功能按钮。您也可以到Google工具列的按钮集页面中,搜寻别人已经提供的工具列按钮,也可以将您的精心杰作与其它Google工具列的使用者分享。

Google Desktop SDK

Google除了在网络服务上有着卓越的使用率外,对于个人桌面的市场亦野心勃勃,自行推出桌面搜寻工具后,连微软也不得不承认一向占有优势地位的桌面也感受到威胁,也推出类似的桌面搜寻工具,颇有相互较劲的意味。

新 一版的Google Desktop 4除了包含既有的桌面搜寻功能之外,还提供可以与网络服务直接连结的侧栏(Sidebar)功能,让您不需要开启网页浏览器也可以使用Google提供的 网络服务。侧栏可以让您下载安装许多与Google现有网络服务结合的Gadget小工具,像是实时新闻气象服务、Gmail个人邮件浏览、个人相簿、行 事历及待办事项等等。Google已经将Desktop视为网络服务的延伸平台,让它的服务更能深入个人桌面前端,结合得更密切。

当然在 Desktop平台方面,Google也提供了开发Gadget的SDK,让您可以设计出属于个人色彩的桌面小工具,成为侧栏的一部份。SDK支援 JavaScript, C, C++, C#, and/or VB.Net等技术,下载的SDK中也包含一可视化设计工具Gadget Designer。Google也鼓励那些网站内容提供者,利用Google Gadget SDK开发出自己网站专属的Gadget,并公布到Google的目录中供下载使用,进而让更多的使用者认识这些具有特色的网络服务,打响自己的知名度。

其它Google API

Google API种类繁多琳琅满目,以上仅针对较常被使用的部份进行介绍。如果您需要参考关于Google API的技术资料,您可以造访http://code.google.com,这儿包括了所有的API分类及相关说明,函式库也是从这儿下载使用。以下便 列出所有Google API的清单供大家参考:
Google API
说明
Google Account Authentication
针对Client软件(ClientLogin API)Web应用程序(AuthSub API)Google会员的身份认证功能。
AdSense API
提供与Google网络广告的整合,可以在您的网页上置入AdSense网页,利用Google播送平台发送网络广告并进行相关的广告管理功能。
AdWords API
提供广告客户自己的应用程序可直接对Google AdWords Server主机进行广告活动设定及管理。
Google AJAX Search API
提供Web Search功能以AJAX方式呈现,在您的网页上以嵌入方式提供Google搜寻功能。
Google Base Data API
提供对于Google Data的数据存取功能
Blogger Data API
Blogger服务整合,提供从您的网络服务对Blogger.com的内容进行编辑的功能。
Google Calendar Data API
Google Calendar服务整合,可以透过它进行事件更新,
Google Data APIs
提供针对Google Blogger, Google Base, Google Calendar等服务的数据交换功能。
Google Desktop SDK
提供建构在Google Desktop平台上的开发工具,应用程序可以直接利用它来开发出桌面小工具。
Google Earth KML
利用KML定义的地理信息来与Google Earth服务整合。
Google Gadgets API
用来开发Google Gadget小工具,Gadget又分成Universal GadgetDesktop Gadget,依您的需求使用不同的API来进行整合开发。
Gmail Atom Feeds
提供以Atom方式呈现Gmail信收件夹内容,将Gmail内容整合到您的网页中以利快速阅读。
Google Checkout API
Google提供的电子商务在线付款机制整合。
Google Web Toolkit
提供以Java链接库设计Web AJAX界面之功能。
Google Groups Feeds
提供搜寻网上论坛(Groups)并以AtomRSS呈现结果
Google Maps API
提供与Google Map服务整合,在您的网页中提供地图服务,并与网页数据密切结合,提供图文并茂的呈现方式。
Google News Feeds
提供搜寻新闻(News)并以AtomRSS呈现结果。
Google Related Links
取得Google搜寻结果后之类似网页的内容。
Google Search Appliance APIs
提供了Search Protocol, Feeds Protocol, Authorization Protocol三种数据传输协议
Google Search History Feeds
提供个人化搜寻历史记录之查询, 包括网页, 新闻等内容的搜寻记录。
Google Sitemaps
提供让Google搜寻能更精确的方式,提高您的网站在搜寻结果的曝光率。
Google Talk XMPP
提供与Google Talk之间讯息传递的通讯协议。在您的应用程序中需要提供与Google Talk相互联系或状态查询时可使用。
Google Toolbar API
提供Google工具列客制化按钮的功能。
Google SOAP Search API
透过Web Services方式呼叫,将Google的搜寻功能整合到自己的应用程序或网页中。
与开放源码社群的紧密结合

除了Google自己提供的工具套件及程序接口外,您也可以在开放源码社群中找到不少与Google服务有关的项目。为Google如痴如狂的使用者不在少数,这些开放源码提供了Google功能的延伸应用,也是您的不赖的另类选择。

若您是Mozilla FireFox的爱用者,除基本功能已经提供了Google的搜寻功能列之外,您还可以下载安装针对Google量身设计的扩充套件(Extension)来使用,像是CustomizeGoogle等。

结语

在Web 2.0的世界中,Google只是其中一个比较显著且知名的例子,其它像是Amazon, Delicious, Cocomment等许多网络服务平台,也都提供Web API的机制。单纯来自一种数据来源已经无法满足现今网络使用者的需求,未来的服务将是以软件混搭(Mashup)的概念(意即Web应用系统整合多种不 同的信息来源)来发展,信息的整合势必是未来的趋势

http://news.csdn.net/n/20061223/99842.html

书到用时方恨少。2006年的冷饭现在要炒炒了。不是炒新闻,是需求。

标签:

Google Maps API 2 文档

第一个程序:
http://www.codechina.org/doc/google/gmapapi/#The_Hello_World_of_Google_Maps

做好的东东:
http://zmap.org/

标签:

挖掘Google隐藏的超强圆角效果

由. Ken Wong 将文章归档于 G源共享

Google_roundcorners.gif

  在设计网页的时候,要实现圆角效果,有N种方法,随便Google一下就可找到很多。但如果我们不想自己动手写这么多代码,又或者根本不想利用自己服务器上的图片,那该怎么办呢?不怕,因为Google本身就隐藏着一个极强大的圆角效果,我们只需要直接把它挖出来用就行了。

  Zach是个圆角效果爱好者(via Philipp),因此每次看到某个网页上有漂亮的圆角,他都会习惯性地查看一下源代码,看看是怎么做出来的。这一次他发现Google在Groups beta里使用的圆角效果相当不错,于是他在源代码里找了一下,发现原来Google本身就有一个强大的圆角效果,并且它是现成的,你可以直接使用它。

  下面就是Google的圆角图片的地址:

http://google.com/groups/roundedcorners?c=0000FF&bc=white&w=40&h=40&a=tr

  效果如下:

Google_roundcorners.gif


  你可以自定义圆角图片的属性:

1.c表示圆角图片的颜色;
2.bc表示圆角图片的背景颜色;
3.wh分别表示圆角图片的宽和高;
4.a表示圆角产生的方向,tl是左上角,tr是右上角,bl是左下角,br是右下角。

  比如我们可以调整上面的属性参性,做出一个"宽和高均为100px、位于右上角的蓝色圆角图片":

Google_roundcorners.gif

  可见你不需要写额外的代码,也不需要使用自己空间里的图片,你要做的只是在设计网页的时候,直接调用Google现成的圆角图片,并且根据自己的需要定义它。当然,这样做的缺点是当Google服务器无法访问时,圆角图片就显示不出来了。

http://www.gseeker.com/50226711/googleeecee_52285.php

标签:

GSeeker: Google API例子

如果你还记得,去年我们曾经介绍过直接利用Google服务器上的图片生成功能制作圆角图片的方法。但那是一种非官方的应用。今天Google Code里推出了一个名为Google Chart API的API,利用它我们便可制出各种统计图表。这个API是由Google苏黎世分部的员工利用20%时间创造出来的。更重要的是,这是一种官方支持的正式应用。

  同样地,我们可以直接利用Google Chart API的链接参数来实现各种统计图表的制作。当前Google Chart API能自动生成线形图、柱形图、饼形图、散点图、曲线图。比如我要做出下面这样一个饼形图:

gseeker-chart1.png

  只需要直接利用Google Chart API的这个链接即可,因为它的结果就是生成这张图:

chart.apis.google.com/chart?cht=p3&chd=s:hW&chs=450x200&chl=GSeeker|Readers

  我们可以看到这个链接里有好几个参数,这些参数的含义是:

*cht=p3(chart type,图表类型;p3表示这是一个三维立体的饼形图)
*chd=s:hW(chart data,图表数据;h代表33,W代表22)
*chs=450x200(chart size,图表尺寸;450x200像素)
*chl=GSeeker|Readers(chart label,图表标签;内容可自定义,但不支持直接写中文)

  要了解Google Chart API的详尽用法,你可以进入它的Google Code专页

  补充fisker利用该API制作了一个更简易的饼图生成器:

  http://ifisker.com/blog/post/0712/chart-printer.html
http://www.gseeker.com/50226711/cgoogle_chart_apice_130159.php

标签:

旅鼠

旅鼠属于啮齿目仓鼠科,共有四个属:环颈旅鼠属,旅鼠属,林旅鼠属和沼泽旅鼠属。

旅鼠腿短,耳朵小,毛软。除尾巴外,全身长10-18厘米。毛上层为浅灰色或浅红褐色,下层颜色更浅,有的旅鼠在冬天毛色变为全白,有利于保护自己。主要分布于挪威北部和欧亚大陆的高纬度针叶林,以根,嫩枝,青草和其他植物材为食,天敌有贼鸥,雪鹗,北极狐黄鼠狼等。

http://baike.baidu.com/view/18912.htm
陪儿子看电视,发现这小东西长的可真肥。肥?对了,看来现在猪肉价格是有点高了~~~,随时随地起反应。

标签:

无题

相信有一天,所有这东西的受益者必将怀有感激的心情看着我。

标签:

带翅膀的奔驰-江淮宾悦


那天看到这天,第一感就是,谁把奔驰停这了?
从侧面看,因为视觉误差,整个Logo部分与奔驰无疑。
不过当你稍稍变动角度,2只小巧的翅膀进入视线。是谁这么好创意?
如果把这心思用在造车上多好?
如果把这心思用在质量管理上多好?
如果,
如果只是如果,
如果真是这样,相信街上都只有国产车(千万别拿国产大众,国产福特之类说事~~~~)

标签:

ruby on rails为什么暂时无法成为企业应用开发的主流?

作者robbin

今天上午和庄表伟在msn上交流了一些看法,下午和JavaEye2.0的主力开发人员jerry讨论了关于ruby on rails在企业应用开发和团队协作的问题。通过讨论,有了一些初步的想法和观点,虽然还不是很清晰,但是现在总结和记录下来,留待今后的实践来验证。

ozzzzzz在Java将死?中提出了一个衡量未来主流工业语言的标准,其中有一条很有意思:

ozzzzzz 写道

1. 应该能规范书写,而不是像c那样可以造就多种不同的风格。


Java明显是一个编程风格非常容易统一起来的语言,而ruby则很明显是一个难以统一编程风格的语言。JavaEye论坛里面有人曾经说过:

引用

Java语言,高手和低手写出来的代码都差不多,而ruby则不同,高手和低手的代码,高下立判


Java编程语言的语法非常简单,规范比较严密,这样规范化带来的好处就是,一旦程序员具有比较良好的面向对象编程基础和设计模式的掌握,那么编写出来的代码几乎是大同小异的。

为什么优秀的Java开源框架的源代码我们读起来都比较容易呢?为什么Java那么容易写出来无二义性,相似度那么高的代码风格呢?为什么用 Java做同样一件事情,往往只有一种最优的写法呢?为什么Java很难搞出来奇技淫巧呢?为什么Java语言一直被人认为是大巧若拙呢?我们再想想,为 什么JDK5.0引入的技巧颇高的泛型编程到现在也有三年,为什么还是没有被广泛采用?再想想Java语言被设计出来是用在什么场合的呢?

想清楚这些问题,那么我们就会发现Java成为企业应用开发主流的一个内在原因(外因也很多,这里不谈),因为Java语言足够死板!

所以写Java程序没有什么花巧,所以为了弄出来点花巧,逼的Java社区搞出来动态反射,搞出来AOP,抄袭了泛型,其目的都是增加Java语言的灵活性。

那么Java这种死板而简单的语言有什么好处呢?好处就是适合作为工业语言!

那么我们分析一下工业语言在语法上面有着什么样的要求呢?

1、语法足够简单而且强壮
2、语法足够死板、做同样的事情,只有一种最优解
3、足够的语法障碍,抑制你的随意发挥,给我规规矩矩的编码

工业语言为什么有这种内在的要求呢?

1、团队协作的需要
大规模的项目需要几十人以上的协作,甚至是异地协作。这种大规模的团队协作要求程序员的代码风格必须高度一致,并且代码块之间的依赖性降到最低。显然死板而容易解藕的Java非常的合格

2、批量生产的需要
现在的软件外包产业体现的尤为明显!不需要你的创意,不需要你的设计,就需要你的coding,而且coding风格,功能已经规定死了。Java显然又非常合适。


好了,上面分析了从语法特点角度,为什么Java成为了工业语言,那么再分析一下为什么ruby不能成为工业语言:

1、ruby的语法过于灵活,发挥的余地太大,导致每个人的代码风格迥异

我刚开始学习ruby的时候非常不适应,被ruby五花八门的语法糖衣搞晕了,同样的一件事情,你有无数种做法,笨拙的,普通的,聪明的,天才的,各式各样,甚至有本《ruby quiz》的书专门讲解ruby编程的各种奇技淫巧。ruby这种内在语法特性直接造就了ruby on rails奇迹。在ruby on rails框架里面,有无数的ruby magic,好用之极又让你惊喜万分,没有ruby这么多灵活的语法支持,rails变不出来这么多魔术。

但是ruby的语法灵活性恰恰是成为工业语言的一大障碍!Java绝顶高手和Java普通高手的代码在风格上不会有大的差别(我就不觉得Rod Johnson代码比我高明到哪里去),但是ruby绝顶高手和ruby普通高手的代码简直判若云泥!高下立判!绝顶高手如DHH把ruby用的出神入化叹服之余,也让你我之辈根本无法写出来符合DHH风格的ruby代码。

在我们JavaEye2.0网站开发中,也出现了这种问题,两个人写的ruby代码,互相之间理解起来存在困难。而由于做一件事情有很多ruby写法,不同性格的人甚至都会选择不同的实现方法,在一个团队中,要统一编码风格,实在难乎其难!而在Java项目中,基本可以杜绝此类问题。

由于代码风格难以统一,因此在大规模的团队中使用ruby编程,会造成合作上面的障碍!


2、ruby on rails会导致你的代码藕合度非常高,不利于团队协作开发

由于rails规定死你的代码框架,不论是横向的功能解藕,还是纵向的分层解藕,都比较困难。

首先来说纵向的分层解藕,这是Java大规模项目常用的办法,但是在ruby on rails中基本不可能。因为ruby on rails各层之间的隐式约定太多了,你不可能分层开发。目前ruby on rails项目都是建议横向功能解藕,不建议纵向分层解藕的。

再说横向功能解藕:首先每个人必须承担足够大颗粒度的功能模块,不能拆分的太细了。因为rails的一个Controller文件就代表一大块功能了。

例如JavaEye2.0中,整个forum就只有一个controller,整个blog也就只有一个controller。当然你惊叹,整个forum代码就一个文件搞定了啊,代码太少了!但是反过来,你也可以说,论坛这个功能只能交给一个人来做了,没有办法再拆分功能了。这就带来了一个问题,团队协作变的困难了,如果两个人同时做论坛模块,就会出现经常性的该controller文件冲突合并。即使妥协一下,每个人只负责一个大功能块,但是底层的model代码都是互相关联在一起的。又难以避免的并发修改和文件冲突合并。

但是Java不存在这个问题,为什么呢?因为Java把一个Controller分解成为了无数个小Action,把一个Model分解成为了PO,DAO,Service,进行了充分的功能职责的解藕,每个人的工作基本不会互相干扰,那么团队协作的问题就好办了。

在JavaEye2.0开发过程中,就遇到了这个问题,即使是分出来一小部分任务,也经常性导致文件冲突合并,最后只能把大部分的程序任务压到了 jerry一个人身上。可敬的jerry同学几乎以一人之力编写了整个JavaEye2.0的绝大多数代码。在惊叹jerry以一个人月的高效率完成整个 JavaEye2.0编码工作的同时,我们也不得不反思,为什么ruby on rails这样难以团队协作开发呢?

在我最推崇的《Getting Real》这本书里面建议一个开发团队3个人足够了,一个人设计规划产品功能,一个人设计界面,一个人编写代码。我们现在也是这样的:robbin设计产 品功能,ouspec负责界面,jerry编写代码,然后robbin和ouspec负责测试。但并不是所有的项目都可以靠3个人搞定的,大规模应用项目 团队协作进行开发,我们目前还没有答案。

jerry有个观点我非常赞同,他认为目前我们没有找到合适的团队协作方法是因为现在的软件开发方法都不适合ruby on rails开发团队。而真正适合ruby on rails的软件开发方法究竟是什么样子,现在还没有出现,恐怕需要人们的探索了。ruby on rails流行必须伴随着适合ruby on rails的软件开发方法一起出现才行。

因此在人们总结出来这种适合ruby on rails的软件开发方法之前,ruby on rails仍然会被局限在web2.0开发领域,在这个领域,ruby on rails的所有优点将发挥的淋漓尽致,而缺点将会被回避开。不过一旦涉及到企业应用开发领域,我们将面临这些问题。

因此,我的结论就是ruby on rails目前尚且不适合企业应用项目的开发。当然如果有适合ruby on rails的软件开发指导方法的出现,或者企业应用本身的定义已经发生了彻底的改变,那么我的结论也就不复存在了。

用一句话来总结就是:

ruby on rails是武林高手的绝世宝剑,却不是两军对垒中士兵使用的常规作战武器(Java却是这种常规武器)。


BTW:我抛出来这个结论,并不代表我的想法已经很成熟了,事实上这也只是我们第一次尝试使用ruby on rails,在不熟悉不了解的情况下做出结论,未免过于草率,但是我之目的在于抛砖引玉,目前我们在开发中遇到了这些团队协作方面的问题,希望我的抛砖能够引出来好玉,解决这些我们还没有想到很好解决办法的问题,多谢啦,哈哈!


http://www.javaeye.com/topic/24499

标签:

wxWidgets是个好东西

最近一个工具,由于是工具,本来是用SDK编写的,只是功能完成后,对界面不满意,但是苦于手头可用的东东有限。。。

MFC?这玩意儿,我从大三开始研究,把各类宏,消息映射机理,搞得很清楚,看了《深入浅出MFC》不止两次,还搞不出东西,于是又看了 《Programming Windows With MFC》终于好像能搞出一些DEMO, 后来碰到一聊友,说“把MFC扔进垃圾堆,永远不要碰这种东西……”

VCL! 是个好东西,虽然不会Delphi,但C++ Builder也很好用,虽然对C++改了些语法和语意,嘿嘿。 Chuck 和 Anders这两个牛人。

SWT/JFace: 可以说这一年多一直在进行着基于Eclipse的RCP开发,所以对SWT/JFace也很熟悉,而且Java语法优美简洁,比起C++,写起来轻松多了 (不仅是生理上的,而且是心理上的: 这个 new 要不要 delete,不行,应该用RAII, 参数不能是直接是类型,应该改成const引用以避免拷贝…… 哇,不想这些了,自然轻松和愉快)

所以如果对方机子上有JVM,或者允许安装JVM的话, 我会选择SWT/JFace

当然,如果对于大一些的窗口程序,使用 Eclipse RCP 简直酷B了!

偶有一次,在使用Ruby,遇见 wxRuby,这东东的文档中提到了 wxWidgets, 于是就这样结识了它(本人我是古墓派)

于是立马下载,安装,编译,哇噻! 还有许许多多的 samplesssssssssss。除了自带的帮助,我还找到了一本由 Julian Smart(我以后就给我儿子取名叫 "X有钱") 亲自写的《Cross-Platform GUI Programming with wxWidgets》...

然后我把我那个类似于资源管理器的小工具用 wxWidgets 重新写过。 果然不错

我的手头又多了一样武器~~~

http://www.javaeye.com/topic/100094

标签:

星期一, 四月 14, 2008

微软称IE 8将推动网页开发人员技术创新

微软本星期在拉斯维加斯举行的MIX08会议上预展了其下一代网络浏览器.微软首席软件设计师Ray Ozzie称,微软向IE 8的投资将使开发人员和设计师能够为网络应用程序、丰富的客户端软件、移动和其它设备提供广泛的无缝的连接的体验.微软IE团队总经理Dean Hachamovitch表示,IE 8将向网页开发人员提供的功能是他们需要的内置的工具,以帮助减少提供互联网内容的难题和复杂性。

Hachamovitch说,开发人员要做的事情是提供迷人的体验.但是,开发人员要实现这个目的需要花费许多宝贵的时间.当开发人员把更多的时间用于技术创新的时候,网页会变得更好.我们研制IE 8的时候就考虑了这个问题。

微软目前提供的IE 8测试版下载主要是面向开发人员的.开发人员将向微软提供重要的反馈意见.Hachamovitch说,这里的关键是我们现在只完成了部分工作,还有需要工作要做。

Hachamovitch说,IE 8的一个目标是让开发人员迅速制作多种浏览器可以访问的网站.目前浏览器的差别让开发人员浪费了许多时间.微软将采用一些标准以实现互联网兼容性的目标。

IE 8的功能改善了对XML和CSS等标准的支持.IE 8在一个可视化的环境中还提供了快速调试HTML、CSS和JavaScript等程序的工具。

Hachamovitch还披露了IE 8的两项技术创新.这两项技术创新的名称是“Activities”和“Webslices”,能够提高浏览器用户的网络浏览体验。
http://www.onlea.com/blog/article.asp?id=102

标签:

IE8 测试版

IE8

http://www.microsoft.com/downloads/details.aspx?FamilyId=1A2E3DDD-B38B-439D-BBA7-F179A5D3ECAF&displaylang=zh-cn

标签:

星期日, 四月 13, 2008

花神(十二月)

蜡月水仙--花神娥皇与女英(借水开花自一奇,水沉为骨玉为肌。)

  水仙别名金盏银台。水仙开于蜡梅之后、江梅之前,为冬令时花,花如其名,绿裙、青带,亭亭玉立于清波之上,素洁碧玉般的花朵冒雨而开,超尘脱俗,宛如水中仙子。
  水仙的花神相传是娥皇与女英。据说,娥皇、女英是尧帝的女儿,二人同嫁给舜。姊姊为后,妹妹为妃,三人感情甚好,后来,舜在南巡崩驾,娥皇与女即双双殉情于湘江。上天怜悯二人的至情至爱,便将二人的魂魄化为江边水仙,二人也成为蜡月水仙的花神了。
  乐曲由木管吹奏出淡淡的和弦,如湘江粼粼波光。古筝的清雅旋律,形容出水仙犹如凌波仙子的仙姿。高胡柔细的音色,画出水仙的碧叶如带,芳花似杯。雅洁恬静的旋律,散发出沁人心脾的幽香,一如娥皇女英的至情至爱,动人心怀。

标签: ,

花神(十二月)

蜡月水仙--花神娥皇与女英(借水开花自一奇,水沉为骨玉为肌。)

  水仙别名金盏银台。水仙开于蜡梅之后、江梅之前,为冬令时花,花如其名,绿裙、青带,亭亭玉立于清波之上,素洁碧玉般的花朵冒雨而开,超尘脱俗,宛如水中仙子。
  水仙的花神相传是娥皇与女英。据说,娥皇、女英是尧帝的女儿,二人同嫁给舜。姊姊为后,妹妹为妃,三人感情甚好,后来,舜在南巡崩驾,娥皇与女即双双殉情于湘江。上天怜悯二人的至情至爱,便将二人的魂魄化为江边水仙,二人也成为蜡月水仙的花神了。
  乐曲由木管吹奏出淡淡的和弦,如湘江粼粼波光。古筝的清雅旋律,形容出水仙犹如凌波仙子的仙姿。高胡柔细的音色,画出水仙的碧叶如带,芳花似杯。雅洁恬静的旋律,散发出沁人心脾的幽香,一如娥皇女英的至情至爱,动人心怀。

标签: ,

花神(十一月)

十一月山茶--花神白居易(似有浓妆出绛纱,行光一道映朝霞。)

  山茶花开放在寒风细雨的农历十一月,花朵五彩缤纷,有大红,粉红,紫白,纯白等。百的色胜玉,红的如火燃烧淡赤。万紫千红,飘香吐艳,为寒冷的大地增添了几分愉悦的色彩。
  山茶花的花神传说是白居易。白居易是唐代知名的诗人,以“野火烧不尽,春风吹又生。”的诗句,备受称赞而闻名于世。传闻中并没有说明为什么白居易是山茶的花神,或许是诗人不畏强权的性情,如同山茶的不畏寒风细雨吧。
  乐曲在琵琶化成的点点寒风中,进入了云南的山水间。二胡缓缓而出,如微寒的细风轻轻吹拂着山茶绿叶。竹笛明亮的音色,仿佛山茶花自绿叶中吐蕊,朵朵艳丽。

标签: ,

花神(十月)

十月木芙蓉--花神石曼卿(江边谁种木芙蓉,寂寞芳姿照水红。)

  木芙蓉又名木莲,因花“艳如荷花”而得名,另有一种花色朝白暮红的叫做醉芙蓉。木芙蓉属落叶灌木,开在霜降之后,农历十月就可以在江水边,看到她如美人初醉般的花容,与潇洒脱俗的仙姿。
  木芙蓉的花神相传是宋真宗的大学士石曼卿。宋代盛传在虚无缥缈的仙乡,有一个开满红花的芙蓉城。据说在石曼卿死后,仍然有人遇到他,在这场恍然若梦的 相遇中,石曼卿说他已经成为芙蓉城的城主。因为在众多传闻中,以石曼卿的故事流传最广,后人就以石曼卿为十月芙蓉的花神。
  乐曲以笙吹奏出缥缈的乐音,引人进入芙蓉仙乡中。中阮优美的旋律,写出芙蓉城内朵朵湛放的娇面的芙蓉,花光映波,绚丽非常。

标签: ,

花神(九月)

九月菊花--花神陶渊明(飒飒西风满院载,蕊寒香冷蝶难来。)

  农历九月的深秋时分,正是菊花开得最艳的时候,因此又称为菊月。
  在菊花这个璀灿的香国里,有的端雅大方,有的龙飞风舞,有的瑰丽如彩虹,有的洁白赛霜雪,相当迷人。
  菊花的花神相传是陶渊明,菊花的凌霜怒放,性情冷傲高洁,在群芳中备受“不为五斗米折腰”的陶渊明喜爱,更为菊花写下“采菊东篱下,悠然见南山”的千古佳句,菊花的花神自然非他莫属了。
  乐曲改编自古曲,古琴的淡雅之音,写出菊花独立秋霜的傲骨。笙乐飘飘如秋风阵阵,古朴而典雅的旋律,形容出菊花淡泊独立的精神,与陶渊明隐世而清静自得的情怀。

标签: ,

花神(八月)

八月桂花--花神徐惠(暗淡轻黄体性柔,情疏迹远只香留。)

  丹桂花又名木犀,丹桂,好生于岩领间,花族开与叶腋,黄色或黄白色,香气极浓。八月桂花香,因此农历八月又称为桂月。
  桂花的花神相传的唐太宗的妃子徐惠。徐惠生与湖州长城,自小就聪慧过人,五月大就会说话,四岁就能读论语,八岁能写诗文。因为才思不凡,被唐太宗招入宫中,封为才人。太宗死后,徐惠哀伤成疾,二十四岁就以身殉情。后世就封这位才情不凡的女子为桂花的花神。
  乐曲以月夜为背景。箫声在虫卿的中吹奏出朦胧月色,筝音点点宛如一族族的桂花吐香。二胡柔美的弦音,淡淡的道出花神徐惠的款款深情。佳人之情,宛如桂花飘香,动人心肺。

标签: ,

花神(七月)

七月蜀葵--花神李夫人(锦水绕花篮,岷山带叶青。)

  蜀葵,植株修长而挺立,开于夏末秋初,花朵大而娇媚,颜色五彩斑斓,其中,黄蜀葵又称为秋葵,在诗经中就餐曾提及“七月菱葵叔”,葵指的就是黄菱葵。秋葵是一种朝开暮落的花,一般人说的“昨日黄花”,就是以秋葵为写照。
  菱葵花的花神相传是汉武帝的宠妃李夫人。李夫人的兄长李延年曾为他写一极其动人的歌,即:“北方有佳人,绝世而独立,一顾倾人城,再顾倾人国,倾城与倾国,佳人难再得。”由于李夫人极早逝,短暂而又绚丽的生命,宛如秋葵一般,所以人们就以她为七月蜀葵的花神了。
  乐曲在鸟鸣一笙、笛轻柔音乐中,花出蜀地的秀丽山水。排箫绽放出蜀葵娇媚的颜色,宛如李夫人倾城倾国的笑面。葫芦丝演奏出轻歌曼舞的旋律,仿佛蜀葵俏丽的花朵随风尽情起舞,在迷人的夕照中,随风而逝。

标签: ,

花神(六月)

六月莲花--花神西施(年年越溪女,相忆采芙蓉。)

  农历六月俗称荷月,荷花既莲花。莲花生于碧波之中,以“出淤泥而不染”著称,且花大叶丽,清香远溢,因此自古即深受人们喜爱。
  莲花的花神相传是绝代美女西施。传说中。西施在助越灭吴之前,是卖柴人家之女,夏日荷花盛开时,西施常到镜湖采莲,也许因为西施曾是六月时节的采莲女,她美丽的身影无人能比,于是就自然成为莲花的花神了。
乐曲中,排箫绵绵远飘的音韵,画出如碧波般的莲乐,清远的女声,飘送出莲花清香。舒展悠扬的旋律中,令人想见吴越佳人驾一叶清舟,在莲中采莲的动人情景。

标签: ,

花神(五月)

五月石榴--花神锺道(微雨过,小荷翻,榴花开欲燃。)

  俗称农历五月是榴月,五月盛开的石榴花,艳红似火,有着火一般的光辉,因此许多女子都喜欢榴花戴在云鬓上,增添娇艳。
  石榴花的花神传说是锺道,五月是疾病最容易流行的季节。于是,民间传说的“鬼王”锺道,便成为人们信仰的主要对象,生前性情十分暴烈正直的锺道,死后 更誓言除尽天下妖魔鬼怪。其嫉恶如仇的火样性格,恰如石榴迎火而出的刚烈性情,因此,大家就把能驱鬼除恶的锺道视为石榴花的花神。
  乐曲以月夜为背景,在自然鸟鸣,潺潺流水中,轻柔的笙乐如月光般照在火红的石榴上,点点娇艳。月夜看榴花,除却了几分暑热,也对了几分柔情。

标签: ,

花神(四月)

四月牡丹--花神李白(国色朝酣酒,天香夜染衣。)

牡丹,开于农历四月,唐代人以起香浓色艳,有富贵之枝,而对牡丹为“花王”,直到今日,世人仍爱其国色天香。
  牡丹的花神传说众多,或说貂婵,或说丽娟(汉武帝的宠妃),但是以李百最为知名。有一回,唐玄宗偕同杨贵妃在沉香亭赏牡丹,一时兴起,与李白进宫写三章《清平乐》:
“云想衣裳花想容,春风拂槛露华浓。若非群玉山头见,会向瑶台月下逢。”
“一枝红艳露凝香, 云雨巫山枉断肠。借问汉宫谁得似, 可怜飞燕倚新妆。 ”
“名花倾国两相欢, 常得君王带笑看。解释春风无限恨, 沉香亭北倚阑干。”
  乐曲以排萧宽远的曲调,展现牡丹层层绽放的娇颜。柔美的女声,宛如花香弥漫天际,使人深深迷醉。

标签: ,

花神(三月)

三月桃花--花神息夫人(西塞山前白鹭飞,桃花流水鳜鱼肥。)

  同属木本蔷薇科的桃花盛开与农历三月,一般又称为桃月。桃花姿态优美,花朵丰腴,色彩艳丽,长被誉为美人,盛开时明媚如画,犹如仙境,乃有所谓的“世外桃源”。
  桃花的花神最早相传是春秋时代楚国息侯的夫人,息侯在一场政变中,被楚文王所灭。楚文王贪图息夫人的美色,意欲强娶,息夫人不肯,乘机偷偷出宫去找息侯,息侯自杀,息夫人也随之殉情。此时正是桃花盛开的三月,楚人感念息夫人的坚贞,就立伺祭拜,也称她为桃花神。
  乐曲以清脆的鸟鸣与笛音引动明媚的春色,古筝、笛、琵琶演奏出明亮、跃动、色彩缤纷的旋律,如桃花绽放,如美人笑面,写成一幅与世隔绝的桃花源地。

标签: ,

花神(二月)

二月杏花--花神杨贵妃(沾衣不湿杏花雨,吹面不寒杨柳风。)

  杏花属木本蔷薇科落叶树,花朵娇小可爱,而成片的杏花林。景色更是奇丽。农历而月又称杏月,正是杏花初放之时,朵朵美若天仙,柔媚动人。
  杏花的花神相传是杨贵妃。杨贵妃虽然身系唐玄宗的三千宠爱于一身,但是在安史之乱时,马兵变,玄宗不得及应军士之求杀了杨贵妃。当时,众人将杨贵妃的 尸体悬挂在佛堂前的杏树上。平乱之后,玄宗派人取会尸骨移葬时,只见一片雪百的杏花迎风而舞。玄宗回宫后,命道士寻找杨贵妃的魂魄,此时的杨贵妃已在仙山 上。司职二月杏花的花神了。
  乐曲在箫与筝的交替中,隐隐如杏花飘香,浅淡的音乐,如杏花临波而立,花瓣在微风中似雪班缓缓飘落。似雪花瓣,化做杨贵妃倩影随风而逝。

标签: ,

花神

正月梅花--花神寿阳公主(影斜清浅处,香度黄昏时。)

  梅花,关于雪花飘飘的岁寒早春时,一般人为是农历正月的代表花。其冰清玉洁,一身傲骨尤其为世人钟爱。
  梅花的花神相传是宋武帝的女儿寿阳公主。在某一年的正月初七,寿阳公主到宫里梅花林赏梅,一时困倦,就在殿檐下小睡,正巧有朵梅花轻轻飘飘落在她的额 上,留下五瓣淡淡红色的痕迹,寿阳公主醒后,宫女都觉得原本嫵媚动人的她,又因梅花瓣而更添几分美感,于是纷纷效仿,以梅花印在额头上,称为“梅花妆”。 世人便传说公主是梅花的精灵变成的,因此寿阳公主就成了梅花的花神。
  音乐以清淡的古筝,悠扬的曲笛,沉静的洞萧,交织出一片梅花枝影横斜的天地,有如仙境。钢片琴穿梭其间,宛如雪飞,宛如梅香,恍惚中,恰似有寿阳公主翩翩而至。

标签: ,

推荐音乐:花神

最近在听这2张,感觉十分好。
点击查看原图片screen.width-468)this.width=screen.width-468" border="0">

TCD-4505
花神

制作人 :杨秀兰、欧阳谦
制作群 :
作曲:史志有
演出:林文增、戴亚、张强等
发行日期:1996/3/26

傲视世界乐坛、深受各国喜爱的中国新世纪音乐。以一到六月中的花与花神为主题,将音乐纳入花的芳姿与花神的美丽传说中。

掬水月在手,弄花香满衣。
  花是天地灵秀之所钟,美的化身,赏花,在于悦其姿色而知其神骨,如此方能遨游在每一种花的独特韵味中,而深得其中情趣。如古人所言:“梅标清骨,兰挺幽芳,茶呈雅韵,李谢弄妆,杏娇疏丽,菊傲严霜,水仙冰肌玉肤,牡丹国色天香,玉树亭亭皆砌,金莲冉冉池塘,丹桂飘香月窟,芙蓉冷艳寒江。”
  花的独特性情便在这清、幽、雅、丽。。。。。。间,一览无遗,成为赏花者美好的心灵享受。
  花,因季节时节地势的不听而与人不同的气质与美感。所谓“冷艳清香受雪知,雨中谁把蜡为衣”是梅花的美;“锦烂重阳节到时,繁华梦里傲霜枝”,是菊花的美。出谷送香非不远,那能送到俗尘中”,是兰花的美。自古至今,许多骚人墨客都为花写下动人篇章,在这些艺术作品中,花已经成为一种心的向往与绝美的精神境界,深深的美化人们的心。

  古人借以诗画表达花的意境,“花乐”系列的制作,则皆于音乐来描绘花的神韵,希望听者能随旋律的流动,进入花的神妙之中,让花的美深驻心灵,使生命宛如一种开花,成为永恒的喜乐。

作者:史志友
一九七九年毕业于北京中央音乐学院,获作曲、指挥双学位,师承著名作曲家赵行道以及著名指挥家黄立飞教授,现为中国音乐家协会会员、中国歌剧舞剧院交响乐指挥。
史志友先生曾指挥过多部著名作曲家的大型交响乐作品,如施光男的《伤逝》、石夫的《古兰丹姆》、阿隆·阿甫夏洛穆夫的《孟姜女》、鲁德继格·名古斯的《唐吉柯德》等。史先生的曲作形式多样、得奖无数,舞蹈音乐《咏剑》获一九八零年中国大陆优秀作品奖,电影音乐《万里长征》获一九八一年电影百花奖,《万紫千红》获一九八七年全大陆比赛金奖,其名被收录于《中国音乐家名录》、《中国当代艺术名人录》、《中国当代青年名人辞典》中。

十二月令花与花神

一枝淡贮书天下,人与花心各自香
  传说农历二月十二是百花的生日,人们称之为“花朝”,因此民间便有一个“花朝”之庆。而随着季节时令的替换,百花也以各种不同的容颜缤纷了大地。百花的玉容笑貌。为人们的生活平添了无数浪漫情趣。爱花惜花之人,自然也为百花留下许多动人的传说。因此,在中国,百花各有其司花之神,也各拥有一段美丽的故事。
  在百花的传说中,以农历中的十二个月令的代表花,与司十二月令花神的传说最令人神往。花的美原是浑然天成,无可比较,这十二月的令的花与花神,或因地区不同以及个人的喜爱而有些差异,其中最广受人流传的,则分别是正月梅花--寿阳公主,二月杏花--杨贵妃,三月桃花--息夫人,四月牡丹--李白,五月石榴--锺道,六月莲花--西施,七月蜀葵--李夫人、八月桂花--徐惠,九月菊花--陶渊明,十月木芙蓉--石曼卿,十一月山茶--白居易,蜡月水仙 --娥皇与女英。
  花神既是以这十二月令的代表花与花神为主题,音乐中结合了花的动人芳姿,与花神的美丽传说。音乐家运用了自然山水的音声,结合传统乐器古筝,笛,二胡,排萧等,以中国新世纪风格的动人旋律,写下了花与神间所有的美好情缘,也写下了传诵千古的佳话。

上:http://www.yourblog.org/Data/200412/196929.html
下:http://www.yourblog.org/Data/200412/196933.html

标签: , ,

星期六, 四月 12, 2008

utf-8网页在ie下显示空白的解决方法

自己测试的,不一定100%准确,仅供参考。

触发条件:
1. title标签里的内容为中文其他双字节字符
2. 指定网页编码的 meta 信息在 title 标签的下方,即
<title>中文或其他双字节字符title</title>

<meta equiv="Content-Type" content="text/html; charset=utf-8">
3. 另存或转换utf-8编码时没有包括 unicode 签名 (BOM)

满足以上三个条件后网页里的任何内容在IE6下都无法显示出来,解决办法:不要同时满足这三个条件即可...
http://www.cublog.cn/u/20718/showart.php?id=215049

经过测试,我的blog就是这个原因,调整次序之后OK。
本次google搜索条件:IE6 UTF8

标签: ,

星期四, 四月 10, 2008

诗经·国风·召南·摽有梅

想起有个汉服美女叫摽有梅,忘了第一个字读什么了。古典的东西要常温习才好。


摽有梅,其实七兮。求我庶士,迨其吉兮。

摽有梅,其实三兮。求我庶士,迨其今兮。

摽有梅,顷筐塈之。求我庶士,迨其谓之。

  [注释]

  1、摽(biào):坠落。有:助词。

  2、七:十分之七。后文中的三指十分之三。

  3、庶:众。

  4、迨(dài):及,趁着。

  5、塈(jì):取。

  6、谓:通“归”,指女子出嫁。

  [参考译文]

  枝头梅子落纷纷,树上还留有七成!追求我的小伙子,不要错过好时辰!

  枝头梅子落纷纷,树上只留有三成!追求我的小伙子,今天就是好时辰!

  梅子全部落下来,倾尽筐子让他取!追求我的小伙子,趁着时机嫁给他!


http://www.mxms.net/html/6/46/136/2006/5/ga9954181515151560022862-0.htm

标签:

随笔2

有关杨二,我只能说以我的智商感觉她挺二。

标签:

随笔

今天发现访问量好少,因为以前多是搜索wxWidgets,估计今天大家都没学。

标签:

使用 PHP 创建图形的巧妙方法

Jack Herrington (jack_d_herrington@codegeneration.net), 高级软件工程师, "Code Generation Network"

2006 年 1 月 04 日

本文将展示如何使用 PHP 构建面向对象的图形层。使用面向对象的系统可以用来构建复杂的图形,这比使用标准 PHP 库中所提供的基本功能来构建图形简单很多。

我将图形编辑程序分为两类:一类是绘图程序,利用这种程序可以一个像素一个像素地绘制图像;另外一类是制图程序,这种程序提供了一组对象,例如线、 椭圆和矩形,您可以使用这些对象来组合成一幅大图像,例如 JPEG。绘图程序非常适合进行像素级的控制。但是对于业务图形来说,制图程序是比较好的方式,因为大部分图形都是由矩形、线和椭圆组成的。

PHP 内置的制图基本操作与绘图程序非常类似。它们对于绘制图像来说功能非常强大;但是如果您希望自己的图像是一组对象集合时,这就不太适合了。本文将向您展示如何在 PHP 图形库的基础上构建一个面向对象的图形库。您将使用 PHP V5 中提供的面向对象的扩展。

具有面向对象的图形支持之后,您的图形代码就非常容易理解和维护了。您可能还需要从一种单一的图形源将图形合成为多种类型的媒介:Flash 电影、SVG 等等。

More detail: http://www.ibm.com/developerworks/cn/opensource/os-objorient/

标签: ,

星期三, 四月 09, 2008

phpMyVisites

phpMyVisites是一个网站流量统计系统,它能够提供非常详细的统计报告和高级图形报表。phpMyVisites不是一个Apache log分析工具,它建有自己的log。它的特点包括:
  • 安装部署:提供可视化的安装向导,并且使用简单只要把一段简单的Javascript代码添加到你网站的页面中就能够马上开始收集访问者的信息。
  • 一个简洁,友好的界面可用来展示数据和帮助数据分析。
  • 提供简洁,明了的图形分析报表。
  • 安全:phpMyVisites能够最大限度地阻止入侵和外部攻击。
  • 支持多网站统计
  • 多用户:可以添加无限个用户并对每个用户赋予不同的管理权限(针对某一个网站的查看和管理的权限)。
  • 国际化支持:phpMyVisites提供30种语言包。
  • 能够准确统计一段时间内的访问量(天/周/月/年)。
  • 访问者的回头率:新访问者,经常访问者,有规律性的访问者。
  • 提供多种文件格式的统计报告(PDF,Image等)。
  • 对被统计的网页进行分组/分级。
  • 访问者分析:统计访问者是从哪个页面离开网站的和从哪个页面进入网站或通过哪个搜索引擎的关健字进入网站,在网站的停留时间,所访问的页面等。
  • 可通过e-mail或RSS聚合获取网站的流量信息。
http://www.phpmyvisites.net/

标签: ,

ADOConnect时如何根据返回信息判断

try
...
Except
if TADOconnection.Errors.Count>0 then
Case TADOconnection.Errors[0].NativeError of
xx:...
End;
End;
TADOconnection.Errors[0].NativeError中返回的是数据库原始错误编号,根据此编号查数据库帮助就可以得知具体的错误信息。比如Oracle的1005,1017号就是用户名或密码错,12154是服务器不存在。

TADOconnection.Errors[0].Description
TADOconnection.Errors[0].Number

http://topic.csdn.net/t/20011006/23/313923.html

标签: ,

跟我学SQL:(七)从子表里删除数据

在这篇文章里我要描述一下如何从表格里删除列,要删除的这些列同时还要依赖于其他表格的标准。要解决这个问题就需要一个很聪明而且完全遵守SQL92子查询声明的应用程序。
我必须提醒读者的是,尽管查询可能会遵守SQL的标准,但是众多的数据库生产商会以不同的句法支持实现SQL。以下这个解决方案应该适合于大多数数据库; 但是,如果你的结果有出入,就还是应该查看一下文档。同时,由于这个查询要处理DELETE声明,所以你应该在将其应用于真实的生产环境以前在实验数据上 进行测试。

需要更多的背景信息?
查看这些文章就能快速上路:
《SQL基础I查数据查询》涉及到了DELETE查询的使用。
《使用SQL子选项来合并查询》说明子选项查询能够减少对数据库请求的数量,并提供了例子。
《SQL基础:查询多个表》提供了更多关于子选项的信息,还讲到了使用单个查询就能访问多个表格的多种其他方法。

宠物店的例子
要解释如何进行这种类型的列删除,我会使用如下这个数据库的表格,该数据库叫做PetStore,并包含有清单(inventory)信息。在叫做“品种 (breed)”的表A里,我存储有每种动物的信息和宠物店库存的信息。在叫做“清单”的表B里,包含有商店里特定动物的信息。

在这个例子里,我们先假设商店把整窝Shitzu小狗都卖完了。我可以使用breed表格里的breed_id字段来删除Shitzu清单里的所有项目,就像这样:

DELETE FROM inventory WHERE breed_id IN
(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

首先,我要指定需要删除记录的表格,在这里是清单表格。然后再将识别字段breed_id同子选项子句的结果反复比对。我知道要找的是Shitzus,所以就能直接删掉他们,而不用再在单独的请求里查询breed_id。

我必须要警告你的是,以这种方式使用DELETE声明是危险的,只有在你对数据库的结构很熟悉的情况下才能使用这些声明。DELETE查询会从受影响的表 格里删除掉全部列,你应该知道这对你所管理着的数据意味着什么。有个好办法是使用SELETE *这个短语替代DELETE关键字来对DELETE声明的子查询结果进行测试,这样就能保证结果里含有你要删除的所有东西,就像这样:

SELECT * FROM inventory WHERE breed_id IN
(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

DELETE和JOIN联用
有人问到了解决这个问题另一个可能的办法:把JOIN子句和DELETE声明联合使用。由于以前没有使用过这种方法,我就研究了一下,发现SQL Server的文档声明支持这个方法,尽管它不符合SQL92。在经过测试和询问各种数据库平台的老手之后,我发现把DELETE和JOIN声明联合使用 在我测试过的任何平台上都行不通。

从多个表格里一次删除
以上的解决方案还没有解释如何使用父表从多个子表里删除信息。但是SQL92规范里没有提供完成这项任务的标准解决方案。

DELETE的声明不能把多个表格作为一个参数接受。作为一个具有破坏性的查询,这能保证在命令要被执行的地方不会出现歧义。此外,这个限制防止了在单个 声明内将AND和多个子查询联用。如果测试SELECT声明的结果用以检查DELETE查询将要影响到的是哪些数据,你会发现SELECT会返回多个表格 的清单,DELETE不会影响到的多个子查询不在其中。

有很多可能的方法能够满足你的需求,例如在表格里创建一个字段,用以指明该项目是否为活动的。或者,你可以使用一些数据库里的预存程序在每个所需的DELETE查询里迭代。

http://bbs.jcwcn.com/thread-7099-1-11.html

标签:

Get text from the control at pos x,y on screen

From Zarko Gajic

This form has 3 labels and a timer component: ~~~~~~~~~~~~~~~~~~~~~~~~~
unit unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure FormCreate(Sender: TObject) ;
procedure Timer1Timer(Sender: TObject) ;
private
procedure ShowHwndAndClassName(CrPos: TPoint) ;
public
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ShowHwndAndClassName(CrPos: TPoint) ;
var
hWnd: THandle;
aName,
Text : array [0..255] of char;
begin
hWnd := WindowFromPoint(CrPos) ;
Label1.Caption := 'Handle : ' + IntToStr(hWnd) ;

if boolean(GetClassName(hWnd, aName, 256)) then
Label2.Caption := 'ClassName : ' + string(aName)
else
Label2.Caption := 'ClassName : not found';
SendMessage(hWnd, WM_GETTEXT,
SizeOf(Text), integer(@Text)) ;
Label3.Caption := 'Text :' + Text;
end;

procedure TForm1.FormCreate(Sender: TObject) ;
begin
Form1.FormStyle := fsStayOnTop;
Timer1.Interval := 50;
end;

procedure TForm1.Timer1Timer(Sender: TObject) ;
var
rPos: TPoint;
begin
if boolean(GetCursorPos(rPos))
then ShowHwndAndClassName(rPos) ;
end;
end.

http://delphi.about.com/cs/adptips2000/a/bltip1200_2.htm

标签:

星期二, 四月 08, 2008

aSSL PHP library for SSL

aSSL is a library distributed under MIT License thats implements a technology similar to SSL without HTTPS.

aSSL enables the client to negotiate a secret random 128-bit key with the server using the RSA algorithm. Once the connection has been established, the data will be sent and received using AES algorithm.

aSSL is composed of some Javascript files and a server side component. Because I have recently changed the negotiation algoritm from RC4 to RSA, only a pure Javascript (ASP) server component is currently available. I will do a porting for the main web languages (PHP, Java, Perl, Python, TKL, etc.) as soon as possible once the library has passed the beta phase.

http://assl.sullof.com/assl/

标签:

Introduction to wxWidgets

Introduction

wxWidgets formerly known as wxWindows is a framework for developing cross-platform GUI applications in C++. Julian Smart started the framework in 1992 at the Artificial Intelligence Applications Institute, University of Edinburgh. In 1995, a port to Xt was released by Markus Holzem. In May 1997, the Windows and the GTK+ ports were merged and put into a CVS repository.

What is wxWidgets

wxWidgets gives you a single, easy-to-use API for writing GUI applications on multiple platforms. Link it with the appropriate library for your platform (Windows/Unix/Mac) and compiler (almost any popular C++ compiler), and your application will adopt the look and feel appropriate to that platform. On top of the great GUI functionality, wxWindows gives you: online help, network programming, streams, clipboard and drag and drop, multithreading, image loading and saving in a variety of popular formats, database support, HTML viewing and printing, and much more.

Who should use wxWidgets

wxWidgets is a framework very much similar to MFC, except for a few negative points of its own. Those MFC programmers who are aware of the growing number of Linux users and who want to write cross platform GUI applications can use wxWidgets. With wxWidgets, it is very easy to use a framework based on C++ and it has a proven record of 13 years. In fact, wxWidgets is very stable and is supported on:

  • Windows 3.1, Windows 95/98, Windows NT, Windows 2000/XP, Windows ME, Windows CE.
  • Linux and other UNIX platforms with GTK+.
  • UNIX with Motif or the free Motif clone Lesstif.
  • Mac OS.
  • Embedded platforms are being investigated. See the wxUniversal project.
  • An OS/2 port is in progress, and you can also compile wxWidgets for GTK+ or Motif on OS/2.
http://www.codeproject.com/KB/library/wxwidgets.aspx

标签: ,

wxWidgets组件

http://wxcode.sourceforge.net/complist.php

标签:

Word: microblogging

microblogging pp. Posting short thoughts and ideas to a personal blog, particularly by using instant messaging software or a cell phone. Also: micro-blogging.
microblog v., n.
microblogger n.

Example Citations:
Twitter, which was created by a 10-person start-up in San Francisco called Obvious, is a heady mixture of messaging; social networking of the sort associated with Web sites like MySpace; the terse, jittery personal revelations of 'microblogging' found on services like Jaiku; and something called 'presence,' shorthand for the idea that people should enjoy an 'always on' virtual omnipresence.
—Jason Pontin, "From Many Tweets, One Loud Voice on the Internet," The New York Times, April 22, 2007

Fotolog, a fast-growing social networking website, has become the latest target of larger internet media players, according to people close to the company. ...

Users can exchange thoughts and feedback around uploaded photos, and a deal with AOL this month added chat, instant messaging and video messaging. It has more than 8m account holders and a broad global reach. It is adding nearly 1m members a month. Fotolog sees itself as part of a new micro-blogging trend where users are opting for simpler and shorter inputs into their own personal home pages.
—Chris Nuttall, "Fotolog in the picture as bid target," Financial Times, May 21, 2007

Earliest Citation:
Only micro-blogging today. It's Sports Day. Oh, can I make a date with you all for about this time in the year 2012? By that time my offspring will be, I trust, all grown up, loaded with achievements and equipped with stratospheric levels of self-esteem. I will then feel free to tell some very funny stories about the egg and spoon race back in 2002.
—Natalie Solent, archive, Natalie Solent (blog), July 17, 2002

Notes:
Here's an even earlier citation, although one that uses microblogging in a different sense (blogging personal throughts and feelings, of any length):

The blogs I like to read are the personal, those individual portraits of the human heart, blogs about lives and losses, realizations, aspirations, fears; bloggers who open their closets, skeletons and all.
—Jeneane Sessum, "Microblogging," Allied, April 12, 2002
http://www.wordspy.com/words/microblogging.asp

标签: ,

wxDb/wxDbTable wxODBC Overview

he wxODBC classes were designed for database independence. Although SQL and ODBC both have standards which define the minimum requirements they must support to be in compliance with specifications, different database vendors may implement things slightly differently. One example of this is that Oracle requires all user names for the datasources to be supplied in uppercase characters. In situations like this, the wxODBC classes have been written to make this transparent to the programmer when using functions that require database-specific syntax.

Currently several major databases, along with other widely used databases, have been tested and supported through the wxODBC classes. The list of supported databases is certain to grow as more users start implementing software with these classes, but at the time of the writing of this document, users have successfully used the classes with the following datasources:

  • DB2
  • DBase (IV, V)**
  • Firebird
  • INFORMIX
  • Interbase
  • MS SQL Server (v7 - minimal testing)
  • MS Access (97, 2000, 2002, and 2003)
  • MySQL (2.x and 3.5 - use the 2.5x drivers though)
  • Oracle (v7, v8, v8i)
  • Pervasive SQL
  • PostgreSQL
  • Sybase (ASA and ASE)
  • XBase Sequiter
  • VIRTUOSO

An up-to-date list can be obtained by looking in the comments of the function wxDb::Dbms in db.cpp, or in the enumerated type wxDBMS in db.h.

**dBase is not truly an ODBC datasource, but there are drivers which can emulate much of the functionality of an ODBC connection to a dBase table. See the wxODBC Known Issues section of this overview for details.

http://docs.wxwidgets.org/2.8.0/wx_odbcoverview.html#wxodbcconfiguringyoursystem

标签: , ,

Runtime class information (aka RTTI) overview

One of the failings of C++ used to be that no run-time information was provided about a class and its position in the inheritance hierarchy. Another, which still persists, is that instances of a class cannot be created just by knowing the name of a class, which makes facilities such as persistent storage hard to implement.

Most C++ GUI frameworks overcome these limitations by means of a set of macros and functions and wxWidgets is no exception. As it originated before the addition of RTTI to the C++ standard and as support for it is still missing from some (albeit old) compilers, wxWidgets doesn't (yet) use it, but provides its own macro-based RTTI system.

In the future, the standard C++ RTTI will be used though and you're encouraged to use whenever possible the wxDynamicCast() macro which, for the implementations that support it, is defined just as dynamic_cast<> and uses wxWidgets RTTI for all the others. This macro is limited to wxWidgets classes only and only works with pointers (unlike the real dynamic_cast<> which also accepts references).

Each class that you wish to be known to the type system should have a macro such as DECLARE_DYNAMIC_CLASS just inside the class declaration. The macro IMPLEMENT_DYNAMIC_CLASS should be in the implementation file. Note that these are entirely optional; use them if you wish to check object types, or create instances of classes using the class name. However, it is good to get into the habit of adding these macros for all classes.

Variations on these macros are used for multiple inheritance, and abstract classes that cannot be instantiated dynamically or otherwise.

DECLARE_DYNAMIC_CLASS inserts a static wxClassInfo declaration into the class, initialized by IMPLEMENT_DYNAMIC_CLASS. When initialized, the wxClassInfo object inserts itself into a linked list (accessed through wxClassInfo::first and wxClassInfo::next pointers). The linked list is fully created by the time all global initialisation is done.

IMPLEMENT_DYNAMIC_CLASS is a macro that not only initialises the static wxClassInfo member, but defines a global function capable of creating a dynamic object of the class in question. A pointer to this function is stored in wxClassInfo, and is used when an object should be created dynamically.

wxObject::IsKindOf uses the linked list of wxClassInfo. It takes a wxClassInfo argument, so use CLASSINFO(className) to return an appropriate wxClassInfo pointer to use in this function.

The function wxCreateDynamicObject can be used to construct a new object of a given type, by supplying a string name. If you have a pointer to the wxClassInfo object instead, then you can simply call wxClassInfo::CreateObject.

http://docs.wxwidgets.org/stable/wx_runtimeclassoverview.html

标签: ,

http://www.xml4wx.org/

XML for wxWidgets is an open source XML parser writen in C++ for use with the wxWidgets cross platform GUI toolkit. This is not the same classes/library included with wxWidgets, but a complete re-write.
  • Designed to be as reasonably standards compliant as possible
  • Includes DOM 1.0, XPath 1.0, XSLT 1.0 and SAX-like implementation
  • Many convienience functions for common functionality makes it easy to use
  • Completely embedable - link your project with the static library
  • Inheritable class structure allows creation of special-use DOM's
  • Easily extendable XPath and XSLT functions so that you can implement the functions you need
  • The open source, relativly simple design makes it easy to solve issues while developing

The biggest feature is that it is a piece of cake to work with an in memory XML Document from your C++ code. Instead of having to write specialized C++ classes/structures to represent your xml, you can simply use the iDOMDocument as-is. You can think of the XML4WX DOM as a giant Hash table that also has a stateless search and reporting engines built in.

Other XML DOMS (xmllib2, Xerces, MS XML) require you to write large ammounts of C++ code to access the data. If your xml changes, you'll have to re-write the container classes and re-compile your application. With XML4WX, if you write your XPath queries carefully, your C++ code will continue to work.

标签: , ,

星期一, 四月 07, 2008

Microblogging

PlayTalk 是又一个 microblogging 平台,类似于 Twitter,可记录生活的点滴,不过单条信息的内容上限达到了 250 字符,具备日语、英语、中文和韩文四国语言界面,还整合了电子地图,可在电子地图上实时显示不同地区更新的情况。

MicroBlogging的几大网站:
www.twitter.com
www.fanfou.com
www.jiwai.de
www.ilaodao.cn
www.taotao.com

看这几个网站都不是我想要的类型。。

标签:

使用wxWidgets的开源项目

http://sourceforge.net/projects/multiget/

标签: ,

Creating Nice Reports with wxWidgets ZIP API

wxWidgets contains a set of classes which handle several archive formats. Most commonly used archive format is ZIP. This tutorial shows how to use wxWidgets API for reading and writing ZIP-files.
As you probably know, Microsoft Office 2007 produces .DOCX files which are ZIP archives which contain several XML files, images and few directories inside. After visiting Microsoft Developer’s Days I decided to add new feature to my current project and create new type of report which is based on .DOCX file format. This tutorial contains some techniques which you can use for generating such reports by yourself.
First of all, we have to open Microsoft Word 2007 and create a stub document. The document which is used in this article contains:
- Heade
- Textual description
- Table with two columns
- Image at the bottom of the table

http://wxwidgets.info/zip_api_create_docx_file_en

标签:

使用wxWidgets的总体框架

下午又尝试了使用wxWidgets做一个稍微完整一点的界面,虽然简单,但都包含了wxWidgets的基本编程"框架"了.说框架夸张了点,吓人用的,^_^
程序里面已经包含了非常详细的注释了,哈哈,突然想起了文学编程!

/////////////////////////

//TextEditorApp.h头文件//

*///////////////////////

#ifndef TEXTEDITORAPP_H
#define TEXTEDITORAPP_H

//每个wxWidgets程序需要定义一个wxApp类的子类
//需要创建并且只能创建一个这个类的实例
//这个实例控制着整个程序的执行!
class TextEditorApp : public wxApp
{
public:
//继承自wxApp的子类至少需要定义OnInit()函数
//这个函数类似于WinMain,wxWidgets准备运行代码时会调用这个函数
virtual bool OnInit();
//这个函数创建至少一个窗口实例,对传入的命令行参数进行解析等
//如果这个函数返回真,wxWidgets将开始时间循环接受/处理用户输入
//如果返回为假,那么wxWidgets将会释放内部分配的资源,然后结束整个的程序的运行
};
//当wxWidgets创建这个TextEditorApp类实例的时候
//会将创建的结果赋值给一个全局变量wxTheApp
//可以直接在程序中使用这个变量,但是需要进行从wxApp到TextEditorApp类型强制转换
//增加了下面一行后,可以调用wxGetApp()函数
//这个函数返回一个到TextEditorApp的实例引用
DECLARE_APP(TextEditorApp)
#endif // TEXTEDITORAPP_H

///////////////////////////

//TextEditorApp.cpp 源文件//

///////////////////////////

// 对支持预编译编译器要包含"wx/wx.h"
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "TextEditorApp.h"
#include "TextFrame.h"
//这里没有创建TextEditorApp的代码!这是在wxWidgets内部实现的!
//你需要告诉wxWidgets创建那个App类实例,就是通过这个宏实现的
IMPLEMENT_APP(TextEditorApp)
//这个宏会检查编译应用程序使用的库文件是否和当前的库文件相匹配

bool TextEditorApp::OnInit()
{
TextFrame *frame = new TextFrame("Simple Text Editor", 100, 100, 400, 300);
frame->Show(TRUE);
SetTopWindow(frame);
return true;
}

上面就是程序的总体框架了,程序就是从这里开始执行的,下面时程序的窗体部分:

///////////////////////////

//TextFrame.h 头文件 //

//////////////////////////

#ifndef _TEXTFRAME_H
#define _TEXTFRAME_H

//一个Frame窗口是一个可以容纳别的窗口的顶层窗口
class TextFrame : public wxFrame
{
public:
//构造函数. 用来创建新的TextFrame
TextFrame(const wxChar *title, int xpos, int ypos, int width, int height);
//析构函数
~TextFrame();

//菜单处理事件
//每个方法都有一个参数用来包含事件的信息
//从菜单获得的事件是一个wxCommandEvent类型的数据
void OnMenuFileOpen(wxCommandEvent &event);
void OnMenuFileSave(wxCommandEvent &event);
void OnMenuFileQuit(wxCommandEvent &event);
void OnMenuInfoAbout(wxCommandEvent &event);
protected:
//要处理事件的每个类都需要声明一个事件表
//宏DECLARE_EVENT_TABLE用来完成这项工作
DECLARE_EVENT_TABLE()
private:
wxTextCtrl *m_pTextCtrl;
wxMenuBar *m_pMenuBar;
wxMenu *m_pFileMenu;
wxMenu *m_pInfoMenu;
enum
{
MENU_FILE_OPEN,
MENU_FILE_SAVE,
MENU_FILE_QUIT,
MENU_INFO_ABOUT
};
};
#endif //_TEXTFRAME_H

///////////////////////

// TextFrame.cpp源文件//

///////////////////////

// 对支持预编译编译器要包含"wx/wx.h"
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "TextFrame.h"
TextFrame::TextFrame(const wxChar *title, int xpos, int ypos, int width, int height)
: wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height))
{
//假如想给程序加上图标,应该使用下面的语句
//SetIcon(wxIcon(mondrian_xpm));
//此前应该加入一个xpm格式的图片
//#include "modrian.xpm"
//xpm其实是一个ASCII编码的完全符合c++语法的文本文件,所以可以直接用c++的方式包含到代码中
//SetIcon使用mondrian_xpm变量在堆栈上创建了一个图标
//这个mondrian变量是在mondrian.xpm文件中定义的


//编辑框
m_pTextCtrl = new wxTextCtrl(this, -1, wxT(wxString("测试")), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

// 菜单条
m_pMenuBar = new wxMenuBar();

// 文件菜单
m_pFileMenu = new wxMenu();

//wxT宏可以让代码兼容Unicode模式,和宏_T的作用一样
//_()将字符串翻译为指定语言的版本
//&符号的前导的字符将成为彩旦的快捷操作符,实际中为一下划线
//t符号则表示一个全局的快捷键
m_pFileMenu->Append(MENU_FILE_OPEN, wxT("O&打开\tF2"), wxT("打开文件"));
m_pFileMenu->Append(MENU_FILE_SAVE, wxT("S&保存\tF3"), wxT("保存文件"));
m_pFileMenu->AppendSeparator();
m_pFileMenu->Append(MENU_FILE_QUIT, wxT("Q&退出\tF4"), wxT("退出系统"));
m_pMenuBar->Append(m_pFileMenu, wxT("F&文件"));

// 关于菜单
m_pInfoMenu = new wxMenu();
m_pInfoMenu->Append(MENU_INFO_ABOUT, wxT("A&关于\tF5"), wxT("关于软件"));
m_pMenuBar->Append(m_pInfoMenu, wxT("I&信息"));

//设置程序菜单条
SetMenuBar(m_pMenuBar);

//创建一个有三个域的状态栏。第一个域包含文本"Ready"
//状态栏用来显示对一个菜单项的描述。
CreateStatusBar(3);
SetStatusText("Ready",0);
}
TextFrame::~TextFrame()
{
}

//事件表是放在实现文件中的
//宏BEGIN_EVENT在事件表声明的开始处使用
BEGIN_EVENT_TABLE(TextFrame, wxFrame)
//将一个方法与事件关联要使用EVT_MENU宏
//这个宏需要菜单ID与事件名
EVT_MENU(MENU_FILE_OPEN, TextFrame::OnMenuFileOpen)
EVT_MENU(MENU_FILE_SAVE, TextFrame::OnMenuFileSave)
EVT_MENU(MENU_FILE_QUIT, TextFrame::OnMenuFileQuit)
EVT_MENU(MENU_INFO_ABOUT, TextFrame::OnMenuInfoAbout)
END_EVENT_TABLE()
//事件表的最后用宏END_EVENT_TABLE作结束标记

void TextFrame::OnMenuFileOpen(wxCommandEvent &event)
{
wxLogMessage(wxT("File Open Menu Selected"));
}

void TextFrame::OnMenuFileSave(wxCommandEvent &event)
{
wxLogMessage(wxT("File Save Menu Selected"));
}

void TextFrame::OnMenuFileQuit(wxCommandEvent &event)
{
//Close函数并不直接关闭Frame窗口,而是产生了一个wxEVT_CLOSE_WINDOWS事件
//这个事件默认的处理函数调用wxWindow::Destory函数释放了frame窗口
Close(FALSE);
//当点击关闭按钮时,wxWidgets也会调用close()函数,给frame窗口发一个wxEVT_CLOSE_WINDOWS事件
//可以在程序中拦截这个事件,改变默认的处理行为!
}

void TextFrame::OnMenuInfoAbout(wxCommandEvent &event)
{
wxLogMessage(wxT("File About Menu Selected"));
}

上面部分就是主窗体,主要包含了菜单,状态栏,编辑框等控件,还包含了事件响应部分,感觉这部分有点像MFC的处理方式。

代码很少(代码是看例子写的),也很简洁,就不用说明了吧(上面还不够详细?)有问题请留言。

http://blog.chinaunix.net/u/25096/showart_375024.html

标签:

Windows未公开函数揭密——之三

http://www.applevb.com

这次介绍的是如何利用Windows未公开函数实现系统文件操作监视功能。利用该功能可以对Windows下的任何文件操作,包括建立文件、文件夹;删除文件;改变文件大小等操作都可以纪录在案。
首先来介绍实现上面操作的两个未公开函数:SHChangeNotifyRegister和SHChangeNotifyDeregister,SHChangeNotifyRegister函数的定义如下:
Declare Function SHChangeNotifyRegister Lib "shell32" Alias "#2" _
(ByVal hWnd As Long, _
ByVal uFlags As SHCN_ItemFlags, _
ByVal dwEventID As SHCN_EventIDs, _
ByVal uMsg As Long, _
ByVal cItems As Long, _
lpps As PIDLSTRUCT) As Long
其 中参数hWnd指定接受系统通告的窗口句柄,参数uMsg指定消息值,如果函数调用成功,系统就会将hWnd指定的窗口加入到系统通告链中,并且返回系统 通告句柄。当有建立文件等系统操作发生时,系统会向hWnd指定的窗口发送uMsg消息,关于其它参数,会在下面的程序中说明。函数 SHChangeNotifyDeregister的定义如下:
Declare Function SHChangeNotifyDeregister Lib "shell32" Alias "#4" _
(ByVal hNotify As Long) As Boolean
其中参数hNotify指定系统通告的句柄。
下面是操作的具体的VB范例:
首先建立一个新的工程,在Form1中加入一个TextBox控件。在Form1的代码窗口之中加入以下代码:
Option Explicit

Private Sub Form_Load()
If SubClass(hWnd) Then '改变Form1的消息处理函数
If IsIDE Then
Text1.Text = vbCrLf & _
"一个 Windows的文件目录操作即时监视程序," & vbCrLf & "可以监视在Explore中的重命名、新建、删除文" & _
vbCrLf & "件或目录;改变文件关联;插入、取出CD和添加" & vbCrLf & "删除网络共享都可以被该程序记录下来。"
End If
Call SHNotify_Register(hWnd)
Else
Text1 = "系统不支持操作监视程序 :-)"
End If
Move Screen.Width - Width, Screen.Height - Height
End Sub

Private Function IsIDE() As Boolean
On Error GoTo Out
Debug.Print 1 / 0
Out:
IsIDE = Err
End Function

Private Sub Form_Unload(Cancel As Integer)
Call SHNotify_Unregister
Call UnSubClass(hWnd)
End Sub

Public Sub NotificationReceipt(wParam As Long, lParam As Long)
Dim sOut As String
Dim shns As SHNOTIFYSTRUCT
Dim sDisplayname1 As String
Dim sDisplayname2 As String

MoveMemory shns, ByVal wParam, Len(shns)

If shns.dwItem1 Then
sDisplayname1 = GetDisplayNameFromPIDL(shns.dwItem1)
End If

If shns.dwItem2 Then
sDisplayname2 = GetDisplayNameFromPIDL(shns.dwItem2)
End If
sOut = SHNotify_GetEventStr(sDisplayname1, sDisplayname2, lParam) & vbCrLf
Text1 = Text1 & sOut & vbCrLf
Text1.SelStart = Len(Text1)
End Sub
然后在工程中加入三个模块(Bas)文件,将三个文件分别保存为mDef.Bas、mShell.Bas、mSub.Bas。在mDef.Bas中加入以下代码:
'mDef.Bas包含Shell操作的函数和数据类型的定义
Option Explicit

Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, _
pSource As Any, ByVal dwLength As Long)
Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)

Public Const MAX_PATH = 260
Public Const NOERROR = 0

'SHGetSpecialFolderLocation获得某一个特殊的目录的位置,如果函数调用成功返回NOERROR
'或者一个OLE错误
Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
(ByVal hwndOwner As Long, _
ByVal nFolder As SHSpecialFolderIDs, _
pidl As Long) As Long

Public Enum SHSpecialFolderIDs '列出所有Windows下特殊文件夹的ID
CSIDL_DESKTOP = &H0
CSIDL_INTERNET = &H1
CSIDL_PROGRAMS = &H2
CSIDL_CONTROLS = &H3
CSIDL_PRINTERS = &H4
CSIDL_PERSONAL = &H5
CSIDL_FAVORITES = &H6
CSIDL_STARTUP = &H7
CSIDL_RECENT = &H8
CSIDL_SENDTO = &H9
CSIDL_BITBUCKET = &HA
CSIDL_STARTMENU = &HB
CSIDL_DESKTOPDIRECTORY = &H10
CSIDL_DRIVES = &H11
CSIDL_NETWORK = &H12
CSIDL_NETHOOD = &H13
CSIDL_FONTS = &H14
CSIDL_TEMPLATES = &H15
CSIDL_COMMON_STARTMENU = &H16
CSIDL_COMMON_PROGRAMS = &H17
CSIDL_COMMON_STARTUP = &H18
CSIDL_COMMON_DESKTOPDIRECTORY = &H19
CSIDL_APPDATA = &H1A
CSIDL_PRINTHOOD = &H1B
CSIDL_ALTSTARTUP = &H1D
CSIDL_COMMON_ALTSTARTUP = &H1E
CSIDL_COMMON_FAVORITES = &H1F
CSIDL_INTERNET_CACHE = &H20
CSIDL_COOKIES = &H21
CSIDL_HISTORY = &H22
End Enum

'SHGetPathFromIDList函数将一个Item转换为文件路径
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, _
ByVal pszPath As String) As Long

'SHGetFileInfoPidl函数获得某个文件对象的信息。
Declare Function SHGetFileInfoPidl Lib "shell32" Alias "SHGetFileInfoA" _
(ByVal pidl As Long, _
ByVal dwFileAttributes As Long, _
psfib As SHFILEINFOBYTE, _
ByVal cbFileInfo As Long, _
ByVal uFlags As SHGFI_flags) As Long

Public Type SHFILEINFOBYTE
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName(1 To MAX_PATH) As Byte
szTypeName(1 To 80) As Byte
End Type

Declare Function SHGetFileInfo Lib "shell32" Alias "SHGetFileInfoA" _
(ByVal pszPath As String, _
ByVal dwFileAttributes As Long, _
psfi As SHFILEINFO, _
ByVal cbFileInfo As Long, _
ByVal uFlags As SHGFI_flags) As Long

Public Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type

Enum SHGFI_flags
SHGFI_LARGEICON = &H0
SHGFI_SMALLICON = &H1
SHGFI_OPENICON = &H2
SHGFI_SHELLICONSIZE = &H4
SHGFI_PIDL = &H8
SHGFI_USEFILEATTRIBUTES = &H10
SHGFI_ICON = &H100
SHGFI_DISPLAYNAME = &H200
SHGFI_TYPENAME = &H400
SHGFI_ATTRIBUTES = &H800
SHGFI_ICONLOCATION = &H1000
SHGFI_EXETYPE = &H2000
SHGFI_SYSICONINDEX = &H4000
SHGFI_LINKOVERLAY = &H8000
SHGFI_SELECTED = &H10000
End Enum

'根据一个特定文件夹对象的ID获得它的目录pidl
Public Function GetPIDLFromFolderID(hOwner As Long, nFolder As SHSpecialFolderIDs) As Long
Dim pidl As Long
If SHGetSpecialFolderLocation(hOwner, nFolder, pidl) = NOERROR Then
GetPIDLFromFolderID = pidl
End If
End Function

Public Function GetDisplayNameFromPIDL(pidl As Long) As String
Dim sfib As SHFILEINFOBYTE
If SHGetFileInfoPidl(pidl, 0, sfib, Len(sfib), SHGFI_PIDL Or SHGFI_DISPLAYNAME) Then
GetDisplayNameFromPIDL = GetStrFromBufferA(StrConv(sfib.szDisplayName, vbUnicode))
End If
End Function

Public Function GetPathFromPIDL(pidl As Long) As String
Dim sPath As String * MAX_PATH
If SHGetPathFromIDList(pidl, sPath) Then
GetPathFromPIDL = GetStrFromBufferA(sPath)
End If
End Function

Public Function GetStrFromBufferA(sz As String) As String
If InStr(sz, vbNullChar) Then
GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1)
Else
GetStrFromBufferA = sz
End If
End Function

在mShell.Bas中加入以下代码:
'mShell.Bas函数包含注册和反注册系统通告以及文件夹信息转换的函数
Option Explicit

Private m_hSHNotify As Long '系统消息通告句柄
Private m_pidlDesktop As Long

'定义系统通告的消息值
Public Const WM_SHNOTIFY = &H401

Public Type PIDLSTRUCT
pidl As Long
bWatchSubFolders As Long
End Type

Declare Function SHChangeNotifyRegister Lib "shell32" Alias "#2" _
(ByVal hWnd As Long, _
ByVal uFlags As SHCN_ItemFlags, _
ByVal dwEventID As SHCN_EventIDs, _
ByVal uMsg As Long, _
ByVal cItems As Long, _
lpps As PIDLSTRUCT) As Long

Type SHNOTIFYSTRUCT
dwItem1 As Long
dwItem2 As Long
End Type

Declare Function SHChangeNotifyDeregister Lib "shell32" Alias "#4" _
(ByVal hNotify As Long) As Boolean

Declare Sub SHChangeNotify Lib "shell32" _
(ByVal wEventId As SHCN_EventIDs, _
ByVal uFlags As SHCN_ItemFlags, _
ByVal dwItem1 As Long, _
ByVal dwItem2 As Long)

Public Enum SHCN_EventIDs
SHCNE_RENAMEITEM = &H1
SHCNE_CREATE = &H2
SHCNE_DELETE = &H4
SHCNE_MKDIR = &H8
SHCNE_RMDIR = &H10
SHCNE_MEDIAINSERTED = &H20
SHCNE_MEDIAREMOVED = &H40
SHCNE_DRIVEREMOVED = &H80
SHCNE_DRIVEADD = &H100
SHCNE_NETSHARE = &H200
SHCNE_NETUNSHARE = &H400
SHCNE_ATTRIBUTES = &H800
SHCNE_UPDATEDIR = &H1000
SHCNE_UPDATEITEM = &H2000
SHCNE_SERVERDISCONNECT = &H4000
SHCNE_UPDATEIMAGE = &H8000&
SHCNE_DRIVEADDGUI = &H10000
SHCNE_RENAMEFOLDER = &H20000
SHCNE_FREESPACE = &H40000
SHCNE_ASSOCCHANGED = &H8000000

SHCNE_DISKEVENTS = &H2381F
SHCNE_GLOBALEVENTS = &HC0581E0
SHCNE_ALLEVENTS = &H7FFFFFFF
SHCNE_INTERRUPT = &H80000000
End Enum

#If (WIN32_IE >= &H400) Then
Public Const SHCNEE_ORDERCHANGED = &H2
#End If

Public Enum SHCN_ItemFlags
SHCNF_IDLIST = &H0
SHCNF_PATHA = &H1
SHCNF_PRINTERA = &H2
SHCNF_DWORD = &H3
SHCNF_PATHW = &H5
SHCNF_PRINTERW = &H6
SHCNF_TYPE = &HFF
SHCNF_FLUSH = &H1000
SHCNF_FLUSHNOWAIT = &H2000

#If UNICODE Then
SHCNF_PATH = SHCNF_PATHW
SHCNF_PRINTER = SHCNF_PRINTERW
#Else
SHCNF_PATH = SHCNF_PATHA
SHCNF_PRINTER = SHCNF_PRINTERA
#End If
End Enum

Public Function SHNotify_Register(hWnd As Long) As Boolean
Dim ps As PIDLSTRUCT

If (m_hSHNotify = 0) Then

m_pidlDesktop = GetPIDLFromFolderID(0, CSIDL_DESKTOP)
If m_pidlDesktop Then

ps.pidl = m_pidlDesktop
ps.bWatchSubFolders = True

'注册Windows监视,将获得的句柄保存到m_hSHNotify中
m_hSHNotify = SHChangeNotifyRegister(hWnd, SHCNF_TYPE Or SHCNF_IDLIST, _
SHCNE_ALLEVENTS Or SHCNE_INTERRUPT, _
WM_SHNOTIFY, 1, ps)
SHNotify_Register = CBool(m_hSHNotify)

Else
Call CoTaskMemFree(m_pidlDesktop)
End If
End If
End Function

Public Function SHNotify_Unregister() As Boolean
If m_hSHNotify Then
If SHChangeNotifyDeregister(m_hSHNotify) Then
m_hSHNotify = 0
Call CoTaskMemFree(m_pidlDesktop)
m_pidlDesktop = 0
SHNotify_Unregister = True
End If
End If
End Function

Public Function SHNotify_GetEventStr(strPath1, strPath2 As String, dwEventID As Long) As String
Dim sEvent As String

Select Case dwEventID
Case SHCNE_RENAMEITEM: sEvent = "重命名文件" + strPath1 + "为" + strPath2
Case SHCNE_CREATE: sEvent = "建立文件 文件名:" + strPath1
Case SHCNE_DELETE: sEvent = "删除文件 文件名:" + strPath1
Case SHCNE_MKDIR: sEvent = "新建目录 目录名:" + strPath1
Case SHCNE_RMDIR: sEvent = "删除目录 目录名:" + strPath1
Case SHCNE_MEDIAINSERTED: sEvent = strPath1 + "中插入可移动存储介质"
Case SHCNE_MEDIAREMOVED: sEvent = strPath1 + "中移去可移动存储介质"
Case SHCNE_DRIVEREMOVED: sEvent = "移去驱动器" + strPath1
Case SHCNE_DRIVEADD: sEvent = "添加驱动器" + strPath1
Case SHCNE_NETSHARE: sEvent = "改变目录" + strPath1 + "的共享属性"
Case SHCNE_UPDATEDIR: sEvent = "更新目录" + strPath1
Case SHCNE_UPDATEITEM: sEvent = "更新文件 文件名:" + strPath1
Case SHCNE_SERVERDISCONNECT: sEvent = "断开与服务器的连" + strPath1 + " " + strPath2
Case SHCNE_UPDATEIMAGE: sEvent = "SHCNE_UPDATEIMAGE"
Case SHCNE_DRIVEADDGUI: sEvent = "SHCNE_DRIVEADDGUI"
Case SHCNE_RENAMEFOLDER: sEvent = "重命名文件夹" + strPath1 + "为" + strPath2
Case SHCNE_FREESPACE: sEvent = "磁盘空间大小改变"

Case SHCNE_ASSOCCHANGED: sEvent = "改变文件关联"
End Select

SHNotify_GetEventStr = sEvent
End Function

在mSub.Bas中加入以下代码:
'mSub函数包括窗口的消息处理函数
Option Explicit

Private Const WM_NCDESTROY = &H82
Private Const GWL_WNDPROC = (-4)
Private Const OLDWNDPROC = "OldWndProc"

Private Declare Function GetProp Lib "user32" Alias "GetPropA" (ByVal _
hWnd As Long, ByVal lpString As String) As Long
Private Declare Function SetProp Lib "user32" Alias "SetPropA" (ByVal _
hWnd As Long, ByVal lpString As String, ByVal hData As Long) As Long
Private Declare Function RemoveProp Lib "user32" Alias "RemovePropA" (ByVal _
hWnd As Long, ByVal lpString As String) As Long

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Public Function SubClass(hWnd As Long) As Boolean
Dim lpfnOld As Long
Dim fSuccess As Boolean

If (GetProp(hWnd, OLDWNDPROC) = 0) Then
lpfnOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
If lpfnOld Then
fSuccess = SetProp(hWnd, OLDWNDPROC, lpfnOld)
End If
End If

If fSuccess Then
SubClass = True
Else
If lpfnOld Then Call UnSubClass(hWnd)
MsgBox "Unable to successfully subclass &H" & Hex(hWnd), vbCritical
End If
End Function

Public Function UnSubClass(hWnd As Long) As Boolean
Dim lpfnOld As Long

lpfnOld = GetProp(hWnd, OLDWNDPROC)
If lpfnOld Then
If RemoveProp(hWnd, OLDWNDPROC) Then
UnSubClass = SetWindowLong(hWnd, GWL_WNDPROC, lpfnOld)
End If
End If
End Function

Public Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As _
Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_SHNOTIFY '处理系统消息通告函数
Call Form1.NotificationReceipt(wParam, lParam)
Case WM_NCDESTROY
Call UnSubClass(hWnd)
MsgBox "Unubclassed &H" & Hex(hWnd), vbCritical, "WndProc Error"
End Select

WndProc = CallWindowProc(GetProp(hWnd, OLDWNDPROC), hWnd, uMsg, wParam, lParam)
End Function

保存文件,然后运行程序,然后你可以在Explore中试着建立或者删除一个文件或者文件夹,在Form中可以看到你所做的操作已经被纪录并且显示到TextBox中了。
现 在分析以下上面的程序,上面的程序首先调用SHChangeNotifyRegister函数将Form添加到系统消息通告链中,并利用 SetWindowLong函数改变Form的缺省的消息处理函数,当接受到系统通告消息后,根据传递的参数获得系统通告的内容并且显示在文本窗口中。退 出程序时调用SHChangeNotifyDeregister函数注销系统消息通告。

http://dev.csdn.net/develop/article/3/3297.shtm

标签: ,

Oracle/MS SQL Server的数据库多表关联更新UPDATE与多表更新

一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表


一、MS SQL Server 多表关联更新

sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引用要更新的表以外的其它数据。
一般形式:

update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式

例如:

UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的

二、Oracle 多表关联更新

Oracle没有update from语法,可以通过两种实现方式:

1、利用子查询:
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式

UPDATE多个字段两种写法:


写法一:

UPDATE table_1 a
SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m),
col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m)



UPDATE table_1 a
SET col_x1 = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m),
col_x2 = (SELECT b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m)


写法二:

UPDATE table_1 a
SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE EXISTS (SELECT * FROM table_2 b WHERE b.col_n = a.col_m);



UPDATE table_1 a
SET (col_x1, col_x2) = (SELECT b.col_y1, b.col_y2 FROM table_2 b WHERE b.col_n = a.col_m)
WHERE a.col_m=(SELECT b.col_n FROM table_2 b WHERE b.col_n = a.col_m)

注意:

1. 对于子查询的值只能是一个唯一值,不能是多值。
2. 子查询在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。且where EXISTS子句可用另一方法代替,如上。

2、利用视图:

UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
SET ANAME=BNAME;

注意:

1. 对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。


另外,Oracle中的Delete的from子句也没有多表联接的功能,只能通过子查询的方式来做:
delete from 表A where exists (select * from 表B where 表A.empid=表B.empid)
delete from 表A where 表A.empid in (select empid from 表B)

三、oracle视图多表更新

在oracle中通常如果视图的数据源来自单表则该视图可以进行更新。而如果视图数据源来自两个以上表时这个视图是不可更新的。但有时候为了操作的方便我们更希望能够对多表视图也进行更新。

这时候我们可以通过建立更新触发器来替代该视图原有更新以达到多表更新的效果

例如:

3.1 创建测试数据表
--===================================================
--创建测试表
--===================================================
Drop Table t1;
Drop Table t2;
create table t1
( t11 numeric(28),t12 varchar2(20));
create table t2
( t11 numeric(28),t22 varchar2(20));

3.2 多表视图范例
--===================================================
--创建测试视图
--===================================================
create Or Replace view t as
select T1.t11 f1 ,T1.t12 f2 ,T2.t22 f3
from T1,T2
Where T1.t11=T2.t11;

3.3 多表视图触发器范例
--===================================================
--创建视图的替代触发器
--===================================================
Create Or Replace Trigger Trg_InsUpdDel_t
Instead Of Insert or update or delete
on t
for each row
Declare
begin
If Inserting Then
Insert Into t1 (t11,t12) Values (:New.f1,:New.f2);
Insert Into t2 (t11,t22) Values (:New.f1,:New.f3);
elsif Updating Then
Update t1 set t11=:New.f1,t12=:New.f2 where t11=:New.f1;
Update t2 set t11=:New.f1,t22=:New.f3 where t11=:New.f1;
elsif Deleting then
Delete from t1 where t11=:Old.f1;
Delete from t2 where t11=:Old.f1;
End if;
end;
如此即实现多表可更新视图的定义工作 。

但要注意当视图进行重新编译的时候这个触发器会失效需要重建。


http://hi.baidu.com/suofang/blog/item/249c067b40c8def00ad187aa.html

标签: , ,

星期五, 四月 04, 2008

Resources Explorer


(
Full Size Image)

ResExplorer is a tool that helps you find resources in EXE or DLL files. The first time you use it, it makes a list of files with resource counts. After that, it can show you a selected resource in a selected file (image and attributes). It is possible to save this to a file or the Clipboard. Some formats are available; these are compatible with Visual Studio (such as BMP, AVI, VAW, RES, ICO, or CUR). The program can easily be extended to support all other resource types.

A management of table of the symbols makes it possible to replace the numerical values indicating the resources by symbols such those defined in the files Resource.h


(Full Size Image)

Special tooltips give attribute details.


(Full Size Image)

This tool is an example of MFC usage (sources available): SDI with variable splitter windows (list view, tree view, and scroll view) to show files listing and tree, and a list for resource attributes.

Parts are directly usable in other applications such as for example:

  • Management of the columns and sorting in CListCtrl in Report mode: Utilities.cpp and Utilities.h.
  • Edition in place of subitems in CListCtrl in Report mode: ListCtrlEx.cpp and ListCtrlEx.h.
  • Display and writing in file of the resoures Bitmap, icon and Curseur: BitmapRW.cpp and BitmapRW.h

It does not use special classes to read resources in the EXE or DLL files.

A help (in French) is implemented but is it necessary to use this tool.

About the Author
Courbevoie (France)

Downloads

  • ResExplorer.zip - Sources of ResExplorer release 2.0
  • ResExplorerHlp1.zip - Source of Help part 1
  • ResExplorerHlp2.zip - Source of Help part 2
  • http://www.codeguru.com/cpp/w-d/dislog/miscellaneous/article.php/c9063/

    标签:

    选择Tcl的十大理由-----转载自Tcl/Tk中文网

    选择Tcl的十大理由

    ---------------------------------------
    转载自Tcl/Tk中文网
    http://tcltk.126.com
    介绍Tcl/Tk语言的基本知识,汇集大量关于
    Tcl/Tk的中文原创文章,英文翻译文档,开
    设有Tcl/Tk中文网论坛。
    ---------------------------------------


    人们使用Tcl/Tk的原因各不相同的,不过总的来说可以归纳为几类。下面所列的就是当前人们选择Tcl/Tk的10个最主要的原因。

    1. 开发应用程序的周期短

    人们使用Tcl/Tk 最主要的原因是Tcl/Tk使他们的工作能够更快的完成。许多情况下,用Tcl编写的应用程序比用其他语言编写的应用程序运行速度快5-10倍。这在那些包含图形用户界面,字符串操作,积分操作的程序中表现得尤为突出。而且用Tcl编写的应用程序稍加修改就能适应变化的需求。

    2. 适于开发图形用户界面

    Tcl与Tk工具箱相互配合提 供了一整套创建图形用户界面的非常简单而又十分强大的工具。比如Tk的Canvas构件,不但可以十分方便的创建图形显示而且还提供诸如bindings 和tags之类功能强大的部件。Text构件则可以提供复杂的超文本功能。在过去,只有Tcl提供了在UNIX下创建图形用户界面的完美的解决方案,这使 得它拥有了一大批早期的追随者。如今Tcl可以在Windows,Macintoshi平台上提供同样出色的功能。

    3.能够开发跨平台的应用程序

    Tcl可以在Windows,Macintosh和几乎所有能想到的UNIX平台下运行,这使它成为开发跨平台应用程序的绝佳工具。举例来说,同样的 Tcl脚本可以在UNIX,Windows和Macintosh上显示一个图形用户界面,这个图形用户界面在不同的平台上具有不同的外观,使不同平台上的 用户在使用上没有障碍。由于Tcl可运行于所有的主流平台,所以它为那些类似于服务器采用UNIX,桌面采用Windows这样的混合环境提供了卓越的管 理和整合工具。

    4. 可以方便的扩展应用程序

    如果你想创建一个能让用户自行修改和扩充的,功能强大的应用程序,那么你需要在这个应用程序中包含进一个解释性的脚本语言。Tcl/Tk能非常好的实现这个目的。Tcl解释器设计的初衷就是要能够嵌入到各种应用程序中。你可以很容易的将Tcl整合到一个应用程序中。Tcl解释器与应用程序能够很自然的融合在一起,看起来就好像Tcl是专门为编写这个应用程序而设计的语言。

    5.具有弹性的整合功能

    使用Tcl可以很方便的将已有的部件与应用程序整合起来,使他们能更有效的工作。例如,可以将Tcl用作特殊用途的硬件和协议的控制语言,为陈旧的应用程序添加图形用户接口或网络接口,或者将以前用C/C++编写的代码与新的Java应用程序整合起来,这使Tcl成为网络管理和工业自动化领域的强大工具。

    6.为企业应用提供解决方案

    随 着Tcl8.1的发布,Tcl成为适合于开发大型服务程序和开发用于执行关键任务的企业级应用程序的首选(也是唯一可选)的脚本语言。脚本语言的优势,如 快速的开发周期,弹性升级,易于整合,是众所周知的,但是在Tcl8.1之前,还没有一种能够满足企业应用程序需求的脚本语言,这些需求包括对国际化,线 性安全,跨平台性,出色的图形用户接口,可嵌入性,因特网访问,数据访问之类的支持。Tcl8.1加入了对国际化的支持和线性安全,使Tcl成为不仅具有脚本语言的所有优势还能满足企业需求的首选脚本语言。

    7.易于调试

    Tcl是用于实现硬件自动化和软件测 试的理想语言并且可能会成为这方面的主导语言。使用Tcl你可以很容易的连接到测试硬件或是一个应用程序的内部API接口,执行测试功能,检查结果,报告 错误。Tcl的解释执行使测试环境能够迅速的建立起来,并且能够将测试结果以脚本文件的形式保存以用于以后的测试。如果你正在测试一个软件应用程 序,Tcl可以使你直接连接到应用程序的底层API中,这样可以使测试更准确、更全面。

    8.易于学习

    Tcl是一种非常简单易学的语言,有经验的程序员可以在几天甚至几小时内就可以学会并能开始着手编写应用程序。普通的程序员也能很快的学会Tcl。通常由有经验的程序员编写一些基本的功能,更多普通的程序员应用这些功能来创建自己的应用程序。

    9.易于编写网络应用程序

    Tcl比任何平台都更易于使用网络设备,编写服务器端和客户端应用程序,只需几行代码,几分钟内就可以创建出来。另外,Tcl还可以很方便的为陈旧的应用程序加入网络接口。

    10.庞大的Tcl网络社区

    使用Tcl的另一个原因是它具有一个庞大的用户开发者社区,你随时都可以在Tcl网络社区中与别人交换代码、扩展包以及应用程序,还可以得到技术支持。

    11.附加一点,Tcl是免费的!

    Tcl可以从Tcl Developer Xchang网站上免费的得到,你可以对其代码进行修改以满足自己的需要或者将它用于商业用途。
    http://topic.csdn.net/t/20030729/18/2086235.html
    估计Python的说法类似

    标签:

    在Code::Blocks上使用wxWidgets-2.8.0 (二)——开发篇

    终于进入正题了,我们先建立一个最简单的demo:
    (1) 建立工程
    用new projects建立一个wxWidgets application,在project option里使用Using UNICODE static wxWidgets libraries,当然如果你编译的是其他类型的库就选其他的。
    这时建立的工程使用的却都是wxWidgets-2.6.0的配置,你需要自己修改wxWidgets的配置。
    在左边栏的工程上点右键->Build Options进行配置.
    (2) 配置Custom variables
    WX_DIR配置为wxWidgets config时设的--prefix的目录,我的就是mingw啦。
    WX_CFG配置为$(WX_DIR)\bin\wx-config。
    (3) 配置directory
    Compiler:
    $(WX_DIR)\include\wx-2.8
    $(WX_DIR)\lib\wx\include\msw-unicode-release-static-2.8

    Linker:
    $(WX_DIR)\lib

    Resource compiler
    $(WX_DIR)\include\wx-2.8
    (4) 配置Linker
    将原来的mswxu去掉,改成wx_mswu-2.8
    再加上lib目录下的其他几个libwx开头的库,如wxpng-2.8。
    注意这些库一定要排在所有库的最前面,否则link的时候仍然会出错。
    (5) 编译运行
    最重要的时刻到了, 点击Build and Run吧!怎么样,出错了吧,因为还要改一些小地方:)
    这肯定是CB的bug了,你会看到new wxMenu时报错, 应该把""改成_(""), 这是因为我们现在建立的是Unicode程序,wxWidgets处理的字符串全都要加上"_()"这个宏.
    现在可以运行了吧~
    使用CB的wxSmith插件可以进行RAD开发, 大家可以看看这篇文章:
    http://wiki.codeblocks.org/index.php?title=WxSmith_Tutorial_%26_Pointers
    写的很详细,不过仍然是基于wx 2.6.0的,如果用在2.8的库上会出一些小错误,不过很好改,有空的话我再写吧~

    (6) something about CB
    CB的编辑器有个问题,就是对中文的支持不是很好,比如要把窗口的标题使用中文字符串就不行,不过这只是编辑器的问题,我们换个支持UTF-8的编辑器编辑这个源文件就可以了,比如emacs23:) 这样中文就能用在你的wxWidget里了吧~
    最后强烈推荐Code::Blocks,它的开发团队非常活跃,每天都会有进展,这点非常重要,听说Dev-CPP的原创人之一都已经跳槽到CB开发了~ 希望更多的人能支持这个IDE,毕竟开源界太缺少这样的工具了,虽然写代码我一般用emacs,但是要开发GUI程序的话,还是有个RAD工具最好了~

    http://aniluke.spaces.live.com/blog/cns!63F0E8C8F9B72D8A!412.entry

    标签: , ,

    星期四, 四月 03, 2008

    报告称美国开源创业公司获风投额创历史新高

    北京时间4月2日消息,据国外媒体报道,美国市场研究公司451 Group今天发布的最新研究报告显示,2008年第一季度期间,美国开放源代码(以下简称“开源”)创业公司所获得的风险投资总额为2.04亿美元,比去年同期增长一倍多,创下历史新高。

      报告称,2008年第一季度期间,风险投资公司与各开源创业公司的总交易为20起,其中17家创业公司已公开了各自价值,平均每起交易涉资额为 1200万美元。451 Group分析师马修·阿斯莱特(Matthew Aslett)表示:“这也是开源创业公司有史以来融资额最好的一个季度。”2007年第一季度期间,开源创业公司获得风险投资交易为11起,总融资额为 1亿美元。

      阿斯莱特指出,在今年第一季度所获风险投资中,大部分流入到Automattic、Greenplum、SugarCRM及Pentaho等开源创业 公司手中。开源数据库厂商EnterpriseDB上周表示,已在第三轮融资中获得了1000万美元资金。由于开源程序基本上没有成本可言,开源创业公司 需要寻求有效的商业盈利模式。通常情况下,开源公司的盈利方式有以下几种:

      1) 免费向客户提供软件,然后向相应用户收取技术支持及其他服务费用;

      2) 在所推出的软件中捆绑广告,然后与广告商共享广告收入;

      3) 仅向客户提供免费的基础版软件;如果用户希望使用增强版,则需交纳一定费用;

      4) 在开源软件中捆绑专利性商用软件。
    来源:腾讯科技

    标签:

    星期三, 四月 02, 2008

    Joomla!扩展开发

    Joomla!扩展开发
    http://hi.baidu.com/andycai/blog/item/f0dbae1ed8f92f1b4134171b.html

    第一章 Joomla!扩展开发:概况

    你以前开发过动态网站但你的朋友告诉你有关Joomla!的事,所以你决定试一试。从食物网上那些出名的厨师中得到灵感后,你想建立一个简单的关于餐厅的网站。这个网站的安装比你期望要建立的内容管理系统要快速和平稳。

    当你找到一个精美的模板并添加了一些菜单和一些内容后,你开始考虑增加一些新的特性可以给你带来更多的访问量,甚至一些钱。之后,你安装了购物车来买书,一个论坛来收集意见和一些边栏广告。

    为什么扩展Joomla

    Joomla!不但能够处理内容文章,而且允许你干净地综合各种复杂的应用。开发者为Joomla!开发各种扩展,如购物车、论坛、职位发布等。所有这些扩展能够运行在单个数据库、模板和核心。我们开发出来的扩展,界面是完全统一的。

    当你正确地开发扩展时,你就不用登录数据库和做其他基本的配置。另外,你也可以分发你自己开发的扩展给别人和别人分享,不需要另外的编程和数据库操作。

    自定义 VS 扩展

    Joomla!的代码是设计成可扩展的而不是直接修改它的核心代码。当有升级版本或者有补丁的时候,Joomla!会升级它本身的核心代码,而你的扩展你不会被覆盖的。

    如何扩展Joomla

    Joomla!支持三类扩展,每一类都有特殊的用途。

    组件

    组件是最基本的,组件就是你所看到的页面的主要部分。Joomla!的设计是来为每个页面加载和运行一个组件。因此,Joomla!核心的内容管理功能本身也是一个组件。

    组件经常会有强大的后端管理。后端通常用来创建和更新数据库记录。你也可以用它来允许网站管理员来上传图片或者视频。

    模块

    相对组件,一个页面可以有很多的模块。模块一般由边栏的元素或者是内容菜单组成,模块显示组件的内容,它们不是页面的主要内容。Joomla! 也支持不需要编程的内容模块。模块后端的控制是有限制的,一般由基本的格式组成。

    插件

    当网站需要插入一些代码来实现某些逻辑,它可以由插件实现(以前叫做Mambot)。插件一般用来格式化页面的组件或者模块的输出。例如有这样的组件,关键字高亮显示、文章评论表单、基于JavaScript的HTML编辑器等。后端的控制与模块相似。

    主题概况

    创建工具栏和列表

    Joomla!的后端提供了一套标准的工具栏按钮。它们使得界面可以保持一致的风格,所以使用者可以很快地熟悉相应的功能。如果有必要的话,这些按钮可 以修改和添加。和标准的工具栏一样,数据库记录的列表也有统一的显示风格。这些列表通常会包括编辑单条记录的链接,改变发布状态的链接和提供自动分页功 能。

    使用HTML函数来维护一致的外观和减少重复的代码

    在你的扩展里,有各种标准的CSS类名可以用来格式化内容和HTML元素。另外,Joomla!包含很多函数可以自动生成复选框、下拉框和其他通用的元素。

    访问数据库和管理记录

    Joomla!提供了一个公用的数据库对象,可以让每个页面的请求只适用一个连接。这个对象提供了一组函数用来查询数据和返回结果。这些函数是独立数据 库的,他们被设计成支持一个数据库多Joomla!。除了一个公用的数据库对象,Joomla!还提供了标准的数据库表类。使用它核心的函数可以创建、读 取、更新和删除记录。也可以添加这样的逻辑,当父记录被删除,其他表的子记录也会被删除。

    安全和获取请求变量的首选方法

    既然Joomla!是一个公开的web 应用,有必要保护他免受攻击。Joomla!提供了只有在框架里被调用的保险的脚本方法,也不会随便地执行。除非是未明的脚本行为,黑客能故意地提交数据来访问你的数据库,Joomla!提供了阻止这类攻击的功能。

    菜单项控制

    Joomla!的一个显著的特性是导航与内容分离。然而,如果一个组件创建时没有考虑到这一点,网站管理员可能会不能选择他们的模板和模块。为了利用这 给系统,有必要在产生连接时使用既定的菜单项ID数字。组件的链接可以有多个选项,允许在前端显示不同的选择而不用手工去构建长长的URL。

    控制组件的逻辑流

    当某一个组件被加载时同一个文件被调用,但是执行不同的函数。Joomla!使用标准的变量来决定每个请求要执行的函数。对于比较小的组件,可以用来从 数据库和其它处理函数直接处理输出,比较大的组件会使用controller来处理逻辑流,用model来处理数据访问,用views来控制输出。这样的 约定使得维护代码更加容易和帮助组件以更可靠的方式执行。

    通过XML进行参数配置

    Joomla!不是通过创建单独的表来处理扩展的配置信息,而是预留了一个字段来处理。变量通过扩展中的XML文件定义。XML文件也提供了默认值和约束这些参数。而且会自动地保存和返回这些值,而不需要手写查询语句。

    打包和分发

    一旦所有的代码都编写完成,它是很容易打包给其他人使用的。所有文件的一个列表会被加入到XML文件中。任何需要建立数据表的查询语句也会包含在里面。所有文件被压缩成一个文件,然后这个扩展就可以被任何基于Joomla!的网站安装和使用。

    http://www.joomlagate.com/component/option,com_smf/Itemid,31/topic,2235.msg9109/

    标签:

    建立access数据库的安全门

    http://jackcess.sourceforge.net/xref/com/healthmarketscience/jackcess/Database.html
    在office 2000下,access数据库的安全机制已经更为完善。除了对数据库设置密码保护,对数据库进行编码压缩,还可以启用用户级的安全机制,在用户级别上控制对数据库的访问。

      一、数据库设置密码

      对于单机使用的数据库或者是需要工作组共享的数据库,仅设置密码保护较为合适。知道密码的组成员,都有数据库的完全操作权限,彼此之间的使用权限没有什么区别。设置密码的步骤如下:

      启动microsoft access,在弹出的选择窗口中点取消,不打开任何数据库。

      点击菜单:文件---打开,在弹出的打开窗口中,选中要打开的数据库文件。然后在打开按钮的右侧展开箭头上单击选定以独占方式打开,用独占方式打开选定的数据库。

      在access窗口菜单上点击:工具—安全—设置数据库密码。在弹出的密码和验证输入框中,输入密码,注意区分大小

      写,并请记住。然后点击确定按钮。

      关闭数据库,退出access环境,密码设置完毕。下次再打开此数据库,就会提示输入密码,密码正确才能打开数据库。

      如要复制数据库,请不要使用数据库密码。如设置了密码,复制的数据库将不能同步。数据库的密码是和数据库文件放置在一起,而不是放在工作组信息文件中。

      二、数据库压缩编码

      为了进一步对数据库进行加密保护,可以对数据库进行编码压缩。这样使用其它工具程序或字处理等软件就无法查看此数据库的内容。而对用户在access下的使用则不影响。编码的步骤如下:

      启动microsoft access,在弹出的选择窗口中点取消,不打开任何数据库。

      点击菜单:工具—安全—加密/解密数据库。

      在弹出的数据库加密/解密窗口中,选取要编码的数据库,点击确定按钮。

      在弹出的数据库加密后另存为窗口中,在文件名输入框中输入编码后的文件名,点击保存按钮。编码压缩后的数据库被另保为另一个文件。

      三、用户级安全机制

      使用用户级的安全机制,可以更灵活更安全的保护数据库。在这种安全机制下,

      在access关联的工作组信息文件中建立用户和工作组帐户,用来管理用户;在具体的数据库中管理对象权限,可以给用户和工作组分别指定使用权限。用户要输入用户名称和密码才能打开数据库,对数据库的操作要受拥有权限的限制。

      1、工作组信息文件

       在microsoft access中,用户和工作组的信息帐户,是存储在工作组信息文件中的,即使用工作组信息文件来管理用户和工作组。而默认的工作组信息文件 是:c:\program files\microsoft office\office\system.mdw。

      用户也可以建立自己的工作组信息文件,用来按照自己的需要来划分和管理用户和工作组,一般是存放在数据库所在的工作目录下的secured.mdw文件中,当然用户也可以自己指定文件名和存放位置,但文件的扩展名不可以变。

       工作组信息文件与整个access关联对应着,在access运行环境下有效,而不是对应某个数据库的。每次access启动,都要读取工作组信息文件 从而得到用户和工作组的帐户信息。默认是读取默认工作组信息文件system.mdw,但用户可以指定access与哪个工作组信息文件关联:运行工作组 信息管理器wrkgadm.exe,(通常在c:\program files\microsoft office\office\下已经有指向该程序的快捷方式ms access workgroup administrator)可以创建新的工作组信息文件或指定access联接某一个工作组信息文件。还可以在启动access的时候用命令行启动参数 选项/wrkg <工作组信息文件名>来指定联接的工作组信息文件。

      2、工作组信息文件的管理

      启动ms access workgroup administrator快捷方式,在工作组管理员窗口中,点联接按钮可以更改access启动时要联接的工作组信息文件:在弹出的工作组信息文件窗口 中指定文件的路径名称即可。点创建按钮,则可以创建一个新的工作组信息文件:在弹出的工作组所有权信息窗口中,输入工作组名称、单位、工作组id三项内 容。在工作组信息文件窗口中输入工作组信息文件数据库的存放路径和名称。这就可以创建新的工作组信息文件,并已经建立了关联。

      工作组id是工作组唯一的唯一性标识,用于区别于其它的工作组信息文件,必须要保存好,必要时可以凭此重建文件。

      在access下,点击菜单:工具安全—用户级安全性向导,选中新建工作组信息文件,也可以建立新的工作组信息文件。

      3、安全机制

      在用户级安全机制下,每个用户有用户名称、个人标识(pid)、根据名称和pid用加密算法产生的唯一安全标识(sid)、密码;每个工作组有唯一的工作组名称、个人标识(pid)、安全标识(sid),组没有密码,也不能用组名登录。

      用户和组的个人标识(pid)是唯一的,由4~20个字符组成,区分大小写。用户和组的安全标识sid(security id),是由名称和pid用加密算法产生的,唯一性的。

       在工作组信息文件中(实际是特殊的access数据库),表msysaccounts中保存用户和组的名称、sid、密码信息,用户和组的sid和用户 的密码,是用二进制保存的。在表msysgroups中,存储工作组sid和用户sid之间的对照关系,以此判断用户属于哪个组。这两个表都是隐藏系统 表。

      用户和组,对于数据库机器各对象之间的对应操作权限关系,并不保存在工作组信息文件中,而是存放在数据库文件中,是因数据库 而异的。在access数据库(.mdb)文件中,有一个隐藏系统表msysaces,其中存放着用户和组的sid以及与之对应的数据库各对象的标识 id,还有操作权限信息。以此表示用户和组与数据库对象之间的对应和操作权限关系。

      在用户打开数据库时,microsoft access根据用户输入的用户名称和密码,在工作组信息文件的msysaccounts表中查找该用户的sid,若未找到则提示帐户无效并让重新输入; 若找到了用户的sid,则在msysgroups表中查找到用户所属组的sid。根据找到的用户和组的sid,再去数据库(.mdb)的msysaces 表中查找对应的数据库对象id和其权限信息,由此可以确定用户和组可以访问什么数据库对象及有什么操作权限。

      4、用户与工作组

       在默认的工作组信息文件system.mdw中,默认的有三个帐户:admin、creator、engine,其中creator和engine是 microsoft jet数据库引擎内建的,用户无法干涉。管理员帐户admin,则是唯一的默认帐户,拥有对数据库中所有对象的全部权限,在中文access中,帐户名可 以是“管理员”也可以是英文下的admin。

      在默认的工作组信息文件中,默认设置了两个工作组:管理员组和用户组。

       在默认状态下,用户启动access时使用的是admin帐户,且无须输入用户名称和密码,因为其名称admin默认,而初始密码为空。若:用此默认方 式启动access,然后点击菜单工具—安全—用户与组帐号,在用户与组帐号窗口中,选更改登录密码选项卡,在旧密码输入框中空着,新密码、验证输入框中 填入新密码,就可以增设了管理员帐号的新密码。如果不是默认登录方式进入的,只须在旧密码输入框中填入旧密码,就可以更改密码。对于其它的用户,也可以同 样的更改自己的密码。设置了密码后,再启动access打开数据库,就会要求输入用户帐号了。

      管理员帐号的sid,对于所有的工作组信息文件都是一样的,这意味着:无论是用哪一个工作组信息文件关联到access启动系统,都可以使用管理员帐号去访问所有本机的access数据库。

       创建对象的用户,是该对象的所有者,拥有全部权限。即使被管理员撤消了权限,也可以进入用户与组权限对话框,给自己指定权限。管理员不能永久彻底撤消对 象所有者的权限,但是可以改变对象的所有者。所以管理员除了要控制好权限外,还要适时的改变对象的所有者,才能保证安全。

      5、用户与工作组的管理与权限

      设置工作组,是为了分配和管理权限的方便,可以将用户划分分配到工作组,然后对工作组授予 权限,而不用一个个的对用户授权。默认的管理员组和用户组,一般就已经可以满足使用了,默认都拥有全部权限。管理员组的sid对所有的工作组信息文件都相 同,而用户组的sid对所有工作组信息文件都不同。所有用户都属于用户组。

      管理员拥有全部的权限,而用户的权限最好是来自于用户组而不是单独授权。为了安全,不应该让用户组拥有全部权限。

      对用户和组的管理,可以按如下步骤:

      启动access,必须用管理员的帐号登录。

      打开要管理的数据库。

      点击菜单:工具—安全—用户与组帐号,进入用户与组的管理窗口,在其中可以新建用户、新建组、分配用户到某个组、更改登录密码、删除用户、删除组、清除用户密码等。

      点击菜单:工具—安全—用户与组的权限,进入用户与组权限管理窗口,在其中可以设置每个用户、对什么对象、有什么操作权限,还可以更改对象的所有者。在用户、组、对象类型的选择中可以切换设置设置方式。

      为了更彻底的安全,可以单独建立一个管理员帐号,授予全部权限,而将默认的管理员帐号删除(从管理员组移出,不能彻底删除)。然后删除管理员和用户组的全部权限。将所有对象的所有者该为新建的管理员帐号。这样可以保证只有新建的管理员帐号才能访问数据库。

      撤消用户级安全性:将管理员归属于管理员组,密码为空;将数据库所有对象的所有权限分配给用户组;将全部对象的所有权归属于管理员。

      6、用户级安全性向导

      可以利用用户级安全性向导来建立数据库的用户级安全性。在运行向导之前先将数据库备份以防万一。从菜单:工具—安全—设置安全机制向导,可以启动向导。按照提示进行设置操作,可以设置好组、用户、权限等各种安全性。

      四、用.mde文件保护数据库

      mde是一种经过编译的特殊形式的数据库,这种格式下,大多数对象只能执行而不能修改。也不能进行对象的导入和导出。

      点击工具—数据库实用工具—生成>mde文件,可以进入保存窗口。

      指定好原始的数据库位置和名称,指定要保存的mde文件的位置和名称,点击保存即可完成。

      access数据库的安全性,从根本上来说不如sql server一类的服务器级别数据库那么完善。但是对于桌面上的数据库管理应用来说,这些安全保密性能已经可以满足使用要求了。


    http://www.esnet.com.cn/Article/jishu/Data/200610/9788.html

    标签:

    SQL Server判断阻塞发生在某张表上

    1. 使用sp_lock进行察看,如果 输出信息 locktype 中包含 -blk 字符,说明当前表 table_id 的 page 上的锁对其他进程造成了阻塞
    2. 通过察看 master..syslocks 系统表

    id dbid page type spid class fid context row loid
    ----------- ------ ----------- ------ ------ ------------------------------ ------ ------- ------ -----------
    512004855 6 0 3 13 Non Cursor Lock 0 0 0 26
    512004855 6 0 4 12 Non Cursor Lock 0 0 0 24
    512004855 6 0 3 10 Non Cursor Lock 0 0 0 20
    512004855 6 793 261 13 Non Cursor Lock 0 8 0 26

    从spid可知道当前阻塞及被阻塞的进程,并且从type字段可以知道锁的类型,见下表:
    1 0x1 排它表锁
    2 0x2 共享表锁
    3 0x3 排它意图锁
    4 0x4 共享意图锁
    5 0x5 排它页锁
    6 0x6 共享页锁
    7 0x7 更新页锁
    8 0x8 排它行锁
    9 0x9 共享行锁
    10 0xA 更新行锁
    11 0xB 共享下一键锁
    256 0x100 锁在阻塞另一个进程
    512 0x200 请求锁

    所以你可以通过下面的查询获得阻塞表信息
    select b.name as dbname,a.id as table_id,page,spid from syslocks a,sysdatabases b
    where b.dbid = a.dbid
    and a.type & 256 = 256

    你也可以写成一个存储过程,不过一定要在master中执行。

    这样更好:

    1. 使用sp_who进行察看,如果输出信息中blk字段不为0,则表明有点问题,问题与blk对应的值有关系。
    fid spid status loginame origname hostname blk dbname cmd
    ------ ------ ------------ ------------ ------------ ---------- ----- ---------- ----------------
    ......
    0 32 recv sleep c7mon c7mon e3500 0 c7db BULK INSERT
    ......
    0 37 recv sleep c7mon c7mon e3500 0 c7db AWAITING COMMAND
    0 38 lock sleep c7mon c7mon e3500 32 c7db DROP TABLE
    0 40 recv sleep c7mon c7mon e3500 0 c7db BULK INSERT

    或:使用sp_lock进行察看,如果 输出信息 locktype 中包含 -blk 字符,说明当前表 table_id 的 page 上的锁对其他进程造
    成了阻塞
    fid spid locktype table_id page row dbname class context
    ------ ------ ---------------------------- ----------- ----------- ------ --------------- ------------------------------ ----------------------------
    ......
    0 31 Ex_intent 1821965567 0 0 c7db Non Cursor Lock Fam dur
    0 32 Ex_intent-blk 1569440665 0 0 c7db Non Cursor Lock Fam dur
    0 33 Ex_intent 42483230 0 0 c7db Non Cursor Lock Fam dur

    2. 通过察看 master..syslocks 系统表

    id dbid page type spid class fid context row loid
    ----------- ------ ----------- ------ ------ ------------------------------ ------ ------- ------ -----------
    512004855 6 0 3 13 Non Cursor Lock 0 0 0 26
    512004855 6 0 4 12 Non Cursor Lock 0 0 0 24
    512004855 6 0 3 10 Non Cursor Lock 0 0 0 20
    512004855 6 793 261 13 Non Cursor Lock 0 8 0 26

    从spid可知道当前阻塞及被阻塞的进程,并且从type字段可以知道锁的类型,见下表:
    1 0x1 排它表锁
    2 0x2 共享表锁
    3 0x3 排它意图锁
    4 0x4 共享意图锁
    5 0x5 排它页锁
    6 0x6 共享页锁
    7 0x7 更新页锁
    8 0x8 排它行锁
    9 0x9 共享行锁
    10 0xA 更新行锁
    11 0xB 共享下一键锁
    256 0x100 锁在阻塞另一个进程
    512 0x200 请求锁

    所以你可以通过下面的查询获得阻塞表信息:

    select b.name as tablename,page,spid
    from master..syslocks a , sysobjects b
    where b.id=a.id and spid=blk_value (目前来看是32)
    如:
    tablename page spid
    ------------------------------ ----------- ------
    t20030228 0 32

    也就是说32 BULK INSERT 和 38 DROP TABLE都是在处理 t20030228 表,导致s锁。

    http://www.chinaunix.net/jh/21/9547.html

    标签:

    Access的系统对象

    MSysObjects
    MSysACEs
    MSysQueries
    MSysRelationships
    MSysAccessObjects
    MSysDb

    Tables
    Databases
    Relationships
    Forms
    Modules
    Reports
    Scripts
    SysRel
    AccessLayout
    DataAccessPages

    备用:Access的系统表和对象

    标签:

    SQL Server 2000 Collection排序规则

    函数调用实例:

    select dbo.fun_getbh('中华人民共和国'),dbo.fun_getbh('中華人民共和國') 

    执行结果:笔划总数分别为39和46,简繁体都行。

    当然,你也可以把上面“UNION ALL”内的汉字和笔划改存在固定表内,在汉字列建CLUSTERED INDEX,列排序规则设定为:

    Chinese_PRC_Stroke_CS_AS_KS_WS

    这样速度更快。假如你用的是BIG5码的操作系统,你得另外生成汉字,方法一样。但有一点要记住:这些汉字是通过SQL语句Select出来的,不是手工输入的,更不是查字典得来的,因为新华字典究竟不同于UNICODE字符集,查字典的结果会不正确。  

    用排序规则的特性得到汉字拼音首字母

    用得到笔划总数相同的方法,我们也可以写出求汉字拼音首字母的函数。如下:

    create  function  fun_getPY(@str  nvarchar(4000))
    returns nvarchar(4000)
    as
    begin
    declare @word nchar(1),@PY nvarchar(4000)
    set @PY=''
    while len(@str)>0
    begin
    set @word=left(@str,1)
    --假如非汉字字符,返回原字符
    set @PY=@PY (case when unicode(@word) between 19968 and 19968 20901
    then (select top 1 PY from (
    select 'A' as PY,N'驁' as word
    union all select 'B',N'簿'
    union all select 'C',N'錯'
    union all select 'D',N'鵽'
    union all select 'E',N'樲'
    union all select 'F',N'鰒'
    union all select 'G',N'腂'
    union all select 'H',N'夻'
    union all select 'J',N'攈'
    union all select 'K',N'穒'
    union all select 'L',N'鱳'
    union all select 'M',N'旀'
    union all select 'N',N'桛'
    union all select 'O',N'漚'
    union all select 'P',N'曝'
    union all select 'Q',N'囕'
    union all select 'R',N'鶸'
    union all select 'S',N'蜶'
    union all select 'T',N'籜'
    union all select 'W',N'鶩'
    union all select 'X',N'鑂'
    union all select 'Y',N'韻'
    union all select 'Z',N'咗'
    ) T
    where word>=@word collate Chinese_PRC_CS_AS_KS_WS
    order by PY ASC) else @word end)
    set @str=right(@str,len(@str)-1)
    end
    return @PY

    http://www.itzhe.cn/html/sql/MsSQL/20080312/108251_5.html
    end

    函数调用实例:

    select dbo.fun_getPY('中华人民共和国'),dbo.fun_getPY('中華人民共和國')

    结果都是:ZHRMGHG

    大家假如有爱好,可以使用相同的方法,扩展得到汉字全拼的函数,甚至你还可以得到全拼的读音声调,不过全拼分类大多了。得到全拼最好还是用对照表,两万多汉字搜索速度显然很快,另外,用对照表还可以充分利用表的索引。

    标签:

    星期二, 四月 01, 2008

    Select语句示例

    以下示例显示三个代码示例。第一个代码示例返回 AdventureWorks 数据库的 Product 表中的所有行(未指定 WHERE 子句)和所有列(使用了 *)。

    USE AdventureWorks ;
    GO
    SELECT *
    FROM Production.Product
    ORDER BY Name ASC ;
    -- Alternate way.
    USE AdventureWorks ;
    GO
    SELECT p.*
    FROM Production.Product p
    ORDER BY Name ASC ;
    GO

    该示例返回 AdventureWorks 数据库的 Product 表的所有行(未指定 WHERE 子句)和列子集(NameProductNumberListPrice)。此外,还添加了一个列标题。

    USE AdventureWorks ;
    GO
    SELECT Name, ProductNumber, ListPrice AS Price
    FROM Production.Product
    ORDER BY Name ASC ;
    GO

    该示例仅返回 Product 表中产品系列为 R 且生产天数少于 4 的那些行。

    USE AdventureWorks ;
    GO
    SELECT Name, ProductNumber, ListPrice AS Price
    FROM Production.Product
    WHERE ProductLine = 'R'
    AND DaysToManufacture < 4
    ORDER BY Name ASC ;
    GO

    下面的示例返回 Product 表中的所有行。第一个示例返回每种产品的总销售额与总折扣。在第二个示例中,计算每种产品的总收入。

    USE AdventureWorks ;
    GO
    SELECT p.Name AS ProductName,
    NonDiscountSales = (OrderQty * UnitPrice),
    Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
    FROM Production.Product p
    INNER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    ORDER BY ProductName DESC ;
    GO

    该查询将计算每个销售订单中每种产品的收入。

    USE AdventureWorks ;
    GO
    SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)), ' for ',
    p.Name AS ProductName
    FROM Production.Product p
    INNER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    ORDER BY ProductName ASC ;
    GO

    以下示例使用 DISTINCT 以避免检索重复标题。

    USE AdventureWorks ;
    GO
    SELECT DISTINCT Title
    FROM HumanResources.Employee
    ORDER BY Title ;
    GO

    以下第一个示例将在 tempdb 中创建一个名为 #Bicycles 的临时表。若要使用该表,则必须使用与下面显示的名称完全相同的名称进行引用。这包括数字符号 (#)。

    USE tempdb ;
    IF OBJECT_ID (N'#Bicycles',N'U') IS NOT NULL
    DROP TABLE #Bicycles ;
    GO
    USE AdventureWorks;
    GO
    SET NOCOUNT ON

    SELECT *
    INTO #Bicycles
    FROM Production.Product
    WHERE ProductNumber LIKE 'BK%'

    SET NOCOUNT OFF

    SELECT name
    FROM tempdb..sysobjects
    WHERE name LIKE '#Bicycles%' ;
    GO

    下面是结果集:

    name                         
    ------------------------------
    #Bicycles_____________________

    第二个示例创建永久表 NewProducts

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
    DROP TABLE dbo.NewProducts ;
    GO
    ALTER DATABASE AdventureWorks SET RECOVERY BULK_LOGGED ;
    GO

    SELECT * INTO dbo.NewProducts
    FROM Production.Product
    WHERE ListPrice > $25
    AND ListPrice < $100

    SELECT name
    FROM sysobjects
    WHERE name LIKE 'New%'

    USE master ;
    GO

    ALTER DATABASE AdventureWorks SET RECOVERY FULL ;
    GO

    下面是结果集:

    name                         
    ------------------------------
    NewProducts
    (1 row(s) affected)

    以下示例显示了语义等价的查询并说明了使用 EXISTS 关键字和 IN 关键字的区别。两个都是有效子查询示例,用于检索产品型号为长袖标志运动衫且 ProductModelID 编号在 ProductProductModel 两个表中相匹配的每种产品名称的实例。

    USE AdventureWorks ;
    GO
    SELECT DISTINCT Name
    FROM Production.Product p
    WHERE EXISTS
    (SELECT *
    FROM Production.ProductModel pm
    WHERE p.ProductModelID = pm.ProductModelID
    AND pm.Name = 'Long-sleeve logo jersey') ;
    GO

    -- OR

    USE AdventureWorks ;
    GO
    SELECT DISTINCT Name
    FROM Production.Product
    WHERE ProductModelID IN
    (SELECT ProductModelID
    FROM Production.ProductModel
    WHERE Name = 'Long-sleeve logo jersey') ;
    GO

    以下示例在相关或重复子查询中使用 IN。该查询依赖于外部查询来查询其值。该查询为外部查询可能选择的每一行各重复执行一次。该查询检索 SalesPerson 表中奖金为 5000.00 且雇员标识号在 EmployeeSalesPerson 表中相匹配的每个雇员姓名的实例。

    USE AdventureWorks ;
    GO
    SELECT DISTINCT c.LastName, c.FirstName
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE 5000.00 IN
    (SELECT Bonus
    FROM Sales.SalesPerson sp
    WHERE e.EmployeeID = sp.SalesPersonID) ;
    GO

    该语句中前面的子查询无法独立于外部查询进行计算。它需要使用 Employee.EmployeeID 值,但是该值随着 SQL Server 2005 数据库引擎检查的 Employee 中的不同行而发生改变。

    相关子查询还可以用于外部查询的 HAVING 子句。以下示例查找其最高标价高于其平均标价两倍以上的产品型号。

    USE AdventureWorks
    GO
    SELECT p1.ProductModelID
    FROM Production.Product p1
    GROUP BY p1.ProductModelID
    HAVING MAX(p1.ListPrice) >= ALL
    (SELECT 2 * AVG(p2.ListPrice)
    FROM Production.Product p2
    WHERE p1.ProductModelID = p2.ProductModelID) ;
    GO

    此示例使用两个相关子查询查找售出过某种特定产品的雇员的姓名。

    USE AdventureWorks ;
    GO
    SELECT DISTINCT c.LastName, c.FirstName
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE EmployeeID IN
    (SELECT SalesPersonID
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID IN
    (SELECT SalesOrderID
    FROM Sales.SalesOrderDetail
    WHERE ProductID IN
    (SELECT ProductID
    FROM Production.Product p
    WHERE ProductNumber = 'BK-M68B-42'))) ;
    GO

    以下示例查找数据库中各销售订单的总额。

    USE AdventureWorks ;
    GO
    SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
    FROM Sales.SalesOrderDetail sod
    GROUP BY SalesOrderID
    ORDER BY SalesOrderID ;
    GO

    由于使用了 GROUP BY 子句,因此针对每个销售订单只返回一行销售总额。

    以下示例查找按产品 ID 和特价产品 ID 分组的平均价格和迄今为止的年销售总额。

    Use AdventureWorks
    SELECT ProductID, SpecialOfferID, AVG(UnitPrice) AS 'Average Price',
    SUM(LineTotal) AS SubTotal
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID, SpecialOfferID
    ORDER BY ProductID
    GO

    以下示例在只检索标价大于 $1000 的行后,将结果进行分组。

    USE AdventureWorks;
    GO
    SELECT ProductModelID, AVG(ListPrice) AS 'Average List Price'
    FROM Production.Product
    WHERE ListPrice > $1000
    GROUP BY ProductModelID
    ORDER BY ProductModelID ;
    GO

    以下示例按表达式进行分组。如果表达式不包含聚合函数,则可以按表达式进行分组。

    USE AdventureWorks ;
    GO
    SELECT AVG(OrderQty) AS 'Average Quantity',
    NonDiscountSales = (OrderQty * UnitPrice)
    FROM Sales.SalesOrderDetail sod
    GROUP BY (OrderQty * UnitPrice)
    ORDER BY (OrderQty * UnitPrice) DESC ;
    GO

    下面的第一个示例仅为数量 > 10 的订单分组。

    第二个示例对所有订单进行分组。

    对于不符合条件的行的组,保存聚合值(平均价格)的列为 NULL

    USE AdventureWorks ;
    GO
    SELECT ProductID, AVG(UnitPrice) AS 'Average Price'
    FROM Sales.SalesOrderDetail
    WHERE OrderQty > 10
    GROUP BY ProductID
    ORDER BY ProductID ;
    GO

    -- Using GROUP BY ALL
    USE AdventureWorks ;
    GO
    SELECT ProductID, AVG(UnitPrice) AS 'Average Price'
    FROM Sales.SalesOrderDetail
    WHERE OrderQty > 10
    GROUP BY ALL ProductID
    ORDER BY ProductID ;
    GO

    以下示例查找每种产品的平均价格并按平均价格将结果排序。

    USE AdventureWorks ;
    GO
    SELECT ProductID, AVG(UnitPrice) AS 'Average Price'
    FROM Sales.SalesOrderDetail
    WHERE OrderQty > 10
    GROUP BY ProductID
    ORDER BY AVG(UnitPrice) ;
    GO

    下面的第一个示例显示带聚合函数的 HAVING 子句。该子句按产品 ID 将 SalesOrderDetail 表中的行进行分组并消除那些平均订单数量等于或小于五的产品。第二个示例显示不带聚合函数的 HAVING 子句。

    USE AdventureWorks ;
    GO
    SELECT ProductID
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING AVG(OrderQty) > 5
    ORDER BY ProductID ;
    GO

    该查询在 HAVING 子句中使用 LIKE 子句。

    USE AdventureWorks ;
    GO
    SELECT SalesOrderID, CarrierTrackingNumber
    FROM Sales.SalesOrderDetail
    GROUP BY SalesOrderID, CarrierTrackingNumber
    HAVING CarrierTrackingNumber LIKE '4BD%'
    ORDER BY SalesOrderID ;
    GO

    以下示例显示在一个 SELECT 语句中使用 GROUP BYHAVINGWHEREORDER BY 子句。该语句生成组和汇总值(但是组和汇总值是在消除价格超过 $25 且平均订单数量低于 5 的产品之后得出的)。它还按 ProductID 组织其结果。

    USE AdventureWorks ;
    GO
    SELECT ProductID
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < 25.00
    GROUP BY ProductID
    HAVING AVG(OrderQty) > 5
    ORDER BY ProductID ;
    GO

    以下示例按产品 ID 将 SalesOrderDetail 表进行分组,结果中仅包含订单总金额超过 $1000000.00 且其平均订单数量少于 3 的产品的组。

    USE AdventureWorks ;
    GO
    SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING SUM(LineTotal) > $1000000.00
    AND AVG(OrderQty) < 3 ;
    GO

    若要查看总销售额超过 $2000000.00 的产品,请使用以下查询:

    USE AdventureWorks ;
    GO
    SELECT ProductID, Total = SUM(LineTotal)
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING SUM(LineTotal) > $2000000.00 ;
    GO

    若要确保在计算中至少为每种产品包含 1500 项,请使用 HAVING COUNT(*) > 1500 消除返回总数少于 1500 售出项的产品。该查询如下所示:

    USE AdventureWorks ;
    GO
    SELECT ProductID, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    GROUP BY ProductID
    HAVING COUNT(*) > 1500 ;
    GO

    下面的示例使用两个代码示例说明 COMPUTE BY 的用法。第一个代码示例使用一个 COMPUTE BY 和一个聚合函数,第二个代码示例使用一个 COMPUTE BY 项和两个聚合函数。

    该查询针对每个产品类型中其价格低于 $5.00 的产品,计算订单的总和。

    USE AdventureWorks ;
    GO
    SELECT ProductID, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    ORDER BY ProductID, LineTotal
    COMPUTE SUM(LineTotal) BY ProductID ;
    GO

    该查询检索单价低于 $5.00 的产品的产品类型及订单总计。COMPUTE BY 子句使用了两个不同的聚合函数。

    USE AdventureWorks ;
    GO
    SELECT ProductID, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    ORDER BY ProductID, LineTotal
    COMPUTE SUM(LineTotal), MAX(LineTotal) BY ProductID ;
    GO

    可以使用不带 BY 的 COMPUTE 关键字生成总计值、总计数,等等。

    以下示例查找价格低于 $2.00 的所有类型产品的价格总计和预付款总计。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, UnitPrice, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $2.00
    COMPUTE SUM(OrderQty), SUM(LineTotal) ;
    GO

    在同一查询中可以使用 COMPUTE BY 和不带 BY 的 COMPUTE。以下查询按产品类型查找订单数量总和与行总计,然后再计算订单数量总计和行总计。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, UnitPrice, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    ORDER BY ProductID
    COMPUTE SUM(OrderQty), SUM(LineTotal) BY ProductID
    COMPUTE SUM(OrderQty), SUM(LineTotal) ;
    GO

    以下示例只显示选择列表中的三列,并在最终结果中给出基于所有订单数量和所有行合计的总计。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, LineTotal
    FROM Sales.SalesOrderDetail
    COMPUTE SUM(OrderQty), SUM(LineTotal) ;
    GO

    以下示例查找按产品 ID 和订单数量组织的单价小于 $5 的所有订单的价格总和,以及只按产品 ID 组织的单价小于 $5 的所有订单的价格总和。通过包含多个 COMPUTE BY 子句,可以在同一语句中使用不同的聚合函数。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, UnitPrice, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    ORDER BY ProductID, OrderQty, LineTotal
    COMPUTE SUM(LineTotal) BY ProductID, OrderQty
    COMPUTE SUM(LineTotal) BY ProductID ;
    GO

    下面的第一个示例使用 COMPUTE 子句按产品类型计算所有单价低于 $5.00 的所有订单总和。第二个示例只使用 GROUP BY 生成相同的汇总信息。

    USE AdventureWorks ;
    GO
    SELECT ProductID, LineTotal
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    ORDER BY ProductID
    COMPUTE SUM(LineTotal) BY ProductID ;
    GO

    下面是使用 GROUP BY 的第二个查询示例。

    USE AdventureWorks ;
    GO
    SELECT ProductID, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    GROUP BY ProductID
    ORDER BY ProductID ;
    GO

    以下示例仅返回那些单价低于 $5 的订单,然后再按产品计算行合计,然后计算总计。所有的计算列都出现在选择列表中。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    GROUP BY ProductID, OrderQty
    ORDER BY ProductID, OrderQty
    COMPUTE SUM(SUM(LineTotal)) BY ProductID, OrderQty
    COMPUTE SUM(SUM(LineTotal)) ;
    GO

    以下示例显示了两个代码示例。第一个示例使用 CUBE 运算符从 SELECT 语句返回结果集。由于使用 CUBE 运算符,该语句将返回一个额外的行。

    USE AdventureWorks ;
    GO
    SELECT ProductID, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    GROUP BY ProductID, OrderQty
    WITH CUBE
    ORDER BY ProductID ;
    GO

    NULL 表示 ProductID 列中的所有值。结果集返回每种产品的售出数量值和所有产品的销售总量值。应用 CUBE 运算符或 ROLLUP 运算符将返回相同的结果。

    以下示例使用 CubeExample 表说明 CUBE 运算符如何影响结果集及使用聚合函数 (SUM)。CubeExample 表包含产品名称、客户名称以及每个客户对某个特定产品下的订单数。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.CubeExample', 'U') IS NOT NULL
    DROP TABLE dbo.CubeExample ;
    GO
    CREATE TABLE dbo.CubeExample(
    ProductName VARCHAR(30) NULL,
    CustomerName VARCHAR(30) NULL,
    Orders INT NULL
    )

    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Filo Mix', 'Romero y tomillo', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Outback Lager', 'Wilman Kala', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Filo Mix', 'Romero y tomillo', 20)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Ikura', 'Wilman Kala', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Ikura', 'Romero y tomillo', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Outback Lager', 'Wilman Kala', 20)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Filo Mix', 'Wilman Kala', 30)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Filo Mix', 'Eastern Connection', 40)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Outback Lager', 'Eastern Connection', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Ikura', 'Wilman Kala', 40)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Ikura', 'Romero y tomillo', 10)
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Filo Mix', 'Romero y tomillo', 50) ;
    GO

    首先,发出一个带 GROUP BY 子句和结果集的典型查询。

    USE AdventureWorks ;
    GO
    SELECT ProductName, CustomerName, SUM(Orders)
    FROM CubeExample
    GROUP BY ProductName, CustomerName
    ORDER BY ProductName ;
    GO

    GROUP BY 使结果集在组内形成组。

    下面是结果集:

    ProductName                    CustomerName                             
    ------------------------------ ------------------------------ -----------
    Filo Mix Eastern Connection 40
    Filo Mix Romero y tomillo 80
    Filo Mix Wilman Kala 30
    Ikura Romero y tomillo 20
    Ikura Wilman Kala 50
    Outback Lager Eastern Connection 10
    Outback Lager Wilman Kala 30
    (7 row(s) affected)

    然后,使用 CUBE 运算符发出一个具有 GROUP BY 子句的查询。结果集应为每个 GROUP BY 列包含相同的信息和超聚合信息。

    USE AdventureWorks ;
    GO
    SELECT ProductName, CustomerName, SUM(Orders)
    FROM CubeExample
    GROUP BY ProductName, CustomerName
    WITH CUBE ;
    GO

    CUBE 运算符的结果集包含上一个简单 GROUP BY 结果集的值,并添加了 GROUP BY 子句中的每一列的超聚合信息。NULL 表示结果集中为其计算了聚合的所有值。

    下面是结果集:

    ProductName                    CustomerName                             
    ------------------------------ ------------------------------ -----------
    Filo Mix Eastern Connection 40
    Filo Mix Romero y tomillo 80
    Filo Mix Wilman Kala 30
    Filo Mix NULL 150
    Ikura Romero y tomillo 20
    Ikura Wilman Kala 50
    Ikura NULL 70
    Outback Lager Eastern Connection 10
    Outback Lager Wilman Kala 30
    Outback Lager NULL 40
    NULL NULL 260
    NULL Eastern Connection 50
    NULL Romero y tomillo 100
    NULL Wilman Kala 110
    (14 row(s) affected)

    结果集的第 4 行表明所有客户总共对 Filo Mix 下了 150 份订单。

    结果集的第 11 行表明所有客户对所有产品下的订单总数为 260

    结果集的第 12-14 行表明各个客户对所有产品下的订单总数分别为 10011050

    以下示例中,SELECT 语句返回产品型号 ID、产品名称和订单数量。该示例中的 GROUP BY 子句包含 ProductModelIDName 列。

    通过使用 CUBE 运算符,结果集中包含有关产品订单数量和产品型号的更详细信息。NULL 表示标题列中的所有值。

    USE AdventureWorks ;
    GO
    SELECT ProductModelID, p.Name AS ProductName, SUM(OrderQty)
    FROM Production.Product p
    INNER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    GROUP BY ProductModelID, p.Name
    WITH CUBE ;
    GO

    增加 GROUP BY 子句中的列数将说明 CUBE 运算符为 n 维运算符的原因。使用 CUBE 运算符时,具有两个列的 GROUP BY 子句将多返回三种分组。分组的个数可能多于三个,这取决于列中的非重复值。

    结果集先按产品型号 ID 进行分组,然后再按产品名称进行分组。

    ProductModelID 列中的 NULL 表示所有 ProductModelsName 列中的 NULL 表示所有 ProductsCUBE 运算符由一个 SELECT 语句返回下列几组信息:

    • 每种产品型号的订单数量
    • 每种产品的订单数
    • 订单的总数

    GROUP BY 子句中被引用每一列都曾与 GROUP BY 子句中的所有其他列一起被交叉引用,而且 SUM 聚合也被重复应用。这将在结果集中产生额外的行。结果集中返回的信息随 GROUP BY 子句中列数的增长而呈现 n 维增长。

    注意:
    请确保在 GROUP BY 子句后列出的列相互之间具有有意义的现实性关系。例如,如果使用 NameProductID,CUBE 运算符将返回不相关的信息。对诸如年度销售额和季度销售额之类的现实性层次结构使用 CUBE 运算符在结果集中生成的行毫无意义。所以使用 ROLLUP 运算符更有效。

    以下示例说明了 SELECT 语句如何使用 SUM 聚合、GROUP BY 子句以及 CUBE 运算符。它还对 GROUP BY 子句后列出的两个列使用 GROUPING 函数。

    USE AdventureWorks ;
    GO
    SELECT ProductModelID, GROUPING(ProductModelID), p.Name AS ProductName, GROUPING(p.Name), SUM(OrderQty)
    FROM Production.Product p
    INNER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    GROUP BY ProductModelID, p.Name
    WITH CUBE ;
    GO

    结果集中有两个包含值 01 的列。这是由 GROUPING(ProductModelID)GROUPING(p.Name) 表达式产生的。

    以下示例显示了两个代码示例。第一个示例检索产品名称、客户名称和客户所下的订单总数,并且该示例使用了 ROLLUP 运算符。

    USE AdventureWorks ;
    GO
    SELECT ProductName, CustomerName, SUM(Orders) AS 'Sum orders'
    FROM dbo.CubeExample
    GROUP BY ProductName, CustomerName
    WITH ROLLUP ;
    GO

    下面是结果集:

    ProductName                    CustomerName                   Sum orders
    ------------------------------ ------------------------------ -----------
    Filo Mix Eastern Connection 40
    Filo Mix Romero y tomillo 80
    Filo Mix Wilman Kala 30
    Filo Mix NULL 150
    Ikura Romero y tomillo 20
    Ikura Wilman Kala 50
    Ikura NULL 70
    Outback Lager Eastern Connection 10
    Outback Lager Wilman Kala 30
    Outback Lager NULL 40
    NULL NULL 260
    (11 row(s) affected)

    下面第二个示例对公司列和部门列执行 ROLLUP 运算并统计出雇员总数。

    ROLLUP 运算符生成聚合汇总。需要汇总信息时,此运算很有用;但是,如果完整的 CUBE 提供了外来的数据或者具有集中集时,此运算就不是很有用了。例如,公司中的部门就是集中集。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.Personnel', 'U') IS NOT NULL
    DROP TABLE dbo.Personnel ;
    GO
    CREATE TABLE dbo.Personnel
    (
    CompanyName VARCHAR(20) NOT NULL,
    Department VARCHAR(15) NOT NULL,
    NumEmployees int NOT NULL
    )

    INSERT dbo.Personnel VALUES ('Du monde entier', 'Finance', 10)
    INSERT dbo.Personnel VALUES ('Du monde entier', 'Engineering', 40)
    INSERT dbo.Personnel VALUES ('Du monde entier', 'Marketing', 40)
    INSERT dbo.Personnel VALUES ('Piccolo und mehr', 'Accounting', 20)
    INSERT dbo.Personnel VALUES ('Piccolo und mehr', 'Personnel', 30)
    INSERT dbo.Personnel VALUES ('Piccolo und mehr', 'Payroll', 40) ;
    GO

    在下列查询中,除了 ROLLUP 计算值外,公司名称、部门和公司内所有雇员的总数也成为结果集的一部分。

    USE AdventureWorks ;
    GO
    SELECT CompanyName, Department, SUM(NumEmployees)
    FROM dbo.Personnel
    GROUP BY CompanyName, Department WITH ROLLUP ;
    GO

    下面是结果集:

    CompanyName          Department                
    -------------------- --------------- -----------
    Du monde entier Engineering 40
    Du monde entier Finance 10
    Du monde entier Marketing 40
    Du monde entier NULL 90
    Piccolo und mehr Accounting 20
    Piccolo und mehr Payroll 40
    Piccolo und mehr Personnel 30
    Piccolo und mehr NULL 90
    NULL NULL 180
    (9 row(s) affected)

    以下示例向 CubeExample 表中添加三个新行。三行中的每行都在一列或多列中记录 NULL,以便说明只有 ROLLUP 函数在分组列中生成值 1。此外,该示例还修改了上一个示例中使用的 SELECT 语句。

    USE AdventureWorks ;
    GO
    -- Add first row with a NULL customer name and 0 orders.
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES ('Ikura', NULL, 0)

    -- Add second row with a NULL product and NULL customer with real value
    -- for orders.
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES (NULL, NULL, 50)

    -- Add third row with a NULL product, NULL order amount, but a real
    -- customer name.
    INSERT dbo.CubeExample (ProductName, CustomerName, Orders)
    VALUES (NULL, 'Wilman Kala', NULL)

    SELECT ProductName AS Prod, CustomerName AS Cust,
    SUM(Orders) AS 'Sum Orders',
    GROUPING(ProductName) AS 'Group ProductName',
    GROUPING(CustomerName) AS 'Group CustomerName'
    FROM CubeExample
    GROUP BY ProductName, CustomerName
    WITH ROLLUP ;
    GO

    GROUPING 函数只能与 CUBE 或 ROLLUP 一起使用。表达式取值为 NULL 时,GROUPING 函数返回值 1,因为该列值是 NULL 且表示所有值的集合。当相应的列(不管是不是 NULL)不是来自 CUBE 或 ROLLUP 选项的语法值时,GROUPING 函数返回值 0。返回值的数据类型为 tinyint

    下面是结果集:

    Prod                           Cust                           Sum Orders  Group ProductName Group CustomerName
    ------------------------------ ------------------------------ ----------- ----------------- ------------------
    NULL NULL 50 0 0
    NULL Wilman Kala NULL 0 0
    NULL NULL 50 0 1
    Filo Mix Eastern Connection 40 0 0
    Filo Mix Romero y tomillo 80 0 0
    Filo Mix Wilman Kala 30 0 0
    Filo Mix NULL 150 0 1
    Ikura NULL 0 0 0
    Ikura Romero y tomillo 20 0 0
    Ikura Wilman Kala 50 0 0
    Ikura NULL 70 0 1
    Outback Lager Eastern Connection 10 0 0
    Outback Lager Wilman Kala 30 0 0
    Outback Lager NULL 40 0 1
    NULL NULL 310 1 1
    Warning: Null value is eliminated by an aggregate or other SET operation.
    (15 row(s) affected)

    以下示例使用了一个包含聚合函数和 GROUP BY 子句的 SELECT 查询。

    USE AdventureWorks ;
    GO
    SELECT pm.Name AS ProductModel, p.Name AS ProductName, SUM(OrderQty)
    FROM Production.ProductModel pm
    INNER JOIN Production.Product p
    ON pm.ProductModelID = p.ProductModelID
    INNER JOIN Sales.SalesOrderDetail sod
    ON p.ProductID = sod.ProductID
    GROUP BY pm.Name, p.Name
    WITH ROLLUP ;
    GO

    在结果集中,NULL 表示该列的所有值。

    如果使用不带 ROLLUP 运算符的 SELECT 语句,则该语句创建单个分组。该查询为 ProductModelProductModelIDProductName 的每个唯一组合返回一个总和值:

    ProductModel ProductModelID title SUM(qty)

    GROUPING 函数可以与 ROLLUP 运算符或 CUBE 运算符一起使用。该函数可以应用于选择列表中的一列。根据该列是否由 ROLLUP 运算符分组,该函数返回 1 或 0。

    以下示例说明了使用 INDEX 优化器提示的两种方式。第一个示例说明如何强制优化器使用非聚集索引检索表中的行,第二个示例使用索引 0 强制执行表扫描。

    -- Use the specifically named INDEX.
    USE AdventureWorks ;
    GO
    SELECT c.FirstName, c.LastName, e.Title
    FROM HumanResources.Employee e WITH (INDEX(IX_Employee_ManagerID))
    JOIN Person.Contact c on e.ContactID = c.ContactID
    WHERE ManagerID = 3 ;
    GO

    -- Force a table scan by using INDEX = 0.
    USE AdventureWorks ;
    GO
    SELECT c.LastName, c.FirstName, e.Title
    FROM HumanResources.Employee e WITH (INDEX = 0) JOIN Person.Contact c
    ON e.ContactID = c.ContactID
    WHERE LastName = 'Johnson' ;
    GO

    以下示例说明了如何将 OPTION (GROUP) 子句与 GROUP BY 子句一起使用。

    USE AdventureWorks ;
    GO
    SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
    FROM Sales.SalesOrderDetail
    WHERE UnitPrice < $5.00
    GROUP BY ProductID, OrderQty
    ORDER BY ProductID, OrderQty
    OPTION (HASH GROUP, FAST 10) ;
    GO

    以下示例使用 MERGE UNION 查询提示。

    USE AdventureWorks ;
    GO
    SELECT *
    FROM HumanResources.Employee e1
    UNION
    SELECT *
    FROM HumanResources.Employee e2
    OPTION (MERGE UNION) ;
    GO

    在以下示例中,结果集同时包含 ProductModelGloves 表中的 ProductModelIDName 列中的内容。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
    DROP TABLE dbo.Gloves ;
    GO
    -- Create Gloves table.
    SELECT ProductModelID, Name
    INTO dbo.Gloves
    FROM Production.ProductModel
    WHERE ProductModelID IN (3, 4) ;
    GO

    -- Here is the simple union.
    USE AdventureWorks ;
    GO
    SELECT ProductModelID, Name
    FROM Production.ProductModel
    WHERE ProductModelID NOT IN (3, 4)
    UNION
    SELECT ProductModelID, Name
    FROM dbo.Gloves
    ORDER BY Name ;
    GO

    在以下示例中,第二个 SELECT 语句中的 INTO 子句指定名为 ProductResults 的表保存 ProductModelGloves 表中的指定列的并集(最终结果集)。注意,Gloves 表是由第一个 SELECT 语句创建的。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
    DROP TABLE dbo.ProductResults ;
    GO
    IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
    DROP TABLE dbo.Gloves ;
    GO
    -- Create Gloves table.
    SELECT ProductModelID, Name
    INTO dbo.Gloves
    FROM Production.ProductModel
    WHERE ProductModelID IN (3, 4) ;
    GO

    USE AdventureWorks ;
    GO
    SELECT ProductModelID, Name
    INTO ProductResults
    FROM Production.ProductModel
    WHERE ProductModelID NOT IN (3, 4)
    UNION
    SELECT ProductModelID, Name
    FROM dbo.Gloves ;
    GO

    SELECT *
    FROM dbo.ProductResults ;

    在 UNION 子句中使用的某些参数的顺序非常重要。以下示例通过两个 SELECT 语句说明 UNION 的错误用法和正确用法(在这两个语句的输出中将重命名一个列)。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
    DROP TABLE dbo.Gloves ;
    GO
    -- Create Gloves table.
    SELECT ProductModelID, Name
    INTO dbo.Gloves
    FROM Production.ProductModel
    WHERE ProductModelID IN (3, 4) ;
    GO

    /* INCORRECT */
    USE AdventureWorks ;
    GO
    SELECT ProductModelID, Name
    FROM Production.ProductModel
    WHERE ProductModelID NOT IN (3, 4)
    ORDER BY Name
    UNION
    SELECT ProductModelID, Name
    FROM dbo.Gloves ;
    GO

    /* CORRECT */
    USE AdventureWorks ;
    GO
    SELECT ProductModelID, Name
    FROM Production.ProductModel
    WHERE ProductModelID NOT IN (3, 4)
    UNION
    SELECT ProductModelID, Name
    FROM dbo.Gloves
    ORDER BY Name ;
    GO

    下列示例使用 UNION 来组合具有相同 5 行数据的三个表的结果。第一个示例使用 UNION ALL 显示重复记录,返回所有的 15 行。第二个示例使用不带 ALLUNION,删除三个 SELECT 语句的组合结果中的重复行,返回 5 行。

    第三个示例将 ALL 用于第一个 UNION,并用括号将第二个没有使用 ALLUNION 括起来。第二个 UNION 因位于括号内而首先得到处理,并且因为没有使用 ALL 选项,所以重复行被删除而返回 5 行。通过使用 UNION ALL 关键字将这 5 行与第一个 SELECT 的结果组合在一起。这不会删除两个 5 行结果集之间的重复行。最终结果有 10 行。

    USE AdventureWorks ;
    GO
    IF OBJECT_ID ('EmployeeOne', 'U') IS NOT NULL
    DROP TABLE EmployeeOne ;
    GO
    IF OBJECT_ID ('EmployeeTwo', 'U') IS NOT NULL
    DROP TABLE EmployeeTwo ;
    GO
    IF OBJECT_ID ('EmployeeThree', 'U') IS NOT NULL
    DROP TABLE EmployeeThree ;
    GO

    SELECT c.LastName, c.FirstName, e.Title
    INTO EmployeeOne
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID
    WHERE ManagerID = 66 ;
    GO
    SELECT c.LastName, c.FirstName, e.Title
    INTO EmployeeTwo
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID
    WHERE ManagerID = 66 ;
    GO
    SELECT c.LastName, c.FirstName, e.Title
    INTO EmployeeThree
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID
    WHERE ManagerID = 66 ;
    GO
    -- Union ALL
    SELECT LastName, FirstName
    FROM EmployeeOne
    UNION ALL
    SELECT LastName, FirstName
    FROM EmployeeTwo
    UNION ALL
    SELECT LastName, FirstName
    FROM EmployeeThree ;
    GO

    SELECT LastName, FirstName
    FROM EmployeeOne
    UNION
    SELECT LastName, FirstName
    FROM EmployeeTwo
    UNION
    SELECT LastName, FirstName
    FROM EmployeeThree ;
    GO

    SELECT LastName, FirstName
    FROM EmployeeOne
    UNION ALL
    (
    SELECT LastName, FirstName
    FROM EmployeeTwo
    UNION
    SELECT LastName, FirstName
    FROM EmployeeThree
    ) ;
    GO
    http://technet.microsoft.com/zh-cn/library/ms187731.aspx

    标签: ,

    辽ICP备05003652号
    流风洄雪听天籁,轻云蔽日看落花

    Powered by Blogger