Bài đăng nổi bật

Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux

Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...

11 tháng 12, 2013

Một số tài nguyên đáng chú ý trên mạng (Update 12/12/2013)

Do dạo này có nhiều việc phải làm, nên để thuận tiện cho việc theo dõi cũng như cập nhật tài liệu (khi nào có điều kiện tôi sẽ viết thành bài riêng cho từng tài liệu), tôi liệt kê một số liên kết tham khảo để bạn đọc có thể tự tìm hiểu thêm.
Lưu ý các hạng mục được sắp xếp theo thứ tự nhóm công việc.
1 - Nhóm thư điện tử.

2 - Nhóm quản trị hệ thống Linux
3 - Nhóm NoSql:
  • Hướng dẫn cài đặt hadoop và hbase:
    •  Phần mềm:
    • Hướng dẫn cài đặt: Hướng dẫn cài đặt Hadoop - Hbase
    • Lưu ý: Hbase và Hadoop phải có sự tương thích về phiên bản, không hiểu sao vấn đề tương thích ngược của hai phần mềm này Apache làm rất kém.

03 tháng 12, 2013

Vòng đời của một servlet trong


1. Vòng đời một servlet trong java
Vòng đời một servlet được kiểm soát bởi container mà servlet được triển khai. Khi một request được gắn với một servlet, container sẽ thực hiện các bước sau:
a. Nếu một thể hiện (instance) của servlet không tồn tại, container sẽ:
  • Tải lớp servlet
  • Tạo một thể hiện của lớp servlet
  • Khởi tạo thể hiện của servlet bằng cách gọi hàm init.
b. Gọi hàm service, và chuyển tham số đầu vào là đối tượng request và response.

2. Nếu container muốn loại bỏ servlet, nó sẽ gọi hàm destroy.
Kiểm soát các sự kiện trong vòng đời của servlet.
Bạn có thể giám sát và thực hiện các công việc dựa vào việc lắng nghe các sự kiện trong vòng đời của servlet. Bảng dưới đây là danh sách các sự kiện có thể được giám sát và thực thi. Khi một sự kiện lắng nghe (Listener method) được gọi, nó sẽ phát sinh ra các tham số sự kiện bao gồm các thông tin tương ứng với từng sự kiện. Ví dụ với các hàm trong HttpSessionListener sẽ được chuyển tham số HttpSessionEvent, được bao hàm trong HttpSession.


Object

Event

Listener Interface and Event
Class

Web context (see Accessing the Web Context)

Initialization and destruction

javax.servlet.ServletContextListener and

ServletContextEvent

Attribute added, removed, or replaced

javax.servlet.ServletContextAttributeListener and

ServletContextAttributeEvent

Session
(See Maintaining Client State)

Creation, invalidation, activation, passivation, and timeout

javax.servlet.http.HttpSessionListener, javax.servlet.http.HttpSessionActivationListener, and

HttpSessionEvent

Attribute added, removed, or
replaced

javax.servlet.http.HttpSessionAttributeListener and

HttpSessionBindingEvent

Request

A servlet request has started being processed by web components

javax.servlet.ServletRequestListener and

ServletRequestEvent

Attribute
added, removed, or replaced

javax.servlet.ServletRequestAttributeListener and

ServletRequestAttributeEvent


Dưới đây là một ví dụ:
import database.BookDBAO;
import javax.servlet.*;
import util.Counter;

import javax.ejb.*;
import javax.persistence.*;

public final class ContextListener
    implements ServletContextListener {
    private ServletContext context = null;

    @PersistenceUnit
    EntityManagerFactory emf;

    public void contextInitialized(ServletContextEvent event) {
        context = event.getServletContext();
        try {
            BookDBAO bookDB = new BookDBAO(emf);
            context.setAttribute("bookDB", bookDB);
        } catch (Exception ex) {
            System.out.println(
                "Couldn’t create database: " + ex.getMessage());
        }
        Counter counter = new Counter();
        context.setAttribute("hitCounter", counter);
        counter = new Counter();
        context.setAttribute("orderCounter", counter);
    }

    public void contextDestroyed(ServletContextEvent event) {
        context = event.getServletContext();
        BookDBAO bookDB = context.getAttribute("bookDB");
        bookDB.remove();
        context.removeAttribute("bookDB");
        context.removeAttribute("hitCounter");
        context.removeAttribute("orderCounter");
    }
}
3. Định nghĩa lớp lắng nghe các sự kiện:
Có thể định nghĩa các lớp lắng nghe sự kiện thông qua listener của phần định nghĩa trong project.
Có thể dùng netbean để định nghĩa, theo các bước sau:
  • Mở ứng dụng.
  • Chọn WEB-INF
  • Bấm kép vào web.xml
  • Bấm tab General.
  • Mở phần Web Application Listener.
  • Chọn Add.
  • Trong cửa sổ Add, chỉ tới lớp đã định nghĩa
  • Chọn Ok
