
2008年7月31日
內(nèi)容如下:

Code
<script>
setInterval( function() {
var date = new Date();
if (date.getMinutes() == 0 || date.getMinutes() == 30) {
alert("老大,喝點(diǎn)水,休息一下!");
}
}, 1000 * 60);
</script>
大家注意身體啊

--------------------------
09博客園紀(jì)念T恤新聞:
網(wǎng)站評(píng)測(cè):搜狐博客 VS 我燒網(wǎng)網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/08/25/1553578.html
防盜鏈原理:
http標(biāo)準(zhǔn)協(xié)議中有專門的字段記錄referer
一來可以追溯上一個(gè)入站地址是什么
二來對(duì)于資源文件,可以跟蹤到包含顯示他的網(wǎng)頁地址是什么。
因此所有防盜鏈方法都是基于這個(gè)Referer字段
網(wǎng)上比較多的2種
一種是使用apache文件FileMatch限制,在httpd.conf中增加 ( 其實(shí)也可以將把下面的語句存成一個(gè).htaccess文件),并放到你的網(wǎng)站的根目錄(就是www/html目錄),這樣子別人就沒有辦法盜連你的東東了~~
SetEnvIfNoCase Referer "^
Order Allow,Deny
Allow from env=local_ref
Allow from 127.0.0.1
這種很方便禁止非允許訪問URL引用各種資源文件
請(qǐng)大家注意,把第一句"^http://www.linji.cn
我應(yīng)該這么寫的
"^
第二種是使用rewrite,需要增加apache的mode_rewrite,支持.htaccess文件目錄權(quán)限限制
在虛擬主機(jī)根目錄增加.htaccess文件,描述從定向,把非本地地址refer的圖片文件都從定向到警告圖片或者警告網(wǎng)頁上。
首先要確認(rèn)你的服務(wù)器或空間的服務(wù)器解譯引擎為Apache2,還有支持.htaccess客戶設(shè)置文件,
如果你有自己的服務(wù)器就請(qǐng)先對(duì)./conf/httpd.conf 文件做以下修改
找到:#LoadModule rewrite_module modules/mod_rewrite.so
把前面的 # 給去丟
找到等一個(gè) AllowOverride None 改為 AllowOverride All
重啟Apache2服務(wù)器
接下就是做一個(gè) .htaccess 文件了,其 .htaccess 文件內(nèi)容為
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://aaoo.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://aaoo.net$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net$ [NC]
RewriteRule .*.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$ http://down.yoyo.com.ru/err.html [R,NC]
其中有色的地方都是要改為你的:
紅色:就是改為你提供下載頁面的地址,也就是只有通過這個(gè)地址才可以下載你所提供的東東。
藍(lán)色:就是要保護(hù)文件的擴(kuò)展名(以|分開),也就是說以這些為擴(kuò)展名的文件只有通過紅色的地址才可以訪問。
綠色:如果不是通過紅色的地址訪問藍(lán)色這些為擴(kuò)展名的文件時(shí)就回重定向到綠色地址上。
這個(gè)方法有個(gè)好處是,不同的虛擬主機(jī)用不同的描述定義。
接下就是怎么用 .htaccess 文件來實(shí)現(xiàn)防盜鏈了。
首先要在空間上建兩個(gè)目錄(當(dāng)然目錄名隨你),一個(gè)為 web 另一個(gè)為 down ,
web 是用來放下載頁面的(或下載程序),down 當(dāng)然就是放你提供的東東的啦,
把 .htaccess 文件的紅色部分改一下,改為http://你的域名/web。藍(lán)色部分
改為你要保護(hù)文件的擴(kuò)展名。綠色部分改為http://你的域名/web。改后保存
.htaccess 文件把它上傳到 down 目錄。
還有第三種:
我在解決plog禁止盜鏈的時(shí)候,發(fā)現(xiàn)個(gè)問題,也算個(gè)好方法。
plog把所有資源都自己管理起來,用resserver.php來動(dòng)態(tài)顯示,這樣統(tǒng)一的入口方便添加權(quán)限操作。
同時(shí)造成上面2種方法無法使用,因?yàn)椴辉偈莂pache直接訪問資源文件,而是php通過文件讀取。
因此只能在代碼中做手腳:在讀取資源文件輸出之前,加如下判斷代碼
引用
$referer = $_SERVER['HTTP_REFERER'];
$selfurl = $_SERVER['HTTP_HOST'];
if(false == strpos($referer,$selfurl))
{
echo '非法盜鏈!';
exit(1);
}
這里有些偷懶,直接看引用地址中是否包含host地址,不過原理就是這樣,判斷referer是否是本站地址。
我們常常在下載的時(shí)候,也碰到盜鏈網(wǎng)站無法下載,報(bào)盜鏈的問題。要下載這類文件最簡(jiǎn)單的方法就是改referer
比方flashget中,網(wǎng)址下面的"引用"一欄中,直接填寫下載地址就可以了。

--------------------------
09博客園紀(jì)念T恤新聞:
微軟:不一樣的PowerPoint 2010網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/08/21/1551756.html
這兩天完善了一下視頻轉(zhuǎn)換這個(gè)東西,以前做的那套東西上傳完之后就開始轉(zhuǎn)換,無法適應(yīng)大并發(fā)量下的視頻轉(zhuǎn)換(我覺得同時(shí)有10個(gè)ffmpeg進(jìn)程在轉(zhuǎn)視頻服務(wù)器肯定要掛掉),所以我用了另一套方案,視頻上傳之后先不轉(zhuǎn)換,把視頻的基本信息存到數(shù)據(jù)庫(kù)中,然后由程序定時(shí)的從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),依次轉(zhuǎn)換視頻。具體做法是:1、上傳文件,將文件名存入數(shù)據(jù)庫(kù),同時(shí)在數(shù)據(jù)庫(kù)標(biāo)明videostat字段為0(表示未轉(zhuǎn)換)
2、通過程序,每隔30秒(根據(jù)不同情況可以改變)取出一個(gè)未轉(zhuǎn)換(videostat=0)且失敗次數(shù)小于5(confailtime<5)的紀(jì)錄
3、開始轉(zhuǎn)換視頻,這里要先將數(shù)據(jù)庫(kù)中videostat字段改為2(表示正在轉(zhuǎn)換)不然30秒鐘轉(zhuǎn)換不完下個(gè)進(jìn)程又會(huì)讀到這條紀(jì)錄開始轉(zhuǎn)換......
4、等待轉(zhuǎn)換進(jìn)程結(jié)束,如果成功將相應(yīng)紀(jì)錄的videostat字段的值改為1(表示轉(zhuǎn)換成功),若轉(zhuǎn)換失敗則將失敗次數(shù)字段加一(confailtime=confailtime+1)
在鼓搗這東西的過程中,遇到了一個(gè)問題,如果一個(gè)進(jìn)程先執(zhí)行p.waitFor();方法而后輸出命令行中的結(jié)果是不行的,即:

Code
int flag = p.waitFor();
InputStream inErr = p.getErrorStream();
InputStream inIns = p.getInputStream();
BufferedReader brErr = new BufferedReader(new InputStreamReader(
inErr));
BufferedReader brIns = new BufferedReader(new InputStreamReader(
inIns));
// inErr讀取輸出信息開始
String strsErr = "";
String strErr = brErr.readLine();
while (strErr != null) {
strsErr = strsErr + strErr + "\n";
System.out.println(strErr);
strErr = brErr.readLine();
}
// inErr讀取輸出信息結(jié)束
// inIns讀取輸出信息開始
String strsIns = "";
String strIns = brIns.readLine();
while (strIns != null) {
strsIns = strsIns + strIns + "\n";
System.out.println(strIns);
strIns = brErr.readLine();
}
如果這樣執(zhí)行的話進(jìn)程會(huì)掛起,無法繼續(xù)下午,而正確的方法是先讀取命令行的數(shù)據(jù),再來waitFor();
還有一點(diǎn)需要注意的是獲得命令行的輸出結(jié)果先要從錯(cuò)誤流中獲得,即(ErrorStream),而非從輸入流(InputStream)中獲得,很有用的經(jīng)驗(yàn)。

--------------------------
09博客園紀(jì)念T恤新聞:
自由軟件基金會(huì)列舉Windows 7之七宗罪網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/08/04/1538824.html
很久不在這里發(fā)帖子了,最近在家閑來無事,想到轉(zhuǎn)視頻的那東西又要做了,遂翻出以前的帖子,看到一年前豐哥讓我做一下文件上傳的進(jìn)度條....額~~那就做一下吧。
東西很簡(jiǎn)單,主要用到commons-fileupload,其中有一個(gè)progressListener的接口,該接口可以實(shí)現(xiàn)實(shí)時(shí)更新已上傳文件的大小,有了這個(gè)還說什么呢?
給出代碼

