Pages

25 thg 12, 2010

CGI - Common Gateway Interface

PCWorld VN 10/99

Định nghĩa: Common Gateway Interface (CGI) là chuẩn để kết nối chương trình ứng dụng với Web server. Dữ liệu từ bảng biểu do người dùng điền vào trên trang Web được chuyển cho ứng dụng CGI, ứng dụng này sau đó sẽ gửi trả nội dung Web được tạo ra theo yêu cầu ngược về cho trình duyệt của người dùng.

Khi được phát triển lần đầu tiên cách đây một thập kỷ, World Wide Web được thiết kế để hiển thị tài liệu. Tuy nhiên, ngay từ lúc khởi đầu, các nhà phát triển Web site đã muốn có một cách thức để gửi dữ liệu từ trình duyệt của người dùng lên Web server, chẳng hạn tên, mật mã người dùng hay yêu cầu tìm kiếm.

CGI mang lại một phương thức chuẩn hoá để thực hiện những khả năng này. Khi người dùng gõ dữ liệu vào bảng biểu trên trang Web, nội dung này sẽ được gửi về cho Web server và thông qua giao tiếp CGI để đưa đến những chương trình riêng biệt xử lý.

Chương trình CGI sau đó có thể gửi ngược về cho trình duyệt của người dùng trang Web hiện có, trang Web mới được sinh ra trong quá trình xử lý, hình ảnh hay bất kỳ loại thông tin nào khác có thể hiển thị được trên trình duyệt.

Vì CGI hết sức linh động nên hầu như bất kỳ chương trình nào có thể chạy trên máy chủ Web và chấp nhận dữ liệu theo kiểu dòng lệnh như những chương trình được viết bằng C, C++, Perl, Visual Basic và thậm chí một số ngôn ngữ kiểu dòng lệnh của Unix - đều có thể dùng được với CGI.

Một trong những tồn tại lớn nhất của CGI là nó nạp một chương trình mới mỗi khi người dùng nhấn vào bảng biểu, vì thế những máy chủ Web dùng cho site có dòng lưu chuyển dữ liệu lớn có thể chạy hàng ngàn chương trình cùng lúc - một gánh nặng cho tốc độ của Web site.

Những chương trình chuyên biệt

Người dùng thường phàn nàn những chương trình được viết cho CGI không thể dùng lại được khi Web site thay đổi vì chúng thường rất chuyên dụng. Kết quả là trong một số năm qua, nhiều Web site lớn đã từ bỏ CGI để đi theo các máy chủ ứng dụng. Tương tự các chương trình CGI, máy chủ ứng dụng chấp nhận nhập liệu từ phía người dùng và gửi ngược lại các trang Web hay thông tin khác. Điều khác biệt là máy chủ ứng dụng xử lý nhập liệu của nhiều người dùng chỉ bằng một chương trình, do đó cải thiện tốc độ rất nhiều.

Hết sức thích hợp

Điều này không có nghĩa máy chủ ứng dụng sẽ thích hợp cho tất cả mọi người. CGI rất phù hợp với các mạng nội bộ, nơi thường có lưu lượng thông tin ít hơn những site bên ngoài. Hơn nữa, kinh phí của các phòng ban thường không chấp nhận mức giá 15.000 - 100.000 USD của máy chủ ứng dụng, trong khi CGI thì được thiết kế sẵn trong các máy chủ Web.

Chương trình CGI có thể được viết bằng bất kỳ ngôn ngữ nào và giao tiếp CGI cũng hết sức đơn giản, vì thế các nhà phát triển Web có thể nhanh chóng kết hợp những tiện ích CGI đơn giản với nhau. Tất cả những điều này làm cho CGI trở thành công cụ thực dụng cho những tiện ích và sửa đổi mang tính tức thời nhưng không thể dùng được trên những Web site thương mại đòi hỏi cao. CGI vẫn có vai trò hết sức quan trọng nhưng ngày càng có nhiều phương thức khác uyển chuyển hơn, hoàn thiện hơn để tích hợp với những hệ thống khác.

Những chọn lựa khác

Cùng với máy chủ ứng dụng, những phương thức khác này bao gồm Active Server Pages - loại server ứng dụng tổng quát được thiết kế sẵn trong Internet Information Server Web server - và Java Servlet là những chương trình Java nhỏ chạy trên server.

CGI vẫn có tác dụng trong những công việc nhất định, ngay cả với các site đã chuyển sang dùng những công cụ mạnh hơn thì có lúc vẫn cần đến CGI.

Computerworld 1999

TELNET Và SEND MAIL

1- Giới thiệu:
Telnet là một chương trình cho phép bạn kết nối và đăng nhập vào một máy tính ở xa (trong LAN, internet). Khi kết nối thành công, máy tính của bạn sẽ thực hiện chức năng như trạm trung gian để gửi yêu cầu đến máy tính ở xa.
Bạn có thể dùng máy tính của mình để truy cập thông tin, thực thi các chương trình và sử dụng một số tài nguyên khác trên máy tính ở xa.

2- Sử dụng telnet:
Bắt đầu từ command prompt, gõ vào telnet, nếu bạn dùng 9x, nó sẽ đưa bạn vào trình windows telnet. Bạn cũng có thể chạy ở menu Start/Run.
Ở chế độ đánh lệnh, bạn có thể dùng các lệnh sau:
OPEN : mở một kết nốI đến máy tính ở xa, gọi là 1 telnet session
CLOSE : đóng kết nối và trở về dấu nhắc đợI lệnh
QUIT: đóng kết nối và thoát telnet
: nhấn phím enter sẽ đưa bạn thoát khỏI chế độ dấu nhắc lệnh và trở lại telnet session
SET ECHO: bật/tắt chế độ hiện các lệnh đánh vào trong windows telnet. Lưu ý trong 2k sẽ là SET LOCAL_ECHO

Để kết nối, ta dùng lệnh OPEN hoặc cũng có thể trực tiếp bằng lệnh
telnet
vd:
telnet anyhost.com 12345
Trying 123.123.112.12 port 12345
Connected to anyhost.com
Escape character is….

Sau khi kết nối xong, bạn đã ở trong một telnet session. Có thể dùng kí tự escape ở trên để trở về dấu nhắc lệnh.

3- Ứng dụng telnet để truy cập POP email:
a- Ðọc mail:
Các internet mail server cho phép truy cập thông qua giao thức POP (Post Office Protocol), cổng 110. Nếu POP server bạn đang dùng là anyhost.com, thì ta sẽ dùng lệnh sau: telnet anyhost.com 110
Một số các lệnh có thể bạn cần dùng khi truy cập POP email
USER : mở hộp thư của username
PASS : mật khẩu cho hộp thư
LIST : liệt kê các emails trong hộp thư
RETR : xem thư có thứ tự là number, được liệt kê trong lệnh LIST
TOP : xem thư như RETR, nhưng dừng lại khi hiện được số dòng nhất định
DELE : xóa thư có thứ tự number
QUIT : đóng telnet session

Ví dụ, ta sẽ truy cập vào yahoo để xem mail, ta thực hiện lệnh:
telnet pop.mail.yahoo.com 110 và chờ một chút…
Nếu thành công, bạn sẽ nhận được dòng thông tin sau:
+OK hello from popgate

Kể từ đây, nếu trước khi mở 1 telnet session, bạn có dùng SET ECHO, thì những gì bạn đánh vào sẽ hiện lên, không thì bạn phải nhập các lệnh thật chính xác
Nhập tên user
USER w_hat95
+OK password required

Nhập mật khẩu
PASS anhyeuemnhieulam
+OK maildrop ready, 2 messages (2983 octets) (34232 2324232)

Ở đây, mail box của tôi có 2 tin, kế đến là tổng kích thước của các email, các số còn lại bạn không cần quan tâm
Bạn dùng lệnh list để liệt kê các email, bao gồm stt và size:
list
1 1728
2 1205
.
Ðể xem một mail có stt nào đó, bạn dùng lệnh retr
retr 1
Chờ một chút, bạn sẽ nhận được những thông tin đầy đủ về mail đó, bao gồm toàn bộ header và nội dung

