Showing posts with label Tutorial. Show all posts
Showing posts with label Tutorial. Show all posts

Hướng dẫn download và bắt đầu chơi pokemon black and white


Bài viết này sẽ hướng dẫn các bạn chơi game pokemon black and white bản tiếng anh trên NO$GBA


Bước 1: download

Pokemon Black: http://www.mediafire.com/?psa2hyee14vddsl
Pokemon White: http://www.mediafire.com/?hlh9tzmh6qaupo3
NO$GBA with Zoomer: http://www.mediafire.com/?hl2h2pofj9e1nwf


Bước 2: cấu hình

Sau khi download, mở NO$Zoomer, nó sẽ bảo bạn chọn đường dẫn tới NO$GBA.
Sau khi chọn file NO$GBA, bạn chọn file game đã extract ra sau khi download (đuôi file .nds)
Load game xong nó sẽ báo lỗi không access đc giống hình sau:


Bình tĩnh. Vào menu others > cheats
Nó mở No$gba cheats ra, đây là chỗ bạn add cheat code.


Chọn add new, nhập code như sau:

POKEMON BLACK

52004EA0 E8BD01F0
02004EA0 EAFFF25C
E2001800 0000005C
E92D4008 E3A00000
E3A0150E E2811A06
E5810B44 EA5FE9F2
E59F4034 E59F5034
E5845000 E59F4020
E5945000 E59F601C
E1550006 03A05001
05C4500A 03A05000
E1445DB4 E8BD01F0
EA000D95 021809E0
28AAFF1F 037FBFE0
EAA01606 00000000
D0000000 00000000

POKEMON WHITE

52004EA0 E8BD01F0
02004EA0 EAFFF25C
E2001800 0000005C
E92D4008 E3A00000
E3A0150E E2811A06
E5810B44 EA5FE9F2
E59F4034 E59F5034
E5845000 E59F4020
E5945000 E59F601C
E1550006 03A05001
05C4500A 03A05000
E1445DB4 E8BD01F0
EA000D95 02180A00
28AAFF1F 037FBFE0
EAA01606 00000000
D0000000 00000000
Xong xuôi thì save lại và nhớ check vào cái code mới tạo.
Restart NO$Zoomer và chơi game thôi.

Emoticon for Blogger version 3

Update the newest link to js file:


https://sites.google.com/site/gman/file/Emoticon.js?20110731

Emoticon for blogger

… is an easy way to show emoticons (smileys) in your blog posts or your comments. You and your readers just need to type the symbol :) and it will automatically change to :) when the post published.
Here is the list I already made:
Emoticon Symbols Emoticon Symbols
:) :) 8-X 8-X
:bz :bz *-:) *-:)
:D :D ~O) ~O)
^#(^ ^#(^ (~~) (~~)
x_x x_x **== **==
:!! :!! ~:> ~:>
\m/ \m/ :(|) :(|)
:-bd :-bd 3:-O 3:-O
:-q :-q :@) :@)
>:) >:) %-( %-(
#:-S #:-S :-?? :-??
:-S :-S :o3 :o3
B-) B-) <):) <):)
~:> ~:> >:P >:P
X( X( :-w :-w
:-O :-O :^o :^o
=(( =(( @-) @-)
:-* :-* #-o #-o
:P :P :-? :-?
:"> :"> (:| (:|
~X( ~X( <:-P <:-P
:)] :)] 8-} 8-}
:-c :-c :O) :O)
=; =; :-& :-&
:-B :-B :-$ :-$
O:-) O:-) [-( [-(
=)) =)) %%- %%-
/:) /:) @};- @};-
:| :| :-< :-<
:)) :)) :-SS :-SS
:(( :(( =D> =D>
:( :( =P~ =P~
:-h :-h (*) (*)
:-t :-t :-j :-j
8-> 8-> ^:)^ ^:)^
I-) I-) :-@ :-@
8-| 8-| ;)) ;))
L-) L-) >:/ >:/
>:D< >:D< \:D/ \:D/
;;) ;;) [-X [-X
[-O< [-O< :)>- :)>-
:-L :-L b-( b-(
>-) >-) :-" :-"
=:) =:) $-) $-)
(%) (%) o=> o=>
o-+ o-+ o-> o->
:x :x ;) ;)
:-/ :-/

In this update

You can separate the “emoticon region” into any ID or class. For example:
#comment-block or .entry-content
It’s way convenient for everyone :D
For those who installed the older versions of this hack, you don’t need to do anything for uninstalling. But of course, you can clean your template by remove the link to emoticon.js and onload=”replaceText()”, it is totally optional.

Steps:

Update: I've changed the link to js file, due to the migration of Google Pages (to Google Sites).

You can see more details how to install this hack here

(My) ToDo

  1. When you type “)” followed by “&” or “>” or “<” it will be changed to ;).
  2. And I haven’t made a way to escape emoticons :D
If you know a way to do this, please tell me how :">, thank you.

Self-dual propositions

Problems

"When does s* = s, where s is a compound proposition"

The dual of a compound proposition that contains only the logical operators AND, OR, and NOT is the compound proposition obtained by replacing each AND by OR, each OR by AND, each T by F, and each F by T. The dual of s is denoted by s*

Solution

Let s = P(a1, a2, a3,…, an) where ai is a single proposition, and P is the relationship among ai.

So s* = (¬P)(a1, a2, a3,…, an) where (¬P) is the inverse relationship of P

s* = ¬(¬(¬P)(a1, a2, a3,…, an) ) double negating

s* = ¬( P(¬a1,¬ a2,¬ a3,…,¬ an) )

If s*= s

Then ¬P(a1, a2, a3,…, an) = P(¬a1,¬ a2,¬ a3,…,¬ an)

It means when we inverse every single proposition in s, if the truth value of s is also inversed, proposition s is self-dual (or s*=s)

FU - Rèn luyện tập trung

Nhất nhật tại tù, thiên thu tại ngoại

Đã 26 cái thiên thu rồi chưa viết blog. Hôm nay xin tường thuật lại 26 ngàn năm làm tù nhân chính trị của mình tại trường giáo dục quốc phòng QK7. Trước hết phải kể đến những cái thường nhật nhất như:

Cái Ăn:

Cái ăn trong trại thật là chấm chấm chấm. Một ngày ăn chính 3 lần, sáng trưa chiều. Cứ sáng sớm, sau khi tập thể dục xong thì mỗi tiểu đội sẽ nháo nhác đi tìm thằng tiểu đội trưởng để lấy phiếu ăn sáng. Phiếu ăn sáng chỉ đơn giản là một mảnh giấy bé tẹo, bé ngang ngửa cái hình thẻ 3x4, trên đó ghi bằng bút bi một trong 4 món: mì gói, banh canh, hủ tíu và phở. Tuy vậy nó vô cùng giá trị, đứa nào khôn khéo thì lấy đc hơn 1 cái nếu có thằng nào trong tiểu đội ko đi ăn. Cầm phiếu ăn trên tay, xách theo đôi đũa (ai nhí nhố xách theo cả cái muỗng cũng ko hơn bao nhiêu mà lại còn phải rửa thêm cái muỗng đó) tiến về phía nhà ăn và xếp hàng. Sau nhiều nỗ lực xếp hàng, bạn sẽ đc trao một cái tô bé tẻo teo, đầy nước, rau và... vô cùng ít cái. Cái tô đó ăn lâu lắm là 3 phút, và no lâu lắm là 30 phút... không hơn. Đó là một bữa sáng.

Đi đều... Bước... 1,2,1,2,1,2

Đến trưa, khi nghe bác Sĩ hay Cường Đôla thổi còi, thì cả bầy kéo ra từ mọi ngóc ngách, từ ngoài sân, tới trong phòng và thậm chí trong nhà vệ sinh. Ai cũng cầm theo tô, muỗng và đũa ra đứng xếp hàng, vừa đi vừa gõ 3 cái thứ ấy vào nhau kêu leng keng như bọn chết đói xin ăn hay như thằng đạp xe bán hủ tíu gõ. Đó là mấy ngày đầu thôi, mấy ngày sau rồi thì bớt nghe tiếng leng keng, một phần do bị chửi nhiều quá, một phần do chúng nó chán ăn trong trung tâm, bỏ ra ngoài ăn cho nó no. Đặc biệt là vào những ngày ăn cá mỡ thì quán cơm gà gần trường lại nhộn nhịp hẳn lên...

Bữa chiều cũng thế.

Bài học rút ra:

Nên mang theo mấy cái tô, dĩa bằng giấy nhựa, loại xài một lần ấy, ăn xong thì bỏ, đỡ mất công làm mất hay ít nhất đỡ phải rửa chén.