代碼
package lc.progress;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import lc.progress.vo.fileUploadStatus;
import org.apache.commons.fileupload.ProgressListener;
public class myProgressListener implements ProgressListener {
private HttpSession session;
public myProgressListener(HttpServletRequest req) {
session=req.getSession();
fileUploadStatus status = new fileUploadStatus();
session.setAttribute("status", status);
}
/* pBytesRead 到目前為止讀取文件的比特?cái)?shù)
* pContentLength 文件總大小
* pItems 目前正在讀取第幾個(gè)文件
* 只要在session中實(shí)時(shí)保存文件上傳的狀態(tài)(這里我用fileUploadStatus類來封裝)
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
// TODO Auto-generated method stub
fileUploadStatus status = (fileUploadStatus) session.getAttribute("status");
status.setPBytesRead(pBytesRead);
status.setPContentLength(pContentLength);
status.setPItems(pItems);
}
}
然后在上傳得servlet或action中加入這樣一段代碼,就可以把自定義的progressListener添加進(jìn)去

代碼
myProgressListener getBarListener = new myProgressListener(req);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(getBarListener);
最后就是通過js來不斷的訪問另一個(gè)servlet來實(shí)時(shí)返回上傳狀態(tài)就可以了,限于篇幅我就不再貼代碼了,有興趣的讀者可以自己下載來看。
代碼下載(目標(biāo)另存為就行了)

--------------------------
09博客園紀(jì)念T恤新聞:
網(wǎng)速調(diào)查報(bào)告:韓國(guó)互聯(lián)網(wǎng)網(wǎng)速全球居首網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/08/03/1537870.html
http://family168.com/oa/springsecurity/html/index.html
package lc.util;
import java.math.BigDecimal;
public class MathHelper {
private static final int DEF_DIV_SCALE = 10;
private MathHelper() {
}
/**
* 提供精確的加法運(yùn)算。
*
* @param v1
* 被加數(shù)
* @param v2
* 加數(shù)
* @return 兩個(gè)參數(shù)的和
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精確的減法運(yùn)算。
*
* @param v1
* 被減數(shù)
* @param v2
* 減數(shù)
* @return 兩個(gè)參數(shù)的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精確的乘法運(yùn)算。
*
* @param v1
* 被乘數(shù)
* @param v2
* 乘數(shù)
* @return 兩個(gè)參數(shù)的積
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。
*
* @param v1
* 被除數(shù)
* @param v2
* 除數(shù)
* @return 兩個(gè)參數(shù)的商
*/
public static double div(double v1, double v2) {
return div(v1, v2, DEF_DIV_SCALE);
}
/**
* 提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指 定精度,以后的數(shù)字四舍五入。
*
* @param v1
* 被除數(shù)
* @param v2
* 除數(shù)
* @param scale
* 表示表示需要精確到小數(shù)點(diǎn)以后幾位。
* @return 兩個(gè)參數(shù)的商
*/
public static double div(double v1, double v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精確的小數(shù)位四舍五入處理。
*
* @param v
* 需要四舍五入的數(shù)字
* @param scale
* 小數(shù)點(diǎn)后保留幾位
* @return 四舍五入后的結(jié)果
*/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}

--------------------------
09博客園紀(jì)念T恤新聞:
王建宙臺(tái)灣布道TD:痛快,一起努力的感覺網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/05/20/1469589.html
import java.sql.*;
public class Access
{
public static void main(String args[])
{
try
{
String strurl="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=books.mdb";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection(strurl) ;
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select * from books");
if(rs.next())
{
System.out.println(rs.getString("簡(jiǎn)介"));
}
}catch(Exception e)
{
System.out.println(e);
}
}
}

--------------------------
09博客園紀(jì)念T恤新聞:
微軟正式對(duì)Word禁售令提起上訴 稱法官不懂法網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/05/08/1452661.html
又一個(gè)新聞發(fā)布......比以前的更加人性化了,用到了Struts2、Struts2的JSON插件,前臺(tái)js用了Jquery庫(kù),自己看吧。歡迎大家提出自己的寶貴意見。
關(guān)于顯示新聞的功能我還沒有找到一個(gè)合適的AJAX表現(xiàn)形式,所以還沒有完成,歡迎大家給我個(gè)建議
點(diǎn)擊下載源碼

--------------------------
09博客園紀(jì)念T恤新聞:
IBM 2009年北美裁員近1萬人網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2009/03/16/1413631.html
最近搞的一個(gè)通訊錄想要加一個(gè)Ajax的自動(dòng)完成功能,看起來功能雖小,可給用戶的體驗(yàn)會(huì)改進(jìn)不少。在一個(gè)介紹了幾十種java的Ajax框架的網(wǎng)頁里面,我找到了AjaxTags這個(gè)小東西,開始了我的第一次Ajax之旅。
從AjaxTags的官方網(wǎng)站上面http://ajaxtags.sourceforge.net/可以下載到其最新的版本,目前是AjaxTags1.3順便下載了一個(gè)官方的小例子看了看,確實(shí)很好阿,例子中使用Ajax完成了11種功能,然而我需要的是自動(dòng)完成(autocomplete)部分的代碼,所以重點(diǎn)研究這一部分
jsp頁面中,首先當(dāng)然是要添加AjaxTags的標(biāo)簽支持,需要如下語句
Code

<%@ taglib uri="http://ajaxtags.org/tags/ajax" prefix="ajax"%>
然后在頁面中加入如下的標(biāo)簽
Code

<ajax:autocomplete
source="model"//從控件"model"中獲得輸入的字符
target="make"//通過Ajax自動(dòng)完成控件"make"的內(nèi)容
baseUrl="${contextPath}/autocomplete.view"//Ajax執(zhí)行時(shí)調(diào)用的請(qǐng)求路徑
className="autocomplete"//css類名
indicator="indicator"
minimumCharacters="1"//Ajax執(zhí)行需要輸入的最小字符數(shù)
/>
在官方的例子中使用的是Servlet來完成Ajax,而對(duì)于使用struts就不適用了,后面說這個(gè)問題。
在 autocomplete.view對(duì)應(yīng)的Servlet類中需要建立xml來供頁面調(diào)取,代碼如下

Code
public class AutocompleteServlet extends BaseAjaxServlet {
public String getXmlContent(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String model = request.getParameter("model");//從頁面獲取控件"model"的輸入值
CarService service = new CarService();
List<Car> list = service.getModelsByName(model);//調(diào)用CarService的方法獲得汽車的List
// Create xml schema
return new AjaxXmlBuilder().addItems(list, "model", "make",true).toString();//生成xml
}
}
其實(shí)還是很簡(jiǎn)單的,接下來看CarService的代碼吧,重點(diǎn)其實(shí)只有一段,然后在下面顯示出自動(dòng)提示,于是可以把剛才的那個(gè)ajax標(biāo)簽修改如下

Code
public class CarService {
private static List<Car> cars = new ArrayList<Car>();
static {
cars.add(new Car("Ford", "Escape"));
cars.add(new Car("Ford", "Expedition"));
cars.add(new Car("Ford", "Explorer"));
cars.add(new Car("Ford", "Focus"));
cars.add(new Car("Ford", "Mustang"));
cars.add(new Car("Ford", "Thunderbird"));
cars.add(new Car("Honda", "Accord"));
cars.add(new Car("Honda", "Civic"));
cars.add(new Car("Honda", "Element"));
cars.add(new Car("Honda", "Ridgeline"));
cars.add(new Car("Mazda", "Mazda 3"));
cars.add(new Car("Mazda", "Mazda 6"));
cars.add(new Car("Mazda", "RX-8"));
}//其實(shí)把上面這個(gè)地方改為數(shù)據(jù)庫(kù)查詢就可以從數(shù)據(jù)庫(kù)中得到List來供頁面顯示
public CarService() {
super();
}
public List<Car> getModelsByMake(String make) {
.
}
public List<Car> getModelsByName(String name) {
..
}
public List<Car> getAllCars() {
return cars;
}
}
例子看完了,開始實(shí)際操作吧,在我的頁面中,需要通過一個(gè)名為"name"的文本框輸入要查詢的人的姓名

Code
<ajax:autocomplete
source="name"
target="name"
baseUrl="ajaxfinduser.do"
className="autocomplete"
indicator="indicator"
minimumCharacters="1"
/>
接下來是我的Action,在寫Action的時(shí)候,我以為只需要把原來Servlet繼承的BaseAjaxServlet改為BaseAjaxAction就可以了,可后來才發(fā)現(xiàn),jar包中根本就沒有BaseAjaxAction這個(gè)類,無語,去官方網(wǎng)站上看了后才知道,在1.2更新到1.3的時(shí)候,把對(duì)Struts的支持去掉了,如果想支持Struts的話需要建立自己的BaseAjaxAction
(Struts removed, to use it create your own BaseAjaxAction.java and implement BaseAjaxXmlAction then just call xml = AjaxActionHelper.invoke(this, request, response);)
下載了一份AjaxTags的源碼來看,原來AjaxActionHelper.invoke();這個(gè)方法需要調(diào)用Action中的getXmlContent方法來完成xml的寫入,那就好說了,代碼如下:

Code
package com.txl.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ajaxtags.servlets.BaseAjaxXmlAction;
import org.ajaxtags.xml.AjaxXmlBuilder;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.ajaxtags.servlets.AjaxActionHelper;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.txl.service.AjaxFindUserService;
import com.vo.User;
public class AjaxFindUserAction extends Action implements BaseAjaxXmlAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, Exception {
response.setCharacterEncoding("utf-8");
response.getOutputStream().print(new String(AjaxActionHelper.invoke(this, request, response).getBytes("UTF-8"),"ISO-8859-1"));//這里需要轉(zhuǎn)換編碼,不然無法支持中文查詢
response.getOutputStream().flush();
return null;
}
public String getXmlContent(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String realname = request.getParameter("name");
ApplicationContext ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(servlet.getServletContext());//用ssh時(shí)需要在這里引入spring的配置文件,不然會(huì)在調(diào)用dao的時(shí)候報(bào)空指針異常
AjaxFindUserService service = (AjaxFindUserService) ctx
.getBean("AjaxFindUserService");
List<User> list = service.getUsersByRealname(realname);
return new AjaxXmlBuilder()
.addItems(list, "realname", "realname", true).toString();
}
}
剩下工作就是在struts-config.xml中配置對(duì)應(yīng)的action,在spring中配置對(duì)應(yīng)的bean就ok拉

