Hiển thị các bài đăng có nhãn Lap trinh vien Java. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lap trinh vien Java. Hiển thị tất cả bài đăng

Thứ Sáu, 10 tháng 9, 2010

Ngôn ngữ lập trình Java có thể sẽ được hỗ trợ tiếng Việt

Ngôn ngữ lập trình Java có thể sẽ được hỗ trợ tiếng Việt Với 1.900 phiếu, yêu cầu hỗ trợ tiếng Việt trong Java của các lập trình viên Java tại Việt Nam đang dẫn đầu Top 25 RFE (Request for Enhancements - yêu cầu hỗ trợ). Nhờ đó, hãng phần mềm Sun đã bắt đầu quan tâm đến thị trường Việt Nam và có khả năng Sun sẽ hỗ trợ tiếng Việt trong Java khoảng giữa năm 2004.

Đầu tháng 10, một số lập trình viên Việt Nam đã gửi đến hãng phần mềm Sun một RFE đề nghị hỗ trợ tiếng Việt trong Java (một ngôn ngữ lập trình tin học rất mạnh và phổ biến trong các chương trình ứng dụng hiện nay). Từ năm 1998, yêu cầu nhập bản địa (cách biểu diễn các dữ kiện, con số, thông tin theo văn hóa, ngôn ngữ của từng quốc gia) Việt Nam trong Java đã được đệ trình đến Sun nhiều lần nhưng đều bị từ chối. Nhưng lần này, khả năng ngôn ngữ lập trình Java sẽ được Sun hỗ trợ tiếng Việt đang có tín hiệu rất lạc quan bởi đang dẫn đầu bảng Top 25 RFE - bảng những yêu cầu được hỗ trợ trong các sản phẩm chương trình phần mềm của Sun tại website http://developer.java.sun.com.

Việc yêu cầu tích hợp tiếng Việt trong ngôn ngữ Java bất ngờ ''leo'' lên đứng đầu bảng Top 25 RFE của Sun chỉ sau ba tuần chấp nhận thư trình của các lập trình viên Việt Nam khiến hãng phần mềm này đã phải ngạc nhiên và bắt đầu quan tâm, chú ý đến đề đạt trên. Trong số hàng chục nghìn RFE được gửi đến, Sun sẽ chọn thực hiện nhũng yêu cầu nào quan trọng nhất, nhiều người đòi hỏi nhất và điều đó được biểu hiện bằng cách vote (bỏ phiếu) trưng cầu ý kiến tại trang web của Sun. Nguyễn Quân - một kỹ sư thiết kế phần mềm đang làm việc ở miền Nam Califomia (Mỹ), người đã gửi thư trình yêu cầu hỗ trợ tiếng Việt trong Java cho biết: ''Java hiện có cả trăm ''bản địa'' nhưng không hiểu sao ''bản địa'' Việt Nam lại không được hỗ trợ khiến việc lập trình các chương trình tiếng Việt trong Java gặp khó khăn không cần thiết. Sau khi gửi thư trình đến Sun và được chấp nhận, tôi vào các diễn đàn IT Việt Nam gửi lời kêu gọi các bạn yểm trợ bỏ phiếu. Sự hưởng ứng vượt ngoài sức tưởng tượng, chỉ sau hai tuần, số phiếu đã đủ để lọt vào Top 25 RFE, rồi Top 10 và vươn lên dẫn đầu chỉ sau ba tuần. Điều này khiến Sun phải chú ý, hay nói chính xác hơn là họ đã sửng sốt và thắc mắc vì sao số phiếu lại lên cao trong một thời gian ngắn kỷ lục như thế''.

