
2006年1月8日
這幾天用TimerTask作了個(gè)框架,擔(dān)心超過(guò)十萬(wàn)條數(shù)據(jù)的時(shí)候速度變慢,其實(shí)每秒十萬(wàn)次的運(yùn)行速度等到以后放在服務(wù)器上運(yùn)行應(yīng)該游刃有余吧,還不清楚,不過(guò)現(xiàn)在在我筆記本上運(yùn)行得還可以,內(nèi)存吃的很大,java就這毛病,程序員不能自由釋放內(nèi)存。1G內(nèi)存不夠用,我筆記本2G有分配不了,似乎虛擬內(nèi)存java用不了,沒(méi)仔細(xì)做過(guò)實(shí)驗(yàn)。
這幾天看新聞知道番茄花園作者被警方逮捕,樹大招風(fēng),槍打出頭鳥,很正常,從程序員的身份來(lái)講,盜版是要打擊的,不過(guò)我本身電腦里要付費(fèi)的軟件都是盜版的,很矛盾,呵呵。
實(shí)在太久沒(méi)寫servlet了,應(yīng)該至少1年了,那時(shí)候做了點(diǎn)皮毛,現(xiàn)在項(xiàng)目要求用到servlet的相關(guān)知識(shí),同時(shí)我在blogjava的bolg又開張了。學(xué)習(xí)的過(guò)程將記錄在我的blog中。對(duì)比了一下netbean和eclipse感覺(jué)用netbean編寫servlet程序方便些,eclipse用了幾年,但是還是感覺(jué)每次要找好相關(guān)的jar需要花費(fèi)太多時(shí)間,于是決定用netbean編寫了。
看看以下代碼:
將26個(gè)英文字母重復(fù)加了5000次,
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1=System.currentTimeMillis();
??String str ="";
??for(int i=0;i<times;i++)
??{
???str+=tempstr;
??}
??
??long lend1=System.currentTimeMillis();
??long time = (lend1-lstart1);
??System.out.println(time);
可惜我的計(jì)算機(jī)不是超級(jí)計(jì)算機(jī),得到的結(jié)果每次不一定一樣一般為 154735 左右。
也就是154秒。
我們?cè)倏纯匆韵麓a
String tempstr = "abcdefghijklmnopqrstuvwxyz";
?
??int times = 5000;
long lstart2=System.currentTimeMillis();
??StringBuffer sb =new? StringBuffer();
??for(int i=0;i<times;i++)
??{
???sb.append(tempstr);
???
??}
??long lend2=System.currentTimeMillis();
??long time2 = (lend2-lstart2);
??System.out.println(time2);
?得到的結(jié)果為 16 有時(shí)還是 0
所以結(jié)論很明顯,StringBuffer 的速度幾乎是String 上萬(wàn)倍。當(dāng)然這個(gè)數(shù)據(jù)不是很準(zhǔn)確。因?yàn)檠h(huán)的次數(shù)在100000次的時(shí)候,差異更大。不信你試試。
下一次我將解釋為什么StringBuffer 的效率比String 高這么多。
swt 簡(jiǎn)單的托盤程序
java寫和操作系統(tǒng)相關(guān)的程序難度非常大。在java 6出現(xiàn)之前,如果你想實(shí)現(xiàn)一個(gè)托盤程序,最簡(jiǎn)單的就是用swt了。
通過(guò)google我找到了一段代碼。
其實(shí)很簡(jiǎn)單。主要的代碼如下:
?????????????final Tray tray = display.getSystemTray();
??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
??????????? Image image = new Image (display, 16, 16);
??????????? trayItem.setImage(image);
知道了重點(diǎn),事情變的很簡(jiǎn)單了??纯此谐绦?br />//-----------------
public class SystemTray extends Shell {
??? public static void main(String args[]) {
??????? try {
??????????? Display display = Display.getDefault();
??????????? SystemTray shell = new SystemTray(display, SWT.SHELL_TRIM);
?????????? // shell.createSystemTray(shell);
??????????? final Tray tray = display.getSystemTray();
??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
??????????? Image image = new Image (display, 16, 16);
??????????? trayItem.setImage(image);
??????????? shell.open();
??????????? shell.layout();
??????????? while (!shell.isDisposed()) {
??????????????? if (!display.readAndDispatch())
??????????????????? display.sleep();
??????????? }
??????? } catch (Exception e) {
??????????? e.printStackTrace();
??????? }
??? }
??? public SystemTray(Display display, int style) {
??????? super(display, style);
??????? createContents();
??? }
??? /**
???? * Create contents of the window
???? */
??? protected void createContents() {
??????? setText("SWT Application");
??????? setSize(500, 375);
??? }
??? //swt 默認(rèn)情況下不允許shell被繼承
??? //所以我重載了父類的方法
??? protected void checkSubclass() {
???????? }
}
//--------------------
如果你想成功運(yùn)行以上代碼,你最好在eclipse下新建一個(gè)swt的類。具體操作你搜索一下吧。
但是上面的代碼只是加入了托盤,這可能是最簡(jiǎn)單的實(shí)現(xiàn)托盤的程序了。我們加入事件處理,讓程序能夠最大和最小化。然后把托盤用圖片來(lái)表示。
詳細(xì)的代碼不參考
下載
到eclipse里運(yùn)行
從8.1號(hào)開始,連續(xù)加班,再過(guò)1小時(shí)結(jié)束。
排序的算法是我們最常用的算法,初學(xué)程序,每個(gè)人都嘗試過(guò)排序。但只是局限于簡(jiǎn)單的排序。
如將下列數(shù)字進(jìn)行排序
1,3,5,8,3,6
于是我們得出結(jié)果
1,3,3,5,6,8
將下列字母(字符)進(jìn)行排序
a,i,e,f,w,s
于是我們得出結(jié)果
a,e,f,i,s,w
但是我們遇到的情況就不是如此簡(jiǎn)單了。如給公司里的商品進(jìn)行排序,我們很輕易的想到按照商品的名稱排序不就完了,而且簡(jiǎn)單明了。但現(xiàn)實(shí)并如我們相信般簡(jiǎn)單。同一商品名稱可以有不同的批次,進(jìn)貨時(shí)間,可能還會(huì)有單價(jià)的不同。顯然只根據(jù)商品名稱排序是不合理的。
再舉個(gè)簡(jiǎn)單例子然后用程序?qū)崿F(xiàn)。如公司要將員工進(jìn)行排序(不要說(shuō)領(lǐng)導(dǎo)排在前面),假設(shè)我們的需求比較復(fù)雜。先進(jìn)行姓排序,誰(shuí)的姓拼音靠前,誰(shuí)就排前面。然后對(duì)名字進(jìn)行排序。恩.如果同名,女性排前頭。如果名字和性別都相同,年齡小的排前頭。ok,一個(gè)也不算復(fù)雜的需求。
如果對(duì)java比較熟悉的會(huì)知道java.util.Comparator 接口。要實(shí)現(xiàn)里面的函數(shù)
?int compare(Object o1, Object o2) 返回一個(gè)基本類型的整型,返回負(fù)數(shù)表示o1 小于o2,返回0 表示o1和o2相等,返回正數(shù)表示o1大于o2。
于是我們?cè)O(shè)計(jì)的人員類要有幾個(gè)變量,firstname,lastname,sex,age分別表示姓,名,性別,年齡。
public class Person {
? String firstname,lastname;
? Boolean sex;
? Integer age;
? public Person(String firstname,String lastname,Boolean sex,Integer age) {
??? this.firstname = firstname;
??? this.lastname = lastname;
??? this.sex = sex;
??? this.age = age;
? }
? public String getFirstName() {
???? return firstname;
?? }
?? public String getLastName() {
???? return lastname;
?? }
?? public Boolean getSex() {
????? return sex;
??? }
??? public Integer getAge() {
????? return age;
??? }
//為了輸入方便,重寫了toString()
public String toString()
??? {
????? return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
??? }
}
//end person
下面是要實(shí)現(xiàn)比較器
public class Comparators {
? public static java.util.Comparator getComparator() {
??? return new java.util.Comparator() {
????? public int compare(Object o1, Object o2) {
??????? if (o1 instanceof String) {
????????? return compare( (String) o1, (String) o2);
??????? }
?????? else if (o1 instanceof Integer) {
????????? return compare( (Integer) o1, (Integer) o2);
??????? }
?????? else if (o1 instanceof Person) {
????? return compare( (Person) o1, (Person) o2);
??? }
??????? else {
????????? System.err.println("未找到合適的比較器");
????????? return 1;
??????? }
????? }
????? public int compare(String o1, String o2) {
??????? String s1 = (String) o1;
??????? String s2 = (String) o2;
??????? int len1 = s1.length();
??????? int len2 = s2.length();
??????? int n = Math.min(len1, len2);
??????? char v1[] = s1.toCharArray();
??????? char v2[] = s2.toCharArray();
??????? int pos = 0;
??????? while (n-- != 0) {
????????? char c1 = v1[pos];
????????? char c2 = v2[pos];
????????? if (c1 != c2) {
??????????? return c1 - c2;
????????? }
????????? pos++;
??????? }
??????? return len1 - len2;
????? }
????? public int compare(Integer o1, Integer o2) {
??????? int val1 = o1.intValue();
??????? int val2 = o2.intValue();
??????? return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));
????? }
????? public int compare(Boolean o1, Boolean o2) {
???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
?????? }
????? public int compare(Person o1, Person o2) {
??????? String firstname1 = o1.getFirstName();
??????? String firstname2 = o2.getFirstName();
??????? String lastname1 = o1.getLastName();
??????? String lastname2 = o2.getLastName();
??????? Boolean sex1 = o1.getSex();
??????? Boolean sex2 = o2.getSex();
??????? Integer age1 = o1.getAge();
??????? Integer age2 = o2.getAge();
??????? return (compare(firstname1, firstname2) == 0 ?
??????????????? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
???????????????? compare(age1, age2)) :
???????????????? compare(sex1, sex2)) :
???????????????? compare(lastname1, lastname2)) :
??????????????? compare(firstname1, firstname2));
????? }
??? };
? }
}
以上代碼有可能因?yàn)闉g覽器的布局自動(dòng)換行。
compare(Person o1, Person o2)的返回值看起來(lái)比較別扭。最簡(jiǎn)單的是
??? public int compare(Boolean o1, Boolean o2) {
???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
?????? }
o1和o2相等返回0,否則o1如果是true 就表示o1大于o2。
再嘗試輸出結(jié)果看看
public class Main {
? public Main() {
? }
? public static void main(String[] args) {
??? Person[] person = new Person[] {
???????? new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
???????? new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
???????? new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
???????? new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),
???? };
???? for (int i = 0; i < person.length; i++) {
?????? System.out.println("before sort=" + person[i]);
???? }
???? java.util.Arrays.sort(person, Comparators.getComparator());
? for (int i = 0; i < person.length; i++) {
??? System.out.println("after sort=" + person[i]);
? }
? }
}
輸出結(jié)果:
before sort=ouyang feng 男 27
before sort=zhuang gw 男 27
before sort=zhuang gw 女 27
before sort=zhuang gw 女 2
after sort=ouyang feng 男 27
after sort=zhuang gw 女 2
after sort=zhuang gw 女 27
after sort=zhuang gw 男 27
仔細(xì)理解java的Comparator會(huì)給你寫排序帶來(lái)很大幫助
?
?
軟件項(xiàng)目,特別是給企業(yè)用戶的項(xiàng)目,實(shí)施過(guò)程大多辛苦,而且一部分問(wèn)題不在于軟件本身。
總結(jié)一下項(xiàng)目最后驗(yàn)收階段案例之一。
案例:項(xiàng)目已經(jīng)按照客戶確認(rèn)的調(diào)研文檔完成實(shí)施工作。客戶的一把手提出新需求。
此一把手H,H精通業(yè)務(wù),對(duì)電腦一竅不通。H對(duì)手下電腦部負(fù)責(zé)人Z提出“要對(duì)業(yè)務(wù)進(jìn)行風(fēng)險(xiǎn)管理,把風(fēng)險(xiǎn)大的業(yè)務(wù)提出來(lái)。”,一句話令Z頭大。Z苦惱H沒(méi)有定義什么是風(fēng)險(xiǎn)大,即使H說(shuō)明風(fēng)險(xiǎn)大的條件,現(xiàn)有的軟件架構(gòu),數(shù)據(jù)模型能否實(shí)現(xiàn)還是未知數(shù)。實(shí)現(xiàn)此功能成為不可完成的任務(wù)。持續(xù)下去Z和項(xiàng)目經(jīng)理W(軟件公司負(fù)責(zé)人)都面臨困境。
Z會(huì)被認(rèn)為沒(méi)有完成領(lǐng)導(dǎo)安排的工作(實(shí)際上他忙的焦頭爛額)。
W進(jìn)入兩難,一方面客戶要求的完成不了,另一方面面臨公司的的項(xiàng)目要拖延。
解決辦法:1.按章辦事,調(diào)研文檔已經(jīng)寫清楚無(wú)此需求。直接拒絕。此為下策,沒(méi)辦法才用,但是關(guān)鍵時(shí)刻很有用。
2.引導(dǎo)+忽悠。對(duì)付H這種老總要從其公司內(nèi)部出發(fā)。分析滿足他需求所需要的條件。一般要犧牲部分工作人員的工作時(shí)間。然后把影響放大,嚇唬他。如果可以的話可以找他們的相關(guān)人員幫忙,讓他聽到不同的聲音,讓他放棄此念頭。因?yàn)檐浖峭庑?,談?wù)撥浖r(shí)心里沒(méi)底氣,有自己人反對(duì),心虛。
比如從財(cái)務(wù)著手比較有效。要滿足H的需求改變了財(cái)務(wù)的核算體系,原有的數(shù)據(jù)都要加上某寫核算項(xiàng),不能保證數(shù)據(jù)準(zhǔn)確性,而且大大增加了財(cái)務(wù)工作量,而且不符合會(huì)計(jì)制度(忽悠)。上策!
轉(zhuǎn)載請(qǐng)注明出處:http://www.tkk7.com/nake/
???自從
java
發(fā)布的第一個(gè)版本開始就已經(jīng)包含
JDBC
了。目前已經(jīng)有
10
個(gè)年頭了。
JDBC4.0
將要被打包到
java6.0
里(
java SE
是
J2SE
新的名字)。它展現(xiàn)設(shè)計(jì)的重大提升和提供更加豐富的
API
,更加重視簡(jiǎn)易開發(fā)和提高生產(chǎn)力
。
??????
本文將討論一些
JDBC
在改善設(shè)計(jì)和提高性能上的重要的變化。但是不能列舉每一個(gè)變化。
注解和泛型
我想你已經(jīng)了解了包含在
JAVA 5.0
的注解(
annotations
)
和泛型(
generic
也有翻譯范型)。
JDBC4.0
也引進(jìn)了注解和泛型
DataSet
,這使得執(zhí)行
sql
語(yǔ)句和
SQL? DML
(
data manipulation? language
)
定義變的簡(jiǎn)單。
??????
在新的
API
里定義了一套
Query
和
DataSet
接口。
Query
接口定義了一套方法,這些方法描述了
SQL
的
select
和
update
語(yǔ)句。而且詳細(xì)介紹了結(jié)果集如何綁定為一個(gè)
DataSet
的。因?yàn)榉盒退?/span>
DataSet
是可以帶參數(shù)的。因此可以說(shuō)
DataSet
接口是類型安全的(
type-saft
)
.
所有
Query
接口都要從
BaseQuery
接口繼承??梢酝ㄟ^(guò)
Connection.createQueryObject()
或者
DataSource.createQueryObject()
得到Query對(duì)象。
一個(gè)DataSet接口都繼承java.util.List。
? DataSet
是有列概念的數(shù)據(jù)集,能從
Query
接口得到,并且可以帶有參數(shù)。
DataSet
可以在連接和斷開連接的情況下使用。從而
DataSet
實(shí)現(xiàn)了
ResultSet
(連接)
或者
?
CachedRowSet
(可以斷開連接)。因?yàn)?span lang="EN-US">DataSet是java.util.List的子接口,所以可以通過(guò)java.util.Iterator來(lái)訪問(wèn)每一行。
DataSet
接口可以帶系統(tǒng)或者用戶自己定義的類作為參數(shù)。通過(guò)兩種方法你可以實(shí)現(xiàn):構(gòu)造函數(shù)或者
JavaBeans
對(duì)象,任何一個(gè)辦法都能達(dá)到將用戶自定義的類綁定到結(jié)果集的列里。但是在其它支持
JavaBeans
的框架里,用
JavaBeans
對(duì)象的實(shí)現(xiàn)就顯更加容易使用。
下面簡(jiǎn)單舉例說(shuō)明如何通過(guò)新的
API
創(chuàng)建和運(yùn)行
SQL
查詢。用用戶自定義的類來(lái)定義結(jié)果集。(拷貝時(shí)候小心有制表符)
pubic class Employee {
?? private int employeeId;
?? private String firstName;
?? private String lastName;
?? public int getEmployeeId() {
??????return employeeId;
?? }
??
?? public setEmployeeId(int employeeId) {
??????this.employeeId = employeeId;
?? }
?? public String getFirstName() {
??????return firstName;
?? }
?? public setFirstName(String firstName) {
??????this.firstName = firstName;
?? }
?? pubic String lastName() {
??????return lastName;
?? }
?? public setLastName(String lastName) {
??????this.lastName = lastName;
?? }
}
interface EmployeeQueries extends BaseQuery {
?? @Select (sql="SELECT employeeId, firstName, lastName FROM employee")
?? DataSet<Employee> getAllEmployees ();
?? @Update (sql="delete from employee")
?? int deleteAllEmployees ();
}
Connection con = ...
EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);
DataSet<Employee> empData = empQueries.getAllEmployees ();
?
異常處理的增強(qiáng):
1.??????
為
SQLException
分為兩類
transient
和
non-transient
。
2.??????
支持連鎖的異常。
3.??????
繼承了
Iterable
接口。
因?yàn)槔^承了Iterable 所以你可以這樣寫:
catch(SQLException ex) {
?? for(Throwable t : ex) {
??????System.out.println("exception:" + t);
?? }
}
參考
http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html
JSR 221: JDBC 4.0 Specification:
http://www.jcp.org/en/jsr/detail?id=221
未完
?????????陳水扁一邊嗆美,另一邊卻熱情對(duì)待布什夫人;他前天(2006-5-9)在哥斯達(dá)黎加總統(tǒng)就職大典上兩度“突襲”美國(guó)總統(tǒng)夫人勞拉的畫面,昨天一整天在臺(tái)灣島內(nèi)電視熱播。
當(dāng)時(shí)正舉行哥國(guó)總統(tǒng)就職大典,陳水扁坐在第一排,勞拉則坐在第二排。阿扁不時(shí)轉(zhuǎn)頭瞄向左后方的勞拉,等到表演節(jié)目開始時(shí),扁跨步越過(guò)身邊所有人走到勞拉身旁寒暄。據(jù)說(shuō),扁邀請(qǐng)勞拉到臺(tái)灣訪問(wèn),勞拉則禮貌性回答“謝謝”。
?????????至典禮結(jié)束時(shí),全場(chǎng)嘉賓起身鼓掌,扁忽然再一個(gè)箭步?jīng)_向勞拉。勞拉表情有些錯(cuò)愕,但雙手繼續(xù)鼓掌。扁此時(shí)伸出右手,懸空一陣后主動(dòng)去輕抓勞拉正在鼓掌的手,迫使勞拉不得不與他相握。手一握到,扁立刻雙手緊抓不放,左手還不斷拍打,勞拉的另一只手此時(shí)卻不期然地移到自己胸前捂住,還下意識(shí)地抓緊了衣領(lǐng)。同時(shí),扁的傳譯員卻已擺好了相機(jī),扁示意勞拉對(duì)著鏡頭微笑,終于完成了這張與總統(tǒng)夫人微笑握手的歷史合照。
原文出自
http://www.zaobao.com/gj/zg060511_501.html
? 整整一天的時(shí)間都在查bug,對(duì)數(shù),然后找到錯(cuò)誤的原因。需要我認(rèn)真,仔細(xì),不要放棄,不要繞過(guò)困難。找bug需要方法和耐心,要記錄下多種數(shù)據(jù)和過(guò)程,不要做無(wú)頭蒼蠅,如果數(shù)據(jù)像今天一樣多要先給數(shù)據(jù)分類分段排除。
???最近看2本書,一本關(guān)于ajax的,一本是《Agile Software Develpment》。先看ajax,我實(shí)在不想公布它的書名,感覺(jué)被騙了,廣告做得好,翻譯和內(nèi)容都很差?!禔gile Software Develpment》還行,同時(shí)也學(xué)習(xí)了英文,是本值得細(xì)讀得書。
???周六周日抽空完成了Table類的排序和搜索功能。搜索速度還能接受,搜索2萬(wàn)條記錄沒(méi)感覺(jué)到停頓,更多的記錄我還沒(méi)測(cè)試,排序就夠嗆,起初花了30分鐘還沒(méi)完成,郁悶!comparator要進(jìn)行優(yōu)化。
? public int compare(Number o1, Number o2) {
??? double n1 = o1.doubleValue();
??? double n2 = o2.doubleValue();
??? if (n1 < n2) {
????? return -1;
??? } else if (n1 > n2) {
????? return 1;
??? } else {
????? return 0;
??? }
? }
感覺(jué)應(yīng)該還好,應(yīng)該是其它地方?jīng)]處理好。
接下來(lái)我要處理
1.改變JTable原來(lái)的UI 在table底下加入可以匯總的表格
2.JTable類在瀏覽器上的表現(xiàn)
3.dataset直接的關(guān)聯(lián)在table中實(shí)現(xiàn)
? ? 好像是兩年前第一次接觸eclipse,不記得版本號(hào)了。那時(shí)候eclipse小有名氣,可能是本身喊的出名字的工具就只有jb。公司買的是jb6,但是我們都貪新,用剛出的jb9。結(jié)果因?yàn)橛帽I版被borland協(xié)同工商罰了好多錢(你不信就開防火墻,用jb調(diào)試程序,看看防火墻情況)。從此公司開始使用eclipse。
?? ?正是eclipse由IBM等出資和開源的緣故有人說(shuō)eclipse是六大門派里的少林,聽起來(lái)有點(diǎn)道理。武當(dāng)派(jboss)已經(jīng)歸于redhat名下(我不喜歡jboss因?yàn)樗拿掷镉袀€(gè)Boss)。可能我很喜歡eclipse了,生怕有一天開始收費(fèi),或者被收購(gòu),畢竟不是原滋原味。
??? eclipse發(fā)展太快,幾乎一個(gè)月一個(gè)Milestone,現(xiàn)在是3.2M6了,最后一個(gè)M。如果按照此速度4月要出3.2的stable build版本的RC1了。其中一項(xiàng)新特性是速度有所提升。看看我為了玩java我機(jī)器的配置吧。
今晚無(wú)聊 用google google 了google 有2,580,000,000項(xiàng)符合查詢結(jié)果。無(wú)意中有看到新成員froogle 。google家族成員越來(lái)越多,可是中文版出得就相對(duì)慢,而且不一定能順利在中國(guó)推廣,或者以后google沒(méi)個(gè)家族成員都有類似提示據(jù)當(dāng)?shù)胤煞ㄒ?guī)和政策,部分搜索結(jié)果未予顯示。
喜歡google,喜歡他簡(jiǎn)潔、快速。
Table類的mind圖.
計(jì).jpeg)
當(dāng)然還有TableModel 沒(méi)有畫進(jìn)來(lái),因?yàn)樗鼘?huì)是變化多端的.code_name_map也沒(méi)有畫.還有輔助錄入以前寫過(guò)就不說(shuō)了.
事件的處理以后再花時(shí)間寫清楚了.
今晚一邊考慮了DataRow,Cell,DataSet,DataTable,Connect,DataProvider的構(gòu)架一邊看 《一球成名》,覺(jué)得很愜意.
我的工作就是和數(shù)據(jù)庫(kù)打交道,數(shù)據(jù)庫(kù)當(dāng)然離不開dataset,用了幾年borland的dx.jar. borland這次看來(lái)真的玩完了.回想borland的歷史,每次危機(jī)時(shí)刻都有英雄出現(xiàn),扭轉(zhuǎn)局面.但愿這次也如此.
我近段時(shí)間要完成的工作:
1.完善我的dataset.
2.實(shí)現(xiàn)table里的過(guò)慮,快速查找等功能
接下來(lái)我才考慮用以上模塊實(shí)現(xiàn)項(xiàng)目管理軟件.
Subversion 已經(jīng)代替了CVS,至少在
SourceForge上是如此.我花了一個(gè)晚上時(shí)間玩玩.原來(lái)在公司用vss,感覺(jué)能用就將就了.畢竟用哪個(gè)版本控制器不重要.
java 的Table類采用了MVC模式,所以設(shè)計(jì)出多種視圖相對(duì)容易.
但是在工作中為了如果Table里的數(shù)據(jù)能用Tree的方式組織起來(lái),數(shù)據(jù)會(huì)更加緊湊,結(jié)構(gòu)清晰.
效果如圖:但是往往工作中數(shù)據(jù)沒(méi)那么少,那么簡(jiǎn)單