--------------------------
09博客園紀(jì)念T恤新聞:
Office 2010雙拳出擊加強(qiáng)反盜版網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/09/22/1295661.html
我一直有通宵下東西的習(xí)慣,可又不忍心讓筆記本下載完成后一直等到我睡醒,所以我經(jīng)常用迅雷給我們提供的下載完成后自動(dòng)關(guān)機(jī)這個(gè)功能。
然而現(xiàn)在迅雷運(yùn)行在了虛擬機(jī)里面,這就郁悶了,即使自動(dòng)關(guān)機(jī)也只能關(guān)掉一個(gè)虛擬機(jī)的進(jìn)程,無奈我想到可不可以用shell程序來監(jiān)測(cè)虛擬機(jī)的進(jìn)程,當(dāng)他關(guān)閉后就運(yùn)行關(guān)機(jī)的命令,經(jīng)過測(cè)試,果然成功了,具體代碼如下:

Code
#!/bin/bash
while [ `pidof -s $1` ]
do
sleep 2 #&& echo "ok"
done
date
echo "Done..shuting down in 60 seconds." && sleep 60
shutdown -h -P now
將代碼保存在shutdown.sh文件中
使用起來也很方便,用"ps ux"找到vbox運(yùn)行的進(jìn)程,將其對(duì)應(yīng)的time command值作為參數(shù)輸入進(jìn)來,例如我的是:
lichao 10659 91.7 52.0 1224284 1079860 ? Sl 21:49 11:01 /opt/VirtualBox-1.6.4/VirtualBox -comment winxp -startvm 5e04c66f-82f7-4df0-0f92-8b9113be6f2
則執(zhí)行上述腳本文件:
./ shutdown.sh /opt/VirtualBox-1.6.4/VirtualBox -comment winxp -startvm 5e04c66f-82f7-4df0-0f92-8b9113be6f2
監(jiān)測(cè)開始
當(dāng)虛擬機(jī)關(guān)機(jī)后命令行出現(xiàn)如下提示:
Done..shuting down in 60 seconds.
60秒后就會(huì)關(guān)機(jī)拉,如果你還不想關(guān)機(jī),可以Ctrl+Alt+C停止當(dāng)前任務(wù),再進(jìn)行其他操作,怎么樣,挺好使的

