2005年01月24日

>      >           在德国法兰克福发行的一份报纸(FrankfurtAllegemeine)上,
>  >           刊登了一篇真实事件,汽车小偷跟失窃车主之间有趣的通信。
>  >           我们可以发觉,在德国拥有汽车的成本主要不在于车辆本身,
>   >           而是使用时所需的维修、税金及保险费。
>  >
>  >           可敬的Brauen先生∶
>  >           您一定已经发觉,您那辆停在Goethe街的蓝色小轿车被人偷走了!
>  >           我就是那个偷车的人,为了表示对失主的情谊,
>  >           我想向您提出一个友好的建议∶
>  >           我在您的车里发现一个装有许多信件和卷夹的皮包。
>  >           这些对我而言是毫无意义,但是对于您呢,我看是相当重要的。
>  >           如果您肯将您这部汽车的各种证件交给我,
>  >           我也将会把这些东西放在Goethe街4号的住宅后面给您。
>  >           您要给我的东西也可以放在那个地方。
>  >           致上亲切的问候
>  >           您的汽车小偷于03/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的小偷先生∶
>  >           我接受您的建议,因为我确实迫切需要那些资料。至于我的(亦即是
>您的)
>  >           那辆蓝色四人小轿车的各种必须证件包含保养数据卡,都将在今晚24
>点
>  >           之后放在您所指定的Goethe街4号住宅后面。
>  >           顺致崇高的敬意
>  >           MarkusBrauen 于05/04/2001法兰克福
>  >
>  ——————————————————————–
>  >
>  >           两天后  车子已过户………..
>  >
>  >           可敬的Brauen先生∶
>  >           本周我得支付高达246马克97芬尼的下一期汽车税,是吗?
>  >           致上亲切的问候
>  >           您的汽车小偷于07/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的小偷先生∶
>  >           我不得不十分抱歉地通知您,下一期的汽车税您一定得在本周内到税
>务所
>  >           缴纳,拖延只会使罚款加重。
>  >           顺致崇高的敬意
>  >           MarkusBrauen 于09/04/2001法兰克福
>  >           附记∶顺便再提醒您,不要忘记到Niekulistars保险公司去缴纳汽车
>保险
>  >           费。
>  >
>  ———————————————————————
>  >
>  >           可敬的Brauen先生∶
>  >           对不起,我又要写信打扰您了,不过这辆小汽车竟然每公里消耗
>12-14升的
>  >           无铅汽油,另外左边后轮也漏气了!
>  >           顺致崇高的敬意
>  >           您的汽车小偷于10/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的小偷先生∶
>  >           上封信中我忘记告诉您,我的(亦即是您的)那辆蓝色四人小轿车
>  >           极需要更换新轮胎,至于耗油量确实是您所提的那么多,
>  >           您想必已经知道那部汽车其实远比她的外观老旧许多,
>  >           她也许常常会使您的工作半途而废。
>  >           为了您的利益起见,我想劝您尽快安装新的汽阀。
>  >           致上亲切的问候
>  >           MarkusBrauen 于12/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的Brauen先生∶
>  >           税务所寄通知给我,要我在十天之内缴交698马克57芬尼的汽车税连
>  >           带罚款。
>  >           此外,坐垫都坏了,右转方向灯也无法正常运作。
>  >           另外,您可以介绍我一间比较便宜的车库吗?
>  >           当然要有暖气配备的,因为现在也已经不容易发动引擎了。
>  >           我目前的车库一个月要支付50马克呀!
>  >           顺致崇高的敬意
>  >           您的汽车小偷于18/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的小偷先生∶
>  >           我想您除了确实缴纳汽车税之外,别无他法。
>  >           昨晚我想起一件事,那就是煞车帮浦也都失效了,
>  >           或许您也已经发觉了,不过还是建议您检查一下。
>  >           此外,您必须在天气不好的时候(现在天气就不太好),
>  >           把车蓬修理一下。至于车库,我恐怕提不出什么好建议,
>  >           因为我总是把车停在外面的。
>  >           致上亲切的问候
>  >           MarkusBrauen 于23/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的Brauen先生∶
>  >           自从偷了您的汽车之后,我吃尽了苦头。更不幸的是,昨天差速器也
>坏
>  >           了。
>  >           我是个诚实的小偷,您叫我怎么能承担得起这些费用呢?我想请求您
>把
>  >           这辆汽车收回,我愿意支付一笔赔偿费好了。但愿您同意我的这个建
>议。
>   >           顺致崇高的敬意
>  >           您的汽车小偷于25/04/2001法兰克福
>  >
>  ———————————————————————
>  >
>  >           可敬的小偷先生∶
>  >           十分遗憾,我们之间的友好通信因为您的残酷决定而结束了。
>  >           由于您偷走了我的(亦即是您的)汽车,
>  >           才使我真正了解到上帝为什么要给我两条腿。
>  >           我又开始漫长的徒步旅行,而我多余的脂肪已经减少了好几公斤,
>  >           我的心脏也开始恢复正常,我完全忘记我的心血管疾病,
>  >           我刚刚做完的健康报告也比起以前进步许多。
>  >           另外,我的经济状况亦大大好转。把汽车收回来!?
>  >           我想也没想过!我坚决拒绝您的提议,即使您向我提出控告也可以。
>
>  >           再者,我是从来不要任何偷来的东西的。
>  >           致上亲切的问候
>  >           MarkusBrauen 于28/04/2001法兰克福


                                

