Hướng dẫn

Nếu bạn lần đầu ghé thăm blog của mình, bạn có thể vào phần hướng dẫn để biết thêm thông tin và cách sử dụng blog này.

Thứ Ba, 7 tháng 12, 2010

Đố vui kiến thức web mùa thứ nhất

Để kỷ niệm "hậu" 1000 năm Thăng Long cũng như "tiền" Noel, kèm theo chúc mừng năm mới và 14/02 mình xin "sale off" cho các bạn một cuộc thi để cùng đua tài. Đây là một dạng đố vui kèm theo một số thủ thuật về web bên trong như: HTML, CSS, Javascript, Google... giúp các bạn giải trí nhẹ nhàng nhưng không kém phần trí tuệ

Quy tắc cuộc thi
Cuộc thi gồm 20 câu đố, mỗi câu đố được trình bày trong một trang web với lời gợi ý khác nhau, tuy nhiên, một số câu sẽ không có lời gợi ý, tự các bạn phải sử dụng kiến thức của mình để tìm tòi, suy luận.

Kết quả câu đố này sẽ là đường dẫn đến câu tiếp theo

Do thử hàng nên mình chỉ "úp" 7 câu đầu tiên, bạn nào hoàn tất 7 câu (đến được câu thứ 8) thì xem như đã "phá đảo". Người chiến thắng có thể gửi liên kết đến câu thứ 8 để chứng minh, cũng như có quyền "bóc tem" để ghi dấu ấn (lần này là ngoại lệ được phép bóc tem). Nếu bạn vẫn muốn cho những người chơi khác có dịp trải nghiệm, thì bạn có thể gửi liên kết đến e-mail của mình, mình sẽ đăng tải thông tin người chiến thắng nhưng không kèm liên kết đến bước 8.

Khi có người hoàn tất 7 câu mình sẽ tiếp tục "úp"  7 câu kế tiếp và cuộc chơi cứ tiếp tục như trên cho đến câu thứ 20.

Tổng kết lại mình sẽ nêu tên 3 người chiến thắng mỗi vòng ngay tại bài viết này để các bạn tiện theo dõi.

Hãy chỉ tôi cách "bắt lỗi"

"Bắt lỗi" là gì ?


"Bắt lỗi" nghe nôm na cũng có bà con và họ hàng xa với bắt bẻ, tựu chung lại vẫn là tìm cái sai mà tấn công, mà bắt, mà lụm. Trong lập trình "bắt lỗi" (debug) là một việc rất chi là hình tượng: đi bắt sâu, ứng dụng tốt là ứng dụng có ít lỗi, vì vậy công việc bắt sâu để tránh cho nó làm "rầu nồi canh" là việc tối cần thiết của một lập trình viên.

Thứ Sáu, 3 tháng 12, 2010

2 phút liệu có "làm" được CMS không ?

Hì hì, khi đọc tiêu đề gây "sốc" và "ngộ độc" tập thể này, có nhiều bạn sẽ nghĩ mình "siêu phét" hoặc chí ít cũng thuộc loại "phét có bằng cấp". Tất nhiên để tạo 1 CMS ngon lành theo hướng "tự xử" chí ít cũng tốn không ít "xương máu" và thời gian, nhanh thì 2-3 ngày, lâu thì 1 tháng, nếu sử dụng mã nguồn mở thì phải tìm hiểu cấu hình rắc rối, nếu sử dụng software phát sinh mã thì "chắc là có thể".

Quên mất chưa giới thiệu, CMS này là một dạng quản trị và cập nhật thông tin đơn giản, có đầy đủ chức năng Thêm, Xóa, Sửa, Lọc và cuối cùng là nó chạy trên môi trường Windows và sử dụng công nghệ .NET. Đặc biệt CMS này sử dụng LINQ đấy, rất thú vị và tiện phát triển sau này.

Thứ Tư, 1 tháng 12, 2010

Khóa học Javascript - Bài 3: Sử dụng jQuery như thế nào ?

jQuery là một thư viện javascript khá nổi tiếng. Nó nổi tiếng vì sự đơn giản, dễ hiểu, dễ sử dụng. Một "gói mì ăn liền" khá ngon. Tuy nhiên, dù là một dạng "mì ăn liền" nhưng jQuery không hề "đuối", ngược lại nó còn bộc lộ những sức mạnh qua việc thao tác xử lý thẻ, tạo hiệu ứng cho thẻ.

Giới thiệu

Để biết thêm về jQuery ta tham khảo qua 2 website chính thức sau:
http://jquery.com Trang thông tin chi tiết về thư viện jQuery
http://jquery.org Trang thông tin về những sản phẩm do nhóm phát triển jQuery thực hiện.

Thứ Tư, 24 tháng 11, 2010

Thông báo về việc tạm dừng viết bài

Thời gian vừa qua, mình có một số công việc đột xuất nên quỹ thời gian dành cho viết bài không nhiều. Có những bài mình đã soạn sẵn nhưng chưa chỉnh sửa lại để đăng lên do bận quá. Mình cũng gửi lời xin lỗi vì sự trễ hẹn của khóa học Javascript. Lý ra mình đã gửi thông báo này sớm hơn, nhưng do không ước lượng được thời gian và nghĩ rằng sẽ giải quyết công việc cá nhân sớm thôi. Hiện tại mình cố gắng giải quyết công việc cá nhân nhanh nhất và viết bài trở lại vào ngày 28/11.

Cảm ơn các bạn đã quan tâm, động viên và ủng hộ blog LINQ to Javascript trong thời gian qua.