--------------------------
09博客園紀(jì)念T恤新聞:
中國(guó)聯(lián)通:國(guó)際通訊已恢復(fù)至震前水平網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/21/1273554.html
查看軟件xxx安裝內(nèi)容
查找軟件
- apt-cache search 正則表達(dá)式
查找文件屬于哪個(gè)包
- dpkg -S filename
apt-file search filename
查詢軟件xxx依賴哪些包
查詢軟件xxx被哪些包依賴
增加一個(gè)光盤源
系統(tǒng)升級(jí)
- sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
清除所以刪除包的殘余配置文件
- dpkg -l |grep ^rc|awk '{print $2}' |tr ["n"] [" "]|sudo xargs dpkg -P -
編譯時(shí)缺少h文件的自動(dòng)處理
- sudo auto-apt run ./configure
查看安裝軟件時(shí)下載包的臨時(shí)存放目錄
- ls /var/cache/apt/archives
備份當(dāng)前系統(tǒng)安裝的所有包的列表
- dpkg --get-selections | grep -v deinstall > ~/somefile
從上面?zhèn)浞莸陌惭b包的列表文件恢復(fù)所有包
- dpkg --set-selections < ~/somefile
sudo dselect
清理舊版本的軟件緩存
清理所有軟件緩存
刪除系統(tǒng)不再使用的孤立軟件
查看包在服務(wù)器上面的地址
- apt-get -qq --print-uris install ssh | cut -d' -f2
系統(tǒng) 查看內(nèi)核
查看Ubuntu版本
查看內(nèi)核加載的模塊
查看PCI設(shè)備
查看USB設(shè)備
查看網(wǎng)卡狀態(tài)
查看CPU信息
顯示當(dāng)前硬件信息
硬盤 查看硬盤的分區(qū)
查看IDE硬盤信息
查看STAT硬盤信息
- sudo hdparm -I /dev/sda
或
sudo apt-get install blktool
sudo blktool /dev/sda id
查看硬盤剩余空間
查看目錄占用空間
優(yōu)盤沒法卸載
- sync
fuser -km /media/usbdisk
內(nèi)存 查看當(dāng)前的內(nèi)存使用情況
進(jìn)程 查看當(dāng)前有哪些進(jìn)程
中止一個(gè)進(jìn)程
- kill 進(jìn)程號(hào)(就是ps -A中的第一列的數(shù)字)
或者 killall 進(jìn)程名
強(qiáng)制中止一個(gè)進(jìn)程(在上面進(jìn)程中止不成功的時(shí)候使用)
- kill -9 進(jìn)程號(hào)
或者 killall -9 進(jìn)程名
圖形方式中止一個(gè)程序
- xkill 出現(xiàn)骷髏標(biāo)志的鼠標(biāo),點(diǎn)擊需要中止的程序即可
查看當(dāng)前進(jìn)程的實(shí)時(shí)狀況
查看進(jìn)程打開的文件
ADSL 配置 ADSL
ADSL手工撥號(hào)
激活 ADSL
- sudo /etc/ppp/pppoe_on_boot
斷開 ADSL
查看撥號(hào)日志
如何設(shè)置動(dòng)態(tài)域名
- #首先去 http://www.3322.org 申請(qǐng)一個(gè)動(dòng)態(tài)域名
#然后修改 /etc/ppp/ip-up 增加撥號(hào)時(shí)更新域名指令
sudo vim /etc/ppp/ip-up
#在最后增加如下行
w3m -no-cookie -dump 'http://username:password@members.3322.org/dyndns/update?system=dyndns&hostname=yourdns.3322.org'
網(wǎng)絡(luò) 根據(jù)IP查網(wǎng)卡地址
查看當(dāng)前IP地址
- ifconfig eth0 |awk '/inet/ {split($2,x,":");print x[2]}'
查看當(dāng)前外網(wǎng)的IP地址
- w3m -no-cookie -dump www.ip138.com|grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
w3m -no-cookie -dump www.123cha.com|grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
w3m -no-cookie -dump ip.loveroot.com|grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
查看當(dāng)前監(jiān)聽80端口的程序
查看當(dāng)前網(wǎng)卡的物理地址
- arp -a | awk '{print $4}'
ifconfig eth0 | head -1 | awk '{print $5}'
立即讓網(wǎng)絡(luò)支持nat
- echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -I POSTROUTING -j MASQUERADE
查看路由信息
- netstat -rn
sudo route -n
手工增加刪除一條路由
- sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
sudo route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
修改網(wǎng)卡MAC地址的方法
- sudo ifconfig eth0 down #關(guān)閉網(wǎng)卡
sudo ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE #然后改地址
sudo ifconfig eth0 up #然后啟動(dòng)網(wǎng)卡
統(tǒng)計(jì)當(dāng)前IP連接的個(gè)數(shù)
- netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n
netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n
統(tǒng)計(jì)當(dāng)前20000個(gè)IP包中大于100個(gè)IP包的IP地址
- tcpdump -tnn -c 20000 -i eth0 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | awk ' $1 > 100 '
屏蔽IPV6
- echo "blacklist ipv6" | sudo tee /etc/modprobe.d/blacklist-ipv6
服務(wù) 添加一個(gè)服務(wù)
- sudo update-rc.d 服務(wù)名 defaults 99
刪除一個(gè)服務(wù)
- sudo update-rc.d 服務(wù)名 remove
臨時(shí)重啟一個(gè)服務(wù)
- /etc/init.d/服務(wù)名 restart
臨時(shí)關(guān)閉一個(gè)服務(wù)
臨時(shí)啟動(dòng)一個(gè)服務(wù)
- /etc/init.d/服務(wù)名 start
設(shè)置 配置默認(rèn)Java使用哪個(gè)
- sudo update-alternatives --config java
修改用戶資料
給apt設(shè)置代理
- export http_proxy=http://xx.xx.xx.xx:xxx
修改系統(tǒng)登錄信息
中文 轉(zhuǎn)換文件名由GBK為UTF8
- sudo apt-get install convmv
convmv -r -f cp936 -t utf8 --notest --nosmart *
批量轉(zhuǎn)換src目錄下的所有文件內(nèi)容由GBK到UTF8
- find src -type d -exec mkdir -p utf8/{} ;
find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} ;
mv utf8/* src
rm -fr utf8
轉(zhuǎn)換文件內(nèi)容由GBK到UTF8
- iconv -f gbk -t utf8 $i > newfile
轉(zhuǎn)換 mp3 標(biāo)簽編碼
- sudo apt-get install python-mutagen
find . -iname “*.mp3” -execdir mid3iconv -e GBK {} ;
控制臺(tái)下顯示中文
- sudo apt-get install zhcon
使用時(shí),輸入zhcon即可
文件 快速查找某個(gè)文件
- whereis filename
- find 目錄 -name 文件名
查看文件類型
顯示xxx文件倒數(shù)6行的內(nèi)容
讓tail不停地讀地最新的內(nèi)容
- tail -n 10 -f /var/log/apache2/access.log
查看文件中間的第五行(含)到第10行(含)的內(nèi)容
- sed -n '5,10p' /var/log/apache2/access.log
查找包含xxx字符串的文件
查找關(guān)于xxx的命令
通過ssh傳輸文件
- scp -rp /path/filename username@remoteIP:/path #將本地文件拷貝到服務(wù)器上
scp -rp username@remoteIP:/path/filename /path #將遠(yuǎn)程文件從服務(wù)器下載到本地
查看某個(gè)文件被哪些應(yīng)用程序讀寫
把所有文件的后輟由rm改為rmvb
把所有文件名中的大寫改為小寫
刪除特殊文件名的文件,如文件名:--help.txt
- rm -- --help.txt 或者 rm ./--help.txt
查看當(dāng)前目錄的子目錄
將當(dāng)前目錄下最近30天訪問過的文件移動(dòng)到上級(jí)back目錄
- find . -type f -atime -30 -exec mv {} ../back ;
將當(dāng)前目錄下最近2小時(shí)到8小時(shí)之內(nèi)的文件顯示出來
- find . -mmin +120 -mmin -480 -exec more {} ;
刪除修改時(shí)間在30天之前的所有文件
- find . -type f -mtime +30 -mtime -3600 -exec rm {} ;
查找guest用戶的以avi或者rm結(jié)尾的文件并刪除掉
- find . -name '*.avi' -o -name '*.rm' -user 'guest' -exec rm {} ;
查找的不以java和xml結(jié)尾,并7天沒有使用的文件刪除掉
- find . ! -name *.java ! -name ‘*.xml’ -atime +7 -exec rm {} ;
統(tǒng)計(jì)當(dāng)前文件個(gè)數(shù)
統(tǒng)計(jì)當(dāng)前目錄個(gè)數(shù)
- ls -l /usr/bin|grep ^d|wc -l
顯示當(dāng)前目錄下2006-01-01的文件名
- ls -l |grep 2006-01-01 |awk '{print $8}'
壓縮 解壓縮 xxx.tar.gz
解壓縮 xxx.tar.bz2
壓縮aaa bbb目錄為xxx.tar.gz
- tar -zcvf xxx.tar.gz aaa bbb
壓縮aaa bbb目錄為xxx.tar.bz2
- tar -jcvf xxx.tar.bz2 aaa bbb
Nautilus 顯示隱藏文件
顯示地址欄
特殊 URI 地址
- * computer:/// - 全部掛載的設(shè)備和網(wǎng)絡(luò)
* network:/// - 瀏覽可用的網(wǎng)絡(luò)
* burn:/// - 一個(gè)刻錄 CDs/DVDs 的數(shù)據(jù)虛擬目錄
* smb:/// - 可用的 windows/samba 網(wǎng)絡(luò)資源
* x-nautilus-desktop:/// - 桌面項(xiàng)目和圖標(biāo)
* file:/// - 本地文件
* trash:/// - 本地回收站目錄
* ftp:// - FTP 文件夾
* ssh:// - SSH 文件夾
* fonts:/// - 字體文件夾,可將字體文件拖到此處以完成安裝
* themes:/// - 系統(tǒng)主題文件夾
查看已安裝字體
- 在nautilus的地址欄里輸入”fonts:///“,就可以查看本機(jī)所有的fonts
程序 詳細(xì)顯示程序的運(yùn)行信息
- strace -f -F -o outfile <cmd>
日期和時(shí)間 設(shè)置日期
設(shè)置時(shí)間
將時(shí)間寫入CMOS
讀取CMOS時(shí)間
從服務(wù)器上同步時(shí)間
- sudo ntpdate time.nist.gov
sudo ntpdate time.windows.com
控制臺(tái) 不同控制臺(tái)間切換
- Ctrl + ALT + ←
Ctrl + ALT + →
指定控制臺(tái)切換
控制臺(tái)下滾屏
控制臺(tái)抓圖
數(shù)據(jù)庫(kù) mysql的數(shù)據(jù)庫(kù)存放在地方
從mysql中導(dǎo)出和導(dǎo)入數(shù)據(jù)
- mysqldump 數(shù)據(jù)庫(kù)名 > 文件名 #導(dǎo)出數(shù)據(jù)庫(kù)
mysqladmin create 數(shù)據(jù)庫(kù)名 #建立數(shù)據(jù)庫(kù)
mysql 數(shù)據(jù)庫(kù)名 < 文件名 #導(dǎo)入數(shù)據(jù)庫(kù)
忘了mysql的root口令怎么辦
- sudo /etc/init.d/mysql stop
sudo mysqld_safe --skip-grant-tables &
sudo mysqladmin -u user password 'newpassword''
sudo mysqladmin flush-privileges
修改mysql的root口令
- sudo mysqladmin -uroot -p password '你的新密碼'
其它 下載網(wǎng)站文檔
- wget -r -p -np -k http://www.21cn.com
· -r:在本機(jī)建立服務(wù)器端目錄結(jié)構(gòu);
· -p: 下載顯示HTML文件的所有圖片;
· -np:只下載目標(biāo)站點(diǎn)指定目錄及其子目錄的內(nèi)容;
· -k: 轉(zhuǎn)換非相對(duì)鏈接為相對(duì)鏈接。
如何刪除Totem電影播放機(jī)的播放歷史記錄
如何更換gnome程序的快捷鍵
- 點(diǎn)擊菜單,鼠標(biāo)停留在某條菜單上,鍵盤輸入任意你所需要的鍵,可以是組合鍵,會(huì)立即生效;
如果要清除該快捷鍵,請(qǐng)使用backspace
vim 如何顯示彩色字符
- sudo cp /usr/share/vim/vimcurrent/vimrc_example.vim /usr/share/vim/vimrc
如何在命令行刪除在會(huì)話設(shè)置的啟動(dòng)程序
- cd ~/.config/autostart
rm 需要?jiǎng)h除啟動(dòng)程序
如何提高wine的反應(yīng)速度 sudo sed -ie '/GBK/,/^}/d' /usr/share/X11/locale/zh_CN.UTF-8/XLC_LOCALE

--------------------------
09博客園紀(jì)念T恤新聞:
分析稱RSS閱讀器是Web 1.0工具 已逐漸被拋棄網(wǎng)站導(dǎo)航:
博客園首頁 個(gè)人主頁 新聞 社區(qū) 博問 閃存 找找看文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/20/1272372.html
Hibernate獲取數(shù)據(jù)的方式有不同的幾種,其與緩存結(jié)合使用的效果也不盡相同,而Hibernate中具體怎么使用緩存其實(shí)是我們很關(guān)心的一個(gè)問題,直接涉及到性能方面。
緩 存在Hibernate中主要有三個(gè)方面:一級(jí)緩存、二級(jí)緩存和查詢緩存;一級(jí)緩存在Hibernate中對(duì)應(yīng)的即為session范圍的緩存,也就是當(dāng) session關(guān)閉時(shí)緩存即被清除,一級(jí)緩存在Hibernate中是不可配置的部分;二級(jí)緩存在Hibernate中對(duì)應(yīng)的即為 SessionFactory范圍的緩存,通常來講SessionFactory的生命周期和應(yīng)用的生命周期相同,所以可以看成是進(jìn)程緩存或集群緩存,二 級(jí)緩存在Hibernate中是可以配置的,可以通過class-cache配置類粒度級(jí)別的緩存(class-cache在class中數(shù)據(jù)發(fā)生任何變 化的情況下自動(dòng)更新),同時(shí)也可通過collection-cache配置集合粒度級(jí)別的緩存(collection-cache僅在 collection中增加了元素或者刪除了元素的情況下才自動(dòng)更新,也就是當(dāng)collection中元素發(fā)生值的變化的情況下它是不會(huì)自動(dòng)更新的),緩 存自然會(huì)帶來并發(fā)的訪問問題,這個(gè)時(shí)候相應(yīng)的就要根據(jù)應(yīng)用來設(shè)置緩存所采用的事務(wù)隔離級(jí)別,和數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別概念基本一樣,沒什么多介紹的, ^_^;查詢緩存在Hibernate同樣是可配置的,默認(rèn)是關(guān)閉的,可以通過設(shè)置cache.use_ query_cache為true來打開查詢緩 存。根據(jù)緩存的通常實(shí)現(xiàn)策略,我們可以來理解Hibernate的這三種緩存,緩存的實(shí)現(xiàn)通過是通過key/value的Map方式來實(shí)現(xiàn),在 Hibernate的一級(jí)、二級(jí)和查詢緩存也同樣如此,一級(jí)、二級(jí)緩存使用的key均為po的主鍵ID,value即為po實(shí)例對(duì)象,查詢緩存使用的則為 查詢的條件、查詢的參數(shù)、查詢的頁數(shù),value有兩種情況,如果采用的是select po.property這樣的方式那么value為整個(gè)結(jié)果集,如采用的是from這樣的方式那么value為獲取的結(jié)果集中各po對(duì)象的主鍵ID,這樣 的作用很明顯,節(jié)省內(nèi)存,^_^
簡(jiǎn)單介紹完Hibernate的緩存后,再結(jié)合Hibernate的獲取數(shù)據(jù)方式來說明緩存的具體使用方式,在Hibernate中獲取數(shù)據(jù)常用的方式主要有四種:Session.load、Session.get、Query.list、Query.iterator。
1、Session.load
在執(zhí)行session.load時(shí),Hibernate首先從當(dāng)前session的一級(jí)緩存中獲取id對(duì)應(yīng)的值,在獲取不到的情況下,將根據(jù)該對(duì)象是否配 置了二級(jí)緩存來做相應(yīng)的處理,如配置了二級(jí)緩存,則從二級(jí)緩存中獲取id對(duì)應(yīng)的值,如仍然獲取不到則還需要根據(jù)是否配置了延遲加載來決定如何執(zhí)行,如未配 置延遲加載則從數(shù)據(jù)庫(kù)中直接獲取,在從數(shù)據(jù)庫(kù)獲取到數(shù)據(jù)的情況下,Hibernate會(huì)相應(yīng)的填充一級(jí)緩存和二級(jí)緩存,如配置了延遲加載則直接返回一個(gè)代 理類,只有在觸發(fā)代理類的調(diào)用時(shí)才進(jìn)行數(shù)據(jù)庫(kù)查詢的操作。
在這樣的情況下我們就可以看到,在session一直打開的情況下,要注意在適當(dāng)?shù)臅r(shí)候?qū)σ患?jí)緩存進(jìn)行刷新操作,通常是在該對(duì)象具有單向關(guān)聯(lián)維護(hù)的時(shí)候, 在Hibernate中可以使用象session.clear、session.evict的方式來強(qiáng)制刷新一級(jí)緩存。
二級(jí)緩存則在數(shù)據(jù)發(fā)生任何變化(新增、更新、刪除)的情況下都會(huì)自動(dòng)的被更新。
2、Session.get
在執(zhí)行Session.get時(shí),和Session.load不同的就是在當(dāng)從緩存中獲取不到時(shí),直接從數(shù)據(jù)庫(kù)中獲取id對(duì)應(yīng)的值。
3、Query.list
在執(zhí)行Query.list時(shí),Hibernate的做法是首先檢查是否配置了查詢緩存,如配置了則從查詢緩存中查找key為查詢語句+查詢參數(shù)+分頁條 件的值,如獲取不到則從數(shù)據(jù)庫(kù)中進(jìn)行獲取,從數(shù)據(jù)庫(kù)獲取到后Hibernate將會(huì)相應(yīng)的填充一級(jí)、二級(jí)和查詢緩存,如獲取到的為直接的結(jié)果集,則直接返 回,如獲取到的為一堆id的值,則再根據(jù)id獲取相應(yīng)的值(Session.load),最后形成結(jié)果集返回,可以看到,在這樣的情況下,list也是有 可能造成N次的查詢的。
查詢緩存在數(shù)據(jù)發(fā)生任何變化的情況下都會(huì)被自動(dòng)的清空。
4、Query.iterator
在執(zhí)行Query.iterator時(shí),和Query.list的不同的在于從數(shù)據(jù)庫(kù)獲取的處理上,Query.iterator向數(shù)據(jù)庫(kù)發(fā)起的是 select id from這樣的語句,也就是它是先獲取符合查詢條件的id,之后在進(jìn)行iterator.next調(diào)用時(shí)才再次發(fā)起session.load的調(diào)用獲取實(shí) 際的數(shù)據(jù)。
可見,在擁有二級(jí)緩存并且查詢參數(shù)多變的情況下,Query.iterator會(huì)比Query.list更為高效。
這 四種獲取數(shù)據(jù)的方式都各有適用的場(chǎng)合,要根據(jù)實(shí)際情況做相應(yīng)的決定,^_^,最好的方式無疑就是打開show_sql選項(xiàng)看看執(zhí)行的情況來做分析,系統(tǒng)結(jié) 構(gòu)上只用保證這種調(diào)整是容易實(shí)現(xiàn)的就好了,在cache這個(gè)方面的調(diào)整自然是非常的容易,只需要調(diào)整配置文件里的設(shè)置,而查詢的方式則可對(duì)外部進(jìn)行屏蔽, 這樣要根據(jù)實(shí)際情況調(diào)整也非常容易。
推薦三篇關(guān)于Hibernate緩存機(jī)制介紹的文章:
http://gocom.primeton.com/blog/index.php?op=ViewArticle&articleId=467&blogId=37&src=jdon&srcforum=62
http://club.gamvan.com/club/clubPage.jsp?ccStyle=0&tID=10456&ccID=37
http://www.devx.com/dbzone/Article/29685/1954?pf=true文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/16/1269160.html
雖然VirtualBox是個(gè)很好用的虛擬機(jī),但是安裝完成之后虛擬機(jī)仍然無法使用usb設(shè)備,沒有聲音還是需要作進(jìn)一步配置的,下面是具體配置方法:
1、配置VirtualBox使其識(shí)別usb設(shè)備
如果不配置VirtualBox的話,每次虛擬機(jī)啟動(dòng)時(shí)他都會(huì)報(bào)錯(cuò)的,大體意思是當(dāng)前虛擬機(jī)沒有安裝使用usb的服務(wù)
解決方法如下:
增加用戶組usbfs
$ sudo groupadd usbfs
2. 查看usbfs用戶組的gid
$ cat /etc/group | grep usbfs
usbfs:x:1002:
把當(dāng)前用戶增加到usbfs組
$ sudo gedit /etc/group
把
usbfs:x:1001:
修改為
usbfs:x:1001:lichao
4. 為USB設(shè)備重新設(shè)置權(quán)限編輯/etc/fstab文件,添加下面兩行,注意你的gid可能不是1001
$ sudo gedit /etc/fstab
在末尾加上
# 1001 is the USB group IDI
none /proc/bus/usb usbfs devgid=1001,devmode=666 0 0
重新啟動(dòng)后,應(yīng)該就可以在客戶機(jī)中使用USB設(shè)備了。
方法:插入一個(gè)USB設(shè)備后,如U盤,右鍵點(diǎn)擊虛擬機(jī)里右下腳的USB圖標(biāo),選擇已經(jīng)識(shí)別的U盤,就可以正常使用了。
注意:(1)在客戶機(jī)里使用USB設(shè)備前要先在主機(jī)里卸載。 (2)完成后重啟系統(tǒng)
2、使虛擬機(jī)支持聲音
使用了一段時(shí)間后,我突然發(fā)現(xiàn)虛擬機(jī)居然沒有聲音,而在操作系統(tǒng)中是有聲卡的,而且右下角有調(diào)節(jié)聲音的圖標(biāo),應(yīng)該有聲音阿
經(jīng)過仔細(xì)查找,我發(fā)現(xiàn)在虛擬機(jī)聲音設(shè)置中,雖然控制芯片被設(shè)置為了“ICH AC97”,但是聲卡類型卻被設(shè)置為了Null Audio Driver,只要將聲卡類型設(shè)置為OSS Audio Driver就可以了
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/15/1268427.html
今天很郁悶阿,昨天剛裝好的系統(tǒng),今天就因?yàn)橐淮文牟僮?.....重裝了
裝系統(tǒng)倒不是很費(fèi)時(shí)間,麻煩的是等待系統(tǒng)升級(jí),很郁悶阿,將近一小時(shí),什么也作不了,所以這次重裝之后,我決定找到一種一勞永逸的方法,備份升級(jí)文件,找了找,還真有,具體過程如下:
備份:

Code
tar cizvf backup.tar.gz /var/cache/apt/archives --exclude=/var/cache/apt/archives/partial/* --exclude=/var/cache/apt/archives/loc
備份成功,在你所對(duì)應(yīng)的/home/user文件夾中可以找到這個(gè)名為backup.tar.gz的文件。
清除:

Code
sudo apt-get clean
rm -rf ~/.thumbnails/fail/gnome-thumbnail-factory/*
還原:

Code
sudo apt-get update && sudo tar xzvf backup.tar.gz -C /
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/13/1267439.html
由于linux下沒有像windows的ALL IN ONE安裝包,而我又不想用eclipse+myeclipse的方式來安裝,就在這時(shí),我發(fā)現(xiàn)在myeclipse的官方網(wǎng)站上有一個(gè)安裝包叫pulse
上網(wǎng)查了一下,這個(gè)安裝包本身沒有任何ide安張程序,他可以讓你來選擇哪些工具你需要下載安裝,哪些你不需要,似乎很好用哦,下載下來試試。
裝上之后,有很多ide提供下載安裝,就選擇我最熟悉的MyEclipse6.5吧,下載速度很快,不到10分鐘就裝好了,打開一看,和windows的界面一樣,爽!!以后就用他了
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/12/1266299.html
早就想把微軟的東西仍進(jìn)虛擬機(jī),只是一直沒下決心,這次實(shí)踐了一回,呵呵,還真好使
我用的ubuntu 7.10+sun Virtual Box
去sun的官方網(wǎng)站下載吧,
VirtualBox-1.6.4-Linux_x86.run
這個(gè)是最新的,下載后照常安裝,其間碰到幾個(gè)依賴包的安裝,在“新立得”里面找一下就好了....
5分鐘后,虛擬機(jī)裝好,開始裝windows拉,用了許久的Vista,回顧一下經(jīng)典的XP,哈哈,蠻不錯(cuò)的,感覺比純運(yùn)行xp還要快,一下是截圖 :
這下爽拉,在linux下玩魔獸完全沒難度拉
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/12/1266297.html
首先去sun公司的網(wǎng)站下載jdk安裝文件 jdk-x.bin不要下載jdk-x.rpm.bin,不知為什么裝不上,
接下來在終端中執(zhí)行
./jdk-x.bin
看過協(xié)議后鍵入"yes"同意許可
安裝完成后需要修改環(huán)境變量
在終端中輸入:
gksu gedit /etc/profile
在文件末尾加上如下幾句話即可:
#set java environment
JAVA_HOME=/home/lichao/Program_File/jdk
export JRE_HOME=/home/lichao/Program_File/jdk/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
javac一下試試看,應(yīng)該沒問題了
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/12/1266215.html
在終端中鍵入
sudo apt-get install mysql-server
ok,等一會(huì)吧,設(shè)置一下root的密碼,
安裝成功,簡(jiǎn)單吧,哈哈!!
安裝完后最要命的是.....不知道m(xù)ysql安裝到那里了,網(wǎng)上找到了答案,若干個(gè)目錄阿
ubuntu下mysql安裝布局:
/usr/bin 客戶端程序和mysql_install_db
/db 數(shù)據(jù)庫(kù)和日志文件(自定義的)
/var/run mysqld 服務(wù)器
/etc/mysql mysql 配置文件my.cnf
/usr/share/mysql 字符集,基準(zhǔn)程序和錯(cuò)誤消息
/etc/init.d/mysql 啟動(dòng)mysql服務(wù)器
成功后在“系統(tǒng) -> 系統(tǒng)管理 -> 服務(wù)”就可以看到mysql的服務(wù)了。
下面要配置了!
mysql默認(rèn)只能在本機(jī)登錄,這時(shí)就需要設(shè)置一下了
在終端中輸入
mysql -u root -p
輸入正確密碼后執(zhí)行如下sql語句:
- mysql -u root -pvmwaremysql>use mysql;
- mysql>update user set host = '%' where user = 'root';
- mysql>select host, user from user;
可以了,試試看吧!
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/12/1266213.html
這里的方法同樣適用于Debian下的Scim輸入法的安裝。
根據(jù)SCIM的文檔說明,裝SCIM最好用UTF-8的locale。(你也可以使用GB2312以及GBK的locale,使用scim都一樣的)
對(duì)于一個(gè)新裝好的沒有安裝SCIM的Ubuntu系統(tǒng)(新的Ubuntu安裝器選擇中文安裝后,一邊都已經(jīng)裝好了scim),只要
apt-get install scim(當(dāng)然前提是你要設(shè)置好源,具體見http://wiki.ubuntu.org.cn/%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97, 有些高校自己內(nèi)部也有源的,好好找找)
就已經(jīng)安裝好SCIM了!當(dāng)然還不能用。因?yàn)镾CIM只是一個(gè)輸入法平臺(tái),還要在上面安裝輸入法(或者碼表)。例如,
apt-get install scim-chinese
就可以使用智能拼音輸入法了!當(dāng)然在使用之前還要先配置一下,配置方法很簡(jiǎn)單,在/etc/X11/Xsession.d/里新建一個(gè)名叫95xinput的文件,文件內(nèi)容如下
/usr/bin/scim -d
XMODIFIERS="@im=SCIM"
export XMODIFIERS
export GTK_IM_MODULE=scim
保存文件,確認(rèn)內(nèi)容無誤后,退出X(建議退出X后運(yùn)行exit命令重新login一次),再進(jìn)入X的時(shí)候就可以用Ctrl+Space調(diào)出SCIM了!
就我的試驗(yàn)情況,這樣已經(jīng)可以在qterm里使用SCIM了。
如果你需要其它中文輸入法,可以這樣
apt-get install scim-tables-zh
這包括了簡(jiǎn)體中文的五筆、二筆、廣東拼音、自然碼,和繁體中文的行列、 }頡五代、大易、注音等輸入法了。
我現(xiàn)在使用五筆輸入法,能輸入簡(jiǎn)繁漢字,詞匯也豐富,很好用。
但是現(xiàn)在還不能在基于GTK的軟件中調(diào)出SCIM,例如我就不能在leafpad里使用SCIM。解決辦法很簡(jiǎn)單,只要安裝scim-gtk2-immodule就可以了。
apt-get install scim-gtk2-immodule
安裝后無須重啟X,只要重新打開基于GTK的軟件就可以了,比如我新開一個(gè)leafpad,馬上就可以使用SCIM了!
這個(gè)命令會(huì)根據(jù)依賴關(guān)系自動(dòng)安裝 scim-server-socket, scim-frontend-socket, scim-config-socket,如果沒有安裝scim,也會(huì)自動(dòng)安裝。
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/12/1265876.html

Code
import java.util.*;
import java.io.*;
import java.security.*;
public class MD5 {
public static String hex(byte[] array) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).toUpperCase().substring(1,3));
}
return sb.toString();
}
public static String md5 (String message) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");\\想用SHA加密的話就把MD5換成SHA吧
return hex (md.digest(message.getBytes("CP1252")));
} catch (NoSuchAlgorithmException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}
public static void main(String[] args) {
System.out.println (md5 ("LiChao"));
}
}
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/04/1260376.html
經(jīng)過若干天斷斷續(xù)續(xù)地研究,終于做出了第一個(gè)spring security的實(shí)例,真是艱難啊,配置太復(fù)雜了,若干個(gè)Bean之間存在著這樣或那樣的關(guān)系......
下面給出我的小例子,主要是配置文件拉~~別的東西自己看源碼吧!

Code
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- 過濾器鏈配置,其中filterInvocationDefinitionSource屬性為配置過濾器的種類與先后順序,注意,順序不能配置錯(cuò)誤哦 -->
<bean id="filterChainProxy"
class="org.springframework.security.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value><![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor]]>
</value>
</property>
</bean>
<!-- 看看你是否已經(jīng)登錄了,如果登錄了就略過下面的過濾器了,直接訪問資源 -->
<bean id="httpSessionIntegrationFilter"
class="org.springframework.security.context.HttpSessionContextIntegrationFilter" />
<!-- 安全驗(yàn)證入口 -->
<bean id="authenticationEntryPoint"
class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/index.jsp" /><!--默認(rèn)登錄頁面-->
<property name="forceHttps" value="true" /><!--使登錄頁面通過HTTPS安全地進(jìn)行顯示-->
</bean>
<!-- 身份驗(yàn)證過濾器,就是驗(yàn)證身份用的嘛 -->
<bean id="authenticationProcessingFilter"
class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<!-- 驗(yàn)證連接名稱,對(duì)應(yīng)表單的action -->
<property name="filterProcessesUrl"
value="/j_spring_security_check" />
<!-- 驗(yàn)證失敗后去哪 -->
<property name="authenticationFailureUrl"
value="/index.jsp?error=1" />
<!-- 驗(yàn)證成功后去哪 -->
<property name="defaultTargetUrl"
value="/security/security.jsp" />
<!--依靠一個(gè)身份驗(yàn)證管理器來驗(yàn)證身份 其實(shí)這個(gè)才是干活的BEAN-->
<property name="authenticationManager"
ref="authenticationManager" />
</bean>
<!-- 用于處理登錄失敗異常和權(quán)限不足異常 -->
<bean id="exceptionTranslationFilter"
class="org.springframework.security.ui.ExceptionTranslationFilter">
<!--配置出現(xiàn)exception時(shí)跳轉(zhuǎn)到登錄頁-->
<property name="authenticationEntryPoint"
ref="authenticationEntryPoint" />
<!--配置403(權(quán)限不足)錯(cuò)誤后跳轉(zhuǎn)的頁面-->
<property name="accessDeniedHandler" ref="accessDeniedHandler" />
</bean>
<!-- 配置權(quán)限不足時(shí)跳轉(zhuǎn)到的頁面 -->
<bean id="accessDeniedHandler"
class="org.springframework.security.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/error.jsp" />
</bean>
<!-- 安全攔截器,下面看看它是干嘛的 -->
<bean id="filterSecurityInterceptor"
class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<!-- 驗(yàn)證管理者 -->
<property name="authenticationManager"
ref="authenticationManager" />
<!-- 權(quán)限決定管理者,他手下的一幫人投票決定登錄者是否有權(quán)訪問該資源 -->
<property name="accessDecisionManager"
ref="accessDecisionManager" />
<!--受保護(hù)資源-->
<property name="objectDefinitionSource">
<!-- 下面表示/security/security.jsp需要ROLE_ADMIN權(quán)限才能訪問 -->
<value><![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/security/security.jsp=ROLE_ADMIN]]>
</value>
</property>
</bean>
<!-- 驗(yàn)證管理者,他管理DAO驗(yàn)證提供者來驗(yàn)證 -->
<bean id="authenticationManager"
class="org.springframework.security.providers.ProviderManager">
<property name="providers">
<list>
<!-- DAO驗(yàn)證提供者,SPRING SECURITY支持各種驗(yàn)證,這里可以添加相應(yīng)配置 -->
<ref local="daoAuthenticationProvider" />
</list>
</property>
</bean>
<!-- -->
<bean id="accessDecisionManager"
class="org.springframework.security.vote.AffirmativeBased">
<!-- 如果所有投票者都棄權(quán)則不讓訪問 -->
<property name="allowIfAllAbstainDecisions">
<value>false</value>
</property>
<!-- 參加投票的BEAN -->
<property name="decisionVoters">
<list>
<bean class="org.springframework.security.vote.RoleVoter">
<!-- 權(quán)限的前綴 -->
<property name="rolePrefix" value="ROLE_" />
</bean>
<bean class="org.springframework.security.vote.AuthenticatedVoter" />
</list>
</property>
</bean>
<!-- DAO驗(yàn)證提供者依靠userDetailsService獲得一個(gè)userDetails實(shí)例,進(jìn)而驗(yàn)證權(quán)限 -->
<bean id="daoAuthenticationProvider"
class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
<!-- jdbcDaoImpl實(shí)現(xiàn)了userDetailsService接口 -->
<property name="userDetailsService">
<ref local="jdbcDaoImpl" />
</property>
</bean>
<bean id="jdbcDaoImpl"
class="org.springframework.security.userdetails.jdbc.JdbcDaoImpl">
<!-- 根據(jù)用戶名獲得用戶名、密碼、用戶是否啟用等信息 -->
<property name="usersByUsernameQuery">
<value>
select username,password,enabled from user where
username=?
</value>
</property>
<!-- 通過用戶名獲取用戶權(quán)限 -->
<property name="authoritiesByUsernameQuery">
<value>
select username,authority from authentication where
username=?
</value>
</property>
<!-- DataSource,不用我說了吧 -->
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="org.gjt.mm.mysql.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/user">
</property>
<property name="username" value="root"></property>
<property name="password" value="hicc"></property>
</bean>
</beans>
這個(gè)是最簡(jiǎn)單的一個(gè)例子,配了141行,呼~~繼續(xù)研究其深入功能,離成功越來越近了
ps.傳說spring security2.0有了超級(jí)簡(jiǎn)單的配置方法,還沒有學(xué)到手,努力ing
源碼下載(需要自己添加spring和mysql的jar包)
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/04/1259523.html
你覺得自己是一個(gè)Java專家嗎?是否肯定自己已經(jīng)全面掌握了Java的異常處理機(jī)制?在下面這段代碼中,你能夠迅速找出異常處理的六個(gè)問題嗎?

Code
OutputStreamWriter out = 
java.sql.Connection conn = 
try { // ⑸
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(
"select uid, name from user");
while (rs.next())
{
out.println("ID:" + rs.getString("uid") // ⑹
",姓名:" + rs.getString("name"));
}
conn.close(); // ⑶
out.close();
}
catch(Exception ex) // ⑵
{
ex.printStackTrace(); // ⑴,⑷
}
作為一個(gè)Java程序員,你至少應(yīng)該能夠找出兩個(gè)問題。但是,如果你不能找出全部六個(gè)問題,請(qǐng)繼續(xù)閱讀本文。
本文討論的不是Java異常處理的一般性原則,因?yàn)檫@些原則已經(jīng)被大多數(shù)人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違背優(yōu)秀編碼規(guī)范的常見壞習(xí)慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實(shí)際工作中敏銳地察覺和避免這些問題。
反例之一:丟棄異常
代碼:15行-18行。
這段代碼捕獲了異常卻不作任何處理,可以算得上Java編程中的殺手。從問題出現(xiàn)的頻繁程度和禍害程度來看,它也許可以和C/C++程序的一個(gè)惡名遠(yuǎn)播的問題相提并論——不檢查緩沖區(qū)是否已滿。如果你看到了這種丟棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問題(在極少數(shù)情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。
這段代碼的錯(cuò)誤在于,異常(幾乎)總是意味著某些事情不對(duì)勁了,或者說至少發(fā)生了某些不尋常的事情,我們不應(yīng)該對(duì)程序發(fā)出的求救信號(hào)保持沉默和無動(dòng)于衷。調(diào)用一下printStackTrace算不上“處理異常”。不錯(cuò),調(diào)用printStackTrace對(duì)調(diào)試程序有幫助,但程序調(diào)試階段結(jié)束之后,printStackTrace就不應(yīng)再在異常處理模塊中擔(dān)負(fù)主要責(zé)任了。
丟棄異常的情形非常普遍。打開JDK的ThreadDeath類的文檔,可以看到下面這段說明:“特別地,雖然出現(xiàn)ThreadDeath是一種‘正常的情形’,但ThreadDeath類是Error而不是Exception的子類,因?yàn)樵S多應(yīng)用會(huì)捕獲所有的Exception然后丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問題,但鑒于許多應(yīng)用會(huì)試圖捕獲所有異常然后不予以適當(dāng)?shù)奶幚恚訨DK把ThreadDeath定義成了Error的子類,因?yàn)镋rror類代表的是一般的應(yīng)用不應(yīng)該去捕獲的嚴(yán)重問題。可見,丟棄異常這一壞習(xí)慣是如此常見,它甚至已經(jīng)影響到了Java本身的設(shè)計(jì)。
那么,應(yīng)該怎樣改正呢?主要有四個(gè)選擇:
1、處理異常。針對(duì)該異常采取一些行動(dòng),例如修正問題、提醒某個(gè)人或進(jìn)行其他一些處理,要根據(jù)具體的情形確定應(yīng)該采取的動(dòng)作。再次說明,調(diào)用printStackTrace算不上已經(jīng)“處理好了異常”。
2、重新拋出異常。處理異常的代碼在分析異常之后,認(rèn)為自己不能處理它,重新拋出異常也不失為一種選擇。
3、把該異常轉(zhuǎn)換成另一種異常。大多數(shù)情況下,這是指把一個(gè)低級(jí)的異常轉(zhuǎn)換成應(yīng)用級(jí)的異常(其含義更容易被用戶了解的異常)。
4、不要捕獲異常。
結(jié)論一:既然捕獲了異常,就要對(duì)它進(jìn)行適當(dāng)?shù)奶幚怼2灰东@異常之后又把它丟棄,不予理睬。
反例之二:不指定具體的異常
代碼:15行。
許多時(shí)候人們會(huì)被這樣一種“美妙的”想法吸引:用一個(gè)catch語句捕獲所有的異常。最常見的情形就是使用catch(Exception ex)語句。但實(shí)際上,在絕大多數(shù)情況下,這種做法不值得提倡。為什么呢?
要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預(yù)期會(huì)出現(xiàn)某種異常,而且希望能夠處理該異常。異常類的作用就是告訴Java編譯器我們想要處理的是哪一種異常。由于絕大多數(shù)異常都直接或間接從java.lang.Exception派生,catch(Exception ex)就相當(dāng)于說我們想要處理幾乎所有的異常。
再來看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個(gè)是SQLException,這是JDBC操作中常見的異常。另一個(gè)可能的異常是IOException,因?yàn)樗僮鱋utputStreamWriter。顯然,在同一個(gè)catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個(gè)catch塊分別捕獲SQLException和IOException就要好多了。這就是說,catch語句應(yīng)當(dāng)盡量指定具體的異常類型,而不應(yīng)該指定涵蓋范圍太廣的Exception類。
另一方面,除了這兩個(gè)特定的異常,還有其他許多異常也可能出現(xiàn)。例如,如果由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續(xù)拋出,即不必捕獲也不必處理。實(shí)際上,我們不能也不應(yīng)該去捕獲可能出現(xiàn)的所有異常,程序的其他地方還有捕獲異常的機(jī)會(huì)——直至最后由JVM處理。
結(jié)論二:在catch語句中盡可能指定具體的異常類型,必要時(shí)使用多個(gè)catch。不要試圖處理所有可能出現(xiàn)的異常。
反例之三:占用資源不釋放
代碼:3行-14行。
異常改變了程序正常的執(zhí)行流程。這個(gè)道理雖然簡(jiǎn)單,卻常常被人們忽視。如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個(gè)簡(jiǎn)化這類操作的關(guān)鍵詞finally。
finally是樣好東西:不管是否出現(xiàn)了異常,F(xiàn)inally保證在try/catch/finally塊結(jié)束之前,執(zhí)行清理任務(wù)的代碼總是有機(jī)會(huì)執(zhí)行。遺憾的是有些人卻不習(xí)慣使用finally。
當(dāng)然,編寫finally塊應(yīng)當(dāng)多加小心,特別是要注意在finally塊之內(nèi)拋出的異常——這是執(zhí)行清理任務(wù)的最后機(jī)會(huì),盡量不要再有難以處理的錯(cuò)誤。
結(jié)論三:保證所有資源都被正確釋放。充分運(yùn)用finally關(guān)鍵詞。
反例之四:不說明異常的詳細(xì)信息
代碼:3行-18行。
仔細(xì)觀察這段代碼:如果循環(huán)內(nèi)部出現(xiàn)了異常,會(huì)發(fā)生什么事情?我們可以得到足夠的信息判斷循環(huán)內(nèi)部出錯(cuò)的原因嗎?不能。我們只能知道當(dāng)前正在處理的類發(fā)生了某種錯(cuò)誤,但卻不能獲得任何信息判斷導(dǎo)致當(dāng)前錯(cuò)誤的原因。
printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程,但只提供了一些最基本的信息,未能說明實(shí)際導(dǎo)致錯(cuò)誤的原因,同時(shí)也不易解讀。
因此,在出現(xiàn)異常時(shí),最好能夠提供一些文字信息,例如當(dāng)前正在執(zhí)行的類、方法和其他狀態(tài)信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。
結(jié)論四:在異常處理模塊中提供適量的錯(cuò)誤原因信息,組織錯(cuò)誤信息使其易于理解和閱讀。
反例之五:過于龐大的try塊
代碼:3行-14行。
經(jīng)常可以看到有人把大量的代碼放入單個(gè)try塊,實(shí)際上這不是好習(xí)慣。這種現(xiàn)象之所以常見,原因就在于有些人圖省事,不愿花時(shí)間分析一大塊代碼中哪幾行代碼會(huì)拋出異常、異常的具體類型是什么。把大量的語句裝入單個(gè)巨大的try塊就象是出門旅游時(shí)把所有日常用品塞入一個(gè)大箱子,雖然東西是帶上了,但要找出來可不容易。
一些新手常常把大量的代碼放入單個(gè)try塊,然后再在catch語句中聲明Exception,而不是分離各個(gè)可能出現(xiàn)異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來了困難,因?yàn)橐淮蠖未a中有太多的地方可能拋出Exception。
結(jié)論五:盡量減小try塊的體積。
反例之六:輸出數(shù)據(jù)不完整
代碼:7行-11行。
不完整的數(shù)據(jù)是Java程序的隱形殺手。仔細(xì)觀察這段代碼,考慮一下如果循環(huán)的中間拋出了異常,會(huì)發(fā)生什么事情。循環(huán)的執(zhí)行當(dāng)然是要被打斷的,其次,catch塊會(huì)執(zhí)行——就這些,再也沒有其他動(dòng)作了。已經(jīng)輸出的數(shù)據(jù)怎么辦?使用這些數(shù)據(jù)的人或設(shè)備將收到一份不完整的(因而也是錯(cuò)誤的)數(shù)據(jù),卻得不到任何有關(guān)這份數(shù)據(jù)是否完整的提示。對(duì)于有些系統(tǒng)來說,數(shù)據(jù)不完整可能比系統(tǒng)停止運(yùn)行帶來更大的損失。
較為理想的處置辦法是向輸出設(shè)備寫一些信息,聲明數(shù)據(jù)的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數(shù)據(jù),準(zhǔn)備好全部數(shù)據(jù)之后再一次性輸出。
結(jié)論六:全面考慮可能出現(xiàn)的異常以及這些異常對(duì)執(zhí)行流程的影響。
改寫后的代碼
根據(jù)上面的討論,下面給出改寫后的代碼。也許有人會(huì)說它稍微有點(diǎn)啰嗦,但是它有了比較完備的異常處理機(jī)制。

Code
OutputStreamWriter out = 
java.sql.Connection conn = 
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select uid, name from user");
while (rs.next())
{
out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
}
}
catch(SQLException sqlex)
{
out.println("警告:數(shù)據(jù)不完整");
throw new ApplicationException("讀取數(shù)據(jù)時(shí)出現(xiàn)SQL錯(cuò)誤", sqlex);
}
catch(IOException ioex)
{
throw new ApplicationException("寫入數(shù)據(jù)時(shí)出現(xiàn)IO錯(cuò)誤", ioex);
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2)
{
System.err(this.getClass().getName() + ".mymethod - 不能關(guān)閉數(shù)據(jù)庫(kù)連接: " + sqlex2.toString());
}
}
if (out != null) {
try {
out.close();
}
catch(IOException ioex2)
{
System.err(this.getClass().getName() + ".mymethod - 不能關(guān)閉輸出文件" + ioex2.toString());
}
}
}
本文的結(jié)論不是放之四海皆準(zhǔn)的教條,有時(shí)常識(shí)和經(jīng)驗(yàn)才是最好的老師。如果你對(duì)自己的做法沒有百分之百的信心,務(wù)必加上詳細(xì)、全面的注釋。
一方面,不要笑話這些錯(cuò)誤,不妨問問你自己是否真地徹底擺脫了這些壞習(xí)慣。即使最有經(jīng)驗(yàn)的程序員偶爾也會(huì)誤入歧途,原因很簡(jiǎn)單,因?yàn)樗鼈兇_確實(shí)實(shí)帶來了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動(dòng)人,無孔不入,時(shí)刻誘惑著你。也許有人會(huì)認(rèn)為這些都屬于雞皮蒜毛的小事,不足掛齒,但請(qǐng)記住:勿以惡小而為之,勿以善小而不為。
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/01/1258247.html
請(qǐng)求有效性處理,使用令牌可以有效的防止重復(fù)提交。
protected String generateToken(HttpServletRequest request) 創(chuàng)建一個(gè)令牌.
protected boolean isTokenValid(HttpServletRequest request) 檢查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 檢查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌
基本原理:
服務(wù)器端在處理到達(dá)的請(qǐng)求之前,會(huì)將請(qǐng)求中包含的令牌值與保存在當(dāng)前用戶會(huì)話中的令牌值進(jìn)行比較,
看是否匹配。在處理完該請(qǐng)求后,且在答復(fù)發(fā)送給客戶端之前,將會(huì)產(chǎn)生一個(gè)新的令牌,該令牌除傳給
客戶端以外,也會(huì)將用戶會(huì)話中保存的舊的令牌進(jìn)行替換。這樣如果用戶回退到剛才的提交頁面并再次
提交的話,客戶端傳過來的令牌就和服務(wù)器端的令牌不一致,從而有效地防止了重復(fù)提交的發(fā)生。
實(shí)例:

Code
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.yourcompany.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* MyEclipse Struts
* Creation date: 08-01-2008
*
* XDoclet definition:
* @struts.action validate="true"
* @struts.action-forward name="add" path="/add.jsp"
*/
public class ToAddAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
saveToken(request);
return mapping.findForward("add");
}
}
這個(gè)Action主要作用就是在跳轉(zhuǎn)的頁面上加入Token,只有加入Token才能實(shí)現(xiàn)Token的驗(yàn)證。執(zhí)行完這個(gè)Action后,跳轉(zhuǎn)到的頁面會(huì)出現(xiàn)類似如下的一個(gè)hidden控件