Tính đến thời điểm đầu tháng 11, yêu cầu hỗ trợ tiếng Việt trong Java vẫn đang đứng đầu Top RFE của Sun với gần 1.900 phiếu. ''Kỳ tích'' này có được là nhờ sự đồng lòng, hỗ trợ của thành viên tại các diễn đàn IT Việt Nam như diendantinhoc.org, javavietnam.org; hvaonline.net, diendantinhoc.com... Tại các diễn đàn này gần một tháng nay xuất hiện ''khẩu hiệu'' chung: ''Ủng hộ nền công nghệ thông tin Việt Nam: bỏ phiếu để Sun hỗ trợ tiếng Việt trong Java''. Sự nhiệt tình của các thành viên ở những trang web này cuối cùng cũng đã giúp các lập trình viên Java Việt Nam nhận được tín hiệu đáng mừng: Brian Beck, Trưởng nhóm Java Internationalization của Sun đã e-mail liên lạc với các lập trình viên đã gửi thư đề đạt đến Sun, yêu cầu lập một điểm liên lạc thống nhất chung tại trang web Javavietnam.org để các lập trình viên Việt Nam có thể tập trung lại, nêu cụ thể các yêu cầu kỹ thuật và trả lời những câu hỏi từ Sun liên quan đến các vấn đề hỗ trợ tiếng Việt. Anh Quân tỏ vẻ lạc quan: ''Với số phiếu và nhiều người lên tiếng như vậy, Sun đã nhận ra rằng lực lượng lập trình viên Java tại Việt Nam đông đảo đáng kể và bắt đầu quan tâm, chú ý đến thị trường Việt Nam. Các lập trình viên Java Việt Nam đã có thể hy vọng sẽ thực hiện công việc lập trình các chương trình tiếng Việt dễ dàng hơn rất nhiều với khả năng Sun có thể sẽ hỗ trợ tiếng Việt trong Java khoảng giữa năm sau''.



Theo Thanh Niên




Đoạn code Java lấy ngày giờ theo định dạng

import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateUtils {
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
public static String now()
{ Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
} public static void main(String arg[])
{ System.out.println("Now : " + DateUtils.now());
} }
Còn đây là một cách khác:
import java.util.Calendar;
import java.text.SimpleDateFormat;
public class DateUtils {
public static String now(String dateFormat)
{ Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.format(cal.getTime()); }
public static void main(String arg[]) {
System.out.println(DateUtils.now("dd MMMMM yyyy"));
System.out.println(DateUtils.now("yyyyMMdd"));
System.out.println(DateUtils.now("dd.MM.yy"));
System.out.println(DateUtils.now("MM/dd/yy"));
System.out.println(DateUtils.now("yyyy.MM.dd G 'at' hh:mm:ss z"));
System.out.println(DateUtils.now("EEE, MMM d, ''yy"));
System.out.println(DateUtils.now("h:mm a"));
System.out.println(DateUtils.now("H:mm:ss:SSS"));
System.out.println(DateUtils.now("K:mm a,z"));
System.out.println(DateUtils.now("yyyy.MMMMM.dd GGG hh:mm aaa"));
} }


Theo blogthuthuat
       

Thứ Ba, 31 tháng 8, 2010

Java cơ bản đến nâng cao (phần II)

Java cơ bản đến nâng cao (phần II)
Bạn đã biết 2 kiểu String (chuỗi) và int (nguyên) bây giờ bạn biết thêm kiểu float (thực). Số nguyên và số thực bạn biết sự khác nhau rồi chứ. Bây giờ ta bắt đầu bài toán ví dụ.

Bài 4: Chia hết, chia lấy dư

*Lí thuyết: một số kiểu biến trong Java
Bạn đã biết 2 kiểu String (chuỗi) và int (nguyên) bây giờ bạn biết thêm kiểu float (thực)

HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhap a: ");
float a = Float.parseFloat(in.readLine());
System.out.print("Nhap b: ");
float b = Float.parseFloat(in.readLine());
float ketqua = a/b;
System.out.println("Ket qua bai toan a+b la: " + ketqua);
}
}

Bạn thử bài toán xem, nhớ đừng nhập số b=0 nhé, chuyện ấy sẽ xử lí sau.
Ví dụ nhập a=5, b=2, kết quả in ra sẽ là 2.5, thú vị phải không ?
Bây giờ cũng bài toán ấy, bạn thay đổi như sau

HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhap a: ");
int a = Integer.parseInt(in.readLine());
System.out.print("Nhap b: ");
int b = Integer.parseInt(in.readLine());
float ketqua = a/b;
System.out.println("Ket qua bai toan a+b la: " + ketqua);
}
}
Cũng nhập a=5, b=2, lần này kết quả in ra là … 2
Phép chia sẽ là phép chia hết nếu cả 2 toán hạng đều kiểu nguyên, gọi là chia lấy nguyên (/) hay div
Bây giờ cũng chương trình ấy mà ta thay đổi lại chút xíu xem sao
HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhap a: ");
int a = Integer.parseInt(in.readLine());
System.out.print("Nhap b: ");
int b = Integer.parseInt(in.readLine());
float ketqua = a%b;
System.out.println("Ket qua bai toan a+b la: " + ketqua);
}
}