vd:
+OK 1783 octets
X-Apparently-To:
w_hat95@yahoo.com via web20306.mail.yahoo.com; 04 Jan 2002 23:4
8:08 -0800 (PST)
X-RocketRCL: 1037;1;2465408753
Received: from web11904.mail.yahoo.com (216.136.172.18)
by mta621.mail.yahoo.com with SMTP; 04 Jan 2002 23:48:08 -0800 (PST)
Message-ID: <20020105074808.35179.qmail@web11904.mail.yahoo.com>
Received: from [61.214.156.105] by web11904.mail.yahoo.com via HTTP; Fri, 04 Jan
2002 23:48:08 PST
Date: Fri, 4 Jan 2002 23:48:08 -0800 (PST)
From: Joel
Subject: Re: hi?
To: F M
In-Reply-To: <20020102080654.68330.qmail@web20307.mail.yahoo.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=”0-888944639-1010216888=:34368″
……vvv
.

Về những thông tin trong email header,bạn tự tìm hiểu lấy! :) )
Nếu những thông tin liệt kê ở trên quá nhiều, bạn không kịp xem, hãy dùng lệnh top để liệt kê theo số lượng dòng nhất định
vd: top 1 10 -> sẽ liệt kê 10 dòng đầu (kể cả header) của email số 1, sau khi hiện xong 10 dòng cho bạn xem, chờ vài giây, nó sẽ tiếp tục hiện các dòng kế tiếp cho đến khi toàn bộ email được xem!?

Ðể xóa 1 email, bạn dùng lệnh dele
vd: dele 2 -> sẽ xóa email thứ 2 trong danh sách
Sau khi check xong emails, bạn đóng telnet session bằng lệnh QUIT, bạn sẽ được đưa về dấu nhắc lệnh
Bất lợi của việc check email POP dùng telnet là bạn không có được giao diện dễ nhìn như các trình check POP mail khác. Bạn cũng không thể trả lời từ các mail đã đọc được.

b- Gửi mail:
Tương tự như trên, các internet mail server sẽ cung cấp một giao thức là SMTP (Simple Mail Transfer Protocol) cho phép bạn send email thông qua server đó, cổng 25.

Một số lệnh bạn cần dùng:
HELO : giới thiệu host, thông tin này không cần thiết
MAIL FROM:
RCPT TO:
DATA : sau khi enter, bạn nhập nội dung email. Sau khi nhập xong, muốn kết thúc, bạn phải xuống hàng và nhập dấu chấm ‘.’
RSET xóa các thông tin lần gửi mới nhất, dùng khi bạn muốn gửi đến một người khác
QUIT : thoát
HELP xem trợ giúp về các lệnh, lệnh này tùy thuộc vào mail server bạn đang connect

Ví dụ, đối với yahoo:
Bạn thực hiện lệnh telnet smtp.mail.yahoo.com 25
Chờ một lúc, nếu kết nối thành công, bạn sẽ nhận được thông tin sau:
220 smtp011.mail.yahoo.com ESMTP
Kết nối:
helo smtp.mail.yahoo.com
250 smtp011.mail.yahoo.com

Nhập thông tin người gửi:
mail from:
w_hat95@yahoo.com
250 ok
Nhập thông tin người nhận:
rcpt to:
joel@yahoo.com Joel
250 ok
Nhập nội dung:

data blsdfsdfsd
354 go ahead

Subject: hi Joel, how r u these days?
Hi Joel,
R u busy this late evening?
If ur free, get to Mo^.ng Mo* bar. I need to talk to you.
See ya,
W_Hat
.
250 ok 1010373599 qp 48077

Ðóng telnet session
Quit

Bạn có thể thao khảo một ví dụ về send mail thông qua SMTP tại: http://www.kbcafe.com/articles/smtp.html

ps: các ví dụ trên đã test trên Windows 2000, các bạn có thể thực hiện tương tự trên Windows 9x. Tùy mail server mà các thông tin xác nhận và thông báo các lệnh của bạn có thể khác nhau.

24 thg 12, 2010

Vài nét về ngôn ngữ JAVA

Java là một ngôn ngữ lập trình do công ty Sun Microsystems phát triển vào đầu thập kỷ 1990. Xuất phát điểm của ngôn ngữ này là một dự án nghiên cứu của công ty trong đó lúc đầu các nhà nghiên cứu dùng C++. Ngay sau đó nhóm nghiên cứu đã cho rằng họ cần một thứ gì đó tốt hơn thế. Các nhà nghiên cứu này đều là các lập trình viên xuất sắc, do vậy họ đã bắt tay ngay vào việc xây dựng một ngôn ngữ lập trình mới bằng cách tận dụng các ý tưởng hay của các ngôn ngữ lập trình khác. Người thiết kế Java là ông James Gosling còn nhà lập trình triển khai phiên bản chương trình dịch Java công cộng đầu tiên là ông Arthur van Hoff. Thoạt đầu người ta đặt tên cho ngôn ngữ này là "Oak", thực ra chỉ là một cái tên không có ý nghĩa gì đặc biệt. Tên gọi "Java" là do nhà tiếp thị Kim Polese đặt cho ngôn ngữ này hàm ý những đặc điểm phong phú và thú vị của nó.

Vì Java xuất phát từ một dự án nghiên cứu chứ không phải là một sản phẩm nhằm mục đích sinh lời, công ty Sun đã đồng ý đưa Java Development Kit (bộ công cụ phát triển Java, bao gồm chương trình dịch và hệ thống đáp ứng chạy chương trình) lên Internet miễn phí vào khoảng giữa năm 1995. Trong vòng 6 tháng kể từ khi công bố miễn phí, Java đã được hơn một trăm ngàn người lập trình sử dụng. Hai năm sau, đã có tới hơn bốn trăm ngàn nhà phát triển phần mềm Java. Vì Java chạy khắp mọi nơi, tổng thị phần tiềm tàng cho toàn bộ các nhà lập trình này là trên 250 triệu hệ thống máy tính trên thế giới. Có thể nói rằng không có một ngôn ngữ nào trong quá khứ gặt hái được nhiều thành tích trong một thời gian ngắn như vậy. Tuy nhiên, do tốc độ chấp nhận Java quá nhanh, đôi khi bạn cũng có thể thấy những ý kiến cho rằng có sự "khuyếch trương quá đáng" về Java. Cũng dễ hiểu là đôi khi một phát triển mới thường gây sự chú ý vì nó thực sự tốt hơn những cái khác trong quá khứ.

Với Java, bạn sẽ có dịp tiếp cận với một trong những sự phát triển kỳ thú nhất của ngành công nghiệp phần mềm.

Hệ thống Java bao gồm một số cấu phần như sau:

- Ngôn ngữ lập trình Java
- Java Virtual Machine (Máy o Java, bộ thông dịch)
- Các thư viện phần mềm đi kèm hệ thống
- chương trình duyệt web HotJava hoặc chương trình duyệt web khác thích ứng với Java

Bạn đọc cũng nên lưu ý rằng có một số phần mềm bao hàm tên Java nhưng chỉ liên quan ngoài lề với Java. Chẳng hạn như JavaScript. Đây là ngôn ngữ chỉ lệnh (script language) do Netscape Communications Corporation xây dựng. JavaScript được dùng trong chương trình duyệt Netscape để nhắc người sử dụng nhập, đọc thông tin, mở và đóng các cửa sổ phụ trợ v.v. JavaScript hỗ trợ khả năng lập trình cơ bản của chương trình duyệt nhưng không phải là một ngôn ngữ ứng dụng vạn năng như Java. Với việc xây dựng hỗ trợ Java trong Netscape Navigator 2.0, Netscape đã giúp cho việc phổ biến rộng rãi Java. Đổi lại, Netscape được Sun cho phép dùng tên Java cho ngôn ngữ chỉ lệnh của họ. JavaScript chẳng liên quan gì tới Java, vì vậy để trở thành người lập trình Java bạn không cần phải học JavaScript. Dĩ nhiên nếu bạn đã biết JavaScript rồi thì cũng không sao.

