Labels

Thursday, September 16, 2010

Basic Java Socket Programming: Creating a Simple IRC Service

Welcome to JavaLand.  Here I will attempt to explain about the basic Java socket programming by creating a simple client/server Chat project (SimpleIRC).

The basic idea for the server is as follow:


ChatServer.java
  • Listen on a port until a client connects using the SocketServer.accept()
  • Once, connected, create a ChatService and have it handle that connection in a separate thread
  • Now, go back to listening mode again for next connection.
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Basic Chat Server (SimpleIRC)
 * @author TA Nguyen
 */
public class ChatServer
{
  // Defines the port that this server will listen on
   final int SBAP_PORT = 80;
   
   public static void main(String[] args) throws IOException
   {
       // Create a new mediator
       Mediator mediator = new Mediator();

       // Create a new server object
       ServerSocket server = new ServerSocket(SBAP_PORT);
       System.out.println("");
       System.out.println("Press CTRL+C to terminate.");
       System.out.println("Waiting for clients to connect...");

       /**
        * Main loop of the application.
        */
       while (true) {
        // wait for client to connect
           Socket socket = server.accept();
           System.out.println("Client connected.");

           // ok, connected, 
           //now create ChatService to handle this connection
           ChatService service = new ChatService(socket, mediator);

           // tell the JVM to run it in a thread
           Thread thread = new Thread(service);
           thread.start();
     
           // now, we go back to wait for next connection.
       }
   }
}

ChatService.java
  • Listen for incoming message and tell the Mediator to send it to all connecting clients
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * ChatService: Executes BChat commands from a socket.
 * @author TA Nguyen
 */
public class ChatService implements Runnable
{
    private Socket socket;
    private Scanner in;
    private Mediator mediator;
    private PrintWriter writer;


    /**
     * Constructs a service object that processes commands
     * from a socket utilizing the mediator service.
     * @param socket the Socket
     * @param mediator the Mediator
     */
    public ChatService(Socket socket, Mediator mediator) {
        this.socket = socket;
        mediator = mediator;
    }


    /**
     * Add new i/o services and call doService()
     * which performs the primary chat functions.
     *
     * When doService() returns, cleans up and shuts down the thread.
     */
    public void run() {
        try {
            try {
                in = new Scanner(socket.getInputStream());
                writer = new PrintWriter(socket.getOutputStream());
                mediator.add(writer);
                doService();
            } finally {
                mediator.remove(writer);
                socket.close();
                System.out.println("Client disconnected.");
            }
        } catch (IOException exception) {
            System.out.println("Serverside error occured.");
            exception.printStackTrace();
        }
    }


    /**
     * Prints every command received.  If the user enters "QUIT",
     * then the thread terminates.
     */
    public void doService() throws IOException {
        while (true) {
            if (!in.hasNext()) {
                return;
            }

            String command = in.nextLine();
            if (command.equals("QUIT")) {
                return;
            } else {
                executeCommand(command);
            }
        }
    }


    /**
     * Executes a single command.
     * @param command the command to execute
     */
    public void executeCommand(String command) {
        mediator.writeMessage(command);
    }
}

Mediator.java
  • keep track of all the outgoing socket (clients)
  • loop and display received a message to all clients
import java.io.PrintWriter;
import java.util.LinkedList;

/**
 * Mediator:
 * 1. Stores and maintains a list of the clients 
 *    that are connected to the server.
 * 2. Provide a relay of received messages 
 *    to all connected clients.
 *
 * This list must be synchronized across all threads 
 * to maintain access to each connection.
 *
 * @author TA Nguyen
 */
public class Mediator {
    private LinkedList connections;


    /**
     * Constructor creates the list that maintains the connections
     */
    public Mediator() {
        connections = new LinkedList();
    }


    /**
     * Accepts a message and sends it out to all of the clients
     * @param Message the message to broadcast to all connections
     */
    public void writeMessage(String message) {
        System.out.println("Recieved: " + message);
        for (PrintWriter out : connections) {
            out.println(message);
            out.flush();
        }
    }


    /**
     * Adds a new connection
     * @param Out the new connection to add to the list
     */
    public void add(PrintWriter out) {
        connections.add(out);
    }


    /**
     * Removes a connection
     * @param Out the connection to remove
     */
    public void remove(PrintWriter out) {
        connections.remove(out);
    }
}

