石建 | Fat Mind

          題記:一個cookie,整個下午都沒有找到解決的辦法。

           

          一、遇到的問題

          1. 情景:訪問http://list.mall.daily.taobao.net/50024400/xxx,當前頁面通過ajax請求廣告,請求的域為http://tmatch.simba.taobao.com/xxx;廣告引擎向頁面種seesion范圍的cookie_back,用于標識翻頁;

                2. 問題:

          點擊當前頁面的翻頁,IE下廣告不翻頁?通過firebughttpwatch對比,發(fā)現(xiàn)IEcookie“_back”不正確。開始猜測是引擎種cookie的邏輯存在問題,但很多地方都在使用此接口,均沒有問題。

          且有人的機器翻頁正常,此時懷疑是瀏覽器設(shè)置問題?再用httpwatch觀察“http請求頭,發(fā)現(xiàn)_back沒有回傳給引擎(其實httpwatchcookies也可以觀察到,如果發(fā)送cookie的話,會顯示為Sent;之前只觀察到Received)? 確認是瀏覽器的問題。

          3. 解決:打開IE隱私設(shè)計,通常默認設(shè)置為,拒絕沒有隱私政策的第三方cookie ...”,意味著_back并沒有成功寫入客戶端,所有請求引擎導(dǎo)致不能正確回傳_back,翻頁失敗。

                   這么說淘寶所有的廣告的翻頁都是不可用的 ?肯定不是。問題在第一方 Cookie 來自您正瀏覽的網(wǎng)站,它們可以是永久的或臨時的;第三方 Cookie 來自您正瀏覽的網(wǎng)站上的其他網(wǎng)站的廣告”,對于瀏覽器“taobao.nettaobao.com”就是不同的兩個網(wǎng)站,所以引擎的_back是無法種在客戶端。此情景是daliy環(huán)境,線上的環(huán)境訪問的是list.mall.daily.taobao.com,所以不存在第三方cookie”的概念,廣告是可以正確顯示。

           

          二、關(guān)于cookie小知識

           

          1.IE Cookie的格式

          第一行名稱,第二行,第三行所屬域” ...比如“.taobao.com”存在cna,此cookie會被瀏覽器自動發(fā)送到任何屬于此域的子域;www.taobao.com\taobao.com,后面的是根域,前一個是二級域。xp存放目錄為:C:\Documents and Settings\<username>\Cookies\,文件命名:你的用戶名@生成COOKIEdomain[COOKIE改變的次數(shù)].txt

            參考:http://blog.csdn.net/zhangxinrun/archive/2010/07/31/5779574.aspx

           

          2.Js Cookie跨域訪

           http://blog.csdn.net/tongdoudpj/archive/2009/05/10/4166096.aspx

           

          3.cookiesession的關(guān)系

          根本的原因:http協(xié)議的無狀態(tài)性,cookie的出現(xiàn)就是為了解決這個問題。

          session是一種在客戶端與服務(wù)器之間保持狀態(tài)的解決方案。服務(wù)端存儲內(nèi)容,返回對應(yīng)的key給客戶端,當下次訪問時,帶上此key,實現(xiàn)狀態(tài)的維持。

          session實現(xiàn):

          1.依賴cookieThe session cookie is stored in temporary memory and is not retained after the browser is closed。(實際測試:IE8,未在1描述的位置找到session級別cookie對應(yīng)的文件,猜測‘臨時存儲在瀏覽器內(nèi)存’,當關(guān)閉瀏覽器時則丟失key)

          2.url重寫。Servlet規(guī)范定義此功能。當瀏覽器禁用cookie時,就算session級別的內(nèi)容也不會被存儲。resp.encodeRedirectURL(url),且僅當禁用cookie時有效,重寫結(jié)果如:http://www.demo.com/cookie.do;jsessionid=19gfy1sg740dl1whwd72lbqlhb

          疑問:server如何判斷,是否需要重寫呢?從實驗現(xiàn)象看,判斷是否收到name=JSESSIONID cookie,若無,則進行url重寫。

                     最好的方式,翻翻tomcatjetty的源碼實現(xiàn),但未找到對應(yīng)的代碼。

          關(guān)于cookie的詳細信息參見: http://en.wikipedia.org/wiki/HTTP_cookie

           

          posted @ 2010-11-08 21:41 石建 | Fat Mind 閱讀(692) | 評論 (0)編輯 收藏
          題記:老大開始在團隊推行敏捷。記錄目前自己理解的優(yōu)點,還有敏捷不適應(yīng)問題。

          一、自己理解的敏捷

          1.風險分散。這點,我是非??隙ǖ摹SH身的體會,jim負責A模塊,以前做法:項目經(jīng)理pety,在A模塊快提交的前期去和jim溝通模塊的完成情況?,F(xiàn)在做法:每天jim向prty匯報自己的進度情況和問題。幫助pety對項目的可控性提高很多,風險也能盡早的暴露出來。帶來的問題:必須對A模塊進行更細的任務(wù)分解,如何分解?時間如何評估?誰來評估?(團隊做法:由jim自己細分A模塊,再與pety確認計劃,此時pety可以給出自己的意見,共同來評估時間。)

          2.可視化。同意這點。之前做法:每天發(fā)郵件周知大家進度情況;團隊目前做法:看板(貼每個人具體細分的任務(wù)),每天匯報具體的進度和遇到的問題。其實兩種做法的目的是一樣,都是想讓別人知道自己的進度和問題。但第二種方法優(yōu)點:a.閱讀郵件,是每個人獨立的行為,是分散的,看板上任務(wù)的匯報是大家在一起的,此時面對面的溝通是更高效的;b.對于我的感覺,看板比郵件更加可視化;c.基于看板,后期的后顧和總結(jié)也更加方便。

          3.團隊化。jim負責A模塊,jeny負責B模塊,當A模塊jim可能存在跟多問題(前期沒有評估到),希望jeny可以幫jim完成其中的部分。問題:jeny根本不熟悉A模塊,熟悉A模塊所花費的時間,以及對B模塊的影響,都是需要評估的。自己的理解:對于多人同時開發(fā)的項目,此方法還是可以試用的;但是對于單兵作戰(zhàn)的日常,大家的精力都是有限的,很難說A做大一半的時候,讓B來幫忙。這也是目前大家爭論的焦點。

          二、團隊目前的做法

          1.細粒度的任務(wù)分解。比如:搜索頁面智能導(dǎo)航,分解的任務(wù):a.了解接口需要的參數(shù),以及返回的結(jié)果的格式 b.請求參數(shù)處理  c.返回xml結(jié)果解析 d.后期根據(jù)業(yè)務(wù)邏輯的處理。整個任務(wù)肢解的力度非常細,對項目風險的把控更加有好處。
          2.看板。分為:任務(wù)、開發(fā)中、done(三部分)。根據(jù)每天大家反饋的情況,更新項目剩余需要的工時(細粒度到時間)。
          3.晨會。早晨站在看板前,每個對著看板,說自己“昨天干了什么&是否遇到什么問題、今天準備做什么”,對應(yīng)的調(diào)整看板的內(nèi)容和任務(wù)所需時間。
          4.總結(jié)。這點目前做的不夠好,不是大家都來提建議,可能整個團隊還是“一個大腦”,只是一個人在想問題(當然這與團隊的氛圍是有關(guān)系的)。

          三、難點

          1.個人的積極性和參與度
            敏捷是需要團隊的每個人都以主人公的態(tài)度參與進來的,當然團隊也要能夠給予他認同,這是軟實力的問題;比如:相互提建議,但是這首先需要團隊安全的環(huán)境,對老大說的話,大家可以提出不同的意見,否則始終是“一個腦袋”在思考,大家習(xí)慣于去服從;同時也要克服養(yǎng)成的“中庸之道”,當然也要注意提建議的方式。
          2.任務(wù)的細分和工時的評估
            需要項目經(jīng)理對團隊成員有很熟悉的了解,才能合理的安排任務(wù)。根據(jù)不同的人確定不同的工時,大家都能在一種被尊重和快樂的氛圍中工作,此時的效率肯定是高。
          3.團隊的成就感
            需要自下而上的,獲得的成就是每一個人的,而不是簡單是他的或者我的。每個人都能找到被認同的感覺,樂于分享自己的收獲,此時整個團隊的每個人都會成長,團隊的戰(zhàn)斗力肯定也會大大提高。


          總結(jié):發(fā)現(xiàn)難點的地方,還是團隊軟實力的建設(shè)。
          posted @ 2010-11-07 18:47 石建 | Fat Mind 閱讀(193) | 評論 (0)編輯 收藏
          題記:主要記錄同學(xué)分享的關(guān)于數(shù)據(jù)庫設(shè)計方面的內(nèi)容,思考過一點,記錄下來。

          一、從需求開始,考慮數(shù)據(jù)庫的設(shè)計,且結(jié)合具體數(shù)據(jù)庫特性

            一個論壇,要求顯示帖子的總條數(shù),對于mysql、innodb引擎;上線前期完全沒有問題,當人氣積累,帖子達到千萬級別時,此時性能的問題就會顯現(xiàn)出來。好的設(shè)計,是需求階段就要考慮的。對于我,這是一個思想概念上的轉(zhuǎn)變。
            但引擎如果換成myisam,就算數(shù)據(jù)達到億的級別,“統(tǒng)計總數(shù)”這樣的問題還會存在嗎 ?不會,myisam自身就會維護總數(shù)信息。因此設(shè)計,必須結(jié)合具體的數(shù)據(jù)庫的特性來做,不能以一概全。

          二、應(yīng)該遵循原則 (未驗證)

            1.小結(jié)果集驅(qū)動大結(jié)果集。理由:mysql的連接查詢原理 ?
            2.盡可能在索引中完成排序。理由:索引本身就是有序的
            3.只取自己需要的column ?
            4.避免復(fù)雜的連接查詢和子查詢。
            5.適當?shù)臄?shù)據(jù)冗余.理由:帖子表&用戶表,如果帖子表擁有username,則每次帖子的顯示是不需要連接查詢獲取username。 
            6.應(yīng)用層的cahce機制 ?

          三、概念

            1.垂直拆分:按列進行分割,即把一條記錄分開多個地方保存,每個子表的行數(shù)相同。帖子表,id、userid、username、content、xxx ...前面4個字段很常用,但是后面xxx等很多字段,不常用,數(shù)據(jù)量很大。進行垂直拆分,table1字段包含“id、userid、username、content”,table2包含“xxx、...”等不常用字段。優(yōu)點:減少io的操作。缺點:如果需要不常用字段信息,需要連表查詢。
            2.水平拆分:
          按記錄進分分割,不同的記錄分開保存,每個子表的列數(shù)相同。比如:淘寶的用戶交易數(shù)據(jù),根據(jù)用戶id取模,確定具體的數(shù)據(jù)存放在那個數(shù)據(jù)庫。水平拆分會給應(yīng)用帶來復(fù)雜性。
            3.集群:提高系統(tǒng)的可用性。分庫的節(jié)點引入多臺機器,每臺機器保 存的數(shù)據(jù)是一樣,負載均衡在多臺機器。如何均衡、探測機器的可用性,是新的問題 ?
            4.主備:一般的互聯(lián)網(wǎng)應(yīng)用中,經(jīng)過一些數(shù)據(jù)調(diào)查得出結(jié)論,讀/寫的比例大概在 10:1左右。為什么要讀寫分離:寫操作涉及到鎖的問題,不管是行鎖還是表鎖還是塊鎖,在大并發(fā)的情況下,效率很低。寫操作集中在一個節(jié)點上,而讀操作其其他 的N個節(jié)點上進行。讀寫分離引入的新問題:比如我的Master上的數(shù)據(jù)怎樣和集群中其它Slave機器保持數(shù)據(jù)的同步和一致呢?




          posted @ 2010-11-07 17:53 石建 | Fat Mind 閱讀(470) | 評論 (0)編輯 收藏
          請參考:http://en.wikipedia.org/wiki/Join_(SQL)#Sample_tables

          inner JOINS

            An inner join is the most common join operation used in applications and can be regarded as the default join-type. Inner join creates a new result table by combining column values of two tables (A and B) based upon the join-predicate. The query compares each row of A with each row of B to find all pairs of rows which satisfy the join-predicate. When the join-predicate is satisfied, column values for each matched pair of rows of A and B are combined into a result row. The result of the join can be defined as the outcome of first taking the Cartesian product (or cross-join) of all records in the tables (combining every record in table A with every record in table B)—then return all records which satisfy the join predicate. Actual SQL implementations normally use other approaches like a Hash join or a Sort-merge join where possible, since computing the Cartesian product is very inefficient.

            注意:innner查詢(默認的連接查詢方式),是先查詢“Cartesian”生成中間表,再根據(jù)where條件篩選結(jié)果;但此方法非常低效,SQL具體的實現(xiàn)可能是 
          Hash join or a Sort-merge join 。
                  
          One can further classify inner joins as equi-joins, as natural joins, or as cross-joins.

          SELECT *
          FROM employee INNER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
          The following example shows a query which is equivalent to the one from the previous example.
          
          
          SELECT *
          FROM   employee, department
          WHERE  employee.DepartmentID = department.DepartmentID;
          

          Outer joins

            An outer join does not require each record in the two joined tables to have a matching record. The joined table retains each record—even if no other matching record exists. Outer joins subdivide further into left outer joins, right outer joins, and full outer joins, depending on which table(s) one retains the rows from (left, right, or both).

          Example of a left outer join, with the additional result row italicized:

          SELECT *
          FROM   employee  LEFT OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
          
          Employee.LastNameEmployee.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
          Jones 33 Engineering 33
          Rafferty 31 Sales 31
          Robinson 34 Clerical 34
          Smith 34 Clerical 34
          John NULL NULL NULL
          Steinberg 33 Engineering 33


          Example right outer join, with the additional result row italicized:

          SELECT *
          FROM   employee RIGHT OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
          
          Employee.LastNameEmployee.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
          Smith 34 Clerical 34
          Jones 33 Engineering 33
          Robinson 34 Clerical 34
          Steinberg 33 Engineering 33
          Rafferty 31 Sales 31
          NULL NULL Marketing 35


          Example full outer join: (mysql is not support)

          SELECT *
          FROM   employee
          FULL OUTER JOIN department
          ON employee.DepartmentID = department.DepartmentID;
          
          Employee.LastNameEmployee.DepartmentIDDepartment.DepartmentNameDepartment.DepartmentID
          Smith 34 Clerical 34
          Jones 33 Engineering 33
          Robinson 34 Clerical 34
          John NULL NULL NULL
          Steinberg 33 Engineering 33
          Rafferty 31 Sales 31
          NULL NULL Marketing 35


          Self-join

          A query to find all pairings of two employees in the same country is desired.

          An example solution query could be as follows:

          SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
          FROM Employee F, Employee S
          WHERE F.Country = S.Country
          AND F.EmployeeID < S.EmployeeID
          ORDER BY F.EmployeeID, S.EmployeeID;
          

          Which results in the following table being generated.

          Employee Table after Self-join by Country
          EmployeeIDLastNameEmployeeIDLastNameCountry
          123 Rafferty 124 Jones Australia
          123 Rafferty 145 Steinberg Australia
          124 Jones 145 Steinberg Australia
          305 Smith 306 John Germany










          Join algorithms

          Three fundamental algorithms exist for performing a join operation: Nested loop joinSort-merge join and Hash join.




           

          posted @ 2010-11-03 15:36 石建 | Fat Mind 閱讀(296) | 評論 (0)編輯 收藏
          題記:新同學(xué)分享了“測試驅(qū)動”,第一次感覺測試驅(qū)動離自己那么近。因此開始嘗試。記下自己的一小點想法。

          1.一切從測試開始
            不管在寫復(fù)雜的代碼,還是簡單的代碼,一切從測試開始。練習(xí)成自己編碼的習(xí)慣。
            自己的做法只能算是“偽測試驅(qū)動”,因為還是有詳細的設(shè)計,但遵循此做法,對于需求的變更、代碼存在的bug,導(dǎo)致編碼修改的時候,心里是踏實的。
            目前自己還不能感覺到對后期的維護會帶來什么樣的結(jié)果?
            推薦《測試驅(qū)動開始》。

          2.工具
            junit、mockito、emma

            junit,這是大家熟知的,學(xué)到新點:a。參數(shù)化測試  b。private方法測試(反射) c。runwith & Unite,組織測試單元
            mockito,輕量的mock工具。測試中很麻煩的一個問題是:環(huán)境依賴,比如:web中依賴容器生成request對象。mockito很好的解決大部分問題(static類與private方法未能解決)。
            emma,代碼覆蓋率檢查工具,eclipse插件。效果:紅色=未測試;黃色=測試不完整,只是部分邏輯;綠色=測試完整。(注意:不能絕對的追求覆蓋率,一定要記住2/8原則,將主要的精力關(guān)注主要的邏輯)。

          3.習(xí)慣
            a。代碼結(jié)構(gòu),3部分:prepare(包含mock)準備數(shù)據(jù)、action執(zhí)行、assert驗證
            b。方法命名:被測試方法名$測試目的,如:run$ParameterIsNull
            c。測試A類,有兩個方法run()和prepare(),run方法調(diào)用prepare,且prepare執(zhí)行非常耗時間。想要單獨測試run()方法 ?
               答案:B extends A,復(fù)寫prepare方法(等于是mock prepare方法),單獨的測試run方法邏輯。
            d。持續(xù)寫測試代碼的習(xí)慣



            

          posted @ 2010-11-02 21:31 石建 | Fat Mind 閱讀(247) | 評論 (0)編輯 收藏
          請參見官網(wǎng):http://androidappdocs.appspot.com/sdk/installing.html

          1. preparing your development computer

            檢查系統(tǒng)環(huán)境是否滿足要求(基本忽略)

          2.下載sdk

            path 增加 %android_home%/tools

          3. eclipse開發(fā)環(huán)境

            eclipse3.5在線安裝地址 :https://dl-ssl.google.com/android/eclipse/
          4. 安裝 android平臺和其它組件

            之前下載的包,僅是一個工具包。The starter package is not a full development environment — it includes only the core SDK Tools, which you can use to download the rest of the SDK components.

            我的選擇 :android platform、document、samples、google api、martket lience(請注意選擇的版本要一致)

            Android USB驅(qū)動只有Windows才需要安裝,作用:Contains driver files that you can install on your Windows computer, so that you can run and debug your applications on an actual device. 可以直接在你的android手機上,進行程序的調(diào)試、運行等。linux、mac是不需要安裝。

          5. hello world 

             http://developer.android.com/training/basics/firstapp/index.html

          6. eclipse查看android源碼

            http://log4think.com/browsing-android-source-in-eclipse/ 已驗證:<sdk-home>/platforms/android-8,建立source文件夾,將源碼放入。重啟eclipse,即可看到源碼。




          今天發(fā)現(xiàn),之前的url也不能訪問;安裝方式也不同,重新整理。

          1. 安裝sdk
          http://developer.android.com/sdk/installing/index.html 
            下載sdk(windows下竟然是exe)
            It includes only the core SDK tools, which you can use to download the rest of the SDK packages, using the Android SDK Manager. 
            To develop an Android app, you also need to download at least one Android platform and the latest SDK Platform-tools。
            選擇其它組件:tools、選擇對應(yīng)版本api、usb driver(請務(wù)必記住:選擇使用http,而不是https,tools->options)

          2.安裝eclipse adt plugin
            http://developer.android.com/sdk/installing/installing-adt.html 
            select the checkbox next to Developer Tools and click Next.
           
          config the adt plugin.



          posted @ 2010-10-24 20:40 石建 | Fat Mind 閱讀(236) | 評論 (0)編輯 收藏

          已遷往 http://fatmind.iteye.com

          題記:.java源文件是如何被找到的?.class字節(jié)碼文件是如何被找到的?內(nèi)容:全部借鑒《Java深度歷險》

          Package:命名空間的問題,隔離類之間的關(guān)系。

          Import:聲明引入的類的路徑(僅在編譯時有作用,編譯后的文件,類的聲明已經(jīng)為全路徑);好處“明晰的代碼結(jié)構(gòu),分離在多個文件;幫助實現(xiàn)動態(tài)鏈接的功能”。

          一、編譯

          package edu.nctu;

           

          import com.taobao.Test;

          import edu.nctu.*;

           

          public class C

          {

          public void print() {

                        System.out.println("package test") ;

                 }

          }

           

          步驟:

          1. 根據(jù)classpath建立,“類相對路徑參考表”

          如:javac –cp .;d:/test/,在d:/下執(zhí)行,結(jié)果:d:/;d:/test/

          2. 以“類相對路徑參考表”作為相對起始路徑,驗證能夠找到所有要用的package

          根據(jù)import引入的package或全限定類名,import packagename.classname,packagename之中的“.”“/”取代.

                 2.1 com.taobao.*形式,驗證在d:/目錄下是否存在com/taobao/目錄,若不存在,依次檢查d:/test/

                 2.2 com.taobao.Test形式,驗證是否存在com/taobao/Test,與上相同。

          3. 建立“類參考表”和“相對類參考表”

                 3.1 類參考表:com.taobao.Test

                 3.2 類相對參考表:com.taobao.*

          4. 解析class{} 包含的代碼

          是否全限定類名

                 4.1 是,絕對路徑 =“類相對路徑參考表”+全限定類名,查找,不存在為錯誤;

                 4.2 否,絕對路徑 =“類相對路徑參考表”,查找;

                        4.2.1是,編譯

                        4.2.2否,解析package

                               4.2.2.1 在類參考表,是否存在1以上的同名類,出錯;否則,絕對路徑 =“類相對路徑參考表”+ “類參考表”,正確。

                               4.2.2.2 在類參考表找不到,絕對路徑 = “類相對路徑參考表”+ “相對類參考表”,若存在一個以上的類,出錯;否則,正確。

          提醒:

          1.       如果已經(jīng)存在A .class文件,A .java不是必須的;

          2.       編譯器在找到源碼或字節(jié)碼,對會驗證是否屬于此package,但沒有通過make機制的編譯,是不會驗證的;make機制,即編譯器自動維護具有相互依賴關(guān)系的文件;javac命令直接編譯文件,如:javac -cp d:/test com.edu.C.java,編譯器角度:com.edu.C.java 是一個文件名,且沒有通過make機制,所以-cp指定的路徑建立的“類相對路徑參考表”也不會使用,編譯器直接在當前目錄下查找com.edu.C.java,結(jié)果 ClassNotFoundException 。

          二、運行

          1、 編譯結(jié)束后,import指令已經(jīng)不存在,類被替換為“全限定類名”

          2、 運行時類的加載,都是通過classloader進行,所以必須遵循正確的“包目錄”結(jié)構(gòu),不管是否直接通過命令行執(zhí)行。

          步驟:

          1.       建立“字節(jié)碼路徑參考表”,根據(jù)classpath

          2.       絕對路徑 = “字節(jié)碼路徑參考表”+ 全限定類名,查找;加載;找不到,報錯。




          posted @ 2010-10-17 01:29 石建 | Fat Mind 閱讀(1375) | 評論 (0)編輯 收藏
          題記:日志記錄,對一個應(yīng)用非常重要,不僅僅只為定位線上bug(exception日志),還有業(yè)務(wù)日志,比如:統(tǒng)計用戶的搜索詞、響應(yīng)時間等。

          一、
          日志級別

          眾所周知,在log4j中定義5個最常用日志級別:debug、info、warn、error、fatal,級別依次嚴重。
          可大家思考過,什么時候應(yīng)該記info,exception時是應(yīng)該記warn,還是error呢 ?下面是今天小團隊討論后,自己的一些理解。

          debug:程序內(nèi)部的信息,對于外部使用的人是沒有意義。比如:函數(shù)的執(zhí)行時間。(fine-grained information events that are most useful to debug an application)debug記錄的是細粒度的事件信息,對于調(diào)式程序是非常有用的。

          info:informational messages that highlight the progress of the application at coarse-grained level.(強調(diào)應(yīng)用的執(zhí)行的進度,關(guān)鍵分支的記錄)。比如:關(guān)鍵分支記錄(輸入?yún)?shù)等),
          對運維工程師來說這些信息也是有價值的,info指明程序的運行是否符合正確的業(yè)務(wù)邏輯。

          對于warn與error級別,是我自己最困惑的 ?

          先講個形象的例子 :

                   有一天,李三說請你幫個忙,幫他收拾一下自行車,但是他的自行車是放在他自己家里的,房屋上鎖。
                   1、李三:給你鑰匙,此時你沒有工具,但是你可以用你自家的工具修理自行車。結(jié)果:完成任務(wù);過程:存在問題,內(nèi)部可以處理此問題。
                   2、李三:沒給你鑰匙,但給你工具或者沒給你工具,此時你不能接觸到自行車。結(jié)果:無法完成任務(wù);過程:存在問題,無法處理此問題。

          結(jié)論:1情況,記warn;2情況,記error。觀點:關(guān)注的是最小單元的業(yè)務(wù)是否能夠完成,而對于應(yīng)用來說,最小單元的業(yè)務(wù)就是“method方法”,每個方法去完成的任務(wù)都是一個獨立的、最小單元的業(yè)務(wù)。

          提醒:必須結(jié)合具體場景來判斷,比如:dao從數(shù)據(jù)庫獲取數(shù)據(jù)失敗,對自身來說是error,沒有完成獲取數(shù)據(jù)的任務(wù);但對業(yè)務(wù)層來說,或者有其它方法修復(fù)此異常,如通過http重新獲取等,此時業(yè)務(wù)層是完成自身任務(wù)的,所以為warn。

          warn:potentially harmful situations.(潛在的有害狀態(tài))。比如:廣告投放,淘寶搜索右側(cè)p4p廣告會根據(jù)地域展現(xiàn),但某次用戶搜素,ip地址獲取失敗,可能會用默認值替代或者為空,但是并不影響右側(cè)廣告的展現(xiàn)。所以展現(xiàn)廣告的任務(wù)是完成的,對于業(yè)務(wù)來說是執(zhí)行成功的,盡管過程中出現(xiàn)問題。

          error:error events that might still allow the application to continue running.(錯誤事件發(fā)生,程序或許依然能夠運行)。比如:廣告前段展現(xiàn),通過http從引擎獲取數(shù)據(jù)時,因為引擎的機器連接數(shù)達到上限或者臨時網(wǎng)絡(luò)原因,timeout,但程序能正常運行,next請求引擎則成功。從函數(shù)角度看,此函數(shù)任務(wù)沒有完成,記error。

          fatal:very severe error events that will presumably lead the application to abort.(錯誤可能會導(dǎo)致應(yīng)用崩潰)。


          對于日志級別,或許大家也會有自己的理解(如有不同意見,請大家指點)


          二、記錄信息

          這個話題簡單一點,三點:
          1、做什么操作
          2、輸入內(nèi)容
          3、堆棧信息(有堆棧信息的情況下)


          posted @ 2010-10-09 23:26 石建 | Fat Mind 閱讀(1812) | 評論 (0)編輯 收藏
               摘要: 已遷往  http://fatmind.iteye.com主要參考: 1.寶寶的文章《中文化和國際化問題淺析》    2.阮一峰的網(wǎng)絡(luò)日志       http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html  ...  閱讀全文
          posted @ 2010-10-05 21:12 石建 | Fat Mind 閱讀(391) | 評論 (0)編輯 收藏
          前話:之前看過貝葉斯的東西,想記錄自己的理解。

               每個人身邊發(fā)生的事情可能都是一個“概率性”事件。從抽簽、買彩票,站在古典概率的角度,這些事對于每個人都是公平的,闡述不確定事件的規(guī)律性。統(tǒng)計概率:在一個事件空間中,進行n次的隨機試驗,某個事件的發(fā)生會趨于一點。這就是“大數(shù)定理”,在統(tǒng)計的基礎(chǔ)上得到的結(jié)果是不是能從之前

          發(fā)生的事件的規(guī)律,預(yù)測某件事之后發(fā)生的概率呢?這就是貝葉斯公式的目的。

               根據(jù)條件概率的定義。在事件B發(fā)生的條件下事件A發(fā)生的概率是:

               同樣地,在事件A發(fā)生的條件下事件B發(fā)生的概率:

               整理與合并這兩個方程式,我們可以找到:

               這個引理有時稱作概率乘法規(guī)則。上式兩邊同除以P(B),若P(B)是非零的,我們可以得到貝葉斯定理:

          參考資料:

          http://zh.wikipedia.org/zh-cn/貝葉斯定理

          http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 平凡而又神奇的貝葉斯

          posted @ 2010-07-12 23:41 石建 | Fat Mind 閱讀(291) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          What 、How、Why,從細節(jié)中尋找不斷的成長點
          主站蜘蛛池模板: 台南县| 新竹县| 泸溪县| 长兴县| 雷山县| 古交市| 南部县| 河曲县| 镇江市| 赣州市| 建始县| 旺苍县| 云南省| 子洲县| 托克托县| 阜平县| 阜新| 桃园市| 肇庆市| 龙口市| 阳原县| 宽城| 洪江市| 始兴县| 九江市| 景宁| 湖口县| 太白县| 仪征市| 康定县| 永丰县| 册亨县| 朔州市| 台州市| 安顺市| 昔阳县| 崇明县| 合肥市| 徐州市| 松阳县| 黎川县|