Archive

Archive for the ‘Programming’ Category

Hướng dẫn biên dịch và deploy Sakai trên Windows

August 3, 2010 11 comments

Chào các bạn, sau vài ngày vật vã tìm cách cài cho được Sakai từ Sakai souce, mình đã rút ra được vài điều và muốn chia sẻ lại cho tất cả các bạn.

Bài viết của mình sẽ hướng dẫn các bạn biên dịch, deploy mã nguồn Sakai mới nhất 2.7.0 bằng Apache Maven,  Apache Tomcat,  Java trên Windows.

Chuẩn bị: Trước tiên các bạn down các gói cần thiết về.

Sakai 2.7.0:

http://source.sakaiproject.org/release/2.7.0/artifacts/sakai-src-2.7.0.zip

Maven 2.2.1:

http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.2.1-bin.zip

Tomcat 5.5.30: nhớ là Tomcat 5 đó nhé, bản cũ hơn bản này cũng được vì Sakai 2.7.0 không chạy được trên Tomcat 6 hay Tomcat 7

http://mirror-fpt-telecom.fpt.net/apache/tomcat/tomcat-5/v5.5.30/bin/apache-tomcat-5.5.30.zip

Java 6:

http://www.oracle.com/technetwork/java/javase/downloads/jdk6-jsp-136632.html

MySQL:

http://www.mysql.com/downloads/mysql/

MySQL Java Connector:

http://dev.mysql.com/downloads/mirror.php?id=390509#mirrors

Cài đặt:
Trước khi cài đặt lưu ý với các bạn một vấn đề: khi bạn cài các phần mềm trên bạn nên để trong thư mục có đường dẫn không có chứa khoảng trắng. Ví dụ:
Good: C:\opt\tomcat\, C:\sakaistuff\installs\tomcat\
Bad: C:\program files\tomcat\, C:\opt\apache tomcat 5.5.28\
- Cài đặt Java: bạn cài đặt gói jdk vừa down vào thư mục, ví dụ của mình là C:\opt\java.
Cài đặt biến môi trường cho Java: để cài đặt biến môi trường bạn vào My Computer –> Click chuột phải chọn Properties –> Advanced system settings –> Environment Valuables ( cài này trên Windows 7, trên XP tương tự). Trong System Variables, bấm New –> Bạn điền tên biến và giá trị vào sau đó OK.
Với JAVA có biến sau:
Tên biến:

JAVA_HOME

Giá trị: đường dẫn tới thư mục cài java, ví dụ của mình là

C:\opt\java\jdk1.6.0_20

Thêm vào đuôi biến Path giá trị như sau: nhớ gõ dấu “;” để ngăn cách nhé.

C:\opt\java\jdk1.6.0_20\bin

- Cài đặt Maven: giải nén gói maven vào thư mục C:\opt\maven. Sau đó cài đặt các biên môi trường sau:
Tên biến:

MAVEN_HOME

Giá trị: đường dẫn tới thư mục cài Maven, ví dụ của mình là

C:\opt\maven

Tương tự thêm vào đuôi biến Path giá trị:

C:\opt\maven\bin

Tên biến:

MAVEN_OPTS

Gia trị: bạn cứ copy y chang rồi dán vào, xuống phần cài đặt Tomcat mình sẽ giải thích rõ tại sao chọn thông số như vậy.

-Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m

Tạo thư mục .m2 để chứa thư viện biên dịch bằng lệnh sau:

mkdir %HOMEDRIVE%%HOMEPATH%\.m2\repository

Trên Windows thư mục Home mặc định là thư mục user của bạn ví dụ của mình là: C:\Users\hoaihuongbk
Tạo một file settings.xml trong thư mục .m2 để khai báo với Maven biết server home Tomcat nằm ở đâu với nội dung như sau:

Anh2
Trong đó : c:\opt\tomcat là đường dẫn tới thư mục cài Tomcat trên máy bạn. Bạn cũng có thể thay chỗ đó bằng

${env.CATALINA_HOME}

để chỉ cần chỉnh sửa trong System Environment là xong.
Nếu network của bạn cần proxy thì bạn thêm vào đoạn code sau:

Anh3

- Cài đặt Tomcat: tương tự như những cài đặt trước bạn cài tomcat vào thư mục C:\opt\tomcat và cài đặt biến môi trường như sau:
Tên biến:

