<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1228370290462112652</id><updated>2026-06-08T23:40:04.163-07:00</updated><category term="HTML5"/><category term="Javascript"/><category term="OGG"/><category term="Audio API"/><category term="Fullscreen"/><category term="HTML5 Game"/><category term="YouTube"/><category term="canvas"/><category term="mp4"/><category term="video"/><category term="video files"/><category term="3gpp"/><category term="APIs"/><category term="Ads"/><category term="Download"/><category term="Puzzle"/><category term="audio"/><category term="download youtube video"/><category term="image puzzle"/><category term="video formats"/><category term="videos"/><category term="webm"/><category term="AdSense"/><category term="AppCache API"/><category term="AppSpot"/><category term="Banner"/><category term="Bootstrap"/><category term="CSS"/><category term="CSS3"/><category term="Cache"/><category term="Deploy"/><category term="Eclipse"/><category term="Game"/><category term="Google"/><category term="Google Adsense"/><category term="Google App Engine"/><category term="IDE"/><category term="MP3"/><category term="Manifest"/><category term="Media Queries"/><category term="Plugins"/><category term="RequestAnimationFrame"/><category term="Responsive"/><category term="Responsive Ads"/><category term="Responsive Adsense"/><category term="Shape Puzzle"/><category term="Twitter Bootstrap"/><category term="Web Application"/><category term="agile"/><category term="avc"/><category term="codecs"/><category term="flv"/><category term="formats"/><category term="game engine"/><category term="goal"/><category term="image"/><category term="media-queries"/><category term="outcome"/><category term="process"/><category term="software"/><category term="test"/><category term="vorbis"/><category term="vp8.0"/><title type='text'>Coding Everyday</title><subtitle type='html'>Tips for The Everyday Web Developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-4103409926772401858</id><published>2013-10-15T15:17:00.001-07:00</published><updated>2013-10-16T09:06:35.514-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppSpot"/><category scheme="http://www.blogger.com/atom/ns#" term="Deploy"/><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><category scheme="http://www.blogger.com/atom/ns#" term="Google App Engine"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="IDE"/><category scheme="http://www.blogger.com/atom/ns#" term="Plugins"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Application"/><title type='text'>How to deploy a HTML5 project on Google App Engine (http://appspot.com)</title><content type='html'>&lt;h2&gt;
How to deploy a HTML5 project on Google App Engine (appspot.com)&lt;/h2&gt;
&lt;div&gt;
&lt;h3&gt;
Step-by-step tutorial showing how to use appspot.com to deploy and host your HTML5 projects.&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Steps&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Signup to Google App Engine&lt;/li&gt;
&lt;li&gt;Download, install, and setup Eclipse IDE&lt;/li&gt;
&lt;li&gt;Deploy your application&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Before we get started, let me give you a few features that makes Google App Engine a really good alternative to you host your projects.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
App Engine applications are easy to build, easy to maintain, and easy to scale as your traffic and data storage needs grow. With App Engine, there are no servers to maintain: You just upload your application, and it&#39;s ready to serve your users.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
With App Engine, you only pay for what you use. There are no set-up costs and no recurring fees. The resources your application uses, such as storage and bandwidth, are measured by the gigabyte, and billed at competitive rates. You control the maximum amounts of resources your app can consume, so it always stays within your budget.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
App Engine costs nothing to get started. All applications can use up to 1 GB of storage and enough CPU and bandwidth to support an efficient app serving around 5 million page views a month, absolutely free.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Run your web applications on Google&#39;s infrastructure.&lt;/li&gt;
&lt;li&gt;Google App Engine is fully-integrated development environment&lt;/li&gt;
&lt;li&gt;You can serve your applications with your own domain (such as http://example.com), or you can use the App Engine domain for free (just like http://emersonestrella.appspot.com)&lt;/li&gt;
&lt;li&gt;You can use server side languages such as PHP, Java, Python, and Go.&lt;/li&gt;
&lt;li&gt;For storage on Google App Engine you can use the App Engine&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
1. Signup to Google App Engine (Appspot)&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Go to &lt;a href=&quot;http://appengine.google.com/&quot;&gt;http://appengine.google.com&lt;/a&gt;&amp;nbsp;and signup to App Engine with your Google Account. After that you can create your application on Google App Engine using the Admin Console. Just click the button &quot;Create Application&quot;...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuugSISLHO8Idl6CtoQv4454etObofat3lyuX1ktbUTuET7Z2FiMypcTlcLUurUqYEY1_XWIS-dwqX9jK4lAS7EZD6EA9oL9UqxYwmH0QKdB3Rr0brxnWrVTv4sr2yFzL36Be-4c2HuU/s1600/Screen+Shot+2013-10-15+at+6.28.58+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuugSISLHO8Idl6CtoQv4454etObofat3lyuX1ktbUTuET7Z2FiMypcTlcLUurUqYEY1_XWIS-dwqX9jK4lAS7EZD6EA9oL9UqxYwmH0QKdB3Rr0brxnWrVTv4sr2yFzL36Be-4c2HuU/s400/Screen+Shot+2013-10-15+at+6.28.58+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fill up the form...&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQwye4tflcrRmzzRJxHxInmxmHIG75P1GgB5ty9BG8-aN7Run87gu-snnyawWGQixfV9Qx4QbIpDIBrLfqM4ccyXxaX95-SH-qOl2QkqFsSugJxrt0jMGXhuL6KNWMCxY4Xx4R3ZiMPNM/s1600/Screen+Shot+2013-10-15+at+6.30.15+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;306&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQwye4tflcrRmzzRJxHxInmxmHIG75P1GgB5ty9BG8-aN7Run87gu-snnyawWGQixfV9Qx4QbIpDIBrLfqM4ccyXxaX95-SH-qOl2QkqFsSugJxrt0jMGXhuL6KNWMCxY4Xx4R3ZiMPNM/s400/Screen+Shot+2013-10-15+at+6.30.15+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3&gt;
2. Download, install, and setup Eclipse&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Go to&amp;nbsp;&lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;http://www.eclipse.org/downloads/&lt;/u&gt;&lt;/span&gt;&amp;nbsp;and download the lasted version &lt;b&gt;&quot;Eclipse IDE for Java EE Developers&quot;&lt;/b&gt;...&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1xzj2KboEyQ2yOprLuyDq719bin93b2PBYJZ7cl5V-e5n1tHDvQzBcwVZCrwefGETtSKKgcXWIYv4_NR4uOK8sYvbfLk0Ldc2tb0AHey0wgSjxMSPsx2xxO1i9IPw8YnPjSU33QZrnXQ/s1600/Screen+Shot+2013-10-15+at+6.36.42+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;53&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1xzj2KboEyQ2yOprLuyDq719bin93b2PBYJZ7cl5V-e5n1tHDvQzBcwVZCrwefGETtSKKgcXWIYv4_NR4uOK8sYvbfLk0Ldc2tb0AHey0wgSjxMSPsx2xxO1i9IPw8YnPjSU33QZrnXQ/s400/Screen+Shot+2013-10-15+at+6.36.42+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;Then extract and execute the binary.&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
Next step is to configure Google Plug-in for Eclipse. Open the Eclipse IDE and go to &quot;Help&quot; -&amp;gt; &quot;Install new software&quot;...&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVIiy_OE1twsAY50sDAB5MiP-dbZdn45msTnqi-XhvKzmj_6Q8okhyphenhypheniGsHAJBUgRt2avpFWjS8YOhfU1D-Zkl54kqktKbGYQ89YtaeZkQ_ABsJgUob0jlyjQo4SjgtSha4kXAPALVaRX4/s1600/Screen+Shot+2013-10-15+at+6.40.32+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;357&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVIiy_OE1twsAY50sDAB5MiP-dbZdn45msTnqi-XhvKzmj_6Q8okhyphenhypheniGsHAJBUgRt2avpFWjS8YOhfU1D-Zkl54kqktKbGYQ89YtaeZkQ_ABsJgUob0jlyjQo4SjgtSha4kXAPALVaRX4/s400/Screen+Shot+2013-10-15+at+6.40.32+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Click in the &quot;Add...&quot; button to add a new update site and then fill the field location with one of the following urls based on the version of Eclipse you have installed:&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Eclipse 3.6: &lt;a href=&quot;http://dl.google.com/eclipse/plugin/archive/3.2.4/3.6&quot;&gt;http://dl.google.com/eclipse/plugin/archive/3.2.4/3.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eclipse 3.5: &lt;a href=&quot;http://dl.google.com/eclipse/plugin/archive/3.1.2/3.5&quot;&gt;http://dl.google.com/eclipse/plugin/archive/3.1.2/3.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eclipse 3.4: &lt;a href=&quot;http://dl.google.com/eclipse/plugin/archive/2.3.3/3.4&quot;&gt;http://dl.google.com/eclipse/plugin/archive/2.3.3/3.4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;After you add the new update site you can go back to &quot;Help&quot; -&amp;gt; &quot;Install new software&quot; and select the Google Plugin Update Site from the list...&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUj5MkZKTZucSlU_cG2vmmsMDg-9MTbTcxCXrlbXO4PMcbWBALJTff7fnkeEzFwtFY_4C4kAbL1bQRgFYiw-OVGFCE693G0ExZevcH9yb5vf5Ik0dLgi4hCJufdcGLXOM9vQGHqGY2C74/s1600/Screen+Shot+2013-10-15+at+6.46.35+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUj5MkZKTZucSlU_cG2vmmsMDg-9MTbTcxCXrlbXO4PMcbWBALJTff7fnkeEzFwtFY_4C4kAbL1bQRgFYiw-OVGFCE693G0ExZevcH9yb5vf5Ik0dLgi4hCJufdcGLXOM9vQGHqGY2C74/s400/Screen+Shot+2013-10-15+at+6.46.35+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
... a list of available plugins and tools will be populated. Choose the &quot;Google Plugin for Eclipse&quot; and click &quot;Next &amp;gt;&quot;. After that restart Eclipse and the Google Plugin will be available.&lt;/div&gt;
&lt;h3&gt;
&lt;br /&gt;3. Deploy your application&lt;/h3&gt;
Create a new project on Eclipse to &quot;hold&quot; your application. To do that go to &quot;File&quot; -&amp;gt; &quot;New Project&quot;&amp;nbsp;-&amp;gt; &quot;Google&quot; -&amp;gt; &quot;Web Application Project&quot;...&lt;br /&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eUToBGtRgPVkIGmBkaRCvbaxwm4MHiv7yTPLSL7JH4cBy1Oe_qD1mnnu-E-D96_tMVMt5xdGujt6ya7pWnrZt7rgOe-goDKMbaxnUmxfHvXXC0oBEpWjPE8oe3AfMJtlvg5nSktqN-k/s1600/project-creation-details.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eUToBGtRgPVkIGmBkaRCvbaxwm4MHiv7yTPLSL7JH4cBy1Oe_qD1mnnu-E-D96_tMVMt5xdGujt6ya7pWnrZt7rgOe-goDKMbaxnUmxfHvXXC0oBEpWjPE8oe3AfMJtlvg5nSktqN-k/s400/project-creation-details.png&quot; width=&quot;322&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
Add the project files under the folder &quot;war&quot; that is inside your project folder on Eclipse Workspace.&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
Before deploy your application to Google App Engine you have to link your Eclipse project to the application that you have created using the App Engine Console (Step #1). To do that you have to edit two little things in the file: &quot;../war/WEB-INF/appengine-web.xml&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Add the same name of the application you have created on App Engine Console between the application tag...&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;application&amp;gt;my-application&amp;lt;/application&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Add the application version number&amp;nbsp;between the version tag...&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;version&amp;gt;0.1&amp;lt;/version&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
Now you&#39;re ready to deploy your application. Sign in with your Google Account by clicking in the bottom right button &quot;Sign in to Google&quot;...&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6RgyEOAP4cRbI_yQFDe6wGvlYQE397U2bH2DCQ85c3h9u67i-4np3LSZqko6IX1V2E81ejTQKHucwpT28X0NaB6zNt-T7oPwSyrBminl6iEek96bTAzLoMHwci4jCF9hZE8pokL6YKyQ/s1600/Screen+Shot+2013-10-15+at+7.09.02+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;206&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6RgyEOAP4cRbI_yQFDe6wGvlYQE397U2bH2DCQ85c3h9u67i-4np3LSZqko6IX1V2E81ejTQKHucwpT28X0NaB6zNt-T7oPwSyrBminl6iEek96bTAzLoMHwci4jCF9hZE8pokL6YKyQ/s400/Screen+Shot+2013-10-15+at+7.09.02+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
And finally, click on the Google button in the menu bar and choose the option: &quot;Deploy to App Engine&quot;...&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTNSPUhym5QF9VPe9kznXuLsAHJ0p_rccyJg0BW95D0MXvXr5BXmdK-NY5-5PBTnfmA1i2yWhq7_6-NqX4lh60OCl0XhgLD1g2Autqb6XpvsqOOIKF6LR1x3iEyYUP4Z4TTI4bsqEhygc/s1600/Screen+Shot+2013-10-15+at+7.11.28+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTNSPUhym5QF9VPe9kznXuLsAHJ0p_rccyJg0BW95D0MXvXr5BXmdK-NY5-5PBTnfmA1i2yWhq7_6-NqX4lh60OCl0XhgLD1g2Autqb6XpvsqOOIKF6LR1x3iEyYUP4Z4TTI4bsqEhygc/s400/Screen+Shot+2013-10-15+at+7.11.28+PM.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
After that the upload process will start and in a few seconds your application will be available on Google App Engine.&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
That is all. Hope that help you guys who are wondering how to use Google App Engine. If you find any problem during this process, please leave a comment. Thanks!&lt;/div&gt;
&lt;div style=&quot;font-weight: normal;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/4103409926772401858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2013/10/how-to-deploy-and-host-html5-project-on.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4103409926772401858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4103409926772401858'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2013/10/how-to-deploy-and-host-html5-project-on.html' title='How to deploy a HTML5 project on Google App Engine (http://appspot.com)'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfuugSISLHO8Idl6CtoQv4454etObofat3lyuX1ktbUTuET7Z2FiMypcTlcLUurUqYEY1_XWIS-dwqX9jK4lAS7EZD6EA9oL9UqxYwmH0QKdB3Rr0brxnWrVTv4sr2yFzL36Be-4c2HuU/s72-c/Screen+Shot+2013-10-15+at+6.28.58+PM.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-1888437538081656613</id><published>2013-03-31T17:51:00.004-07:00</published><updated>2013-03-31T17:52:38.557-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="goal"/><category scheme="http://www.blogger.com/atom/ns#" term="outcome"/><category scheme="http://www.blogger.com/atom/ns#" term="process"/><title type='text'>Focus on process, not outcome</title><content type='html'>&lt;h2&gt;
Focus on process, not outcome&lt;/h2&gt;
&lt;h3&gt;
&lt;span style=&quot;border: 0px; margin: 0px; outline: none; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;By default we tend to be forward-looking, goal-pursuing, results-focused.&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h3&gt;
&lt;span style=&quot;border: 0px; margin: 0px; outline: none; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;But focusing on process rather than outcome is a much better strategy. Why?&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;It eliminates the noise of external factors.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;It encourages experimentation.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;It lets you enjoy the process more.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;And you also &lt;/span&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;enjoy and benefit more from the outcomes.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
by Tom Murcko&lt;/div&gt;
&lt;/h4&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/1888437538081656613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/focus-on-process-not-outcome.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/1888437538081656613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/1888437538081656613'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/focus-on-process-not-outcome.html' title='Focus on process, not outcome'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-1746584381617537844</id><published>2013-03-05T17:12:00.003-08:00</published><updated>2013-03-05T17:12:27.950-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="APIs"/><category scheme="http://www.blogger.com/atom/ns#" term="audio"/><category scheme="http://www.blogger.com/atom/ns#" term="Audio API"/><category scheme="http://www.blogger.com/atom/ns#" term="Fullscreen"/><category scheme="http://www.blogger.com/atom/ns#" term="Game"/><category scheme="http://www.blogger.com/atom/ns#" term="game engine"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5 Game"/><category scheme="http://www.blogger.com/atom/ns#" term="image puzzle"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Puzzle"/><category scheme="http://www.blogger.com/atom/ns#" term="Shape Puzzle"/><title type='text'>HTML5 Shape Puzzle - HTML5 Version of the game the preschool kids love</title><content type='html'>&lt;h2&gt;
HTML5 Shape Puzzle - HTML5 Version of the game the preschool kids love&lt;/h2&gt;
&lt;h3&gt;







&lt;div class=&quot;p1&quot;&gt;
Including music, sound, touch support, responsive design, and 20 stages&lt;/div&gt;
&lt;/h3&gt;
&lt;h4&gt;
&lt;a href=&quot;http://shapepuzzle.appspot.com/&quot;&gt;http://shapepuzzle.appspot.com&lt;/a&gt;&lt;/h4&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;a href=&quot;http://shapepuzzle.appspot.com/&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://shapepuzzle.appspot.com/img/shapepuzzle.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://shapepuzzle.appspot.com/&quot;&gt;HTML5 Shape Puzzle Game&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/1746584381617537844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/html5-shape-puzzle-html5-version-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/1746584381617537844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/1746584381617537844'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/html5-shape-puzzle-html5-version-of.html' title='HTML5 Shape Puzzle - HTML5 Version of the game the preschool kids love'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-4570599785543740432</id><published>2013-03-03T09:43:00.000-08:00</published><updated>2013-10-14T12:04:34.041-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3gpp"/><category scheme="http://www.blogger.com/atom/ns#" term="Download"/><category scheme="http://www.blogger.com/atom/ns#" term="download youtube video"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="mp4"/><category scheme="http://www.blogger.com/atom/ns#" term="OGG"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><category scheme="http://www.blogger.com/atom/ns#" term="video files"/><category scheme="http://www.blogger.com/atom/ns#" term="video formats"/><category scheme="http://www.blogger.com/atom/ns#" term="webm"/><category scheme="http://www.blogger.com/atom/ns#" term="YouTube"/><title type='text'>How to grab YouTube playback video files</title><content type='html'>&lt;h2&gt;
How to grab YouTube playback video files&lt;/h2&gt;
&lt;h3&gt;
Step-by-step tutorial showing how to get all available video source files from a video on YouTube using only Javascript. No plugins and/or server side scripts are required.&lt;/h3&gt;
&lt;div&gt;
First of all I want to list here a few benefits from being able to do that.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;You can download any video from YouTube without plugins or server-side scripts. You just need a browser.&lt;/li&gt;
&lt;li&gt;You can use YouTube as an encoder. Let&#39;s say you have to convert a FLV video to MP4 or &lt;br /&gt;WebM.&lt;/li&gt;
&lt;li&gt;You can set a cron job to run once a week to download all available video files from any channel.&lt;/li&gt;
&lt;li&gt;You can play any YouTube video out of the YouTube player (not&amp;nbsp;recommend).&lt;/li&gt;
&lt;li&gt;You can play YouTube videos on HTML5 canvas and go crazy! Check this out at:&amp;nbsp;&lt;a href=&quot;http://videopuzzle.possum-cms.com/&quot;&gt;http://videopuzzle.possum-cms.com&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3&gt;
How to do it&lt;/h3&gt;
&lt;div&gt;
Live demo:&amp;nbsp;&lt;a href=&quot;http://keepvideos.possum-cms.com/&quot;&gt;http://keepvideos.possum-cms.com&lt;/a&gt; or&amp;nbsp;&lt;a href=&quot;http://keepvideos.appspot.com/&quot;&gt;http://keepvideos.appspot.com&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Source code:&amp;nbsp;&lt;a href=&quot;https://github.com/edse/keepvideos&quot;&gt;https://github.com/edse/keepvideos&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;h3&gt;
Step 1: Extract YouTube video ID from URL&lt;/h3&gt;
&lt;/div&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;  var url = &#39;http://www.youtube.com/watch?v=yntfUjenls0&#39;;  
  var video_id = &#39;&#39;;  
  var regExp = /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&amp;amp;\?]*).*/;  
  var match = url.match(regExp);  
  if(match){  
   video_id = match[1];  
  }  &lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;h3&gt;