Kiểm soát lỗi của servlet
Bất cứ khi nào xảy ra lỗi trong servlet, hệ thống , container sẽ sinh ra một trang mặc định với nội dung: A Servlet Exception Has Occurred
Nhưng ta có thể định nghĩa lại nội dung trang trả về mặc định này. Xem thêm tại Mapping Errors to Error Screens

26 tháng 11, 2013

Tạo SOAP message bằng Java

Về cơ bản một SOAP message bao gồm 3 thành phần:
  • SOAP-ENV:Envelope
  • SOAP-ENV:Header
  • SOAP-ENV:Body
Như hình vẽ dưới đây:
Để  tạo một SOAP message ta tuân thủ theo các bước sau:
  • Tạo một đối tượng của javax.xml.soap.MessageFactory.
  • Sau đó tạo đối tượng javax.xml.soap.SOAPMessage từ MessageFactory.
  • Một SOAPMessage sẽ chứa toàn bộ javax.xml.soap.SOAPEnvelope" 
  • Một SOAPEnvelope sẽ chứa header và body của SOAP message 
Và ta tạo SOAP message theo code ví dụ dưới đây:

18 tháng 11, 2013

Build scribe trên Ubuntu server 12.04 64 bit



http://ycavatars.blogspot.com/2012/05/build-scribe-on-ubuntu-1204.html
>

Một số link tham khảo:

Cài các thư viện cần thiết

$sudo apt-get install make flex bison libtool libevent-dev automake pkg-config libssl-dev libboost-all-dev libbz2-dev build-essential g++ python-dev git

Cài đặt Thrift

$git clone https://github.com/apache/thrift.git
$cd thrift
$git fetch
$git branch -a
$git checkout 0.9.x # latest version at this time
# install jdk and ant if you need the java code generator
$sudo apt-get install openjdk-6-jdk ant
$./bootstrap.sh #ignore warning
$./configure
$make
$sudo make install

Kiểm tra lại thrift

#in thrift/tutorial directory
$thrift -r -v --gen java tutorial.thrift
Nếu thấy thư mục gen-java được tạo ra là được.

Cài đặt fb303

#chuyển tới thư mục thrift/contrib/fb303
$./bootstrap.sh
$./configure CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H"
$make
$sudo make install

Cài đặt Python Module cho Thrift và fb303

# từ thư mục thrift
$ cd lib/py
$ sudo python setup.py install
$ cd contrib/fb303/py
$ sudo python setup.py install
Để kiểm tra module python đã được cài đặt, ta chạy lệnh, nếu không có lỗi là Okey:
$ python -c 'import thrift' ; python -c 'import fb303'

Cài đặt Scribe

Chú ý phải có bước chạy ./bootstrap.sh trước khi chạy configure.
$git clone https://github.com/facebook/scribe.git
$cd scribe
$./configure CPPFLAGS="-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -DBOOST_FILESYSTEM_VERSION=2" LIBS="-lboost_system -lboost_filesystem"
$make
$sudo make install
Tạo biến môi trường
export LD_LIBRARY_PATH=/usr/local/lib

Cài đặt module Python cho Scribe

$ cd lib/py
$ sudo python setup.py install
Kiểm tra lại bằng lệnh, thấy không có lỗi là okey:
$python -c 'import scribe'
  Cuối cùng là chạy  'scribed'.
Một số chú ý:
  • Hiện tôi phải lấy nguồn từ git thì mới build thành công, các nguồn khác tôi thử đều có lỗi.
  • Nếu thrift phải build thông qua proxy, bạn mở file thrift/lib/java/build.properties và thêm dòng sau:
    #proxy configure
    proxy.host=10.30.11.6 #ip của proxy server
    proxy.port=3128 #port của proxy server
    proxy.enabled=true