Các lý do khiến bạn không nên rửa chén: mất thời gian, rửa không sạch, không có nước rửa chén, mà có thì cũng bị đứa khác xin đểu... Mà chẳng may phải rửa thì tốt nhất là không mang nước rửa chén theo, vì thể nào cũng có đứa khác mang để mình... xin đểu. Còn nếu lỡ mang theo thì nên về phòng, rót một tí vào đồ rửa chén rồi cất đi, đem ra thế nào cũng hết.

Các bữa ăn trưa và chiều thì có lượng hơn bữa sáng, nhưng chất thì cũng kẻ tám lạng, người nửa cân (ngày xưa 1 cân là 16 lạng). Mình ăn cũng tích cực lắm, bới cơm liên tục, ăn gấp đôi gấp ba ở nhà, vì nếu ko ăn thì nguy cơ gục trên bục giảng là rất cao, nhiều bạn nữ đã như vậy.

Ngoài các bữa chính như vậy, sinh viên còn tự tạo ra các bữa phụ, vào các giờ chuyển tiết, các lúc rảnh rỗi buổi chiều, tối và các bữa mì gói tập thể lúc nửa đêm (cái này thì yêu cầu có bình đun nước nóng, nếu không thì chịu khó nịnh mấy chị ở canteen để mấy chị rót tí nước sôi cho mà nấu mì). Cũng nhờ các bữa phụ này mà chỉ vài chục bạn phải lên quân y thôi...

Mém quên cái uống, trong này nóng bức khó chịu cho nên sinh viên uống nước như trâu. Mà nước thì không có sẵn đâu mà uống, muốn uống thì phải vào canteen mua. Tốt nhất là cả phòng cứ thu tiền hết vào rồi chia ra mua từng ngày. Một ngày thì một phòng 36 người có thể uống hết 3 bình nước 12k. Tức là khoảng 1k/1ngày/1người. Cứ thu 25k mỗi người để mua nước là ổn.

Cái ăn đã xong, thì đến cái mặc

Cái Mặc:

Cái mặc thì mình chỉ khuyên các bạn nên đem theo 3 bộ đồ để mặc là đủ, đem nhiều mất công mang vác mà lại mất diện tích để, vì một người chỉ có khoảng 0.4m2 để chất đồ cá nhân thôi. Ngoài ra cần đem theo từ 1-2 cái móc quần áo là đủ. Thực tế thì cũng không cần giặt giũ gì nên mang móc chỉ là đề phòng. Không cần giặt giũ không phải là cứ bộ đó mặc hoài không giặt, mà chẳng qua là sát bên cạnh trường có chỗ tắm giặt tư nhân rồi. Sang bên đó cứ 2k là tắm thoải mái, không phải xếp hàng hay tắm tiên như trong trường (nhiều khi đang tắm trong trường mà cúp nước là lắm chuyện vui lắm đấy nhé. Cẩn thận). Tắm xong có người ta giặt ủi dùm luôn, quá đỡ, không sợ giặt dơ, không phải nơm nớp canh trời mưa để cất quần áo vào và đặc biệt, không sợ thằng khác "hack" áo quần và khăn mặt của mình (nhất là quân phục). Giá chung cho việc giặt ủi là 1k một cái áo hoặc 1 cái quần, "quần em bé" và vớ là free. Tạm tính là 1 ngày tắm 1 lần, giặt 1 bộ thường phục, 1 bộ quân phục thì 1 ngày hết 6k, 25 ngày hết 150k.

Ngoài ra mũ nón cũng là một vấn đề. Tuyệt đối hy sinh thân mình để bảo vệ cái mũ tai bèo được phát. Cái này cực kỳ dễ mất, dễ để quên trong phòng học, ở thao trường, ở canteen và ở quán net, và hơn hết, cực kỳ dễ bị hack.

Bài học:

Dù được dặn là không được ghi vẽ lên mũ nón nhưng bạn cứ thẳng tay mà ghi tên, ký hiệu lên mũ, càng dễ thấy càng tốt, để cho bọn hacker không dám tự tiện lấy.

Còn vấn đề về giầy dép thì thế này. Chỉ nên đem theo 1 đôi giầy thường thường và một đôi dép độc độc. Lý do, giầy thì ít thấy nó hack của nhau, chỉ có cái là đi liên tục trong 26 ngày liền, không có lúc nào mà giặt, phơi cho nên dễ đứt bóng lắm, mang giầy cúi bắp theo có gì xài xong bỏ luôn. Còn dép thì cần đôi độc độc để có bị hack cũng dễ tìm lại, mà dép thì dễ bị hack lắm, cứ buông dép ra là có thể mất ngay lập tức (kinh nghiệm bản thân 3 lần mất dép và 3 lần tìm lại được). Nói chung cái gì cũng có thể bị hack cả. Cho nên khi mất đồ thì tiên trách kỷ hậu trách nhân nhé.

Lê Thắng

Cái Ngủ:

Ngủ mà cũng có vấn đề à? Có lắm đấy, thứ nhất, ngủ trong cái trung tâm mà trước sau đều là đồng cỏ thì tốt nhất là mắc mùng vào đi, không thì mỗi đêm ráng mua 2 bịch soffell mà bôi khắp người (2 bịch x 25 đêm x 2k = 100k đấy, chịu khó mắc mùng thì tiết kiệm đc 100k). Ngủ dậy thì ráng mà gấp mùng mền (gọi chung là nội vụ) cho nó gọn, không cần làm theo đúng hướng dẫn đâu, cứ làm cho nó gọn gàng là được. Xong rồi nhớ canh chừng (dù rất khó) vì nhiều đứa gấp xấu bị tịch thu, chúng nó sẽ đi "mượn" của đứa khác.

 Phòng 54

Theo luật thì phải tắt đèn đi ngủ lúc 9:30. Lúc đầu thì ai cũng nghĩ làm sao ngủ nổi cái giờ đó, nhưng mà cứ thử sau 1 ngày dậy lúc 5 giờ, học 5 tiết chính trị cộng thêm 4 tiết thực hành ở ngoài trời nắng nóng thì đếm 9 giờ hơn đã muốn đi ngủ rồi.

Cái Chơi:

Vào đây thì ngoài mấy cái tối đi học hát hay phải ôn bài thì hầu hết là rảnh (bắt đọc hồi ký làm report nhưng mà mấy ai thèm đọc. Không đọc vẫn làm được như thường). Mà nhàn cư vi bất thiện. Chính vì lẽ đó, các anh em thường giải trí bằng việc đánh bài. Đánh bài ăn tiền là bị cấm, bị bắt là chỉ có đường viết kiểm điểm và đi nhổ cỏ. Cho nên nhiều hình thức đánh bài khác được lưu hành, như đánh bài ghi điểm bao nước, đánh bài quỳ và hấp dẫn nhất là đánh bài quỳ. Ngoài ra còn vài biến thể biến thái khác là đánh bài ăn đập hay đánh bài cười (thằng nào thua phải ngồi... cười).

Sau nhiều ngày nhịn, anh em FU không thể chịu được nữa nên đã trốn về đem laptop lên (lúc này cũng thân thân rồi nên đỡ lo mất laptop) để... chơi game (là chính). Game phổ biến nhất là đá banh fifa, một máy gắn 2 tay cầm vào để 2 thằng đấu với nhau. Phòng 44 kinh doanh dịch vụ này ghê gớm nhất, đá đơn là 2k/ván, đá bảng là 5k. Ai vô địch thì gom một phần đem bao nước anh em trong phòng.

Ngoài ra thì khoản thể thao văn nghệ các bạn khỏi lo. Ở đây 26 ngày bạn sẽ được tham dự rất nhiều hoạt động thể thao văn nghệ. Như 3 môn thể thao, kéo co, bóng đá, bóng sọt. Kéo co với nhau, kéo co với cả bộ đội. Bóng đá thì khỏi nói rồi, các phòng đá với nhau dành giải vô địch. Còn bóng sọt là hoàn toàn mới lại. Nó là kết hợp của khá nhiều môn thể thao như bóng rổ, bóng ném, bóng chuyền, bóng bầu dục. Phòng 54 của mình năm nay dành được 2 giải nhất và giải 3 kéo co (tổng cộng là 1tr9 tiền thưởng).

Kéo co

Văn nghệ còn phong phú hơn. Lâu lâu ông Việt lại xách đàn vào mở show nhạc cho sinh viên. Các bạn còn được "tận hưởng" các show lớn khác như giao lưu với Fsoft, giao lưu với bộ đội rồi văn nghệ chia tay... nói chung là lắm lắm, chỉ sự bạn không đủ sức chơi thôi.

Thông tin liên lạc:

Vào đây thật sự chỉ còn cái điện thoại di động để liên lạc. Điện thoại có thể dùng để gọi, nghe, nhắn tin, chơi game, nghe nhạc. Nhưng cũng có nhiều thằng chỉ dám đem theo mấy cục gạch vào để khỏi sợ mất máy (nhiều khi sim còn giá trị hơn máy). Sóng điện thoại thì cũng tương đối, khoảng 8/10 với Mobi.

Lời khuyên:

Nên dùng Viettel khi đi học quân sự vì FPT sẽ bắt mấy bạn phải vào rừng vài lần. Mà trong khu quân sự ở Tây Ninh hay Củ Chi thì chỉ có Viettel là sống (của quân đội mà).

Nói thế cho vui thôi, chứ một ngày vẫn có 2 thời điểm có thể ra ngoài tiệm net đc. Đó là sau lúc ăn trưa cho đến 1 giờ 15 và sau lúc ăn tối cho ơới 7 giờ. Đa phần ra tiệm net để chơi game, một số làm report, một số update thông tin thời sự. Quán net xung quanh khu quân sự ko thiếu như chỉ có một quán là xài đc (có máy lạnh, có vài máy ko chậm lắm) ở đường Tô Ký, đi từ trường ra khoảng 250m.

Cái học:

Cái này mới là cái chán nhất. Ở trường quân sự QK7, bạn sẽ phải học 12 bài chính trị để thi 2 học phần. Mỗi bài thi là một bài tập làm văn đúng nghĩa với dàn ý là cuốn sách giáo dục quốc phòng. Học phần đầu mình còn ngây thơ, cầm sách học, nhưng tới học phần 2 thì đã khác, tiến bộ hơn. Hai bài ngắn thì chép ý vào tờ giấy, mấy bài còn lại thì lấy điện thoại ra chụp rồi đem vào quay :D.

Cái lý do chính đáng bắt mình phải làm cái hành động không chính đáng đó cơ bản là do độ hấp dẫn của môn chính trị. Cái hay duy nhất của môn này là mỗi một bài có một ông thầy mới vào dạy. Cứ như thể không ông nào chịu nổi cái trường này quá 1 buổi học. Mà cũng có thể thế thật.

Giờ thực hành cũng ko chịu thua người bạn lý thuyết của mình. Thực hành như cái như đi đều quay nghiêng quay ngửa thì không nói làm gì (tại cũng chả có gì mà nói, ông thầy cho chơi không). Chỉ có tập bắn súng là chán. Ngày nào cũng như ngày nào, cứ thay nhau ra nhắm nhắm cái bia mỏi cả mắt. Đã thế nhiều lần còn không có cái chiếu lót bên dưới, tanh banh cái áo. Nhưng mà những giờ tập vất vả cũng đem lại một kết quả tốt. Hehe mình bắn đạn thật được 27/30 lận (trong đó có 1 lần 10, head-shot). Giờ thực hành còn có cái màn chiến thuật tiến công phòng ngự. Tiến công thì có trò ném lựu đạn vào ụ súng và vác bộc phá đánh cốt. Phòng ngự còn nhảm hơn với trò đi hào bắn súng. Nói chung, chỉ có 3 từ để tả lại cái việc học trong này là: tẻ nhạt, tẻ nhạt và tẻ nhạt.

Vào rừng ngủ võng

Mà nói thẳng là trong này tiêu cực lắm, mấy ông thầy còn dặn sinh viên đóng tiền tế nhị trong thi cử để đậu hết. Có đứa vác cây súng chạy đc vài bước thì té mà cũng đậu hết. Biết trước thế này đã không phải tập trung nghe và làm đi làm lại mấy lần mấy động tác đó.

Riêng sinh viên FPT còn bị lao động khổ sai với cái trò viết report. Điếm đi đếm lại thì vào trong trại này phải làm 6 cái report. Report về mấy cuốn hồi ký của nhạc phụ ông chủ tịch và tía của ông phó chủ tịch FPT (nhạc phụ của BìnhTG là đại tướng GiápVN, còn tía của ông TiếnHN là ông Thiếu tướng Hoàng Đan). Ngoài ra còn 3 bài chuyên đề về giáo dục truyền thống với ông Trung tướng Nguyễn Thành Tâm và thiếu tướng Trần Ngọc Thổ, cộng thêm bài extra với ông Ogawa Takeo chủ tịch danh dự của Hitachi Software nữa... thiệt tình hết chịu nổi.

Lời khuyên:

Mấy cuốn hồi ký đó chả cần đọc cũng có thể làm đc hết, cứ phang đại vào, cứ chém gió chém bão ào ào vào. Chỉ có 2-3 người chấm tới 300x6 bài thì quả thật là không thể kỹ lưỡng được đâu.

Mấy vấn đề trên là mấy vấn đề cơ bản nhất bạn phải lo nếu như bạn chót đăng ký học FU. Ngoài ra còn vô khối chuyện lớn bé trong đợt rèn luyện tập trung đầu tiên của FU-HCM nữa, nào là vụ bigshow YếnMH, rồi vụ trộm vào chôm đồ của sinh viên, rồi vụ lên rừng ngủ võng bị muỗn chích, đánh bài ăn tiền, mất bóp, mất điện thoại, xù tiền...

Lời cuối:

Kết luận cuối cùng sau đợt quân sự này là: sv FU-HCM quả là một bộ sưu tập phong phú các loại người. Từ loại abc đến loại xyz, từ người quân tử đến hạng tiểu nhân, kiêu kỳ có, chất phác có, cưa bom có, thật thá có, tích cực có, thụ động có,... vân vân và vân vân. Chỉ mong sao những người mình đang tin tưởng còn có thể tin tưởng đc trong suốt 4 năm ở đây.

Sau đây là toàn bộ hình ảnh mình chụp được trong đợt rèn luyện tập trung lần này

Auto-hibernate in Windows Vista

Sometimes, while you're playing a full-screen game, using a full-screen application on your laptop that you can't see the low battery notification at the system tray. So when the battery becomes 0%, your windows vista turns off suddenly without closing any running application. All unsaved work lost and you might go crazy. To help you out of this, Windows Vista has some advanced settings you may not know.

Solution:

  1. Open Control Panel
    Open the Power Options in Hardware and Sound
  2. On the Select a power plan page, click Change plan settings under the selected plan.
  3. On the Change settings for the plan page, next to Turn off the display and Put the computer to sleep, choose the display and sleep settings that you want to use when your computer is running on battery and when it's plugged in.
  4. Click Change advanced power settings.
  5. On the Advanced settings tab, expand the battery category, set Critical Battery action to Hibernate (on battery) and Critical battery level to 5%. Then click Apply button to save changes

Now whenever you battery becomes lower than 5%, your laptop will auto hebernate to save your session and turn off your computer. You can also change the action and/or the level to suit yourself.

NBA live 2008 - timeout error fixed

If you are running NBA live 2008 game in your pc, you may get a critical error in playing time. That is whenever your foe makes a timeout called, the game terminates and a error dialog sent. It might take place at the halftime break or sometime at a quarter break.
NOW you can fix this bug easily.
  1. Go to GameCopyWorld
  2. Click on the blue floppy disk
  3. In the pop-up window, choose a mirror link to download (note: some accelerating downloaders cannot work with these links, so you should use the regular download method)
  4. Unrar the downloaded file htd-nl8f.rar
  5. copy file nbalive08.exe to installed folder of your NBA live 2008 (overwrite the old one)
  6. Run the game normally and no error appears again.

Vietkicks

ViệtKicks.com là một trang bookmark kiểu Digg tiếng Việt đầu tiên mà mình biết. Trang này hoạt động khá ổn định, thành viên cũng đông, bài viết cũng nhiều. Sự xuất hiện của ViệtKicks cũng là một dấu hiệu phát triển lành mạnh, đúng hướng của cộng đồng blogger tiếng Việt. Nó đáng giá để bạn bỏ thời gian xem qua.

Vietkicks còn rất có lợi trong việc giới thiệu blog của bạn. Để nhanh chóng post bài, bạn có thể dùng bookmarklet có sẵn của VK. Nhưng nếu bạn dùng Blogger và muốn mọi người đọc blog của bạn dễ dàng "kick" bài của bạn lên, bạn có thể đưa trực tiếp button của ViệtKicks cung cấp vào trang bài viết của mình.

Nhưng những bài cũ thì sao? Bạn không thể update lại tất cả đc. Nhờ vào chức năng Layout template của Blogger mới, bạn có thể thực hiện tự động công việc này.

Bước 1:

Các bạn mở phần Edit HTML trong blog ra.
(từ DashboardEdit Layout → chọn Edit HTML)

Sao lưu template hiện tại
(Download Full Template)

Bước 2:

Tìm tới đoạn code sau:

<p><data:post.body/></p>

