Wednesday, August 30, 2006

从带各种符号的字段中把中文分离出来的方法

前些天, 在工作中遇到要从管道的名称中的解析出管道所在的路进行统计的问题. 系统中, 管道的名称基本都以"XX路-XX路"输入, "XX路"就是管道所在的道路名. 麻烦的是根据管道的结点, 名称里还加入了"XX路1-XX路1"或"XX路001#-XX路001#"之类的无关符号. 如果都要一个个进行解析, 那只能疯掉, 还好Oracle提供了一个批量的函数TRANSLATE. 这个函数就是把一个字符串中某些指定的字符用另一些字符来代替, 于是, 只要写成 TRANSLATE(管道名称, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#_''"+-', ' ') 就能把名称中基本含有的无关的字符全变成了空格了, 而且如果字符是连续的, 那也会合成为一个空格, 真是美妙啊. 下面是TRANSLATE函数的英文原帮助:

TRANSLATE
Syntax
TRANSLATE(char, from, to)

Purpose
Returns char with all occurrences of each character in from replaced by its corresponding character in to. Characters in char that are not in from are not replaced. The argument from can contain more characters than to. In this case, the extra characters at the end of from have no corresponding characters in to. If these extra characters appear in char, they are removed from the return value. You cannot use an empty string for to to remove all characters in from from the return value. Oracle interprets the empty string as null, and if this function has a null argument, it returns null.


Example 1
The following statement translates a license number. All letters 'ABC...Z' are translated to 'X' and all digits '012 . . . 9' are translated to '9':



SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') "License"
FROM DUAL;

License
--------
9XXX999

Example 2
The following statement returns a license number with the characters removed and the digits remaining:



SELECT TRANSLATE('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789')
"Translate example"
FROM DUAL;

Translate example
-----------------
2229

关于delphi7编译慢与linking阶段会出错的问题

用delphi7对大的程序进行编译与链接时, 比如一百三十万行左右的程序时, 编译的过程很慢, 而且在最后的链接阶段会出各种地址啦, dcc啦什么的错误. 这件事情其实主要是由于delphi7自带的bolndmm的内在管理很慢, 而rlink32又没有优化的原因.

经实践证明, delphi2006实在是一个很好的工具, 它对大程序的支持很好, borlndmm.dll与rlink32.dll明显经过了优化, 最绝的是, borland居然也没有改变它们的接口, 所以我们就可以直接把delphi2006下的bolndmm.dll与rlink32.dll拷贝至delphi7下的bin目录中, 换了原来的这两个文件, 就可以得到快速的无错的编译与链接了.

Monday, August 28, 2006

莫尔斯电码表

字符 电码符号 字符 电码符号 字符 电码符号
A · ━ Q ━ ━ · ━ 1 · ━ ━ ━ ━
B ━ · · · R · ━ · 2 · · ━ ━ ━
C ━ · ━ · S ··· 3 · · · ━ ━
D ━ · · T ━ 4 · · · ·
E · U · · ━ 5 · · · · ·
F · · ━ · V · · · ━ 6 ━ · · · ·
G ━ ━ · W · ━ ━ 7 ━ ━ · · ·
H

· · · ·

X ━ · · ━ 8 ━ ━ ━ · ·
I · · Y ━ · ━ ━ 9 ━ ━ ━ ━ ·
J · ━ ━ ━ Z ━ ━ · · 0 ━ ━ ━ ━ ━
K ━ · ━ ? · · ━ ━ · ·    
L · ━ · · / ━ · · ━ ·    
M ━ ━ () ━ · ━ ━ · ━    
N ━ · ━ ━ · · · ━    
O ━ ━ ━ · · ━ · ━ · ━    
P · ━ ━ ·      

元素周期表

元素周期表    

Group 1 2
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
周期
1 1
H
氢

2
He
氦
2 3
Li
锂
4
Be
铍

5
B
硼
6
C
碳
7
N
氮
8
O
氧
9
F
氟
10
Ne
氖
3 11
Na
钠
12
Mg
镁

13
Al
铝
14
Si
硅
15
P
磷
16
S
硫
17
Cl
氯
18
Ar
氩
4 19
K
钾
20
Ca
钙

21
Sc
钪
22
Ti
钛
23
V
钒
24
Cr
铬
25
Mn
锰
26
Fe
铁
27
Co
钴
28
Ni
镍
29
Cu
铜
30
Zn
锌
31
Ga
镓
32
Ge
锗
33
As
砷
34
Se
硒
35
Br
溴
36
Kr
氪
5 37
Rb
铷
38
Sr
锶

39
Y
钇
40
Zr
锆
41
Nb
铌
42
Mo
钼
43
Tc
锝
44
Ru
钌
45
Rh
铑
46
Pd
钯
47
Ag
银
48
Cd
镉
49
In
铟
50
Sn
锡
51
Sb
锑
52
Te
碲
53
I
碘
54
Xe
氙
6 55
Cs
铯
56
Ba
钡
56-70
镧系
*
71
Lu
镥
72
Hf
铪
73
Ta
钽
74
W
钨
75
Re
铼
76
Os
锇
77
Ir
铱
78
Pt
铂
79
Au
金
80
Hg
汞
81
Tl
铊
82
Pb
铅
83
Bi
铋
84
Po
钋
85
At
砹
86
Rn
氡
7 87
Fr
钫
88
Ra
镭
89-102
锕系
**
103
Lr
铹*
104
Rf
105
Db
106
Sg
107
Bh
108
Hs
109
Mt
110
Uun
111
Uuu
112
Uub
113
Uut
114
Uuq
115
Uup
116
Uuh
117
Uus
118
Uuo

 

镧系 57La
镧
58Ce
铈
59Pr镨 60Nd
钕
61Pm钷 62Sm钐 63Eu铕 64Gd钆 65Tb铽 66Dy镝 67Ho钬 68Er铒 69Tm铥 70Yb镱
锕系 89Ac锕 90Th钍 91Pa镤 92U铀 93Np镎 94Pu钚 95Am镅* 96Cm锔* 97Bk锫* 98Cf锎* 99Es锿* 100Fm镄* 101Md钔* 102No锘*

 

Sunday, August 27, 2006

ASCII码表

       Decimal   Octal   Hex    Binary     Value

------- ----- --- ------ -----

000 000 000 00000000 NUL (Null char.)

001 001 001 00000001 SOH (Start of Header)

002 002 002 00000010 STX (Start of Text)

003 003 003 00000011 ETX (End of Text)

004 004 004 00000100 EOT (End of Transmission)

005 005 005 00000101 ENQ (Enquiry)

006 006 006 00000110 ACK (Acknowledgment)

007 007 007 00000111 BEL (Bell)

008 010 008 00001000 BS (Backspace)

009 011 009 00001001 HT (Horizontal Tab)

010 012 00A 00001010 LF (Line Feed)

011 013 00B 00001011 VT (Vertical Tab)

012 014 00C 00001100 FF (Form Feed)

013 015 00D 00001101 CR (Carriage Return)

014 016 00E 00001110 SO (Shift Out)

015 017 00F 00001111 SI (Shift In)

016 020 010 00010000 DLE (Data Link Escape)

017 021 011 00010001 DC1 (XON) (Device Control 1)

018 022 012 00010010 DC2 (Device Control 2)

019 023 013 00010011 DC3 (XOFF)(Device Control 3)

020 024 014 00010100 DC4 (Device Control 4)

021 025 015 00010101 NAK (Negative Acknowledgement)

022 026 016 00010110 SYN (Synchronous Idle)

023 027 017 00010111 ETB (End of Trans. Block)

024 030 018 00011000 CAN (Cancel)

025 031 019 00011001 EM (End of Medium)

026 032 01A 00011010 SUB (Substitute)

027 033 01B 00011011 ESC (Escape)

028 034 01C 00011100 FS (File Separator)

029 035 01D 00011101 GS (Group Separator)

030 036 01E 00011110 RS (Request to Send)(Record Separator)

031 037 01F 00011111 US (Unit Separator)

032 040 020 00100000 SP (Space)

033 041 021 00100001 ! (exclamation mark)

034 042 022 00100010 " (double quote)

035 043 023 00100011 # (number sign)

036 044 024 00100100 $ (dollar sign)

037 045 025 00100101 % (percent)

038 046 026 00100110 & (ampersand)

039 047 027 00100111 ' (single quote)

040 050 028 00101000 ( (left/opening parenthesis)

041 051 029 00101001 ) (right/closing parenthesis)

042 052 02A 00101010 * (asterisk)

043 053 02B 00101011 + (plus)

044 054 02C 00101100 , (comma)

045 055 02D 00101101 - (minus or dash)

046 056 02E 00101110 . (dot)

047 057 02F 00101111 / (forward slash)

048 060 030 00110000 0

049 061 031 00110001 1

050 062 032 00110010 2

051 063 033 00110011 3

052 064 034 00110100 4

053 065 035 00110101 5

054 066 036 00110110 6

055 067 037 00110111 7

056 070 038 00111000 8

057 071 039 00111001 9

058 072 03A 00111010 : (colon)

059 073 03B 00111011 ; (semi-colon)

060 074 03C 00111100 < (less than)

061 075 03D 00111101 = (equal sign)

062 076 03E 00111110 > (greater than)

063 077 03F 00111111 ? (question mark)

064 100 040 01000000 @ (AT symbol)

065 101 041 01000001 A

066 102 042 01000010 B

067 103 043 01000011 C

068 104 044 01000100 D

069 105 045 01000101 E

070 106 046 01000110 F

071 107 047 01000111 G

072 110 048 01001000 H

073 111 049 01001001 I

074 112 04A 01001010 J

075 113 04B 01001011 K

076 114 04C 01001100 L

077 115 04D 01001101 M

078 116 04E 01001110 N

079 117 04F 01001111 O

080 120 050 01010000 P

081 121 051 01010001 Q

082 122 052 01010010 R

083 123 053 01010011 S

084 124 054 01010100 T

085 125 055 01010101 U

086 126 056 01010110 V

087 127 057 01010111 W

088 130 058 01011000 X

089 131 059 01011001 Y

090 132 05A 01011010 Z

091 133 05B 01011011 [ (left/opening bracket)

092 134 05C 01011100 \ (back slash)

093 135 05D 01011101 ] (right/closing bracket)

094 136 05E 01011110 ^ (caret/cirumflex)

095 137 05F 01011111 _ (underscore)

096 140 060 01100000 `

097 141 061 01100001 a

098 142 062 01100010 b

099 143 063 01100011 c

100 144 064 01100100 d

101 145 065 01100101 e

102 146 066 01100110 f

103 147 067 01100111 g

104 150 068 01101000 h

105 151 069 01101001 i

106 152 06A 01101010 j

107 153 06B 01101011 k

108 154 06C 01101100 l

109 155 06D 01101101 m

110 156 06E 01101110 n

111 157 06F 01101111 o

112 160 070 01110000 p

113 161 071 01110001 q

114 162 072 01110010 r

115 163 073 01110011 s

116 164 074 01110100 t

117 165 075 01110101 u

118 166 076 01110110 v

119 167 077 01110111 w

120 170 078 01111000 x

121 171 079 01111001 y

122 172 07A 01111010 z

123 173 07B 01111011 { (left/opening brace)

124 174 07C 01111100 | (vertical bar)

125 175 07D 01111101 } (right/closing brace)

126 176 07E 01111110 ~ (tilde)

127 177 07F 01111111 DEL (delete)

前32个控制字符的详细解释:

NUL (null)

SOH (start of heading)

STX (start of text)

ETX (end of text)

EOT (end of transmission) - Not the same as ETB

ENQ (enquiry)

ACK (acknowledge)

BEL (bell) - Caused teletype machines to ring a bell. Causes a beep

in many common terminals and terminal emulation programs.

BS (backspace) - Moves the cursor (or print head) move backwards (left)

one space.

TAB (horizontal tab) - Moves the cursor (or print head) right to the next

tab stop. The spacing of tab stops is dependent

on the output device, but is often either 8 or 10.

LF (NL line feed, new line) - Moves the cursor (or print head) to a new

line. On Unix systems, moves to a new line

AND all the way to the left.

VT (vertical tab)

FF (form feed) - Advances paper to the top of the next page (if the

output device is a printer).

CR (carriage return) - Moves the cursor all the way to the left, but does

not advance to the next line.

SO (shift out) - Switches output device to alternate character set.

SI (shift in) - Switches output device back to default character set.

DLE (data link escape)

DC1 (device control 1)

DC2 (device control 2)

DC3 (device control 3)

DC4 (device control 4)

NAK (negative acknowledge)

SYN (synchronous idle)

ETB (end of transmission block) - Not the same as EOT

CAN (cancel)

EM (end of medium)

SUB (substitute)

ESC (escape)

FS (file separator)

GS (group separator)

RS (record separator)

US (unit separator)
转自http://blogger.org.cn/blog/more.asp?name=pengzuyun&id=8352

Tuesday, August 22, 2006

Delphi7中接口使用的注意事项与原因

Delphi为了与COM结合, 在PASCAL中加入了原来没有的接口元素, 变相的也扩展了对OO的支持.但也正因为只是为了与COM结合, Delphi中的接口实现实际上是不完整的. 因为没有垃圾收集功能, 在接口的实现中加入了COM的引用记数功能, 而这个功能的引入可以说是所有使用接口的麻烦的开始. 而看上去很优雅的很方便的自动进行引用记数加减的编译器代码又加重了这个麻烦, 让习惯于object打交道的Delphi使用者感觉到接口的使用是个大麻烦.
麻烦的开始:
第一步 引用记数: 引用记数是在COM中应用很广的技术, 它用很简单的方法实在了一个方便的垃圾收集机制. 这个在接口为王的COM世界中, 一切都很OK. 但与Delphi的结合就不那么美好了, 原因看第二步.

第二步 自动的进行引用记数加减: 因为引用记数要求使用者在引用这个接口时, 要对引用记数加1, 而在释放这个接口时对引用记数减1, 这是一个很麻烦与繁琐的事情, 一个不小心, 就可能忘记了这事, 那么引用记数所对应的机制就会无效, 于是我们家可爱的Borland就在Delphi的编译器中自动的加入了这件事. 当这个接口的变量被付值时, 对应接口的引用记数就会自动加1, 变量被定为nil或超出范围时又会自动的减1, 完全的不用各位去操心这事, 多么的方便啊. 可这是真的方便吗?

Delphi很大的好处在于它对低层进行了深厚而且漂亮的封装, 但在接口这个问题上, 很明显没有处理好. 这体现在

根源: 自动的引用记数只对接口的引用进行了处理, 而没有对对象的引用进行处理. 于是, 当你写了一个有接口的类, 并且让它从TInterfacedObject这个实现了引用记数为0时就自杀的基类上继承时, 你的麻烦就开始了. 因为你一旦建立了这个类的对象, 然后从中得到了它的接口, 自动的引用记数就开始起了作用, 你再也不能使用原来的对象了, 你只能使用对象的接口, 要不然你的接口变量定为nil或超出作用范围. 你的可爱的对象就消失了, 你原来的对象引用就无效了.

帮凶: 一切都源自根源, 由于接口与对象的不一致处理, 那些TObjectList啦, TStrings啦这些常用的集合都不能用了, 因为你在其中保存的对象, 可能已经在其它地方被自动的释放了. 于是你不得不使用TInterfaceList, 然后再用一些小技巧来进行比如TStringHash之类的集合的功能, 要不然就要自己写代码重新作一个接口的版本出来了.

以上是在Delphi中使用接口要注意的事项, 其实说来只有一点, 用了接口就要一直用, 不能再回到原来的对象那上了, 唉, 上了贼船下来就难了. 不过接口后面所体现的OO精神与设计模式, 还是很方便的, 很多地方都说过了, 这儿就不说了.

Friday, August 18, 2006

在ORACLE 8I, 9I上建立全文搜索的方法汇总

好吧,我承认这都是从GOOGLE上搜索来的, 为了建立一个全文搜索,搞了我一整天.现在把在我建立全文搜索中搜索到的有用的信息汇总一下,省得到时又要去找.

第 一步: 全文搜索功能需要oracle intermedia的支持, 如果没有安装, 请使用universal install安装一下, 如果是8i则可以使用$ORACLE_HOME/bin/dbassist来进行安装. 9i上没有这个(我是初学者, 反正是没有找到)请使用universal install, 把intermedia部分与j server部分都安装上.

第二步: 看很多网页上说第一步安装后就可以了, 但其实不然. 我的机子上的oracle就是安全安装, 但没发现全文搜索的部分. 这种情况下, 其实oracle已经把全文搜索功能所要的文件拷贝至你机子上了, 但是你要手动的安装. 这步完全是从http://www.eygle.com/archives/2005/06/ecieoeoracleeia.html这里学习来的, 谢谢啦. 我这个总结一下, 其实就是

$ sqlplus "/ as sysdba"
SQL> connect sys/password as sysdba
SQL> rem 这步建立全文搜索的用户, 用户名都是CTXSYS, 密码,表空间与临时表空间要根据实际情况来设置
SQL> start ?/ctx/admin/dr0csys password tablesapce tempspace
SQL> connect ctxsys/password
SQL> rem 这步进行了全文搜索的安装, 包括必要的存储过程与API, 另在我安装的过程中,
SQL> rem 这步在后面的阶段有可能会报错, 但不影响使用
SQL> start ?/ctx/admin/dr0inst ?/ctx/lib/libctxx9.so
SQL> rem 这步进行一些全文搜索方面的系统缺省设置
SQL> start ?/ctx/admin/defaults/drdefus.sql;


第三步: 设置extproc 在 $ORACLE_HOME/network/admin/listner.ora的LISTENER的
description list上添加
(DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
在SID_LIST_LISTENER的SID_LIST上添加
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/8.1.6)
其实这一步如果你在安装oracle时就已经安装了intermedia的话,listner.ora文件很可能就已经有这两个信息了,
我的机子上就是这种情况.

第四步: 设置$ORACLE_HOME/network/admin/tnsnames.ora, 在其中添加
EXTPROC_CONNECTION_DATA,EXTPROC_CONNECTION_DATA.WORLD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(CONNECT_DATA =
(SID = PLSExtProc)
)
)
请注意KEY值与SID值要与listner.ora对应才行

第五步: 在http://support.iap.ac.cn/portal/viewarticle.php?id=370中说要:
重新启动listener (先用lsnrctl stop, 然后 lsnrctl start), 然后,使用tnsping 来测试一下是否配置正确:
tnsping extproc_connection_data 或者
tnsping extproc_connection_data.world,如果配置正确,会显示:
Attempting to contact (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)) OK(140毫秒)
不过我试过了,我机子上只要作这步就会死机,不知道为什么,其实上面几步都完成了,这步也只要作重新启动
listener部分就可以了.

第六步: 设置语法分析器, 一般来说设置成 chinese_lexer, 但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,
就使用chinese_vgram_lexer吧.
SQL> connect ctxsys/password
SQL> begin ctx_ddl.create_preference('自定的lexer的名字', 'chinese_lexer'); end;
SQL> /
这步可以建立很多个你想用的lexer, 只要名字不一样就行了.

第七步: 好了,已经过上面几步. 现在可以对某个字段建立索引了
SQL> connect yourname/password
SQL> create index index_name on your_table(some_column) indextype is ctxsys.context
parameters('lexer ctxsys.自定的lexer的名字');
SQL> /
那'ctxsys.自定的lexer的名字'的ctxsys名字空间一定要加上, 要不然会报找不到对应的lexer.而且
ctxsys.context是一般使用的索引方式, oracle还有其实方式, 请参考一下oracle的帮助吧.

第八步: 我有说过context型的索引不能同步吗?好吧, context型的不能自动同步, 就是说在你修改内容后无法
自动进行更新索引内容, 所以我们要建立两个job来作这个事:
-- 同步
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''myindex'');', SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;

-- 优化
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',SYSDATE, 'SYSDATE + 1');
commit;
END;
其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,
第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定


OK, 现在全文搜索建立完了. 要模糊查询, 请用select * from tablename where contains(field, '%要查找的内容%') > 0

参考网址:
www.google.com
http://support.iap.ac.cn/portal/viewarticle.php?id=370
http://www.eygle.com/archives/2005/06/ecieoeoracleeia.html