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

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

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

    隨筆-20  評(píng)論-2  文章-0  trackbacks-0
      2009年4月26日
    **
     * <pre>
     * Title:         HttpRequestProxy.java
     * Project:     HP-Common
     * Type:        com.hengpeng.common.web.HttpRequestProxy
     * Author:        benl
     * Create:         2007-7-3 上午03:07:07
     * Copyright:     Copyright (c) 2007
     * Company:
     * <pre>
     */
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;

    import org.apache.log4j.Logger;

    /**
     * <pre>
     * HTTP請(qǐng)求代理類
     * </pre>
     *
     * @author benl
     * @version 1.0, 2007-7-3
     */
    public class HttpRequestProxy
    {
        /**
         * 連接超時(shí)
         */
        private static int connectTimeOut = 5000;

        /**
         * 讀取數(shù)據(jù)超時(shí)
         */
        private static int readTimeOut = 10000;

        /**
         * 請(qǐng)求編碼
         */
        private static String requestEncoding = "GBK";

        private static Logger logger = Logger.getLogger(HttpRequestProxy.class);

        /**
         * <pre>
         * 發(fā)送帶參數(shù)的GET的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @param parameters 參數(shù)映射表
         * @return HTTP響應(yīng)的字符串
         */
        public static String doGet(String reqUrl, Map parameters,
                String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                for (Iterator iter = parameters.entrySet().iterator(); iter
                        .hasNext();)
                {
                    Entry element = (Entry) iter.next();
                    params.append(element.getKey().toString());
                    params.append("=");
                    params.append(URLEncoder.encode(element.getValue().toString(),
                            HttpRequestProxy.requestEncoding));
                    params.append("&");
                }

                if (params.length() > 0)
                {
                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(reqUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("GET");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();

                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer temp = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    temp.append(tempLine);
                    temp.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = temp.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }

            return responseContent;
        }

        /**
         * <pre>
         * 發(fā)送不帶參數(shù)的GET的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @return HTTP響應(yīng)的字符串
         */
        public static String doGet(String reqUrl, String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                String queryUrl = reqUrl;
                int paramIndex = reqUrl.indexOf("?");

                if (paramIndex > 0)
                {
                    queryUrl = reqUrl.substring(0, paramIndex);
                    String parameters = reqUrl.substring(paramIndex + 1, reqUrl
                            .length());
                    String[] paramArray = parameters.split("&");
                    for (int i = 0; i < paramArray.length; i++)
                    {
                        String string = paramArray[i];
                        int index = string.indexOf("=");
                        if (index > 0)
                        {
                            String parameter = string.substring(0, index);
                            String value = string.substring(index + 1, string
                                    .length());
                            params.append(parameter);
                            params.append("=");
                            params.append(URLEncoder.encode(value,
                                    HttpRequestProxy.requestEncoding));
                            params.append("&");
                        }
                    }

                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(queryUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("GET");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();
                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer temp = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    temp.append(tempLine);
                    temp.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = temp.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }

            return responseContent;
        }

        /**
         * <pre>
         * 發(fā)送帶參數(shù)的POST的HTTP請(qǐng)求
         * </pre>
         *
         * @param reqUrl HTTP請(qǐng)求URL
         * @param parameters 參數(shù)映射表
         * @return HTTP響應(yīng)的字符串
         */
        public static String doPost(String reqUrl, Map parameters,
                String recvEncoding)
        {
            HttpURLConnection url_con = null;
            String responseContent = null;
            try
            {
                StringBuffer params = new StringBuffer();
                for (Iterator iter = parameters.entrySet().iterator(); iter
                        .hasNext();)
                {
                    Entry element = (Entry) iter.next();
                    params.append(element.getKey().toString());
                    params.append("=");
                    params.append(URLEncoder.encode(element.getValue().toString(),
                            HttpRequestProxy.requestEncoding));
                    params.append("&");
                }

                if (params.length() > 0)
                {
                    params = params.deleteCharAt(params.length() - 1);
                }

                URL url = new URL(reqUrl);
                url_con = (HttpURLConnection) url.openConnection();
                url_con.setRequestMethod("POST");
                System.setProperty("sun.net.client.defaultConnectTimeout", String
                        .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個(gè),連接超時(shí)
                System.setProperty("sun.net.client.defaultReadTimeout", String
                        .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個(gè),讀操作超時(shí)
                // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                // 1.5換成這個(gè),連接超時(shí)
                // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個(gè),讀操作超時(shí)
                url_con.setDoOutput(true);
                byte[] b = params.toString().getBytes();
                url_con.getOutputStream().write(b, 0, b.length);
                url_con.getOutputStream().flush();
                url_con.getOutputStream().close();

                InputStream in = url_con.getInputStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                        recvEncoding));
                String tempLine = rd.readLine();
                StringBuffer tempStr = new StringBuffer();
                String crlf=System.getProperty("line.separator");
                while (tempLine != null)
                {
                    tempStr.append(tempLine);
                    tempStr.append(crlf);
                    tempLine = rd.readLine();
                }
                responseContent = tempStr.toString();
                rd.close();
                in.close();
            }
            catch (IOException e)
            {
                logger.error("網(wǎng)絡(luò)故障", e);
            }
            finally
            {
                if (url_con != null)
                {
                    url_con.disconnect();
                }
            }
            return responseContent;
        }

        /**
         * @return 連接超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
         */
        public static int getConnectTimeOut()
        {
            return HttpRequestProxy.connectTimeOut;
        }

        /**
         * @return 讀取數(shù)據(jù)超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
         */
        public static int getReadTimeOut()
        {
            return HttpRequestProxy.readTimeOut;
        }

        /**
         * @return 請(qǐng)求編碼
         * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
         */
        public static String getRequestEncoding()
        {
            return requestEncoding;
        }

        /**
         * @param connectTimeOut 連接超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
         */
        public static void setConnectTimeOut(int connectTimeOut)
        {
            HttpRequestProxy.connectTimeOut = connectTimeOut;
        }

        /**
         * @param readTimeOut 讀取數(shù)據(jù)超時(shí)(毫秒)
         * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
         */
        public static void setReadTimeOut(int readTimeOut)
        {
            HttpRequestProxy.readTimeOut = readTimeOut;
        }

        /**
         * @param requestEncoding 請(qǐng)求編碼
         * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
         */
        public static void setRequestEncoding(String requestEncoding)
        {
            HttpRequestProxy.requestEncoding = requestEncoding;
        }
       
        public static void main(String[] args)
        {
            Map map = new HashMap();
            map.put("actionType", "1");
    //        map.put("issueId", "33");
            String temp = HttpRequestProxy.doPost("http://192.168.0.99/AgentPortal/autoHandler", map, "GBK");
            System.out.println("返回的消息是:"+temp);
           
        }
    }

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616102329953
    posted @ 2009-07-16 10:23 C.B.K 閱讀(1811) | 評(píng)論 (1)編輯 收藏

    /*

    下面的程序說明了怎樣實(shí)現(xiàn)對(duì)象序列化和反序列化。它由實(shí)例化一個(gè)MyClass類的對(duì)象開始。該對(duì)象有三個(gè)實(shí)例變量,它們的類型分別是String,int和double。這是我們希望存儲(chǔ)和恢復(fù)的信息。

    FileOutputStream被創(chuàng)建,引用了一個(gè)名為“serial”的文件。為該文件流創(chuàng)建一個(gè)ObjectOutputStream。ObjectOutputStream 的writeObject( )方法用來序列化對(duì)象。對(duì)象的輸出流被刷新和關(guān)閉。
    然后,引用名為“serial”的文件創(chuàng)建一個(gè)FileInputStream類并為該文件創(chuàng)建一個(gè)ObjectInputStream類。ObjectInputStream 的readObject( )方法用來反序列化對(duì)象。然后對(duì)象輸入流被關(guān)閉。
    注意MyClass被定義成實(shí)現(xiàn)Serializable接口。如果不這樣做,將會(huì)引發(fā)一個(gè)NotSerializableException異常。試圖做一些把MyClass實(shí)例變量聲明成transient的實(shí)驗(yàn)。那些數(shù)據(jù)在序列化過程中不被保存

    */

    import java.io.*;
    class MyClass implements Serializable{
     String s;
     int i;
     double d;
     public MyClass (String s,int i,double d){
      this.s = s;
      this.i = i;
      this.d = d;
     }
     public String toString(){
      return "s=" + s + "; i=" + i + "; d=" + d;
     }
    }
    class SerializationDemo{
     public static void main(String[] args){
      //Object serialization.
      try{
       MyClass object1 = new MyClass("Evan",9,9.9e10);
       System.out.println("object1 : " +object1);
       FileOutputStream fos = new FileOutputStream("serial");
       ObjectOutputStream oos = new ObjectOutputStream(fos);
       oos.writeObject(object1);
       oos.flush();
       oos.close();
      }catch(Exception e){
       System.out.println("Exception during serialization :" + e);
       System.exit(0);
      }
      //Object deserialization.
      try{
       MyClass object2 ;
       FileInputStream fis = new FileInputStream("serial");
       ObjectInputStream ois = new ObjectInputStream(fis);
       object2 = (MyClass)ois.readObject();
       ois.close();
       System.out.println("object2 : " +object2);
      }catch(Exception e){
       System.out.println("Exception during serialization :" + e);
       System.exit(0);
      }
     }
    }


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616101541196
    posted @ 2009-07-16 10:16 C.B.K 閱讀(173) | 評(píng)論 (0)編輯 收藏
    Java的serialization提供了一種持久化對(duì)象實(shí)例的機(jī)制。當(dāng)持久化對(duì)象時(shí),可能有一個(gè)特殊的對(duì)象數(shù)據(jù)成員,我們不想
    用serialization機(jī)制來保存它。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉serialization,可以在這個(gè)域前加上關(guān)鍵字transient。
    transient是Java語言的關(guān)鍵字,用來表示一個(gè)域不是該對(duì)象串行化的一部分。當(dāng)一個(gè)對(duì)象被串行化的時(shí)候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進(jìn)去的。

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096161094144
    posted @ 2009-07-16 10:09 C.B.K 閱讀(158) | 評(píng)論 (0)編輯 收藏

    匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]
    匹配雙字節(jié)字符(包括漢字在內(nèi)): [^\x00-\xff]

    應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
    String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
    匹配空行的正則表達(dá)式: \n[\s| ]*\r
    匹配HTML標(biāo)記的正則表達(dá)式: /<(.*)>.*<\/>|<(.*) \/>/
    匹配首尾空格的正則表達(dá)式: (^\s*)|(\s*$)

    應(yīng)用:javascript中沒有像vbscript那樣的trim函數(shù),我們就可以利用這個(gè)表達(dá)式來實(shí)現(xiàn),如下:
    String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g, "");
    }


    利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:
    下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對(duì)應(yīng)數(shù)值的javascript程序:

    function IP2V(ip) {
    re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達(dá)式
    if(re.test(ip)) {
    return RegExp.*Math.pow(255,3))+RegExp.*Math.pow(255,2))+RegExp.*255+RegExp.*1
    }
    else {
    throw new Error("Not a valid IP address!")
    }
    }


    不過上面的程序如果不用正則表達(dá)式,而直接用split函數(shù)來分解可能更簡(jiǎn)單,程序如下:

    var ip="10.100.20.168"
    ip=ip.split(".")
    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
    匹配Email地址的正則表達(dá)式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    匹配網(wǎng)址URL的正則表達(dá)式: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?


    利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*/g,"")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2) //結(jié)果為:abcefgi


    用正則表達(dá)式從URL地址中提取文件名的javascript程序,如下結(jié)果為page1

    s="http://www.9499.net/page1.htm"
    s=s.replace(/(.*\/)([^\.]+).*/ig,"")
    alert(s)


    利用正則表達(dá)式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:

    用正則表達(dá)式限制只能輸入中文:
    onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

    用正則表達(dá)式限制只能輸入全角字符:
    onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字:
    onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    用正則表達(dá)式限制只能輸入數(shù)字和英文:
    onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961005220547
    posted @ 2009-07-10 12:52 C.B.K 閱讀(214) | 評(píng)論 (0)編輯 收藏
    ant手冊(cè)中的ant配置classpath采用classpath標(biāo)簽,可是我發(fā)現(xiàn)這樣配置總是不好用,還是直接用path可以使用
      設(shè)置classpath的方法有多種
    <path id="project.classpath">
        1<pathelement path="${basedir}/lib/aa.jar"/>
       2<pathelement location="aa.jar"/>與1的區(qū)別在于location可以去當(dāng)前路徑,當(dāng)然可以使用絕對(duì)路徑
        3<filelist id="file" dir="${basedir}/lin">
              <file name="a.jar"/>
              <file name="d:lib/b.jar"/>
         </filelist>
       4<fileset dir="d:/lib">
           <include name="**/*.jar"/>
        </fileset>
       5手冊(cè)上說了dirset也好用,但是我測(cè)試了還是不要用的
    </path>   
      下面說classpath的使用
       樣例如下
         <javac scdir="./src" destdir="./classes">
               <classpath refid="project.classpath"/> 
       </javac>


    下面是比較四種方式的優(yōu)缺點(diǎn)
       第一種調(diào)用的需要設(shè)置絕對(duì)路徑適合第三方j(luò)ar包
        第二種則適合jar包和build.xml文件在同一目錄下的情況,但是我覺得兩個(gè)文件放在一起本身就不合理,估計(jì)是用的情況不多。
      前兩個(gè)都是設(shè)置單個(gè)jar包
       第三種是一個(gè)文件集合適合引入不同路徑的jar包,但是需要輸入每個(gè)jar包的名字,比較繁瑣,適合于jar包屬于不同位置,比較分散但是不多的情況
      第四種是一個(gè)文件夾,可以采用匹配模式來引入,這個(gè)適合在同一個(gè)文件夾下,文件名字比較多的情況下

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961051533899
    posted @ 2009-07-10 05:16 C.B.K 閱讀(1648) | 評(píng)論 (0)編輯 收藏
    ant的構(gòu)建文件中,有很多核心類型,這些核心類型都是XXXSet的形式,主要有以下幾個(gè):PatternSet、DirSet、FileSet、PropertySet、ZipFileSet等。說下前三個(gè)的功能就應(yīng)該可以舉一反三了。
              1.PatternSet  即模式集合。顧名思義,就是定義一個(gè)模式,他可以用來指定一個(gè)文件集合。常常可以被外部的target引用,復(fù)用性很強(qiáng)。有includes、 includesfile、excludes、excludesfile屬性。每個(gè)屬性里面還可以嵌套name、if、unless等類型。
              2.DirSet  即目錄集合。用來定義目錄的集合。有dir、casesensitive、followsymlinks和PatternSet也有的那4個(gè)屬性。上面說過PatternSet可以很好的復(fù)用。下面就是一個(gè)例子:
    Xml代碼
    1. <dirset dir="${build.dir}">  
    2.                <patternset id="non.test.classes">  
    3.                       <include name="apps/**/classes"/>  
    4.                        <exclude name="apps/**/*Test*"/>  
    5.                 </patternset>  
    6.  </dirset>  
    <dirset dir="${build.dir}">
                   <patternset id="non.test.classes">
                          <include name="apps/**/classes"/>
                           <exclude name="apps/**/*Test*"/>
                    </patternset>
     </dirset>
    
     

            這是用patternset來定義DirSet的模式,這個(gè)模式還可以在外部引用。如:

    Xml代碼
    1. <dirset dir="{build.dir}">  
    2.                 <patternset refid="non.test.classes"/>  
    3. </dirset>  
      <dirset dir="{build.dir}">
                      <patternset refid="non.test.classes"/>
      </dirset>
     

              上面定義了一個(gè)名為non.test.classes的PatternSet,現(xiàn)在就可以引用他了。refid即reference ID.
              3.FileSet即文件集合,他的內(nèi)部屬性與DirSet幾乎一樣,只是多了一個(gè)file和defaultexcludes。和dirset一樣,經(jīng)常 嵌入patternset來定義文件集合;但是也有另外一個(gè)很常用的類型,叫selector,它并不是一個(gè)真正的類型或元素,只是一種、一類類型的統(tǒng) 稱。如contains、date、depend、depth、different、filename、present、containsregexp、 size、type等。


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096105521217
    posted @ 2009-07-10 05:05 C.B.K 閱讀(429) | 評(píng)論 (0)編輯 收藏
    第一種方法:
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    -> ON <dbname>.*
    -> TO <username>@<host name>
    -> IDENTIFIED BY '<password>';

    where <dbname> is the name of the database you are tyring to connect to, <username> is the username of the user trying to connect to the database, <host name> the name of the host (in your case the XXX host) and <password> the password of the user.
    第二種方法:
    通過客戶端軟件設(shè)置用戶的主機(jī)以及權(quán)限,
    message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952925050579
    posted @ 2009-06-29 14:51 C.B.K 閱讀(1563) | 評(píng)論 (0)編輯 收藏

    一、什么是條件變量

           與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動(dòng)阻塞一個(gè)線程,直到某特殊情況發(fā)生為止。通常條件變量和互斥鎖同時(shí)使用。

           條件變量使我們可以睡眠等待某種條件出現(xiàn)。條件變量是利用線程間共享的全局變量進(jìn)行同步的一種機(jī)制,主要包括兩個(gè)動(dòng)作:一個(gè)線程等待"條件變量的條件成立"而掛起;另一個(gè)線程使"條件成立"(給出條件成立信號(hào))。

    條 件的檢測(cè)是在互斥鎖的保護(hù)下進(jìn)行的。如果一個(gè)條件為假,一個(gè)線程自動(dòng)阻塞,并釋放等待狀態(tài)改變的互斥鎖。如果另一個(gè)線程改變了條件,它發(fā)信號(hào)給關(guān)聯(lián)的條件 變量,喚醒一個(gè)或多個(gè)等待它的線程,重新獲得互斥鎖,重新評(píng)價(jià)條件。如果兩進(jìn)程共享可讀寫的內(nèi)存,條件變量可以被用來實(shí)現(xiàn)這兩進(jìn)程間的線程同步。

           使用條件變量之前要先進(jìn)行初始化。可以在單個(gè)語句中生成和初始化一個(gè)條件變量如:

    pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;(用于進(jìn)程間線程的通信)。

    也可以利用函數(shù)pthread_cond_init動(dòng)態(tài)初始化。

     

    二、條件變量函數(shù)

    1

    名稱:

    pthread_cond_init

    目標(biāo):

    條件變量初始化

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

    參數(shù):

    cptr  條件變量

    attr  條件變量屬性

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

         

     

     

     

     

     

      pthread_cond_init函數(shù)可以用來初始化一個(gè)條件變量。他使用變量attr所指定的屬性來初始化一個(gè)條件變量,如果參數(shù)attr為空,那么它將使用缺省的屬性來設(shè)置所指定的條件變量。

     

    2.

    名稱:

    pthread_cond_destroy

    目標(biāo):

    條件變量摧毀

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_destroy(pthread_cond_t *cond);

    參數(shù):

    cptr  條件變量

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     pthread_cond_destroy函數(shù)可以用來摧毀所指定的條件變量,同時(shí)將會(huì)釋放所給它分配的資源。調(diào)用該函數(shù)的進(jìn)程也并不要求等待在參數(shù)所指定的條件變量上。

     

    3.

    名稱:

    pthread_cond_wait/pthread_cond_timedwait

    目標(biāo):

    條件變量等待

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

    int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);

    參數(shù):

    cond 條件變量

    mutex 互斥鎖

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     

     

     

     

    第一個(gè)參數(shù)*cond是指向一個(gè)條件變量的指針。第二個(gè)參數(shù)*mutex則是對(duì)相關(guān)的互斥鎖的指針。函數(shù)pthread_cond_timedwait函數(shù)類型與函數(shù)pthread_cond_wait,區(qū)別在于,如果達(dá)到或是超過所引用的參數(shù)*abstime,它將結(jié)束并返回錯(cuò)誤ETIME.pthread_cond_timedwait函數(shù)的參數(shù)*abstime指向一個(gè)timespec結(jié)構(gòu)。該結(jié)構(gòu)如下:

    typedef struct timespec{

           time_t tv_sec;

           long tv_nsex;

    }timespec_t;

     

    3.

    名稱:

    pthread_cond_signal/pthread_cond_broadcast

    目標(biāo):

    條件變量通知

    頭文件:

    #include < pthread.h>

    函數(shù)原形:

    int pthread_cond_signal(pthread_cond_t *cond);

    int pthread_cond_broadcast(pthread_cond_t *cond);

    參數(shù):

    cond 條件變量

    返回值:

    成功返回0,出錯(cuò)返回錯(cuò)誤編號(hào)。

          

     

     

     

     

     參數(shù)*cond是對(duì)類型為pthread_cond_t 的一個(gè)條件變量的指針。當(dāng)調(diào)用pthread_cond_signal時(shí)一個(gè)在相同條件變量上阻塞的線程將被解鎖。如果同時(shí)有多個(gè)線程阻塞,則由調(diào)度策略確定接收通知的線程。如果調(diào)用pthread_cond_broadcast,則將通知阻塞在這個(gè)條件變量上的所有線程。一旦被喚醒,線程仍然會(huì)要求互斥鎖。如果當(dāng)前沒有線程等待通知,則上面兩種調(diào)用實(shí)際上成為一個(gè)空操作。如果參數(shù)*cond指向非法地址,則返回值EINVAL

     

    下面是一個(gè)簡(jiǎn)單的例子,我們可以從程序的運(yùn)行來了解條件變量的作用。

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*
    初始化互斥鎖*/
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*
    初始化條件變量*/

    void *thread1(void *);
    void *thread2(void *);

    int i=1;
    int main(void)
    {
        pthread_t t_a;
        pthread_t t_b;

        pthread_create(&t_a,NULL,thread2,(void *)NULL);/*
    創(chuàng)建進(jìn)程t_a*/
        pthread_create(&t_b,NULL,thread1,(void *)NULL); /*
    創(chuàng)建進(jìn)程t_b*/
        pthread_join(t_b, NULL);/*
    等待進(jìn)程t_b結(jié)束*/
        pthread_mutex_destroy(&mutex);
        pthread_cond_destroy(&cond);
        exit(0);
    }

    void *thread1(void *junk)
    {
        for(i=1;i<=9;i++)
        {
            pthread_mutex_lock(&mutex);/*
    鎖住互斥量*/
            if(i%3==0)
                 pthread_cond_signal(&cond);/*
    條件改變,發(fā)送信號(hào),通知t_b進(jìn)程*/
            else       
                 printf("thead1:%d\n",i);
            pthread_mutex_unlock(&mutex);/*
    解鎖互斥量*/

    sleep(1);
    }

    }

    void *thread2(void *junk)
    {
        while(i<9)
        {
            pthread_mutex_lock(&mutex);

    if(i%3!=0)
                pthread_cond_wait(&cond,&mutex);/*
    等待*/
            printf("thread2:%d\n",i);
            pthread_mutex_unlock(&mutex);

    sleep(1);
    }

    }

    程序創(chuàng)建了2個(gè)新線程使他們同步運(yùn)行,實(shí)現(xiàn)進(jìn)程t_b打印20以內(nèi)3的倍數(shù),t_a打印其他的數(shù),程序開始線程t_b不滿足條件等待,線程t_a運(yùn)行使a循環(huán)加1并打印。直到i3的倍數(shù)時(shí),線程t_a發(fā)送信號(hào)通知進(jìn)程t_b,這時(shí)t_b滿足條件,打印i值。

    下面是運(yùn)行結(jié)果:

    #cc –lpthread –o cond cond.c

    #./cond

    thread1:1

    thread1:2

    thread2:3

    thread1:4

    thread1:5

    thread2:6

    thread1:7

    thread1:8

    thread2:9


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095235658763
    posted @ 2009-06-23 17:07 C.B.K 閱讀(292) | 評(píng)論 (0)編輯 收藏
    工具:grub4dos0.4.2(想要的給我發(fā)信,我發(fā)給你,loveitdoit@163.com)

    文件:fedora7.0映像文件,可在網(wǎng)上下載。

    過程:

    1.解壓縮grub4dos0.4.2,把里面的 grldr和menu.lst,文件復(fù)制到c盤根目錄下。

    2.fedora7.0映像文件不必解壓,必須放在fat32的分區(qū)里。把里面的isolinux目錄下

    的VMLINUZ、INITRD.IMG解壓到c盤根目錄下。

    3.在c:\下找到menu.lst,用記事本打開并修改,刪除其他命令,添加以下命令!


    title Linux System Install

    kernel (hd0,0)/vmlinuz

    initrd (hd0,0)/initrd.img


    4.修改c:\boot.ini文件,在最后面添加c:\grldr="Start GRUB"并保存即可。

    5.重起系統(tǒng),選擇Start GRUB,開始安裝。

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095234437396
    posted @ 2009-06-23 16:05 C.B.K 閱讀(142) | 評(píng)論 (0)編輯 收藏
    花了半天時(shí)間研究了下下MYSQL的備份實(shí)現(xiàn),發(fā)現(xiàn)其是在MY.CNF(MY.INI)配置文件中作的設(shè)置,直接設(shè)置服務(wù)器唯一性ID號(hào)加上其它的附加設(shè) 置,則可作為一臺(tái)MASTER,而在 SLAVE機(jī)上,也只需要在配置文件中設(shè)置一下連接MASTER所需的參數(shù)即可,如果在MASTER里也加上連到SLAVE機(jī)的參數(shù),則就是雙向備份 了~~不過,這些連接參數(shù)中用到的賬號(hào)需要注意權(quán)限的設(shè)置,否則會(huì)搞半天沒反就急死你迪。。。
    我在WIN上和LINUX上各裝了MYSQL5,下面是它們的配置:
    WIN(172.22.33.33)下的MASTER(由于我改了端口3327所以下面多加了個(gè)端口方面的特殊處理了)的配置(my.ini):(**一定要在mysqld配置段中配置,不象PHP,APACHE可以隨便找個(gè)方便的地方配的,注意哈!!)

    [mysqld]
    #master 設(shè)置
    server-id=1
    log-bin=c:/masterlog
    binlog-do-db=db5

    #實(shí)現(xiàn)雙機(jī)備份段,給MASTER同時(shí)加上SLAVE段,可選哈,如果不選,那就是WIN到LIN的主從備份

    master-host=172.22.1.37
    master-user=backup2
    master-password=backup2
    master-port=3306
    master-connect-retry=60
    replicate-do-db=db5

    數(shù)據(jù)庫中加一個(gè)賬號(hào):

    GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
    TO [email=backup@]backup@'172.22.1.37'[/email] IDENTIFIED by 'backup';
    這個(gè)權(quán)限表示,這個(gè)backup賬號(hào)只能由從備份機(jī)172.22.1.37訪問只能用來進(jìn)行備份操作
    LINUX(172.22.1.37)下的SLAVE機(jī)的配置(把安裝目錄里找到的任意一個(gè)*.cnf拷到/etc/my.cnf下進(jìn)行修改):

    server-id=2
    #如果不需要雙向備份下面兩行可以不要
    #否則還要加一個(gè)數(shù)據(jù)庫用戶賬號(hào)
    /*
    GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
    TO [email=backup2@]backup2@'172.22.33.33'[/email] IDENTIFIED by 'backup2';
    */
    log-bin=./masterlog
    binlog-do-db=db5
    #---------------------------------------
    master-host=172.22.33.33
    master-user=backup
    master-password=backup
    master-port=3327
    master-connect-retry=60
    replicate-do-db=db5
    由于只是大概的弄了一下,特別是在數(shù)據(jù)庫用戶方面沒有作仔細(xì)試驗(yàn):),可能會(huì)有所不太準(zhǔn)確的地方,還有就是,上面測(cè)試用到的數(shù)據(jù)庫一定要是已經(jīng)建立好并且 結(jié)構(gòu)相同的,兩臺(tái)機(jī)子都重啟后會(huì)進(jìn)行檢查,如果出現(xiàn)找不到或者檢查到結(jié)構(gòu)不同,會(huì)報(bào)錯(cuò),最好就是在創(chuàng)建空數(shù)據(jù)庫時(shí)或初始時(shí)安裝兩個(gè)一樣的數(shù)據(jù)庫后就建立好 關(guān)系,對(duì)于不同版本的MYSQL,官方說明也可以同步,但想一想,把MYSQL5 的數(shù)據(jù)備份到4中去丟失5的特性也沒什么意義吧。。

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952335921779
    posted @ 2009-06-23 15:59 C.B.K 閱讀(219) | 評(píng)論 (0)編輯 收藏

    【第一篇】

    我是如何提高口語水平的?


       首先、確定你自己的英語水平。中國大學(xué)畢業(yè)生的通病是,書面閱讀還可以,口語不行,聽力很差,書寫湊合。但每個(gè)人具體情況又都不一樣,有人閱讀專業(yè)書一目 十行,但讀報(bào)紙很費(fèi)勁。有人聽新聞可以,聽別的不行。你必須首先了解自己,然后針對(duì)你的情況對(duì)癥下藥。這種評(píng)估工作最好找英語好的人幫你做,如果不方便, 只能自己評(píng)自己,就要盡量做到客觀。

      其次、確定自己的發(fā)音水平。我有個(gè)朋友對(duì)我說他的發(fā)音沒問題,可實(shí)際上他說得很多詞我都聽不懂。你學(xué)的是英國音還 是美國音都無所謂,反正最終從你嘴里出來的肯定是中國音。最重要的是發(fā)音要合理。英語每一個(gè)單詞都有自己的念法,你不能憑空想象。比如,有人把 RESUME讀做RE-'SOOM,這樣,別人說RE-SIU-'MAY,你不知道是什么。你念RE-'SOOM,別人也聽不懂。再次、確定自己的英語學(xué) 習(xí)目標(biāo)。我這里僅把口語交流做為目標(biāo)。最后、開始學(xué)習(xí)。

    1、口語學(xué)習(xí)的關(guān)鍵是要模仿人家的說話。這包括語音和語調(diào)兩部分。中國英語教學(xué)重視語調(diào)的很少,盡管很多時(shí)候語調(diào)可能比語音更重要。

    2、買一臺(tái)錄音機(jī),找一合磁帶。根據(jù)你的水平,可以選擇新概念第二或第三冊(cè),也可以到圖書館借一套有書和磁帶的小故事集。注意:一定要有書,故事篇幅不能太長(zhǎng),生詞量要小,過于簡(jiǎn)單沒有關(guān)系。我傾向于使用故事,而不是對(duì)話或新聞聽力材料。

    3、進(jìn)行跟讀訓(xùn)練。放磁帶,看著書,搞明白每一個(gè)單詞的意思,理解整個(gè)故事情節(jié)。然后,放一句,暫停,學(xué)著人家讀一句,然后,放下一句,暫停,再學(xué)一句,繼續(xù)。

    4、跟讀過程中要注意的幾點(diǎn):

    (1)一定要盡力模仿發(fā)音和語調(diào),越象越好。

    (2)開始時(shí)速度可以比較慢,要逐步使自己跟上人家的速度。

    (3)中間可以回倒重放,但我傾向于讓大家完成一小段后再回去重來。

    5、同步閱讀。當(dāng)你對(duì)文章發(fā)音、語調(diào)完全掌握之后,就要在放錄音的同時(shí)同步跟讀。爭(zhēng)取讓自己的聲音與他完全重合。注意語調(diào)和語音。如果中間有結(jié)巴的地方也不要緊,繼續(xù)讀下去,然后再回來重讀。

    6、關(guān)掉錄音機(jī),朗誦課文。注意使用學(xué)到的語音語調(diào)。帶滾瓜爛熟之后,可以進(jìn)入下一篇課文。

      這樣,一兩個(gè)月之后,當(dāng)你“精讀”過五到十篇約一千字篇幅的文章之后,你會(huì)發(fā)現(xiàn)你的英語發(fā)音和聽力有了明顯的進(jìn)步。再配合其他學(xué)習(xí),如與人聊天,看電視,聽廣播,等等,口語水平會(huì)得到顯著提高。

    【第二篇】

             英語作為一種工具,其實(shí)用性愈顯重要。傳統(tǒng)英語教育方法由于過于艱深化,以及盲目的應(yīng)試模式使大部分的英語學(xué)習(xí)者學(xué)了幾年甚至數(shù)十年,卻仍然處于聽不懂開不了口的尷尬境地。那么究竟如何才能在比較短的時(shí)間里快速提高口語水平,讓她真正為你所用呢?
       西方最新流行一種外語學(xué)習(xí)理論,即口語提高的最好方式就是采用短期突破法。從下面的公式中,就可以看出,口語短期突破的方法是很有效的。
      口語提高速度定律=說英語時(shí)間/說中文時(shí)間Speed of learning English=Speaking English/Speaking Chinese ( in a period of time)
      比如,在給定的一天時(shí)間內(nèi)(16小時(shí)),學(xué)生A練習(xí)英語口語的時(shí)間為14小時(shí),說中文的時(shí)間為2小時(shí),兩者的比例為7:1;學(xué)生B練習(xí)口語的時(shí)間為2 小時(shí)英語,說中文的時(shí)間為14小時(shí)。比例為1:7。如此一來,學(xué)生A比學(xué)生B說英語的比例大49倍。
      我們認(rèn)為:這一理論其實(shí)就是對(duì)語言學(xué)習(xí)規(guī)律一次很好的回歸,語言的核心是使用者能夠隨時(shí)隨地地使用它。你用的時(shí)間越長(zhǎng),你就越熟練,這里我們說的使用 就是“說”,用嘴巴表達(dá)出來,而不是用眼睛和腦子去看和死記。如果你能夠在一段時(shí)間內(nèi)的大部分時(shí)間里堅(jiān)持持續(xù)使用英語而不是中文進(jìn)行表達(dá),把學(xué)習(xí)英語的任 務(wù)轉(zhuǎn)化成母語似的說話習(xí)慣,你就完全可以在很短的時(shí)間內(nèi)有效掌握一口流利的英語口語。
      當(dāng)然現(xiàn)實(shí)情況卻是:很多人并沒有這樣的勇氣和能力去堅(jiān)持使用一個(gè)完全不熟悉的語言進(jìn)行日常的交流!所以選用一套優(yōu)秀的教材和相應(yīng)的工具就顯得異常重要了,這種教材應(yīng)該具備以下特點(diǎn)才能幫助你克服困難:
      1、能夠隨時(shí)隨地學(xué)習(xí),讓你很容易就接觸到英語;
      2、能夠讓你脫離書本,完全浸在英語環(huán)境里;
      3、內(nèi)容應(yīng)該精挑細(xì)選,具備典型性和代表性,幫助你在短時(shí)間內(nèi)掌握精華內(nèi)容,從而建立起長(zhǎng)期學(xué)習(xí)的信心和基本能力。
      同時(shí)你應(yīng)該注意培養(yǎng)自己的自信,學(xué)會(huì)勇敢犯錯(cuò)誤,克服恐懼的心理障礙。其實(shí)這種心理障礙是成人自己加給自己的,為什么我們小時(shí)候?qū)W母語這么自然容易,就是因?yàn)槟莻€(gè)時(shí)候不知道什么是丟臉。所以我們應(yīng)該象小時(shí)候那樣暫時(shí)忘卻丟臉,勇敢地去丟臉!

    【第三篇】

    想提高英語口語水平,首先要在語音上下功夫:)~
    下面是些方法,你可以根據(jù)自己的學(xué)習(xí)方式掌握:)~

    1.其次,要有大量的閱讀和聽力做基礎(chǔ)。在讀和聽的過程中,積累了詞匯,掌握了句型,熟悉了用英語表達(dá)思想的方式,最重要的是培養(yǎng)了語感。

    2.同時(shí),學(xué)英語口語也需要用多種辦法:如大聲朗讀英語對(duì)話和文章,朗讀各種句型的例句和口語中最常用的句子,背誦文章及演講,與會(huì)英語的人練口語,當(dāng) 然,最好與以英語為母語的人練口語。事實(shí)上,自言自語亦是練習(xí)口語的有效的方法之一。如果你把自己說的英語給錄制下來,聽聽自己的錄音,若有問題,再加以 改正,效果就會(huì)更好。

    3.說英語還要有膽量。如果你能在說不太出口,或是說不好的情況下,大膽地說。說上一段時(shí)間后,突然有一天你會(huì)自如、清楚地表達(dá)自己的思想。有了大膽說的精神,你才能闖過口語的難關(guān)。

    4.只會(huì)學(xué)英語,而不能盡快地去用,那就永遠(yuǎn)也學(xué)不好英語。在學(xué)英語的過程中,要始終尋找機(jī)會(huì)說英語。比如說,你周圍有幾個(gè)喜歡說英語的朋友,大家在一起 就要用英語來交談。這種交談?dòng)欣诿總€(gè)人的英語學(xué)習(xí),因?yàn)榇蠹叶加袡C(jī)會(huì)運(yùn)用自己已掌握的英語知識(shí)來交流思想,鞏固了已學(xué)的知識(shí),并把知識(shí)轉(zhuǎn)化成技能,同 時(shí),還能從別人那兒學(xué)到新的東西。要想學(xué)好英語口語就要多說。

    5.能同以英語為母語的人說英語是最佳方法。在國內(nèi)學(xué)英語缺乏環(huán)境,看電影學(xué)英語口語是彌補(bǔ)環(huán)境不足的好方法。英語電影是一部英語國家的生活、文化、風(fēng)俗 等一切的百科全書,是最全的英語口語百科全書。大量地看英文電影就是你徹底攻克英語“聽”和“說”的法寶。英語電影把你帶入了一個(gè)新的世界中去。你在電影 中,學(xué)到了英語口語的語匯、短語、句子結(jié)構(gòu),以及表達(dá)各種內(nèi)容的說法。你要做的就是把自己想像成電影中的一個(gè)角色,在經(jīng)歷著自己的生活,又在經(jīng)歷著其他人 的生活。總之,看一部電影比在美國生活一天還好,看電影也能學(xué)到地道的英語口語。

    【第四篇】

    當(dāng)代社會(huì)是個(gè)開放社會(huì),信息社會(huì),人們?cè)絹碓街匾暯浑H,而我國改革開放的成功也日益提高了我國在世界上的地位,我們與世界各國交流的領(lǐng)域越來越廣了,沒有出眾的英語口語表達(dá)將會(huì)寸步難行。
      而要提高英語口語表達(dá)能力,就要先了解英語口語表達(dá)的過程是怎樣發(fā)生的。大家知道,語言是思維的外殼。口語表達(dá)的過程,實(shí)際上是一個(gè)復(fù)雜的心理和生理過程,是思維借助詞語按一定句式迅速轉(zhuǎn)換為有聲言語的過程。因此,口語能力的強(qiáng)弱取決于:
      1、思維能力的強(qiáng)弱,特別是與口語有關(guān)的思維的條理性、敏銳性與靈活性,這是關(guān)鍵。
      2、準(zhǔn)確、迅速地組織言語(選詞、造句、組段、構(gòu)篇)能力的強(qiáng)弱,這是基礎(chǔ)。
      3、運(yùn)用語言的能力的強(qiáng)弱,這是前提。
      根據(jù)口語表達(dá)循序漸進(jìn)的一般規(guī)律,口語訓(xùn)練的重點(diǎn)應(yīng)是培養(yǎng)敏銳的思維和強(qiáng)烈的語感。具體包括:
      1、語音。學(xué)會(huì)科學(xué)發(fā)聲方法,能用準(zhǔn)確、響亮、流暢的英語進(jìn)行口頭表達(dá)。
      2、語調(diào)。能借助聲音高低升降、抑揚(yáng)頓挫的變化來表達(dá)復(fù)雜的感情,掌握停連和輕重、抑揚(yáng)和明暗、快慢和松緊等一般的朗讀技巧。
      3、詞匯。能掌握比較豐富的口語詞匯。
      4、語脈。說話能做到有條有理、語言流暢、上下貫通、一脈相承。
      5、語境。說話注意目的、對(duì)象、場(chǎng)合,合乎規(guī)定情景的要求,講禮貌、有針對(duì)性。懂得口語修辭。在會(huì)話中有隨機(jī)應(yīng)變的能力。
      此外,還要懂得口頭言語的輔助手段--表情、姿勢(shì)、動(dòng)作等態(tài)勢(shì)言語的運(yùn)用。
      由于書面語和口語是相互滲透、相互促進(jìn)的,為提高口語的表現(xiàn)力,可在說話訓(xùn)練之前先進(jìn)行一章朗讀、朗誦訓(xùn)練。聽和說是一個(gè)事物的兩個(gè)方面,吸收、表達(dá) 兩者不能偏廢,所以口語訓(xùn)練體系中也應(yīng)包括。通過以上訓(xùn)練,掌握一定的朗讀朗誦技巧,培養(yǎng)準(zhǔn)確、流利、有感情地朗讀朗誦一般作品的能力,特別注意培養(yǎng)強(qiáng)烈 的語感。
      3、聽力訓(xùn)練
      培養(yǎng)聽的注意力、理解力、記憶力和辨析力,提高聽知能力,養(yǎng)成良好的聽的習(xí)慣。
      4、口語表達(dá)基本方式訓(xùn)練
      進(jìn)行敘述、描述、評(píng)述、解說等口語表達(dá)基本方式的訓(xùn)練,培養(yǎng)內(nèi)部言語向外部言語迅速轉(zhuǎn)化的能力,結(jié)合進(jìn)行語調(diào)、語脈的訓(xùn)練。
      5、會(huì)話型言語訓(xùn)練
      言語形式有會(huì)話型和獨(dú)白型兩類。會(huì)話是指兩個(gè)以上的人圍繞一個(gè)或幾個(gè)話題一起說話的形式,如交談、座談、辯論、審訊等。會(huì)話時(shí)參加者是互為聽、講者 的,因此后面的發(fā)言常常受到前面發(fā)言的制約。另外,由于當(dāng)面交談,大量態(tài)勢(shì)語代替了言語表達(dá),會(huì)話者的言語結(jié)構(gòu)往往不嚴(yán)謹(jǐn)、不完善,省略句較多。
      可進(jìn)行如下訓(xùn)練:通過交談和辯論兩種會(huì)話言語訓(xùn)練,了解它們的一般特點(diǎn)、注意事項(xiàng),結(jié)合進(jìn)行應(yīng)變能力和禮貌用語的訓(xùn)練,從而在會(huì)話中有效地培養(yǎng)隨機(jī)應(yīng)變的能力。
      6、獨(dú)白型言語訓(xùn)練
      獨(dú)白是指一個(gè)人單獨(dú)發(fā)言而其他人都作為聽眾的言語表達(dá)形式,如:講故事、作報(bào)告、講課、演講、講解員的解說等。獨(dú)白言語一般不在進(jìn)行過程中跟聽眾問答 交流,因此要求在事先要周密地了解聽眾的要求并系統(tǒng)地組織好發(fā)言內(nèi)容和有關(guān)態(tài)勢(shì)語。獨(dú)白是一種高層次的言語形式。
      可通過講故事和演講兩種獨(dú)白言語的訓(xùn)練,了解它們的一般特點(diǎn)、注意事項(xiàng),結(jié)合進(jìn)行運(yùn)用態(tài)勢(shì)語的訓(xùn)練,這類訓(xùn)練很有利于培養(yǎng)思維的條理性和連貫性。
      7、即興小品訓(xùn)練
      即興小品要求表演者按照規(guī)定的題目和要求,在規(guī)定的時(shí)間內(nèi),充分發(fā)揮自己的想象,不用或少用道具,通過言語和動(dòng)作的表演,展現(xiàn)社會(huì)生活中的某個(gè)瞬間或片斷,表達(dá)一個(gè)簡(jiǎn)單的主題。
      嚴(yán)格地說,小品應(yīng)該是話劇藝術(shù)表演訓(xùn)練的一種形式,但由于它具有綜合的特點(diǎn),對(duì)訓(xùn)練思維的創(chuàng)造性、敏捷性、條理性、言語表達(dá)的準(zhǔn)確性、形象性、流暢 性,以及應(yīng)變力,乃至姿勢(shì)的綜合運(yùn)用等等,都有很大的好處,所以我們要想英語口語表達(dá)能力更上一個(gè)層次,這種形式的訓(xùn)練也要加以采用。
      懂得了英語口語表達(dá)的規(guī)律,并不等于就有了一口流暢的英語表達(dá)口才,就好象讀了介紹游泳的書并不等于一定會(huì)游泳一樣,關(guān)鍵還是要在長(zhǎng)期的時(shí)實(shí)踐中持之 以恒地艱苦磨練。這種訓(xùn)練不同于我們平時(shí)常聽常說的那種日常英語口語訓(xùn)練。日常的英語口語訓(xùn)練與之相比簡(jiǎn)單得多,所用的詞匯量及話題所涉及的深度都是相當(dāng) 有限的。而真正高層次的英語口語交際所需達(dá)到的流暢性、條理性、敏銳性和靈活性并不是常練一些日常用語就能達(dá)到的,其中用到的詞匯量也因話題的深入和多樣 而大大增加了。
      所以,要想真正地提高英語口語,說一口流利而又有水平的交際英語,得有對(duì)英語口語表達(dá)感興趣作為前提,懂得以上的規(guī)律,重視運(yùn)用以上的訓(xùn)練步驟,加上 長(zhǎng)期的艱苦訓(xùn)練,才會(huì)有成效,才會(huì)達(dá)到目的。聽力訓(xùn)練,當(dāng)然,在訓(xùn)練過程中,聽和說是無法截然分開的。
      因此,英語口語訓(xùn)練體系可按以下順序安排:
      1、語音訓(xùn)練
      在學(xué)習(xí)英語語音知識(shí)的基礎(chǔ)上加強(qiáng)語音訓(xùn)練,進(jìn)行方音辨正練習(xí)。通過學(xué)習(xí),打好英語語音知識(shí),有一定的辨音能力,能用英語正確、清楚、響亮地表達(dá)。
      2、朗讀朗誦訓(xùn)練
      進(jìn)行呼吸、發(fā)聲與共鳴訓(xùn)練,吐字納音的訓(xùn)練,以及各種朗讀朗誦技巧的訓(xùn)練,學(xué)會(huì)常用文體的朗讀、朗誦,懂得在朗誦中恰當(dāng)使用態(tài)勢(shì)語


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095109201252
    posted @ 2009-06-10 09:20 C.B.K 閱讀(93) | 評(píng)論 (0)編輯 收藏

    [關(guān)鍵字]:java,design pattern,設(shè)計(jì)模式,《Java與模式》,Chain of Responsibility,責(zé)任鏈模式
    [環(huán)境]:StarUML5.0 + JDK6
    [作者]:Winty (wintys@gmail.com)
    [正文]:

    package pattern.chainofresponsibility;

    /**
     * 責(zé)任鏈模式:Chain of Responsibility
     * @version 2009-5-9
     * @author Winty(wintys@gmail.com)
     */
    public class ChainOfResponsibilityTest{
        public static void main(String[] args){
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            Handler handler3 = new ConcreteHandler3();

            //設(shè)置責(zé)任鏈
            handler3.setSuccessor(handler2);
            handler2.setSuccessor(handler1);

            //發(fā)送命令
            handler3.handleRequest();
        }
    }

    /**
     *抽象處理者
     */
    abstract class Handler{
        protected Handler successor;

        public Handler getSuccessor(){
            return successor;
        }

        public void setSuccessor(Handler successor){
            this.successor = successor;
        }

        public abstract void handleRequest();
    }

    /**
     *具體處理者
     */
    class ConcreteHandler1 extends Handler{
        public void handleRequest(){
            if(getSuccessor() != null){
                System.out.print("Request passed:from class Concrete1");
                System.out.println(" to class" + getSuccessor().getClass().getName());

                getSuccessor().handleRequest();
            }
            else{
                System.out.println("Request handled in ConcreteHandler1");
            }
        }
    }

    /**
     *具體處理者
     */
    class ConcreteHandler2  extends Handler{
        public void handleRequest(){
            if(getSuccessor() != null){
                System.out.print("Request passed:from class Concrete2");
                System.out.println(" to class " + getSuccessor().getClass().getName());

                getSuccessor().handleRequest();
            }
            else{
                System.out.println("Request handled in ConcreteHandler2");
            }
        }
    }

    /**
     *具體處理者
     */
    class ConcreteHandler3  extends Handler{
        public void handleRequest(){
            if(getSuccessor() != null){
                System.out.print("Request passed:from class Concrete3");
                System.out.println(" to class " + getSuccessor().getClass().getName());

                getSuccessor().handleRequest();
            }
            else{
                System.out.println("Request handled in ConcreteHandler3");
            }
        }
    }

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009410264843
    posted @ 2009-05-10 14:07 C.B.K 閱讀(88) | 評(píng)論 (0)編輯 收藏
    這么一個(gè)需求:同一臺(tái)服務(wù)器上有兩個(gè)應(yīng)用,如
    http://hostA:8080/serviceshttp://hostA:8080/admin
    外部訪問時(shí),需要從不同的域名訪問,如
    http://services.host.comhttp://admin.host.com
    一開始給他們這么一個(gè)比較簡(jiǎn)單的解決方案:
    分別把services和admin兩個(gè)應(yīng)用,部署到不同的兩個(gè)端口上,如
    services -> http://hostA:8081/
    admin -> http://hostA:8082/
    接著在防火墻配兩個(gè)公網(wǎng)IP,然后dns上把services.host.com和admin.host.com配置到這兩個(gè)IP上。
    當(dāng)請(qǐng)求到達(dá)防火墻時(shí),防火墻根據(jù)所訪問的ip轉(zhuǎn)發(fā)到hostA的對(duì)應(yīng)端口上。
    前 方用的防火墻是我們公司的Audemon 100,和公司的Audemon系統(tǒng)組的交流后得知,目前的防火墻版本不支持同時(shí)配置兩個(gè)ip,要到六月底才能出版本支持。!@…%#%…%¥,暈倒,好 像這是很基本的功能來的吧,居然還不支持。沒辦法,此路不通。由于防火墻是不管域名的(因?yàn)橛蛎Y料是通過應(yīng)用層傳輸?shù)?,那更別指望防火墻根據(jù)域名轉(zhuǎn)發(fā) 了。
    因此,我們只好提供了軟件級(jí)的解決方案,讓前方在Tomcat前加一個(gè)Apache 2.2,通過Apache的Virtual Host + AJP實(shí)現(xiàn)轉(zhuǎn)發(fā)。
    Apache的部分配置如下:
    NameVirtualHost *:80
    <VirtualHost *:80>
    ServerName host1.com
    ProxyPass / ajp://host1.com:8009/
    ProxyPassReverse / ajp://host1.com:8009/
    </VirtualHost>
    <VirtualHost *:80>
    ServerName host2.com
    ProxyPass / ajp://host2.com:8019/
    ProxyPassReverse / ajp://host2.com:8019/
    </VirtualHost>
    Tomcat也需要配置AJP Connector,如host1.com的配置
    <Connector port=”8009″ enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
    這個(gè)方案相對(duì)于防火墻的硬件方案,性能上要差一些,但還是不錯(cuò)的。
    另 外還有一種方案是通過iptables的domain module來實(shí)現(xiàn),但這個(gè)domain module好像是國內(nèi)的某個(gè)高手寫的,只更新到v0.02版本,并沒有提交到iptables的標(biāo)準(zhǔn)里。雖然可以用而且性能比Apache的方案要高一 些,但是風(fēng)險(xiǎn)較大,而且配置麻煩(既要編譯內(nèi)核,又要配置iptables的rules),所以沒有用這種方式。

    文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009326115641438
    posted @ 2009-04-26 11:57 C.B.K 閱讀(4203) | 評(píng)論 (0)編輯 收藏
    隨著訪問量的不斷提高,以及對(duì)響應(yīng)速度的要求,進(jìn)行負(fù)載均衡設(shè)置就顯得非常必要了。公司的系統(tǒng)在最初設(shè)計(jì)的時(shí)候就已經(jīng)考慮到了負(fù)載均衡的規(guī)劃,www靜態(tài) 服務(wù)器配置了兩臺(tái),由于初期項(xiàng)目時(shí)間緊,并且訪問量并不高,所以當(dāng)時(shí)只用了一臺(tái),另一臺(tái)在內(nèi)網(wǎng)中,只是進(jìn)行了同步,并為發(fā)揮出效用來。此次就是對(duì)負(fù)載均衡 的一個(gè)簡(jiǎn)單測(cè)試。
           先介紹一下apache mod_proxy_balancer的幾個(gè)配置規(guī)則(從網(wǎng)上找的):
    將Apache作為L(zhǎng)oadBalance前置機(jī)分別有三種不同的部署方式,分別是:

    1 )輪詢均衡策略的配置

    進(jìn)入Apache的conf目錄,打開httpd.conf文件,在文件的末尾加入:
    ProxyPass / balancer://proxy/         #注意這里以"/"結(jié)尾
    <Proxy balancer://proxy> 
           BalancerMember http://192.168.6.37:6888/ 
           BalancerMember http://192.168.6.38:6888/
    </Proxy> 
          我們來觀察上述的參數(shù)“ProxyPass / balancer://proxy/”,其中,“ProxyPass”是配置虛擬服務(wù)器的命令,“/”代表發(fā)送Web請(qǐng)求的URL前綴,如:http://myserver/或者h(yuǎn)ttp://myserver/aaa,這些URL都將符合上述過濾條件;“balancer://proxy/”表示要配置負(fù)載均衡,proxy代表負(fù)載均衡名;BalancerMember 及其后面的URL表示要配置的后臺(tái)服務(wù)器,其中URL為后臺(tái)服務(wù)器請(qǐng)求時(shí)的URL。以上面的配置為例,實(shí)現(xiàn)負(fù)載均衡的原理如下: 
          假設(shè)Apache接收到http://localhost/aaa請(qǐng)求,由于該請(qǐng)求滿足ProxyPass條件(其URL前綴為“/”),該請(qǐng)求會(huì)被分發(fā)到后臺(tái)某一個(gè)BalancerMember,譬如,該請(qǐng)求可能會(huì)轉(zhuǎn)發(fā)到 http://192.168.6.37:6888/aaa進(jìn)行處理。當(dāng)?shù)诙€(gè)滿足條件的URL請(qǐng)求過來時(shí),該請(qǐng)求可能會(huì)被分發(fā)到另外一臺(tái)BalancerMember,譬如,可能會(huì)轉(zhuǎn)發(fā)到http://192.168.6.38:6888/。如此循環(huán)反復(fù),便實(shí)現(xiàn)了負(fù)載均衡的機(jī)制。

    2) 按權(quán)重分配均衡策略的配置

    ProxyPass / balancer://proxy/         #注意這里以"/"結(jié)尾

    <Proxy balancer://proxy> 
            BalancerMember http://192.168.6.37:6888/  loadfactor=3 
            BalancerMember http://192.168.6.38:6888/  loadfactor=1
    </Proxy> 
          參數(shù)”loadfactor”表示后臺(tái)服務(wù)器負(fù)載到由Apache發(fā)送請(qǐng)求的權(quán)值,該值默認(rèn)為1,可以將該值設(shè)置為1到100之間的任何值。以上面的配置 為例,介紹如何實(shí)現(xiàn)按權(quán)重分配的負(fù)載均衡,現(xiàn)假設(shè)Apache收到http://myserver/aaa 4次這樣的請(qǐng)求,該請(qǐng)求分別被負(fù)載到后臺(tái)服務(wù)器,則有3次連續(xù)的這樣請(qǐng)求被負(fù)載到BalancerMember為http://192.168.6.37:6888的服務(wù)器,有1次這樣的請(qǐng)求被負(fù)載BalancerMember為http://192.168.6.38:6888后臺(tái)服務(wù)器。實(shí)現(xiàn)了按照權(quán)重連續(xù)分配的均衡策略。

    3) 權(quán)重請(qǐng)求響應(yīng)負(fù)載均衡策略的配置

    ProxyPass / balancer://proxy/ lbmethod=bytraffic  #注意這里以"/"結(jié)尾

    <Proxy balancer://proxy> 
             BalancerMember http://192.168.6.37:6888/  loadfactor=3 
             BalancerMember http://192.168.6.38:6888/  loadfactor=1 
     </Proxy> 
           參數(shù)“l(fā)bmethod=bytraffic”表示后臺(tái)服務(wù)器負(fù)載請(qǐng)求和響應(yīng)的字節(jié)數(shù),處理字節(jié)數(shù)的多少是以權(quán)值的方式來表示的。 “l(fā)oadfactor”表示后臺(tái)服務(wù)器處理負(fù)載請(qǐng)求和響應(yīng)字節(jié)數(shù)的權(quán)值,該值默認(rèn)為1,可以將該值設(shè)置在1到100的任何值。根據(jù)以上配置是這么進(jìn)行均 衡負(fù)載的,假設(shè)Apache接收到http://myserver/aaa請(qǐng)求,將請(qǐng)求轉(zhuǎn)發(fā)給后臺(tái)服務(wù)器,如果BalancerMember為http://192.168.6.37:6888后臺(tái)服務(wù)器負(fù)載到這個(gè)請(qǐng)求,那么它處理請(qǐng)求和響應(yīng)的字節(jié)數(shù)是BalancerMember為http://192.168.6.38:6888 服務(wù)器的3倍(回想(2)均衡配置,(2)是以請(qǐng)求數(shù)作為權(quán)重負(fù)載均衡的,(3)是以流量為權(quán)重負(fù)載均衡的,這是最大的區(qū)別)。

    看明白了沒有,根據(jù)不同的需要,可以按這三種方式進(jìn)行配置。我按照第三種配置的,感覺上這種對(duì)于負(fù)載的均衡更全面合理。我的配置很簡(jiǎn)單,如下:
    先配置均衡器:
    <Proxy balancer://proxy>
           BalancerMember ajp://127.0.0.1:8009/  loadfactor=1
           BalancerMember http://192.168.10.6:8083/  loadfactor=1
    </Proxy>
    其中http://192.168.10.6:8083實(shí)際上是另外一個(gè)端口啟動(dòng)的apache,為了測(cè)試,它就簡(jiǎn)單的直接轉(zhuǎn)發(fā)所有請(qǐng)求到tomcat。
    對(duì)于上次的VirtualHost進(jìn)行以下的修改即可:
    <VirtualHost *:80>
            ServerName www.test.com
            DocumentRoot /www
            DirectoryIndex index.html index.jsp
            <Directory "/www">
                Options Indexes FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
            <Directory "/control">
                Options Indexes FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
            </Directory>
            ProxyPass /nxt/images/ !
            ProxyPass /nxt/js/ !
            ProxyPass /nxt/css/ !
            #ProxyPass / ajp://127.0.0.1:8009/
            #ProxyPassReverse / ajp://127.0.0.1:8009/
            ProxyPass / balancer://proxy/
            ProxyPassReverse / balancer://proxy/
    </VirtualHost>
    注釋掉之前的ajp轉(zhuǎn)發(fā),而配置成通過balancer去處理。
    通過觀察access log,的確有部分請(qǐng)求發(fā)送到了8083端口的apache上,而有部分是直接ajp轉(zhuǎn)發(fā)到tomcat上了。對(duì)于更多的負(fù)載均衡的參數(shù)檢測(cè),待空了再做。


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200932611555639
    posted @ 2009-04-26 11:56 C.B.K 閱讀(150) | 評(píng)論 (0)編輯 收藏

    一、集群和負(fù)載均衡的概念

    (一)集群的概念

      集群(Cluster)是由兩臺(tái)或多臺(tái)節(jié)點(diǎn)機(jī)(服務(wù)器)構(gòu)成的一種松散耦合的計(jì)算節(jié)點(diǎn)集合,為用 戶提供網(wǎng)絡(luò)服務(wù)或應(yīng)用程序(包括數(shù)據(jù)庫、Web服務(wù)和文件服務(wù)等)的單一客戶視圖,同時(shí)提供接近容錯(cuò)機(jī)的故障恢復(fù)能力。集群系統(tǒng)一般通過兩臺(tái)或多臺(tái)節(jié)點(diǎn)服 務(wù)器系統(tǒng)通過相應(yīng)的硬件及軟件互連,每個(gè)群集節(jié)點(diǎn)都是運(yùn)行其自己進(jìn)程的獨(dú)立服務(wù)器。這些進(jìn)程可以彼此通信,對(duì)網(wǎng)絡(luò)客戶機(jī)來說就像是形成了一個(gè)單一系統(tǒng),協(xié) 同起來向用戶提供應(yīng)用程序、系統(tǒng)資源和數(shù)據(jù)。除了作為單一系統(tǒng)提供服務(wù),集群系統(tǒng)還具有恢復(fù)服務(wù)器級(jí)故障的能力。集群系統(tǒng)還可通過在集群中繼續(xù)增加服務(wù)器 的方式,從內(nèi)部增加服務(wù)器的處理能力,并通過系統(tǒng)級(jí)的冗余提供固有的可靠性和可用性。
    (二)集群的分類
    1、高性能計(jì)算科學(xué)集群:
       以解決復(fù)雜的科學(xué)計(jì)算問題為目的的IA集群系統(tǒng)。是并行計(jì)算的基礎(chǔ),它可以不使用專門的由十至上萬個(gè)獨(dú)立處理器組成的并行超級(jí)計(jì)算機(jī),而是采用通過高速 連接來鏈接的一組1/2/4 CPU的IA服務(wù)器,并且在公共消息傳遞層上進(jìn)行通信以運(yùn)行并行應(yīng)用程序。這樣的計(jì)算集群,其處理能力與真正超級(jí)并行機(jī)相等,并且具有優(yōu)良的性價(jià)比。
    2、負(fù)載均衡集群:
       負(fù)載均衡集群為企業(yè)需求提供更實(shí)用的系統(tǒng)。該系統(tǒng)使各節(jié)點(diǎn)的負(fù)載流量可以在服務(wù)器集群中盡可能平均合理地分?jǐn)偺幚怼T撠?fù)載需要均衡計(jì)算的應(yīng)用程序處理端 口負(fù)載或網(wǎng)絡(luò)流量負(fù)載。這樣的系統(tǒng)非常適合于運(yùn)行同一組應(yīng)用程序的大量用戶。每個(gè)節(jié)點(diǎn)都可以處理一部分負(fù)載,并且可以在節(jié)點(diǎn)之間動(dòng)態(tài)分配負(fù)載,以實(shí)現(xiàn)平 衡。對(duì)于網(wǎng)絡(luò)流量也如此。通常,網(wǎng)絡(luò)服務(wù)器應(yīng)用程序接受了大量入網(wǎng)流量,無法迅速處理,這就需要將流量發(fā)送給在其它節(jié)點(diǎn)。負(fù)載均衡算法還可以根據(jù)每個(gè)節(jié)點(diǎn) 不同的可用資源或網(wǎng)絡(luò)的特殊環(huán)境來進(jìn)行優(yōu)化。
    3、高可用性集群:
      為保證集群整體服務(wù)的高可用,考慮計(jì)算硬件和軟件的容錯(cuò)性。如果高可用性群集中的某個(gè)節(jié)點(diǎn)發(fā)生了故障,那么將由另外的節(jié)點(diǎn)代替它。整個(gè)系統(tǒng)環(huán)境對(duì)于用戶是一致的。

      實(shí)際應(yīng)用的集群系統(tǒng)中,這三種基本類型經(jīng)常會(huì)發(fā)生混合與交雜。

    (三)典型集群
    科學(xué)計(jì)算集群:
    1、Beowulf
    當(dāng)談到 Linux 集群時(shí),許多人的第一反映是 Beowulf。那是最著名的 Linux科學(xué)軟件集群系統(tǒng)。實(shí)際上,它是一組適用于在 Linux 內(nèi)核上運(yùn)行的公共軟件包的通稱。其中包括流行的軟件消息傳遞 API,如“消息傳送接口”(MPI) 或“并行虛擬機(jī)”(PVM),對(duì) Linux 內(nèi)核的修改,以允許結(jié)合幾個(gè)以太網(wǎng)接口、高性能網(wǎng)絡(luò)驅(qū)動(dòng)器,對(duì)虛擬內(nèi)存管理器的更改,以及分布式進(jìn)程間通信 (DIPC) 服務(wù)。公共全局進(jìn)程標(biāo)識(shí)空間允許使用 DIPC 機(jī)制從任何節(jié)點(diǎn)訪問任何進(jìn)程。
    2、MOSIX
    Beowulf類似于給系統(tǒng)安裝的一個(gè)支持 集群的外掛軟件,提供了應(yīng)用級(jí)的集群能力。而MOSIX是徹底修改Linux的內(nèi)核,從系統(tǒng)級(jí)提供了集群能力,它對(duì)應(yīng)用而言是完全透明的,原有的應(yīng)用程 序,可以不經(jīng)改動(dòng),就能正常運(yùn)行在MOSIX系統(tǒng)之上。集群中的任何節(jié)點(diǎn)都可以自由地加入和移除,來接替其它節(jié)點(diǎn)的工作,或是擴(kuò)充系統(tǒng)。MOSIX 使用自適應(yīng)進(jìn)程負(fù)載均衡和內(nèi)存引導(dǎo)算法使整體性能最大化。應(yīng)用程序進(jìn)程可以在節(jié)點(diǎn)之間實(shí)現(xiàn)遷移,以利用最好的資源,這類似于對(duì)稱多處理器系統(tǒng)可以在各個(gè)處 理器之間切換應(yīng)用程序。由于MOSIX通過修改內(nèi)核來實(shí)現(xiàn)集群功能,所以存在兼容性問題,部分系統(tǒng)級(jí)應(yīng)用程序?qū)o法正常運(yùn)行。

    負(fù)載均衡/高可用性集群
    3、LVS(Linux Virtual Server)
    這是一個(gè)由國人主持的項(xiàng)目。
    它是一個(gè)負(fù)載均衡/高可用性集群,主要針對(duì)大業(yè)務(wù)量的網(wǎng)絡(luò)應(yīng)用(如新聞服務(wù)、網(wǎng)上銀行、電子商務(wù)等)。
    LVS 是建立在一個(gè)主控服務(wù)器(通常為雙機(jī))(director)及若干真實(shí)服務(wù)器(real-server)所組成的集群之上。real-server負(fù)責(zé)實(shí) 際提供服務(wù),主控服務(wù)器根據(jù)指定的調(diào)度算法對(duì)real-server進(jìn)行控制。而集群的結(jié)構(gòu)對(duì)于用戶來說是透明的,客戶端只與單個(gè)的IP(集群系統(tǒng)的虛擬 IP)進(jìn)行通信,也就是說從客戶端的視角來看,這里只存在單個(gè)服務(wù)器。
    N54537Real-server可以提供眾多服務(wù),如ftp, http, dns, telnet, nntp, smtp 等。主控服務(wù)器負(fù)責(zé)對(duì)Real-Server進(jìn)行控制。客戶端在向LVS發(fā)出服務(wù)請(qǐng)求時(shí),Director會(huì)通過特定的調(diào)度算法來指定由某個(gè)Real- Server來應(yīng)答請(qǐng)求,而客戶端只與Load Balancer的IP(即虛擬IP,VIP)進(jìn)行通信。

    其他集群:
    現(xiàn)在集群系統(tǒng)可謂五花八門,絕大部分的OS開發(fā)商,服務(wù)器開發(fā)商都提供了系統(tǒng)級(jí)的 集群產(chǎn)品,最典型的是各類雙機(jī)系統(tǒng),還有各類科研院校提供的集群系統(tǒng)。以及各類軟件開發(fā)商提供的應(yīng)用級(jí)別的集群系統(tǒng),如數(shù)據(jù)庫集 群,Application Server 集群,Web Server集群,郵件集群等等。

    (四)負(fù)載均衡

    1、概念

        由于目前現(xiàn)有網(wǎng)絡(luò)的各個(gè)核心部分隨著業(yè)務(wù)量的提高,訪問量和數(shù)據(jù)流量的快速增長(zhǎng),其處理能力和計(jì)算強(qiáng)度也相應(yīng)地增大,使得單一的服務(wù)器設(shè)備根本無法承擔(dān)。 在此情況下,如果扔掉現(xiàn)有設(shè)備去做大量的硬件升級(jí),這樣將造成現(xiàn)有資源的浪費(fèi),而且如果再面臨下一次業(yè)務(wù)量的提升時(shí),這又將導(dǎo)致再一次硬件升級(jí)的高額成本 投入,甚至性能再卓越的設(shè)備也不能滿足當(dāng)前業(yè)務(wù)量增長(zhǎng)的需求。

    針對(duì)此情況而衍生出來的一種廉價(jià)有效透明的方法以擴(kuò)展現(xiàn)有網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性的技術(shù)就是負(fù)載均衡(Load Balance)。

    2、特點(diǎn)和分類

         負(fù)載均衡(Server Load Balance)一般用于提高服務(wù)器的整體處理能力,并提高可靠性,可用性,可維護(hù)性,最終目的是加快服務(wù)器的響應(yīng)速度,從而提高用戶的體驗(yàn)度。  

         負(fù)載均衡從結(jié)構(gòu)上分為本地負(fù)載均衡(Local Server Load Balance)和地域負(fù)載均衡(Global Server Load Balance)(全局負(fù)載均衡),一是指對(duì)本地的服務(wù)器群做負(fù)載均衡,另一是指對(duì)分別放置在不同的地理位置、有不同的網(wǎng)絡(luò)及服務(wù)器群之間作負(fù)載均衡。   

    地域負(fù)載均衡有以下的特點(diǎn):

    (1)解決網(wǎng)絡(luò)擁塞問題,服務(wù)就近提供,實(shí)現(xiàn)地理位置無關(guān)性

    (2)對(duì)用戶提供更好的訪問質(zhì)量

    (3)提高服務(wù)器響應(yīng)速度

    (4)提高服務(wù)器及其他資源的利用效率

    (5)避免了數(shù)據(jù)中心單點(diǎn)失效

    3、負(fù)載均衡技術(shù)主要應(yīng)用

    (1)DNS負(fù)載均衡 最早的負(fù)載均衡技術(shù)是通過DNS來實(shí)現(xiàn)的,在DNS中為多個(gè)地址配置同一個(gè)名字,因而查詢這個(gè)名字的客戶機(jī)將得到其中一個(gè)地址,從而使得不同的客戶訪問不 同的服務(wù)器,達(dá)到負(fù)載均衡的目的。DNS負(fù)載均衡是一種簡(jiǎn)單而有效的方法,但是它不能區(qū)分服務(wù)器的差異,也不能反映服務(wù)器的當(dāng)前運(yùn)行狀態(tài)。

    (2)代理服務(wù)器負(fù)載均衡 使用代理服務(wù)器,可以將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的服務(wù)器,使用這種加速模式顯然可以提升靜態(tài)網(wǎng)頁的訪問速度。然而,也可以考慮這樣一種技術(shù),使用代理服務(wù)器將請(qǐng)求均勻轉(zhuǎn)發(fā)給多臺(tái)服務(wù)器,從而達(dá)到負(fù)載均衡的目的。

    (3)地址轉(zhuǎn)換網(wǎng)關(guān)負(fù)載均衡 支持負(fù)載均衡的地址轉(zhuǎn)換網(wǎng)關(guān),可以將一個(gè)外部IP地址映射為多個(gè)內(nèi)部IP地址,對(duì)每次TCP連接請(qǐng)求動(dòng)態(tài)使用其中一個(gè)內(nèi)部地址,達(dá)到負(fù)載均衡的目的。

    (4)協(xié)議內(nèi)部支持負(fù)載均衡 除了這三種負(fù)載均衡方式之外,有的協(xié)議內(nèi)部支持與負(fù)載均衡相關(guān)的功能,例如HTTP協(xié)議中的重定向能力等,HTTP運(yùn)行于TCP連接的最高層。

    (5)NAT 負(fù)載均衡 NAT(Network Address Translation 網(wǎng)絡(luò)地址轉(zhuǎn)換)簡(jiǎn)單地說就是將一個(gè)IP地址轉(zhuǎn)換為另一個(gè)IP地址,一般用于未經(jīng)注冊(cè)的內(nèi)部地址與合法的、已獲注冊(cè)的Internet IP地址間進(jìn)行轉(zhuǎn)換。適用于解決Internet IP地址緊張、不想讓網(wǎng)絡(luò)外部知道內(nèi)部網(wǎng)絡(luò)結(jié)構(gòu)等的場(chǎng)合下。

    (6)反向代理負(fù)載均 衡 普通代理方式是代理內(nèi)部網(wǎng)絡(luò)用戶訪問internet上服務(wù)器的連接請(qǐng)求,客戶端必須指定代理服務(wù)器,并將本來要直接發(fā)送到internet上服務(wù)器的連 接請(qǐng)求發(fā)送給代理服務(wù)器處理。反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給 internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器。反向代理負(fù)載均衡技術(shù)是把將來自internet上的連接請(qǐng)求以反向代理的 方式動(dòng)態(tài)地轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的多臺(tái)服務(wù)器進(jìn)行處理,從而達(dá)到負(fù)載均衡的目的。

    (7)混合型負(fù)載均衡 在有些大型網(wǎng)絡(luò),由于多個(gè)服務(wù)器群內(nèi)硬件設(shè)備、各自的規(guī)模、提供的服務(wù)等的差異,我們可以考慮給每個(gè)服務(wù)器群采用最合適的負(fù)載均衡方式,然后又在這多個(gè)服 務(wù)器群間再一次負(fù)載均衡或群集起來以一個(gè)整體向外界提供服務(wù)(即把這多個(gè)服務(wù)器群當(dāng)做一個(gè)新的服務(wù)器群),從而達(dá)到最佳的性能。我們將這種方式稱之為混合 型負(fù)載均衡。此種方式有時(shí)也用于單臺(tái)均衡設(shè)備的性能不能滿足大量連接請(qǐng)求的情況下。

    二、搭建集群和實(shí)現(xiàn)負(fù)載平衡

    (一)前期準(zhǔn)備

    我的系統(tǒng)用的是windowsXP專業(yè)版,我要做的是,用一個(gè)apache和多個(gè)(這里以兩個(gè)作為示例)tomcat,通過jk方式,構(gòu)造一個(gè)集群。以下是要首先準(zhǔn)備的東西:

    1、jdk,我用的版本是jdk1.5.0_06,下載地址是http://192.18.108.216/ECom/EComTicketServlet/BEGIND597A309654D73D910E051D73D539D5F/-2147483648/2438196255/1/852050/851882/2438196255/2ts+/westCoastFSEND/jdk-1.5.0_13-oth-JPR/jdk-1.5.0_13-oth-JPR:3/jdk-1_5_0_13-windows-i586-p.exe

    2、apache,我用的版本是2.2.4,下載地址是http://apache.justdn.org/httpd/binaries/win32/apache_2.2.4-win32-x86-openssl-0.9.8d.msi

    3、tomcat,我用的版本是5.5的解壓版本,這里要注意:不能用安裝的版本,因?yàn)橐慌_(tái)機(jī)器上裝兩個(gè)一樣的tomcat,是會(huì)出錯(cuò)誤的。下載地址是http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25.zip

    4、jk,這個(gè)jk的版本,本來有兩個(gè)的,但是版本2已經(jīng)被廢棄掉了,目前可用的jk版本是1.2.25。每個(gè)apache的版本,都會(huì)有一個(gè)特定的jk與之對(duì)應(yīng),所以這里要用的jk也必須是為apache-2.2.4開發(fā)的那個(gè)才行。它的下載地址是http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.25/mod_jk-apache-2.2.4.so

    有了這四樣?xùn)|西,我們就可以開始做集群了。

    (二)安裝

    1、相信需要看這篇文章的人,JDK的安裝一定不會(huì)陌生,這里不在贅述。只是需要提醒一下:環(huán)境變量別忘記配置了。

    2、安裝apache也沒有什么難度,就是在安裝過程中要配置域名、網(wǎng)址和管理員郵箱之類的信息,這 個(gè)信息完全可以按照提示,然后修改下填入即可,之后想修改的話直接到配置文件中改就行了。除了這個(gè)地方,還要保證機(jī)器上的80端口沒有被其他程序占用。至 于安裝路徑,完全取決于個(gè)人愛好。其他的默認(rèn)就行了。安裝成功后,系統(tǒng)右下角的托盤區(qū)會(huì)有個(gè)圖標(biāo),我們可以通過這個(gè)啟動(dòng)apache,如果那個(gè)小紅點(diǎn)變成 綠色,說明服務(wù)已經(jīng)正常啟動(dòng)了(如果服務(wù)沒有啟動(dòng)起來,說明安裝過程中的配置有錯(cuò)誤,建議卸載后重裝)。如果按照默認(rèn),端口是80的話,那打開瀏覽器,輸 入:http://localhost/ ,應(yīng)該可以看到 " It works “的字樣。這樣就可以進(jìn)入下一步了。

    3、解壓縮tomcat,記得要做兩份。這里不妨將兩個(gè)tomcat命名為:tomcat- 5.5.25_1和tomcat-5.5.25_2,其實(shí)這兩個(gè)文件夾中的東西是完全一樣的。但是我為了在同一臺(tái)機(jī)器上做集群,那就要保證兩個(gè) tomcat運(yùn)行起來不會(huì)在端口上起沖突。進(jìn)入tomcat-5.5.25_1/conf目錄,用文本編輯器打開并修改server.xml,將該 tomcat的默認(rèn)8080端口改為8088(其實(shí)沒必要改,我改這個(gè)是因?yàn)槲覚C(jī)器上還有其他tomcat占用著8080端口)。然后進(jìn)入tomcat- 5.5.25_2/conf目錄,同樣將8080修改掉,至于改成多少?zèng)]多大關(guān)系,只要不占用其他程序的端口,應(yīng)該不會(huì)出什么問題。這樣,tomcat就 算安裝好了。

    4、jk這東西是一個(gè)連接模塊,不用安裝,直接將mod_jk-apache-2.2.4.so這個(gè)文件拷貝到apache安裝目錄下的modules文件夾下面就行了。

    這樣,安裝完成,下面開始配置。

    (三)配置

    這個(gè)地方才是搭建集群的關(guān)鍵所在,我也會(huì)盡我的可能寫的詳細(xì)點(diǎn)。

    1、配置tomcat

    為防止沖突,進(jìn)入第二個(gè)tomcat主目錄,然后進(jìn)入conf目錄,打開server.xml修改配 置。主要是修改端口,我這里把所有的端口信息,都在原有基礎(chǔ)上加1000,即原端口是8009,我改為9009。當(dāng)然,你不必和我一樣,只要保證不沖突就 OK!這些配置在apache的配置中可能會(huì)用到。

    2、配置apache

    (1)進(jìn)入apache的主目錄,然后進(jìn)入conf文件夾,用文本編輯器打開httpd.conf,在該文件末尾加上如下幾行:

    ### 加載 mod_jk 模塊
    LoadModule jk_module modules/mod_jk-apache-2.2.4.so

    ### 配置 mod_jk
    JkWorkersFile conf/workers.properties           #加載集群中的workers
    JkMountFile conf/uriworkermap.properties    #加載workers的請(qǐng)求處理分配文件
    JkLogFile logs/mod_jk.log                                #指定jk的日志輸出文件
    JkLogLevel warn                                                  #指定日志級(jí)別

    (2)不要改變目錄,新建一個(gè)文件:workers.properties,該文件用來配置web容器的信息。該文件的內(nèi)容如下:

    # worker列表
    worker.list=controller, status

    #第一個(gè)server的配置,server名為s1
    #ajp13 端口號(hào),在tomcat下server.xml配置,默認(rèn)8009
    worker.s1.port=8009
    #tomcat的主機(jī)地址,如不為本機(jī),請(qǐng)?zhí)顚慽p地址
    worker.s1.host=localhost
    worker.s1.type=ajp13
    #server的加權(quán)比重,值越高,分得的請(qǐng)求越多
    worker.s1.lbfactor=1

    #第二個(gè)server的配置,server名為s2
    worker.s2.port=9009
    worker.s2.host=localhost
    worker.s2.type=ajp13
    worker.s2.lbfactor=1

    #server名為controller,用于負(fù)載均衡
    worker.controller.type=lb
    worker.retries=3   #重試次數(shù)
    #指定分擔(dān)請(qǐng)求的server列表,用逗號(hào)分隔
    worker.controller.balanced_workers=s1,s2
    #設(shè)置用于負(fù)載均衡的server的session可否共享 有不少文章說設(shè)置為1是可以的,但是我是設(shè)置為0才可以的
    worker.controller.sticky_session=0
    #worker.controller.sticky_session_force=1

    worker.status.type=status

    (3)不要改變目錄,新建一個(gè)文件:uriworkermap.properties,文件內(nèi)容如下:

    /*=controller                         #所有請(qǐng)求都由controller這個(gè)server處理
    /jkstatus=status                   #所有包含jkstatus請(qǐng)求的都由status這個(gè)server處理

    !/*.gif=controller                   #所有以.gif結(jié)尾的請(qǐng)求都不由controller這個(gè)server處理,以下幾個(gè)都是一樣的意思
    !/*.jpg=controller
    !/*.png=controller
    !/*.css=controller
    !/*.js=controller
    !/*.htm=controller
    !/*.html=controller

    這里的"!”類似于java中的"!”,是“非”的意思。

    這樣,apache一塊就配置好了。

    3、再修改tomcat配置:這里兩個(gè)tomcat都要配置。

    仍然是打開第一步中的那個(gè)server.xml文件,找到<Engine name="Catalina" defaultHost="localhost">這一行,在里面加上一句:jvmRoute="s1",即把該句改為:<Engine name="Catalina" defaultHost="localhost" jvmRoute="s1">。這里的s1就是第二步中配置的用于負(fù)載均衡的server的名稱。如果該tomcat的端口是第二步中s1用的端 口,那這里就寫s1,第二個(gè)tomcat就應(yīng)該是s2了。

    這樣,配置就完成了。

    (四)運(yùn)行

    進(jìn)入兩個(gè)tomcat的bin目錄,執(zhí)行兩個(gè)tomcat的startup.bat啟動(dòng)這兩個(gè) tomcat,然后將apache重新啟動(dòng)后,運(yùn)行起來看看效果吧。如果不出意外,兩個(gè)tomcat的窗口應(yīng)該是你一次我一次的打印日志信息了,而且此時(shí) session也是共享了的。

    到這里,集群搭建好了,負(fù)載均衡也實(shí)現(xiàn)了。


    文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200932611544216
    posted @ 2009-04-26 11:54 C.B.K 閱讀(195) | 評(píng)論 (0)編輯 收藏
    主站蜘蛛池模板: 久久成人国产精品免费软件| 亚洲美女又黄又爽在线观看| 亚洲黄色激情视频| 久久久久高潮毛片免费全部播放| 国产亚洲色视频在线| 深夜a级毛片免费无码| 全免费a级毛片免费**视频| 亚洲免费一级视频| 18女人腿打开无遮掩免费| 亚洲a在线视频视频| 国产成人免费ā片在线观看老同学| 亚洲人成色7777在线观看不卡| 国产亚洲欧美日韩亚洲中文色| 免费观看a级毛片| 亚洲国产精品无码久久久秋霞1| 在线天堂免费观看.WWW | 亚洲AV成人噜噜无码网站| 91嫩草免费国产永久入口| 亚洲毛片在线免费观看| 久久w5ww成w人免费| 亚洲毛片在线观看| 少妇太爽了在线观看免费视频 | 亚洲国产成人精品无码区在线网站| 久久久免费精品re6| 日本久久久久亚洲中字幕| 99精品视频免费在线观看| 久久亚洲春色中文字幕久久久| 91老湿机福利免费体验| 亚洲黄色网址在线观看| 免费在线视频你懂的| 色偷偷女男人的天堂亚洲网 | 一级做a免费视频观看网站| 久久99亚洲综合精品首页| 皇色在线免费视频| 亚洲国产三级在线观看| 伊人久久免费视频| 亚洲一区中文字幕在线电影网 | 亚洲精品中文字幕乱码| 中文字幕人成无码免费视频 | 精品国产综合成人亚洲区| 久久青草免费91观看|