18 tháng 10, 2013

Cấu hình proxy trong Ubuntu bằng terminal

Bài này chúng ta sẽ tập trung vào thao tác cấu hình proxy cho các máy chạy Ubuntu bằng dòng lệnh ("terminal").
Ta sẽ tập trung giải quyết cho các câu hỏi:
  • Mạng nội bộ của tôi sử dụng proxy, tôi phải cấu hình nó như nào?
  • Tôi đã cài đặt proxy cho hệ thống, tuy nhiên lệnh "apt-get install" lại không thể cài đặt được phần mềm 
Trước hết, để sử dụng được proxy trên các máy chạy Ubuntu, ta cần phải thêm thông tin cấu hình vào tập tin "/etc/enviroment". Nội dung cần thêm như sau:
HTTP_PROXY="http://10.61.11.38:3128/"
HTTPS_PROXY="http://10.61.11.38:3128/"
FTP_PROXY="http://10.61.11.38:3128/"
NO_PROXY="localhost,127.0.0.1,localaddress,.localdomain.com"

http_proxy="http://10.61.11.38:3128/"
https_proxy="http://10.61.11.38:3128/"
ftp_proxy="http://10.61.11.38:3128/"
no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

Ta để cả in hoa và in thường để phòng trường hợp có một số ứng dụng không nhận một trong hai kiểu.
Tiếp theo, để có thể sử dụng proxy với lệnh "apt-get install" ta phải làm như sau.
Mở tập tin "/etc/apt/apt.conf" và thêm vào nội dung sau:

Acquire::http::proxy "http://10.61.11.38:3128/";

Sở dĩ phải thêm nội dung này do apt-get luôn bỏ qua nội dung trong tập tin enviroment.

Link tham khảo: http://askubuntu.com/questions/158557/setting-proxy-from-terminal

08 tháng 10, 2013

Abstract và Interface trong java

Bài viết này, người viết không nhằm mục đích đi sâu vào việc giải thích về hai thành phần này trong Java mà chỉ lạm bàn về mục đích, sự khác biệt trong sử dụng của chúng. Mọi vấn đề sẽ chỉ dừng ở hiểu biết của chính bản thân người viết.
Trước tiên câu hỏi đặt ra ở đây là "Ta sử dụng hai cái này như thế nào?"
  • Abstract class: sẽ được dùng khi chúng ta biết rõ một số thao tác cần phải có ở đây nhưng chưa rõ nếu đi vào cụ thể thì nó phải được thực hiện như thế nào và một số thao tác đã biết rõ rồi. Lấy ví dụ như ta có một lớp Vehicles, như vậy những thao tác mà ta biết rõ sẽ gồm như bơm hơi nhưng một số thao tác ta chỉ biết chung chung là nổ máy nhưng cụ thể với xe như nào thì làm như nào lại chưa biết.
  • Interface class: có thể hiểu nó cũng giống như abstract class, tuy nhiên, mọi method của nó đều chỉ là một declare (tức là không có nội dung) và phải để các lớp con của nó định nghĩa cụ thể.

29 tháng 8, 2013

Cấu hình mạng trên Linux

Cái này là một kinh nghiệm "đau thương" của người viết gặp phải khi triển khai hệ thống máy chủ cho cty của mình. Đó là khi tôi cố gắng cài đặt mạng cho một máy chủ chạy Ubuntu server 10.04 LTS 64 bit. Tôi đã cấu hình trực tiếp vào file /etc/network/interface và /etc/resolv.conf nhưng không thể được.
Hiện tượng tôi gặp phải là:
  • Ping chỉ lên tới gateway, không ra được mạng.
  • Trên máy có 2 card mạng (eth0 và eth1), không hiểu sao khi tôi cấu hình thì các thông số card luôn bị "dính" tức là khi tôi thêm thông số cho eth0, nhưng sau đó thay đổi lại thì eth0 vẫn giữ các giá trị cũ.