Thêm ngay dưới chân nó đoạn màu đỏ sau:

<p><data:post.body/></p>
<span class='vietkick'>
<b:if cond='data:blog.pageType == &quot;item&quot;'>
<a expr:href='&quot;http://vietkicks.com:80/kick/?url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:blog.pageTitle' target='_blank'><img alt='kick it on VIỆTKICKS' border='0' expr:src='&quot;http://vietkicks.com/Services/Images/KickItImageGenerator.ashx?url=&quot;+data:post.url'/></a>
<b:else/>
<a expr:href='&quot;http://vietkicks.com:80/kick/?url=&quot; + data:post.url + &quot;&amp;title=&quot; + data:blog.pageTitle + &quot;: &quot; + data:post.title' target='_blank'><img alt='kick it on VIỆTKICKS' border='0' expr:src='&quot;http://vietkicks.com/Services/Images/KickItImageGenerator.ashx?url=&quot;+data:post.url'/></a>
</b:if>
</span>

Vậy là xong xuôi. Logo ViệtKicks sẽ xuất hiện trong tất cả các bài viết của bạn. Kể cả trong feed reader như Google Reader chẳng hạn.

Kinh nghiệm Java Swing

Ờ, sau mấy tuần làm project Java vừa qua, mình có một vài kinh nghiệm muốn chia sẻ cho các bạn nào sắp tới phải đối mặt với việc làm project đầu tay này.

  1. Kinh nghiệm dùng IDE.
  2. Lấy dữ liệu từ database đưa vào JTable.
  3. Cập nhật JTable.
  4. Đổi ngôn ngữ trong Swing.
  5. Validate ngày tháng. (chưa hoàn thành)

IDE

Về IDE thì mình nghĩ tốt nhất các bạn nên viết bằng NetBeans, mà NetBeans 6.0 là hơn hết. Với NetBeans các bạn có thể nhanh chóng tạo những form phức tạp. Mà các bạn hay làm quen với việc xây dựng project đi, vừa dễ quản lý mà lại dễ có điểm phần kỹ năng.

netBeans có thể tải về từ http://www.netbeans.org/

Database to JTable

Rất nhanh chóng để tạo 1 ResultSet từ câu lệnh SQL. Vấn đề nhiều người gặp phải là chuyển từ ResultSet sang table. Mà ResultSet lại không có method nào làm chuyện này cả. Muốn như vậy, bạn nên dùng contructor JTable(Vector rowData, Vector columnName). Cụ thể:

 

public JTable toTable() {
   JTable result = null;
   try {
      col = new Vector();
      rowData = new Vector();
      //add columnName
      for(int i=0;i<header.length;i++) {
        col.add(header[i]);
      }
      //Add rows data
      while(rs.next()){
           Vector v = new Vector();
           v.add(rs.getInt(1));
           v.add(rs.getString(2));
           v.add(rs.getDate(3));
           rowData.add(v);
      }
      model = new DefaultTableModel(rowData,col);
      result = new JTable(model);
      if(con!=null) con.close();
   } catch (SQLException ex) { 
       ex.printStackTrace();
   }
   return result;

Ở đây header là 1 mảng String[] chứa tên của các cột. rsResultSet vừa tạo bằng câu lệnh SQL với bảng giá trị gồm 3 cột (số thứ tự, tên, ngày sinh chẳng hạn).

Bạn nên đưa nó vào một class mới. Cho nó extends JTable hoặc là ResultSet cũng được.

Update JTable

Muốn Update một JTable với các dòng dữ liệu mới, các cột mới, hay nói chung là 1 tableModel mới, bạn cần đặt hàm table.repaint() trong tableChanged(TableModelEvent e). Mà hàm này nằm trong interface TableModelListener. Nó được kích hoạt khi table nào đó được setModel mới. Vì vậy ta cần thực hiện như sau:

public class yourClassName extends JFrame implements TableModelListener {
     ...
    JTable table;
    void methodBấtKỳ() {
        ...
        table = new JTable(modelMặcĐịnh);
        table.setModel(mộtModelMới);
        ...
    }
    public void tableChanged(TableModelEvent e) {
        table.repaint();
    }
    ...
}

Khi mà hàm setModel được gọi cho table thì sự kiện tableChanged được kích hoạt, vì thế mà hàm repaint() cũng được gọi theo.

Multi-language inteface

Để thực hiện chức năng đa ngôn ngữ trong Swing. Bạn chỉ cần dùng method setText() cho các Component như button, label... Với cái List hay Choice, bạn cần removeAll() và add lại mảng nội dung mới. Với JTable, bạn có thể tạo một Table Model mới đã cập nhật tên cột và nội dung, rồi setModel đó vào table cần chuyển ngữ.


Vì lý do cần phải thay đổi nhiều, bạn nên tạo các mảng String[] cho từng nhóm Component, chứa lần lượt các text của Component dó. Tốt nhất bạn nên dựng 1 abstract class mới chứa các mảng String[] đó. Và các class ngôn ngữ con extends class abstract này. Trong các class con ta sẽ truyền chuỗi thật vào. Ví dụ:


abstract public class Language {
   String title;
   String[] btn,lbl;
   Language() {}
}
class english extends Language {
     String title = "Personal Information Manager";
     String[] btn ={
       "Exit","Cancel","New","Save","Edit","Delete"
       };
     String[] lbl = {
       "Full Name:","Nickname:","Job:","Birthday:"
       };

    public english() {
        super();
        super.btn = this.btn;
        super.lbl = this.lbl;
        super.title = this.title;
    }
}

class vietnamese extends Language {
     String title = "Quản lý danh bạ cá nhân";
     String[] btn ={
       "Thoát","Hủy bỏ","Tạo mới","Lưu","Chỉnh sửa","Xóa
       };
     String[] lbl = {
       "Họ tên:","Biệt danh:","Nghề nghiệp:","Ngày sinh:"
       };

    public vietnamese() {
        super();
        super.btn = this.btn;
        super.lbl = this.lbl;
        super.title = this.title;
    }
}

Trong class chính, bạn tạo 1 đối tượng Language lan;. Tùy vào action mà bạn sắp đặt, bạn gọi hàm assignLabel(int ind) đã dựng ra. Hàm assignLabel(int ind) có dạng như sau:


Language lan;    //Tạo đối tượng abstract
...
 
void assignLabel(int ind) {
    switch(ind) {
      case 0: lan = new english(); break;
      case 1: lan = new vietnamese(); break;
      case 2: lan = new french(); break;
    }
 

    //Button
    for(int i =0;i<lan.btn.length;i++) {
       btn[i].setText(lan.btn[i]);
    }

    //Label
    for(int i=0;i<lan.lbl.length;i++) {
       lbl[i].setText(lan.lbl[i]);
    }
 
    //Title
    this.setTitle(lan.title);
}

Chú ý: Nếu bạn có nhiều component thì hơn hết bạn nên đưa chúng vào từng mảng. Ví dụ:


JButton[] btn = new JButton[9];
 
public initComponent() {
    for(int i=0;i<btn.length;i++)
        btn[i] = new JButton();
}

Cũng đơn giản phải không bạn. NẾu bạn không thực hiện được theo hướng dẫn này, vui lòng comment hoặc email tới gmanvn@gmail.com. Cám ơn.

Hiệu ứng Lightbox

Lâu quá không viết về hack trong Blogger rồi. Hôm nay mình xin viết 1 bài về hiệu ứng Lightbox.
Chú ý: hiệu ứng chỉ chạy tốt trên nền Internet Explorer. Người dùng Firefox có thể không xem đc hiệu ứng này.

Trước hết Lightbox là thế nào?

Đơn giản, Lightbox là một dạng cải tiến từ popup. Nó giống Popup là nó cũng bật ra (pop up), "đè" lên phần còn lại của trang web. Nhưng khác Popup ở một điểm cơ bản, nó không mở ra cửa sổ nào mới mà là một khung chứa (container) ngay trong trang web hiện tại.

Xem mẫu sau: (click vào tấm hình nhỏ phía dưới, chỉ với IE mà thôi)
cat11024
Bạn đã thấy hiệu ứng rồi đấy. Trên cả tuyệt vời phải không?

Hướng dẫn Cài đặt

Phiên bản: 2.03.2
tác giả đầu tiên: Lokesh Dhakar
Thiết lập phù hợp cho Blogger: Gman

Đưa 4 dòng code sau vào phần head trong template của bạn.
Hãy nhớ backup trước khi làm:
Vào DashboardLayoutEdit HTMLDownload Full Template.



<script src='http://bloggerhosting.appspot.com/serve/site.gman.googlepages.com/prototype.js' type='text/javascript'/>
<script src='http://bloggerhosting.appspot.com/serve/site.gman.googlepages.com/scriptaculous.js?load=effects' type='text/javascript'/>
<script src='http://bloggerhosting.appspot.com/serve/site.gman.googlepages.com/lightbox.js' type='text/javascript'/>
<link href='http://bloggerhosting.appspot.com/serve/site.gman.googlepages.com/lightbox.css' media='screen' rel='stylesheet' type='text/css'/>

Save Template lại

Sử dụng thế nào?

Cực kỳ đơn giản, sau khi bạn upload một tấm hình vào bài viết. Nó sẽ có đoạn code với dạng như sau:
<a href="Địa_chỉ_thật_của_ảnh"><img src="địa_chỉ_hình_thu_nhỏ_(thumbnail)"></a>
Bây giờ bạn hay thêm vào thẻ <a> 2 thuộc tính là title="Tên_hình"rel="lightbox" (tên hình có thể bỏ qua). Và bạn có đc đoạn code mới như sau:
<a title="Tên_hình" href="Địa_chỉ_thật_của_ảnh" rel="lightbox"><img src="địa_chỉ_hình_thu_nhỏ_(thumbnail)"></a>
Vậy là xong. Từ nay, khi người xem click vào tấm hình nào có thuộc tính rel="lightbox" thì hiệu ứng Lightbox sẽ xuất hiện.
Muốn thoát khỏi lightbox, chỉ cần bấm ra vùng bên ngoài ảnh. Ngoài ra bạn cũng có thể bấm nút Close x hay phím tắt X từ bàn phím.

Nhiều hình cùng nhóm


Lightbox 2 có thể đưa nhiều hình vào một nhóm để dễ dàng chuyển từ hình này sang hình khác. Muốn vậy, bạn chỉ cần sửa thành rel="lightbox[tên_nhóm]" ở mỗi ảnh trong nhóm.
Việc di chuyển trong nhóm có thể thực hiện bằng 3 cách:
  1. Dùng phím mũi trên ← và →.
  2. Dùng phím N (next) và P (previous)
  3. Nhấn chuột vào nửa bên trái hay nửa bên phải của tấm hình

Chú ý:

Địa chỉ hình thu nhỏ cũng có thể chính là địa chỉ thật của ảnh.
Với Blogger, khi bạn upload hình lên từ máy (không phải chèn hình có sãn trên mạng) thì tự động nó đưa ra link hình thật và cả link hình thumbnail. Nhưng, link thật đó đc định nghĩa để không thể mở trực tiếp từ trang blogspot.com (vì lý do bảo mật). Vì vậy, muốn dùng lightbox trong trường hợp này, bạn phải sửa lại đôi chút trong link full-size:
bây giờ bạn hãy bỏ ký tự -h đi. Như vậy, bạn sẽ có:
Nếu quan tâm hơn tới người xem, trong trường hợp màn hình của họ không đủ rộng để xem toàn bộ chiều ngang tấm hình. Khi đó lightbox sẽ là trở ngại. Để khắc phục tình huống này. Bạn có thể thay link full-size lại thành:
cũng có thể dùng s640, s320,... thay cho s800 đó chính là số pixel chiều ngang tối đa của hình (1600 là full size)

Chúc bạn thành công

Capitalize

[ 15.8.2007 ]


Hehe, hôm nay khá là thú vị, lên trường coi thông báo đầu tiên của năm học mới. Không nhiều ngạc nhiên, vẫn phòng đó, vẫn thầy đó chủ nhiệm. Chỉ có một thứ làm mình hơi bất ngờ. Đó là lớp mình có thêm 2 người mới (cứ bao nhiêu người đi thì bấy nhiêu người đến, 3 năm vẫn thế). Hai bạn này từ chuyên Lý chuyển sang, một quen, một lạ. Quen thì chính là cái cậu Khôi, bạn thằng Khải và Nguyện. Còn người lạ, thì chính là... người lạ :)), chỉ biết tên bạn này là Misa.