Thứ Bảy, 6 tháng 11, 2010

Làm sao để tạo một website đa ngôn ngữ

Website đa ngôn ngữ là gì.
Trong thế giới internet ngày nay, mọi thông tin được truyền tải và diễn đạt dưới nhiều hình thức, trong đó, nội dung văn bản luôn được chú trọng. Yêu cầu truyền đạt thông tin trên diện rộng thì nội dung thông tin phải phù hợp với nhiều thành phần người sử dụng khác nhau, yếu tố ngôn ngữ, thân thiện với người sử dụng luôn được đặt lên hàng đầu. Chúng ta không thể làm cho người sử dụng cảm thấy thoải mái nếu họ không hiểu những gì họ đang làm, họ không biết họ phải làm gì, rào cản ngôn ngữ là một vấn đề nan giải. Vì vậy những website đa ngôn ngữ ra đời nhằm bản địa hóa nội dung, xử lý cho phù hợp với phần lớn người sử dụng ở bất kỳ vùng miền nào trên thế giới. Nói như vậy không có nghĩa là website đa ngôn ngữ phải bao gồm tất cả ngôn ngữ hiện có, mà nó chỉ đảm nhiệm việc bản địa hóa "một số" ngôn ngữ phong tục mà người chủ website hướng đến. Hiểu theo cách đơn giản thì website đa ngôn ngữ là website có thể hiển thị nội dung trên nhiều ngôn ngữ khác nhau (ít nhất là 2). Do nhu cầu phổ cập "Tiếng Việt cho người Anh" hay "đem chuông đi đánh xứ người" nên đa phần những website hiện nay thường có cặp bài trùng Tiếng Việt, Tiếng Anh, nên gọi tắt thì website đa ngôn ngữ là website Anh-Việt cũng không sai.

Thứ Sáu, 5 tháng 11, 2010

5 lý do tại sao bạn nên học Javascript

Trước khi trình bày những lý do cốt yếu để có thể "rủ rê" bạn học / nghiên cứu về Javascript, mình xin giới thiệu sơ qua về "lai lịch" của "anh chàng" này. Nguyên tổ tiên của anh ta là ECMAScript được mô tả và phát triển bởi Netscape, lạ chưa, té ra anh ta không có họ chi với Java hay sao ? Không phải anh ta họ Java tên là Script hay sao ? Xin thưa với các bạn rằng, Javascript và Java là một mối quan hệ "phức tạp", đại loại như "cùng cha khác ông nội" vậy, hoặc nói trắng ra là chả có dính chút sơ mướp hay sơ mít gì với nhau cả. Javascript ra đời nhằm mục đích hỗ trợ, trang bị một công cụ xử lý mạnh mẽ cho trang web. Thế không biết Javascript thì có chết không ? Tất nhiên là không, nhưng bạn cũng sẽ "tức mà chết" vì ngay bây giờ không tự trang bị cho mình kiến thức vững vàng về nó.

Những lý do sau cũng sẽ phần nào thuyết phục bạn nên đầu tư thời gian để nghiên cứu Javascript

Thứ Tư, 3 tháng 11, 2010

Khóa học Javascript - Bài 2: Giới thiệu về Prototype

Prototype
Trang chủ http://www.prototypejs.org/


Là một Javascript framework mạnh mẽ, lâu đời. Điểm mạnh của Prototype là tập thư viện hướng đối tượng dùng để xử lý dữ liệu rất phong phú. Đi kèm theo đó có một add-on nổi tiếng là http://script.aculo.us/ trang bị cho Prototype khả năng tạo hiệu ứng phong phú.

Thứ Ba, 2 tháng 11, 2010

Cắt chuỗi theo độ dài chỉ định

Nhiều lúc "cuộc đời ngang trái" ép ta phải cắt một chuỗi theo chiều dài nhất định, không theo cách thông thường là cắt một chuỗi theo nội dung phân cách. Việc cắt chuỗi theo nội dung phân cách trong Javascript thật đơn giản, ta có thể làm như sau
var inputString = "Hôm nay là một ngày đẹp trời, nên lấy Javascript ra ôn, ặc..ặc, thiệt là bó tay";
var parts = inputString.split(","); // cắt chuỗi tại những chỗ xuất hiện dấu phẩy
alert("Số phần đã cắt: " + parts.length);
alert("Phần 1: " + parts[0]);
alert("Phần 2: " + parts[1]);
alert("Phần 3: " + parts[2]);
alert("Phần 4: " + parts[3]);
Dòng 2 thực hiện việc cắt chuỗi, chỉ với hàm split có tham số là nội dung phân cách, ta đã xử đẹp "tứ mã phân thây" chuỗi trên dễ dàng.

Thứ Hai, 1 tháng 11, 2010

Khóa học Javascript - Bài 1: Giới thiệu về những thư viện / framework Javascript

Phần mã của một website luôn gồm 2 phần: thư viện "tự phát" (triển) và thư viện sử dụng / kế thừa lại từ những thư viện có sẵn trên Internet. Dạng thư viện có sẵn này do một số "mạnh thường quân" phát triển nhằm cung cấp cho người sử dụng Javascript sự đơn giản, tiện lợi. Có thể kể đến những thư viện sau:

Chủ Nhật, 31 tháng 10, 2010

Thông báo nội dung học của lớp Javascript

Theo thông tấn xã bắp cải đưa tin, vào lúc 0 giờ ngày hôm nay, tổng số lượng người tham gia lớp học là 18 người, trong đó có 17 nam và 1 nghi vấn là nữ. Danh sách đầy đủ xin xem tại đây.