Vì vậy, trong bài này, tôi sẽ hướng dẫn bạn một cách cấu hình khác, không theo lối cũ và tôi khuyên bạn chỉ dùng cách này khi cách ở trên đã vô hiệu.
Nội dung bài viết được viết theo tiến trình tìm hiểu của người viết, không phải theo cách làm step-by-step.
Bài học số 1: Cấu hình mạng bằng lệnh ifconfig
  • Để xem thông tin của một card mạng ta dùng lệnh sau:
    ifconfig eth0 (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
  • Xem thông tin của tất cả card mạng trong hệ thống ta dùng lệnh sau:
    ifconfig -a
  • Tắt một card mạng:
    ifconfig eth0 down (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
  • Bật một card mạng:
    ifconfig eth0 up (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
  • Gán ip cho một card mạng:
    ifconfig eth0 192.168.2.2 (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
  • Thay đổi subnet mask cho một card mạng:
    ifconfig eth0 netmask 255.255.255.0 (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
  • Thay đổi broadcast cho một card mạng:
    ifconfig eth0 broadcast 192.168.2.255
Xem thêm tại: link tham khảo
Bài học số 2: cấu hình gateway cho mạng bằng lệnh route
Cái này chỉ cần lệnh sau:
route add default gw 192.168.1.254 eth0 (eth0 là tên card mạng cần xem, có thể là eth1, wlan0,...)
Xem thêm tại: link tham khảo
Bài học số 3: khởi động lại vẫn giữ được những thông tin vừa cấu hình
Lưu ý, những điều bạn vừa làm ở trên, sau khi khởi động lại máy sẽ bị mất. Vậy muốn giữ bạn phải làm như sau:
Mở tập tin /etc/rc.local và thêm các dòng sau vào trước "exit 0".
sudo ifconfig eth0 192.168.2.2
sudo  ifconfig eth0 netmask 255.255.255.0
sudo ifconfig eth1 down (cái này là tôi disable card eth1 đi cho khỏi xung đột thôi, bạn muốn thêm hay không thì tùy)
sudo ifconfig eth0 up
sudo route add default gw 192.168.1.254 eth0
Xem thêm tại: link tham khảo
Bài học số 4: máy có nhiều card mạng, biết là mình đang cắm dây vào card nào đây?
Cái này, tôi nhiều lần bị vướng, cắm cable mạng vào đuôi máy nhưng không biết đó là card số mấy. Kinh nghiệm là làm như sau:
Cắm cable mạng vào đã.
Dùng lệnh ifconfig tắt tất cả các card mạng đi, sau đó lần lượt bật từng cái một lên, bật cái nào thì tắt các cái còn lại đi. Tới khi nào bạn thấy đèn báo mạng nháy ở vị trí cắm thì đó chính là card mạng bạn muốn tìm.

File descriptor trong Linux

Mô tả nôm na thì số lượng file descriptor là số file mà một người dùng hệ thống có thể mở trong một phiên làm việc của mình.
 Hard limit là thông số chỉ có thể thay đổi bởi người quản trị, nó là giới hạn trên của soft limit, các soft limit không được vượt quá giá trị của hard limit.
Soft limit là thông số có thể thay đổi bởi user và process, nó là giá trị quy định số file có thể mở cùng lúc trong một phiên làm việc và không thể lớn hơn giá trị quy định trong hard limit.
Để xem giá trị của hard limit và soft limit ta làm như sau:
  • Chuyển sang người dùng muốn xem, ví dụ user1.
  • Xem hard limit bằng lệnh: ulimit -Hn
  • Xem soft limit bằng lệnh: ulimit -Sn
Để tác động tới các giá trị này trong toàn hệ thống
 Để thay đổi với toàn hệ thống, người dùng cần thay đổi giá trị của hard limit và soft limit trong tập tin /etc/sysctl.conf.
Khi gặp trường hợp số tập tin mở cùng lúc vượt quá mức quy định, bạn cần làm như sau:
  • Thay đổi giá trị trong tập tin /proc/sys/fs/file-max bằng người dùng root
    sysctl -w fs.file-max=10000
    Lệnh này sẽ yêu cầu thay đổi giá trị sang 10000
  • Sau khi đổi bạn cần thay đổi giá trị trong tập tin /etc/sysctl.conf để thông tin thay đổi vẫn được giữ nguyên khi khởi động lại máy, bằng cách thêm dòng sau vào:
    fs.file-max = 10000
  • Sau đó gõ lệnh sau để áp dụng các thay đổi:
    sysctl -p
Để tác động tới các giá trị này của người dùng:
Để thay đổi với người dùng cụ thể , ta thay đổi nội dung trong tập tin /etc/security/limits.conf.
Ví dụ để thay đổi giá trị cho user1, ta thêm các giá trị sau:
user1 soft nofile 1024
user1 hard nofile 2048

05 tháng 8, 2013

Các thủ thuật hay cho người quản trị hệ thống Zimbra (update ngày 05/08/2013)

1 - Tôi muốn thống kê tình trạng sử dụng của người dùng trong hệ thống
Bạn chạy lệnh sau:
zmprov gqu domain.com
Hệ thống sẽ hiển thị theo cấu trúc sau:
Tên account - Quota đã dùng - Quota được cấp.
Xem thêm tại:
http://wiki.zimbra.com/wiki/Mailbox_usage_report
2 - Tôi muốn thống kê tình trạng sử dụng message của hệ thống.
Bạn chạy lệnh sau:
zmdailyreport
với lệnh này, bạn sẽ có các tùy chọn sau:
--user Report usage for only
--mail Send report via email, default is stdout
--now Shortcut for midnight to the current time
--time , Default is midnight to midnight of the previous day

Xem thêm tại:
http://www.zimbra.com/forums/administrators/27700-solved-monthly-messages-report.html

07 tháng 5, 2013

Lập trình hướng đối tượng với Javascript

Đây là bài tổng kết vì các bộ quy tắc lập trình hướng đối tượng trong Javascript.
Cái lợi của nó ở đây sẽ là:
  • Code rõ ràng hơn rất nhiều.
  • Maintaince dễ hơn.
  • Code có cấu trúc hơn, dễ đọc hơn.
  • Và cuối cùng sẽ dễ dàng hơn cho những người muốn chuyển từ các ngôn ngữ như Java, C++ sang Javascript
Bài viết này mình sẽ chỉ tổng hợp lại một số ý chính cần nhớ, không dông dài (vì đọc thấy nguồn tài liệu trên mạng thì nhiều nhưng toàn "khoai" quá, đọc mãi mà cũng chỉ nắm được tí tí). Cấu trúc đại khái của một class trong Javascript nó sẽ thế này:
//hàm khởi tạo
function Classname(){
      //Khai báo các biến private
      var var1 = value;
      var var2 = value;
      //khai báo các biến public
      this.var3 = value;
      this.var4 = value;
      //Khai báo các hàm private
      function method1(){
      }
}
//Nếu Class này kế thừa một class khác thì dùng phần này
Classname.prototype = new ParentClass();
Classname.prototype.constructor = Classname;
//Khai báo thêm các biến public ở đây
Classname.prototype.var5 = value;
//Khai báo hàm public như này
Classname.prototype.method2 = function(){
}
//Khai báo hàm static và biến static như này:
Classname.var6 = value;
Classname.method = function(){
}

Và đây là bộ quy tắc:
  • Biến private chỉ có thể truy cập bằng hàm private và hàm privileged
  • Biến public có thể truy cập từ trong và ngoài của Object.
  • Biến và hàm static có thể sử dụng mà không cần khởi tạo Object
  • Một properties nếu được khai báo là một prototype thì có thể bị ghi đè.
  • Nếu khai báo một biến hoặc hàm với từ khoá var nằm độc lập (không nằm trong hàm nào của Class) thì nó sẽ được coi là một biến hoặc hàm Global.
  • Từ khoá this:
    •  Nếu khi khởi tạo đối tượng ta dùng từ khoá new, thì this sẽ là đối tượng đó.
    • Nếu không có từ khoá new thì this sẽ là một global object
    • Tốt nhất là nên có new nếu không thì sẽ chịu hậu quả khó lường khi dùng this
  •  Một nguyên tắc khi truy câp các dạng biến (cái này cho java, không phải cho javascript tuy nhiên có thể áp dụng được):
    Modifier    | Class | Package | Subclass | World
    ————————————+———————+—————————+——————————+———————
    public      |  ✔    |    ✔    |    ✔     |   ✔
    ————————————+———————+—————————+——————————+———————
    protected   |  ✔    |    ✔    |    ✔     |   ✘
    ————————————+———————+—————————+——————————+———————
    no modifier |  ✔    |    ✔    |    ✘     |   ✘
    ————————————+———————+—————————+——————————+———————
    private     |  ✔    |    ✘    |    ✘     |   ✘
Một số lưu ý:
  • Unconfirm: nếu một biến là undefine thì trong các phép toán boolean nó sẽ có giá trị là false.

12 tháng 3, 2013

Gửi mail tới Yahoo và Gmail bằng Java

1 - Gửi mail tới Yahoo bằng java
Dưới đây là code ví dụ:
//Use TLS protocal
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.mail.yahoo.com");
        props.put("mail.debug", "false");
        //props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.port", "587");
        final String password = mbox.getAccount().getDataSourceByName(datasourceName).getDecryptedPassword();
        final String username = datasourceName;
        Session mailSession = Session.getInstance(props,
            new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(username, password);
                }
            }
        );
        Transport transport = mailSession.getTransport("smtp");
        transport.connect();
        transport.sendMessage(mm, rcptAddress);
        transport.close();
2 - Gửi mail tới Gmail bằng java
Dưới đây là code ví dụ:
//Use TLS protocal
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.port", "465");
        final String password = mbox.getAccount().getDataSourceByName(datasourceName).getDecryptedPassword();
        final String username = datasourceName;
        Session mailSession = Session.getInstance(props,
            new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(username, password);
                }
            }
        );
        Transport transport = mailSession.getTransport("smtp");
        transport.connect();
        transport.sendMessage(mm, rcptAddress);
        transport.close();
Xem thêm tại các địa chỉ sau:
Gửi mail bằng java
Cách sử dụng TLS/SSL trong java để gửi mail

28 tháng 2, 2013

Cài đặt SSH public/private key

SSH có thể được cài đặt bằng cặp khóa public/private key để giúp người dùng không phải nhập mật khẩu mỗi lần muốn đăng nhập máy chủ từ xa.
Các bước thực hiện:
1 - Sử dụng dsa
  • Gõ lệnh: ssh-keygen -t dsa sẽ thấy các dòng sau:
Generating public/private dsa key pair.
Enter file in which to save the key (~/.ssh/id_dsa):
(just type return)
Enter passphrase (empty for no passphrase):
(just type return)
Enter same passphrase again:
(just type return)
Your identification has been saved in ~/.ssh/id_dsa
Your public key has been saved in ~/.ssh/id_dsa.pub
The key fingerprint is:
Some really long string

  • Copy nội dung file id_dsa.pub vào file ~/.ssh/authorized_keys trên server từ xa. Thao tác này cho phép máy local sẽ đăng nhập được vào máy remote mà không cần phải sử dụng mật khẩu.
2 - Sử dụng rsa
  • Gõ lệnh: ssh-keygen -t rsa -b 4096
  • Chọn tên id_rsa và id_rsa.pub thay vì id_dsa và id_dsa.pub
Chú ý về quyền trên thư mục .ssh, phải là 700 
Nếu có nhiều máy chủ làm việc với nhau thì:
  • Đưa nội dung các public key vào chung một file authorized_keys bằng lệnh: cat file1 >> authorized_keys
  •  Lưu ý, mỗi pub key phải trên một dòng

15 tháng 1, 2013

Cách khắc phục một số lỗi thường gặp của java trên Linux

1 - Khi build tôi nhận được thông báo "/bin/sh: jar not found" mặc dù tôi đã cài jdk?
  • Nguyên nhân là do trình biên dịch không tìm thấy file jar tương ứng.
  • Cách khắc phục là bạn chỉ lại đường dẫn tới file jar này bằng lệnh:
    sudo update-alternative --install "/usr/bin/jar" "jar" "/đường/dẫn/tới/file/jar" 1
2 - Khi build tôi nhận được thông báo lỗi ở từ khóa "@Override" mặc dù trên eclipse tôi vẫn build bình thường?
  • Nguyên nhân do bạn đang dùng bản jdk5, nó không hỗ trợ build với từ khóa Overrride
  • Cách khắc phục là bạn hãy chọn phiên bản jdk cao hơn, jdk6 chẳng hạn.
3 - Khi build tôi gặp thông báo lỗi không tìm thấy file tools.jar mặc dù tôi đã cài jdk cho hệ thống.
  • Bạn nên cài sun-java vào cho hệ thống
4- Tôi muốn cài sun-java trên Ubuntu, tôi phải làm thế nào?
  • Bạn chạy lệnh sau để thêm kho (Repository) vào:

    add-apt-repository ppa:sun-java-community-team/sun-java6
    apt-get update
    apt-get install sun-java6-jdk
    update-java-alternatives -s java-6-sun