Một vài điều thú vị về các giá trị NaN (Not a Number), null và undefined trong javascript:
Không thể dùng (aVariable == NaN) để kiểm tra aVariable có phải là NaN hay không, thay vào đó hãy dùng isNaN(aVariable);
Vừa mới làm một việc ngốc nghếch. Sau khi hoàn thành cái javascript/css tool SideNotes, đầy tự tin vào "hiểu biết" của mình về js/css nên có một thằng ngốc lại tiếp tục lao đầu tìm kiếm ý tưởng cho project khác. Sau một hồi suy nghĩ lung tung, một ý tưởng "độc đáo" nảy ra: "viết một class javascript tool cho phép điều khiển sự kiện DoubleClick". Nguồn gốc của cái ý tưởng này là một đoạn ActionScript mà mình làm hồi trước có cùng tác dụng nhưng là trong Flash. Kết quả là sau một lúc thử tới thử lui, đoạn script sau ra đời:
Để test nó, mình bắt đầu nghĩ tới việc tạo một cửa sổ window trong trang web bằng javascript+css, lại mất thêm một hồi thử tới thử lui, viết viết xóa xóa. Thế rồi, trong lúc loay hoay với việc xử lí DOM bằng js, không biết phải làm thế nào để xóa một element, đành phải đem cái javascript tutor mới download về nhưng để đấy chưa thèm đọc ra xem (trước giờ mình học javascript chủ yếu bằng cách đọc source code của người khác, chưa đọc quyển sách nào vì cũng chỉ mới học cho biết). Trời xui đất khiến thế nào, đùng một cái phát hiện nãy giờ mình làm một việc vô ích. DoubleClick được hỗ trợ sẵn, thay vì dùng onclick thì chỉ cần dùng ondblclick cho sự kiện double click là xong. Không cần một dòng code nào cả, không cần một ý tưởng tuyệt vời nào cả.
Ôi ngốc!
P3 933MHz, 128Mb Ram, không internet, bạn có thể làm gì với cái máy vi tính đó? Khốn khổ thay, nó lại chính là cái máy của mình ở nhà. Không còn ADSL, nếu muốn chạy Java 1.5 thì cần phải có một cốc cafe để mà nhâm nhi lúc ngồi chờ, Flash và Dreamweaver 8 là cả một gánh nặng, gần như mình không còn việc gì khác để làm với cái máy này ngoài nghe nhạc. May thay, vẫn còn Firefox và một công cụ tuyệt vời của M$ là Notepad :D, chừng đó cũng là tạm đủ cho javascript và css, cho cái SideNotes này ra đời.
Click here to view demo.
Click here to download code.
Để sử dụng nó, bạn chỉ cần thêm đoạn mã sau vào trong phần đầu trang web của bạn:
Chú ý là SideNotes có sử dụng Prototype javascript framework và Script.aculo.us javascript (cả 2 đã có sẵn khi bạn download code ở trên). Sau đó, nếu cần thêm ghi chú cho một đoạn text nào đó, bạn chỉ cần bao đoạn text đó trong cặp thẻ <span class="noteLink" id="note1"></span> với id có thể thay đổi tùy bạn nhưng class bắt buộc phải là noteLink, phần ghi chú bạn hãy đặt vào trong cặp thẻ <div class="sidenote" id="_note1"></div> với id chính là _(dấu gạch dưới) cộng với id của cặp thẻ span trên. Vậy là xong, phần việc còn lại là của SideNotes javascript.
Mặc định thì các ghi chú (sidenote) của bạn sẽ không hiện ra lúc trang web được load mà chỉ hiện ra lúc người đọc click vào phần liên kết tới sidenote (phần chữ nằm trong cặp thẻ span - từ giờ gọi là noteLink). Bạn có thể hiển thị toàn bộ các sidenote lúc trang web được load bằng cách thêm lệnh SideNotes.showAllSidenotes() vào sự kiện onload của trang web
Bạn cũng có thể định sẵn vị trí để các sidenote hiển thị, ví dụ bạn muốn các sidenote chỉ hiển thị tại vị trí nào đó, chỉ cần thêm cặp thẻ <div id="notesContainer"></div> tại vị trí mong muốn, sửa id của các cặp thẻ span chứa noteLink thành "note1_notesContainer". Xem ví dụ Sidenote Demo2.
Nếu bạn không xác định vị trí hiển thị cho các sidenote thi mặc định nó sẽ hiển thị như trong demo1, cùng cấp, nằm trước element chứa noteLink và sẽ có 2 kiểu hiển thị, trái phải lần lượt. Bạn có thể thay đổi file css để sửa kiểu hiển thị của sidenote theo ý thích, thêm số style định sẵn, vv... Cấu trúc của sidenote lúc hiển thị sẽ như sau:
Một cách hiển thị khác của các sidenote, chỉ cần thay đổi css.
Thay đổi hoàn toàn theme cũ, vốn là để mặc định của blog nhưng nhìn có vẻ hơi nhạt và tăm tối, lại hạn chế không gian của bài viết. Theme hiện tại mình thấy nhiều màu sắc hơn, đẹp hơn nhưng vẫn rõ ràng và cũng thoải mái hơn cho việc trình bày. Hi vọng mọi người cũng thấy nó đẹp.
Theme này có thể tải về từ đây. Vẫn chưa đủ trình độ + thời gian để thiết kế một giao diện riêng cho bản thân, đành lấy của người khác rồi thay đổi cho phù hợp vậy.
Mọi class trong Java đều kế thừa class Object, vì thế nó kế thừa luôn method equals của class Object. Khốn khổ thay, method equals mặc định của class Object chỉ đơn giản là toán tử ==, nó chỉ đơn thuần so sánh liệu 2 object đó có cùng tham chiếu tới một đối tượng không mà thôi chứ không phái là so sánh giá trị của 2 object đó.
Ví dụ bây giờ mình có một class mô tả một điểm trong mặt phẳng như sau
Đoạn code sau sẽ luôn trả về false
Bởi vì p1 và p2 tham chiếu tới 2 đối tượng khác nhau trong bộ nhớ nên kết quả của p1.equals(p2) luôn luôn là false cho dù ta thấy chúng có cùng miêu tả điểm (1,1). Đó không phải là điều mà chúng ta mong muốn, phương thức equals phải trả về true trong trường hợp này. Muốn thế, ta phải override phương thức equals, bắt nó tuân theo ý muốn của ta. Bạn có thể thấy là viết phương thức equals thực hiện đúng yêu cầu này thật đơn giản, hai điểm giống nhau khi có cùng tọa độ x và tọa độ y.
Tuy nhiên, cuộc đời không phải lúc nào cũng đơn giản như vậy :D. Thử tưởng tượng một ngày xấu trời nào đó p2 không phái là tham chiếu tới đối tượng thuộc lớp Point hay p2 là null thì sẽ ra sao nhỉ? Tất nhiên rồi, error chứ sao, Java sẽ ném cho bạn một đống exception ngay. Java Language Specification đòi hỏi phương thức equals mà bạn viết phải thõa mãn những yêu cầu sau:
- Nếu p không phải là tham chiếu null thì
p.equals(p)
phải trả về true. - Có tính đối xứng: với p1, p2 bất kỳ không phải null,
p1.equals(p2)
trả về true khi và chỉ khip2.equals(p1)
trả về true. - Có tính bắc cầu: với p1, p2, p3 bất kỳ không phải null,nếu
p1.equals(p2)
vàp2.equals(p3)
đều trả về true thìp1.equals(p3)
bắt buộc cũng phải trả về true. - Cố định, không thay đổi: nếu đối tượng mà p1, p2 tham chiếu tới không bị thay đổi thì việc gọi lặp lại lệnh
p1.equals(p2)
trả về cùng một giá trị. - Với p bất kỳ khác null,
p.equals(null)
phải trả về false
Lúc này thì phương thức equals có lẽ sẽ được bạn sửa lại thành:
Chú ý là ở đây bạn không cần phải check xem other có phải là null không bởi vì nếu other là null thì biểu thức
other instanceof Point
sẽ trả về false luôn cho bạn rồi. Phương thức equals trong class Integer của Java và nhiều class khác cũng được viết tương tự vậy:
Nhưng, một lần nữa, cuộc đời là không đơn giản chút nào và Java cũng vậy :D
Giả sử bây giờ bạn có một lớp mới là ColorPoint kế thừa lớp Point và bạn cũng tạo cho nó một constructor và một phương thức equals
Bây giờ bạn nghĩ đoạn code sau sẽ cho ra kết quả như thế nào
Theo yêu cầu về tính đối xứng,
p.equals(cp)
và cp.equals(p)
phải trả về cùng một giá trị. Tuy nhiên, ở đây, p.equals(cp)
sẽ trả về true còn cp.equals(p)
sẽ trả về false. Nguyên nhân là nằm ở toán tử instanceof, ColorPoint là class con của class Point nên cp instanceof Point
là true còn p instanceof ColorPoint
là false. Phương thức equals của chúng ta đã không đạt yêu cầu đề ra. Tới đây, bạn có thể thắc mắc là vậy phương thức equals trong class Integer của Java cũng không đạt hay sao, chả lẽ Sun kém vậy hay sao :D? Không phải như vậy. Có một sự khác nhau rất lớn giữa class Point của chúng ta và class Integer, class Integer là final, không thể tạo một class khác extends class Integer được nên lỗi trên sẽ không bao giờ xảy ra và phương thức equals luôn luôn hoạt động tốt.
Cách tốt nhất cho phương thức equals của chúng ta là sử dụng phương thức getClass() thay cho sử dụng instanceof trong việc kiểm tra xem có đúng đối tượng thuộc đúng loại class mà ta định ép kiểu để so sánh hay không.
Và cho class ColorPoint là
Lúc này thì cả
p.equals(cp)
và cp.equals(p)
đều trả về false, một điểm có màu thì khác một điểm không có màu chứ nhỉ?
Vậy là một kì thi ĐH nữa lại bắt đầu. Mới 1 năm trước đây, cũng vào hôm nay, mình cũng chỉ là một trong hơn nửa triệu sĩ tử lao đầu vào cái cuộc thi được xem là quyết định cả cuộc đời này. Năm nay, mình chỉ là một kẻ ngoài cuộc, có thể tự do xem WorldCup mới thấy mình may mắn hơn bao người.
Sáng nay chở Trung đi thi mới thấy, cái kì thi quái quỷ nay làm khổ không biết bao nhiêu người chứ không chỉ mình. Học sinh đi thi mệt, giáo viên coi thi, chấm điểm mệt, phụ huynh cũng mệt,... chắc chỉ có mấy người làm dich vụ, cho thuê trọ là cám ơn nó thôi.
Cái áp lực phải vào ĐH quả là vô cùng lớn, người người muốn vào ĐH, nhà nhà muốn con mình vào ĐH. Việc vào ĐH được rất nhiều người xem như là yếu tố quyết định cuộc đời thành công hay thất bại (môphật, có cả mẹ của mình trong số đó), vì thế dễ hiểu là mọi người sẵn sàng dồn tất cả sức lực của mình để cho con vào ĐH. Các bậc phụ huynh sẵn sàng từ bỏ công việc, đi theo chăm sóc con cái, tất cả chỉ để con mình có thể vào ĐH. Rồi còn học thêm học bớt, luyện thi này nọ, vô số trung tâm luyện thi mọc lên như nấm sau mưa thì không biết có bao nhiêu chỉ là kẻ lừa đảo? Bao nhiêu tiền đã đổ ra cho giấc mộng ĐH?
Nhưng nói là vậy thôi chứ theo ý mình thì dù tốn kém cho XH rất nhiều nhưng không thể bỏ kì thi này được, chừng nào mà kì thi tốt nghiệp THPT vẫn chỉ là một bài tập viết mà thôi. Chỉ có thi ĐH thì mới phản ánh đúng được trình độ của học sinh mà thôi. Là một kẻ trong cuộc, mình có thể hiểu được cái gì gọi là thi tốt nghiệp. Một bài thi đôi khi không phải làm bởi một người mà là bởi cả phòng, phòng nào có học sinh giỏi thì y như rằng cả phòng sẽ làm bài tốt, giám thị nhiều khi chỉ là những con bù nhìn biết đi, để mặc, làm ngơ thậm chí là tiếp tay. "Căn bệnh thành tích" được xem là một nguyên nhân chính của điều đó, tuy nhiên theo mình thì chính "căn bệnh không dám nói" mới là nguyên nhân của sự việc. Việc đó đâu có hại gì cho mình đâu, đó là việc của họ, chuyện đó luc nào mà chả vậy, nói làm gì cho nó thêm phiền phức vào mình,... chính cái tư tưởng đó đã làm nên một nền GD ngày càng "cải lùi" của chúng ta. Chúng ta không dám nói, không muốn nói tới những chuyện đang xảy ra xung quanh ta chỉ trừ phi nó ảnh hưởng tới lợi ích của chúng ta, chúng ta đang quá ích kỷ và hèn nhát. Và cả một thế hệ người Việt trẻ mắc căn bệnh này (trong đó có cả tôi) đã làm cho Việt Nam vẫn chỉ là một đất nước "có nhiều tiềm năng" nhưng chẳng ai biết, chẳng phát huy được cái gì. Than ôi, liệu mình có nhận ra điều đó quá muộn không và liệu mình có thể thay đổi bản thân hay không?
12 năm ngồi trên ghế nhà trường, cái nền GD nhồi nhét này đã để lại cho mình được những gì? Trưa nay cầm cái đề Toán trên tay mà thấy ngạc nhiên sao năm ngoái mình lại có thể làm nó vèo vèo được nhỉ, không biết tối nay đọc cái đề Lý liệu mình có thể hiểu được bao nhiêu đây? Bao nhiêu thế hệ, bao nhiêu người như mình? Học chỉ để mà thi, học cốt chỉ để có kết quả tốt, thi xong là hết, quên sạch, không vấn vương chút gì. Có ai nhớ chút gì về những điều mình đã học năm lớp 10, 11 và trước đó không vậy? GDCD, Lịch sử, Địa lí, Văn học,... có ai nhớ mình đã học cái gì không vậy hả những người bạn của tôi?
Chỉ ngồi chờ thôi mà mình cũng đã mệt mỏi lắm rồi, không biết Trung ra sao nhỉ? Còn khoảng một tiếng nữa là xong môn Lý, vậy là xong 2 môn. Làm bài tốt nha Trung, những người bạn khác của tôi cũng vậy nhé.