Những nội dung học được quan tâm
  1. Ajax (89%)
  2. Chưa biết nhiều về những hiệu ứng, trang trí website bằng Javascript (89%)
  3. Phát triển những extension, plugin cho những thư viện, framework (89%)
  4. Chưa biết cách sử dụng những thư viện, framework Javascript (Jquery, Prototype, Mootool...) (83%)
  5. Tự phát triển thư viện riêng cho mình (78%)
  6. Tương tác giữa Javascript và các thẻ HTML (61%)
  7. Sử dụng biến và hàm (56%)
  8. Những cú pháp và cách sử dụng những đối tượng cơ bản (56%)
  9. Kiểm tra thông tin form (56%)

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

Position và Z-Index trong CSS

Trong HTML, mặc định các thẻ được phân tích và hiển thị từ trái qua phải, từ trên xuống dưới. CSS được trang bị những thuộc tính left, top, right, bottom để chỉ định vị trí tương đối của thẻ, nhưng khi ở chế độ mặc định, việc chỉ định left, top, right, bottom không có tác dụng
<div style="background: red; left: 10px; top: 20px; width: 100px; height: 100px;"></div>


Đoạn mã này không dịch chuyển thẻ DIV lại vị trí 10px theo chiều ngang và 20px theo chiều dọc, nguyên do là vì thẻ DIV mặc định có position là static. Position đóng vai trò quan trọng trong việc dàn trang, chỉ định vị trí hiển thị thẻ như mong muốn, thuộc tính position có những loại giá trị sau:

Thứ Năm, 28 tháng 10, 2010

Ứng dụng dò lỗi tập tin MySQL

