ダン・クァン・ミン Blog

はじめまして

Java for Beginner

Nguyên tắc trong java

Dưới đây là năm mục tiêu chính khi làm việc với ngôn ngữ Java:

  • Nó phải “đơn giản, hướng đối tượng, và gần gũi”.
  • Nó phải “mạnh mẽ và bảo mật”.
  • Nó phải “Độc lập với cấu trúc và dễ di chuyển”.
  • Nó phải “hiệu suất cao”.
  • Nó phải “đa luồng, và có tính động”

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

Lập trình hướng đối tượng (gọi tắt là OOP, từ chữ Anh ngữ object-oriented programming), hay còn gọi là lập trình định hướng đối tượng, là kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là các phương pháp trước đó.

Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là tương tác với các đối tượng vật lý.

Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường.

Tính trừu tượng (abstraction):

Đây là khả năng của chương trình bỏ qua hay không chú ý đến một số khía cạnh của thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có khả năng tập trung vào những cốt lõi cần thiết. Mỗi đối tượng phục vụ như là một “động tử” có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác. Tính chất này thường được gọi là sự trừu tượng của dữ liệu.

Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể có một số đặc điểm chung cho nhiều đối tượng khác như là sự mở rộng của nó nhưng bản thân đối tượng ban đầu này có thể không có các biện pháp thi hành. Tính trừu tượng này thường được xác định trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng.

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding):

Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Tính đa hình (polymorphism):

Thể hiện thông qua việc gửi các thông điệp (message). Việc gửi các thông điệp này có thể so sánh như việc gọi các hàm bên trong của một đối tượng. Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau. Người lập trình có thể định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không bị nhầm lẫn.

Thí dụ khi định nghĩa hai đối tượng “hinh_vuong” và “hinh_tron” thì có một phương thức chung là “chu_vi”. Khi gọi phương thức này thì nếu đối tượng là “hinh_vuong” nó sẽ tính theo công thức khác với khi đối tượng là “hinh_tron”.

Tính kế thừa (inheritance):

Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này.

Một số khái niệm cần biết

Lớp (class)

Một lớp có thể được hiểu là khuôn mẫu để tạo ra các đối tượng. Trong một lớp, người ta thường dùng các biến để mô tả các thuộc tính và các hàm để mô tả các phương thức của đối tượng. Khi đã định nghĩa được lớp, ta có thể tạo ra các đối tượng từ lớp này. Để việc sử dụng được dễ dàng, thông qua hệ thống hàm tạo (constructor), người ta dùng lớp như một kiểu dữ liệu để tạo ra các đối tượng.

Lớp con (subclass)

Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một phần hay toàn bộ các đặc tính của một lớp khác. Lớp chia sẻ sự kế thừa gọi là lớp cha (parent class).

Lớp trừu tượng hay lớp cơ sở trừu tượng (abstract class)

Lớp trừu tượng là một lớp mà nó không thể thực thể hóa thành một đối tượng thực dụng được. Lớp này được thiết kế nhằm tạo ra một lớp có các đặc tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ý nghĩa) để có thể tiến hành viết mã cho việc thực thể hóa. (xem thí dụ)

Thí dụ: Lớp “hinh” được định nghĩa không có dữ liệu nội tại và chỉ có các phương thức (hàm nội tại) “tinh_chu_vi”, “tinh_dien_tich”. Nhưng vì lớp hinh này chưa xác định được đầy đủ các đặc tính của nó (cụ thể các biến nội tại là tọa độ các đỉnh nếu là đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn,…) nên nó chỉ có thể được viết thành một lớp trừu tượng. Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp “tam_giac”, lớp “hinh_tron”, lớp “tu_giac”,…. Và trong các lớp con này người viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán kính và hằng số nội tại Pi cho lớp “hinh_tron” và sau đó viết mã cụ thể cho các phương thức “tinh_chu_vi” và “tinh_dien_tich”).

Phương thức (method)

Phương thức của một lớp thường được dùng để mô tả các hành vi của đối tượng (hoặc của lớp). Ví dụ như đối tượng thuộc lớp điện thoại có các hành vi sau: Đổ chuông, chuyển tín hiệu từ sóng sang dạng nghe được, chuyển tín hiệu giọng nói sang dạng chuẩn, chuyển tín hiệu lên tổng đài.v.v. Khi thiết kế, người ta có thể dùng các phương thức để mô tả và thực hiện các hành vi của đối tượng. Mỗi phương thức thường được định nghĩa là một hàm, các thao tác để thực hiện hành vi đó được viết tại nội dung của hàm. Khi thực hiện hành vi này, đối tượng có thể phải thực hiện các hành vi khác. Ví dụ như điện thoại phải chuyển tín hiệu giọng nói sang dạng chuẩn trước khi chuyển lên tổng đài. Cho nên một phương thức trong một lớp có thể sử dụng phương thức khác trong quá trình thực hiện hành vi của mình.