ChatClient.java
  • Establish a connection to the ChatServer
  • Create a DisplayService and run it in a thread to handle server income message
  • Loop and wait for a user to enter a message, then send it to the server.
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;


/**
 * Basic Chat Client (BChat)
 *
 * @author TA Nguyen
 */
public class ChatClient 
{
  // The port to connect to
    private static final int BCHAT_PORT = 80;
    private static final String BCHAT_IP = "localhost";
    
    public static void main(String[] args) throws IOException {

        // Create the socket and connect to the predefined server:port
        Socket socket = new Socket(WTSCS_IP, WTSCS_PORT);

        // Create the input and output streams, from this socket connection
        InputStream instream = socket.getInputStream();
        OutputStream outstream = socket.getOutputStream();

        // Create a scanner and print writer for local i/o
        Scanner socketIn = new Scanner(instream);
        PrintWriter socketOut = new PrintWriter(outstream);
        Scanner keyIn = new Scanner(System.in);

        // Define the display service and instruct it to listen 
        // to the socket input stream, display all messages the come in.
        DisplayService service = new DisplayService(socketIn);

        // Well, do it (display) in a thread so that 
        // we can type without being blocked by incoming messages.
        Thread thread = new Thread(service);
        thread.start();

        // first, get the client name and remember it.
        System.out.print("Enter your name: ");
        String name = keyIn.nextLine();

        while (true) {
            // read a line of message from (system/console) input stream 
            String line = keyIn.nextLine();
            
            // write the message with client name to the socket output stream
            socketOut.println(name + ": " + line);
            socketOut.flush();
            
            // if the last message is "QUIT" then stop.
            if ("QUIT".equals(line)) {
                break;
            }
        }
        socket.close();
    }
}

DisplayService.java
  • Wait for a message from the server and display it to the console.
import java.util.Scanner;

/**
 * DisplayService: 
 * Displays all input received.
 *
 * @author TA Nguyen
 */
public class DisplayService implements Runnable {
    private Scanner scanner;
    
    
    /**
     * Constructor receives a scanner object for i/o operations.
     *
     * @param scanner The source to read input from
     */
    public DisplayService(Scanner scanner) {
        this.scanner = scanner;
    }
    
    
    /**
     * Get input from the scanner and print the line to the output.
     */
    public void run() {
        while (true) {
            if(scanner.hasNext()) {
                String line = scanner.nextLine();
                System.out.println(line);
            } else {
                return;
            }
        }
    }
}

Now, that you have the basic understanding of client/server using the socket and a working chat client/server, I challenge you to take this to a step further and add a GUI to the client, along with the Avatar image for the client.  Hint you can use the java serialization to send complete Java object over the socket.

Note: this demo was originally written as part of the class exercise for CSC-251 class that I teach at WakeTech.edu
Enjoy,
T.A. Nguyen

Sunday, February 14, 2010

Hương Đời Dịu Êm!

Cũng may em đến gọi mời
Nhen lên ngọn lửa cuối đời lả lơi
Trời thương nhả tí mưa rơi
Em thương nhả tí hương đời dịu êm

Cám ơn em,
TA Nguyen
Tết 2010

Nghẹn Ngào!

Xuân này, xuân nữa ... tha hương
Bước chân viển xứ sầu vương xứ người
Sớm hôm cặm cụi với đời
Ngày qua tháng lại theo thời vận xoay

Cố đô mãi đắm trong lầy
Ngàn thu núi hận ... máu đầy Hương Giang
Bao ơi thương nhớ muôn ngàn
Ngự Bình hùng vỹ ... Hương Giang thuở nào

Sanh lổi thời bởi phận trao
Bình thời sao mãi ... nghẹn ngào lệ tuôn
Tự tình một thoáng sầu buông
Đề thơ vơi nổi thảm buồn tha hương

For my grandmother, Tết Mậu Thân!
TA Nguyen
Tết 2010

Wednesday, February 3, 2010

Akỏn » Trùng Dương Màu Tím

Một tối hôm nào của tháng năm
Tôi với thằng em trong tối tăm
Tìm đoàn đi vượt cùng nhau bước
Ra tới hè “ôn”, con chó gầm

