這幾天看新聞知道番茄花園作者被警方逮捕,樹大招風(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)行
排序的算法是我們最常用的算法,初學(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.aygfsteel.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.jcp.org/en/jsr/detail?id=221
未完
當(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)容都很差。《Agile 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)??赡芪液芟矚geclipse了,生怕有一天開始收費(fèi),或者被收購(gòu),畢竟不是原滋原味。
??? eclipse發(fā)展太快,幾乎一個(gè)月一個(gè)Milestone,現(xiàn)在是3.2M6了,最后一個(gè)M。如果按照此速度4月要出3.2的stable build版本的RC1了。其中一項(xiàng)新特性是速度有所提升??纯次覟榱送鎗ava我機(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圖.
當(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é)合.
一年的開始......
埃及海難,人們大罵船長(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)安裝的包。
ok,先看看mysql能否正常工作
做完上面的步驟,然后把你編譯目錄的一個(gè)腳本COPY過(guò)去 2.安裝Apache1.3.29。
3.安裝PHP4.3.4 軟件獲?。篬url]http://www.php.net/downloads.php[/url]
正常的話,應(yīng)該能看到php的信息了,恭喜你的Apche+Mysql+PHP安裝成功。 |
讓Linux的中文字變得清晰--一個(gè)超級(jí)簡(jiǎn)單的方法
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);
}
}
}
}
1.一定時(shí)候重建索引
2.盡量避免用sql語(yǔ)句代替程序
3.復(fù)雜的insert update 在一個(gè)事物中同時(shí)處理..
4.exists 代替in
5.left join 不要關(guān)聯(lián) null
6. 主鍵就是聚集索引
7.將查詢條件做聚集索引
8.'a%' 比 '%a' 快
9.非操作符、函數(shù)引起的不滿足SARG形式的語(yǔ)句
不滿足SARG形式的語(yǔ)句最典型的情況就是包括非操作符的語(yǔ)句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外還有函數(shù)。下面就是幾個(gè)不滿足SARG形式的例子:
ABS(價(jià)格)<5000
Name like ‘%三’
有些表達(dá)式,如:
WHERE 價(jià)格*2>5000
SQL SERVER也會(huì)認(rèn)為是SARG,SQL SERVER會(huì)將此式轉(zhuǎn)化為:
WHERE 價(jià)格>2500/2
但我們不推薦這樣使用,因?yàn)橛袝r(shí)SQL SERVER不能保證這種轉(zhuǎn)化與原始表達(dá)式是完全等價(jià)的。 10. not 要少用
11.沒(méi)有用的字段不要查.
12.為key進(jìn)行order by
13 . 其實(shí)top 很好用
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 31 | 1 | 2 | 3 | 4 |
常用鏈接
留言簿(18)
我參與的團(tuán)隊(duì)
隨筆檔案(39)
- 2008年8月 (1)
- 2008年7月 (1)
- 2007年1月 (2)
- 2006年9月 (1)
- 2006年5月 (5)
- 2006年4月 (4)
- 2006年3月 (5)
- 2006年2月 (1)
- 2006年1月 (9)
- 2005年12月 (2)
- 2005年11月 (2)
- 2005年10月 (6)
收藏夾(1)
搜索
積分與排名
- 積分 - 451355
- 排名 - 119
最新評(píng)論

- 1.?re: 天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物
- 有這麼難嗎,
- --弟弟
- 2.?re: 效率低下
- 真是的,既然不是靜水流深,那就把家底一五一十的報(bào)上來(lái)
- --簡(jiǎn)單的生長(zhǎng)
- 3.?re: 天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物
- 幼稚,天主動(dòng),意為天道,天道運(yùn)行不息。君子當(dāng)效天道,錘煉意志,精神。一往無(wú)前,以證天道。地為坤,主靜,意指本源。君子當(dāng)應(yīng)地勢(shì),取長(zhǎng)補(bǔ)短,明心見(jiàn)性,外練體魄,內(nèi)修德行。
- --大號(hào)中華
- 4.?re: 天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物
-
灌灌灌灌灌灌灌灌灌灌灌灌灌灌灌
@對(duì)方的豐富的
- --的幾率
- 5.?re: 樹型Table的設(shè)計(jì)[未登錄](méi)
- 求一份,xuan0555@126.com
- --ff