Người ta còn định nghĩa thêm vài loại phương thức đặc biệt:

  • Hàm tạo (constructor) là hàm được dùng để tạo ra một đối tượng, cài đặt các giá trị ban đầu cho các thuộc tính của đối tượng đó.
  • Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ đã dùng để lưu đối tượng và hủy bỏ tên của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồm cả việc xóa các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng.

Nhiều lớp thư viện có sẵn hàm tạo mặc định (thông thường không có tham số) và hàm huỷ.

Thuộc tính (attribute)

Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước. Như đã ghi, khi một lớp đã được thực thể hoá thành đối tượng cụ thể thì tập hợp các giá trị của các biến nội tại làm thành trạng thái của đối tượng. Giống như trường hợp của phương thức, tùy theo người viết mã, biến nội tại có thể chỉ được dùng bên trong các phương thức của chính lớp đó, có thể cho phép các câu lệnh bên ngoài lớp, hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ lớp con, (và quan hệ bạn bè (friend) trong C++) được phép dùng tới nó (hay thay đổi giá trị của nó). Mỗi thuộc tính của một lớp còn được gọi là thành viên dữ liệu của lớp đó.

Thực thể hóa (instantiate)

Là quá trình khai báo để có một tên (có thể được xem như là một biến) trở thành một đối tượng từ một lớp nào đó.

Một lớp sau khi được tiến hành thực thể hóa để có một đối tượng cụ thể gọi là một thực thể. Hay nói ngược lại một thực thể là một đối tượng riêng lẻ của một lớp đã định trước. Như các biến thông thường, hai thực thể của cùng một lớp có thể có trạng thái nội tại khác nhau (xác định bởi các giá trị hiện có của các biến nội tại) và do đó hoàn toàn độc lập nhau nếu không có yêu cầu gì đặc biệt từ người lập trình. “ Thực thể hóa: gần giống như cá nhân hóa. Một lớp khi được ” cá nhân hóa" sẽ thành một đối tượng cụ thể.

Công cộng (public)

Công cộng là một tính chất được dùng để gán cho các phương thức, các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép các câu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó.

Riêng tư (private)

Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc tính hay một lớp). Khi dùng tính chất này gán cho một biến, một phương thức thì biến hay phương thức đó chỉ có thể được sử dụng bên trong của lớp mà chúng được định nghĩa. Mọi nỗ lực dùng trực tiếp đến chúng từ bên ngoài qua các câu lệnh hay từ các lớp con sẽ bị phủ nhận hay bị lỗi.

Bảo tồn (protected)

Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu tính chất này. Nhìn chung đây là tính chất mà khi dùng để áp dụng cho các phương thức, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó hay các lớp con của nó (hay trong nội bộ một gói như trong Java) được phép gọi đến hay dùng đến các phương pháp, biến hay lớp đó.

So với tính chất riêng tư thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ dữ liệu hay chức năng. Nó cho phép một số trường hợp được dùng tới các đặc tính của một lớp (từ một lớp con chẳng hạn).

Lưu ý: Các tính chất công cộng, riêng tư và bảo tồn đôi khi còn được dùng để chỉ thị cho một lớp con cách thức kế thừa một lớp cha như trong C++.

Đa kế thừa (multiple inheritance)

Đây là một tính chất cho phép một lớp con có khả năng kế thừa trực tiếp cùng lúc nhiều lớp khác.

Vài điểm cần lưu ý khi viết mã dùng tính chất đa kế thừa:

  • Khi muốn có một sự kế thừa từ nhiều lớp cha thì các lớp này cần phải độc lập và đặc biệt tên của các dữ liệu hay hàm cho phép kế thừa phải có tên khác nhau để tránh lỗi “ambiguity”. Bởi vì lúc đó trình dịch sẽ không thể xác định được là lớp con sẽ thừa kế tên nào của các lớp cha.
  • Nhiều ngôn ngữ, ví dụ như Java, không có đa thừa kế, nhưng chúng có khái niệm giao diện Interface. Với Interface, ta có thể có hầu hết các lợi ích mà đa thừa kế mang lại.

Ngoài các khái niệm trên, tùy theo ngôn ngữ, có thể sẽ có các chức năng OOP riêng biệt được cấp thêm vào.

Explore About RESTful Webservice

RESTtful webservice là gì?

REST là một tập hợp các nguyên tắc mà dữ liệu có thể truyền qua phương thức truyền tin (như là HTTP). REST là từ viết tắt của Representational State Transfer.

This basically means that each unique URL is a representation of some object.

Represntational : Tiêu biểu, tượng trưng; Đại diện, thay mặt

