
2006年1月5日
這幾天用TimerTask作了個框架,擔心超過十萬條數據的時候速度變慢,其實每秒十萬次的運行速度等到以后放在服務器上運行應該游刃有余吧,還不清楚,不過現在在我筆記本上運行得還可以,內存吃的很大,java就這毛病,程序員不能自由釋放內存。1G內存不夠用,我筆記本2G有分配不了,似乎虛擬內存java用不了,沒仔細做過實驗。
這幾天看新聞知道番茄花園作者被警方逮捕,樹大招風,槍打出頭鳥,很正常,從程序員的身份來講,盜版是要打擊的,不過我本身電腦里要付費的軟件都是盜版的,很矛盾,呵呵。
posted @
2008-08-21 23:54 nake 閱讀(2148) |
評論 (3) |
編輯 收藏
實在太久沒寫servlet了,應該至少1年了,那時候做了點皮毛,現在項目要求用到servlet的相關知識,同時我在blogjava的bolg又開張了。學習的過程將記錄在我的blog中。對比了一下netbean和eclipse感覺用netbean編寫servlet程序方便些,eclipse用了幾年,但是還是感覺每次要找好相關的jar需要花費太多時間,于是決定用netbean編寫了。
posted @
2008-07-12 15:15 nake 閱讀(1944) |
評論 (2) |
編輯 收藏
看看以下代碼:
將26個英文字母重復加了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);
可惜我的計算機不是超級計算機,得到的結果每次不一定一樣一般為 154735 左右。
也就是154秒。
我們再看看以下代碼
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);
?得到的結果為 16 有時還是 0
所以結論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當然這個數據不是很準確。因為循環的次數在100000次的時候,差異更大。不信你試試。
下一次我將解釋為什么StringBuffer 的效率比String 高這么多。
posted @
2007-01-14 12:24 nake 閱讀(4220) |
評論 (4) |
編輯 收藏
swt 簡單的托盤程序
java寫和操作系統相關的程序難度非常大。在java 6出現之前,如果你想實現一個托盤程序,最簡單的就是用swt了。
通過google我找到了一段代碼。
其實很簡單。主要的代碼如下:
?????????????final Tray tray = display.getSystemTray();
??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
??????????? Image image = new Image (display, 16, 16);
??????????? trayItem.setImage(image);
知道了重點,事情變的很簡單了。看看所有程序
//-----------------
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 默認情況下不允許shell被繼承
??? //所以我重載了父類的方法
??? protected void checkSubclass() {
???????? }
}
//--------------------
如果你想成功運行以上代碼,你最好在eclipse下新建一個swt的類。具體操作你搜索一下吧。
但是上面的代碼只是加入了托盤,這可能是最簡單的實現托盤的程序了。我們加入事件處理,讓程序能夠最大和最小化。然后把托盤用圖片來表示。
詳細的代碼不參考
下載
到eclipse里運行
posted @
2007-01-03 22:58 nake 閱讀(3413) |
評論 (4) |
編輯 收藏
從8.1號開始,連續加班,再過1小時結束。
posted @
2006-09-21 02:39 nake 閱讀(976) |
評論 (4) |
編輯 收藏
排序的算法是我們最常用的算法,初學程序,每個人都嘗試過排序。但只是局限于簡單的排序。
如將下列數字進行排序
1,3,5,8,3,6
于是我們得出結果
1,3,3,5,6,8
將下列字母(字符)進行排序
a,i,e,f,w,s
于是我們得出結果
a,e,f,i,s,w
但是我們遇到的情況就不是如此簡單了。如給公司里的商品進行排序,我們很輕易的想到按照商品的名稱排序不就完了,而且簡單明了。但現實并如我們相信般簡單。同一商品名稱可以有不同的批次,進貨時間,可能還會有單價的不同。顯然只根據商品名稱排序是不合理的。
再舉個簡單例子然后用程序實現。如公司要將員工進行排序(不要說領導排在前面),假設我們的需求比較復雜。先進行姓排序,誰的姓拼音靠前,誰就排前面。然后對名字進行排序。恩.如果同名,女性排前頭。如果名字和性別都相同,年齡小的排前頭。ok,一個也不算復雜的需求。
如果對java比較熟悉的會知道java.util.Comparator 接口。要實現里面的函數
?int compare(Object o1, Object o2) 返回一個基本類型的整型,返回負數表示o1 小于o2,返回0 表示o1和o2相等,返回正數表示o1大于o2。
于是我們設計的人員類要有幾個變量,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
下面是要實現比較器
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));
????? }
??? };
? }
}
以上代碼有可能因為瀏覽器的布局自動換行。
compare(Person o1, Person o2)的返回值看起來比較別扭。最簡單的是
??? public int compare(Boolean o1, Boolean o2) {
???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
?????? }
o1和o2相等返回0,否則o1如果是true 就表示o1大于o2。
再嘗試輸出結果看看
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]);
? }
? }
}
輸出結果:
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
仔細理解java的Comparator會給你寫排序帶來很大幫助
?
posted @
2006-05-27 17:20 nake 閱讀(2286) |
評論 (5) |
編輯 收藏
?
軟件項目,特別是給企業用戶的項目,實施過程大多辛苦,而且一部分問題不在于軟件本身。
總結一下項目最后驗收階段案例之一。
案例:項目已經按照客戶確認的調研文檔完成實施工作。客戶的一把手提出新需求。
此一把手H,H精通業務,對電腦一竅不通。H對手下電腦部負責人Z提出“要對業務進行風險管理,把風險大的業務提出來。”,一句話令Z頭大。Z苦惱H沒有定義什么是風險大,即使H說明風險大的條件,現有的軟件架構,數據模型能否實現還是未知數。實現此功能成為不可完成的任務。持續下去Z和項目經理W(軟件公司負責人)都面臨困境。
Z會被認為沒有完成領導安排的工作(實際上他忙的焦頭爛額)。
W進入兩難,一方面客戶要求的完成不了,另一方面面臨公司的的項目要拖延。
解決辦法:1.按章辦事,調研文檔已經寫清楚無此需求。直接拒絕。此為下策,沒辦法才用,但是關鍵時刻很有用。
2.引導+忽悠。對付H這種老總要從其公司內部出發。分析滿足他需求所需要的條件。一般要犧牲部分工作人員的工作時間。然后把影響放大,嚇唬他。如果可以的話可以找他們的相關人員幫忙,讓他聽到不同的聲音,讓他放棄此念頭。因為軟件他是外行,談論軟件時心里沒底氣,有自己人反對,心虛。
比如從財務著手比較有效。要滿足H的需求改變了財務的核算體系,原有的數據都要加上某寫核算項,不能保證數據準確性,而且大大增加了財務工作量,而且不符合會計制度(忽悠)。上策!
posted @
2006-05-16 17:46 nake 閱讀(3245) |
評論 (2) |
編輯 收藏
轉載請注明出處:http://www.tkk7.com/nake/
???自從
java
發布的第一個版本開始就已經包含
JDBC
了。目前已經有
10
個年頭了。
JDBC4.0
將要被打包到
java6.0
里(
java SE
是
J2SE
新的名字)。它展現設計的重大提升和提供更加豐富的
API
,更加重視簡易開發和提高生產力
。
??????
本文將討論一些
JDBC
在改善設計和提高性能上的重要的變化。但是不能列舉每一個變化。
注解和泛型
我想你已經了解了包含在
JAVA 5.0
的注解(
annotations
)
和泛型(
generic
也有翻譯范型)。
JDBC4.0
也引進了注解和泛型
DataSet
,這使得執行
sql
語句和
SQL? DML
(
data manipulation? language
)
定義變的簡單。
??????
在新的
API
里定義了一套
Query
和
DataSet
接口。
Query
接口定義了一套方法,這些方法描述了
SQL
的
select
和
update
語句。而且詳細介紹了結果集如何綁定為一個
DataSet
的。因為泛型所以
DataSet
是可以帶參數的。因此可以說
DataSet
接口是類型安全的(
type-saft
)
.
所有
Query
接口都要從
BaseQuery
接口繼承。可以通過
Connection.createQueryObject()
或者
DataSource.createQueryObject()
得到Query對象。
一個DataSet接口都繼承java.util.List。
? DataSet
是有列概念的數據集,能從
Query
接口得到,并且可以帶有參數。
DataSet
可以在連接和斷開連接的情況下使用。從而
DataSet
實現了
ResultSet
(連接)
或者
?
CachedRowSet
(可以斷開連接)。因為DataSet是java.util.List的子接口,所以可以通過java.util.Iterator來訪問每一行。
DataSet
接口可以帶系統或者用戶自己定義的類作為參數。通過兩種方法你可以實現:構造函數或者
JavaBeans
對象,任何一個辦法都能達到將用戶自定義的類綁定到結果集的列里。但是在其它支持
JavaBeans
的框架里,用
JavaBeans
對象的實現就顯更加容易使用。
下面簡單舉例說明如何通過新的
API
創建和運行
SQL
查詢。用用戶自定義的類來定義結果集。(拷貝時候小心有制表符)
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 ();
?
異常處理的增強:
1.??????
為
SQLException
分為兩類
transient
和
non-transient
。
2.??????
支持連鎖的異常。
3.??????
繼承了
Iterable
接口。
因為繼承了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
未完
posted @
2006-05-11 22:26 nake 閱讀(6768) |
評論 (4) |
編輯 收藏
?????????陳水扁一邊嗆美,另一邊卻熱情對待布什夫人;他前天(2006-5-9)在哥斯達黎加總統就職大典上兩度“突襲”美國總統夫人勞拉的畫面,昨天一整天在臺灣島內電視熱播。
當時正舉行哥國總統就職大典,陳水扁坐在第一排,勞拉則坐在第二排。阿扁不時轉頭瞄向左后方的勞拉,等到表演節目開始時,扁跨步越過身邊所有人走到勞拉身旁寒暄。據說,扁邀請勞拉到臺灣訪問,勞拉則禮貌性回答“謝謝”。
?????????至典禮結束時,全場嘉賓起身鼓掌,扁忽然再一個箭步沖向勞拉。勞拉表情有些錯愕,但雙手繼續鼓掌。扁此時伸出右手,懸空一陣后主動去輕抓勞拉正在鼓掌的手,迫使勞拉不得不與他相握。手一握到,扁立刻雙手緊抓不放,左手還不斷拍打,勞拉的另一只手此時卻不期然地移到自己胸前捂住,還下意識地抓緊了衣領。同時,扁的傳譯員卻已擺好了相機,扁示意勞拉對著鏡頭微笑,終于完成了這張與總統夫人微笑握手的歷史合照。
原文出自
http://www.zaobao.com/gj/zg060511_501.html
posted @
2006-05-11 19:23 nake 閱讀(496) |
評論 (1) |
編輯 收藏
? 整整一天的時間都在查bug,對數,然后找到錯誤的原因。需要我認真,仔細,不要放棄,不要繞過困難。找bug需要方法和耐心,要記錄下多種數據和過程,不要做無頭蒼蠅,如果數據像今天一樣多要先給數據分類分段排除。
posted @
2006-05-09 23:50 nake 閱讀(373) |
評論 (0) |
編輯 收藏
???最近看2本書,一本關于ajax的,一本是《Agile Software Develpment》。先看ajax,我實在不想公布它的書名,感覺被騙了,廣告做得好,翻譯和內容都很差。《Agile Software Develpment》還行,同時也學習了英文,是本值得細讀得書。
posted @
2006-04-24 22:39 nake 閱讀(397) |
評論 (0) |
編輯 收藏
???周六周日抽空完成了Table類的排序和搜索功能。搜索速度還能接受,搜索2萬條記錄沒感覺到停頓,更多的記錄我還沒測試,排序就夠嗆,起初花了30分鐘還沒完成,郁悶!comparator要進行優化。
? 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;
??? }
? }
感覺應該還好,應該是其它地方沒處理好。
接下來我要處理
1.改變JTable原來的UI 在table底下加入可以匯總的表格
2.JTable類在瀏覽器上的表現
3.dataset直接的關聯在table中實現
posted @
2006-04-18 20:43 nake 閱讀(446) |
評論 (0) |
編輯 收藏
? ? 好像是兩年前第一次接觸eclipse,不記得版本號了。那時候eclipse小有名氣,可能是本身喊的出名字的工具就只有jb。公司買的是jb6,但是我們都貪新,用剛出的jb9。結果因為用盜版被borland協同工商罰了好多錢(你不信就開防火墻,用jb調試程序,看看防火墻情況)。從此公司開始使用eclipse。
?? ?正是eclipse由IBM等出資和開源的緣故有人說eclipse是六大門派里的少林,聽起來有點道理。武當派(jboss)已經歸于redhat名下(我不喜歡jboss因為他的名字里有個Boss)。可能我很喜歡eclipse了,生怕有一天開始收費,或者被收購,畢竟不是原滋原味。
??? eclipse發展太快,幾乎一個月一個Milestone,現在是3.2M6了,最后一個M。如果按照此速度4月要出3.2的stable build版本的RC1了。其中一項新特性是速度有所提升。看看我為了玩java我機器的配置吧。
posted @
2006-04-13 23:27 nake 閱讀(237) |
評論 (0) |
編輯 收藏
今晚無聊 用google google 了google 有2,580,000,000項符合查詢結果。無意中有看到新成員froogle 。google家族成員越來越多,可是中文版出得就相對慢,而且不一定能順利在中國推廣,或者以后google沒個家族成員都有類似提示據當地法律法規和政策,部分搜索結果未予顯示。
喜歡google,喜歡他簡潔、快速。
posted @
2006-04-05 00:32 nake 閱讀(238) |
評論 (0) |
編輯 收藏
Table類的mind圖.

