Thứ Năm, 19 tháng 3, 2009

Project Dark Star – start Server: Helloworld


Quay trở lại vấn đề Start Server & làm cho Server chào Helloworld – điều mà không phải ai cũng đủ kiên trì làm được với bài tut trước. Bài tut này sẽ trình bày lại một cách đơn giản cách Start Server, bỏ qua việc giới thiệu & quảng cáo về PDS.

C      Công việc sẽ chia thành mấy bước thế này:




- Build Path cho các file .jar trong thư viện của PDS vào project


- Tạo class HelloWorld


- Tạo thư mục conf


- Viết hello.xml



Trước hết, muốn làm việc với PDS thì phải down nó về đã. Down ở đây:


http://www.projectdarkstar.com/current-distribution.html


download và giải nén 2 gói Project Darkstar Server, source & binary Project Darkstar Java Client SDK, source & binary là đủ dùng.


Bây giờ tạo một project Java, ví dụ tên là PDSHelloServer.


1.    1. Build Path: (lấy thư viện của PDS Server)


Chuột phải vào System library-> Build Patch -> Configure Build Path -> Add External Jars. Sau đó chỉ đường dẫn vào sgs-server-dist->lib, chọn tất cả file đuôi jar -> ok . Sẽ xuất hiện thư mục Referenced Library.


2.    2. Tạo 1 package tên là helloServer trong project, copy class HelloWorld trong sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson1, nhớ đổi tên package


3.   3. Tạo thư mục conf trong Project copy các file Helloworld.boot , Helloworld.properties , logging.properties trong sgs-server-dist-0.9.8/tutorial/conf vào thư mục conf.



Chỉnh sửa một số thông tin trong các file này như sau:

File HelloWorld.boot:




SGS_PROPERTIES=${SGS_HOME}/HelloWorld/conf/HelloWorld.properties



SGS_LOGGING=${SGS_HOME}/HelloWorld/conf/logging.properties



- Fi   File  HelloWorld.properties:




com.sun.sgs.app.name=HelloWorld


com.sun.sgs.app.root=HelloWorld/data/HelloWorld


com.sun.sgs.app.port=1139


com.sun.sgs.app.listener=helloServer.HelloWorld => package chứa class HelloWorld



4.  4. Viết hello.xml

Tạo ra 1 file hello.xml trong project, nội dung như sau:





<project default="jar">


<!--bắt buộc phải có target clean trong mỗi ant -->


<target name="clean">


<delete dir="jar"></delete>


</target>


<!-- nén file từ basedir thành destfile (trong thư mục project của minh)-->


<target name="jar">


<mkdir dir="jar"/>


<jar destfile="jar/HelloWorld.jar" basedir="bin"/>


<!--copy file jar-->


<!--ở đây folder sgs-server-dist-0.9.8 được đặt ở địa chỉ E:/mydata/projectdarkstar, để chạy được phải sửa đường dẫn tương ứng trên máy cá nhân -->


<copyfile dest="E:/my data/projectdarkstar/sgs-server-dist-0.9.8/lib/HelloWorld.jar" src="jar/HelloWorld.jar"/>


<copydir dest="E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/conf" src="conf"></copydir>


<!--delete để có thể chạy lại application-->


<delete dir="E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/data"></delete>


<!--start application với tham số bên dưới-->


<java fork="true" jar="E:/my data/projectdarkstar/sgs-server-dist-0.9.8/bin/sgs-boot.jar" >


<arg value="E:/my data/projectdarkstar/sgs-server-dist-0.9.8/HelloWorld/conf/HelloWorld.boot"></arg>


</java>


</target>


</project>




Right click vào file hello.xml này, chọn Run As --> Ant Build, trên màn hình console sẽ log lại dòng Hello World!


Lưu ý, khi start lại Server lần 2, nếu gặp lỗi không xóa được /sgs-server-dist-0.9.8/HelloWorld/data








thì vào task manager và kill bớt mấy process từ lần chạy trước. Good luck!

Copy and paste Programming VIA Copy and paste Writing



I was always against Copy and Paste programming. I condemned people who use this practice as discrediting the honorable profession of The Programmer. This evil activity inflates application code without adding anything useful. This shameful practice causes various complications - more code, more things to remember, needless complexity, and difficulty to manage and synchronize related changes in the future. But at some point, I admitted to myself - things are not so black and white. I do Copy and Paste in my code, it is difficult to resist this seductive activity.

