#
摘要: 系統(tǒng),三種角色:教師,學(xué)生,管理員,我想讓他們的登陸都在一個(gè)界面下自動(dòng)識(shí)別,而無(wú)需進(jìn)行身份選擇,登陸后,他們將分別到各自的admin.jsp,stu.jsp,teacher.jsp 在數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)如下(很多屬性略): id--- user---password--type---about
type是用來(lái)存儲(chǔ)用戶(hù)的類(lèi)別,分別有a,t,s分別對(duì)應(yīng)三種角色 about對(duì)應(yīng)的是acegi里所需要的e...
閱讀全文
做數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),ETL是關(guān)鍵的一環(huán)。說(shuō)大了,ETL是數(shù)據(jù)整合解決方案,說(shuō)小了,就是倒數(shù)據(jù)的工具。回憶一下工作這么些年來(lái),處理數(shù)據(jù)遷移、轉(zhuǎn)換的工作倒還真的不少。但是那些工作基本上是一次性工作或者很小數(shù)據(jù)量,使用access、DTS或是自己編個(gè)小程序搞定。可是在數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,ETL上升到了一定的理論高度,和原來(lái)小打小鬧的工具使用不同了。究竟什么不同,從名字上就可以看到,人家已經(jīng)將倒數(shù)據(jù)的過(guò)程分成3個(gè)步驟,E、T、L分別代表抽取、轉(zhuǎn)換和裝載。
其實(shí)ETL過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同的數(shù)據(jù)源流向不同的目標(biāo)數(shù)據(jù)。但在數(shù)據(jù)倉(cāng)庫(kù)中,ETL有幾個(gè)特點(diǎn),一是數(shù)據(jù)同步,它不是一次性倒完數(shù)據(jù)就拉到,它是經(jīng)常性的活動(dòng),按照固定周期運(yùn)行的,甚至現(xiàn)在還有人提出了實(shí)時(shí)ETL的概念。二是數(shù)據(jù)量,一般都是巨大的,值得你將數(shù)據(jù)流動(dòng)的過(guò)程拆分成E、T和L。
現(xiàn)在有很多成熟的工具提供ETL功能,例如datastage、powermart等,且不說(shuō)他們的好壞。從應(yīng)用角度來(lái)說(shuō),ETL的過(guò)程其實(shí)不是非常復(fù)雜,這些工具給數(shù)據(jù)倉(cāng)庫(kù)工程帶來(lái)和很大的便利性,特別是開(kāi)發(fā)的便利和維護(hù)的便利。但另一方面,開(kāi)發(fā)人員容易迷失在這些工具中。舉個(gè)例子,VB是一種非常簡(jiǎn)單的語(yǔ)言并且也是非常易用的編程工具,上手特別快,但是真正VB的高手有多少?微軟設(shè)計(jì)的產(chǎn)品通常有個(gè)原則是“將使用者當(dāng)作傻瓜”,在這個(gè)原則下,微軟的東西確實(shí)非常好用,但是對(duì)于開(kāi)發(fā)者,如果你自己也將自己當(dāng)作傻瓜,那就真的傻了。ETL工具也是一樣,這些工具為我們提供圖形化界面,讓我們將主要的精力放在規(guī)則上,以期提高開(kāi)發(fā)效率。從使用效果來(lái)說(shuō),確實(shí)使用這些工具能夠非常快速地構(gòu)建一個(gè)job來(lái)處理某個(gè)數(shù)據(jù),不過(guò)從整體來(lái)看,并不見(jiàn)得他的整體效率會(huì)高多少。問(wèn)題主要不是出在工具上,而是在設(shè)計(jì)、開(kāi)發(fā)人員上。他們迷失在工具中,沒(méi)有去探求ETL的本質(zhì)。
可以說(shuō)這些工具應(yīng)用了這么長(zhǎng)時(shí)間,在這么多項(xiàng)目、環(huán)境中應(yīng)用,它必然有它成功之處,它必定體現(xiàn)了ETL的本質(zhì)。如果我們不透過(guò)表面這些工具的簡(jiǎn)單使用去看它背后蘊(yùn)涵的思想,最終我們作出來(lái)的東西也就是一個(gè)個(gè)獨(dú)立的job,將他們整合起來(lái)仍然有巨大的工作量。大家都知道“理論與實(shí)踐相結(jié)合”,如果在一個(gè)領(lǐng)域有所超越,必須要在理論水平上達(dá)到一定的高度
探求ETL本質(zhì)之一
ETL的過(guò)程就是數(shù)據(jù)流動(dòng)的過(guò)程,從不同異構(gòu)數(shù)據(jù)源流向統(tǒng)一的目標(biāo)數(shù)據(jù)。其間,數(shù)據(jù)的抽取、清洗、轉(zhuǎn)換和裝載形成串行或并行的過(guò)程。ETL的核心還是在于T這個(gè)過(guò)程,也就是轉(zhuǎn)換,而抽取和裝載一般可以作為轉(zhuǎn)換的輸入和輸出,或者,它們作為一個(gè)單獨(dú)的部件,其復(fù)雜度沒(méi)有轉(zhuǎn)換部件高。和OLTP系統(tǒng)中不同,那里充滿(mǎn)這單條記錄的insert、update和select等操作,ETL過(guò)程一般都是批量操作,例如它的裝載多采用批量裝載工具,一般都是DBMS系統(tǒng)自身附帶的工具,例如Oracle SQLLoader和DB2的autoloader等。
?
ETL本身有一些特點(diǎn),在一些工具中都有體現(xiàn),下面以datastage和powermart舉例來(lái)說(shuō)。
?
1、靜態(tài)的ETL單元和動(dòng)態(tài)的ETL單元實(shí)例;一次轉(zhuǎn)換指明了某種格式的數(shù)據(jù)如何格式化成另一種格式的數(shù)據(jù),對(duì)于數(shù)據(jù)源的物理形式在設(shè)計(jì)時(shí)可以不用指定,它可以在運(yùn)行時(shí),當(dāng)這個(gè)ETL單元?jiǎng)?chuàng)建一個(gè)實(shí)例時(shí)才指定。對(duì)于靜態(tài)和動(dòng)態(tài)的ETL單元,Datastage沒(méi)有嚴(yán)格區(qū)分,它的一個(gè)Job就是實(shí)現(xiàn)這個(gè)功能,在早期版本,一個(gè)Job同時(shí)不能運(yùn)行兩次,所以一個(gè)Job相當(dāng)于一個(gè)實(shí)例,在后期版本,它支持multiple instances,而且還不是默認(rèn)選項(xiàng)。Powermart中將這兩個(gè)概念加以區(qū)分,靜態(tài)的叫做Mapping,動(dòng)態(tài)運(yùn)行時(shí)叫做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ù),相對(duì)還有實(shí)參,它是運(yùn)行時(shí)指定的參數(shù),實(shí)參不在元數(shù)據(jù)管理范圍之內(nèi)。
3、數(shù)據(jù)流程的控制;要有可視化的流程編輯工具,提供流程定義和流程監(jiān)控功能。流程調(diào)度的最小單位是ETL單元實(shí)例,ETL單元是不能在細(xì)分的ETL過(guò)程,當(dāng)然這由開(kāi)發(fā)者來(lái)控制,例如可以將抽取、轉(zhuǎn)換放在一個(gè)ETL單元中,那樣這個(gè)抽取和轉(zhuǎn)換只能同時(shí)運(yùn)行,而如果將他們分作兩個(gè)單元,可以分別運(yùn)行,這有利于錯(cuò)誤恢復(fù)操作。當(dāng)然,ETL單元究竟應(yīng)該細(xì)分到什么程度應(yīng)該依據(jù)具體應(yīng)用來(lái)看,目前還沒(méi)有找到很好的細(xì)分策略。比如,我們可以規(guī)定將裝載一個(gè)表的功能作為一個(gè)ETL單元,但是不可否認(rèn),這樣的ETL單元之間會(huì)有很多共同的操作,例如兩個(gè)單元共用一個(gè)Hash表,要將這個(gè)Hash表裝入內(nèi)存兩次。
4、轉(zhuǎn)換規(guī)則的定義方法;提供函數(shù)集提供常用規(guī)則方法,提供規(guī)則定義語(yǔ)言描述規(guī)則。
?
5、對(duì)數(shù)據(jù)的快速索引;一般都是利用Hash技術(shù),將參照關(guān)系表提前裝入內(nèi)存,在轉(zhuǎn)換時(shí)查找這個(gè)hash表。Datastage中有Hash文件技術(shù),Powermart也有類(lèi)似的Lookup功能。
?探求ETL本質(zhì)之二(分類(lèi))
昨在IT-Director上閱讀一篇報(bào)告,關(guān)于ETL產(chǎn)品分類(lèi)的。一般來(lái)說(shuō),我們眼中的ETL工具都是價(jià)格昂貴,能夠處理海量數(shù)據(jù)的家伙,但是這是其中的一種。它可以分成4種,針對(duì)不同的需求,主要是從轉(zhuǎn)換規(guī)則的復(fù)雜度和數(shù)據(jù)量大小來(lái)看。它們包括
1、交互式運(yùn)行環(huán)境,你可以指定數(shù)據(jù)源、目標(biāo)數(shù)據(jù),指定規(guī)則,立馬ETL。這種交互式的操作無(wú)疑非常方便,但是只能適合小數(shù)據(jù)量和復(fù)雜度不高的ETL過(guò)程,因?yàn)橐坏┮?guī)則復(fù)雜了,可能需要語(yǔ)言級(jí)的描述,不能簡(jiǎn)簡(jiǎn)單單拖拖拽拽就可以的。還有數(shù)據(jù)量的問(wèn)題,這種交互式必然建立在解釋型語(yǔ)言基礎(chǔ)上,另外他的靈活性必然要犧牲一定的性能為代價(jià)。所以如果要處理海量數(shù)據(jù)的話(huà),每次讀取一條記錄,每次對(duì)規(guī)則進(jìn)行解釋執(zhí)行,每次在寫(xiě)入一條記錄,這對(duì)性能影響是非常大的。
2、專(zhuān)門(mén)編碼型的,它提供了一個(gè)基于某種語(yǔ)言的程序框架,你可以不必將編程精力放在一些周邊的功能上,例如讀文件功能、寫(xiě)數(shù)據(jù)庫(kù)的功能,而將精力主要放在規(guī)則的實(shí)現(xiàn)上面。這種近似手工代碼的性能肯定是沒(méi)話(huà)說(shuō),除非你的編程技巧不過(guò)關(guān)(這也是不可忽視的因素之一)。對(duì)于處理大數(shù)據(jù)量,處理復(fù)雜轉(zhuǎn)換邏輯,這種方式的ETL實(shí)現(xiàn)是非常直觀的。
3、代碼生成器型的,它就像是一個(gè)ETL代碼生成器,提供簡(jiǎn)單的圖形化界面操作,讓你拖拖拽拽將轉(zhuǎn)換規(guī)則都設(shè)定好,其實(shí)他的后臺(tái)都是生成基于某種語(yǔ)言的程序,要運(yùn)行這個(gè)ETL過(guò)程,必須要編譯才行。Datastage就是類(lèi)似這樣的產(chǎn)品,設(shè)計(jì)好的job必須要編譯,這避免了每次轉(zhuǎn)換的解釋執(zhí)行,但是不知道它生成的中間語(yǔ)言是什么。以前我設(shè)計(jì)的ETL工具大挪移其實(shí)也是歸屬于這一類(lèi),它提供了界面讓用戶(hù)編寫(xiě)規(guī)則,最后生成C++語(yǔ)言,編譯后即可運(yùn)行。這類(lèi)工具的特點(diǎn)就是要在界面上下狠功夫,必須讓用戶(hù)輕松定義一個(gè)ETL過(guò)程,提供豐富的插件來(lái)完成讀、寫(xiě)和轉(zhuǎn)換函數(shù)。大挪移在這方面就太弱了,規(guī)則必須手寫(xiě),而且要寫(xiě)成標(biāo)準(zhǔn)c++語(yǔ)法,這未免還是有點(diǎn)難為最終用戶(hù)了,還不如做成一個(gè)專(zhuān)業(yè)編碼型的產(chǎn)品呢。另外一點(diǎn),這類(lèi)工具必須提供面向?qū)<覒?yīng)用的功能,因?yàn)樗豢赡芸紤]到所有的轉(zhuǎn)換規(guī)則和所有的讀寫(xiě),一方面提供插件接口來(lái)讓第三方編寫(xiě)特定的插件,另一方面還有提供特定語(yǔ)言來(lái)實(shí)現(xiàn)高級(jí)功能。例如Datastage提供一種類(lèi)Basic的語(yǔ)言,不過(guò)他的Job的腳本化實(shí)現(xiàn)好像就做的不太好,只能手工繪制job,而不能編程實(shí)現(xiàn)Job。
4、最后還有一種類(lèi)型叫做數(shù)據(jù)集線(xiàn)器,顧名思義,他就是像Hub一樣地工作。將這種類(lèi)型分出來(lái)和上面幾種分類(lèi)在標(biāo)準(zhǔn)上有所差異,上面三種更多指ETL實(shí)現(xiàn)的方法,此類(lèi)主要從數(shù)據(jù)處理角度。目前有一些產(chǎn)品屬于EAI(Enterprise Application Integration),它的數(shù)據(jù)集成主要是一種準(zhǔn)實(shí)時(shí)性。所以這類(lèi)產(chǎn)品就像Hub一樣,不斷接收各種異構(gòu)數(shù)據(jù)源來(lái)的數(shù)據(jù),經(jīng)過(guò)處理,在實(shí)施發(fā)送到不同的目標(biāo)數(shù)據(jù)中去。
雖然,這些類(lèi)看似各又千秋,特別在BI項(xiàng)目中,面對(duì)海量數(shù)據(jù)的ETL時(shí),中間兩種的選擇就開(kāi)始了,在選擇過(guò)程中,必須要考慮到開(kāi)發(fā)效率、維護(hù)方面、性能、學(xué)習(xí)曲線(xiàn)、人員技能等各方面因素,當(dāng)然還有最重要也是最現(xiàn)實(shí)的因素就是客戶(hù)的意象。
探求ETL本質(zhì)之三(轉(zhuǎn)換)
ETL探求之一中提到,ETL過(guò)程最復(fù)雜的部分就是T,這個(gè)轉(zhuǎn)換過(guò)程,T過(guò)程究竟有哪些類(lèi)型呢?
一、宏觀輸入輸出
從對(duì)數(shù)據(jù)源的整個(gè)宏觀處理分,看看一個(gè)ETL過(guò)程的輸入輸出,可以分成下面幾類(lèi):
1、大小交,這種處理在數(shù)據(jù)清洗過(guò)程是常見(jiàn)了,例如從數(shù)據(jù)源到ODS階段,如果數(shù)據(jù)倉(cāng)庫(kù)采用維度建模,而且維度基本采用代理鍵的話(huà),必然存在代碼到此鍵值的轉(zhuǎn)換。如果用SQL實(shí)現(xiàn),必然需要將一個(gè)大表和一堆小表都Join起來(lái),當(dāng)然如果使用ETL工具的話(huà),一般都是先將小表讀入內(nèi)存中再處理。這種情況,輸出數(shù)據(jù)的粒度和大表一樣。
2、大大交,大表和大表之間關(guān)聯(lián)也是一個(gè)重要的課題,當(dāng)然其中要有一個(gè)主表,在邏輯上,應(yīng)當(dāng)是主表Left Join輔表。大表之間的關(guān)聯(lián)存在最大的問(wèn)題就是性能和穩(wěn)定性,對(duì)于海量數(shù)據(jù)來(lái)說(shuō),必須有優(yōu)化的方法來(lái)處理他們的關(guān)聯(lián),另外,對(duì)于大數(shù)據(jù)的處理無(wú)疑會(huì)占用太多的系統(tǒng)資源,出錯(cuò)的幾率非常大,如何做到有效錯(cuò)誤恢復(fù)也是個(gè)問(wèn)題。對(duì)于這種情況,我們建議還是盡量將大表拆分成適度的稍小一點(diǎn)的表,形成大小交的類(lèi)型。這類(lèi)情況的輸出數(shù)據(jù)粒度和主表一樣。
3、站著進(jìn)來(lái),躺著出去。事務(wù)系統(tǒng)中為了提高系統(tǒng)靈活性和擴(kuò)展性,很多信息放在代碼表中維護(hù),所以它的“事實(shí)表”就是一種窄表,而在數(shù)據(jù)倉(cāng)庫(kù)中,通常要進(jìn)行寬化,從行變成列,所以稱(chēng)這種處理情況叫做“站著進(jìn)來(lái),躺著出去”。大家對(duì)Decode肯定不陌生,這是進(jìn)行寬表化常見(jiàn)的手段之一。窄表變寬表的過(guò)程主要體現(xiàn)在對(duì)窄表中那個(gè)代碼字段的操作。這種情況,窄表是輸入,寬表是輸出,寬表的粒度必定要比窄表粗一些,就粗在那個(gè)代碼字段上。
4、聚集。數(shù)據(jù)倉(cāng)庫(kù)中重要的任務(wù)就是沉淀數(shù)據(jù),聚集是必不可少的操作,它是粗化數(shù)據(jù)粒度的過(guò)程。聚集本身其實(shí)很簡(jiǎn)單,就是類(lèi)似SQL中Group by的操作,選取特定字段(維度),對(duì)度量字段再使用某種聚集函數(shù)。但是對(duì)于大數(shù)據(jù)量情況下,聚集算法的優(yōu)化仍是探究的一個(gè)課題。例如是直接使用SQL的Group by,還是先排序,在處理。
二、微觀規(guī)則
從數(shù)據(jù)的轉(zhuǎn)換的微觀細(xì)節(jié)分,可以分成下面的幾個(gè)基本類(lèi)型,當(dāng)然還有一些復(fù)雜的組合情況,例如先運(yùn)算,在參照轉(zhuǎn)換的規(guī)則,這種基于基本類(lèi)型組合的情況就不在此列了。ETL的規(guī)則是依賴(lài)目標(biāo)數(shù)據(jù)的,目標(biāo)數(shù)據(jù)有多少字段,就有多少條規(guī)則。
1、直接映射,原來(lái)是什么就是什么,原封不動(dòng)照搬過(guò)來(lái),對(duì)這樣的規(guī)則,如果數(shù)據(jù)源字段和目標(biāo)字段長(zhǎng)度或精度不符,需要特別注意看是否真的可以直接映射還是需要做一些簡(jiǎn)單運(yùn)算。
2、字段運(yùn)算,數(shù)據(jù)源的一個(gè)或多個(gè)字段進(jìn)行數(shù)學(xué)運(yùn)算得到的目標(biāo)字段,這種規(guī)則一般對(duì)數(shù)值型字段而言。
3、參照轉(zhuǎn)換,在轉(zhuǎn)換中通常要用數(shù)據(jù)源的一個(gè)或多個(gè)字段作為Key,去一個(gè)關(guān)聯(lián)數(shù)組中去搜索特定值,而且應(yīng)該只能得到唯一值。這個(gè)關(guān)聯(lián)數(shù)組使用Hash算法實(shí)現(xiàn)是比較合適也是最常見(jiàn)的,在整個(gè)ETL開(kāi)始之前,它就裝入內(nèi)存,對(duì)性能提高的幫助非常大。
4、字符串處理,從數(shù)據(jù)源某個(gè)字符串字段中經(jīng)常可以獲取特定信息,例如身份證號(hào)。而且,經(jīng)常會(huì)有數(shù)值型值以字符串形式體現(xiàn)。對(duì)字符串的操作通常有類(lèi)型轉(zhuǎn)換、字符串截取等。但是由于字符類(lèi)型字段的隨意性也造成了臟數(shù)據(jù)的隱患,所以在處理這種規(guī)則的時(shí)候,一定要加上異常處理。
5、空值判斷,對(duì)于空值的處理是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)常見(jiàn)問(wèn)題,是將它作為臟數(shù)據(jù)還是作為特定一種維成員?這恐怕還要看應(yīng)用的情況,也是需要進(jìn)一步探求的。但是無(wú)論怎樣,對(duì)于可能有NULL值的字段,不要采用“直接映射”的規(guī)則類(lèi)型,必須對(duì)空值進(jìn)行判斷,目前我們的建議是將它轉(zhuǎn)換成特定的值。
6、日期轉(zhuǎn)換,在數(shù)據(jù)倉(cāng)庫(kù)中日期值一般都會(huì)有特定的,不同于日期類(lèi)型值的表示方法,例如使用8位整型20040801表示日期。而在數(shù)據(jù)源中,這種字段基本都是日期類(lèi)型的,所以對(duì)于這樣的規(guī)則,需要一些共通函數(shù)來(lái)處理將日期轉(zhuǎn)換為8位日期值、6位月份值等。
7、日期運(yùn)算,基于日期,我們通常會(huì)計(jì)算日差、月差、時(shí)長(zhǎng)等。一般數(shù)據(jù)庫(kù)提供的日期運(yùn)算函數(shù)都是基于日期型的,而在數(shù)據(jù)倉(cāng)庫(kù)中采用特定類(lèi)型來(lái)表示日期的話(huà),必須有一套自己的日期運(yùn)算函數(shù)集。
8、聚集運(yùn)算,對(duì)于事實(shí)表中的度量字段,他們通常是通過(guò)數(shù)據(jù)源一個(gè)或多個(gè)字段運(yùn)用聚集函數(shù)得來(lái)的,這些聚集函數(shù)為SQL標(biāo)準(zhǔn)中,包括sum,count,avg,min,max。
9、既定取值,這種規(guī)則和以上各種類(lèi)型規(guī)則的差別就在于它不依賴(lài)于數(shù)據(jù)源字段,對(duì)目標(biāo)字段取一個(gè)固定的或是依賴(lài)系統(tǒng)的值。
?探求ETL本質(zhì)之四(數(shù)據(jù)質(zhì)量)
“不要絕對(duì)的數(shù)據(jù)準(zhǔn)確,但要知道為什么不準(zhǔn)確。”
這是我們?cè)跇?gòu)建BI系統(tǒng)是對(duì)數(shù)據(jù)準(zhǔn)確性的要求。確實(shí),對(duì)絕對(duì)的數(shù)據(jù)準(zhǔn)確誰(shuí)也沒(méi)有把握,不僅是系統(tǒng)集成商,包括客戶(hù)也是無(wú)法確定。準(zhǔn)確的東西需要一個(gè)標(biāo)準(zhǔn),但首先要保證這個(gè)標(biāo)準(zhǔn)是準(zhǔn)確的,至少現(xiàn)在還沒(méi)有這樣一個(gè)標(biāo)準(zhǔn)。客戶(hù)會(huì)提出一個(gè)相對(duì)標(biāo)準(zhǔn),例如將你的OLAP數(shù)據(jù)結(jié)果和報(bào)表結(jié)果對(duì)比。雖然這是一種不太公平的比較,你也只好認(rèn)了吧。
?
首先在數(shù)據(jù)源那里,已經(jīng)很難保證數(shù)據(jù)質(zhì)量了,這一點(diǎn)也是事實(shí)。在這一層有哪些可能原因?qū)е聰?shù)據(jù)質(zhì)量問(wèn)題?可以分為下面幾類(lèi):
1、數(shù)據(jù)格式錯(cuò)誤,例如缺失數(shù)據(jù)、數(shù)據(jù)值超出范圍或是數(shù)據(jù)格式非法等。要知道對(duì)于同樣處理大數(shù)據(jù)量的數(shù)據(jù)源系統(tǒng),他們通常會(huì)舍棄一些數(shù)據(jù)庫(kù)自身的檢查機(jī)制,例如字段約束等。他們盡可能將數(shù)據(jù)檢查在入庫(kù)前保證,但是這一點(diǎn)是很難確保的。這類(lèi)情況諸如身份證號(hào)碼、手機(jī)號(hào)、非日期類(lèi)型的日期字段等。
2、數(shù)據(jù)一致性,同樣,數(shù)據(jù)源系統(tǒng)為了性能的考慮,會(huì)在一定程度上舍棄外鍵約束,這通常會(huì)導(dǎo)致數(shù)據(jù)不一致。例如在帳務(wù)表中會(huì)出現(xiàn)一個(gè)用戶(hù)表中沒(méi)有的用戶(hù)ID,在例如有些代碼在代碼表中找不到等。
3、業(yè)務(wù)邏輯的合理性,這一點(diǎn)很難說(shuō)對(duì)與錯(cuò)。通常,數(shù)據(jù)源系統(tǒng)的設(shè)計(jì)并不是非常嚴(yán)謹(jǐn),例如讓用戶(hù)開(kāi)戶(hù)日期晚于用戶(hù)銷(xiāo)戶(hù)日期都是有可能發(fā)生的,一個(gè)用戶(hù)表中存在多個(gè)用戶(hù)ID也是有可能發(fā)生的。對(duì)這種情況,有什么辦法嗎?
?
構(gòu)建一個(gè)BI系統(tǒng),要做到完全理解數(shù)據(jù)源系統(tǒng)根本就是不可能的。特別是數(shù)據(jù)源系統(tǒng)在交付后,有更多維護(hù)人員的即興發(fā)揮,那更是要花大量的時(shí)間去尋找原因。以前曾經(jīng)爭(zhēng)辯過(guò)設(shè)計(jì)人員對(duì)規(guī)則描述的問(wèn)題,有人提出要在ETL開(kāi)始之前務(wù)必將所有的規(guī)則弄得一清二楚。我并不同意這樣的意見(jiàn),倒是認(rèn)為在ETL過(guò)程要有處理這些質(zhì)量有問(wèn)題數(shù)據(jù)的保證。一定要正面這些臟數(shù)據(jù),是丟棄還是處理,無(wú)法逃避。如果沒(méi)有質(zhì)量保證,那么在這個(gè)過(guò)程中,錯(cuò)誤會(huì)逐漸放大,拋開(kāi)數(shù)據(jù)源質(zhì)量問(wèn)題,我們?cè)賮?lái)看看ETL過(guò)程中哪些因素對(duì)數(shù)據(jù)準(zhǔn)確性產(chǎn)生重大影響。
1、規(guī)則描述錯(cuò)誤。上面提到對(duì)設(shè)計(jì)人員對(duì)數(shù)據(jù)源系統(tǒng)理解的不充分,導(dǎo)致規(guī)則理解錯(cuò)誤,這是一方面。另一方面,是規(guī)則的描述,如果無(wú)二義性地描述規(guī)則也是要探求的一個(gè)課題。規(guī)則是依附于目標(biāo)字段的,在探求之三中,提到規(guī)則的分類(lèi)。但是規(guī)則總不能總是用文字描述,必須有嚴(yán)格的數(shù)學(xué)表達(dá)方式。我甚至想過(guò),如果設(shè)計(jì)人員能夠使用某種規(guī)則語(yǔ)言來(lái)描述,那么我們的ETL單元就可以自動(dòng)生成、同步,省去很多手工操作了。
2、ETL開(kāi)發(fā)錯(cuò)誤。即時(shí)規(guī)則很明確,ETL開(kāi)發(fā)的過(guò)程中也會(huì)發(fā)生一些錯(cuò)誤,例如邏輯錯(cuò)誤、書(shū)寫(xiě)錯(cuò)誤等。例如對(duì)于一個(gè)分段值,開(kāi)區(qū)間閉區(qū)間是需要指定的,但是常常開(kāi)發(fā)人員沒(méi)注意,一個(gè)大于等于號(hào)寫(xiě)成大于號(hào)就導(dǎo)致數(shù)據(jù)錯(cuò)誤。
3、人為處理錯(cuò)誤。在整體ETL流程沒(méi)有完成之前,為了圖省事,通常會(huì)手工運(yùn)行ETL過(guò)程,這其中一個(gè)重大的問(wèn)題就是你不會(huì)按照正常流程去運(yùn)行了,而是按照自己的理解去運(yùn)行,發(fā)生的錯(cuò)誤可能是誤刪了數(shù)據(jù)、重復(fù)裝載數(shù)據(jù)等。
?探求ETL本質(zhì)之五(質(zhì)量保證)
上回提到ETL數(shù)據(jù)質(zhì)量問(wèn)題,這是無(wú)法根治的,只能采取特定的手段去盡量避免,而且必須要定義出度量方法來(lái)衡量數(shù)據(jù)的質(zhì)量是好還是壞。對(duì)于數(shù)據(jù)源的質(zhì)量,客戶(hù)對(duì)此應(yīng)該更加關(guān)心,如果在這個(gè)源頭不能保證比較干凈的數(shù)據(jù),那么后面的分析功能的可信度也都成問(wèn)題。數(shù)據(jù)源系統(tǒng)也在不斷進(jìn)化過(guò)程中,客戶(hù)的操作也在逐漸規(guī)范中,BI系統(tǒng)也同樣如此。本文探討一下對(duì)數(shù)據(jù)源質(zhì)量和ETL處理質(zhì)量的應(yīng)對(duì)方法。
如何應(yīng)對(duì)數(shù)據(jù)源的質(zhì)量問(wèn)題?記得在onteldatastage列表中也討論過(guò)一個(gè)話(huà)題-"-1的處理",在數(shù)據(jù)倉(cāng)庫(kù)模型維表中,通常有一條-1記錄,表示“未知”,這個(gè)未知含義可廣了,任何可能出錯(cuò)的數(shù)據(jù),NULL數(shù)據(jù)甚至是規(guī)則沒(méi)有涵蓋到的數(shù)據(jù),都轉(zhuǎn)成-1。這是一種處理臟數(shù)據(jù)的方法,但這也是一種掩蓋事實(shí)的方法。就好像寫(xiě)一個(gè)函數(shù)FileOpen(filename),返回一個(gè)錯(cuò)誤碼,當(dāng)然,你可以只返回一種錯(cuò)誤碼,如-1,但這是一種不好的設(shè)計(jì),對(duì)于調(diào)用者來(lái)說(shuō),他需要依據(jù)這個(gè)錯(cuò)誤碼進(jìn)行某些判斷,例如是文件不存在,還是讀取權(quán)限不夠,都有相應(yīng)的處理邏輯。數(shù)據(jù)倉(cāng)庫(kù)中也是一樣,所以,建議將不同的數(shù)據(jù)質(zhì)量類(lèi)型處理結(jié)果分別轉(zhuǎn)換成不同的值,譬如,在轉(zhuǎn)換后,-1表示參照不上,-2表示NULL數(shù)據(jù)等。不過(guò)這僅僅對(duì)付了上回提到的第一類(lèi)錯(cuò)誤,數(shù)據(jù)格式錯(cuò)誤。對(duì)于數(shù)據(jù)一致性和業(yè)務(wù)邏輯合理性問(wèn)題,這仍有待探求。但這里有一個(gè)原則就是“必須在數(shù)據(jù)倉(cāng)庫(kù)中反應(yīng)數(shù)據(jù)源的質(zhì)量”。
對(duì)于ETL過(guò)程中產(chǎn)生的質(zhì)量問(wèn)題,必須有保障手段。從以往的經(jīng)驗(yàn)看,沒(méi)有保障手段給實(shí)施人員帶來(lái)麻煩重重。實(shí)施人員對(duì)于反復(fù)裝載數(shù)據(jù)一定不會(huì)陌生,甚至是最后數(shù)據(jù)留到最后的Cube,才發(fā)現(xiàn)了第一步ETL其實(shí)已經(jīng)錯(cuò)了。這個(gè)保障手段就是數(shù)據(jù)驗(yàn)證機(jī)制,當(dāng)然,它的目的是能夠在ETL過(guò)程中監(jiān)控?cái)?shù)據(jù)質(zhì)量,產(chǎn)生報(bào)警。這個(gè)模塊要將實(shí)施人員當(dāng)作是最終用戶(hù),可以說(shuō)他們是數(shù)據(jù)驗(yàn)證機(jī)制的直接收益者。
首先,必須有一個(gè)對(duì)質(zhì)量的度量方法,什么是高質(zhì)什么是低質(zhì),不能靠感官感覺(jué),但這卻是在沒(méi)有度量方法條件下通常的做法。那經(jīng)營(yíng)分析系統(tǒng)來(lái)說(shuō),聯(lián)通總部曾提出測(cè)試規(guī)范,這其實(shí)就是一種度量方法,例如指標(biāo)的誤差范圍不能高于5%等,對(duì)系統(tǒng)本身來(lái)說(shuō)其實(shí)必須要有這樣的度量方法,先不要說(shuō)這個(gè)度量方法是否科學(xué)。對(duì)于ETL數(shù)據(jù)處理質(zhì)量,他的度量方法應(yīng)該比聯(lián)通總部測(cè)試規(guī)范定義的方法更要嚴(yán)格,因?yàn)樗鄬I系統(tǒng)看作一個(gè)黑盒子,從數(shù)據(jù)源到展現(xiàn)的數(shù)據(jù)誤差允許一定的誤差。而ETL數(shù)據(jù)處理質(zhì)量度量是一種白盒的度量,要注重每一步過(guò)程。因此理論上,要求輸入輸出的指標(biāo)應(yīng)該完全一致。但是我們必須正面完全一致只是理想,對(duì)于有誤差的數(shù)據(jù),必須找到原因。
在質(zhì)量度量方法的前提下,就可以建立一個(gè)數(shù)據(jù)驗(yàn)證框架。此框架依據(jù)總量、分量數(shù)據(jù)稽核方法,該方法在高的《數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)稽核技術(shù)》一文中已經(jīng)指出。作為補(bǔ)充,下面提出幾點(diǎn)功能上的建議:
1、提供前端。將開(kāi)發(fā)實(shí)施人員當(dāng)作用戶(hù),同樣也要為之提供友好的用戶(hù)界面。《稽核技術(shù)》一文中指出測(cè)試報(bào)告的形式,這種形式還是要依賴(lài)人為判斷,在一堆數(shù)據(jù)中去找規(guī)律。到不如用OLAP的方式提供界面,不光是加上測(cè)試統(tǒng)計(jì)出來(lái)的指標(biāo)結(jié)果,并且配合度量方法的計(jì)算。例如誤差率,對(duì)于誤差率為大于0的指標(biāo),就要好好查一下原因了。
2、提供框架。數(shù)據(jù)驗(yàn)證不是一次性工作,而是每次ETL過(guò)程中都必須做的。因此,必須有一個(gè)框架,自動(dòng)化驗(yàn)證過(guò)程,并提供擴(kuò)展手段,讓實(shí)施人員能夠增加驗(yàn)證范圍。有了這樣一個(gè)框架,其實(shí)它起到規(guī)范化操作的作用,開(kāi)發(fā)實(shí)施人員可以將主要精力放在驗(yàn)證腳本的編寫(xiě)上,而不必過(guò)多關(guān)注驗(yàn)證如何融合到流程中,如何展現(xiàn)等工作。為此,要設(shè)計(jì)一套表,類(lèi)似于DM表,每次驗(yàn)證結(jié)果數(shù)據(jù)都記錄其中,并且自動(dòng)觸發(fā)多維分析的數(shù)據(jù)裝載、發(fā)布等。這樣,實(shí)施人員可以在每次裝載,甚至在流程過(guò)程中就可以觀察數(shù)據(jù)的誤差率。特別是,如果數(shù)據(jù)倉(cāng)庫(kù)的模型能夠統(tǒng)一起來(lái),甚至數(shù)據(jù)驗(yàn)證腳本都可以確定下來(lái),剩下的就是規(guī)范流程了。
3、規(guī)范流程。上回提到有一種ETL數(shù)據(jù)質(zhì)量問(wèn)題是由于人工處理導(dǎo)致的,其中最主要原因還是流程不規(guī)范。開(kāi)發(fā)實(shí)施人員運(yùn)行單獨(dú)一個(gè)ETL單元是很方便的,雖然以前曾建議一個(gè)ETL單元必須是“可重入”的,這能夠解決誤刪數(shù)據(jù),重復(fù)裝載數(shù)據(jù)問(wèn)題。但要記住數(shù)據(jù)驗(yàn)證也是在流程當(dāng)中,要讓數(shù)據(jù)驗(yàn)證能夠日常運(yùn)作,就不要讓實(shí)施者感覺(jué)到他的存在。總的來(lái)說(shuō),規(guī)范流程是提高實(shí)施效率的關(guān)鍵工作,這也是以后要繼續(xù)探求的。
?探求ETL本質(zhì)之六(元數(shù)據(jù)漫談)
對(duì)于元數(shù)據(jù)(Metadata)的定義到目前為止沒(méi)有什么特別精彩的,這個(gè)概念非常廣,一般都是這樣定義,“元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)(Data about Data)”,這造成一種遞歸定義,就像問(wèn)小強(qiáng)住在哪里,答,在旺財(cái)隔壁。按照這樣的定義,元數(shù)據(jù)所描述的數(shù)據(jù)是什么呢?還是元數(shù)據(jù)。這樣就可能有元元元...元數(shù)據(jù)。我還聽(tīng)說(shuō)過(guò)一種對(duì)元數(shù)據(jù),如果說(shuō)數(shù)據(jù)是一抽屜檔案,那么元數(shù)據(jù)就是分類(lèi)標(biāo)簽。那它和索引有什么區(qū)別?
元數(shù)據(jù)體現(xiàn)是一種抽象,哲學(xué)家從古至今都在抽象這個(gè)世界,力圖找到世界的本質(zhì)。抽象不是一層關(guān)系,它是一種逐步由具體到一般的過(guò)程。例如我->男人->人->哺乳動(dòng)物->生物這就是一個(gè)抽象過(guò)程,你要是在軟件業(yè)混會(huì)發(fā)現(xiàn)這個(gè)例子很常見(jiàn),面向?qū)ο蠓椒ň褪沁@樣一種抽象過(guò)程。它對(duì)世界中的事物、過(guò)程進(jìn)行抽象,使用面向?qū)ο蠓椒ǎ瑯?gòu)建一套對(duì)象模型。同樣在面向?qū)ο蠓椒ㄖ校?lèi)是對(duì)象的抽象,接口又是對(duì)類(lèi)的抽象。因此,我認(rèn)為可以將“元”和“抽象”換一下,叫抽象數(shù)據(jù)是不是好理解一些。
常聽(tīng)到這樣的話(huà),“xx領(lǐng)導(dǎo)的講話(huà)高屋建瓴,給我們后面的工作指引的清晰的方向”,這個(gè)成語(yǔ)“高屋建瓴”,站在10樓往下到水,居高臨下,能砸死人,這是指站在一定的高度看待事物,這個(gè)一定的高度就是指他有夠“元”。在設(shè)計(jì)模式中,強(qiáng)調(diào)要對(duì)接口編程,就是說(shuō)你不要處理這類(lèi)對(duì)象和那類(lèi)對(duì)象的交互,而要處理這個(gè)接口和那個(gè)接口的交互,先別管他們內(nèi)部是怎么干的。
元數(shù)據(jù)存在的意義也在于此,雖然上面說(shuō)了一通都撤到哲學(xué)上去,但這個(gè)詞必須還是要結(jié)合軟件設(shè)計(jì)中看,我不知道在別的領(lǐng)域是不是存在Metadata這樣的叫法,雖然我相信別的領(lǐng)域必然有類(lèi)似的東東。元數(shù)據(jù)的存在就是要做到在更高抽象一層設(shè)計(jì)軟件。這肯定有好處,什么靈活性啊,擴(kuò)展性啊,可維護(hù)性啊,都能得到提高,而且架構(gòu)清晰,只是彎彎太多,要是從下往上看,太復(fù)雜了。很早以前,我曾看過(guò)backorifice的代碼,我靠,一個(gè)簡(jiǎn)單的功能,從這個(gè)類(lèi)轉(zhuǎn)到父類(lèi),又轉(zhuǎn)到父類(lèi),很不理解,為什么一個(gè)簡(jiǎn)單的功能不在一個(gè)類(lèi)的方法中實(shí)現(xiàn)就拉到了呢?現(xiàn)在想想,還真不能這樣,這雖然使代碼容易看懂了,但是結(jié)構(gòu)確實(shí)混亂的,那他只能干現(xiàn)在的事,如果有什么功能擴(kuò)展,這些代碼就廢了。
我從98年剛工作時(shí)就開(kāi)始接觸元數(shù)據(jù)的概念,當(dāng)時(shí)叫做元數(shù)據(jù)驅(qū)動(dòng)的系統(tǒng)架構(gòu),后來(lái)在QiDSS中也用到這個(gè)概念構(gòu)建QiNavigator,但是現(xiàn)在覺(jué)得元數(shù)據(jù)也沒(méi)啥,不就是建一堆表描述界面的元素,再利用這些數(shù)據(jù)自動(dòng)生成界面嗎。到了數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,這個(gè)概念更強(qiáng)了,是數(shù)據(jù)倉(cāng)庫(kù)中一個(gè)重要的部分。但是至今,我還是認(rèn)為這個(gè)概念過(guò)于玄乎,看不到實(shí)際的東西,市面上有一些元數(shù)據(jù)管理的東西,但是從應(yīng)用情況就得知,用的不多。之所以玄乎,就是因?yàn)槌橄髮哟螞](méi)有分清楚,關(guān)鍵就是對(duì)于元數(shù)據(jù)的分類(lèi)(這種分類(lèi)就是一種抽象過(guò)程)和元數(shù)據(jù)的使用。你可以將元數(shù)據(jù)抽象成0和1,但是那樣對(duì)你的業(yè)務(wù)有用嗎?必須還得抽象到適合的程度,最后問(wèn)題還是“度”。
數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的元數(shù)據(jù)作用如何?還不就是使系統(tǒng)自動(dòng)運(yùn)轉(zhuǎn),易于管理嗎?要做到這一步,可沒(méi)必要將系統(tǒng)抽象到太極、兩儀、八卦之類(lèi)的,業(yè)界也曾定義過(guò)一些元數(shù)據(jù)規(guī)范,向CWM、XMI等等,可以借鑒,不過(guò)俺對(duì)此也是不精通的說(shuō),以后再說(shuō)
摘要: 我們要做到不但會(huì)寫(xiě)SQL,還要做到寫(xiě)出性能優(yōu)良的SQL,以下為筆者學(xué)習(xí)、摘錄、并匯總部分資料與大家分享!
(1)?????
選擇最有效率的表名順序
(
只在基于規(guī)則的優(yōu)化器中有效
)
:
ORACLE
的解析器按照從右到左的順序處理
FROM
子...
閱讀全文
摘要: 操作符優(yōu)化
IN 操作符
用
IN
...
閱讀全文
比如我們想對(duì)某人的消費(fèi)項(xiàng)目進(jìn)行匯總,對(duì)應(yīng)以下兩個(gè)表:Theme 與 ThemeDetail
Theme 的記錄為:
ThemeID(int)????ThemeName(varchar[10])
????????1????????????????????????就餐
????????2????????????????????????出差
????????3????????????????????????乘車(chē)
????????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 是一對(duì)多的關(guān)系,對(duì) ThemeDetail 表的理解如下:“就餐”費(fèi)用為 12.5 + 5 + 6 = 23.5 元,“出差”費(fèi)用為 11 + 17 = 28 元,“乘車(chē)”費(fèi)用為 8 = 8 元,“其它”費(fèi)用不存在,視為 0 處理,對(duì)應(yīng)的 SQL 語(yǔ)句可以這樣表示:
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
????乘車(chē)??????????????? 8
對(duì)于消費(fèi)記錄不存的記錄如果就這樣不顯示它的話(huà),使用內(nèi)聯(lián)的方法就可以滿(mǎn)足要求了,但是我們現(xiàn)在需要對(duì) Theme 中的每一項(xiàng)均做統(tǒng)計(jì),也包括“其它”項(xiàng),于是我們應(yīng)該采用另一種方法來(lái)實(shí)現(xiàn),這就是左外聯(lián)的方法,相應(yīng)的 SQL 語(yǔ)句可以這樣表示:
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
????乘車(chē)??????????????? 8
????其它????????????????0
這樣是不是就滿(mǎn)足了我們的要求呢!
/*
我測(cè)試了 10 萬(wàn)條記錄后發(fā)現(xiàn)速度并非兄弟所說(shuō)的那樣,測(cè)試代碼如下
*/
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())
/* 測(cè)試結(jié)果如下,精確到毫秒,最后是平均值 */
次數(shù) 時(shí)間 時(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
?
?1)如何分別行貨和水貨:
??? 這一點(diǎn)對(duì)于那些不了解IBM的朋友們還是非常有必要了解的,否則非常有可能被JS以水充行的糊弄過(guò)去,IBM行貨和水貨非常容易分辨,在不打開(kāi)包裝箱的情況下就可以很輕松的看到。在不打開(kāi)包裝箱的情況下,看包裝箱側(cè)面的白色標(biāo)簽,上面有一串諸如2662 B2C的編碼,如果最后一位是C,那么這臺(tái)機(jī)器就是行貨,如果最后一位是U、H、A、J等編號(hào),那么這臺(tái)機(jī)器是水貨無(wú)疑。這是打開(kāi)包裝箱前的第一項(xiàng)任務(wù),如果沒(méi)有問(wèn)題,那么就可以打開(kāi)包裝箱看看了。
??? 2)核對(duì)BIOS、包裝箱和機(jī)身的序列號(hào):
??? 這一點(diǎn)是至關(guān)重要的,這是保證整機(jī)不被貍貓換太子的非常關(guān)鍵的一步。具體步驟如下:在不插外界電源的情況下開(kāi)機(jī),在出現(xiàn)IBM LOGO的時(shí)候按住F1鍵,在出現(xiàn)的頁(yè)面中找到S/N這一項(xiàng),將其和包裝箱的S/N號(hào)相比較,看看是否吻合,如果吻合,就可以退出BIOS,將機(jī)身反過(guò)來(lái),找到背部的條形碼標(biāo)簽,看看上面的序列號(hào)是否和包裝箱上的相同,如果吻合就可以進(jìn)入系統(tǒng)了。一般情況下,水貨的機(jī)器是已經(jīng)解包的(WIN? XP不經(jīng)過(guò)注冊(cè)就可以進(jìn)行系統(tǒng)),即可以進(jìn)入相對(duì)應(yīng)的操作系統(tǒng)了,這是由于從香港帶過(guò)關(guān)的時(shí)候防止機(jī)器被扣下所作的一些應(yīng)對(duì)措施,如果是這種情況,那么直接點(diǎn)擊開(kāi)始,選擇程序中的ThinkPad Utilities選項(xiàng),點(diǎn)擊控制臺(tái)程序,里面的最后一個(gè)頁(yè)面里也有S/N號(hào),將他和包裝箱的相比較看是否吻合,如果這幾項(xiàng)全部沒(méi)有問(wèn)題,OK,說(shuō)明機(jī)器整體來(lái)看沒(méi)有太大的問(wèn)題。如果說(shuō)系統(tǒng)還沒(méi)有解包,那么先解包再進(jìn)行上面的程序,這一點(diǎn)非常重要,不要因?yàn)橄到y(tǒng)沒(méi)有解包就跳過(guò)這一步,這是不可取的。這一步進(jìn)行完就可以進(jìn)行下一步了。
??? 3)放下機(jī)器,核對(duì)裝箱單
??? 裝箱單一般放在正面打開(kāi)盒子的夾層里面,上面寫(xiě)明了包裝箱內(nèi)的所有物品,包括一些廣告宣傳單,檢查裝箱單就是防止部件被JS克扣的重要環(huán)節(jié),細(xì)心的對(duì)照裝箱單上的所有內(nèi)容,與包裝箱內(nèi)的每一個(gè)部件相對(duì)比,如果缺少任何一個(gè)部件,那么就要和JS交涉了,你的機(jī)器和有可能被JS克扣下某些部件,最容易被克扣的部件是:小紅帽、紅點(diǎn)包。另外,IBM的筆記本沒(méi)有系統(tǒng)恢復(fù)盤(pán),這點(diǎn)和其他品牌的產(chǎn)品有些不同。細(xì)心的對(duì)照完每一項(xiàng)就可以將包裝箱放在一邊來(lái)看機(jī)器了。
??? 4)電池的充電次數(shù)
??? 業(yè)界只有IBM和SONY能夠直接的看到筆記本電腦電池的充電次數(shù),這一點(diǎn)為用戶(hù)提供了不少的方便,并且可以成為我們分辨機(jī)器是否被人使用過(guò)的非常好的辦法,看充電次數(shù)的方法如下:點(diǎn)擊開(kāi)始,選擇程序中的ThinkPad Utilities選項(xiàng),選中BATTERY INFORMATION,點(diǎn)擊Stutas Detail頁(yè)面,其中的Cycle Count就是這塊電池的充電次數(shù),一般來(lái)說(shuō)行貨的電池充電次數(shù)都在0-1次之間,如果超過(guò)這個(gè)數(shù)就可能有問(wèn)題,水貨的話(huà)一般也不能超過(guò)三次,否則的話(huà)也可能有問(wèn)題,如果充電次數(shù)在幾十次,那么看都不要看,這臺(tái)機(jī)器肯定有問(wèn)題
??? 5)查詢(xún)保修日期
??? IBM的機(jī)器一般都帶有1年到3年的保修,這一點(diǎn)是IBM用戶(hù)的便利之處,也是挑機(jī)的時(shí)候非常重要的一步,具體的方法是向JS要一根網(wǎng)線(xiàn)或者電話(huà)線(xiàn),然后到如下網(wǎng)址http://www-3.ibm.com/pc/support/site.wss/warranty/warranty.vm,在打開(kāi)的頁(yè)面中輸入包裝箱上的序列號(hào),即可,你會(huì)看到這臺(tái)機(jī)器的銷(xiāo)售國(guó)家(行貨的話(huà)應(yīng)該寫(xiě)明銷(xiāo)往中國(guó)),還有這臺(tái)機(jī)器的保修截止日期,和機(jī)器被面的機(jī)器出廠日期相對(duì)照,看是否有問(wèn)題,沒(méi)有問(wèn)題的話(huà)就可以下線(xiàn)進(jìn)行下一步了。
??? 6)火眼金睛查壞點(diǎn)
??? 壞點(diǎn)是非常影響屏幕顯示效果的,并且壞點(diǎn)的出現(xiàn)是不可逆的,如何保證自己的機(jī)器沒(méi)有壞點(diǎn)哪,在開(kāi)箱之前其實(shí)就應(yīng)該和JS協(xié)商好,如果出現(xiàn)壞點(diǎn)該如何解決,一般是可以要求換貨,但是行貨可能會(huì)有些不同,一般是壞點(diǎn)的數(shù)量在一定的范圍內(nèi)都屬于正常范圍內(nèi),所以說(shuō)這一步比較適合購(gòu)買(mǎi)水貨的朋友。具體的步驟如下:如果您沒(méi)有做任何準(zhǔn)備,沒(méi)有專(zhuān)用的軟件來(lái)進(jìn)行測(cè)試的話(huà),用肉眼也是完全可以達(dá)到挑選的效果的,首先刪除桌面上的所有快捷方式圖標(biāo),右鍵單擊桌面,選擇屬性,在背景選項(xiàng)中,選擇圖片為無(wú),然后在右下角的顏色中挑選各種顏色,主要要選擇紅白藍(lán)黑綠五中,每切換到一種顏色,就用肉眼仔細(xì)地看屏幕有沒(méi)有和顯示顏色不同的點(diǎn),沒(méi)有的話(huà)就切換到另外一種顏色,直到進(jìn)行完所有的顏色察看。如果您事先準(zhǔn)備了專(zhuān)門(mén)的軟件,比如NOKIA的屏幕測(cè)試程序,就可以直接運(yùn)行提來(lái)進(jìn)行檢測(cè),效果相同。如果幾項(xiàng)測(cè)試中都沒(méi)有發(fā)現(xiàn)壞點(diǎn),那么恭喜您,屏幕比較完美。
??? 7)需要注意的其他事項(xiàng)
??? 以上的這些項(xiàng)目都進(jìn)行完之后就應(yīng)該看看一些小的細(xì)節(jié)了,比如,看看機(jī)器的進(jìn)風(fēng)口有沒(méi)有很多的灰塵,鍵盤(pán)是否有亮光,外殼有沒(méi)有劃傷的痕跡,邊角有沒(méi)有撞痕,外觀方面也就這么多了。如果是光軟互換機(jī)器,就可以抽出光驅(qū),看看光驅(qū)是否全新(主要看鐵板的地方有沒(méi)有手指印),插拔的接口是否很新,沒(méi)問(wèn)題的話(huà)插進(jìn)機(jī)器了,拿張光碟讀一下,將VCD播放的刻度來(lái)回拖一下看反映是否靈敏,如果沒(méi)有問(wèn)題就可以交錢(qián)了,記住要讓JS開(kāi)具一張有公章的收據(jù),寫(xiě)清楚序列號(hào),省得以后麻煩。還有就是要向JS索要境外發(fā)票,一般來(lái)說(shuō)發(fā)票會(huì)在賣(mài)出機(jī)器的半個(gè)月后給你。交完錢(qián)后有可能的話(huà)在JS的賣(mài)場(chǎng)內(nèi)用螺絲刀拆開(kāi)硬盤(pán)和內(nèi)存插槽,看看這兩個(gè)配件上是否有IBM的專(zhuān)用標(biāo)簽和FRU號(hào)碼,如果JS給你的機(jī)器沒(méi)有這兩項(xiàng)的話(huà),就當(dāng)場(chǎng)和他交涉換貨,因?yàn)檫@說(shuō)明這兩個(gè)配件被偷梁換柱了。如果以上的種種都沒(méi)有問(wèn)題,就可以拿機(jī)器走人了,大可不必去繁瑣的測(cè)試USB接口、并口等等I/O接口,一般來(lái)說(shuō)這些部件是不會(huì)出現(xiàn)問(wèn)題的,如果出現(xiàn)問(wèn)題大可以直接拿境外發(fā)票向藍(lán)快要求保修服務(wù)。
??? 相比其他品牌的筆記本電腦,IBM筆記本有著在挑選時(shí)的獨(dú)特優(yōu)勢(shì),比如有軟件的支持和標(biāo)準(zhǔn)的規(guī)則,挑選的時(shí)候只要做到筆者所說(shuō)的這幾點(diǎn),一般都可以買(mǎi)到稱(chēng)心如意的IBM筆記本電腦,但是還是要提醒朋友們的是,心細(xì)才是正確的,切不可麻痹大意。OK,筆者祝大家都能挑選到?jīng)]有任何問(wèn)題的IBM筆記本。
本文是開(kāi)發(fā)基于spring的web應(yīng)用的入門(mén)文章,前端采用Struts MVC框架,中間層采用spring,后臺(tái)采用Hibernate。
本文包含以下內(nèi)容:
·配置Hibernate和事務(wù)
·裝載Spring的applicationContext.xml文件
·建立業(yè)務(wù)層和DAO之間的依賴(lài)關(guān)系
·將Spring應(yīng)用到Struts中
簡(jiǎn)介 這個(gè)例子是建立一個(gè)簡(jiǎn)單的web應(yīng)用,叫MyUsers,完成用戶(hù)管理操作,包含簡(jiǎn)單的數(shù)據(jù)庫(kù)增,刪,查,該即CRUD(新建,訪問(wèn),更新,刪除)操作。這是一個(gè)三層的web應(yīng)用,通過(guò)Action(Struts)訪問(wèn)業(yè)務(wù)層,業(yè)務(wù)層訪問(wèn)DAO。圖一簡(jiǎn)要說(shuō)明了該應(yīng)用的總體結(jié)構(gòu)。圖上的數(shù)字說(shuō)明了流程順序-從web(UserAction)到中間層(UserManager),再到數(shù)據(jù)訪問(wèn)層(UserDAO),然后將結(jié)果返回。
Spring層的真正強(qiáng)大在于它的聲明型事務(wù)處理,幫定和對(duì)持久層支持(例如Hiberate和iBATIS)
以下下是完成這個(gè)例子的步驟:
1. 安裝Eclipse插件
2. 數(shù)據(jù)庫(kù)建表
3. 配置Hibernate和Spring
4. 建立Hibernate DAO接口的實(shí)現(xiàn)類(lèi)
5. 運(yùn)行測(cè)試類(lèi),測(cè)試DAO的CRUD操作
6. 創(chuàng)建一個(gè)處理類(lèi),聲明事務(wù)
7. 創(chuàng)建web層的Action和model
8. 運(yùn)行Action的測(cè)試類(lèi)測(cè)試CRUD操作
9. 創(chuàng)建jsp文件通過(guò)瀏覽器進(jìn)行CRUD操作
10. 通過(guò)瀏覽器校驗(yàn)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ù)庫(kù)建表create table app_user(id number not null primary,firstname vchar(32),lastname vchar(32)); |
新建項(xiàng)目 新建一個(gè)web project,新建后的目錄結(jié)構(gòu)同時(shí)包含了新建文件夾page用于放jsp文件,和源文件夾test用于放junit測(cè)試文件。同時(shí)將用到的包,包括struts,hibernate,spring都導(dǎo)入到lib目錄下。
創(chuàng)建持久層O/R mapping
1. 在src/com.jandar.model下用hibernate插件從數(shù)據(jù)庫(kù)導(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"> <id column="ID" name="id" type="integer" >
<generator class="assigned" />
</id>
<property column="LASTNAME" length="10" name="lastname" not-null="false" type="string" />
<property column="FIRSTNAME" length="10" name="firstname" not-null="true" type="string" />
</class> </hibernate-mapping> |
2. 通過(guò)hibernate synchronizer->synchronizer file生成User.java文件,User對(duì)象對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的app_user表
注:在eclipse下自動(dòng)生成的對(duì)象文件不完全相同,相同的是每個(gè)對(duì)象文件必須實(shí)現(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訪問(wèn)對(duì)象 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); } |
該接口提供了訪問(wèn)對(duì)象的方法,
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 自動(dòng)生成方法存根 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); } } } |
在這個(gè)類(lèi)中實(shí)現(xiàn)了IUserDAO接口的方法,并且繼承了HibernateDAOSupport類(lèi)。這個(gè)類(lèi)的作用是通過(guò)hibernate訪問(wèn)、操作對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
這個(gè)*頭司機(jī)太強(qiáng)勁了,要做生意額朋友好好看看。。。
我要從徐家匯趕去機(jī)場(chǎng),于是匆匆結(jié)束了一個(gè)會(huì)議,在美羅大廈前搜索出租車(chē)。一輛大眾發(fā)現(xiàn)了我,非常專(zhuān)業(yè)的、徑直的停在我的面前。這一停,于是有了后面的這個(gè)讓我深感震撼的故事,象上了一堂生動(dòng)的MBA案例課。為了忠實(shí)于這名出租車(chē)司機(jī)的原意,我憑記憶盡量重復(fù)他原來(lái)的話(huà)。
“去哪里……好的,機(jī)場(chǎng)。我在徐家匯就喜歡做美羅大廈的生意。這里我只做兩個(gè)地方。美羅大廈,均瑤大廈。你知道嗎?接到你之前,我在美羅大廈門(mén)口兜了兩圈,終于被我看到你了!從寫(xiě)字樓里出來(lái)的,肯定去的不近~~~”
“哦?你很有方法嘛!”我附和了一下。
“做出租車(chē)司機(jī),也要用科學(xué)的方法。”他說(shuō)。我一愣,頓時(shí)很有些興趣“什么科學(xué)的方法?”
“要懂得統(tǒng)計(jì)。我做過(guò)精確的計(jì)算。我說(shuō)給你聽(tīng)啊。我每天開(kāi)17個(gè)小時(shí)的車(chē),每小時(shí)成本34.5元……”
“怎么算出來(lái)的?”我追問(wèn)。
“你算啊,我每天要交380元,油費(fèi)大概210元左右。一天17小時(shí),平均每小時(shí)固定成本22元,交給公司,平均每小時(shí)12.5元油費(fèi)。這是不是就是34.5元?”,我有些驚訝。我打了10年的車(chē),第一次聽(tīng)到有出租車(chē)司機(jī)這么計(jì)算成本。以前的司機(jī)都和我說(shuō),每公里成本0.3元,另外每天交多少錢(qián)之類(lèi)的。
“成本是不能按公里算的,只能按時(shí)間算。你看,計(jì)價(jià)器有一個(gè)“檢查”功能。你可以看到一天的詳細(xì)記錄。我做過(guò)數(shù)據(jù)分析,每次載客之間的空駛時(shí)間平均為7分鐘。如果上來(lái)一個(gè)起步價(jià),10元,大概要開(kāi)10分鐘。也就是每一個(gè)10元的客人要花17分鐘的成本,就是9.8元。不賺錢(qián)啊!如果說(shuō)做浦東、杭州、青浦的客人是吃飯,做10元的客人連吃菜都算不上,只能算是撒了些味精。”
強(qiáng)!這位師傅聽(tīng)上去真不象出租車(chē)司機(jī),到象是一位成本核算師。“那你怎么辦呢?”我更感興趣了,繼續(xù)問(wèn)。看來(lái)去機(jī)場(chǎng)的路上還能學(xué)到新東西。
“千萬(wàn)不能被客戶(hù)拉了滿(mǎn)街跑。而是通過(guò)選擇停車(chē)的地點(diǎn),時(shí)間,和客戶(hù),主動(dòng)地決定你要去的地方。”我非常驚訝,這聽(tīng)上去很有意思。“有人說(shuō)做出租車(chē)司機(jī)是靠運(yùn)氣吃飯的職業(yè)。我以為不是。你要站在客戶(hù)的位置上,從客戶(hù)的角度去思考。”這句話(huà)聽(tīng)上去很專(zhuān)業(yè),有點(diǎn)象很多商業(yè)管理培訓(xùn)老師說(shuō)的“putyourselfintoothers\'shoes.”
“給你舉個(gè)例子,醫(yī)院門(mén)口,一個(gè)拿著藥的,一個(gè)拿著臉盆的,你帶哪一個(gè)。”我想了想,說(shuō)不知道。
“你要帶那個(gè)拿臉盆的。一般人病小痛的到醫(yī)院看一看,拿點(diǎn)藥,不一定會(huì)去很遠(yuǎn)的醫(yī)院。拿著臉盆打車(chē)的,那是出院的。住院哪有不死人的?今天二樓的誰(shuí)死了,明天三樓又死了一個(gè)。從醫(yī)院出來(lái)的人通常會(huì)有一種重獲新生的感覺(jué),重新認(rèn)識(shí)生命的意義,健康才最重要。那天這個(gè)說(shuō):走,去青浦。眼睛都不眨一下。你說(shuō)他會(huì)打車(chē)到人民廣場(chǎng),再去做青浦線(xiàn)嗎?絕對(duì)不會(huì)!”
我不由得開(kāi)始佩服。
“再給你舉個(gè)例子。那天人民廣場(chǎng),三個(gè)人在前面招手。一個(gè)年輕女子,拿著小包,剛買(mǎi)完?yáng)|西。還有一對(duì)青年男女,一看就是逛街的。第三個(gè)是個(gè)里面穿絨襯衫的,外面羽絨服的男子,拿著筆記本包。我看一個(gè)人只要3秒鐘。我毫不猶豫地停在這個(gè)男子面前。這個(gè)男的上車(chē)后說(shuō):延安高架、南北高架~~~還沒(méi)說(shuō)后面就忍不住問(wèn),為什么你毫不猶豫地開(kāi)到我面前?前面還有兩個(gè)人,他們要是想上車(chē),我也不好意思和他們搶。我回答說(shuō),中午的時(shí)候,還有十幾分鐘就1點(diǎn)了。那個(gè)女孩子是中午溜出來(lái)買(mǎi)東西的,估計(jì)公司很近;那對(duì)男女是游客,沒(méi)拿什么東西,不會(huì)去很遠(yuǎn);你是出去辦事的,拿著筆記本包,一看就是公務(wù)。而且這個(gè)時(shí)候出去,估計(jì)應(yīng)該不會(huì)近。那個(gè)男的就說(shuō),你說(shuō)對(duì)了,去寶山。”
“那些在超市門(mén)口,地鐵口打車(chē),穿著睡衣的人可能去很遠(yuǎn)嗎?可能去機(jī)場(chǎng)嗎?機(jī)場(chǎng)也不會(huì)讓她進(jìn)啊。”
有道理!我越聽(tīng)越有意思。
“很多司機(jī)都抱怨,生意不好做啊,油價(jià)又漲了啊,都從別人身上找原因。我說(shuō),你永遠(yuǎn)從別人身上找原因,你永遠(yuǎn)不能提高。從自己身上找找看,問(wèn)題出在哪里。”這話(huà)聽(tīng)起來(lái)好熟,好像是“如果你不能改變世界,就改變你自己”,或者StevenCorvey的“影響圈和關(guān)注圈”的翻版。“有一次,在南丹路一個(gè)人攔車(chē),去田林。后來(lái)又有一次,一個(gè)人在南丹路攔車(chē),還是去田林。我就問(wèn)了,怎么你們從南丹路出來(lái)的人,很多都是去田林呢?人家說(shuō),在南丹路有一個(gè)公共汽車(chē)總站,我們都是坐公共汽車(chē)從浦東到這里,然后搭車(chē)去田林的。我恍然大悟。比如你看我們開(kāi)過(guò)的這條路,沒(méi)有寫(xiě)字樓,沒(méi)有酒店,什么都沒(méi)有,只有公共汽車(chē)站,站在這里攔車(chē)的多半都是剛下公共汽車(chē)的,再選擇一條最短路經(jīng)打車(chē)。在這里攔車(chē)的客戶(hù)通常不會(huì)高于15元。”
“所以我說(shuō),態(tài)度決定一切!”我聽(tīng)十幾個(gè)總裁講過(guò)這句話(huà),第一次聽(tīng)出租車(chē)司機(jī)這么說(shuō)。
“要用科學(xué)的方法,統(tǒng)計(jì)學(xué)來(lái)做生意。天天等在地鐵站口排隊(duì),怎么能賺到錢(qián)?每個(gè)月就賺500塊錢(qián)怎么養(yǎng)活老婆孩子?這就是在謀殺啊!慢性謀殺你的全家。要用知識(shí)武裝自己。學(xué)習(xí)知識(shí)可以把一個(gè)人變成聰明的人,一個(gè)聰明的人學(xué)習(xí)知識(shí)可以變成很聰明的人。一個(gè)很聰明的人學(xué)習(xí)知識(shí),可以變成天才。”
“有一次一個(gè)人打車(chē)去火車(chē)站,問(wèn)怎么走。他說(shuō)這么這么走。我說(shuō)慢,上高架,再這么這么走。他說(shuō),這就繞遠(yuǎn)了。我說(shuō),沒(méi)關(guān)系,你經(jīng)常走你有經(jīng)驗(yàn),你那么走50塊,你按我的走法,等里程表50塊了,我就翻表。你只給50快就好了,多的算我的。按你說(shuō)的那么走要50分鐘,我?guī)氵@么走只要25分鐘。最后,按我的路走,多走了4公里,快了25分鐘,我只收了50塊。乘客很高興,省了10元錢(qián)左右。這4公里對(duì)我來(lái)說(shuō)就是1塊多錢(qián)的油錢(qián)。我相當(dāng)于用1元多錢(qián)買(mǎi)了25分鐘。我剛才說(shuō)了,我一小時(shí)的成本34.5塊,我多合算啊!”
“在大眾公司,一般一個(gè)司機(jī)3、4千,拿回家。做的好的大概5千左右。頂級(jí)的司機(jī)大概每月能有7000。全大眾2萬(wàn)個(gè)司機(jī),大概只有2-3個(gè)司機(jī),萬(wàn)里挑一,每月能拿到8000以上。我就是這2-3個(gè)人中間的一個(gè)。而且很穩(wěn)定,基本不會(huì)大的波動(dòng)。”
太強(qiáng)了!到此為止,我越來(lái)越佩服這個(gè)出租車(chē)司機(jī)。
“我常常說(shuō)我是一個(gè)快樂(lè)的車(chē)夫。有人說(shuō),你是因?yàn)橘嵉腻X(qián)多,所以當(dāng)然快樂(lè)。我對(duì)他們說(shuō),你們正好錯(cuò)了。是因?yàn)槲矣锌鞓?lè)、積極的心態(tài),所以賺的錢(qián)多。”
說(shuō)的多好啊!
“要懂得體味工作帶給你的美。堵在人民廣場(chǎng)的時(shí)候,很多司機(jī)抱怨,又堵車(chē)了!真是倒霉。千萬(wàn)不要這樣,用心體會(huì)一下這個(gè)城市的美,外面有很多漂亮的女孩子經(jīng)過(guò),非常現(xiàn)代的高樓大廈,雖然買(mǎi)不起,但是卻可以用欣賞的眼光去享受。開(kāi)車(chē)去機(jī)場(chǎng),看著兩邊的綠色,冬天是白色的,多美啊。再看看里程表,100多了,就更美了!每一樣工作都有她美麗的地方,我們要懂得從工作中體會(huì)這種美麗。”
“我10年前是強(qiáng)生公司的總教練。8年前在公司作過(guò)三個(gè)不同部門(mén)的部門(mén)經(jīng)理。后來(lái)我不干了,一個(gè)月就3、5千塊,沒(méi)意思。就主動(dòng)來(lái)做司機(jī)。我愿意做一個(gè)快樂(lè)的車(chē)夫。哈哈哈哈。”
到了機(jī)場(chǎng),我給他留了一張名片,說(shuō):“你有沒(méi)有興趣這個(gè)星期五,到我辦公室,給微軟的員工講一講你怎么開(kāi)出租車(chē)的?你就當(dāng)打著表,60公里一小時(shí),你講多久,我就付你多少錢(qián)。給我電話(huà)。”
我迫不及待的在飛機(jī)上記錄下他這堂生動(dòng)的MBA課。
工作是生存的飯碗,考研是投資未來(lái)的手段,辭職考研是砸掉飯碗來(lái)?yè)Q取改變?nèi)松\(yùn)的可能機(jī)會(huì)。做任何事都要考慮成本,自費(fèi)讀研總計(jì)十幾萬(wàn)元的經(jīng)濟(jì)成本(包括隱型成本)的巨大壓力讓你在走每一步時(shí)都會(huì)懷疑自己是否踩的塌實(shí)。而由此帶來(lái)的精神壓力曾讓無(wú)數(shù)研友出師未捷身先死。總結(jié)一下很多前輩的經(jīng)驗(yàn)以及自己的教訓(xùn),這里為每一個(gè)在辭職與否的天堂地獄間徘徊的兄弟們提出幾點(diǎn)忠告:
1.關(guān)于動(dòng)機(jī),所有的應(yīng)屆生都把我們辭職的看作最大的對(duì)手,原因是背水一戰(zhàn)的勇氣和置之死地而后生的氣概讓多少漫不經(jīng)心的他們感到畏懼。或者說(shuō)是哀兵必勝的緣故吧。不是說(shuō)動(dòng)機(jī)一定要有多“純”,在我看來(lái),無(wú)論是在原單位混不下去也好,在公司里感到前途無(wú)望也好,畢業(yè)幾年后迫切想回到學(xué)校再讀幾年書(shū)也好……只要你有強(qiáng)烈的改變目前生活狀態(tài)的欲望以及在還看的進(jìn)書(shū)的年紀(jì)在搏一把的勇氣,我想,你已經(jīng)成功了一半。
2.所報(bào)的學(xué)校需量力而行,不是每個(gè)人都能象喬丹一樣飛身扣藍(lán),櫻木花道的小人物上籃也是2分。
3.你說(shuō)你很有激情,這一點(diǎn)我們堅(jiān)信。有激情的人們多的是,關(guān)鍵是這種激情能保持多久。那個(gè)部隊(duì)叫石光榮老爺子用行動(dòng)告訴了我們堅(jiān)忍不拔才是通往成功的人間正道。面對(duì)辭職的壓力請(qǐng)時(shí)刻挺住。
4.對(duì)于所報(bào)專(zhuān)業(yè)是否有錢(qián)途,網(wǎng)友的爭(zhēng)論希望不要引起你情緒的波動(dòng),記住考試和入行還有很長(zhǎng)的路要走。無(wú)聊的單身漢有時(shí)會(huì)美好的遐想未來(lái)的兒子可能會(huì)是個(gè)省長(zhǎng),我們對(duì)此的建議是找到孩子他媽才是當(dāng)務(wù)之及。法碩版有個(gè)著名ID的簽名就是“有前途的不是專(zhuān)業(yè),而是人。”
5.不要真的以為研究生的畢業(yè)證能徹底改變一個(gè)人的命運(yùn),我們只是認(rèn)為增大了這種可能性而已。考試只是考試,命運(yùn)不是一張證書(shū)就能輕易改變的。投資也有虧錢(qián)的風(fēng)險(xiǎn),看看股市就知道了。也許日后你的工作甚至沒(méi)有現(xiàn)在的好,但我相信你的人生境界已經(jīng)上了一層臺(tái)階
6.訂個(gè)學(xué)習(xí)計(jì)劃,雖然你我都知道這東西和那些戒煙計(jì)劃,減肥計(jì)劃一樣,效用并不大,但至少你還能知道考試在幾月進(jìn)行。
7.翻爛教材,所有的教材使用價(jià)值也就6個(gè)月。考完后80%的可能會(huì)被別的要求上進(jìn)的同志借走,而90%的可能這些同志不會(huì)真正看一遍,因?yàn)樗麄円彩呛苊Φ摹?br />
8.養(yǎng)成聽(tīng)課記筆記的好習(xí)慣,網(wǎng)上會(huì)有熱心的網(wǎng)友張貼筆記,不過(guò)雷峰叔叔自己也要考試,我們沒(méi)權(quán)利讓他們堅(jiān)持到底。
9.結(jié)交一些考友,炎熱的夏天,很多人都有聽(tīng)課瞌睡的習(xí)慣。但重要的是我們睡醒了還會(huì)繼續(xù)戰(zhàn)斗,而你的那些考友們至少會(huì)讓你補(bǔ)筆記,或干脆拿針扎醒你。另有他們?cè)冢闩R陣脫逃的可能性會(huì)大幅下降。
10.過(guò)多的輔導(dǎo)書(shū)浪費(fèi)的不是你的金錢(qián),而是你的時(shí)間。當(dāng)然如果你非要看到身邊堆滿(mǎn)了輔導(dǎo)教材,才能心滿(mǎn)意足的看的進(jìn)書(shū)的話(huà)。那還是去買(mǎi)吧,我們知道每個(gè)人都有不同的癖好。
11.翻看歷年考卷往往會(huì)覺(jué)得容易,當(dāng)然等你拿到考卷會(huì)發(fā)現(xiàn)那是一種錯(cuò)覺(jué)。有時(shí)看70年代的英國(guó)足總杯錄象,我都懷疑他們是否干得過(guò)申花,當(dāng)然這也是種錯(cuò)覺(jué)。
12.為了考試你不得不放棄一些娛樂(lè)活動(dòng),這的確應(yīng)該。光榮轉(zhuǎn)業(yè)老兵們都是這樣過(guò)來(lái)的。今年的世青賽,建議只看看中國(guó)隊(duì)的比賽吧,這應(yīng)該是一種愛(ài)國(guó)行為。
13.進(jìn)考場(chǎng)建議帶疊面巾紙,看到綜合題的一剎那,很多同志會(huì)出一身冷汗,很正常,這是一種生理現(xiàn)象。但切記別將汗水留在考卷上,我們已經(jīng)付了考務(wù)費(fèi),沒(méi)必要再白送我們的汗水。
14.考完之后對(duì)答案。有必要嗎?如果很多人和你答案一樣,可能你還是錯(cuò)的,80%的同志是明年還會(huì)回來(lái)的;當(dāng)然更多的可能是答案五花八門(mén),對(duì)此我們的解釋是不幸的家庭各有各的不幸。
15.記住別人的經(jīng)驗(yàn)永遠(yuǎn)是別人的,各人情況不同而已。我朋友的女友看了不下10遍《逆風(fēng)飛揚(yáng)》,最后她還是換了個(gè)有錢(qián)的男友,我們認(rèn)為這可能更適合她飛揚(yáng),畢竟可以順風(fēng),干嗎還要逆風(fēng)。
一、讀大學(xué),究竟讀什么?
大學(xué)生和非大學(xué)生最主要的區(qū)別絕對(duì)不在于是否掌握了一門(mén)專(zhuān)業(yè)技能……一個(gè)經(jīng)過(guò)獨(dú)立思考而堅(jiān)持錯(cuò)誤觀點(diǎn)的人比一個(gè)不假思索而接受正確觀點(diǎn)的人更值得肯定……草木可以在校園年復(fù)一年地生長(zhǎng),而我們卻注定要很快被另外一群人替代……盡管每次網(wǎng)到魚(yú)的不過(guò)是一個(gè)網(wǎng)眼,但要想捕到魚(yú),就必須要編織一張網(wǎng)……
二、人生規(guī)劃:三岔路口的抉擇
不走彎路就是捷徑……仕途,商界,學(xué)術(shù)。在這人生的三岔路口,你將何去何從……與其跟一百個(gè)人去競(jìng)爭(zhēng)五個(gè)職位,不如跟一個(gè)人去競(jìng)爭(zhēng)一個(gè)職位……學(xué)術(shù)精神天然的應(yīng)當(dāng)與塵囂和喧嘩保持足夠的距離……商場(chǎng)不忌諱任何神話(huà)。你也完全可能成為下一個(gè)傳奇……
三、專(zhuān)業(yè)無(wú)冷熱,學(xué)校無(wú)高低
沒(méi)有哪個(gè)用人單位會(huì)認(rèn)為你代表了你的學(xué)校或者你的專(zhuān)業(yè)……既然是概率,就存在不止一種可能性……如果是選擇學(xué)術(shù),冷門(mén)專(zhuān)業(yè)比熱門(mén)專(zhuān)業(yè)更容易獲得成就……跨專(zhuān)業(yè)幾乎早已成為一種流行一種時(shí)尚……大學(xué)之間的實(shí)力之爭(zhēng)到了考研考場(chǎng)和人才市場(chǎng)原來(lái)是那樣的微不足道……
四、不可一業(yè)不專(zhuān),不可只專(zhuān)一業(yè)
千招會(huì),不如一招熟……十個(gè)百分之十并不是百分之百,而是零……在這個(gè)現(xiàn)實(shí)的社會(huì),真正實(shí)現(xiàn)個(gè)人價(jià)值才是最體面最有面子最有尊嚴(yán)的事情……要想知道需要學(xué)什么,最好的方式就是留意招聘信息……很多專(zhuān)業(yè)因?yàn)椴痪邆鋵?zhuān)長(zhǎng)的有效性,所以成為了屠龍之術(shù)……為什么不將“買(mǎi)一送一”的促銷(xiāo)思維運(yùn)用到求職應(yīng)聘的過(guò)程中來(lái)呢……
五、不逃課的學(xué)生不是好學(xué)生
什么課都不逃,跟什么課都逃掉沒(méi)什么兩樣……讀大學(xué),關(guān)鍵是學(xué)會(huì)思考問(wèn)題的方法……逃課沒(méi)有錯(cuò),但是不要逃錯(cuò)課……英語(yǔ)角絕對(duì)不是學(xué)英語(yǔ)的地方……為了英語(yǔ)丟了專(zhuān)業(yè),那就舍本逐末了……招聘單位是用人才的地方,而不是培養(yǎng)人才的地方……既要逃課,又要讓老師給高分……
六、勤工儉學(xué)的辯證法
對(duì)于貧困生來(lái)說(shuō),首先要做的不是掙錢(qián),而是省錢(qián)……大部分女生將電腦當(dāng)成了影碟機(jī),大部分男生將電腦當(dāng)成了游戲機(jī)……在這個(gè)處女膜都可以隨意偽造的年代,還有什么值得輕易相信……態(tài)度決定一切……當(dāng)學(xué)習(xí)下降到次要的地位,大學(xué)生就只能說(shuō)是兼職的學(xué)生了……
七、做事不如做人,人脈決定成敗
學(xué)問(wèn)好不如做事好,做事好不如做人好……會(huì)說(shuō)話(huà),就能減少奮斗三十年……一個(gè)人有多少錢(qián)并不是指他擁有多少錢(qián)的所有權(quán),而是指他擁有多少錢(qián)的使用權(quán)……一個(gè)人賺的錢(qián),12.5%是靠自身的知識(shí),87.5%則來(lái)自人脈關(guān)系……三十歲以前靠專(zhuān)業(yè)賺錢(qián),三十歲以后拿人脈賺錢(qián)……你和世界上的任何一個(gè)人之間只隔著四個(gè)人……
八、互聯(lián)網(wǎng):倚天劍與達(dá)摩克利斯之劍
花兩個(gè)小時(shí)就寫(xiě)出一篇天衣無(wú)縫的優(yōu)秀畢業(yè)論文……在互聯(lián)網(wǎng)領(lǐng)域創(chuàng)業(yè)的技術(shù)門(mén)檻并不高,關(guān)鍵的是市場(chǎng)眼光和營(yíng)銷(xiāo)能力……輕舞飛揚(yáng)已經(jīng)紅顏薄命了,而痞子蔡卻繼續(xù)跟別的女孩發(fā)生著一次又一次的親密接觸……很多大學(xué)生的網(wǎng)友遍布祖國(guó)大江南北,可他們卻從未主動(dòng)向周?chē)娜苏f(shuō)一聲:你好,我們可以聊聊嗎……
九、戀愛(ài):花開(kāi)堪折方須折
愛(ài)情是不期而至的,可以期待,但不可以制造……越是寂寞,越要警惕愛(ài)情……既然單身是可恥的,那西門(mén)慶是不是應(yīng)該被評(píng)為宋朝十大杰出青年……花開(kāi)堪折方須折,莫讓鮮花敗殘枝……一個(gè)有一萬(wàn)塊錢(qián)的人為你花掉一百元,你只占了他的百分之一;而一個(gè)只有十塊錢(qián)的人為你花掉十塊,你就成了他的全部……
十、性:上帝死了,眾神在墮落
愛(ài)要說(shuō),愛(ài)要做……我只有在肉體一下一下的撞擊中才感到快樂(lè)。經(jīng)過(guò)之后,將是更大的寂寞更大的空虛……為何要讓別人的虛榮成為對(duì)自己的傷害……當(dāng)她機(jī)械地躺在床上張開(kāi)雙腿,她的父母正在憧憬著女兒的未來(lái)……一朝春盡紅顏老,花落人亡兩不知……
十一、考研:痛苦的安樂(lè)死
沒(méi)有比浪費(fèi)青春更失敗的事情了……研究生擴(kuò)招的速度是30%,也就意味著碩士學(xué)歷貶值的速度是30%……同樣是付出三年的努力,你可以讓E1的值增加1,也可以讓E2的值增加2甚至增加3……讀完碩士或博士并不等于工作能力更強(qiáng)……面對(duì)13.54萬(wàn)的成本,你還會(huì)毫不猶豫地投資讀研究生嗎……努力就會(huì)有結(jié)果,但不一定是好結(jié)果……
十二、留學(xué):“海龜”變“海帶”
月薪2500元的工作,居然引得三個(gè)“海歸”碩士爭(zhēng)相競(jìng)聘……對(duì)于某些專(zhuān)業(yè)而言,去美國(guó)留學(xué)和去埃塞俄比亞留學(xué)沒(méi)什么兩樣……既然全世界的公司都想到中國(guó)的市場(chǎng)上來(lái)瓜分蛋糕,為什么中國(guó)人還要一門(mén)心思到國(guó)外去留學(xué)然后給外國(guó)人打工……
十三、非統(tǒng)招:養(yǎng)卑照樣處優(yōu)
她在中國(guó)信息產(chǎn)業(yè)界創(chuàng)下了幾項(xiàng)紀(jì)錄。她被稱(chēng)為中國(guó)的“打工皇后”。而她不過(guò)是一名自考大專(zhuān)生……要想把曾經(jīng)輸?shù)舻臇|西贏回來(lái),就必須把自己比別人少付出的努力補(bǔ)上來(lái)……非統(tǒng)招生不但要有一定的實(shí)力,而且必須掌握一定的技巧,做到揚(yáng)長(zhǎng)避短出奇制勝……路在腳下。好走,走好……
十四、畢業(yè):十面埋伏的陷阱
母校不把自己當(dāng)母親,你又何必把自己當(dāng)兒女……聽(tīng)輔導(dǎo)班不過(guò)是花錢(qián)買(mǎi)踏實(shí)……人才市場(chǎng)就是一個(gè)地雷陣……通過(guò)多種方式求職固然沒(méi)有錯(cuò),但是千萬(wàn)不要饑不擇食……只要用人單位一說(shuō)要你交錢(qián),你掉頭就走便是了……這年頭立字尚且不足以為據(jù),更何況一個(gè)口頭約定……
十五、求職:做人不要太厚道
求職簡(jiǎn)歷必須突出自己的核心競(jìng)爭(zhēng)力……求職的時(shí)候大可不必像嚴(yán)守一那樣“有一說(shuō)一”……一個(gè)人說(shuō)假話(huà)并不難,難的是把假話(huà)說(shuō)到底,并且不露一絲破綻……在填寫(xiě)自己的特長(zhǎng)時(shí),一定要盡可能詳細(xì)……一份求職簡(jiǎn)歷只要用一張A4紙做個(gè)表格就足夠了……面試其實(shí)是有規(guī)律的,每次面試的時(shí)候只要背標(biāo)準(zhǔn)答案就行了……
十六、騎一頭能找千里馬的驢
美國(guó)鐵路兩條鐵軌之間的標(biāo)準(zhǔn)距離是4英尺8.5英寸,為什么呢?因?yàn)閮善ヱR臀部之間的寬度是4英尺8.5英寸……垃圾是放錯(cuò)位置的人才……世界上最大的悲劇莫過(guò)于有太多的年輕人從來(lái)沒(méi)有發(fā)現(xiàn)自己真正想做什么……中小型企業(yè)或許能夠讓你得到更充分的鍛煉……從基層做起并不意味著可以從基層的每一個(gè)職位做起……要“錢(qián)途”,更要前途……
十七、寫(xiě)字樓政治:白領(lǐng)必修課
大公司是做人,小公司是做事……職員能否得到提升,很大程度不在于是否努力,而在于老板對(duì)你的賞識(shí)程度……公司的事情和秘密永遠(yuǎn)比你想象的還要復(fù)雜和深?yuàn)W……在適當(dāng)?shù)臅r(shí)候裝糊涂不但是必要的,而且是睿智的……就把你的同事當(dāng)成一群你可以叫得出名字的陌生人好了……
十八、創(chuàng)業(yè):29歲以前做富翁
瘦死的駱駝比馬大……撐死膽大的,餓死膽小的……不再是“大魚(yú)吃小魚(yú)”,而是“快魚(yú)吃慢魚(yú)”……對(duì)于趨勢(shì)的把握是一個(gè)創(chuàng)業(yè)者最重要的能力……高科技行業(yè)留給畢業(yè)生的空間已經(jīng)很小……欲速則不達(dá)。在創(chuàng)業(yè)以前通過(guò)給別人打工而積累經(jīng)驗(yàn)是非常必要的……市場(chǎng)永遠(yuǎn)比產(chǎn)品更重要……錢(qián)不夠花,怎么辦?第一,看菜吃飯;第二,借雞生蛋……