<?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: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-986509793457320090</id><updated>2012-03-10T12:03:24.133-08:00</updated><category term='Random'/><category term='Heuristic'/><category term='Python'/><category term='Touring'/><category term='Skydive Surf City'/><category term='WebAPI'/><category term='Firefox for Mobile'/><category term='France'/><category term='github'/><category term='Number Theory'/><category term='World Music'/><category term='Variation'/><category term='solutions for humanity'/><category term='death of companion'/><category term='Test Automation'/><category term='Web API'/><category term='Matter into energy'/><category term='applications'/><category term='TDD'/><category term='Santa Cruz'/><category term='Groove'/><category term='Karelia'/><category term='Cucumber'/><category term='Mozilla'/><category term='Javascript.'/><category term='persistence.'/><category term='Boot 2 Gecko'/><category term='Software Test Automation'/><category term='Fennec'/><category term='blogs'/><category term='Bayesian Analysis'/><category term='SF Bay'/><category term='Lo-Fi'/><category term='travels'/><category term='Jazz Guitar.'/><category term='Radio St. Petersburg'/><category term='Acoustic Music'/><category term='Korg EMX-1'/><category term='Avoid KLM'/><category term='California'/><category term='Skydiving'/><category term='Radio'/><category term='experience'/><category term='Don&apos;t Fly Iberia'/><category term='Java'/><category term='Marionette'/><category term='API'/><category term='loss of loved one'/><category term='Avoid SAS'/><category term='Desktop Firefox'/><category term='loss of pet'/><category term='Learning'/><category term='Ruby'/><category term='T.V. Rennes'/><category term='Avoid Madrid Airport'/><category term='quality'/><category term='Russia'/><category term='Ubuntu'/><category term='testing'/><category term='Fall'/><category term='P2P'/><category term='Death'/><title type='text'>on Quality</title><subtitle type='html'>John Hammink on music, writing, language, and quality.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-3241475171419178742</id><published>2012-02-06T17:38:00.000-08:00</published><updated>2012-02-06T17:38:30.893-08:00</updated><title type='text'>My new home:  write up in Lion's club, Staffansdorp, Sweden</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Wicked!&amp;nbsp; My new home in Mountain View got a nice write up on the Lion's club site:&amp;nbsp; &lt;a href="http://www.lionsstaffanstorp.se/loppis-i-staffanstorp/"&gt;http://www.lionsstaffanstorp.se/loppis-i-staffanstorp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.lionsstaffanstorp.se/wp-content/uploads/2012/02/329094_10150645464950775_503955774_11627991_471196836_o-300x225.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.lionsstaffanstorp.se/wp-content/uploads/2012/02/329094_10150645464950775_503955774_11627991_471196836_o-300x225.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.lionsstaffanstorp.se/wp-content/uploads/2012/02/334016_10150645461055775_503955774_11627977_1032222943_o-300x225.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.lionsstaffanstorp.se/wp-content/uploads/2012/02/334016_10150645461055775_503955774_11627977_1032222943_o-300x225.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-3241475171419178742?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/3241475171419178742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2012/02/my-new-home-write-up-in-lions-club.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3241475171419178742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3241475171419178742'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2012/02/my-new-home-write-up-in-lions-club.html' title='My new home:  write up in Lion&apos;s club, Staffansdorp, Sweden'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-7845164527283127583</id><published>2012-02-02T18:03:00.000-08:00</published><updated>2012-02-03T15:39:24.046-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='Web API'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Marionette'/><title type='text'>Part 2: Setting up Marionette for automating WebAPI testing on B2G</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;NOTE:&amp;nbsp; The following article is now available as a series of articles on &lt;a href="https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/" target="_blank"&gt;MDN&lt;/a&gt;: &lt;a href="https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/"&gt;https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/&lt;/a&gt;&amp;nbsp; and will be maintained and updated there.&lt;br /&gt;&lt;br /&gt;Here, we'll &lt;b&gt;set up marionette&lt;/b&gt; and try out some of its functionality with the &lt;b&gt;interactive python&lt;/b&gt; prompt. &lt;br /&gt;&lt;br /&gt;&lt;a href="https://wiki.mozilla.org/Auto-tools/Projects/Marionette" target="_blank"&gt;Marionette&lt;/a&gt; is a test automation framework build by the "ateam" internally at Mozilla. &amp;nbsp; Marionette provides "a new and unified way to automate testing on the B2G environment" since we're booting directly into Gecko rendering engine and don't have the traditional browser support previously afforded.&lt;br /&gt;&lt;br /&gt;It's already assumed you've gone through the steps (cloning marionette client and B2G) in our &lt;a href="http://johnhammink.blogspot.com/2012/01/part-1-setting-up-boot-to-gecko-build.html" target="_blank"&gt;previous tutorial. &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Setting up Marionette &lt;/b&gt;requires installing &lt;a href="http://www.python.org/download/releases/2.7.2/" target="_blank"&gt;Python 2.7.2&lt;/a&gt; and pip.&amp;nbsp; You'll also need the ManifestDestiny and MozHttpd packages from Mozbase:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ git clone https://github.com/mozilla/mozbase.git&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd mozbase&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ python setup_development.py &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you're using (or planning to use) the selenium proxy to bang on UI elements, you can also install the selenium bindings:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ pip install selenium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Interactive Python tests &lt;/b&gt;work similarly against the device or against QEMU so the only thing different, is that with QEMU, you, of course, must launch an emulator&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ ./emu.sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Whereas, with the device, you must make sure it's turned on, and physically connected via adb:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-vpuo3WO8EI8/TysyaEm6mFI/AAAAAAAAANE/gU4qvE3w8qI/s1600/adb+devices+connect.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://1.bp.blogspot.com/-vpuo3WO8EI8/TysyaEm6mFI/AAAAAAAAANE/gU4qvE3w8qI/s640/adb+devices+connect.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;Otherwise, the steps are more or less the same.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Open two terminals. &amp;nbsp; In one, forward the port:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt; &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb forward tcp:2828 tcp:2828&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In another, launch Python to get to the interactive prompt:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ python&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From the interactive prompt, run the commands necessary to invoke a Marionette session interactively:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from marionette import Marionette&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; marionette = Marionette('localhost', 2828)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; marionette.start_session()&lt;br /&gt;&amp;nbsp;u'session-b2g'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Here, we see that the system returns that a Marionette session is running.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wdjTWI_UrH0/Tys1t-VWTMI/AAAAAAAAANM/Hb3pLdPOoMc/s1600/Starting+Marionette+Session+Interactively.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://4.bp.blogspot.com/-wdjTWI_UrH0/Tys1t-VWTMI/AAAAAAAAANM/Hb3pLdPOoMc/s640/Starting+Marionette+Session+Interactively.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;The command "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;marionette.execute_script()&lt;/span&gt;" can embed JavaScript commands which run on Gecko.&amp;nbsp; Next, you can see which DOM elements return HTMLElement objects:&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.mozBattery;")&lt;br /&gt;{u'onlevelchange': None, u'level': 0.91, u'dischargingTime': None, u'onchargingchange': None, u'ondischargingtimechange': None, u'onchargingtimechange': None, u'chargingTime': None, u'charging': True}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.mozBattery.level;")&lt;br /&gt;0.91&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.geolocation;")&lt;br /&gt;{}&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.mozSms;")&lt;br /&gt;{u'onreceived': None, u'ondelivered': None, u'onsent': None}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WaSbVYa85K0/Tys2-IJC3ZI/AAAAAAAAANU/s7wvpanwmNY/s1600/Getting+DOMHTMLelements.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://2.bp.blogspot.com/-WaSbVYa85K0/Tys2-IJC3ZI/AAAAAAAAANU/s7wvpanwmNY/s640/Getting+DOMHTMLelements.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;You can traverse the DOM tree using this technique and evaluate which calls are available.&lt;br /&gt;&lt;br /&gt;You can test out &lt;b&gt;basic telephony using &lt;/b&gt;interactively with marionette.&amp;nbsp; The following example requires two working phones, both with simcards.&amp;nbsp; One is your Galaxy SII, running B2G.&lt;br /&gt;&lt;br /&gt;Start an interactive Marionette session and forward the port:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb forward tcp:2828 tcp:2828&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ python&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; from marionette import Marionette&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette = Marionette('localhost', 2828)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.start_session()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;u'5-b2g' &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, try this, with dialer app invoked on the phone: &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.set_context("chrome")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.mozTelephony;")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; num = &lt;insert here="" number=""&gt;&lt;/insert&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("return navigator.mozTelephony.dial('%d');" % num)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or else, this (notice the quotes around the JS number variable:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.set_context("chrome")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;gt;&amp;gt;&amp;gt; marionette.execute_script("""&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;... var num = "&lt;insert here="" number=""&gt;"&lt;/insert&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;... return navigator.mozTelephony.dial(num);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;... """)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{}&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-cAsP3Beif4g/Tyxr92r6baI/AAAAAAAAANk/GiMlZsXfFYc/s1600/Marionette_interactive_telephony.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="410" src="http://3.bp.blogspot.com/-cAsP3Beif4g/Tyxr92r6baI/AAAAAAAAANk/GiMlZsXfFYc/s640/Marionette_interactive_telephony.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This kicks off a phone call, the output of which can be monitored in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb logcat&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Np12ZkqpRfM/Tyxs3zAf0EI/AAAAAAAAANs/xhr58eU_s00/s1600/ADB+LOGCAT+interactive+telephony.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="282" src="http://4.bp.blogspot.com/-Np12ZkqpRfM/Tyxs3zAf0EI/AAAAAAAAANs/xhr58eU_s00/s640/ADB+LOGCAT+interactive+telephony.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-7845164527283127583?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/7845164527283127583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2012/02/part-2-setting-up-marionette-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7845164527283127583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7845164527283127583'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2012/02/part-2-setting-up-marionette-for.html' title='Part 2: Setting up Marionette for automating WebAPI testing on B2G'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-vpuo3WO8EI8/TysyaEm6mFI/AAAAAAAAANE/gU4qvE3w8qI/s72-c/adb+devices+connect.tiff' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-6926252564844732021</id><published>2012-01-30T19:32:00.000-08:00</published><updated>2012-03-08T17:27:34.178-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='Web API'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Boot 2 Gecko'/><title type='text'>Part 1: Setting up Boot-to-Gecko build environment</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;NOTE:&amp;nbsp; The following article is now available as a series of articles on &lt;a href="https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/" target="_blank"&gt;MDN&lt;/a&gt;: &lt;a href="https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/"&gt;https://developer.mozilla.org/en/Mozilla/Boot_to_Gecko/&lt;/a&gt;&amp;nbsp; and will be maintained and updated there.&lt;br /&gt;&lt;br /&gt;There's been already a fair bit posted on how to set up a boot-to-gecko building- and flashing- environment.&amp;nbsp;&amp;nbsp;&amp;nbsp; However that information tends to be scattered about a bit and rather asequential.&amp;nbsp; So in the interest of keeping everyone on the same page, so to speak - and one path to success - I'll endeavor to spec out one set of instructions anyone can follow to get up and running.&lt;br /&gt;&lt;br /&gt;This tutorial assumes a basic grasp of Ubuntu Linux.&lt;br /&gt;&lt;br /&gt;You should be able to copy most commands from this blog and paste.&amp;nbsp; &lt;b&gt;Note, however that there are no guarantees and you proceed at your own risk! &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I built B2G from a VM.&amp;nbsp;&amp;nbsp;&amp;nbsp; You can build from a Native Ubuntu Linux platform.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The environment&lt;/b&gt;:&lt;br /&gt;You'll need:&lt;br /&gt;*64-bit platform running Ubuntu 11.10&lt;br /&gt;with at least:&lt;br /&gt;*4 gb RAM&lt;br /&gt;*7 gb swap partition&lt;br /&gt;*80 gb hard disk &lt;br /&gt;&lt;br /&gt;This deliberately overstates the requirements on B2G github.&amp;nbsp;&amp;nbsp; You'll find eventually you'll need the resources.&lt;br /&gt;&lt;br /&gt;Once that's installed, you'll need to &lt;b&gt;add adb to your environment's path&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;This is where it gets interesting.  There is a circular dependency concerning adb. The first time around, you will need adb to build gonk (which, then, builds the adb you will use subsequently).  So, even though we say otherwise, you STILL need to install the Android SDK and edit your ./bashrc path to point to that adb instance - so that you can build gonk the first time! &lt;br /&gt;&lt;br /&gt;Once you've built gonk the first time, adb is created under "/glue/gonk/out" . You must edit ./bashrc again to point to this new instance.&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd ~&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo nano .bashrc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and add the following lines (depending on where you've extracted android sdk):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;PATH=$PATH:/home/mozilla/gits/B2G/glue/gonk/out/host/linux-x86/bin/adb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;export PATH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;You'll need to &lt;b&gt;setup adb&amp;nbsp; talk to your galaxy S2&lt;/b&gt;.&amp;nbsp; To do that:&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo nano /etc/udev/rules.d/51-android.rules&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;and add the following line&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make the file readable:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ chmod a+r /etc/udev/rules.d/51-android.rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You'll need to &lt;b&gt;install heimdall&lt;/b&gt; to flash B2G (and backup the preinstalled Android OS) to your Galaxy S2 device.&amp;nbsp; Get it from&lt;br /&gt;&lt;br /&gt;&lt;a href="http://glassechidna.com.au/products/heimdall"&gt;http://glassechidna.com.au/products/heimdall&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and run the install.&lt;br /&gt;&lt;br /&gt;Next, you'll need to&lt;b&gt; install basic build dependencies for building firefox&lt;/b&gt; on 64-bit Ubuntu 10.11 VM.&lt;br /&gt;&lt;br /&gt;Download and install the build prerequisites with two commands (as root):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo apt-get build-dep firefox&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo apt-get install mercurial libasound2-dev libcurl4-openssl-dev libnotify-dev libxt-dev libiw-dev mesa-common-dev autoconf2.13&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;We've also found it necessary to install the following dependencies (note that there may be some repeats here):&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo apt-get install ia32-libs gcc-multilib g++-multilib bisonflex gperf lib32zl-dev lib32ncurses5-dev lib32ncursesw5-devlibidl-dev lib32gomp1 autoconf2.13 ccache libx11-devlib32readline-gplv2-dev&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also, if you haven't installed a JDK, get one:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ sudo apt-get install default-jdk&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Almost inevitably, you will, at various times, need to install some additional dependencies.&amp;nbsp; Click "Y" when prompted to do this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next steps depend very much on what you wish to do.&amp;nbsp; If you wish to build only Boot 2 Gecko Kernel, Gonk Backend and Gaia, clone the following repo:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ git clone https://github.com/andreasgal/B2G.git&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You'll also need to &lt;b&gt;clone the marionette client&lt;/b&gt; for later:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ git clone https://github.com/jonallengriffin/marionette_client.git&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building for QEMU&lt;/b&gt;&lt;br /&gt;The following steps allow you to&lt;b&gt; build - and run - B2G on your emulator&lt;/b&gt;.&amp;nbsp; Do NOT run them as root.&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd B2G&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make sync&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5o6HoCR0xE0/Tydf8jj-UPI/AAAAAAAAAMk/EfcvWBaWv-w/s1600/Make+Sync.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://3.bp.blogspot.com/-5o6HoCR0xE0/Tydf8jj-UPI/AAAAAAAAAMk/EfcvWBaWv-w/s640/Make+Sync.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make config-qemu&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make gonk&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE:&amp;nbsp;&amp;nbsp; &lt;/b&gt;if ./emu.sh - your emulator - doesn't run at first, you'll need to make it executable:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ chmod 777 emu.sh&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lastly, run the emulator:&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ ./emu.sh&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Backing up your Galaxy S2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You'll want to &lt;b&gt;back up your phone's factory image&lt;/b&gt; before attempting to build or flash anything to it.&amp;nbsp; As it happens, the builds or flash process itself can be unstable and you don't want to end up with a brick.&lt;br /&gt;&lt;br /&gt;These instructions assume that you have already installed heimdall.&lt;br /&gt;&lt;br /&gt;From &lt;b&gt;some other directory &lt;/b&gt;than where you have B2G or NDK/SDK installed:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd /tmp&lt;br /&gt;$ wget http://cmw.22aaf3.com/c1/recovery/recovery-clockwork-4.0.1.4-galaxys2.tar&lt;br /&gt;$ tar xvf recovery-clockwork-*tar&lt;br /&gt;$ adb reboot download&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When your phone is in "download" mode, it's ready to be flashed using Odin protocol.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To Flash Clockworked &lt;/b&gt;(and backup image):&lt;br /&gt;With your phone in "download" mode, run the following:&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ heimdall flash --kernel zImage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, reboot the phone to recovery mode.&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb reboot recovery&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the phone in recovery mode, follow the on-screen instructions to make a backup image.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Building for Samsung Galaxy S2&lt;/b&gt; &lt;br /&gt;Do NOT run any of the following commands as root!&amp;nbsp; From the directory to where you've cloned your git repositories:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd B2G&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make sync&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;With the device connected and running:&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make config-galaxy-s2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make gonk&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-IaDmq-AlC_I/TydgNEkHvAI/AAAAAAAAAMs/G2DJfdUkIts/s1600/Make.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://4.bp.blogspot.com/-IaDmq-AlC_I/TydgNEkHvAI/AAAAAAAAAMs/G2DJfdUkIts/s640/Make.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Flashing to Samsung Galaxy S2&lt;/b&gt;&lt;br /&gt;-&lt;b&gt;making and flashing the kernel&lt;/b&gt; (first time only)&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make kernel&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb reboot download&lt;br /&gt;$ heimdall flash --kernel boot/kernel-android-galaxy-s2/arch/arm/boot/zImage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;-making&lt;b&gt; generic flash&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb reboot recovery&lt;br /&gt;$ make flash-only&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Cw8CGBVxAbM/TydgXiJA5hI/AAAAAAAAAM0/qbV_5QapWi4/s1600/flashing+OS.tiff" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://2.bp.blogspot.com/-Cw8CGBVxAbM/TydgXiJA5hI/AAAAAAAAAM0/qbV_5QapWi4/s640/flashing+OS.tiff" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Quick reinstall gaia&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;Assuming you're in the root directory of B2G:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ cd gaia&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ git pull origin master&amp;nbsp;&lt;/span&gt;&lt;br /&gt;(Pulls remote and merges files to your local repo)&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make install-gaia&lt;br /&gt;$ make kill-b2g&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;(Restarts Gaia)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Quick build and reflash of gecko only:&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make install-gecko&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make kill-b2g&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;How to &lt;b&gt;force git repo into same state as fresh clone (comprehensive git clean)&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make sync; git clean -xfd; git submodule foreach "git clean -xfd"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alternately, you can try:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make mrproper&lt;/span&gt;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once your system is up and running on your device, you can begin to use and debug very much like an Android phone.&amp;nbsp; You may have noticed that we use the Android Debug Bridge &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;adb&lt;/span&gt;&amp;nbsp; for many purposes.&amp;nbsp; &amp;nbsp; For example, if I wanted to debug telephony or SMS on my device, and I had incoming calls/SMSes coming from a number with area code "216"&amp;nbsp; I could monitor that with a command such as:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb logcat | grep 216&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To be sure, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ adb logcat&lt;/span&gt; with no params will simply output everything until you ctrl+c to close the adb session.&lt;br /&gt;&lt;br /&gt;Below is an example of enabling debugging on the device.&lt;br /&gt;&lt;br /&gt;How&amp;nbsp; to&lt;b&gt; enable debugging, for example, of radio component:&lt;/b&gt;&lt;br /&gt;First, change &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DEBUG&lt;/span&gt; to &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;true &lt;/span&gt;in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;gecko/dom/telephony/ril_worker.js&lt;/span&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Next, rebuild gecko and reflash at least gecko on the device:&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$ make install-gecko&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and then provide &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$adb logcat&lt;/span&gt; output&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$adb logcat -b radio &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While performing the affected operation, e.g. trying to initiate a phone call from the dialer app.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/0PE8fr2q8N8/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0PE8fr2q8N8&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/0PE8fr2q8N8&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-6926252564844732021?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/6926252564844732021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2012/01/part-1-setting-up-boot-to-gecko-build.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/6926252564844732021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/6926252564844732021'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2012/01/part-1-setting-up-boot-to-gecko-build.html' title='Part 1: Setting up Boot-to-Gecko build environment'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-5o6HoCR0xE0/Tydf8jj-UPI/AAAAAAAAAMk/EfcvWBaWv-w/s72-c/Make+Sync.tiff' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-2451445948401173098</id><published>2012-01-23T13:54:00.000-08:00</published><updated>2012-01-23T14:52:34.926-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='California'/><category scheme='http://www.blogger.com/atom/ns#' term='Jazz Guitar.'/><category scheme='http://www.blogger.com/atom/ns#' term='Touring'/><category scheme='http://www.blogger.com/atom/ns#' term='Acoustic Music'/><category scheme='http://www.blogger.com/atom/ns#' term='World Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Groove'/><title type='text'></title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CjylVAWa6bs/Tx3V8nvZ3GI/AAAAAAAAAMU/pzXSTwAzXXU/s1600/JH_Panama_Red_Concord_Jan_2012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-CjylVAWa6bs/Tx3V8nvZ3GI/AAAAAAAAAMU/pzXSTwAzXXU/s320/JH_Panama_Red_Concord_Jan_2012.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;...a promo pic from a coffeehouse gig I did in Concord, CA (at the Panama Red Cafe), Sunday, January 22, 2012.&lt;br /&gt;&lt;br /&gt;I had been wanting to reconcile the "nerd" and the "artiste".... thus the "Ion Monkey" (it's Mozilla's new JIT compiler) t-shirt.&amp;nbsp; The set had a host of short jazz pieces, mostly intros, some culled and influenced by one of my favorite jazz guitarists, Joe Pass.&amp;nbsp;&amp;nbsp; Which of course, sounded amazing on acoustic guitar.&lt;br /&gt;&lt;br /&gt;Links to some of the live stuff, to come. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-2451445948401173098?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/2451445948401173098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2012/01/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2451445948401173098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2451445948401173098'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2012/01/blog-post.html' title=''/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-CjylVAWa6bs/Tx3V8nvZ3GI/AAAAAAAAAMU/pzXSTwAzXXU/s72-c/JH_Panama_Red_Concord_Jan_2012.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-8042363259469834475</id><published>2011-12-27T17:17:00.000-08:00</published><updated>2011-12-27T17:31:19.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox for Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Test Automation'/><title type='text'>Zippity - and automated performance tests for Firefox Mobile</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Many have wondered how we get the device coverage with our automated Performance tests.&amp;nbsp; Here's one way:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/wIx5wLVaICs/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wIx5wLVaICs?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/wIx5wLVaICs?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;What you see running here are the Zippity tests (a &lt;a href="http://people.mozilla.com/%7Emfinkle/addons%20" target="_blank"&gt;plug in available&lt;/a&gt; for &lt;a href="http://nightly.mozilla.org/" target="_blank"&gt;Firefox mobile &lt;/a&gt;), running the pageload tests on a number of different devices.&amp;nbsp; I also have logcat attached and running, to catch any possible crashes.&lt;br /&gt;&lt;br /&gt;Pageload tests load a series of predefined webpages, to gauge pageload speed.&amp;nbsp; There are also Startup tests (which start the application several times to measure startup speed); as well as SunSpider and V8 tests.&amp;nbsp;&amp;nbsp; Lastly, you can ping your memory metrics to Zippity.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Having the crowd available to help run these tests (just install the plug in), helps us get the device coverage up and ensures we find things like native crashes, hopefully sooner, rather than later.&lt;br /&gt;&lt;br /&gt;Kudos to &lt;a href="http://starkravingfinkle.org/blog/" target="_blank"&gt;Mark Finkle&lt;/a&gt; for this great tool. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-8042363259469834475?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/8042363259469834475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/12/zippity-and-automated-performance-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8042363259469834475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8042363259469834475'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/12/zippity-and-automated-performance-tests.html' title='Zippity - and automated performance tests for Firefox Mobile'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-2977189359695727069</id><published>2011-12-27T00:19:00.000-08:00</published><updated>2011-12-27T00:21:17.010-08:00</updated><title type='text'></title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I made this video last winter, when I was still in Helsinki:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/kt9TfAYetlU/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kt9TfAYetlU&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/kt9TfAYetlU&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;...and &lt;a href="http://theutah.org/performance/johnhammink/20111219/againsttheglass" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;is one of my songs from my performance at Hotel Utah, San Francisco on December 19, 2011: &amp;nbsp;&lt;a href="http://theutah.org/performance/johnhammink/20111219/againsttheglass" original_target="http://theutah.org/performance/johnhammink/20111219/againsttheglass" rel="nofollow nofollow" saprocessedanchor="true" style="background-color: black; color: #3b5998; cursor: pointer; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 14px; line-height: 18px; text-decoration: none;" target="_blank" verdict_1d647md="OK"&gt;http://theutah.org/performance/johnhammink/20111219/againsttheglass&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-2977189359695727069?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/2977189359695727069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/12/i-made-this-video-last-winter-when-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2977189359695727069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2977189359695727069'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/12/i-made-this-video-last-winter-when-i.html' title=''/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-3536502264478828263</id><published>2011-12-11T15:55:00.001-08:00</published><updated>2011-12-13T15:46:05.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='Desktop Firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='WebAPI'/><category scheme='http://www.blogger.com/atom/ns#' term='Web API'/><category scheme='http://www.blogger.com/atom/ns#' term='Boot 2 Gecko'/><title type='text'>A plug for the Fullscreen,  Gamepad, and Mouse Lock gaming APIs</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="font-family: Arial,Helvetica,sans-serif; text-align: left;" trbidi="on"&gt;&lt;span style="font-size: small;"&gt;Sometimes, when things are moving as quickly as they generally do here at &lt;a href="http://www.mozilla.org/" target="_blank"&gt;the Moz&lt;/a&gt;&amp;nbsp;(as in the open web generally), the best that one can do is channel the work of others to try and stay on track with everything. &amp;nbsp; It certainly beats trying to do everything oneself, at the breakneck speed at which envisioning the new technology - and technology itself - unfolds.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;On that note, kudos to &lt;a href="http://vocamus.net/dave/" target="_blank"&gt;Dave Humphries&lt;/a&gt;,&amp;nbsp; &lt;a href="http://rawkes.com/" target="_blank"&gt;Rob Hawkes&lt;/a&gt;&amp;nbsp;and &lt;a href="http://blog.pearce.org.nz/" target="_blank"&gt;Chris Pearce&lt;/a&gt; for their recent &lt;a href="http://hacks.mozilla.org/2011/12/paving-the-way-for-open-games-on-the-web-with-the-gamepad-and-mouse-lock-apis/" target="_blank"&gt;blog&lt;/a&gt; &lt;a href="http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html" target="_blank"&gt;posts&lt;/a&gt;&amp;nbsp;on these brand new APIs. &amp;nbsp;And so, by way of a rehash...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;as 12th,="" &lt;b="" december="" of="" the=""&gt;Fullscreen, &lt;b&gt;Gamepad&lt;/b&gt; and &lt;b&gt;Mouse Lock APIs&lt;/b&gt; are available in a single experimental desktop &lt;a href="http://people.mozilla.com/%7Etmielczarek/mouselock+gamepad/" target="_blank"&gt;build&lt;/a&gt; of Firefox.&amp;nbsp; There are also builds that support these features &lt;a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/try-builds/david.humphrey@senecac.on.ca-ec560c67351d/try-linux/" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These APIs are estimated to land soon in the nightly builds.&lt;/as&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;as 12th,="" &lt;b="" december="" of="" the=""&gt;&lt;br /&gt;&lt;/as&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The Fullscreen API:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Scheduled to ship in firefox 10 by the end of January, you can still try out some of the examples in the latest &lt;a href="http://nightly.mozilla.org/" target="_blank"&gt;nightly builds&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Based on the&amp;nbsp;&amp;nbsp;&lt;a href="https://wiki.mozilla.org/RapidRelease/Calendar" target="_blank"&gt;W3C's draft spec&lt;/a&gt;, this API enables any HTML element to be made "fullscreen", which hides the browsers UI and stretches the element to cover the entire screen area. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;To use it, the developer calls void &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mozRequestFullScreen()&lt;/span&gt;, which, if the request is granted (there are security implications here) gets a &lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mozfullscreenchange&lt;/span&gt; event back to the specifying element; otherwise a &lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;mozfullscreenerror&lt;/span&gt; is dispatched.&lt;br /&gt;&lt;br /&gt;The user can ESC or F11 to exit full screen mode. &amp;nbsp; As with YouTube or other fullscreen videos, navigating (ALT+TAB) will cause fullscreen mode to exit. &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;There is a cross-browser full-screen API example &lt;a href="http://html5-demos.appspot.com/static/fullscreen.html" target="_blank"&gt;here.&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;The Gamepad API:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="background-color: white; font-size: small; line-height: 20px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;As directed by the &lt;a href="http://dvcs.w3.org/hg/webevents/raw-file/default/gamepad.html" target="_blank"&gt;W3C spec&lt;/a&gt;, Javascript and Firefox now gives developers the possibility to connect a gamepad directly to the computer (using USB or Bluetooth) - a domain previously only available to gaming consoles and native computer games. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;You can &lt;a href="https://bug604039.bugzilla.mozilla.org/attachment.cgi?id=565617" target="_blank"&gt;try it out&lt;/a&gt;&amp;nbsp;here; note that you''ll need that custom &lt;a href="http://people.mozilla.com/%7Etmielczarek/mouselock+gamepad/" target="_blank"&gt;build&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;. &amp;nbsp; This &lt;a href="https://wiki.mozilla.org/GamepadAPI" target="_blank"&gt;wiki page&lt;/a&gt;&amp;nbsp;contains more implementation specifics.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="background-color: white; font-size: small; line-height: 20px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 20px;"&gt;Rob Hawkes made a great demo video:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="background-color: white; font-size: small; line-height: 20px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="225" mozallowfullscreen="" src="http://player.vimeo.com/video/31906995" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;The Mouse Lock API:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This API hides the cursor and locks it to the center of the screen, thus enabling developers to make games and visualizations of a 3D world (otherwise the cursor would go off the side of the screen or hit the edge). With the cursor locked, the user can roam X, Y, Z axes without restrictions.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://vocamus.net/dave/?p=1393" style="line-height: 19px;" target="_blank"&gt;David Humphrey and his students at Seneca College&lt;/a&gt;&amp;nbsp;are currently implementing this API based on the W3C &lt;a href="http://dvcs.w3.org/hg/webevents/raw-file/default/mouse-lock.html" target="_blank"&gt;spec.&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There are &lt;a href="http://humphd.github.com/mozilla-central/mouselock/" target="_blank"&gt;demo files&lt;/a&gt; available.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/0aF7qWMawJM/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0aF7qWMawJM&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/0aF7qWMawJM&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Arial,Helvetica,sans-serif; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;We're tracking Mouse Lock API on &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=633602" target="_blank"&gt;Bugzilla&lt;/a&gt;. You can also check out &lt;a href="http://vocamus.net/dave/" target="_blank"&gt;David Humphrey’s series of posts&lt;/a&gt; on the development of the Mouse Lock API.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I'm just now trying these out myself; of course, if you find any issues, please feel free to &lt;a href="http://shrt.st/2b9i" target="_blank"&gt;file a bug&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-3536502264478828263?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/3536502264478828263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/12/plug-for-fullscreen-gamepad-and-mouse.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3536502264478828263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3536502264478828263'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/12/plug-for-fullscreen-gamepad-and-mouse.html' title='A plug for the Fullscreen,  Gamepad, and Mouse Lock gaming APIs'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-5771444688313497348</id><published>2011-12-10T23:31:00.001-08:00</published><updated>2011-12-22T22:52:52.684-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fall'/><category scheme='http://www.blogger.com/atom/ns#' term='Touring'/><category scheme='http://www.blogger.com/atom/ns#' term='Acoustic Music'/><category scheme='http://www.blogger.com/atom/ns#' term='SF Bay'/><title type='text'>Fall tour of the Acoustic Circuit, S.F. Bay Area</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LBww2jPTH84/TuRgsJtvYRI/AAAAAAAAALw/QHA1jWazNfI/s1600/Freight+and+Salvage+Coffeehouse+Berkeley+November+22+2011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-LBww2jPTH84/TuRgsJtvYRI/AAAAAAAAALw/QHA1jWazNfI/s320/Freight+and+Salvage+Coffeehouse+Berkeley+November+22+2011.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From Freight &amp;amp; Salvage Coffeehouse, Berkeley, &amp;nbsp;November 22, 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;If I don't (yet) get to unleash the beast on my software evangelism (a quintessentially nerdy pursuit) the least I can do is hit the acoustic singer/songwriter music circuit around the Bay area (which I'm currently doing). &amp;nbsp;It's only been a few short weeks since I've started touring regularly in addition to my awesome &lt;a href="http://www.mozilla.org/" target="_blank"&gt;day job&lt;/a&gt; &amp;nbsp;(longer geographic swaths in the works on both the music and work fronts), but it's already been a hell of a ride.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VPADRwE8scs/TuRfvK36YYI/AAAAAAAAALo/nqfVYyQSMs4/s1600/St+Lukes+Church+San+Francisco+November+20+2011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-VPADRwE8scs/TuRfvK36YYI/AAAAAAAAALo/nqfVYyQSMs4/s320/St+Lukes+Church+San+Francisco+November+20+2011.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From St. Lukes Church, San Francisco, November 20, 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-prSLlHNkXio/TuRhSsx4FUI/AAAAAAAAAL4/-4rltPsJIvk/s1600/ROcket+Room+San+Francisco+November+24+2011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-prSLlHNkXio/TuRhSsx4FUI/AAAAAAAAAL4/-4rltPsJIvk/s320/ROcket+Room+San+Francisco+November+24+2011.jpg" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From Rockit Room, San Francisco, &amp;nbsp;November 24, 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-csEDW9nrS1g/TuRik3JqRnI/AAAAAAAAAMA/eYXVnVJ8vvA/s1600/Panama+Red+Coffeehouse+Concord+CA+December+9+2011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-csEDW9nrS1g/TuRik3JqRnI/AAAAAAAAAMA/eYXVnVJ8vvA/s320/Panama+Red+Coffeehouse+Concord+CA+December+9+2011.jpg" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From &lt;a href="http://panamaredcoffee.com/concord.htm" target="_blank"&gt;Panama Red Coffeehouse&lt;/a&gt;, Concord, December 9, 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a href="https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc7/390218_10150523961510775_503955774_11185628_1433749794_n.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc7/390218_10150523961510775_503955774_11185628_1433749794_n.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sJrm-UcAaxY/TuRe9Yus2BI/AAAAAAAAALg/LSITcV5XbJc/s1600/Berkeley+City+Club+Berkeley+November+17+2011.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-sJrm-UcAaxY/TuRe9Yus2BI/AAAAAAAAALg/LSITcV5XbJc/s640/Berkeley+City+Club+Berkeley+November+17+2011.jpg" width="480" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From &lt;a href="http://berkeleycityclubhotel.com/" target="_blank"&gt;Berkeley City Club&lt;/a&gt;, November 17, 2011&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://theutah.org/performance/johnhammink/20111219/againsttheglass" target="_blank"&gt;Here&lt;/a&gt; is one of my songs from my performance at the &lt;a href="http://theutah.org/" target="_blank"&gt;Hotel Utah&lt;/a&gt;, San Francisco, from December 19, 2011.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-5771444688313497348?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/5771444688313497348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/12/fall-tour-of-acoustic-circuit-sf-bay.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5771444688313497348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5771444688313497348'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/12/fall-tour-of-acoustic-circuit-sf-bay.html' title='Fall tour of the Acoustic Circuit, S.F. Bay Area'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LBww2jPTH84/TuRgsJtvYRI/AAAAAAAAALw/QHA1jWazNfI/s72-c/Freight+and+Salvage+Coffeehouse+Berkeley+November+22+2011.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-9108891329430682871</id><published>2011-12-06T18:43:00.001-08:00</published><updated>2011-12-07T02:55:11.582-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='California'/><category scheme='http://www.blogger.com/atom/ns#' term='Skydive Surf City'/><category scheme='http://www.blogger.com/atom/ns#' term='Skydiving'/><category scheme='http://www.blogger.com/atom/ns#' term='Santa Cruz'/><title type='text'>When going down is good</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/xNpsQokXx_E/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xNpsQokXx_E&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/xNpsQokXx_E&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://24.media.tumblr.com/tumblr_lowp6n5ANg1qzqp61o1_500.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://24.media.tumblr.com/tumblr_lowp6n5ANg1qzqp61o1_500.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;I've often complained about how jumping out of an airplane with an experienced tandem guide is safer than &lt;a href="http://cad.chp.ca.gov/" target="_blank"&gt;merging onto the 101&lt;/a&gt;.&amp;nbsp; It's certainly more fun.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-9108891329430682871?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/9108891329430682871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/12/when-going-down-is-good.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/9108891329430682871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/9108891329430682871'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/12/when-going-down-is-good.html' title='When going down is good'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-5158619504877963476</id><published>2011-11-28T13:49:00.001-08:00</published><updated>2011-12-12T14:58:24.419-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fennec'/><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='WebAPI'/><category scheme='http://www.blogger.com/atom/ns#' term='Boot 2 Gecko'/><title type='text'>Let's have a look at some recently landed Web APIs for Firefox</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;So, without further ado (as there's been too much "to do" about it) let's take a look at what we presently have (landed or about to land) regarding our latest (Firefox) Web APIs.&lt;br /&gt;&lt;br /&gt;You'll need the latest &lt;a href="https://ftp.mozilla.org/pub/mozilla.org/mobile/nightly/latest-mozilla-central-android-xul/"&gt;xul fennec builds&lt;/a&gt; to run these.&amp;nbsp; Technically, these also run on the latest birch nightly, but that one is presently undergoing a major facelift due to rendering and related issues.&lt;br /&gt;&lt;br /&gt;I'd suggest using a tablet. (For the SMS app, you'll need a phone with simcard and a &lt;a href="http://people.mozilla.org/%7Ejhammink/android_builds_4_testing_webapi/for_SMS_API/fennec-11.0a1.en-US.android-arm.apk%09"&gt;special build&lt;/a&gt;, but we'll get to that presently).&lt;br /&gt;&lt;br /&gt;All example testpages to which we'll be referring are available under the directory at:&amp;nbsp; &lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you find a bug with any of the demos and/or APIs themselves (and we hope you will:) please write them here:&lt;br /&gt;&lt;a href="http://shrt.st/2adv"&gt;http://shrt.st/2adv&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Make sure to include your device model &amp;amp; Android version, as well as the nightly fennec version you are using,&amp;nbsp; in the bug.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Battery API demo:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/BatteryAPIdemo.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/BatteryAPIdemo.html&lt;/a&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-IdDWpfv7gGM/TtQLcKzV6hI/AAAAAAAAAKo/rDOW0x5zliI/s1600/SC20111128-142031.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-IdDWpfv7gGM/TtQLcKzV6hI/AAAAAAAAAKo/rDOW0x5zliI/s320/SC20111128-142031.jpg" width="320" /&gt;&lt;/a&gt;This API tests the different charging states of the battery, along with charging level and discharging time.&lt;b&gt;&amp;nbsp; &lt;/b&gt;Try launching the page with the device plugged in, and&amp;nbsp; then unplugging (and/or vice versa).&amp;nbsp; Note that the charging/discharging time presently shows &lt;i&gt;Infinity&amp;nbsp; &lt;/i&gt;until the battery has charged/discharged about 2% of its total capacity.&lt;br /&gt;&lt;br /&gt;Does the testpage show the correct battery state for the device?&amp;nbsp; Does it correctly generate an alert when the charging state changes?&amp;nbsp; Is the level correct (when compared against native battery app level)?&amp;nbsp; Does it give a numerical discharging/charging time&amp;nbsp;&lt;b&gt;&lt;/b&gt;after some time in the same charging state?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Camera API demo:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/CameraAPIdemo.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/CameraAPIdemo.html&lt;/a&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;This API presently tests the browser's ability to directly capture pictures from the device camera. &lt;br /&gt;&lt;br /&gt;Point the device camera at the object you want to shoot&lt;b&gt;&amp;nbsp;&lt;/b&gt; and click capture.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-raHYE50i3DM/TtQO6C8s3nI/AAAAAAAAAKw/7DCSaoF7Wo4/s1600/SC20111128-143915.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-raHYE50i3DM/TtQO6C8s3nI/AAAAAAAAAKw/7DCSaoF7Wo4/s320/SC20111128-143915.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Is the picture rendered correctly (as opposed to&amp;nbsp; upside down, or sideways) both in the pre-capture and the preview?&amp;nbsp; Is the picture quality consistent with what your camera normally delivers?&amp;nbsp; Are there any other issues?&amp;nbsp; Please feel to play around with it a bit.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;IndexedDB API demo:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/IndexeddbAPIdemo.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/IndexeddbAPIdemo.html&amp;nbsp;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Since accessing the native file system from the web introduces a huge risk, there needs to be a way to handle offline storage directly on a device.&amp;nbsp; Enter IndexedDB.&amp;nbsp;&amp;nbsp; Actually, this api has been around since Firefox 4 (and subsequently for quite a few Chrome and other browser versions since) but the &lt;a href="http://www.w3.org/TR/IndexedDB/"&gt;W3C spec&lt;/a&gt; got a rewrite recently and it's been well overdue for an upgrade.&lt;br /&gt;&lt;br /&gt;When the browser first tries to create a local database, a prompt requests permission:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-f66Yy0BGfLo/TtQfg5N_ntI/AAAAAAAAAK4/N3-PcZLUza0/s1600/SC20111128-154911.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-f66Yy0BGfLo/TtQfg5N_ntI/AAAAAAAAAK4/N3-PcZLUza0/s320/SC20111128-154911.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Subsequently, once this is allowed, the db initializes, and after some time, reports back on the number of records:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_obgxqnByCc/TtQgCiTv5sI/AAAAAAAAALA/0igKioUgYKo/s1600/SC20111128-154913.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-_obgxqnByCc/TtQgCiTv5sI/AAAAAAAAALA/0igKioUgYKo/s320/SC20111128-154913.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Our current demo matches a hash of zipcodes against a city (you must have zipcodes.csv present in same dir to work - this demo does), doing all the database access operations.&amp;nbsp; (Note that we're presently missing the functionality to do the reverse!) Once the CSV is loaded into the device local database, the&amp;nbsp; lookup should be instantaneous (note that all the steps are not depicted here):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ppjJLn8-0Cs/TtQhDydk98I/AAAAAAAAALI/SxGKruQF7C8/s1600/SC20111128-155321.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-ppjJLn8-0Cs/TtQhDydk98I/AAAAAAAAALI/SxGKruQF7C8/s320/SC20111128-155321.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Note that I've been getting dramatically different results from device to device.&amp;nbsp;&amp;nbsp; Sometimes it works, sometimes not.&amp;nbsp;&amp;nbsp; To be sure the feature is still a work in progress, so let me know what your experiences are.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vibrator API demo:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/VibratorAPIdemo.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/VibratorAPIdemo.html&lt;/a&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt; &lt;/b&gt;&lt;br /&gt;Web apps, just like native ones,&amp;nbsp; need a way to send feedback to various sensors - including notification vibes.&amp;nbsp;&amp;nbsp; The W3C spec lays a foundation, which we've &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=679966"&gt;implemented&lt;/a&gt;.&amp;nbsp; Note that you'll need a device with a vibrator to test this one:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-05A2gO6kAZw/TtQkAOTqNXI/AAAAAAAAALQ/DY1f-EmLIMc/s1600/SC20111128-161315.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-05A2gO6kAZw/TtQkAOTqNXI/AAAAAAAAALQ/DY1f-EmLIMc/s320/SC20111128-161315.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You'll need a special &lt;a href="http://people.mozilla.com/%7Ejhammink/android_builds_4_testing_webapi/for_vibrator_API/fennec-vibrator.apk" target="_blank"&gt;build&lt;/a&gt; for this one also. &amp;nbsp;Try out each of the scenarios and verify the result. &amp;nbsp; &amp;nbsp; Are we getting the correct number of buzzes, given the spec?&amp;nbsp; As with any of our APIs here, you can check the implementation by typing the string "view-source:" (without the quotes) before the "http://....".&amp;nbsp; Try it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SMS API demo:&lt;/b&gt;&lt;br /&gt;Note that you'll need an android phone with a working SIM card to try these demos.&amp;nbsp; Until this feature lands, you may also may also need a&amp;nbsp; &lt;a href="http://people.mozilla.org/%7Ejhammink/android_builds_4_testing_webapi/for_SMS_API/fennec-11.0a1.en-US.android-arm.apk"&gt;special build&lt;/a&gt; with this feature.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/SMSAPI_simplesend.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/SMSAPI_simplesend.html&lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ufeztKgesnY/TtQne1Q-8CI/AAAAAAAAALY/2iAgZqlWF0U/s1600/SC20111128-162229.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-ufeztKgesnY/TtQne1Q-8CI/AAAAAAAAALY/2iAgZqlWF0U/s320/SC20111128-162229.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The simplesend is a page that lets you send SMS messages to any phone.&amp;nbsp; Try it!&amp;nbsp; Is your message able to get through?&amp;nbsp; Any other issues?&amp;nbsp; Note that,&amp;nbsp; for testing purposes,&amp;nbsp; you can also try sending the messages directly to the same phone from where they originate.&lt;br /&gt;&lt;br /&gt;This next example lets you do exactly that:&amp;nbsp; send and receive SMS messages from the same webpage instance:&lt;br /&gt;&lt;a href="http://people.mozilla.org/%7Ejhammink/webapi_test_pages/SMSAPI_send_receive.html"&gt;http://people.mozilla.org/~jhammink/webapi_test_pages/SMSAPI_send_receive.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This page is similar to the previous one, but also has an event handler for incoming messages.&lt;br /&gt;&lt;br /&gt;Don't forget to study the page source, for each of these pages, to understand how these APIs are implemented. &lt;br /&gt;&lt;br /&gt;And, once again, don't hesitate to &lt;a href="http://shrt.st/2adv"&gt;file a bug&lt;/a&gt; if something doesn't appear to be working correctly, or if you have an idea about some features you'd like to see.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Addendum: &amp;nbsp;&lt;/b&gt;The Web API test pages are now available in github: &amp;nbsp;&lt;a href="https://github.com/jhammink/WebAPI-test-pages"&gt;https://github.com/jhammink/WebAPI-test-pages&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-5158619504877963476?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/5158619504877963476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/11/lets-have-look-at-some-recently-landed.html#comment-form' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5158619504877963476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5158619504877963476'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/11/lets-have-look-at-some-recently-landed.html' title='Let&apos;s have a look at some recently landed Web APIs for Firefox'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-IdDWpfv7gGM/TtQLcKzV6hI/AAAAAAAAAKo/rDOW0x5zliI/s72-c/SC20111128-142031.jpg' height='72' width='72'/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-1203972460376889822</id><published>2011-11-21T00:20:00.001-08:00</published><updated>2011-11-21T16:07:15.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Web API'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript.'/><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><title type='text'>Mozilla's Web API - on testing a framework.</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;So, hello again to you all. &amp;nbsp;It's been ages since I last posted at this space - but for good reason: &amp;nbsp;I've taken my performance show on the road again, and, at the same time, begun my work at Mozilla. &amp;nbsp;I find myself, once again, in the happy place of doing, on a daily basis, two different things that I love.&lt;br /&gt;&lt;br /&gt;Primarily, my work has been around our &lt;a href="http://hacks.mozilla.org/2011/08/more-details-about-the-webapi-effort/"&gt;Web API&lt;/a&gt;, and how we will write -and eventually automate - tests against it. &amp;nbsp;But how will we do this?&lt;br /&gt;&lt;br /&gt;Our API is intended to "expand what the web can do". &amp;nbsp; One of the most important implications is the ability to access - in a secure fashion - our device hardware from the web. &amp;nbsp;To that end, there are such things as Vibrator API, Battery API, Settings API, Accelerometer and Sensor API, a new and improved Geolocation API, Sound API....from which we can work our device directly from the web!&lt;br /&gt;&lt;br /&gt;So, how does one test a bunch of APIs as a user would use them? &amp;nbsp; &amp;nbsp;Well, one thing (and I've been involved with such an effort before) is to build an Application Framework - essentially a series of mock-up and atomic apps that each demonstrate a single API. &amp;nbsp; &lt;br /&gt;&lt;br /&gt;Over time, these atomic apps will be folded into more feature rich ones - to demonstrate the capabilities and (hopefully - we're QA after all) reveal any bugs that mixing and matching these APIs will uncover.&lt;br /&gt;&lt;br /&gt;Another aspect that is important - particularly where automation is concerned - is a way of getting "golden values". &amp;nbsp; We will build a series of simple native applications for each OS that will help us to obtain these values for comparison.&lt;br /&gt;&lt;br /&gt;Watch this space - &amp;nbsp;in the (very near) future we will demonstrate how many of the web apis work; how we will build HTML/JS test pages around them and test many of the features as a user would use them; build our golden apps in java and/or python (depending on our target platform), and, eventually, work the lot into an automation framework. &amp;nbsp; All of the code will be freely available on github.&lt;br /&gt;&lt;br /&gt;I'm hoping for many outcomes; one of them being that you will learn (if you don't know already) how any of the technologies depicted here actually work, but also that you might jump in and help out - when the time is ready - by expanding what we've started here and our web api testpages, enriching our automation core apps, and really putting those apis through the paces, at their intended purpose.&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-1203972460376889822?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/1203972460376889822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/11/mozillas-web-api-on-testing-framework.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/1203972460376889822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/1203972460376889822'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/11/mozillas-web-api-on-testing-framework.html' title='Mozilla&apos;s Web API - on testing a framework.'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-5514116113416831733</id><published>2011-10-12T00:12:00.000-07:00</published><updated>2011-10-12T15:26:03.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='loss of pet'/><category scheme='http://www.blogger.com/atom/ns#' term='death of companion'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence.'/><category scheme='http://www.blogger.com/atom/ns#' term='Death'/><category scheme='http://www.blogger.com/atom/ns#' term='loss of loved one'/><title type='text'>Absence is the inverse of presence</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;blockquote&gt;&lt;i&gt;"When the changes come, hallelujah!  When the changes come, there's nothing you can do."&lt;/i&gt;&lt;/blockquote&gt;- from a song by Matt Weidemann&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_LbvwhZpDoU/TpU3C_hanSI/AAAAAAAAAJ8/v2JaMm8bohw/s1600/182285_10150150109740775_503955774_8650848_1310145_n.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-_LbvwhZpDoU/TpU3C_hanSI/AAAAAAAAAJ8/v2JaMm8bohw/s400/182285_10150150109740775_503955774_8650848_1310145_n.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Kisu.&amp;nbsp; Helsinki, 2010&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table class="image" style="margin-left: 0px; margin-right: auto; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="caption"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: left;"&gt;Kisu, my buddy of 14 years, the "Itty-bitty-kitty" passed away Monday morning at the age of 15.  I think the sense of loss and absence has only just begun.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;We had planned for a veterinary visit already on Thursday, but the week went on as I became more focused on my new job.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;So we changed our plans to Monday.   I had some idea in the back of my mind that she wouldn't make it that far.  She started failing already on Saturday; that was the last time she could make it to my lap; by Sunday, she could no longer get up on her own.&amp;nbsp; I moved her from the window (it was the last beautiful day of the rainy California autumn), which was open, to the bed.   I played her a little dulcimer for a few minutes and also sang her a few old songs she may remember from her earlier years.   During the dulcimer part, she rallied around and with much shaky effort and managed to give me that loving look I've been blessed with so many times.  During the night, she reached out with her paws to me a couple of times.   By Monday morning, she had slipped away.&amp;nbsp; I wonder, what, if anything, she's experiencing now?&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;We all have our legacies and journeys to tell about, but somehow the years with Kisu were extraordinary.&amp;nbsp;  She came into my life when a younger, more worried me was living with a girlfriend, anxiously unemployed in a tiny Soviet-looking apartment in Helsinki.   Although the situation eventually resolved itself by the end of summer, having the one-year old Kisu around&amp;nbsp; (who was left to us by a recent divorcee) was, in a pattern set for the rest of her life, an incredible reassurance.   Her playful antics were the perfect (or as good as could be expected) distraction from the anxiety of a 27 year old, who doesn't know any better how things usually work out for the better; literally thousands of CVs later and I had found myself some pretty lucrative work, and had reached an island in the storm.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Over the years, Kisu was with me during the meteoric rise and riches accompanying the IPO of the company which gave me my first real job; she moved with me from the heights of Kallio, Helsinki, up to the forests of Espoo, and eventually across the Gulf of Finland to Tallinn, Estonia, where I set out on my own and eventually connected with another company that encountered even more meteoric success than the first one had.   She patiently waited with friends during my jet-setting years, when I always seemed to be catching a flight to some remote corner of the world (sometimes she caught the flight with me!).   Then she eventually reunited with me when we moved together to a huge house in the Swedish countryside.   Eventually, she even moved with me back to my original homeland of Ohio, U.S.A.; enduring my irritating months with one not-too-happening nor well-advised  startup, and finally made one last great journey of her amazing feline life: a trip, by car, from Cleveland, Ohio to Silicon Valley, California.   Again, enduring the stresses of a dysfunctional contract (but one where I learned oodles), taking me, through another contract hunt, finally to my present job, one where I feel secure and appreciated for the first time in years.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Kisu lived in Finland, Estonia, Sweden, and the United States (including traveling across it) and visited Chile and Russia.  She's been to homebrew robotics and programming nights, with gaggles of caffeinated pals, living room jam sessions, real commercial recording sessions, Christmases and Thanksgivings, hosted more guests than I can imagine and been the guest of at least five families that I can remember.   She's been through the most excessive of good times and the leanest of lean times and everything  in between.   She's sat by the side of my computer as I've worked, in my lap when I've cried and across from me, watching eagerly, when I've sang.  And we met in that tiny apartment on Alppikatu; she died in a motel.  In some ways, it seems, we've taken a step back together.&amp;nbsp; Just her and me. &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I live alone, and have for some time now. Sometimes I have thought that cat is the only thing keeping me from going crazy.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;On the Monday evening following hear death, I removed all traces of her from the apartment (well, not exactly all, but the unused litterbox, food).   I knew that I couldn't stand to have that stuff around, and that it would be difficult to deal with, the more time passed.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I still sense her in the ways that she's not there: expectations of  a soft padding up to the bed, of her watching me from the bed or chair when I came in the door everyday; of her sniffing the breeze out the window, and watching the activities, the seasons change, the rain, the sunshine.   And then there are the intangibles of absence: the absolute dead quiet of the room, the sense that someone else is right out of earshot or just around the corner.   Kisu is present in her absence.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Like a boat making its way through a calm stream, our legacy is as much about the ripples that remain after us.  That which is present, and &lt;i&gt;of&lt;/i&gt; us,  in our absence.  In this way, we persist.   Although I have to give myself some credit, I feel that Kisu, in her lifetime,  took me (well, she took the journey with me) from a place of anxiety, through some incredible moments and backdrops, to a much more hopeful place.   If I make the best of this,  now, will she, as she persists now,  be ever intertwined with this new future?&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9cOJm9la3JA/TpU0PVf8KkI/AAAAAAAAAJw/RXUIDoodWJo/s1600/Kisu%2Band%2BJohn%252C%2BDenver%2B2011.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="354" src="http://1.bp.blogspot.com/-9cOJm9la3JA/TpU0PVf8KkI/AAAAAAAAAJw/RXUIDoodWJo/s400/Kisu%2Band%2BJohn%252C%2BDenver%2B2011.jpg" width="180" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Kisu and me. Denver Colorado, Summer 2011&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-5514116113416831733?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/5514116113416831733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2011/10/absence-is-inverse-of-presence.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5514116113416831733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/5514116113416831733'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2011/10/absence-is-inverse-of-presence.html' title='Absence is the inverse of presence'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-_LbvwhZpDoU/TpU3C_hanSI/AAAAAAAAAJ8/v2JaMm8bohw/s72-c/182285_10150150109740775_503955774_8650848_1310145_n.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-8093715142989016147</id><published>2010-12-05T17:44:00.000-08:00</published><updated>2010-12-08T16:00:23.234-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='France'/><category scheme='http://www.blogger.com/atom/ns#' term='T.V. Rennes'/><category scheme='http://www.blogger.com/atom/ns#' term='Radio'/><category scheme='http://www.blogger.com/atom/ns#' term='Karelia'/><category scheme='http://www.blogger.com/atom/ns#' term='World Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Russia'/><category scheme='http://www.blogger.com/atom/ns#' term='Radio St. Petersburg'/><title type='text'>Liet International 2010, playing bass with Jousnen Jarved</title><content type='html'>&lt;object height="170" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/P1-9JE2fwwA?fs=1&amp;amp;hl=en_US&amp;amp;rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/P1-9JE2fwwA?fs=1&amp;amp;hl=en_US&amp;amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="170" width="320"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It's always been one of my big dreams to play bass for &lt;span style="font-style: italic;"&gt;world music&lt;/span&gt; and although, since having this dream in the early 90's when I was briefly a fill-in &lt;a href="http://www.wcbn.org/"&gt;disk-jockey at an Ann Arbor, Michigan radio station&lt;/a&gt; - I've recorded &lt;a href="http://www.soundclick.com/rijksbandradio"&gt;fairly little&lt;/a&gt; in this regard - and of extremely variable quality, in relation to where I've actually been over the last 10 years or so. Most of my recorded stuff is from Russia, &lt;a href="http://soundclick.com/share.cfm?id=4216933"&gt;Siberia&lt;/a&gt;, &lt;a href="http://soundclick.com/share.cfm?id=4216117"&gt;China&lt;/a&gt;, (I've recorded others from &lt;a href="http://soundclick.com/share.cfm?id=4216968"&gt;Taiwan&lt;/a&gt;), the &lt;a href="http://soundclick.com/share.cfm?id=4045116"&gt;middle-east&lt;/a&gt; (stylistically), or Fenno-Scania - and I can add both Americas and Greenland to the itinerary. Occasionally, however, I do something which represents a bit of a zenith.&lt;br /&gt;&lt;br /&gt;Ahh, but enter &lt;a href="http://www.jousne.com/"&gt;Jousnen Jarved&lt;/a&gt;, from Russia. I've been travelling to the Russian side of Karelia since the early 2000s and have worked with the project's creator, Peter Coon, for almost as long. Peter's quite the producer, having written, scored, and produced a few &lt;a href="http://soundclick.com/share.cfm?id=4787803"&gt;hard-rocking&lt;/a&gt; &lt;a href="http://soundclick.com/share.cfm?id=4787718"&gt;singles&lt;/a&gt; for me out of his own studio in Petrozavodsk, and being an honest-to-goodness music professional in his own right, something which I am most definitely not. And so, it was like the dream fairy came and dropped this thing in my lap, as I was sitting in Helsinki, bored to death with my musical prospects there, and about ready to give up on the whole damn thing. The &lt;a href="http://www.liet.nl/"&gt;Liet International&lt;/a&gt; festival in Lorient, France, was just the ticket.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TPxJ-QMj2EI/AAAAAAAAAFg/WYagjBRJWV8/s1600/Jousne_Liet2010_1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5547390174861973570" style="width: 320px; cursor: pointer; height: 170px;" alt="" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TPxJ-QMj2EI/AAAAAAAAAFg/WYagjBRJWV8/s320/Jousne_Liet2010_1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;TV Renne&lt;/span&gt; in France, &lt;span style="font-style: italic;"&gt;Fryslan T.V&lt;/span&gt;. in the Netherlands and &lt;span style="font-style: italic;"&gt;CNN&lt;/span&gt; covered the event for a global audience.  We're up for a spot (and hopefully rotation) on Radio St. Petersburg at some point, but I don't know the details yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-8093715142989016147?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/8093715142989016147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2010/12/liet-international-2010-playing-bass.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8093715142989016147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8093715142989016147'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2010/12/liet-international-2010-playing-bass.html' title='Liet International 2010, playing bass with Jousnen Jarved'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Niw9Cby8kWw/TPxJ-QMj2EI/AAAAAAAAAFg/WYagjBRJWV8/s72-c/Jousne_Liet2010_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-3624690061624292066</id><published>2010-11-15T01:46:00.000-08:00</published><updated>2010-11-15T17:11:39.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cucumber'/><category scheme='http://www.blogger.com/atom/ns#' term='Variation'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Learning'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Test Automation'/><category scheme='http://www.blogger.com/atom/ns#' term='Heuristic'/><category scheme='http://www.blogger.com/atom/ns#' term='Random'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Bayesian Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Off the beaten path - Test Automation that can vary (and learn)...</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_Niw9Cby8kWw/TOEEF9ofhhI/AAAAAAAAAEQ/PX7MnmZTGRI/s1600/classy_robot.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5539713517132678674" style="float: left; margin: 0px 10px 10px 0px; width: 224px; height: 154px;" alt="" src="http://2.bp.blogspot.com/_Niw9Cby8kWw/TOEEF9ofhhI/AAAAAAAAAEQ/PX7MnmZTGRI/s320/classy_robot.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The problems with most software test automation is essentially twofold: for the most part, it's only capable of following the same path, over and over again, and, it's incapable of ever learning. It's as dumb today as it was yesterday. That said, it's just not as classy as it could be.&lt;br /&gt;&lt;br /&gt;What, it can be asked, is such repetitive test automation actually useful for? Well, most importantly, for verifying that something doesn't get broken as new features get added to our software; we opt to run our tests to give us a sense of confidence in &lt;em&gt;what's already there. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Of interesting note, though, is the fact that we nearly &lt;em&gt;always&lt;/em&gt; need to pair our automated tests with hands-on exploratory testing. Except that it never really happens like that. The hands-on exploratory testing gradually gives way to the &lt;em&gt;Manual Monkey Test&lt;/em&gt; as the testers and managers lose confidence in those unique skills of perception and hunches that make us human and instead seek something quantifiable, repeatable and reproducible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOEg9_rwY-I/AAAAAAAAAEg/8HilI_E7tho/s1600/trained_monkey.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5539745266081489890" style="display: block; margin: 0px auto 10px; width: 320px; height: 240px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOEg9_rwY-I/AAAAAAAAAEg/8HilI_E7tho/s320/trained_monkey.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TOEgY2VupSI/AAAAAAAAAEY/WbuHou-tYuU/s1600/trained_monkey.gif"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;So how can we turn this around? Boredom with repetitive work begets automation; automation begets need to exploratory test which somehow though time pressures turns into more of the same....in the meantime, the defects to be found live "somewhere" off the path of this tedious nightmare.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are no complete solutions presented here, but I hope you might get some idea of the possibilities available.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Well, one thing to do is to make our test automation more intelligent. Exploratory testing essentially involves two skills, before thought to be uniquely the domain of homo-sapiens - 1.) the ability to &lt;em&gt;randomize&lt;/em&gt; inputs and 2.) the ability to assess and &lt;em&gt;learn&lt;/em&gt; if a given output is appropriate given a non-linear input. Let me elaborate.&lt;br /&gt;&lt;br /&gt;One of the great benefits of open-source software on test automation is (aside from not being bound to a proprietary language) the ability to leverage the wealth of extension libraries that come with the open source languages, and you're supported for free by a massive user community of volunteers. Tools like &lt;em&gt;Squish&lt;/em&gt; and &lt;em&gt;Selenium&lt;/em&gt; use &lt;em&gt;Python &lt;/em&gt;(among others); Nokia's &lt;em&gt;TDriver&lt;/em&gt; uses &lt;em&gt;Ruby&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Without going into too much low level detail ;-), both Python and Ruby have randomizer functions. In Python, one can use the &lt;span style="font-family:courier new;"&gt;rand()&lt;/span&gt;function with an integer as an argument, for example rand(7) returns any number between 0 and 6; Ruby has exactly the same thing. Here's a recipe in Ruby for a simple sort and shuffle of a deck of cards, producing &lt;em&gt;n log n&lt;/em&gt; variable swaps:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOEq33aYtaI/AAAAAAAAAEo/fQ_pqfdFGtY/s1600/rand_array.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5539756155898213794" style="float: left; margin: 0px 10px 10px 0px; width: 320px; height: 106px;" alt="" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOEq33aYtaI/AAAAAAAAAEo/fQ_pqfdFGtY/s320/rand_array.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, this won't be the fastest way if you're dealing with a &lt;em&gt;very large &lt;/em&gt;list, but for generating a small set to explore alternative paths, it could well suffice.&lt;br /&gt;&lt;br /&gt;Now this randomizing can apply to just about any input that comes as an index - so this means just about anything: selected items in a list, buttons in toolbars, parts of a string or a numerical sequence. Once we are randomizing, we are dealing with &lt;em&gt;inputs.&lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;But, how to know &lt;em&gt;when&lt;/em&gt; to randomize?&lt;br /&gt;&lt;br /&gt;Most users out there are going to use a software application in a given or fairly static way - just enough steps to suit their purpose. Configure the music player, cue it up and play the song. But every ONCE in a while, they might deviate from that sequence. So knowing &lt;em&gt;when&lt;/em&gt; to randomize, means knowing how often, based on probability, to do something completely different.&lt;br /&gt;&lt;br /&gt;By way of a practical example....&lt;a href="http://www.cukes.info/"&gt;Cucumber&lt;/a&gt; has become a popular way to express automatic tests in plain language. A cucumber test may read something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Given the MusicPlayer application is started &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;When I press Options softkey &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;When I select Songs from menu &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;And I Select the Song number 1 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Then &lt;strong&gt;Now playing&lt;/strong&gt; view is opened correctly&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Where &lt;em&gt;each line&lt;/em&gt; in that block relates to a function implemented in the core language below it, for example: &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOE1NfLCDWI/AAAAAAAAAFA/abi7AGqdsOw/s1600/nk.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5539767522464763234" style="float: left; margin: 0px 10px 10px 0px; width: 559px; height: 116px;" alt="" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TOE1NfLCDWI/AAAAAAAAAFA/abi7AGqdsOw/s320/nk.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Once we pass a certain &lt;em&gt;threshold &lt;/em&gt;(e.g. the function has been accessed &lt;em&gt;n&lt;/em&gt; times, we are twice or three times likely to deviate from our original number and choose a random index). Doing this effectively requires a trick though - the ability to visualize a software system as a state machine in 4D. And if we randomize at the &lt;em&gt;function&lt;/em&gt; level, our cucumber test writer gets the benefit of that randomization without having to do anything differently&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Once our scripts start to randomize, however, the fixed answer sets to our test runs will no longer suffice; our tests will require the ability to be able to &lt;em&gt;be trained&lt;/em&gt;, to &lt;em&gt;learn&lt;/em&gt;, and to &lt;em&gt;guess &lt;/em&gt;based on previous history as per a correct answer. Fortunately, our open-source languages have the tools to allow us to be able to do just that.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Bayesian gems are already in common use in email spam filtering. Python, for example offers the &lt;span style="font-family:courier new;"&gt;PEBL&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;Classifier&lt;/span&gt; libraries; Ruby offers &lt;span style="font-family:courier new;"&gt;Bishop&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;Classifier&lt;/span&gt; gems. Training for the Classifier gem works along the lines as follows (note - NOT TESTED):&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;require 'rubygems'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;require 'classifier'&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier = Classifier::Bayes.new('Song', 'Not_Song)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.train_Song('%r{.+\.(?i)mp3}')&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.train_Song('%r{.+\.(?i)3gp}')&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.train_Not_Song('%r{.+\.(?i)jpg}')&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;p&gt;And the good stuff - where the real demonstration of learning happens - is here:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.classify "bubba_chops.jpg"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;#=&gt;"Not_Song"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.classify "song.3gp"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;#=&gt;"Song"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;classifier.classify "song.m3u"&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;#=&gt;"Song"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In the case where the script gets it wrong - you have to train it. But after more and more iterations - it will start to make the correct decisions in more and more of the cases. &lt;/p&gt;&lt;p&gt;This is where your script can think, and make decisions as you do.&lt;/p&gt;&lt;p&gt;And that's no monkey business.&lt;/p&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Niw9Cby8kWw/TOE-J5BNUyI/AAAAAAAAAFI/iTOqjzDRCkY/s1600/no_monkey-business.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5539777356288054050" style="width: 150px; height: 190px;" alt="" src="http://4.bp.blogspot.com/_Niw9Cby8kWw/TOE-J5BNUyI/AAAAAAAAAFI/iTOqjzDRCkY/s320/no_monkey-business.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-3624690061624292066?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/3624690061624292066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2010/11/off-beaten-path-test-automation-that.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3624690061624292066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3624690061624292066'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2010/11/off-beaten-path-test-automation-that.html' title='Off the beaten path - Test Automation that can vary (and learn)...'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Niw9Cby8kWw/TOEEF9ofhhI/AAAAAAAAAEQ/PX7MnmZTGRI/s72-c/classy_robot.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-8426002973054721218</id><published>2010-08-11T10:16:00.000-07:00</published><updated>2011-01-18T14:50:36.522-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lo-Fi'/><category scheme='http://www.blogger.com/atom/ns#' term='Number Theory'/><category scheme='http://www.blogger.com/atom/ns#' term='Acoustic Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Korg EMX-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Groove'/><title type='text'>The sine wave and quantum beats</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGLbsaDvFuI/AAAAAAAAADY/MMSoH19yOrs/s1600/index.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5504203250555885282" style="FLOAT: left; MARGIN: 0pt 10px 10px 0pt; WIDTH: 231px; CURSOR: pointer; HEIGHT: 154px" alt="" src="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGLbsaDvFuI/AAAAAAAAADY/MMSoH19yOrs/s320/index.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;s long as I'm mucking about trying to find parallels between quantum mechanics, set theory, and rythm, I set about with a bit of a musical experiment on my trusty korg electribe mx as piped through my soundcraft lexicon mixer's drum plate. The tubes in the electribe give the drums a predictable warmth, while the plate adds room overtones and depth.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGLgR-rD3MI/AAAAAAAAADg/ebDJbMffgdg/s1600/SAM_0645.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5504208294086171842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: pointer; HEIGHT: 240px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGLgR-rD3MI/AAAAAAAAADg/ebDJbMffgdg/s320/SAM_0645.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problem is no doubt simple from a purely musical or musician's perspective, but interesting from a mathematical one.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.csounds.com/ezine/winter1999/beginner/sine.gif"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 447px; CURSOR: pointer; HEIGHT: 278px; TEXT-ALIGN: center" alt="" src="http://www.csounds.com/ezine/winter1999/beginner/sine.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Just like an ordinary sine wave, we simply build a rythm that alternates parts from one measure to the next. For example, we can build a rhythm consisting of bass drum, snare, and decorate it up top with a constant closed hihat (with an open on the last half beat).&lt;br /&gt;&lt;br /&gt;Our bass drum hits on [1, 5, 9, 13], where as our snare is on [3, 6, 9, 12]. What we end up with is a pretty straightforward bossa nova, with the intersection of both parts occuring on the half four [9]. Enter the sine wave: we alternate the bass and snare every other measure! (Incidentally, the effect that this has - if I first switch that opening snare to an opening kick - is a binary alternation between bossa nova and rock-steady beat!).&lt;br /&gt;&lt;br /&gt;Granted this is the simplest way of looking at our beat composition and arrangement, but the best way I can think of to introduce the analogy. But think of the tapestry we could weave when we apply more sophistication to this schema? Like introducing limits, Integration/Differentiation, partial derivatives to the same set of numbers? (Note: I haven't figured all this out myself yet - still some of the results I've observed are really interesting - not to mention they groove, albeit in ways you probably don't expect!) It's probably possible to build this on e.g. complex functions, while keeping the groove. Then you're in uncharted territory, sweet stuff, you're sailing in &lt;a href="http://en.wikipedia.org/wiki/Blue_Ocean_Strategy"&gt;blue oceans&lt;/a&gt;. Of course, there's more than just these musical variables to tweak.&lt;br /&gt;&lt;br /&gt;When combined with acoustic instruments, the intent is hopefully to sincerely emulate "the groove" within the prescribed toolset with this added rythmic complexity as part of the mix. But like everything I'm into at the moment, I've kind of ripped the machine down to its parts to muse and dwell on particular small bits of the problem that fascinate me. Hopefully I'll get down to proper business with it soon enough!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGLpCxJir3I/AAAAAAAAADw/sIu9fku10t8/s1600/SAM_0649.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5504217928362536818" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 240px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGLpCxJir3I/AAAAAAAAADw/sIu9fku10t8/s320/SAM_0649.JPG" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-8426002973054721218?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/8426002973054721218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2010/08/sine-wave-and-quantum-beats.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8426002973054721218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8426002973054721218'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2010/08/sine-wave-and-quantum-beats.html' title='The sine wave and quantum beats'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Niw9Cby8kWw/TGLbsaDvFuI/AAAAAAAAADY/MMSoH19yOrs/s72-c/index.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-2391722840583498102</id><published>2010-08-11T05:58:00.000-07:00</published><updated>2010-08-11T07:41:14.661-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='P2P'/><category scheme='http://www.blogger.com/atom/ns#' term='solutions for humanity'/><category scheme='http://www.blogger.com/atom/ns#' term='Matter into energy'/><title type='text'>Conservation - of energy and matter - would solve humanities major problem(s)...if we could just get there!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGKlTcesXAI/AAAAAAAAADA/WKbe2f8AStg/s1600/SAM_0411.JPG"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGKlTcesXAI/AAAAAAAAADA/WKbe2f8AStg/s320/SAM_0411.JPG" alt="" id="BLOGGER_PHOTO_ID_5504143448081193986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The key to all of this is about humans being able to convert matter into energy, transmit it, and reconvert it back into matter, perhaps conveniently reconfigured!&lt;br /&gt;&lt;br /&gt;Yes, it's more or less right out of Star Trek (we could beam people around, we could project objects like holographs), is only remotely possible with our current understanding of quantum mechanics (but is apparently only as far away as our grasp of a grand unification theory) which is being stabbed at constantly by professionals and amateurs everywhere (which introduces a promising possibility that something will emerge).  Which reminds me, I must look into whatever exists out there in terms of P2P scientific communities and start farming for ideas...same with my fractal art, my music, my programming, my performance style, and just about anything else I've ever smugly attempted to synthesize :P&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGKvdKpUptI/AAAAAAAAADI/y5QJHHpr8JY/s1600/77n.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGKvdKpUptI/AAAAAAAAADI/y5QJHHpr8JY/s320/77n.jpg" alt="" id="BLOGGER_PHOTO_ID_5504154610208909010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When I was recently in Greenland, I was thinking about the simplicity of water, versus the apparent impossibility (technically speaking) to transform it into energy and back again - and how it would fundamentally transform the conditions of humans, and planet earth.  Imagine...being able to take water gushing and streaming off the arctic and antarctic ice and make it bubble out of the ground across all the arid regions on planet earth - from the Sub Sahara across the 'stans to Mongolia.    Certainly, the room full of Somalis, Kenyans and other Africans on Helsinki's north-east side agreed with me hands down that this is the major number one obstacle on earth:  obviously it would feed and economically enable billions who are currently dormant.   By the greening of the deserts, would transform back the environment into something far more oxygen rich and equally less CO&lt;sub&gt;2&lt;/sub&gt; saturated.&lt;br /&gt;&lt;br /&gt;And yet's what stopping it?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Humans have, in the 20th century, been able to convert very unstable matter into raw energy in the course of wiping out foes, and related pursuits.  And we have harnessed the practical energy of grabbing electrons as they fly off bits of U&lt;sup&gt;238&lt;/sup&gt;. This is used in many countries to supplement what we can't get from wind, solar, hydroelectric and other sources of free-in-nature kinetic energy, and wouldn't want to necessarily get from other carbon-based non-renewable sources.  But the &lt;span style="font-style: italic;"&gt;pure&lt;/span&gt; conversion of matter to energy (and back) still seems a long way off in spite of our best efforts.  And I find that somewhat puzzling.&lt;br /&gt;&lt;br /&gt;In browsing across the macro-patterns of human activity we observe attempts to get there, but, for whatever reason, no solution completely bridges the divide.  Take&lt;br /&gt;current recycling...what we are gaining in reduced quantities of discarded paper (and to a far lesser degree, plastics), we gain in e-waste.  With what I call "next years junk" syndrome, technophiles and technophytes, eagerly snatch up the latest available doodad that has arrived to their point on the bell-curve.   Off to the "recycling" center or in some cases, landfill, with 2001's latest.   Stuff resells on the market for anything greater than junk value for only so long, and when last years doodad goes to Africa, it simply ends up in the ground and water there, because Africans like the latest and greatest, just like everyone else, and they raid their shopping malls in Lagos and Johannesburg just like we do ours in Helsinki, London or suburban LA.  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGKwuk7abdI/AAAAAAAAADQ/mXgOgbnXGTY/s1600/6991A-technophobe.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 128px; height: 123px;" src="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGKwuk7abdI/AAAAAAAAADQ/mXgOgbnXGTY/s320/6991A-technophobe.jpg" alt="" id="BLOGGER_PHOTO_ID_5504156008833510866" border="0" /&gt;&lt;/a&gt;  Anyone seen my track-pad iPod?&lt;br /&gt;&lt;br /&gt;I'm not sure what the state of the art in e-recycling is, but I don't believe it goes far enough.   What happens to non-renewable plastics, parts like transistors that are not easily reducible (except with the same sort of "expensive" equipment employed in their manufacture and assembly), etc.  I have often said that for everything that is manufactured, there should be an equal and opposite demanufacturing process/facility waiting for it at the end of its life.  To what extent we fall short of it, I  cannot say, but any shortcoming in it's achievement sets the immutability of those physical laws to a different footlight.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/en/5/55/Escher_Circle_Limit_III.jpg"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 317px; height: 317px;" src="http://upload.wikimedia.org/wikipedia/en/5/55/Escher_Circle_Limit_III.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"Gross bodies and light are convertible into one another..." Isaac Newton, 1704. But what's the catch?  Personally I stick to my e=mc&lt;sup&gt;2&lt;/sup&gt; as a matter of faith, but understand, that it's opposite, its anti-particle, the yin to its hang, is subtly transformed, like water, to patterns that our symmetrical approach to reason and practical implementation perhaps cannot yet fully grasp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-2391722840583498102?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/2391722840583498102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2010/08/what-i-see-as-solution-to-humanitys.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2391722840583498102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2391722840583498102'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2010/08/what-i-see-as-solution-to-humanitys.html' title='Conservation - of energy and matter - would solve humanities major problem(s)...if we could just get there!'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Niw9Cby8kWw/TGKlTcesXAI/AAAAAAAAADA/WKbe2f8AStg/s72-c/SAM_0411.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-2587223528952754838</id><published>2010-08-10T03:09:00.000-07:00</published><updated>2010-08-10T03:35:26.881-07:00</updated><title type='text'>In-between moments</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGEpuzyI4ZI/AAAAAAAAACw/f3eWJV4Ho3k/s1600/SAM_0632.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGEpuzyI4ZI/AAAAAAAAACw/f3eWJV4Ho3k/s400/SAM_0632.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503726103774683538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Niw9Cby8kWw/TGEpuXXzb7I/AAAAAAAAACo/8Gzvyak5VVE/s1600/SAM_0634.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_Niw9Cby8kWw/TGEpuXXzb7I/AAAAAAAAACo/8Gzvyak5VVE/s400/SAM_0634.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503726096148033458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGEptvE1UbI/AAAAAAAAACg/s15P1624VOk/s1600/SAM_0635.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/TGEptvE1UbI/AAAAAAAAACg/s15P1624VOk/s400/SAM_0635.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503726085331046834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGEpte8djDI/AAAAAAAAACY/mAdFoLxQPtI/s1600/SAM_0636.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_Niw9Cby8kWw/TGEpte8djDI/AAAAAAAAACY/mAdFoLxQPtI/s400/SAM_0636.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503726081000967218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGEps8v6xiI/AAAAAAAAACQ/GilXzsx0H44/s1600/SAM_0628.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGEps8v6xiI/AAAAAAAAACQ/GilXzsx0H44/s400/SAM_0628.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503726071821551138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGEmVn9Te1I/AAAAAAAAACI/K066MsbpTPU/s1600/SAM_0630.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_Niw9Cby8kWw/TGEmVn9Te1I/AAAAAAAAACI/K066MsbpTPU/s320/SAM_0630.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5503722372568677202" /&gt;&lt;/a&gt;&lt;br /&gt;...when you care enough to give the very least.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-2587223528952754838?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/2587223528952754838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2010/08/in-between-moments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2587223528952754838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/2587223528952754838'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2010/08/in-between-moments.html' title='In-between moments'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Niw9Cby8kWw/TGEpuzyI4ZI/AAAAAAAAACw/f3eWJV4Ho3k/s72-c/SAM_0632.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-8599346171879682963</id><published>2009-10-22T13:08:00.001-07:00</published><updated>2009-10-22T13:08:58.360-07:00</updated><title type='text'></title><content type='html'>&lt;a href="http://apps.facebook.com/dailyperfect/" target="_blank" title="My digital footprint"&gt;&lt;br /&gt; &lt;img src="http://www.dailyperfect.com/plugins/facebook/footprint_image.php?hash=de412c64bb3aa28459007e58d231f7a3&amp;t=1256242067&amp;size=625" alt="My digital footprint"/&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-8599346171879682963?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/8599346171879682963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2009/10/my-digital-footprint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8599346171879682963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/8599346171879682963'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2009/10/my-digital-footprint.html' title=''/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-7866349798021916479</id><published>2009-03-19T15:46:00.000-07:00</published><updated>2009-03-19T15:53:39.931-07:00</updated><title type='text'>Longevity, brings me back to the center.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i2.cdn.turner.com/cnn/2009/SHOWBIZ/Music/03/19/simon.garfunkel.reunion.tour/art.simon.garfunkel.gi.jpg"&gt;&lt;img style="cursor: pointer; width: 292px; height: 219px;" src="http://i2.cdn.turner.com/cnn/2009/SHOWBIZ/Music/03/19/simon.garfunkel.reunion.tour/art.simon.garfunkel.gi.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So I'm working on two fronts.   Trying to stay on my project, here, get funding for it, etc. because it's going to change the world.   But we're in Limbo right now...and I question whether I have what it takes to go out and work as an outside consultant while we play the waiting game.  I'm really tired, see, and need a break from this endless churn of working a few months, then hunting, etc.&lt;br /&gt;&lt;br /&gt;On the other front, I've built up the recording studio and found musicians, and am very eager about making somthing happen there.   Those are my goals.  Acoustic groove.   I can't get these rythms out of my head.&lt;br /&gt;&lt;br /&gt;So I was feeling pretty hopeless until I read about two guys I could always count on to break up - and then reunite.&lt;br /&gt;&lt;br /&gt;Longevity, constancy, always brings me back to where I need to go.   I reach into that real center to find myself again.  &lt;br /&gt;&lt;br /&gt;I wonder how a trip to New Zealand sounds?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-7866349798021916479?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/7866349798021916479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2009/03/longevity-brings-me-back-to-center.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7866349798021916479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7866349798021916479'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2009/03/longevity-brings-me-back-to-center.html' title='Longevity, brings me back to the center.'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-3239104439431419794</id><published>2009-01-24T13:57:00.000-08:00</published><updated>2009-01-24T14:01:48.552-08:00</updated><title type='text'>25+ points about me.....</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Niw9Cby8kWw/SXuPvpd_XNI/AAAAAAAAAAo/LEYlQPSxIJk/s1600-h/10052008%28010%29.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_Niw9Cby8kWw/SXuPvpd_XNI/AAAAAAAAAAo/LEYlQPSxIJk/s400/10052008%28010%29.jpg" alt="" id="BLOGGER_PHOTO_ID_5294983835652414674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In Facebook, there was a mail going around amongst friends where we were supposed to write a note -  25 things about ourselves.   What better material for a blog about me?  (I may update this in the future with more points, but for now here goes).&lt;br /&gt;&lt;br /&gt;1.  Everyplace I have ever lived, I dreamed there was a mountain near me, and I would climb it.  I rather like the far north.&lt;br /&gt;2. Years later, I found a place a world away that I could swear was the same place I dreamt about repeatedly as a boy. (When my friends and I went back to the forest to find this hilltop - we couldn't locate it again.)&lt;br /&gt;3.  I consider myself the least funniest person in my immediate family - but to my friends, I'm a laff-riot.&lt;br /&gt;4. Even though I love them to death, I've never been geographically close to my folks, don't see them personally so often, and I'm cool with that.&lt;br /&gt;5.  I tend to find ways to avoid bureaucratic unpleasantries.  Or dealing with bureaucracies of any kind.  Whatsoever.&lt;br /&gt;6. Even though I've been working with technology for most of my working years, I despise debugging /troubleshooting poorly - or even well - implemented products. I have exactly *one* requirement on usability - it should work like a train's toilet! Devices, networks, drives, partitions, yer momma's anti-virus, Skype not working right- I'll have none of it. No, I will NOT fix your bloody computer!&lt;br /&gt;7. I've become fascinated with mathematics - particularly calculus - to the point where I will now sit up until 3 a.m. graphing some weird function or pondering some proof. (Heim's unification is the latest). And get up at 7 a.m. to continue. I'm also intrigued by the idea of a grand unification theory which unites general relativity and quantum mechanics, but don't believe that reconciliation exists yet - perhaps with our current understanding as humans we just can't get it.&lt;br /&gt;&lt;br /&gt;8. Among other things I believe there's a workable alternative (we haven't discovered it yet) to our economic system (y'know, the one based on money?) that would solve a hell of a lot of the problems we face as a race on this planet. (What's the biggest shortage right now in our current global downturn - that's right - money!). No shortage in the world whatsoEVER of goods, services, food, people able to do things! And yet people are sitting at home, unemployed, with no way to manage. What's UP with that?&lt;br /&gt;&lt;br /&gt;9. Even though I live in Sweden at the moment, and am thoroughly inspired and fired up by our new U.S. leadership, I'm nonetheless thoroughly convinced that the less government there is, the better. I consider myself a libertarian.&lt;br /&gt;&lt;br /&gt;10. When I was envisioning my current home, which I'm crazy about - even though I don't own it - I was living at the time in a early soviet flat in Tallinn Estonia. That place had an interesting latticework pattern in the floor and a tattoo shop directly below. So I held a picture in my mind about where I WANTED to live, (it was based on my current surroundings of course, what else could I do?) focused on it, meditated on it, and - guess what? Years later, I've got the same floor and the tattoo shop directly below.&lt;br /&gt;&lt;br /&gt;11.  I always wanted to create my own reality, job, career, complete with travel - and I have!&lt;br /&gt;12.  No use for family and kids.  But thanks anyway.&lt;br /&gt;13.  I value my freedom over my security.  Bigtime.&lt;br /&gt;14. I've always believed in my own power to be the captain of my own life and destiny. But I have lost that compass sometimes - those were my darkest moments.&lt;br /&gt;15.  Surprised that I haven't uttered a word about my music yet?&lt;br /&gt;16. I've lived on both sides of that paradox - i've been well off and broke, self-determined and dependent, completely social and totally isolated. Seems like I've needed one to thoroughly appreciate the other.&lt;br /&gt;17. I often soak up other bits of people's personalities and quirks and merge them with my own. Who you see as you observe me depends very much on who - and when - you are.&lt;br /&gt;18.  My ex's little daughter Susanna was thoroughly convinced I was a cartoon.&lt;br /&gt;19.  I rather enjoy myself and my own  company.&lt;br /&gt;20. After I left Finland, my Finnish began to improve dramatically. Same thing with my Estonian. (Kas te järgmises väljute?) Currently my Swedish right sucks.&lt;br /&gt;21. During my university years, I used to get alot of praise for my creative writing, and even published some things, travelled around to recitals, etc.. Now you couldn't get me to write a poem or short story if you put a gun to my head. I'm just far too lazy about it. I keep a blog and hardly ever update it. But I do take immense perverse pride in the voluminous technical specs I've written for some of my jobs (some in the hundreds of pages).&lt;br /&gt;22.  I'm compiling a book of the best pranks of my friends - "1001 ways to be an unwanted guest".  Submissions, anyone?&lt;br /&gt;23. I'm fascinated by how the true nature of a particle - or person - reveals itself over time. Nothing - no one - can escape that. 4th dimensional thinking?&lt;br /&gt;24. Ok. About the music then. Much of what I produce nowadays (and I'm producing alot) are "experiments" with different harmonies, instruments, tambres, recording techniques, microphones, etc. I may never release any of it, although probably some.&lt;br /&gt;25. I've played with some really great players. But I pride myself in how I've been able to get great results out of whoever I happened to find.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-3239104439431419794?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/3239104439431419794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2009/01/25-points-about-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3239104439431419794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3239104439431419794'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2009/01/25-points-about-me.html' title='25+ points about me.....'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Niw9Cby8kWw/SXuPvpd_XNI/AAAAAAAAAAo/LEYlQPSxIJk/s72-c/10052008%28010%29.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-7200066330668094577</id><published>2009-01-06T10:45:00.000-08:00</published><updated>2009-01-06T11:25:43.271-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='Avoid Madrid Airport'/><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='Avoid KLM'/><category scheme='http://www.blogger.com/atom/ns#' term='experience'/><category scheme='http://www.blogger.com/atom/ns#' term='travels'/><category scheme='http://www.blogger.com/atom/ns#' term='Don&apos;t Fly Iberia'/><category scheme='http://www.blogger.com/atom/ns#' term='Avoid SAS'/><title type='text'>in Madrid, thanks to Iberia Airlines strike....</title><content type='html'>As I'm somewhat new to blogging this way (the CMS at my original website, johnhammink.com, has been broken for more than a year, and I'm too lazy to fix it), I'm simply not in the habit of reporting the circumstances of my life, travels, and travails from one day to the next.   Indeed, as someone who works professionally as a writer (essentially), I'm not even accostomed to posting unedited thoughts in forums like these.   Nonetheless, I have always been pretty committed about reporting crappy services and situations, as well as celebrating the good ones, so, as they say, there's no better time than the present.&lt;br /&gt;&lt;br /&gt;I'm supposed to be in Santiago, Chile right now, giving a panel discussion http://www.mite.usm.cl/index.php?id=96 for the local media, and later teaching a master's degree module on consumer product realisation.   Instead I'm in a cafe in Madrid.  After flying in a very dirty plane, which was more than four hours delayed from my origin, I missed my LAN Chile (a very good airline) connection.&lt;br /&gt;&lt;br /&gt;When we arrived in Madrid airport at 12.30 a.m. there was no information point, or person at the exit gate to redirect us to the place we were supposed to get our transfers.   Instead, we were forced to go out of the country, through passport control, then back into the country (through passport control) which resulted in two stamps I really didn't want in my already nearly full passport.  When we finally (on our own, no help from airport staff) finally figured out where we were supposed to go, we stood in that line for more than three hours, while they issues our transfers)! &lt;br /&gt;&lt;br /&gt;Being diabetic, I went out to ask someone (one of the iberia clerks had wandered off to talk to his buddies) where I could find food so that I wouldn't go into shock.   I was then told to go stand back in line and wait for my ticket (it turned out that there was a cafe downstairs).   When I finally got to the desk, and insisted on a connection through LAN Chile, rather than Iberia, it took all of 2 minutes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Iberia finally put us in a hotel, which although it was three stars,   was inflexible about meal times.&lt;br /&gt;&lt;br /&gt;So Madrid is nice (was nicer back before the EU), but I'd really rather not be here right now.&lt;br /&gt;&lt;br /&gt;A couple of lessons I've learned.&lt;br /&gt;&lt;br /&gt;When travelling with a plane full of South Americans, don't do the nice Scandinavian thing and expect other waiting travellers to exercise the same forbearance and respect for lines as you have (As I already knew, but my Scandinavian friends did not realize - South Americans have none - after an asshole-to-elbows scramble, we were last in line, while our tickets were the easiest to process).&lt;br /&gt;&lt;br /&gt;Madrid airport is a mess.   Don't fly there.    And although Iberia respected our passenger's rights (they have to, don't they?) they go on strike several times a year, so somethings not right there.&lt;br /&gt;&lt;br /&gt;In Europe, Consumer's rights and integrity are clearly absolutely LAST priority, if in practice they are even considered at all, light years behind those rights of public officials, followed by trade unions.&lt;br /&gt;&lt;br /&gt;Why do other developing countries' services (LAN Airlines, Chile; Thai Airways) perform so much better in terms of customer treatment, and those services from nations where standard of living is supposed to be the best (SAS, Denmark; KLM, Netherlands, to name a few) offer, by far, the worst customer service?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-7200066330668094577?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/7200066330668094577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2009/01/in-madrid-thanks-to-iberia-airlines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7200066330668094577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/7200066330668094577'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2009/01/in-madrid-thanks-to-iberia-airlines.html' title='in Madrid, thanks to Iberia Airlines strike....'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-986509793457320090.post-3427812571132230707</id><published>2009-01-01T19:06:00.000-08:00</published><updated>2009-01-01T19:15:47.904-08:00</updated><title type='text'>on Fox news...</title><content type='html'>....I just had something of a revelation (or just a question?) about inflammatory shows like the O'Reilly factor and fox news?  I mean what if these guys were actually doing us a favor by acting as a counterpoint to public opinion? Public  sentiment being as divided as it now is.  &lt;br /&gt;&lt;br /&gt;One could argue that Fox news, while seemingly a creation of the Republican party and right wing agenda as such, is actually a reaction to it.   I can see people starting to watch it and thinking "wait a minute, this doesn't seem right", while actually starting to levitate in the other direction.   What if this was created to show how absolutely preposterous that so called "fair and balanced" viewpoint were, in order to get people to oppose it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/986509793457320090-3427812571132230707?l=johnhammink.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johnhammink.blogspot.com/feeds/3427812571132230707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://johnhammink.blogspot.com/2009/01/on-fox-news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3427812571132230707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/986509793457320090/posts/default/3427812571132230707'/><link rel='alternate' type='text/html' href='http://johnhammink.blogspot.com/2009/01/on-fox-news.html' title='on Fox news...'/><author><name>John Hammink</name><uri>http://www.blogger.com/profile/02100058778549982229</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_Niw9Cby8kWw/SWOmW5hZoyI/AAAAAAAAAAM/asJXR5xEmVE/S220/Photo+73.jpg'/></author><thr:total>0</thr:total></entry></feed>
