<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    統(tǒng)計(jì)

    IT技術(shù)鏈接

    保險(xiǎn)相關(guān)

    友情鏈接

    基金知識(shí)

    生活相關(guān)

    最新評(píng)論

    #

    模式與框架

    1.什么是模式?
    模式,即pattern,其實(shí)就是解決某一類問題的方法論,你把解決某類問題的方法總結(jié)歸納到理論高度,這就是模式。
     
    Alexander給出的經(jīng)典定義是:每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數(shù)次地使用那些已有的解決方案,無需再重復(fù)相同的工作。

    模式有不同的領(lǐng)域,建筑領(lǐng)域有建筑模式,軟件設(shè)計(jì)領(lǐng)域也有設(shè)計(jì)模式。當(dāng)一個(gè)領(lǐng)域逐漸成熟的時(shí)候,自然會(huì)出現(xiàn)很多模式。

    什么是框架?

    框架,即framework。其實(shí)就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單地說就是使用別人搭建好的舞臺(tái),你來做表演。而且,框架一般是成熟的,不斷升級(jí)的軟件。

    2。為什么要用模式?

    因?yàn)槟J绞且环N指導(dǎo),在一個(gè)良好的指導(dǎo)下,有助于你完成任務(wù),有助于你作出一個(gè)優(yōu)良的設(shè)計(jì)方案,達(dá)到事半功倍的效果。而且會(huì)得到解決問題的最佳辦法。

    為什么要使用框架?

    因?yàn)檐浖到y(tǒng)發(fā)展到今天已經(jīng)很復(fù)雜了,特別是服務(wù)器端軟件,設(shè)計(jì)到的知識(shí),內(nèi)容,問題太多。在某些方面使用別人成熟的框架,就相當(dāng)于讓別人幫你完成一些基礎(chǔ)的工作,你只需要集中精力完成系統(tǒng)業(yè)務(wù)邏輯設(shè)計(jì)。而且框架一般是成熟,穩(wěn)健的,它可以處理系統(tǒng)很多細(xì)節(jié)的問題,比如,事物處理,安全性,數(shù)據(jù)流控制等問題。還有框架一般都是經(jīng)過很多人使用,所以結(jié)構(gòu)很好,所以擴(kuò)展性也好,而且它是不斷升級(jí)的,你可以直接享受別人升級(jí)代碼帶來的好處。

    框架一般處在低層的應(yīng)用平臺(tái)(如J2EE)和高層業(yè)務(wù)邏輯之間的中間層。

    軟件為什么要分層?

    為了實(shí)現(xiàn)“高內(nèi)聚、低耦合”。把問題劃分開來各個(gè)解決,易于控制,易于擴(kuò)展,易于分配資源。。。



    posted @ 2008-10-10 09:39 鴻雁 閱讀(249) | 評(píng)論 (0)編輯 收藏

    Javascript中最常用的55個(gè)經(jīng)典技巧

    1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標(biāo)右鍵
    <table border oncontextmenu=return(false)><td>no</table> 可用于Table

    2. <body onselectstart="return false"> 取消選取、防止復(fù)制

    3. onpaste="return false" 不準(zhǔn)粘貼

    4. oncopy="return false;" oncut="return false;" 防止復(fù)制

    5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址欄前換成自己的圖標(biāo)

    6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖標(biāo)


    7. <input style="ime-mode:disabled"> 關(guān)閉輸入法


    8. 永遠(yuǎn)都會(huì)帶著框架
    <script language="JavaScript"><!--
    if (window == top)top.location.href = "frames.htm"; //frames.htm為框架網(wǎng)頁
    // --></script>


    9. 防止被人frame
    <SCRIPT LANGUAGE=JAVASCRIPT><!--
    if (top.location != self.location)top.location=self.location;
    // --></SCRIPT>


    10. 網(wǎng)頁將不能被另存為
    <noscript><*** src="/*.html>";</***></noscript>


    11. <input type=button value="/查看網(wǎng)頁源代碼
    onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">
    12.刪除時(shí)確認(rèn)
    <a href=""javascript :if(confirm("確實(shí)要?jiǎng)h除嗎?"))location="boos.asp?&areyou=刪除&page=1"">刪除</a>


    13. 取得控件的絕對(duì)位置
    //Javascript
    <script language="Javascript">
    function getIE(e){
    var t=e.offsetTop;
    var l=e.offsetLeft;
    while(e=e.offsetParent){
    t+=e.offsetTop;
    l+=e.offsetLeft;
    }
    alert("top="+t+"/nleft="+l);
    }
    </script>
    //VBScript
    <script language="VBScript"><!--
    function getIE()
    dim t,l,a,b
    set a=document.all.img1
    t=document.all.img1.offsetTop
    l=document.all.img1.offsetLeft
    while a.tagName<>"BODY"
    set a = a.offsetParent
    t=t+a.offsetTop
    l=l+a.offsetLeft
    wend
    msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
    end function
    --></script>


    14. 光標(biāo)是停在文本框文字的最后
    <script language="javascript">
    function cc()
    {
    var e = event.srcElement;
    var r =e.createTextRange();
    r.moveStart("character",e.value.length);
    r.collapse(true);
    r.select();
    }
    </script>
    <input type=text name=text1 value="123" onfocus="cc()">


    15. 判斷上一頁的來源
    javascript :
    document.referrer


    16. 最小化、最大化、關(guān)閉窗口
    <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Minimize"></object>
    <object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
    <param name="Command" value="Maximize"></object>
    <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    <PARAM NAME="Command" value="/Close"></OBJECT>
    <input type=button value="/最小化 onclick=hh1.Click()>
    <input type=button value="/blog/最大化 onclick=hh2.Click()>
    <input type=button value=關(guān)閉 onclick=hh3.Click()>
    本例適用于IE


    17.屏蔽功能鍵Shift,Alt,Ctrl
    <script>
    function look(){
    if(event.shiftKey)
    alert("禁止按Shift鍵!"); //可以換成ALT CTRL
    }
    document.onkeydown=look;
    </script>


    18. 網(wǎng)頁不會(huì)被緩存
    <META HTTP-EQUIV="pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
    <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
    或者<META HTTP-EQUIV="expires" CONTENT="0">


    19.怎樣讓表單沒有凹凸感?
    <input type=text style="""border:1 solid #000000">

    <input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:
    1 solid #000000"></textarea>


    20.<div><span>&<layer>的區(qū)別?
    <div>(division)用來定義大段的頁面元素,會(huì)產(chǎn)生轉(zhuǎn)行
    <span>用來定義同一行內(nèi)的元素,跟<div>的唯一區(qū)別是不產(chǎn)生轉(zhuǎn)行
    <layer>是ns的標(biāo)記,ie不支持,相當(dāng)于<div>


    21.讓彈出窗口總是在最上面:
    <body onblur="this.focus();">


    22.不要滾動(dòng)條?
    讓豎條沒有:
    <body style="overflow:scroll;overflow-y:hidden">
    </body>
    讓橫條沒有:
    <body style="overflow:scroll;overflow-x:hidden">
    </body>
    兩個(gè)都去掉?更簡單了
    <body scroll="no">
    </body>


    23.怎樣去掉圖片鏈接點(diǎn)擊后,圖片周圍的虛線?
    <a href="#" onFocus="this.blur()"><img src="/logo.jpg" border=0></a>


    24.電子郵件處理提交表單
    <form name="form1" method="post" action=mailto:****@***.com
    enctype="text/plain">
    <input type=submit>
    </form>


    25.在打開的子窗口刷新父窗口的代碼里如何寫?
    window.opener.location.reload()


    26.如何設(shè)定打開頁面的大小
    <body onload="top.resizeTo(300,200);">
    打開頁面的位置<body onload="top.moveBy(300,200);">


    27.在頁面中如何加入不是滿鋪的背景圖片,拉動(dòng)頁面時(shí)背景圖不動(dòng)
    <STYLE>
    body
    {background-image:url(/logo.gif); background-repeat:no-repeat;
    background-position:center;background-attachment: fixed}
    </STYLE>


    28. 檢查一段字符串是否全由數(shù)字組成
    <script language="Javascript"><!--
    function checkNum(str){return str.match(//D/)==null}
    alert(checkNum("1232142141"))
    alert(checkNum("123214214a1"))
    // --></script>


    29. 獲得一個(gè)窗口的大小
    document.body.clientWidth; document.body.clientHeight


    30. 怎么判斷是否是字符
    if (/[^/x00-/xff]/g.test(s)) alert("含有漢字");
    else alert("全是字符");


    31.TEXTAREA自適應(yīng)文字行數(shù)的多少
    <textarea rows=1 name=s1 cols=27 onpropertychange
    ="this.style.posHeight=this.scrollHeight">
    </textarea>


    32. 日期減去天數(shù)等于第二個(gè)日期
    <script language=Javascript>
    function cc(dd,dadd)
    {
    //可以加上錯(cuò)誤處理
    var a = new Date(dd)
    a = a.valueOf()
    a = a - dadd * 24 * 60 * 60 * 1000
    a = new Date(a)
    alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
    }
    cc("12/23/2002",2)
    </script>


    33. 選擇了哪一個(gè)Radio
    <HTML><script language="vbscript">
    function checkme()
    for each ob in radio1
    if ob.checked then
    window.alert ob.value
    next
    end function
    </script><BODY>
    <INPUT name="radio1" type="radio" value="/style" checked>Style
    <INPUT name="radio1" type="radio" value="/blog/barcode">Barcode
    <INPUT type="button" value="check" onclick="checkme()">
    </BODY></HTML>


    34.腳本永不出錯(cuò)
    <SCRIPT LANGUAGE="JavaScript">
    <!-- Hide
    function killErrors() {
    return true;
    }
    window.onerror = killErrors;
    // -->
    </SCRIPT>


    35.ENTER鍵可以讓光標(biāo)移到下一個(gè)輸入框
    <input onkeydown="if(event.keyCode==13)event.keyCode=9">


    36. 檢測(cè)某個(gè)網(wǎng)站的鏈接速度:
    把如下代碼加入<body>區(qū)域中:
    <script language=Javascript>
    tim=1
    setInterval("tim++",100)
    b=1
    var autourl=new Array()
    autourl[1]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.njcatv.net"
    autourl[2]="javacool.3322.net"
    autourl[3]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.sina.com.cn"
    autourl[4]="www.nuaa.edu.cn"
    autourl[5]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.cctv.com"
    function butt(){
    ***("<form name=autof>")
    for(var i=1;i<autourl.length;i++)
    ***("<input type=text name=txt"+i+" size=10 value="/測(cè)試中……> =》<input type=text
    name=url"+i+" size=40> =》<input type=button value="/blog/GO
    onclick=window.open(this.form.url"+i+".value)><br>")
    ***("<input type=submit value=刷新></form>")
    }
    butt()
    function auto(url){
    document.forms[0]["url"+b].value=url
    if(tim>200)
    {document.forms[0]["txt"+b].value="/鏈接超時(shí)"}
    else
    {document.forms[0]["txt"+b].value="/blog/時(shí)間"+tim/10+"秒"}
    b++
    }
    function run(){for(var i=1;i<autourl.length;i++)***("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1
    onerror=auto("http://"+autourl+"")>")}
    run()</script>


    37. 各種樣式的光標(biāo)
    auto :標(biāo)準(zhǔn)光標(biāo)
    default :標(biāo)準(zhǔn)箭頭
    hand :手形光標(biāo)
    wait :等待光標(biāo)
    text :I形光標(biāo)
    vertical-text :水平I形光標(biāo)
    no-drop :不可拖動(dòng)光標(biāo)
    not-allowed :無效光標(biāo)
    help :?幫助光標(biāo)
    all-scroll :三角方向標(biāo)
    move :移動(dòng)標(biāo)
    crosshair :十字標(biāo)
    e-resize
    n-resize
    nw-resize
    w-resize
    s-resize
    se-resize
    sw-resize


    38.頁面進(jìn)入和退出的特效
    進(jìn)入頁面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
    推出頁面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">  
    這個(gè)是頁面被載入和調(diào)出時(shí)的一些特效。duration表示特效的持續(xù)時(shí)間,以秒為單位。transition表示使用哪種特效,取值為1-23:
      0 矩形縮小
      1 矩形擴(kuò)大
      2 圓形縮小
      3 圓形擴(kuò)大
      4 下到上刷新
      5 上到下刷新
      6 左到右刷新
      7 右到左刷新
      8 豎百葉窗
      9 橫百葉窗
      10 錯(cuò)位橫百葉窗
      11 錯(cuò)位豎百葉窗
      12 點(diǎn)擴(kuò)散
      13 左右到中間刷新
      14 中間到左右刷新
      15 中間到上下
      16 上下到中間
      17 右下到左上
      18 右上到左下
      19 左上到右下
      20 左下到右上
      21 橫條
      22 豎條
      23 以上22種隨機(jī)選擇一種


    39.在規(guī)定時(shí)間內(nèi)跳轉(zhuǎn)
    <META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">


    40.網(wǎng)頁是否被檢索
    <meta name="ROBOTS" content="屬性值">
      其中屬性值有以下一些:
      屬性值為"all": 文件將被檢索,且頁上鏈接可被查詢;
      屬性值為"none": 文件不被檢索,而且不查詢頁上的鏈接;
      屬性值為"index": 文件將被檢索;
      屬性值為"follow": 查詢頁上的鏈接;
      屬性值為"noindex": 文件不檢索,但可被查詢鏈接;
      屬性值為"nofollow": 文件不被檢索,但可查詢頁上的鏈接。


    41、email地址的分割
    把如下代碼加入<body>區(qū)域中
    <a href="mailto:webmaster@sina.com">webmaster@sina.com</a>


    42、流動(dòng)邊框效果的表格
    把如下代碼加入<body>區(qū)域中
    <SCRIPT>
    l=Array(6,7,8,9,'a','b','b','c','d','e','f')
    Nx=5;Ny=35
    t="<table border=0 cellspacing=0 cellpadding=0 height="+((Nx+2)*16)+"><tr>"
    for(x=Nx;x<Nx+Ny;x++)
    t+="<td width=16 id=a_mo"+x+"> </td>"
    t+="</tr><tr><td width=10 id=a_mo"+(Nx-1)+"> </td><td colspan="+(Ny-2)+" rowspan="+(Nx)+"> </td><td width=16 id=a_mo"+(Nx+Ny)+"></td></tr>"
    for(x=2;x<=Nx;x++)
    t+="<tr><td width=16 id=a_mo"+(Nx-x)+"> </td><td width=16 id=a_mo"+(Ny+Nx+x-1)+"> </td></tr>"
    t+="<tr>"
    for(x=Ny;x>0;x--)
    t+="<td width=16 id=a_mo"+(x+Nx*2+Ny-1)+"> </td>"
    ***(t+"</tr></table>")
    var N=Nx*2+Ny*2
    function f1(y){
    for(i=0;i<N;i++){
    c=(i+y)%20;if(c>10)c=20-c
    document.all["a_mo"+(i)].bgColor=""""#0000"+l[c]+l[c]+"'"}
    y++
    setTimeout('f1('+y+')','1')}
    f1(1)
    </SCRIPT>


    43、JavaScript主頁彈出窗口技巧
    窗口中間彈出
    <script>
    window.open("http://www.cctv.com","","width=400,height=240,top="+(screen.availHeight-240)/2+",left="+(screen.availWidth-400)/2);
    </script>
    ============
    <html>
    <head>
    <script language="LiveScript">
    function WinOpen() {
        msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
        msg.***("<HEAD><TITLE>哈 羅!</TITLE></HEAD>");
        msg.***("<CENTER><H1>酷 斃 了!</H1><h2>這 是<B>JavaScript</B>所 開 的 視 窗!</h2></CENTER>");
    }
    </script>
    </head>
    <body>
    <form>
    <input type="button" name="Button1" value="Push me" onclick="WinOpen()">
    </form>
    </body>
    </html>
    ==============
    一、在下面的代碼中,你只要單擊打開一個(gè)窗口,即可鏈接到賽迪網(wǎng)。而當(dāng)你想關(guān)閉時(shí),只要單擊一下即可關(guān)閉剛才打開的窗口。
      代碼如下:
      <SCRIPT language="JavaScript">
      <!--
      function openclk() {
      another=open('1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>http://www.ccidnet.com','NewWindow');
      }
      function closeclk() {
      another.close();
      }
      //-->
      </SCRIPT>
      <FORM>
      <INPUT TYPE="BUTTON" NAME="open" value="/打開一個(gè)窗口" onClick="openclk()">
      <BR>
      <INPUT TYPE="BUTTON" NAME="close" value="/blog/關(guān)閉這個(gè)窗口" onClick="closeclk()">
      </FORM>
      二、上面的代碼也太靜了,為何不來點(diǎn)動(dòng)感呢?如果能給頁面來個(gè)降落效果那該多好啊!
      代碼如下:
      <script>
      function drop(n) {
      if(self.moveBy){
      self.moveBy (0,-900);
      for(i = n; i > 0; i--){
      self.moveBy(0,3);
      }
      for(j = 8; j > 0; j--){
      self.moveBy(0,j);
      self.moveBy(j,0);
      self.moveBy(0,-j);
      self.moveBy(-j,0);
      }
      }
      }
      </script>
      <body onLoad="drop(300)">
      三、討厭很多網(wǎng)站總是按照默認(rèn)窗口打開,如果你能隨心所欲控制打開的窗口那該多好。
      代碼如下:
      <SCRIPT LANGUAGE="JavaScript">
      <!-- Begin
      function popupPage(l, t, w, h) {
      var windowprops = "location=no,scrollbars=no,menubars=no,toolbars=no,resizable=yes" +
      ",left=" + l + ",top=" + t + ",width=" + w + ",height=" + h;
      var URL = "http://www.80cn.com";
      popup = window.open(URL,"MenuPopup",windowprops);
      }
      // End -->
      </script>
      <table>
      <tr>
      <td>
      <form name=popupform>
      <pre>
      打開頁面的參數(shù)<br>
      離開左邊的距離: <input type=text name=left size=2 maxlength=4> pixels
      離開右邊的距離: <input type=text name=top size=2 maxlength=4> pixels
      窗口的寬度: <input type=text name=width size=2 maxlength=4> pixels
      窗口的高度: <input type=text name=height size=2 maxlength=4> pixels
      </pre>
      <center>
      <input type=button value="打開這個(gè)窗口!" onClick="popupPage(this.form.left.value, this.form.top.value, this.form.width.value,
    this.form.height.value)">
      </center>
      </form>
      </td>
      </tr>
      </table>你只要在相對(duì)應(yīng)的對(duì)話框中輸入一個(gè)數(shù)值即可,將要打開的頁面的窗口控制得很好。


    44、頁面的打開移動(dòng)
    把如下代碼加入<body>區(qū)域中
    <SCRIPT LANGUAGE="JavaScript">
    <!-- Begin
    for (t = 2; t > 0; t--) {
    for (x = 20; x > 0; x--) {
    for (y = 10; y > 0; y--) {
    parent.moveBy(0,-x);
       }
    }
    for (x = 20; x > 0; x--) {
    for (y = 10; y > 0; y--) {
    parent.moveBy(0,x);
       }
    }
    for (x = 20; x > 0; x--) {
    for (y = 10; y > 0; y--) {
    parent.moveBy(x,0);
       }
    }
    for (x = 20; x > 0; x--) {
    for (y = 10; y > 0; y--) {
    parent.moveBy(-x,0);
         }
       }
    }
    //-->
    //   End -->
    </script>


    45、顯示個(gè)人客戶端機(jī)器的日期和時(shí)間
    <script language="LiveScript">
    <!-- Hiding
       today = new Date()
       ***("現(xiàn) 在 時(shí) 間 是: ",today.getHours(),":",today.getMinutes())
       ***("<br>今 天 日 期 為: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
    // end hiding contents -->
    </script>


    46、自動(dòng)的為你每次產(chǎn)生最後修改的日期了:
    <html>
    <body>
    This is a simple HTML- page.
    <br>
    Last changes:
       <script language="LiveScript">
       <!--   hide script from old browsers
         ***(document.lastModified)
       // end hiding contents -->
       </script>
    </body>
    </html>


    47、不能為空和郵件地址的約束:
    <html>
    <head>
    <script language="JavaScript">
    <!-- Hide
    function test1(form) {
       if (form.text1.value == "")
         alert("您 沒 寫 上 任 何 東 西, 請(qǐng) 再 輸 入 一 次 !")
       else {
        alert("嗨 "+form.text1.value+"! 您 已 輸 入 完 成 !");
       }
    }
    function test2(form) {
       if (form.text2.value == "" ||
           form.text2.value.indexOf('@', 0) == -1)
             alert("這 不 是 正 確 的 e-mail address! 請(qǐng) 再 輸 入 一 次 !");
       else alert("您 已 輸 入 完 成 !");
    }
    // -->
    </script>
    </head>
    <body>
    <form name="first">
    Enter your name:<br>
    <input type="text" name="text1">
    <input type="button" name="button1" value="輸 入 測(cè) 試" onClick="test1(this.form)">
    <P>
    Enter your e-mail address:<br>
    <input type="text" name="text2">
    <input type="button" name="button2" value="輸 入 測(cè) 試" onClick="test2(this.form)">
    </body>


    48、跑馬燈
    <html>
    <head>
    <script language="JavaScript">
    <!-- Hide
    var scrtxt="怎麼樣 ! 很酷吧 ! 您也可以試試."+"Here goes your message the visitors to your
    page will "+"look at for hours in pure fascination...";
    var lentxt=scrtxt.length;
    var width=100;
    var pos=1-width;
    function scroll() {
       pos++;
       var scroller="";
       if (pos==lentxt) {
         pos=1-width;
       }
       if (pos<0) {
         for (var i=1; i<=Math.abs(pos); i++) {
           scroller=scroller+" ";}
         scroller=scroller+scrtxt.substring(0,width-i+1);
       }
       else {
         scroller=scroller+scrtxt.substring(pos,width+pos);
       }
       window.status = scroller;
       setTimeout("scroll()",150);
       }
    //-->
    </script>
    </head>
    <body onLoad="scroll();return true;">
    這里可顯示您的網(wǎng)頁 !
    </body>
    </html>


    49、在網(wǎng)頁中用按鈕來控制前頁,后頁和主頁的顯示。
    <html>
    <body>
    <FORM NAME="buttonbar">
          <INPUT TYPE="button" VALUE="Back" onClick="history.back()">
          <INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
          <INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
    </FORM>
    </body>
    </html>
    50、查看某網(wǎng)址的源代碼
    把如下代碼加入<body>區(qū)域中
    <SCRIPT>
    function add()
    {
    var ress=document.forms[0].luxiaoqing.value
    window.location="view-source:"+ress;
    }
    </SCRIPT>
    輸入要查看源代碼的URL地址:
    <FORM><input type="text" name="luxiaoqing" size=40 value="http://"></FORM>
    <FORM><br>
    <INPUT type="button" value="查看源代碼" onClick=add()>
    </FORM>


    51、title顯示日期
    把如下代碼加入<body>區(qū)域中:
    <script language="JavaScript1.2">
    <!--hide
    var isnMonth = new
    Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");
    var isnDay = new
    Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六","星期日");
    today = new Date () ;
    Year=today.getYear();
    Date=today.getDate();
    if (document.all)
    document.title="今天是: "+Year+"年"+isnMonth[today.getMonth()]+Date+"日"+isnDay[today.getDay()]
    //--hide-->
    </script>


    52、顯示所有鏈接
    把如下代碼加入<body>區(qū)域中
    <script language="JavaScript1.2">
    <!--
    function extractlinks(){
    var links=document.all.tags("A")
    var total=links.length
    var win2=window.open("","","menubar,scrollbars,toolbar")
    win2.***("<font size='2'>一共有"+total+"個(gè)連接</font><br>")
    for (i=0;i<total;i++){
    win2.***("<font size='2'>"+links[i].outerHTML+"</font><br>")
    }
    }
    //-->
    </script>
    <input type="button" onClick="extractlinks()" value="顯示所有的連接">


    53、回車鍵換行
    把如下代碼加入<body>區(qū)域中
    <script type="text/javascript">                
    function handleEnter (field, event) {
       var keyCode = event.keyCode ? event.keyCode : event.which ?
    event.which : event.charCode;
       if (keyCode == 13) {
        var i;
        for (i = 0; i < field.form.elements.length; i++)
         if (field == field.form.elements[i])
          break;
        i = (i + 1) % field.form.elements.length;
        field.form.elements[i].focus();
        return false;
       }
       else
       return true;
    }      
    </script>
    <form>
    <input type="text" onkeypress="return handleEnter(this, event)"><br>
    <input type="text" onkeypress="return handleEnter(this, event)"><br>
    <textarea>回車換行


    54、確認(rèn)后提交
    把如下代碼加入<body>區(qū)域中
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function msg(){
    if (confirm("你確認(rèn)要提交嘛!"))
    document.lnman.submit()
    }
    //-->
    </SCRIPT>
    <form name="lnman" method="post" action="">
       <p>
         <input type="text" name="textfield" value="確認(rèn)后提交">
       </p>
       <p>
         <input type="button" name="Submit" value="提交" onclick="msg();">
       </p>
    </form>


    55、改變表格的內(nèi)容
    把如下代碼加入<body>區(qū)域中
    <script ***script>
    var arr=new Array()
    arr[0]="一一一一一";
    arr[1]="二二二二二";
    arr[2]="三三三三三";
    </script>
    <select onchange="zz.cells[this.selectedIndex].innerHTML=arr[this.selectedIndex]">
       <option value=a>改變第一格</option>
       <option value=a>改變第二格</option>
       <option value=a>改變第三格</option>
    </select>
    <table id=zz border=1>
       <tr height=20>
         <td width=150>第一格</td>
    <td width=150>第二格</td>
    <td width=150>第三格</td>
       </tr>
    </table>

    posted @ 2008-10-09 20:10 鴻雁 閱讀(214) | 評(píng)論 (0)編輯 收藏

    struts+spring+hibernate的web應(yīng)用示例

         摘要: struts+spring+hibernate的web應(yīng)用<一> 架構(gòu)搭建 開發(fā)工具: Eclipse 3.2 + NLpack1-eclipse-SDK-3.2.1-win32( 中文語言包 ) 插件: tomcatPluginV31 :用于 tomcat 項(xiàng)目建立和管理。 Properties Editor : struts 中的資源國際化的中文編輯插件,不需要...  閱讀全文

    posted @ 2008-03-01 21:39 鴻雁 閱讀(826) | 評(píng)論 (0)編輯 收藏

    如何查找、刪除表中重復(fù)的記錄

    軟件環(huán)境:

    1Windows NT4.0+ORACLE 8.0.4

    2ORACLE安裝路徑為:C:"ORANT

    問題提出:

    1、當(dāng)我們想要為一個(gè)表創(chuàng)建唯一索引時(shí),如果該表有重復(fù)的記錄,則無法創(chuàng)建成功。

    方法原理:

    1Oracle中,每一條記錄都有一個(gè)rowidrowid在整個(gè)數(shù)據(jù)庫中是唯一的,

      rowid確定了每條記錄是在ORACLE中的哪一個(gè)數(shù)據(jù)文件、塊、行上。

    2、在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中

      那些具有最大rowid的就可以了,其余全部刪除。

    3、以下語句用到了3項(xiàng)技巧:rowid、子查詢、別名。

    實(shí)現(xiàn)方法:

    SQL> create table a (

     2 bm char(4),            --編碼

     3 mc varchar2(20)            --名稱

     4 )

     5 /

    表已建立.

    SQL> insert into a values('1111','1111');

    SQL> insert into a values('1112','1111');

    SQL> insert into a values('1113','1111');

    SQL> insert into a values('1114','1111');

    SQL> insert into a select * from a;

    插入4個(gè)記錄.

    SQL> commit;

    完全提交.

    SQL> select rowid,bm,mc from a;

    ROWID              BM   MC

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

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111

     

    查詢到8記錄.

    查出重復(fù)記錄

    SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

    ROWID              BM   MC

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

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

     

    刪除重復(fù)記錄

    SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

    刪除4個(gè)記錄.

    SQL> select rowid,bm,mc from a;

    ROWID              BM   MC

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

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111

     

    come from :: http://dev.csdn.net/article/59/59333.shtm

    -測(cè)試數(shù)據(jù)

    /*-----------------------------

    select * from tt

    -----------------------------*/

    id          pid        

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

    1           1

    1           1

    2           2

    3           3

    3           3

    3           3

    (所影響的行數(shù)為 6 行)

    首先,如何查詢table中有重復(fù)記錄

    select *,count(1) as rownum

    from tt

    group by id, pid

    having count(1) > 1

    id          pid         rownum     

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

    1           1           2

    3           3           3

     

    (所影響的行數(shù)為 2 行)

    方法一:使用distinct和臨時(shí)表

    if object_id('tempdb..#tmp') is not null

    drop table #tmp

    select distinct * into #tmp from tt

    truncate table tt

    insert into tt select * from #tmp

    方法二:添加標(biāo)識(shí)列

    alter table tt add NewID int identity(1,1)

    go 

    delete from tt where exists(select 1 from tt a where a.newid>tt.newid and tt.id=a.id and tt.pid=a.pid)

    go

    alter table tt drop column NewID

    go

    --測(cè)試結(jié)果

    /*-----------------------------

    select * from tt

    -----------------------------*/

    id          pid        

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

    1           1

    2           2

    3           3

    (所影響的行數(shù)為 3 行)

    *---*-- * 8 8 * * * * 8* * * * 8 8 *

    USE CEO

    CREATE TABLE TT

    (

    TTNO CHAR(4),

    TTNAME VARCHAR(10)

    )

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1424','WHEREIS')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')

    方法二:添加標(biāo)識(shí)列(最有效方法)

    alter table tt add newid2 int identity(1,1)

    go

    delete from tt where exists( select 1 from tt   a where a.newid2>tt.newid2 and tt.ttno=a.ttno and tt.ttname=a.ttname)

    alter table tt drop column newid2

    go

    select * from tt

    posted @ 2008-01-22 01:57 鴻雁 閱讀(294) | 評(píng)論 (0)編輯 收藏

    Java程序員:一刻鐘精通正則表達(dá)式

    開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結(jié)束,以下分別舉例說明:

      "^The": 開頭一定要有"The"字符串;

      "of despair$": 結(jié)尾一定要有"of despair" 的字符串;

      那么,

      "^abc$": 就是要求以abc開頭和以abc結(jié)尾的字符串,實(shí)際上是只有abc匹配。

      "notice": 匹配包含notice的字符串。

      你可以看見如果你沒有用我們提到的兩個(gè)字符(最后一個(gè)例子),就是說 模式(正則表達(dá)式) 可以出現(xiàn)在被檢驗(yàn)字符串的任何地方,你沒有把他鎖定到兩邊。

      接著,說說 '*', '+',和 '?',

      他們用來表示一個(gè)字符可以出現(xiàn)的次數(shù)或者順序. 他們分別表示:

    1.   "zero or more"相當(dāng)于{0,},
    2.   "one or more"相當(dāng)于{1,},
    3.   "zero or one."相當(dāng)于{0,1}, 這里是一些例子:
    4.   "ab*": 和ab{0,}同義,匹配以a開頭,后面可以接0個(gè)或者N個(gè)b組成的字符串("a", "ab", "abbb", 等);
    5.   "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個(gè)b存在 ("ab", "abbb", 等.);
    6.   "ab?":和ab{0,1}同義,可以沒有或者只有一個(gè)b;
    7.   "a?b+$": 匹配以一個(gè)或者0個(gè)a再加上一個(gè)以上的b結(jié)尾的字符串.

      要點(diǎn), '*', '+',和 '?'只管它前面那個(gè)字符.

      你也可以在大括號(hào)里面限制字符出現(xiàn)的個(gè)數(shù),比如

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

      現(xiàn)在我們把一定幾個(gè)字符放到小括號(hào)里,比如:

    1.   "a(bc)*": 匹配 a 后面跟0個(gè)或者一個(gè)"bc";
    2.   "a(bc){1,5}": 一個(gè)到5個(gè) "bc."

      還有一個(gè)字符 '│', 相當(dāng)于OR 操作:

      "hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;

      "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;

      "(a│b)*c": 匹配含有這樣多個(gè)(包括0個(gè))a或b,后面跟一個(gè)c的字符串;

      一個(gè)點(diǎn)('.')可以代表所有的單一字符,不包括"\n"

      如果,要匹配包括"\n"在內(nèi)的所有單個(gè)字符,怎么辦?

      對(duì)了,用'[\n.]'這種模式.

      "a.[0-9]": 一個(gè)a加一個(gè)字符再加一個(gè)0到9的數(shù)字

      "^.{3}$": 三個(gè)任意字符結(jié)尾 .

      中括號(hào)括住的內(nèi)容只匹配一個(gè)單一的字符

      "[ab]": 匹配單個(gè)的 a 或者 b ( 和 "a│b" 一樣);

      "[a-d]": 匹配'a' 到'd'的單個(gè)字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個(gè)大小寫英文

      "^[a-zA-Z]": 匹配以大小寫字母開頭的字符串

      "[0-9]%": 匹配含有 形如 x% 的字符串

      ",[a-zA-Z0-9]$": 匹配以逗號(hào)再加一個(gè)數(shù)字或字母結(jié)尾的字符串

      你也可以把你不想要得字符列在中括號(hào)里,你只需要在總括號(hào)里面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個(gè)百分號(hào)里面有一個(gè)非字母的字符串.

      要點(diǎn):^用在中括號(hào)開頭的時(shí)候,就表示排除括號(hào)里的字符。為了PHP能夠解釋,你必須在這些字符面前后加'',并且將一些字符轉(zhuǎn)義.

      不要忘記在中括號(hào)里面的字符是這條規(guī)路的例外?在中括號(hào)里面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質(zhì) "[*\+?{}.]"匹配含有這些字符的字符串.

      還有,正如regx的手冊(cè)告訴我們: "如果列表里含有 ']', 最好把它作為列表里的第一個(gè)字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一個(gè)范圍的第二個(gè)結(jié)束點(diǎn)[a-d-0-9]中間的‘-’將有效.

      看了上面的例子,你對(duì){n,m}應(yīng)該理解了吧.要注意的是,n和m都不能為負(fù)整數(shù),而且n總是小于m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個(gè)p.

    下面說說以\開頭的

      \b 書上說他是用來匹配一個(gè)單詞邊界,就是...比如've\b',可以匹配love里的ve而不匹配very里有ve

      \B 正好和上面的\b相反.例子我就不舉了

      .....突然想起來....可以到http://www.phpv.net/article.php/251 看看其它用\ 開頭的語法

      好,我們來做個(gè)應(yīng)用:

      如何構(gòu)建一個(gè)模式來匹配 貨幣數(shù)量 的輸入

      構(gòu)建一個(gè)匹配模式去檢查輸入的信息是否為一個(gè)表示money的數(shù)字。我們認(rèn)為一個(gè)表示money的數(shù)量有四種方式: "10000.00" 和 "10,000.00",或者沒有小數(shù)部分, "10000" and "10,000". 現(xiàn)在讓我們開始構(gòu)建這個(gè)匹配模式:

    ^[1-9][0-9]*$

    這是所變量必須以非0的數(shù)字開頭.但這也意味著 單一的 "0" 也不能通過測(cè)試. 以下是解決的方法:

    ^(0│[1-9][0-9]*)$

      "只有0和不以0開頭的數(shù)字與之匹配",我們也可以允許一個(gè)負(fù)號(hào)在數(shù)字之前:

    ^(0│-?[1-9][0-9]*)$

      這就是: "0 或者 一個(gè)以0開頭 且可能 有一個(gè)負(fù)號(hào)在前面的數(shù)字." 好了,現(xiàn)在讓我們別那么嚴(yán)謹(jǐn),允許以0開頭.現(xiàn)在讓我們放棄 負(fù)號(hào) , 因?yàn)槲覀冊(cè)诒硎惧X幣的時(shí)候并不需要用到. 我們現(xiàn)在指定 模式 用來匹配小數(shù)部分:

    ^[0-9]+(\.[0-9]+)?$

      這暗示匹配的字符串必須最少以一個(gè)阿拉伯?dāng)?shù)字開頭. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道為什么嗎)

    ^[0-9]+(\.[0-9]{2})?$

      我們上面指定小數(shù)點(diǎn)后面必須有兩位小數(shù).如果你認(rèn)為這樣太苛刻,你可以改成:

    ^[0-9]+(\.[0-9]{1,2})?$

      這將允許小數(shù)點(diǎn)后面有一到兩個(gè)字符. 現(xiàn)在我們加上用來增加可讀性的逗號(hào)(每隔三位), 我們可以這樣表示:

    ^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})?$

      不要忘記 '+' 可以被 '*' 替代 如果你想允許空白字符串被輸入話 (為什么?). 也不要忘記反斜桿 ’\’ 在php字符串中可能會(huì)出現(xiàn)錯(cuò)誤 (很普遍的錯(cuò)誤).

      現(xiàn)在,我們已經(jīng)可以確認(rèn)字符串了, 我們現(xiàn)在把所有逗號(hào)都去掉 str_replace(",", "", $money) 然后在把類型看成 double然后我們就可以通過他做數(shù)學(xué)計(jì)算了.

    再來一個(gè):

      構(gòu)造檢查email的正則表達(dá)式

      在一個(gè)完整的email地址中有三個(gè)部分:

      1. 用戶名 (在 '@' 左邊的一切),

      2.'@',

      3. 服務(wù)器名(就是剩下那部分).

      用戶名可以含有大小寫字母阿拉伯?dāng)?shù)字,句號(hào) ('.'), 減號(hào)('-'), and 下劃線 ('_'). 服務(wù)器名字也是符合這個(gè)規(guī)則,當(dāng)然下劃線除外.

      現(xiàn)在, 用戶名的開始和結(jié)束都不能是句點(diǎn). 服務(wù)器也是這樣. 還有你不能有兩個(gè)連續(xù)的句點(diǎn)他們之間至少存在一個(gè)字符,好現(xiàn)在我們來看一下怎么為用戶名寫一個(gè)匹配模式:

    ^[_a-zA-Z0-9-]+$

      現(xiàn)在還不能允許句號(hào)的存在. 我們把它加上:

    ^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$

      上面的意思就是說: "以至少一個(gè)規(guī)范字符(除了.)開頭,后面跟著0個(gè)或者多個(gè)以點(diǎn)開始的字符串."

      簡單化一點(diǎn), 我們可以用 eregi()取代 ereg().eregi()對(duì)大小寫不敏感, 我們就不需要指定兩個(gè)范圍 "a-z" 和 "A-Z" ? 只需要指定一個(gè)就可以了:

    ^[_a-z0-9-]+(\.[_a-z0-9-]+)*$

      后面的服務(wù)器名字也是一樣,但要去掉下劃線:

    ^[a-z0-9-]+(\.[a-z0-9-]+)*$

      好. 現(xiàn)在只需要用”@”把兩部分連接:

    ^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$

      這就是完整的email認(rèn)證匹配模式了,只需要調(diào)用

    eregi(‘^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$ ’,$eamil)

      就可以得到是否為email了.


    正則表達(dá)式的其他用法

      提取字符串

      ereg() and eregi() 有一個(gè)特性是允許用戶通過正則表達(dá)式去提取字符串的一部分(具體用法你可以閱讀手冊(cè)). 比如說,我們想從 path/URL 提取文件名 ? 下面的代碼就是你需要:

    ereg("([^\\/]*)$", $pathOrUrl, $regs);
    echo $regs[1];

      高級(jí)的代換

      ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負(fù)號(hào)都替換成逗號(hào):

    ereg_replace("[ \n\r\t]+", ",", trim($str));

      最后,我把另一串檢查EMAIL的正則表達(dá)式讓看文章的你來分析一下.

    "^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$"

      如果能方便的讀懂,那這篇文章的目的就達(dá)到了.

    posted @ 2008-01-16 15:59 鴻雁 閱讀(292) | 評(píng)論 (0)編輯 收藏

    Hibernate3調(diào)用存儲(chǔ)過程用法

    DB2中簡單存儲(chǔ)過程 selectAllUsers

    CREATE procedure selectAllUsers
    DYNAMIC RESULT SETS 1
    BEGIN
    DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR
    SELECT * FROM test;
    OPEN temp_cursor1;
    END;

    映射文件中關(guān)于存儲(chǔ)過程內(nèi)容如下

    <hibernate-mapping package="com.unmi.vo">
    <class name="Test" table="TEST">
         ............
    </class>

    <sql-query callable="true" name="selectAllUsers">
    <return alias="aa" class="Test">
    <return-property name="oborqt" column="OBORQT"/>
    <return-property name="moorqt" column="MOORQT"/>
    <return-property name="roschn" column="ROSCHN"/>
    <return-property name="plandate" column="PLANDATE"/>
    </return>
    { ? = call selectAllUsers() }
    </sql-query>
    </hibernate-mapping>

    { ? = call selectAllUsers() } 也可以寫成{ call selectAllUsers() },
    如果有參數(shù)就寫成
    { ? = call selectAllUsers(?,?,?) }
    代碼中對(duì)query設(shè)置相應(yīng)位置上的值就OK

    Java調(diào)用關(guān)鍵代碼如下

    Session session = HibernateUtil.currentSession();
    Query query = session.getNamedQuery("selectAllUsers");
    List list = query.list();
    System.out.println(list);

    要求你的存儲(chǔ)過程必須能返回記錄集,否則要出錯(cuò)
    如果你的存儲(chǔ)過程是完成非查詢?nèi)蝿?wù)就應(yīng)該在配置文件用以下三個(gè)標(biāo)簽
    <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
    <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
    <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>

    posted @ 2008-01-11 18:31 鴻雁 閱讀(271) | 評(píng)論 (0)編輯 收藏

    數(shù)字智力測(cè)試題

    ——此文章摘自《Java程序員面試寶典》定價(jià):46元 特價(jià):38.9元 購買>>

        回答智力測(cè)試的一些基本方法如下。
        (1)排除法
        把一些無關(guān)的問題先予以排除,可以確定的問題先確定,盡可能縮小未知的范圍,以便于問題的分析和解決。這種思維方式在我們的工作和生活中都是很有用處的。

        (2)遞推法
        由已知條件層層向下分析,要確保每一步都能準(zhǔn)確無誤。可能會(huì)有幾個(gè)分支,應(yīng)本著先易后難的原則,先從簡單的一支入手。

        (3)倒推法
        從問題最后的結(jié)果開始,一步一步往前推,直到求出問題的答案。有些問題用此法解起來很簡單,如用其他方法則很難。

        (4)假設(shè)法
        對(duì)給定的問題,先做一個(gè)或一些假設(shè),然后根據(jù)已給的條件進(jìn)行分析,如果出現(xiàn)與題目給的條件有矛盾的情況,說明假設(shè)錯(cuò)誤,可再做另一個(gè)或另一些假設(shè)。如果結(jié)果只有兩種可能,那么問題就已經(jīng)解決了。在科學(xué)史上,“假設(shè)”曾起了極大的作用。

        (5)計(jì)算法
        有些問題必須經(jīng)計(jì)算才能解決。要注意的是,智力測(cè)驗(yàn)中的問題往往含有隱含的條件,有時(shí)給出的數(shù)是無用的。

        (6)分析法
        這是最基本的方法。各種方法常常要用到分析法。可以說,分析能力的高低,是一個(gè)人的智力水平的體現(xiàn)。分析能力不僅是先天性的,在很大程度上取決于后天的訓(xùn)練,應(yīng)養(yǎng)成對(duì)客觀事物進(jìn)行分析的良好習(xí)慣。

        (7)作圖法
        根據(jù)問題中已知的條件,采用適當(dāng)?shù)姆椒ó嫵鰣D形,有助于問題的解決。有些問題,在沒畫圖之前,會(huì)覺得無處下手,畫了圖后就一目了然了。

        (8)綜合法
        事實(shí)上,許多問題都要運(yùn)用幾種不同的方法才能解決。所謂綜合法,就是綜合各種方法(包括前述各種方法以外的方法)去解決某些問題。

        面試?yán)}1:100美元哪里去了?

        3個(gè)朋友住進(jìn)了一家賓館。結(jié)賬時(shí),賬單總計(jì)3 000美元。3個(gè)朋友每人分?jǐn)? 000美元,并把這3 000美元如數(shù)交給了服務(wù)員,委托他代到總臺(tái)交賬。但在交賬時(shí),正逢賓館實(shí)施價(jià)格優(yōu)惠,總臺(tái)退還給服務(wù)員500美元,實(shí)收2 500美元。服務(wù)員從這500美元退款中扣下了200美元,只退還3個(gè)客人300美元。3個(gè)客人平分了這300美元,每人取回了100美元。這樣,3個(gè)客人每人實(shí)際支付900美元,共支付2 700美元,加上服務(wù)員扣的200美元,共計(jì)2 900美元,那么這100美元的差額到哪里去了?

        答案:這道題純粹是文字游戲,但是如果你的頭腦不夠清晰,很可能把你搞糊涂了。客人實(shí)際支付2 700美元,就等于總臺(tái)實(shí)際結(jié)收的2 500美元加上服務(wù)員克扣的200美元。在這2 700美元上加上200美元是毫無道理的,而在這2 700美元上加退回的300美元,這是有道理的,因?yàn)檫@等于客人原先交給服務(wù)員的3 000美元。

        面試?yán)}2:擊鼠標(biāo)比賽現(xiàn)在開始!參賽者有拉爾夫、威利和保羅。

        拉爾夫10秒鐘能擊10下鼠標(biāo),威利20秒鐘能擊20下鼠標(biāo),保羅5秒鐘能擊5下鼠標(biāo)。以上各人所用的時(shí)間是這樣計(jì)算的:從第一擊開始,到最后一擊結(jié)束。

        他們是否打平手?如果不是,誰最先擊完40下鼠標(biāo)?

        解析:n秒鐘擊n下鼠標(biāo)其實(shí)是擊第一下鼠標(biāo)時(shí)才開始計(jì)時(shí)的,實(shí)際上擊n-1下需要n秒鐘,那么若擊40下鼠標(biāo),拉爾夫需要(40-1)/(9/10)=39/0.9秒,威利需要(40-1)/(19/20)=39/0.95秒,保羅需要(40-1)/(4/5)=39/0.8秒,因此威利先擊完。

        答案:威利先擊完。

        面試?yán)}3:父親打電話給女兒,要她替自己買一些生活用品,同時(shí)告訴她,錢放在書桌上的一個(gè)信封里。女兒找到信封,看見上面寫著98,以為信封內(nèi)有98元,就把錢拿出來,數(shù)也沒數(shù)放進(jìn)書包里。在商店里,她買了90元的東西,付款時(shí)才發(fā)現(xiàn),她不僅沒有剩下8元,反而差了4元。回到家里,她把這事告訴了父親,懷疑父親把錢點(diǎn)錯(cuò)了。父親笑著說,他并沒有數(shù)錯(cuò),錯(cuò)在女兒身上。

        問:女兒錯(cuò)在什么地方?

        答案:拿倒了,86看成是98了。

        面試?yán)}4:3個(gè)孩子翻衣兜,他們把兜里所有的錢都掏出來,看看一共有多少錢。結(jié)果一共有320日元。其中有兩枚硬幣是100日元的,兩枚是50日元的,兩枚是10日元的。每一個(gè)孩子所帶的硬幣中沒有相同的。而且,沒帶100日元硬幣的孩子也沒帶10日元的硬幣,沒帶50日元硬幣的孩子也沒帶100日元的硬幣。你能弄清楚這3個(gè)日本孩子原來各自帶了什么硬幣嗎?

        答案:第一個(gè)小孩:100,50,10;第二個(gè)小孩:100,50;第三個(gè)小孩:10。

        面試?yán)}5:有一種小蟲,每隔2秒鐘分裂一次。分裂后的2只新的小蟲經(jīng)過2秒鐘后又會(huì)分裂。如果最初某瓶中只有一只小蟲,那么2秒后變2只,再過2秒后就變4只……2分鐘后,正好滿滿一瓶小蟲。假設(shè)這個(gè)瓶內(nèi)最初放入2只這樣的小蟲。

        問:經(jīng)過多少時(shí)間后,正巧也是滿滿的一瓶?

        答案:經(jīng)過1分58秒時(shí)間,也正巧是滿滿一瓶。因?yàn)閺囊恢幌x蛻變?yōu)?只蟲只需2秒鐘。在瓶內(nèi)只有一只蟲子的情況下,經(jīng)過2秒鐘后就變成2只。這時(shí)的情況和瓶內(nèi)一開始就有2只蟲子的情況是一樣的。出現(xiàn)這兩種情況的時(shí)間差是2秒鐘。所以,經(jīng)過1分58秒后,也正好是滿滿一瓶。

        面試?yán)}6:斯芬克斯是古代希臘神話中的帶翅膀的獅子女魔。傳說她在底比斯附近要人猜謎,猜不出來就要?dú)⑷恕R淮危妆人雇踝硬轮i:“有一種動(dòng)物,早上4條腿,中午2條腿,晚上3條腿,是什么動(dòng)物?”聰明的王子說:“是人。”他猜中了。

        如果你是現(xiàn)代的斯芬克斯,會(huì)提出什么樣的問題呢?比如,1和0之間加上什么符號(hào)才可以使得到的數(shù)比0大又比1小呢?你知道嗎?

        答案:0.1

        面試?yán)}7:你讓工人為你工作7天,給工人的回報(bào)是一根金條。金條平分成相連的7段,你必須在每天結(jié)束時(shí)給他們一段金條,如果只許你兩次把金條弄斷,你如何給你的工人付費(fèi)?你讓工人為你工作7天,給工人的回報(bào)是一根金條。金條平分成相連的7段,你必須在每天結(jié)束時(shí)給他們一段金條,如果只許你兩次把金條弄斷,你如何給你的工人付費(fèi)?

        答案:兩次弄斷就應(yīng)分成三份,我把金條分成1/7、2/7和4/7三份。這樣,第1天我就可以給他1/7;第2天我給他2/7,讓他找回我1/7;第3天我就再給他1/7,加上原先的2/7就是3/7;第4天我給他那塊4/7,讓他找回那兩塊1/7和2/7的金條;第5天,再給他1/7;第6天和第2天一樣;第7天給他找回的那個(gè)1/7。

         面試題8:對(duì)一批編號(hào)為1-100全部開關(guān)朝上(開)的燈進(jìn)行以下操作:凡是1的倍數(shù)反方向撥一次開關(guān);2的倍數(shù)反方向又撥一次開關(guān);3的倍數(shù)反方向又撥一次開關(guān)。。。。。問:最后為關(guān)熄狀態(tài)的燈的編號(hào)。    
       
      答案:  
      1,4,9,16,25,36,47,64,81,100關(guān) 

         面試題9:  
      小明和小強(qiáng)都是王老師的學(xué)生。王老師的生日是m月n日,2人都指導(dǎo)王老師的生日是下列10組中的一天,王老師把m值告訴了小明,把n值告訴了小強(qiáng)。王老師文他們知道他的生日是那一天嗎?  
      3月4   日,3月5   日,3月9   日  
      6月   4日,6月   7日  
      9月   1日,9月   5日  
      12月   1日,12月   2日,12月   8日  
      小明說:我不知道的話,小強(qiáng)肯定也不知道  
      小強(qiáng)說:笨來我不知道,但是現(xiàn)在我知道了  
      小明說:哦,那我也知道了  
      情根據(jù)上面的對(duì)話推斷出王老師的生日是哪一天?
      
       答案:9月1號(hào)準(zhǔn)沒錯(cuò)  
      首先小明是不知道的,所以不可能在某月的   2號(hào),7號(hào),8號(hào),9號(hào).去掉一些日子后;簡化如下  
      3月4   日,3月5   日,  
      6月   4日,  
      9月   1日,9月   5日  
      12月   1日,  
      小強(qiáng)說他不知道,小明也不會(huì)知道.即小強(qiáng)知道的月數(shù)不會(huì)在有   2號(hào),7號(hào),8號(hào),9號(hào)   的這些月數(shù),因?yàn)槿绻谶@些月數(shù),小明是有可能知道的.最后只剩下   9月1日   和   9月5日.  
      這時(shí)候小明也清楚M是9月了,小強(qiáng)也因此知道N是1號(hào).   


         神的交通工具是什么------神奇(騎)寶貝
      什么動(dòng)物可以貼在墻上------海豹(報(bào))
      什么顏色最會(huì)模仿------紅(磨坊)模仿
      什么雞最慢------尼可基(雞)曼
      辣妹什么地方最香------臘梅處處香
      哪位古人跑得最快------曹操(說曹操曹操就到)
      什么動(dòng)物沒有方向感------麋鹿(迷路)
      茉莉花、太陽花、玫瑰花,哪一朵花最沒力------茉莉花[好一朵美麗(沒力)的茉莉花]
      猴子最付厭什么錢------平行線[沒有相交(香蕉)]
      象皮、老虎皮、獅子つ囊桓霰冉喜?-----象皮擦(象皮差)
      木魚掉進(jìn)海里會(huì)變成什么------虱目魚(濕木魚)
      哪一位藝人講的笑話最冷------蔡依琳(衣淋濕就冷)
      狼、老虎和獅子誰玩游戲一定會(huì)被淘汰------狼,桃太郎(淘汰狼)
      孔子有三位徒弟子貢、子路和子游,請(qǐng)問哪一位不是人------子路(指鹿為馬)
      布跟紙怕什么------不怕一萬只怕萬一 (布怕一萬紙怕萬一)
      麒麟飛到北極會(huì)變成什么------冰淇淋(冰麒麟)
      哪個(gè)歷史人物游泳必定沉下去------阿斗,扶(浮)不起的阿斗
      星星、月亮、太陽哪一個(gè)是啞巴------星星,歌中有「天上的星星不說話 」
      鉛筆姓什么------蕭,削(蕭)鉛筆
      糖果是公的還是母的------母的,因?yàn)樗鼤?huì)生螞蟻
      請(qǐng)問哪一種花沒有孩子------五月花, 五月花衛(wèi)生紙(未生子)
      左和右,誰喜歡獨(dú)奏,誰又比較好------左solo, 右so good (左手鑼,右手鼓)
      為什么蠶寶寶很有錢------蠶會(huì)結(jié)繭(節(jié)儉)
      周瑜與諸葛亮的母親分別姓什么------[既]生瑜,[何]生亮
      和誰交往最辛苦------莉莉,粒粒(莉莉)皆辛苦
      蝴蝶、螞蟻、蜘蛛、蜈蚣,哪一個(gè)沒有領(lǐng)到酬勞------蜈蚣,無功(蜈蚣)不受祿
      哪位歷史人物最欠扁------蘇武,蘇武牧羊北海邊(被海扁)
      123456789哪個(gè)數(shù)字最勤勞,哪個(gè)數(shù)字最懶惰------1最勤勞2最懶惰(一不做二不休)
      誰家沒有電話------天衣(天衣無縫 phone)
      怎樣使麻雀安靜下來------壓它一下(鴉雀無聲)
      哪一家的路最窄------冤家(冤家路窄)
      紅豆的小孩是誰------南國(紅豆生南國)
      有位媽媽生了連體嬰,姐姐叫瑪麗,那么妹妹叫什么------夢(mèng)露,瑪麗蓮(連)夢(mèng)露

    posted @ 2008-01-05 15:05 鴻雁 閱讀(1688) | 評(píng)論 (0)編輯 收藏

    常用正則表達(dá)式


    正則表達(dá)式用于字符串處理、表單驗(yàn)證等場(chǎng)合,實(shí)用高效。現(xiàn)將一些常用的表達(dá)式收集于此,以備不時(shí)之需。

    匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]
    評(píng)注:匹配中文還真是個(gè)頭疼的事,有了這個(gè)表達(dá)式就好辦了

    匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
    評(píng)注:可以用來計(jì)算字符串的長度(一個(gè)雙字節(jié)字符長度計(jì)2,ASCII字符計(jì)1)

    匹配空白行的正則表達(dá)式:\n\s*\r
    評(píng)注:可以用來刪除空白行

    匹配HTML標(biāo)記的正則表達(dá)式:<(\S*?)[^>]*>.*?</\1>|<.*? />
    評(píng)注:網(wǎng)上流傳的版本太糟糕,上面這個(gè)也僅僅能匹配部分,對(duì)于復(fù)雜的嵌套標(biāo)記依舊無能為力

    匹配首尾空白字符的正則表達(dá)式:^\s*|\s*$
    評(píng)注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達(dá)式

    匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    評(píng)注:表單驗(yàn)證時(shí)很實(shí)用

    匹配網(wǎng)址URL的正則表達(dá)式:[a-zA-z]+://[^\s]*
    評(píng)注:網(wǎng)上流傳的版本功能很有限,上面這個(gè)基本可以滿足需求

    匹配帳號(hào)是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    評(píng)注:表單驗(yàn)證時(shí)很實(shí)用

    匹配國內(nèi)電話號(hào)碼:\d{3}-\d{8}|\d{4}-\d{7}
    評(píng)注:匹配形式如 0511-4405222 或 021-87888822

    匹配騰訊QQ號(hào):[1-9][0-9]{4,}
    評(píng)注:騰訊QQ號(hào)從10000開始

    匹配中國郵政編碼:[1-9]\d{5}(?!\d)
    評(píng)注:中國郵政編碼為6位數(shù)字

    匹配身份證:\d{15}|\d{18}
    評(píng)注:中國的身份證為15位或18位

    匹配ip地址:\d+\.\d+\.\d+\.\d+
    評(píng)注:提取ip地址時(shí)有用

    匹配特定數(shù)字:
    ^[1-9]\d*$    //匹配正整數(shù)
    ^-[1-9]\d*$   //匹配負(fù)整數(shù)
    ^-?[1-9]\d*$   //匹配整數(shù)
    ^[1-9]\d*|0$  //匹配非負(fù)整數(shù)(正整數(shù) + 0)
    ^-[1-9]\d*|0$   //匹配非正整數(shù)(負(fù)整數(shù) + 0)
    ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮點(diǎn)數(shù)
    ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配負(fù)浮點(diǎn)數(shù)
    ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮點(diǎn)數(shù)
    ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非負(fù)浮點(diǎn)數(shù)(正浮點(diǎn)數(shù) + 0)
    ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮點(diǎn)數(shù)(負(fù)浮點(diǎn)數(shù) + 0)
    評(píng)注:處理大量數(shù)據(jù)時(shí)有用,具體應(yīng)用時(shí)注意修正

    匹配特定字符串:
    ^[A-Za-z]+$  //匹配由26個(gè)英文字母組成的字符串
    ^[A-Z]+$  //匹配由26個(gè)英文字母的大寫組成的字符串
    ^[a-z]+$  //匹配由26個(gè)英文字母的小寫組成的字符串
    ^[A-Za-z0-9]+$  //匹配由數(shù)字和26個(gè)英文字母組成的字符串
    ^\w+$  //匹配由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串
    評(píng)注:最基本也是最常用的一些表達(dá)式

    原載地址:http://lifesinger.3322.org/myblog/?p=185

    posted @ 2007-12-24 00:02 鴻雁 閱讀(396) | 評(píng)論 (0)編輯 收藏

    數(shù)據(jù)庫和數(shù)據(jù)倉庫的區(qū)別

    數(shù)據(jù)庫是面向事務(wù)的設(shè)計(jì),數(shù)據(jù)倉庫是面向主題設(shè)計(jì)的。數(shù)據(jù)庫一般存儲(chǔ)在線交易數(shù)據(jù),數(shù)據(jù)倉庫存儲(chǔ)的一般是歷史數(shù)據(jù)。

    數(shù)據(jù)庫設(shè)計(jì)是盡量避免冗余,一般采用符合范式的規(guī)則來設(shè)計(jì),數(shù)據(jù)倉庫在設(shè)計(jì)是有意引入冗余,采用反范式的方式來設(shè)計(jì)。

    數(shù)據(jù)庫是為捕獲數(shù)據(jù)而設(shè)計(jì),數(shù)據(jù)倉庫是為分析數(shù)據(jù)而設(shè)計(jì),它的兩個(gè)基本的元素是維表和事實(shí)表。(維是看問題的角度,比如時(shí)間,部門,維表放的就是這些東西的定義,事實(shí)表里放著要查詢的數(shù)據(jù),同時(shí)有維的ID)

    數(shù)據(jù)倉庫,是在數(shù)據(jù)庫已經(jīng)大量存在的情況下,為了進(jìn)一步挖掘數(shù)據(jù)資源、為了決策需要而產(chǎn)生的,它決不是所謂的“大型數(shù)據(jù)庫”。那么,數(shù)據(jù)倉庫與傳統(tǒng)數(shù)據(jù)庫比較,有哪些不同呢?讓我們先看看W.H.Inmon關(guān)于數(shù)據(jù)倉庫的定義:面向主題的、集成的、與時(shí)間相關(guān)且不可修改的數(shù)據(jù)集合。

    “面向主題的”:傳統(tǒng)數(shù)據(jù)庫主要是為應(yīng)用程序進(jìn)行數(shù)據(jù)處理,未必按照同一主題存儲(chǔ)數(shù)據(jù);數(shù)據(jù)倉庫側(cè)重于數(shù)據(jù)分析工作,是按照主題存儲(chǔ)的。這一點(diǎn),類似于傳統(tǒng)農(nóng)貿(mào)市場(chǎng)與超市的區(qū)別—市場(chǎng)里面,白菜、蘿卜、香菜會(huì)在一個(gè)攤位上,如果它們是一個(gè)小販賣的;而超市里,白菜、蘿卜、香菜則各自一塊。也就是說,市場(chǎng)里的菜(數(shù)據(jù))是按照小販(應(yīng)用程序)歸堆(存儲(chǔ))的,超市里面則是按照菜的類型(同主題)歸堆的。

    “與時(shí)間相關(guān)”:數(shù)據(jù)庫保存信息的時(shí)候,并不強(qiáng)調(diào)一定有時(shí)間信息。數(shù)據(jù)倉庫則不同,出于決策的需要,數(shù)據(jù)倉庫中的數(shù)據(jù)都要標(biāo)明時(shí)間屬性。決策中,時(shí)間屬性很重要。同樣都是累計(jì)購買過九車產(chǎn)品的顧客,一位是最近三個(gè)月購買九車,一位是最近一年從未買過,這對(duì)于決策者意義是不同的。

    “不可修改”:數(shù)據(jù)倉庫中的數(shù)據(jù)并不是最新的,而是來源于其它數(shù)據(jù)源。數(shù)據(jù)倉庫反映的是歷史信息,并不是很多數(shù)據(jù)庫處理的那種日常事務(wù)數(shù)據(jù)(有的數(shù)據(jù)庫例如電信計(jì)費(fèi)數(shù)據(jù)庫甚至處理實(shí)時(shí)信息)。因此,數(shù)據(jù)倉庫中的數(shù)據(jù)是極少或根本不修改的;當(dāng)然,向數(shù)據(jù)倉庫添加數(shù)據(jù)是允許的。

    數(shù)據(jù)倉庫的出現(xiàn),并不是要取代數(shù)據(jù)庫。目前,大部分?jǐn)?shù)據(jù)倉庫還是用關(guān)系數(shù)據(jù)庫管理系統(tǒng)來管理的。可以說,數(shù)據(jù)庫、數(shù)據(jù)倉庫相輔相成、各有千秋

    補(bǔ)充一下,數(shù)據(jù)倉庫的方案建設(shè)的目的,是為前端查詢和分析作為基礎(chǔ),由于有較大的冗余,所以需要的存儲(chǔ)也較大。為了更好地為前端應(yīng)用服務(wù),數(shù)據(jù)倉庫必須有如下幾點(diǎn)優(yōu)點(diǎn),否則是失敗的數(shù)據(jù)倉庫方案。

    1.效率足夠高。客戶要求的分析數(shù)據(jù)一般分為日、周、月、季、年等,可以看出,日為周期的數(shù)據(jù)要求的效率最高,要求24小時(shí)甚至12小時(shí)內(nèi),客戶能看到昨天的數(shù)據(jù)分析。由于有的企業(yè)每日的數(shù)據(jù)量很大,設(shè)計(jì)不好的數(shù)據(jù)倉庫經(jīng)常會(huì)出問題,延遲1-3日才能給出數(shù)據(jù),顯然不行的。

    2.數(shù)據(jù)質(zhì)量。客戶要看各種信息,肯定要準(zhǔn)確的數(shù)據(jù),但由于數(shù)據(jù)倉庫流程至少分為3步,2次ETL,復(fù)雜的架構(gòu)會(huì)更多層次,那么由于數(shù)據(jù)源有臟數(shù)據(jù)或者代碼不嚴(yán)謹(jǐn),都可以導(dǎo)致數(shù)據(jù)失真,客戶看到錯(cuò)誤的信息就可能導(dǎo)致分析出錯(cuò)誤的決策,造成損失,而不是效益。

    3.擴(kuò)展性。之所以有的大型數(shù)據(jù)倉庫系統(tǒng)架構(gòu)設(shè)計(jì)復(fù)雜,是因?yàn)榭紤]到了未來3-5年的擴(kuò)展性,這樣的話,客戶不用太快花錢去重建數(shù)據(jù)倉庫系統(tǒng),就能很穩(wěn)定運(yùn)行。主要體現(xiàn)在數(shù)據(jù)建模的合理性,數(shù)據(jù)倉庫方案中多出一些中間層,使海量數(shù)據(jù)流有足夠的緩沖,不至于數(shù)據(jù)量大很多,就運(yùn)行不起來了.

    posted @ 2007-12-05 00:07 鴻雁 閱讀(195) | 評(píng)論 (0)編輯 收藏

    數(shù)據(jù)抽取、清洗與轉(zhuǎn)換 BI項(xiàng)目中ETL設(shè)計(jì)

           ETL是將業(yè)務(wù)系統(tǒng)的數(shù)據(jù)經(jīng)過抽取、清洗轉(zhuǎn)換之后加載到數(shù)據(jù)倉庫的過程,目的是將企業(yè)中的分散、零亂、標(biāo)準(zhǔn)不統(tǒng)一的數(shù)據(jù)整合到一起,為企業(yè)的決策提供分析的依據(jù)

      ETLBI項(xiàng)目最重要的一個(gè)環(huán)節(jié),通常情況下ETL會(huì)花掉整個(gè)項(xiàng)目的1/3的時(shí)間,ETL設(shè)計(jì)的好壞直接關(guān)接到BI項(xiàng)目的成敗。ETL也是一個(gè)長期的過程,只有不斷的發(fā)現(xiàn)問題并解決問題,才能使ETL運(yùn)行效率更高,為項(xiàng)目后期開發(fā)提供準(zhǔn)確的數(shù)據(jù)。

      ETL的設(shè)計(jì)分三部分:數(shù)據(jù)抽取、數(shù)據(jù)的清洗轉(zhuǎn)換、數(shù)據(jù)的加載。在設(shè)計(jì)ETL的時(shí)候也是從這三部分出發(fā)。數(shù)據(jù)的抽取是從各個(gè)不同的數(shù)據(jù)源抽取到ODS中(這個(gè)過程也可以做一些數(shù)據(jù)的清洗和轉(zhuǎn)換),在抽取的過程中需要挑選不同的抽取方法,盡可能的提高ETL的運(yùn)行效率。ETL三個(gè)部分中,花費(fèi)時(shí)間最長的是T(清洗、轉(zhuǎn)換)的部分,一般情況下這部分工作量是整個(gè)ETL的2/3。數(shù)據(jù)的加載一般在數(shù)據(jù)清洗完了之后直接寫入DW中去。

      ETL的實(shí)現(xiàn)有多種方法,常用的有三種,第一種是借助ETL工具如Oracle的OWB、SQL server 2000的DTS、SQL Server2005的SSIS服務(wù)、informatic等實(shí)現(xiàn),第二種是SQL方式實(shí)現(xiàn),第三種是ETL工具和SQL相結(jié)合。前兩種方法各有優(yōu)缺點(diǎn),借助工具可以快速的建立起ETL工程,屏蔽復(fù)雜的編碼任務(wù),提高速度,降低難度,但是欠缺靈活性。SQL的方法優(yōu)點(diǎn)是靈活,提高ETL運(yùn)行效率,但是編碼復(fù)雜,對(duì)技術(shù)要求比較高。第三種是綜合了前面二種的優(yōu)點(diǎn),極大的提高ETL的開發(fā)速度和效率。

      數(shù)據(jù)的抽取

      數(shù)據(jù)的抽取需要在調(diào)研階段做大量工作,首先要搞清楚以下幾個(gè)問題:數(shù)據(jù)是從幾個(gè)業(yè)務(wù)系統(tǒng)中來?各個(gè)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫服務(wù)器運(yùn)行什么DBMS?是否存在手工數(shù)據(jù),手工數(shù)據(jù)量有多大?是否存在非結(jié)構(gòu)化的數(shù)據(jù)?等等類似問題,當(dāng)收集完這些信息之后才可以進(jìn)行數(shù)據(jù)抽取的設(shè)計(jì)。

      1、與存放DW的數(shù)據(jù)庫系統(tǒng)相同的數(shù)據(jù)源處理方法

      這一類數(shù)源在設(shè)計(jì)比較容易,一般情況下,DBMS(包括SQLServer,Oracle)都會(huì)提供數(shù)據(jù)庫鏈接功能,在DW數(shù)據(jù)庫服務(wù)器和原業(yè)務(wù)系統(tǒng)之間建立直接的鏈接關(guān)系就可以寫Select 語句直接訪問。

      2、與DW數(shù)據(jù)庫系統(tǒng)不同的數(shù)據(jù)源的處理方法。

      這一類數(shù)據(jù)源一般情況下也可以通過ODBC的方式建立數(shù)據(jù)庫鏈接,如SQL Server和Oracle之間。如果不能建立數(shù)據(jù)庫鏈接,可以有兩種方式完成,一種是通過工具將源數(shù)據(jù)導(dǎo)出成.txt或者是.xls文件,然后再將這些源系統(tǒng)文件導(dǎo)入到ODS中。另外一種方法通過程序接口來完成。

      3、對(duì)于文件類型數(shù)據(jù)源(.txt,,xls),可以培訓(xùn)業(yè)務(wù)人員利用數(shù)據(jù)庫工具將這些數(shù)據(jù)導(dǎo)入到指定的數(shù)據(jù)庫,然后從指定的數(shù)據(jù)庫抽取。或者可以借助工具實(shí)現(xiàn),如SQL SERVER 2005 的SSIS服務(wù)的平面數(shù)據(jù)源和平面目標(biāo)等組件導(dǎo)入ODS中去。

      4、增量更新問題

      對(duì)于數(shù)據(jù)量大的系統(tǒng),必須考慮增量抽取。一般情況,業(yè)務(wù)系統(tǒng)會(huì)記錄業(yè)務(wù)發(fā)生的時(shí)間,可以用作增量的標(biāo)志,每次抽取之前首先判斷ODS中記錄最大的時(shí)間,然后根據(jù)這個(gè)時(shí)間去業(yè)務(wù)系統(tǒng)取大于這個(gè)時(shí)間的所有記錄。利用業(yè)務(wù)系統(tǒng)的時(shí)間戳,一般情況下,業(yè)務(wù)系統(tǒng)沒有或者部分有時(shí)間戳。

      數(shù)據(jù)的清洗轉(zhuǎn)換

      一般情況下,數(shù)據(jù)倉庫分為ODS、DW兩部分,通常的做法是從業(yè)務(wù)系統(tǒng)到ODS做清洗,將臟數(shù)據(jù)和不完整數(shù)據(jù)過濾掉,再從ODS到DW的過程中轉(zhuǎn)換,進(jìn)行一些業(yè)務(wù)規(guī)則的計(jì)算和聚合。

               1、數(shù)據(jù)清洗

      數(shù)據(jù)清洗的任務(wù)是過濾那些不符合要求的數(shù)據(jù),將過濾的結(jié)果交給業(yè)務(wù)主管部門,確認(rèn)是否過濾掉還是由業(yè)務(wù)單位修正之后再進(jìn)行抽取。不符合要求的數(shù)據(jù)主要是有不完整的數(shù)據(jù)、錯(cuò)誤的數(shù)據(jù)和重復(fù)的數(shù)據(jù)三大類。

    •   A、不完整的數(shù)據(jù),其特征是是一些應(yīng)該有的信息缺失,如供應(yīng)商的名稱,分公司的名稱,客戶的區(qū)域信息缺失、業(yè)務(wù)系統(tǒng)中主表與明細(xì)表不能匹配等。需要將這一類數(shù)據(jù)過濾出來,按缺失的內(nèi)容分別寫入不同Excel文件向客戶提交,要求在規(guī)定的時(shí)間內(nèi)補(bǔ)全。補(bǔ)全后才寫入數(shù)據(jù)倉庫。
    •   B、錯(cuò)誤的數(shù)據(jù),產(chǎn)生原因是業(yè)務(wù)系統(tǒng)不夠健全,在接收輸入后沒有進(jìn)行判斷直接寫入后臺(tái)數(shù)據(jù)庫造成的,比如數(shù)值數(shù)據(jù)輸成全角數(shù)字字符、字符串?dāng)?shù)據(jù)后面有一個(gè)回車、日期格式不正確、日期越界等。這一類數(shù)據(jù)也要分類,對(duì)于類似于全角字符、數(shù)據(jù)前后有不面見字符的問題只能寫SQL的方式找出來,然后要求客戶在業(yè)務(wù)系統(tǒng)修正之后抽取;日期格式不正確的或者是日期越界的這一類錯(cuò)誤會(huì)導(dǎo)致ETL運(yùn)行失敗,這一類錯(cuò)誤需要去業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫SQL的方式挑出來,交給業(yè)務(wù)主管部門要求限期修正,修正之后再抽取。
    •   C、重復(fù)的數(shù)據(jù),特別是維表中比較常見,將重復(fù)的數(shù)據(jù)的記錄所有字段導(dǎo)出來,讓客戶確認(rèn)并整理。

      數(shù)據(jù)清洗是一個(gè)反復(fù)的過程,不可能在幾天內(nèi)完成,只有不斷的發(fā)現(xiàn)問題,解決問題。對(duì)于是否過濾、是否修正一般要求客戶確認(rèn);對(duì)于過濾掉的數(shù)據(jù),寫入Excel文件或者將過濾數(shù)據(jù)寫入數(shù)據(jù)表,在ETL開發(fā)的初期可以每天向業(yè)務(wù)單位發(fā)送過濾數(shù)據(jù)的郵件,促使他們盡快的修正錯(cuò)誤,同時(shí)也可以作為將來驗(yàn)證數(shù)據(jù)的依據(jù)。數(shù)據(jù)清洗需要注意的是不要將有用的數(shù)據(jù)過濾掉了,對(duì)于每個(gè)過濾規(guī)則認(rèn)真進(jìn)行驗(yàn)證,并要用戶確認(rèn)才行。

      2、數(shù)據(jù)轉(zhuǎn)換

      數(shù)據(jù)轉(zhuǎn)換的任務(wù)主要是進(jìn)行不一致的數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)粒度的轉(zhuǎn)換和一些商務(wù)規(guī)則的計(jì)算。

    •   A、不一致數(shù)據(jù)轉(zhuǎn)換,這個(gè)過程是一個(gè)整合的過程,將不同業(yè)務(wù)系統(tǒng)的相同類型的數(shù)據(jù)統(tǒng)一,比如同一個(gè)供應(yīng)商在結(jié)算系統(tǒng)的編碼是XX0001,而在CRM中編碼是YY0001,這樣在抽取過來之后統(tǒng)一轉(zhuǎn)換成一個(gè)編碼。
    •   B、數(shù)據(jù)粒度的轉(zhuǎn)換,業(yè)務(wù)系統(tǒng)一般存儲(chǔ)非常明細(xì)的數(shù)據(jù),而數(shù)據(jù)倉庫中的數(shù)據(jù)是用來分析的,不需要非常明細(xì)的數(shù)據(jù),一般情況下,會(huì)將業(yè)務(wù)系統(tǒng)數(shù)據(jù)按照數(shù)據(jù)倉庫粒度進(jìn)行聚合。
    •   C、商務(wù)規(guī)則的計(jì)算,不同的企業(yè)有不同的業(yè)務(wù)規(guī)則,不同的數(shù)據(jù)指標(biāo),這些指標(biāo)有的時(shí)候不是簡單的加加減減就能完成,這個(gè)時(shí)候需要在ETL中將這些數(shù)據(jù)指標(biāo)計(jì)算好了之后存儲(chǔ)在數(shù)據(jù)倉庫中,供分析使用。

      ETL日志與警告發(fā)送

      1、ETL日志,記錄日志的目的是隨時(shí)可以知道ETL運(yùn)行情況,如果出錯(cuò)了,出錯(cuò)在那里。

      ETL日志分為三類。第一類是執(zhí)行過程日志,是在ETL執(zhí)行過程中每執(zhí)行一步的記錄,記錄每次運(yùn)行每一步驟的起始時(shí)間,影響了多少行數(shù)據(jù),流水賬形式。第二類是錯(cuò)誤日志,當(dāng)某個(gè)模塊出錯(cuò)的時(shí)候需要寫錯(cuò)誤日志,記錄每次出錯(cuò)的時(shí)間,出錯(cuò)的模塊以及出錯(cuò)的信息等。第三類日志是總體日志,只記錄ETL開始時(shí)間,結(jié)束時(shí)間是否成功信息。

      如果使用ETL工具,工具會(huì)自動(dòng)產(chǎn)生一些日志,這一類日志也可以作為ETL日志的一部分。

      2、警告發(fā)送

      ETL出錯(cuò)了,不僅要寫ETL出錯(cuò)日志而且要向系統(tǒng)管理員發(fā)送警告,發(fā)送警告的方式有多種,常用的就是給系統(tǒng)管理員發(fā)送郵件,并附上出錯(cuò)的信息,方便管理員排查錯(cuò)誤。

    posted @ 2007-06-21 21:36 鴻雁 閱讀(501) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共18頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
    主站蜘蛛池模板: 亚洲av无码片vr一区二区三区| 免费无遮挡无遮羞在线看| 日韩a在线观看免费观看| 一区视频免费观看| 亚洲欧洲国产成人精品| 亚洲va中文字幕无码| 一级毛片免费视频| 深夜福利在线免费观看| 亚洲av无码乱码国产精品| 四虎免费大片aⅴ入口| 国内精品免费久久影院| 亚洲色大成网站www久久九 | 国产又粗又猛又爽又黄的免费视频| 一区二区三区精品高清视频免费在线播放 | 久久久久国产精品免费免费搜索 | 91在线视频免费观看| 亚洲午夜无码久久| 久热综合在线亚洲精品| 国产在线98福利播放视频免费| 一区二区免费视频| 九九热久久免费视频| 亚洲高清乱码午夜电影网| 久久久久亚洲av无码专区导航 | 亚洲韩国—中文字幕| 亚洲AV无码乱码在线观看性色扶| 中文字幕天天躁日日躁狠狠躁免费| 美女免费视频一区二区三区| 国产色在线|亚洲| 亚洲va久久久噜噜噜久久天堂| 国产午夜影视大全免费观看| 中文字幕天天躁日日躁狠狠躁免费| 一级一看免费完整版毛片| 亚洲国产精品99久久久久久| 亚洲剧场午夜在线观看| 亚洲产国偷V产偷V自拍色戒| 亚洲精品乱码久久久久久蜜桃| 蜜臀91精品国产免费观看| 青娱乐免费视频在线观看| 免费女人高潮流视频在线观看| 一级一片免费视频播放| 日日摸夜夜添夜夜免费视频|