當然還有TableModel 沒有畫進來,因為它將會是變化多端的.code_name_map也沒有畫.還有輔助錄入以前寫過就不說了.
事件的處理以后再花時間寫清楚了.
posted @
2006-03-29 23:29 nake 閱讀(944) |
評論 (3) |
編輯 收藏
今晚一邊考慮了DataRow,Cell,DataSet,DataTable,Connect,DataProvider的構架一邊看 《一球成名》,覺得很愜意.
posted @
2006-03-28 23:07 nake 閱讀(429) |
評論 (0) |
編輯 收藏
我的工作就是和數據庫打交道,數據庫當然離不開dataset,用了幾年borland的dx.jar. borland這次看來真的玩完了.回想borland的歷史,每次危機時刻都有英雄出現,扭轉局面.但愿這次也如此.
我近段時間要完成的工作:
1.完善我的dataset.
2.實現table里的過慮,快速查找等功能
接下來我才考慮用以上模塊實現項目管理軟件.
posted @
2006-03-27 23:57 nake 閱讀(265) |
評論 (0) |
編輯 收藏
Subversion 已經代替了CVS,至少在
SourceForge上是如此.我花了一個晚上時間玩玩.原來在公司用vss,感覺能用就將就了.畢竟用哪個版本控制器不重要.
posted @
2006-03-27 23:43 nake 閱讀(232) |
評論 (0) |
編輯 收藏
java 的Table類采用了MVC模式,所以設計出多種視圖相對容易.
但是在工作中為了如果Table里的數據能用Tree的方式組織起來,數據會更加緊湊,結構清晰.
效果如圖:但是往往工作中數據沒那么少,那么簡單