State: Trạng thái; tình trạng

Transfer: Sự di chuyển, sự dời chỗ; sự truyền

REST yêu cầu người lập trình sử dụng các phương thức HTTP một cách rõ ràng và theo một cách phù hợp với định nghĩa giao thức. Nguyên tắc thiết kế cơ bản là thiết lập một ánh xạ 1:1 giữa create, read, update và delete (CRUD) và HTTP methods. Tuân theo quy tắc dưới đây:

  • Để “create”, hãy sử dụng POST
  • Để “read”, hãy sử dụng GET.
  • Để “update”, hãy sử dụng PUT.
  • Để “delete”, hãy sử dụng DELETE.

Who is using Restful webservice?

Internet giants like Yahoo, Amazon, eBay and more are using Restful webservice

Rest vs SOAP

REST SOAP
REST stands for REpresentational State Transfer SOAP stands for Simple Object Access Protocol
REST is not XML protocol based SOAP is a XML based messaging protocol
REST doesn’t have any specification SOAP has specifications like WSDL etc
REST doesn’t enforce message format as XML or JSON SOAP enforces message format as XML
Light weight – due to the usage of JSON Heavy weight – due to the usage of XML
Easy to parse the response Bit difficult to parse the response

RESTFul Webservice Request and Response – Drill down

Bước đầu tiên khi thiết kế RESTFul webservice là lựa chọn domain name đúng - gửi đến weatherinfo.org để hỏi thông tin thời tiết của các thành phố.

Hãy xem ví dụ đầu tiên (weatherinfo.org) đã lấy tên thành phố là đầu vào, lấy thông tin thời tiết của thành phố và gửi trả kết quả lại cho trình duyệt. Giả sử các kết quả trả về là XML format, nó có thể là JSON một cách dễ dàng.

Dưới đây là cấu trúc của Request và Response:

HTTP Request

The client request from the browser will look like:

GET http://weatherinfo.org/getweather/mumbai HTTP/1.1

HTTP Response

The server response will look like

HTTP/1.1 200 Ok
Date: Mon, 14 Apr 2014 10:20:58 GMT
Content-Type: text/xml
Content-length: 139

<City name="Mumbai" datetime="2014-04-14 10:20:58 GMT" >
<Condition>Scattered Clouds</Condition>
<Temp>33</Temp>
</City>

Line 1 is the initial line which has the HTTP response code – 200 OK, lines 2 through 4 are the HTTP headers (there can be lots of headers, only 3 are shown here), line 5 is the mandatory blank line separating header and body, and lines 6 through 10 constitute the “HTTP Body (or content)” – this part is the data that the response carries and can be in any format, not necessarily XML.

In fact, the most commonly used format on the web is HTML – one that web servers use to send back data to browsers. Whatever it is, the “Content-type” header usually specifies it. But if you are writing a web service, JSON is a better choice, but that is upto me. If your web service does not return complex or composite data, the format does not need to be JSON – it can be plain , in which case the body will just be a string of characters.

Advantages of using RESTful webservice

  1. RESTful Web services are designed with less dependence on proprietary middleware (for example, an application server) than the SOAP- and WSDL-based kind.

  2. As per the RESTful interface design, XML or JSON over HTTP is a powerful interface that allows internal applications, such as Asynchronous JavaScript + XML/JSON (Ajax)-based custom user interfaces, to easily connect, address, and consume resources.

  3. The great fit between Ajax and REST has increased the amount of attention REST is getting these days.

  4. Exposing a system’s resources through a RESTful API is a flexible way to provide different kinds of applications with data formatted in a standard way. It helps to meet integration requirements that are critical to building systems where data can be easily combined (mashups) and to extend or build on a set of base, RESTful services into something much bigger.

JavaScript RegExp Reference

Một biểu thức chính quy là một chuỗi các ký tự tạo thành một mẫu tìm kiếm.

Một mẫu tìm kiếm có thể được sử dụng cho tìm kiếm văn bản và thay thế text trong văn bản.

What Is a Regular Expression?

Khi bạn tìm kiếm dữ liệu trong văn bản, có thể sử dụng mẫu tìm kiếm này để miêu tả cái đang tìm kiếm.

Một biểu thức chính quy có thể là một ký tự, hoặc có thể là môt mẫu phức tạp.

Biểu thức chính quy có thể được sử dụng để thực hiện xử lý tìm kiếm và thay thế văn bản.

Syntax

/pattern/modifiers;

Example:

var patt = /w3schools/i

Example explained:

  • /w3schools/i là một biểu thức chính quy
  • w3schools là một mẫu (to be used in a search).
  • i là một modifier (modifies the search to be case-insensitive).

Using String Methods

In JavaScript, regular expressions are often used with the two string methods: search() and replace().