Trong đêm em bảo "Hảy về thôi
Đèn tắt chắc họ đã đi rồi!"
Tôi bảo thằng em "răng khờ rứa ?”,
Vượt biên chơ bộ, ráng chờ coi!"

Tôi với thằng em quờ quạng tới
Lùm cây bóng tối phủ chúng tôi
Bỗng nghe tiếng nước kêu lũm bũm
Cóc nhái nhà ai nhảy quá trời (*1)

Năm phút trôi qua bỗng lù lù
Một đoàn lớn bé chiếm một khu
Trưởng nhóm lại gần rồi khẽ hỏi
“Đứa nào ?”. Tôi khẽ “Con của chú ..”

Tôi hú hồn ngay rất là may
Nếu bác không qua nhà lúc nãy (*1a)
Bão rằng họ đi trong năm phút
Vượt biên tôi chẳng cơ hội này

Có lẽ nhà tôi nhang đỏ hồng
Nước sôi như thể ở trong lòng
Ba Mẹ tôi cùng nhau run vái
Cầu mong hai đứa thoát cho xong

Theo đoàn như thể người đi biển
Em một mo cơm tôi cây đèn (- cơm tối chưa ăn, đèn thùng 0 thắp)
Cả nhóm im ru theo đoàn trưởng (*2)
Và đang khấn nguyện trong lặng yên

Sa mạc cỏ cây không trật tự
Cả nhóm xù xì bởi tiếng kiêu
“Vức đèn kẻo kêu công an bắt !”
Tôi im tay nhấc không chần chừ

Đi một hồi lâu mỏi thả buông
Lâu lâu rột rẹt bị la luôn
Nhưng vẫn kiên trì tôi không bỏ
Hành trang tôi đấy mổi cây đèn

Tới một cồn đất lưa thưa cây
Đoàn trưởng khẻ rằng nằm chờ đây
Không khí đợi chờ nghe ngột ngạt
Thời gian như dừng lại chốn nầy

Khi dấu hiệu thông cả đoàn theo
Ra tới biển đông tiếng nước reo
Nghe lời ba dặn thuyền nước cao
Vói tay nhớ nhé, ráng mà leo

Dùng dằng sóng nước vỗ ngang vai
Lên được trên thuyền ngã lăn dài
Nhớ nhà đức ruột … và say lắm
Nước xanh, nước tím, phủ … láng lai

Thum thũm mùi hôi ở bên đầu
Đứa nhỏ nhà ai đã đi cầu
Đầu tôi nặng lắm không nhấc nổi
Lệ tràn … tôi thiếp một giấc lâu

Tỉnh dậy ngày đêm đi không đợi
Trùng dương màu tím phủ quanh tôi
Tôi hỏi chung quanh kiếm thằng em
Có ở trên thuyền không ?, Thật tội
Thằng em say sóng ngũ mất rồi
Một ngụm nước chanh cứu lấy tôi (*3)
Nhìn quanh chỉ biển màu đen tím
Thuyền con bé bỏng cứ dần trôi

Tối đó mo cơm chưa kịp ăn
Bây giờ tỉnh dậy kiếm chi ăn
Bọc khoai, đường, má đi nhờ gởi
Tìm chẳng có ra, cơm thúi ình
*-*
Hải Nam ghé lại thuyền cập bến
Mọi người nhốn nháo ghi lại tên
Bức tường nho nhỏ không còn chổ
Bao người vượt biển khắc qua đêm
*-*
Sáng đi tối ghé bãi biễn Tàu
Tha hương phiêu bạc họ cùng nhau
Bế ẵm con đi xin cơm nước
Ngậm ngùi mai chẵng biết về đâu