下圖是樹型圖的思維圖

基本上程序上要寫的地方有:
1.實(shí)現(xiàn)TreeModel接口,
同時(shí)實(shí)現(xiàn)TableModel中幾個(gè)必要函數(shù)
public Class getColumnClass(int column);
public int getColumnCount();
public String getColumnName(int column);
public Object getValueAt(Object node, int column);
public boolean isCellEditable(Object node, int column);
public void setValueAt(Object value, Object node, int column);
使tree和table能相互結(jié)合使用
2.繼承AbstractTableModel
將1中繼承TreeModel和此結(jié)合
3.繼承TableCellRenderer
要覆蓋paint,updateUI 要實(shí)現(xiàn)getTableCellRendererComponent
4.TreeModelListener的實(shí)現(xiàn)了
整體的代碼不長(zhǎng) 但花了我不少時(shí)間.需要的話留下mail吧.
此代碼還有不完善的地方.如和sql結(jié)合.
春節(jié)是中國(guó)人傳統(tǒng)節(jié)日一年的開始。
一年的開始......
埃及海難,人們大罵船長(zhǎng)不該跑該死,埃及人都學(xué)會(huì)了“都坐下不要?jiǎng)?,讓領(lǐng)導(dǎo)先走”。
美國(guó)防部將中國(guó)列為“最具軍事威脅國(guó)家”,米國(guó)人本應(yīng)該出中文版《四年防務(wù)評(píng)估報(bào)告》,competition 對(duì)抗;競(jìng)爭(zhēng)行為,如為了利益或獎(jiǎng)品;敵對(duì) 。 menace 威脅;可能發(fā)生之危險(xiǎn);威脅。我英文不好就只能借助英語(yǔ)字典了。
菲律賓體育場(chǎng)發(fā)生踩踏事件,他死因?yàn)樗F。
IAEA理事會(huì)決定把伊朗核問(wèn)題報(bào)告安理會(huì)。絕不讓流氓國(guó)家menace 我們泱泱大國(guó)。
我,我把我的程序整理了一遍,加了注釋,打成工具包。
我,制定了一份偉大的、可持續(xù)使用的、為別人打工的工作計(jì)劃(三的計(jì)劃)。
在http://www.mysql.com/ 下載Query Browser
運(yùn)行時(shí)需要libstdc++.so.5
原來(lái)它藏在compat-libstdc++-8-3.3.4.ix86_64.rpm
找了我超過(guò)4個(gè)小時(shí)。在http://download.fedora.redhat.com/pub/fedora/linux/core/4/x86_64/os/Fedora/RPMS/找到,需要下載下來(lái)然后
rpm -ivh compat-libstdc++-8-3.3.4.ix86_64.rpm
當(dāng)然在這之前可能要chmod -R 755 compat-libstdc++-8-3.3.4.ix86_64.rpm
原文來(lái)自http://fanqiang.chinaunix.net/app/web/2005-08-30/3548.shtml
Linux+Apache+Mysql+PHP典型配置 |
作者:張微波 來(lái)源:5ilinux
|
|
|
Linux+Apache+Mysql+PHP典型配置
調(diào)試環(huán)境:Redhat9.0 Apache1.3.29 Mysql3.23.58 PHP4.3.4 Linux系統(tǒng)的安裝我就不講了,這是基本功,其實(shí)這篇文章在類似Redhat的其他linux也應(yīng)該通用,大家只要掌握我提供的方法就行。記得安裝 Redhat9。0的時(shí)候不要安裝系統(tǒng)默認(rèn)的apache,mysql和php以及相關(guān)的軟件。已經(jīng)安裝的請(qǐng)用rpm -e * 刪除已經(jīng)安裝的包。
1.安裝Mysql3.23.58
其實(shí)老實(shí)說(shuō)直接安裝Mysql官方網(wǎng)站提供的rpm包也是一個(gè)比較可行的辦法,他的官方網(wǎng)站的rpm包的提供基本跟tar包發(fā)行是同步的,這點(diǎn)我比較喜歡,至少安裝rpm包的在后面的調(diào)試中不會(huì)出現(xiàn)mysql庫(kù)文件找不到的情況。但這里還是有必要講一下自定義安裝的步驟,畢竟網(wǎng)友自定義安裝的還說(shuō)挺多的。
軟件獲?。篬url]http://www.mysql.com/downloads/index.html[/url]
安裝步驟:
tar zxvf mysql-3.23.58.tar.gz cd mysql-3.23.58 ./configure --prefix=/usr/local/mysql --sysconfdir=/etc --localstatedir=/var/lib/mysql make make install #prefix=/usr/local/mysql mysql安裝的目標(biāo)目錄 #sysconfdir=/etc my.ini配置文件的路徑 #localstatedir=/var/lib/mysql 數(shù)據(jù)庫(kù)存放的路徑 安裝完以后要初始化數(shù)據(jù)庫(kù),當(dāng)然你是升級(jí)的話不用做這步; /usr/local/mysql/bin/mysql_install_db 如果系統(tǒng)沒(méi)有mysql這個(gè)用戶的話,最好做以下這步: useradd -M -o -r -d /var/lib/mysql -s /bin/bash -c "MySQL Server" -u 27 mysql 然后我啟動(dòng)mysql /usr/local/mysql/bin/safe_mysqld |
ok,先看看mysql能否正常工作 mysql -uroot mysql
一般情況下都是不能正常鏈接數(shù)據(jù)庫(kù),錯(cuò)誤提示一般為:
ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
其實(shí)網(wǎng)上大家問(wèn)的最多的都是整個(gè)問(wèn)題,說(shuō)什么鏈接不到mysqld.sock,其實(shí)大家不妨看看mysql的錯(cuò)誤日志就明白怎么回事,我這里的錯(cuò)誤日志是在/var/lib/mysql/*.err.
你會(huì)發(fā)現(xiàn)mysql只所以不能啟動(dòng),是因?yàn)?var/lib/mysql的權(quán)限不允許mysql服務(wù)訪問(wèn),英文mysql默認(rèn)是調(diào)用mysql用戶來(lái)啟動(dòng)服務(wù)的,好了,既然知道是什么原因找到不能啟動(dòng),那就簡(jiǎn)單了。我們只要chown -R mysql:mysql /var/lib/mysql就行,如果還是啟動(dòng)不了,再慢慢調(diào)試權(quán)限,反正一般啟動(dòng)不了都是權(quán)限的問(wèn)題。
如果大家還是不能啟動(dòng)不了的話,那就用我的比較繁瑣的權(quán)限的設(shè)置,反正我每次都是這么做的,一般不會(huì)有問(wèn)題,見下:
chown -R root /usr/local/mysql chgrp -R mysql /usr/local/mysql chown -R root /usr/local/mysql/bin chgrp -R mysql /usr/local/mysql/bin chgrp -R mysql /var/lib/mysql chmod 777 /var/lib/mysql chown -R root /var/lib/mysql/mysql chgrp -R mysql /var/lib/mysql/mysql chmod 777 /var/lib/mysql/mysql chown -R root /var/lib/mysql/mysql/* chgrp -R mysql /var/lib/mysql/mysql/* chmod 777 /var/lib/mysql/mysql/* chmod 777 /usr/local/mysql/lib/mysql/libmysqlclient.a |
做完上面的步驟,然后把你編譯目錄的一個(gè)腳本COPY過(guò)去
cp support-files/mysql.server /etc/rc.d/init.d/mysqld chkconfig --add mysqld 用ntsysv設(shè)置使mysql每次啟動(dòng)都能自動(dòng)運(yùn)行。
好了,至此mysql安裝完畢,你可以這樣起動(dòng)你的mysql服務(wù)
/etc/rc.d/init.d/mysqld start
下面這步比較關(guān)鍵:
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql ln -s /usr/local/mysql/include/mysql /usr/include/mysql 大家可以不做這步,大可以在編譯其他軟件的時(shí)候自定義myslq的庫(kù)文件路徑,但我還是喜歡把庫(kù)文件鏈接到默認(rèn)的位置,這樣你在編譯類似PHP,Vpopmail等軟件時(shí)可以不用指定mysql的庫(kù)文件地址。
2.安裝Apache1.3.29。
我沒(méi)有選擇安裝Apache2.0是我對(duì)他還是不放心,因?yàn)榫W(wǎng)上最新公布的apache的漏洞基本上是針對(duì)2.0,當(dāng)然大家可以自己選擇安裝相應(yīng)的版本。我這里講的都是采用DSO動(dòng)態(tài)編譯的方法編譯Apache.
tar zvxf apache_1.3.29.tar.gz cd apache_1.3.29 修改src/include/httpd.h 增大最大線程數(shù) #define HARD_SERVER_LIMIT 256 改成 #define HARD_SERVER_LIMIT 2560 保存退出編譯apache ./configure --prefix=/usr/local/apache --enable-module=so --enable-module=rewrite --enable-shared=max --htdocsdir=/var/www && make && make install |
# 這里我們通過(guò)enable-module參數(shù)告訴設(shè)置腳本,我們需要啟動(dòng)so和rewrite模塊,so模塊是用來(lái)提DSO支持的apache核心模塊,而rewrite模塊則是用意實(shí)現(xiàn)地址重寫的模塊,由于rewrite模塊需要DBM支持,如果在初次安裝時(shí)沒(méi)有編譯進(jìn)apache,以后需要用到時(shí)需要重新編譯整個(gè)apache才可以實(shí)現(xiàn)。為此除非你可以確定以后不會(huì)用到rewrite模塊,否則還是建議你在第一次編譯的時(shí)候把rewrite 模塊編譯好。
enable-shared=max
這個(gè)參數(shù)的作用時(shí)編譯apache時(shí),把除了so以外的所有apache的標(biāo)準(zhǔn)模塊都編譯成DSO模塊。而不是編譯進(jìn)apache核心內(nèi)。
好了安裝apache很簡(jiǎn)單的哦,啟動(dòng)apache看看
/usr/local/apache/bin/apachectl start
然后用ie看[url]http://你的服務(wù)器地址。應(yīng)該能看到熟悉的apache羽毛標(biāo)志。[/url]
3.安裝PHP4.3.4 軟件獲?。篬url]http://www.php.net/downloads.php[/url]
tar zvxf php-4.3.4.tar.gz cd php-4.3.4 ./configure \ --prefix=/usr/local/php \ --with-mysql=/usr/local/mysql \ --enable-force-cgi-redirect \ --with-freetype-dir=/usr \ --with-png-dir=/usr \ --with-gd --enable-gd-native-ttf \ --with-ttf \ --with-gdbm \ --with-gettext \ --with-iconv \ --with-jpeg-dir=/usr \ --with-png \ --with-zlib \ --with-xml \ --enable-calendar \ --with-apxs=/usr/local/apache/bin/apxs make make install |
# 我這里由于服務(wù)器需要用到GD庫(kù),所以加了一些支持GD的編譯參數(shù),GD直接用了redhat自帶的GD庫(kù),大家沒(méi)有安裝的話可以從安裝盤安裝,注意除了安裝GD以外,還要安裝libjpeg,libpng等庫(kù)文件。另外--with-mysql=/usr/local/mysql指向你安裝 mysql的路徑。--with-apxs指向apache的apxs文件的路徑。
vi /usr/local/apache/conf/httpd.conf 查找<IfModule mod_mime.c> 在此范圍添加 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 然CPOPY PHP的配置文件 cp ../php4.3.4/php.ini.dist /usr/local/php/lib/php.ini 修改php.ini文件 register_globals = On ok!重新啟動(dòng)一下apache服務(wù)器 /usr/local/apache/bin/apachectl restart 然后寫個(gè)php測(cè)試頁(yè)info.php:內(nèi)容如下 <?php phpinfo(); ?> |
正常的話,應(yīng)該能看到php的信息了,恭喜你的Apche+Mysql+PHP安裝成功。 |
Fedora中的中文字體是模糊的,總有種霧里看花的感覺(jué),看久了眼鏡很不舒服。網(wǎng)上也有很多方法將字體改得清晰?;旧隙际菑膚indows中拷了
simsun字體后,再修改好幾個(gè)配置文件。往往會(huì)改得很郁悶,還一個(gè)不小心打錯(cuò)幾個(gè)字母,字體就變?yōu)槟J(rèn)的很難看的仿宋體。
自己也郁悶了好久之后,網(wǎng)上看了一篇很強(qiáng)的方法,超級(jí)簡(jiǎn)單,又很實(shí)用:
1:進(jìn)入下面的文件夾
[root@S01 ~]#cd /usr/share/fonts/chinese/TrueType
2:刪除:gkai00mp.ttf/gbsn00lp.ttf/bsmi00lp.ttf/bkai00mp.ttf四個(gè)字體文件
[root@S01 ~]#rm -rf gkai00mp.ttf gbsn00lp.ttf bkai00mp.ttf bsmi00lp.ttf
3:將simsun.ttc重命名為:gkai00mp.ttf和bkai00mp.ttf,并放到/usr/share/fonts/chinese/TrueTypa下
這樣重啟一下就OK了,怎么樣,簡(jiǎn)單吧
simsun.ttc可以在windows中的%systemroot%windows/Fonts文件夾下拷貝。
在linux 中設(shè)置java的環(huán)境
vi /etc/profile.d/java.sh
這樣可以在所有的用戶中使用
在新的java.sh中輸入以下內(nèi)容:
#set java environment
JAVA_HOME=/usr/java/jdk1.5.0_06
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
畢業(yè)后就沒(méi)用linux了,今晚裝了Fedora4
64位的.感覺(jué)一般.redhat5的時(shí)候我就稍微用過(guò).不過(guò)安裝過(guò)程很快提示是15分鐘.我裝了4G的數(shù)據(jù).裝完后就啟動(dòng)
eclipse3.1.0M6.死機(jī),重起,再啟動(dòng),還死機(jī). 郁悶!不過(guò)adsl很容易設(shè)置.啟動(dòng)IM,不錯(cuò)雖然和m s n
的樣子不一樣但是還是可以用.
今天坐車回來(lái)突然有個(gè)想法,我把它記錄下來(lái)。
在廣州上下班時(shí)間主要交通路線一定會(huì)塞車,而且通常是沒(méi)有交通意外,紅綠燈沒(méi)壞,交警們還在的情況下發(fā)生。部分原因是因?yàn)閺V州的主要商業(yè)區(qū)比較集中,市民的居住地也集中在幾個(gè)方向,這樣一來(lái)就會(huì)出現(xiàn)上下班時(shí)間集中在某個(gè)方向的車道塞車,而相反方向的車道卻被閑置著。

但是如果把道路的設(shè)施稍微改動(dòng)一下。比如現(xiàn)在道路之間是用花圃、欄桿或者雙黃線隔開的。這有可能會(huì)美化道路,但是卻不能給市民帶來(lái)方便。如果我們把花圃、欄桿拆掉,把黃線給抹掉,用埋在道路表面的燈來(lái)代替。

如上圖 1,2,3 分別代表埋在路表面的黃燈 平時(shí)默認(rèn)2亮,在出現(xiàn)塞車時(shí)可以靈活的調(diào)整1,3燈是否為亮。通過(guò)調(diào)整塞車車道的寬度來(lái)緩解廣州的路況。我覺(jué)得是可行的辦法。
1.從分利用了道路資源,不會(huì)出現(xiàn)一邊道路緊張一邊卻被閑置。
2.在路表鋪上路燈的成本比每天塞車的成本低(我沒(méi)調(diào)查過(guò))
但是還是會(huì)面臨各種問(wèn)題
1.沒(méi)有相關(guān)法規(guī)規(guī)定,路表的指示燈可以作為指揮交通。
2.即使有相關(guān)法規(guī)出臺(tái)。廣州的司機(jī)大老會(huì)買單嗎?誰(shuí)來(lái)監(jiān)管。
3.即使可以通過(guò)電子眼來(lái)監(jiān)管司機(jī)。指示燈誰(shuí)來(lái)控制?如何控制燈亮燈滅。會(huì)出現(xiàn)車開到一半車道變窄的情況,車卻開到了相反方向。
4.其實(shí)控制燈亮燈滅技術(shù)上計(jì)算機(jī)是可以實(shí)現(xiàn)的。
完
今天運(yùn)氣不錯(cuò),一到車站就能上車,有位置坐,開了幾個(gè)站都沒(méi)有老太太上車。今天司機(jī)開車想瘋了一樣把車開得很快。也許現(xiàn)在很晚了吧。工作到了收尾階段,不是很忙了,我還是晚回。也許我是習(xí)慣了吧。我習(xí)慣下班后修改一些bug或者優(yōu)化程序,這樣我能夠靜下心來(lái)。我該改改我的習(xí)慣了。
今天看了一篇文章,讓我想起了老子說(shuō)的信言不美,美言不信。善者不辯,辯者不善。知者不博,博者不知。意思是說(shuō),自己可以相信的、對(duì)自己真正有益的話不會(huì)好聽,但阿諛?lè)畛械暮寐犜捛f(wàn)不可以相信......
線程池的體驗(yàn),這里是簡(jiǎn)單的例子,不解釋了,只能意會(huì)不能言傳。
//第一個(gè)類
package thread;
import java.util.LinkedList;
public class ThreadPool {
private LinkedList tasks = new LinkedList();
public ThreadPool(int size) {
for (int i = 0; i < size; i++) {
System.out.println("new");
Thread thread = new ThreadTask(this);
thread.start();
}
}
public void run(Runnable task) {
System.out.println("run0");
synchronized (tasks) {
tasks.addLast(task);
tasks.notify();
}
}
public Runnable getNext() {
Runnable returnVal = null;
synchronized (tasks) {
while (tasks.isEmpty()) {
try {
System.out.println("waiting");
Thread.sleep(1000);
tasks.wait();
System.out.println("waited");
} catch (InterruptedException ex) {
System.err.println("Interrupted");
}
}
returnVal = (Runnable) tasks.removeFirst();
}
return returnVal;
}
public static void main(String args[]) {
final String message[] = { "zgw", "nake", "sunny", "piao" };
ThreadPool pool = new ThreadPool(message.length / 1);
for (int i = 0, n = message.length; i < n; i++) {
final int innerI = i;
Runnable runner = new Runnable() {
public void run() {
for (int j = 0; j < 25; j++) {
System.out.println("j: " + j + ": " + message[innerI]+" "+innerI);
}
}
};
pool.run(runner);
}
}
}
//---------------------
第二個(gè)類
package thread;
import java.util.LinkedList;
class ThreadTask extends Thread {
private ThreadPool pool;
public ThreadTask(ThreadPool thePool) {
pool = thePool;
}
public void run() {
while (true) {
System.out.println("gogogo");
// blocks until job
Runnable job = pool.getNext();
try {
job.run();
} catch (Exception e) {
System.err.println("Job exception: " + e);
}
}
}
}