下圖是樹型圖的思維圖

基本上程序上要寫的地方有:
1.實現TreeModel接口,
同時實現TableModel中幾個必要函數
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能相互結合使用
2.繼承AbstractTableModel
將1中繼承TreeModel和此結合
3.繼承TableCellRenderer
要覆蓋paint,updateUI 要實現getTableCellRendererComponent
4.TreeModelListener的實現了
整體的代碼不長 但花了我不少時間.需要的話留下mail吧.
此代碼還有不完善的地方.如和sql結合.
posted @
2006-03-11 13:15 nake 閱讀(2912) |
評論 (45) |
編輯 收藏
春節是中國人傳統節日一年的開始。
一年的開始......
埃及海難,人們大罵船長不該跑該死,埃及人都學會了“都坐下不要動,讓領導先走”。
美國防部將中國列為“最具軍事威脅國家”,米國人本應該出中文版《四年防務評估報告》,competition 對抗;競爭行為,如為了利益或獎品;敵對 。 menace 威脅;可能發生之危險;威脅。我英文不好就只能借助英語字典了。
菲律賓體育場發生踩踏事件,他死因為他窮。
IAEA理事會決定把伊朗核問題報告安理會。絕不讓流氓國家menace 我們泱泱大國。
我,我把我的程序整理了一遍,加了注釋,打成工具包。
我,制定了一份偉大的、可持續使用的、為別人打工的工作計劃(三的計劃)。
posted @
2006-02-05 21:45 nake 閱讀(302) |
評論 (0) |
編輯 收藏
在http://www.mysql.com/ 下載Query Browser
運行時需要libstdc++.so.5
原來它藏在compat-libstdc++-8-3.3.4.ix86_64.rpm
找了我超過4個小時。在http://download.fedora.redhat.com/pub/fedora/linux/core/4/x86_64/os/Fedora/RPMS/找到,需要下載下來然后
rpm -ivh compat-libstdc++-8-3.3.4.ix86_64.rpm
當然在這之前可能要chmod -R 755 compat-libstdc++-8-3.3.4.ix86_64.rpm
posted @
2006-01-27 03:01 nake 閱讀(315) |
評論 (0) |
編輯 收藏
原文來自http://fanqiang.chinaunix.net/app/web/2005-08-30/3548.shtml
Linux+Apache+Mysql+PHP典型配置 |
作者:張微波 來源:5ilinux
|
|
|
Linux+Apache+Mysql+PHP典型配置
調試環境:Redhat9.0 Apache1.3.29 Mysql3.23.58 PHP4.3.4 Linux系統的安裝我就不講了,這是基本功,其實這篇文章在類似Redhat的其他linux也應該通用,大家只要掌握我提供的方法就行。記得安裝 Redhat9。0的時候不要安裝系統默認的apache,mysql和php以及相關的軟件。已經安裝的請用rpm -e * 刪除已經安裝的包。
1.安裝Mysql3.23.58
其實老實說直接安裝Mysql官方網站提供的rpm包也是一個比較可行的辦法,他的官方網站的rpm包的提供基本跟tar包發行是同步的,這點我比較喜歡,至少安裝rpm包的在后面的調試中不會出現mysql庫文件找不到的情況。但這里還是有必要講一下自定義安裝的步驟,畢竟網友自定義安裝的還說挺多的。
軟件獲取:[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安裝的目標目錄 #sysconfdir=/etc my.ini配置文件的路徑 #localstatedir=/var/lib/mysql 數據庫存放的路徑 安裝完以后要初始化數據庫,當然你是升級的話不用做這步; /usr/local/mysql/bin/mysql_install_db 如果系統沒有mysql這個用戶的話,最好做以下這步: useradd -M -o -r -d /var/lib/mysql -s /bin/bash -c "MySQL Server" -u 27 mysql 然后我啟動mysql /usr/local/mysql/bin/safe_mysqld |
ok,先看看mysql能否正常工作 mysql -uroot mysql
一般情況下都是不能正常鏈接數據庫,錯誤提示一般為:
ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
其實網上大家問的最多的都是整個問題,說什么鏈接不到mysqld.sock,其實大家不妨看看mysql的錯誤日志就明白怎么回事,我這里的錯誤日志是在/var/lib/mysql/*.err.
你會發現mysql只所以不能啟動,是因為/var/lib/mysql的權限不允許mysql服務訪問,英文mysql默認是調用mysql用戶來啟動服務的,好了,既然知道是什么原因找到不能啟動,那就簡單了。我們只要chown -R mysql:mysql /var/lib/mysql就行,如果還是啟動不了,再慢慢調試權限,反正一般啟動不了都是權限的問題。
如果大家還是不能啟動不了的話,那就用我的比較繁瑣的權限的設置,反正我每次都是這么做的,一般不會有問題,見下:
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 |
做完上面的步驟,然后把你編譯目錄的一個腳本COPY過去
cp support-files/mysql.server /etc/rc.d/init.d/mysqld chkconfig --add mysqld 用ntsysv設置使mysql每次啟動都能自動運行。
好了,至此mysql安裝完畢,你可以這樣起動你的mysql服務
/etc/rc.d/init.d/mysqld start
下面這步比較關鍵:
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql ln -s /usr/local/mysql/include/mysql /usr/include/mysql 大家可以不做這步,大可以在編譯其他軟件的時候自定義myslq的庫文件路徑,但我還是喜歡把庫文件鏈接到默認的位置,這樣你在編譯類似PHP,Vpopmail等軟件時可以不用指定mysql的庫文件地址。
2.安裝Apache1.3.29。
我沒有選擇安裝Apache2.0是我對他還是不放心,因為網上最新公布的apache的漏洞基本上是針對2.0,當然大家可以自己選擇安裝相應的版本。我這里講的都是采用DSO動態編譯的方法編譯Apache.
tar zvxf apache_1.3.29.tar.gz cd apache_1.3.29 修改src/include/httpd.h 增大最大線程數 #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 |
# 這里我們通過enable-module參數告訴設置腳本,我們需要啟動so和rewrite模塊,so模塊是用來提DSO支持的apache核心模塊,而rewrite模塊則是用意實現地址重寫的模塊,由于rewrite模塊需要DBM支持,如果在初次安裝時沒有編譯進apache,以后需要用到時需要重新編譯整個apache才可以實現。為此除非你可以確定以后不會用到rewrite模塊,否則還是建議你在第一次編譯的時候把rewrite 模塊編譯好。
enable-shared=max
這個參數的作用時編譯apache時,把除了so以外的所有apache的標準模塊都編譯成DSO模塊。而不是編譯進apache核心內。
好了安裝apache很簡單的哦,啟動apache看看
/usr/local/apache/bin/apachectl start
然后用ie看[url]http://你的服務器地址。應該能看到熟悉的apache羽毛標志。[/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 |
# 我這里由于服務器需要用到GD庫,所以加了一些支持GD的編譯參數,GD直接用了redhat自帶的GD庫,大家沒有安裝的話可以從安裝盤安裝,注意除了安裝GD以外,還要安裝libjpeg,libpng等庫文件。另外--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!重新啟動一下apache服務器 /usr/local/apache/bin/apachectl restart 然后寫個php測試頁info.php:內容如下 <?php phpinfo(); ?> |
正常的話,應該能看到php的信息了,恭喜你的Apche+Mysql+PHP安裝成功。 |
posted @
2006-01-26 20:22 nake 閱讀(541) |
評論 (0) |
編輯 收藏
Fedora中的中文字體是模糊的,總有種霧里看花的感覺,看久了眼鏡很不舒服。網上也有很多方法將字體改得清晰。基本上都是從windows中拷了
simsun字體后,再修改好幾個配置文件。往往會改得很郁悶,還一個不小心打錯幾個字母,字體就變為默認的很難看的仿宋體。
自己也郁悶了好久之后,網上看了一篇很強的方法,超級簡單,又很實用:
1:進入下面的文件夾
[root@S01 ~]#cd /usr/share/fonts/chinese/TrueType
2:刪除:gkai00mp.ttf/gbsn00lp.ttf/bsmi00lp.ttf/bkai00mp.ttf四個字體文件
[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了,怎么樣,簡單吧
simsun.ttc可以在windows中的%systemroot%windows/Fonts文件夾下拷貝。
在linux 中設置java的環境
vi /etc/profile.d/java.sh
這樣可以在所有的用戶中使用
在新的java.sh中輸入以下內容:
#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
posted @
2006-01-26 08:42 nake 閱讀(408) |
評論 (0) |
編輯 收藏
畢業后就沒用linux了,今晚裝了Fedora4
64位的.感覺一般.redhat5的時候我就稍微用過.不過安裝過程很快提示是15分鐘.我裝了4G的數據.裝完后就啟動
eclipse3.1.0M6.死機,重起,再啟動,還死機. 郁悶!不過adsl很容易設置.啟動IM,不錯雖然和m s n
的樣子不一樣但是還是可以用.
posted @
2006-01-20 01:40 nake 閱讀(283) |
評論 (2) |
編輯 收藏
今天坐車回來突然有個想法,我把它記錄下來。
在廣州上下班時間主要交通路線一定會塞車,而且通常是沒有交通意外,紅綠燈沒壞,交警們還在的情況下發生。部分原因是因為廣州的主要商業區比較集中,市民的居住地也集中在幾個方向,這樣一來就會出現上下班時間集中在某個方向的車道塞車,而相反方向的車道卻被閑置著。

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

如上圖 1,2,3 分別代表埋在路表面的黃燈 平時默認2亮,在出現塞車時可以靈活的調整1,3燈是否為亮。通過調整塞車車道的寬度來緩解廣州的路況。我覺得是可行的辦法。
1.從分利用了道路資源,不會出現一邊道路緊張一邊卻被閑置。
2.在路表鋪上路燈的成本比每天塞車的成本低(我沒調查過)
但是還是會面臨各種問題
1.沒有相關法規規定,路表的指示燈可以作為指揮交通。
2.即使有相關法規出臺。廣州的司機大老會買單嗎?誰來監管。
3.即使可以通過電子眼來監管司機。指示燈誰來控制?如何控制燈亮燈滅。會出現車開到一半車道變窄的情況,車卻開到了相反方向。
4.其實控制燈亮燈滅技術上計算機是可以實現的。
完
posted @
2006-01-17 21:39 nake 閱讀(1097) |
評論 (10) |
編輯 收藏
今天運氣不錯,一到車站就能上車,有位置坐,開了幾個站都沒有老太太上車。今天司機開車想瘋了一樣把車開得很快。也許現在很晚了吧。工作到了收尾階段,不是很忙了,我還是晚回。也許我是習慣了吧。我習慣下班后修改一些bug或者優化程序,這樣我能夠靜下心來。我該改改我的習慣了。
今天看了一篇文章,讓我想起了老子說的信言不美,美言不信。善者不辯,辯者不善。知者不博,博者不知。意思是說,自己可以相信的、對自己真正有益的話不會好聽,但阿諛奉承的好聽話千萬不可以相信......
posted @
2006-01-10 22:54 nake 閱讀(356) |
評論 (2) |
編輯 收藏
線程池的體驗,這里是簡單的例子,不解釋了,只能意會不能言傳。
//第一個類
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);
}
}
}
//---------------------
第二個類
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);
}
}
}
}
posted @
2006-01-08 22:58 nake 閱讀(287) |
評論 (0) |
編輯 收藏
我新的作品就要開始,她將開源,春節后辭職完成她。
1.一定時候重建索引
2.盡量避免用sql語句代替程序
3.復雜的insert update 在一個事物中同時處理..
4.exists 代替in
5.left join 不要關聯 null
6.
主鍵就是聚集索引 7.將查詢條件做聚集索引
8.'a%' 比 '%a' 快
9.非操作符、函數引起的不滿足
SARG形式的語句
不滿足SARG形式的語句最典型的情況就是包括非操作符的語句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外還有函數。下面就是幾個不滿足SARG形式的例子:
ABS(價格)<5000
Name like ‘%三’
有些表達式,如:
WHERE 價格*2>5000
SQL SERVER也會認為是SARG,SQL SERVER會將此式轉化為:
WHERE 價格>2500/2
但我們不推薦這樣使用,因為有時SQL SERVER不能保證這種轉化與原始表達式是完全等價的。
10. not 要少用
11.沒有用的字段不要查.
12.為key進行order by
13 . 其實top 很好用
posted @
2006-01-05 19:31 nake 閱讀(392) |
評論 (0) |
編輯 收藏