Hai anh con bác, chị em tôi
Cùng năm thanh niên lạ lắm thôi (*4)
Chúng tôi chín đứa vô làngTa`u
Năm anh lớn xin, bốn nhỏ cười (* lần đầu xin ăn, vui lắm sao?*)

Có tiếng oang oang “Mậu, Chẩu lơ!”
Chúng tôi không hiểu, chỉ thấy quơ
Thì ra “Mậu, chẩu” là bị đuổi
Thôi đi nhà khác để xin mờ

Tôi nhớ ngày xưa ở làng tôi
Có đám nít con theo chọc đuổi
Người đi ăn xin. Tôi thĩng thoãng
Nghe xem có lúc nhe răng cười

Có lẽ rằng đây là nghiệp chướng
Nợ trần vay trã rất là thường
Nhưng ít mất ai mà hiểu được
Chưa trãi làm sao biết mà thương

Chín người chúng tôi mỗi lần vào
Lớn nhường tốp nhỏ nhét dạ no
Xong rồi còn lại anh lớn hưởng
Cứ thế cùng nhau trên chuyến đò

Tuần đầu trên biển lại có dì (*5)
Lúc có nước non hay có chi
Dì nhường nhỏ cháu khi đói khát
Ai tốt hiễn nhiên biết một khi

Tối đến tôi cùng với bốn cô
Dưới tấm ni lông trong thật nhỏ
Che sương trên cát đêm đêm đến
Dần quen đêm tới ngũ năm cô

Tôi cũng an tâm đêm có lạnh
Thằng em theo ngũ với các anh
Anh em tình ấy cùng nhau sống
Từng phút gian nan cũng qua nhanh
*-*
Một lần sóng lớn ghé vô bờ
Bỗng dưng loạt súng chĩa vu vơ (*5a)
Họ bão chúng tôi quay ra biễn
Chúng tôi chỉ chỏ vẽ sơ đồ

Ba chục phút sau có người ra
“Đây là cấm phận” , nói tiếng ta
“Sóng to có chết không ra biển
Cho ở qua đêm mai đi mà!”

*-*
Khoát áo da trời mặc áo bông
Dáng dấp tròn no một má hồng
Cùng tôi năm đứa trừng đêm đến
An toàn thân gái lại ngũ chung

Có một lần kia ghé biển Tàu
Chúng tôi ăn uống lại cùng nhau
Vào Tàu bỏ hoang không có chủ
Chiếc giữa năm cô ngũ cùng tàu

Đánh thức tôi vào lúc nữa đêm
Chị ơi ông Tàu nhéo đùi em
Xi xô ổng nói gì không hiểu
Bọn tôi la lớn kiêu tàu bên

Ba mươi mấy mạng ngũ say sưa
Trong khoãnh khắc theo dỏi mắt đưa
Tôi bảo khi ổng tới đầu tàu
Tôi hô ba tiếng chạy nhớ chưa ?

Ổng bỗng vòng qua nhéo đùi tôi (*Nhéo đùi – xem còn sống hay chết)
Kéo ni lông nhỏ che không nổi
Nhắm mắt thôi liều coi như chế
Vì cô bên nọ mạnh hơn tôi

Chợt bước xa dần tôi hô to
Một hai ba chạy nhớ giùm cho
Ba chân bốn cẵng nhanh đầu chạy
Chợt nghe tiếng gọi “Chị ơi, chờ!”

Như phóng phi lao bỗng dừng ào
“Còn ngồi ở đó tại vì sao ?”
Tiếng vọng “Em đang ni lông xếp”
Tôi la “Đừng xếp, kéo chạy nào!”

Thuyền mình năm đứa hướng về mau
Chui vào trong đó núp cùng nhau
Tôi nhanh miệng mét anh giữ tàu (*a)
Vì sợ ông Tàu, hảy trốn mau

Năm phút sau thôi có tiếng người
Vòng quanh rồi lại tới gần tôi
Đèn Pin ổng rọi ngay vào mặt
Nhắm mắt giúp tôi bớ ông Trời!

Mấy phút kinh hồn bỗng qua đi
Có lẽ ổng đà hiểu điều chi
Nên bỏ đi ngay không trở lại
Bọn tôi sợ quá đã ngũ lỳ

Sáng sớm hôm sau bỗng nực cười
Lọ lem đen thủi lại đen thui
Áo thêu da trời luyn chiếm hữu
Má hồng biến dạng, khói máy chui

*-*
Một ngày nắng đẹp ghé vô bờ
Núi non cây cối đứng chơ vơ
Chúng tôi trèo núi cao hái dứa
Bài hát vang vang tự do chờ (6*)
*-*

Ghé một làng nọ núi cheo leo
Thức ăn không có, cỏ cức heo (*Rau cỏ hôi)
Chúng tôi hái về cùng nhau luột
Ăn say đêm đến cùng ói theo

Hôm sau đoàn trưởng lên tiếng bảo
Hai lon gạo cuối đem nấu cháo
Cháo loãng cùng húp rồi vào làng
Đem của cải ra đi đổi gạo

Tôi chẳng có gì, chĩ cái thân
Nước mặn mục dần bộ áo quần
Mặc nó như là treo vãi mùng
Nhìn xuyên tôi đó, ngượng ngùng xuân
*-*

Có một lần kia ghé bến dân
Cùng nhau ăn tối chuyện không ngừng
Bỗng có ông Tàu trông nham nhỡ
Xông vào ôm hụt đoá phù Dung

Nữa đêm thức giấc tầm tã mưa
Người ta đi mất, ngũ say “Chừa!’
Năm đứa cùng nhau tay níu áo
Chân dò định hướng cứ đi bừa

Bỗng cãn trở đường tiếng một ông
Hù la thật lớn dội không trung
Chúng tôi năm đứa cùng la hét
Thì ra anh họ giỡn .. chết không ?

Trước hiên nhà lạ trốn mưa đêm
Càng chờ đêm sáng thấy dài thêm
Một cuộc du hành qua đất lạ
Phiêu lưu thám hiểm có ai thèm ?

Có lần qua khe nước phủ ống
Đem về bánh ú nước ngang hông (*Mồng 5 tháng 5 bánh Ú Tro Tàu là số 1)
Sanh tử phó trời theo đệnh mệnh
Lúc tạnh mưa rồi nắng lên không ?

Đã mấy tuần trôi tới Macao
Vào đây nghĩ tạm trên hòn đão
Lưa thưa cuốc bộ dân đi biển
Hỏi đường chỉ vẽ viết và quơ

Bọn tôi không hiểu họ nói gì
Làm dấu hai ngày ngũ xong thì
Hồng Kông cắt cổ, nghe ớn lạnh
Biển sóng thế này làm sao đi ?

Mò vào hải phận của Ma Cao
Thuyền to họ phóng tựa phi lao
Thuyền đi trên nước dừng và rước
Cho nước đồ ăn, ngon làm sao

Hải phận Hồng Kông họ lại giao
Chúng tôi tuyệt vọng đến cở nào
Khi họ bảo rằng sắt lệnh đóng ( đến HK 7/02/1982)
Hai hôm rồi đấy giờ làm sao ?

Chúng tôi đắng họng với u phiền
Có chết cùng chết ở đất liền
Cho dầu thức ăn đi đâu nữa
Trại cấm ở lại vẫn là Tiên
-*-
Hôm sau chạy kiếm mấy anh em
Xà lang tất cả cùng ra xem
Tivi máy lớn truyền thanh phát
Đăng báo hình mình (*7) gởi nhà xem

Đúng một tuần sau tới trại tù (Chimawan lower Camp)
Trống rỗng phòng phòng cỏi âm u
Tưởng tượng bao người xưa từng ở
Chung thân tàn cuộc của ngục tù

LM một bảy một không
Ba lăm người thiểu thảo trông
Đợt đầu vào trại chừng mười chiếc
Mấy trăm người đợi bế xách bồng

Sổ sách khai báo, hàng cùng sắp
Khám xét, phát thau ly mền đắp
Xong rồi chỉ cho một cái giường
Ba tầng dãy giường dài thẳng tắp

Tắm rữa xong rồi đi ngũ thôi
Có lo cho lắm cũng xong rồi
Tương lai rào đón bao lớp thép
Chung quanh là biển, chỉ giữa đồi
-*-
Người tù bên ngoài một hai ông
Chùi rữa chung quanh khu nhà trống
Để quên miếng vãi trắng sọc xanh
Anh em nhặt lấy đem về phòng

Chĩ rút mền, thép nhỏ mài kim
Lon nước thành dao cắt vãi rim
Ghép lại may quần anh em mặc
Bốn quần (3) anh em thay đổi sim (*lần đầu tiên may đồ)

Tôi nhớ thằng em nói ông anh
Đít ghẻ quần đen lấm chấm tanh
Thôi được kiếm thêm hai miếng vãi
May thêm quần sọt chốc sẽ thành
-*-
Ngày đến ngày đi mỗi một đông
Bà con vượt biên đến Hồng Ko^ng
Đổi lên trên núi, HeiLingChau
Về lại Chimawan ở lòng vòng

Tôi nhớ một lần khoãng tháng tư (4/1983)
Nữa đêm thức giấc chạy sặc sừ
Vợ chồng gây lộn dân hoãng chạy
Mấy ngàn người đến coi thật hư (Chimawan Upper camp)

Tiếng chân rầm rập, đánh nhau ư ?
Trong lúc tôi còn đang ngái ngũ
Thất thanh hồn vía trốn gầm giường
Nằm thêm năm phút sau tĩnh ngũ

Người đi đâu cả ? Tôi chui ra
Bỗng họ trở về, trố mắt ra
Thấy tôi họ bỗng ngồi ôm bụng
Lăn ra cười ngất ngưỡi đó mà

*-*
Hei Ling Chau trại đổi rất mau
Tối đến kệ kinh đọc làu làu
Cầu An, Xám Hối, luôn Tịnh Độ
Làm luôn một lược trước tới sau

Ngẫm nghĩ nhiều lúc bật cười hì
Phật Tổ, Kệ kinh con biết chi
Bỗng dưng con thấy vui vui lắm
An lành khi tụng mỗi một khi

*-*
Rục rịch đó đây dao dắt lưng (Hei Ling Chau Camp)
Đàn bà cũng thế nên coi chừng
“Luận” bước vào phòng, ai chém lộn
Cổ cắt, nhà thương ở hai tuần

Có một lần tôi văn nghệ về
Đường dài lúc bệnh càng lê thê
Về phòng nom anh cười ha hả (*anh Bình)
Khi họ bẽ giường sắt tự vệ

Tôi hoãng la luôn “anh xuống đây!
Người ta chuẩn bị vũ khí đây`
Loay hoay ở đấy người ta đánh
Phải biết quý thôi cái mạng nầy"