The search() method uses an expression to search for a match, and returns the position of the match.

The replace() method returns a modified string where the pattern is replaced.

Using String search() With a Regular Expression

Example use a regular expression to do a case-insensitive search for “w3schools” in a string:

var str = "Visit W3Schools";
var n = str.search(/w3schools/i);

The result in n will be: 6

Using String search() With String

Example use a case insensitive regular expression to replace Microsoft with W3Schools in a string:

var str = "Visit Microsoft!";
var res = str.replace(/microsoft/i, "W3Schools");

The result in res will be: Visit W3Schools!

Using String replace() With a String

The replace() method will also accept a string as search argument:

var str = "Visit Microsoft!";
var res = str.replace("Microsoft", "W3Schools");

RegExp Object

A regular expression is an object that describes a pattern of characters.

Regular expressions are used to perform pattern-matching and “search-and-replace” functions on text.

Syntax

/pattern/modifiers;

Example:

var patt = /w3schools/i

Modifiers

Modifiers are used to perform case-insensitive and global searches:

Modifier        Description
i               Bật chế độ tìm kiếm phân biệt hoa thường
g               Bật chế độ tìm kiếm toàn cục (nếu không thì sẽ chỉ tìm kiếm kết quả đầu tiên)
m               bật chế độ tìm kiếm trên nhiều dòng

Brackets

Cặp ngoặc được dùng để tìm kiếm một dải ký tự:

Expression      Description
[abc]           1 ký tự a hoặc b hoặc c
[^abc]          1 ký tự nào đó khác a,b,c (ví dụ d)
[0-9]           1 ký tự số từ 0 đến 9
[^0-9]          1 ký tự số không phải từ 0 đến 9
(x|y)           1 ký tự hoặc là x hoặc là y

Metacharacters

Metacharacters are characters with a special meaning:

Metacharacters  Description
.               Find a single character, except newline or line terminator
\w              Find a word character
\W              Find a non-word character
\d              Find a digit
\D              Find a non-digit character
\s              Find a whitespace character
\S              Find a non-whitespace character
\b              Find a match at the beginning/end of a word
\B              Find a match not at the beginning/end of a word
\0              Find a NUL character
\n              Find a new line character
\f              Find a form feed character
\r              Find a carriage return character
\t              Find a tab character
\v              Find a vertical tab character
\xxx            Find the character specified by an octal number xxx
\xdd            Find the character specified by a hexadecimal number dd
\uxxxx          Find the Unicode character specified by a hexadecimal number xxxx

Quantifiers

Quantifier      Description
n+              Matches any string that contains at least one n
n*              Matches any string that contains zero or more occurrences of n
n?              Matches any string that contains zero or one occurrences of n
n{X}            Matches any string that contains a sequence of X n's
n{X,Y}          Matches any string that contains a sequence of X to Y n's
n{X,}           Matches any string that contains a sequence of at least X n's
n$              Matches any string with n at the end of it
^n              Matches any string with n at the beginning of it
?=n             Matches any string that is followed by a specific string n
?!n             Matches any string that is not followed by a specific string n

RegExp Object Properties

Property        Description
constructor     Returns the function that created the RegExp object's prototype
global          Checks whether the "g" modifier is set
ignoreCase      Checks whether the "i" modifier is set
lastIndex       Specifies the index at which to start the next match
multiline       Checks whether the "m" modifier is set
source          Returns the text of the RegExp pattern

RegExp Object Methods

Method          Description
compile()       Deprecated in version 1.5. Compiles a regular expression
exec()          Tests for a match in a string. Returns the first match
test()          Tests for a match in a string. Returns true or false
toString()      Returns the string value of the regular expression

Regular Expression

From Wikipedia

In theoretical computer science and formal language theory, a regular expression (abbreviated regex or regexp and sometimes called a rational expression) is a sequence of characters that define a search pattern, mainly for use in pattern matching with strings, or string matching, i.e. “find and replace”-like operations. The concept arose in the 1950s, when the American mathematician Stephen Kleene formalized the description of a regular language, and came into common use with the Unix text processing utilities ed, an editor, and grep (global regular expression print), a filter.

Regular expressions are so useful in computing that the various systems to specify regular expressions have evolved to provide both a basic and extended standard for the grammar and syntax; modern regular expressions heavily augment the standard. Regular expression processors are found in several search engines, search and replace dialogs of several word processors and text editors, and in the command lines of text processing utilities, such as sed and AWK.

Many programming languages provide regular expression capabilities, some built-in, for example Perl, JavaScript, Ruby, AWK, and Tcl, and others via a standard library, for example .NET languages, Java, Python and C++ (since C++11). Most other languages offer regular expressions via a library.