Code
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="b030d9188a218097211d9061907cde5d"></div>
那么恭喜你,Token生效拉,注意,跳轉(zhuǎn)到的頁面里面,表單指可以用Struts標(biāo)簽來生成,不可以用HTML來生成,不然Token是無效的。
使用Token的第一步完成,第二步,在提交的Action中驗(yàn)證Token是否符合,代碼如下:

Code
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.yourcompany.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import com.lc.sqlhelp.Access;
import com.yourcompany.struts.form.AddForm;
/**
* MyEclipse Struts Creation date: 08-01-2008
*
* XDoclet definition:
*
* @struts.action path="/add" name="addForm" input="/form/add.jsp"
* scope="request" validate="true"
* @struts.action-forward name="add_suc" path="/add_suc.jsp"
* @struts.action-forward name="add_fail" path="/add_fail.jsp"
*/
public class AddAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
*
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AddForm af = (AddForm) form;
if (isTokenValid(request, true))//驗(yàn)證Token是否符合要求
{
String sql = "insert into user (username,password) values('"
+ af.getUsername() + "','" + af.getPassword() + "')";
System.out.println(sql);
Access sh = new Access();
sh.loadMyDriver();
sh.setMyConnection();
sh.createMyStatement();
sh.executeMyUpdata(sql);
sh.closeMyStatement();
sh.closeMyConnection();
return mapping.findForward("add_suc");
}
return mapping.getInputForward();
}
}
這樣就完成了防止表單重復(fù)提交的功能。
實(shí)例源碼下載
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/01/1258067.html
在用戶登錄輸入密碼時(shí),常常會(huì)有因?yàn)榇髮戞i定開啟而造成輸入密碼錯(cuò)誤的情況,如果在用戶大寫鎖定開啟時(shí)給予提示,就可以盡量避免這種情況的發(fā)生。
一下是代碼:

Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>檢測(cè)大寫鎖定鍵</title>
<style type="text/css">
<!--
*{margin:0;padding:0;}
body{padding:2em;background:#242424;color:#ccc;}
h1{text-align:center;line-height:200%;}
h3{text-indent:1em;line-height:160%;color:#666;font-weight:normal;font-size:1em;}
h3 a{color:#bbb; text-decoration:none;margin:0 0.5em;}
h3 a:hover{color:#fff;}
p{margin:5em;}
span{margin:0 0.5em;font-size:85.7%;}
-->
</style>
</head>
<body>
<h1>檢測(cè)大寫鎖定鍵 </h1>
<form action="#" method="post">
<p><label for="password">密碼:</label><input type="password" id="password" name="password" /><span style="display:none;">大寫鎖定鍵被按下,請(qǐng)注意大小寫</span></p>
</form>
<script type="text/javascript">
//<![CDATA[
function detectCapsLock(event){
var e = event||window.event;
var o = e.target||e.srcElement;
var oTip = o.nextSibling;
var keyCode = e.keyCode||e.which; // 按鍵的keyCode
var isShift = e.shiftKey ||(keyCode == 16 ) || false ; // shift鍵是否按住
if (
((keyCode >= 65 && keyCode <= 90 ) && !isShift) // Caps Lock 打開,且沒有按住shift鍵
|| ((keyCode >= 97 && keyCode <= 122 ) && isShift)// Caps Lock 打開,且按住shift鍵
){oTip.style.display = '';}
else{oTip.style.display = 'none';}
}
document.getElementById('password').onkeypress = detectCapsLock;
//]]>
</script>
</body>
</html>
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/07/31/1257624.html
摘要: 前一段時(shí)間朱哥一直在搞視頻轉(zhuǎn)換這個(gè)東東,我也一直很有興趣,就嘗試了一下。
首先是文件上傳功能的完成,做得很粗糙,沒有驗(yàn)證上傳文件是否為視頻文件。利用前一段時(shí)間看視頻學(xué)來的部分代碼很輕松搞定。
接下來,就是視頻轉(zhuǎn)換了,...
閱讀全文