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à...

29 tháng 8, 2013

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

13 tháng 11, 2012

Sử dụng kết nối SSL/TLS trên java với các self-certificate

Vấn đề này tôi gặp phải khi viết một unitest cho kết nối imaps tới một server sử dụng self-certificate. Mọi nỗ lực kết nối tới server tôi đều gặp lỗi java phàn nàn về việc kết nối sử dụng một certificate không đáng tin - "untrusted certificate". Câu hỏi đặt ra ở đây là làm thế nào để ép java tiếp tục sử dụng kết nối này?
Nếu bạn để ý mỗi khi bạn dùng trình duyệt để kết nối tới một địa chỉ dạng https:// nào đó bạn có thể nhận được thông báo về việc đây là một kết nối không đáng tin, nếu bạn tin tưởng nó thì có thể thêm ngoại lệ này vào trình duyệt. Và đây cũng là ý tưởng để tôi giải quyết vấn đề này, đó là tôi cần phải tìm cách để java sẽ tự động thêm certificate này vào kho lưu trữ của mình hoặc đánh lừa java để nó luôn luôn tin tưởng vào certificate này.
Cách làm như sau:
  • Trước khi mở kết nối tôi cho java chạy qua hàm sau:
    private static void disableUntrustedComplain(){
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers(){
                        return null;
                    }
                   
                    public void checkClientTrusted(X509Certificate[] certs, String authType){}
                   
                    public void checkServerTrusted(X509Certificate[] certs, String authType){}
                }
            };
            try{
                SSLContext sc = SSLContext.getInstance("TLS");//SSL nếu sử dụng mã hóa SSL.
                sc.init(null, trustAllCerts, new SecureRandom());
                SSLContext.setDefault(sc);
                System.out.println("disabled");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
  •  Hàm này có tác dụng giúp java bỏ qua các complaining về untrusted certificate
  • Sau khi chạy hàm này chúng ta có thể thoải mái kết nối tới bất kỳ một kết nối nào sử dụng SSL/TLS.
Vui lòng xem thêm tại đây để tham khảo:http://abhinavasblog.blogspot.com/2011/07/allow-untrusted-certificate-for-https.html 
UPDATE:
    Gần đây tôi có làm việc với các kết nối liên quan tới giao thức XMPP (cụ thể là với Openfire) thì thấy cần phải sửa đoạn code trên một chút thì mới chạy được (Lưu ý là chỉ áp dụng với Openfire thôi nhé).
    Khi xử lý kết nối với Openfire sử dụng các self-certificate, mặc dù tôi sử dụng hàm ở phía trên nhưng vẫn bị dính lỗi PKIX không tin tưởng certificate. Để xử lý lỗi này tôi làm như sau:
Khi khởi tạo kết nối tới server XMPP tôi thêm thông tin cấu hình như sau:
SSLContext sc = disableUntrustedComplain();
        ConnectionConfiguration cc = new ConnectionConfiguration("mydomain.com", 5222);
        cc.setCustomSSLContext(sc);
        XMPPConnection connection = new XMPPTCPConnection(cc);
Trong đó có một số điểm lưu ý:
  • Hàm disableUntrustedComplain tôi trả về một giá trị thay vì sử dụng void như ở trên.
    Hàm này nội dung sẽ như sau:
    private static SSLContext disableUntrustedComplain(){
            SSLContext sc = null;
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {

                    @Override
                    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {

                    }

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                }
            };
            //install the all-trusting trust manager
            try {
                sc = SSLContext.getInstance("TLS");//TLS or SSL
                sc.init(null, trustAllCerts, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                SSLContext.setDefault(sc);
                System.out.println("disable");
            } catch(NoSuchAlgorithmException naex){
                naex.printStackTrace();
            }catch(KeyManagementException kmex){
                kmex.printStackTrace();
            }finally{
                return sc;
            }
        }