Nhìn quanh Nam Bắc họ phân ly
Tôi hỏi chung quanh xem chuyện gì
“Em nhỏ ở lại cùng anh chị
Tụi em sẽ chẵng có chuyện chi!”

Tôi biết chúng tôi rất được thương
Dân nào cũng thế, cũng đồng hương
Nhưng ai biết được tâm người khác
Phòng bệnh còn hơn chữa vết thương

Tôi bão anh em dọn hành trang
Miễn phòng mỡ cữa nhắm bên Nam (*xx)
Chạy qua bên đấy đi cho tiện
Kẻo sợ kéo dao không mắt phang

Cả đám cùng đang cơm tối ăn
Tôi hô “Cùng chạy” cơm chiếu chăn
Bàn thờ tất cả cùng chung lộn
Chúng tôi sáu đứa như thằn lằn (0 đuôi)

Chợt tiếng đùng đùng hai túi xách
Lăn lóc trên sàng tôi một mạch
Chui trốn gầm giường hơi thở đứt
Bỗng một con dao đưa sành sạch

Đứa nào dưới ấy ? Hảy ra đây
Hai tay tôi đó run lẫy bẫy
Cất lấy con dao đi thật bậy
Chẵng ai xa lạ mà tôi đây (Sợ ê xê nặng xệ )