2005年01月21日

<第一个笑话>
> >
> >   有一个老头,正在草地上放羊,忽然走来一个年轻人,年经人走到老头面前说:

> > 老先生,我可以为您服务,我将告诉您您的这群羊有几头,作为酬劳您需要给我一头
> > 羊。
>
>
> >   老头还未作答,年青人就开始了工作,年轻人用笔记本电脑无线上网,链接上
> > NASA的内

> > 部网,调动低轨道卫星,把卫星遥感成像的图片再通过软件分析,数十分钟后,年轻
> >
人再次走到老头面前:老先生,您的羊群共有763头。说完后他抱起一只羊就要走。
> >
> >
  老头这时叫住了年青人:年青人,如果我能猜出你就职的公司,你可不可以把酬
> > 劳还给我?
> >
>
>   可以,年轻人答。
> >
> >   你是麦肯锡公司的,老头说。
> >

> >   年轻人很惊讶,您怎么知道?
> >
> >
  老头笑了:因为你具有该公司咨询人员的所有特点啊,第一.你不请自来。第二.
> >
你告诉我的分析结果是我本就知道的。第三.你抱走的不是羊,而是我的牧羊犬。
> >
> >



<第二个笑话>
> >
> >
  上周末,我去一间熟悉的西餐厅吃晚饭,发现餐厅内部刚装修过,餐厅服务生的
> > 装束也有所改变。
> >

> >   我发现服务生们上衣夹克的口袋里都多放了一把勺子。于是我叫来相熟的亨利,
> > 向他打听最近的变化。

> >
> >   亨利告诉我,餐厅老板最近请了埃森哲公司作业务流程重组的咨询,以改进餐厅
> >
的工作效率和服务质量。
> >
> >   埃森哲的咨询顾问经过两个礼拜的现场工作,发现33.333%的餐桌在就餐过程中

> > 都会发生一次勺子掉在地上的情况。而以往服务生需要单跑去厨房一次给客人换干净
> >
勺子。如果在服务生的夹克口袋里放一把备用勺,则他们不必单独跑一次厨房,可以
> >
在下次上菜时顺路换掉勺子,这样可以将服务生的劳动生产率提高17.365%。
> >
> >
  正说着,我旁边的桌子响起叮当一声:他们的勺子掉地上了。只见亨利从容地从
> > 口袋里拿出备用勺,及时给客人换上。
>
>
> >   看到这个场景,我对埃森哲公司的咨询建议相当佩服。
> >
> >
  这时,我又留意到所有服务生西裤的拉链外有一根很细的绳子,其质地和隐性胸
> > 罩带一样,所以较难发现。
> >

> >   于是,我又向亨利提出这个新问题:“你们这根细绳儿是干嘛用的?”亨利环顾了
> >
一下,将身子倾斜过来,小声说道:“好眼力!不是每个人都象您这样观察入的!”
> >
> >
  亨利接着说:“埃森哲公司通过对餐厅工作流程的现场观察和数据分析,发现服