The only indulgence is that I’m very keen to eliminate bad effects of Copy and Paste before finishing my task.

I use two main approaches for writing new code. The first is Top-Down - I have clear design ideas how I should program and I know what classes and components to use. I go ahead and write code from scratch using my memory and power of intellect :). There are few problems with this approach. Unfortunately, my memory is not so great and knowledge is not so vast. Regularly I have new tasks that I don’t know or don’t remember how to program. Sometimes I don’t get immediately what other people programmed without debugging. And often I want to save time and avoid re-implementing the same idea again. And that is why I also use the second approach - Bottom-Up. I copy and paste code first. And after I figure out how this code works, how to use, fit and improve it.

When is Copy and Paste approach useful?


Shamelessly, I can come up with few cases:
1. Work by example - you found new code through search and want to  use it immediately to solve your problems.
2. Quick start - you copy code (including your old code) to save time.
3. Test in the new context - you want to quickly assess if code will be correctly running in the context of your application
4. Too hard to reuse - if you cannot reuse, just copy code. For example, you don’t have time to build common framework with separate application or another team owns code and don’t want you to touch and spoil it.
5. Series of experiments - you try to find the best way to solve a problem and copy code to try if it solves a problem well.

How to eliminate bad effects of Copy and Paste


Now I’m going to return to canonical view on evilness of Copy and Paste. Even if you have legitimate reason to use Copy and Paste, it is acceptable only on temporary basis before you commit your code or your team granted absolution (probably for very short time) :).
Therefore, after committing Copy and Paste scandalous act, do following:
1. Understand what have you done - any code that you don’t understand is ineffective for future use, and potentially excessive, wasteful and dangerous.
2. Clean, minimize and shape - remove all useless, over-engineered and questionable pieces; consider yourself as a jeweler, who is converting rough crystals in beautiful diamonds that fit well into solid code and concepts in your program.
3. Refactor and Integrate - use refactoring techniques to integrate new cleaned code into existing application: improve design, simplify and increase power of your code.
4. Learn - the best outcome of this sinful activity is gained knowledge and experience that will make Copy and Paste unnecessary next time.

With age and experience of harsh programming reality, I’m becoming less purist and more pragmatic. I have started to accept everything what makes me effective. The only rule - I shouldn’t be ashamed of my code after the finish… even if I did Copy and Paste couple times ;)

What do you think?

source  : http://softwarecreation.org/2008/a-few-words-in-defense-of-copy-and-paste-programming/

Thứ Tư, 18 tháng 3, 2009

Project Dark Star - connecting server and client

Ở bài tut trước đã hướng dẫn cách để làm cho Server “chạy”. Mục tiêu tiếp theo sẽ là làm sao để Server nói chuyện với Client, phức tạp hơn là làm cho các Client nói chuyện với nhau thông qua Server. Bài tut này sẽ hướng dẫn cách làm cho Server & Client nói chuyện với nhau.


Cụ tỉ sẽ gồm các công việc sau:


- Start Server


- Login: Start Client & client login vào server, Server cho client login vào


- Echo : Client gửi cho Server 1 chuỗi bất kì, Server gửi trả cho Client đúng chuỗi đó



1. Start Server : xem bài tut trước hoặc bài này

2. Login:


- Tạo một project mới quản lý Client, ví dụ tên là PDSHelloClient.


o Add các file .jar trong \sgs-client-0.9.8\lib theo cách tương tự như đã làm với Server


o Tạo 1 package mới và copy file HelloUserClient.java trong \sgs-client-0.9.8\tutorial\src\com\sun\sgs\tutorial\client\lesson1 vào.


- Quay về project Server:


o Copy class HelloUserSessionListener ở \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5.


o Trong class của Server:


- Thêm khai báo logger:




/** The {@link Logger} for this class. */
private static final Logger logger =
Logger.getLogger(HelloWorld.class.getName());


- đổi phương thức loggedIn thành:


public ClientSessionListener loggedIn(ClientSession session) {


// User has logged in


logger.log(Level.INFO, "User {0} has logged in", session.getName());



// Return a valid listener


return new HelloUserSessionListener(session);


}


Để server cho phép Client login và log lại thông tin. Phương thức này sẽ trả về một instance của HelloUserSessionListener.



(Hoặc copy Class HelloEcho trong \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5 )

- Bây giờ Run lại Server & Run Client, xong nhiệm vụ 2


