The important thing in life is to have a great aim , and the determination

          常用鏈接

          統(tǒng)計

          IT技術(shù)鏈接

          保險相關(guān)

          友情鏈接

          基金知識

          生活相關(guān)

          最新評論

          #

          Spring+Hibernate+Acegi 的初次體驗

               摘要: 系統(tǒng),三種角色:教師,學(xué)生,管理員,我想讓他們的登陸都在一個界面下自動識別,而無需進(jìn)行身份選擇,登陸后,他們將分別到各自的admin.jsp,stu.jsp,teacher.jsp 在數(shù)據(jù)庫中的表結(jié)構(gòu)如下(很多屬性略): id--- user---password--type---about type是用來存儲用戶的類別,分別有a,t,s分別對應(yīng)三種角色 about對應(yīng)的是acegi里所需要的e...  閱讀全文

          posted @ 2007-03-13 17:19 鴻雁| 編輯 收藏

          ETL學(xué)習(xí)心得:探求數(shù)據(jù)倉庫關(guān)鍵環(huán)節(jié)ETL的本質(zhì)

          做數(shù)據(jù)倉庫系統(tǒng),ETL是關(guān)鍵的一環(huán)。說大了,ETL是數(shù)據(jù)整合解決方案,說小了,就是倒數(shù)據(jù)的工具。回憶一下工作這么些年來,處理數(shù)據(jù)遷移、轉(zhuǎn)換的工作倒還真的不少。但是那些工作基本上是一次性工作或者很小數(shù)據(jù)量,使用access、DTS或是自己編個小程序搞定??墒窃跀?shù)據(jù)倉庫系統(tǒng)中,ETL上升到了一定的理論高度,和原來小打小鬧的工具使用不同了。究竟什么不同,從名字上就可以看到,人家已經(jīng)將倒數(shù)據(jù)的過程分成3個步驟,E、T、L分別代表抽取、轉(zhuǎn)換和裝載。


          其實ETL過程就是數(shù)據(jù)流動的過程,從不同的數(shù)據(jù)源流向不同的目標(biāo)數(shù)據(jù)。但在數(shù)據(jù)倉庫中,ETL有幾個特點,一是數(shù)據(jù)同步,它不是一次性倒完數(shù)據(jù)就拉到,它是經(jīng)常性的活動,按照固定周期運行的,甚至現(xiàn)在還有人提出了實時ETL的概念。二是數(shù)據(jù)量,一般都是巨大的,值得你將數(shù)據(jù)流動的過程拆分成E、T和L。
          現(xiàn)在有很多成熟的工具提供ETL功能,例如datastage、powermart等,且不說他們的好壞。從應(yīng)用角度來說,ETL的過程其實不是非常復(fù)雜,這些工具給數(shù)據(jù)倉庫工程帶來和很大的便利性,特別是開發(fā)的便利和維護(hù)的便利。但另一方面,開發(fā)人員容易迷失在這些工具中。舉個例子,VB是一種非常簡單的語言并且也是非常易用的編程工具,上手特別快,但是真正VB的高手有多少?微軟設(shè)計的產(chǎn)品通常有個原則是“將使用者當(dāng)作傻瓜”,在這個原則下,微軟的東西確實非常好用,但是對于開發(fā)者,如果你自己也將自己當(dāng)作傻瓜,那就真的傻了。ETL工具也是一樣,這些工具為我們提供圖形化界面,讓我們將主要的精力放在規(guī)則上,以期提高開發(fā)效率。從使用效果來說,確實使用這些工具能夠非??焖俚貥?gòu)建一個job來處理某個數(shù)據(jù),不過從整體來看,并不見得他的整體效率會高多少。問題主要不是出在工具上,而是在設(shè)計、開發(fā)人員上。他們迷失在工具中,沒有去探求ETL的本質(zhì)。


          可以說這些工具應(yīng)用了這么長時間,在這么多項目、環(huán)境中應(yīng)用,它必然有它成功之處,它必定體現(xiàn)了ETL的本質(zhì)。如果我們不透過表面這些工具的簡單使用去看它背后蘊(yùn)涵的思想,最終我們作出來的東西也就是一個個獨立的job,將他們整合起來仍然有巨大的工作量。大家都知道“理論與實踐相結(jié)合”,如果在一個領(lǐng)域有所超越,必須要在理論水平上達(dá)到一定的高度


          探求ETL本質(zhì)之一
          ETL的過程就是數(shù)據(jù)流動的過程,從不同異構(gòu)數(shù)據(jù)源流向統(tǒng)一的目標(biāo)數(shù)據(jù)。其間,數(shù)據(jù)的抽取、清洗、轉(zhuǎn)換和裝載形成串行或并行的過程。ETL的核心還是在于T這個過程,也就是轉(zhuǎn)換,而抽取和裝載一般可以作為轉(zhuǎn)換的輸入和輸出,或者,它們作為一個單獨的部件,其復(fù)雜度沒有轉(zhuǎn)換部件高。和OLTP系統(tǒng)中不同,那里充滿這單條記錄的insert、update和select等操作,ETL過程一般都是批量操作,例如它的裝載多采用批量裝載工具,一般都是DBMS系統(tǒng)自身附帶的工具,例如Oracle SQLLoader和DB2的autoloader等。
          ?
          ETL本身有一些特點,在一些工具中都有體現(xiàn),下面以datastage和powermart舉例來說。
          ?
          1、靜態(tài)的ETL單元和動態(tài)的ETL單元實例;一次轉(zhuǎn)換指明了某種格式的數(shù)據(jù)如何格式化成另一種格式的數(shù)據(jù),對于數(shù)據(jù)源的物理形式在設(shè)計時可以不用指定,它可以在運行時,當(dāng)這個ETL單元創(chuàng)建一個實例時才指定。對于靜態(tài)和動態(tài)的ETL單元,Datastage沒有嚴(yán)格區(qū)分,它的一個Job就是實現(xiàn)這個功能,在早期版本,一個Job同時不能運行兩次,所以一個Job相當(dāng)于一個實例,在后期版本,它支持multiple instances,而且還不是默認(rèn)選項。Powermart中將這兩個概念加以區(qū)分,靜態(tài)的叫做Mapping,動態(tài)運行時叫做Session。
          ?
          2、ETL元數(shù)據(jù);元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù),他的含義非常廣泛,這里僅指ETL的元數(shù)據(jù)。主要包括每次轉(zhuǎn)換前后的數(shù)據(jù)結(jié)構(gòu)和轉(zhuǎn)換的規(guī)則。ETL元數(shù)據(jù)還包括形式參數(shù)的管理,形式參數(shù)的ETL單元定義的參數(shù),相對還有實參,它是運行時指定的參數(shù),實參不在元數(shù)據(jù)管理范圍之內(nèi)。

          3、數(shù)據(jù)流程的控制;要有可視化的流程編輯工具,提供流程定義和流程監(jiān)控功能。流程調(diào)度的最小單位是ETL單元實例,ETL單元是不能在細(xì)分的ETL過程,當(dāng)然這由開發(fā)者來控制,例如可以將抽取、轉(zhuǎn)換放在一個ETL單元中,那樣這個抽取和轉(zhuǎn)換只能同時運行,而如果將他們分作兩個單元,可以分別運行,這有利于錯誤恢復(fù)操作。當(dāng)然,ETL單元究竟應(yīng)該細(xì)分到什么程度應(yīng)該依據(jù)具體應(yīng)用來看,目前還沒有找到很好的細(xì)分策略。比如,我們可以規(guī)定將裝載一個表的功能作為一個ETL單元,但是不可否認(rèn),這樣的ETL單元之間會有很多共同的操作,例如兩個單元共用一個Hash表,要將這個Hash表裝入內(nèi)存兩次。

          4、轉(zhuǎn)換規(guī)則的定義方法;提供函數(shù)集提供常用規(guī)則方法,提供規(guī)則定義語言描述規(guī)則。
          ?
          5、對數(shù)據(jù)的快速索引;一般都是利用Hash技術(shù),將參照關(guān)系表提前裝入內(nèi)存,在轉(zhuǎn)換時查找這個hash表。Datastage中有Hash文件技術(shù),Powermart也有類似的Lookup功能。

          ?探求ETL本質(zhì)之二(分類)
          昨在IT-Director上閱讀一篇報告,關(guān)于ETL產(chǎn)品分類的。一般來說,我們眼中的ETL工具都是價格昂貴,能夠處理海量數(shù)據(jù)的家伙,但是這是其中的一種。它可以分成4種,針對不同的需求,主要是從轉(zhuǎn)換規(guī)則的復(fù)雜度和數(shù)據(jù)量大小來看。它們包括
          1、交互式運行環(huán)境,你可以指定數(shù)據(jù)源、目標(biāo)數(shù)據(jù),指定規(guī)則,立馬ETL。這種交互式的操作無疑非常方便,但是只能適合小數(shù)據(jù)量和復(fù)雜度不高的ETL過程,因為一旦規(guī)則復(fù)雜了,可能需要語言級的描述,不能簡簡單單拖拖拽拽就可以的。還有數(shù)據(jù)量的問題,這種交互式必然建立在解釋型語言基礎(chǔ)上,另外他的靈活性必然要犧牲一定的性能為代價。所以如果要處理海量數(shù)據(jù)的話,每次讀取一條記錄,每次對規(guī)則進(jìn)行解釋執(zhí)行,每次在寫入一條記錄,這對性能影響是非常大的。
          2、專門編碼型的,它提供了一個基于某種語言的程序框架,你可以不必將編程精力放在一些周邊的功能上,例如讀文件功能、寫數(shù)據(jù)庫的功能,而將精力主要放在規(guī)則的實現(xiàn)上面。這種近似手工代碼的性能肯定是沒話說,除非你的編程技巧不過關(guān)(這也是不可忽視的因素之一)。對于處理大數(shù)據(jù)量,處理復(fù)雜轉(zhuǎn)換邏輯,這種方式的ETL實現(xiàn)是非常直觀的。
          3、代碼生成器型的,它就像是一個ETL代碼生成器,提供簡單的圖形化界面操作,讓你拖拖拽拽將轉(zhuǎn)換規(guī)則都設(shè)定好,其實他的后臺都是生成基于某種語言的程序,要運行這個ETL過程,必須要編譯才行。Datastage就是類似這樣的產(chǎn)品,設(shè)計好的job必須要編譯,這避免了每次轉(zhuǎn)換的解釋執(zhí)行,但是不知道它生成的中間語言是什么。以前我設(shè)計的ETL工具大挪移其實也是歸屬于這一類,它提供了界面讓用戶編寫規(guī)則,最后生成C++語言,編譯后即可運行。這類工具的特點就是要在界面上下狠功夫,必須讓用戶輕松定義一個ETL過程,提供豐富的插件來完成讀、寫和轉(zhuǎn)換函數(shù)。大挪移在這方面就太弱了,規(guī)則必須手寫,而且要寫成標(biāo)準(zhǔn)c++語法,這未免還是有點難為最終用戶了,還不如做成一個專業(yè)編碼型的產(chǎn)品呢。另外一點,這類工具必須提供面向?qū)<覒?yīng)用的功能,因為它不可能考慮到所有的轉(zhuǎn)換規(guī)則和所有的讀寫,一方面提供插件接口來讓第三方編寫特定的插件,另一方面還有提供特定語言來實現(xiàn)高級功能。例如Datastage提供一種類Basic的語言,不過他的Job的腳本化實現(xiàn)好像就做的不太好,只能手工繪制job,而不能編程實現(xiàn)Job。
          4、最后還有一種類型叫做數(shù)據(jù)集線器,顧名思義,他就是像Hub一樣地工作。將這種類型分出來和上面幾種分類在標(biāo)準(zhǔn)上有所差異,上面三種更多指ETL實現(xiàn)的方法,此類主要從數(shù)據(jù)處理角度。目前有一些產(chǎn)品屬于EAI(Enterprise Application Integration),它的數(shù)據(jù)集成主要是一種準(zhǔn)實時性。所以這類產(chǎn)品就像Hub一樣,不斷接收各種異構(gòu)數(shù)據(jù)源來的數(shù)據(jù),經(jīng)過處理,在實施發(fā)送到不同的目標(biāo)數(shù)據(jù)中去。
          雖然,這些類看似各又千秋,特別在BI項目中,面對海量數(shù)據(jù)的ETL時,中間兩種的選擇就開始了,在選擇過程中,必須要考慮到開發(fā)效率、維護(hù)方面、性能、學(xué)習(xí)曲線、人員技能等各方面因素,當(dāng)然還有最重要也是最現(xiàn)實的因素就是客戶的意象。

          探求ETL本質(zhì)之三(轉(zhuǎn)換)
          ETL探求之一中提到,ETL過程最復(fù)雜的部分就是T,這個轉(zhuǎn)換過程,T過程究竟有哪些類型呢?
          一、宏觀輸入輸出
          從對數(shù)據(jù)源的整個宏觀處理分,看看一個ETL過程的輸入輸出,可以分成下面幾類:
          1、大小交,這種處理在數(shù)據(jù)清洗過程是常見了,例如從數(shù)據(jù)源到ODS階段,如果數(shù)據(jù)倉庫采用維度建模,而且維度基本采用代理鍵的話,必然存在代碼到此鍵值的轉(zhuǎn)換。如果用SQL實現(xiàn),必然需要將一個大表和一堆小表都Join起來,當(dāng)然如果使用ETL工具的話,一般都是先將小表讀入內(nèi)存中再處理。這種情況,輸出數(shù)據(jù)的粒度和大表一樣。
          2、大大交,大表和大表之間關(guān)聯(lián)也是一個重要的課題,當(dāng)然其中要有一個主表,在邏輯上,應(yīng)當(dāng)是主表Left Join輔表。大表之間的關(guān)聯(lián)存在最大的問題就是性能和穩(wěn)定性,對于海量數(shù)據(jù)來說,必須有優(yōu)化的方法來處理他們的關(guān)聯(lián),另外,對于大數(shù)據(jù)的處理無疑會占用太多的系統(tǒng)資源,出錯的幾率非常大,如何做到有效錯誤恢復(fù)也是個問題。對于這種情況,我們建議還是盡量將大表拆分成適度的稍小一點的表,形成大小交的類型。這類情況的輸出數(shù)據(jù)粒度和主表一樣。
          3、站著進(jìn)來,躺著出去。事務(wù)系統(tǒng)中為了提高系統(tǒng)靈活性和擴(kuò)展性,很多信息放在代碼表中維護(hù),所以它的“事實表”就是一種窄表,而在數(shù)據(jù)倉庫中,通常要進(jìn)行寬化,從行變成列,所以稱這種處理情況叫做“站著進(jìn)來,躺著出去”。大家對Decode肯定不陌生,這是進(jìn)行寬表化常見的手段之一。窄表變寬表的過程主要體現(xiàn)在對窄表中那個代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個代碼字段上。
          4、聚集。數(shù)據(jù)倉庫中重要的任務(wù)就是沉淀數(shù)據(jù),聚集是必不可少的操作,它是粗化數(shù)據(jù)粒度的過程。聚集本身其實很簡單,就是類似SQL中Group by的操作,選取特定字段(維度),對度量字段再使用某種聚集函數(shù)。但是對于大數(shù)據(jù)量情況下,聚集算法的優(yōu)化仍是探究的一個課題。例如是直接使用SQL的Group by,還是先排序,在處理。
          二、微觀規(guī)則
          從數(shù)據(jù)的轉(zhuǎn)換的微觀細(xì)節(jié)分,可以分成下面的幾個基本類型,當(dāng)然還有一些復(fù)雜的組合情況,例如先運算,在參照轉(zhuǎn)換的規(guī)則,這種基于基本類型組合的情況就不在此列了。ETL的規(guī)則是依賴目標(biāo)數(shù)據(jù)的,目標(biāo)數(shù)據(jù)有多少字段,就有多少條規(guī)則。
          1、直接映射,原來是什么就是什么,原封不動照搬過來,對這樣的規(guī)則,如果數(shù)據(jù)源字段和目標(biāo)字段長度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡單運算。
          2、字段運算,數(shù)據(jù)源的一個或多個字段進(jìn)行數(shù)學(xué)運算得到的目標(biāo)字段,這種規(guī)則一般對數(shù)值型字段而言。
          3、參照轉(zhuǎn)換,在轉(zhuǎn)換中通常要用數(shù)據(jù)源的一個或多個字段作為Key,去一個關(guān)聯(lián)數(shù)組中去搜索特定值,而且應(yīng)該只能得到唯一值。這個關(guān)聯(lián)數(shù)組使用Hash算法實現(xiàn)是比較合適也是最常見的,在整個ETL開始之前,它就裝入內(nèi)存,對性能提高的幫助非常大。
          4、字符串處理,從數(shù)據(jù)源某個字符串字段中經(jīng)常可以獲取特定信息,例如身份證號。而且,經(jīng)常會有數(shù)值型值以字符串形式體現(xiàn)。對字符串的操作通常有類型轉(zhuǎn)換、字符串截取等。但是由于字符類型字段的隨意性也造成了臟數(shù)據(jù)的隱患,所以在處理這種規(guī)則的時候,一定要加上異常處理。
          5、空值判斷,對于空值的處理是數(shù)據(jù)倉庫中一個常見問題,是將它作為臟數(shù)據(jù)還是作為特定一種維成員?這恐怕還要看應(yīng)用的情況,也是需要進(jìn)一步探求的。但是無論怎樣,對于可能有NULL值的字段,不要采用“直接映射”的規(guī)則類型,必須對空值進(jìn)行判斷,目前我們的建議是將它轉(zhuǎn)換成特定的值。
          6、日期轉(zhuǎn)換,在數(shù)據(jù)倉庫中日期值一般都會有特定的,不同于日期類型值的表示方法,例如使用8位整型20040801表示日期。而在數(shù)據(jù)源中,這種字段基本都是日期類型的,所以對于這樣的規(guī)則,需要一些共通函數(shù)來處理將日期轉(zhuǎn)換為8位日期值、6位月份值等。
          7、日期運算,基于日期,我們通常會計算日差、月差、時長等。一般數(shù)據(jù)庫提供的日期運算函數(shù)都是基于日期型的,而在數(shù)據(jù)倉庫中采用特定類型來表示日期的話,必須有一套自己的日期運算函數(shù)集。
          8、聚集運算,對于事實表中的度量字段,他們通常是通過數(shù)據(jù)源一個或多個字段運用聚集函數(shù)得來的,這些聚集函數(shù)為SQL標(biāo)準(zhǔn)中,包括sum,count,avg,min,max。
          9、既定取值,這種規(guī)則和以上各種類型規(guī)則的差別就在于它不依賴于數(shù)據(jù)源字段,對目標(biāo)字段取一個固定的或是依賴系統(tǒng)的值。

          ?探求ETL本質(zhì)之四(數(shù)據(jù)質(zhì)量)
          “不要絕對的數(shù)據(jù)準(zhǔn)確,但要知道為什么不準(zhǔn)確?!?br />這是我們在構(gòu)建BI系統(tǒng)是對數(shù)據(jù)準(zhǔn)確性的要求。確實,對絕對的數(shù)據(jù)準(zhǔn)確誰也沒有把握,不僅是系統(tǒng)集成商,包括客戶也是無法確定。準(zhǔn)確的東西需要一個標(biāo)準(zhǔn),但首先要保證這個標(biāo)準(zhǔn)是準(zhǔn)確的,至少現(xiàn)在還沒有這樣一個標(biāo)準(zhǔn)??蛻魰岢鲆粋€相對標(biāo)準(zhǔn),例如將你的OLAP數(shù)據(jù)結(jié)果和報表結(jié)果對比。雖然這是一種不太公平的比較,你也只好認(rèn)了吧。
          ?
          首先在數(shù)據(jù)源那里,已經(jīng)很難保證數(shù)據(jù)質(zhì)量了,這一點也是事實。在這一層有哪些可能原因?qū)е聰?shù)據(jù)質(zhì)量問題?可以分為下面幾類:
          1、數(shù)據(jù)格式錯誤,例如缺失數(shù)據(jù)、數(shù)據(jù)值超出范圍或是數(shù)據(jù)格式非法等。要知道對于同樣處理大數(shù)據(jù)量的數(shù)據(jù)源系統(tǒng),他們通常會舍棄一些數(shù)據(jù)庫自身的檢查機(jī)制,例如字段約束等。他們盡可能將數(shù)據(jù)檢查在入庫前保證,但是這一點是很難確保的。這類情況諸如身份證號碼、手機(jī)號、非日期類型的日期字段等。
          2、數(shù)據(jù)一致性,同樣,數(shù)據(jù)源系統(tǒng)為了性能的考慮,會在一定程度上舍棄外鍵約束,這通常會導(dǎo)致數(shù)據(jù)不一致。例如在帳務(wù)表中會出現(xiàn)一個用戶表中沒有的用戶ID,在例如有些代碼在代碼表中找不到等。
          3、業(yè)務(wù)邏輯的合理性,這一點很難說對與錯。通常,數(shù)據(jù)源系統(tǒng)的設(shè)計并不是非常嚴(yán)謹(jǐn),例如讓用戶開戶日期晚于用戶銷戶日期都是有可能發(fā)生的,一個用戶表中存在多個用戶ID也是有可能發(fā)生的。對這種情況,有什么辦法嗎?
          ?
          構(gòu)建一個BI系統(tǒng),要做到完全理解數(shù)據(jù)源系統(tǒng)根本就是不可能的。特別是數(shù)據(jù)源系統(tǒng)在交付后,有更多維護(hù)人員的即興發(fā)揮,那更是要花大量的時間去尋找原因。以前曾經(jīng)爭辯過設(shè)計人員對規(guī)則描述的問題,有人提出要在ETL開始之前務(wù)必將所有的規(guī)則弄得一清二楚。我并不同意這樣的意見,倒是認(rèn)為在ETL過程要有處理這些質(zhì)量有問題數(shù)據(jù)的保證。一定要正面這些臟數(shù)據(jù),是丟棄還是處理,無法逃避。如果沒有質(zhì)量保證,那么在這個過程中,錯誤會逐漸放大,拋開數(shù)據(jù)源質(zhì)量問題,我們再來看看ETL過程中哪些因素對數(shù)據(jù)準(zhǔn)確性產(chǎn)生重大影響。
          1、規(guī)則描述錯誤。上面提到對設(shè)計人員對數(shù)據(jù)源系統(tǒng)理解的不充分,導(dǎo)致規(guī)則理解錯誤,這是一方面。另一方面,是規(guī)則的描述,如果無二義性地描述規(guī)則也是要探求的一個課題。規(guī)則是依附于目標(biāo)字段的,在探求之三中,提到規(guī)則的分類。但是規(guī)則總不能總是用文字描述,必須有嚴(yán)格的數(shù)學(xué)表達(dá)方式。我甚至想過,如果設(shè)計人員能夠使用某種規(guī)則語言來描述,那么我們的ETL單元就可以自動生成、同步,省去很多手工操作了。
          2、ETL開發(fā)錯誤。即時規(guī)則很明確,ETL開發(fā)的過程中也會發(fā)生一些錯誤,例如邏輯錯誤、書寫錯誤等。例如對于一個分段值,開區(qū)間閉區(qū)間是需要指定的,但是常常開發(fā)人員沒注意,一個大于等于號寫成大于號就導(dǎo)致數(shù)據(jù)錯誤。
          3、人為處理錯誤。在整體ETL流程沒有完成之前,為了圖省事,通常會手工運行ETL過程,這其中一個重大的問題就是你不會按照正常流程去運行了,而是按照自己的理解去運行,發(fā)生的錯誤可能是誤刪了數(shù)據(jù)、重復(fù)裝載數(shù)據(jù)等。

          ?探求ETL本質(zhì)之五(質(zhì)量保證)
          上回提到ETL數(shù)據(jù)質(zhì)量問題,這是無法根治的,只能采取特定的手段去盡量避免,而且必須要定義出度量方法來衡量數(shù)據(jù)的質(zhì)量是好還是壞。對于數(shù)據(jù)源的質(zhì)量,客戶對此應(yīng)該更加關(guān)心,如果在這個源頭不能保證比較干凈的數(shù)據(jù),那么后面的分析功能的可信度也都成問題。數(shù)據(jù)源系統(tǒng)也在不斷進(jìn)化過程中,客戶的操作也在逐漸規(guī)范中,BI系統(tǒng)也同樣如此。本文探討一下對數(shù)據(jù)源質(zhì)量和ETL處理質(zhì)量的應(yīng)對方法。
          如何應(yīng)對數(shù)據(jù)源的質(zhì)量問題?記得在onteldatastage列表中也討論過一個話題-"-1的處理",在數(shù)據(jù)倉庫模型維表中,通常有一條-1記錄,表示“未知”,這個未知含義可廣了,任何可能出錯的數(shù)據(jù),NULL數(shù)據(jù)甚至是規(guī)則沒有涵蓋到的數(shù)據(jù),都轉(zhuǎn)成-1。這是一種處理臟數(shù)據(jù)的方法,但這也是一種掩蓋事實的方法。就好像寫一個函數(shù)FileOpen(filename),返回一個錯誤碼,當(dāng)然,你可以只返回一種錯誤碼,如-1,但這是一種不好的設(shè)計,對于調(diào)用者來說,他需要依據(jù)這個錯誤碼進(jìn)行某些判斷,例如是文件不存在,還是讀取權(quán)限不夠,都有相應(yīng)的處理邏輯。數(shù)據(jù)倉庫中也是一樣,所以,建議將不同的數(shù)據(jù)質(zhì)量類型處理結(jié)果分別轉(zhuǎn)換成不同的值,譬如,在轉(zhuǎn)換后,-1表示參照不上,-2表示NULL數(shù)據(jù)等。不過這僅僅對付了上回提到的第一類錯誤,數(shù)據(jù)格式錯誤。對于數(shù)據(jù)一致性和業(yè)務(wù)邏輯合理性問題,這仍有待探求。但這里有一個原則就是“必須在數(shù)據(jù)倉庫中反應(yīng)數(shù)據(jù)源的質(zhì)量”。
          對于ETL過程中產(chǎn)生的質(zhì)量問題,必須有保障手段。從以往的經(jīng)驗看,沒有保障手段給實施人員帶來麻煩重重。實施人員對于反復(fù)裝載數(shù)據(jù)一定不會陌生,甚至是最后數(shù)據(jù)留到最后的Cube,才發(fā)現(xiàn)了第一步ETL其實已經(jīng)錯了。這個保障手段就是數(shù)據(jù)驗證機(jī)制,當(dāng)然,它的目的是能夠在ETL過程中監(jiān)控數(shù)據(jù)質(zhì)量,產(chǎn)生報警。這個模塊要將實施人員當(dāng)作是最終用戶,可以說他們是數(shù)據(jù)驗證機(jī)制的直接收益者。
          首先,必須有一個對質(zhì)量的度量方法,什么是高質(zhì)什么是低質(zhì),不能靠感官感覺,但這卻是在沒有度量方法條件下通常的做法。那經(jīng)營分析系統(tǒng)來說,聯(lián)通總部曾提出測試規(guī)范,這其實就是一種度量方法,例如指標(biāo)的誤差范圍不能高于5%等,對系統(tǒng)本身來說其實必須要有這樣的度量方法,先不要說這個度量方法是否科學(xué)。對于ETL數(shù)據(jù)處理質(zhì)量,他的度量方法應(yīng)該比聯(lián)通總部測試規(guī)范定義的方法更要嚴(yán)格,因為他更多將BI系統(tǒng)看作一個黑盒子,從數(shù)據(jù)源到展現(xiàn)的數(shù)據(jù)誤差允許一定的誤差。而ETL數(shù)據(jù)處理質(zhì)量度量是一種白盒的度量,要注重每一步過程。因此理論上,要求輸入輸出的指標(biāo)應(yīng)該完全一致。但是我們必須正面完全一致只是理想,對于有誤差的數(shù)據(jù),必須找到原因。
          在質(zhì)量度量方法的前提下,就可以建立一個數(shù)據(jù)驗證框架。此框架依據(jù)總量、分量數(shù)據(jù)稽核方法,該方法在高的《數(shù)據(jù)倉庫中的數(shù)據(jù)稽核技術(shù)》一文中已經(jīng)指出。作為補(bǔ)充,下面提出幾點功能上的建議:
          1、提供前端。將開發(fā)實施人員當(dāng)作用戶,同樣也要為之提供友好的用戶界面。《稽核技術(shù)》一文中指出測試報告的形式,這種形式還是要依賴人為判斷,在一堆數(shù)據(jù)中去找規(guī)律。到不如用OLAP的方式提供界面,不光是加上測試統(tǒng)計出來的指標(biāo)結(jié)果,并且配合度量方法的計算。例如誤差率,對于誤差率為大于0的指標(biāo),就要好好查一下原因了。
          2、提供框架。數(shù)據(jù)驗證不是一次性工作,而是每次ETL過程中都必須做的。因此,必須有一個框架,自動化驗證過程,并提供擴(kuò)展手段,讓實施人員能夠增加驗證范圍。有了這樣一個框架,其實它起到規(guī)范化操作的作用,開發(fā)實施人員可以將主要精力放在驗證腳本的編寫上,而不必過多關(guān)注驗證如何融合到流程中,如何展現(xiàn)等工作。為此,要設(shè)計一套表,類似于DM表,每次驗證結(jié)果數(shù)據(jù)都記錄其中,并且自動觸發(fā)多維分析的數(shù)據(jù)裝載、發(fā)布等。這樣,實施人員可以在每次裝載,甚至在流程過程中就可以觀察數(shù)據(jù)的誤差率。特別是,如果數(shù)據(jù)倉庫的模型能夠統(tǒng)一起來,甚至數(shù)據(jù)驗證腳本都可以確定下來,剩下的就是規(guī)范流程了。
          3、規(guī)范流程。上回提到有一種ETL數(shù)據(jù)質(zhì)量問題是由于人工處理導(dǎo)致的,其中最主要原因還是流程不規(guī)范。開發(fā)實施人員運行單獨一個ETL單元是很方便的,雖然以前曾建議一個ETL單元必須是“可重入”的,這能夠解決誤刪數(shù)據(jù),重復(fù)裝載數(shù)據(jù)問題。但要記住數(shù)據(jù)驗證也是在流程當(dāng)中,要讓數(shù)據(jù)驗證能夠日常運作,就不要讓實施者感覺到他的存在??偟膩碚f,規(guī)范流程是提高實施效率的關(guān)鍵工作,這也是以后要繼續(xù)探求的。

          ?探求ETL本質(zhì)之六(元數(shù)據(jù)漫談)
          對于元數(shù)據(jù)(Metadata)的定義到目前為止沒有什么特別精彩的,這個概念非常廣,一般都是這樣定義,“元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)(Data about Data)”,這造成一種遞歸定義,就像問小強(qiáng)住在哪里,答,在旺財隔壁。按照這樣的定義,元數(shù)據(jù)所描述的數(shù)據(jù)是什么呢?還是元數(shù)據(jù)。這樣就可能有元元元...元數(shù)據(jù)。我還聽說過一種對元數(shù)據(jù),如果說數(shù)據(jù)是一抽屜檔案,那么元數(shù)據(jù)就是分類標(biāo)簽。那它和索引有什么區(qū)別?
          元數(shù)據(jù)體現(xiàn)是一種抽象,哲學(xué)家從古至今都在抽象這個世界,力圖找到世界的本質(zhì)。抽象不是一層關(guān)系,它是一種逐步由具體到一般的過程。例如我->男人->人->哺乳動物->生物這就是一個抽象過程,你要是在軟件業(yè)混會發(fā)現(xiàn)這個例子很常見,面向?qū)ο蠓椒ň褪沁@樣一種抽象過程。它對世界中的事物、過程進(jìn)行抽象,使用面向?qū)ο蠓椒ǎ瑯?gòu)建一套對象模型。同樣在面向?qū)ο蠓椒ㄖ?,類是對象的抽象,接口又是對類的抽象。因此,我認(rèn)為可以將“元”和“抽象”換一下,叫抽象數(shù)據(jù)是不是好理解一些。
          常聽到這樣的話,“xx領(lǐng)導(dǎo)的講話高屋建瓴,給我們后面的工作指引的清晰的方向”,這個成語“高屋建瓴”,站在10樓往下到水,居高臨下,能砸死人,這是指站在一定的高度看待事物,這個一定的高度就是指他有夠“元”。在設(shè)計模式中,強(qiáng)調(diào)要對接口編程,就是說你不要處理這類對象和那類對象的交互,而要處理這個接口和那個接口的交互,先別管他們內(nèi)部是怎么干的。
          元數(shù)據(jù)存在的意義也在于此,雖然上面說了一通都撤到哲學(xué)上去,但這個詞必須還是要結(jié)合軟件設(shè)計中看,我不知道在別的領(lǐng)域是不是存在Metadata這樣的叫法,雖然我相信別的領(lǐng)域必然有類似的東東。元數(shù)據(jù)的存在就是要做到在更高抽象一層設(shè)計軟件。這肯定有好處,什么靈活性啊,擴(kuò)展性啊,可維護(hù)性啊,都能得到提高,而且架構(gòu)清晰,只是彎彎太多,要是從下往上看,太復(fù)雜了。很早以前,我曾看過backorifice的代碼,我靠,一個簡單的功能,從這個類轉(zhuǎn)到父類,又轉(zhuǎn)到父類,很不理解,為什么一個簡單的功能不在一個類的方法中實現(xiàn)就拉到了呢?現(xiàn)在想想,還真不能這樣,這雖然使代碼容易看懂了,但是結(jié)構(gòu)確實混亂的,那他只能干現(xiàn)在的事,如果有什么功能擴(kuò)展,這些代碼就廢了。

          我從98年剛工作時就開始接觸元數(shù)據(jù)的概念,當(dāng)時叫做元數(shù)據(jù)驅(qū)動的系統(tǒng)架構(gòu),后來在QiDSS中也用到這個概念構(gòu)建QiNavigator,但是現(xiàn)在覺得元數(shù)據(jù)也沒啥,不就是建一堆表描述界面的元素,再利用這些數(shù)據(jù)自動生成界面嗎。到了數(shù)據(jù)倉庫系統(tǒng)中,這個概念更強(qiáng)了,是數(shù)據(jù)倉庫中一個重要的部分。但是至今,我還是認(rèn)為這個概念過于玄乎,看不到實際的東西,市面上有一些元數(shù)據(jù)管理的東西,但是從應(yīng)用情況就得知,用的不多。之所以玄乎,就是因為抽象層次沒有分清楚,關(guān)鍵就是對于元數(shù)據(jù)的分類(這種分類就是一種抽象過程)和元數(shù)據(jù)的使用。你可以將元數(shù)據(jù)抽象成0和1,但是那樣對你的業(yè)務(wù)有用嗎?必須還得抽象到適合的程度,最后問題還是“度”。
          數(shù)據(jù)倉庫系統(tǒng)的元數(shù)據(jù)作用如何?還不就是使系統(tǒng)自動運轉(zhuǎn),易于管理嗎?要做到這一步,可沒必要將系統(tǒng)抽象到太極、兩儀、八卦之類的,業(yè)界也曾定義過一些元數(shù)據(jù)規(guī)范,向CWM、XMI等等,可以借鑒,不過俺對此也是不精通的說,以后再說

          posted @ 2007-03-06 21:51 鴻雁| 編輯 收藏

          oracle SQL性能優(yōu)化

               摘要: 我們要做到不但會寫SQL,還要做到寫出性能優(yōu)良的SQL,以下為筆者學(xué)習(xí)、摘錄、并匯總部分資料與大家分享! (1)????? 選擇最有效率的表名順序 ( 只在基于規(guī)則的優(yōu)化器中有效 ) : ORACLE 的解析器按照從右到左的順序處理 FROM 子...  閱讀全文

          posted @ 2007-03-05 20:50 鴻雁| 編輯 收藏

          SQL語句優(yōu)化技術(shù)分析

               摘要: 操作符優(yōu)化 IN 操作符 用 IN ...  閱讀全文

          posted @ 2007-02-05 18:40 鴻雁| 編輯 收藏

          在SQL Server 中合理的使用 LEFT OUTER JOIN 進(jìn)行開發(fā)

          比如我們想對某人的消費項目進(jìn)行匯總,對應(yīng)以下兩個表:Theme 與 ThemeDetail

          Theme 的記錄為:
          ThemeID(int)????ThemeName(varchar[10])
          ????????1????????????????????????就餐
          ????????2????????????????????????出差
          ????????3????????????????????????乘車
          ????????4????????????????????????其它

          ThemeDetail 的記錄為:
          DetailID(int)????ThemeID(int)????Price(money)
          ??? ???1????????????????????1?????????????????12.5
          ? ?????2????????????????????1????????????????????5
          ? ?????3????????????????????1????????????????????6
          ? ?????4????????????????????2???????????????????11
          ? ???? 5????????????????????2???????????????????17
          ? ???? 6????????????????????3????????????????????8

          其中 Theme 中的 ThemeID 與 ThemeDetail 中的 ThemeID 是一對多的關(guān)系,對 ThemeDetail 表的理解如下:“就餐”費用為 12.5 + 5 + 6 = 23.5 元,“出差”費用為 11 + 17 = 28 元,“乘車”費用為 8 = 8 元,“其它”費用不存在,視為 0 處理,對應(yīng)的 SQL 語句可以這樣表示:

          SELECT TOP 100 PERCENT dbo.Theme.ThemeName, ISNULL(SUM(dbo.ThemeDetail.Price), 0)
          ????? AS TotalPrice
          FROM dbo.Theme INNERJOIN
          ????? dbo.ThemeDetail ON dbo.Theme.ThemeID = dbo.ThemeDetail.ThemeID
          GROUP BY dbo.Theme.ThemeName, dbo.Theme.ThemeID
          ORDER BY dbo.Theme.ThemeID

          執(zhí)行結(jié)果如下:
          ThemeName????TotalPrice
          ????就餐????????????? 23.5
          ????出差?????????????? 28
          ????乘車??????????????? 8

          對于消費記錄不存的記錄如果就這樣不顯示它的話,使用內(nèi)聯(lián)的方法就可以滿足要求了,但是我們現(xiàn)在需要對 Theme 中的每一項均做統(tǒng)計,也包括“其它”項,于是我們應(yīng)該采用另一種方法來實現(xiàn),這就是左外聯(lián)的方法,相應(yīng)的 SQL 語句可以這樣表示:

          SELECT TOP 100 PERCENT dbo.Theme.ThemeName, ISNULL(SUM(dbo.ThemeDetail.Price), 0)
          ????? AS TotalPrice
          FROM dbo.Theme LEFTOUTER JOIN
          ????? dbo.ThemeDetail ON dbo.Theme.ThemeID = dbo.ThemeDetail.ThemeID
          GROUP BY dbo.Theme.ThemeName, dbo.Theme.ThemeID
          ORDER BY dbo.Theme.ThemeID

          執(zhí)行結(jié)果如下:
          ThemeName????TotalPrice
          ????就餐????????????? 23.5
          ????出差?????????????? 28
          ????乘車??????????????? 8
          ????其它????????????????0

          這樣是不是就滿足了我們的要求呢!



          /*
          我測試了 10 萬條記錄后發(fā)現(xiàn)速度并非兄弟所說的那樣,測試代碼如下
          */
          declare @StartTime datetime
          set @StartTime = getdate()

          SELECT TOP 100 PERCENT ThemeName, ISNULL(SUM(Price), 0) AS TotalPrice
          FROM Theme LEFT OUTER JOIN ThemeDetail ON Theme.ThemeID = ThemeDetail.ThemeID
          GROUP BY ThemeName, Theme.ThemeID
          ORDER BY Theme.ThemeID

          select datediff(millisecond,@StartTime,getdate())
          set @StartTime = getdate()

          SELECT TOP 100 PERCENT ThemeName, ISNULL((SELECT SUM(ThemeDetail.Price)
          FROM ThemeDetail
          WHERE ThemeDetail.ThemeID = Theme.ThemeID), 0) AS TotalPrice
          FROM Theme
          GROUP BY ThemeName, ThemeID
          ORDER BY ThemeID

          select datediff(millisecond,@StartTime,getdate())


          /* 測試結(jié)果如下,精確到毫秒,最后是平均值 */
          次數(shù) 時間 時間
          ----------------------
          1 93 110
          2 93 93
          3 93 110
          4 93 93
          5 93 110
          6 93 110
          7 93 93
          8 93 93
          9 93 93
          10 93 126
          11 110 110
          12 93 126
          13 96 123
          14 93 126
          15 93 110
          16 93 123
          17 106 96
          18 93 93
          19 106 96
          20 93 93
          ----------------------
          95.3 106.35

          posted @ 2007-02-05 18:25 鴻雁| 編輯 收藏

          購買筆記本需注意的幾點建議!

          ?

          ?1)如何分別行貨和水貨:
          ??? 這一點對于那些不了解IBM的朋友們還是非常有必要了解的,否則非常有可能被JS以水充行的糊弄過去,IBM行貨和水貨非常容易分辨,在不打開包裝箱的情況下就可以很輕松的看到。在不打開包裝箱的情況下,看包裝箱側(cè)面的白色標(biāo)簽,上面有一串諸如2662 B2C的編碼,如果最后一位是C,那么這臺機(jī)器就是行貨,如果最后一位是U、H、A、J等編號,那么這臺機(jī)器是水貨無疑。這是打開包裝箱前的第一項任務(wù),如果沒有問題,那么就可以打開包裝箱看看了。

          ??? 2)核對BIOS、包裝箱和機(jī)身的序列號:

          ??? 這一點是至關(guān)重要的,這是保證整機(jī)不被貍貓換太子的非常關(guān)鍵的一步。具體步驟如下:在不插外界電源的情況下開機(jī),在出現(xiàn)IBM LOGO的時候按住F1鍵,在出現(xiàn)的頁面中找到S/N這一項,將其和包裝箱的S/N號相比較,看看是否吻合,如果吻合,就可以退出BIOS,將機(jī)身反過來,找到背部的條形碼標(biāo)簽,看看上面的序列號是否和包裝箱上的相同,如果吻合就可以進(jìn)入系統(tǒng)了。一般情況下,水貨的機(jī)器是已經(jīng)解包的(WIN? XP不經(jīng)過注冊就可以進(jìn)行系統(tǒng)),即可以進(jìn)入相對應(yīng)的操作系統(tǒng)了,這是由于從香港帶過關(guān)的時候防止機(jī)器被扣下所作的一些應(yīng)對措施,如果是這種情況,那么直接點擊開始,選擇程序中的ThinkPad Utilities選項,點擊控制臺程序,里面的最后一個頁面里也有S/N號,將他和包裝箱的相比較看是否吻合,如果這幾項全部沒有問題,OK,說明機(jī)器整體來看沒有太大的問題。如果說系統(tǒng)還沒有解包,那么先解包再進(jìn)行上面的程序,這一點非常重要,不要因為系統(tǒng)沒有解包就跳過這一步,這是不可取的。這一步進(jìn)行完就可以進(jìn)行下一步了。

          ??? 3)放下機(jī)器,核對裝箱單
          ??? 裝箱單一般放在正面打開盒子的夾層里面,上面寫明了包裝箱內(nèi)的所有物品,包括一些廣告宣傳單,檢查裝箱單就是防止部件被JS克扣的重要環(huán)節(jié),細(xì)心的對照裝箱單上的所有內(nèi)容,與包裝箱內(nèi)的每一個部件相對比,如果缺少任何一個部件,那么就要和JS交涉了,你的機(jī)器和有可能被JS克扣下某些部件,最容易被克扣的部件是:小紅帽、紅點包。另外,IBM的筆記本沒有系統(tǒng)恢復(fù)盤,這點和其他品牌的產(chǎn)品有些不同。細(xì)心的對照完每一項就可以將包裝箱放在一邊來看機(jī)器了。

          ??? 4)電池的充電次數(shù)
          ??? 業(yè)界只有IBM和SONY能夠直接的看到筆記本電腦電池的充電次數(shù),這一點為用戶提供了不少的方便,并且可以成為我們分辨機(jī)器是否被人使用過的非常好的辦法,看充電次數(shù)的方法如下:點擊開始,選擇程序中的ThinkPad Utilities選項,選中BATTERY INFORMATION,點擊Stutas Detail頁面,其中的Cycle Count就是這塊電池的充電次數(shù),一般來說行貨的電池充電次數(shù)都在0-1次之間,如果超過這個數(shù)就可能有問題,水貨的話一般也不能超過三次,否則的話也可能有問題,如果充電次數(shù)在幾十次,那么看都不要看,這臺機(jī)器肯定有問題

          ??? 5)查詢保修日期
          ??? IBM的機(jī)器一般都帶有1年到3年的保修,這一點是IBM用戶的便利之處,也是挑機(jī)的時候非常重要的一步,具體的方法是向JS要一根網(wǎng)線或者電話線,然后到如下網(wǎng)址http://www-3.ibm.com/pc/support/site.wss/warranty/warranty.vm,在打開的頁面中輸入包裝箱上的序列號,即可,你會看到這臺機(jī)器的銷售國家(行貨的話應(yīng)該寫明銷往中國),還有這臺機(jī)器的保修截止日期,和機(jī)器被面的機(jī)器出廠日期相對照,看是否有問題,沒有問題的話就可以下線進(jìn)行下一步了。

          ??? 6)火眼金睛查壞點
          ??? 壞點是非常影響屏幕顯示效果的,并且壞點的出現(xiàn)是不可逆的,如何保證自己的機(jī)器沒有壞點哪,在開箱之前其實就應(yīng)該和JS協(xié)商好,如果出現(xiàn)壞點該如何解決,一般是可以要求換貨,但是行貨可能會有些不同,一般是壞點的數(shù)量在一定的范圍內(nèi)都屬于正常范圍內(nèi),所以說這一步比較適合購買水貨的朋友。具體的步驟如下:如果您沒有做任何準(zhǔn)備,沒有專用的軟件來進(jìn)行測試的話,用肉眼也是完全可以達(dá)到挑選的效果的,首先刪除桌面上的所有快捷方式圖標(biāo),右鍵單擊桌面,選擇屬性,在背景選項中,選擇圖片為無,然后在右下角的顏色中挑選各種顏色,主要要選擇紅白藍(lán)黑綠五中,每切換到一種顏色,就用肉眼仔細(xì)地看屏幕有沒有和顯示顏色不同的點,沒有的話就切換到另外一種顏色,直到進(jìn)行完所有的顏色察看。如果您事先準(zhǔn)備了專門的軟件,比如NOKIA的屏幕測試程序,就可以直接運行提來進(jìn)行檢測,效果相同。如果幾項測試中都沒有發(fā)現(xiàn)壞點,那么恭喜您,屏幕比較完美。

          ??? 7)需要注意的其他事項
          ??? 以上的這些項目都進(jìn)行完之后就應(yīng)該看看一些小的細(xì)節(jié)了,比如,看看機(jī)器的進(jìn)風(fēng)口有沒有很多的灰塵,鍵盤是否有亮光,外殼有沒有劃傷的痕跡,邊角有沒有撞痕,外觀方面也就這么多了。如果是光軟互換機(jī)器,就可以抽出光驅(qū),看看光驅(qū)是否全新(主要看鐵板的地方有沒有手指印),插拔的接口是否很新,沒問題的話插進(jìn)機(jī)器了,拿張光碟讀一下,將VCD播放的刻度來回拖一下看反映是否靈敏,如果沒有問題就可以交錢了,記住要讓JS開具一張有公章的收據(jù),寫清楚序列號,省得以后麻煩。還有就是要向JS索要境外發(fā)票,一般來說發(fā)票會在賣出機(jī)器的半個月后給你。交完錢后有可能的話在JS的賣場內(nèi)用螺絲刀拆開硬盤和內(nèi)存插槽,看看這兩個配件上是否有IBM的專用標(biāo)簽和FRU號碼,如果JS給你的機(jī)器沒有這兩項的話,就當(dāng)場和他交涉換貨,因為這說明這兩個配件被偷梁換柱了。如果以上的種種都沒有問題,就可以拿機(jī)器走人了,大可不必去繁瑣的測試USB接口、并口等等I/O接口,一般來說這些部件是不會出現(xiàn)問題的,如果出現(xiàn)問題大可以直接拿境外發(fā)票向藍(lán)快要求保修服務(wù)。

          ??? 相比其他品牌的筆記本電腦,IBM筆記本有著在挑選時的獨特優(yōu)勢,比如有軟件的支持和標(biāo)準(zhǔn)的規(guī)則,挑選的時候只要做到筆者所說的這幾點,一般都可以買到稱心如意的IBM筆記本電腦,但是還是要提醒朋友們的是,心細(xì)才是正確的,切不可麻痹大意。OK,筆者祝大家都能挑選到?jīng)]有任何問題的IBM筆記本。

          posted @ 2007-01-18 13:24 鴻雁| 編輯 收藏

          Struts+Spring+Hibernate快速入門

          本文是開發(fā)基于spring的web應(yīng)用的入門文章,前端采用Struts MVC框架,中間層采用spring,后臺采用Hibernate。

            本文包含以下內(nèi)容:

             ·配置Hibernate和事務(wù)

             ·裝載Spring的applicationContext.xml文件

             ·建立業(yè)務(wù)層和DAO之間的依賴關(guān)系

             ·將Spring應(yīng)用到Struts中

            簡介

            這個例子是建立一個簡單的web應(yīng)用,叫MyUsers,完成用戶管理操作,包含簡單的數(shù)據(jù)庫增,刪,查,該即CRUD(新建,訪問,更新,刪除)操作。這是一個三層的web應(yīng)用,通過Action(Struts)訪問業(yè)務(wù)層,業(yè)務(wù)層訪問DAO。圖一簡要說明了該應(yīng)用的總體結(jié)構(gòu)。圖上的數(shù)字說明了流程順序-從web(UserAction)到中間層(UserManager),再到數(shù)據(jù)訪問層(UserDAO),然后將結(jié)果返回。

            Spring層的真正強(qiáng)大在于它的聲明型事務(wù)處理,幫定和對持久層支持(例如Hiberate和iBATIS)

            以下下是完成這個例子的步驟:

            1. 安裝Eclipse插件

            2. 數(shù)據(jù)庫建表

            3. 配置Hibernate和Spring

            4. 建立Hibernate DAO接口的實現(xiàn)類

            5. 運行測試類,測試DAO的CRUD操作

            6. 創(chuàng)建一個處理類,聲明事務(wù)

            7. 創(chuàng)建web層的Action和model

            8. 運行Action的測試類測試CRUD操作

            9. 創(chuàng)建jsp文件通過瀏覽器進(jìn)行CRUD操作

            10. 通過瀏覽器校驗jsp

            安裝eclipse插件

            1. Hibernate插件http://www.binamics.com/hibernatesync

            2. Spring插件http://springframework.sourceforge.net/spring-ide/eclipse/updatesite/

            3. MyEclipse插件(破解版)

            4. Tomcat插件. tanghan

            5. 其他插件包括xml,jsp,

            數(shù)據(jù)庫建表


          create table app_user(id number not null primary,firstname vchar(32),lastname vchar(32));

            新建項目

            新建一個web project,新建后的目錄結(jié)構(gòu)同時包含了新建文件夾page用于放jsp文件,和源文件夾test用于放junit測試文件。同時將用到的包,包括struts,hibernate,spring都導(dǎo)入到lib目錄下。

            創(chuàng)建持久層O/R mapping

            1. 在src/com.jandar.model下用hibernate插件從數(shù)據(jù)庫導(dǎo)出app_user的.hbm.xml文件改名為User.hbm.xml

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
             "-//Hibernate/Hibernate Mapping DTD//EN"
             "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
          <hibernate-mapping package="com.jandar.model">
          <class name="User" table="APP_USER">
          ?。糹d
            column="ID"
            name="id"
            type="integer"
          ?。?br />
            <generator class="assigned" />

           </id>

          ?。紁roperty
             column="LASTNAME"
             length="10"
             name="lastname"
             not-null="false"
             type="string"
           />

          ?。紁roperty
             column="FIRSTNAME"
             length="10"
             name="firstname"
             not-null="true"
             type="string"
           />

          </class>
          </hibernate-mapping>

            2. 通過hibernate synchronizer->synchronizer file生成User.java文件,User對象對應(yīng)于數(shù)據(jù)庫中的app_user表

            注:在eclipse下自動生成的對象文件不完全相同,相同的是每個對象文件必須實現(xiàn)Serializable接口,必需又toString和hashCode方法;

          import java.io.Serializable;
          import org.apache.commons.lang.builder.EqualsBuilder;
          import org.apache.commons.lang.builder.HashCodeBuilder;
          import org.apache.commons.lang.builder.ToStringBuilder;
          import org.apache.commons.lang.builder.ToStringStyle;

          public class BaseObject implements Serializable {
           public String toString() {
            return ToStringBuilder.reflectionToString(this,
            ToStringStyle.MULTI_LINE_STYLE);
           }

           public boolean equals(Object o) {
            return EqualsBuilder.reflectionEquals(this, o);
           }

           public int hashCode() {
            return HashCodeBuilder.reflectionHashCode(this);
           }
          }

          public class User extends BaseObject {
           private Long id;
           private String firstName;
           private String lastName;

           /**
           * @return Returns the id.
           */

           public Long getId() {
            return id;
           }

           /**
            * @param id The id to set.
           */

           public void setId(Long id) {
            this.id = id;
           }

           /**
           * @return Returns the firstName.
           */

           public String getFirstName() {
            return firstName;
           }

           /**
            * @param firstName The firstName to set.
           */

           public void setFirstName(String firstName) {
            this.firstName = firstName;
           }

           /**
           * @return Returns the lastName.
           */

           public String getLastName() {
            return lastName;
           }

           /**
           * @param lastName The lastName to set.
           */

           public void setLastName(String lastName) {
            this.lastName = lastName;
           }
          }
          創(chuàng)建DAO訪問對象

            1. 在src/com.jandar.service.dao新建IDAO.java接口,所有的DAO都繼承該接口

          package com.jandar.services.dao;

          public interface IDAO {

          }

            2. 在src/com.jandar.service.dao下新建IUserDAO.java接口

          public interface IUserDAO extends DAO {
           List getUsers();
           User getUser(Integer userid);
           void saveUser(User user);
           void removeUser(Integer id);
          }

            該接口提供了訪問對象的方法,

            3. 在src/com.jandar.service.dao.hibernate下新建UserDAOHiberante.java

          import java.util.List;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.springframework.orm.hibernate.support.HibernateDaoSupport;
          import com.jandar.model.User;
          import com.jandar.service.dao.IUserDAO;

          public class UserDaoHibernate extends HibernateDaoSupport implements IUserDAO {

           private Log log=LogFactory.getLog(UserDaoHibernate.class);
           /* (非 Javadoc)
           * @see com.jandar.dao.IUserDAO#getUsers()
           */

           public List getUsers() {
            return getHibernateTemplate().find("from User");
           }

           /* (非 Javadoc)
           * @see com.jandar.dao.IUserDAO#getUser(java.lang.Long)
           */

           public User getUser(Integer id) {
            // TODO 自動生成方法存根
            return (User) getHibernateTemplate().get(User.class,id);
           }

           /* (非 Javadoc)
           * @see com.jandar.dao.IUserDAO#saveUser(com.jandar.model.User)
           */

           public void saveUser(User user) {
            log.debug("xxxxxxx");
            System.out.println("yyyy");
            getHibernateTemplate().saveOrUpdate(user);
            if(log.isDebugEnabled())
            {
             log.debug("userId set to "+user.getId());
            }
           }

           /* (非 Javadoc)
           * @see com.jandar.dao.IUserDAO#removeUser(java.lang.Long)
           */

           public void removeUser(Integer id) {
            Object user=getHibernateTemplate().load(User.class,id);
            getHibernateTemplate().delete(user);
            if(log.isDebugEnabled()){
             log.debug("del user "+id);
            }
           }
          }

            在這個類中實現(xiàn)了IUserDAO接口的方法,并且繼承了HibernateDAOSupport類。這個類的作用是通過hibernate訪問、操作對象,進(jìn)而實現(xiàn)對數(shù)據(jù)庫的操作。

          posted @ 2007-01-15 14:07 鴻雁| 編輯 收藏

          月薪8000元的出租車司機(jī)(轉(zhuǎn)貼)

          這個*頭司機(jī)太強(qiáng)勁了,要做生意額朋友好好看看。。。

            我要從徐家匯趕去機(jī)場,于是匆匆結(jié)束了一個會議,在美羅大廈前搜索出租車。一輛大眾發(fā)現(xiàn)了我,非常專業(yè)的、徑直的停在我的面前。這一停,于是有了后面的這個讓我深感震撼的故事,象上了一堂生動的MBA案例課。為了忠實于這名出租車司機(jī)的原意,我憑記憶盡量重復(fù)他原來的話。

            “去哪里……好的,機(jī)場。我在徐家匯就喜歡做美羅大廈的生意。這里我只做兩個地方。美羅大廈,均瑤大廈。你知道嗎?接到你之前,我在美羅大廈門口兜了兩圈,終于被我看到你了!從寫字樓里出來的,肯定去的不近~~~”

            “哦?你很有方法嘛!”我附和了一下。

            “做出租車司機(jī),也要用科學(xué)的方法。”他說。我一愣,頓時很有些興趣“什么科學(xué)的方法?”

            “要懂得統(tǒng)計。我做過精確的計算。我說給你聽啊。我每天開17個小時的車,每小時成本34.5元……”

            “怎么算出來的?”我追問。

            “你算啊,我每天要交380元,油費大概210元左右。一天17小時,平均每小時固定成本22元,交給公司,平均每小時12.5元油費。這是不是就是34.5元?”,我有些驚訝。我打了10年的車,第一次聽到有出租車司機(jī)這么計算成本。以前的司機(jī)都和我說,每公里成本0.3元,另外每天交多少錢之類的。

            “成本是不能按公里算的,只能按時間算。你看,計價器有一個“檢查”功能。你可以看到一天的詳細(xì)記錄。我做過數(shù)據(jù)分析,每次載客之間的空駛時間平均為7分鐘。如果上來一個起步價,10元,大概要開10分鐘。也就是每一個10元的客人要花17分鐘的成本,就是9.8元。不賺錢?。∪绻f做浦東、杭州、青浦的客人是吃飯,做10元的客人連吃菜都算不上,只能算是撒了些味精?!?

            強(qiáng)!這位師傅聽上去真不象出租車司機(jī),到象是一位成本核算師。“那你怎么辦呢?”我更感興趣了,繼續(xù)問??磥砣C(jī)場的路上還能學(xué)到新東西。

            “千萬不能被客戶拉了滿街跑。而是通過選擇停車的地點,時間,和客戶,主動地決定你要去的地方?!蔽曳浅s@訝,這聽上去很有意思?!坝腥苏f做出租車司機(jī)是靠運氣吃飯的職業(yè)。我以為不是。你要站在客戶的位置上,從客戶的角度去思考?!边@句話聽上去很專業(yè),有點象很多商業(yè)管理培訓(xùn)老師說的“putyourselfintoothers\'shoes.”

            “給你舉個例子,醫(yī)院門口,一個拿著藥的,一個拿著臉盆的,你帶哪一個。”我想了想,說不知道。

            “你要帶那個拿臉盆的。一般人病小痛的到醫(yī)院看一看,拿點藥,不一定會去很遠(yuǎn)的醫(yī)院。拿著臉盆打車的,那是出院的。住院哪有不死人的?今天二樓的誰死了,明天三樓又死了一個。從醫(yī)院出來的人通常會有一種重獲新生的感覺,重新認(rèn)識生命的意義,健康才最重要。那天這個說:走,去青浦。眼睛都不眨一下。你說他會打車到人民廣場,再去做青浦線嗎?絕對不會!”

            我不由得開始佩服。

            “再給你舉個例子。那天人民廣場,三個人在前面招手。一個年輕女子,拿著小包,剛買完東西。還有一對青年男女,一看就是逛街的。第三個是個里面穿絨襯衫的,外面羽絨服的男子,拿著筆記本包。我看一個人只要3秒鐘。我毫不猶豫地停在這個男子面前。這個男的上車后說:延安高架、南北高架~~~還沒說后面就忍不住問,為什么你毫不猶豫地開到我面前?前面還有兩個人,他們要是想上車,我也不好意思和他們搶。我回答說,中午的時候,還有十幾分鐘就1點了。那個女孩子是中午溜出來買東西的,估計公司很近;那對男女是游客,沒拿什么東西,不會去很遠(yuǎn);你是出去辦事的,拿著筆記本包,一看就是公務(wù)。而且這個時候出去,估計應(yīng)該不會近。那個男的就說,你說對了,去寶山?!?

            “那些在超市門口,地鐵口打車,穿著睡衣的人可能去很遠(yuǎn)嗎?可能去機(jī)場嗎?機(jī)場也不會讓她進(jìn)啊。”

            有道理!我越聽越有意思。

            “很多司機(jī)都抱怨,生意不好做啊,油價又漲了啊,都從別人身上找原因。我說,你永遠(yuǎn)從別人身上找原因,你永遠(yuǎn)不能提高。從自己身上找找看,問題出在哪里?!边@話聽起來好熟,好像是“如果你不能改變世界,就改變你自己”,或者StevenCorvey的“影響圈和關(guān)注圈”的翻版?!坝幸淮?,在南丹路一個人攔車,去田林。后來又有一次,一個人在南丹路攔車,還是去田林。我就問了,怎么你們從南丹路出來的人,很多都是去田林呢?人家說,在南丹路有一個公共汽車總站,我們都是坐公共汽車從浦東到這里,然后搭車去田林的。我恍然大悟。比如你看我們開過的這條路,沒有寫字樓,沒有酒店,什么都沒有,只有公共汽車站,站在這里攔車的多半都是剛下公共汽車的,再選擇一條最短路經(jīng)打車。在這里攔車的客戶通常不會高于15元?!?

            “所以我說,態(tài)度決定一切!”我聽十幾個總裁講過這句話,第一次聽出租車司機(jī)這么說。

            “要用科學(xué)的方法,統(tǒng)計學(xué)來做生意。天天等在地鐵站口排隊,怎么能賺到錢?每個月就賺500塊錢怎么養(yǎng)活老婆孩子?這就是在謀殺?。÷灾\殺你的全家。要用知識武裝自己。學(xué)習(xí)知識可以把一個人變成聰明的人,一個聰明的人學(xué)習(xí)知識可以變成很聰明的人。一個很聰明的人學(xué)習(xí)知識,可以變成天才。”

            “有一次一個人打車去火車站,問怎么走。他說這么這么走。我說慢,上高架,再這么這么走。他說,這就繞遠(yuǎn)了。我說,沒關(guān)系,你經(jīng)常走你有經(jīng)驗,你那么走50塊,你按我的走法,等里程表50塊了,我就翻表。你只給50快就好了,多的算我的。按你說的那么走要50分鐘,我?guī)氵@么走只要25分鐘。最后,按我的路走,多走了4公里,快了25分鐘,我只收了50塊。乘客很高興,省了10元錢左右。這4公里對我來說就是1塊多錢的油錢。我相當(dāng)于用1元多錢買了25分鐘。我剛才說了,我一小時的成本34.5塊,我多合算啊!”

            “在大眾公司,一般一個司機(jī)3、4千,拿回家。做的好的大概5千左右。頂級的司機(jī)大概每月能有7000。全大眾2萬個司機(jī),大概只有2-3個司機(jī),萬里挑一,每月能拿到8000以上。我就是這2-3個人中間的一個。而且很穩(wěn)定,基本不會大的波動?!?

            太強(qiáng)了!到此為止,我越來越佩服這個出租車司機(jī)。

            “我常常說我是一個快樂的車夫。有人說,你是因為賺的錢多,所以當(dāng)然快樂。我對他們說,你們正好錯了。是因為我有快樂、積極的心態(tài),所以賺的錢多?!?

            說的多好啊!

            “要懂得體味工作帶給你的美。堵在人民廣場的時候,很多司機(jī)抱怨,又堵車了!真是倒霉。千萬不要這樣,用心體會一下這個城市的美,外面有很多漂亮的女孩子經(jīng)過,非?,F(xiàn)代的高樓大廈,雖然買不起,但是卻可以用欣賞的眼光去享受。開車去機(jī)場,看著兩邊的綠色,冬天是白色的,多美啊。再看看里程表,100多了,就更美了!每一樣工作都有她美麗的地方,我們要懂得從工作中體會這種美麗?!?

            “我10年前是強(qiáng)生公司的總教練。8年前在公司作過三個不同部門的部門經(jīng)理。后來我不干了,一個月就3、5千塊,沒意思。就主動來做司機(jī)。我愿意做一個快樂的車夫。哈哈哈哈。”

            到了機(jī)場,我給他留了一張名片,說:“你有沒有興趣這個星期五,到我辦公室,給微軟的員工講一講你怎么開出租車的?你就當(dāng)打著表,60公里一小時,你講多久,我就付你多少錢。給我電話。”

            我迫不及待的在飛機(jī)上記錄下他這堂生動的MBA課。

          posted @ 2006-12-28 23:13 鴻雁| 編輯 收藏

          對辭職考研的兄弟姐妹們的十六點忠告

          工作是生存的飯碗,考研是投資未來的手段,辭職考研是砸掉飯碗來換取改變?nèi)松\的可能機(jī)會。做任何事都要考慮成本,自費讀研總計十幾萬元的經(jīng)濟(jì)成本(包括隱型成本)的巨大壓力讓你在走每一步時都會懷疑自己是否踩的塌實。而由此帶來的精神壓力曾讓無數(shù)研友出師未捷身先死。總結(jié)一下很多前輩的經(jīng)驗以及自己的教訓(xùn),這里為每一個在辭職與否的天堂地獄間徘徊的兄弟們提出幾點忠告:

          1.關(guān)于動機(jī),所有的應(yīng)屆生都把我們辭職的看作最大的對手,原因是背水一戰(zhàn)的勇氣和置之死地而后生的氣概讓多少漫不經(jīng)心的他們感到畏懼?;蛘哒f是哀兵必勝的緣故吧。不是說動機(jī)一定要有多“純”,在我看來,無論是在原單位混不下去也好,在公司里感到前途無望也好,畢業(yè)幾年后迫切想回到學(xué)校再讀幾年書也好……只要你有強(qiáng)烈的改變目前生活狀態(tài)的欲望以及在還看的進(jìn)書的年紀(jì)在搏一把的勇氣,我想,你已經(jīng)成功了一半。

          2.所報的學(xué)校需量力而行,不是每個人都能象喬丹一樣飛身扣藍(lán),櫻木花道的小人物上籃也是2分。

          3.你說你很有激情,這一點我們堅信。有激情的人們多的是,關(guān)鍵是這種激情能保持多久。那個部隊叫石光榮老爺子用行動告訴了我們堅忍不拔才是通往成功的人間正道。面對辭職的壓力請時刻挺住。

          4.對于所報專業(yè)是否有錢途,網(wǎng)友的爭論希望不要引起你情緒的波動,記住考試和入行還有很長的路要走。無聊的單身漢有時會美好的遐想未來的兒子可能會是個省長,我們對此的建議是找到孩子他媽才是當(dāng)務(wù)之及。法碩版有個著名ID的簽名就是“有前途的不是專業(yè),而是人。”

          5.不要真的以為研究生的畢業(yè)證能徹底改變一個人的命運,我們只是認(rèn)為增大了這種可能性而已??荚囍皇强荚嚕\不是一張證書就能輕易改變的。投資也有虧錢的風(fēng)險,看看股市就知道了。也許日后你的工作甚至沒有現(xiàn)在的好,但我相信你的人生境界已經(jīng)上了一層臺階

          6.訂個學(xué)習(xí)計劃,雖然你我都知道這東西和那些戒煙計劃,減肥計劃一樣,效用并不大,但至少你還能知道考試在幾月進(jìn)行。

          7.翻爛教材,所有的教材使用價值也就6個月??纪旰?0%的可能會被別的要求上進(jìn)的同志借走,而90%的可能這些同志不會真正看一遍,因為他們也是很忙的。

          8.養(yǎng)成聽課記筆記的好習(xí)慣,網(wǎng)上會有熱心的網(wǎng)友張貼筆記,不過雷峰叔叔自己也要考試,我們沒權(quán)利讓他們堅持到底。

          9.結(jié)交一些考友,炎熱的夏天,很多人都有聽課瞌睡的習(xí)慣。但重要的是我們睡醒了還會繼續(xù)戰(zhàn)斗,而你的那些考友們至少會讓你補(bǔ)筆記,或干脆拿針扎醒你。另有他們在,你臨陣脫逃的可能性會大幅下降。

          10.過多的輔導(dǎo)書浪費的不是你的金錢,而是你的時間。當(dāng)然如果你非要看到身邊堆滿了輔導(dǎo)教材,才能心滿意足的看的進(jìn)書的話。那還是去買吧,我們知道每個人都有不同的癖好。

          11.翻看歷年考卷往往會覺得容易,當(dāng)然等你拿到考卷會發(fā)現(xiàn)那是一種錯覺。有時看70年代的英國足總杯錄象,我都懷疑他們是否干得過申花,當(dāng)然這也是種錯覺。

          12.為了考試你不得不放棄一些娛樂活動,這的確應(yīng)該。光榮轉(zhuǎn)業(yè)老兵們都是這樣過來的。今年的世青賽,建議只看看中國隊的比賽吧,這應(yīng)該是一種愛國行為。

          13.進(jìn)考場建議帶疊面巾紙,看到綜合題的一剎那,很多同志會出一身冷汗,很正常,這是一種生理現(xiàn)象。但切記別將汗水留在考卷上,我們已經(jīng)付了考務(wù)費,沒必要再白送我們的汗水。

          14.考完之后對答案。有必要嗎?如果很多人和你答案一樣,可能你還是錯的,80%的同志是明年還會回來的;當(dāng)然更多的可能是答案五花八門,對此我們的解釋是不幸的家庭各有各的不幸。

          15.記住別人的經(jīng)驗永遠(yuǎn)是別人的,各人情況不同而已。我朋友的女友看了不下10遍《逆風(fēng)飛揚(yáng)》,最后她還是換了個有錢的男友,我們認(rèn)為這可能更適合她飛揚(yáng),畢竟可以順風(fēng),干嗎還要逆風(fēng)。

          posted @ 2006-12-28 23:00 鴻雁| 編輯 收藏

          一名董事長給大學(xué)生的18條忠告

          一、讀大學(xué),究竟讀什么?

            大學(xué)生和非大學(xué)生最主要的區(qū)別絕對不在于是否掌握了一門專業(yè)技能……一個經(jīng)過獨立思考而堅持錯誤觀點的人比一個不假思索而接受正確觀點的人更值得肯定……草木可以在校園年復(fù)一年地生長,而我們卻注定要很快被另外一群人替代……盡管每次網(wǎng)到魚的不過是一個網(wǎng)眼,但要想捕到魚,就必須要編織一張網(wǎng)……

            二、人生規(guī)劃:三岔路口的抉擇

            不走彎路就是捷徑……仕途,商界,學(xué)術(shù)。在這人生的三岔路口,你將何去何從……與其跟一百個人去競爭五個職位,不如跟一個人去競爭一個職位……學(xué)術(shù)精神天然的應(yīng)當(dāng)與塵囂和喧嘩保持足夠的距離……商場不忌諱任何神話。你也完全可能成為下一個傳奇……


            三、專業(yè)無冷熱,學(xué)校無高低

            沒有哪個用人單位會認(rèn)為你代表了你的學(xué)校或者你的專業(yè)……既然是概率,就存在不止一種可能性……如果是選擇學(xué)術(shù),冷門專業(yè)比熱門專業(yè)更容易獲得成就……跨專業(yè)幾乎早已成為一種流行一種時尚……大學(xué)之間的實力之爭到了考研考場和人才市場原來是那樣的微不足道……


            四、不可一業(yè)不專,不可只專一業(yè)

            千招會,不如一招熟……十個百分之十并不是百分之百,而是零……在這個現(xiàn)實的社會,真正實現(xiàn)個人價值才是最體面最有面子最有尊嚴(yán)的事情……要想知道需要學(xué)什么,最好的方式就是留意招聘信息……很多專業(yè)因為不具備專長的有效性,所以成為了屠龍之術(shù)……為什么不將“買一送一”的促銷思維運用到求職應(yīng)聘的過程中來呢……


            五、不逃課的學(xué)生不是好學(xué)生

            什么課都不逃,跟什么課都逃掉沒什么兩樣……讀大學(xué),關(guān)鍵是學(xué)會思考問題的方法……逃課沒有錯,但是不要逃錯課……英語角絕對不是學(xué)英語的地方……為了英語丟了專業(yè),那就舍本逐末了……招聘單位是用人才的地方,而不是培養(yǎng)人才的地方……既要逃課,又要讓老師給高分……


            六、勤工儉學(xué)的辯證法

            對于貧困生來說,首先要做的不是掙錢,而是省錢……大部分女生將電腦當(dāng)成了影碟機(jī),大部分男生將電腦當(dāng)成了游戲機(jī)……在這個處女膜都可以隨意偽造的年代,還有什么值得輕易相信……態(tài)度決定一切……當(dāng)學(xué)習(xí)下降到次要的地位,大學(xué)生就只能說是兼職的學(xué)生了……

            七、做事不如做人,人脈決定成敗

            學(xué)問好不如做事好,做事好不如做人好……會說話,就能減少奮斗三十年……一個人有多少錢并不是指他擁有多少錢的所有權(quán),而是指他擁有多少錢的使用權(quán)……一個人賺的錢,12.5%是靠自身的知識,87.5%則來自人脈關(guān)系……三十歲以前靠專業(yè)賺錢,三十歲以后拿人脈賺錢……你和世界上的任何一個人之間只隔著四個人……


            八、互聯(lián)網(wǎng):倚天劍與達(dá)摩克利斯之劍

            花兩個小時就寫出一篇天衣無縫的優(yōu)秀畢業(yè)論文……在互聯(lián)網(wǎng)領(lǐng)域創(chuàng)業(yè)的技術(shù)門檻并不高,關(guān)鍵的是市場眼光和營銷能力……輕舞飛揚(yáng)已經(jīng)紅顏薄命了,而痞子蔡卻繼續(xù)跟別的女孩發(fā)生著一次又一次的親密接觸……很多大學(xué)生的網(wǎng)友遍布祖國大江南北,可他們卻從未主動向周圍的人說一聲:你好,我們可以聊聊嗎……


            九、戀愛:花開堪折方須折

            愛情是不期而至的,可以期待,但不可以制造……越是寂寞,越要警惕愛情……既然單身是可恥的,那西門慶是不是應(yīng)該被評為宋朝十大杰出青年……花開堪折方須折,莫讓鮮花敗殘枝……一個有一萬塊錢的人為你花掉一百元,你只占了他的百分之一;而一個只有十塊錢的人為你花掉十塊,你就成了他的全部……

          十、性:上帝死了,眾神在墮落

            愛要說,愛要做……我只有在肉體一下一下的撞擊中才感到快樂。經(jīng)過之后,將是更大的寂寞更大的空虛……為何要讓別人的虛榮成為對自己的傷害……當(dāng)她機(jī)械地躺在床上張開雙腿,她的父母正在憧憬著女兒的未來……一朝春盡紅顏老,花落人亡兩不知……


            十一、考研:痛苦的安樂死

            沒有比浪費青春更失敗的事情了……研究生擴(kuò)招的速度是30%,也就意味著碩士學(xué)歷貶值的速度是30%……同樣是付出三年的努力,你可以讓E1的值增加1,也可以讓E2的值增加2甚至增加3……讀完碩士或博士并不等于工作能力更強(qiáng)……面對13.54萬的成本,你還會毫不猶豫地投資讀研究生嗎……努力就會有結(jié)果,但不一定是好結(jié)果……


            十二、留學(xué):“海龜”變“海帶”

            月薪2500元的工作,居然引得三個“海歸”碩士爭相競聘……對于某些專業(yè)而言,去美國留學(xué)和去埃塞俄比亞留學(xué)沒什么兩樣……既然全世界的公司都想到中國的市場上來瓜分蛋糕,為什么中國人還要一門心思到國外去留學(xué)然后給外國人打工……

            十三、非統(tǒng)招:養(yǎng)卑照樣處優(yōu)

            她在中國信息產(chǎn)業(yè)界創(chuàng)下了幾項紀(jì)錄。她被稱為中國的“打工皇后”。而她不過是一名自考大專生……要想把曾經(jīng)輸?shù)舻臇|西贏回來,就必須把自己比別人少付出的努力補(bǔ)上來……非統(tǒng)招生不但要有一定的實力,而且必須掌握一定的技巧,做到揚(yáng)長避短出奇制勝……路在腳下。好走,走好……


            十四、畢業(yè):十面埋伏的陷阱

            母校不把自己當(dāng)母親,你又何必把自己當(dāng)兒女……聽輔導(dǎo)班不過是花錢買踏實……人才市場就是一個地雷陣……通過多種方式求職固然沒有錯,但是千萬不要饑不擇食……只要用人單位一說要你交錢,你掉頭就走便是了……這年頭立字尚且不足以為據(jù),更何況一個口頭約定……


            十五、求職:做人不要太厚道

            求職簡歷必須突出自己的核心競爭力……求職的時候大可不必像嚴(yán)守一那樣“有一說一”……一個人說假話并不難,難的是把假話說到底,并且不露一絲破綻……在填寫自己的特長時,一定要盡可能詳細(xì)……一份求職簡歷只要用一張A4紙做個表格就足夠了……面試其實是有規(guī)律的,每次面試的時候只要背標(biāo)準(zhǔn)答案就行了……


            十六、騎一頭能找千里馬的驢

            美國鐵路兩條鐵軌之間的標(biāo)準(zhǔn)距離是4英尺8.5英寸,為什么呢?因為兩匹馬臀部之間的寬度是4英尺8.5英寸……垃圾是放錯位置的人才……世界上最大的悲劇莫過于有太多的年輕人從來沒有發(fā)現(xiàn)自己真正想做什么……中小型企業(yè)或許能夠讓你得到更充分的鍛煉……從基層做起并不意味著可以從基層的每一個職位做起……要“錢途”,更要前途……


            十七、寫字樓政治:白領(lǐng)必修課

            大公司是做人,小公司是做事……職員能否得到提升,很大程度不在于是否努力,而在于老板對你的賞識程度……公司的事情和秘密永遠(yuǎn)比你想象的還要復(fù)雜和深奧……在適當(dāng)?shù)臅r候裝糊涂不但是必要的,而且是睿智的……就把你的同事當(dāng)成一群你可以叫得出名字的陌生人好了……


            十八、創(chuàng)業(yè):29歲以前做富翁

            瘦死的駱駝比馬大……撐死膽大的,餓死膽小的……不再是“大魚吃小魚”,而是“快魚吃慢魚”……對于趨勢的把握是一個創(chuàng)業(yè)者最重要的能力……高科技行業(yè)留給畢業(yè)生的空間已經(jīng)很小……欲速則不達(dá)。在創(chuàng)業(yè)以前通過給別人打工而積累經(jīng)驗是非常必要的……市場永遠(yuǎn)比產(chǎn)品更重要……錢不夠花,怎么辦?第一,看菜吃飯;第二,借雞生蛋……

          posted @ 2006-12-28 22:51 鴻雁| 編輯 收藏

          僅列出標(biāo)題
          共18頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 
          主站蜘蛛池模板: 泾川县| 儋州市| 兴业县| 孟村| 铜陵市| 丁青县| 安乡县| 南溪县| 东乌| 兖州市| 宜阳县| 安龙县| 榆中县| 洛阳市| 平度市| 永泰县| 韶山市| 竹山县| 内乡县| 抚松县| 冀州市| 疏附县| 田阳县| 沈阳市| 剑河县| 即墨市| 河曲县| 珠海市| 淳安县| 林周县| 巴林右旗| 亚东县| 怀柔区| 连江县| 桂阳县| 泾川县| 鲁甸县| 皮山县| 寻甸| 玉龙| 旬阳县|