Step 2: Request YouTube playback files information&lt;/h3&gt;
&lt;div&gt;
Easy as pie. Just make an Ajax request to: http://www.youtube.com/get_video_info sending the desired video ID...&lt;/div&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;  $.ajax({  
   url: &quot;http://www.youtube.com/get_video_info?video_id=&quot;+video_id,  
   dataType: &quot;text&quot;  
  }).done(function(data) {  
   ...  
  });  
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;
&lt;span style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;Step 3: Parse the response data information from YouTube&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The information that we are looking for is &quot;url_encoded_fmt_stream_map&quot;. This variable contains all streams available for the requested movie.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; function(data) {  
  var info = {};  
  parse_str(data, info);  
  var streams = explode(&#39;,&#39;, info[&#39;url_encoded_fmt_stream_map&#39;]);  
  ...  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;Step 4: Trick. Parse again each one of the streams&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
YouTube encode the information twice, so you have to parse it again.&lt;br /&gt;
There is other trick here, You also have to add a signature value on each stream url, otherwise it won&#39;t work.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;  var results = [];  
  for(var i=0; i&amp;lt;streams.length; i++){  
   var real_stream = {};  
   parse_str(streams[i], real_stream);  
   real_stream[&#39;url&#39;] += &#39;&amp;amp;signature=&#39; + real_stream[&#39;sig&#39;];  
   results.push(real_stream);  
  }  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-size: 19px; font-weight: bold;&quot;&gt;Step 5: Have fun!&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
By now you should have a variable &quot;results&quot; with all YouTube video files available for the requested movie.&lt;br /&gt;
&lt;br /&gt;
You can do whatever you want with the files. For example: display a link, play the video, grab snap shots of the video... Have fun!&lt;br /&gt;
&lt;br /&gt;
To display the a link for each video file available...&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;   if(results.length &amp;gt; 0){  
    $.each(results, function(index, value) {  
     $(&#39;#results&#39;).append(&#39;&amp;lt;a href=&quot;&#39;+value.url+&#39;&quot;&amp;gt;&#39;+value.quality+&#39; - &#39;+value.type&amp;lt;/a&amp;gt;&#39;);  
    });  
   }  
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/4570599785543740432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/how-to-grab-youtube-playback-video-files.html#comment-form' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4570599785543740432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4570599785543740432'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2013/03/how-to-grab-youtube-playback-video-files.html' title='How to grab YouTube playback video files'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-8392234795673697868</id><published>2012-10-18T19:33:00.000-07:00</published><updated>2012-10-18T19:45:36.504-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5 Game"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="mp4"/><category scheme="http://www.blogger.com/atom/ns#" term="OGG"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><category scheme="http://www.blogger.com/atom/ns#" term="video files"/><title type='text'>How to play a video on HTML5 canvas tag</title><content type='html'>&lt;br /&gt;
&lt;h2&gt;
How to play a video on HTML5 canvas tag&lt;/h2&gt;
&lt;h3&gt;
Step-by-step tutorial on how to play a video on HTML5 canvas tag&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://html5videopuzzle.appspot.com/video.html&quot;&gt;LIVE DEMO&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB1D3WPcLBKmaX9st7XRNNUPsAp5FcN7Mquux_p7BsfYK2wXMQSxIHtAsLDPuzV0pDMUXVH7DipuNcinmIZ1rI8cUNmXzOKfjaxpWlBdTM20yv8Jk-waSe7tpIRmMiLiUa_AmRSjz5eXo/s1600/Screen+Shot+2012-10-18+at+11.33.49+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB1D3WPcLBKmaX9st7XRNNUPsAp5FcN7Mquux_p7BsfYK2wXMQSxIHtAsLDPuzV0pDMUXVH7DipuNcinmIZ1rI8cUNmXzOKfjaxpWlBdTM20yv8Jk-waSe7tpIRmMiLiUa_AmRSjz5eXo/s320/Screen+Shot+2012-10-18+at+11.33.49+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
First you need a video file. Actually, two. One video file in ogg format (for Chrome and Firefox) and the other one in mp4 format (for Safari). To get any video in these file formats you can use a website like &lt;a href=&quot;http://www.online-convert.com/&quot;&gt;www.online-convert.com&lt;/a&gt;&amp;nbsp;or &lt;a href=&quot;http://www.mediaconverter.org/&quot;&gt;www.mediaconverter.org&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Once you have the video files, the next step is to create a simple HTML page with one canvas tag, and one video tag. Just like the code below.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;!DOCTYPE html&amp;gt;  
 &amp;lt;head&amp;gt;  
 &amp;lt;title&amp;gt;Playing YouTube video on HTML5 canvas&amp;lt;/title&amp;gt;  
 &amp;lt;/head&amp;gt;  
 &amp;lt;body&amp;gt;  
  &amp;lt;video id=&quot;video&quot; autoplay=&quot;true&quot; loop=&quot;true&quot;&amp;gt;  
   &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.ogv&quot; type=&quot;video/ogg&quot; /&amp;gt;  
   &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;  
  &amp;lt;/video&amp;gt;  
  &amp;lt;canvas id=&quot;canvas&quot;&amp;gt;&amp;lt;/canvas&amp;gt;  
 &amp;lt;/body&amp;gt;  
 &amp;lt;/html&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Right now, you should be able to test the video and check if it is playing well on Chrome Safari and Firefox.&lt;br /&gt;
&lt;br /&gt;
Next, we add some CSS and a new&amp;nbsp;hidden&amp;nbsp;div wrapping the video tag.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;!DOCTYPE html&amp;gt;  
 &amp;lt;head&amp;gt;  
 &amp;lt;title&amp;gt;Playing YouTube video on HTML5 canvas&amp;lt;/title&amp;gt;  
 &amp;lt;/head&amp;gt;  
 &amp;lt;body&amp;gt;  
  &amp;lt;video id=&quot;video&quot; autoplay=&quot;true&quot; loop=&quot;true&quot;&amp;gt;  
   &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.ogv&quot; type=&quot;video/ogg&quot; /&amp;gt;  
   &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;  
  &amp;lt;/video&amp;gt;  
  &amp;lt;canvas id=&quot;canvas&quot;&amp;gt;&amp;lt;/canvas&amp;gt;  
 &amp;lt;/body&amp;gt;  
 &amp;lt;/html&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Since we will be rendering the video on canvas, we need to make the video hidden. But we will be using the audio from the video tag.&lt;br /&gt;
&lt;br /&gt;
Now the only missing piece is the javascript that renders the video on canvas. To do this we need to grab a image from the video&amp;nbsp;and then paint this image on canvas. If we repeat this process&amp;nbsp;every X&amp;nbsp;milliseconds... TA-DA!&amp;nbsp;We have the video playing on canvas.&lt;br /&gt;
&lt;br /&gt;
Here is the full source code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;!DOCTYPE html&amp;gt;  
 &amp;lt;head&amp;gt;  
 &amp;lt;title&amp;gt;Playing YouTube video on HTML5 canvas&amp;lt;/title&amp;gt;  
 &amp;lt;meta name=&quot;viewport&quot; content=&quot;user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=device-width&quot; /&amp;gt;  
 &amp;lt;style type=&quot;text/css&quot;&amp;gt;  
  html, body {  
   width: 100%;  
   height: 100%;  
   padding: 0px;  
   margin: 0px;  
  }  
  #canvas {  
   padding: 0px;  
   margin: 0px;  
   top:0;  
   left:0;  
   z-index: 30;  
   position: absolute;  
   width: 100%;  
   height: 100%;  
  }  
 &amp;lt;/style&amp;gt;  
 &amp;lt;/head&amp;gt;  
 &amp;lt;body&amp;gt;  
  &amp;lt;div style=&quot;display: none;&quot;&amp;gt;  
   &amp;lt;video id=&quot;video&quot; autoplay=&quot;true&quot; loop=&quot;true&quot;&amp;gt;  
    &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.ogv&quot; type=&quot;video/ogg&quot; /&amp;gt;  
    &amp;lt;source src=&quot;./video/BigBuckBunny_640x360.mp4&quot; type=&quot;video/mp4&quot; /&amp;gt;  
   &amp;lt;/video&amp;gt;  
  &amp;lt;/div&amp;gt;  
  &amp;lt;canvas id=&quot;canvas&quot;&amp;gt;&amp;lt;/canvas&amp;gt;  
  &amp;lt;script&amp;gt;  
  document.addEventListener(&#39;DOMContentLoaded&#39;, function(){  
   var v = document.getElementById(&#39;video&#39;);  
   var canvas = document.getElementById(&#39;canvas&#39;);  
   var context = canvas.getContext(&#39;2d&#39;);  
   //var cw = Math.floor(canvas.clientWidth / 100);  
   //var ch = Math.floor(canvas.clientHeight / 100);  
   var cw = Math.floor(canvas.clientWidth);  
   var ch = Math.floor(canvas.clientHeight);  
   canvas.width = cw;  
   canvas.height = ch;  
   v.addEventListener(&#39;play&#39;, function(){  
    draw(this,context,cw,ch);  
   },false);  
  },false);  
  function draw(v,c,w,h) {  
   if(v.paused || v.ended) return false;  
   c.drawImage(v,0,0,w,h);  
   setTimeout(draw,20,v,c,w,h);  
  }  
  &amp;lt;/script&amp;gt;  
 &amp;lt;/body&amp;gt;  
 &amp;lt;/html&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
If you want to play a video from YouTube, check this tutorial:&amp;nbsp;&lt;a href=&quot;http://coding-everyday.blogspot.com.br/2012/10/playing-youtube-videos-on-html5-canvas.html&quot;&gt;Playing YouTube videos on HTML5 canvas with Javascript&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you want to download a video from YouTube, check this one:&amp;nbsp;&lt;a href=&quot;http://coding-everyday.blogspot.com.br/2012/10/download-youtube-video-files-with.html&quot;&gt;Download YouTube video files with Javascript&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Next, I&#39;ll show you&amp;nbsp;&lt;a href=&quot;http://coding-everyday.blogspot.com.br/2012/10/step-by-step-creating-html5-image.html&quot;&gt;how to make a simple HTML5 game puzzle&lt;/a&gt;. Stay tuned!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/8392234795673697868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/how-to-play-video-on-html5-canvas-tag.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8392234795673697868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8392234795673697868'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/how-to-play-video-on-html5-canvas-tag.html' title='How to play a video on HTML5 canvas tag'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB1D3WPcLBKmaX9st7XRNNUPsAp5FcN7Mquux_p7BsfYK2wXMQSxIHtAsLDPuzV0pDMUXVH7DipuNcinmIZ1rI8cUNmXzOKfjaxpWlBdTM20yv8Jk-waSe7tpIRmMiLiUa_AmRSjz5eXo/s72-c/Screen+Shot+2012-10-18+at+11.33.49+PM.png" height="72" width="72"/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-8656331329325719157</id><published>2012-10-17T00:21:00.001-07:00</published><updated>2013-03-22T20:39:22.345-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="3gpp"/><category scheme="http://www.blogger.com/atom/ns#" term="avc"/><category scheme="http://www.blogger.com/atom/ns#" term="codecs"/><category scheme="http://www.blogger.com/atom/ns#" term="Download"/><category scheme="http://www.blogger.com/atom/ns#" term="download youtube video"/><category scheme="http://www.blogger.com/atom/ns#" term="flv"/><category scheme="http://www.blogger.com/atom/ns#" term="formats"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="mp4"/><category scheme="http://www.blogger.com/atom/ns#" term="OGG"/><category scheme="http://www.blogger.com/atom/ns#" term="video"/><category scheme="http://www.blogger.com/atom/ns#" term="video files"/><category scheme="http://www.blogger.com/atom/ns#" term="video formats"/><category scheme="http://www.blogger.com/atom/ns#" term="videos"/><category scheme="http://www.blogger.com/atom/ns#" term="vorbis"/><category scheme="http://www.blogger.com/atom/ns#" term="vp8.0"/><category scheme="http://www.blogger.com/atom/ns#" term="webm"/><category scheme="http://www.blogger.com/atom/ns#" term="YouTube"/><title type='text'>Download YouTube video files with Javascript</title><content type='html'>&lt;h2&gt;
UPDATED!&amp;nbsp;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
Check the new blog post:&amp;nbsp;&lt;a href=&quot;http://coding-everyday.blogspot.com/2013/03/how-to-grab-youtube-playback-video-files.html&quot;&gt;http://coding-everyday.blogspot.com/2013/03/how-to-grab-youtube-playback-video-files.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Live demo:&amp;nbsp;&lt;a href=&quot;http://keepvideos.possum-cms.com/&quot;&gt;http://keepvideos.possum-cms.com&lt;/a&gt;&amp;nbsp;or&amp;nbsp;&lt;a href=&quot;http://keepvideos.appspot.com/&quot;&gt;http://keepvideos.appspot.com&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;/div&gt;
&lt;h2&gt;
Download YouTube video files with Javascript&lt;/h2&gt;
&lt;h3&gt;
How to download YouTube videos files with Javascript only! Is it possible?&lt;/h3&gt;
&lt;h3&gt;
YES!&amp;nbsp;It is possible! And without relying in any kind of server side scripts!&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://keepvideos.appspot.com/&quot;&gt;LIVE DEMO: KeepVideos&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM_RGTQLRMyLU7bglsXiJe6y3GhY7wL7E-uER_debpZ3Tq6A-gzwh71OdjDZxwOjXhzhb02EZWbCVkt66RAXqinLpDFZAYtyVKWm94fw8nYCfy_-gLAjnWPbjZHnqXjbhhunQGyrsnMtY/s1600/Screen+Shot+2012-10-18+at+12.40.43+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM_RGTQLRMyLU7bglsXiJe6y3GhY7wL7E-uER_debpZ3Tq6A-gzwh71OdjDZxwOjXhzhb02EZWbCVkt66RAXqinLpDFZAYtyVKWm94fw8nYCfy_-gLAjnWPbjZHnqXjbhhunQGyrsnMtY/s320/Screen+Shot+2012-10-18+at+12.40.43+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Libraries needed to do this:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Step-by-step: Downloading YouTube videos with Javascript.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Part 1: Get the YouTube video URL from an input and validate the URL using regular expression.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;  var url = $(&#39;#url&#39;).val();  
  var regExp = /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&amp;amp;\?]*).*/;  
  var match = url.match(regExp);  
  if(match){  
   $(&#39;#download-btn&#39;).fadeOut(&#39;fast&#39;);  
   $(&#39;#loading&#39;).fadeIn(&#39;slow&#39;);  
   setTimeout(&quot;getVideo(&#39;&quot;+match[1]+&quot;&#39;)&quot;,2000);  
  }  
  else{  
   alert(&#39;Invalid URL!&#39;);  
   $(&#39;#url&#39;).val(&quot;&quot;);  
   $(&#39;#url&#39;).focus();  
  }  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Part 2: Retrive raw video information from YouTube&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Make an Ajax call to&amp;nbsp;http://www.youtube.com/get_video_info?video_id=XXX&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; $.ajax({  
  url: &quot;http://www.youtube.com/get_video_info?video_id=&quot;+id,  
  dataType: &quot;text&quot;  
 }).done(function(data) {
  ...  &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;Part 3: Prepare information to be parsed. We need to do 3 things:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;a) Replace all&amp;nbsp;occurrences&amp;nbsp;of the&amp;nbsp;character&amp;nbsp;&quot;\&quot; to &quot;%20&quot;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; data = (data+&#39;&#39;).replace(/\+/g, &#39;%20&#39;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;b) Replace all&amp;nbsp;occurrences&amp;nbsp;of the&amp;nbsp;string &quot;url%3D&quot; to &quot;\n\r&amp;lt;break&amp;gt;&quot;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; data = data.replace(/url%3D/g, &#39;\n\r\n\r&amp;lt;break&amp;gt;&#39;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;c) Replace all&amp;nbsp;occurrences&amp;nbsp;of the&amp;nbsp;string &quot;sig%3D&quot; to &quot;signature%3D&quot;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; data = data.replace(/sig%3D/g, &#39;signature%3D&#39;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;li&gt;Part 4: Grab all files URLs from this YouTube video&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt;  var urls = data.split(&#39;&amp;lt;break&amp;gt;&#39;);   
  for(var u = 0; u &amp;lt; urls.length; u++){   
  var result = {};   
  ...   
  }   &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;Part 5: Prepare each URL to be parsed&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;a) Decode the URL&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; decodeURIComponent((urls[u]+&#39;&#39;)  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;b) Replace all occurrences of the&amp;nbsp;character &quot;\&quot; to &quot;%20&quot;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; url = url.replace(/\+/g, &#39;%20&#39;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;c) Unescape the result twice&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; url = unescape(unescape(url));  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;d)&amp;nbsp;Replace all occurrences of the&amp;nbsp;string &#39;=&quot;&#39; to &#39;%3D%22&#39;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; url = url.replace(/=&quot;/g, &#39;%3D%22&#39;);  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;e)&amp;nbsp;Replace all occurrences of the&amp;nbsp;character &#39;&quot;&#39; to &quot;%22&quot;&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; url = url.replace(/&quot;/g, &#39;%22&#39;);  &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Part 6: Return a list for the videos URLs present in the YouTube results.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;a) Parse all variables present in each URL&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; var vars = [], hash;  
 var hashes = d.slice(d.indexOf(&#39;?&#39;) + 1).split(&#39;&amp;amp;&#39;);  
 for(var i = 0; i &amp;lt; hashes.length; i++){  
  hash = hashes[i].split(&#39;=&#39;);  
  vars.push(hash[0]);  
  vars[hash[0]] = unescape(hash[1]);  
 }  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;b) Grab the video type and codecs from the URL parameters&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; if(vars[&#39;type&#39;]!=undefined){  
  result.type = vars[&#39;type&#39;];  
  if(vars[&#39;type&#39;].indexOf(&quot;codecs&quot;)&amp;gt;0){  
   var cs = vars[&#39;type&#39;].split(&#39;;+codecs=&quot;&#39;);  
   result.type = cs[0];  
   result.codecs = cs[1].replace(&#39;&quot;&#39;,&#39;&#39;).replace(&#39;+&#39;,&#39; &#39;);  
  }  
 }  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;c) Grab the video quality from the URL parameters&lt;br /&gt;&lt;br /&gt;

&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; //quality  
 if(vars[&#39;quality&#39;]!=undefined){  
  result.quality = vars[&#39;quality&#39;];  
  if(vars[&#39;quality&#39;].indexOf(&quot;,&quot;)&amp;gt;0){  
   var cs = vars[&#39;quality&#39;].split(&#39;,&#39;);  
   result.quality = cs[0];  
  }  
 }  &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
That is it. Now you have all information needed in the result object.&amp;nbsp;Here is the full source-code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; /* Author: Emerson Estrella */  
 $(&#39;#again&#39;).click(function() {  
  $(&#39;#hero2&#39;).fadeOut(&#39;fast&#39;);$(&#39;#hero1&#39;).fadeIn(&#39;slow&#39;);  
 });  
 $(&#39;#form&#39;).submit(function() {  
  var url = $(&#39;#url&#39;).val();  
  var regExp = /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&amp;amp;\?]*).*/;  
  var match = url.match(regExp);  
  if(match){  
   $(&#39;#download-btn&#39;).fadeOut(&#39;fast&#39;);  
   $(&#39;#loading&#39;).fadeIn(&#39;slow&#39;);  
   setTimeout(&quot;getVideo(&#39;&quot;+match[1]+&quot;&#39;)&quot;,2000);  
  }  
  else{  
   alert(&#39;Invalid URL!&#39;);  
   $(&#39;#url&#39;).val(&quot;&quot;);  
   $(&#39;#url&#39;).focus();  
  }  
  return false;  
 });  
 function getVideo(youtube_video_id){  
  var id = &quot;b4VsluhWVh8&quot;;  
  id = youtube_video_id;  
  $.ajax({  
   url: &quot;http://www.youtube.com/get_video_info?video_id=&quot;+id,  
   dataType: &quot;text&quot;  
  }).done(function(data) {  
   var results = [];  
   var r = 0;  
   data = (data+&#39;&#39;).replace(/\+/g, &#39;%20&#39;);  
   data = data.replace(/url%3D/g, &#39;\n\r\n\r&amp;lt;break&amp;gt;&#39;);  
   data = data.replace(/sig%3D/g, &#39;signature%3D&#39;);  
   var urls = data.split(&#39;&amp;lt;break&amp;gt;&#39;);  
   for(var u = 0; u &amp;lt; urls.length; u++){  
    var result = {};  
    var d = unescape(unescape(decodeURIComponent((urls[u]+&#39;&#39;).replace(/\+/g, &#39;%20&#39;))));  
    d = d.replace(/=&quot;/g, &#39;%3D%22&#39;);  
    d = d.replace(/&quot;/g, &#39;%22&#39;);  
    var url = d;  
    //console.log(d);  
    //console.log(d.length);  
    if(d.length &amp;gt; 1500){  
     aux = d.split(&#39;&amp;amp;has_cc&#39;);  
     d = aux[0];  
    }  
    var vars = [], hash;  
    var hashes = d.slice(d.indexOf(&#39;?&#39;) + 1).split(&#39;&amp;amp;&#39;);  
    for(var i = 0; i &amp;lt; hashes.length; i++){  
     hash = hashes[i].split(&#39;=&#39;);  
     vars.push(hash[0]);  
     vars[hash[0]] = unescape(hash[1]);  
    }  
    if(vars[&#39;type&#39;]!=undefined){  
     result.type = vars[&#39;type&#39;];  
     if(vars[&#39;type&#39;].indexOf(&quot;codecs&quot;)&amp;gt;0){  
      var cs = vars[&#39;type&#39;].split(&#39;;+codecs=&quot;&#39;);  
      result.type = cs[0];  
      result.codecs = cs[1].replace(&#39;&quot;&#39;,&#39;&#39;).replace(&#39;+&#39;,&#39; &#39;);  
     }  
    }  
    //quality  
    if(vars[&#39;quality&#39;]!=undefined){  
     result.quality = vars[&#39;quality&#39;];  
     if(vars[&#39;quality&#39;].indexOf(&quot;,&quot;)&amp;gt;0){  
      var cs = vars[&#39;quality&#39;].split(&#39;,&#39;);  
      result.quality = cs[0];  
     }  
    }  
    if(result.type &amp;amp;&amp;amp; result.quality){  
     result.url = url;  
     results[r] = result;  
     r++;  
    }  
   }  
   //console.log(results);  
   //print results  
   var html = &#39;&#39;;  
   html += &#39;&amp;lt;h4 class=&quot;alert-heading&quot; style=&quot;margin-top: 25px;&quot;&amp;gt;All video files found for your request&amp;lt;/h4&amp;gt;&#39;;  
   html += &#39;&amp;lt;a id=&quot;again&quot; style=&quot;margin-top: 25px;&quot; class=&quot;btn btn-small btn-danger&quot; href=&quot;#main&quot; onclick=&quot;$(\&#39;#hero2\&#39;).fadeOut(\&#39;fast\&#39;);$(\&#39;#hero1\&#39;).fadeIn(\&#39;slow\&#39;);&quot;&amp;gt;&amp;lt;i class=&quot;icon-repeat icon-white&quot;&amp;gt;&amp;lt;/i&amp;gt; Make Another Request&amp;lt;/a&amp;gt;&#39;;  
   html += &#39;&amp;lt;table class=&quot;table table-striped musica&quot; style=&quot;background: rgba(255,255,255,0.7); margin-top:25px;&quot;&amp;gt;&amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Quality&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Format&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Codecs&amp;lt;/th&amp;gt;&amp;lt;th style=&quot;text-align: right;&quot;&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&amp;lt;tbody&amp;gt;&#39;;  
   $.each(results, function(index, value) {  
    html += &#39;\n\r&amp;lt;tr&amp;gt;&#39;;  
    html += &#39;&amp;lt;td&amp;gt;&#39;+value.quality+&#39;&amp;lt;/td&amp;gt;&#39;;  
    html += &#39;&amp;lt;td&amp;gt;&#39;+value.type+&#39;&amp;lt;/td&amp;gt;&#39;;  
    if(value.codecs!=undefined)  
     html += &#39;&amp;lt;td&amp;gt;&#39;+value.codecs+&#39;&amp;lt;/td&amp;gt;&#39;;  
    else  
     html += &#39;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&#39;;  
    html += &#39;&amp;lt;td&amp;gt;&amp;lt;a class=&quot;btn btn-success pull-left&quot; href=&quot;&#39;+value.url+&#39;&quot; style=&quot;margin-right: 15px;&quot;&amp;gt;&amp;lt;i class=&quot;icon-download-alt icon-white&quot;&amp;gt;&amp;lt;/i&amp;gt; Download this video format file&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#39;;  
    html += &#39;&amp;lt;/tr&amp;gt;\n\r&#39;;  
   });  
   html += &#39;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;a style=&quot;margin-top: 10px; margin-bottom: 25px;&quot; class=&quot;btn btn-small btn-danger&quot; href=&quot;#main&quot; onclick=&quot;$(\&#39;#hero2\&#39;).fadeOut(\&#39;fast\&#39;);$(\&#39;#hero1\&#39;).fadeIn(\&#39;slow\&#39;);&quot;&amp;gt;&amp;lt;i class=&quot;icon-repeat icon-white&quot;&amp;gt;&amp;lt;/i&amp;gt; Make Another Request&amp;lt;/a&amp;gt;&#39;;  
   $(&#39;#vid&#39;).html(html);  
   $(&#39;#vid&#39;).fadeIn(&#39;slow&#39;);  
   $(&#39;#loading&#39;).hide();  
   $(&#39;#hero1&#39;).hide();  
   $(&#39;#hero2&#39;).fadeIn(&#39;slow&#39;);  
   $(&#39;#download-btn&#39;).show();  
  });  
 }  &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;http://keepvideos.appspot.com/&quot;&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;LIVE DEMO: KeepVideos&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM_RGTQLRMyLU7bglsXiJe6y3GhY7wL7E-uER_debpZ3Tq6A-gzwh71OdjDZxwOjXhzhb02EZWbCVkt66RAXqinLpDFZAYtyVKWm94fw8nYCfy_-gLAjnWPbjZHnqXjbhhunQGyrsnMtY/s1600/Screen+Shot+2012-10-18+at+12.40.43+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM_RGTQLRMyLU7bglsXiJe6y3GhY7wL7E-uER_debpZ3Tq6A-gzwh71OdjDZxwOjXhzhb02EZWbCVkt66RAXqinLpDFZAYtyVKWm94fw8nYCfy_-gLAjnWPbjZHnqXjbhhunQGyrsnMtY/s320/Screen+Shot+2012-10-18+at+12.40.43+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
In the next post I&#39;ll explain how to Download YouTube video files from a server side script like PHP. Stay tuned!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/8656331329325719157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/download-youtube-video-files-with.html#comment-form' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8656331329325719157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8656331329325719157'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/download-youtube-video-files-with.html' title='Download YouTube video files with Javascript'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM_RGTQLRMyLU7bglsXiJe6y3GhY7wL7E-uER_debpZ3Tq6A-gzwh71OdjDZxwOjXhzhb02EZWbCVkt66RAXqinLpDFZAYtyVKWm94fw8nYCfy_-gLAjnWPbjZHnqXjbhhunQGyrsnMtY/s72-c/Screen+Shot+2012-10-18+at+12.40.43+PM.png" height="72" width="72"/><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-2821680442724852057</id><published>2012-10-17T00:14:00.000-07:00</published><updated>2012-10-17T00:14:01.866-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="videos"/><category scheme="http://www.blogger.com/atom/ns#" term="YouTube"/><title type='text'>Playing YouTube videos on HTML5 canvas with Javascript</title><content type='html'>&lt;h2&gt;
Playing YouTube videos on HTML5 canvas with Javascript&lt;/h2&gt;
&lt;h3&gt;
How to play YouTube videos on HTML5 canvas tag&lt;/h3&gt;
&lt;div&gt;
This blog post is coming soon. Stay tuned!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/2821680442724852057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/playing-youtube-videos-on-html5-canvas.html#comment-form' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2821680442724852057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2821680442724852057'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/playing-youtube-videos-on-html5-canvas.html' title='Playing YouTube videos on HTML5 canvas with Javascript'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-4431862678315385794</id><published>2012-10-13T21:40:00.001-07:00</published><updated>2012-10-13T23:31:35.665-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="audio"/><category scheme="http://www.blogger.com/atom/ns#" term="Audio API"/><category scheme="http://www.blogger.com/atom/ns#" term="canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="Fullscreen"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5 Game"/><category scheme="http://www.blogger.com/atom/ns#" term="image"/><category scheme="http://www.blogger.com/atom/ns#" term="image puzzle"/><category scheme="http://www.blogger.com/atom/ns#" term="Puzzle"/><title type='text'>Step-by-step creating a HTML5 image puzzle game</title><content type='html'>&lt;h2&gt;
Step-by-step creating a HTML5 image puzzle game&lt;/h2&gt;
&lt;h3&gt;
How to create a HTML5 image puzzle game with images, canvas, audio and fullscreen support.&lt;/h3&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcMZATnFfDJBT-K0UwIRJv7N7ZF5g8WEotsG9RNxOUwWnnSydP0O5fo4yskXWKfTMxzCmtg8Nv6oolavJ4M8G8v4i7rmxmCMk_5sUN_DB6T7zfMePGrkNXemiFOU-vMiE9ANdtw4ffOY/s1600/05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcMZATnFfDJBT-K0UwIRJv7N7ZF5g8WEotsG9RNxOUwWnnSydP0O5fo4yskXWKfTMxzCmtg8Nv6oolavJ4M8G8v4i7rmxmCMk_5sUN_DB6T7zfMePGrkNXemiFOU-vMiE9ANdtw4ffOY/s320/05.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisZY4ytV8g-AgQpgka9luxDC-IXG7aVJlM31U2Thw2uWkk-nUvO_E9nbJirq-aaox_nVG7FkaWOQLG48M0lglUgT5Fsv1dAHOM6WdFeYQVTv_4-XPJbximPGJDdABxLALFeINOR6RiXKs/s1600/06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisZY4ytV8g-AgQpgka9luxDC-IXG7aVJlM31U2Thw2uWkk-nUvO_E9nbJirq-aaox_nVG7FkaWOQLG48M0lglUgT5Fsv1dAHOM6WdFeYQVTv_4-XPJbximPGJDdABxLALFeINOR6RiXKs/s320/06.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj87hy6EupfR9N2rpjHnkwg0uiQOsjkbbS-gXgZbLJ86gRrBDdXnH-ZLwtfRX2DiPm4sW58yw7VIcA7ci9NTArk-bRzW243pB79wYI3lya8nevepZKsxzIO01ZFcZE0xlW_6O6LpycXRdg/s1600/07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj87hy6EupfR9N2rpjHnkwg0uiQOsjkbbS-gXgZbLJ86gRrBDdXnH-ZLwtfRX2DiPm4sW58yw7VIcA7ci9NTArk-bRzW243pB79wYI3lya8nevepZKsxzIO01ZFcZE0xlW_6O6LpycXRdg/s320/07.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJzf3jyeFSuP08hiOT7t5mumXp-HvIGU4YP89Yy7m1x4laMZKvzIIH6FiUOtE-6PbLSMPKn6IhWO3q4Yzv41Q7PaNSyCrjeepRpKtn7agYeoXE0x75p1edK6dDSF4pAIcND_gEAbv1HH8/s1600/09.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJzf3jyeFSuP08hiOT7t5mumXp-HvIGU4YP89Yy7m1x4laMZKvzIIH6FiUOtE-6PbLSMPKn6IhWO3q4Yzv41Q7PaNSyCrjeepRpKtn7agYeoXE0x75p1edK6dDSF4pAIcND_gEAbv1HH8/s320/09.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;
Demo: &lt;a href=&quot;http://html5puzzle.appspot.com/&quot;&gt;HTML5 Image Puzzle Game&lt;/a&gt;&lt;/h4&gt;
&lt;h4&gt;
Source code: &lt;a href=&quot;https://github.com/edse/puzzle&quot;&gt;github.com/edse/puzzle&lt;/a&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;
Tutorial coming soon&amp;nbsp;&lt;/h4&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/4431862678315385794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/step-by-step-creating-html5-image.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4431862678315385794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/4431862678315385794'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/step-by-step-creating-html5-image.html' title='Step-by-step creating a HTML5 image puzzle game'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcMZATnFfDJBT-K0UwIRJv7N7ZF5g8WEotsG9RNxOUwWnnSydP0O5fo4yskXWKfTMxzCmtg8Nv6oolavJ4M8G8v4i7rmxmCMk_5sUN_DB6T7zfMePGrkNXemiFOU-vMiE9ANdtw4ffOY/s72-c/05.png" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-3642406928924279111</id><published>2012-10-13T17:26:00.004-07:00</published><updated>2012-10-13T17:26:40.247-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ads"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Adsense"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Responsive"/><category scheme="http://www.blogger.com/atom/ns#" term="Responsive Ads"/><category scheme="http://www.blogger.com/atom/ns#" term="Responsive Adsense"/><title type='text'>Adsense - Responsive Ads using a Javascript interface</title><content type='html'>&lt;h2&gt;
Adsense - Responsive Ads with a Javascript interface&lt;/h2&gt;
&lt;h3&gt;
How to make responsive ads using Javascript&lt;/h3&gt;
&lt;div&gt;
So, the idea is check the user screen size and then based on that value show up the ads.&lt;br /&gt;
&lt;br /&gt;
In my case I have the following set:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Leaderboard (728x90)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s1600/01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s320/01.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Portrait tablet to landscape and desktop&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Banner (468x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s1600/02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s320/02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Landscape phone to portrait tablet&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Banner&amp;nbsp;(468x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s1600/02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s320/02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Landscape phones and down&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Half Banner&amp;nbsp;(234x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxl6VOM4IAUcYbf0l0o9qByrvD1tb23zstB1Bk8FeKXeIbvHWBBuybJYmznV1ob1h8ucAZ0MFtGlcNknofgt8LKqk3vjKhoCYBXEv38Lx2nPhzw5MZ_TcwB4yXRCXBxZ0xBGVZo2WxJc/s1600/03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxl6VOM4IAUcYbf0l0o9qByrvD1tb23zstB1Bk8FeKXeIbvHWBBuybJYmznV1ob1h8ucAZ0MFtGlcNknofgt8LKqk3vjKhoCYBXEv38Lx2nPhzw5MZ_TcwB4yXRCXBxZ0xBGVZo2WxJc/s320/03.png&quot; width=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
See the source code example:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;  
       google_ad_client = &quot;ca-pub-XXXXXX&quot;;  
       google_ad_slot = &quot;&quot;;  
       if(window.innerWidth &amp;gt;= 800) {  
        //visible-desktop  
        //Medium Rectangle  
        google_ad_slot = &quot;xxxxxxx&quot;;  
        google_ad_width = 300;  
        google_ad_height = 250;  
       }  
       else if((window.innerWidth &amp;gt; 480)&amp;amp;&amp;amp;(window.innerWidth &amp;lt; 800)) {  
        //visible-tablet  
        //Square  
        google_ad_slot = &quot;xxxxxxx&quot;;  
        google_ad_width = 250;  
        google_ad_height = 250;  
       }  
       else if(window.innerWidth &amp;lt;= 480) {  
        //visible-phone  
        //Large Rectangle  
        google_ad_slot = &quot;xxxxxxx&quot;;  
        google_ad_width = 336;  
        google_ad_height = 280;  
       }  
       if(google_ad_slot != &quot;&quot;)  
        document.write(&#39;1: &amp;lt;scr&#39;+&#39;ipt type=\&quot;text/javascript\&quot; src=\&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js\&quot;&amp;gt;&amp;lt;/scri&#39;+&#39;pt&amp;gt;&#39;);  
       &amp;lt;/script&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Are you using Twitter Bootstrap? If so, you can make the same thing quite&amp;nbsp;easier. &lt;a href=&quot;http://coding-everyday.blogspot.com.br/2012/10/adsense-responsive-ads-with-css-media.html&quot;&gt;Take a look!&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/3642406928924279111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/adsense-responsive-ads-using-javascript.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/3642406928924279111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/3642406928924279111'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/adsense-responsive-ads-using-javascript.html' title='Adsense - Responsive Ads using a Javascript interface'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s72-c/01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-6310430468255450818</id><published>2012-10-12T12:18:00.001-07:00</published><updated>2012-10-13T17:31:20.078-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ads"/><category scheme="http://www.blogger.com/atom/ns#" term="AdSense"/><category scheme="http://www.blogger.com/atom/ns#" term="Banner"/><category scheme="http://www.blogger.com/atom/ns#" term="Bootstrap"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><category scheme="http://www.blogger.com/atom/ns#" term="Media Queries"/><category scheme="http://www.blogger.com/atom/ns#" term="media-queries"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter Bootstrap"/><title type='text'>Adsense - Responsive Ads with CSS @media queries from Bootstrap responsive utility classes</title><content type='html'>&lt;h2&gt;
Adsense - Responsive Ads with Bootstrap and CSS @media queries&lt;/h2&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Twitter Bootstrap is built with Responsive utility classes that help us to implement&amp;nbsp;different sizes of ads&amp;nbsp;&amp;nbsp; for different devices.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;table class=&quot;table table-bordered table-striped responsive-utilities&quot; style=&quot;background-color: white; border-bottom-color: rgb(221, 221, 221); border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-bottom-style: solid; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-spacing: 0px; border-top-color: rgb(221, 221, 221); border-top-left-radius: 4px; border-top-right-radius: 4px; border-top-style: solid; border-width: 1px 1px 1px 0px; color: #333333; font-family: &#39;Helvetica Neue&#39;, Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; margin-bottom: 20px; max-width: 100%; text-align: start; width: 869px;&quot;&gt;&lt;thead&gt;
&lt;tr&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-left-radius: 4px; border-top-width: 0px; padding: 8px; vertical-align: bottom;&quot;&gt;Class&lt;/th&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-width: 0px; padding: 8px; vertical-align: bottom;&quot;&gt;Phones&lt;small style=&quot;color: #999999; display: block; font-size: 12px; font-weight: normal;&quot;&gt;767px and below&lt;/small&gt;&lt;/th&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-width: 0px; padding: 8px; vertical-align: bottom;&quot;&gt;Tablets&lt;small style=&quot;color: #999999; display: block; font-size: 12px; font-weight: normal;&quot;&gt;979px to 768px&lt;/small&gt;&lt;/th&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-right-radius: 4px; border-top-width: 0px; padding: 8px; vertical-align: bottom;&quot;&gt;Desktops&lt;small style=&quot;color: #999999; display: block; font-size: 12px; font-weight: normal;&quot;&gt;Default&lt;/small&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.visible-phone&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.visible-tablet&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: rgb(249, 249, 249) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: rgb(223, 240, 216) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: rgb(249, 249, 249) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.visible-desktop&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.hidden-phone&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: rgb(249, 249, 249) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: rgb(223, 240, 216) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: rgb(223, 240, 216) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.hidden-tablet&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: #f9f9f9; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th style=&quot;border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; font-weight: normal; padding: 8px; vertical-align: top;&quot;&gt;&lt;code style=&quot;background-color: #f7f7f9; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(225, 225, 232); color: #dd1144; font-family: Monaco, Menlo, Consolas, &#39;Courier New&#39;, monospace; font-size: 12px; padding: 2px 4px;&quot;&gt;.hidden-desktop&lt;/code&gt;&lt;/th&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: rgb(223, 240, 216) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-visible&quot; style=&quot;background-color: rgb(223, 240, 216) !important; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #468847; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Visible&lt;/td&gt;&lt;td class=&quot;is-hidden&quot; style=&quot;background-color: rgb(249, 249, 249) !important; border-bottom-right-radius: 4px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; color: #cccccc; padding: 8px; text-align: center; vertical-align: top;&quot;&gt;Hidden&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
So, the idea is to use these classes to show the right ads. In my case I have the following set:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Leaderboard (728x90)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s1600/01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s320/01.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Portrait tablet to landscape and desktop&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Banner (468x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s1600/02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s320/02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Landscape phone to portrait tablet&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Banner&amp;nbsp;(468x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s1600/02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;188&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-J87LQsxCCn_zVrtwkHjcojAlE39FH4yir1Ae5mQcLp4epkbLH35oYhNeUyZRerE4UNOIK83pSivCmAbydGYAqYVNDNVvnU8x8jS7x6rnPU-e8yfPBgFNfKqjOr6JkJBHigpC1pqbgk/s320/02.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Landscape phones and down&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Half Banner&amp;nbsp;(234x60)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxl6VOM4IAUcYbf0l0o9qByrvD1tb23zstB1Bk8FeKXeIbvHWBBuybJYmznV1ob1h8ucAZ0MFtGlcNknofgt8LKqk3vjKhoCYBXEv38Lx2nPhzw5MZ_TcwB4yXRCXBxZ0xBGVZo2WxJc/s1600/03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRxl6VOM4IAUcYbf0l0o9qByrvD1tb23zstB1Bk8FeKXeIbvHWBBuybJYmznV1ob1h8ucAZ0MFtGlcNknofgt8LKqk3vjKhoCYBXEv38Lx2nPhzw5MZ_TcwB4yXRCXBxZ0xBGVZo2WxJc/s320/03.png&quot; width=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
It is really simple to&amp;nbsp;achieve&amp;nbsp;this using the Bootstrap&amp;nbsp;built-in responsive utility classes. See the example bellow:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;div class=&quot;visible-desktop&quot;&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;  
             google_ad_client = &quot;ca-pub-XXXXXX&quot;;  
             google_ad_slot = &quot;XXXXXXX&quot;;  
             google_ad_width = 728;  
             google_ad_height = 90;  
        &amp;lt;/script&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&amp;gt;&amp;lt;/script&amp;gt;   
 &amp;lt;/div&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;div class=&quot;visible-tablet&quot;&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;  
             google_ad_client = &quot;ca-pub-XXXXXX&quot;;  
             google_ad_slot = &quot;XXXXXXX&quot;;  
             google_ad_width = 468;  
             google_ad_height = 60;  
        &amp;lt;/script&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;/div&amp;gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;pre style=&quot;background-image: URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUIBP74SzOgdltcWSoIe2DS73rxv_oLQqh0vLLAHFtKQM7SLcFjDCCgyACRH40i60vC0Gcj85qvbB9PN-aNGVzgexNvmNcJyO41L4ml1CcteMJXODiQz7DzETBzPU6OCDesk3Qq-5YSCM/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;&quot;&gt;&lt;code style=&quot;color: black; word-wrap: normal;&quot;&gt; &amp;lt;div class=&quot;visible-phone&quot;&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;  
             google_ad_client = &quot;ca-pub-XXXXXX&quot;;  
             google_ad_slot = &quot;XXXXXXX&quot;;  
             google_ad_width = 234;  
             google_ad_height = 60;  
        &amp;lt;/script&amp;gt;  
        &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;/div&amp;gt;  &lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Easy uh?!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://coding-everyday.blogspot.com.br/2012/10/adsense-responsive-ads-using-javascript.html&quot;&gt;Here is a example&lt;/a&gt; showing how we can make the same thing using Javascript only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/6310430468255450818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/adsense-responsive-ads-with-css-media.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/6310430468255450818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/6310430468255450818'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/10/adsense-responsive-ads-with-css-media.html' title='Adsense - Responsive Ads with CSS @media queries from Bootstrap responsive utility classes'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisD8HUwpoYwUmCLCybV_sQM0NaNXDzEvqlgqAzBKnsao2VBolZxNQK1mcrajYyo8IAMYtx-yurv0tH7VDVcb6nJmewJq8l2iCzRRkAuiQ2kwXALjZ5Y3DUWKdjlGuc6WdcpN3go8PxDc0/s72-c/01.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-7988815481847016622</id><published>2012-09-09T16:42:00.004-07:00</published><updated>2012-09-09T16:42:44.754-07:00</updated><title type='text'>iOS 5.1.1 Development on Xcode 4.3 - Testing on real device without an Apple Provisioning Profile</title><content type='html'>&lt;h2&gt;
iOS 5.1.1 Development on Xcode 4.3&lt;/h2&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h3&gt;
Testing on real device without an Apple Provisioning Profile&lt;/h3&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;After a two long days, today I was able to build and run an iOS 5.1.1 from Xcode straight to my device.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;To do this you will need:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Jailbroken iPhone, iPad or iPod&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Appsync&amp;nbsp;installed&amp;nbsp;on device&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Xcode 4.3+&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step 1:&lt;/b&gt; &lt;span style=&quot;font-weight: normal;&quot;&gt;Create a new self-signed code-signing certificate using Keychain Access&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Open the&amp;nbsp;Keychain Access application&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Go to Menu &quot;Keychain Access&quot; -&amp;gt; &quot;Certificate Assistant&quot; -&amp;gt; &quot;Create a Certificate&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Choose an unique name, easier to remember. You will need that name latter on.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Choose &quot;Self Signed Root&quot; for &quot;Identity Type&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Choose &quot;Code Signing&quot; for &quot;Certificate Type&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Check &quot;Let me override defaults&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;And then click &quot;Create&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Click next to all following questions without changing anything&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step 2:&lt;/b&gt; &lt;span style=&quot;font-weight: normal;&quot;&gt;Edit Xcode &quot;Info.plist&quot; file&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Open the file:&amp;nbsp;/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Info.plist&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Replace the three occurrences of &quot;XCiPhoneOSCodeSignContext&quot; by &quot;XCCodeSignContext&quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Save the file and restart Xcode&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Step 3:&lt;/b&gt; Install Appsync&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Intall &quot;Appsync&quot; application from Cydia&lt;/li&gt;
&lt;li&gt;Intall &quot;SSH&quot; application from Cydia&lt;/li&gt;
&lt;li&gt;Log into your device via SSH and create a blank file called &quot;tdmtanf&quot; in &quot;/var/mobile&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;b&gt;Step 4:&lt;/b&gt; Xcode Project Setup&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Open your project on Xcode&lt;/li&gt;
&lt;li&gt;Go to &quot;Project&quot; -&amp;gt; &quot;Build Settings&quot; -&amp;gt; &quot;Code Signing&quot; -&amp;gt; &quot;Code Signing Identity&quot; -&amp;gt; Choose the identity related to the certificate that you created on step 1 on settings for debug and release.&lt;/li&gt;
&lt;li&gt;Make&amp;nbsp;exactly&amp;nbsp;the same thing on &quot;Targets&quot; -&amp;gt;&amp;nbsp;&quot;Build Settings&quot; -&amp;gt; &quot;Code Signing&quot; -&amp;gt; &quot;Code Signing Identity&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Now you should be able to build and run your project from Xcode to your device.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/7988815481847016622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/09/ios-511-development-on-xcode-43-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/7988815481847016622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/7988815481847016622'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/09/ios-511-development-on-xcode-43-testing.html' title='iOS 5.1.1 Development on Xcode 4.3 - Testing on real device without an Apple Provisioning Profile'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-6598372392391896605</id><published>2012-07-01T12:28:00.002-07:00</published><updated>2012-07-01T12:28:43.404-07:00</updated><title type='text'>Touch != mouse</title><content type='html'>&lt;h2&gt;
Touch != mouse&lt;/h2&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;No hover state&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Multiple points&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Less precise input&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Fingers aren&#39;t (x, y), but also have shape&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Future: Pressure?&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Haptic feedback?&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Hover?&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/6598372392391896605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/07/touch-mouse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/6598372392391896605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/6598372392391896605'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/07/touch-mouse.html' title='Touch != mouse'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-8479197514231972935</id><published>2012-06-26T21:27:00.003-07:00</published><updated>2012-06-26T21:27:42.908-07:00</updated><title type='text'>This is why I love cache...</title><content type='html'>&lt;h2&gt;
This is why I love cache...&lt;/h2&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJxBfSB5llRpeSSp38l4z5kWb0msxAjXkrBh8HwH5v7VrSICQ8Or0nUQWiLcnfjFr6YTSg6-iVLEm7DlL8AgcNbdRZwU8ikyviBjN409LgMrRU4jLMQJdk4b04xuuTusA7wfxqtJaPHE/s1600/chart.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJxBfSB5llRpeSSp38l4z5kWb0msxAjXkrBh8HwH5v7VrSICQ8Or0nUQWiLcnfjFr6YTSg6-iVLEm7DlL8AgcNbdRZwU8ikyviBjN409LgMrRU4jLMQJdk4b04xuuTusA7wfxqtJaPHE/s1600/chart.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/8479197514231972935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/this-is-why-i-love-cache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8479197514231972935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/8479197514231972935'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/this-is-why-i-love-cache.html' title='This is why I love cache...'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtJxBfSB5llRpeSSp38l4z5kWb0msxAjXkrBh8HwH5v7VrSICQ8Or0nUQWiLcnfjFr6YTSg6-iVLEm7DlL8AgcNbdRZwU8ikyviBjN409LgMrRU4jLMQJdk4b04xuuTusA7wfxqtJaPHE/s72-c/chart.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-5665762399203827581</id><published>2012-06-23T11:22:00.000-07:00</published><updated>2012-06-23T11:22:28.803-07:00</updated><title type='text'>HTML5 Puzzle Chrome Experiment</title><content type='html'>&lt;h2&gt;

HTML5 Puzzle Chrome Experiment&lt;/h2&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.chromeexperiments.com/detail/html5-puzzle/&quot;&gt;http://www.chromeexperiments.com/detail/html5-puzzle/&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/goog_489994573&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;175&quot; src=&quot;http://www.chromeexperiments.com/detail/html5-puzzle/img/ahZzfmNocm9tZXhwZXJpbWVudHMtaHJkchgLEg9FeHBlcmltZW50SW1hZ2UY4Z-yBQw/large&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.chromeexperiments.com/detail/html5-puzzle/&quot;&gt;HTML5 Puzzle&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/5665762399203827581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/html5-puzzle-chrome-experiment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/5665762399203827581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/5665762399203827581'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/html5-puzzle-chrome-experiment.html' title='HTML5 Puzzle Chrome Experiment'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-7204353410584232087</id><published>2012-06-22T19:55:00.001-07:00</published><updated>2012-06-22T19:55:46.607-07:00</updated><title type='text'>Conventional Debugging vs. TDD</title><content type='html'>&lt;br /&gt;
&lt;h2&gt;

Conventional&amp;nbsp;Debugging vs.&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;TDD&lt;/span&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;h3&gt;

Conventional&amp;nbsp;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Write 10s of lines, run, hit bug: break&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;out debugger&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Insert printfʼs to print variables while &lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;running repeatedly&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Stop in debugger, tweak/set variables to&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;control code path&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Dammit, I thought for sure I ﬁxed it, now&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;have to do this all again&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;

TDD&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Write a few lines, with test ﬁrst; know&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;immediately if broken&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Test short pieces of code using&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;expectations&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Use mocks and stubs to control code&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;path&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Re-run test automatically&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/7204353410584232087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/conventional-debugging-vs-tdd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/7204353410584232087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/7204353410584232087'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/conventional-debugging-vs-tdd.html' title='Conventional Debugging vs. TDD'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-2614946578016351971</id><published>2012-06-15T20:06:00.000-07:00</published><updated>2012-06-22T11:57:59.483-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><category scheme="http://www.blogger.com/atom/ns#" term="test"/><title type='text'>Testing Software</title><content type='html'>&lt;h2&gt;
&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;Testing Software&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3&gt;
&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small; line-height: 18px;&quot;&gt;Before&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;Developers ﬁnish code, some ad-hoc testing&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;“toss over the wall to Quality Assurance [QA]”&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;QA people manually poke at software&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h3&gt;
&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;Today&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;Testing is part of every Agile iteration&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;Developers responsible for testing own code&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;Testing tools &amp;amp; processes highly automated;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;QA/testing group improves testability &amp;amp; tools&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div style=&quot;font-family: Times; font-size: medium; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;Software quality is the result of a god process, rather than the responsibility of one specific group.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times; font-size: medium; line-height: normal;&quot;&gt;
&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;font-family: Times; font-size: medium; line-height: normal;&quot;&gt;
&lt;button class=&quot;g-ci&quot; data-sbxm=&quot;1&quot; data-token-entity=&quot;#agile&quot; email=&quot;agile&quot; style=&quot;background-color: #eeeeee; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; border-top-left-radius: 2px; border-top-right-radius: 2px; border: 1px solid rgb(221, 221, 221); color: #3366cc; font-family: Arial, sans-serif; font-size: 13px; line-height: 1.4; margin: 0px 1px; padding: 0px 1px; vertical-align: baseline; white-space: nowrap;&quot; tabindex=&quot;-1&quot;&gt;&lt;span style=&quot;color: #888888;&quot;&gt;#&lt;/span&gt;agile&lt;/button&gt;&lt;span style=&quot;background-color: white; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/2614946578016351971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/testing-software.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2614946578016351971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2614946578016351971'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/06/testing-software.html' title='Testing Software'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-708001724419182293</id><published>2012-05-07T23:51:00.003-07:00</published><updated>2012-05-07T23:53:48.448-07:00</updated><title type='text'>HTML5 - Javascript Performance Tests - jsperf.com</title><content type='html'>&lt;a href=&quot;http://jsperf.com/&quot;&gt;jsperf&lt;/a&gt;&amp;nbsp;is one of the best things I have seen this year. It is a&amp;nbsp;powerful&amp;nbsp;test engine for Javascript.&lt;br /&gt;
&lt;br /&gt;
Every test created is public, and listed there. So anybody can test it, in any&amp;nbsp;platform or browser and all test results are keept. So as more people runs each test, more analysis data we have.&lt;br /&gt;
&lt;br /&gt;
To see how it works, and also to answer one question regarding the performance of drawing text with shadow on canvas, &lt;a href=&quot;http://jsperf.com/requestanimationframe-canvas-drawing-text-shadows&quot;&gt;I have setup a test on&amp;nbsp;jsperf&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
http://jsperf.com/requestanimationframe-canvas-drawing-text-shadows&lt;br /&gt;
&lt;br /&gt;
As I only tested on Chrome and Firefox what I can say for now is:&lt;br /&gt;
&lt;br /&gt;
On Chrome 18.0 the performance dorps by almost half when drawing texts with shadows.&lt;br /&gt;
&lt;br /&gt;
On Firefox 12.0 is the same thing. Doesn&#39;t matter it keep the same performance, but comparing the results&amp;nbsp;Chrome is almost 50% faster than Firefox when drawing texts without shadows.&lt;br /&gt;
&lt;br /&gt;
Remember that it is only a test and I have only test it on my computer.</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/708001724419182293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/05/html5-javascript-performance-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/708001724419182293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/708001724419182293'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/05/html5-javascript-performance-tests.html' title='HTML5 - Javascript Performance Tests - jsperf.com'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-3945758254448866984</id><published>2012-04-28T18:04:00.001-07:00</published><updated>2012-04-29T17:11:11.532-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppCache API"/><category scheme="http://www.blogger.com/atom/ns#" term="Audio API"/><category scheme="http://www.blogger.com/atom/ns#" term="Cache"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="Javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Manifest"/><category scheme="http://www.blogger.com/atom/ns#" term="MP3"/><category scheme="http://www.blogger.com/atom/ns#" term="OGG"/><title type='text'>HTML5 AppCache API - How to prevent browser caching unsupported resources in manifest file</title><content type='html'>&lt;blockquote class=&quot;tr_bq&quot;&gt;
The method describe below doesn&#39;t work in all browsers.&amp;nbsp;&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
For now I&#39;m using two different html files. But the best solution is on server side, making a rewrite rule for redirecting the user to the correct manifest file.&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;br /&gt;
I&#39;m writing a web application that uses the AppCache API for offline browsing. But I&#39;m also using the Audio API to play back-ground music and a few audio effects.&lt;br /&gt;
&lt;br /&gt;
For audio support in different browsers I&#39;m delivering each sound/music in two different&amp;nbsp;file&amp;nbsp;formats:&amp;nbsp;OGG and MP3.&lt;br /&gt;
&lt;br /&gt;
The problem is regarding the cache manifest file. If we add all audio files (MP3 and OGG) in the cache manifest file, all browsers will cache all files. Including the unsupported ones. So, we end up with a huge storage&amp;nbsp;requirement. Which is really bad if you are on a 3G&amp;nbsp;connection for example.&lt;br /&gt;
&lt;br /&gt;
So, to prevent browser caching unsupported resources, the best approach I&#39;ve found was to split the manifest file. This way we can tell browsers that sopport OGG files to cache only OGG files, and do tha same for other formats like MP3.&lt;br /&gt;
&lt;br /&gt;
Ok then. I have two manifest cache files, one with all OGG files listed (ogg.appcache)&amp;nbsp;and the other one with the MP3 files (mp3.appcache).&lt;br /&gt;
&lt;br /&gt;
Now what!? How do I swap from one to other?&lt;br /&gt;
&lt;br /&gt;
Easy. First we should consider the browser supports OGG. If so, we can add the manifest attribute into the html tag with the right manifest file, just like that:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
&lt;span class=&quot;s1&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;html &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;manifest&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;=&lt;/span&gt;&quot;ogg.appcache&quot;&lt;span class=&quot;s1&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
Now, we have to check if the browser supports MP3. If it does, we change the value of the attribute &quot;manifest&quot; from the html tag. We can do that with this javascript:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;
var audio = document.createElement(&#39;audio&#39;);&lt;br /&gt;
&lt;span class=&quot;s1&quot;&gt;if&lt;/span&gt;(audio.canPlayType(&lt;span class=&quot;s2&quot;&gt;&#39;audio/mpeg;&#39;&lt;/span&gt;))&lt;br /&gt;
&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; document&lt;/span&gt;.documentElement.setAttribute(&lt;span class=&quot;s3&quot;&gt;&quot;manifest&quot;&lt;/span&gt;,&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;document&lt;/span&gt;.documentElement.getAttribute(&lt;span class=&quot;s3&quot;&gt;&quot;manifest&quot;&lt;/span&gt;).replace(&lt;span class=&quot;s3&quot;&gt;&#39;ogg&#39;&lt;/span&gt;,&lt;span class=&quot;s3&quot;&gt;&#39;mp3&#39;&lt;/span&gt;));&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/3945758254448866984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/04/html5-appcache-api-how-to-prevent.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/3945758254448866984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/3945758254448866984'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/04/html5-appcache-api-how-to-prevent.html' title='HTML5 AppCache API - How to prevent browser caching unsupported resources in manifest file'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1228370290462112652.post-2109092394279109431</id><published>2012-04-23T22:29:00.002-07:00</published><updated>2012-04-23T23:05:32.918-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="APIs"/><category scheme="http://www.blogger.com/atom/ns#" term="Fullscreen"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="RequestAnimationFrame"/><title type='text'>HTML5 Polyfills - Fullscreen &amp; RequestAnimationFrame APIs</title><content type='html'>&lt;h3&gt;








So far, those are the best polyfills for using&amp;nbsp;Fullscreen and RequestAnimationFrame&amp;nbsp;features from HTML5 on today&#39;s browsers.&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;



&lt;/h4&gt;
&lt;h3&gt;






RequestAnimationFrame API&lt;/h3&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;Optimize concurrent animations together into a single reflow and repaint cycle, leading to higher fidelity animation, and using&amp;nbsp;less CPU, GPU, memory, and battery.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating&quot;&gt;http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h4&gt;






&lt;/h4&gt;
&lt;h4&gt;




&lt;/h4&gt;
&lt;h4&gt;



&lt;/h4&gt;
&lt;h3&gt;






Fullscreen API&lt;/h3&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;Provides an easy way for web content to be presented using the user&#39;s entire screen.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://github.com/sindresorhus/screenfull.js&quot;&gt;https://github.com/sindresorhus/screenfull.js&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://coding-everyday.blogspot.com/feeds/2109092394279109431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://coding-everyday.blogspot.com/2012/04/html5-polyfills-fullscreen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2109092394279109431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1228370290462112652/posts/default/2109092394279109431'/><link rel='alternate' type='text/html' href='http://coding-everyday.blogspot.com/2012/04/html5-polyfills-fullscreen.html' title='HTML5 Polyfills - Fullscreen &amp; RequestAnimationFrame APIs'/><author><name>Coding Everyday</name><uri>http://www.blogger.com/profile/01808612719604360165</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>