CATALINA_HOME

Giá trị: đường dẫn tới thư mục cài tomcat trên máy bạn, của mình là

C:\opt\tomcat

Thêm vào đuôi biến Path giá trị:

C:\opt\tomcat\bin

Tạo file setenv.bat đặt trogn thư mục bin của tomcat với nội dung như sau:

set JAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:NewSize=192m -XX:MaxNewSize=384m -Djava.awt.headless=true -Dhttp.agent=Sakai -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang.ClassLoader.allowArraySyntax=true

Tới đây bạn để ý các giá trị Xms256m, Xmx512m: đó là giá trị quy định kích thước của đối tượng Java heap, khởi đầu là 256MB và lớn nhất là 512MB, cái này phụ thuộc vào dung lượng RAM trên máy bạn, nếu RAM 1GB thì nên để y như mình đề nghị, RAM 2GB thì bạn có thể chỉnh thành Xms512m, Xmx1024m, RAM 3G trở lên mình chưa thử, chú ý là giá trị Xms không được bằng hoặc lớn hơn giá trị Xmx. Tiếp đến giá trị -XX:PermSize=64m -XX:MaxPermSize=128m là giá trị vùng nhớ để load các class java, cũng tùy vào RAM của bạn mà nên để kích thước vừa phải, mình test trên RAM 1GB thì giá trị như trên, RAM 2GB thì có thể chỉnh thành -XX:PermSize=128m -XX:MaxPermSize=512m.
Một chú ý quan trọng là các giá trị trên phải đồng bộ giữa MAVEN_OPTS và JAVA_OPTS
Copy file MySQL Java Connecter (file *.jar nhé) vào thư mục:

C:\opt\tomcat\common\lib

- Cấu hình Sakai: bạn giải nén sakai vào một thư mục nào đó mà bạn muốn với khuyến cáo đường dẫn như đầu bài viết. Ví dụ của mình là C:\opt\sakai.
Tạo thư mục sakai trong thư mục tomcat và copy file sakai.properties từ C:\opt\sakai\reference\docs vào thư mục sakai vừa tạo. Sau đó chỉnh sửa nội dung lại như sau:
Tìm và comment các thông số trong phần HSQLDB setting:

## HSQLDB settings – on by default
#vendor@org.sakaiproject.service.framework.sql.SqlService=hsqldb
#driverClassName@javax.sql.BaseDataSource=org.hsqldb.jdbcDriver
#hibernate.dialect=org.hibernate.dialect.HSQLDialect
#validationQuery@javax.sql.BaseDataSource=select 1 from
SYSTEM_USERS
# two hsqldb storage options: first for in-memory (no persistence between runs), second for disk based
#url@javax.sql.BaseDataSource=jdbc:hsqldb:.
#url@javax.sql.BaseDataSource=jdbc:hsqldb:${sakai.home}/db/sakai.db

Tìm và chỉnh sửa 2 dòng sau:

Set username@javax.sql.BaseDataSource=sakaiuser
Set password@javax.sql.BaseDataSource=sakaipwd

Trong đó “sakaiuser”, “sakaipwd” lần lượt là username và password để truy cập cơ sở dữ liệu sẽ được tạo trong hướng dẫn cài MySQL sau.
Tìm và uncomment các thông số trong phần MySQL

## MySQL settings – make sure to alter as appropriate
vendor@org.sakaiproject.db.api.SqlService=mysql
driverClassName@javax.sql.BaseDataSource=com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQLDialect
url@javax.sql.BaseDataSource=jdbc:mysql://127.0.0.1:3306/sakai?
useUnicode=true&characterEncoding=UTF-8
validationQuery@javax.sql.BaseDataSource=select 1 from DUAL
defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTED

- Cài đặt MySQL: tương tự bạn cũng cài đặt MySQL vào thư mục C:\opt\mysql.
Tạo biến môi trường,
Tên biến:

MySQL_HOME

Giá trị: đường dẫn tới thư mục cài mysql, ví dụ của mình là

C:\opt\mysql

Thêm vào cuối biến Path:

C:\opt\mysql

Tạo cơ sở dữ liệu:

create database sakai default character set utf8;

Tiếp tục gõ các lệnh sau:

grant all on sakai.* to sakaiuser@’localhost’ identified
by ‘sakaipwd’;
grant all on sakai.* to sakaiuser@’127.0.0.1′ identified
by ‘sakaipwd’;
flush privileges;