Cái làm mình vui hơn là giờ học Aptech. Từ giờ 1 ngày tới 4 tiếng thực hành lận, đã hơn trước nhiều. Hôm nay thầy cho mọi người xem mấy bài Play with String hôm bữa. Hà hà, thầy lấy bài của mình ra làm bài giải tiêu biểu :)>-. Vì mình viết cực kỳ ngắn gọn (tuy hơi phức tạp tí). Đó là nhờ công sức bao ngày nghiên cứu Regular Expression của mình (ai thích tìm hiểu thì vào trang này nhé) ;)).

Từ khúc này trở đi hơi bị nhảm, tại mình quá khích, nên viết ra thôi, khỏi đọc cũng đc. Trong bài có 1 câu mà mình thích nhất, chỉ cần 1 dòng lệnh là xong. Nếu dùng cách thường (duyệt chuỗi) thì sẽ rất dài 8-}.

Capitalize

Cái này yêu cầu viết hoa ký tự đầu tiên của mỗi từ. Cơ bản thì Jscript không có method là .toProperCase(), nhưng nếu dùng regular expression thì dễ dàng tạo ra hàm tương tự.

1  function proper(str) {
2  str = " "+str
3  str = str.toLowerCase()
4  re = /\s(\S)/g
5  str = str.replace(re, function($1) {return $1.toUpperCase() })
6  str = str.substr(1)
7  return str
8 }

Giải thích:
1. Khai báo hàm proper, tham số là str
2. Tạo thêm 1 khoảng trắng nằm trước chuỗi cần Capitalize
3. Chuyển str về chữ thường hết
4. Khai báo 1 regular expression tên là re gồm 1 cặp khoảng trắng (\s) và không phải khoảng trắng (\S). Riêng \S được đặt trong cặp ngoặc có ý nghĩa lưu lại giá trị của chữ cái đầu tiên sau khoảng trắng vào biến ảo $1.
5. Dùng method replace để thay thế re thành cái hàm phía sau. Hàm này dùng để chuyển ký tự đã lưu ($1) thành viết hoa.
6. Bỏ đi 1 ký tự đầu tiên, chính là khoảng trắng đã thêm vào ở đầu.
7. Trả giá trị str vừa đổi về cho hàm.

Chúng ta có thể rút gọn hàm này tới tối đa như sau:

function proper(str) {
return (" "+str).toLowerCase().replace( /\s(\S)/g,function($1){return $1.toUpperCase() }).substr(1)
}

Và thế là xong, đã giải quyết đc bài toán chỉ trong 1 câu lệnh.

Thôi, ba hoa đủ rồi, bữa khác rảnh nói tiếp hen.

Blogger + Google Reader = ?

Google hẳn đã quá quen thuộc với mọi người rồi, nhưng liệu bạn đã biết hết các dịch vụ của Google chưa? Hay chỉ dùng nó như một search engine mà thôi. Hôm nay xin giới thiệu một dịch vụ đang trong giai đoạn thử nghiệm nhưng chạy rất tốt và đặc biệt, có thể kết hợp với Blogger khá nhịp nhàng. Đó là Google Reader.

Google Reader là một ứng dụng web 2.0 dùng để đọc tin RSS. Vì RSS chưa phổ biến lắm ở VN nên dẫn tới Google Reader cũng ít ai biết tới.

RSS được cho là từ viết tắt của Rich Site Summary (Tóm tắt trang có nội dung đa dạng) hay Really Simple Syndication (Nguồn cung cấp vô cùng đơn giản). Nói chung, RSS là một cách để phân phối tựa đề và các nội dung khác của một trang web, chẳng hạn trang tin tức hay thậm chí là blog.

Ở các nước đã phát triển thì RSS là một kênh thông tin không thể thiếu của các website từ cá nhân tới tập thể từ khá lâu. Ở Việt Nam hiện nay cũng có một vài trang cung cấp nguồn RSS cho người đọc, chẳng hạn bảo Tuổi trẻ Online hay VnExpress.net. Nhưng việc đọc các file RSS không thực sự đơn giản. Nó cần những chương trình đọc RSS riêng, cũng giống như các tài liệu PDF vậy. Ở đây mình chỉ đề cập tới một trình đọc RSS miễn phí, chạy trên web cực kỳ dễ sử dụngGoogle Reader. Nếu các bạn muốn tìm hiểu thì có thể click vào đây.


Nội dung:

  1. Blogger
  2. Google Reader
  3. Blogger + Google Reader
Tất cả các hướng dẫn sau đây đều sử dụng giao diện tiếng Anh

1. Blogger

Cách dùng Feed trong Blogger:

Blogger cung cấp cho người dùng của mình một hệ thống RSS và Atom thuận tiện để chia sẻ.