Những người từng sử dụng MySQL đã quen với việc xuất / nhập (Export / Import) dạng mã SQL để chuyển giao hay xử lý. Tất nhiên việc để nguyên mã SQL được xuất từ một ứng dụng sinh mã SQL thì không có gì để bàn cãi, vì cú pháp của ứng dụng đó sinh ra phải chính xác. Nhưng giả sử chúng ta cần thay thế một đoạn nhỏ nào đó trong mớ SQL này thì sao. Việc thay thế đó đôi khi phát sinh những lỗi cú pháp không mong muốn. Những lỗi này thường là:
  • Xóa nhầm phần đóng của chú thích (comment)
  • Xóa nhầm dấu kết thúc chuỗi (chuỗi đơn hoặc chuỗi kép)
  • Thêm dư hoặc chưa escape ký tự nháy đơn hoặc nháy kép trong nội dung chuỗi
  • Escape sai ký tự quy định do thừa dấu \ trong chuỗi (MySQL có những ký tự sau có thể đi kèm với dấu \ là: 0, ', ", \, b, n, r, t, Z, %, _)

Thứ Tư, 27 tháng 10, 2010

JSON, đơn giản là JSON

JSON hay còn gọi là JavaScript Object Notation, là một chuẩn dùng để truyền tải dữ liệu. Vậy hóa ra JSON chả làm được gì rồi, đúng vậy, thực tế thì anh JSON này chả có chút "võ công" gì cả, thế mà "giang hồ" lại đồn đại là anh này "mạnh lắm", làm được "nhiều thứ" lắm thì không chính xác "lắm". JSON là một dạng văn bản thuần, mô tả về một loại thông tin nào đó mà "con người" có thể đọc được(human-readability, còn con khác thì không đọc được nhá).

Danh sách những đồng chí đã đăng ký lớp học Javascript (Cập nhật thường xuyên)

Trước hết mình xin cảm ơn sự quan tâm đến lớp học này của mình, đây cũng là lần đầu tiên mình viết blog và gõ đầu trẻ bất đắc dĩ, nên có thể thiếu sót trong quá trình chuẩn bị cũng như phổ biến thông tin, mong các anh em, bà con, đồng chí "chém" nhẹ tay để mình được nhờ.

Sau đây là danh sách những học sinh bị "lừa"(trúng thầy dỏm) đăng ký, danh sách sẽ được cập nhật từng ngày.
Một số nick có tên không dấu, mình xin phép không biên tập lại, lỡ hiểu nhầm thì nguy.
  1. Tuy
  2. Nam
  3. Do Van Manh
  4. Minh Sơn
  5. Ý Nhi
  6. thinhit
  7. tuyencode
  8. 7chulinhchi 
  9. dungnguyen
  10. siêu
  11. Ali333
  12. htd
  13. vienleuy
  14. potatokudo
  15. Secuirty
  16. pbn
  17. cuibap
  18. pino_o1
  19. kbt09
  20. Biết Chết Liền
  21. gatesun

Nếu bạn nào đã đăng ký mà chưa có tên vui lòng liên hệ linqtojs@gmail.com hoặc góp ý ngay dưới bài viết này

Nếu bạn chưa đăng ký thì vui lòng đăng ký tại http://linq2js.blogspot.com/2010/10/lop-day-javascript-truc-tuyen.html

Tìm trẻ lạc
Hiện tại e-mail của bạn namprojs...... không gửi được, vui lòng phản hồi e-mail của bạn tại linqtojs@gmail.com

Là một web designer tôi cần biết những gì ?

Ngày đó, khi còn đi học ngành CNTT, mình và một số bạn chỉ biết đến 2 chuyên ngành chính là Công nghệ Phầm Mềm và Công nghệ Mạng (chứ không phải Phần Cứng đâu nha). Khi đó những bạn học Phần Mềm do tiếp xúc với nhiều phần mềm (hì hì, tất nhiên rồi), nên có kinh nghiệm hơn bên mạng, khi ra trường đi làm thì sẽ theo những hướng sau: làm lập trình ứng dụng, làm lập trình web (số tiết học hơi bị "thiếu thốn"), làm thiết kế web (có biết chi đâu mà, nhưng cũng làm đại) và đôi khi "lấn sân" sang quản trị mạng ... Thế đó, nhắc lại mới thấy, có những nghề mà ngày đó chúng mình không có những nơi đào tạo, không bài bản, khi đi làm chỉ biết nhắm mắt mà "lụi" thôi. Ngày nay, các cơ sở, các trường chuyên về thiết kế mọc lên khá nhiều, âu cũng là một sự thuận lợi cho các bạn trẻ. Thôi không dông dài nữa, mình đi thẳng vào vấn đề chính đây.

Thứ Ba, 26 tháng 10, 2010

Tạo plugin cho jQuery dùng để kiểm tra sự hợp lệ của form (Phần 3)

Trở lại nhiệm vụ lần trước, chúng ta đã tìm hiểu qua những khái niệm: gọi liên hoàn / không liên hoàn, cấu hình dành cho plugin... Hôm nay công việc sẽ khó "nhai" hơn, nào bắt đầu thôi.

Giới thiệu những thẻ tương tác dữ liệu
Trước khi bắt tay vào việc "code kiếc" chúng ta cần biết những phần tử (element) nào cần / được kiểm tra. Hiện tại HTML có những phần tử sau chứa giá trị khả dĩ có thể chuyển dữ liệu về máy chủ hoặc có thể tương tác với người sử dụng:
Trong những thẻ trên, thẻ input có thuộc tính value dùng để nhận / gán giá trị, riêng thẻ hình ảnh input type="image" thì sử dụng thuộc tính src.

Tạo plugin cho jQuery dùng để kiểm tra sự hợp lệ của form (Phần 2)

phần 1, chúng ta đã biết cấu trúc để viết một plugin cho jQuery, phần 2 này mình sẽ trình bày về cách xử lý dựa trên đối tượng jQuery.

Những cách sử dụng liên hoàn và không liên hoàn trong jQuery

Có thể gọi đây là một chuỗi những lệnh gọi phương thức xử lý của jQuery:
jQuery('#myheader').addClass('.hilite');
jQuery('#myheader').text('Hello world !!!');
Ở trên là từng câu lệnh riêng lẽ, ta có thể rút gọn:
jQuery('#myheader').addClass('.hilite').text('Hello world !!!');
2 khai báo trên đều có kết quả như nhau, nhưng lợi điểm thì khác nhau. Khai báo đầu tách riêng từng câu lệnh, điều này khiến cho jQuery phải truy vấn tìm ra tập thẻ thỏa điều kiện 2 lần ứng với mỗi lần gọi. Nhưng ở khai báo sau thì jQuery chỉ cần một lần truy vấn để tìm thẻ và thông tin những thẻ đó được bảo lưu cho những lần gọi tiếp theo sau. Để có thể gọi một chuỗi liên hoàn như khai báo hai, điều cần thiết là ta phải nắm rõ kết quả trả về của một phương thức jQuery, nếu phương thức trả về đối tượng jQuery thì có nghĩa ta có thể gọi liên hoàn, ngược lại thì không:
jQuery('#myheader').attr('href');
jQuery('#myheader').attr('href', 'http://google.com');
Với lệnh dòng 2, phương thức attr với tham số 'href' sẽ trả về giá trị thuộc tính href của thẻ #myheader, như vây ta không thể tiếp tục gọi liên hoàn theo sau câu lệnh này được. Đến dòng 3, phương thức attr có tham số 'href''http://google.com' sẽ thực hiện việc gán giá trị của thuộc tính href của thẻ #myheader, phương thức này trả về đối tượng jQuery, ta có thể gọi liên hoàn. Như bạn thấy đó, cùng một phương thức attr, ở mỗi cách gọi (ngữ cảnh) khác nhau, thì kết quả trả về sẽ khác nhau, chúng ta cần tham khảo tài liệu về jQuery để có thể vận dụng chính xác.

Thứ Hai, 25 tháng 10, 2010

Tạo plugin cho jQuery dùng để kiểm tra sự hợp lệ của form (Phần 1)

Lời mở đầu
jQuery là một thư viện Javascript khá nổi tiếng, thư viện này "bảo kê"  tất cả những thao tác xử lý về thẻ một cách linh hoạt và đơn giản. Ai chưa biết về thư viện này thì mất nửa "cuộc đời", mà biết rồi thì cũng mất thêm nửa "cuộc đời" để tìm hiểu nó, nói cho vui vậy thôi chứ jQuery theo mình là rất tuyệt nhưng không hẳn là "vô đối", ngoài jQuery còn có những "đại gia" như mootool, extJS, prototype... khi có thời gian mình sẽ giới thiệu nhiều hơn về chúng.

Làm sao để viết plugin cho jQuery ?
Viết một "cắm vào" (plugin) cho jQuery khó không ? Theo mình thì đơn giản vô cùng, quan trọng là viết xử lý có phức tạp hay không, chứ viết một cái được gọi là plugin của jQuery thì còn dễ hơn ăn bánh mì.

Chủ Nhật, 24 tháng 10, 2010

Tối ưu hóa website (Phần cuối)

Với phần cuối này, mình xin trình bày về cách tối ưu hóa hình ảnh trong website. Hình ảnh là thành phần quan trọng, được sử dụng khá nhiều trong trang, chính vì vậy bạn cần phải cân nhắc khi sử dụng hình ảnh hợp lý. Tối ưu hình ảnh có những công đoạn sau:

Cách sử dụng hình ảnh
Hình ảnh hiển thị thường thông qua 2 cách, sử dụng thẻ img và sử dụng thuộc tính background. Ở đây mình xin khuyến khích các bạn nên sử dụng thuộc tính background khi có thể, vì những lợi điểm sau:

Dễ thay đổi bằng hình ảnh khác khi cần, chỉ cần thay đổi nội dung CSS là có thể chuyển đổi hình ảnh khác, thay vì phải vào mã HTML dò tìm thẻ IMG và thay đổi thuộc tính src

Có thể tạo hiệu ứng thay đổi khi di chuyển mouse vào thẻ, chỉ cần định thêm style dành cho :hover là ta có thể có 2 trang thái hiển thị khác nhau trên cùng một thẻ, điều này muốn thực hiện trên thẻ IMG phải sử dụng Javascript

Thứ Bảy, 23 tháng 10, 2010

Lớp dạy Javascript trực tuyến

Hình thức / thời gian
Mình sẽ đăng những bài viết lý thuyết Javascript liên tục, các bạn sẽ đọc và tham gia thảo luận, gửi bài tập qua mẫu form ở cuối bài. Sau khi nhận bài mình sẽ xem và phản hồi ý kiến, đồng thời đăng tải lên blog. Thời gian học sẽ bắt đầu từ ngày 01/11/2010

Nội dung
Khóa học sẽ dài hoặc ngắn tùy theo chuyên đề của khóa học, hiện tại mình sẽ gửi mẫu đăng ký và tùy theo kết quả đăng ký mình sẽ quyết định chuyên đề, thời gian của khóa học là gì.

Kết quả
Mình không tham vọng sẽ đem đến cho bạn được những kỹ năng như bạn mong muốn, nhưng trên hết, sẽ là sự cố gắng chia sẻ kiến thức của chính mình để giúp các bạn có một số vốn kiến thức nhất định qua mỗi khóa học. Trong quá trình thảo luận, nếu có những điểm bạn nhận thấy mình truyền đạt không chính xác, hãy góp ý xây dựng bằng cách trình bày nguyên nhân, nội dung sai lạc, có liên kết tham khảo càng tốt, nhằm mục đích hoàn thiện nội dung khóa học.

Chơi xếp kim cương 2 thật đã trên web của bạn

Game xếp kim cương 2 nguyên bản của Popcap
Đối với mỗi người chúng ta, dòng game xếp kim cương của hãng Popcap đã không còn xa lạ nữa. Nhớ lại cái thời người người chơi xếp kim cương, nhà nhà chơi xếp kim cương (hì hì, nói hơi quá nhưng thực ra thì các bạn nữ mê trò này lắm). Hôm nay mình xin trình bày cách cài đặt một game xếp kim cương lên website, blog, forum hoặc bất cứ đâu, miễn là nơi đó có hỗ trợ javascript, vì game này được viết bằng javascript mà.

Thứ Năm, 21 tháng 10, 2010

Tối ưu hóa website (Phần 3)

Xem lại Phần 1, Phần 2

Ở 2 bài trước mình đã trình bày về tối ưu hóa CSS và Javascript, hôm nay mình xin trình bày về tối ưu hóa HTML. HTML là một phần mã không thể thiếu của một trang web, ở bất kỳ đâu cũng có HTML, vì vậy nếu ta tối ưu hóa được HTML là đã cải thiện tốc độ web khá nhiều. HTML như các bạn đã biết, là một ngôn ngữ đánh dấu có cấu trúc, nó có những cú pháp tùy tiện hơn Javascript và CSS, dù bạn có viết sai cú pháp thì nó vẫn có khả năng hiển thị, còn hiển thị "cái gì" thì không xác định được. Để tối ưu HTML gồm có những công việc sau:

Tối ưu cấu trúc sử dụng thẻ
Việc sử dụng thẻ một cách hợp lý, "tiết kiệm", nói chung là càng ít thẻ càng tốt. Ít thẻ thì được lợi gì ? Ít thẻ thì mã ít hơn, trong sáng hơn, dễ hiểu hơn, ít thẻ thì trình duyệt biên dịch nhẹ gánh biên dịch hơn, giảm thiểu trường hợp "cạn" bộ nhớ. Vậy tiêu hoang thẻ là như thế nào ? Xem đoạn mã dưới:
<table class="box">
    <tr>
        <td class="box-header"></td>
    </tr>
    <tr>
        <td class="box-body">Nội dung</td>
    </tr>
    <tr>
        <td class="box-footer"></td>
    </tr>
</table>
"Tình hình" là đoạn mã trên có 7 thẻ, nếu sử dụng một cách khác:

Điều kỳ diệu của đối tượng Date trong Javascript

Lần này mình xin "đổi gió" chút đỉnh. Hôm nay mình xin trình bày về đối tượng Date trong Javascript. Ngày tháng là yếu tố quan trọng, được sử dụng khá nhiều, nên việc tính toán ngày tháng cũng muôn hình vạn trạng.

Khởi tạo một đối tượng Date
var now = new Date();
Với lệnh khởi tạo Date không tham số, hệ thống sẽ trả về ngày hiện tại. Ta cũng có thể khởi tạo đối tượng Date bằng cách chỉ định rõ những tham số theo thứ tự sau: năm, tháng, ngày, giờ, phút, giây:
var vnwomanDay = new Date(2010, 9, 20);
alert(vnwomanDay);
var vnwomanDayAndTime = new Date(2010, 9, 20, 12, 20, 30);
alert(vnwomanDayAndTime);


Có một điểm cần lưu ý, trong Javascript, tháng được tính từ 0 - 11, nghĩa là 0 là tháng 1, 1 là tháng 2 ... Chúng ta phải luôn ghi nhớ điều này để tránh tính toán hoặc hiển thị nhầm.

Tối ưu hóa website (Phần 2)

Xem lại phần 1

Ở phần 1, mình đã trình bày về cách "nén" mã javascript, sang phần này mình sẽ giải quyết tới "anh chàng" CSS.
Vậy CSS có khả năng "nén" được như javascript không ?
Ngoài cách "nén" ra còn có cách nào để tối ưu hóa CSS không ?

Chúng ta sẽ đi vào từng vấn đề trên.
CSS cũng tương tự như javascript, là một dạng văn bản có cấu trúc, mà đã là văn bản thì ta đều có thể "nén" được, tuy nhiên, tỉ lệ nén ở CSS không nhiều, và chỉ có một cách nén duy nhất. Thông thường các trình nén CSS sẽ làm như sau:

Thứ Ba, 19 tháng 10, 2010

Tối ưu hóa website (Phần 1)

Tối ưu hóa là cách làm cho website hoạt động trơn tru hơn, tốt hơn. Nhìn chung mọi người thường hiểu là làm sao cho website của tôi "chạy nhanh". Đôi khi có những định nghĩa tối ưu hóa website tương đương với việc tối ưu hóa đối với bộ máy tìm kiếm (SEO), ở đây mình xin trình bày khía cạnh tối ưu hóa nội dung, tài nguyên website.

Những kiến thức này dựa trên việc tham khảo tài liệu của 2 chương trình Page Speed (anh Goo) và YSlow (anh Yah), mình đã giản lược đồng thời mô tả chi tiết hơn một số khái niệm để các bạn có thể nắm được.

Tối ưu hóa tài nguyên website
Tài nguyên website được kể ở đây chính là: hình ảnh, tập tin javascript, tập tin css, tập tin html. Thông thường ta sử dụng những tài nguyên này và không nghĩ rằng có thể làm gì với nó để cho nó phục vụ website tốt hơn. Việc tối ưu hóa chúng nhằm mục đích cải thiện thời gian tải về của trang web (là làm nhanh lên đó), việc cải thiện này cũng sẽ làm giảm tải phía máy chủ nhưng đôi lúc cũng bắt máy chủ làm việc nhiều hơn.

Thứ Hai, 18 tháng 10, 2010

Những định dạng hình ảnh thường được sử dụng cho trang web

Hình ảnh là thành phần không thể thiếu của một trang web. Hình ảnh dùng để trang trí, nhấn mạnh nội dung, truyền tải thông điệp. Một trang web được xem là đẹp thì không thể thiếu hình ảnh.

Với vai trò khá quan trọng như thế, ta cần phải nắm rõ về những định dạng ảnh thường được sử dụng, từ đó vận dụng tốt hơn trong việc hiển thị trang.

Hiện nay được sử dụng nhiều nhất là 3 định dạng ảnh: GIF, JPG (JPEG), PNG. Mỗi định dạng này có những ưu khuyết điểm riêng, phục vụ tốt cho một mục đích hiển thị đặc thù. Mình sẽ trình bày sơ lược về "tiểu sử" cũng như cách sử dụng chúng, những chi tiết liên quan thì mình sẽ dẫn link tham khảo.

Khắc phục lỗi chiều cao thẻ nhỏ hơn chiều cao của font mặc định của IE6

Khi tạo box ta thường sử dụng 4 thẻ DIV với cấu trúc như sau
<div class="box">
    <div class="box-top"></div>
    <div class="box-middle">Nội dung</div>
    <div class="box-bottom"></div>
</div>
Ta sử dụng một hình ảnh làm nền:


Các phần box-top, box-middle, box-bottom chứa những phần hình ảnh tương ứng: cạnh trên của hộp, phần giữa hộp, cạnh dưới hộp. Do phần cạnh trên và cạnh dưới có chiều cao nhỏ 10px, ta đặt style như sau:
.box-top {height: 10px; background: ...}
.box-bottom {height: 10px; background: ...}
Hiển thị ở những trình duyệt khác thì hoàn toàn chính xác:


Riêng IE6 bắt đầu "khó chịu":


Lần này ta được "ban tặng" cho 2 khoảng trống rất chi là vô duyên. Vậy khoảng trống này từ đâu ra ? Xin thưa rằng, trong IE6 nếu một thẻ có chiều cao X, và chiều cao của font là Y thì IE6 sẽ chọn chiều cao lớn nhất giữa 2 giá trị này làm chiều cao hiển thị của thẻ, điều này làm phát sinh những khoảng trống ngoài dự liệu.

Chủ Nhật, 17 tháng 10, 2010

Linq2Js: Thực thi chậm trong Linq2Js

Đặc tính thực thi chậm trong Linq2Js giúp cho hệ thống tiết kiệm bộ nhớ khi ta chưa sử dụng kết quả, lấy ví dụ:
// Bước 1: Khởi tạo mảng
var numbers = [1, 2, 3, 4];
// Bước 2: Sắp xếp theo thứ tự giảm
var sortedNumbers = linq(numbers).desc();
// Bước 3: Thêm một phần tử mới vào mảng gốc
numbers.push(5);
// Bước 4: Xuất ra kết quả
sortedNumbers.alert();


Ở tại bước 2, nếu ngay lúc đó biểu thức linq thực thi và sắp xếp lại thứ mảng giảm dần là không cần thiết, vì ta chưa sử dụng đến kết quả sắp xếp đó, đến bước 3 ta thêm một phần tử vào mảng numbers thì linq vẫn chưa làm công việc của mình, chỉ khi ta gọi những hàm kết xuất như alert, array.. thì toàn bộ biểu thức mới được thực thi.

Theo như mình tham khảo một số thư viện khác, ngay tại bước 2 thì linq của họ đã thực thi và chuyển hóa thành một mảng số mới đã được sắp xếp, những thao tác sau đó với linq đều không có tác dụng.

Khắc phụ lỗi "rớt hàng", khi sử dụng những thẻ có thuộc tính float và clear

Giới thiệu
Ta có đoạn mã html sau
<style type="text/css">
    .page {width: 800px; margin: 0px auto; background: white; border: 1px solid silver;}
    .left-column {float: left; width: 200px; background: #eee;}
    .right-column {float: right; width: 200px; background: #eee;}
    .center-column {margin-left: 210px; margin-right: 210px; background: #eee;}
    .entry {background: #ddd; margin-top: 10px;}
    .entry .title {display: block;}
    .entry .image {float: left; width: 100px; height: 100px; border: 1px solid silver;}
</style>
<div class="page">
    <div class="left-column">
        Nội dung cột trái
    </div>
    <div class="right-column">
        Nội dung cột phải
    </div>
    <div class="center-column">
        Nội dung cột giữa
        <div class="entry">
            <a class="title">Tiêu đề</a>
            <a class="image"><span>Hình ảnh</span></a>
            <div class="summary">Nội dung sơ lược, nội dung sơ lược</div>
        </div>
        <div class="entry">
            <a class="title">Tiêu đề</a>
            <a class="image"><span>Hình ảnh</span></a>
            <div class="summary">Nội dung sơ lược, nội dung sơ lược</div>
        </div>
    </div>
</div>


Kết quả hiển thị:


Khắc phục lỗi double margin (bị nhân đôi khoảng cách) của một thẻ sử dụng float trên IE6

Giới thiệu
Khi tạo giao diện bằng thẻ DIV, đa phần chúng ta đều sử dụng float để canh chỉnh các cột, hoặc những box. Lỗi double margin là lỗi tạo nên một khoảng trống có kích thước bằng gấp đôi kích thước ta chỉ định, lấy ví dụ:

<style>
    body {margin: 0px; padding: 0px;}
    .wrapper1 {border: 5px solid red; float: left; width: 200px; margin: 20px;}
    .wrapper2 {border: 5px solid blue; float: right; width: 200px; margin: 20px;}
</style>
<div class="wrapper1">Nội dung bên trong</div>
<div class="wrapper2">Nội dung bên trong</div>

Trong trang html trên, ta có 2 class wrapper1 và wrapper2, đều sử dụng thuộc tính float là left và right, có margin là 20px. Khi hiển thị trên firefox:


Như bạn thấy, ở firefox hoặc những trình duyệt trừ IE6, kích thước vùng trống margin đúng bằng 20px. Nhưng khi ta duyệt bằng IE6:


Thì bỗng dưng IE6 "hào phóng" "khuyến mãi" cho ta thêm 20px nữa, đúng là "mua 1 tặng 1", lỗi này gây khó chịu cho người thiết kế giao diện html rất nhiều, vì mọi thành phần trong trang sẽ bị xáo trộn khi kích thước bị tăng lên đột ngột, ở đây chỉ là 20px thành 40px, nhưng nếu ta margin khoảng 100px thì sẽ được là 200px, một con số khủng khiếp đủ để làm biến dạng bộ mặt website.

Linq2Js: Một số phương thức thông dụng

var numbers = linq([10, 9, 8, 7, 6]);
numbers.alert('First number: ', 'first');
alert('First number: ' + numbers.first());
numbers.alert('Last number: ', 'last');
alert('Last number: ' + numbers.last());
numbers.alert('Second number: ', 'get', [1]);
alert('Second number: ' + numbers.get(1));
numbers.alert('Count: ', 'count');
numbers.desc().alert('Lowest number: ', 'first');
alert('Lowest number: ' + numbers.desc().first());
numbers.alert('Min: ', 'min');
numbers.concat([1, 2, 3]).alert();

Linq2Js: Sử dụng chuỗi những phương thức truy vấn

Để sử dụng liên tục những phương thức truy vấn ta cần nắm rõ kết quả trả về của một phương thức phải là đối tượng LINQ.
Ví dụ
linq([1, 2, 3, 4, 5]) // hàm linq trả về đối tượng LINQ chứa 1, 2, 3, 4 nên ta có thể gọi phương thức tiếp theo sau
linq([1, 2, 3, 4, 5]).odd() // và ta có thể tiếp tục vì odd() trả về đối tượng LINQ chứa danh sách những số l
linq([1, 2, 3, 4, 5]).odd().array() // nhưng đến đây ta không thể gọi tiếp phương thức của LINQ nữa, vì array() là phương thức trả về một mảng giá trị
// tương tự như vậy
linq([1, 2, 3, 4, 5]).odd().first() // trả về 1 nên chuỗi truy vấn sẽ kết thúc

Linq2Js: Tìm những phần tử có chứa một nội dung chỉ định

Để tìm những phần tử nào đó thỏa điều kiện cho trước ta sử dụng phương thức where.
Tìm những phần tử có chứa ký tự a
var names = ["Tom", "Dick", "Harry"];
// Cách viết thông thường với tham số where là một hàm dùng để kiểm tra
linq(names).where(function() { return this.indexOf('a') != -1; }).alert();
// Cách viết ngắn gọn
linq(names).where('this.indexOf("a") != -1').alert();
// Sử dụng phương thức contains
linq(names).contains('a').alert();

Linq2Js: Tìm tên có độ dài chỉ định

Chúng ta sử dụng đoạn mã sau để tìm những tên có độ dài lớn hơn hoặc bằng 4 ký tự
var names = ["Tom", "Dick", "Harry"];
linq(names).where('this.length >= 4').alert();

Linq2Js: Cú pháp Linq2Js

Khời tạo một đối tượng LINQ
linq([1, 2, 3, 4, 5]);

Hàm linq sẽ nhận những tham số dạng chuỗi, tập hợp, mảng để tạo thành đối tượng LINQ.

Những cú pháp khởi tạo khác
linq(array)
Tạo đối tượng LINQ chứa các phần tử của mảng array

linq(string)
Tạo đối tượng LINQ chứa mảng các ký của chuỗi string

linq(regex, string)
Tạo đối tượng LINQ chứa những kết quả tìm của biểu thực chính quy regex dựa trên chuỗi giá trị string

linq(number)
Tạo đối tượng LINQ chứa dãy số từ 0 đến number

linq(from, to)
Tạo đối tượng LINQ chứa dãy số từ from đến to

Sau khi khởi tạo được đối tượng LINQ ta có thể sử dụng những hàm truy vấn của nó để nhận được những kết quả như mong muốn.

Thứ Bảy, 16 tháng 10, 2010

Linq2Js: Tải và cài đặt Linq2Js

Những tập tin cần thiết
Bạn có thể tải thư viện này tại địa chỉ http://sourceforge.net/projects/linq2js/files/linq2js-20101016.js/download
Cũng như bạn có thể tải kèm cơ sở dữ liệu JSON được phát sinh từ northwind http://sourceforge.net/projects/linq2js/files/northwind.js/download để phục vụ cho việc chạy thử những ví dụ.

Cài đặt
Do tên của thư viện khi tải về có dạng linq2js-(ngày cập nhật), nếu bạn không thích thì có thể đổi tên thành linq2js.js hoặc linq.js cho ngắn gọn
Chèn đoạn mã html sau vào tài liệu của bạn:
<script src="duong_dan_luu_tru_cua_ban/linq2js.js" type="text/javascript"></script>
<script src="duong_dan_luu_tru_cua_ban/northwind.js" type="text/javascript"></script>

Giới hạn
Do thư viện đang trong quá trình phát triển, nên tạm thời mình sẽ nén lại cho ngắn gọn mã javascript, khi nào có điều kiện thuận lợi mình sẽ xuất bản mã nguồn đầy đủ.

Linq2Js: Giới thiệu về Linq2Js

Khơi nguồn cảm hứng và sáng tạo
Ý tưởng lập trình thư viện này bắt nguồn từ việc mình rất thích LINQ của Microsoft, sau đó lả lướt ở một số trang cũng thấy có khá nhiều thư viện dạng này. Máu "made in tự tui" nổi lên và mình đã cố gắng code một cái thư viện cho thật customize theo ý mình. Có thể nhiều bạn xem việc này như việc đẽo lại cái bánh xe, nhưng qua đó mình cũng đã tự nâng kinh nghiệm mình đôi chút, và cũng như mình mong muốn đây là sân chơi thảo luận của những bạn yêu thích LINQ, Javascript như mình.

Trước hết, LINQ là gì ?
LINQ - Language-integrated query là dạng truy vấn tích hợp, giúp cho lập trình viên giảm nhẹ những thao tác về tập hợp, về cơ sở dữ liệu... Còn muốn biến thêm chi tiết thì có thể nhờ anh Goo .

Còn nữa, Javascript là gì ?
Ngày nay, web đã quá phổ thông, có rất nhiều nhiều những trang web khác nhau, muôn hình vạn trạng. Mỗi trang web đều có những hình thái, giao diện riêng, nhưng chung quy lại thì một trang web có 3 thành phần chính: html, css, javascript. Vậy anh javascript nhà ta là một thành phần thiết yếu, chuyên đảm nhận những trách nhiệm to lớn như: tạo hiệu ứng, xử lý nội dung, kiểm tra hoặc chuyển giao nội dung trang web...

Và theo cách hiểu đơn giản của mình LINQ 2 JS là một thư viện được tích hợp dựa trên nền tảng javascript, phục vụ cho việc truy vấn dữ liệu một cách hiệu quả hơn, ngoài ra có thể bạn sẽ cảm thấy những tên như: linq in javascript, linq for javascript ... phù hợp hơn.
Related Posts Plugin for WordPress, Blogger...

Hãy nói không với 4T

Hướng dẫn sử dụng chức năng góp ý
Bạn có thể sử dụng những thẻ <b>, <i>, <a>. Để chú thích đoạn mã bạn có thể sử dụng thẻ [code=type]  [/code], với type là những loại mã sau js, css, html. Chú ý: Khi sử dụng thẻ [code=html] bạn cần theo thế những ký tự < , > thành [] hoặc bạn có thể sử dụng bộ chuyển đổi. Những loại mã khác thì bạn thay thế < , > thành &lt;&gt; hoặc bạn cũng có thể sử dụng bộ chuyển đổi