Lính chiến Hồng Kông như ra trận
Súng mũ giáp bào chạy rần rần
Bắt hết dân ta sắp cúi đầu
Hai tay sau cổ xét cùng thân (1983?)

Họ lục các nơi và gom lại
Vũ khí kéo dao (v.v.) xe trên mười
Chở chúng đỗ đi và từ đó
Dân Nam dân Bắc họ phân ly

Từ đó trã về đám độc thân
Mấy anh ngày xưa cùng bước chân
Vào làng Hoa kiếm xin chút cháo
Giờ cũng về đây, cũng thấy mừng
-*-
Thuỡ đó người ta cứ kép đôi
Tôi thì cũng lớn, thích biết rồi
Nhưng yêu .. tôi chẳng rỏ gốc nôi
Ai lỡ thương tôi, ôm khổ thôi

*-*
Phỏng vấn vừa xong, loại mất rồi
Tôi buồn tôi khóc quá đi thôi
Tự Do hai tiếng xa vời vợi
Mẹ ơi con đã mất hết rồi

Tuần một châu đỗ cạn giòng
Tuần hai hỏi ý lòng vòng xem sao
Lắc đầu họ bão được nào ?
Cam tâm đành chịu lao đao phó trời

Tuần ba ngẫm nghĩ chuyện người
Họ to, mình bé, trí mình nhỏ sao ?
Kiếm cách thì phải cách nào ?
Để cho hợp lý làm sao hợp tình ?