Trong đó “sakaiuser”, “sakaipwd” trùng với giá trị lúc nãy đã cài đặt.
Biên dịch và deploy:
Tạo file Master POM cho Sakai: gõ các dòng lệnh sau trong cmd

cd c:\opt\sakai\master
mvn clean install

Deploy Sakai: gõ các dòng lệnh sau trong cmd

cd c:\opt\sakai
mvn clean install sakai:deploy

Nếu lần đầu tiên biên dịch, chương trình sẽ tự động down các gói thư viện cần thiết nên thời gian có thể hơi lâu, chừng 2 giờ đồng hồ, tranh thủ kiếm tách cafe nhâm nhi tí quay lại là có, hehe.
Sau khi biên dịch và deploy thành công, các bạn chạy Tomcat bằng lệnh sau:

startup.bat

Mở browser lên và gõ vào địa chỉ:

http://localhost:8080/portal

Thướng thức thành quả đạt được…
Tắt Tomcat: gõ dòng lệnh sau trong cmd

shutdown.bat

Bạn đừng nản lòng khi biên dịch lỗi hoặc xảy ra hiện tượng outOfMemory, các bạn chỉ cần chỉnh lại các giá trị bộ nhớ mà mình nói lúc nãy đó.
Còn nhiều vấn đề muốn nói nhưng thôi để các bạn nào quan tâm thì nghiên cứu thêm:

http://confluence.sakaiproject.org/display/DOC/Sakai+2.7

Chúc các bạn thành công !!!

Categories: Java Tags: , , , ,

Creating a simple Chat Client/Server Solution – Part5

December 29, 2009 Leave a comment

Stage 5: Chat client moved to very simple GUI interface

import java.net.*;
import java.io.*;
import java.applet.*;
import java.awt.*;
public class ChatClient extends Applet
{  private Socket socket              = null;
private DataInputStream  console   = null;
private DataOutputStream streamOut = null;
private ChatClientThread client    = null;
private TextArea  display = new TextArea();
private TextField input   = new TextField();
private Button    send    = new Button(“Send”), connect = new Button(“Connect”),
quit    = new Button(“Bye”);
private String    serverName = “localhost”;
private int       serverPort = 4444;

public void init()
{  Panel keys = new Panel(); keys.setLayout(new GridLayout(1,2));
keys.add(quit); keys.add(connect);
Panel south = new Panel(); south.setLayout(new BorderLayout());
south.add(“West”, keys); south.add(“Center”, input);  south.add(“East”, send);
Label title = new Label(“Simple Chat Client Applet”, Label.CENTER);
title.setFont(new Font(“Helvetica”, Font.BOLD, 14));
setLayout(new BorderLayout());
add(“North”, title); add(“Center”, display);  add(“South”,  south);
quit.disable(); send.disable(); getParameters(); }
public boolean action(Event e, Object o)
{  if (e.target == quit)
{  input.setText(“.bye”);
send();  quit.disable(); send.disable(); connect.enable(); }
else if (e.target == connect)
{  connect(serverName, serverPort); }
else if (e.target == send)
{  send(); input.requestFocus(); }
return true; }
public void connect(String serverName, int serverPort)
{  println(“Establishing connection. Please wait …”);
try
{  socket = new Socket(serverName, serverPort);
println(“Connected: ” + socket);
open(); send.enable(); connect.disable(); quit.enable(); }
catch(UnknownHostException uhe)
{  println(“Host unknown: ” + uhe.getMessage()); }
catch(IOException ioe)
{  println(“Unexpected exception: ” + ioe.getMessage()); } }
private void send()
{  try
{  streamOut.writeUTF(input.getText()); streamOut.flush(); input.setText(“”); }
catch(IOException ioe)
{  println(“Sending error: ” + ioe.getMessage()); close(); } }
public void handle(String msg)
{  if (msg.equals(“.bye”))
{  println(“Good bye. Press RETURN to exit …”);  close(); }
else println(msg); }
public void open()
{  try
{  streamOut = new DataOutputStream(socket.getOutputStream());
client = new ChatClientThread(this, socket); }
catch(IOException ioe)
{  println(“Error opening output stream: ” + ioe); } }
public void close()
{  try
{  if (streamOut != null)  streamOut.close();
if (socket    != null)  socket.close(); }
catch(IOException ioe)
{  println(“Error closing …”); }
client.close();  client.stop(); }
private void println(String msg)
{  display.appendText(msg + “\n”); }
public void getParameters()
{  serverName = getParameter(“host”);
serverPort = Integer.parseInt(getParameter(“port”)); }
}

