Bạn,
Nếu bạn xem được trang Học Trò Việt và thấy giao diện mới, chúc mừng bạn: bạn có một browser "hại điện". Bạn có thể thử trên trang bạn một trong bẩy cách nhìn từ cái sidebar menu. Tôi phân vân không biết chọn cái nào để dùng cho blog, cuối cùng đành chọn cái mà bạn thấy dưới đây:
Nếu bạn không có browser đời mới thì cũng không sao, bạn sẽ được dẫn tới trang đời cũ:
Tôi là người khoái thử mấy thứ đồ mới của Blogger, và lần này tính năng Dynamic View thật sự cuốn hút tôi!!! It blows my mind away, so to speak!
Bạn có blog mà muốn sửa theo cũng dễ, trước tiên là phải chọn cái "feed" là full thì mới chạy được:
Thay ở Dashboard kiểu mới:
hay kiểu cũ:
Sau đó vào Design, chọn Template Designer, thì bạn sẽ thấy hình đầu tiên có tên là Dynamic View:
Thế là xong.
Cái bất tiện hiện nay là dynamic view chưa cho phép cài đặt javascript, nên cái Yahoo Media Palyer nghe nhạc của tôi hiện chưa sử dụng được, hy vọng Blogger sẽ cho phép thêm javascript vào trong tương lai.
Xem thông tin đầy đủ về Dynamic View ở đây:
http://buzz.blogger.com/2011/09/dynamic-views-seven-new-ways-to-share.html
Chúc bạn một ngày thật an lành,
Hoctro
Hiển thị các bài đăng có nhãn Mẹo làm Blog. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Mẹo làm Blog. Hiển thị tất cả bài đăng
Thứ Năm, 29 tháng 9, 2011
Thứ Sáu, 1 tháng 7, 2011
Làm thế nào để chèn code nghe nhạc mp3 & YouTube trên blog?
Bạn,
Sau khi đi tìm tòi lục lọi, tôi tìm ra một cái player cho phép làm một listing với nhiều bài, khi ấn vào link khác thì nó đổi bài.
http://mediaplayer.yahoo.com/
Muốn thêm vào rất dễ nếu bạn biết HTML. Bạn vào phần <head> tag, tìm chỗ trước </head> rồi thêm vào dòng này:
Để ở chỗ đó rất lợi vì bạn khỏi phải bận tâm về chuyện lắp player nữa, từ giờ trở đi nó có sẵn trong blog.
Sau đó là thêm vào các links (bên trang EditHTML):
Chúc bạn thành công .
Làm thử:
Happy 4th of July!!!
Sau khi đi tìm tòi lục lọi, tôi tìm ra một cái player cho phép làm một listing với nhiều bài, khi ấn vào link khác thì nó đổi bài.
http://mediaplayer.yahoo.com/
Muốn thêm vào rất dễ nếu bạn biết HTML. Bạn vào phần <head> tag, tìm chỗ trước </head> rồi thêm vào dòng này:
<script type="text/javascript" src="http://webplayer.yahooapis.com/player.js"></script>
Để ở chỗ đó rất lợi vì bạn khỏi phải bận tâm về chuyện lắp player nữa, từ giờ trở đi nó có sẵn trong blog.
Sau đó là thêm vào các links (bên trang EditHTML):
<ul>
<a href="http://www.phamduy2010.com/phamduy50/chichungdothoi_nguyenthao.mp3">Chỉ Chừng Đó Thôi - Nguyên Thảo trình bày</a>
<a href="http://www.phamduy2010.com/phamduy50/chuyentinhbuon_bangkieu.mp3">Chuyện Tình Buồn - Bằng Kiều trình bày</a>
<a href="http://www.phamduy2010.com/phamduy50/cohaimo_TanMinh.mp3">Cô Hái Mơ - Tấn Minh trình bày</a>
</ul>
Chúc bạn thành công .
Làm thử:
Happy 4th of July!!!
Thứ Sáu, 6 tháng 5, 2011
Cách lưu trữ blog để xem dưới dạng PDF
Bạn,
Có khi nào bạn cảm thấy cần lưu trữ bài viết của blog bạn, hoặc tải bài viết của người khác về máy mình để xem offline không? Tôi có tìm ra một cách và hay dùng nó, hôm nay muốn chia xẻ với bạn.
Chúng ta sẽ dùng một cách rất thường gặp trong các sở làm hiện tại, đó là in trang bằng PDF "distiller". Nếu bạn đã có software PDF Professional 9.0 trên máy, thì khi in, và chọn "PDF Distiller" thì máy sẽ hỏi bạn save vào máy dưới tên file là gì. Thế là xong.
Nhưng trong bài viết này tôi giả sử bạn không có software này. Vậy việc trước tiên là chúng ta sẽ cài đặt một phần mềm miễn phí tên là CutePDF có thể save một trang web dưới dạng pdf, tương tự như PDF Distiller. Nhưng CutePDF cần có GhostScript trước, vậy hãy vào trang sau
http://www.cutepdf.com/Products/CutePDF/writer.asp
Bước 1 là cài đặt software GhostScript này. Hãy ấn vào chữ Free Converter để cài đặt.
Bước 2 là cài đặt CutePDF.
Ấn vào Free Download cũng trong hình trên để tải về và lắp.
Nếu lắp thành công, bạn thử in một trang web bằng cách chọn Print preview, ấn vào nút Print, rồi chọn CutePDF Writer khi chọn printer name
Máy sẽ hỏi bạn muốn tên của PDF là gì, và để ở đâu. Bạn điền tên vào dưới folder muốn chứa rồi ấn OK là xong.
Bây giờ mới tới phần "Mẹo làm blog". Nếu bây giờ tôi thử in trang của tôi ngay thì sẽ thấy như vầy trong phần Print preview:
Bạn thấy là nội dung chẳng có gì hết! Vầy làm sao in?
May thay, trong blogger có khái niệm gọi là feed, là một dòng (stream) của các chữ và hình ảnh của nội dung không thôi, chứ không có các thứ khác, như các widgets chẳng hạn.
Nếu gọi feed của trang hoctroviet thì đây là cú pháp, thêm vào là phần in đậm:
http://hoctroviet.blogspot.com/feeds/posts/default
và đây là kết quả:
Điều bất tiện là feed chỉ có cho in ra 25 posts mới sửa hay thêm vào nhất mà thôi, do đó muốn in ra toàn bộ sự nghiệp văn chương trên blog bạn thì phải thêm vào cú pháp max-results như sau:
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=1000
thì máy sẽ tải về hết 1000 (một ngàn) posts của bạn!
Nếu trang ấy khi in xong quá lớn, mà ta lại muốn dung lượng pdf nhỏ, để upload lên đâu đó, thì ta phải dùng thêm một thành tố nữa, là start-index. Thí dụ như tôi có trên 200 posts, và muốn chia làm 3 tập, mỗi tập 100 bài, thì tôi sẽ làm như sau:
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=1
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=101
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=201
Bạn thấy lúc nào cũng có 100 posts, rồi tôi in bài từ index 1, 101, 201, v.v.
Bây giờ là phần khó nhất. Tỷ dụ như tôi chỉ muốn in những cái gì tôi viết mà thôi, còn bài tôi đi sưu tầm thì tôi không cần. Vậy thì tôi phải làm sao? Cách dễ nhất là để chúng vào chung một nhãn (label), như Hoctro Tản Mạn chẳng hạn. Dùng Edit Posts bạn có thể chọn nhiều bài và thêm nhãn cùng lúc:
Sau đó bạn cũng dùng các thành tố max-results và start-index như đã trình bày, nhưng phần đầu trước dấu hỏi thì phải là nhãn. thí dụ như tôi muốn in hết các bài tôi đã "tám" thì phải làm như sau:
http://hoctroviet.blogspot.com/feeds/posts/default/-/Hoctro Tản Mạn?max-results=1000
Tôi có phân loại các bài viết của tôi, được trên 200 bài, in lại thành PDF, và upload lên chỗ này, cùng một số tài liệu khác, nếu bạn muốn xem chất lượng PDF thì mời vào xem (hoctroviet_01, 02 và 03):
http://sites.google.com/site/hoctroarticles/
Hy vọng bài chỉ dẫn này sẽ có ích cho bạn để bạn có thể mang tài liệu của bạn cũng như của blogger khác về xem offline khi rảnh rỗi.
Thân mến,
Hoctro
6 May 2011
Có khi nào bạn cảm thấy cần lưu trữ bài viết của blog bạn, hoặc tải bài viết của người khác về máy mình để xem offline không? Tôi có tìm ra một cách và hay dùng nó, hôm nay muốn chia xẻ với bạn.
Chúng ta sẽ dùng một cách rất thường gặp trong các sở làm hiện tại, đó là in trang bằng PDF "distiller". Nếu bạn đã có software PDF Professional 9.0 trên máy, thì khi in, và chọn "PDF Distiller" thì máy sẽ hỏi bạn save vào máy dưới tên file là gì. Thế là xong.
Nhưng trong bài viết này tôi giả sử bạn không có software này. Vậy việc trước tiên là chúng ta sẽ cài đặt một phần mềm miễn phí tên là CutePDF có thể save một trang web dưới dạng pdf, tương tự như PDF Distiller. Nhưng CutePDF cần có GhostScript trước, vậy hãy vào trang sau
http://www.cutepdf.com/Products/CutePDF/writer.asp
Bước 1 là cài đặt software GhostScript này. Hãy ấn vào chữ Free Converter để cài đặt.
Bước 2 là cài đặt CutePDF.
Ấn vào Free Download cũng trong hình trên để tải về và lắp.
Nếu lắp thành công, bạn thử in một trang web bằng cách chọn Print preview, ấn vào nút Print, rồi chọn CutePDF Writer khi chọn printer name
Máy sẽ hỏi bạn muốn tên của PDF là gì, và để ở đâu. Bạn điền tên vào dưới folder muốn chứa rồi ấn OK là xong.
Bây giờ mới tới phần "Mẹo làm blog". Nếu bây giờ tôi thử in trang của tôi ngay thì sẽ thấy như vầy trong phần Print preview:
Bạn thấy là nội dung chẳng có gì hết! Vầy làm sao in?
May thay, trong blogger có khái niệm gọi là feed, là một dòng (stream) của các chữ và hình ảnh của nội dung không thôi, chứ không có các thứ khác, như các widgets chẳng hạn.
Nếu gọi feed của trang hoctroviet thì đây là cú pháp, thêm vào là phần in đậm:
http://hoctroviet.blogspot.com/feeds/posts/default
và đây là kết quả:
Khi in thì chữ cũng rõ ràng, và ta có thể chỉnh chiều cao của chữ bằng cách dùng dropdown box in tỉ lệ:
Điều bất tiện là feed chỉ có cho in ra 25 posts mới sửa hay thêm vào nhất mà thôi, do đó muốn in ra toàn bộ sự nghiệp văn chương trên blog bạn thì phải thêm vào cú pháp max-results như sau:
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=1000
thì máy sẽ tải về hết 1000 (một ngàn) posts của bạn!
Nếu trang ấy khi in xong quá lớn, mà ta lại muốn dung lượng pdf nhỏ, để upload lên đâu đó, thì ta phải dùng thêm một thành tố nữa, là start-index. Thí dụ như tôi có trên 200 posts, và muốn chia làm 3 tập, mỗi tập 100 bài, thì tôi sẽ làm như sau:
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=1
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=101
http://hoctroviet.blogspot.com/feeds/posts/default?max-results=100&start-index=201
Bạn thấy lúc nào cũng có 100 posts, rồi tôi in bài từ index 1, 101, 201, v.v.
Bây giờ là phần khó nhất. Tỷ dụ như tôi chỉ muốn in những cái gì tôi viết mà thôi, còn bài tôi đi sưu tầm thì tôi không cần. Vậy thì tôi phải làm sao? Cách dễ nhất là để chúng vào chung một nhãn (label), như Hoctro Tản Mạn chẳng hạn. Dùng Edit Posts bạn có thể chọn nhiều bài và thêm nhãn cùng lúc:
Sau đó bạn cũng dùng các thành tố max-results và start-index như đã trình bày, nhưng phần đầu trước dấu hỏi thì phải là nhãn. thí dụ như tôi muốn in hết các bài tôi đã "tám" thì phải làm như sau:
http://hoctroviet.blogspot.com/feeds/posts/default/-/Hoctro Tản Mạn?max-results=1000
Tôi có phân loại các bài viết của tôi, được trên 200 bài, in lại thành PDF, và upload lên chỗ này, cùng một số tài liệu khác, nếu bạn muốn xem chất lượng PDF thì mời vào xem (hoctroviet_01, 02 và 03):
http://sites.google.com/site/hoctroarticles/
Hy vọng bài chỉ dẫn này sẽ có ích cho bạn để bạn có thể mang tài liệu của bạn cũng như của blogger khác về xem offline khi rảnh rỗi.
Thân mến,
Hoctro
6 May 2011
Thứ Năm, 28 tháng 4, 2011
Blogging với "Stats" ... vài kỷ niệm ...
Bạn,
Nếu để ý, bạn sẽ thấy tôi cố tình không để cái "Recent Comments" widget, vì rất bận việc làm ở sở và không có thì giờ nhiều để lên net, nếu không trả lời hay trả lời chậm thì thất lễ với bạn đọc, còn trả lời nhiều quá cũng ... mệt :-)
Tuy nhiên, với bản tính tò mò cố hữu, tôi rất hay vào xem trang Fedjit mà tôi có account: http://live.feedjit.com/live/hoctroviet.blogspot.com/0/ để xem những bạn đọc đến từ đâu, đã đánh vào Google những chữ gì để tới được trang tôi. Gần 1 năm nay, đa số bạn đọc đến với trang tôi là do truy tìm những nhạc sĩ, ca sĩ, và nhiều nhất là "cach sang tac nhac". Kể cũng vui vì tôi chưa có sáng tác được một bài nào hết, mà người ta đến là vì những bài tôi viết tìm hiểu nhạc Phạm Duy, Trịnh Công Sơn, và gần đây là các bài dịch sang Việt Ngữ của nhà báo Trường Kỳ.
Tự nhiên trên một tuần nay số trang xem của tôi tăng vọt từ 300+/- một ngày, lên đến 700+ hay 800+. Không biết tôi có viết gì khác lạ hay không mà tăng dữ thần vậy. Tôi để ý thấy có một số bạn đến từ các email links để đọc bài viết tôi sưu tầm là Người Đàn Bà Trên Tầu 502: http://hoctroviet.blogspot.com/2010/04/nguoi-ba-tren-tau-502.html. Tôi chợt nhớ ra là chỉ còn 2 ngày nữa là tới ngày Tháng Tư Đen, mau quá, ai sinh ngày đó giờ đã 36 tuổi rồi, có khi là tỷ tỷ phú rồi như anh chàng CEO của Facebook không chừng.
Trở lại chuyện blog, sau đây là hình ảnh minh họa lượng người xem của blog trong tuần qua, gồm 10 bài xem nhiều nhất:
rồi hình ảnh lượng người xem trong tháng tự nhiên tăng lên:
rồi các trang referring đến nhiều nhất từ Google ở Việt Nam:
Tôi để ý thấy có hai điều quan trọng để thu hút đọc giả:
1. Cái tựa bài: cái tựa bài càng ngắn gọn, đủ ý là nhiều đọc giả càng xem, cái gì nói chung chung như "tản Mạn", "Chuyện Cuối Tuần" coi bộ ít thu hút.
2. Thu hẹp sở trường: trước kia người ta đến xem có thể vì thích sửa widget, vì tôi có làm một trang nay đã bị tôi "ruồng bỏ" là trang http://hoctro.blogspot.com viết tiếng Anh cho bạn bè thế giới xem. Nay thì tôi cũng chán làm widget, nên thôi để đó để ai muốn xem các hacks cũ thì có chỗ tham khảo. Riêng rang hoctroviet này tôi chú tâm vào việc chọn bài viết hay về nhạc Việt Nam trên mạng thì mang (cất èn pết) về, hay là cũng viết một số bài viết linh tinh cảm nghĩ về Nhạc nữa. Tôi thấy có nhiều blog viết và posts đủ thứ, không biết có nhiều người đến xem không?
Ngoài ra cái counter cũng cho thấy trên 100000 lượt người đã xem bài viết, cũng nhiều cỡ lượng người xem một hay hai trận banh trên sân túc cầu! Tôi cũng vui lắm và cũng hy vọng đọc giả cũng sẽ biết thêm ít nhiều với những links và những suy nghĩ vụn vặt của tôi.
Khi nào thì tôi biết "I made it!", là khi có người google đích danh trang nhạc Pháp tôi làm, cũng như khi thấy các bạn log vào directly, tức là đã bookmark trang tôi để đọc.
Nói gì thì nói chứ nếu bạn đọc có cho ý kiến thì thế nào tôi cũng sẽ trả lời thư của bạn, nên mong bạn cứ tự nhiên góp ý kiến, tôi hứa sẽ "tiếp thu" :-)
Chúc bạn một ngày vui khỏe.
Thân ái,
Hoctro
4/28/11
Nếu để ý, bạn sẽ thấy tôi cố tình không để cái "Recent Comments" widget, vì rất bận việc làm ở sở và không có thì giờ nhiều để lên net, nếu không trả lời hay trả lời chậm thì thất lễ với bạn đọc, còn trả lời nhiều quá cũng ... mệt :-)
Tuy nhiên, với bản tính tò mò cố hữu, tôi rất hay vào xem trang Fedjit mà tôi có account: http://live.feedjit.com/live/hoctroviet.blogspot.com/0/ để xem những bạn đọc đến từ đâu, đã đánh vào Google những chữ gì để tới được trang tôi. Gần 1 năm nay, đa số bạn đọc đến với trang tôi là do truy tìm những nhạc sĩ, ca sĩ, và nhiều nhất là "cach sang tac nhac". Kể cũng vui vì tôi chưa có sáng tác được một bài nào hết, mà người ta đến là vì những bài tôi viết tìm hiểu nhạc Phạm Duy, Trịnh Công Sơn, và gần đây là các bài dịch sang Việt Ngữ của nhà báo Trường Kỳ.
Tự nhiên trên một tuần nay số trang xem của tôi tăng vọt từ 300+/- một ngày, lên đến 700+ hay 800+. Không biết tôi có viết gì khác lạ hay không mà tăng dữ thần vậy. Tôi để ý thấy có một số bạn đến từ các email links để đọc bài viết tôi sưu tầm là Người Đàn Bà Trên Tầu 502: http://hoctroviet.blogspot.com/2010/04/nguoi-ba-tren-tau-502.html. Tôi chợt nhớ ra là chỉ còn 2 ngày nữa là tới ngày Tháng Tư Đen, mau quá, ai sinh ngày đó giờ đã 36 tuổi rồi, có khi là tỷ tỷ phú rồi như anh chàng CEO của Facebook không chừng.
Trở lại chuyện blog, sau đây là hình ảnh minh họa lượng người xem của blog trong tuần qua, gồm 10 bài xem nhiều nhất:
rồi hình ảnh lượng người xem trong tháng tự nhiên tăng lên:
rồi các trang referring đến nhiều nhất từ Google ở Việt Nam:
Tôi để ý thấy có hai điều quan trọng để thu hút đọc giả:
1. Cái tựa bài: cái tựa bài càng ngắn gọn, đủ ý là nhiều đọc giả càng xem, cái gì nói chung chung như "tản Mạn", "Chuyện Cuối Tuần" coi bộ ít thu hút.
2. Thu hẹp sở trường: trước kia người ta đến xem có thể vì thích sửa widget, vì tôi có làm một trang nay đã bị tôi "ruồng bỏ" là trang http://hoctro.blogspot.com viết tiếng Anh cho bạn bè thế giới xem. Nay thì tôi cũng chán làm widget, nên thôi để đó để ai muốn xem các hacks cũ thì có chỗ tham khảo. Riêng rang hoctroviet này tôi chú tâm vào việc chọn bài viết hay về nhạc Việt Nam trên mạng thì mang (cất èn pết) về, hay là cũng viết một số bài viết linh tinh cảm nghĩ về Nhạc nữa. Tôi thấy có nhiều blog viết và posts đủ thứ, không biết có nhiều người đến xem không?
Ngoài ra cái counter cũng cho thấy trên 100000 lượt người đã xem bài viết, cũng nhiều cỡ lượng người xem một hay hai trận banh trên sân túc cầu! Tôi cũng vui lắm và cũng hy vọng đọc giả cũng sẽ biết thêm ít nhiều với những links và những suy nghĩ vụn vặt của tôi.
Khi nào thì tôi biết "I made it!", là khi có người google đích danh trang nhạc Pháp tôi làm, cũng như khi thấy các bạn log vào directly, tức là đã bookmark trang tôi để đọc.
Nói gì thì nói chứ nếu bạn đọc có cho ý kiến thì thế nào tôi cũng sẽ trả lời thư của bạn, nên mong bạn cứ tự nhiên góp ý kiến, tôi hứa sẽ "tiếp thu" :-)
Chúc bạn một ngày vui khỏe.
Thân ái,
Hoctro
4/28/11
Thứ Tư, 27 tháng 4, 2011
Cách nghe nhạc YouTube theo trang Hoctroviet
Bạn,
Theo lời yêu cầu của bạn HT, tôi "bật mí" cho các bạn (lần nữa) cách chèn mã vào trong trang nhà của bạn để bạn có thể nghe nhiều nhạc mà không cần phải chèn (embed) nhiều windows.
Lưu ý: Sáng nay (27 tháng 4) do hơi vội nên tôi chép thiếu hai dòng (chỗ chữ xanh bước 2), nếu bạn nào lỡ thử dùng mà không được cho tôi gửi lời xin lỗi. Tôi đã sửa lại và thử dùng mã mới thêm vào và lắp thành công trang này. Thời gian lắp ít hơn 5 phút nếu bạn từ từ làm, còn tôi vì biết chỗ nào lắp vào rồi thì chỉ tốn dưới 1 phút là xong. (Hoctro)
Bước 1: Mở trang Design, vào Edit HTML rồi chèn đoạn mã này ngay ở đầu:
Tiếp theo, thêm vào bước 2 ở gần cuối khung, ngay trước trang tag /body:
<!-- Bước 2: Chèn một table chứa mã để hiển thị video -->
<table align='center' width='90%'>
<tr>
<td align='left' width='120%'>
<b><span id='videoHeader' style='color:#fff;'>...</span></b>
</td>
<td align='right' width='20%'><a href='javascript:void(0);' onclick='genRandom();' style='color:#fff;'> Skip</a></td>
</tr>
</table>
</div>
<div id='videoDiv'>Loading... </div>
</div>
<!-- Hết bước 2 - Nhớ chèn toàn bộ bước này trước tag /body -->
Bước 3: Cách tạo các links chứa bài:
Quy tắc #1: các bài phải nằm trong một div có class="post-body" mới chạy liên tục được. Nếu các nhãn nằm trong thân bài thì khỏi cần làm điều này vì thân bài đã là class="post-body" rồi.
Thí dụ như các links sau là thân bài, nên khỏi cần chèn (hình lấy từ trang nhạc Paul Mauriat)
còn các links sau phải chèn div với class="post-body" vì là một widget ngoài phần "body". Hình lấy từ widget "Raymond Lefevre" tôi mới lắp thêm.
<li><a href="javascript:void(0);" onclick="loadVideo('Ni2UKwfsZEQ');">TU TE RECONNAITRAS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('NUXkAnEq7VI');">MY LOVE </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('D4Exp08zZXQ');">UN GRANDE AMORE E NIENTE PIU </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('J3SJ0RwXTqM');">REVIENS MON AMOUR REVIENS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('WmhOn2RXys0');">NOUS IRONS A VERONE </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('sxI7jrqTrso')">Ainsi Soit-Il (1977)</a></li>
</ul>
</div>
Quy tắc #2: tạo các links.
Trong trang của mình, thêm vào tag "a" với href có cái ID của bài nhạc mình muốn nghe, thí dụ như:
<li><a href="javascript:void(0);" onclick="loadVideo('lOMhkGZdujY');">VOUS LES FEMMES (You the Women) (02:02)(Enrique Macias / P.-R. Blanc & Jacques Demarny)</a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('-JutiwteRj8');">N'AVOUE JAMAIS (I Wanna Know) (02:01)(Guy Mardel - Francoise Dorin)</a></li>
Ngoài ra, bạn còn có thể bắt đầu bài nhạc từ số giây, thí dụ như bài Dancing on the ceiling dưới đây tôi cho bắt đầu từ 20 giây bằng cách them vào:
loadVideo('OdQDXs75Ulo',20);
và nếu bài nhạc không cho embed như bài Beat It, tôi cũng có thể mở một window để xem :-) Bạn phải dùng một function mới là loadVideoWindow, (thay vì chỉ là loadVideo)
loadVideoWindow('Uqxo1SKB0z8');
Hãy xem các biến thể đó ở đoạn sau:
"In 1985, a team of superstars gathered together to record the song"We Are the World". The song itself was a collaboration between Michael Jackson ((Beat It) and Lionel Richie (Hello, Dancing on the ceiling, etc.)"
Chúc bạn thành công, có gì thì hỏi ngay ở trang này.
Thân mến,
Hoctro
Theo lời yêu cầu của bạn HT, tôi "bật mí" cho các bạn (lần nữa) cách chèn mã vào trong trang nhà của bạn để bạn có thể nghe nhiều nhạc mà không cần phải chèn (embed) nhiều windows.
Lưu ý: Sáng nay (27 tháng 4) do hơi vội nên tôi chép thiếu hai dòng (chỗ chữ xanh bước 2), nếu bạn nào lỡ thử dùng mà không được cho tôi gửi lời xin lỗi. Tôi đã sửa lại và thử dùng mã mới thêm vào và lắp thành công trang này. Thời gian lắp ít hơn 5 phút nếu bạn từ từ làm, còn tôi vì biết chỗ nào lắp vào rồi thì chỉ tốn dưới 1 phút là xong. (Hoctro)
Bước 1: Mở trang Design, vào Edit HTML rồi chèn đoạn mã này ngay ở đầu:
<!-- Bước 1: bắt đầu chèn mã từ chỗ này -->
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<link href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5//themes/base/jquery.ui.all.css' rel='stylesheet'/>
<!-- Đây là CSS để sửa vị trí và các chiều ngang và dọc của youtube -->
<style>
#videoDiv { margin-right: 3px;}
#videoInfo {margin-left: 3px;}
#content-links {RIGHT: 5px; WIDTH: 480px; height: 380px; POSITION: fixed; BOTTOM: 6px}
</style>
<!-- Đây là các lệnh gọi các fuctions của các libraries chính -->
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<script type='text/javascript'>
google.load("swfobject", "2.1");
</script>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js' type='text/javascript'/>
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<!-- Đây là youtube code -->
<script type='text/javascript'>//<![CDATA[
var urls = [];
var incr = 0;
var total = "";
var titles = [];
var skip = 0;
function getParams() {
$('div.post-body a[onclick]').each(function(i) {
urls[i] = $(this).attr('onclick');
titles[i] = $(this).html();
skip = 0;
}); // each
// alert(total);
}
// Callback main function
$(document).ready(function() {
getParams() ;
$('div.post-body a[onclick]').click(function() {
var $element = $(this);
updateHTML('videoHeader', $element.html());
});
}); // function
//]]>
</script>
<script type='text/javascript'>
/*
* Change out the video that is playing
*/
// Update a particular HTML element with a new value
function updateHTML(elmId, value) {
document.getElementById(elmId).innerHTML = value;
}
// Make the Youtube player visible or not. Basically at loading time it
// should be off, and only be on whenever the first video is clicked.
function ytVisible(value) {
attr = (value == true) ? "visible" : "hidden";
document.getElementById("ytPlayer").style.visibility = attr;
document.getElementById("content-links").style.visibility = attr;
}
// Loads the selected video into the player.
function loadVideo(id, num) {
if(ytplayer) {
ytVisible(true);
if (!num) num=0;
ytplayer.loadVideoById(id, num);
//updateHTML('videoHeader', "");
}
else // Flash not allowed, call loadVideoWindow
{
loadVideoWindow(id);
}
}
// Open a new window in case the video doesn't allow embedding
// or for peaceful degradation purposes
function loadVideoWindow(id) {
var ytlink;
var newwindow;
ytlink = "http://www.youtube.com/watch?v=" + id;
newwindow=window.open(ytlink,'name','height=600,width=700');
if (window.focus) {newwindow.focus()}
}
// This function is called when an error is thrown by the player
function onPlayerError(errorCode) {
skip++;
if (skip < 5) genRandom();
// alert("An error occured of type:" + errorCode);
}
function genRandom() {
var randomNumber=Math.floor(Math.random()*(urls.length-1));
urls[randomNumber].apply();
updateHTML('videoHeader', titles[randomNumber]);
}
// This function is called when an error is thrown by the player
function onStateChange(errorCode) {
if (errorCode == 0) { // current vid is ended
// Best line ever!!!
genRandom();
}
}
// This function is automatically called by the player once it loads
function onYouTubePlayerReady(playerId) {
ytplayer = document.getElementById("ytPlayer");
ytplayer.addEventListener("onError", "onPlayerError");
ytplayer.addEventListener("onStateChange", "onStateChange");
ytVisible(false);
}
// The "main method" of this sample. Called when someone clicks "Run".
function loadPlayer() {
// The video to load
var videoID = "aym9D3xYzrs"
// Lets Flash from another domain call JavaScript
var params = { allowScriptAccess: "always" };
// The element id of the Flash embed
var atts = { id: "ytPlayer" };
// All of the magic handled by SWFObject (http://code.google.com/p/swfobject/)
swfobject.embedSWF("http://www.youtube.com/v/" + videoID +
"&enablejsapi=1&border=1&color1=0x2b405b&color2=0x6b8ab6&playerapiid=player1", "videoDiv", "480", "350", "8", null, null, params, atts);
}
function _run() {
loadPlayer();
}
google.setOnLoadCallback(_run);
</script>
<!-- Hết bước 1 -->
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<link href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5//themes/base/jquery.ui.all.css' rel='stylesheet'/>
<!-- Đây là CSS để sửa vị trí và các chiều ngang và dọc của youtube -->
<style>
#videoDiv { margin-right: 3px;}
#videoInfo {margin-left: 3px;}
#content-links {RIGHT: 5px; WIDTH: 480px; height: 380px; POSITION: fixed; BOTTOM: 6px}
</style>
<!-- Đây là các lệnh gọi các fuctions của các libraries chính -->
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<script type='text/javascript'>
google.load("swfobject", "2.1");
</script>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js' type='text/javascript'/>
<script src='http://www.google.com/jsapi' type='text/javascript'/>
<!-- Đây là youtube code -->
<script type='text/javascript'>//<![CDATA[
var urls = [];
var incr = 0;
var total = "";
var titles = [];
var skip = 0;
function getParams() {
$('div.post-body a[onclick]').each(function(i) {
urls[i] = $(this).attr('onclick');
titles[i] = $(this).html();
skip = 0;
}); // each
// alert(total);
}
// Callback main function
$(document).ready(function() {
getParams() ;
$('div.post-body a[onclick]').click(function() {
var $element = $(this);
updateHTML('videoHeader', $element.html());
});
}); // function
//]]>
</script>
<script type='text/javascript'>
/*
* Change out the video that is playing
*/
// Update a particular HTML element with a new value
function updateHTML(elmId, value) {
document.getElementById(elmId).innerHTML = value;
}
// Make the Youtube player visible or not. Basically at loading time it
// should be off, and only be on whenever the first video is clicked.
function ytVisible(value) {
attr = (value == true) ? "visible" : "hidden";
document.getElementById("ytPlayer").style.visibility = attr;
document.getElementById("content-links").style.visibility = attr;
}
// Loads the selected video into the player.
function loadVideo(id, num) {
if(ytplayer) {
ytVisible(true);
if (!num) num=0;
ytplayer.loadVideoById(id, num);
//updateHTML('videoHeader', "");
}
else // Flash not allowed, call loadVideoWindow
{
loadVideoWindow(id);
}
}
// Open a new window in case the video doesn't allow embedding
// or for peaceful degradation purposes
function loadVideoWindow(id) {
var ytlink;
var newwindow;
ytlink = "http://www.youtube.com/watch?v=" + id;
newwindow=window.open(ytlink,'name','height=600,width=700');
if (window.focus) {newwindow.focus()}
}
// This function is called when an error is thrown by the player
function onPlayerError(errorCode) {
skip++;
if (skip < 5) genRandom();
// alert("An error occured of type:" + errorCode);
}
function genRandom() {
var randomNumber=Math.floor(Math.random()*(urls.length-1));
urls[randomNumber].apply();
updateHTML('videoHeader', titles[randomNumber]);
}
// This function is called when an error is thrown by the player
function onStateChange(errorCode) {
if (errorCode == 0) { // current vid is ended
// Best line ever!!!
genRandom();
}
}
// This function is automatically called by the player once it loads
function onYouTubePlayerReady(playerId) {
ytplayer = document.getElementById("ytPlayer");
ytplayer.addEventListener("onError", "onPlayerError");
ytplayer.addEventListener("onStateChange", "onStateChange");
ytVisible(false);
}
// The "main method" of this sample. Called when someone clicks "Run".
function loadPlayer() {
// The video to load
var videoID = "aym9D3xYzrs"
// Lets Flash from another domain call JavaScript
var params = { allowScriptAccess: "always" };
// The element id of the Flash embed
var atts = { id: "ytPlayer" };
// All of the magic handled by SWFObject (http://code.google.com/p/swfobject/)
swfobject.embedSWF("http://www.youtube.com/v/" + videoID +
"&enablejsapi=1&border=1&color1=0x2b405b&color2=0x6b8ab6&playerapiid=player1", "videoDiv", "480", "350", "8", null, null, params, atts);
}
function _run() {
loadPlayer();
}
google.setOnLoadCallback(_run);
</script>
<!-- Hết bước 1 -->
Tiếp theo, thêm vào bước 2 ở gần cuối khung, ngay trước trang tag /body:
<!-- Bước 2: Chèn một table chứa mã để hiển thị video -->
<div id='content-links'>
<div style='background-color:#000;'><table align='center' width='90%'>
<tr>
<td align='left' width='120%'>
<b><span id='videoHeader' style='color:#fff;'>...</span></b>
</td>
<td align='right' width='20%'><a href='javascript:void(0);' onclick='genRandom();' style='color:#fff;'> Skip</a></td>
</tr>
</table>
</div>
<div id='videoDiv'>Loading... </div>
</div>
<!-- Hết bước 2 - Nhớ chèn toàn bộ bước này trước tag /body -->
Bước 3: Cách tạo các links chứa bài:
Quy tắc #1: các bài phải nằm trong một div có class="post-body" mới chạy liên tục được. Nếu các nhãn nằm trong thân bài thì khỏi cần làm điều này vì thân bài đã là class="post-body" rồi.
Thí dụ như các links sau là thân bài, nên khỏi cần chèn (hình lấy từ trang nhạc Paul Mauriat)
còn các links sau phải chèn div với class="post-body" vì là một widget ngoài phần "body". Hình lấy từ widget "Raymond Lefevre" tôi mới lắp thêm.
<div class="post-body" >
<ul>
<li><a href="javascript:void(0);" onclick="loadVideo('9bGyrIciQHk');">VIENS VIENS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('9bGyrIciQHk');">VIENS VIENS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('Ni2UKwfsZEQ');">TU TE RECONNAITRAS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('NUXkAnEq7VI');">MY LOVE </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('D4Exp08zZXQ');">UN GRANDE AMORE E NIENTE PIU </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('J3SJ0RwXTqM');">REVIENS MON AMOUR REVIENS </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('WmhOn2RXys0');">NOUS IRONS A VERONE </a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('sxI7jrqTrso')">Ainsi Soit-Il (1977)</a></li>
</ul>
</div>
Quy tắc #2: tạo các links.
Trong trang của mình, thêm vào tag "a" với href có cái ID của bài nhạc mình muốn nghe, thí dụ như:
<li><a href="javascript:void(0);" onclick="loadVideo('lOMhkGZdujY');">VOUS LES FEMMES (You the Women) (02:02)(Enrique Macias / P.-R. Blanc & Jacques Demarny)</a></li>
<li><a href="javascript:void(0);" onclick="loadVideo('-JutiwteRj8');">N'AVOUE JAMAIS (I Wanna Know) (02:01)(Guy Mardel - Francoise Dorin)</a></li>
Ngoài ra, bạn còn có thể bắt đầu bài nhạc từ số giây, thí dụ như bài Dancing on the ceiling dưới đây tôi cho bắt đầu từ 20 giây bằng cách them vào:
loadVideo('OdQDXs75Ulo',20);
và nếu bài nhạc không cho embed như bài Beat It, tôi cũng có thể mở một window để xem :-) Bạn phải dùng một function mới là loadVideoWindow, (thay vì chỉ là loadVideo)
loadVideoWindow('Uqxo1SKB0z8');
Hãy xem các biến thể đó ở đoạn sau:
"In 1985, a team of superstars gathered together to record the song"We Are the World". The song itself was a collaboration between Michael Jackson ((Beat It) and Lionel Richie (Hello, Dancing on the ceiling, etc.)"
Thân mến,
Hoctro
Chủ Nhật, 23 tháng 1, 2011
Fonts mới cho Bloggers!!!
Bạn,
Như bạn đang thấy "live" trên trang Hoctroviet, cách đây 3 ngày (1/20/2011) Blogger lại trình làng một sáng tạo mới của họ, là cho phép các trang mạng có thêm các font chữ mới, họ gọi là web fonts.
Làm cái này rất dễ. Bạn vào Design->Template Designer:
Xong rồi vào Advanced, và chọn các chỗ cho phép mình sửa như tên của blog, tên của widget, v.v. Thí dụ hình sau tôi đang thay đổi font ở "tên của post", chữ đỏ.
Chúc bạn thành công!
Hoctro
1/23/2010
Như bạn đang thấy "live" trên trang Hoctroviet, cách đây 3 ngày (1/20/2011) Blogger lại trình làng một sáng tạo mới của họ, là cho phép các trang mạng có thêm các font chữ mới, họ gọi là web fonts.
Làm cái này rất dễ. Bạn vào Design->Template Designer:
Xong rồi vào Advanced, và chọn các chỗ cho phép mình sửa như tên của blog, tên của widget, v.v. Thí dụ hình sau tôi đang thay đổi font ở "tên của post", chữ đỏ.
Chúc bạn thành công!
Hoctro
1/23/2010
Thứ Hai, 6 tháng 9, 2010
Đột nhập nhà Blogger trái phép - Sherlock Hoc tường trình
Bạn,
Như thám tử Sherlock Holmes đi tìm thủ phạm vụ án, có một người lương thiện (hình như) mách tôi rằng kẻ trộm đột nhập vào blog bạn ấy, rồi gài links tùm lum.
Sau vài ngày điều tra, tôi đã tìm ra thủ phạm. Đó là feature Back links của Blogger!
Nếu setting Back links is on:
Ta sẽ thấy ai links đến nhà ta:
Vì feature "Blog links" có đường link dẫn đến post mới nhất "Great songs of The Fifties" (cuối hình 3), nên khổ chủ bên site kia sẽ có một cái link dưới "Links to this post" (hình 2)
Như thám tử Sherlock Holmes đi tìm thủ phạm vụ án, có một người lương thiện (hình như) mách tôi rằng kẻ trộm đột nhập vào blog bạn ấy, rồi gài links tùm lum.
Sau vài ngày điều tra, tôi đã tìm ra thủ phạm. Đó là feature Back links của Blogger!
Nếu setting Back links is on:
Hình 1
Ta sẽ thấy ai links đến nhà ta:
Hình 2
Vì feature "Blog links" có đường link dẫn đến post mới nhất "Great songs of The Fifties" (cuối hình 3), nên khổ chủ bên site kia sẽ có một cái link dưới "Links to this post" (hình 2)
hình 3
Hẹn bạn kỳ sau. Happy's Labor Day!
Chủ Nhật, 15 tháng 8, 2010
YouTube Mashup Tìm Kiếm Dựa Trên Label
Bạn,
Loay hoay hoài hủy cả tối, rồi cũng tìm ra cách viết code để tìm kiếm những videos liên hệ tới một label (nhãn). Ý tưởng rất đơn giản. Thay vì dùng "Label" widget để hiện lên các bài viết có nhãn ấy, tôi dùng Ajax Search API để tìm kiếm. Tôi làm hai tìm kiếm khác nhau để tạo ra hai kết quả: video và từ blog của tôi. Ấn các "tabs" để chuyển đổi. Vì tôi dùng "relevant search", kết quả trả về là kết quả giống với chữ cần tìm nhất, hệt như khi bạn dùng google.com để tìm vậy.
Tôi có gắn thử ngay sau post này, có gì bạn thử nghe.
Thế là từ nay tôi đỡ mắc công lên google tìm nhạc theo tên của các nhạc sĩ. Tôi chỉ cần gắn một label mới đâu đó trong một post vớ vẩn nào đó, et voilà!
Đây là đoạn mã tôi chèn vô, tôi lười sửa soạn lại nên "chụp" lại đây để ai thích làm thì làm theo nhé. Cũng có thể dùng View -> source để cut-and-paste những đoạn mã JavaScript, rồi đánh vào những đoạn blogger code.
Hoctro,
8/15/10
Loay hoay hoài hủy cả tối, rồi cũng tìm ra cách viết code để tìm kiếm những videos liên hệ tới một label (nhãn). Ý tưởng rất đơn giản. Thay vì dùng "Label" widget để hiện lên các bài viết có nhãn ấy, tôi dùng Ajax Search API để tìm kiếm. Tôi làm hai tìm kiếm khác nhau để tạo ra hai kết quả: video và từ blog của tôi. Ấn các "tabs" để chuyển đổi. Vì tôi dùng "relevant search", kết quả trả về là kết quả giống với chữ cần tìm nhất, hệt như khi bạn dùng google.com để tìm vậy.
Tôi có gắn thử ngay sau post này, có gì bạn thử nghe.
Thế là từ nay tôi đỡ mắc công lên google tìm nhạc theo tên của các nhạc sĩ. Tôi chỉ cần gắn một label mới đâu đó trong một post vớ vẩn nào đó, et voilà!
Đây là đoạn mã tôi chèn vô, tôi lười sửa soạn lại nên "chụp" lại đây để ai thích làm thì làm theo nhé. Cũng có thể dùng View -> source để cut-and-paste những đoạn mã JavaScript, rồi đánh vào những đoạn blogger code.
Hoctro,
8/15/10
Thứ Hai, 19 tháng 7, 2010
Thay đổi cách trình bày trang Blog
Bạn,
Hôm nay tôi đọc được một bài viết hay: How Can 10 Simple Articles Change Your Life?
http://www.pearsonified.com/2006/10/how_can_10_simple_articles_change_your_life.php
Tôi học được một điều là mình phải chú tâm vào thế mạnh của trang Hoctro Viet là giới thiệu những tính năng mới của Blogger. Theo dõi Feedjit, tôi cũng thấy đa số người tới trang Hoctroviet là nhằm một trong các mục đích sau:
1. Tải nhiều hình cùng lúc lên blog,
2. Trang trí blog (Template designer)
3. Các bài viết lượm lặt trên Net về nhạc
4. Các nhu liệu để xem và tải Youtube về máy
5. Link thẳng đến trang chính để đọc các posts mới (cám ơn các bạn ấy rất nhiều)
6. Các nguồn kết nối từ các trang bạn (cám ơn rất nhiều)
7. Những tản mạn về Âm Nhạc, học sáng tác nhạc, tạo phong cách riêng, v.v. Nhiều khi các câu "search" không ăn nhằm đến nội dung của blog, nhưng vì Google có lẽ cho ranking của blog tôi cao, nên search cứ thong thả dẫn đến trang nhà Hoctroviet, mỗi ngày trên dưới 100 người mới đến.
(Editing: Thí dụ sau đây chứng tỏ ranking của blog tôi khá cao. Tôi lần theo Feedjit từ những người search những từ khóa (keyword) từ trang google của Việt Nam, một trong các từ khóa ấy là "nhac carpenter"
và tôi rất ngạc nhiên và thích thú khi thấy blog mình là answer #1, trên cả các trang web chuyên nghiệp khác.
Rất ngạc nhiên vì tôi mới làm trang Carpenters Anthology có khoảng 2 tháng nay thôi, nhưng nhờ ranking của blog hoctroviet cao, nên trang có độ tin cậy ngay trên trang google search Việt. Tất nhiên nếu search trên google.com thì chắc trang blog của tôi cỡ thứ mấy trăm hay mấy ngàn :-)))))
Trở lại chủ đề trình bày trang blog. Một bài viết hay khác cũng trong trang đó là What Every Blogger Needs to Know About Categories
http://www.pearsonified.com/2008/02/what_every_blogger_needs_to_know_about_categories.php
trong đó tác giả viết rằng chúng ta lạm dụng tags (nhãn), categories (thể loại) quá nhiều, vì kỹ thuật blog làm việc ấy quá dễ dàng. Theo anh ta, một trang blog chỉ cần 3 nhãn là đủ: phổ cập nhất (most popular - must read), vừa (cách cải thiện trang: improve your site), và các thứ khác (đáng dòm sơ: worth a look).
Cách này tôi thấy rất có lý, vì nếu một người đi tìm trong google về một thông tin tải hình chẳng hạn, thì họ sẽ thấy trang "Tải hình" ngay, còn các trang khác ít liên can (irrelevant) hơn thì để chỗ khác.
Thấy hay là làm liền, bạn sẽ thấy trang mới của tôi làm với phương châm na ná như http://www.pearsonified.com/
Hy vọng bạn sẽ thấy thích cách design này.
Hoctro
7/19/10
Hôm nay tôi đọc được một bài viết hay: How Can 10 Simple Articles Change Your Life?
http://www.pearsonified.com/2006/10/how_can_10_simple_articles_change_your_life.php
Tôi học được một điều là mình phải chú tâm vào thế mạnh của trang Hoctro Viet là giới thiệu những tính năng mới của Blogger. Theo dõi Feedjit, tôi cũng thấy đa số người tới trang Hoctroviet là nhằm một trong các mục đích sau:
1. Tải nhiều hình cùng lúc lên blog,
2. Trang trí blog (Template designer)
3. Các bài viết lượm lặt trên Net về nhạc
4. Các nhu liệu để xem và tải Youtube về máy
5. Link thẳng đến trang chính để đọc các posts mới (cám ơn các bạn ấy rất nhiều)
6. Các nguồn kết nối từ các trang bạn (cám ơn rất nhiều)
7. Những tản mạn về Âm Nhạc, học sáng tác nhạc, tạo phong cách riêng, v.v. Nhiều khi các câu "search" không ăn nhằm đến nội dung của blog, nhưng vì Google có lẽ cho ranking của blog tôi cao, nên search cứ thong thả dẫn đến trang nhà Hoctroviet, mỗi ngày trên dưới 100 người mới đến.
(Editing: Thí dụ sau đây chứng tỏ ranking của blog tôi khá cao. Tôi lần theo Feedjit từ những người search những từ khóa (keyword) từ trang google của Việt Nam, một trong các từ khóa ấy là "nhac carpenter"
Rất ngạc nhiên vì tôi mới làm trang Carpenters Anthology có khoảng 2 tháng nay thôi, nhưng nhờ ranking của blog hoctroviet cao, nên trang có độ tin cậy ngay trên trang google search Việt. Tất nhiên nếu search trên google.com thì chắc trang blog của tôi cỡ thứ mấy trăm hay mấy ngàn :-)))))
Trở lại chủ đề trình bày trang blog. Một bài viết hay khác cũng trong trang đó là What Every Blogger Needs to Know About Categories
http://www.pearsonified.com/2008/02/what_every_blogger_needs_to_know_about_categories.php
trong đó tác giả viết rằng chúng ta lạm dụng tags (nhãn), categories (thể loại) quá nhiều, vì kỹ thuật blog làm việc ấy quá dễ dàng. Theo anh ta, một trang blog chỉ cần 3 nhãn là đủ: phổ cập nhất (most popular - must read), vừa (cách cải thiện trang: improve your site), và các thứ khác (đáng dòm sơ: worth a look).
Cách này tôi thấy rất có lý, vì nếu một người đi tìm trong google về một thông tin tải hình chẳng hạn, thì họ sẽ thấy trang "Tải hình" ngay, còn các trang khác ít liên can (irrelevant) hơn thì để chỗ khác.
Thấy hay là làm liền, bạn sẽ thấy trang mới của tôi làm với phương châm na ná như http://www.pearsonified.com/
Hy vọng bạn sẽ thấy thích cách design này.
Hoctro
7/19/10
Thứ Tư, 7 tháng 7, 2010
Stats: tiện ích mới của Blogger để biết thống kê lượt người xem
Bạn,
Blogger đang thử nghiệm một tiện ích giúp người dùng có thể nhanh chóng tìm hiểu lưu lượng người đọc trang, họ từ đâu đến, đại đa số thích xem những gì, những từ khóa họ đã dùng để tìm kiếm, trang nào đọc nhiều nhất. Các thống kê này có thể hiển thị theo ngày, tuần, tháng, hoặc năm. Điều hay nhất là bạn không phải làm gì hết, chỉ cần đăng nhập vào trang là những thống kê này đã có sẵn trong trang của bạn. Đây là một dạng phiên bản tối thiểu của Google Analytics, chỉ khác cái là bạn khỏi cần phải làm acoount, setup, v.v.
Theo tôi, đây là một tiện ích rất quan trọng và sẽ làm Blogger có thêm nhiều người dùng nữa, vì không phải ai cũng giỏi computer, với họ càng ít cách setup càng tốt.
Muốn vào xem tiện ích mới này, hiện giờ bạn phải đăng nhập theo lối này: http://draft.blogger.com/
Sau đó ấn vào chữ Stats ở cuối blog mà bạn muốn xem:
Đây là toàn cảnh thông tin của trang Học Trò Việt. Blogger mới làm cái này 2, 3 tuần nay (trong khi mình đang say mê coi World Cup) nên dữ kiện chưa được nhiều lắm, nhưng cũng đủ gây "ấn tượng", "hoành tráng" (impressed?) theo như cách nói mới bên nhà.
Chúng mình cũng biết trang nào được người xem "tham quan" nhất :-)
Hay các Pages mới thì ai xem nhiều nhất
Chúng ta cũng biết người đến thăm từ đâu. Tôi được vinh hạnh có bạn đọc đến nhiều nhất từ Việt Nam, chứ không phải từ Hóc Bà Tó :-)
Nhờ có thống kê xem người dùng thích tìm những thứ gì trên liên mạng, tôi mới biết là người ta thích xem coi cách làm blog của tôi ra sao, còn những sưu tầm về nhạc thì cũng na ná, và hai cái đó là "thế mạnh" của blog Học Trò Việt.
Cuối cùng là hình ảnh xem họ đến từ đâu, dùng browser nào, hệ điều hành (operating system) nào ...
Những stats này rất thiết thực để định hướng cho các bài viết sắp tới của chúng ta.
Hẹn bạn kỳ (giới thiệu tiện ích của Blogger) tới.
Cầu chúc Hòa Lan sẽ thắng giải Vô địch túc cầu 2010. It's about time for them.
Hoctro
(7/7/10)
Blogger đang thử nghiệm một tiện ích giúp người dùng có thể nhanh chóng tìm hiểu lưu lượng người đọc trang, họ từ đâu đến, đại đa số thích xem những gì, những từ khóa họ đã dùng để tìm kiếm, trang nào đọc nhiều nhất. Các thống kê này có thể hiển thị theo ngày, tuần, tháng, hoặc năm. Điều hay nhất là bạn không phải làm gì hết, chỉ cần đăng nhập vào trang là những thống kê này đã có sẵn trong trang của bạn. Đây là một dạng phiên bản tối thiểu của Google Analytics, chỉ khác cái là bạn khỏi cần phải làm acoount, setup, v.v.
Theo tôi, đây là một tiện ích rất quan trọng và sẽ làm Blogger có thêm nhiều người dùng nữa, vì không phải ai cũng giỏi computer, với họ càng ít cách setup càng tốt.
Muốn vào xem tiện ích mới này, hiện giờ bạn phải đăng nhập theo lối này: http://draft.blogger.com/
Sau đó ấn vào chữ Stats ở cuối blog mà bạn muốn xem:
Đây là toàn cảnh thông tin của trang Học Trò Việt. Blogger mới làm cái này 2, 3 tuần nay (trong khi mình đang say mê coi World Cup) nên dữ kiện chưa được nhiều lắm, nhưng cũng đủ gây "ấn tượng", "hoành tráng" (impressed?) theo như cách nói mới bên nhà.
Chúng mình cũng biết trang nào được người xem "tham quan" nhất :-)
Hay các Pages mới thì ai xem nhiều nhất
Chúng ta cũng biết người đến thăm từ đâu. Tôi được vinh hạnh có bạn đọc đến nhiều nhất từ Việt Nam, chứ không phải từ Hóc Bà Tó :-)
Nhờ có thống kê xem người dùng thích tìm những thứ gì trên liên mạng, tôi mới biết là người ta thích xem coi cách làm blog của tôi ra sao, còn những sưu tầm về nhạc thì cũng na ná, và hai cái đó là "thế mạnh" của blog Học Trò Việt.
Cuối cùng là hình ảnh xem họ đến từ đâu, dùng browser nào, hệ điều hành (operating system) nào ...
Những stats này rất thiết thực để định hướng cho các bài viết sắp tới của chúng ta.
Hẹn bạn kỳ (giới thiệu tiện ích của Blogger) tới.
Cầu chúc Hòa Lan sẽ thắng giải Vô địch túc cầu 2010. It's about time for them.
Hoctro
(7/7/10)
Thứ Hai, 17 tháng 5, 2010
Widget "Bài Liên Quan" ( hay là "Các Bài Viết Cùng Chủ Đề")
Bạn,
Anh Trần Hùng có nhắn là tôi nên đăng lại widget tôi viết là "Bài Liên Quan", vậy tôi đăng nó lại ở đây. widget này cho ta xem những bài liên quan bằng cách dùng AJAX tìm những posts có cùng label rồi đăng chúng lên.
Bước 1: chèn mã này vào header:
<script src='http://www.google.com/jsapi/' type='text/javascript'/>
<script src='http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.js' type='text/javascript'/>
Bước 2: chèn mã này vào phần body, giữa những widget khác (tôi có để ra một dòng trống để bạn chèn vào, như trong hình sau):
<b:widget id='Blog3' locked='false' title='Blog Posts' type='Blog'>
<b:includable id='nextprev'>
</b:includable>
<b:includable id='backlinks' var='post'>
</b:includable>
<b:includable id='post' var='post'>
</b:includable>
<b:includable id='commentDeleteIcon' var='comment'>
</b:includable>
<b:includable id='status-message'>
</b:includable>
<b:includable id='feedLinks'>
</b:includable>
<b:includable id='comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<h4 id='comment-post-message'><data:postCommentMsg/></h4>
<p><data:blogCommentMessage/></p>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src' style='display: none'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize' frameborder='0' height='275' id='comment-editor' scrolling='auto' src='' width='100%'/>
<data:post.iframeColorizer/>
</div>
</b:includable>
<b:includable id='backlinkDeleteIcon' var='backlink'>
</b:includable>
<b:includable id='feedLinksBody' var='links'>
</b:includable>
<b:includable id='postQuickEdit' var='post'>
</b:includable>
<b:includable id='comments' var='post'>
</b:includable>
<b:includable id='main'>
<!-- *****************http://hoctro.blogspot.com*****Oct,2008********** -->
<!-- *** by Labels Written by Hoctro- Take Four******* -->
<!--<b:if cond='data:blog.pageType == "item"'>-->
<div class='widget-content'>
<h4>Các Bài Viết Cùng Chủ Đề</h4>
<div id='data2007' style='padding:15px;'/><br/><br/>
<h6>Related Article Widget by <u><a href='http://hoctro.blogspot.com/2008/10/new-and-improved-related-articles.html'>Hoctro</a></u></h6>
<script type='text/javascript'>
// Incorporating modified by Jackbook to the next line, thank you very much.
var homeUrl = "<data:blog.homepageUrl/>";
var maxNumberOfPostsPerLabel = 8;
var maxNumberOfLabels = 10;
var urlArray = new Array();
<b:if cond='data:blog.pageType == "item"'>
maxNumberOfPostsPerLabel = 15;
</b:if>
<b:if cond='data:blog.pageType == "item"'>
maxNumberOfLabels = 4;
</b:if>
var titleArray = new Array();
var titleTest = 0;
function relInitialize() {
var labelArray = new Array();
var numLabel = 0;
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
textLabel = "<data:label.name/>";
var test = 0;
// Do not add identical labels from posts
for (var i = 0; i < labelArray.length; i++)
if (labelArray[i] == textLabel) test = 1;
if (test == 0) {
labelArray.push(textLabel);
var maxLabels = (labelArray.length <= maxNumberOfLabels) ?
labelArray.length : maxNumberOfLabels;
if (numLabel < maxLabels) {
var url = homeUrl + 'feeds/posts/default/-/'
+ encodeURIComponent(textLabel);
var feed = new google.feeds.Feed(url);
feed.setNumEntries(maxNumberOfPostsPerLabel);
feed.load(function(result) {
if (!result.error) {
var container = document.getElementById("data2007");
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
titleTest = 0;
for (var i = 0; i < titleArray.length; i++)
if ( titleArray[i] == entry["title"] ) titleTest = 1;
if (titleTest == 0 ) {
titleArray.push(entry["title"]);
var div = document.createElement('div');
var a = document.createElement('a');
a.href = entry["link"];
// Adding an if statement to exclude current post.
// Addition from Jackbook.com. Thank you
if( a.href!=location.href ) {
var txt = document.createTextNode(entry["title"]);
a.appendChild(txt);
div.appendChild(a);
container.appendChild(div);
} // if not home page
}// if titleTest
} // for
}// if result is not error
}); // feed.load
numLabel++;
}
}
</b:loop>
</b:loop>
}
google.load("feeds", "1");
google.setOnLoadCallback(relInitialize);
</script>
</div>
<!--</b:if>-->
</b:includable>
</b:widget>
Thế là xong! Tôi có làm thử lại và thành công (xem cuối trang).
Chú ý: Khi làm thành công thì bạn sẽ thấy trên layout->page elements cái widget này là một Blog! không sao hết, vì đó là cách tôi dùng để lấy labels. Nếu bạn không thích dùng widget nữa thì vào edit html và xóa dòng in đậm trong hình sau, rồi save template:
Anh Trần Hùng có nhắn là tôi nên đăng lại widget tôi viết là "Bài Liên Quan", vậy tôi đăng nó lại ở đây. widget này cho ta xem những bài liên quan bằng cách dùng AJAX tìm những posts có cùng label rồi đăng chúng lên.
Bước 1: chèn mã này vào header:
<script src='http://www.google.com/jsapi/' type='text/javascript'/>
<script src='http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.js' type='text/javascript'/>
Bước 2: chèn mã này vào phần body, giữa những widget khác (tôi có để ra một dòng trống để bạn chèn vào, như trong hình sau):
<b:widget id='Blog3' locked='false' title='Blog Posts' type='Blog'>
<b:includable id='nextprev'>
</b:includable>
<b:includable id='backlinks' var='post'>
</b:includable>
<b:includable id='post' var='post'>
</b:includable>
<b:includable id='commentDeleteIcon' var='comment'>
</b:includable>
<b:includable id='status-message'>
</b:includable>
<b:includable id='feedLinks'>
</b:includable>
<b:includable id='comment-form' var='post'>
<div class='comment-form'>
<a name='comment-form'/>
<h4 id='comment-post-message'><data:postCommentMsg/></h4>
<p><data:blogCommentMessage/></p>
<a expr:href='data:post.commentFormIframeSrc' id='comment-editor-src' style='display: none'/>
<iframe allowtransparency='true' class='blogger-iframe-colorize' frameborder='0' height='275' id='comment-editor' scrolling='auto' src='' width='100%'/>
<data:post.iframeColorizer/>
</div>
</b:includable>
<b:includable id='backlinkDeleteIcon' var='backlink'>
</b:includable>
<b:includable id='feedLinksBody' var='links'>
</b:includable>
<b:includable id='postQuickEdit' var='post'>
</b:includable>
<b:includable id='comments' var='post'>
</b:includable>
<b:includable id='main'>
<!-- *****************http://hoctro.blogspot.com*****Oct,2008********** -->
<!-- *** by Labels Written by Hoctro- Take Four******* -->
<!--<b:if cond='data:blog.pageType == "item"'>-->
<div class='widget-content'>
<h4>Các Bài Viết Cùng Chủ Đề</h4>
<div id='data2007' style='padding:15px;'/><br/><br/>
<h6>Related Article Widget by <u><a href='http://hoctro.blogspot.com/2008/10/new-and-improved-related-articles.html'>Hoctro</a></u></h6>
<script type='text/javascript'>
// Incorporating modified by Jackbook to the next line, thank you very much.
var homeUrl = "<data:blog.homepageUrl/>";
var maxNumberOfPostsPerLabel = 8;
var maxNumberOfLabels = 10;
var urlArray = new Array();
<b:if cond='data:blog.pageType == "item"'>
maxNumberOfPostsPerLabel = 15;
</b:if>
<b:if cond='data:blog.pageType == "item"'>
maxNumberOfLabels = 4;
</b:if>
var titleArray = new Array();
var titleTest = 0;
function relInitialize() {
var labelArray = new Array();
var numLabel = 0;
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
textLabel = "<data:label.name/>";
var test = 0;
// Do not add identical labels from posts
for (var i = 0; i < labelArray.length; i++)
if (labelArray[i] == textLabel) test = 1;
if (test == 0) {
labelArray.push(textLabel);
var maxLabels = (labelArray.length <= maxNumberOfLabels) ?
labelArray.length : maxNumberOfLabels;
if (numLabel < maxLabels) {
var url = homeUrl + 'feeds/posts/default/-/'
+ encodeURIComponent(textLabel);
var feed = new google.feeds.Feed(url);
feed.setNumEntries(maxNumberOfPostsPerLabel);
feed.load(function(result) {
if (!result.error) {
var container = document.getElementById("data2007");
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
titleTest = 0;
for (var i = 0; i < titleArray.length; i++)
if ( titleArray[i] == entry["title"] ) titleTest = 1;
if (titleTest == 0 ) {
titleArray.push(entry["title"]);
var div = document.createElement('div');
var a = document.createElement('a');
a.href = entry["link"];
// Adding an if statement to exclude current post.
// Addition from Jackbook.com. Thank you
if( a.href!=location.href ) {
var txt = document.createTextNode(entry["title"]);
a.appendChild(txt);
div.appendChild(a);
container.appendChild(div);
} // if not home page
}// if titleTest
} // for
}// if result is not error
}); // feed.load
numLabel++;
}
}
</b:loop>
</b:loop>
}
google.load("feeds", "1");
google.setOnLoadCallback(relInitialize);
</script>
</div>
<!--</b:if>-->
</b:includable>
</b:widget>
Thế là xong! Tôi có làm thử lại và thành công (xem cuối trang).
Chú ý: Khi làm thành công thì bạn sẽ thấy trên layout->page elements cái widget này là một Blog! không sao hết, vì đó là cách tôi dùng để lấy labels. Nếu bạn không thích dùng widget nữa thì vào edit html và xóa dòng in đậm trong hình sau, rồi save template:
Thứ Hai, 3 tháng 5, 2010
Nghe nhạc YouTube từ một danh sách - Chuyện hậu trường
Bạn,
Nhân rảnh rỗi và có bạn Nhã hỏi một câu hỏi nhỏ, tôi viết bài này để giới thiệu thêm vài cái links hữu ích cho các bạn hiểu thêm hay muốn dùng Google's và tại sao tôi nảy ra ý tưởng là một cái "mashup" về YouTube trong Blogger.
Cách đây vài tháng, tôi tìm ra được một Youtube của một người bên Đài Loan, chứa rất nhiều nhạc Paul Mauriat, trong đó hơn một nửa là nhạc hiếm, nhiều bài tôi chưa từng nghe.
http://www.youtube.com/profile?user=o1160507#p/u/6/jxwkhbxO2V0
Lúc đó tôi cũng i-tờ về YouTube, chỉ biết dùng embed code rồi mang về lắp từng bài, mỗi khi thấy có bài hay. Kiểu này mang mấy cái embed này về mà lắp 300+ bài chắc chết! Lại tốn nhiều công sức nữa!
Cùng lúc đang mê nhạc Paul trở lại đó, thì tôi lại tìm ra một trang nhạc khác, có đầy đủ Paul's discography:
http://www.soundtrackfan.com/pmauriat/discos/discografia-referencial-visual.html
Thấy đẹp là tôi muốn rinh về ngay, và đã in ra một tập nhạc thật đẹp để ngắm, nhưng rồi tôi nghĩ, nếu mình ấn vào một bài, mà nghe được ngay, rồi ấn vào link khác, nó sẽ đổi nhạc, nhưng vẫn chung một trang đang xem, thì hay biết mấy. Nghĩ là đi tìm dụng cụ làm liền.
Như mọi khi, muốn viết tiện ích cho Goggle, thì phải vào trang này:
http://code.google.com/intl/en/
Viết cho YouTube thì phải lần mò đến trang này:
http://code.google.com/intl/en/apis/youtube/overview.html
Lựa các trang để tìm ra trang thích hợp, thì tôi tới trang này:
http://code.google.com/intl/en/apis/youtube/js_api_reference.html
Thế là in ra để "ngâm cứu". Sau một ngày tìm hiểu thì tôi đã hiểu sơ sơ cách gắn. Bước kế tiếp là gắn thử.
Đầu tiên là tôi đi tìm trang "demonstration" (demo)
http://code.google.com/intl/en/apis/youtube/youtube_player_demo.html
Công nhận cái trang này chỉ rất nhiều cách để thay đổi Youtube video. Tôi bèn in ra code để xem, thì thấy cũng OK, chỉ cái là nó nhiều thứ linh tinh quá. May thay, tôi nhớ Google có một cái tool rất "cool", đó là Google Code Playground, cho phép bạn code thử trên ô trên, và máy sẽ hiện kết quả trên ô dưới. (Bạn phải dùng Firefox để access được trang này.)
http://code.google.com/apis/ajax/playground/?exp=youtube#simple_embed
Tôi dòm vào cái code, thì thấy nó thật đơn giản, đơn giản hơn nhiều cái HTML code demo 10+ trang mà tôi đã in.
Nếu bạn ấn vào nút Edit HTML trong góc phải bên trên, bạn sẽ thấy toàn bộ mã, đây là căn bản mã mà tôi dùng để lắp ráp trang mashup sau này.
Đó là "lịch sử hình thành" của mashup. Sau đây là giải thích sơ ý nghĩa của từng bước của post trước:
http://hoctroviet.blogspot.com/2010/05/nghe-nhac-youtube-tu-mot-danh-sach-take.html
1. Đoạn mã này dùng để "load" swfobject, version 2.1, cũng như load
<script src='http://www.google.com/jsapi' type="text/javascript" />
<script type='text/javascript' >
google.load("swfobject", "2.1");
</script>
Câu script đầu thì làm cho variable "google" dùng được.
Câu thứ hai dùng để load swfobject, là phần mềm từ Adobe, dùng kỹ thuật Flash, để có thể load video vào. Nếu không có dòng này, thì dòng dưới #3 swfobject.embedSWF("http://www.youtube.com ... không thực hiện được. Ngoài ra, hai câu scripts này phải nằm trong phần head, cho máy laod trước khi load phần body.
2. Ba câu sau là chỗ mà video sẽ hiện ra. Vì thế, nếu ta làm nó thành một widget, thì ta có thể dễ dàng di chuyển sau này khi dùng trang Layout->Page Elements. Nếu tinh ý hơn, như cách bạn Nhã đang dùng, ta cũng có thể chèn đoạn này vào trong một post. Tuy nhiên, ta chỉ chèn được một lần thôi, vì tên tag videoDiv là unique, nếu để 2 cái thì cái thứ hai không có tác dụng, chỉ đứng trơ ra đó mà dòm thôi.
<div id='content-links'>
<div id='videodiv'>Loading... </div>
</div>
3. Phần mã chính.
Trước tiên, khi browser loads trang mình vô memory, nó sẽ thấy lệnh này:
google.setOnLoadCallback(_run);
Câu này nói là nếu máy load được thì làm ơn load dùm một function có tên là _run.
Đây là function _run(), nó có thể làm nhiều việc, như load vài ba cái player chẳng hạn, nhưng trong application này nó chỉ load một function có tên là loadPlayer()
function _run() {
loadPlayer();
}
Đây là nội dung của loadPlayer()
function loadPlayer() {
var videoID = "jfivtWEAyrk";
var params = { allowScriptAccess: "always" };
var atts = { id: "ytPlayer" };
swfobject.embedSWF("http://www.youtube.com/v/"
+ videoID +
"&enablejsapi=1&playerapiid=player1",
"videodiv", "320", "270", "8", null, null, params,
atts);
}
Function này đại khái là nó muốn load một cái player, với video có tên là "jfivtWEAyrk", với chiều rộng là 320 pixels, chiều cao là 270 pixels.
Nếu máy load thành công thì hình sẽ hiện ra trong tag "videoDiv", còn không thì ta thấy dòng chữ Loading ... ở step 2 hoài.
Các giải thích khác mời bạn xem kỹ hơn ở đây http://code.google.com/intl/en/apis/youtube/js_api_reference.html
Nếu có hình hiện ra, máy cũng sẽ đọc tiếp được những lệnh mình muốn làm trong function onYouTubePlayerReady(playerId).
Function này cũng không là gì cao siêu hết, chỉ nhắn rằng nếu có gì trục trặc từ rày về sau (onError), thì gọi function onPlayerError() để nó tìm cách chữa.
function onYouTubePlayerReady(playerId)
{
ytPlayer = document.getElementById("ytPlayer");
ytPlayer.addEventListener("onError", "onPlayerError");
}
Thực ra thì cũng chả chữa được gì, nó chỉ tạo ra một cái info window, rồi báo tên lỗi mà thôi.
function onPlayerError(errorCode) {
alert("An error occured of type:" + errorCode);
}
Hai đoạn code chính tôi chèn vào để mashup, là:
function loadVideo(id, num) {
if(ytPlayer) {
if (!num) num=0;
ytPlayer.loadVideoById(id, num);
}
else
{
loadVideoWindow(id);
}
}
là một bản thêm thắt kha khá so với bản gốc trên trang hướng dẫn:
function play() {
if (ytplayer) {
ytplayer.playVideo();
}
}
Tôi viết rằng, nếu cái ytPlayer mà load thành công, thì trước tiên xem số giây (seconds) có gửi theo không, nếu không thì cho nó = zero, tức là ở đầu video. Đôi khi, một video có MC giới thiệu rườm rà, ta có thể dùng cách này để nghe thẳng nhạc mà khỏi phải nghe MC ca. Sau đó thì tôi gọi thẳng function ytPlayer.loadVideoById(id, num); để load và chơi bài nhạc với id, và num đã gửi kèm trong lệnh gọi, thí dụ như:
<li><a href="javascript:void(0);" onclick="loadVideo('4pOElMjQ-DI');">Tà Áo Xanh (Đoàn Chuẩn - Từ Linh) - Lệ Thu trình bày</a></li>
Ngoài ra, nếu ytPlayer load không thành công, tôi cũng sẽ mở được nó ra với lệnh gọi loadVideoWindow(id);:
function loadVideoWindow(id) {
var ytlink;
var newwindow;
ytlink = "http://www.youtube.com/watch?v=" + id;
newwindow = window.open(ytlink,'name','height=600,width=700');
if (window.focus) {newwindow.focus()}
}
trong đó, tôi thu xếp ("assembled") cái URL cho nó gọi Youtube link, rồi mở một cái window mới, chiều rộng 700, chiều cao 600 pixels. Sau rốt là làm cho window đó active bằng lệnh newwindow.focus().
Trong cái mashup trước, tôi còn tìm tòi để sửa Youtube video thành một thanh, chỉ có nghe chứ không thấy hình. Nếu bạn xem kỹ 3 cái CSS tags, thì thấy tôi tìm cách làm nó "bất động", lúc nào cũng nằm ở bên dưới tay phải. Hiện tôi còn để trang như vậy ở bên blog anh ngữ
http://hoctro.blogspot.com/
Bài mashup đó ở đây:
http://hoctroviet.blogspot.com/2010/02/embedding-youtube-music-ngay-trong.html
Sau khi làm xong mashup, tôi bỏ ra một vài ngày lắp trang này, chỉ mới hòan thành một nửa trên, dùng nhạc của anh bạn người Đài Loan, vì nửa dưới số lượng bài khó tìm hơn trên YouTube.
http://hoctroviet.blogspot.com/p/paul-mauriat.html
Cái mà tôi ghét nhất khi làm xong là phải coi xem hai bên Internet Explorer, và Firefox có work hay không. Vì Firefox là hậu thân của Netscape hồi "browser war" năm 95, trong đó Microsoft thắng cuộc, nên hai software này không hề muốn compatible với nhau chút nào, làm người developers như tôi phải khổ sở để làm vừa ý, cho mashup chạy được cả hai bên. Code javascipt thì đúng rồi, mà bên này chạy còn bên kia thì không, chả hiểu tại sao????
Đó là "sự tích Youtube mashup" :-) Như bạn thấy, cũng chẳng có gì là bí hiểm, nói như Steve Jobs trong bài diễn văn ông đọc chào mừng ra trường, là ông chỉ biết cách "connect the dots" thôi. Tôi có dịch bài đó ở đây, nhân mùa tan trường mời bạn cùng xem lại.
http://hoctroviet.blogspot.com/2009/11/ban-phai-tim-thay-ieu-ban-yeu-thich-loi.html
Chúc bạn một đầu tuần thật vui.
Hoctro.
5/3/2010
Nhân rảnh rỗi và có bạn Nhã hỏi một câu hỏi nhỏ, tôi viết bài này để giới thiệu thêm vài cái links hữu ích cho các bạn hiểu thêm hay muốn dùng Google's và tại sao tôi nảy ra ý tưởng là một cái "mashup" về YouTube trong Blogger.
Cách đây vài tháng, tôi tìm ra được một Youtube của một người bên Đài Loan, chứa rất nhiều nhạc Paul Mauriat, trong đó hơn một nửa là nhạc hiếm, nhiều bài tôi chưa từng nghe.
http://www.youtube.com/profile?user=o1160507#p/u/6/jxwkhbxO2V0
Lúc đó tôi cũng i-tờ về YouTube, chỉ biết dùng embed code rồi mang về lắp từng bài, mỗi khi thấy có bài hay. Kiểu này mang mấy cái embed này về mà lắp 300+ bài chắc chết! Lại tốn nhiều công sức nữa!
Cùng lúc đang mê nhạc Paul trở lại đó, thì tôi lại tìm ra một trang nhạc khác, có đầy đủ Paul's discography:
http://www.soundtrackfan.com/pmauriat/discos/discografia-referencial-visual.html
Thấy đẹp là tôi muốn rinh về ngay, và đã in ra một tập nhạc thật đẹp để ngắm, nhưng rồi tôi nghĩ, nếu mình ấn vào một bài, mà nghe được ngay, rồi ấn vào link khác, nó sẽ đổi nhạc, nhưng vẫn chung một trang đang xem, thì hay biết mấy. Nghĩ là đi tìm dụng cụ làm liền.
Như mọi khi, muốn viết tiện ích cho Goggle, thì phải vào trang này:
http://code.google.com/intl/en/
Viết cho YouTube thì phải lần mò đến trang này:
http://code.google.com/intl/en/apis/youtube/overview.html
Lựa các trang để tìm ra trang thích hợp, thì tôi tới trang này:
http://code.google.com/intl/en/apis/youtube/js_api_reference.html
Thế là in ra để "ngâm cứu". Sau một ngày tìm hiểu thì tôi đã hiểu sơ sơ cách gắn. Bước kế tiếp là gắn thử.
Đầu tiên là tôi đi tìm trang "demonstration" (demo)
http://code.google.com/intl/en/apis/youtube/youtube_player_demo.html
Công nhận cái trang này chỉ rất nhiều cách để thay đổi Youtube video. Tôi bèn in ra code để xem, thì thấy cũng OK, chỉ cái là nó nhiều thứ linh tinh quá. May thay, tôi nhớ Google có một cái tool rất "cool", đó là Google Code Playground, cho phép bạn code thử trên ô trên, và máy sẽ hiện kết quả trên ô dưới. (Bạn phải dùng Firefox để access được trang này.)
http://code.google.com/apis/ajax/playground/?exp=youtube#simple_embed
Tôi dòm vào cái code, thì thấy nó thật đơn giản, đơn giản hơn nhiều cái HTML code demo 10+ trang mà tôi đã in.
Nếu bạn ấn vào nút Edit HTML trong góc phải bên trên, bạn sẽ thấy toàn bộ mã, đây là căn bản mã mà tôi dùng để lắp ráp trang mashup sau này.
Đó là "lịch sử hình thành" của mashup. Sau đây là giải thích sơ ý nghĩa của từng bước của post trước:
http://hoctroviet.blogspot.com/2010/05/nghe-nhac-youtube-tu-mot-danh-sach-take.html
1. Đoạn mã này dùng để "load" swfobject, version 2.1, cũng như load
<script src='http://www.google.com/jsapi' type="text/javascript" />
<script type='text/javascript' >
google.load("swfobject", "2.1");
</script>
Câu script đầu thì làm cho variable "google" dùng được.
Câu thứ hai dùng để load swfobject, là phần mềm từ Adobe, dùng kỹ thuật Flash, để có thể load video vào. Nếu không có dòng này, thì dòng dưới #3 swfobject.embedSWF("http://www.youtube.com ... không thực hiện được. Ngoài ra, hai câu scripts này phải nằm trong phần head, cho máy laod trước khi load phần body.
2. Ba câu sau là chỗ mà video sẽ hiện ra. Vì thế, nếu ta làm nó thành một widget, thì ta có thể dễ dàng di chuyển sau này khi dùng trang Layout->Page Elements. Nếu tinh ý hơn, như cách bạn Nhã đang dùng, ta cũng có thể chèn đoạn này vào trong một post. Tuy nhiên, ta chỉ chèn được một lần thôi, vì tên tag videoDiv là unique, nếu để 2 cái thì cái thứ hai không có tác dụng, chỉ đứng trơ ra đó mà dòm thôi.
<div id='content-links'>
<div id='videodiv'>Loading... </div>
</div>
3. Phần mã chính.
Trước tiên, khi browser loads trang mình vô memory, nó sẽ thấy lệnh này:
google.setOnLoadCallback(_run);
Câu này nói là nếu máy load được thì làm ơn load dùm một function có tên là _run.
Đây là function _run(), nó có thể làm nhiều việc, như load vài ba cái player chẳng hạn, nhưng trong application này nó chỉ load một function có tên là loadPlayer()
function _run() {
loadPlayer();
}
Đây là nội dung của loadPlayer()
function loadPlayer() {
var videoID = "jfivtWEAyrk";
var params = { allowScriptAccess: "always" };
var atts = { id: "ytPlayer" };
swfobject.embedSWF("http://www.youtube.com/v/"
+ videoID +
"&enablejsapi=1&playerapiid=player1",
"videodiv", "320", "270", "8", null, null, params,
atts);
}
Function này đại khái là nó muốn load một cái player, với video có tên là "jfivtWEAyrk", với chiều rộng là 320 pixels, chiều cao là 270 pixels.
Nếu máy load thành công thì hình sẽ hiện ra trong tag "videoDiv", còn không thì ta thấy dòng chữ Loading ... ở step 2 hoài.
Các giải thích khác mời bạn xem kỹ hơn ở đây http://code.google.com/intl/en/apis/youtube/js_api_reference.html
Nếu có hình hiện ra, máy cũng sẽ đọc tiếp được những lệnh mình muốn làm trong function onYouTubePlayerReady(playerId).
Function này cũng không là gì cao siêu hết, chỉ nhắn rằng nếu có gì trục trặc từ rày về sau (onError), thì gọi function onPlayerError() để nó tìm cách chữa.
function onYouTubePlayerReady(playerId)
{
ytPlayer = document.getElementById("ytPlayer");
ytPlayer.addEventListener("onError", "onPlayerError");
}
Thực ra thì cũng chả chữa được gì, nó chỉ tạo ra một cái info window, rồi báo tên lỗi mà thôi.
function onPlayerError(errorCode) {
alert("An error occured of type:" + errorCode);
}
Hai đoạn code chính tôi chèn vào để mashup, là:
function loadVideo(id, num) {
if(ytPlayer) {
if (!num) num=0;
ytPlayer.loadVideoById(id, num);
}
else
{
loadVideoWindow(id);
}
}
là một bản thêm thắt kha khá so với bản gốc trên trang hướng dẫn:
function play() {
if (ytplayer) {
ytplayer.playVideo();
}
}
Tôi viết rằng, nếu cái ytPlayer mà load thành công, thì trước tiên xem số giây (seconds) có gửi theo không, nếu không thì cho nó = zero, tức là ở đầu video. Đôi khi, một video có MC giới thiệu rườm rà, ta có thể dùng cách này để nghe thẳng nhạc mà khỏi phải nghe MC ca. Sau đó thì tôi gọi thẳng function ytPlayer.loadVideoById(id, num); để load và chơi bài nhạc với id, và num đã gửi kèm trong lệnh gọi, thí dụ như:
<li><a href="javascript:void(0);" onclick="loadVideo('4pOElMjQ-DI');">Tà Áo Xanh (Đoàn Chuẩn - Từ Linh) - Lệ Thu trình bày</a></li>
Ngoài ra, nếu ytPlayer load không thành công, tôi cũng sẽ mở được nó ra với lệnh gọi loadVideoWindow(id);:
function loadVideoWindow(id) {
var ytlink;
var newwindow;
ytlink = "http://www.youtube.com/watch?v=" + id;
newwindow = window.open(ytlink,'name','height=600,width=700');
if (window.focus) {newwindow.focus()}
}
trong đó, tôi thu xếp ("assembled") cái URL cho nó gọi Youtube link, rồi mở một cái window mới, chiều rộng 700, chiều cao 600 pixels. Sau rốt là làm cho window đó active bằng lệnh newwindow.focus().
Trong cái mashup trước, tôi còn tìm tòi để sửa Youtube video thành một thanh, chỉ có nghe chứ không thấy hình. Nếu bạn xem kỹ 3 cái CSS tags, thì thấy tôi tìm cách làm nó "bất động", lúc nào cũng nằm ở bên dưới tay phải. Hiện tôi còn để trang như vậy ở bên blog anh ngữ
http://hoctro.blogspot.com/
Bài mashup đó ở đây:
http://hoctroviet.blogspot.com/2010/02/embedding-youtube-music-ngay-trong.html
Sau khi làm xong mashup, tôi bỏ ra một vài ngày lắp trang này, chỉ mới hòan thành một nửa trên, dùng nhạc của anh bạn người Đài Loan, vì nửa dưới số lượng bài khó tìm hơn trên YouTube.
http://hoctroviet.blogspot.com/p/paul-mauriat.html
Cái mà tôi ghét nhất khi làm xong là phải coi xem hai bên Internet Explorer, và Firefox có work hay không. Vì Firefox là hậu thân của Netscape hồi "browser war" năm 95, trong đó Microsoft thắng cuộc, nên hai software này không hề muốn compatible với nhau chút nào, làm người developers như tôi phải khổ sở để làm vừa ý, cho mashup chạy được cả hai bên. Code javascipt thì đúng rồi, mà bên này chạy còn bên kia thì không, chả hiểu tại sao????
Đó là "sự tích Youtube mashup" :-) Như bạn thấy, cũng chẳng có gì là bí hiểm, nói như Steve Jobs trong bài diễn văn ông đọc chào mừng ra trường, là ông chỉ biết cách "connect the dots" thôi. Tôi có dịch bài đó ở đây, nhân mùa tan trường mời bạn cùng xem lại.
http://hoctroviet.blogspot.com/2009/11/ban-phai-tim-thay-ieu-ban-yeu-thich-loi.html
Chúc bạn một đầu tuần thật vui.
Hoctro.
5/3/2010
Đăng ký:
Bài đăng (Atom)














