Biểu thức chính quy (tiếng Anh: regular expression, viết tắt là regexp, regex hay regxp) là một chuỗi miêu tả một bộ các chuỗi khác, theo những quy tắc cú pháp nhất định. Biểu thức chính quy thường được dùng trong các trình biên tập văn bản và các tiện ích tìm kiếm và xử lý văn bản dựa trên các mẫu được quy định. Nhiều ngôn ngữ lập trình cũng hỗ trợ biểu thức chính quy trong việc xử lý chuỗi, chẳng hạn như Perl có bộ máy mạnh mẽ để xử lý biểu thức chính quy được xây dựng trực tiếp trong cú pháp của chúng. Bộ các trình tiện ích (gồm trình biên tập sed và trình lọc grep) đi kèm các bản phân phối Unix có vai trò đầu tiên trong việc phổ biến khái niệm biểu thức chính quy.

Patterns

Each character in a regular expression is either understood to be a metacharacter with its special meaning, or a regular character with its literal meaning. Together, they can be used to identify textual material of a given pattern, or process a number of instances of it that can vary from a precise equality to a very general similarity of the pattern. The pattern sequence itself is an expression that is a statement in a language designed specifically to represent prescribed targets in the most concise and flexible way to direct the automation of text processing of general text files, specific textual forms, or of random input strings.

Basic concepts

A regular expression, often called a pattern, is an expression used to specify a set of strings required for a particular purpose. A simple way to specify a finite set of strings is to list its elements or members. However, there are often more concise ways to specify the desired set of strings. For example, the set containing the three strings “Handel”, “Händel”, and “Haendel” can be specified by the pattern H(ä|ae?)ndel; we say that this pattern matches each of the three strings. In most formalisms, if there exists at least one regex that matches a particular set then there exists an infinite number of other regex that also match it—the specification is not unique. Most formalisms provide the following operations to construct regular expressions.

Boolean “or” A vertical bar separates alternatives. For example, gray|grey can match “gray” or “grey”. Grouping Parentheses are used to define the scope and precedence of the operators (among other uses). For example, gray|grey and gr(a|e)y are equivalent patterns which both describe the set of “gray” or “grey”. Quantification A quantifier after a token (such as a character) or group specifies how often that preceding element is allowed to occur. The most common quantifiers are the question mark ?, the asterisk * (derived from the Kleene star), and the plus sign + (Kleene plus).

?   The question mark indicates there is zero or one of the preceding element. For example, colou?r matches both "color" and "colour".
*   The asterisk indicates there is zero or more of the preceding element. For example, ab*c matches "ac", "abc", "abbc", "abbbc", and so on.
+   The plus sign indicates there is one or more of the preceding element. For example, ab+c matches "abc", "abbc", "abbbc", and so on, but not "ac".

These constructions can be combined to form arbitrarily complex expressions, much like one can construct arithmetical expressions from numbers and the operations +, −, ×, and ÷. For example, H(ae?|ä)ndel and H(a|ae|ä)ndel are both valid patterns which match the same strings as the earlier example, H(ä|ae?)ndel.

The precise syntax for regular expressions varies among tools and with context; more detail is given in the Syntax section.

MySQL Tuning and Optimization

MySQL is a powerful open-source database. With more and more database driven applications, people have been pushing MySQL to its limits. Here are 101 tips for tuning and optimizing your MySQL install. Some tips are specific to the environment they are installed on, but the concepts are universal. I have divided them up into several categories to help you with getting the most out of MySQL:

MySQL Server Hardware and OS Tuning:

  1. Have enough physical memory to load your entire InnoDB file into memory – InnoDB is much faster when the file can be accessed in memory rather than from disk.

  2. Avoid Swap at all costs – swapping is reading from disk, its slow.

  3. Use Battery-Backed RAM.

  4. Use an advanced RAID – preferably RAID10 or higher.

  5. Avoid RAID5 – the checksum needed to ensure integrity is costly.

  6. Separate your OS and data partitions, not just logically, but physically – costly OS writes and reads will impact your database performance.

  7. Put your mysql temp space and replication logs on a separate partition than your data – background writes will impact your database when it goes to write/read from disk.

  8. More disks equals more speed.

  9. Faster disks are better.

  10. Use SAS over SATA.

  11. Smaller disks are faster than larger disks, especially in RAID configs.

  12. Use Battery-Backed Cache RAID controllers.

  13. Avoid software raids.

  14. Consider using Solid State IO Cards (not disk drives) for your data partition – these cards can sustain over 2GB/s writes for almost any amount of data.

  15. On Linux set your swappiness value to 0 – no reason to cache files on a database server, this is more of a web server or desktop advantage.

  16. Mount filesystem with noatime and nodirtime if available – no reason to update database file modification times for access.

  17. Use XFS filesystem – a faster, smaller filesystem than ext3 and has more options for journaling, also ext3 has been shown to have double buffering issues with MySQL.

  18. Tune your XFS filesystem log and buffer variables – for maximum performance benchmark.

  19. On Linux systems, use NOOP or DEADLINE IO scheduler – the CFQ and ANTICIPATORY scheduler have been shown to be slow vs NOOP and DEADLINE scheduler.

  20. Use a 64-bit OS – more memory addressable and usable to MySQL.

  21. Remove unused packages and daemons from servers – less resource stealing.

  22. Put your host that use MySQL and your MySQL host in a hosts file – no dns lookups.

  23. Never force kill a MySQL process – you will corrupt your database and be running for the backups.

  24. Dedicate your server to MySQL – background processes and other services can steal from the db cpu time.

