
2009年5月10日
**
* <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請求代理類
* </pre>
*
* @author benl
* @version 1.0, 2007-7-3
*/
public class HttpRequestProxy
{
/**
* 連接超時
*/
private static int connectTimeOut = 5000;
/**
* 讀取數據超時
*/
private static int readTimeOut = 10000;
/**
* 請求編碼
*/
private static String requestEncoding = "GBK";
private static Logger logger = Logger.getLogger(HttpRequestProxy.class);
/**
* <pre>
* 發送帶參數的GET的HTTP請求
* </pre>
*
* @param reqUrl HTTP請求URL
* @param parameters 參數映射表
* @return HTTP響應的字符串
*/
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換成這個,連接超時
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
// url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
// 1.5換成這個,連接超時
// url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
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("網絡故障", e);
}
finally
{
if (url_con != null)
{
url_con.disconnect();
}
}
return responseContent;
}
/**
* <pre>
* 發送不帶參數的GET的HTTP請求
* </pre>
*
* @param reqUrl HTTP請求URL
* @return HTTP響應的字符串
*/
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換成這個,連接超時
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
// url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
// 1.5換成這個,連接超時
// url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
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("網絡故障", e);
}
finally
{
if (url_con != null)
{
url_con.disconnect();
}
}
return responseContent;
}
/**
* <pre>
* 發送帶參數的POST的HTTP請求
* </pre>
*
* @param reqUrl HTTP請求URL
* @param parameters 參數映射表
* @return HTTP響應的字符串
*/
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換成這個,連接超時
System.setProperty("sun.net.client.defaultReadTimeout", String
.valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
// url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
// 1.5換成這個,連接超時
// url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
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("網絡故障", e);
}
finally
{
if (url_con != null)
{
url_con.disconnect();
}
}
return responseContent;
}
/**
* @return 連接超時(毫秒)
* @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
*/
public static int getConnectTimeOut()
{
return HttpRequestProxy.connectTimeOut;
}
/**
* @return 讀取數據超時(毫秒)
* @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
*/
public static int getReadTimeOut()
{
return HttpRequestProxy.readTimeOut;
}
/**
* @return 請求編碼
* @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
*/
public static String getRequestEncoding()
{
return requestEncoding;
}
/**
* @param connectTimeOut 連接超時(毫秒)
* @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
*/
public static void setConnectTimeOut(int connectTimeOut)
{
HttpRequestProxy.connectTimeOut = connectTimeOut;
}
/**
* @param readTimeOut 讀取數據超時(毫秒)
* @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
*/
public static void setReadTimeOut(int readTimeOut)
{
HttpRequestProxy.readTimeOut = readTimeOut;
}
/**
* @param requestEncoding 請求編碼
* @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) |
評論 (1) |
編輯 收藏
/*
下面的程序說明了怎樣實現對象序列化和反序列化。它由實例化一個MyClass類的對象開始。該對象有三個實例變量,它們的類型分別是String,int和double。這是我們希望存儲和恢復的信息。
FileOutputStream被創建,引用了一個名為“serial”的文件。為該文件流創建一個ObjectOutputStream。ObjectOutputStream 的writeObject( )方法用來序列化對象。對象的輸出流被刷新和關閉。
然后,引用名為“serial”的文件創建一個FileInputStream類并為該文件創建一個ObjectInputStream類。ObjectInputStream 的readObject( )方法用來反序列化對象。然后對象輸入流被關閉。
注意MyClass被定義成實現Serializable接口。如果不這樣做,將會引發一個NotSerializableException異常。試圖做一些把MyClass實例變量聲明成transient的實驗。那些數據在序列化過程中不被保存
*/
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 閱讀(175) |
評論 (0) |
編輯 收藏
Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,我們不想
用serialization機制來保存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。
transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。
文章來源:
http://blog.163.com/ccbobo_cat/blog/static/3209946220096161094144
posted @
2009-07-16 10:09 C.B.K 閱讀(159) |
評論 (0) |
編輯 收藏
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內): [^\x00-\xff]
應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正則表達式: \n[\s| ]*\r
匹配HTML標記的正則表達式: /<(.*)>.*<\/>|<(.*) \/>/
匹配首尾空格的正則表達式: (^\s*)|(\s*$)
應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正則表達式分解和轉換IP地址:
下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的javascript程序:
function IP2V(ip) {
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達式
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!")
}
}
不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:
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地址的正則表達式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正則表達式去除字串中重復的字符的算法程序:
var s="abacabefgeeii"
var s1=s.replace(/(.).*/g,"")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //結果為:abcefgi
用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/)([^\.]+).*/ig,"")
alert(s)
利用正則表達式限制網頁表單里的文本框輸入內容:
用正則表達式限制只能輸入中文:
onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正則表達式限制只能輸入全角字符:
onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')"
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正則表達式限制只能輸入數字:
onkeyup="value=value.replace(/[^\d]/g,'')
"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正則表達式限制只能輸入數字和英文:
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 閱讀(215) |
評論 (0) |
編輯 收藏
ant手冊中的ant配置classpath采用classpath標簽,可是我發現這樣配置總是不好用,還是直接用path可以使用
設置classpath的方法有多種
<path id="project.classpath">
1<pathelement path="${basedir}/lib/aa.jar"/>
2<pathelement location="aa.jar"/>與1的區別在于location可以去當前路徑,當然可以使用絕對路徑
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手冊上說了dirset也好用,但是我測試了還是不要用的
</path>
下面說classpath的使用
樣例如下
<javac scdir="./src" destdir="./classes">
<classpath refid="project.classpath"/>
</javac>
下面是比較四種方式的優缺點
第一種調用的需要設置絕對路徑適合第三方jar包
第二種則適合jar包和build.xml文件在同一目錄下的情況,但是我覺得兩個文件放在一起本身就不合理,估計是用的情況不多。
前兩個都是設置單個jar包
第三種是一個文件集合適合引入不同路徑的jar包,但是需要輸入每個jar包的名字,比較繁瑣,適合于jar包屬于不同位置,比較分散但是不多的情況
第四種是一個文件夾,可以采用匹配模式來引入,這個適合在同一個文件夾下,文件名字比較多的情況下
文章來源:
http://blog.163.com/ccbobo_cat/blog/static/32099462200961051533899
posted @
2009-07-10 05:16 C.B.K 閱讀(1648) |
評論 (0) |
編輯 收藏
ant的構建文件中,有很多核心類型,這些核心類型都是XXXSet的形式,主要有以下幾個:PatternSet、DirSet、FileSet、PropertySet、ZipFileSet等。說下前三個的功能就應該可以舉一反三了。
1.PatternSet
即模式集合。顧名思義,就是定義一個模式,他可以用來指定一個文件集合。常常可以被外部的target引用,復用性很強。有includes、
includesfile、excludes、excludesfile屬性。每個屬性里面還可以嵌套name、if、unless等類型。
2.DirSet 即目錄集合。用來定義目錄的集合。有dir、casesensitive、followsymlinks和PatternSet也有的那4個屬性。上面說過PatternSet可以很好的復用。下面就是一個例子:
- <dirset dir="${build.dir}">
- <patternset id="non.test.classes">
- <include name="apps/**/classes"/>
- <exclude name="apps/**/*Test*"/>
- </patternset>
- </dirset>
<dirset dir="${build.dir}">
<patternset id="non.test.classes">
<include name="apps/**/classes"/>
<exclude name="apps/**/*Test*"/>
</patternset>
</dirset>
這是用patternset來定義DirSet的模式,這個模式還可以在外部引用。如:
- <dirset dir="{build.dir}">
- <patternset refid="non.test.classes"/>
- </dirset>
<dirset dir="{build.dir}">
<patternset refid="non.test.classes"/>
</dirset>
上面定義了一個名為non.test.classes的PatternSet,現在就可以引用他了。refid即reference ID.
3.FileSet即文件集合,他的內部屬性與DirSet幾乎一樣,只是多了一個file和defaultexcludes。和dirset一樣,經常
嵌入patternset來定義文件集合;但是也有另外一個很常用的類型,叫selector,它并不是一個真正的類型或元素,只是一種、一類類型的統
稱。如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) |
評論 (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.
第二種方法:
通過客戶端軟件設置用戶的主機以及權限,


文章來源:
http://blog.163.com/ccbobo_cat/blog/static/32099462200952925050579
posted @
2009-06-29 14:51 C.B.K 閱讀(1565) |
評論 (0) |
編輯 收藏
一、什么是條件變量
與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動阻塞一個線程,直到某特殊情況發生為止。通常條件變量和互斥鎖同時使用。
條件變量使我們可以睡眠等待某種條件出現。條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動作:一個線程等待"條件變量的條件成立"而掛起;另一個線程使"條件成立"(給出條件成立信號)。
條
件的檢測是在互斥鎖的保護下進行的。如果一個條件為假,一個線程自動阻塞,并釋放等待狀態改變的互斥鎖。如果另一個線程改變了條件,它發信號給關聯的條件
變量,喚醒一個或多個等待它的線程,重新獲得互斥鎖,重新評價條件。如果兩進程共享可讀寫的內存,條件變量可以被用來實現這兩進程間的線程同步。
使用條件變量之前要先進行初始化。可以在單個語句中生成和初始化一個條件變量如:
pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;(用于進程間線程的通信)。
也可以利用函數pthread_cond_init動態初始化。
二、條件變量函數
1.
名稱: |
pthread_cond_init |
目標: |
條件變量初始化 |
頭文件: |
#include < pthread.h> |
函數原形: |
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); |
參數: |
cptr 條件變量
attr 條件變量屬性 |
返回值: |
成功返回0,出錯返回錯誤編號。 |
pthread_cond_init函數可以用來初始化一個條件變量。他使用變量attr所指定的屬性來初始化一個條件變量,如果參數attr為空,那么它將使用缺省的屬性來設置所指定的條件變量。
2.
名稱: |
pthread_cond_destroy |
目標: |
條件變量摧毀 |
頭文件: |
#include < pthread.h> |
函數原形: |
int pthread_cond_destroy(pthread_cond_t *cond); |
參數: |
cptr 條件變量 |
返回值: |
成功返回0,出錯返回錯誤編號。 |
pthread_cond_destroy函數可以用來摧毀所指定的條件變量,同時將會釋放所給它分配的資源。調用該函數的進程也并不要求等待在參數所指定的條件變量上。
3.
名稱: |
pthread_cond_wait/pthread_cond_timedwait |
目標: |
條件變量等待 |
頭文件: |
#include < pthread.h> |
函數原形: |
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); |
參數: |
cond 條件變量
mutex 互斥鎖 |
返回值: |
成功返回0,出錯返回錯誤編號。 |
第一個參數*cond是指向一個條件變量的指針。第二個參數*mutex則是對相關的互斥鎖的指針。函數pthread_cond_timedwait函數類型與函數pthread_cond_wait,區別在于,如果達到或是超過所引用的參數*abstime,它將結束并返回錯誤ETIME.pthread_cond_timedwait函數的參數*abstime指向一個timespec結構。該結構如下:
typedef struct timespec{
time_t tv_sec;
long tv_nsex;
}timespec_t;
3.
名稱: |
pthread_cond_signal/pthread_cond_broadcast |
目標: |
條件變量通知 |
頭文件: |
#include < pthread.h> |
函數原形: |
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond); |
參數: |
cond 條件變量 |
返回值: |
成功返回0,出錯返回錯誤編號。 |
參數*cond是對類型為pthread_cond_t 的一個條件變量的指針。當調用pthread_cond_signal時一個在相同條件變量上阻塞的線程將被解鎖。如果同時有多個線程阻塞,則由調度策略確定接收通知的線程。如果調用pthread_cond_broadcast,則將通知阻塞在這個條件變量上的所有線程。一旦被喚醒,線程仍然會要求互斥鎖。如果當前沒有線程等待通知,則上面兩種調用實際上成為一個空操作。如果參數*cond指向非法地址,則返回值EINVAL。
下面是一個簡單的例子,我們可以從程序的運行來了解條件變量的作用。
#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);/*創建進程t_a*/ pthread_create(&t_b,NULL,thread1,(void *)NULL); /*創建進程t_b*/ pthread_join(t_b, NULL);/*等待進程t_b結束*/ 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);/*條件改變,發送信號,通知t_b進程*/ 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); }
} |
程序創建了2個新線程使他們同步運行,實現進程t_b打印20以內3的倍數,t_a打印其他的數,程序開始線程t_b不滿足條件等待,線程t_a運行使a循環加1并打印。直到i為3的倍數時,線程t_a發送信號通知進程t_b,這時t_b滿足條件,打印i值。
下面是運行結果:
#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) |
評論 (0) |
編輯 收藏
工具:grub4dos0.4.2(想要的給我發信,我發給你,loveitdoit@163.com)
文件:fedora7.0映像文件,可在網上下載。
過程:
1.解壓縮grub4dos0.4.2,把里面的 grldr和menu.lst,文件復制到c盤根目錄下。
2.fedora7.0映像文件不必解壓,必須放在fat32的分區里。把里面的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.重起系統,選擇Start GRUB,開始安裝。
文章來源:
http://blog.163.com/ccbobo_cat/blog/static/3209946220095234437396
posted @
2009-06-23 16:05 C.B.K 閱讀(142) |
評論 (0) |
編輯 收藏
花了半天時間研究了下下MYSQL的備份實現,發現其是在MY.CNF(MY.INI)配置文件中作的設置,直接設置服務器唯一性ID號加上其它的附加設
置,則可作為一臺MASTER,而在
SLAVE機上,也只需要在配置文件中設置一下連接MASTER所需的參數即可,如果在MASTER里也加上連到SLAVE機的參數,則就是雙向備份
了~~不過,這些連接參數中用到的賬號需要注意權限的設置,否則會搞半天沒反就急死你迪。。。
我在WIN上和LINUX上各裝了MYSQL5,下面是它們的配置:
WIN(172.22.33.33)下的MASTER(由于我改了端口3327所以下面多加了個端口方面的特殊處理了)的配置(my.ini):(**一定要在mysqld配置段中配置,不象PHP,APACHE可以隨便找個方便的地方配的,注意哈??!)
[mysqld]
#master 設置
server-id=1
log-bin=c:/masterlog
binlog-do-db=db5
#實現雙機備份段,給MASTER同時加上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
數據庫中加一個賬號:
GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
TO [email=backup@]backup@'172.22.1.37'[/email] IDENTIFIED by 'backup';
這個權限表示,這個backup賬號只能由從備份機172.22.1.37訪問只能用來進行備份操作
LINUX(172.22.1.37)下的SLAVE機的配置(把安裝目錄里找到的任意一個*.cnf拷到/etc/my.cnf下進行修改):
server-id=2
#如果不需要雙向備份下面兩行可以不要
#否則還要加一個數據庫用戶賬號
/*
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
由于只是大概的弄了一下,特別是在數據庫用戶方面沒有作仔細試驗:),可能會有所不太準確的地方,還有就是,上面測試用到的數據庫一定要是已經建立好并且
結構相同的,兩臺機子都重啟后會進行檢查,如果出現找不到或者檢查到結構不同,會報錯,最好就是在創建空數據庫時或初始時安裝兩個一樣的數據庫后就建立好
關系,對于不同版本的MYSQL,官方說明也可以同步,但想一想,把MYSQL5 的數據備份到4中去丟失5的特性也沒什么意義吧。。
文章來源:
http://blog.163.com/ccbobo_cat/blog/static/32099462200952335921779
posted @
2009-06-23 15:59 C.B.K 閱讀(219) |
評論 (0) |
編輯 收藏
【第一篇】
首先、確定你自己的英語水平。中國大學畢業生的通病是,書面閱讀還可以,口語不行,聽力很差,書寫湊合。但每個人具體情況又都不一樣,有人閱讀專業書一目
十行,但讀報紙很費勁。有人聽新聞可以,聽別的不行。你必須首先了解自己,然后針對你的情況對癥下藥。這種評估工作最好找英語好的人幫你做,如果不方便,
只能自己評自己,就要盡量做到客觀。 其次、確定自己的發音水平。我有個朋友對我說他的發音沒問題,可實際上他說得很多詞我都聽不懂。你學的是英國音還
是美國音都無所謂,反正最終從你嘴里出來的肯定是中國音。最重要的是發音要合理。英語每一個單詞都有自己的念法,你不能憑空想象。比如,有人把
RESUME讀做RE-'SOOM,這樣,別人說RE-SIU-'MAY,你不知道是什么。你念RE-'SOOM,別人也聽不懂。再次、確定自己的英語學
習目標。我這里僅把口語交流做為目標。最后、開始學習。
1、口語學習的關鍵是要模仿人家的說話。這包括語音和語調兩部分。中國英語教學重視語調的很少,盡管很多時候語調可能比語音更重要。
2、買一臺錄音機,找一合磁帶。根據你的水平,可以選擇新概念第二或第三冊,也可以到圖書館借一套有書和磁帶的小故事集。注意:一定要有書,故事篇幅不能太長,生詞量要小,過于簡單沒有關系。我傾向于使用故事,而不是對話或新聞聽力材料。
3、進行跟讀訓練。放磁帶,看著書,搞明白每一個單詞的意思,理解整個故事情節。然后,放一句,暫停,學著人家讀一句,然后,放下一句,暫停,再學一句,繼續。
4、跟讀過程中要注意的幾點:
(1)一定要盡力模仿發音和語調,越象越好。
(2)開始時速度可以比較慢,要逐步使自己跟上人家的速度。
(3)中間可以回倒重放,但我傾向于讓大家完成一小段后再回去重來。
5、同步閱讀。當你對文章發音、語調完全掌握之后,就要在放錄音的同時同步跟讀。爭取讓自己的聲音與他完全重合。注意語調和語音。如果中間有結巴的地方也不要緊,繼續讀下去,然后再回來重讀。
6、關掉錄音機,朗誦課文。注意使用學到的語音語調。帶滾瓜爛熟之后,可以進入下一篇課文。
這樣,一兩個月之后,當你“精讀”過五到十篇約一千字篇幅的文章之后,你會發現你的英語發音和聽力有了明顯的進步。再配合其他學習,如與人聊天,看電視,聽廣播,等等,口語水平會得到顯著提高。
【第二篇】
英語作為一種工具,其實用性愈顯重要。傳統英語教育方法由于過于艱深化,以及盲目的應試模式使大部分的英語學習者學了幾年甚至數十年,卻仍然處于聽不懂開不了口的尷尬境地。那么究竟如何才能在比較短的時間里快速提高口語水平,讓她真正為你所用呢?
西方最新流行一種外語學習理論,即口語提高的最好方式就是采用短期突破法。從下面的公式中,就可以看出,口語短期突破的方法是很有效的。
口語提高速度定律=說英語時間/說中文時間Speed of learning English=Speaking English/Speaking Chinese ( in a period of time)
比如,在給定的一天時間內(16小時),學生A練習英語口語的時間為14小時,說中文的時間為2小時,兩者的比例為7:1;學生B練習口語的時間為2
小時英語,說中文的時間為14小時。比例為1:7。如此一來,學生A比學生B說英語的比例大49倍。
我們認為:這一理論其實就是對語言學習規律一次很好的回歸,語言的核心是使用者能夠隨時隨地地使用它。你用的時間越長,你就越熟練,這里我們說的使用
就是“說”,用嘴巴表達出來,而不是用眼睛和腦子去看和死記。如果你能夠在一段時間內的大部分時間里堅持持續使用英語而不是中文進行表達,把學習英語的任
務轉化成母語似的說話習慣,你就完全可以在很短的時間內有效掌握一口流利的英語口語。
當然現實情況卻是:很多人并沒有這樣的勇氣和能力去堅持使用一個完全不熟悉的語言進行日常的交流!所以選用一套優秀的教材和相應的工具就顯得異常重要了,這種教材應該具備以下特點才能幫助你克服困難:
?。?、能夠隨時隨地學習,讓你很容易就接觸到英語;
2、能夠讓你脫離書本,完全浸在英語環境里;
3、內容應該精挑細選,具備典型性和代表性,幫助你在短時間內掌握精華內容,從而建立起長期學習的信心和基本能力。
同時你應該注意培養自己的自信,學會勇敢犯錯誤,克服恐懼的心理障礙。其實這種心理障礙是成人自己加給自己的,為什么我們小時候學母語這么自然容易,就是因為那個時候不知道什么是丟臉。所以我們應該象小時候那樣暫時忘卻丟臉,勇敢地去丟臉!
【第三篇】
想提高英語口語水平,首先要在語音上下功夫:)~
下面是些方法,你可以根據自己的學習方式掌握:)~
1.其次,要有大量的閱讀和聽力做基礎。在讀和聽的過程中,積累了詞匯,掌握了句型,熟悉了用英語表達思想的方式,最重要的是培養了語感。
2.同時,學英語口語也需要用多種辦法:如大聲朗讀英語對話和文章,朗讀各種句型的例句和口語中最常用的句子,背誦文章及演講,與會英語的人練口語,當
然,最好與以英語為母語的人練口語。事實上,自言自語亦是練習口語的有效的方法之一。如果你把自己說的英語給錄制下來,聽聽自己的錄音,若有問題,再加以
改正,效果就會更好。
3.說英語還要有膽量。如果你能在說不太出口,或是說不好的情況下,大膽地說。說上一段時間后,突然有一天你會自如、清楚地表達自己的思想。有了大膽說的精神,你才能闖過口語的難關。
4.只會學英語,而不能盡快地去用,那就永遠也學不好英語。在學英語的過程中,要始終尋找機會說英語。比如說,你周圍有幾個喜歡說英語的朋友,大家在一起
就要用英語來交談。這種交談有利于每個人的英語學習,因為大家都有機會運用自己已掌握的英語知識來交流思想,鞏固了已學的知識,并把知識轉化成技能,同
時,還能從別人那兒學到新的東西。要想學好英語口語就要多說。
5.能同以英語為母語的人說英語是最佳方法。在國內學英語缺乏環境,看電影學英語口語是彌補環境不足的好方法。英語電影是一部英語國家的生活、文化、風俗
等一切的百科全書,是最全的英語口語百科全書。大量地看英文電影就是你徹底攻克英語“聽”和“說”的法寶。英語電影把你帶入了一個新的世界中去。你在電影
中,學到了英語口語的語匯、短語、句子結構,以及表達各種內容的說法。你要做的就是把自己想像成電影中的一個角色,在經歷著自己的生活,又在經歷著其他人
的生活??傊匆徊侩娪氨仍诿绹钜惶爝€好,看電影也能學到地道的英語口語。
【第四篇】
當代社會是個開放社會,信息社會,人們越來越重視交際,而我國改革開放的成功也日益提高了我國在世界上的地位,我們與世界各國交流的領域越來越廣了,沒有出眾的英語口語表達將會寸步難行。
而要提高英語口語表達能力,就要先了解英語口語表達的過程是怎樣發生的。大家知道,語言是思維的外殼??谡Z表達的過程,實際上是一個復雜的心理和生理過程,是思維借助詞語按一定句式迅速轉換為有聲言語的過程。因此,口語能力的強弱取決于:
1、思維能力的強弱,特別是與口語有關的思維的條理性、敏銳性與靈活性,這是關鍵。
2、準確、迅速地組織言語(選詞、造句、組段、構篇)能力的強弱,這是基礎。
3、運用語言的能力的強弱,這是前提。
根據口語表達循序漸進的一般規律,口語訓練的重點應是培養敏銳的思維和強烈的語感。具體包括:
1、語音。學會科學發聲方法,能用準確、響亮、流暢的英語進行口頭表達。
2、語調。能借助聲音高低升降、抑揚頓挫的變化來表達復雜的感情,掌握停連和輕重、抑揚和明暗、快慢和松緊等一般的朗讀技巧。
3、詞匯。能掌握比較豐富的口語詞匯。
4、語脈。說話能做到有條有理、語言流暢、上下貫通、一脈相承。
5、語境。說話注意目的、對象、場合,合乎規定情景的要求,講禮貌、有針對性。懂得口語修辭。在會話中有隨機應變的能力。
此外,還要懂得口頭言語的輔助手段--表情、姿勢、動作等態勢言語的運用。
由于書面語和口語是相互滲透、相互促進的,為提高口語的表現力,可在說話訓練之前先進行一章朗讀、朗誦訓練。聽和說是一個事物的兩個方面,吸收、表達
兩者不能偏廢,所以口語訓練體系中也應包括。通過以上訓練,掌握一定的朗讀朗誦技巧,培養準確、流利、有感情地朗讀朗誦一般作品的能力,特別注意培養強烈
的語感。
3、聽力訓練
培養聽的注意力、理解力、記憶力和辨析力,提高聽知能力,養成良好的聽的習慣。
4、口語表達基本方式訓練
進行敘述、描述、評述、解說等口語表達基本方式的訓練,培養內部言語向外部言語迅速轉化的能力,結合進行語調、語脈的訓練。
5、會話型言語訓練
言語形式有會話型和獨白型兩類。會話是指兩個以上的人圍繞一個或幾個話題一起說話的形式,如交談、座談、辯論、審訊等。會話時參加者是互為聽、講者
的,因此后面的發言常常受到前面發言的制約。另外,由于當面交談,大量態勢語代替了言語表達,會話者的言語結構往往不嚴謹、不完善,省略句較多。
可進行如下訓練:通過交談和辯論兩種會話言語訓練,了解它們的一般特點、注意事項,結合進行應變能力和禮貌用語的訓練,從而在會話中有效地培養隨機應變的能力。
6、獨白型言語訓練
獨白是指一個人單獨發言而其他人都作為聽眾的言語表達形式,如:講故事、作報告、講課、演講、講解員的解說等。獨白言語一般不在進行過程中跟聽眾問答
交流,因此要求在事先要周密地了解聽眾的要求并系統地組織好發言內容和有關態勢語。獨白是一種高層次的言語形式。
可通過講故事和演講兩種獨白言語的訓練,了解它們的一般特點、注意事項,結合進行運用態勢語的訓練,這類訓練很有利于培養思維的條理性和連貫性。
7、即興小品訓練
即興小品要求表演者按照規定的題目和要求,在規定的時間內,充分發揮自己的想象,不用或少用道具,通過言語和動作的表演,展現社會生活中的某個瞬間或片斷,表達一個簡單的主題。
嚴格地說,小品應該是話劇藝術表演訓練的一種形式,但由于它具有綜合的特點,對訓練思維的創造性、敏捷性、條理性、言語表達的準確性、形象性、流暢
性,以及應變力,乃至姿勢的綜合運用等等,都有很大的好處,所以我們要想英語口語表達能力更上一個層次,這種形式的訓練也要加以采用。
懂得了英語口語表達的規律,并不等于就有了一口流暢的英語表達口才,就好象讀了介紹游泳的書并不等于一定會游泳一樣,關鍵還是要在長期的時實踐中持之
以恒地艱苦磨練。這種訓練不同于我們平時常聽常說的那種日常英語口語訓練。日常的英語口語訓練與之相比簡單得多,所用的詞匯量及話題所涉及的深度都是相當
有限的。而真正高層次的英語口語交際所需達到的流暢性、條理性、敏銳性和靈活性并不是常練一些日常用語就能達到的,其中用到的詞匯量也因話題的深入和多樣
而大大增加了。
所以,要想真正地提高英語口語,說一口流利而又有水平的交際英語,得有對英語口語表達感興趣作為前提,懂得以上的規律,重視運用以上的訓練步驟,加上
長期的艱苦訓練,才會有成效,才會達到目的。聽力訓練,當然,在訓練過程中,聽和說是無法截然分開的。
因此,英語口語訓練體系可按以下順序安排:
1、語音訓練
在學習英語語音知識的基礎上加強語音訓練,進行方音辨正練習。通過學習,打好英語語音知識,有一定的辨音能力,能用英語正確、清楚、響亮地表達。
2、朗讀朗誦訓練
進行呼吸、發聲與共鳴訓練,吐字納音的訓練,以及各種朗讀朗誦技巧的訓練,學會常用文體的朗讀、朗誦,懂得在朗誦中恰當使用態勢語
文章來源:
http://blog.163.com/ccbobo_cat/blog/static/3209946220095109201252
posted @
2009-06-10 09:20 C.B.K 閱讀(93) |
評論 (0) |
編輯 收藏
[關鍵字]:java,design pattern,設計模式,《Java與模式》,Chain of Responsibility,責任鏈模式
[環境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com)
[正文]:

package pattern.chainofresponsibility;
/**
* 責任鏈模式: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();
//設置責任鏈
handler3.setSuccessor(handler2);
handler2.setSuccessor(handler1);
//發送命令
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) |
評論 (0) |
編輯 收藏