> >
务生每班次平均要小便5.125次,而每次小便完平均要花1.306分钟洗手和烘干手。埃
> >
森哲的顾问建议我们在那儿上面系上这根绳子,以后每次小便直接把自己那活儿拉出
> >
来,可以避免手接触到,这样就可以省去洗手和烘干的麻烦,既提高服务生的劳动生
> > 产率,又节约餐厅的水费和电费...”
>
>
> >   听完亨利的介绍,我对埃森哲公司更敬佩了。
> >
> >
  不过,我还有一点小小的疑问:“亨利啊,你们可以用绳子把自己那活儿拉出
> > 来,但是
> >
怎么能不用手把它给放回去呢?”
> >
> >
  亨利又一次谨慎地环顾左右,将身子倾得更低,用更小的声音对我说:“我不知
> > 道其他
> >
人是怎么解决的,但我是用的那把勺子...”





The previous article introduced the basic concept about Oracle Text. Now, let’s turn to the real world and show you an example. This example will let you search on multi-column of a table base on multi-language. In order to search on multi column, we  should use MULTI_COLUMN_DATASTORE, and in order to search multi language, we should use MULTI_LEXER which is a slot for special language lexer. Through this example, you will get a clear understanding about Oracle Text.

First, we will extend the simple in the previous article to have more column, and  insert some demo data into it:

DROP TABLE SEARCH_TEST CASCADE CONSTRAINTS ;

CREATE TABLE SEARCH_TEST (
  ID              VARCHAR2 (30)  NOT NULL,
  TITLE                  VARCHAR2 (80),
  LONG_DESCRIPTION       VARCHAR2 (1000),
  SHORT_DESCRIPTION      VARCHAR2 (100),
  KEY_WORDS              VARCHAR2 (425),
  LANG                VARCHAR2 (3),
  DUMMY_COLUMN1         VARCHAR2 (5),
  DUMMY_COLUMN2         VARCHAR2 (5),
  DUMMY_COLUMN3         VARCHAR2 (5),
  PRIMARY KEY ( ID )  );