Cũng nhập a=5, b=2, lần này kết quả in ra là … 1

Đây là kết quả phép chia lấy dư 5 chia cho 2, gọi là chia lấy dư (%) hay mod
*Thế nếu tôi muốn 2 số nguyên chia nhau mà ra kiểu thực chứ không phải phép chia lấy nguyên thì sao ? Trong trường hợp đó, bạn dùng “ép kiểu”
int a=5,b=2;float ket qua;
ketqua=(float)a/b;

NguNguồn: Tuoitre_8x - diendanaptech

Java cơ bản đến nâng cao (phần I)

Java cơ bản đến nâng cao
Vì thấy hay và bổ ích muốn chia sẻ cho những ai thích java và muốn tìm hiểu về nó. Chúc các bạn thành công.



CHƯƠNG I - BẮT ĐẦU VỚI JAVA
Bài 1: Hello world

Bài 2: In ra chuỗi nhập vào
Bài đầu tiên của bạn, bạn đã học cách để Java in cái gì đó ra màn hình, trong bài này, bạn sẽ học cách nhập vào cái gì đó và Java in cái đó ra màn hình. Gõ cái này đi bạn (lưu ý, bạn phải gõ, không được copy và paste)

HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Your name is: ");
String str;
str = in.readLine();
System.out.println("Welcome " + str + " to Java");
}
}

Xin hỏi, tôi đã bắt đầu với một vài ví dụ, mà tôi chẳng hiểu cái gì cả.
Xin trả lời, bạn sẽ học Java qua các ví dụ, rất nhiều ví dụ, lí thuyết thì bạn chỉ học từ từ thôi.
*Lí thuyết: cấu trúc một chương trình Java

HTML Code:
public class Core
{
public static void main(String[] args)
{
System.out.println("Hello,Everybody in the World!");
}
}

public class Core bạn bắt đầu một lớp Java
public static void main(String[] args) đây là một phương thức main trong Java, để cho chương trình chạy được. Tạm thời bạn phải gõ y như thế này
System.out.println("Hello,Everybody in the World!") đây là một câu lệnh trong Java, đơn giản nó chỉ in ra chuỗi nằm trong 2 dấu “” ra màn hình.
Mọi lớp và phương thức trong Java mở ra bằng { và đóng lại bằng }
Mọi câu lệnh trong java kết thúc bằng ;

Bài 3: Biến trong Java

HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Nhap a: ");
int a = Integer.parseInt(in.readLine());
System.out.print("Nhap b: ");
int b = Integer.parseInt(in.readLine());
int ketqua;
ketqua = a+b;
System.out.println("Ket qua bai toan a+b la: “ + ketqua);
}
}

Nhập thử 2 số a và b vào đi bạn, kết quả bài toán a+b sẽ được in ra.
*Lí thuyết:

HTML Code:
import java.io.*;
public class Hello
{
public static void main(String[] args) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Your name is: ");
String str;
str = in.readLine();
System.out.println("Welcome " + str + " to Java");
}
}

Tạm thời, trong chương trình này, bạn chỉ nên quan tâm đến dòng
String str khai báo biến str kiểu chuỗi, và
System.out.println("Welcome " + str + " to Java")
Đây cũng là dòng System.out.println như chương trình đầu, có khác là + str + tức là đưa một biến vào chuỗi in ra. Chỉ đến đó thôi nhé, sau đó, hãy quan tâm đến bài hôm nay

HTML Code:

System.out.print("Nhap a: ");
int a = Integer.parseInt(in.readLine());
System.out.print("Nhap b: ");
int b = Integer.parseInt(in.readLine());
int ketqua;
ketqua = a+b;
System.out.println("Ket qua bai toan a+b la: “ + ketqua);

Giải thích
import bạn nhập class hay thư viện chuẩn, tạm thời đừng quan tâm nó là gì, chỉ cần nhớ là có nó để chương trình chạy

HTML Code:
System.out.print in ra một chuỗi, nhưng không xuống dòng
System.out.println in ra một chuỗi, nhưng xuống dòng
int ketqua tức là khai báo biến ketqua kiểu int
ketqua = a+b tức là gán kết quả một biểu thức tính toán (ở đây là biến a + biến b) cho biến ketqua
System.out.println("Ket qua bai toan a+b la: “ + ketqua)

Nguồn: Tuoitre_8x - diendanaptech

Thứ Tư, 26 tháng 5, 2010

CRC (Cyclic Redundancy Check)

Trong quá trình sử dụng máy tính, chắc hẳn bạn đã không ít lần cảm thấy khó chịu (đặc biệt là khi bạn đã tốn hàng giờ để download một tập tin quan trọng) khi gặp phải thông báo lỗi của WinZip từ chối xả nén một tập tin vì phép kiểm CRC thấy bại. Tại sao các phần mềm nén lại phải thực hiện phép kiểm tra CRC mỗi khi nó xả nén một tập tin?


Thực ra, CRC là một phương pháp nhằm kiểm tra xem nội dung một tập tin có bị thay đổi hay không (đặc biệt là khi tập tin này được truyền đi trên mạng). Điều này cực kỳ quan trọng đối với các phần mềm nén vì chỉ cần sai lệch một byte cũng đủ để làm sai lệch hoàn toàn nội dung các tập tin bị nén.

Ý tưởng về CRC cũng không quá phức tạp. Trong bài viết này, chúng ta sẽ xem xét qua một thuật toán phát sinh CRC đơn giản.

Trước tiên, để đơn giản hóa bài toán mà không làm mất tính tổng quát, ta sẽ xem nội dung tập tin F cần kiểm tra như là một con số nguyên khổng lồ trong đó, byte có nghĩa nhất là byte đầu tiên của tập tin, byte tiếp theo là byte có nghĩa kế tiếp và cứ thế cho đến byte cuối cùng của tập tin là byte ít có nghĩa nhất. Hay nói một cách khác, tập tin cần được kiểm tra F sẽ được đại diện bởi một con số nguyên SF mà giá trị của nó là :

(1)

trong đó b[i] là byte thứ i của tập tin.

Chẳng hạn, giả sử tập tin cần kiểm tra có nội dung là TEST thì giá trị SF của nó sẽ là :

SF = 84´2563 + 69´2562 + 83´2561 + 84 = 1 413 829 716

(trong đó mã ASCII của ký tự các T, E và S lần lượt là 84, 69, 83)

Giá trị CRC của một tập tin F là một số nguyên 2 byte sao cho với một hằng số nguyên cho trước G, đẳng thức sau được thỏa mãn (MOD là toán tử chia lấy phần dư, giống toán tử % của C, chẳng hạn 5 mod 2 = 1 vì 5 chia cho 2 còn dư 1 )

(SF ´ 2562 + CRC) MOD G = 0 (2)

Người ta thường chọn G là một số nguyên tố.

Giá trị CRC thỏa (2) có thể được xác định bằng công thức sau :

CRC = G – ( (SF ´ 2562) MOD G ) (3)

Khi truyền tập tin F sang nơi khác, ta đồng thời truyền cả giá trị CRC sang nơi nhận. Nơi nhận sẽ nhận được một tập tin có nội dung là Fnhận­ và giá trị
CRC­nhận. Áp dụng công thức (1) với Fnhận ­ để tính ra giá trị số nguyên đại diện cho Fnhận là S’F

Tại nơi nhận, phép kiểm tra CRC được thực hiện bằng cách áp dụng công thức (2) đối với S’F và giá trị CRCnhận, nghĩa là kiểm tra đẳng thức:

(S’F ´ 2562 + CRCnhận) MOD G = 0 (4)

Nếu (4) sai thì chắc chắn Fnhận ¹ F. Ngược lại, nếu (4) đúng thì không chắc chắn Fnhận ¹ F nhưng cũng không chắc chắn là Fnhận = F !!!

Điều này mới nghe có vẻ rất ngạc nhiên vì nếu đúng như vậy thì phương pháp này chẳng có giá trị gì cả ! Nhưng may mắn là, trong điều kiện thực tế, khi (3) đúng thì khả năng xảy ra trường Fnhận ¹ F là cực kỳ thấp, thấp đến mức mà ta có thể yên tâm là nó không thể xảy ra. Cơ sở cho khẳng định này là các sai sót trong quá trình truyền tập tin thường xảy ra ngẫu nhiên và số bit bị sai sót thường ít (1-2 bit). Trong khi đó, để xảy ra trường hợp Fnhận ¹ F và đẳng thức (3) được thỏa mãn cùng lúc, nội dung của Fnhận phải tuân theo một quy luật khá đặc biệt và số bit bị thay đổi giá trị cũng thường nhiều. Sự ngẫu nhiên khó có thể tạo ra một sai sót đặc biệt như vậy.

Cách cài đặt thuật toán phát sinh và kiểm tra CRC cho một tập tin cũng khá rõ ràng. Tuy nhiên, bạn đọc nên lưu ý đến vấn đề tràn số khi tính tổng SF. Để tránh điều này, bạn có thể sử dụng tính chất sau của toán tử mod : (A + B) MOD C = ( (A MOD C) + B ) MOD C

Đoạn chương trình minh họa sau dùng để phát sinh giá trị CRC của một chuỗi ký tự F (biến value sẽ giữ giá trị CRC khi đoạn chương trình kết thúc).

len = strlen(F);

value = 0;

// Tính giá trị số nguyên đại diện cho F dùng công thức (1)

for (i = 0; i < len; i++) {

value = value << 8;

value += F[i];

value = value % G;

}

// Tính giá trị CRC dùng công thức (3)

value = value << 16;

value = value % G;

if (value) value = G - value;

...

Chủ Nhật, 2 tháng 5, 2010

So mẫu (RegExp) trong javascript


Đây là phần kiến thức cơ bản về so mẫu trong JS được thống kê lại để dễ tham khảo,về cơ bản thì so mẫu đều giống nhau chỉ khác nhau về hình thức trên từng ngôn ngữ lập trình, nên nếu bạn nắm tốt so mẫu trong js thì trong php cùng tương tự, hy vọng giúp ích cho các bạn.


1. Cách khai báo so mẫu trong JS
a. var regexp = /pattern/flags
ví dụ: var re1 = /mac/i;
b. var regexp = new RegExp("pattern","flags");
ví dụ: var re2 = new RegExp("mac","g");
Ví dụ về so mẫu (VD 1)



2. Các giá trị của flag:
i: không phân biệt chữ hoa chữ thường
ví dụ: /The/i gồm "the" và "The" và "tHe"
g: tìm tất cả các chuỗi thỏa so mẫu
Mặc định trong js, chỉ tìm phần tử đầu tiên ( ví dụ VD 1.1) , khi dùng flag "g" JS sẽ tìm tất cả trong chuỗi ( VD 1.2)
m: tìm trên nhiều dòng (JavaScript1.5+)


3. Các ký tự dùng trong so mẫu /pattern/
\ loại bỏ các ký tự đặc biệt trong so mẫu ( những ký tự
{n}: chính xác n lần
ví dụ: /d{5}/ tìm những số có 5 chữ số
{n,}: nhiều hơn n lần.
ví dụ: /d{5,}/ tìm những số có 5 chữ số trở lên
{n,m}: n đến m lần
ví dụ: /d{5,9}/ tìm những số có 5 đến 10 chữ số

(pattern) tìm và bắt lấy /pattern/
ví dụ: /(d).1/ thì 1 chính là giá trị đại diện của (d)
=> so mẫu này sẽ tìm chuỗi dạng /d.d/ ( tức dad,dbd,..)
(? [:P] attern) tìm nhưng không bắt lấy
ví dụ: /(? [:D] ).1/ thì 1 chính không phải là đại diện của (d)
Lưu ý: (? [:P] attern) hổ trợ từ JavaScript 1.5.
| tìm thay phiên
ví dụ: /(a|b)a/ tìm những chuỗi aa hoặc ba.
[characters]: chứa bất kỳ ký tự characters
ví dụ: /[abcd]/( dạng ngắng /[a-d]/) tìm các ký tự 'a', 'b', 'c', 'd'
[^characters]: không chứa bất kỳ ký tự characters
ví dụ: /[^0-9]/ tìm tất cả các ký tự không phải là các ký tự số

* dạng ghi ngắn của {0,}
+ dạng ghi ngắn của {1,}
? dang ghi ngắn của {0,1}
^ điểm bắt đầu (or new line with m flag).
$ điểm kết thúc (or end of line with m flag).
. tìm bất kỳ ký tự nào trừ ký tự xuống dòng.


Alphanumeric: tìm chính xác các ký tự Alphanumeric
ví dụ: /2 days/ sẽ tìm "2 days" trong chuỗi
\f matches form-feed.
\r matches carriage return.
\n matches linefeed.
\t ký tự tab (ngang).
\v ký tự tab (đứng).
\� tìm ký tự NUL.
[\b] ký tự xóa.
\s những ký tự khoảng trắng (dạng ngắn của [\f\n\r\t\v\u00A0\u2028\u2029]).
S không phải là ký tự khoảng trắng (dạng ngắn của [^\f\n\r\t\v\u00A0\u2028\u2029]).
\w những ký tự là chữ,số hoặc _ (dạng ngắn của [a-zA-Z0-9_]).
\W những ký tự không là chữ, số hoặc _ (short for [^a-zA-Z0-9_]).
\d những ký tự số (dạng ngắn của [0-9]).
\D không phải là ký tự số (dạng ngắn của [^0-9]).
\b những ký tự boundary (vị trí giữa 1 từ và khoảng trắng).
\B không phải là ký tự boundary (dạng ngắn [^b]).
\cX ký tự Control. Ví dụ: cm tìm control-M.
\xhh tìm chuỗi ký tự hệ 16 dạng hh
\uhhhh tìm chuỗi ký tự unicode dạng hhhh.

4. Các cách sử dụng regexp
a. dùng method của string (str)
str.match(/pattern/ ) trả về 1 mảng các thông tin nếu tìm thấy và false nếu không tìm thấy /pattern/ trong str
ví dụ:
var str = "Watch out for the rock!";
a = str.match(/r?or?/g)// kết quả: a = ["o","or","ro"]

str.replace( /pattern/, replacement_text ) tìm và thay thế /pattern/ thành replacement_text
ví dụ:
var str = "Liorean said: My name is Liorean!".replace(/Liorean/g,'Big Fat Dork')
kết quả: str = "Big Fat Dork said: My name is Big Fat Dork!"

str.split ( /pattern/ ) chia str thành 1 array
ví dụ:
var str = "I am confused".split(/s/g)
kết quả: str = ["I","am","confused"]

str.search(/pattern/) trả về vị trí đầu tiên của /pattern/ trong str và -1 nếu không tìm thấy
ví dụ:
var str = "Watch out for the rock!"
ndx = str.search(/for/) //kết quả : 10

b. dùng method và property của RegExp
+ method:
/pattern/.test(string) trả về true nếu /pattern/ tồn tại trong string và ngược lại
ví dụ: var match = /sample/.test("Sample text") // kết quả : false

/pattern/.exec(string) trả về array thông nếu /pattern/ tồn tại trong string và ngược lại trả về false
ví dụ: var match = /s(amp)le/i.exec("Sample text") // kết quả ["Sample","amp"]

+ property:
$n: với 0< n < 9
ví dụ:
re = /(Hello)(s+)(world)/ thì re.$2 chính là tất cả khoảng trắng nằm giữa Hello và world ( giá trị của (s+))

source: chứa bản copy của so mẫu
global: kiểm tra flag "g" trong so mẫu
ignoreCase: kiểm tra flag "i" trong so mẫu
lastIndex: vị trí ký tự đầu tiên của pattern tìm thấy cuối cùng trong str

Có một số chỗ không chính xác, các bạn tham khảo và bổ sung thêm.

Theo phpbasic

Mang Ruby vào Java hay mang Java vào Ruby?


Việc kết hợp Java và Ruby với nhau hiện tại hoàn toàn khả thi. Đã có sẵn các thư viện đạt mức stable cho việc này: JRuby, Rjb...


Tuy nhiên, kết hợp như thế nào là vấn đề cần bàn. Có 2 hướng tiếp cận: mang Ruby vào Java và mang Java vào Ruby.

Mang Ruby vào Java

Java là ngôn ngữ và platform đã quá vững vàng. Sau nhiều lần dùng dằng, năm qua động thái mở mã nguồn của Sun cũng chẳng gây ồn ào mấy minh chứng cho điều này.

Platform ví như cái xe tải. Đối với các chương trình dựa chủ yếu vào Java (như Red5), việc chất thêm Ruby lên chẳng qua chỉ là tô điểm màu mè thêm chút đỉnh chăng? Nghĩa là, việc đưa Ruby vào chỉ tăng chút ít lợi ích về tổng thể?

Xét về mặt thực hiện (implementation), JRuby hiện chỉ cho phép nối với thư viện Ruby viết thuần bằng Ruby, không cho phép nối với thư viện Ruby viết bằng C. Việc này gây rất nhiều cản trở trong việc đưa JRuby vào ứng dụng thực tế.

Mang Java vào Ruby

Ruby đã có fullstack platform. Tuy nhiên có ý kiến cho rằng fullstack này chưa sánh ngang với cái của Java được.

Java có quá nhiều thư viện bất cứ developer ngoài Java (Ruby, Python...) nào cũng thèm khát. Dùng được các thư viện này vào chương trình Ruby thì quá tuyệt!

Xét về mặt thực hiện, thư viện Rjb cho phép làm việc này dễ dàng.

Kết luận

Nên xét platform/stack trước (Rails, Spring...). Từ tiền đề đó, xét tiếp xem sẽ mở rộng thế nào. Việc xem xét này cần làm ở giai đoạn đầu của project và cần có chuyên gia có kinh nghiệm cùng lúc cả Java cả Ruby giúp tư vấn.


Theo cntt

Tìm kiếm tất cả trong một

Thao tác với các tệp dữ liệu với bằng Java

Java cung cấp một giao lập trình ứng dụng (API) chuẩn hoá, đơn giản để thực hiện các thao tác đọc/ghi tới như file, database và socket - API I/O. Bài này sẽ hướng dẫn bạn cách tiếp cận có hiệu quả trong việc đọc một lượng dữ liệu lớn trong trường hợp cần phải cân nhắc kỹ các các yếu tố như thời gian và cấp phát bộ nhớ để cải thiện hiệu nǎng tổng thể của hệ thống.


Bài này sẽ hướng dẫn bạn cách tiếp cận có hiệu quả trong việc đọc một lượng dữ liệu lớn trong trường hợp cần phải cân nhắc kỹ các các yếu tố như thời gian và cấp phát bộ nhớ để cải thiện hiệu nǎng tổng thể của hệ thống.

Cách tốt nhất để bắt đầu là chúng ta hãy xem xét một thí dụ cụ thể. Giả sử bạn cần đọc dữ liệu lớn từ một tệp nhị phân kích thước lớn và lưu vào một mảng để tiếp tục xử lý. Các thao tác I/O của Java đều dựa trên các stream (dòng), tức một chuỗi tuần tự các byte dữ liệu. Đầu tiên, bạn phải chọn loại stream. Chúng ta làm việc với các tệp nhị phân, vì vậy cần phải sử dụng lớp FileInputStream. Bạn có thể sử dụng lớp FileReader khi làm việc với các stream dữ liệu ký tự. Chúng ta có thể mở một kết nối (connection) tới tệp dữ liệu theo cách sau:

InputStream in = new FileInputStream (fileName);

Tại thời điểm này, bạn đã có thể đọc dữ liệu từ tệp fileName. Tuy nhiên, với ưu tiên về hiệu nǎng, chúng ta hãy xem xét một lớp khác từ gói (package) java.io - BufferedInputStream. Đây là lớp bọc (wrapper) của các stream nhập, nó cho phép lưu vào bộ đệm (buffering) các dữ liệu đầu vào của các stream để cải thiện tiến trình đọc. Bạn có thể kết nối với tệp như dưới đây:

InputStream is = new BufferedInputStream (new FileInputStream (fileName));

Khi đã thiết lập được kết nối tới tệp, bạn cũng có thể bắt đầu đọc nội dung của nó. Lớp InputStream có hai phương thức chính cho việc đọc dữ liệu: int read() và int read (byte[] b, int off, int len). Phương thức thứ nhất chỉ đọc một byte dữ liệu một lần. Trái lại, phương thức thứ hai đọc nhiều byte một lúc (xác định theo tham số len) từ stream vào một mảng. Phương thức thứ hai có hiệu quả cao hơn và chúng ta có thể sử dụng nó trong Listing1.

Listing1

/**
* Đọc tệp và lưu dữ liệu vào mảng.
* Tham số file: tệp dữ liệu cần đọc
*
public byte[] read2array(String file) throws Exception {
InputStream in = null;
byte[] out = new byte[0];
try{
in = new BufferedInputStream(new FileInputStream(file));
// the length of a buffer can vary
int bufLen = 20000*1024;
byte[] buf = new byte[bufLen];
byte[] tmp = null;
int len = 0;
while((len = in.read(buf,0,bufLen)) != -1){
// mở rộng mảng
tmp = new byte[out.length + len];
// copy dữ liệu
System.arraycopy(out,0,tmp,0,out.length);
System.arraycopy(buf,0,tmp,out.length,len);
out = tmp;
tmp = null;
}
}finally{
//đóng stream
if (in != null) try{ in.close();}catch (Exception e){}
}
return out;
}

Có một số khía cạnh rất đáng quan tâm trong thí dụ này. Trước tiên, vì tệp có kích thước lớn, chúng ta cần một bộ nhớ đệm cũng khá lớn (20Mb) khi gọi phương thức đọc. Bộ nhớ đệm càng lớn, đọc dữ liệu sẽ càng nhanh. Trên thực tế, có những trường hợp ta không thể biết trước số byte cần đọc từ một stream nhập nên cần phải cấp phát bộ một dung lượng cố định ban đầu cho bộ nhớ đệm. Điều này có thể giải quyết được bằng cách sử dụng các phương thức thích hợp.

Tuy nhiên, phương thức này không phải lúc nào cũng cho kết quả mong muốn và có thể sinh ra các biệt lệ (exception). Biệt lệ có thể nảy sinh khi đọc các dữ liệu kiểu long hoặc BLOB qua stream. Thứ hai, vì được khởi tạo ở bên ngoài vòng while, các mảng out, buf và tmp có thể được sử dụng lại và hạn chế đối tượng cần phải giải phóng ở thường trình thu nhặt rác. Thứ ba, khi bộ đệm đầy, nó được copy vào một mảng có khả nǎng mở rộng kích thước bằng cách gọi phương thức System.arraycopy. Mặc dù thuật toán này khá hiệu quả nhưng tất cả các vòng lặp read đều tạo ra các mảng tạm thời và cần thực hiện 2 thao tác copy mảng trong một lần lặp.

Bạn có thể giảm thao tác copy dữ liệu và bộ nhớ cho mảng bằng cách thay đổi vòng lặp while như Thí dụ 2 dưới đây.

Listing2

/**
* Đọc tệp và lưu dữ liệu vào một danh sách. Phương pháp nhanh
* Tham số file: tệp dữ liệu cần đọc
*
*/
public byte[] read2list(String file) throws Exception {
InputStream in = null;
byte[] buf = null; // output buffer
int bufLen = 20000*1024;
try{
in = new BufferedInputStream(new FileInputStream(file));
buf = new byte[bufLen];
byte[] tmp = null;
int len = 0;
List data = new ArrayList(24); // lưu "các mảnh" dữ liệu
while((len = in.read(buf,0,bufLen)) != -1){
tmp = new byte[len];
System.arraycopy(buf,0,tmp,0,len); // vẫn cần copy
data.add(tmp);
}
/*

Đoạn này có thể tuỳ chọn. Phương pháp này có thể trả về một List dữ liệuđể xử lý sau này

*/
len = 0;
if (data.size() == 1) return (byte[]) data.get(0);
for (int i=0;ibuf = new byte[len]; // bộ đệm xuất cuối cùng
len = 0;
for (int i=0;itmp = (byte[]) data.get(i);
System.arraycopy(tmp,0,buf,len,tmp.length);
len += tmp.length;
}
}finally{
if (in != null) try{ in.close();}catch (Exception e){}
}
return buf;

Ở đây, thay vì lưu dữ liệu ngay vào một mảng lớn và mở rộng mảng này vào những lúc dữ liệu được thu về, chúng ta duy trì một danh sách với các phần tử là các "mảnh" dữ liệu. Khi đã đến cuối stream, dữ liệu được lấy ra từ danh sách và điền vào một mảng. Điều này cho phép bạn chỉ cần sử dụng tới một mảng và thực hiện một thao tác copy dữ liệu. Nếu không cần kết quả trả về dưới dạng mảng, bạn có thể trả về danh sách để tiết kiệm thời gian và tài nguyên. Đọc dữ liệu sử dụng thuật toán này nhanh hơn đáng để so với phương pháp thứ nhất. Sự khác biệt trong tốc độ phụ thuộc vào kích thước mảng đệm sử dụng trong phương thức đọc.

Theo ITG - Java Group