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

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

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

    yxhxj2006

    常用鏈接

    統(tǒng)計

    最新評論

    2015年6月13日 #

    jQuery 插件autocomplete 應(yīng)用

    項(xiàng)目中有時會用到自動補(bǔ)全查詢,就像Google搜索框、淘寶商品搜索功能,輸入漢字或字母,則以該漢字或字母開頭的相關(guān)條目會顯示出來供用戶選擇, autocomplete插件就是完成這樣的功能。

      autocomplete官網(wǎng) : http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/ (可下載jQuery autocomplete插件)。

      淘寶商品搜索功能 效果:

      下面來使用 autocomplete插件來實(shí)現(xiàn)類似效果。

    1. 創(chuàng)建 AjaxPage.aspx 頁面,在其中定義 WebMethod 方法來返回 搜索頁面需要的輸入框所有提示條目。 后臺代碼如下:

    復(fù)制代碼
     1 using System.Collections.Generic;
    2 using System.IO;
    3 using System.Runtime.Serialization.Json;
    4 using System.Web.Services;
    5
    6 public partial class AjaxPage : System.Web.UI.Page
    7 {
    8 [WebMethod]
    9 public static string GetAllHints()
    10 {
    11 Dictionary<string, string> data = new Dictionary<string, string>();
    12 data.Add("蘋果4代iphone正品", "21782");
    13 data.Add("蘋果4代 手機(jī)套", "238061");
    14 data.Add("蘋果4", "838360");
    15 data.Add("蘋果皮", "242721");
    16 data.Add("蘋果筆記本", "63348");
    17 data.Add("蘋果4s", "24030");
    18 data.Add("戴爾筆記本", "110105");
    19 data.Add("戴爾手機(jī)", "18870");
    20 data.Add("戴爾鍵盤", "30367");
    21
    22 DataContractJsonSerializer serializer = new DataContractJsonSerializer(data.GetType());
    23
    24 using (MemoryStream ms = new MemoryStream())
    25 {
    26 serializer.WriteObject(ms, data);
    27 return System.Text.Encoding.UTF8.GetString(ms.ToArray());
    28 }
    29 }
    30 }
    復(fù)制代碼

      注:該方法返回的數(shù)據(jù)格式為json字符串。

    2. 創(chuàng)建搜索頁面 Index.aspx, 前臺代碼如下:

    復(fù)制代碼
     1 <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Index.aspx.cs" Inherits="_Default" %>
    2
    3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4
    5 <html xmlns="http://www.w3.org/1999/xhtml">
    6 <head runat="server">
    7 <title></title>
    8 <link rel="Stylesheet" href="Styles/jquery.autocomplete.css" />
    9 <script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
    10 <script type="text/javascript" src="Scripts/jquery.autocomplete.js"></script>
    11 <script type="text/javascript">
    12 var v = 1;
    13 $(document).ready(function () {
    14 $.ajax({
    15 type: "POST",
    16 contentType: "application/json",
    17 url: "AjaxPage.aspx/GetAllHints",
    18 data: "{}",
    19 dataType: "json",
    20 success: function (msg) {
    21 var datas = eval('(' + msg.d + ')');
    22 $("#txtIput").autocomplete(datas, {
    23 formatItem: function (row, i, max) {
    24 return "<table width='400px'><tr><td align='left'>" + row.Key + "</td><td align='right'><font style='color: #009933; font-family: 黑體; font-style: italic'>約" + row.Value + "個寶貝</font>&nbsp;&nbsp;</td></tr></table>";
    25 },
    26 formatMatch: function(row, i, max){
    27 return row.Key;
    28 }
    29 });
    30 }
    31 });
    32 });
    33 </script>
    34 </head>
    35 <body>
    36 <form id="form1" runat="server">
    37 <div>
    38 <center>
    39 <asp:TextBox ID="txtIput" runat="server" Width="400px"></asp:TextBox>
    40 </center>
    41 </div>
    42 </form>
    43 </body>
    44 </html>
    復(fù)制代碼

      實(shí)現(xiàn)效果如下:

    3. autocomplete 參數(shù)說明

    * minChars (Number)
        在觸發(fā)autoComplete前用戶至少需要輸入的字符數(shù).Default: 1,如果設(shè)為0,在輸入框內(nèi)雙擊或者刪除輸入框內(nèi)內(nèi)容時顯示列表
    * width (Number)
        指定下拉框的寬度. Default: input元素的寬度
    * max (Number)
        autoComplete下拉顯示項(xiàng)目的個數(shù).Default: 10
    * delay (Number)
        擊鍵后激活autoComplete的延遲時間(單位毫秒).Default: 遠(yuǎn)程為400 本地10
    * autoFill (Boolean)
        要不要在用戶選擇時自動將用戶當(dāng)前鼠標(biāo)所在的值填入到input框. Default: false
    * mustMatch (Booolean)
        如果設(shè)置為true,autoComplete只會允許匹配的結(jié)果出現(xiàn)在輸入框,所有當(dāng)用戶輸入的是非法字符時將會得不到下拉框.Default: false
    * matchContains (Boolean)
        決定比較時是否要在字符串內(nèi)部查看匹配,如ba是否與foo bar中的ba匹配.使用緩存時比較重要.不要和autofill混用.Default: false
    * selectFirst (Boolean)
        如果設(shè)置成true,在用戶鍵入tab或return鍵時autoComplete下拉列表的第一個值將被自動選擇,盡管它沒被手工選中(用鍵盤或鼠標(biāo)).當(dāng)然如果用戶選中某個項(xiàng)目,那么就用用戶選中的值. Default: true
    * cacheLength (Number)
        緩存的長度.即對從數(shù)據(jù)庫中取到的結(jié)果集要緩存多少條記錄.設(shè)成1為不緩存.Default: 10
    * matchSubset (Boolean)
        autoComplete可不可以使用對服務(wù)器查詢的緩存,如果緩存對foo的查詢結(jié)果,那么如果用戶輸入foo就不需要再進(jìn)行檢索了,直接使用緩存.通常是打開這個選項(xiàng)以減輕服務(wù)器的負(fù)擔(dān)以提高性能.只會在緩存長度大于1時有效.Default: true
    * matchCase (Boolean)
        比較是否開啟大小寫敏感開關(guān).使用緩存時比較重要.如果你理解上一個選項(xiàng),這個也就不難理解,就好比foot要不要到FOO的緩存中去找.Default: false
    * multiple (Boolean)
        是否允許輸入多個值即多次使用autoComplete以輸入多個值. Default: false
    * multipleSeparator (String)
        如果是多選時,用來分開各個選擇的字符. Default: ","
    * scroll (Boolean)
        當(dāng)結(jié)果集大于默認(rèn)高度時是否使用卷軸顯示 Default: true
    * scrollHeight (Number)
        自動完成提示的卷軸高度用像素大小表示 Default: 180  
    * formatItem (Function)
        為每個要顯示的項(xiàng)目使用高級標(biāo)簽.即對結(jié)果中的每一行都會調(diào)用這個函數(shù),返回值將用LI元素包含顯示在下拉列表中. Autocompleter會提供三個參數(shù)(row, i, max): 返回的結(jié)果數(shù)組, 當(dāng)前處理的行數(shù)(即第幾個項(xiàng)目,是從1開始的自然數(shù)), 當(dāng)前結(jié)果數(shù)組元素的個數(shù)即項(xiàng)目的個數(shù). Default: none, 表示不指定自定義的處理函數(shù),這樣下拉列表中的每一行只包含一個值.
    * formatResult (Function)
        和formatItem類似,但可以將將要輸入到input文本框內(nèi)的值進(jìn)行格式化.同樣有三個參數(shù),和formatItem一樣.Default: none,表示要么是只有數(shù)據(jù),要么是使用formatItem提供的值.
    * formatMatch (Function)
        對每一行數(shù)據(jù)使用此函數(shù)格式化需要查詢的數(shù)據(jù)格式. 返回值是給內(nèi)部搜索算法使用的. 參數(shù)值row
    * extraParams (Object)
        為后臺(一般是服務(wù)端的腳本)提供更多的參數(shù).和通常的作法一樣是使用一個鍵值對對象.如果傳過去的值是{ bar:4 },將會被autocompleter解析成my_autocomplete_backend.php?q=foo&bar=4 (假設(shè)當(dāng)前用戶輸入了foo). Default: {}
    * result (handler)
        此事件會在用戶選中某一項(xiàng)后觸發(fā),參數(shù)為:
        event: 事件對象. event.type為result.
        data: 選中的數(shù)據(jù)行.
        formatted:formatResult函數(shù)返回的值
        例如:
        $("#singleBirdRemote").result(function(event, data, formatted) {
            //如選擇后給其他控件賦值,觸發(fā)別的事件等等
        });

     

    posted @ 2016-06-17 17:54 奮斗成就男人 閱讀(289) | 評論 (0)編輯 收藏

    防止重復(fù)登錄請求

    過頁頭生成Token,進(jìn)行請求驗(yàn)證,解決Ajax請求安全問題。目前為止我做的最多的防止ajax請求攻擊的就是添加驗(yàn)證碼、添加隨機(jī)Token,限制同一請求在規(guī)定時間內(nèi)的最大請求數(shù)。

    下面重點(diǎn)說說添加隨機(jī)Token限制:
    token是為了防止表單重復(fù)提交,token 原理大致為:

    1:顯示表單的那個 action 中使用 createToken() 生成一個隨機(jī)的 token值,并存放在服務(wù)端(session或者cache中),并且傳遞一份到頁面中

    2:表單頁面使用一個隱藏表單域獲取后端傳過來的 token值,該表單頁面提交時會將此 token 值一同提交到后端

    3:在表單頁面提交到的 actioin 中使用 validateToken() 將服務(wù)端與表單隱藏域中的 token 值進(jìn)行對比,如果服務(wù)端存在 token值并且與表單提交過來的值相等,證明是第一次提交。

    4:每次校驗(yàn)過后服務(wù)端的 token 值會立即被清除,所以當(dāng)用戶重復(fù)提交時,后面的提交校驗(yàn)都再也無法通過。從而實(shí)現(xiàn)了防止重復(fù)提交的功能,validateToken 是在 synchronized 塊中執(zhí)行的保障了多線程下的安全性。

        token 會優(yōu)先存入 me.setTokenCache(ITokenCache) 指定的 TokenCache 中,如果未指定則默認(rèn)使用 session 來存放

    但是這種機(jī)制是有問題的,比如我是用ajax提交表單,提交完成以后表單頁面并不刷新,然后我修改了部分?jǐn)?shù)據(jù)以后再次提交頁面,那么token還是之前的那個token,后臺會以為這個為重復(fù)提交不能通過校驗(yàn),那么請求就不能完成,數(shù)據(jù)無法得到正確的處理。我認(rèn)為合理的機(jī)制應(yīng)該是這樣的:

    1:顯示表單的那個 action 中使用 createToken() 生成一個隨機(jī)的 token值,并且傳遞一份到頁面中

    2:表單頁面使用一個隱藏表單域獲取后端傳過來的 token值,該表單頁面提交時會將此 token 值一同提交到后端

    3:將提交過來的token值放入session或者cache中,然后執(zhí)行controller中的代碼,代碼全部執(zhí)行完以后,再把存入session或cache中的token值刪除掉;驗(yàn)證用戶是否為重復(fù)提交只需要驗(yàn)證提交過來的token是否存在于session或cache中,有則為重復(fù)提交,無則為正常提交。

    4:該邏輯應(yīng)該可以寫成一個Interceptor,在需要的地方加上,或者直接設(shè)為全局?jǐn)r截器都是可以的,簡單,快捷;

    posted @ 2015-12-03 16:03 奮斗成就男人 閱讀(502) | 評論 (0)編輯 收藏

    在Java中直接調(diào)用js代碼

    JDK1.6版添加了新的ScriptEngine類,允許用戶直接執(zhí)行js代碼。

    在Java中直接調(diào)用js代碼

    不能調(diào)用瀏覽器中定義的js函數(shù),會拋出異常提示ReferenceError: “alert” is not defined。

     
    package com.sinaapp.manjushri; 
    import javax.script.ScriptEngine; 
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;   /**  * 直接調(diào)用js代碼  */
    public class ScriptEngineTest {    
    public static void main(String[] args) { 
      ScriptEngineManager manager = new ScriptEngineManager();
      ScriptEngine engine = manager.getEngineByName("javascript");
         try{                engine.eval("var a=3; var b=4;print (a+b);");           // engine.eval("alert(\"js alert\");");    // 不能調(diào)用瀏覽器中定義的js函數(shù) // 錯誤,會拋出alert引用不存在的異常
     }catch(ScriptException e){   e.printStackTrace();  }  }    }

    輸出結(jié)果:7

    在Java中綁定js變量

    在調(diào)用engine.get(key);時,如果key沒有定義,則返回null

     
    package com.sinaapp.manjushri;     import javax.script.Bindings;   import javax.script.ScriptContext;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;   import javax.script.ScriptException;     public class ScriptEngineTest2 {    public static void main(String[] args) {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");    engine.put("a", 4);    engine.put("b", 3);    Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);   try {                          // 只能為Double,使用Float和Integer會拋出異常      Double result = (Double) engine.eval("a+b");         System.out.println("result = " + result);     engine.eval("c=a+b");      Double c = (Double)engine.get("c");      System.out.println("c = " + c);         } catch (ScriptException e) {     e.printStackTrace();         }      }   }

    輸出:
    result = 7.0
    c = 7.0

    在Java中調(diào)用js文件中的function,傳入調(diào)用參數(shù),并獲取返回值

    js文件中的merge函數(shù)將兩個參數(shù)a,b相加,并返回c。

     
    // expression.js 
    function merge(a, b) { 
     c = a * b; 
     return c; 
    }

    在Java代碼中讀取js文件,并參數(shù)兩個參數(shù),然后回去返回值。

     
    package com.sinaapp.manjushri;     import java.io.FileReader;    import javax.script.Invocable;   import javax.script.ScriptEngine;   import javax.script.ScriptEngineManager;    /**  * Java調(diào)用并執(zhí)行js文件,傳遞參數(shù),并活動返回值  *   * @author manjushri  */   public class ScriptEngineTest {      public static void main(String[] args) throws Exception {    ScriptEngineManager manager = new ScriptEngineManager();    ScriptEngine engine = manager.getEngineByName("javascript");       String jsFileName = "expression.js";   // 讀取js文件     FileReader reader = new FileReader(jsFileName);   // 執(zhí)行指定腳本    engine.eval(reader);     if(engine instanceof Invocable) {     Invocable invoke = (Invocable)engine;    // 調(diào)用merge方法,并傳入兩個參數(shù)      // c = merge(2, 3);      Double c = (Double)invoke.invokeFunction("merge", 2, 3);      System.out.println("c = " + c);    }     reader.close();      } }

    輸出結(jié)果:
    c = 5.0


    java調(diào)用腳本語言筆記(jython,jruby,groovy)

     有兩種方法
    1.java se 6以后實(shí)現(xiàn)了jsr 223規(guī)范
    java代碼:

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"  
    3. scriptEngine.eval(code);//執(zhí)行一段腳本,code是js代碼  


     很方便調(diào)用腳本

    2.可以使用腳本語方本身提供的與java的集成手段

    jython集成
    使用jsr223:
    前提下載jython的包,已實(shí)現(xiàn)jsr223
    (建議在官網(wǎng)上下載,在安裝目錄下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 這里也有,但是這個包里沒有jsr223的實(shí)現(xiàn),看包下存不存在org.python.jsr223)

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"  
    3. scriptEngine.eval(code);  


    使用PythonInterpreter,可以調(diào)用exec(String code)方法:

    [java]
    1. PythonInterpreter interpreter = new PythonInterpreter();  
    2. interpreter.exec(code);  

    訪問數(shù)據(jù)庫
    使用jdbc:

    [python] 
    1. from oracle.jdbc.driver import OracleDriver  
    2. from java.sql import DriverManager  
    3.   
    4. username = 'hr'  
    5. password = '123456'  
    6. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    7. driver = OracleDriver()  
    8. DriverManager.registerDriver(driver)  
    9. conn = DriverManager.getConnection(url, username, password)  
    10. stmt = conn.createStatement()  
    11. sql = "select salary from EMPLOYEES t where t.salary<2300"  
    12. rs = stmt.executeQuery(sql)  
    13. while (rs.next()):  
    14.  print rs.getInt('salary')  
    15. rs.close()  
    16. stmt.close()  


     結(jié)果:
    2200
    2100
    2200

    使用zxJDBC :

    [python] 
    1. from com.ziclix.python.sql import zxJDBC  
    2.   
    3. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    4. username = 'hr'  
    5. password = '123456'  
    6. driverName = 'oracle.jdbc.driver.OracleDriver'  
    7. mysqlConn = zxJDBC.connect(url,username, password,driverName)  
    8. cursor = mysqlConn.cursor()       
    9. cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");  
    10. #print cursor.fetchone()  
    11. list = cursor.fetchall()  
    12. for record in list:  
    13.     print "name:"+record[0]  
    14. #print cursor.description[0]  
    15. #print cursor.description[1]  


     結(jié)果:
    name:麥克
    name:Olson
    name:Philtanker

    從數(shù)據(jù)庫中查出的中文內(nèi)容正常的。
    而在代碼里面的中文全部是亂碼或拋異常,未解決。

    與jruby集成
    使用jsr223:Java代碼

    [java]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"  
    3. scriptEngine.eval(code);  

     訪問數(shù)據(jù)庫

    Ruby代碼

    [ruby] 
    1. require 'java'  
    2.   
    3. module JavaLang  
    4.   include_package "java.lang"  
    5. end  
    6.   
    7. module JavaSql  
    8.   include_package 'java.sql'  
    9. end  
    10.   
    11. begin  
    12.  username = 'hr'  
    13.  password = '123456'  
    14.  url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    15.  driverName = 'oracle.jdbc.driver.OracleDriver'  
    16.  JavaLang::Class.forName(driverName).newInstance  
    17.  conn = JavaSql::DriverManager.getConnection(url, username, password)  
    18.  stmt = conn.createStatement  
    19.  sql = "select last_name from EMPLOYEES t where t.salary<2300"  
    20.  rs = stmt.executeQuery(sql)  
    21.  while (rs.next) do  
    22.   puts "名字:"+rs.getString("last_name")  
    23.  end  
    24.  rs.close  
    25.  stmt.close  
    26.  conn.close()  
    27. rescue JavaLang::ClassNotFoundException  
    28.  puts "ClassNotFoundException"  
    29. rescue JavaSql::SQLException  
    30.  puts "SQLException"  
    31. end  


     

     結(jié)果:
    名字:楹﹀厠
    名字:Olson
    名字:Philtanker

     

    從數(shù)據(jù)庫中查出的中文內(nèi)容為亂碼的。
    而在代碼里面的中文正常。

     

    與groovy集成
    使用jsr223:

    Java代碼

    [java] 
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"  
    3. scriptEngine.eval(code);  


     使用GroovyShell:

    Java代碼

    [java] 
    1. GroovyShell shell = new GroovyShell();  
    2. Script script = shell.parse(code);  
    3. Object result = script.run();  


    訪問數(shù)據(jù)庫

    Groovy代碼

     

    1. import groovy.sql.Sql  
    2.   
    3. def username = 'hr'  
    4. def password = '123456'  
    5. def url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    6. def driverName = 'oracle.jdbc.driver.OracleDriver'  
    7. def sql = Sql.newInstance(url, username, password, driverName)  
    8.   
    9. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {  
    10.  println "名字:${it.last_name}"  
    11. }  

    結(jié)果:
    名字:麥克
    名字:Olson
    名字:Philtanker

     

    在使用groovy過程中碰到了一個異常
    Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call
    這個異常解決花了很長時間
    是因?yàn)樵谠瓉眄?xiàng)目中存在json-lib-2.1.jar(有可能名稱為json-lib-2.1-jdk15.jar),這個包是用來處理json的,與groovy1.7.5存在沖突,更新為json-lib-2.3.jar即可
    (json-lib里有一些groovy運(yùn)行時處理的內(nèi)容)

    posted @ 2015-11-19 00:25 奮斗成就男人 閱讀(2935) | 評論 (0)編輯 收藏

    Java導(dǎo)入證書的問題(PKIX:unable to find valid certification path to requested target 的問題)

    這兩天Java服務(wù)器上忽然遇到這樣的異常:

    avax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    問題的根本是:

    缺少安全證書時出現(xiàn)的異常。

    解決問題方法:

    將你要訪問的webservice/url....的安全認(rèn)證證書導(dǎo)入到客戶端即可。


    以下是獲取安全證書的一種方法,通過以下程序獲取安全證書:

    /*
     * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Sun Microsystems nor the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     
    */

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.security.KeyStore;
    import java.security.MessageDigest;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLException;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;

    public class InstallCert {

        public static void main(String[] args) throws Exception {
            String host;
            int port;
            char[] passphrase;
            if ((args.length == 1) || (args.length == 2)) {
                String[] c = args[0].split(":");
                host = c[0];
                port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
                String p = (args.length == 1) ? "changeit" : args[1];
                passphrase = p.toCharArray();
            } else {
                System.out
                        .println("Usage: java InstallCert <host>[:port] [passphrase]");
                return;
            }

            File file = new File("jssecacerts");
            if (file.isFile() == false) {
                char SEP = File.separatorChar;
                File dir = new File(System.getProperty("java.home") + SEP + "lib"
                        + SEP + "security");
                file = new File(dir, "jssecacerts");
                if (file.isFile() == false) {
                    file = new File(dir, "cacerts");
                }
            }
            System.out.println("Loading KeyStore " + file + "");
            InputStream in = new FileInputStream(file);
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(in, passphrase);
            in.close();

            SSLContext context = SSLContext.getInstance("TLS");
            TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(ks);
            X509TrustManager defaultTrustManager = (X509TrustManager) tmf
                    .getTrustManagers()[0];
            SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
            context.init(nullnew TrustManager[] { tm }, null);
            SSLSocketFactory factory = context.getSocketFactory();

            System.out
                    .println("Opening connection to " + host + ":" + port + "");
            SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
            socket.setSoTimeout(10000);
            try {
                System.out.println("Starting SSL handshake");
                socket.startHandshake();
                socket.close();
                System.out.println();
                System.out.println("No errors, certificate is already trusted");
            } catch (SSLException e) {
                System.out.println();
                e.printStackTrace(System.out);
            }

            X509Certificate[] chain = tm.chain;
            if (chain == null) {
                System.out.println("Could not obtain server certificate chain");
                return;
            }

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    System.in));

            System.out.println();
            System.out.println("Server sent " + chain.length + " certificate(s):");
            System.out.println();
            MessageDigest sha1 = MessageDigest.getInstance("SHA1");
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            for (int i = 0; i < chain.length; i++) {
                X509Certificate cert = chain[i];
                System.out.println(" " + (i + 1) + " Subject "
                        + cert.getSubjectDN());
                System.out.println("   Issuer  " + cert.getIssuerDN());
                sha1.update(cert.getEncoded());
                System.out.println("   sha1    " + toHexString(sha1.digest()));
                md5.update(cert.getEncoded());
                System.out.println("   md5     " + toHexString(md5.digest()));
                System.out.println();
            }

            System.out
                    .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
            String line = reader.readLine().trim();
            int k;
            try {
                k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
            } catch (NumberFormatException e) {
                System.out.println("KeyStore not changed");
                return;
            }

            X509Certificate cert = chain[k];
            String alias = host + "-" + (k + 1);
            ks.setCertificateEntry(alias, cert);

            OutputStream out = new FileOutputStream("jssecacerts");
            ks.store(out, passphrase);
            out.close();

            System.out.println();
            System.out.println(cert);
            System.out.println();
            System.out
                    .println("Added certificate to keystore 'jssecacerts' using alias '"
                            + alias + "'");
        }

        private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

        private static String toHexString(byte[] bytes) {
            StringBuilder sb = new StringBuilder(bytes.length * 3);
            for (int b : bytes) {
                b &= 0xff;
                sb.append(HEXDIGITS[b >> 4]);
                sb.append(HEXDIGITS[b & 15]);
                sb.append(' ');
            }
            return sb.toString();
        }

        private static class SavingTrustManager implements X509TrustManager {

            private final X509TrustManager tm;
            private X509Certificate[] chain;

            SavingTrustManager(X509TrustManager tm) {
                this.tm = tm;
            }

            public X509Certificate[] getAcceptedIssuers() {
                throw new UnsupportedOperationException();
            }

            public void checkClientTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                throw new UnsupportedOperationException();
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                this.chain = chain;
                tm.checkServerTrusted(chain, authType);
            }
        }

    }

    編譯InstallCert.java,然后執(zhí)行:java InstallCert hostname,比如:
    java InstallCert www.twitter.com
    會看到如下信息:

    java InstallCert www.twitter.com
    Loading KeyStore /usr/java/jdk1.6.0_16/jre/lib/security/cacerts
    Opening connection to www.twitter.com:443
    Starting SSL handshake

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038)
        at InstallCert.main(InstallCert.java:63)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
        at sun.security.validator.Validator.validate(Validator.java:203)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
        at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158)
        at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839)
         7 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
         13 more

    Server sent 2 certificate(s):

     1 Subject CN=www.twitter.com, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7 
       md5     dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54 

     2 Subject CN=Certificate Shack, O=example.com, C=US
       Issuer  CN=Certificate Shack, O=example.com, C=US
       sha1    fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6 
       md5     72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68 

    Enter certificate to add to trusted keystore or 'q' to quit: [1]


    輸入1,回車,然后會在當(dāng)前的目錄下產(chǎn)生一個名為“ssecacerts”的證書。

    將證書拷貝到$JAVA_HOME/jre/lib/security目錄下,或者通過以下方式:
    System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts證書路徑");



    注意:因?yàn)槭庆o態(tài)加載,所以要重新啟動你的Web Server,證書才能生效。


    試了以上的方法,后來發(fā)現(xiàn)還不行。最后突然心血來潮:我把Myeclipse關(guān)閉,直接啟動Tomcat,然后運(yùn)行,居然就可以了。具體原因沒有找到。估計是
    我的Myeclipse引用的JDK引用不對。后來就沒有具體找原因了。

    posted @ 2015-10-30 15:06 奮斗成就男人 閱讀(1419) | 評論 (0)編輯 收藏

    常用的MySQL語句寫法

    MySQLSQL語句寫法,除了那些基本的之外,還有一些也算比較常用的,這里記錄下來,以便以后查找。
        好記性不如爛筆頭,這話說的太有道理了,一段時間不寫它,還真容易忘記。大家不要糾結(jié)這些SQL語句包含的業(yè)務(wù)或是其它問題,本文只是一篇筆記而已。

        將數(shù)據(jù)從T1表導(dǎo)入到T2
    INSERT INTO T2 (C1,C2) SELECT C1,C2 FROM T1 [WHERE C1 = XX AND C2 = XX ORDER BY C1]

        使用T2表的NAME來更新T1表的NAME
    UPDATE T1 AS A, T2 AS B SET A.NAME = B.NAME WHERE A.TID = B.ID

        兩表的關(guān)聯(lián)更新
    UPDATE T_ROLE_USER AS A,
     (
        SELECT
            ID
        FROM
            T_USER
        WHERE
            DEPARTID IN (
                SELECT
                    ID
                FROM
                    T_DEPART
                WHERE
                    LENGTH(ORG_CODE) = 9
            )
    AS B
    SET A.ROLEID = '123456'
    WHERE
        A.USERID = B.ID

        自己和自己關(guān)聯(lián)更新
    UPDATE T_DEPART AS A,
     (
        SELECT
            ID,
            SUBSTRING(ORG_CODE, 16) ORG_CODE
        FROM
            T_DEPART
        WHERE
            LENGTH(ORG_CODE) = 8
        AND PARENT_DEPART_ID IS NOT NULL
    AS B
    SET A.PARENT_DEPART_ID = B.ID
    WHERE
        SUBSTRING(A.ORG_CODE, 16= B.ORG_CODE

        兩表關(guān)聯(lián)刪除,將刪除兩表中有關(guān)聯(lián)ID并且T2NAME為空的兩表記錄
    DELETE A,B FROM T1 AS A LEFT JOIN T2 AS B ON A.TID = B.ID WHERE B.NAME IS NULL

        將統(tǒng)計結(jié)果插入到表
    INSERT INTO SE_STAT_ORG (
        RECORD_DATE,
        ORG_ID,
        ORG_NAME,
        SIGN_CONT_COUNT,
        SIGN_ARRI_CONT_COUNT,
        SIGN_CONT_MONEY,
        SIGN_ARRI_CONT_MONEY,
        TOTAL_ARRI_CONT_COUNT,
        TOTAL_ARRI_MONEY,
        PUBLISH_TOTAL_COUNT,
        PROJECT_COUNT
    SELECT
        *
    FROM
        (
            SELECT
                '2012-06-09' RECORD_DATE,
                PARENT_ORG_ID,
                PARENT_ORG_NAME,
                SUM(SIGN_CONT_COUNT) SIGN_CONT_COUNT,
                SUM(SIGN_ARRI_CONT_COUNT) SIGN_ARRI_CONT_COUNT,
                SUM(SIGN_CONT_MONEY) SIGN_CONT_MONEY,
                SUM(SIGN_ARRI_CONT_MONEY) SIGN_ARRI_CONT_MONEY,
                SUM(TOTAL_ARRI_CONT_COUNT) TOTAL_ARRI_CONT_COUNT,
                SUM(TOTAL_ARRI_MONEY) TOTAL_ARRI_MONEY,
                SUM(PUBLISH_TOTAL_COUNT) PUBLISH_TOTAL_COUNT,
                SUM(PROJECT_COUNT) PROJECT_COUNT,
            FROM SE_STAT_USER
            WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
            GROUP BY PARENT_ORG_ID
        ) M

        三表關(guān)聯(lián)更新
    UPDATE SE_STAT_USER A,
     (
        SELECT
            USER_ID,
            SUM(INVEST_ORG_COUNT + FINANCIAL_ORG_COUNT + INTERMEDIARY_ORG_COUNT + ENTERPRISE_COUNT) AS COMMON_COUNT
        FROM SE_STAT_USER
        WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
        GROUP BY USER_ID
    ) B,
     (
        SELECT
            USER_ID,
            SUM(ESTABLISH_COUNT + STOCK_COUNT + MERGER_COUNT + ACHIEVE_COUNT) AS PROJECT_COUNT
        FROM SE_STAT_USER
        WHERE DATE_FORMAT(RECORD_DATE, '%Y-%m-%d'= '2012-06-09'
        GROUP BY USER_ID
    ) C
    SET A.COMMON_COUNT = B.COMMON_COUNT, A.PROJECT_COUNT = C.PROJECT_COUNT
    WHERE A.USER_ID = B.USER_ID
    AND A.USER_ID = C.USER_ID
    AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-09'

        帶條件的關(guān)聯(lián)更新
    UPDATE SE_STAT_USER A,
     (
        SELECT
            P.CHANNEL,
            COUNT(P.CONT_ID) AS CONT_COUNT,
            C.CUST_MGR_ID
        FROM
            (
                SELECT
                    CHANNEL,
                    CONT_ID
                FROM SK_PROJECT
                WHERE PROJECT_STATUS = 6
                AND DATE_FORMAT(AUDIT_TIME, '%Y-%m-%d'= '2012-06-11'
            ) p
        INNER JOIN SE_CONTRACT C ON P.CONT_ID = C.CONT_ID
        GROUP BY P.CHANNEL, C.CUST_MGR_ID
    ) B
    SET
        A.STOCK_COUNT = CASE WHEN B.CHANNEL = 2 THEN B.CONT_COUNT ELSE 0 END,
        A.ESTABLISH_COUNT = CASE WHEN B.CHANNEL = 3 THEN B.CONT_COUNT ELSE 0 END,
        A.ACHIEVE_COUNT = CASE WHEN B.CHANNEL = 4 THEN B.CONT_COUNT ELSE 0 END
        A.BRAND_COUNT = CASE WHEN B.CHANNEL = 5 THEN B.CONT_COUNT ELSE 0 END,
        A.MERGER_COUNT = CASE WHEN B.CHANNEL = 6 THEN B.CONT_COUNT ELSE 0 END
    WHERE
        A.USER_ID = B.CUST_MGR_ID
    AND DATE_FORMAT(A.RECORD_DATE, '%Y-%m-%d'= '2012-06-11'

        加索引
    ALTER TABLE PROJECT ADD INDEX INDEX_USER_ID (USER_ID),
            ADD INDEX INDEX_PROJECT_STATUS (PROJECT_STATUS);

        刪除列
    ALTER TABLE PROJECT DROP COLUMN PROJECT_STATUS,
            DROP COLUMN EXPECT_RETURN,DROP COLUMN CURRENCY;

        增加列
    ALTER TABLE PROJECT 
            ADD COLUMN DICT_ID INT DEFAULT NULL COMMENT 'xxx' AFTER PROJECT_SITE,
            ADD COLUMN INTRODUCE TEXT DEFAULT NULL COMMENT 'xx' AFTER DICT_ID,
            ADD COLUMN STAGE INT DEFAULT NULL COMMENT 'xx' AFTER ID,
            ADD COLUMN ATTACH_URI VARCHAR(8DEFAULT NULL COMMENT 'xxx' AFTER INTRODUCE;

        修改列,一般用MODIFY修改數(shù)據(jù)類型,CHANGE修改列名
    ALTER TABLE PROJECT CHANGE DICT_ID DICT_ID1 INT NOT NULL,
            MODIFY PROJECT_STATUS TINYINT NOT NULL COMMENT 'xxx';

    posted @ 2015-08-09 23:31 奮斗成就男人 閱讀(403) | 評論 (0)編輯 收藏

    程序員必看的書

    做為一名程序員,如果你只顧得寫代碼,那是不行的,要抽出一下時間來豐富自己的知識,多看看書,在這里我將為程序員們推薦一些不錯的書。能夠給程序員們帶來幫助。

    大數(shù)據(jù)時代

    5487a5bd00010d2903120426

    《大數(shù)據(jù)時代》是國外大數(shù)據(jù)研究的先河之作,本書作者維克托•邁爾•舍恩伯格被譽(yù)為"大數(shù)據(jù)商業(yè)應(yīng)用第一人",擁有在哈佛大學(xué)、牛津大學(xué)、耶魯大學(xué)和新加坡國立大學(xué)等多個互聯(lián)網(wǎng)研究重鎮(zhèn)任教的經(jīng)歷,早在2010年就在《經(jīng)濟(jì)學(xué)人》上發(fā)布了長達(dá)14頁對大數(shù)據(jù)應(yīng)用的前瞻性研究。

    維克托•邁爾•舍恩伯格在書中前瞻性地指出,大數(shù)據(jù)帶來的信息風(fēng)暴正在變革我們的生活、工作和思維,大數(shù)據(jù)開啟了一次重大的時代轉(zhuǎn)型,并用三個部分講述了大數(shù)據(jù)時代的思維變革、商業(yè)變革和管理變革。

    維克托最具洞見之處在于,他明確指出,大數(shù)據(jù)時代最大的轉(zhuǎn)變就是,放棄對因果關(guān)系的渴求,而取而代之關(guān)注相關(guān)關(guān)系。也就是說只要知道"是什么",而不需要知道"為什么"。這就顛覆了千百年來人類的思維慣例,對人類的認(rèn)知和與世界交流的方式提出了全新的挑戰(zhàn)。

     淘寶技術(shù)這十年

    5487a5c800013dae03030438

    《淘寶技術(shù)這十年》內(nèi)容簡介:任何網(wǎng)站的發(fā)展都不是一蹴而就的。它在發(fā)展過程中會遇到各種各樣的問題和業(yè)務(wù)帶來的壓力。正是這些問題和壓力推動著技術(shù)的進(jìn)步和發(fā)展,而技術(shù)的發(fā)展反過來又會促進(jìn)業(yè)務(wù)的更大提升。如今淘寶網(wǎng)的流量排名已是全球前15名、國內(nèi)前3名,其系統(tǒng)服務(wù)器也從一臺發(fā)展到萬臺以上。

    《淘寶技術(shù)這十年》從工程師的角度講述淘寶這個超大規(guī)模互聯(lián)網(wǎng)系統(tǒng)的成長歷程,及其所有主動和被動的技術(shù)變革的前因后果。書中有幕后故事、產(chǎn)品經(jīng)驗(yàn)、架構(gòu)演進(jìn)、技術(shù)啟蒙,也有大牛成長、業(yè)內(nèi)八卦、失敗案例、勵志故事。《淘寶技術(shù)這十年》文風(fēng)流暢,有技術(shù)人員特有的幽默感;內(nèi)容積極正面,有現(xiàn)場感,全部是作者親身經(jīng)歷。

    白帽子講Web安全

    5487a7b90001fa2303030438

    《白帽子講Web安全》內(nèi)容簡介:在互聯(lián)網(wǎng)時代,數(shù)據(jù)安全與個人隱私受到了前所未有的挑戰(zhàn),各種新奇的攻擊技術(shù)層出不窮。如何才能更好地保護(hù)我們的數(shù)據(jù)?《白帽子講Web安全》將帶你走進(jìn)Web安全的世界,讓你了解Web安全的方方面面。黑客不再變得神秘,攻擊技術(shù)原來我也可以會,小網(wǎng)站主自己也能找到正確的安全道路。大公司是怎么做安全的,為什么要選擇這樣的方案呢?你能在《白帽子講Web安全》中找到答案。詳細(xì)的剖析,讓你不僅能"知其然",更能"知其所以然"。

    重構(gòu):改善既有代碼的設(shè)計

    5487a7c400010cce04000400

    《重構(gòu):改善既有代碼的設(shè)計》清晰地揭示了重構(gòu)的過程,解釋了重構(gòu)的原理和最佳實(shí)踐方式,并給出了何時以及何地應(yīng)該開始挖掘代碼以求改善。書中給出了70多個可行的重構(gòu),每個重構(gòu)都介紹了一種經(jīng)過驗(yàn)證的代碼變換手法的動機(jī)和技術(shù)。《重構(gòu):改善既有代碼的設(shè)計》提出的重構(gòu)準(zhǔn)則將幫助你一次一小步地修改你的代碼,從而減少了開發(fā)過程中的風(fēng)險。

    《重構(gòu):改善既有代碼的設(shè)計》適合軟件開發(fā)人員、項(xiàng)目管理人員等閱讀,也可作為高等院校計算機(jī)及相關(guān)專業(yè)師生的參考讀物。

    代碼整潔之道

    5487a7cf000167fd03240408

    軟件質(zhì)量,不但依賴于架構(gòu)及項(xiàng)目管理,而且與代碼質(zhì)量緊密相關(guān)。這一點(diǎn),無論是敏捷開發(fā)流派還是傳統(tǒng)開發(fā)流派,都不得不承認(rèn)。《代碼整潔之道》提出一種觀念:代碼質(zhì)量與其整潔度成正比。干凈的代碼,既在質(zhì)量上較為可靠,也為后期維護(hù)、升級奠定了良好基礎(chǔ)。

    作為編程領(lǐng)域的佼佼者,《代碼整潔之道》作者給出了一系列行之有效的整潔代碼操作實(shí)踐。這些實(shí)踐在《代碼整潔之道》中體現(xiàn)為一條條規(guī)則(或稱"啟示"),并輔以來自現(xiàn)實(shí)項(xiàng)目的正、反兩面的范例。只要遵循這些規(guī)則,就能編寫出干凈的代碼,從而有效提升代碼質(zhì)量。

    《代碼整潔之道》閱讀對象為一切有志于改善代碼質(zhì)量的程序員及技術(shù)經(jīng)理。書中介紹的規(guī)則均來自作者多年的實(shí)踐經(jīng)驗(yàn),涵蓋從命名到重構(gòu)的多個編程方面,雖為一"家"之言,然誠有可資借鑒的價值。

    設(shè)計模式之禪 (第2版)


    549ccdfa00018b6503630363

      本書是設(shè)計模式領(lǐng)域公認(rèn)的3本經(jīng)典著作之一,"極具趣味,容易理解,但講解又極為嚴(yán)謹(jǐn)和透徹"是本書的寫作風(fēng)格和方法的最大特點(diǎn)。第1版2010年出版,暢銷至今,廣受好評,是該領(lǐng)域的里程碑著作。深刻解讀6大設(shè)計原則和28種設(shè)計模式的準(zhǔn)確定義、應(yīng)用方法和最佳實(shí)踐,全方位比較各種同類模式之間的異同,詳細(xì)講解將不同的模式組合使用的方法。第2版在第1版的基礎(chǔ)上有兩方面的改進(jìn),一方面結(jié)合讀者的意見和建議對原有內(nèi)容中的瑕疵進(jìn)行了修正和完善,另一方面增加了4種新的設(shè)計模式,希望這一版能為廣大程序員們奉上一場更加完美的設(shè)計模式盛宴!

    程序員修煉之道

    549cce040001ee3b03150420

      《程序員修煉之道》由一系列的獨(dú)立的部分組成,涵蓋的主題從個人責(zé)任、職業(yè)發(fā)展,直到用于使代碼保持靈活、并且易于改編和復(fù)用的各種架構(gòu)技術(shù)。利用許多富有娛樂性的奇聞軼事、有思想性的例子以及有趣的類比,全面闡釋了軟件開發(fā)的許多不同方面的最佳實(shí)踐和重大陷阱。無論你是初學(xué)者,是有經(jīng)驗(yàn)的程序員,還是軟件項(xiàng)目經(jīng)理,本書都適合你閱讀。

    平臺戰(zhàn)略:正在席卷全球的商業(yè)模式革命

    549cce0e00012ad003120426

    《平臺戰(zhàn)略:正在席卷全球的商業(yè)模式革命》內(nèi)容簡介:平臺商業(yè)模式的精髓,在于打造一個完善的、成長潛能強(qiáng)大的"生態(tài)圈"。它擁有獨(dú)樹一幟的精密規(guī)范和機(jī)制系統(tǒng),能有效激勵多方群體之間互動,達(dá)成平臺企業(yè)的愿景。縱觀全球許多重新定義產(chǎn)業(yè)架構(gòu)的企業(yè),我們往往就會發(fā)現(xiàn)它們成功的關(guān)鍵——建立起良好的"平臺生態(tài)圈",連接兩個以上群體,彎曲、打碎了既有的產(chǎn)業(yè)鏈。

    平臺生態(tài)圈里的一方群體,一旦因?yàn)樾枨笤黾佣鴫汛螅硪环饺后w的需求也會隨之增長。如此一來,一個良性循環(huán)機(jī)制便建立了,通過此平臺交流的各方也會促進(jìn)對方無限增長。而通過平臺模式達(dá)到戰(zhàn)略目的,包括規(guī)模的壯大和生態(tài)圈的完善,乃至對抗競爭者,甚至是拆解產(chǎn)業(yè)現(xiàn)狀、重塑市場格局。

    互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄

    549cce170001475203030438

    《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》是一部互聯(lián)網(wǎng)公司的創(chuàng)業(yè)指南,內(nèi)容涉及網(wǎng)站創(chuàng)業(yè)的現(xiàn)狀和機(jī)遇、創(chuàng)業(yè)公司價值、平臺選擇、工具和群組、資金的籌集、管理和盈利、社會化媒體環(huán)境、行動執(zhí)行管理、開發(fā)人員方法論和工作效率、創(chuàng)始人的角色等方面,既有綱領(lǐng)和指導(dǎo)性理論,又有具體操作方法。書中大量對互聯(lián)網(wǎng)創(chuàng)業(yè)成功人士的訪談介紹,以及創(chuàng)業(yè)公司的成功案例,更可以作為初次創(chuàng)業(yè)者的良好借鑒。

    《互聯(lián)網(wǎng)創(chuàng)業(yè)啟示錄》主要寫給想自己創(chuàng)業(yè)的程序員,但同樣適合非技術(shù)人員,適合網(wǎng)絡(luò)創(chuàng)業(yè)者、大學(xué)生創(chuàng)業(yè)者、網(wǎng)絡(luò)營銷人員及一切有志創(chuàng)業(yè)者。做網(wǎng)絡(luò)不一定要懂技術(shù),互聯(lián)網(wǎng)的成功是可以借鑒和延伸的!

    程序員健康指南

    549cce2600015a5003600369

    本書是為程序員量身制作的健康指南,針對頭痛、眼部疲勞、背部疼痛和手腕疼痛等常見的問題,簡要介紹了其成因、測試方法,并列出了每天的行動計劃,從運(yùn)動、飲食等方面給出詳細(xì)指導(dǎo),幫助程序員在不改變工作方式的情況下輕松擁有健康。

    本書適合程序員、長期伏案工作的其他人群以及所有關(guān)心健康的人士閱讀。

    結(jié)網(wǎng)@改變世界的互聯(lián)網(wǎng)產(chǎn)品經(jīng)理

    54aa4f680001268603060435

    本書以如何創(chuàng)建、發(fā)布、推廣互聯(lián)網(wǎng)產(chǎn)品為主線,介紹了互聯(lián)網(wǎng)產(chǎn)品經(jīng)理的工作內(nèi)容以及應(yīng)對每一部分工作所需的方法和工具。為用戶創(chuàng)造價值是產(chǎn)品經(jīng)理的第一要務(wù),產(chǎn)品經(jīng)理的工作是圍繞用戶及具體任務(wù)展開的,本書豐富的案例和透徹的分析道出了從發(fā)現(xiàn)用戶到最終滿足用戶這一過程背后的玄機(jī)。

    本書面向現(xiàn)在正在從事及未來將要從事互聯(lián)網(wǎng)相關(guān)工作的創(chuàng)業(yè)者和產(chǎn)品經(jīng)理,也可以作為互聯(lián)網(wǎng)產(chǎn)品策劃人員或相關(guān)專業(yè)學(xué)生的參考書。新版完善了各章節(jié),增加了優(yōu)雅降級等內(nèi)容,讀者也可從中更深地去感受一名產(chǎn)品經(jīng)理的感悟。

    程序員面試邏輯題解析

    54aa4f7800016ca403240408

    程序員面試邏輯題解析》共分為3個部分。第一部分從有趣且鍛煉頭腦的謎題入手,繼而給出解題思路和詳細(xì)答案,更有"熱身問題"給大家提供充分的思考空間。第二部分綜合了不同類型的謎題,如數(shù)獨(dú)、調(diào)度問題及概率題等。神秘的第三部分帶領(lǐng)大家不斷歷險,開動腦筋,解決大量密碼及銀行賬戶等方面的問題。幾十道簡潔的小謎題不僅充分鍛煉了我們的思維方式,更為提高面試成功率奠定了基礎(chǔ)。

        《程序員面試邏輯題解析》不僅適合程序員閱讀,更是謎題愛好者的饕餮盛宴。

    程序員,你傷不起

    54aa4f8d000171b703060435

    本書是作者博客文章的精選集。是作者作為老牌程序員、現(xiàn)在的IT 創(chuàng)業(yè)者15 年軟件開發(fā)生涯的心路歷程和經(jīng)驗(yàn)總結(jié)。涉及程序人生、開發(fā)經(jīng)驗(yàn)、職業(yè)規(guī)劃、創(chuàng)業(yè)心得。對任何的軟件開發(fā)者和IT 從業(yè)人員都有借鑒價值。作者語言風(fēng)趣幽默,讀起來津津有味。字里行間充滿了不屈不撓的碼農(nóng)正能量。

    像程序員一樣思考

    54aa4f9800013e1e03270405

    編程的真正挑戰(zhàn)不是學(xué)習(xí)一種語言的語法,而是學(xué)習(xí)創(chuàng)造性地解決問題,從而構(gòu)建美妙的應(yīng)用。《像程序員一樣思考》分析了程序員解決問題的方法,并且教授你其他圖書所忽略的一種能力,即如何像程序員一樣思考。

    全書分為8章。第1章通對幾個經(jīng)典的算法問題切入,概括了問題解決的基本技巧和步驟。第2章通過實(shí)際編寫C++代碼來解決幾個簡單的問題,從而讓讀者進(jìn)一步體會到問題解決的思路和應(yīng)用。第3到7章是書中的主體部分,分別探討了用數(shù)組、指針和動態(tài)內(nèi)存、類、遞歸和代碼復(fù)用來解決問題的途徑和實(shí)際應(yīng)用。最后,第8章從培養(yǎng)程序員思維的角度,進(jìn)行了總結(jié)和概括,告訴讀者如何才能像程序員一樣思考。

    編寫可讀代碼的藝術(shù)

    54aa4fbf0001a7c103180417

    細(xì)節(jié)決定成敗,思路清晰、言簡意賅的代碼讓程序員一目了然;而格式凌亂、拖沓冗長的代碼讓程序員一頭霧水。除了可以正確運(yùn)行以外,優(yōu)秀的代碼必須具備良好的可讀性,編寫的代碼要使其他人能在最短的時間內(nèi)理解才行。本書旨在強(qiáng)調(diào)代碼對人的友好性和可讀性。

    本書關(guān)注編碼的細(xì)節(jié),總結(jié)了很多提高代碼可讀性的小技巧,看似都微不足道,但是對于整個軟件系統(tǒng)的開發(fā)而言,它們與宏觀的架構(gòu)決策、設(shè)計思想、指導(dǎo)原則同樣重要。編碼不僅僅只是一種技術(shù),也是一門藝術(shù),編寫可讀性高的代碼尤其如此。如果你要成為一位優(yōu)秀的程序員,要想開發(fā)出高質(zhì)量的軟件系統(tǒng),必須從細(xì)處著手,做到內(nèi)外兼修,本書將為你提供有效的指導(dǎo)。

    posted @ 2015-06-13 00:03 奮斗成就男人 閱讀(442) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 成年大片免费视频| 亚洲国产精品线观看不卡| 无码一区二区三区免费视频| eeuss在线兵区免费观看| 国产成人精品日本亚洲专一区| 亚洲色成人中文字幕网站| 日韩一级免费视频| 永久看日本大片免费35分钟| 中文字幕无码免费久久| 欧亚一级毛片免费看| 亚洲一区二区三区写真| 久久精品国产亚洲av高清漫画| 亚洲真人无码永久在线| 国产又大又长又粗又硬的免费视频| 国产成人免费在线| 久久精品视频免费看| 久久er国产精品免费观看8| 美女的胸又黄又www网站免费| 亚洲一卡2卡3卡4卡5卡6卡| 亚洲狠狠ady亚洲精品大秀| 亚洲国产精品久久久天堂| 亚洲午夜精品第一区二区8050| 国产免费无遮挡精品视频| 妞干网在线免费视频| 国产91免费在线观看| 69av免费视频| 精品免费久久久久久久| 久久一区二区三区免费播放 | jizz免费在线观看| 国产精品无码亚洲一区二区三区| 亚洲中文字幕久久精品无码VA| 亚洲三级在线免费观看| 亚洲精品**中文毛片| 亚洲精品美女久久久久| 亚洲精品美女在线观看| 亚洲人成网站在线观看播放青青| 亚洲国产精品综合一区在线| 亚洲国产最大av| 亚洲国产精品99久久久久久| 亚洲av中文无码乱人伦在线观看| 久久亚洲AV成人无码国产电影|