insert into SEARCH_TEST (ID,TITLE,LONG_DESCRIPTION,SHORT_DESCRIPTION,KEY_WORDS,LANG) values(1,’tsunami hit the eaten asia’,'DEC. 26 2004, the tsunami hit the easten asia and cause great damage.’,'tsunami hit the eaten asia’,'tsunami’,'eng’);
insert into SEARCH_TEST (ID,TITLE,LONG_DESCRIPTION,SHORT_DESCRIPTION,KEY_WORDS,LANG) values(2,’海啸袭击东南亚’,'2004年十二月二十六号,海啸袭击东南亚,造成巨大破坏’,'海啸袭击东南亚’,'海啸’, ‘chi’);


Now, maybe you will confuse about the usage of column LANG, DUMMY_COLUMNX. Do not worry, when you reading on ,you will know.

Then, we will create some preference , which will be used to create the index.

In order to search on multicolumn, which also mean create index on multi column ,we should use MULTI_COLUMN_DATASTORE. In Oracle Text, the columns the index created on can be different with the content of index come from. The real content of Index is control by DATASTORE object. In our example, we will create a  MULTI_COLUMN_DATASTORE preference which will read the content from column TITLE, SHORT_DESCRIPTION, LONG_DESCRIPTION and KEY_WORDS. While creating index, we can create index on any column ,here we will create on a dummy column.

To search multi language content in these column, we should use MULTI_LEXER . MULTI_LEXER is a slot for special language lexer. You should create one language specific lexer for every language , then plug them into MULTI_LEXER. While indexing, the MULTI_LEXER will use the right lexer according to the lang in the language column , which should be specified while creating index.

Oracle Text use functions in package “CTX_DDL” to create preference, following is the PL/SQL of creating preference:

begin
    ctx_ddl.drop_preference(‘my_global_lexer’);
    ctx_ddl.drop_preference(‘my_english_lexer’);
    ctx_ddl.drop_preference(‘my_chinese_lexer’);
    ctx_ddl.create_preference(‘my_english_lexer’, ‘basic_lexer’);
    ctx_ddl.set_attribute(‘my_english_lexer’, ‘index_themes’, ‘yes’);
    ctx_ddl.set_attribute(‘my_english_lexer’,'theme_language’, ‘english’);    
    ctx_ddl.create_preference(‘my_chinese_lexer’, ‘chinese_vgram_lexer’);
    ctx_ddl.create_preference(‘my_global_lexer’, ‘multi_lexer’);
    ctx_ddl.add_sub_lexer(‘my_global_lexer’, ‘default’, ‘my_english_lexer’);
    ctx_ddl.add_sub_lexer(‘my_global_lexer’, ’simplified chinese’, ‘my_chinese_lexer’, ‘chi’);

     ctx_ddl.drop_preference(‘my_multi_datastore’);
    ctx_ddl.create_preference(‘my_multi_datastore’, ‘MULTI_COLUMN_DATASTORE’);
    ctx_ddl.set_attribute(‘my_multi_datastore’, ‘columns’, ‘TITLE,SHORT_DESCRIPTION,LONG_DESCRIPTION,KEY_WORDS’);
    
    commit;
end;

Next, we will use the preferences we created before to create the index:

create index my_multilanguageIndex on SEARCH_TEST(DUMMY_COLUMN1)
    indextype is ctxsys.context
    parameters (‘DATASTORE my_multi_datastore
        FILTER CTXSYS.NULL_FILTER
        LEXER my_global_lexer language column LANGUAGE_ID’);



OK, now we can use Query Operation in SQL to search content.

SQL> select id, score(1) score from citisg_user.CITI_LITESEARCH_TEST where CONTAINS (dummy_column1, ‘tsunami’,1) > 0 ;
id     score
—-   ——
1       14

SQL> select id, score(1) score from citisg_user.CITI_LITESEARCH_TEST where CONTAINS (dummy_column2, ‘海啸’,1) > 0 ;
id     scroe
—- ——–
2       12



Tips:

you should make sure the charset of content is same as the charset of oracle. Otherwise  you should use charset_filter to filter them.





2005年01月20日


Understanding Oracle Text:

Oracle Text use index to support searching. There are three different index types: Context, Catalog and Ctxxpath. They are used all for document indexing, but each has a different functionality.

Context index is a “domain” index used for fast retrieval of unstructured text. DML processing on a Context index is deferred. The actual index updates do not take place until an index SYNC is performed.

Catalog (CTXCAT) index is an online, “catalog” index, efficient for searching between small, simple text fields and with queries using some structured criteria, (usually numbers or dates). This index type supports only a basic functionality provided in a Context index. A Catalog index has all the characteristics of the normal database index.

Ctxxpath index is a special index installed during an Oracle Text install. This index uses Oracle Text code and can be created only on sys.xmltype columns. It is used to speed up certain queries using the existsnode method.

An Oracle text index can be created on the following column types: CHAR, VARCHAR, VARCHAR2, LONG, LONG RAW, BLOB, CLOB or BFILE.

Text index will store words and the documents in which these words occur. Oracle Text create an Index through following process:

 

The indexing process is managed in several stages called “classes”. Defined classes on the Oracle 8.1.7.2 database are:

SQL> select * from ctx_classes;
 
CLA_NAME                       CLA_DESCRIPTION
—————————— —————————–DATASTORE    Data store Class
FILTER                          Filter Class
SECTION_GROUP                   Section Group
LEXER                           Lexer Class
WORDLIST                        Word List Class
STOPLIST                        Stop List Class
STORAGE                         Storage Class
INDEX_SET                       Index Set

Datastore is a document data selector table from which the CTX engine reads column data and returns document data.

Filter takes the document data from the datastore class and filters it to readable text.

Sectioner takes a text format, as input, and generates two outputs (the section boundaries and plaintext).

Lexer gets plaintext from the sectioner and splits it into words (discrete tokens).

Every class has a defined list of objects, which are only templates.Instead of directly using objects, we are creating a “preference” from one of the object templates, which is further customized by setting “attributes”.

When we create the Oracle Text index, the indexing engine will read the defined preference for the index and invoke the attribute for each indexed document.

After creating Index, we can search the context using Oracle Text Query operators. Following is an example using CONTAINS operate to searching on CONTEXT index:

select id, score(1) score from citisg_user.CITI_LITESEARCH_TEST_STATIC where CONTAINS (doc_url, ‘tsunami’,1) > 0


Check Oracle Text installing:

Oracle Text is a part of Oracle installation. After installing, Oracle Text will create a role — CTXAPP, and an user — CTXSYS. All of the Oracle Text index information is kept in the database repository under user CTXSYS.  In order to manipulate Oracle Text, you should have the permission of CTXAPP, and some of operations even need you be CTXSYS user.

We can check for the existence of the objects under CTXSYS schema and the version of Oracle Text:

SQL> connect ctxsys/ctxsys
Connected.
SQL> select * from ctx_version;
 
VER_D
—–
8.1.7

SQL> select * from ctx_objects;
 
OBJ_CLASS           OBJ_NAME             OBJ_DESCRIPTION
—————   ——————- —————————————–
DATASTORE         DIRECT_DATASTORE      Documents are stored in the column
DATASTORE         DETAIL_DATASTORE      Documents are split into multiple lines
DATASTORE         FILE_DATASTORE        Documents are stored in files,column is file name
DATASTORE         URL_DATASTORE         Documents are web pages, column is URL
DATASTORE         USER_DATASTORE        Documents are stored in the column
DATASTORE         NESTED_DATASTORE      Documents are stored in a column in the nested table
DATASTORE     MULTI_COLUMN_DATASTORE    Documents are stored in multiple columns
FILTER            NULL_FILTER           Null filter
FILTER            USER_FILTER           User-defined filter
FILTER            CHARSET_FILTER        character set converting filter
FILTER            INSO_FILTER           filter for binary document formats
FILTER            PROCEDURE_FILTER      Procedure filter
SECTION_GROUP     NULL_SECTION_GROUP    null section group
SECTION_GROUP     BASIC_SECTION_GROUP   basic section group
SECTION_GROUP     HTML_SECTION_GROUP    html section group
SECTION_GROUP     XML_SECTION_GROUP     xml section group
SECTION_GROUP     NEWS_SECTION_GROUP    news section group
SECTION_GROUP     AUTO_SECTION_GROUP    auto section group
LEXER             BASIC_LEXER           Lexer for alphabetic languages
LEXER             JAPANESE_VGRAM_LEXER  V-gram lexer for Japanese
LEXER             KOREAN_LEXER          Dictionary-based lexer for Korean
LEXER             CHINESE_VGRAM_LEXER   V-GRAM lexer for Chinese
LEXER             CHINESE_LEXER         Chinese lexer
LEXER             MULTI_LEXER           Multi-language lexer
WORDLIST          BASIC_WORDLIST        basic wordlist
STOPLIST          BASIC_STOPLIST        basic stoplist
STOPLIST          MULTI_STOPLIST        multi-language stoplist
STORAGE           BASIC_STORAGE         text-index storage
INDEX_SET         BASIC_INDEX_SET       basic index set


An existence and the status of Text index is checked via user_indexes view:

SQL> select index_name name, index_type “TYPE 1″, ityp_owner “OWNER”,ityp_name “TYPE 2″, domidx_opstatus   status from user_indexes where ityp_name=”CONTEXT”

NAME          TYPE 1       OWNER        TYPE 2       STATUS
————  ———— ———— ———— ——–
KB_INDEX      DOMAIN       ARTIST       CONTEXT      VALID
WEB_TEXT      DOMAIN       WEB_ARTIST   CONTEXT      VALID
TEST_IDX      DOMAIN       CTXTEST      CONTEXT      INVALID
WEB_TEXT_GER  DOMAIN       WEB_ARTIST   CONTEXT      VALID

We have four Text indexes defined in the database. One of them is invalid.The following select will provide information about indexed columns and indexed documents:

SQL> select IDX_OWNER#,IDX_NAME,IDX_TABLE#,IDX_KEY_NAME, IDX_DOCID_COUNT from DR$INDEX;

IDX_OWNER# IDX_NAME              IDX_TABLE#  IDX_KEY_NAME             IDX_DOCID_COUNT
—————————————————————————————
       107 KB_INDEX            274239       ID,DOCU                   99014
       108 WEB_TEXT            276487       PRODUCT_DETAIL            99332
        81 TEST_IDX            191146       NR                        2
        97 WEB_TEXT_GER        238978       PRODUCT_DETAIL            97368

Listing content for the WEB_TEXT_GER index:

SQL> select token_text from ARTIST.DR$WEB_TEXT_GER$I;

TOKEN_TEXT
—————-
900782
387869
MANTEL
124
221
ANDEREN
EF
26.17
150005
AUFLOESUNGEN



Using Oracle Text:



Following is the standard steps to use Oracle Text searching engine :
1. Create the table that can support oracle text;
2. According to the source you will search on ,create the appropriate preference;
3. using preferences , create index on column you will searched  on;
4. use SQL searching the content;

following is a simple example :

First, we create a table whose column will be searched, and insert some data:

CREATE TABLE SEARCH_TEST (
  ID              VARCHAR2 (30)  NOT NULL,
  TITLE                  VARCHAR2 (80),
  DESCRIPTION       VARCHAR2 (1000),
  DUMMY_COLUMN1         VARCHAR2 (5),
  PRIMARY KEY ( ID )  );

insert into SEARCH_TEST (ID,TITLE,DESCRIPTION) values(1, ‘tsunami hit the eaten asia’,'DEC. 26 2004, the tsunami hit the easten asia and cause great damage.’);


Next, because it is a simple index, we will use predefined preference.

Then, create the index on the column “TITLE”:
  create index citisg_user.my_simpleindex on citisg_user.CITI_LITESEARCH_TEST(title)
    indextype is ctxsys.context
    parameters (‘DATASTORE CTXSYS.DEFAULT_DATASTORE
        FILTER CTXSYS.NULL_FILTER
        LEXER CTXSYS.DEFAULT_LEXER’);


Last, you can search the content in title column:

SQL> select id, score(1) score from citisg_user.CITI_LITESEARCH_TEST where CONTAINS (title, ‘tsunami’,1) > 0 ;

id         score
——–   ——-     
1             5












2005年01月11日

一天,在给一男客户办理完取款业务后,我交待说:请您把卡收好.再看,发现客户手包拉链没
拉好,又交待说:请您把拉链拉好.客户立即低头查看,周围同事笑成一片

我们行,一次一个客户不会用取款机,咨询员教他使用,咨询员把卡放到取款机里后,对客
户说,您在这输下密码~~哪知客户低下头,对着电脑屏幕轻声说了他的一卡通6位取款密
码,客户把“输密码”给听成了“说密码~~”,咨询员当场-
-|||||

刚刚开始学临柜开汇票时,有两客户各自拿了一张五拾万和三万的汇票同时来办理,结果三
万的先办好了,五拾万的客户有点急:为什么我的还没好?!我马上很认真地和他讲:对不
起,先生,因为你的金额比较大,比他的大多了,所以会比较慢一点哦!结果我话音未落,
整个营业厅的人都冲着我愣了半天,然后就是一片大笑中。。。。晕,我呢,早就找不到
了!呵呵,挖地洞去了啦!
还是这个哥们,作会计业务总是不平帐,耽误同事下班时间,一日同事基本搞定,但其美元
还未平,这哥们不慌不忙大唱“那有不平那有我,那有不平那有我………”

有一次,刚刚接完小女儿的电话,电话又响,前面都正常,不知怎么我突然说:“你要乖一
点哦。”电话那边沉默,周围同事笑倒一片。

刚开始免填凭条时,一客户来办理存款业务,当业务办完后,我用双手凭条递出,恭恭敬敬
的说:“请在下面的横杠上写下您的取款密码。”(应该是名字)

一日时逢中午饭点,一同事掂记着中午只有米饭,但想吃面条。客户来办理取款业务,临走
时,该同事十分体贴的说:“请拿好您的面条,欢迎下次再来。”(应该是请拿好您的现
金)

刚用上排队机时,一同事着急上厕所,但这时有一客户直接到了该同事的窗口,想要办理业
务。没办法。该同事只好让其在排队机上抽个号,于是说道:“请您在厕所里抽个号,等叫
号后再办理业务,谢谢。”

请您到填单台填写一下XXX单。被讲为请您到天文台填写一下……请您到吧台填写一下……

做久了储蓄,突然出来做大堂经理,在网上银行替客户购买基金时,指着小键盘,想让客户
输入密码,却字正腔圆的冒出一句:“请在这里签名。”汗!!!!

一个超搞笑,让我笑晕的笑话一客户在取款机取款,操作不当吞卡了,客户异常着急,立即
到窗口满脸通红地问:“同志,我的卡把机器吞了!怎么办?”窗口的哥们听后不仅没笑,
反而异常镇静地对客户说:“我说怎么今天早上清机的时候发现少了一台机器呢,原来是被
你的卡吞了!”全体同事暴笑

有一次,一个客户输密码输了n遍,最后终于对了,我同事是位大姐,就对客户说:”密码可不能
忘,忘了就麻烦了,今天晚上回家别看电视,把它背熟了.

俺科室有个MM爆出经典名句:“王先生,请问您贵姓?”,全科室的人都晕了~~

上次一同事mm打电话时,情急之下竟然说:”刚才是一位男先生接的电话.”大家皆笑倒.

有一次接手机,是我哥打来得,习惯性的说了句“您好,c行。”哥先是一愣,然后回了
句:你好,我是c行他哥。

原来在前台办业务时,请客户在金额边上补上”小写”;将单子收回时,发现客户并没有写上小
写金额,刚想追问,又发现她在签名处补加上了”小姐”两字…

我行传播很广的的一个笑话,
经办员:“您好,请问您办什么业务?”
客户:“哦,我存一个死期(整存整取)!”
经办员:“那请问您死多久?”
客户:“嗯,死一年!”

In Weblogic server6.1, we want to implement compression filter in order to increase the preformance. But, we encounter a big problem which may make the compression filter unfeasible.


This problem is the unmatched sequence of compression/decompression and encoding/decoding between appServer and browser side.


At browser side, regardless which kind of browser you use,  the browser will decompress the http body first if the head “content-encoding” is “gzip”. Then, the browser will read the decompressed content as charset set by head “content-type”.


At AppServer side, which is weblogic6.1 here,  our compression filter will compress the content first. Then, weblogic6.1 will encoding the compressed content to charset which our jsp claimed.


So, the flow is like following, which is unmatched:
             decoding    <– decompressing    <=======      encoding <– compressing


The result is that, if the charset is not default charset, i.e.ISO8859-1,  the compressed content will be encoded which will destroy the gzip format. For example,  the gzip content should begin with the magic code 31, 139, but, if jsp set the charset to UTF-8, two bytes
“31,139″ will be encoded to  three bytes “31, 194,139″. When the browser get the response , it found the first two byte is not the correct gzip magic code and show the blank page.



here is the fragment of servletresponseImpl class  picked from weblogic’s sourefile:

    public void setHeader(String s, String s1)
    {
        if(isCommitted())
            return;
        if(s1 == null)
            s1 = “”;
        if(s.equals(“Content-Type”))
        {
            int i = s1.toUpperCase().indexOf(“CHARSET”);
            if(i != -1)
            {
                String s2 = null;
                int j = s1.indexOf(‘;’, i);
                int k = s1.indexOf(‘=’, i);
                if(j == -1)
                {
                    if(k != -1 && k < s1.length())
                        s2 = s1.substring(k + 1).trim();
                } else
                if(k != -1 && k < j)
                    s2 = s1.substring(k + 1, j).trim();
                s2 = HttpParsing.StripHTTPFieldValue(s2);
                if(s2 != null && s2.length() != 0)
                    setEncoding(s2);
            } else
            {
                String s3 = outputStream.getOutput().getOutput().getEncoding();
                if(s3 != null && !BytesToString.is8BitCharset(s3))


=======see here ==========>  setEncoding(“ISO-8859-1″);


            }
        }
        if(s.equalsIgnoreCase(“Content-Length”))
            try
            {
                setContentLength(Integer.parseInt(s1.trim()));
                return;
            }
            catch(NumberFormatException numberformatexception) { }
        headers.setHeader(s, s1);
    }



I think what weblogic6.1 done is correct, because wls should make sure that the response is really encoded as declared in response header.  But, it should offer a place/point to let the hook program to compress the encoded content.


following is a thread on bea dev2dev:
                    http://forums.bea.com/bea/thread.jspa?threadID=200079650