Ngôn ngữ Java

Thực ra Java không đưa ra nhiều ý tưởng hoàn toàn mới mà sự đổi mới ở đây là việc gom lại các ý tưởng hay nhất của các hệ thống đi trước. Java là một ngôn ngữ lập trình hướng đối tượng trong cùng một họ như C++, Pascal hay Algol-60. Các chương trình Java có các mô tả dữ liệu và các câu lệnh nhóm lại trong các hàm (do Java là một ngôn ngữ lập trình hướng đối tượng, các hàm của nó thường được gọi là các "phương pháp" (method). Các phương pháp có thể gọi tới các phương pháp khác. Sự thực hiện chương trình sẽ được bắt đầu với một phương pháp có tên đặc biệt là main().

Java nhanh chóng được nhiều nhà lập trình công nhận. Các câu lệnh và các biểu diễn tương tự như trong nhiều ngôn ngữ và trong nhiều trường hợp là đồng nhất như trong C hoặc C++. Mặc dù Java đã bổ sung một số điểm mới, nét phân biệt nhất của Java lại là những đặc điểm mà nó bỏ qua. Chẳng hạn, so sánh với C, Java không có

- Số học địa chỉ bộ nhớ (con trỏ)
- Bộ tiền xử lý
- Câu lệnh goto
- Chuyển đổi kiểu tự động
- Các biến và hàm tổng thể
- Các định danh xác định kiểu.

Còn so với C++ thì Java không có

- Các mẫu (template - tuy nhiên người ta đang tính đến việc bổ sung đặc điểm này cho Java)
- Quá tải toán tử (operator overloading)
- Đa thừa kế
- Đa ABI (Application Binary Interface, giao diện nhị phân ứng dụng)

Nếu bạn không phải là người lập trình C++ và bạn không biết một số những khái niệm trên thì cũng không hề gì. Ngay cả một người lập trình C++ cũng không nhất thiết đã thành thạo tất cả những khía cạnh này. Với Java bạn không cần phải biết tới chúng.

Tới đây, có lẽ bạn cũng muốn biết liệu Java có thay thế C++ hay không. Trên thực tế có thể nói rằng Java đang "cạnh tranh" với C++ trên phương diện ngôn ngữ đầu tiên được xem xét đến để phát triển các ứng dụng mới. Tuy nhiên, các ngôn ngữ lập trình mức cao không bao giờ thực sự mất đi cả. C++ sẽ vẫn còn trong một thời gian nữa đối với các ứng dụng riêng. Có 3 lý do về việc người ta sẽ tiếp tục lập trình với C++ là:

- Tính tương thích với mã hiện tại
- Không cần đào tạo lại cán bộ liên quan
- Có sẵn nhiều công cụ tốt hơn (nhanh hơn)

Trong các lý do nêu trên, lý do đầu tiên sát với thực tế về việc bảo trì mã chương trình bằng C++, nhưng có lẽ cũng chỉ xác đáng cho một thời gian ngắn nữa. C++ đã đạt tới đỉnh điểm và nay nó sẽ duy trì ở mức đó hoặc đi xuống. Tổ hợp C và Java sẽ không để cho C++ có địa vị dài hạn nữa.

Máy ảo Java (Java Virtual Machine)

Mã nguồn Java được biên dịch để sinh ra mã đối tượng gọi là bytecode (mã byte). Nếu chỉ có thế thôi thì cũng chẳng có gì khác với các ngôn ngữ khác. Điều khác nhau căn bản ở đây là bytecode không phải là mã nhị phân của bất kỳ máy tính đang tồn tại thực tế nào mà đó là một loại mã máy kiến tạo - trung gian có thể dễ dàng dịch sang để chạy trên bất kỳ máy tính cụ thể nào. Bạn sẽ thực hiện một chương trình Java bằng cách chạy một chương trình khác gọi là Java Virtual Machine hay là JVM. Thông thường trong hầu hết các môi trường hiện tại JVM được gọi thực hiện bằng một chương trình có tên là java. JVM đọc chương trình bằng bytecode và thông dịch hoặc biên dịch nó ra theo hệ lệnh thực tế.

Đây là một đặc điểm có ý nghĩa rất lớn. Chạy bytecode trên một JVM là lý do vì sao các phần mềm Java là "viết một lần, chạy khắp nơi". Các chương trình chạy được Java (Java executable) cung cấp một bộ mã nhị phân chạy trên mọi bộ xử lý. Nói cách khác, một ứng dụng bằng Java của bạn chẳng hạn là chương trình xyz nào đó bằng Java sẽ chạy trên mọi hệ thống hỗ trợ Java mà không cần phải có riêng "xyz cho DOS", "xyz cho Windows 3.1", "xyz cho Windows 95"...

Tính dễ chuyển mang và tính năng của phần mềm

Tính dễ chuyển mang của phần mềm là khuynh hướng lý tưởng của ngành công nghệ phần mềm. Nó đã được nghiên cứu, tìm kiếm từ lâu nay nhưng chưa bao giờ thực sự đạt được. Java làm cho ngành công nghệ này tiến lại gần tính dễ chuyển mang của phần mềm nhiều hơn tất cả các hệ thống trước đó. Tại các cửa hàng bán phần mềm hiện nay, có lẽ bạn sẽ thấy chủ yếu là các phần mềm dùng cho Windows (một số chỉ cho Windows 3.1, một số cho cả Windows 95 và Windows 3.1), một số ít cho Mac và một số rất ít (có thể là không có) cho Unix. Khi Java trở thành ngôn ngữ phổ biến thì bạn có thể chọn từ tất cả các phần mềm có trong cửa hàng và phần mềm bạn chọn mua sẽ chạy trên tất cả các hệ thống máy tính mà bạn có. Lúc đó mọi người có được sự lựa chọn rộng rãi hơn và giá phần mềm cũng sẽ hạ do các nhà cung ứng phần mềm có thể phân bổ chi phí phát triển trên một thị trường rộng lớn 250 triệu máy tính chứ không phải chỉ cho 91 triệu hệ thống Windows 3.1 hoặc cho 20 triệu hệ thống Macintosh hoặc cho 8 triệu hệ thống Unix.

Máy ảo Java (chẳng qua chỉ là một cái tên mỹ miều cho bộ thông dịch) phải được triển khai cho mỗi hệ thống máy tính và sau đó mọi bytecode sẽ chạy được trên hệ thống đó. Điểm quan trọng ở đây là bytecode có khả năng chuyển mang tổng hợp. Đương nhiên vấn đề đặt ra là làm sao để có các JVM thích hợp cho từng môi trường. Có lẽ vấn đề này cũng tương tự như quá trình để cho các máy tính cá nhân (PC) là tương thích DOS trước đây.

Một điều lý thú là bytecode không phải chỉ dành riêng cho Java. Nếu bạn sửa đổi một chương trình dịch đối với một số ngôn ngữ khác như Ada hay Visual Basic để nó sinh ra được bytecode thì bạn cũng có thể chạy bytecode đó "ngon lành" trên JVM trên bất kỳ máy tính nào. Đây là một hướng mà các nhà cung ứng phần mềm đang quan tâm. Khả năng chạy được mã của bạn trên mọi hệ thống máy tính trên hành tinh là lý do mạnh mẽ để cải cách. ý tưởng về JVM hỗ trợ đắc lực cho hướng cải cách này.

Java có những đảm bảo tính dễ chuyển mang, bao gồm việc cung cấp cùng một giao diện người lập trình ứng dụng (API, Application Programmer Interface) trên mọi loại nền; cùng một giao diện nhị phân ứng dụng (ABI, Application Binary Interface), cụ thể là máy ảo Java, trên mọi loại nền. Ngoài ra ngôn ngữ Java còn có qui định bắt buộc một số điểm lâu nay vẫn để tuỳ thuộc vào sự cụ thể hoá của người viết chương trình dịch. Bằng cách yêu cầu rằng các toán hạng được đánh giá theo thứ tự nghiêm ngặt từ trái qua phải và qui định kích thước của tất cả các kiểu cơ bản (kiểu nguyên là 32 bit, kiểu chính xác gấp đôi là 64 bit v.v) Java đáp ứng không những tính dễ chuyển mang mà còn cả cách xử lý đồng nhất của chương trình trên các hệ thống khác nhau. Java dùng Unicode là tập ký tự chuẩn có thể biểu diễn các ký hiệu, ký tự trong hầu hết các bảng chữ cái trên thế giới, kể cả các ký tự tiếng Việt cũng như các loại chữ tượng hình của châu A'. Trong thời gian sắp tới, nếu chuẩn tiếng Việt cho công nghệ thông tin của Việt nam dựa trên Unicode thì chắc chắn Java dễ dàng hỗ trợ cho chuẩn đó.

Một điều có thể dễ nhận thấy rằng việc bảo đảm tính dễ chuyển mang có thể ảnh hưởng tới tính năng thực hiện của phần mềm. Tuy nhiên, ta có một sự cân nhắc đáng giá. Bạn hãy hình dung xem, nếu tất cả các hệ thống được xây dựng trong nhiều năm qua không cố gắng tiết kiệm chi phí của hai byte "thừa" và lưu giữ các con số năm bằng 4 byte chứ không phải là 2 byte thì chúng ta đã không gặp phải sự cố đau đầu "vấn đề năm 2000" . Với Java, có thể bạn thấy một số điểm là hơi "cồng kềnh" hoặc "dư thừa". Tuy nhiên, những qui định chặt chẽ và chuẩn hoá của Java chính là để đảm bảo tính dễ chuyển mang và tính năng của nó trong một tương lai dài lâu.

Java với việc quản lý bộ nhớ

Trong lập trình, một vấn đề rất nặng nề được đặt ra là việc quản lý bộ nhớ động, trong đó có việc "dọn dẹp bộ nhớ" - tức là việc giải phóng những phần bộ nhớ mà chương trình đã dùng xong để dành cho những mục đích khác. Khi một chương trình chạy, nó sẽ phân bổ bộ nhớ để lưu giữ các đối tượng mới. Khi sự tồn tại của các đối tượng này đã kết thúc thì không gian bộ nhớ dành cho chúng cần được giải phóng và dùng lại cho các đối tượng khác. Nếu bộ nhớ không được giải phóng thì quá trình (chương trình) sẽ ngày càng lớn lên và sẽ có thể chiếm hết tất cả không gian nhớ, gây tràn. Một số ngôn ngữ như COBOL-74 không trang bị khả năng quản lý bộ nhớ động (do vậy một số chương trình hết sức khó viết hoặc không thể viết được). Một số ngôn ngữ khác như Pascal, C, C++ lại trút gánh nặng quản lý bộ nhớ lên vai người lập trình. Thậm chí người lập trình còn phải quan tâm xem phần nào của bộ nhớ đang được sử dụng và phải giải phóng phần nào của bộ nhớ khi cần thiết. Những chuyện này dẫn đến nhiều loại lỗi khác nhau của các chương trình, phổ biến là lỗi không giải phóng được bộ nhớ gây ra các "lỗ hổng" không bao giờ được khai báo lại trong bộ nhớ. Còn tệ hơn là các lỗi gây ra do việc cố giải phóng những phần bộ nhớ còn đang sử dụng dẫn đến hỏng hoặc mất dữ liệu.

Các chương trình Java được quản lý về bộ nhớ ở mức hệ thống và người lập trình không bao giờ phải lo lắng về chuyện đó. Thư viện thời gian chạy của Java sẽ giám sát các cấu trúc dữ liệu. Khi không còn một tham chiếu nào tới một cấu trúc dữ liệu thì nó không thể là đang được sử dụng vì chương trình không có cách gì để đọc hoặc ghi nó. Lúc đó nó sẽ là đối tượng của việc dọn dẹp bộ nhớ.

Java hướng tới việc dọn dẹp bộ nhớ tự động. Việc dọn dẹp bộ nhớ tự động ảnh hưởng tới tính năng vì nó liên quan đến các quá trình khác chạy trong nền sau để giám sát việc sử dụng bộ nhớ. Tuy nhiên thực tế đã chỉ ra rằng, ở đây cũng có một sự cân nhắc đáng giá. Một hệ thống nhỏ thực hiện dọn dẹp bộ nhớ tự động đã dẫn tới sự cải thiện rất lớn thông qua việc gỡ bỏ một loạt các lỗi của các chương trình Java. Có thể so sánh, các chương trình C++ chịu trách nhiệm quản lý các đống (heap) bộ nhớ của riêng chúng do vậy chúng phải có mã dài hơn, mất nhiều thời gian gỡ rối hơn và các chương trình lớn thường dẫn tới các lỗi rất khó phát hiện và xử lý về việc dọn dẹp bộ nhớ.

Java và WWW (World Wide Web)

Có hai loại chương trình Java: chương trình đơn lẻ, gọi là các ứng dụng, và chương trình chạy trong các trình duyệt web, gọi là các applet. Một applet đơn thuần là một chương trình ứng dụng chạy bên trong một chương trình duyệt. Có rất ít khác biệt giữa lập trình ứng dụng và lập trình applet. Trên thực tế cùng một bộ mã nhị phân có thể đồng thời là cả hai thứ đó. Điều này có nghĩa là tất cả những kiến thức và kỹ năng lập trình ứng dụng Java cũng áp dụng được cho lập trình applet Java và ngược lại..

Applet hoạt động giống như cung cách bạn đặt một trang web với các siêu văn bản trên một server và một máy khách (client) có thể tải trang đó xuống theo yêu cầu để xem các văn bản đã sắp đặt theo khuôn dạng. Tương tự, bạn viết và biên dịch một chương trình applet Java và đặt một tham chiếu URL hoặc HTML tới nó trong trang web. Khi một client duyệt qua trang web này, mã nhị phân của applet Java được tải xuống client đó cùng các tệp văn bản và đồ hoạ. chương trình duyệt chứa một JVM và nó sẽ thực hiện applet trên máy tính của client.

Điều mô tả ở trên nghe có vẻ giản đơn và có lẽ cũng chẳng có gì thú vị nhưng thực tế nó đã làm sôi động cả ngành công nghệ máy tính. Trước Java, WWW là giao diện chỉ đọc (read-only interface). Bạn duyệt và trình duyệt phục vụ bạn đọc các trang, chỉ có thế thôi. Nay các trang web có thể làm cho các chương trình được chạy và chương trình duyệt ngày càng trở nên giao diện máy tính vạn năng. Thoạt tiên, các applet được coi là các ứng dụng nhỏ nhưng trên thực tế không có hạn chế nào về kích thước cuả các applet cả. Do chỗ mô hình này rất tiện lợi nên hiên nay đã có các applet đủ các kích cỡ.

Các applet hết sức phù hợp với mô hình xử lý khách - chủ. Bằng cách viết chương trình Java của mình như là một applet bạn có thể đưa nó vào một trang web và cho phép mọi người, với mọi loại máy tính ở mọi nơi trên mạng intranet của bạn truy nhập và thực hiện nó một cách tự động mà không phải cài đặt một cái gì cả. Khi nâng cấp hoặc thay đổi applet của mình bạn chỉ việc đưa phiên bản mới của applet lên trang web và thế là trong lần truy nhập sau đó các client sẽ được cập nhật một cách tự động. Các vấn đề đau đầu liên quan đến phân phối phần mềm như làm thế nào để cài đặt hay cập nhật các phiên bản cho một loạt các máy tính có thể giải quyết dễ dàng theo cách này.

21 thg 12, 2010

[PHP] Create Instance, Call Method by Name

class ABC {
public function method() {
echo "Call Method";
}
}
$c = "ABC";
$i = new $c();
$m = "method";
$i-&gt;
$m();

Biên dịch mã nguồn C# từ Command Line

Hôm nay, chúng ta sẽ cùng nhau thực hiện công việc biên dịch một đoạn mã C# từ Command Line mà không có sự hỗ trợ của IDE Visual Studio. Tuy rằng việc biên dịch từ Command Line hầu như rất ít được thực hiện khi các bạn phát triển ứng dụng lớn, phức tạp nhưng qua bài viết này, hy vọng các bạn sẽ hiểu rõ hơn bản chất thật sự của quá trình biên dịch đó là như thế nào.

Ứng dụng của chúng ta cần thực hiện sẽ là một ứng dụng Console đơn giản có nhiệm vụ in ra màn hình ngày giờ hiện tại của hệ thống. Nội dung đoạn mã C# là như sau:

1using System;
2public class Sample
3{
4 public static void Main()
5 {
6 Console.WriteLine(DateTime.Now);
7 Console.ReadKey();
8 }
9}

Chúng ta sẽ lưu đoạn mã trên trong tập tin Sample.cs tại một nơi nào đó trong máy tính (các bạn nhớ lưu ý đường dẫn đến tập tin này).

Bước tiếp theo, các bạn khởi động Visual Studio Command Prompt (Thông thường là nằm trong Start Menu –> All Programs –> Microsoft Visual Studio –> Visual Studio Tools). Chúng ta phải sử dụng Visual Studio Command Prompt bởi vì ứng dụng này đã thiết lập sẵn cho chúng ta đường dẫn đến các tập tin thực thi cho các lệnh tương ứng. Còn nếu như các bạn muốn sử dụng Command Line của Windows thì chúng ta cần phải thiết lập thêm biến môi trường cho Windows hiểu được các lệnh bạn sử dụng là lấy từ đâu.

Trong Visual Studio Command Prompt, các bạn thực hiện các lệnh chuyển đổi thư mục để đi đến thư mục chứa tập tin mã nguồn Sample.cs mà chúng ta đã tạo. Để thực hiện việc chuyển đổi giữa các thư mục thì các bạn sử dụng lệnh cd. Ví dụ chuyển sang thư mục C:\Windows thì các bạn gõ lệnh:

cd C:\Windows

Bây giờ chính là lúc chúng ta sẽ thực hiện công việc biên dịch mã nguồn thành chương trình để chạy. Các bạn gõ lệnh sau vào trong Visual Studio Command Prompt:

csc /target:exe /out:DateTimeApp.exe Sample.cs

Giải thích:

  • csc: Chương trình biên dịch, bắt buộc phải có
  • /target: chỉ định rằng chúng ta biên dịch ra ứng dụng Console (exe), một ứng dụng Windows (winexe), hay là một tập tin thư viện DLL (library)
  • /out: Nếu như chúng ta không sử dụng tham số này thì ứng dụng sau khi được biên dịch sẽ có tên trùng với tên file mã nguồn. Ở đây, chúng ta muốn sử dụng một tên khác nên có truyền giá trị cho đối số /out
  • Sample.cs: tên của tập tin chứa mã muốn biên dịch
    Nếu như chương trình C# của chúng ta có sử dụng thêm các tham chiếu (Reference) khác những tham chiếu mặc định (như System; System.Windows.Forms…) thì bắt buộc khi biên dịch, chúng ta phải chỉ định nơi chứa các tham chiếu này bằng sử dụng thêm đối số /reference trong câu lệnh biên dịch. Giả sử đoạn mã của chúng ta có tham chiếu đến namespace sau đây:
    using System.Collections.Generic;

Khi đó, để biên dịch được đoạn mã này, chúng ta phải dùng lệnh sau:

csc /target:exe /out:DateTimeApp.exe /reference:System.Collections.Generic.dll Sample.cs

Chúng ta đã bổ sung thêm tùy chọn /reference nhằm chỉ định tập tin dll sẽ được tham chiếu tới.

Kết luận: Như vậy là chúng ta đã có thể cơ bản biên dịch được một ứng dụng viết bằng ngôn ngữ lập trình C# mà không sử dụng bộ IDE Visual Studio. Tất nhiên, khi ứng dụng của chúng ta lớn và bao gồm nhiều thành phần liên kết với nhau thì rõ ràng việc sử dụng Command Line như thế này rất tốn thời gian mà không đem lại lợi ích nào cho lập trình viên. Do đó, tốt nhất là chúng ta nên sử dụng Visual Studio để lập trình ứng dụng, và đồng thời có thể tận dụng được những tính năng phong phú, mạnh mẽ được tích hợp trong Visual Studio. (Nếu như bạn chưa có Visual Studio 2010, tải ngay các bản Express tại đây: http://www.microsoft.com/express/Downloads/)

Một số khái niệm trong Lập trình

  1. Tiến trình là gì? Tiến trình khác chương trình thế nào? Nhiệm vụ chính của bộ phận Process Management
    Tiến trình là một chương trình đang xử lí, sở hữu một tập con trỏ lệnh, tập các thanh ghi, các biến và một tập các tài nguyên cần cho hoạt động của tiến trình.
    Chương trình là một thực thể thụ động chứa các chỉ thị điều khiển máy tính để tiến hành một hoạt động nào đó, khi thực hiện tác vụ này thì chương trình chuyển thành tiến trình – một thực thể hoạt động với con trỏ lệnh xác định chỉ thị tiếp theo sẽ thi hành và tập tài nguyên.
    Bộ phận Process Management có nhiệm vụ:
    • Tạo và hủy tiến trình người dùng và tiến trình hệ thống
    • Hoãn và khôi phục tiến trình
    • Cung cấp cơ chế cho việc đồng bộ hóa tiến trình
    • Cung cấp cơ chế cho việc giao tiếp tiến trình
    • Cung cấp cơ chế quản lý deadlock
  2. Các công việc chính của bộ phận Memory Management, File Management và Secondary Storage Management?
    • Memory Management
      • Theo dõi thành phần nào của của bộ nhớ đang được sử dụng và tiến trình nào đang sử dụng
      • Quyết định tiến trình nào hoặc dữ liệu nào sẽ được di chuyển ra khỏi hoặc đưa vào bộ nhớ
      • Cấp phát và hủy không gian bộ nhớ nếu cần.
    • File Management
      • Tạo và xóa tập tin
      • Tạo và xóa thư mục
      • Hỗ trợ các thao tác cơ bản trên tập tin và thư mục
      • Ánh xạ tập tin vào trong bộ lưu trữ thứ cấp
      • Sao lưu trên các thiết bị ổn định
    • Storage Management
      • Quản lí không gian trống
      • Cấp phát cho việc lưu trữ dữ liệu
      • Định thời yêu cầu truy cập bộ nhớ
  3. Cho biết công việc chính của I/O Management và Hệ thống bảo vệ?
    • I/O Management: Che dấu sự khác biệt của các thiết bị đối với người dùng
      • Cung cấp giao diện chung đến các trình điều khiển thiết bị (device driver)
      • Bộ điều khiển thiết bị phần cứng
      • Các cơ chế buffering, caching, spooling
    • Hệ thống bảo vệ:
      • Cung cấp cơ chế kiểm soát đăng nhập và đăng xuất
      • Phân định sự truy cập tài nguyên hợp pháp, bất hợp pháp
      • Phương tiện thi hành các chính sách (cần bảo vệ dữ liệu của ai đối với ai)
  4. System call là gì? Cho ví dụ? System program khác với Application program điểm nào? Liệt kê các system program cơ bản.
    • System Call là một cơ chế mà các chương trình ứng dụng sử dụng để yêu cầu các dịch vụ có sẵn của hệ điều hành. Hay nói cách khác System Call cung cấp một giao diện cho các dịch vụ mà hệ điều hành cung cấp.
    • Ví dụ về system call: Lệnh fork() trong Unix dùng để tạo ra một tiến trình mới.
    • System Program là các chương trình cung cấp một môi trường thuận tiện để phát triển và thực thi chương trình. Application là chương trình được viết ra để giúp người sử dụng giải quyết một vấn đề nào đó hoặc thao tác trong công việc. Ví dụ như Web Browser, Microsoft Office Word
    • Vài ví dụ về các System Program là: Compiler, Linker, Loader, Debugger
  5. Kernel Mode và User Mode là gì? Cho biết sự khác nhau giữa chúng? Các trạng thái của một quá trình, vẽ sơ đồ và giải thích sự chuyển đổi.
    • Kernel Mode: là một trong hai chế độ thao tác của CPU. Khi CPU ở trong Kernel Mode, nó có thể thực thi bất cứ chỉ thị nào và tham chiếu đến bất kì địa chỉ nhớ nào
    • User Mode: Khi CPU ở trong User Mode, nó không thể truy cập tới phần cứng hoặc tham chiếu đến bộ nhớ một cách trực tiếp. Các đoạn mã trong User mode phải được chuyển đổi thành các hàm API hệ thống để có thể truy cập tới bộ nhớ và phần cứng.
  6. Tại sao các hệ điều hành hiện đại hỗ trợ môi trường đa nhiệm? Phân biệt multitasking, multiprogramming và multiprocessing?
    • Các hệ điều hành hiện đại hỗ trợ môi trường đa nhiệm vì: tăng hiệu suất sử dụng CPU và tăng tốc độ xử lý
    • Multitasking (đa nhiệm): thực hiện nhiều nhiệm vụ cùng một lúc, CPU sẽ luân phiên xử lý các tiến trình trong một khoảng thời gian rồi chuyển sang cho tiến trình khác. VD: nghe nhạc và duyệt web đồng thời
    • Multiprogramming (đa chương): có nhiều hơn một chương trình đang nằm trong bộ nhớ để được lựa chọn chuyển giao cho CPU thực thi. Ví dụ: mở Word, Excel, Powerpoint cùng lúc, trong khi chúng ta sử dụng Word thì Excel và Powerpoint vẫn thường trực trong bộ nhớ mặc dù chúng không thực hiện việc gì cả
    • Multiprocessing (đa tiến trình): sử dụng nhiều hơn 1 CPU để có thể xử lý song song cùng lúc nhiều tiến trình.
  7. Khái niệm tiến trình được xây dựng nhằm mục đích gì? Sự khác biệt, mối quan hệ giữa tiến trình và tiểu trình?
    • Để hỗ trợ sự đa chương, máy tính phải có khả năng thực hiện nhiều tác vụ đồng thời. Nhưng việc điều khiển nhiều hoạt động song song ở cấp độ phần cứng là rất khó khăn. Vì thế các nhà thiết kế hệ điều hành đề xuất một mô hình song song gỉa lặp bằng cách chuyển đổi bộ xử lý qua lại giữa các chương trình để duy trì hoạt động của nhiều chương trình cùng lúc, điều này tạo cảm giác có nhiều hoạt động được thực hiện đồng thời. Trong mô hình này, tất cả các phần mềm trong hệ thống được tổ chức thành một số những tiến trình (process).
    • Tiến trình có không gian địa chỉ và chỉ có một dòng xử lý. Các tiểu trình thì chia sẻ một không gian địa chỉ, và các dòng xử lý này hoạt động song song tương tự như các tiến trình phân biệt.
    • Một tiến trình có thể có nhiều tiểu trình chạy đồng thời
  8. Thông tin lưu trữ trong PCB và TCB? Tổ chức điều phối tiến trình? Ưu khuyết của các chiến lược điều phối?
    • PCB: định danh, trạng thái, ngữ cảnh, thông tin giao tiếp, thông tin thống kê
    • TCB:

Quản lý bộ nhớ trong .NET (Garbage Collection)

Nếu bạn đã từng lập trình C/C++ thì chắc hẳn sẽ nhớ đến một trong những điểm mạnh và cũng rất phức tạp của ngôn ngữ này là con trỏ và cấp phát động. Bạn luôn phải tuân thủ theo quy tắc: cấp bao nhiêu, thu hồi bấy nhiêu. Ví dụ đoạn chương trình C++ sau cấp phát một vùng nhớ gồm 5 phần tử số nguyên như sau:

int *p = new int[5];

Và giả sử như sau khi kết thúc chương trình mà chúng ta không thu hồi vùng nhớ này thì chuyện gì sẽ xảy ra? 5 ô nhớ này sẽ cứ tồn tại trong bộ nhớ trong khi các chương trình khác không thể sử dụng được vùng nhớ này (hay còn gọi là rò rỉ bộ nhớ – memory leak). Nếu như điều này diễn ra nhiều lần thì chúng ta sẽ dần dần không còn đủ bộ nhớ để sử dụng. Vì thế, trong C++, yêu cầu bắt buộc là sau khi sử dụng xong vùng nhớ đã cấp phát thì phải thu hồi. Để thu hồi lại vùng nhớ chúng ta đã cấp phát trong ví dụ trên thì ta sử dụng hàm delete trong C++:

delete[] p;

Ở đây, vì thu hồi lại vùng nhớ của một mảng gồm nhiều phần tử nên chúng ta phải sử dụng thêm dấu ngoặc vuông để cho chương trình biết rằng p là địa chỉ đầu của một mảng liên tiếp nhiều phần tử.

Trong .NET, khái niệm con trỏ bị hạn chế sử dụng (nếu muốn sử dụng thì phải đánh dấu đoạn mã là unsafe). Tuy nhiên, thực chất khi chúng ta tạo một đối tượng của lớp (nói rộng hơn là một kiểu tham chiếu) thì quá trình cấp phát bộ nhớ cũng tương tự như cấp phát động cho con trỏ trong C++. Xét khai báo của một class sau:

class MyClass
{
int x;
int y;
}

Sau đó, tại một nơi nào đó trong chương trình, chúng ta tạo một đối tượng của lớp này như sau:

MyClass c = new MyClass();

Dòng lệnh trên sẽ tạo ra một biến c trong bộ nhớ và biến này sẽ lưu trữ địa chỉ của vùng nhớ thật sự chứa dữ liệu của đối tượng lớp đó. Hình sau cho chúng ta thấy biến c không hề chứa dữ liệu mà nó sẽ tham chiếu đến một vùng nhớ thực sự chứa dữ liệu.

image

Nhưng chúng ta biết rằng .NET không cung cấp cho chúng ta từ khóa delete để thu hồi lại vùng nhớ đã được cấp, vậy “vùng nhớ đó thật sự được thu hồi như thế nào?”

Trong .NET (cũng như Java) có một khái niệm là Bộ dọn rác (Garbage Collector). Đây là một tiến trình đặc biệt có nhiệm vụ duyệt qua các vùng nhớ đã được cấp phát và kiểm tra xem vùng nhớ nào không còn được sử dụng nữa (không còn tham chiếu tới nó nữa) thì sẽ thực hiện thu hồi một cách tự động để có thể cấp phát cho các yêu cầu tiếp theo. Vấn đề chúng ta cần biết ở đây là, “làm thế nào Garbage Collector có thể biết được rằng vùng nhớ đó không còn được sử dụng nữa để mà thu hồi?”

Chúng ta có thể hình dung được công việc của Garbage Collector như sau: Khi chương trình khởi chạy thì một vùng nhớ liên tục còn trống sẽ được dành riêng để cấp phát cho các biến trong chương trình (vùng nhớ này được gọi là managed-heap). Khi chúng ta dùng toán tử new để tạo một đối tượng mới thì chương trình sẽ kiểm tra xem vùng nhớ này còn đủ để cấp phát hay không, nếu không đủ thì GC sẽ được khởi động. Bước đầu tiên mà GC thực hiện là tạm dừng chương trình và thực hiện việc duyệt để đánh dấu tất cả những vùng nhớ đang được sử dụng với khởi đầu tại một điểm nào đó đã biết trước (hay được gọi là điểm gốc).

Figure 2 Allocated Objects in Heap

Như hình trên, chúng ta thấy rằng chương trình này có một số điểm gốc tham chiếu tới các đối tượng F, D, C và A. GC sẽ bắt đầu tại 1 điểm gốc nào đó tham chiếu tới D, GC sẽ đánh dấu D là “còn sống”. Tiếp đó GC thấy rằng D tham chiếu tới H nên cũng sẽ đánh dấu H là “còn sống”. Cứ tiếp tục như vậy, GC sẽ duyệt qua tất cả các đối tượng đang được tham chiếu bởi một đối tượng nào đó trong chương trình.

Tất cả những đối tượng mà không được GC đánh dấu là “còn sống” thì sẽ được xem là rác và được giải phóng ngay lập tức. Liền sau đó, GC phải thực hiện công việc di chuyển các khối bộ nhớ rời rạc, phân mảnh nằm gần lại với nhau để tạo thành một vùng liên tục. Như vậy, từ hình trên ta có thể suy ra được vùng nhớ sau khi đã được thu dọn và sắp xếp nhờ GC như sau

Figure 3 Managed Heap after Collection

Kết luận: Quá trình thực hiện dọn dẹp bộ nhớ của Garbage Collector thật sự khiến cho chương trình của chúng ta sẽ chạy chậm hơn so với các chương trình viết bằng C/C++. Tuy nhiên, năng suất mà chúng ta đạt được là rất đáng kể bởi vì chúng ta không phải tập trung giải quyết những công việc đòi hỏi sự tỉ mỉ, cẩn thận với ngôn ngữ lập trình mà chỉ cần tập trung vào giải quyết các vấn đề của khách hàng đưa ra.

20 thg 12, 2010

Firefox 3.6a1, Opera 10.0, IE8, Safari 4, Chrome 4 : Ai nhanh hơn

Firefox 3.6a1, Opera 10.0, IE8, Safari 4, Chrome 4 trình duyệt nào là số một ? Những thông tin sau từ cuộc thử nghiệm của Daily Tech sẽ cho bạn câu trả lời khách quan nhất.

Tuần rồi Opera 10.0 đã chính thức ra mắt, Daily Tech đã làm môt cuộc đo kiểm các trình duyệt tốt nhất hiện nay như Safari 4, Opera 10.0, Firefox 3.6 alpha 1, Internet Explorer 8, và Google Chrome 3 và 4.

1. Giao diện và các tính năng cơ bản

Đầu tiên, hãy xem xét các tính năng của trình duyệt:

So sánh về giao diện và các tính năng cơ bản

Như bạn thấy, khi nói đến giao diện người dùng, Opera dẫn đầu với những thiết kế giao diện chức năng tốt nhất. Firefox ở vị trí thứ hai, với các tính năng hỗ trợ hầu hết bởi các Add-on vốn làm Firefox trở nên nổi tiếng, nếu bạn cài đặt tiện ích (mặc dù tiện ích làm giảm hiệu suất và có thể gây ra vấn đề tương thích). đánh giá này không bao gồm bảo mật, mà chúng tôi sẽ xem xét trong một đoạn sau.

2. Cài đặt

Google's Chrome là trình duyệt dể cài đặt nhất, Microsoft's Internet Explorer 8 là khó khăn nhất để cài đặt, bởi đến nay, đòi hỏi một thiết lập lại hệ thống đầy đủ. Nhìn lại, những tranh cãi trên IE 8 yêu cầu lúc cài đặt nếu bạn muốn làm cho trình duyệt mặc định của bạn, có vẻ khá ngớ ngẩn. Trong thực tế, tất cả các trình duyệt yêu luôn hỏi bạn có cho phép việc khởi động cùng hệ thống hay không và chọn làm trình duyệt mặc định, tuy nhiên điều cho phép ta loại bỏ thông báo khó chiệu này một cách dể dàng.

3. Tốc độ khởi động của ứng dụng

Điểm chuẩn thứ hai là thời gian khởi động của ứng dụng, người ta dùng phím tắt và hẹn giờ đo để đo được tốc độ khởi động của trình duyệt, đây là thời gian tính từ thao tác double-click đến lúc hiển thị cửa sổ trình duyệt.

Trong lần thử nghiệm đầu tiên, chúng tôi để trình duyệt khởi động "lạnh" sau khi hệ thống khởi động lại toàn bộ. Trung bình trên ba thử nghiệm, Chrome luôn đạt tốc độ nhanh nhất, trong đó Chrome 4 là trình duyệt nhanh nhất của Google. Tiếp theo là Opera 10.0. Firefox 3.5 chậm nhất, đến 10 giây dù đã thử nghiệm đến 5 lần và bản cài đặt đơn thuần, không bao gồm Add-on. Chúng tôi cuối cùng đã kết luận rằng, điều này đã được dự kiến và không phải là một lỗi. Firefox 3.5 khởi động chậm nhât, nhưng Namaroka (Firefox 3.6 alpha 1) nhanh hơn nhiều lần. IE8 chậm nhất thứ hai cuộc thử nghiệm khởi động lạnh.

Trong lần thử nghiệm thứ hai, chúng tôi để trình duyệt khởi động "nóng" sau khi nó đã được khởi chạy một lần. Như có thể dự đoán, do bộ nhớ đệm, các trình duyệt mở nhanh hơn đáng kể bằng cách này. Khởi động "nóng" bắt đầu, nhưng một lần nữa Chrome đã nhanh nhất, trong khi Opera và Safari ở vị trí thứ hai, dù cả hai phiên bản mới nhất(10,0 Opera và Safari 4) đều chậm hơn so với phiên bản trước(Opera 9.6 và Safari 3).

Ghi chú: Cuộc thử nghiệm thực hiện trên Laptop Sony Vaio cài Windows Vista 32 bit, RAM 3 Gb, bộ xử lý T8100 Intel Processor (2,1 GHz).


4. Sử dụng tài nguyên

Một trong những khía cạnh quan trọng nhất của một chương trình là các nguồn tài nguyên nó sử dụng vào mỗi công việc. Chúng tôi đo bộ nhớ và sử dụng CPU cho từng trình duyệt với mười tab mở và nạp - DailyTech, AnandTech, CNET, CNN, SportsIllustrated, GameFAQs, Google, Yahoo, Bing, và Facebook (đăng nhập). Sau đó chúng tôi đã đo sau 15, 20, và 25 phút hoạt động.

Sử dụng bộ nhớ

Khi nói đến bộ nhớ, Firefox thực sự cho thấy giá trị của nó, điều này có thể gây ngạc nhiên, Firefox vốn được xem là một trình duyệt "ngốn" bộ nhớ. Điều này đã hoàn toàn trái ngược, nó lại là trình duyệt ít tốn RAM nhất. Namoroka sử dụng bộ nhớ một cách đáng kể hơn 3.5.2, nhưng hy vọng này chỉ là một trong các cạnh thô đang được dự kiến sẽ phát hành một alpha.

Nhìn vào phần còn lại, Opera xứng đáng ở vị trí thứ hai, kế đến là Safari, vàChrome, vượt mặt hai gả đàn anh, nó thực sự là trình duyệt đói bộ nhớ. Tuy nhiên, không có ứng dụng nào ngốn bộ nhớ như Internet Explorer 8, trong đó được sử dụng gần gấp đôi bộ nhớ của các đối thủ cạnh tranh gần nhất của nó.

Trong việc sử dụng CPU, Opera đã dẫn đầu cho việc sử dụng bình quân ít nhất. Opera 9.6 cũng là trình duyệt sử dụng trung bình ít CPU nhất. Opera 10 vẫn hiển thị chỉ số khá cao trong cuộc đo sử dụng tối đa.

Chrome, Safari, và Internet Explorer xếp trên Opera nhưng không là gì so với Chrome 4 trong việc sử dụng CPU. Nó chạm đỉnh tối đa 64% CPU, với Firrefox thì khá lý tưởng mặc dù cũng như lần trước, Namoroka 3.6a1 tỏ ra "đói " hơn 3.5.2.

5. Bảo mật

Có xem xét các nguồn lực được sử dụng, nó cũng rất quan trọng để nhìn vào những gì đang được thực hiện với chúng. Chúng tôi đã kết luận rằng Opera được xây dựng tại hầu hết các tính năng (không an toàn) trong việc xem xét đầu tiên của chúng tôi (mặc dù Firefox có nhiều Add-on được xem là hiểm họa). Nhưng những gì về tính năng bảo mật?

Bảng dưới đây minh hoạ một số điểm nổi bật của hồ sơ theo dõi các trình duyệt:

Như bạn thấy, an ninh là một chủ đề khá khó hiểu để đánh giá các trình duyệt trên. Một mặt, IE 8 cung cấp một chế độ duyệt web cá nhân xuất sắc, cô lập tab, và blacklisting tuyệt vời các trang web độc hại. Mặt khác, InPrivate của nó không lọc bắt tất cả các quảng cáo được. IE 8 cũng là trình duyệt thường xuyên xảy ra tấn công và khai thác trình duyệt nhất, mặc dù Microsoft đặt nỗ lực rất lớn vào các bản vá.

Mặc dù vậy, IE 8 cho người dùng ít kinh nghiệm một sự yên tâm nhất định trong việc ngăn ngừa các trang Wed độc hại, lừa đảo. Thử nghiệm cho thấy nó khóa 81 % các trang Wed không mong muốn, trong khi chỉ số này là 27 % trên Firefox. Điều này có thể là một cường điệu một chút, nhưng Microsoft xứng đáng khen ngợi cho sự tiến bộ của mình trên mặt trận này.

Chrome cung cấp tổng thể bảo vệ tốt với sự cô lập tab, duyệt một chế độ riêng tư và rủi ro ít hơn, nhưng là nan nhân của quảng cáo nhiều hơn bất kỳ trình duyệt nào. Firefox là một Á hậu kế tiếp IE 8, đặc biệt là khi tiện ích được xem xét. Tuy nhiên, nó thiếu sự cô lập tab. Opera và Apple đặt nhiều nổ lực vào việc bảo mật của trình duyệt, nhưng họ không mạnh hoặc tập trung như những người của Microsoft, Mozilla, và Google.


Trong phần ba này, chúng ta sẽ tìm hiểu thế mạnh của mỗi trình duyệt và điểm yếu lớn nhất của chúng.

Firefox 3.6a1, Opera 10.0, IE8, Safari 4, Chrome 4 : Ai nhanh hơn? (Phần II)

Trước tiên, chúng ta sẽ xem xét điểm chuẩn tổng hợp và sau đó là plug-in hỗ trợ của từng trình duyệt.

6. Điểm chuẩn tổng hợp

Đầu tiên chúng tôi chạy thử nghiệm Javascript Celtic Kane's. Thử nghiệm của của chúng tôi chỉ ra rằng Chrome của Google là số một. Safari đến thứ hai, thứ ba là Opera, Firefox thứ tư, và Internet Explorer đến sau cùng, cách một khoảng khá xa so với các đổi thủ.

Tiếp theo tổng hợp điểm chuẩn là chạy Sunspider Javascript - một script test phổ biến. Một lần nữa cuộc thử nghiệm cho thấy Chrome 4 vượt mặt Safari 4. Tiếp theo là Firefox, Opera thực hiện kém một cách bất ngờ trong thử nghiệm này. Internet Explorer 8 thực hiện tồi tệ nhất, nó mất một thời gian gấp 8 Chrome. Kết hợp với Celtic Kane, các thực nghiệm chỉ ra rằng động cơ Squirrelfish của Safari và Chrome V8 đạt hiệu suất tối ưu trên JS, còn động cơ của IE 8 thì làm thật tệ điều đó.

Tiổng hợp điểm chuẩn kế tiếp, chúng tôi đã làm thử nghiệm với Peacekeeper. Thử nghiệm của chúng tôi chỉ ra Chrome dẫn đầu, theo sau sát nút là Safari và Firefox. Opera 10 cho kết quả trung bình. Trong khi đó, Internet Explorer là chậm nhất , bằng một phần sáu chỉ số điểm của Chrome. Các kiểm tra nhìn vào một số phương diện, bao gồm hiệu suất JS, hiệu suất CSS, rendering, và nhiều hơn nữa, do đó, nó là một chỉ số chung để đo tốc độ.

Cuối cùng tổng hợp điểm chuẩn, chúng tôi sử dụng dùng How-To-Create UK's CSS. Một trang chuyên test tốc độ nạp với khoảng 2.500 DIVs. Thật không may, trình duyệt WebKit (Safari và Chrome) không được hỗ trợ do cách đo thời gian này, do đó chúng tôi chỉ có thể có được kết quả cho Firefox, IE 8, và Opera. Đối với các trình duyệt này, Opera 10 dẫn trước 3.6a1 Firefox, trong khi Internet Explorer 8 hoạt động kém nhất.

Kết luận được rút ra từ các cuộc thử nghiệm tổng hợp - Chrome là trình duyệt nhanh nhất, Safari bám đuổi phía sau. Opera va Firefox sau một chút và Internet Explorer 8 là trình duyệt chậm nhất. Kết quả thực nghiệm này trên thực tế đôi khi khó nhận biết với những trang Web thông thường. Tuy nhiên, nó có thể trở thành phiền toái trên các trang có nội dung nặng như Facebook.

7. Plug-ins

Một quan niệm sai lầm phổ biến là Firefox là trình duyệt duy nhất có plug-in, tiện ích, phần mở rộng, hoặc nếu không có tên là thành phần tùy chọn. Plug-ins/add-ons/extensions, trên thực tế là một phần quan trọng của trình duyệt hiện đại. Có rất nhiều định dạng khác nhau bao gồm: ActiveX, NPAPI, Java, Google Gears, RSS, và Atom.

Mozilla Firefox được cho là dẫn đầu trong lĩnh vực này với những nhà phát triển plug-in nhiệt tình, luôn tạo ra những plug-in hữu ích nhất. Tuy nhiên Firefox 3.6a1 không hỗ trợ các Java plugins và ActiveX plug-ins cổ điển.

Với các trình duyệt khác, Opera ( không hỗ trợ Gears, ActiveX), Chrome (cũng không hỗ trợ ActiveX), và Safari (không hỗ trợ ActiveX, chỉ hỗ trợ Gears )tất cả đều cung cấp plug-in hỗ trợ, nhưng cộng đồng nhà phát triển vẫn còn khá non trẻ. Internet Explorer 8 cung cấp rất nhiều plug-in - trong thực tế, plug-in là cần thiết để cải thiện các tiêu chuẩn của trình duyệt. Thật không may, IE 8 không hỗ trợ ngôn ngữ mở rộng NPAPI thường được sử dụng cho Mozilla, các plug-in của IE8 thường là cung cấp nhiều tiện ích hơn là tính thẩm mỹ.

Ghi chú: Cuộc thử nghiệm thực hiện trên Laptop Sony Vaio cài Windows Vista 32 bit, RAM 3 Gb, bộ xử lý T8100 Intel Processor (2.1 GHz).

Còn tiếp: Phần cuối sẽ bàn về việc làm thế nào các trình duyệt thế hệ tiếp đáp ứng được các cuộc thử nghiệm và làm thế nào chúng hỗ trợ các tiêu chuẩn web mới nhất, và đi đến kết luận cuối cùng của thử nghiệm này.

Powered By Blogger