Nguồn: sưu tầm

Categories: Java Tags: , , , ,

Creating a simple Chat Client/Server Solution – Part4

December 29, 2009 1 comment

Step 4: A Simple but functional, text based chat server/client

import java.net.*;
import java.io.*;

public class ChatServer implements Runnable
{  private ChatServerThread clients[] = new ChatServerThread[50];
private ServerSocket server = null;
private Thread       thread = null;
private int clientCount = 0;

public ChatServer(int port)
{  try
{  System.out.println(“Binding to port ” + port + “, please wait  …”);
server = new ServerSocket(port);
System.out.println(“Server started: ” + server);
start(); }
catch(IOException ioe)
{  System.out.println(“Can not bind to port ” + port + “: ” + ioe.getMessage()); }
}
public void run()
{  while (thread != null)
{  try
{  System.out.println(“Waiting for a client …”);
addThread(server.accept()); }
catch(IOException ioe)
{  System.out.println(“Server accept error: ” + ioe); stop(); }
}
}
public void start()  { /* as before */ }
public void stop()   { /* as before */ }
private int findClient(int ID)
{  for (int i = 0; i < clientCount; i++)
if (clients[i].getID() == ID)
return i;
return -1;
}
public synchronized void handle(int ID, String input)
{  if (input.equals(“.bye”))
{  clients[findClient(ID)].send(“.bye”);
remove(ID); }
else
for (int i = 0; i < clientCount; i++)
clients[i].send(ID + “: ” + input);
}
public synchronized void remove(int ID)
{  int pos = findClient(ID);
if (pos >= 0)
{  ChatServerThread toTerminate = clients[pos];
System.out.println(“Removing client thread ” + ID + ” at ” + pos);
if (pos < clientCount-1)
for (int i = pos+1; i < clientCount; i++)
clients[i-1] = clients[i];
clientCount–;
try
{  toTerminate.close(); }
catch(IOException ioe)
{  System.out.println(“Error closing thread: ” + ioe); }
toTerminate.stop(); }
}
private void addThread(Socket socket)
{  if (clientCount < clients.length)
{  System.out.println(“Client accepted: ” + socket);
clients[clientCount] = new ChatServerThread(this, socket);
try
{  clients[clientCount].open();
clients[clientCount].start();
clientCount++; }
catch(IOException ioe)
{  System.out.println(“Error opening thread: ” + ioe); } }
else
System.out.println(“Client refused: maximum ” + clients.length + ” reached.”);
}
public static void main(String args[]) { /* as before */ }
}
import java.net.*;
import java.io.*;

public class ChatServerThread extends Thread
{  private ChatServer       server    = null;
private Socket           socket    = null;
private int              ID        = -1;
private DataInputStream  streamIn  =  null;
private DataOutputStream streamOut = null;

public ChatServerThread(ChatServer _server, Socket _socket)
{  super();
server = _server;
socket = _socket;
ID     = socket.getPort();
}
public void send(String msg)
{   try
{  streamOut.writeUTF(msg);
streamOut.flush();
}
catch(IOException ioe)
{  System.out.println(ID + ” ERROR sending: ” + ioe.getMessage());
server.remove(ID);
stop();
}
}
public int getID()
{  return ID;
}
public void run()
{  System.out.println(“Server Thread ” + ID + ” running.”);
while (true)
{  try
{  server.handle(ID, streamIn.readUTF());
}
catch(IOException ioe)
{  System.out.println(ID + ” ERROR reading: ” + ioe.getMessage());
server.remove(ID);
stop();
}
}
}
public void open() throws IOException
{  streamIn = new DataInputStream(new
BufferedInputStream(socket.getInputStream()));
streamOut = new DataOutputStream(new
BufferedOutputStream(socket.getOutputStream()));
}
public void close() throws IOException
{  if (socket != null)    socket.close();
if (streamIn != null)  streamIn.close();
if (streamOut != null) streamOut.close();
}
}

Read more…

Categories: Java Tags: , , , ,
Follow

Get every new post delivered to your Inbox.