tag:blogger.com,1999:blog-61868330477342221852024-02-19T23:54:42.507+08:00We love programmingAlvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comBlogger22125tag:blogger.com,1999:blog-6186833047734222185.post-80095230365049040882012-04-02T10:33:00.000+08:002012-04-02T10:35:05.063+08:00Google Map 8-bit Landscapes GalleryThe Google April fool 2012 is Google Map in 8-bit. It is freakin awesome and I have capture some landscapes around the world for you.<br />
<br />
Let's have the promotion clip from Google first:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/rznYifPHxDg" width="560"></iframe>
<br />
<br />
OK! Let's go!<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJRXhgIbDq05MhkNTIz6UyGtd0olwwp_IWu2Xc_-XDbgJxBkONb04hqD8VdyNkFH7X5Yj5Qpg5R4iawqSud-OKnG9XhJ6wfx84wFF5AzH8H8PenfxdCUs5cw_W0hEdO-6y0NhvPs7Ea-Z/s1600/hk1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCJRXhgIbDq05MhkNTIz6UyGtd0olwwp_IWu2Xc_-XDbgJxBkONb04hqD8VdyNkFH7X5Yj5Qpg5R4iawqSud-OKnG9XhJ6wfx84wFF5AzH8H8PenfxdCUs5cw_W0hEdO-6y0NhvPs7Ea-Z/s400/hk1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hong Kong Google office</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhyphenhyphen47dISNXvDyDe7AN5-2eDX51LkxE3rerSD0ZkTU-JAOaDYUMDE_9BQfTS5rtLLK5I22jwEAIOogOYaynOcp64y82jsAUUhy839SjMPoM0OxEx1PsmA6f817xbVpNDMSjWx0ic0qYFDqZ/s1600/hk2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhyphenhyphen47dISNXvDyDe7AN5-2eDX51LkxE3rerSD0ZkTU-JAOaDYUMDE_9BQfTS5rtLLK5I22jwEAIOogOYaynOcp64y82jsAUUhy839SjMPoM0OxEx1PsmA6f817xbVpNDMSjWx0ic0qYFDqZ/s400/hk2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The Ocean Park in Hong Kong, all parks around the world using Panda as the logo</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9bk71qOJkQstLDgXLivZfLVoLJfbUc6ZkJEFPSCsxR1sE0gxjEeRrGek3y_76MOsR9yFj7EQdOYVlgJm0_QmMEzEJbN8YgQAjQf_eoGPV2sns4g7HQWgqdb8H-fnClimLMzxnfDYS6XVP/s1600/tw1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9bk71qOJkQstLDgXLivZfLVoLJfbUc6ZkJEFPSCsxR1sE0gxjEeRrGek3y_76MOsR9yFj7EQdOYVlgJm0_QmMEzEJbN8YgQAjQf_eoGPV2sns4g7HQWgqdb8H-fnClimLMzxnfDYS6XVP/s400/tw1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Taiwan 101 tower</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMMu6vTY0iqO9yvQIgFQiYAEJKfXCXS2C9oTrtazZ5bIWM_MxhxGpxNOMQKE7tc2vwOAvCr8BJc6PRy4Pw0eOqCmJPdEv7707CTleYP8Fcd5rJPpQAv5G4_B0nzC8LaXTzDh1Vibg4utYj/s1600/jp1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMMu6vTY0iqO9yvQIgFQiYAEJKfXCXS2C9oTrtazZ5bIWM_MxhxGpxNOMQKE7tc2vwOAvCr8BJc6PRy4Pw0eOqCmJPdEv7707CTleYP8Fcd5rJPpQAv5G4_B0nzC8LaXTzDh1Vibg4utYj/s400/jp1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mountain Fuji in Japan</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4cXcIuLYbCzxQlz7aldEWgf8txt6OaAdYWJHsZbbTs16SI_GocsAEHnzSE9eac0ZE2sEEt74tZTbe_p2TY4TIVPbgEpSxOoC2_YzMWOHaam3SfXWLJKYS1_709rLO_WMSX-dX8tLx4beV/s1600/jp2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4cXcIuLYbCzxQlz7aldEWgf8txt6OaAdYWJHsZbbTs16SI_GocsAEHnzSE9eac0ZE2sEEt74tZTbe_p2TY4TIVPbgEpSxOoC2_YzMWOHaam3SfXWLJKYS1_709rLO_WMSX-dX8tLx4beV/s400/jp2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monster at Japan</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMHF87F4nyviPpfmWYOowT6ncwbtAg5gUlTRbtKEQmuN1DrXgDcLcRrcLFjCk3EI3LKqOsAP3rdA8jdyJmmsQnht8K3ckTPrRnz0Ywk2bpKtgnfPUGB5jrKRawtJBMhb5REQB7oeYm137c/s1600/jp3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMHF87F4nyviPpfmWYOowT6ncwbtAg5gUlTRbtKEQmuN1DrXgDcLcRrcLFjCk3EI3LKqOsAP3rdA8jdyJmmsQnht8K3ckTPrRnz0Ywk2bpKtgnfPUGB5jrKRawtJBMhb5REQB7oeYm137c/s400/jp3.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Slime and JR in Tokyo</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCmMsu2teDL4yuDSgtKlf9LEYt1uELJXYXcuC-Y3bsS965SiLvEn6Q2c6ZV59cUIP8WrJ1cwTIQsxW2jkazObnFrJigBGBPboifcd6lSSh-O3gvK1x4JfszRcg1mOAnX36mIA4WKnpZ1Lf/s1600/jp4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCmMsu2teDL4yuDSgtKlf9LEYt1uELJXYXcuC-Y3bsS965SiLvEn6Q2c6ZV59cUIP8WrJ1cwTIQsxW2jkazObnFrJigBGBPboifcd6lSSh-O3gvK1x4JfszRcg1mOAnX36mIA4WKnpZ1Lf/s400/jp4.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Osaka Castle</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizPVukF4narj6-IyWxu-MpafhPVUIiqEXP9jjX3zqxErLaQ76AZezVjk-6Skfa2_BXhIGVh3n1nHC61DiDcI09JmuHkxEnkzi9auhDCaycEv5F2BFZcGjXUZkzSXZ16J1-GS2TLL6lZEH5/s1600/jp5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizPVukF4narj6-IyWxu-MpafhPVUIiqEXP9jjX3zqxErLaQ76AZezVjk-6Skfa2_BXhIGVh3n1nHC61DiDcI09JmuHkxEnkzi9auhDCaycEv5F2BFZcGjXUZkzSXZ16J1-GS2TLL6lZEH5/s400/jp5.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Kyoto Tower</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdcT3YFuMO20DBs6smKYlh-ZX14u6MsvFikLZYyBDEbCO-hRvzSeKQSNc-1jZeVHlU8xTsPT0QkBtUA_BgKSswIJ8QVOTMB-eohkyRBd3oWv6h6b7wQuXI1DN_X2QOANz8jwtgqrwGrI6g/s1600/jp6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdcT3YFuMO20DBs6smKYlh-ZX14u6MsvFikLZYyBDEbCO-hRvzSeKQSNc-1jZeVHlU8xTsPT0QkBtUA_BgKSswIJ8QVOTMB-eohkyRBd3oWv6h6b7wQuXI1DN_X2QOANz8jwtgqrwGrI6g/s400/jp6.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Another castle in Kyoto</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOxUyb-wvaQB3fLT2-dVNCBc7nU2G8Hy1aT4kLWVHDgruObLUfo22g9LdietqNpSSsPr8Z1o9DuvvjCfNlv7IX5gMPhSR-bwXvdDvb2RKgKnUj3rc4aYzhlshOUXk0ebbtDV513SBiG-Zt/s1600/jp7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOxUyb-wvaQB3fLT2-dVNCBc7nU2G8Hy1aT4kLWVHDgruObLUfo22g9LdietqNpSSsPr8Z1o9DuvvjCfNlv7IX5gMPhSR-bwXvdDvb2RKgKnUj3rc4aYzhlshOUXk0ebbtDV513SBiG-Zt/s400/jp7.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Unknown characters at Kyoto</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVVCE3Wf5FI2TOps4jn-eHYxNPy0bVhcky-Y1HAtEE_aejCHgo1At9OkMrDnC3KbC4Vl0HH3tYXcWoYh1xqiEiGFXPuCneSc-jdlyEjmRFsxnJVbe_tgQq_Ax9coo8sERVsBa8zF-xWssD/s1600/pr1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVVCE3Wf5FI2TOps4jn-eHYxNPy0bVhcky-Y1HAtEE_aejCHgo1At9OkMrDnC3KbC4Vl0HH3tYXcWoYh1xqiEiGFXPuCneSc-jdlyEjmRFsxnJVbe_tgQq_Ax9coo8sERVsBa8zF-xWssD/s400/pr1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Eiffel tower in Paris</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlB8ZIj8-HPr4EImGLZ35k0IKwEliE9TvpbpezxTY-qddvlzHTgLzncJytrPAd31nv6rQ2qdPhduwdUc-xzmkcjHT9d8bbIponiZhmJ4IrivT7N5Rp09IHEG5VOzf1PBUAwazjM98hGBvD/s1600/pr2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlB8ZIj8-HPr4EImGLZ35k0IKwEliE9TvpbpezxTY-qddvlzHTgLzncJytrPAd31nv6rQ2qdPhduwdUc-xzmkcjHT9d8bbIponiZhmJ4IrivT7N5Rp09IHEG5VOzf1PBUAwazjM98hGBvD/s400/pr2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Arch of Triumph, France</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtK0xm8IIGa4Mmv5mQnl1dsmmIt8CbPVMwaV0yQNSsEFzQXtrU7BFumBfNvJkPdbfePkHl-y6o0ouJKeKnMDFzS4y9MmlxWDvUNKBwB14OLSqwSKbDyoaQln0xmYgPXsXAtFGQHnFTyixQ/s1600/us1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtK0xm8IIGa4Mmv5mQnl1dsmmIt8CbPVMwaV0yQNSsEFzQXtrU7BFumBfNvJkPdbfePkHl-y6o0ouJKeKnMDFzS4y9MmlxWDvUNKBwB14OLSqwSKbDyoaQln0xmYgPXsXAtFGQHnFTyixQ/s400/us1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Statue of Liberty in US</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGonPyePFOUQReORSlptb_vE78Yto9ZP05z7m0GQYEyBfYg0AC229PXLE-PbWpZf1PyizrbjwF9PXUzmDBxf7_9uZ94A8QbpnxFH41UnLwDOFUF333e9L0CGCv5Zlo9YNijeTYNnMM2ItA/s1600/us2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGonPyePFOUQReORSlptb_vE78Yto9ZP05z7m0GQYEyBfYg0AC229PXLE-PbWpZf1PyizrbjwF9PXUzmDBxf7_9uZ94A8QbpnxFH41UnLwDOFUF333e9L0CGCv5Zlo9YNijeTYNnMM2ItA/s400/us2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">New York</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9jq_c0B-Ps-Im5CrVcg9QXLxbiXdbOi7wISVx4XoZwyB3dRpIZpiGkQEKWses-eqBYbtQSD63Sb6mEO3Og_xQsOO6wsT76vryJ7JbXeC6rh2Q0lvJ_vB0l-FHgZu7jLyOZmOGYmdFRWW/s1600/us3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9jq_c0B-Ps-Im5CrVcg9QXLxbiXdbOi7wISVx4XoZwyB3dRpIZpiGkQEKWses-eqBYbtQSD63Sb6mEO3Og_xQsOO6wsT76vryJ7JbXeC6rh2Q0lvJ_vB0l-FHgZu7jLyOZmOGYmdFRWW/s400/us3.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The white house</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6ixPZlbpd44K4uemVsl-QX8_vvKEitusN34O0vz6uBMTuRRGGJfzEmUH0KuIMA3NcdaJgzmGGUUVsKIHJEiJa6PbSKrfW0rtNAB0deEUTa9-WYIzommeiUCcEUMklrLbdy4bCdfOa7qU/s1600/us4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU6ixPZlbpd44K4uemVsl-QX8_vvKEitusN34O0vz6uBMTuRRGGJfzEmUH0KuIMA3NcdaJgzmGGUUVsKIHJEiJa6PbSKrfW0rtNAB0deEUTa9-WYIzommeiUCcEUMklrLbdy4bCdfOa7qU/s400/us4.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Area 51</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7snRkIFYnXxhlDaCBckvTX73Uttb7o2MeWfr8psJwAoD8iJSaqNBq4bPCeJcIdOdg-ABNa-p5jCoG76xo_JFHdYx46jU3-KbBwhhre3EAA_YbQp2Ek6z5MdYENezx3pdCOMoLeRF8hLln/s1600/us5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7snRkIFYnXxhlDaCBckvTX73Uttb7o2MeWfr8psJwAoD8iJSaqNBq4bPCeJcIdOdg-ABNa-p5jCoG76xo_JFHdYx46jU3-KbBwhhre3EAA_YbQp2Ek6z5MdYENezx3pdCOMoLeRF8hLln/s400/us5.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mountain View Google headquarter</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsfvAYLNWyRGvWSR5hnf_7vdl9TbWeVl3K2H5BpGcPF9z92Re0BJgY5mm62aP0lABUD8Xew4EuaYKQjDUEyAcJ27hcow3jmjd-xF442HiOdh3bSafiiH6jLRncG5wg4oUYeywyeVTlsUW-/s1600/us6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsfvAYLNWyRGvWSR5hnf_7vdl9TbWeVl3K2H5BpGcPF9z92Re0BJgY5mm62aP0lABUD8Xew4EuaYKQjDUEyAcJ27hcow3jmjd-xF442HiOdh3bSafiiH6jLRncG5wg4oUYeywyeVTlsUW-/s400/us6.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monster at US</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBlPlTRPXtZm8U1b_29OQDcN2sBafLvdJgSY3FXsgyCdB7vuXQ29SkUuyFu3ZcHeVVQ2JN09HjR7Nda7xsqGEyo91hhHCwJAEoo7u6mcIqAJu9PhmHlZwbSuLPet-EL5ggC_ku6Oa256zE/s1600/us7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBlPlTRPXtZm8U1b_29OQDcN2sBafLvdJgSY3FXsgyCdB7vuXQ29SkUuyFu3ZcHeVVQ2JN09HjR7Nda7xsqGEyo91hhHCwJAEoo7u6mcIqAJu9PhmHlZwbSuLPet-EL5ggC_ku6Oa256zE/s400/us7.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hollywood</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgETLDSAqJja4rFWdgdbSjgqgy9MLuInI5lmnvB3q1yEnM-RDjtfZjgL3kFO-AZv3PVpu7KGlZFxY0XxO7Q2M6QUQSxH5PV6I3en7DaXMCT-iev75aIpAZ6wA5tVYLdesGOSp5UUTNuTh1I/s1600/us8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgETLDSAqJja4rFWdgdbSjgqgy9MLuInI5lmnvB3q1yEnM-RDjtfZjgL3kFO-AZv3PVpu7KGlZFxY0XxO7Q2M6QUQSxH5PV6I3en7DaXMCT-iev75aIpAZ6wA5tVYLdesGOSp5UUTNuTh1I/s400/us8.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Golden bridge gate</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaMOIrw8uDOK5Ocps1ccN8FvnVM3VhZFH_Djdgvr-VpbdFC73eRjrD-sZWFX5vbPqpmZXdqi9RZZ4dJUMAlmQxrSYmrc8A-milfwTlSLVqch-M0i_f6qcMwVWHXvz4WZf9qUx6Wzp9M4WN/s1600/us9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaMOIrw8uDOK5Ocps1ccN8FvnVM3VhZFH_Djdgvr-VpbdFC73eRjrD-sZWFX5vbPqpmZXdqi9RZZ4dJUMAlmQxrSYmrc8A-milfwTlSLVqch-M0i_f6qcMwVWHXvz4WZf9qUx6Wzp9M4WN/s400/us9.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Space Needle in Seattle</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGSd57k-V4oXfT5WkGavpBW4ho5ASwacnF3UrHbGmMbrYd19YnPviZ9sd90c8hlheUP5AcD2NQkbTdNpfoN6xzmeBXkcgXOnv_Maje5OGUdAmpkLXrOIR1RWhpIrPpVF2XRIfXN8zwSofw/s1600/cn1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGSd57k-V4oXfT5WkGavpBW4ho5ASwacnF3UrHbGmMbrYd19YnPviZ9sd90c8hlheUP5AcD2NQkbTdNpfoN6xzmeBXkcgXOnv_Maje5OGUdAmpkLXrOIR1RWhpIrPpVF2XRIfXN8zwSofw/s400/cn1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Shanghai Tower, China</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl6t5B-hNcU-r0onrTThh28gfexNxLxNchjxsqwIO9bm5VG8GSsJUNdVMyQYnZk0-GYELRZP4sGL7AvhjocxWCCR0kBXBLMCWtJdF11nqHXeINm5weKhn8NC_Ro7H3Dlv2-CZQ9x4hDAKq/s1600/au1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl6t5B-hNcU-r0onrTThh28gfexNxLxNchjxsqwIO9bm5VG8GSsJUNdVMyQYnZk0-GYELRZP4sGL7AvhjocxWCCR0kBXBLMCWtJdF11nqHXeINm5weKhn8NC_Ro7H3Dlv2-CZQ9x4hDAKq/s400/au1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Sydney Opera House</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVY4HXcmGAE7UQcWJDsQ96sCVKfcMQYDKiazYj1wBl_eqOzbcXcpGVCOB291VL_p_LOwOcZWoSZ5QWT4ciF2O6Kpo0TLzl0TMoYs-leG9G6SagQUaLfddsaKHqXRzkp6P-IFMs3_zcS_xS/s1600/au2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVY4HXcmGAE7UQcWJDsQ96sCVKfcMQYDKiazYj1wBl_eqOzbcXcpGVCOB291VL_p_LOwOcZWoSZ5QWT4ciF2O6Kpo0TLzl0TMoYs-leG9G6SagQUaLfddsaKHqXRzkp6P-IFMs3_zcS_xS/s400/au2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Melbourne</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrOLC6dXz310hYdGGdAzVMVzVqPTK1SA7ABTWl4z_dUkSB1otNR9MFpVx7v7wL4WrHdVsxweaUWDl7MWWaAhuFSC-5qSs522e3CCswQx6XeacQmDoKLyCgLmQGERZTSi0PigZAPDz_ZNss/s1600/au3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrOLC6dXz310hYdGGdAzVMVzVqPTK1SA7ABTWl4z_dUkSB1otNR9MFpVx7v7wL4WrHdVsxweaUWDl7MWWaAhuFSC-5qSs522e3CCswQx6XeacQmDoKLyCgLmQGERZTSi0PigZAPDz_ZNss/s400/au3.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monster at Tasmania, Australia</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRVEEA3CiU3a_jihfEWL9gvQTAcsnUpGwmy6TPcudXF6PMtXSPG-Ro_eI156YTMfPucdEKbUvmtF-CfHL2SVM9pWO2T2h5rL_zyzc9ex3WQ2EJHTEmdSUQ-HaZn8Q6-zgDvitXT3hDvRP/s1600/my1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmRVEEA3CiU3a_jihfEWL9gvQTAcsnUpGwmy6TPcudXF6PMtXSPG-Ro_eI156YTMfPucdEKbUvmtF-CfHL2SVM9pWO2T2h5rL_zyzc9ex3WQ2EJHTEmdSUQ-HaZn8Q6-zgDvitXT3hDvRP/s400/my1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Petronas Twin Towers,Kuala Lumpur City Centre</span></td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkcYTXYGi9ScnzIMnBkeOMN3EF3vwOoD2fengDHtzegRTGsstFP3ZY3cWFnM6DoVBj0U70aNNyqm4weE1pMh51u7T4hnhq7P6BaAiNcLhKCi1M0SDRshbFPXGzhJkqz8eyhpJDB4Bfaj7s/s1600/eg1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkcYTXYGi9ScnzIMnBkeOMN3EF3vwOoD2fengDHtzegRTGsstFP3ZY3cWFnM6DoVBj0U70aNNyqm4weE1pMh51u7T4hnhq7P6BaAiNcLhKCi1M0SDRshbFPXGzhJkqz8eyhpJDB4Bfaj7s/s400/eg1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">The Pyramids</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiveN_C_kchGAnKo8YFZMwzk-Qq05IiOSVTVu8ZcweGp3MplRP-O2P__5YVFEO7w4mN2et3hqtV9MvBHBfxTMY2PjO4JgtIfgOf3oJCNqbNSSrnWF3yOTjnvM96BYJbn8cppHSIqQ6T334o/s1600/aa1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiveN_C_kchGAnKo8YFZMwzk-Qq05IiOSVTVu8ZcweGp3MplRP-O2P__5YVFEO7w4mN2et3hqtV9MvBHBfxTMY2PjO4JgtIfgOf3oJCNqbNSSrnWF3yOTjnvM96BYJbn8cppHSIqQ6T334o/s400/aa1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dragon at the center of the world</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlA7HoIvjsMvlOKZWeOtRTEwGmeT4WdIoQkW5mADiYyM2p52UJhK4SBiYrYSQpoxQlCahsK5m290w1ckKS9uxGV4FZMJS9VqmLJFaao4IemFb13znS1pXXYjIxK_UvrlkTTsm1SPLurNym/s1600/aa2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlA7HoIvjsMvlOKZWeOtRTEwGmeT4WdIoQkW5mADiYyM2p52UJhK4SBiYrYSQpoxQlCahsK5m290w1ckKS9uxGV4FZMJS9VqmLJFaao4IemFb13znS1pXXYjIxK_UvrlkTTsm1SPLurNym/s400/aa2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Buckingham Palace</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1p3PLRj7gzO0RaZ_0tioDZON7_jafjN6bSqO0i9C5qUBXaIYo_mH6d7_UZX8yF9ASo1zCbp9CGjtiyEOiNm-ZmTh7UoJF1Xsw3rzbz4Zrn8hyphenhyphenfJfRrMGZslkHfI6Xem8c_zXb1upHFYmE/s1600/aa3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1p3PLRj7gzO0RaZ_0tioDZON7_jafjN6bSqO0i9C5qUBXaIYo_mH6d7_UZX8yF9ASo1zCbp9CGjtiyEOiNm-ZmTh7UoJF1Xsw3rzbz4Zrn8hyphenhyphenfJfRrMGZslkHfI6Xem8c_zXb1upHFYmE/s400/aa3.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monster at <span class="st">Loch Ness</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjllpxURI7NlNDcPZkdyhLny9pehTlV5EHZFBC7lsa1Psq-bxQjoNRASfpvILTSwm_wYwQU2iS6wJd0ZQp5mxKenx8FoU-k16ILLaBCYUowaX1L2tP7BlZnTVzjX07_bw7iWWerGrIIMbDl/s1600/aa4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjllpxURI7NlNDcPZkdyhLny9pehTlV5EHZFBC7lsa1Psq-bxQjoNRASfpvILTSwm_wYwQU2iS6wJd0ZQp5mxKenx8FoU-k16ILLaBCYUowaX1L2tP7BlZnTVzjX07_bw7iWWerGrIIMbDl/s400/aa4.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monster at Deutschland</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWl9OmoqrRuITiazYsDwKVtQuzVvJRw3jmoPfe8qUNLGWqDJosKASHaxZrRxtXBxtHyUqHq0_5TZEwYaaBYOTX1ZmKyxG57T0bt_1oqRe9ag5GphXRWHFQ0DWlZ34ibnxIuwIbixsjhP2/s1600/aa5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibWl9OmoqrRuITiazYsDwKVtQuzVvJRw3jmoPfe8qUNLGWqDJosKASHaxZrRxtXBxtHyUqHq0_5TZEwYaaBYOTX1ZmKyxG57T0bt_1oqRe9ag5GphXRWHFQ0DWlZ34ibnxIuwIbixsjhP2/s400/aa5.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Jesus mountain</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvFfeX1ctRGVVuZ5BG0r7uD4OW7PM4GJ2Xjid_F-ZRCWloZNFiNz4b1XsxsNsb52BzNa7R5U6bIO0IqVtBe5B-tSE-jIHBf2K076o6SeqemexM86px5R1Tutr7sghs12lUKpJK_TaZw4ou/s1600/aa6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvFfeX1ctRGVVuZ5BG0r7uD4OW7PM4GJ2Xjid_F-ZRCWloZNFiNz4b1XsxsNsb52BzNa7R5U6bIO0IqVtBe5B-tSE-jIHBf2K076o6SeqemexM86px5R1Tutr7sghs12lUKpJK_TaZw4ou/s400/aa6.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Roman Coliseum</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV0YauVnS4mP87NPPU0uqlhBAu61fsC1XpUoNFGwMbR6MCkRNC97xSndT6toXWxnjyttJhbNzyY6TTn_new8K8ZbvMLF1ml8hfTRIjFc8H97Zh9XtD1TRXRADS25USQiFq5ccUcjBfo8QF/s1600/aa7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV0YauVnS4mP87NPPU0uqlhBAu61fsC1XpUoNFGwMbR6MCkRNC97xSndT6toXWxnjyttJhbNzyY6TTn_new8K8ZbvMLF1ml8hfTRIjFc8H97Zh9XtD1TRXRADS25USQiFq5ccUcjBfo8QF/s400/aa7.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Moai</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKGRI8UvqJKomISbsSSjneEI-VlHP74VUV5TWyTVzE6MOQTyZq_eQmjFXUMpxKxPJTmB_0fJQFzA8EOVxFn-SEdWZiOYdwrGEC7jzBye3RZ2fxe5Q80SGzoZief8aeQdt5gPueJaUd_Z_E/s1600/aa8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKGRI8UvqJKomISbsSSjneEI-VlHP74VUV5TWyTVzE6MOQTyZq_eQmjFXUMpxKxPJTmB_0fJQFzA8EOVxFn-SEdWZiOYdwrGEC7jzBye3RZ2fxe5Q80SGzoZief8aeQdt5gPueJaUd_Z_E/s400/aa8.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Sagrada Familia</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoo7J1SgyX4ikb-dTtX_DT3q9Aj_5Yfx3n8QXYVU7notcvUOiWHzJ-xQldz_a3zX5sNMc1QclrB9TGZIx5l5WP1sZIRr6oMYp1isuucXSR-pxH9X4-kWHgyyZ57RNBNHre7Ue6UTn-snuE/s1600/aa9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoo7J1SgyX4ikb-dTtX_DT3q9Aj_5Yfx3n8QXYVU7notcvUOiWHzJ-xQldz_a3zX5sNMc1QclrB9TGZIx5l5WP1sZIRr6oMYp1isuucXSR-pxH9X4-kWHgyyZ57RNBNHre7Ue6UTn-snuE/s400/aa9.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Berli </span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWuRJK76zUFkA_ZaxHSd4pX4-rGxeekOql40e5De8HLPW1ItBEFrDECCJcFQlXD-dzoQvEMlYypH4_JrMFzJZvJgYp4x5pvABzRnbuh5JclSxg875BJ-r3I2Fr0h7nU1SDXf2z6TR1Vkqa/s1600/aa10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWuRJK76zUFkA_ZaxHSd4pX4-rGxeekOql40e5De8HLPW1ItBEFrDECCJcFQlXD-dzoQvEMlYypH4_JrMFzJZvJgYp4x5pvABzRnbuh5JclSxg875BJ-r3I2Fr0h7nU1SDXf2z6TR1Vkqa/s400/aa10.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span class="st">Leaning Tower of Pisa</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUylkRL-nSzKfpQa3NB82dA4NfdUTmv3nAjXeTOUGsDYqii_m2chSM-kMs8DA0JkyIe2bMisEuuIGPES49Y0cgG0HSPb6j980antcVUe_PnchoAaRs74j-bibUsvo_o5jgrJk6IR17iOyD/s1600/aa11.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-pinit="registered" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUylkRL-nSzKfpQa3NB82dA4NfdUTmv3nAjXeTOUGsDYqii_m2chSM-kMs8DA0JkyIe2bMisEuuIGPES49Y0cgG0HSPb6j980antcVUe_PnchoAaRs74j-bibUsvo_o5jgrJk6IR17iOyD/s400/aa11.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">London Bridge</td></tr>
</tbody></table>
If you found more landscape in 8-bit. Please tell me!<br />
<br />
<br />
<br />
<br />
<br />
<br />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-52383077788394361932012-03-26T18:27:00.001+08:002012-03-27T15:39:09.522+08:00Missing 'type' field from Facebook Graph API result<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGBG-uDzg_jLbIiYQwt9sFEP4AXy-bB88lHnNsAcPKdOxFX4z3RFgCMQzuftQ4Q7sjXwgAoHj2QE1P7cET3WutTFfyMyQMcEqbelaK8TgDeHexV3F1bXgiuz_Dh0LXzsqhZgG5EBehqnk/s1600/ishot-44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGBG-uDzg_jLbIiYQwt9sFEP4AXy-bB88lHnNsAcPKdOxFX4z3RFgCMQzuftQ4Q7sjXwgAoHj2QE1P7cET3WutTFfyMyQMcEqbelaK8TgDeHexV3F1bXgiuz_Dh0LXzsqhZgG5EBehqnk/s320/ishot-44.png" width="320" /></a></div>
Last Friday I have joined Facebook Mobile Hack event which held at Hong Kong. I have learnt alot and want to build something by Facebook Graph API for fun. The first thing I have to try is retrieving my feed in Facebook. However I found that if I retrieving the information from the Facebook Graph API Explorer it return a 'type' field for the post such as status, link, video, checkin, etc, but the 'type' field is missing if I use Javascript SDK to retreive the post.<br />
<br />
After do some googling, I found out the answer and I think it's worth to share. Just add "<b>?metadata=true</b>" at the end of query will work fine.<br />
<br />
<br />
<code>
<html><br /><head><br /> <title>Testing</title><br /> <link rel="stylesheet" type="text/css" href="style.css"><br /> <meta name="viewport" content="initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /><br /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script><br /></head><br /><body><br /><br /><div id="fb-root"></div><br /><br /><script><br />(function() {<br /> var e = document.createElement('script'); e.async = true;<br /> e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';<br /> document.getElementById('fb-root').appendChild(e);<br />}())<br /><br />window.fbAsyncInit = function() {<br /> FB.init({ appId: 'YOUR_APP_ID',<br /> status: true,<br /> cookie: true,<br /> xfbml: true,<br /> oauth: true})<br />checking();<br />};<br /><br /><b>function checking() {<br /> FB.api('/414866888308?metadata=true', function(response) { // retrieving checkin ID<br /> // the response.type come out finally<br /> <br /> });<br />}</b><br /><br />function login() {<br /> FB.login(function(response) { }, {scope:'user_likes'});<br />}<br /><br /></script><br /></body><br /></html><br /> </code>
<br />
<br />
<b>Here is the book you may feel interested:
</b><br />
<a href="http://www.amazon.com/gp/product/1615641181/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1615641181"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=1615641181&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1615641181" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-89394119960134689962012-03-05T14:41:00.001+08:002012-03-27T15:49:25.575+08:00PHP function that get query from search engine<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0U1oVReFI1823IdAKV3Cc8wlq-NnrYnxT2uwpDE4vMc5GviA4sVbCQXmHV3NlBJ6nD_YgfwKk5XmqgyDDD_mHwrIXcBZ_4aw3RJx-KWfb18B3GCh1e6QiXy5L38N__CwCLWbDfGgpGNw/s1600/SearchEngine.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0U1oVReFI1823IdAKV3Cc8wlq-NnrYnxT2uwpDE4vMc5GviA4sVbCQXmHV3NlBJ6nD_YgfwKk5XmqgyDDD_mHwrIXcBZ_4aw3RJx-KWfb18B3GCh1e6QiXy5L38N__CwCLWbDfGgpGNw/s1600/SearchEngine.jpg" /></a></div>
SEO (Search Engine Optimisation) take an important role for the success of your online business. For someone you may not know what is SEO, here is the definition from <a href="http://en.wikipedia.org/wiki/Search_engine_optimization" target="_blank">wiki</a>.
<br />
<br />
Search engine optimization (SEO) is the process of improving the visibility of a website or a web page in search engines via the "natural," or un-paid ("organic" or "algorithmic"), search results. In general, the earlier (or higher ranked on the search results page), and more frequently a site appears in the search results list, the more visitors it will receive from the search engine's users. SEO may target different kinds of search, including image search, local search, video search, academic search,news search and industry-specific vertical search engines.<br />
<br />
Indeed, you may want to know more how your customers go to your site through search engine. This is a function to track the search query on search engine before a user goes to your site.<br />
<br />
<br />
<code>
function search_engine_query_string($url = false) {<br /><br /> if(!$url) {<br /> $url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : false;<br /> }<br /> if($url == false) {<br /> return '';<br /> }<br /><br /> $parts = parse_url($url);<br /> parse_str($parts['query'], $query);<br /><br /> $search_engines = array(<br /> 'about' => 'terms',<br /> 'alice' => 'qs',<br /> 'alltheweb' => 'q',<br /> 'altavista' => 'q',<br /> 'aol' => 'q',<br /> 'aol.' => 'query',<br /> 'aol..' => 'encquery',<br /> 'answers' => 's',<br /> 'aolsearch' => 'q',<br /> 'ask' => 'q',<br /> 'baidu' => 'wd',<br /> 'bing' => 'q',<br /> 'cnn' => 'query',<br /> 'daum' =>'q',<br /> 'eniro' => 'search_word',<br /> 'ekolay' => 'q',<br /> 'google' => 'q',<br /> 'google.se' => 'as_q', // seen on google.se<br /> 'images.google' => 'q',<br /> 'kvasir' => 'q',<br /> 'live' => 'q',<br /> 'lycos' => 'query',<br /> 'mamma' => 'query',<br /> 'msn' => 'q',<br /> 'mynet' => 'q',<br /> 'naver' => 'query',<br /> 'najdi' => 'q',<br /> 'netscape' => 'query',<br /> 'onet' => 'qt',<br /> 'ozu' => 'q',<br /> 'pchome' => 'q',<br /> 'rambler' => 'words',<br /> 'search' => 'q',<br /> 'sesam' => 'q',<br /> 'seznam' => 'q',<br /> 'sNOWsh' => 'q',<br /> 'szukacz' => 'q',<br /> 'terra' => 'query',<br /> 'voila' => 'rdata',<br /> 'virgilio' => 'qs',<br /> 'wp' => 'szukaj',<br /> 'yahoo' => 'p',<br /> 'yam' => 'k',<br /> 'yandex' => 'text'<br /> );<br /><br /> preg_match('/(' . implode('|', array_keys($search_engines)) . ')\./', $parts['host'], $matches);<br /><br /> return isset($matches[1]) && isset($query[$search_engines[$matches[1]]]) ? $query[$search_engines[$matches[1]]] : '';<br /><br />}
</code>
<br />
<br />
<b>Books you may feel interested:
</b><br />
<a href="http://www.amazon.com/gp/product/0596101015/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0596101015"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=0596101015&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=0596101015" style="border: none !important; margin: 0px !important;" width="1" />
<a href="http://www.amazon.com/gp/product/0596518862/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0596518862"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=0596518862&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=0596518862" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-58674743544964692352012-01-07T16:30:00.001+08:002012-03-27T15:50:22.835+08:00Mysql fastest distance lookup given latitude/longitude<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5tudbhDTYyAbROzRDwQ72Wvdirp6plv5sE265td55fnUb6o0gLsObYhiBFrZ1DKx9TmePQJrtUykEBJxLRxz41hZFK_s7EEFPz-642CmZPIizSmzFBYMuAKoKmA6HtfSkwqmJOgjHIg/s1600/lbs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik5tudbhDTYyAbROzRDwQ72Wvdirp6plv5sE265td55fnUb6o0gLsObYhiBFrZ1DKx9TmePQJrtUykEBJxLRxz41hZFK_s7EEFPz-642CmZPIizSmzFBYMuAKoKmA6HtfSkwqmJOgjHIg/s320/lbs.png" width="273" /></a></div>
<br />
Recently I have developed an Android application, which is an LBS(location-based services) application. This application is in Chinese, but the name in English is "<a href="https://market.android.com/details?id=info.hkdevelopers.HKChainStore" target="_blank">Hong Kong chain store</a>" (香港連鎖店). I have got a list of branch in my database, and the app can help user to find out all branch nearby.<br />
<br />
The question is, how to retrieve the distance between user location and branch location in the most fastest way. I think most of people just store the latitude and longitude of the location in database. And the code loop through the whole database and calculate the distance record by record. But running the code by this method is very time consuming. We need a much more faster way.<br />
<br />
I have google around and got the answer in <a href="http://stackoverflow.com/questions/1006654/fastest-distance-lookup-given-latitude-longitude" target="_blank">stackoverflow</a>. However, I found that there is some typo in the answer, and it is not a complete answer. So right now I make a summary to tackle this question.<br />
<br />
I assumed that you have got the latitude(lat) and longitude(lng) point of your locations in database. But this is not enough, you should open one more field that store a geo point of the location(latlng) and create a spatial index on it. Here is the SQL statement to make this field when you create the table, <br />
<blockquote class="tr_bq">
CREATE TABLE geom (latlng GEOMETRY NOT NULL, SPATIAL INDEX(latlng)) ENGINE=MyISAM;</blockquote>
Please note that the field [latlng] should be in GEOMETRY type. If you have already create the field, you can use ALERT command to create spatial index.<br />
<blockquote class="tr_bq">
CREATE SPATIAL INDEX sp_index ON geom (latlng); </blockquote>
Then, run the following SQL to update [latlng] field.<br />
<blockquote class="tr_bq">
UPDATE geom SET latlng = POINT(lat, lng)</blockquote>
OK, that is all the things for database. Here is the PHP script in your code. Assume that you have to find all locations not more then 0.5km distance. <br />
<blockquote class="tr_bq">
$orglng = $_GET["user_lng"];<br />
$orglat = $_GET["user_lat"];<br />
$distance = 0.5;<br />
<br />
$pt1 = $orglat + $distance / ( 111.1 / cos($orglat));<br />
$pt2 = $orglng + $distance / 111.1;<br />
$pt3 = $orglat - $distance / ( 111.1 / cos($orglat));<br />
$pt4 = $orglng - $distance / 111.1;<br />
<br />
$qry = "SELECT * ";<br />
$qry .= "FROM geom ";<br />
$qry .= "WHERE MBRContains(GeomFromText('LineString(".$pt1." ".$pt2.", ".$pt3." ".$pt4.")'), latlng)";</blockquote>
Here is what you need! Test it yourself now.<br />
<br />
Happy coding!<br />
<br />
<b>Book you may feel interested:</b><br />
<a href="http://www.amazon.com/gp/product/0596101716/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0596101716"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=0596101716&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=0596101716" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-47042834617804588012012-01-06T12:23:00.000+08:002012-01-06T12:23:04.923+08:00Facebook Hacker Cup 2012<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2c3P1EhtgGzWvrLhjlLJdu_zfa57xPj0HPodBO0DT-L7f3Tb0ot_2ItnP2-VGTbo8P1cSaL_eC-uWOVXwyo3n-wOAoW2UzKxTlUsEoWZC1tHrqiq-eSRkiTY3EbFWYGvh6Q1aOp_AJ9Q/s1600/hackercup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2c3P1EhtgGzWvrLhjlLJdu_zfa57xPj0HPodBO0DT-L7f3Tb0ot_2ItnP2-VGTbo8P1cSaL_eC-uWOVXwyo3n-wOAoW2UzKxTlUsEoWZC1tHrqiq-eSRkiTY3EbFWYGvh6Q1aOp_AJ9Q/s320/hackercup.jpg" width="320" /></a></div><br />
<br />
Facebook Hacker Cup is open for registration now. Frankly speaking, if you love programming, you should try it. I have joined this contest last year. You may mislead by the contest name. Actually it is not related to "hack" anymore. It is just a purely programming competition. Understanding the question, solve the problem with your prefer programming language, download the data set from facebook and submit your result, that is.<br />
<br />
Comparing with Google Codejam, I feel the question from facebook is much more easy to understand. But since you have to submit your answer within certain time, you have to optimize the running process of your code. Most likely there is a math formula or philosophy behind. If you didn't notice it, I bet your code cannot return the result in time.<br />
<br />
Anyway, get it a try if you love programming.<br />
<br />
Registration: <a href="https://www.facebook.com/notes/facebook-engineering/announcing-facebooks-2012-hacker-cup/10150468260528920">https://www.facebook.com/notes/facebook-engineering/announcing-facebooks-2012-hacker-cup/10150468260528920</a>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-50581902265747131352011-10-20T15:51:00.001+08:002012-03-27T15:51:25.222+08:00[HTML5] Using canvas element and javascript to modify imageDemo: <br />
<br />
<blockquote>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript">
</script> <br />
<script>
function genImage() {
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
var bgsrc = document.createElement("img");
bgsrc.src = "data:image/jpeg;base64,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";
bgsrc.onload = function(){
context.drawImage(this, 0,0);
context.fillStyle = '#000000';
context.font = "bold 28px 'Lucida Grande',Helvetica,Arial,Verdana,sans-serif";
context.fillText($("#message").val(), 160, 130);
var imgsrc = canvas.toDataURL('image/jpeg');
$("#img").attr("src",imgsrc);
}
}
$(document).ready(function(){
genImage();
});
</script><br />
<canvas height="266" id="myCanvas" style="display: none;" width="400"></canvas><br />
<img id="img" src="https://lh4.googleusercontent.com/-6Y6TdPz2CdE/Tp-V1KgAJHI/AAAAAAAAEGA/eOvQOtgwFuY/s400/11%252520-%2525201.jpg" /><br />
<input id="message" maxlength="20" type="text" value="Hello Hello!" /> <input onclick="genImage()" type="button" value="Generate" /></blockquote>
<br />
<br />
HTML5 Canvas is an HTML element that its contents can be rendered with Javascript. This time we will go through how to use HTML5 canvas to add text to the top layer of image. The first thing we have to prepare is a picture. Eventually I found this picture on web and it is quite suitable for this showcase. We can put a message at the paper.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6Y6TdPz2CdE/Tp-V1KgAJHI/AAAAAAAAEGA/eOvQOtgwFuY/s1600/11+-+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/-6Y6TdPz2CdE/Tp-V1KgAJHI/AAAAAAAAEGA/eOvQOtgwFuY/s320/11+-+1.jpg" width="320" /></a></div>
<br />
OK, here is the code.<br />
<code><script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> <br />
<script><br />
<br />
function genImage() {<br />
var canvas = document.getElementById("myCanvas");<br />
var context = canvas.getContext("2d");<br />
<br />
var bgsrc = document.createElement("img");<br />
bgsrc.src = "[image path]";<br />
<br />
bgsrc.onload = function(){<br />
<br />
context.drawImage(this, 0,0);<br />
<br />
context.fillStyle = '#000000';<br />
context.font = "bold 28px 'Lucida Grande',Helvetica,Arial,Verdana,sans-serif";<br />
context.fillText($("#message").val(), 160, 130);<br />
<br />
var imgsrc = canvas.toDataURL('image/jpeg');<br />
$("#img").attr("src",imgsrc);<br />
}<br />
<br />
}<br />
<br />
$(document).ready(function(){<br />
genImage();<br />
});<br />
</script><br />
<canvas id='myCanvas' width='400' height='266' style="display:none;"></canvas><br />
<img id="img" src="https://lh4.googleusercontent.com/-6Y6TdPz2CdE/Tp-V1KgAJHI/AAAAAAAAEGA/eOvQOtgwFuY/s400/11%252520-%2525201.jpg"><br />
<p><br />
<input type="text" value="Hello Hello!" maxlength="20" id="message"> <input type="button" value="Generate" onClick="genImage()"><br />
</p></code><br />
<br />
In this example, JQuery has been chosen to simplify javascript calling. It can save lots of development time. Then, we should define the canvas area first.<br />
<br />
<blockquote>
<canvas id='myCanvas' width='400' height='266' style="display:none;"></canvas></blockquote>
This is the code that define the canvas named <b><i>myCanvas </i></b>with dimension 400x266. It is the same with the picture size. The canvas is just a place for processing the image data. We will render the final image to a HTML image tag at the last step. We should give an ID to a image tag for the final image holder. <br />
<br />
<blockquote>
<img id="img" src="https://lh4.googleusercontent.com/-6Y6TdPz2CdE/Tp-V1KgAJHI/AAAAAAAAEGA/eOvQOtgwFuY/s400/11%252520-%2525201.jpg"></blockquote>
For the source image <i><b>bgsrc</b></i>, you can supply a relative path or base64 data of an image. But please note that URL is not a choice because it will cause security problem and you will got an javascript error.<br />
<br />
OK, after the source image has been completely loaded, the first thing we have to draw the image again. Then, draw the text message and tune the position over the image.<br />
<br />
<blockquote>
context.drawImage(this, 0,0);<br />
<br />
// write clock<br />
context.fillStyle = '#000000';<br />
context.font = "bold 28px 'Lucida Grande',Helvetica,Arial,Verdana,sans-serif";<br />
context.fillText($("#message").val(), 160, 130);</blockquote>
At the last, export the data at canvas to base64 image data, and assign it to the image tag <b><i>#img</i></b>. Here you go.<br />
<br />
One more point you have to pay attention, word-wrap function is not support with in canvas area now. You have to develop your own word-wrap function for workaround. <br />
<br />
Recently, iPhone 4S is the hottest topic around the world. I developed an application, which using canvas, to generate the conversation between Siri and me. <br />
<br />
<a href="http://siri.we-love-programming.com/">http://siri.we-love-programming.com</a><br />
<br />
Check it out.<br />
<br />
<b>Book you may feel interested:</b><br />
<a href="http://www.amazon.com/gp/product/1849691363/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1849691363"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=1849691363&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1849691363" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-15070103529338588182011-10-18T18:47:00.000+08:002012-03-27T15:53:33.948+08:00Siri can tell - tool created by HTML5 canvas function<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD1oy_wBaZP0eudHDyTn9DV7_xdrYtgTTppf3KLcH6joChFKgrytja0xW6FFFvMBG7HI1JKLuUPfRV1EQHyuUEnnAQOci0nEszjCqtLuLf6tJyiz6-UB7IS6cN7hyphenhyphenl6LVukNGqnp6wpyg/s1600/sirifavoritecolor.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD1oy_wBaZP0eudHDyTn9DV7_xdrYtgTTppf3KLcH6joChFKgrytja0xW6FFFvMBG7HI1JKLuUPfRV1EQHyuUEnnAQOci0nEszjCqtLuLf6tJyiz6-UB7IS6cN7hyphenhyphenl6LVukNGqnp6wpyg/s200/sirifavoritecolor.PNG" width="133" /></a></div>
iPhone4S is the hottest topic recently. The most innovative function for iPhone4S should be the app - Siri. According to Apple website, Siri lets your voice to send messages, schedule meetings, place phone calls, and more. I think lots of you guys must want to try it. Yes. I also want to try it but I can't buy iPhone4S in my region right now.<br />
<br />
<br />
<br />
Inspired by my friend <a href="http://blog.chiuto.com/profile">Chiuto</a>, I have developed a tool (called Siri can tell) that can generate a screen shot of Siri with my tailor-made conversation. The technology at the back end is canvas function by HTML5. By using canvas, you can generate a image at client side on fly. It's pretty cool huh. So, please try the tool at<br />
<br />
<a href="http://siri.we-love-programming.com/">http://siri.we-love-programming.com</a><br />
<br />
Also, feel free to give me your comment. Thanks.<br />
<br />
If you would like to start building HTML5 canvas application too, read this:<br />
<br />
<a href="http://www.amazon.com/gp/product/144939390X/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=144939390X"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=144939390X&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=144939390X" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-42243705404197154112011-10-15T15:10:00.006+08:002012-03-27T16:11:20.563+08:00Generating QR code by Google Chart API<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL9loMKDpMw1vurExB6X8PqCahqQTT4MviJzSH4gIHXns9E8X1KK5lEQt6MAWLG-FEUlsnQazIGKLkATGfDkGxWdOlIOenmHESLb6GKmOrNitY8FiuoHw4S8xNjFrecosO9JV_OJLTdxY/s1600/chart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL9loMKDpMw1vurExB6X8PqCahqQTT4MviJzSH4gIHXns9E8X1KK5lEQt6MAWLG-FEUlsnQazIGKLkATGfDkGxWdOlIOenmHESLb6GKmOrNitY8FiuoHw4S8xNjFrecosO9JV_OJLTdxY/s1600/chart.png" /></a></div>
<br />
Google provide lots of API for developers to develop their own tools. Today I would like to go through a funny feature from Google Chart Tools - QR code generating.<br />
<br />
<br />
Developer always have to come across with tons of data and make it to a presentable report for end-users. Google Chart Tools can save your a day. However, we just focus on QR code generating function today. If you interest in it, check it out at <a href="http://code.google.com/apis/chart/">http://code.google.com/apis/chart/.</a><br />
<br />
<br />
Generating QR code by Google API is just a piece of cake. You just have to append your target message to a URL. Here is an example.<br />
<br />
<br />
I want to make a QR code with a message 'We love programming.', here we go<br />
https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=We%20love%20programming<br />
<br />
<br />
Actually it will be a image if you click on it. The parameter <i><b>chs </b></i>is <i><b>widthxheight</b></i>. Parameter <i><b>chl </b></i>is the message or URL you want to include. Please do URL encode for your message.<br />
<br />
<br />
I have written a snippet of code to generate QR code by current URL automatically.<br />
<br />
<code><div id="qrcode"></div><br />
<script><br />
var img = document.createElement('img');<br />
img.src = 'https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=' + encodeURIComponent(document.location.href);<br />
document.getElementById('qrcode').appendChild(img);<br />
</script></code><br />
<br />
<br />
Here is just the core function. You can also design your own interface to make a nice QR code generator. For more details, check out the document of Google, <a href="http://code.google.com/apis/chart/infographics/docs/overview.html">http://code.google.com/apis/chart/infographics/docs/overview.html</a><br />
<br />
You can build QR code easily with Google Chart API now, but how QR code can help on your business? Try to read this:<br />
<a href="http://www.amazon.com/gp/product/1456347837/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1456347837"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=1456347837&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1456347837" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-32901160591645415232011-10-04T22:55:00.007+08:002012-03-28T18:01:43.344+08:00First Google+ API application - Google+ Geolocation Timeline<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXgiqYwukyTjSb2a2Mo1d6s5LEvKPPVD_KZdktSXI7bOCxWL4JG5WlOpSYLQWgEwWK8KQdb-Y5XaoTYhX_3i2FgSxJ0x14-N2jXBguhcBJDzcXRdHi_K_xI__O7NuSga9N9Ontw2e19A/s1600/gplusmap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsXgiqYwukyTjSb2a2Mo1d6s5LEvKPPVD_KZdktSXI7bOCxWL4JG5WlOpSYLQWgEwWK8KQdb-Y5XaoTYhX_3i2FgSxJ0x14-N2jXBguhcBJDzcXRdHi_K_xI__O7NuSga9N9Ontw2e19A/s400/gplusmap.png" width="400" /></a></div>
<br />
Google+ API has been introduced by Google at mid Sept 2011. Just use my spare time to come across with this and create an application. Hopefully, it is the first application that made with Google+ API. (Please let me know if I am wrong)<br />
<br />
So far, Google+ API is quite handy. However, sample code may not enough for developer for reference. Besides, just only few of methods provided now. For example, user's circle cannot be retrieved by API. Looking forward for Google to enhance this.<br />
<br />
Since Google+ API is very new at this moment, I can just find one book only (<a href="http://www.amazon.com/gp/product/1449312268/ref=as_li_tf_tl?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1449312268">Developing with Google+</a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1449312268" style="border: none !important; margin: 0px !important;" width="1" />)
for teaching the technique on how to use this API. But anyway, let's try my first Google+ API application.<br />
<br />
<a href="http://www.foodogram.me/gplusmap/">http://www.foodogram.me/gplusmap/</a><br />
<br />
This application is mapping your Google+ check-in activities in Google Map. I will upload all source code to github later on. Welcome for any comments.<br />
<br />
Book you may feel interested:<br />
<a href="http://www.amazon.com/gp/product/0789749149/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=0789749149"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=0789749149&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" ></a><img src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=0789749149" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-29201706469644249342011-09-26T09:52:00.000+08:002011-09-26T09:52:44.931+08:00Subscribe Google Calendar into iPhoneFirst of all, you have to prepare your calendar at Google Calendar first. You may create a new calendar inside your account, or export existing calendar. In this article, we create a new calendar to demonstrate the process.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy_d2KkyDNGZCLlLLXE03KZLW-i6pOlM2LzNNBsKlDiaqvD13G5bpIcCvFP1IffMC5omYPbTodndAp7_Zkfr52nRivptWMHugvDvL0VZVssSlg_bJiX-96PBTndBKps50_OAGknvYmA_s/s1600/gcal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy_d2KkyDNGZCLlLLXE03KZLW-i6pOlM2LzNNBsKlDiaqvD13G5bpIcCvFP1IffMC5omYPbTodndAp7_Zkfr52nRivptWMHugvDvL0VZVssSlg_bJiX-96PBTndBKps50_OAGknvYmA_s/s320/gcal.png" width="320" /></a></div>I have created a calendar named "my plan". Assume that I have input all special day to it. Then click "Calendar settings".<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4m80lRVieY7RKvzqxxkcQfTqr_w-SNWRAl4rH1Nf1QNfPrmLzkLUq5zsZp1YhLSO-AFhgAxa5f9yfQ3NX7u5XPVKmVL2veojAxo6HjpS8oqzKGzL4yY_M2i11LSDa38bNL_q38d15rns/s1600/gcal2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4m80lRVieY7RKvzqxxkcQfTqr_w-SNWRAl4rH1Nf1QNfPrmLzkLUq5zsZp1YhLSO-AFhgAxa5f9yfQ3NX7u5XPVKmVL2veojAxo6HjpS8oqzKGzL4yY_M2i11LSDa38bNL_q38d15rns/s320/gcal2.png" width="320" /></a></div>Click the green button "ICAL" at "Calendar Address". You can get the URL with extesion ".ics"<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-LfNHHHJOBFQ6YxqeKsoPX_I1eFg-WSnpT31TOVVP9ACo8G0kBrJ2zwXK_LqZlAjnWPygBsU8rKObXkRrzMM_h3VLrYS6rhZYmAxtsnLeVoQq2DJVnHYb7WdepC0iE5-1Y5SgnqqNehI/s1600/gcal3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-LfNHHHJOBFQ6YxqeKsoPX_I1eFg-WSnpT31TOVVP9ACo8G0kBrJ2zwXK_LqZlAjnWPygBsU8rKObXkRrzMM_h3VLrYS6rhZYmAxtsnLeVoQq2DJVnHYb7WdepC0iE5-1Y5SgnqqNehI/s320/gcal3.png" width="320" /></a></div>Write down this URL address, then what we need now is set it into your iPhone now.<br />
<br />
Ok, tap "setting" icon at your iPhone<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfEnG2-Uv72xxMigFdCtiIv3gTJmM-ImihIOgSLongbl1rHTFQeSQtU7Mlca9pxjH8ewFPk42sDL_3_U1QK9LaABA1eZ1bk6m9ubHEc8SGj_EC4SInWs76sPawbxmFSXDeiG2104Gsfs/s1600/gcal_iphone1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTfEnG2-Uv72xxMigFdCtiIv3gTJmM-ImihIOgSLongbl1rHTFQeSQtU7Mlca9pxjH8ewFPk42sDL_3_U1QK9LaABA1eZ1bk6m9ubHEc8SGj_EC4SInWs76sPawbxmFSXDeiG2104Gsfs/s320/gcal_iphone1.png" width="213" /><br />
</a></div>Choose "Mail,Contacts,Calendars".<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFFOia03aZ6F8xWS2npgnzqEtN_8S85D3Ynrp7oyPQuaEskSl_N9w23MTNuTF-r84HERAsA2NxvmSDNmYch7rGD_MsLjIN6fVK6qjQxHaSDLBjAXeJprf1HdX5msWmp7SRsw4cXsHT48A/s1600/gcal_iphone2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFFOia03aZ6F8xWS2npgnzqEtN_8S85D3Ynrp7oyPQuaEskSl_N9w23MTNuTF-r84HERAsA2NxvmSDNmYch7rGD_MsLjIN6fVK6qjQxHaSDLBjAXeJprf1HdX5msWmp7SRsw4cXsHT48A/s320/gcal_iphone2.png" width="213" /></a></div><br />
Tap "Add Account".<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggESqwWgOiOWgrUs3WMFQBFy23VrwFN6pGyiQXBhRNP-OvUVj2U9YjE6QJ1snKZ5kSzQYJgAE0k7jkiNx4lJb6s0at6uphRgNwOjMg8n1s9xtimRbacOEqJIqYJ1WqRVlXT57b6AEmxOQ/s1600/gcal_iphone3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggESqwWgOiOWgrUs3WMFQBFy23VrwFN6pGyiQXBhRNP-OvUVj2U9YjE6QJ1snKZ5kSzQYJgAE0k7jkiNx4lJb6s0at6uphRgNwOjMg8n1s9xtimRbacOEqJIqYJ1WqRVlXT57b6AEmxOQ/s320/gcal_iphone3.png" width="213" /></a></div><br />
Tap "Other".<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5S7F8j_eR2IIA3PKcvOc44SkviCOZtpzP9tD_hsvPa4MWMWzHMmK8h6XfFMQsJaUXrSH0DyM_vjqJifeUEssaJbCObY_OmqaAUGkCraHDw4i6JheTULSc57mXNABN0icjbY1wYTVjSIU/s1600/gcal_iphone4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5S7F8j_eR2IIA3PKcvOc44SkviCOZtpzP9tD_hsvPa4MWMWzHMmK8h6XfFMQsJaUXrSH0DyM_vjqJifeUEssaJbCObY_OmqaAUGkCraHDw4i6JheTULSc57mXNABN0icjbY1wYTVjSIU/s320/gcal_iphone4.png" width="213" /></a></div><br />
Tap "Add Subscribed Calendar"<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9OpYqW1B7M01QHJQ6ejb3rMfH4YpGrMvd3cPzwGSF3bI8BU4JKcSv0oYc7kcgTkfaUFlUvaSdEb_brqxPOdbGvuK2hDI1KdKFH7FCTDF-LolpQxv8uQdggXys28ejJtfm4phlzhCQvvY/s1600/gcal_iphone5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9OpYqW1B7M01QHJQ6ejb3rMfH4YpGrMvd3cPzwGSF3bI8BU4JKcSv0oYc7kcgTkfaUFlUvaSdEb_brqxPOdbGvuK2hDI1KdKFH7FCTDF-LolpQxv8uQdggXys28ejJtfm4phlzhCQvvY/s320/gcal_iphone5.png" width="213" /></a></div><br />
Add the URL you wrote down at the top and input it at the "server". Then here you go.Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-81197493338983782152011-09-06T18:41:00.003+08:002011-10-15T15:15:42.018+08:00[Javascript] date function return NaN in IE but work fine in FirefoxSometimes, javascript run in IE and firefox have different interpretation on a string of date. If there is a date string, for example<br />
<br />
2011-01-01T12:56:12<br />
<br />
Well, I think it is a well-formatted date string and no-doubt that Javascript can change it to a date object without any mistake. However, I find that I got different return at IE and firefox. At IE, I got NaN, but I can get date object at firefox.<br />
<br />
For a developer who have to meet tight deadline, we don't want to know what the back-end logic inside different browsers. Here is the function for you to cater this problem.<br />
<br />
<code><br />
function parseISO8601(dateStringInRange) {<br />
<br />
var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)\s*$/,<br />
date = new Date(NaN), month,<br />
parts = isoExp.exec(dateStringInRange);<br />
<br />
if(parts) {<br />
month = +parts[2];<br />
date.setFullYear(parts[1], month - 1, parts[3], parts[4], parts[5], parts[6]);<br />
if(month != date.getMonth() + 1) {<br />
date.setTime(NaN);<br />
}<br />
}<br />
return date;<br />
<br />
}</code><br />
The input is YYYY-MM-DDTHH:ii:ss, output is date object and NaN if there is not a date input.Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-23693506759040577032011-08-31T17:08:00.014+08:002011-10-11T14:16:35.813+08:00[Chrome Extension] Show Emoji<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWiI5Uxf4I_5FMmnbQ5TeZofNsZHgeG2WnuwrXoGKAf5HinYHfK7cTs_MxFn_MGqQ_SzBpLuxRPFo7jELVurd8c9KenrbZ_SJagApZA_1xb6R1-l1gDjjaVwGcv2QGbDyuwaNOzaxdP5Y/s1600/iPhone-emoji-food.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWiI5Uxf4I_5FMmnbQ5TeZofNsZHgeG2WnuwrXoGKAf5HinYHfK7cTs_MxFn_MGqQ_SzBpLuxRPFo7jELVurd8c9KenrbZ_SJagApZA_1xb6R1-l1gDjjaVwGcv2QGbDyuwaNOzaxdP5Y/s1600/iPhone-emoji-food.png" /></a></div><span class="Apple-style-span" style="background-color: white; color: black; font-family: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">Emoji is very popular across iPhone user. You always see some strange characters at your Facebook, Google+, Twitter etc. Just like the belows.</span><br />
<br />
<span class="Apple-style-span" style="background-color: white; color: black; font-family: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><br />
<br />
<br />
<br />
<wbr></wbr><br />
<br />
<br />
</span><br />
<span class="Apple-style-span" style="background-color: white; color: black; font-family: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><br />
</span><br />
<span class="Apple-style-span" style="background-color: white; color: black; font-family: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">Here is a chrome extension that enable web user viewing those monster characters. Check it out.</span><br />
<a href="https://chrome.google.com/webstore/detail/aepnepljbnakkkhjegpdklnmccdnadjj">https://chrome.google.com/webstore/detail/aepnepljbnakkkhjegpdklnmccdnadjj</a><br />
<br />
There is also a Emoji conversion tools if you want to encode emoji.<br />
<a href="http://www.we-love-programming.com/emoji" target="_blank">http://www.we-love-programming.com/emoji</a><br />
<br />
If you have any question/comments for this extension, feel free to jot me some comments. Your comments help me keep improving this extension. Thanks.<br />
<br />
<br />
<br />
<span class="Apple-style-span" style="background-color: white; color: black; font-family: arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"> </span>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-72872455304052139382011-08-25T12:12:00.001+08:002011-10-15T15:16:22.395+08:00[Javascript] Dynamic class not working in IE7We all known how to change class for a DIV by Javascript. For example:<br />
<code><br />
document.getElementById("<i>div_name</i>").setAttribute("class", "<i>class_name</i>");</code><br />
Generally, it works across different browser nowadays. Unfortunately, some users still using IE7 or even older-version, and we have to take care of them. Here is a JS function for workaround.<br />
<br />
<code><br />
function rollStyle (styleObj, styleName) {<br />
if (styleObj.className) {<br />
styleObj.className = styleName;<br />
} else {<br />
document.getElementById(styleObj).className = styleName;<br />
}<br />
}</code><br />
Usage:<br />
<code><br />
rollStyle("<i>div_name</i>","<i>class_name</i>") </code>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-17609872348737044372011-08-24T11:29:00.001+08:002011-10-15T15:17:48.585+08:00[PHP] Sorting associative array by random orderAssumed that we have an associative array like this:<br />
<code>$books = array();<br />
$books[0] = array();<br />
$books[0]["name"] = "Book1";<br />
$books[0]["author"] = "John";<br />
<br />
$books[1] = array();<br />
$books[1]["name"] = "Book2";<br />
$books[1]["author"] = "Sam";<br />
<br />
$books[2] = array();<br />
$books[2]["name"] = "Book3";<br />
$books[2]["author"] = "James";</code><br />
Now, we are going to shuffle this associative array. First of all, we have to create a new array to store the lucky number for each "book", this lucky number will be act as a key.<br />
<code>$luckydraw = range(0, count($books));<br />
shuffle($luckydraw);</code><br />
OK, we now redraw the array and assign the lucky number to each book.<br />
<code>$list = array();<br />
<br />
$c = 0;<br />
foreach ($books as $key => $value) {<br />
$list[$key] = $value;<br />
$luck[$key] = $luckydraw[$c];<br />
$c++;<br />
}</code><br />
And finally, sorting it by the lucky number.<br />
<code><br />
array_multisort($luck, SORT_ASC, $list);</code>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-38740522216137870772011-08-23T21:16:00.002+08:002012-03-27T16:21:37.849+08:00[Javascript] Implementing Instagram API with JavascriptInstagram becomes a popular photo taking app on iPhone rapidly. You can also integrate Instagram photo on your web by <a href="http://instagram.com/developer/">API</a>. This is a basic tutorial on how to code it.<br />
<br />
Let's take a look at the <a href="http://www.we-love-programming.com/instagram.html">demo</a> first.<br />
<br />
In this example, jQuery has been used for decreasing development time. It can also be done without jQuery. Here is the full source.<br />
<br />
<code><!DOCTYPE html><br />
<html><br />
<head><br />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/><br />
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/><br />
<title>Instagram</title><br />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <br />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></script> <br />
<style><br />
html, body { height: 100%; margin: 0; padding: 0; background-color: #ffffff;}<br />
<br />
#panel { height: auto; float: right; width: 100%; }<br />
#panel .photoWrapper { width: 150px; height: 150px; margin:2px; float:left; box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4); display:none;}<br />
#panel. photoWrapper .photo { width: auto; height: auto; }<br />
<br />
</style><br />
<script type="text/javascript"><br />
<!--<br />
$(document).ready(function(){<br />
var access_token = '3794301.f59def8.e08bcd8b10614074882b2d1b787e2b6f';<br />
<br />
loadFeed();<br />
<br />
function loadFeed() {<br />
var param = {access_token:access_token};<br />
cmd(param, onPhotoLoaded);<br />
}<br />
<br />
function cmd(param, callback) {<br />
//popular<br />
var cmdURL = 'https://api.instagram.com/v1/media/popular?callback=?';<br />
$.getJSON(cmdURL, param, callback);<br />
}<br />
<br />
function onPhotoLoaded(data) {<br />
if(data.meta.code == 200) {<br />
var photos = data.data;<br />
<br />
if(photos.length > 0) {<br />
for (var key in photos ){<br />
var photo = photos[key];<br />
$('<div id=p' + photo.id + '></div>').addClass('photoWrapper').appendTo('#panel');<br />
<br />
var str = '<img id="' + photo.id + '" src="' + photo.images.thumbnail.url + '" width="100%">';<br />
$('<div></div>').addClass('photo').html(str).appendTo('#p' + photo.id);<br />
<br />
$('#' + photo.id).load(function() {<br />
$('#p' + $(this).attr('id')).fadeTo('slow', 1.0);<br />
});<br />
<br />
}<br />
}else{<br />
alert('empty');<br />
}<br />
<br />
}else{<br />
alert(data.meta.error_message);<br />
}<br />
}<br />
<br />
});<br />
//--><br />
</script><br />
</head><br />
<body><br />
<div id="panel"></div><br />
</body><br />
</html></code><br />
This is an example grabbing popular feed from Instagram. You may have a question on the <i>access_code</i>. This is a code generated from OAuth authentication. Each application that work with Instagram API should be registered at official website. A <i>client_id</i> and <i>client_secure</i> will be assigned for your application. But at development stage, you can use the access_code in my example. However, only popular feed can be retrieved from this code, such as <i>/media/*</i> .<br />
<br />
I have developed a JS function called <i>cmd()</i> to centralize all API call in this example. JSON has been adopted because it can handle cross-domain issue.<br />
<br />
Actually, the logic in the example is not so complicated. Hope this example can give you a brief idea on the API integration.<br />
<br />
<b>Book you may feel interested:</b><br />
<a href="http://www.amazon.com/gp/product/1449399029/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1449399029"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=1449399029&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1449399029" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-60420101701457715362011-08-18T11:25:00.015+08:002012-04-03T10:42:54.619+08:00[Gadget] We love Instagram gadget for iGoogle<div style="text-align: center;">
<br /></div>
<img align="left" src="http://www.gmodules.com/gadgets/proxy?refresh=86400&url=https://lh4.googleusercontent.com/-__Cu8BUcn1c/TkyRNRX20SI/AAAAAAAAEAk/ztMpl9YCDyU/we-love-programming-thumb.png&container=ig&gadget=http://hosting.gmodules.com/ig/gadgets/file/104132533111937820884/instagram-popular-v1.xml" /> We all love Instagram and Google. This is a google gadget to show the popular feed at your iGoogle panel or paste it into your blog as well. All photos will be rotated automatically, with nice transition, by time to time and what we could do is layback and enjoy all sweet photos. This is the version and I know it still lots of things going to improve. I'm happy that you can jot down your comments to me. So, stay tuned.<br />
<div>
<br /></div>
<div>
<img alt="" border="0" data-pinit="registered" id="BLOGGER_PHOTO_ID_5642097071635550098" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv4GDow9eA23UMBxRl4qN4uqzCG0jrugR3bg-nbo0ddKm4E9DaA9TTRdaQ-xm4J74DMygJtzpOpezi8_wPpzDi7zC0Pn_K-lh2H8sk27QLCohFvW1SkzPjbVTXbuoeiSRvywqKdj8KaXI/s320/we-love-instagram-photo.png" style="cursor: hand; cursor: pointer; display: block; height: 310px; margin: 0px auto 10px; text-align: center; width: 320px;" /></div>
<div>
<br /></div>
<div>
<br />
<div>
<a href="http://fusion.google.com/add?source=atgs&moduleurl=http%3A//hosting.gmodules.com/ig/gadgets/file/104132533111937820884/instagram-popular-v1.xml"><img alt="Add to Google" border="0" src="http://buttons.googlesyndication.com/fusion/add.gif" /></a> add "We love Instagram" to my iGoogle now</div>
<div>
<form action="http://www.blogger.com/add-widget" method="post">
<input name="widget.title" type="hidden" value="We love Instagram" /><br />
<input name="widget.content" type="hidden" value="<link href='http://fonts.googleapis.com/css?family=Lobster+Two' rel='stylesheet' type='text/css'>
<style>
#instagram_widget { width:100%; height: 100%; }
#container { width:300px; height: 300px; margin: 0 auto; overflow:hidden}
#container .photoWrapper0 { width: 150px; height: 150px; position:absolute; display:none;}
#container .photoWrapper1 { width: 150px; height: 150px; position:absolute; display:none; margin-left:150px;}
#container .photoWrapper2 { width: 150px; height: 150px; position:absolute; display:none; margin-top:150px;}
#container .photoWrapper3 { width: 150px; height: 150px; position:absolute; display:none; margin-left:150px; margin-top:150px;}
#container .photoWrapper0 .inner { width: auto; height: auto; overflow:hidden; }
#container .photoWrapper0 .inner .photo { width:auto; height:auto; z-index:1;}
#container .photoWrapper0 .inner .info { width: 150px; height:44px; background-color: #000000; position:absolute; padding:2px; margin-top:-44px; z-index:2; display:none; }
#container .photoWrapper0 .inner .info .profile { width:40px; height:40px; float:left;}
#container .photoWrapper0 .inner .info .username { height:20px; color:#ffffff; font:12px Lobster Two,arial; line-height:20px; float:left; margin:2px}
#container .photoWrapper1 .inner { width: auto; height: auto; overflow:hidden; }
#container .photoWrapper1 .inner .photo { width:auto; height:auto; z-index:1; }
#container .photoWrapper1 .inner .info { width: 150px; height:44px; background-color: #000000; position:absolute; padding:2px; margin-top:-44px; z-index:2; display:none; }
#container .photoWrapper1 .inner .info .profile { width:40px; height:40px; float:left;}
#container .photoWrapper1 .inner .info .username { height:20px; color:#ffffff; font:12px Lobster Two,arial; line-height:20px; float:left; margin:2px}
#container .photoWrapper2 .inner { width: auto; height: auto; overflow:hidden; }
#container .photoWrapper2 .inner .photo { width:auto; height:auto; z-index:1; }
#container .photoWrapper2 .inner .info { width: 150px; height:44px; background-color: #000000; position:absolute; padding:2px; margin-top:-44px; z-index:2; display:none; }
#container .photoWrapper2 .inner .info .profile { width:40px; height:40px; float:left;}
#container .photoWrapper2 .inner .info .username { height:20px; color:#ffffff; font:12px Lobster Two,arial; line-height:20px; float:left; margin:2px}
#container .photoWrapper3 .inner { width: auto; height: auto; overflow:hidden; }
#container .photoWrapper3 .inner .photo { width:auto; height:auto; z-index:1; }
#container .photoWrapper3 .inner .info { width: 150px; height:44px; background-color: #000000; position:absolute; padding:2px; margin-top:-44px; z-index:2; display:none; }
#container .photoWrapper3 .inner .info .profile { width:40px; height:40px; float:left;}
#container .photoWrapper3 .inner .info .username { height:20px; color:#ffffff; font:12px Lobster Two,arial; line-height:20px; float:left; margin:2px}
</style>
<div id="instagram_widget"><div id="container"></div><div id="footer"></div></div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
var init = false;
var photo_ids = new Array();
var photo_obj = new Array();
var pos = 0;
var slot = 4;
var ga = new _IG_GA("UA-198979-7");
ga.reportPageview('/view/we-love-instagram');
var refreshId = setInterval("buildPopular()", 5000);
function loadPopular() {
makeJSONRequest(onPopularLoaded);
}
function makeJSONRequest(callback) {
var ts = new Date().getTime();
var params = {};
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
var cmdURL = 'http://api.instagram.com/v1/media/popular?client_id=b4502b58e35b457696fa80554843b365&nocache=' + ts;
gadgets.io.makeRequest(cmdURL, callback, params);
};
function onPopularLoaded(obj) {
var data = obj.data;
if(data.meta.code == 200) {
var photos = data.data;
if(photos.length > 0) {
for (var key in photos ){
var photo = photos[key];
photo_obj.push(photo);
}
buildPopular();
}
}
}
function buildPopular() {
if(photo_obj.length > 0) {
if(!init) {
var counter = 0;
init = true;
while (counter < slot ){
var photo = photo_obj.pop();
$('<div id=p' + counter + '></div>').addClass('photoWrapper' + counter).appendTo('#container');
var str = '<a href="' + photo.link + '" target="_blank"><img id="' + photo.id + '" src="' + photo.images.thumbnail.url + '" width="100%" border="0"></a>';
$('<div id="d' + photo.id + '"></div>').addClass('inner').appendTo('#p' + counter);
$('<div></div>').addClass('photo').html(str).appendTo('#d' + photo.id);
$('<div></div>').addClass('info').appendTo('#d' + photo.id);
var photo_str = '<img src="' + photo.user.profile_picture + '" width="40">';
$('<div></div>').addClass('profile').html(photo_str).appendTo('#d' + photo.id + ' .info');
$('<div></div>').addClass('username').html(photo.user.username).appendTo('#d' + photo.id + ' .info');
$('#' + photo.id).load(function() {
var pid = $('#d' + $(this).attr('id')).parents('div').attr('id');
$('#' + pid).fadeTo('slow', 1.0);
});
$('#d' + photo.id).mouseenter(function() {
$(this).find('.info').fadeIn('slow');
}).mouseleave(function() {
$(this).find('.info').fadeOut('slow');
});
photo_ids[counter] = photo.id;
counter++;
}
}else{
var photo = photo_obj.pop();
$('#p' + pos).fadeOut('slow', function() {
var str = '<a href="' + photo.link + '" target="_blank"><img id="' + photo.id + '" src="' + photo.images.thumbnail.url + '" width="100%" border="0"></a>';
$('#d' + photo_ids[pos]).remove();
$('<div id="d' + photo.id + '"></div>').addClass('inner').appendTo('#p' + pos);
$('<div></div>').addClass('photo').html(str).appendTo('#d' + photo.id);
$('<div></div>').addClass('info').appendTo('#d' + photo.id);
var photo_str = '<img src="' + photo.user.profile_picture + '" width="40">';
$('<div></div>').addClass('profile').html(photo_str).appendTo('#d' + photo.id + ' .info');
$('<div></div>').addClass('username').html(photo.user.username).appendTo('#d' + photo.id + ' .info');
$('#' + photo.id).load(function() {
var pid = $('#d' + $(this).attr('id')).parents('div').attr('id');
$('#' + pid).fadeTo('slow', 1.0);
});
$('#d' + photo.id).mouseenter(function() {
$(this).find('.info').fadeIn('slow');
}).mouseleave(function() {
$(this).find('.info').fadeOut('slow');
});
photo_ids[pos] = photo.id;
pos ++;
if(pos >= slot) {
pos = 0;
}
})
}
}else{
loadPopular();
}
}
gadgets.util.registerOnLoadHandler(loadPopular);
</script>" /><br />
<input name="infoURL" type="hidden" value="http://we-love-programming.blogspot.com/2011/08/gadget-we-love-instagram-gadget-for.html" /><br />
<input name="logoURL" type="hidden" value="http://www.gmodules.com/gadgets/proxy?refresh=86400&url=https://lh4.googleusercontent.com/-__Cu8BUcn1c/TkyRNRX20SI/AAAAAAAAEAk/ztMpl9YCDyU/we-love-programming-thumb.png&container=ig&gadget=http://hosting.gmodules.com/ig/gadgets/file/104132533111937820884/instagram-popular-v1.xml" /><br />
<input src="http://www.blogger.com/img/add/add2blogger_sm_b.gif" type="image" value="Add Widget" /> add to your blog</form>
</div>
</div>
<div>
Todo:</div>
<div>
<ul>
<li><strike>show photo owner details</strike></li>
<li>show total number of comments</li>
</ul>
<div>
Update:<br />
<ul>
<li>2011/10/25 - just found there is an API update at Instagram, the gadget has been updated. </li>
<li>2011/08/19 - add owner photo and username</li>
</ul>
<br /></div>
<div>
Please share to your friend if you like it. Thanks.</div>
</div>
<div>
<br /></div>
<div>
This is a gadget that I like very much for my iPhone<br />
<br />
<div id="imageViewerDiv">
<a href="http://www.amazon.com/gp/product/B005UGZPNQ/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=B005UGZPNQ" target="_blank"><img data-pinit="registered" id="prodImage" src="http://ecx.images-amazon.com/images/I/31lwf52RvvL._SS400_.jpg" /> </a></div>
<div id="imageViewerDiv">
Just a small part that can make my iPhone having one more special effect.</div>
<div id="imageViewerDiv">
</div>
<div id="imageViewerDiv">
<div id="imageViewerDiv" style="height: 400px; visibility: visible; width: 500px;">
<img data-pinit="registered" id="prodImage" src="http://ecx.images-amazon.com/images/I/41EWPiC9WVL._SS400_.jpg" /></div>
nice huh?</div>
<br /></div>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-49122312140882348802011-08-16T09:56:00.000+08:002011-08-16T09:56:38.420+08:00[Javascript] loading URL into a DIVSometimes, we want to load in other website into my own site as part of element. Javascript can help perfectly. First of all, we have to place a container for the website you want to display. In this example, I also build a combo box to change different URL for loading. So, the HTML coding should look like,<br />
<br />
<blockquote><!DOCTYPE html><br />
<html><br />
<head><br />
<meta charset="UTF-8"><br />
<title>Loading URL into a DIV</title><br />
<br />
<style type="text/css"><br />
<br />
html, body {<br />
height: 100%;<br />
margin: 0;<br />
padding: 0;<br />
}<br />
<br />
#web-panel {<br />
height: 100%;<br />
float: right;<br />
width: 100%;<br />
overflow: hidden;<br />
}<br />
<br />
#control {<br />
background: #fff;<br />
padding: 5px;<br />
font-size: 14px;<br />
font-family: Arial;<br />
border: 1px solid #ccc;<br />
box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4);<br />
}<br />
<br />
</style><br />
<br />
</head><br />
<body><br />
<div id="control"><br />
<strong>URL:</strong><br />
<select id="url"><br />
<option value="">Please select</option><br />
<option value="http://www.apple.com">Apple</option><br />
<option value="http://www.yahoo.com">Yahoo</option><br />
<option value="http://www.google.com">Google</option><br />
</select><br />
<br />
</div><br />
<div id="web-panel"></div><br />
</body><br />
</html></blockquote><br />
OK, now build the Javascript function to load in the URL. Just simple Javascript is good enough and we don't need jQuery help.<br />
<blockquote><script type="text/javascript"><br />
function loadURL(u) {<br />
document.getElementById("web-panel").innerHTML = '<iframe src="' + u + '" width="100%" height="100%" border="0"></iframe>';<br />
}<br />
</script></blockquote><br />
This function should be triggered by combo bo onChange function. So, here is the complete code.<br />
<blockquote><!DOCTYPE html><br />
<html><br />
<head><br />
<meta charset="UTF-8"><br />
<title>Loading URL into a DIV</title><br />
<br />
<style type="text/css"><br />
<br />
html, body {<br />
height: 100%;<br />
margin: 0;<br />
padding: 0;<br />
}<br />
<br />
#web-panel {<br />
height: 100%;<br />
float: right;<br />
width: 100%;<br />
overflow: hidden;<br />
}<br />
<br />
#control {<br />
background: #fff;<br />
padding: 5px;<br />
font-size: 14px;<br />
font-family: Arial;<br />
border: 1px solid #ccc;<br />
box-shadow: 0 2px 2px rgba(33, 33, 33, 0.4);<br />
}<br />
<br />
</style><br />
<br />
<script type="text/javascript"><br />
function loadURL(u) {<br />
document.getElementById("web-panel").innerHTML = '<iframe src="' + u + '" width="100%" height="100%" border="0"></iframe>';<br />
}<br />
</script><br />
</head><br />
<body><br />
<div id="control"><br />
<strong>URL:</strong><br />
<select id="url" onchange="loadURL(this.value);"><br />
<option value="">Please select</option><br />
<option value="http://www.apple.com">Apple</option><br />
<option value="http://www.yahoo.com">Yahoo</option><br />
<option value="http://www.google.com">Google</option><br />
</select><br />
<br />
</div><br />
<div id="web-panel"></div><br />
</body><br />
</html></blockquote>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-17321948506988325182011-08-15T14:47:00.001+08:002011-08-15T15:27:46.129+08:00[jQuery] Using jQuery to extract data from XML<a href="http://www.b2bweb.fr/wp-content/uploads/jquery_icon-150x150.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a>jQuery is a wonderful tool for developers for developing dynamic content in the web. Before you can enjoy all wonderful features by it, you must initiate jQuery at the beginning of your web page first. You can download the whole copy to your hosting, or just using <a href="http://code.google.com/apis/libraries/devguide.html">Google libraries API</a>.<br />
<br />
<br />
<br />
<br />
<blockquote><script language="Javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script></blockquote><br />
Assumed that you want to extract the data from a XML file, called "data.xml".<br />
<br />
data.xml<br />
<blockquote><?xml version="1.0" encoding="utf-8"?><br />
<books><br />
<book id="001"><br />
<title>Book1</title><br />
<content>ABC</content><br />
</book><br />
<book id="002"><br />
<title>Book2</title><br />
<content>DEF</content><br />
</book><br />
</books> </blockquote><br />
Here is js code for you to extract the data, and display it at result DIV.<br />
<blockquote><script language="Javascript"><br />
<!--<br />
jQuery(document).ready(function() {<br />
<br />
var dataUrl = "data.xml";<br />
<br />
jQuery.ajax({<br />
// get the collections XML<br />
type: "GET",<br />
url: dataUrl,<br />
dataType: "xml",<br />
error: function (request, error) {<br />
// do this on AJAX error<br />
},<br />
success: function(data) {<br />
<br />
jQuery(data).find('book').each(function() {<br />
var id = jQuery(this).attr('id');<br />
var title = jQuery(this).find('title').text();<br />
var content = jQuery(this).find('content').text();<br />
<br />
var htmlString = 'ID:' + id + '<br>' + 'Title:' + title + '<br>' + 'Content:' + content;<br />
jQuery('<div></div>').html(htmlString).appendTo('#result');<br />
<br />
});<br />
<br />
}<br />
});<br />
<br />
});<br />
//--><br />
</script><br />
<div id="result"></div></blockquote>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-91268081150553332932011-08-14T22:17:00.002+08:002012-03-27T15:56:53.140+08:00[Javascript] Adding custom markers and icons at Google MapYou may want to make a map at your website to indicate the location of your shop. Google map API absolutely can do your favor.<br />
<style>
#scene{width:480x;height:320px;margin:0 0 10px 0;display:block;}
</style><br />
<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript">
</script><br />
<script type="text/javascript">
<!--
// district
var MongKok = {
name : "Mong Kok",
latlng : new google.maps.LatLng(22.319183,114.169353),
zoom : 17,
}
// marker
var markers = [
['Langham Place', 22.318905, 114.168538, 4],
];
function setMarkers(map, locations) {
var image = new google.maps.MarkerImage('http://server2.iconfinder.com/data/icons/socialnetworking/32/google.png',
new google.maps.Size(30, 30),
new google.maps.Point(0,0),
new google.maps.Point(15, 15));
var shape = {
coord: [1,1,30,30],
type: 'rect'
};
for (var i = 0; i < locations.length; i++) {
var marker = locations[i];
var latLng = new google.maps.LatLng(marker[1], marker[2]);
var marker = new google.maps.Marker({
clickable: true,
position: latLng,
map: map,
icon: image,
flat: true,
shape: shape,
title: marker[0],
zIndex: marker[3]
});
google.maps.event.addListener(marker, 'click', function(e) {
//
});
}
}
function showMap(district) {
var settings = {
streetViewControl: false,
zoomControl: false,
mapTypeControl: false,
panControl: false,
zoom: district.zoom,
center: district.latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("scene"),settings);
setMarkers(map, markers);
}
window.onload = function() {
showMap(MongKok);
}
//-->
</script><br />
Demonstration:<br />
<div id="scene">
</div>
<br />
First of all, you have to initiate Google map API at the beginning of the page .<br />
<blockquote>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> </blockquote>
<br />
The parameter "sensor" means that whether detecting your current location or not. Then place a DIV container for the map, and name it as "scene".<br />
<br />
<blockquote>
<div id="scene"></div></blockquote>
<br />
Using CSS to control the width and height of that DIV.<br />
<br />
<blockquote>
<style><br />
#scene{width:480x;height:320px;margin:0 0 10px 0;display:block;}<br />
</style></blockquote>
<br />
In order to load Google Map, we should define a center point of the map first.<br />
<blockquote>
var MongKok = {<br />
name : "Mong Kok",<br />
latlng : new google.maps.LatLng(22.319183,114.169353),<br />
zoom : 17,<br />
} </blockquote>
<br />
I define a point that is Mong Kok at Hong Kong, and name it as a variable "MongKok". You can extract latitude and longitude point from the linkage of the point in the map.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzkyADqftzfAuiNRrO5T2qpyiD8RBNADRCCwoG6G_cb1d9kp-bsZHr-QOnqTmDYpKkmmArbwv5hOphKqpoaFANk6MKQjXa4_7jVzC_PMUbvmBRyrpwsJUx3PD7Bye8DATwyCWOphePqV8/s1600/gmap.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzkyADqftzfAuiNRrO5T2qpyiD8RBNADRCCwoG6G_cb1d9kp-bsZHr-QOnqTmDYpKkmmArbwv5hOphKqpoaFANk6MKQjXa4_7jVzC_PMUbvmBRyrpwsJUx3PD7Bye8DATwyCWOphePqV8/s320/gmap.jpg" width="320" /></a></div>
<br />
<br />
OK, we can load the map into the DIV now.<br />
<br />
<blockquote>
function showMap(district) {<br />
var settings = {<br />
streetViewControl: false,<br />
zoomControl: false,<br />
mapTypeControl: false,<br />
panControl: false,<br />
zoom: district.zoom,<br />
center: district.latlng,<br />
mapTypeId: google.maps.MapTypeId.ROADMAP<br />
};<br />
var map = new google.maps.Map(document.getElementById("scene"),settings);<br />
<br />
setMarkers(map, markers);<br />
}<br />
window.onload = function() {<br />
showMap(MongKok);<br />
}</blockquote>
<br />
The second step, set your shop location and put a maker on it now. Here is the location and the function to set marker.<br />
<br />
<blockquote>
var markers = [<br />
['Langham Place', 22.318905, 114.168538, 4],<br />
];</blockquote>
<blockquote>
function setMarkers(map, locations) {<br />
<br />
var image = new google.maps.MarkerImage('http://server2.iconfinder.com/data/icons/socialnetworking/32/google.png',<br />
new google.maps.Size(30, 30),<br />
new google.maps.Point(0,0),<br />
new google.maps.Point(15, 15));<br />
<br />
var shape = {<br />
coord: [1,1,30,30],<br />
type: 'rect'<br />
};<br />
<br />
for (var i = 0; i < locations.length; i++) {<br />
var marker = locations[i];<br />
var latLng = new google.maps.LatLng(marker[1], marker[2]);<br />
var marker = new google.maps.Marker({<br />
clickable: true,<br />
position: latLng,<br />
map: map,<br />
icon: image,<br />
flat: true,<br />
shape: shape,<br />
title: marker[0],<br />
zIndex: marker[3]<br />
});<br />
<br />
google.maps.event.addListener(marker, 'click', function(e) {<br />
//<br />
});<br />
}<br />
<br />
}</blockquote>
<br />
So, put it all together and here you go.<br />
<blockquote>
<style><br />
#scene{width:480x;height:320px;margin:0 0 10px 0;display:block;}<br />
</style><br />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script><br />
<script type="text/javascript"><br />
<!--<br />
// district<br />
var MongKok = {<br />
name : "Mong Kok",<br />
latlng : new google.maps.LatLng(22.319183,114.169353),<br />
zoom : 17,<br />
}<br />
<br />
// marker<br />
var markers = [<br />
['Langham Place', 22.318905, 114.168538, 4],<br />
];<br />
<br />
function setMarkers(map, locations) {<br />
<br />
var image = new google.maps.MarkerImage('http://server2.iconfinder.com/data/icons/socialnetworking/32/google.png',<br />
new google.maps.Size(30, 30),<br />
new google.maps.Point(0,0),<br />
new google.maps.Point(15, 15));<br />
<br />
var shape = {<br />
coord: [1,1,30,30],<br />
type: 'rect'<br />
};<br />
<br />
for (var i = 0; i < locations.length; i++) {<br />
var marker = locations[i];<br />
var latLng = new google.maps.LatLng(marker[1], marker[2]);<br />
var marker = new google.maps.Marker({<br />
clickable: true,<br />
position: latLng,<br />
map: map,<br />
icon: image,<br />
flat: true,<br />
shape: shape,<br />
title: marker[0],<br />
zIndex: marker[3]<br />
});<br />
<br />
google.maps.event.addListener(marker, 'click', function(e) {<br />
//<br />
});<br />
}<br />
<br />
}<br />
<br />
function showMap(district) {<br />
var settings = {<br />
streetViewControl: false,<br />
zoomControl: false,<br />
mapTypeControl: false,<br />
panControl: false,<br />
zoom: district.zoom,<br />
center: district.latlng,<br />
mapTypeId: google.maps.MapTypeId.ROADMAP<br />
};<br />
var map = new google.maps.Map(document.getElementById("scene"),settings);<br />
<br />
setMarkers(map, markers);<br />
}<br />
window.onload = function() {<br />
showMap(MongKok);<br />
}<br />
//--><br />
</script><br />
<br />
<div id="scene"></div></blockquote>
<br />
Here's for you to learn more google map usages:
<br />
<a href="http://www.amazon.com/gp/product/1593272715/ref=as_li_tf_il?ie=UTF8&tag=weloveprogra-20&linkCode=as2&camp=1789&creative=9325&creativeASIN=1593272715"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&Format=_SL160_&ASIN=1593272715&MarketPlace=US&ID=AsinImage&WS=1&tag=weloveprogra-20&ServiceVersion=20070822" /></a><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=weloveprogra-20&l=as2&o=1&a=1593272715" style="border: none !important; margin: 0px !important;" width="1" />Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-25120102360634984942011-08-12T09:40:00.003+08:002011-08-14T12:53:48.320+08:00[PHP] Number to alphabeticalThis function is used to generate Excel report.<br />
<br />
<blockquote>function toAlphaNumber( $num ) {<br />
$anum = '';<br />
while( $num >= 1 ) {<br />
$num = $num - 1;<br />
$anum = chr(($num % 26)+65).$anum;<br />
$num = $num / 26;<br />
}<br />
return $anum;<br />
}</blockquote><br />
Usage:<br />
<blockquote>echo toAlphaNumber(1) // output: A<br />
echo toAlphaNumber(27) // output: AA<br />
</blockquote>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-58300596500303908002011-08-11T17:16:00.006+08:002011-08-13T12:46:06.479+08:00The importance of URL encoding for GET parameterPOST and GET is widely used when we developing an web application, it is used to carry data from one page to another page. For example,<br />
<br />
Extract variable <i>category</i> from the following URL<br />
http://www.yourdomain.com/index.php?category=fruit<br />
<br />
<blockquote>$cateogry = $_GET["category"];</blockquote><br />
and then, we may want to echo it on the web page, or form SQL statement for query.<br />
<br />
If we don't have any filtering for the value before we really use it, it may become an opportunity for someone to hack in your system. Here are the possibilities,<br />
<br />
<b>SQL Injection</b><br />
SQL injection is a code injection technique that exploits a security vulnerability occurring in the database layer of an application (like queries). Using the above example, if we use the category value to build SQL statement:<br />
<blockquote>$sql = "select * from product where category='".$category."'"</blockquote><br />
Attackers can change the value from URL to:<br />
http://www.yourcompany.com/index.php?category=';show tables where not '<br />
<br />
and your SQL statement becomes<br />
<blockquote>select * from product where category='';show tables where not ''</blockquote>so your database structure can be listed. The whole database can be dropped in the worst case.<br />
<br />
<b>Cross-site Scription Vulnerability </b><br />
Cross-site scripting vulnerability enables attackers to inject client-side script into web pages viewed by other users. If attackers change the URL from the above example<br />
<br />
http://www.yourdomain.com/index.php?category=\%22><script>alert('You have been hacked')</script><br />
<br />
and you directly print "category" at the page, the Javascript sitting in the URL will be run. Attackers can put in any harmful script, such as trojan attack, to it rather that an alert message. Although this type of vulnerability can be blocked by the latest browser, you can't make sure every single client is using the latest browser.<br />
<br />
<b>Solution:</b><br />
Actually, there is a very simple way to prevent this kind of attack. Before using GET or POST variable, do URL encoding first. URL encoding is also a build-in function of PHP.<br />
<br />
<blockquote>$category = urlencode($_GET['category']</blockquote>Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.comtag:blogger.com,1999:blog-6186833047734222185.post-41191277062500433472011-08-11T10:55:00.008+08:002011-08-13T13:07:10.957+08:00Make cache-friendly image pathA content delivery network or content distribution network (CDN) is a system of computers containing copies of data placed at various nodes of a network. When properly designed and implemented, a CDN can improve access to the data it caches by increasing access bandwidth and redundancy and reducing access latency. The price of this service is quite high, so it is not common for normal user.<br />
<br />
However, if you can add more alias for your domain, your web page download speed can also be improved. For example,<br />
<br />
http://static0.yourdomain.com/images/yourimage1.jpg<br />
http://static1.yourdomain.com/images/yourimage2.jpg<br />
http://static2.yourdomain.com/images/yourimage3.jpg<br />
http://static3.yourdomain.com/images/yourimage4.jpg<br />
<br />
Here is the function for making cache-friendly image path,<br />
<br />
PHP:<br />
<blockquote>function path_to_origin_suffix($path,$NUM_ALIASES=6){<br />
if (1 == $NUM_ALIASES)<br />
return 0 ;<br />
$hex = md5($path);<br />
return ord($hex[31]) % $NUM_ALIASES;<br />
}<br />
<br />
<br />
function make_url($path,$origin="static.yourdomain.com"){<br />
<br />
$pos = strpos($path,'/');<br />
<br />
if ($pos === FALSE || $pos != 0) {<br />
$path = sprintf('/%s',$path);<br />
}<br />
$suffix = path_to_origin_suffix($path);<br />
<br />
$array= explode('.',$origin,2);<br />
$domain1 = $array[0];<br />
<br />
$host = "$domain1$suffix.$array[1]";<br />
<br />
$abs_href = "http://$host$path";<br />
echo $abs_href;<br />
}<br />
<br />
</blockquote>Usage:<br />
<blockquote><img src="<?=make_url('/images/yourimage.jpg')?>"></blockquote><br />
This function is using MD5 to transform image path to hex value, and using ord to change to decimal number. Then, determine which alias domain should be used by MOD value<br />
<br />
Javascript:<br />
<blockquote>function make_url(path, origin) {<br />
<br />
if (typeof origin == "undefined") {<br />
origin = "static.yourdomain.com";<br />
}<br />
<br />
var pos = path.indexOf("/");<br />
if (pos == -1 || pos != 0) {<br />
path = "/"+path;<br />
}<br />
var suffix = (path.length+1) % 6<br />
var array= origin.split(".");<br />
var subDomain = array.shift();<br />
var domain = array.join(".");<br />
<br />
var host = "";<br />
host = subDomain+suffix+"."+domain;<br />
<br />
<br />
abs_href = "http://"+host+path;<br />
return abs_href;<br />
}</blockquote>Usage:<br />
<blockquote>make_url('/images/yourimage.jpg')</blockquote><br />
Since there is not MD5 build-in function for Javascript, I just simply using the length of URL to determine which alias domain should be used. <br />
<br />
Flash Actionscript 2:<br />
<blockquote>function make_url(path, origin) {<br />
var origin = origin==undefined ? origin="static.yourdomain.com" : origin;<br />
<br />
var pos = path.indexOf("/");<br />
if (pos == -1 || pos != 0) {<br />
path = "/"+path;<br />
}<br />
var suffix = (path.length+1) % 6<br />
var array= origin.split(".");<br />
var subDomain = array.shift();<br />
var domain = array.join(".");<br />
<br />
var host = "";<br />
<br />
host = subDomain+suffix+"."+domain;<br />
<br />
abs_href = "http://"+host+path;<br />
return abs_href;<br />
} </blockquote><br />
At last, please be careful that cross-domain issue after using this function to modify your JS path or SWF path.Alvinhttp://www.blogger.com/profile/01417605026017034607noreply@blogger.com