Atom trước hết là một tài liệu dạng xml và sử dụng giao thức HTTP để phân phối nội dung của các trang Web (bao gồm Blog hay các nguồn tin khác) một cách trực tiếp. Nó được tạo dựng từ công nghệ của các phiên bản RSS đàn anh. Nói cách khác, Atom là một API (Application Program Interface)

Để bật hay tắt chức năng Feed cho blog, đầu tiên bạn phải vào DashboardSettingsSite Feed.

Tại đây, bạn chỉ có một lựa chọn đơn giản về mực độ cung cấp nội dung bài viết mà thôi. Chọn "Full" để cung cấp toàn bộ nội dung của mỗi bài ra feed, còn "Short" thì chỉ đưa ra một đoạn đầu của mỗi bài. Lựa chọn "None" đồng nghĩa với việc bạn tắt chức năng Feed trên blog.

Nếu một lựa chọn là quá ít với bạn, bạn có thể nhấn vào liên kết "Advanced Mode" để mở rộng tùy chọn về Feed. Với chế độ Advanced, bạn cần xác định mức độ cho 3 loại Feed:

  • Blog Posts Feed: Feed chứa tất cả các bài viết của bạn
  • Blog Comment Feed: Feed này chỉ chứa các comment (theo thứ tự thời gian)
  • Per Post Comment Feeds: Mỗi feed kiểu này chỉ chứa các comment cho một bài viết cụ thể.

Sau đó bạn hay Save Settings lại. Và bạn sẽ có các Feed của mình với những địa chỉ như sau:

Các địa chỉ trên đều là định dạng Atom 1.0, để sử dụng định dạng RSS 2.0 bạn chỉ cần thêm vào sau địa chỉ đó 1 đoạn: ?alt=rss

2. Google Reader

Cách đăng ký một feed:

Feed là một tập tin dạng xml (Extensible Markup Language) chứa thông tin về tựa bài và nội dung lấy từ nguồn RSS. Khi bạn công bố một bài viết và chức năng Feed đang mở, Blogger sẽ tự tạo cho bạn một phiên bản có thể nhúng vào các website khác hoặc các trình đọc RSS của bài viết đó.

Để đăng ký 1 feed mới, bạn chỉ cần click vào Add subscription hay Browse để lựa chọn các Feed phổ biến (bằng tiếng Anh là chính). Một khi bạn chọn Add subscription, tại đó sẽ mở ra một ô cho bạn nhập từ khóa hay địa chỉ của Feed (với người dùng Blogger, chỉ cần nhập địa chỉ blog) vào rồi nhấn Add là xong.

Thao tác với các Feed:

Ti giao diện chính của Google Reader bạn sẽ thấy 4 phần như hình sau:

  1. Phần sidebar bên tay trái của màn hình chứa tất cả những feed mà bạn đã đăng ký. Con số nằm cạnh các feed là tổng số bài chưa đọc trong feed đó. Để xem nội dung trong feed nào, bạn chỉ cần nhấn vào tên feed đó.
  2. Nhấn vào liên kết "All items" trong phần này sẽ mở ra toàn bộ nội dung trong tất cả các feed bạn đã đăng ký. Chế độ sắp xếp tự động trong danh sách All items sẽ là: feed có ít bài nằm trên feed có nhiều bài hơn.
  3. Vùng bên phải của màn hình chính là nơi hiển thị nội dung. Có 2 cách hiển thị là List view (chỉ hiện tựa đề của bài cho đến khi bạn nhấn vào nó) hay Expanded View (hiển thị toàn bộ nội dung và tựa đề bài viết)
  4. Mặc định thì Google Reader hiển thị tất cả các bài viết. Nhưng với liên kết New items bạn có thể thay đổi điều đó. Ở chế độ này, các bài đã đọc sẽ được giấu đi, chỉ để lại những bài mới mà thôi. Để quay lại mặc định, bạn chỉ cần nhấn vào liên kết All items.

Đi sâu vào nội dung của một bài viết, bạn sẽ thấy nó cũng có 4 phần như sau:

  1. Nhấn vào nút mũi tên (>>) màu xám để mở trang web thật chứa nội dung bạn đang xem. Chức năng này cực kỳ hữu dụng khi feed của bạn chỉ cung cấp đoạn trích mà thôi.  (phím tắt: v)
  2. Nằm dưới mỗi bài viết đều có một thanh công cụ nhỏ với những chức năng sau:
    • Giống như Gmail, bạn cũng có thể đánh dấu (star) bài viết bạn thích bằng nút Add Star. Việc đánh dấu sẽ giúp bạn tìm lại những bài bạn thấy thích. (phím tắt: s)
    • Ngoài ra, bằng việc nhấn vào nút Share bạn có thể đưa bài viết đó ra với cộng đồng. Trang cộng đồng của bạn là cách đơn giản nhất để chia sẻ sở thích với bạn bè và người thân. (phím tắt: shift + s)
    • Nút Email cho phép bạn gửi bài viết này tới một cá nhân nào đó. (phím tắt: e)

  3. Trong chế độ list view (phím tắt: 2), một đối tượng được coi là đã xem khi bạn nhấn vào nó. Còn trong chế độ expand view (phím tắt: 1), một bài chỉ được coi là đã xem khi bạn kéo thành cuộn qua hết bài. Để chuyển một bài đã xem thành chưa xem, bạn có thể bỏ chọn trong ô "mark as read". (phím tắt: m)
  4. Sử dụng Tag giúp bạn sắp xếp các feed theo cách của mình, chẳng hạn "blog của bạn bè", "tin tức"... (phím tắt: t)