MySQL Configuration:

  1. Use innodb_flush_method=O_DIRECT to avoid a double buffer when writing.

  2. Avoid O_DIRECT and EXT3 filesystem – you will serialize all your writes.

  3. Allocate enough innodb_buffer_pool_size to load your entire InnoDB file into memory – less reads from disk.

  4. Do not make innodb_log_file_size too big, with faster and more disks – flushing more often is good and lowers the recovery time during crashes.

  5. Do not mix innodb_thread_concurrency and thread_concurrency variables – these two values are not compatible.

  6. Allocate a minimal amount for max_connections – too many connections can use up your RAM and lock up your MySQL server.

  7. Keep thread_cache at a relatively high number, about 16 – to prevent slowness when opening connections.

  8. Use skip-name-resolve – to remove dns lookups.

  9. Use query cache if your queries are repetitive and your data does not change often – however using query cache on data that changes often will give you a performance hit.

  10. Increase temp_table_size – to prevent disk writes.

  11. Increase max_heap_table_size – to prevent disk writes.

  12. Do not set your sort_buffer_size too high – this is per connection and can use up memory fast.

  13. Monitor key_read_requests and key_reads to determine your key_buffer size – the key read requests should be higher than your key_reads, otherwise you are not efficiently using your key_buffer.

  14. Set innodb_flush_log_at_trx_commit = 0 will improve performance, but leaving it to default (1), you will ensure data integrity, you will also ensure replication is not lagging

  15. Have a test environment where you can test your configs and restart often, without affecting production.

MySQL Schema Optimization:

  1. Keep your database trim.

  2. Archive old data – to remove excessive row returns or searches on queries.

  3. Put indexes on your data.

  4. Do not overuse indexes, compare with your queries.

  5. Compress text and blob data types – to save space and reduce number of disk reads.

  6. UTF 8 and UTF16 is slower than latin1.

  7. Use Triggers sparingly.

  8. Keep redundant data to a minimum – do not duplicate data unnecessarily.

  9. Use linking tables rather than extending rows.

  10. Pay attention to your data types, use the smallest one possible for your real data.

  11. Separate blob/text data from other data if other data is often used for queries when blob/text are not.

  12. Check and optimize tables often.

  13. Rewrite InnoDB tables often to optimize.

  14. Sometimes, it is faster to drop indexes when adding columns and then add indexes back.

  15. Use different storage engines for different needs.

  16. Use ARCHIVE storage engine for Logging tables or Auditing tables – this is much more efficient for writes.

  17. Store session data in memcache rather than MySQL – memcache allows for auto-expiring values and prevents you from having to create costly reads and writes to MySQL for temporal data.

  18. Use VARCHAR instead CHAR when storing variable length strings – to save space since CHAR is fixed length and VARCHAR is not (utf8 is not affected by this).

  19. Make schema changes incrementally – a small change can have drastic effects.

  20. Test all schema changes in a development environment that mirrors production.

  21. Do NOT arbitrarily change values in your config file, it can have disastrous affects.

  22. Sometimes less is more in MySQL configs.

  23. When in doubt use a generic MySQL config file.