Ba mẹ không ở bên mình
Ngồi khóc cũng thế, thường tình nhân gian
Tỉnh lại để mà lo toan
Phải tính phải toán lo toàn chị em

Tự an tự ủi tấm thân
Ai hoài bé mãi ? ai thông minh liền ?
A ha, Anh ngữ trước tiên
Tôi phải đi học chớ điên ngồi sầu

Chẳng ai giúp được mình đâu
Tự mình lo lấy khởi đầu gian nan
Có công mài sắc không màn
Nên kim sẽ có con đàng cho ta

Giục em theo học cùng nha
Làm giương chị phải nghĩ xa nghĩ gần
Linh tinh quấy nhiễu tấm thân
Cầu xin bền chí chứ đừng hỏng hư

*-*
Trường tan lẽo đẽo một anh theo (*Chimawan Upper Camp)
Nhét lá thư xanh, phóng cái vèo
Nghĩ thư trại dưới gởi lên thăm
Cảm ơn vồn vã vui xiết bao

Mở ra nét bút thật nam nhi
Viết bằng anh ngữ có chữ ghi
Phải tra từ điển tôi mới hiểu
Hiểu xong hổng biết trả lời chi

Trường tan ngày tới lại thư xanh
“Người ta nhờ gởi chẳng phải anh!”
Rút tay không nhận, "thôi năn nĩ
Nhận đi, bạn lớp thấy ghẹo .. nhanh!"

Cũng cùng nét chữ, lá thư xanh
Đọc xong tôi vội viết rất nhanh
Cảm ơn ai đấy, tên không thấy
Xếp lại tình thư xanh rất xanh

Chiều tà ngã bóng hanh hanh
Vói tay chị gọi thư xanh em nè
Chị ơi chị đợi em nghe
Cầm thư trao đổi, chị nè em xin

Nhỏ to hỏi chị chút tin
Chủ nhân ba lá thư tình là ai ?
Chị rằng má trái, không sai
Nốt ruồi là Vũ, em trai đó mà
*-*
Một đêm trời tối tụm đám đông
Ngây thơ đom đóm bắt nhau cùng
Riêng tôi dõi mắt trong đêm tối
Tìm trên má ấy có hay không

Chị ơi, tối quá làm sao thấy ?
Đằng kia, đấy đấy, em nhìn đấy
Đèn dầu thoang thoãng em đã rõ
Chào chị rút lui, em đi đây

Đường về tuy ngắn mà như xa
Nét mặt ai kia đã nhìn ra
Yêu chi, anh đó như con nít
Té ra mình cũng nít con mà

(còn tiếp)
Akỏn

Tuesday, January 19, 2010

Simple way to display FILE and LINE NUMBER from java source codes similar to C++ __LINE__

Have you ever wanted to be able to display the __file__ name, __line__ number and __method__ name from within Java class for quick debugging? Well, perhaps the following utility will help:

Save the following code in a file name __.java

package org.cnci.util;

/*
* Simple utility class to display __LINE__ number, __FILE__, __METHOD__ and __CLASS__ name for debugging...
* @author TA Nguyen
*/

public class __ {

 // __.LINE__() similar to __line__ in C++
 public static int LINE__() {
  return Thread.currentThread().getStackTrace()[2].getLineNumber();
 }

 // __.METHOD__()
 public static String METHOD__() {
  return Thread.currentThread().getStackTrace()[2].getMethodName();
 }

 // __.CLASS__()
 public static String CLASS__() {
  return Thread.currentThread().getStackTrace()[2].getClassName();
 }

 // __.FILE__() similar to __file__ in C++
 public static String FILE__() {
  return Thread.currentThread().getStackTrace()[2].getFileName();
 }

 private static String testOne() {
  return "testOne:: " + " File:" + __.FILE__() + " Class:" + __.CLASS__()
    + " Method:" + __.METHOD__() + " Line:" + __.LINE__();
 }

 public static void main(String[] args) {
  String info = testOne();
  System.out.println("1. " + info);
  System.out.println("2. File:" + __.FILE__() + " Class:" + __.CLASS__()
    + " Method:" + __.METHOD__() + " Line:" + __.LINE__());
 }
}