3. Echo:


- Phía Server:


o Copy class HelloEchoSessionListener từ \sgs-server-dist-0.9.8\tutorial\src\com\sun\sgs\tutorial\server\lesson5.


o Trong class của Server: đổi phương thức loggedIn thành:


public ClientSessionListener loggedIn(ClientSession session) {


// User has logged in


logger.log(Level.INFO, "User {0} has logged in", session.getName());



// Return a valid listener


return new HelloEchoSessionListener(session);


}


Khác biệt duy nhất ở đây so với phương thức loggedIn cũ là phương thức này trả về một instance của HelloEchoSessionListener


o Bây giờ Run Server đi.


- Phía Client: Run Client và type vào text box một string bất kì, sẽ nhận được phản hồi từ phía Server.


Xong. Bây giờ tìm cách để Client trò chuyện với Client đi :D.

Thứ Sáu, 13 tháng 3, 2009

DarkStar Project

1. DarkStar là gì ?
Project DarkStar (PDS) là  một dự án mã nguồn mở viết bằng java được phát triển nhằm đơn giản hóa việc phát triển các dự án như  game trực tuyến trên qui mô lớn, xây dựng một thế giới ảo, hoặc các ứng dụng mạng xã hội. Thay vì phải mất thời gian code, thì nay tất cả đều có sẵn trong PDS.
2.Cụ thể PDS dùng để làm gì ?
-PDS dùng để xây dựng Server và Client cho ứng dụng.
-Tạo một mạng Game lớn, đồ sộ, đáng tin cậy, ổn định, quan trọng là không bị đứt khi gặp lỗi .
3.Cài đặt và chạy Darkstar :
Dowload Project tại trang chủ  http://www.projectdarkstar.com/ để có phiên bản mới nhất (có 2 gói, một là sgs-server-dist dùng cho server  và sgs-client-dist cho client, ở đây sẽ lấy ví dụ ở sgs-server-client) .
Sau khi giải nén, ta được thư mục sgs-server-dist. Trong thư mục này có những hướng dẫn cụ thể, những bài thực hành của PDS trong mục tutorial. Dưới đây là hướng dẫn để áp dụng PDS vào dự án của mình.
4. Áp dụng: (Lesson 1 : Hellowolrd)
- Vào Eclipse, tạo Project java.
- Trong thư  mục src : tạo package chứa class HelloListener (copy từ  /sgs-server-dist-0.9.8/tutorial/src/com/sun/sgs/tutorial/server/lesson1)
- Lấy thư viện của sgs-server-dist : Chuột phải vào System library-> Build Patch -> Configure Build Path -> Add External Jars. Sau đó chỉ đường dẫn vào sgs-server-dist->lib, chọn tất cả file đuôi jar -> ok . Sẽ xuất hiện thư mục Referenced Library.
- Tạo thư mục conf trong Project, copy các file Helloworld.boot , Helloworld.properties , logging.properties trong sgs-server-dist-0.9.8/tutorial/conf vào thư mục conf.
- Cuối cùng, tạo một file.xml (dùng ant xml để chạy vì đơn giản hơn  so với việc viết bằng ngôn ngữ  khác các chức năng). File có nội dung như sau :
<!--Dùng ant thay cho code java, khả năng tương thích cao, được dịch ngay khi compile,
đây là phương pháp đơn giản, dễ sử dụng -->
<project default="jar">
<!--bắt buộc phải có target clean trong mỗi ant -->
<target name="clean">
<delete dir="jar"></delete>
</target>
<!-- nén file từ basedir thành destfile (trong thư mục project của minh)-->
<target name="jar">
<mkdir dir="jar"/>
<jar destfile="jar/phom.jar" basedir="bin"/>
<!--copy file jar-->
<copyfile dest="/home/legend/Desktop/sgs-server-dist-0.9.8/lib/phom.jar" src="jar/phom.jar"/>
<copydir dest="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/conf" src="conf"></copydir>
<!--delete để có thể chạy lại application-->
<delete dir="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/data"></delete>
<!--start application với tham số bên dưới-->
<java fork="true" jar="/home/legend/Desktop/sgs-server-dist-0.9.8/bin/sgs-boot.jar" >
<arg value="/home/legend/Desktop/sgs-server-dist-0.9.8/phom/conf/Phom.boot"></arg>
</java>
</target>
</project>

- Chạy file.xml này ( chuột phải -> run as -> ant build)