Query Optimization:

  1. Use the slow query log to find slow queries.

  2. Use EXPLAIN to determine queries are functioning appropriately.

  3. Test your queries often to see if they are performing optimally – performance will change over time.

  4. Avoid count(*) on entire tables, it can lock the entire table.

  5. Make queries uniform so subsequent similar queries will use query cache.

  6. Use GROUP BY instead of DISTINCT when appropriate.

  7. Use indexed columns in WHERE, GROUP BY, and ORDER BY clauses.

  8. Keep indexes simple, do not reuse a column in multiple indexes.

  9. Sometimes MySQL chooses the wrong index, use USE INDEX for this case

  10. Check for issues using SQL_MODE=STRICT.

  11. Use a LIMIT on UNION instead of OR for less than 5 indexed fields.

  12. Use INSERT ON DUPLICATE KEY or INSERT IGNORE instead of UPDATE to avoid the SELECT prior to update.

  13. Use a indexed field and ORDER BY instead of MAX.

  14. Avoid using ORDER BY RAND().

  15. LIMIT M,N can actually slow down queries in certain circumstances, use sparingly.

  16. Use UNION instead of sub-queries in WHERE clauses.

  17. For UPDATES, use SHARE MODE to prevent exclusive locks.

  18. On restarts of MySQL, remember to warm your database, to ensure that your data is in memory and queries are fast.

  19. Use DROP TABLE then CREATE TABLE instead of DELETE FROM to remove all data from a table.

  20. Minimize the data in your query to only the data you need, using * is overkill most of the time.

  21. Consider persistent connections instead of multiple connections to reduce overhead.

  22. Benchmark queries, including using load on the server, sometimes a simple query can have affects on other queries.

  23. When load increases on your server, use SHOW PROCESSLIST to view slow/problematic queries.

  24. Test all suspect queries in a development environment where you have mirrored production data.

MySQL Backup Procedures:

  1. Backup from secondary replicated server.

  2. Stop replication during backups to prevent inconsistencies on data dependencies and foreign constraints.

  3. Stop MySQL altogether and take a backup of the database files.

  4. Backup binary logs at same time as dumpfile if MySQL dump used – to make sure replication does not break.

  5. Do not trust an LVM snapshot for backups – this could create data inconsistencies that will give you issues in the future.

  6. Make dumps per table for easier single table recovery – if data is isolated from other tables.

  7. Use –opt when using mysqldump.

  8. Check and Optimize tables before a backup.

  9. When importing temporarily disable foreign constraints for a faster import.

  10. When importing temporarily disable unique checks for a faster import.

  11. Calculate size of database/tables data and indexes after each backup to monitor growth.

  12. Monitor slave replication for errors and delay with a cron script.

  13. Perform Backups regularly.

  14. Test your backups regularly.

Concepts Used in the Network

ISP – Internet Service Provider

An Internet service provider (ISP) is an organization that provides services for accessing, using, or participating in the Internet. Internet service providers may be organized in various forms, such as commercial, community-owned, non-profit, or otherwise privately owned.

Internet services typically provided by ISPs include Internet access, Internet transit, domain name registration, web hosting, Usenet service, colocation.

ISP là công ty cung cấp cho bạn kết nối Internet . Ví dụ tại Việt Nam có những ISP như FPT , VDC , Viettel và một số công ty khác . Đó là những công ty mà bạn sẽ phải trả tiền hàng tháng để dùng kết nối Internet của mình .

Gradle

Gradle.org - Why Gradle?

Gradle is an advanced build system as well as an advanced build toolkit allowing to create custom build logic through plugins.

Here are some of its features that made us choose Gradle:

  • Domain Specific Language (DSL) to describe and manipulate the build logic
  • Build files are Groovy based and allow mixing of declarative elements through the DSL and using code to manipulate the DSL elements to provide custom logic.
  • Built-in dependency management through Maven and/or Ivy.
  • Very flexible. Allows using best practices but doesn’t force its own way of doing things.
  • Plugins can expose their own DSL and their own API for build files to use.
  • Good Tooling API allowing IDE integration

Wikipedia

Gradle is a build automation tool that builds upon the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the more traditional XML form of declaring the project configuration. Gradle uses a directed acyclic graph (“DAG”) to determine the order in which tasks can be run.

Gradle was designed for multi-project builds which can grow to be quite large, and supports incremental builds by intelligently determining which parts of the build tree are up-to-date, so that any task dependent upon those parts will not need to be re-executed.

The initial plugins are primarily focused around Java, Groovy and Scala development and deployment, but more languages and project workflows are on the roadmap.

Example Java project

Consider the case where the Maven directory structure is used for Java sources and resources. These directories are: src/main/java, src/main/resources, src/test/java and src/test/resources.

build.gradle

apply plugin: 'java'

The most simple Android project has the following build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.1'
    }
}

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"
}

Running gradle build will result in

> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Tutorial

Installation of Gradle and setting it up correctly on your system

In this part of the tutorial, we shall focus on setting up Gradle on our system. While tools like Android Studio do ship with an internal Gradle distribution, our intention here is to understand the tools, its installation, the setup and firing up some basic Gradle commands.

Download Gradle

At the time of this update, Gradle is in version 2.2.1 and is available for download here.

Just go ahead and download the ZIP file to your machine. You should have a file named gradle-2.2.1-all.zip. Expand it to a folder of your choice.

Environment Settings

The \bin folder of your gradle distribution contains the gradle script file (both Unix and Windows) that you will use to run the gradle command along with various parameters.