Mẹo vặt

  1. Tạo thư mục để quản lý Feed:
    Vào Google ReaderSettings → Subscriptions
    Tại mỗi Feed, bạn có thể thay đổi, thêm bớt thư mục. Chú ý là mỗi feed có thể có nhiều thư mục khác nhau, giống tag vậy.
  2. Đọc các feed mới chỉ bằng 1 cái click chuột:
    Vào Google ReaderSettings → Goodies → Put Reader in a bookmark
    Tại đây, bạn chỉ cần kéo cái liên kết Next » vào thanh Bookmark (với Firefox) và thanh Links (với IE). Từ nay, bạn chỉ cần click vào bookmark đó là trình duyệt sẽ tự động chuyển bạn sang trang web thật có bài viết bạn chưa đọc.
  3. Đăng ký feed mới không cần mở Google Reader
    Vào Google ReaderSettings → Goodies → Subscribe as you surf
    Tương tự, bạn chỉ cần kéo liên kết Subscribe vào thanh Bookmark là xong. Sau khi làm động tác này, mỗi khi bạn mở một trang web và bạn muốn đăng ký feed, bạn chỉ cần nhấn vào đó. (nếu trang không có feed, thì sẽ nhận đc thông báo "Oops. Can't find a feed."
  4. Đọc bài viết chỉ bằng 1 ngón tay
    Bạn chỉ cần dùng phím Spacebar trên bàn phím (phím đánh dấu cách) để duyệt qua tất cả các bài viết. Bình thường, phim này đưa ban xuống đoạn tiếp theo của bài, nhưng khi hết bài, nó sẽ chuyển bạn sang bài tiếp theo trong thư mục (nếu là bài cuối củng thư mục đó thì nó sẽ chuyển sang bài đầu tiên của thư mục tiếp theo). Tổ hợp phím shift và spacebar có tác dụng ngược lại.

3. Blogger + Google Reader

Sử dụng Google Reader để đọc các feed từ Blogger của bạn bè là cách hay nhất để luôn cập nhật bài viết của họ. Ngoài ra Yahoo! 360o cũng có Feed (bạn có thể tìm thấy link feed ở nút RSS màu đỏ cuối trang blog). Và nếu may mắn người đó để blog public thì bạn có thể cập nhật bài viết của họ (tuy hơi chậm một tí, nhưng mà đáng để thử)

Quản lý blog bằng Google Analytics

Đã lâu không biết mấy cái hướng dẫn này rồi. Hôm nay làm xong bài Assignment xong thấy người nhẹ nhõm, bắt tay vào viết bài cho mọi người thôi.

Nói trước, đây không phải là hack hay widget gì hết, đây là một ứng dụng ngoài (tạm gọi là thế) cho phép bạn theo dõi việc truy cập của người khác trên blog mình, một cách âm thầm, nhanh gọn và hiệu quả mà chỉ mất chưa tới 1 phút.

Tạo tài khoản:

  1. Nhấn vào đây để mở Google Analytics ra. (3 giây)
  2. Đăng nhập vào bằng tài khoản Google (chính là tài khoản bạn dùng khi đăng nhập vào Blogger). Trong lúc chờ đợi, bạn mở sẵn Dashboard của Blogger (12s hoặc ít hơn)
  3. Nếu đây là lần đầu tiên bạn đăng nhập vào Analytics thì bạn sẽ thấy dòng
    Sign Up for Google Analytics

    Nhấn Sign up để tiếp tục (1s)
  4. Bạn sẽ được dẫn tới trang Analytics: New Account Signup. Tại đây bạn điền đầy đủ thông tin vào các ô rồi nhấn Continue: (6s có thể nhanh hơn)
    • Website's URL: http://blogcủabạn.blogspot.com/.
    • Account Name: Tên của tài khoản, chẳng hạn "My blog".
    • Time zone country or territory: Vietnam
    • Time zone: tự động chọn (GMT+07:00) Saigon
  5. Ở phần Contact Information chỉ cần nhập Country or territory: Vietnam rồi nhần Continue (1,5s).
  6. Accept User Agreement bạn hãy đánh dấu check vào dòng
    Yes, I agree to the above terms and conditions.
    Rồi bấm Create New Account ». (1,5 giây)
  7. Bây giờ Google Analytics dẫn bạn đến trang Tracking Instructions, tại đây bạn được cung cấp một đoạn code nhỏ, có dạng như sau:
    <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
    </script>
    <script type="text/javascript">
    _uacct = "UA-2235926-1"; <!-- dòng này sẽ thay đổi theo blog của bạn -->
    urchinTracker();
    </script>

    Hãy copy đoạn code này vào template của mình qua trang Edit HTML. Và nhớ đặt nó vào ngay sau dòng <head> rồi save template lại, quay sang trang Analytics, bấm continue lần cuối. Và thế là xong (5s).

Tổng cộng là 30 giây, chỉ mất có 30 giây để tạo một chương trình thống kế hoàn hảo cho blog của mình.

Các chức năng chính của Analytics



Để bắt đầu, tại trang Analytics, bạn thấy 1 cái bảng: Website Profiles chọn View Report. Bạn sẽ được đưa vào trang Dashboard (bạn nên bookmark lại trang này để tiện việc truy cập sau này).

Tại sidebar bên tay trái, có cái mục:

  • Visitors:
    • Map Overlay: theo dõi truy cập bằng bản đồ địa lý.
    • New vs. Returning: so sánh khách truy cập mới và cũ.
    • Languages: cái này không chính xác, không cần chú ý tới.
    • Visitor Trending:
      • Visits: Số lần truy cập
      • Absolute Unique Visitors: Số người truy cập
      • Pageviews: Số trang được load
      • Average Pageviews: Số trang trung bình một lần xem
      • Time On Site: Thời gian trung bình một lần xem
      • Bounce Rate: Tỉ lệ chuyển trang
    • Visitor Loyalty
      • Loyalty: Số lần quay lại của 1 người.
      • Recency: Lần quay lại mới nhất.
      • Length of Visit: Thời gian truy cập
      • Depth of Visit: Số trang xem trong 1 lần truy cập
    • Browser Capabilities (thích hợp cho việc design)
      • Browsers: Loại trình duyệt
      • Operating Systems: Hệ điều hành
      • Browsers and OS: Kết hợp 2 cái kía
      • Screen Colors: Dải màu màn hình.
      • Screen Resolutions: Phân giải màn hình.
      • Flash Versions: Phiên bản của Flash player
      • Java Support: Trình duyệt có hỗ trợ Java hay không
    • Network Properties: :p không cần quan tâm lắm.
    • User Defined: :D ko có giá trị gì lắm.
  • Traffic Source: (các nguồn truy cập)
    • Direct Traffic: Truy cập trực tiếp
    • Referring Sites: Thông qua các trang web khác.
    • Search Engines: Thông qua các cỗ máy tìm kiếm.
    • All Traffic Source: Tổng hợp
    • Keywords: Các từ khóa dẫn tới blog của bạn từ trang tìm kiếm.
    • AdWords: Ko cần quan tâm
    • Campaigns: Ko cần quan tâm
    • Ad Versions: Ko cần quan tâm
  • Content
    • Top Content: Nhưng trang được xem nhiều nhất (xét theo URL).
    • Content by Title: Tương tự trên những xét theo tên trang.
    • Content Drilldown: Tổng hợp tất cả.
    • Top Landing Pages: Những trang nhiều khách ghé đầu tiên nhất.
    • Top Exit Pages: Những trang khách rời khỏi blog nhiều nhất.
    • Site Overlay: Mô phỏng những link đc click nhiều nhất.
  • Goals (không cần để ý)

Nếu bạn muốn thay đổi khung thời gian thì hay click vào ô hiển thị ngày, ngay trên đồ thị lớn. Có 2 chế độ chọn ngày:

  1. Calendar: một cái lịch cho bạn chọn ngày. Nhấn 1 cái vào ngày đầu tiên, cái thứ 2 vào ngày cuối cùng để xác định khung thời gian.
  2. Timeline: Biểu đồ cột của từng ngày, bạn có thể kéo và mở rộng khung thời gian một cách trực quan hơn.

Chức năng Compare to Past, giúp bạn so sánh khung thời gian này và 1 đoạn khác trong quá khứ (màu xanh lá cây) và cách lựa chọn cũng tương tự như trên.

Bạn có thể "quăng" một chức năng hay dùng ra Dashboard bằng nút Add to Dashboard. Hay đặt lịch gửi thống kê về email bằng nút Email. Bạn cũng có thể xuất ra và download thống kê về máy bằng nút Export.

Ngoài ra còn nhiều tính năng khác đợi bạn khám phá. Sau đây là vài link hữu ích cho bạn:

Lời cuối: Nếu bạn muốn đăng lại bài viết này, hay nhấn vào nút Kết nối bài viết phía dưới. Cám ơn.

Mã nguồn cho Blogger (phần 2)

Lần trước mình đã giới thiệu về mã nguồn của Blogger. Nhưng đó chỉ là dạng thu gọn, nội dung của các widget bị giấu đi. Ở bài này, mình sẽ nói chi tiết về nội dung của một Widget. Xét về bản chất thì nó khá giống những ngôn ngữ lập trình hướng cấu trúc (structured programming language), nó cũng cấu tạo bởi cái code block và có những hàm cơ bản như LoopCondition.

I.Chuẩn bị
Tại trang Edit HTML (?) bạn nhấn vào checkbox Expand Widget Templates


Lúc này thì trang Edit HTML sẽ tự tải lại. Và dễ dàng nhận ra, phần mã nguồn đã thay đổi, các dòng
<b:widget [các thuộc tính] />

trở thành
<b:widget [các thuộc tính]>
<b:includable>
...
</b:includable>
</b:widget>

Lưu ý là giữa 2 thẻ <b:widget></b:widget> có thể chứa nhiều nhóm <b:includable></b:includable>

II.Sẵn sàng
Thẻ <b:includable>

Bạn có thể bất cứ thứ gì vào giữa 2 thẻ <b:includable></b:includable>. Thẻ này có 2 thuộc tính như sau.

  • id: (bắt buộc) Những chữ hay số có giá trị như tên của 1 includable. Hai includable trong cùng widget không được trùng tên.

  • var: Một tham số có liên quan tối phần nội dung trong thẻ, có thể là chữ hoặc số.
Có thể xem mỗi 1 includable là một function trong lập trình (C, Pascal...) có id là tên hàm và var là tên biến. Trong mỗi Widget cần phải có một includable với id='main'. Nếu bạn viết thêm những includable với những id khác thì chúng sẽ không tự xuất hiện. Muốn chúng xuất hiện thì bạn cần dùng đến thẻ <b:include>.
Các thuộc tính của thẻ <b:include> gồm:
  • name: (bắt buộc) là tên của include này. Nó buộc phải trùng với ID của includable bạn muốn xuất hiện (với điều kiện, cả 2 nằm trong cùng một widget).

  • data: có ý nghĩa như var trong includable.

Thẻ include dùng để gọi một includable khác vào includableid='main'. Nó giống như một lệnh để gọi hàm vào hàm main() vậy. Để có thể hiểu và phân biệt được thế nào là 1 includable và 1 include, xin mọi người xem qua ví dụ sau:
<b:includable id='main'>
<b:loop var='i' values='posts'>
<b:include name='post' data='i'/>
</b:loop>
</b:includable>

<b:includable id='post' var='p'>
Title: <data:p.title/>
</b:includable>

Chỉ cần một dòng
<b:include name='post' data='i'/>

sẽ thay thế cho cả đoạn
<b:includable id='post' var='p'>
Title: <data:p.title/>
</b:includable>

Tham số i được dùng trong thẻ include có ý nghĩa như p trong includable. Sở dĩ dùng i ở đây là vì trong thẻ b:loop có var='i'. Thẻ <b:include> rất có ý nghĩa nếu bạn phải lập đi lập lại một vùng includable nhiều lần trong một widget.
Lưu ý: <b:include name='main'/> không cần viết vào vì nó sẽ xuất hiện tự động.

Thẻ data:
Thẻ data: có ý nghĩa quan trong nhất trong toàn bộ phần mã nguồn. Vì nó là đại diện cho nội dung thực sự của blog. Một vài ví dụ của thẻ này:
<data:title/> đại diện cho tựa đề của widget
<data:photo.url/> đại diện cho đường dẫn của ảnh
...
Đây là những ví dụ đơn giản và thường gặp nhất. Vì hầu hết các widget đều có tựa đề. Thẻ data còn được dùng trong nhiều trường hợp phức tạp khác, thậm chí có tham số trong đó. Dấu "." ý chỉ là url ta cần là url của tấm hình đó, chứ không phải của bất cứ cái gì khác. Tới đây thì có vẻ nó đã giống như một ngôn ngữ lập trình rồi.
Lưu ý: Còn rất nhiều thẻ data khác nhau và danh sách các thẻ data sẽ được viết trong bài sau.


Thẻ <b:loop>
Thẻ b:loop được dùng khá phổ biến. Nó dùng để lặp đi lặp lại một nhóm thông tin. Cú pháp cơ bản của b:loop là:
<b:loop var='tham số chỉ định' values='nhóm dữ liệu'>
[Nội dung cần lặp lại]
</b:loop>

Với tham số chỉ định là tùy chọn, thường dùng nhất là 'i'. Và nhóm dữ liệu chính là các data: (chi tiết sẽ để cập ở bài sau).
vd:
<b:loop var='i' values='data:posts'>
<h2><data:i.title/></h2>
</b:loop>

Trong ví dụ này, ta sẽ lặp đi lặp lại tựa đề của bài viết. Tham số là i, lặp lại sau mỗi bài viết (data:posts là danh sách tất cả các bài viết trong một trang). Nội dung cần lặp lại là tựa đề của từng bài. Tức là khi i sẽ chạy từ post[1] tới post[n], thì xuất hiện trên màn hình sẽ là tựa đề của post[1] tới post[n].

Thẻ <b:if>
Bạn có thể dùng b:if và b:else để quy định thông tin chỉ hiển thị trên vùng này hay vùng khác. Cú pháp cơ bản là:

<b:if cond='điều kiện'>
[nếu điều kiện đúng]
<b:else/>
[nếu điều kiện sai]
</b:if>

Bạn có thể bỏ qua <b:else/> mà không ảnh hưởng tới <b:if>. Như vậy, chỉ có 2 trường hợp, một là nội dung nếu điều kiện đúng; hai là không có gì.
Điều kiện phải là những biểu thức có thể đánh giá đúng sai. vd:
<b:if cond='data:post.showBacklinks'>
đúng nếu bài viết hiện tại cho phép hiển thị backlinks.
<b:if cond='data:blog.pageType == "item"'>
Đúng nếu trang hiện tại là dạng item (trang chứa bài viết).
<b:if cond='data:displayname != "Gman"'>
Đúng nếu tên hiển thị khác Gman.
<b:if cond='data:post.numComments > 1'>
Đúng nếu bài viết hiện tại có nhiều hơn một bài trả lời.


Mã nguồn của Blogger

Blogger của Google là một dịch vụ blog mã nguồn mở. Bạn có thể biên tập khoảng 95% mã nguồn của nó để thay đổi theme cho nó. Không chỉ đổi màu, đổi background... mà hơn thế nữa, bạn có thể thay đổi Layout (bố cục) để có một giao diện 100% mới. Ngoài ra vì là mã nguồn mở lên bạn dễ dàng tìm được những thứ gọi là Widget (phụ tùng) - một kiểu Add-on cho blog - và nhưng đoạn script tạo các chức năng, hiệu ứng đặc biệt... Với Blogger, bạn có thể tạo một cái blog trên nền tảng Web 2.0 dễ dàng. Bài viết này sẽ hướng dẫn bạn chỉnh sửa mã nguồn của Blogger.

I.Chuẩn bị:
Để bắt đầu, bạn phải đăng nhập vào blog của mình.
Trong trang Dashboard → chọn Layout (tại blog muốn chỉnh)
Tại trang Blogger :: Edit Layout → nhấn vào link Edit HTML
Ở trang này, bạn có thể bắt đầu việc chỉnh sửa của mình.

II.Dạng cơ bản:
Mã nguồn thường sẽ có dạng cơ bản như sau:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>
<b:include data='blog' name='all-head-content'/>
<title><data:blog.pageTitle/></title>
<b:skin><![CDATA[/*
-----------------------------------------------
Giới thiệu về skin và tác giả
-----------------------------------------------*/


/* Variable definitions
phần đặt biến cho skin
*/


Phần CSS có thể chỉnh sửa
]]></b:skin>
Phần chèn Javascript
</head>
<body>
Nội dung trang...
Phần này thay đổi theo trang. Thường được chia ra thành cái Section (nằm giữa thẻ <b:section> và </b:section>).
Trong các section (vùng) còn có những Widget (nằm giữa thẻ <b:widget> và </b:widget>).

</body>
</html>
Từ đoạn này trở đi không có giá trị



Những phần nằm trên thẻ <head> bạn không cần để ý, cũng đừng bao giờ thay đổi gì ở đây. Có thể hiểu đây là phần thủ tục thôi. Phần màu xanh lá cây có thể bỏ đi. Phần in nghiêng là các lưu ý.
Ngoài ra, những đoạn nằm trong /**/ trong phần CSS và những đoạn nằm trong <!----> trong những phần còn lại đều không có ý nghĩa. Đó chỉ là phần chú thích.
...



III.Section và Widget:
Thẻ <b:section>
Nó có các thuộc tính (attribute) như sau:

  • id: (Bắt buộc) Nó có ý nghĩa như tên của section đó (chỉ dùng chữ và số).
    VD: <b:section id="MySection">.
  • class: phân nhóm cho section của bạn. Bạn nên dùng những cái tên sau cho class của mình như "navbar," "header," "main," "sidebar," and "footer". Để sau này, khi thay đổi phần CSS, Blogger có thể chuyển Section của bạn đến đúng nơi.
    VD: <b:section class="sidebar" id="MySection">.
  • maxwidgets: Quy định số lượng widget tối đa mà section có thể chứa. Nếu không đề cập có nghĩa là không giới hạn.
    VD: <b:section id="MySection" maxwidget="1">.
  • showaddelement: Chỉ có 2 giá trị là "yes" hay "no" (mặc định là "yes". Nó quy định tại trang Edit Layout có hiển thị liên kết "Add a Page Element" cho section này không.
    VD: <b:section id="MySection" showaddelement="no">.
  • growth: Cũng chỉ có 2 giá trị là "horizontal" (ngang) hay "vertical" (dọc) (mặc định là "vertical"). Nó quy định cách mà các widget xuất hiện (hàng dọc hay ngang).
    VD: <b:section id="MySection" growth="horizontal">


Nằm trong <b:section> bắt buộc phải là thẻ <b:widget>, những thẻ khác sẽ không được chấp nhận

Thẻ <b:widget>
Widget là những phần add-on có thể quản lý được trong trang Edit Layout. Nó có các thuộc tính sau:

  • id: (bắt buộc) có ý nghĩa như tên của widget đó. Không thể có 2 widget cùng tên. ID của widget sau khi tạo, không thể thay đổi được trừ khi bạn xóa vào tạo lại một widget khác.

  • type: (bắt buộc) Nó xác định kiểu widget.

  • locked: có 2 giá trị "yes" hoặc "no" (mặc định là "no"). Nếu bạn trong "yes" thì widget này không thể xóa hay di chuyển trong trang Edit Layout.

  • title: Hiện tên của widget khi nó xuất hiện trên trang blog. Nếu bạn bỏ trống thì Blogger sẽ sử dụng một cái tên tự động kiểu HTML1, List2...

  • pageType: Có thể là "all", "archive", "main", hay "item" (mặc định là "all"). Widget này sẽ chỉ hiển thị ở loại trang được xác định cho nó. Nhưng tất cả đều xuất hiện trong trang Edit Layout.

Các loại widget hiện có:
  • BlogArchive
  • Blog
  • Feed
  • Header
  • HTML
  • SingleImage
  • LinkList
  • List
  • Logo
  • BlogProfile
  • Navbar
  • VideoBar
  • NewsBar


Khi bạn bấm nút , tất cả các thẻ <b:section> và <b:widget> sẽ được chuyển thành <div> với ID tương ứng. ID này sẽ cùng với định dạng trong phần CSS của bạn để hiển thị đúng trên màn hình.

Hết phần 1
Phần 2 sẽ nói về các biên tập một widget với thẻ <b:includable>