Ideally, do the following:

  • Create an environment variable GRADLE_HOME and point it to the Gradle Installation folder. On my machine, the Gradle installation folder is e:\gradle-2.2.1 and hence I have created a GRADLE_HOME Environment variable that has the value e:\gradle-2.2.1
  • Add %GRADLE_HOME%\bin to the PATH environment variable. This will allow you to launch gradle command from any directory.

Verify Gradle Setup

$ gradle -v

Basic Gradle commands

$ gradle -q help

$ gradle -q tasks

$ gradle properties

Your first Java Project Build with Gradle

Multiple Java Projects with Gradle

Java Web Applications with Gradle

App Engine Gradle Plugin

Gradle + Android Studio

Gradle + Android Studio + App Engine

Gradle + App Engine + Cloud Endpoints + Android Studio

Gradle + App Engine + Cloud Endpoints (Persistence) + Android Studio

Consuming Endpoints in your Android application

Linux Command to Check Status

To investigate the usage of disk memory

Check the disk usage. It was confirmed command in CentOS on Vagrant + Virtualbox.

$ df

Check the usage of memory.

$ free

Survey the load on the CPU and disk I / O

Check the load average.

$ uptime

$ w

Check and load average / task status / memory usage / swap.

$ top

CPU and I / O load, and other various confirmation.

$ sar

Check the status of the virtual memory.

$ vmstat

Check the status of the disk I / O.

$ iostat

Check the process running. CPU load of each process, it can confirm the memory usage.

$ ps aux

Display the network-related statistics

$ netstat -an | wc -l

Rails Server

Rails Server Throwdown: Passenger, Unicorn or Puma?

Every millisecond counts. As professionals from industries outside the technology sector turn to web apps to run their businesses, shaving a minuscule amount of response time from your process can mean the difference between keeping an end user happy and losing their company’s account. It’s fair game to expect your Rails server to handle load balancing, to deter DDoS attacks, and to manage your app’s reverse proxy requests.

Selecting a Rails server can set the pace for your app’s speed and scalability down the road, and switching horses mid-stream can lead to some tough client conversations. Even as hardware gets more robust and cloud computing platforms aim to replace dedicated servers, three of the most popular Rails server products got major updates in the past few months. Therefore, we set out to compare Passenger, Unicorn, and Puma to see if there’s more than a slight difference in performance.

Rails Server #1: Passenger

Passenger still gets the Rails Core Team’s vote as the “preferred way to deploy your Rails applications,” according to Phusion’s website. After a significant update during the summer, this popular Rails server now comes in two flavors: open source and Enterprise. This popular module directly integrates with Apache or NGINX, so you can upload and run your application code with ease.

Thanks to built-in deployment error resistance, Passenger can shut down all application processes when it encounters a configuration error or a glitch in an application’s code. The Enterprise edition of Passenger enables enhanced monitoring and debugging, so you can get to the source of an error in real time. An accepted standard for many corporate server environments, Phusion’s website boasts of over 150,000 leading companies running apps with Passenger.

Rails Server #2: Unicorn

When James Pozdena benchmarked Unicorn in 2009, it maintained consistent average response times of around a second, even when hammered by concurrent requests. Podenza noted that Passenger’s maximum response time grew by as much as a second with each concurrent request.

However, Urban Influence’s Nate Miller discovered that Unicorn’s speed comes at a cost. While testing Unicorn as a replacement for a Mongrel deployment experiencing a high number of 502 Bad Gateway errors, Miller benchmarked a similar drop in average response time on Unicorn. However, Unicorn’s standard deviation for gateway errors increased significantly, raising concerns that the speed gains could leave the door open to increased instability.

Rails Server #3: Puma

Evan Phoenix took a “Back to the Future” approach to rails servers, rewriting code from Mongrel that hearkens back to what Phoenix calls a “pre-rack world.” His benchmarks show Puma using less than one-tenth the active memory of a similar Unicorn setup, while trouncing competitors in speed tests. Puma leverage’s Mongrel’s heritage HTTP parser, offering accuracy without the “stuck mongrel” issues that dogged early Rails deployments.

Puma runs best with Rubinius or JRuby, implementations that provide true concurrency. As developers prepare for Rails 4, some admins report significant speed improvements when combining Puma with NGINX’s proxy functionality. As recent Ruby converts search for Rails servers, developers have noticed the difference between a slow stack and a system supercharged with Puma.

Verdict

Even though Passenger’s recent updates address both speed and stability, Puma offers a lean and fast web server solution for most applications that require high concurrency. Of course, it always makes sense to run your own benchmarks and application tests. However, with growing support for Puma on many cloud-based application servers, this significantly refreshed version of Mongrel should be easy for you to test and to enjoy.

Deploy

Rails Server #1: Passenger

Rails Server #2: Unicorn

Rails Server #3: Puma