<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>svpino.com</title><link>http://blog.svpino.com/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/svpino" /><description>Other than that, I'm a &lt;a href="http://blog.svpino.com/p/about-myself.html"&gt;regular guy&lt;/a&gt;, English apprentice, and writer enthusiast. I've been coding software since '94, and this is my shot at making you love this world as I do.</description><language>en</language><managingEditor>noreply@blogger.com (Santiago L. Valdarrama)</managingEditor><lastBuildDate>Mon, 22 Apr 2013 12:12:28 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">160</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">25</openSearch:itemsPerPage><feedburner:info uri="svpino" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>svpino</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/svpino" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsvpino" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><item><title>The magical tech behind paper...</title><link>http://feedproxy.google.com/~r/svpino/~3/y2v917uilLE/the-magical-tech-behind-paper.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Wed, 14 Nov 2012 05:38:29 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-6078725895485976166</guid><description>&lt;a href="http://www.fastcompany.com/3002676/magical-tech-behind-paper-ipads-color-mixing-perfection" target="_blank"&gt;The Magical Tech Behind Paper For iPad's Color-Mixing Perfection.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
An amazing post about an amazing iPad application. I love the application and really enjoyed reading about what's going on behind the scenes. It's amazing how much effort was put behind an apparently trivial feature.&lt;br /&gt;
&lt;br /&gt;
You gotta love these guys.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y2v917uilLE:HPTuq_2uQss:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y2v917uilLE:HPTuq_2uQss:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=y2v917uilLE:HPTuq_2uQss:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y2v917uilLE:HPTuq_2uQss:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/y2v917uilLE" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-14T08:38:29.742-05:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/11/the-magical-tech-behind-paper.html</feedburner:origLink></item><item><title>The magic of being skilled</title><link>http://feedproxy.google.com/~r/svpino/~3/YVPF9YikN3Q/the-magic-of-being-skilled.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Tue, 30 Oct 2012 10:50:54 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-7451999724135794352</guid><description>Incredible what some people can do with an iPad (or a pencil and a piece of paper). From left to right: &lt;a href="https://plus.google.com/102420615329557248749/about" target="_blank"&gt;me&lt;/a&gt;, &lt;a href="https://plus.google.com/105024131283051803248/about" target="_blank"&gt;Deisbel&lt;/a&gt;, and &lt;a href="https://plus.google.com/104154804135554831199/about" target="_blank"&gt;Jorge&lt;/a&gt;.&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/-G7gttqFgwFI/UJARXkugbiI/AAAAAAAAG70/IHUP5cReEWA/s1600/us.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="390" src="http://3.bp.blogspot.com/-G7gttqFgwFI/UJARXkugbiI/AAAAAAAAG70/IHUP5cReEWA/s640/us.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I&amp;nbsp;really&amp;nbsp;wish I could draw like this. If you are interested,&amp;nbsp;&lt;a href="http://instagram.com/p/Rak4tgMFta/" target="_blank"&gt;here is the original photo&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=YVPF9YikN3Q:M4zpOF-9oMQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=YVPF9YikN3Q:M4zpOF-9oMQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=YVPF9YikN3Q:M4zpOF-9oMQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=YVPF9YikN3Q:M4zpOF-9oMQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/YVPF9YikN3Q" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-30T13:50:54.506-04:00</app:edited><media:thumbnail url="http://3.bp.blogspot.com/-G7gttqFgwFI/UJARXkugbiI/AAAAAAAAG70/IHUP5cReEWA/s72-c/us.jpg" height="72" width="72" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/10/the-magic-of-being-skilled.html</feedburner:origLink></item><item><title>This ain't a Windows-friendly corner</title><link>http://feedproxy.google.com/~r/svpino/~3/c4tU4FXQdBg/this-aint-windows-friendly-corner.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 27 Oct 2012 15:54:31 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3437766860838677364</guid><description>I'm hanging this on my office wall for Halloween.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-GKF2dxMmfcc/UIxl9_inzoI/AAAAAAAAG7c/Qo9K9Sn12aY/s1600/non-windows.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-GKF2dxMmfcc/UIxl9_inzoI/AAAAAAAAG7c/Qo9K9Sn12aY/s1600/non-windows.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Scary, right?&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=c4tU4FXQdBg:FV6DSrzPGPM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=c4tU4FXQdBg:FV6DSrzPGPM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=c4tU4FXQdBg:FV6DSrzPGPM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=c4tU4FXQdBg:FV6DSrzPGPM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/c4tU4FXQdBg" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-27T18:54:31.546-04:00</app:edited><media:thumbnail url="http://3.bp.blogspot.com/-GKF2dxMmfcc/UIxl9_inzoI/AAAAAAAAG7c/Qo9K9Sn12aY/s72-c/non-windows.jpg" height="72" width="72" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/10/this-aint-windows-friendly-corner.html</feedburner:origLink></item><item><title>Cartoonish diagrams</title><link>http://feedproxy.google.com/~r/svpino/~3/jpVE3msSwoo/cartoonish-diagrams.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 27 Oct 2012 00:15:48 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-4862587054076900613</guid><description>It's amazing how quick a drawing becomes alive, isn't it?&lt;br /&gt;
&lt;br /&gt;
I love this kind of fun to somehow break the traditional boring diagrams that everybody uses for technical stuff. Believe me, people in your audience will be way more willing to pay attention if you throw some funny-looking cartoons at them.&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/--YIkEu50hpQ/UIuFGbXbY8I/AAAAAAAAG6M/DBhW7YUk3s0/s1600/1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/--YIkEu50hpQ/UIuFGbXbY8I/AAAAAAAAG6M/DBhW7YUk3s0/s320/1.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-aV4ZFObTB9A/UIuFHdvS4xI/AAAAAAAAG6Q/8FwNgZXFlUI/s1600/2.jpg" imageanchor="1" style="float: right; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-aV4ZFObTB9A/UIuFHdvS4xI/AAAAAAAAG6Q/8FwNgZXFlUI/s320/2.jpg" width="320" /&gt;&lt;/a&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/-OCBQPFejmZc/UIuFH-v-9DI/AAAAAAAAG6Y/zsmVrxZQONw/s1600/3.jpg" imageanchor="1" style="clear: both; float: left; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-OCBQPFejmZc/UIuFH-v-9DI/AAAAAAAAG6Y/zsmVrxZQONw/s320/3.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-v62JcWHCWSs/UIuFJEpqAkI/AAAAAAAAG6s/5fu99YpBwLU/s1600/5.jpg" imageanchor="1" style="float: right; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-v62JcWHCWSs/UIuFJEpqAkI/AAAAAAAAG6s/5fu99YpBwLU/s320/5.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-FKDElEFYW5w/UIuFJ1kUJ5I/AAAAAAAAG60/D7yeE3o5qe0/s1600/6.jpg" imageanchor="1" style="clear: right; float: left; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-FKDElEFYW5w/UIuFJ1kUJ5I/AAAAAAAAG60/D7yeE3o5qe0/s320/6.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-xr77jkbbkeI/UIuFIb3WSbI/AAAAAAAAG6k/bP-qL9PIGtQ/s1600/4.jpg" imageanchor="1" style="float: right; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-xr77jkbbkeI/UIuFIb3WSbI/AAAAAAAAG6k/bP-qL9PIGtQ/s320/4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&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/-zD4WcvrW_HA/UIuFLKs6SaI/AAAAAAAAG7E/NhJeELHFPEI/s1600/8.jpg" imageanchor="1" style="clear: right; float: left; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-zD4WcvrW_HA/UIuFLKs6SaI/AAAAAAAAG7E/NhJeELHFPEI/s320/8.jpg" width="320" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-f3Su2SxiKQE/UIuFKpVb7JI/AAAAAAAAG64/WW2nyZOrcN0/s1600/7.jpg" imageanchor="1" style="float: right; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-f3Su2SxiKQE/UIuFKpVb7JI/AAAAAAAAG64/WW2nyZOrcN0/s320/7.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&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/-uHuoDRuBAc0/UIuFMB3bueI/AAAAAAAAG7M/Yh-Ap_wE3d4/s1600/9.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="433" src="http://4.bp.blogspot.com/-uHuoDRuBAc0/UIuFMB3bueI/AAAAAAAAG7M/Yh-Ap_wE3d4/s640/9.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;It takes time, but at the end it looks awesome! For anyone wondering, this is a classic Integration-Manager Workflow in Git.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=jpVE3msSwoo:P6nyyQHi7zA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=jpVE3msSwoo:P6nyyQHi7zA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=jpVE3msSwoo:P6nyyQHi7zA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=jpVE3msSwoo:P6nyyQHi7zA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/jpVE3msSwoo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-27T03:15:48.561-04:00</app:edited><media:thumbnail url="http://2.bp.blogspot.com/--YIkEu50hpQ/UIuFGbXbY8I/AAAAAAAAG6M/DBhW7YUk3s0/s72-c/1.jpg" height="72" width="72" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/10/cartoonish-diagrams.html</feedburner:origLink></item><item><title>Open sourcing my Android App. Go, grab it, and do something good with it.</title><link>http://feedproxy.google.com/~r/svpino/~3/DTmMFomtW_I/open-sourcing-my-android-app-go-grab-it.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Mon, 22 Oct 2012 10:43:50 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3568019734209741345</guid><description>If you've been following my blog, you already know that &lt;a href="http://blog.svpino.com/2012/07/stocktile-sees-light.html" target=""&gt;some time ago&lt;/a&gt; I was working on an Android application. Its main goal was satisfying a personal need: I was super-frustrated that there was nothing for the Android platform that let me take a quick glance at the stock market. Personally I'm a stock junkie, and I love to check stocks 20 times a day. Not having a simple app to do it was really painful.&lt;br /&gt;
&lt;br /&gt;
So &lt;a href="https://play.google.com/store/apps/details?id=com.svpino.longhorn"&gt;I did it myself&lt;/a&gt;. Just like I wanted. When I published it, I called it "&lt;i&gt;Stocktile"&lt;/i&gt;, but internally "&lt;i&gt;Longhorn"&lt;/i&gt; was its name.&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/-fb2-fB909lg/UIVa8pXTDWI/AAAAAAAAG58/MQIIsVZvFVw/s1600/longhorn.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="592" src="http://3.bp.blogspot.com/-fb2-fB909lg/UIVa8pXTDWI/AAAAAAAAG58/MQIIsVZvFVw/s640/longhorn.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
And God knows I loved the result! It was quick, easy to use, and beautiful for my taste. I made it rock-solid and took special care of every detail I could imagine. Since day one I used it 20 times a day until I bought an iPhone 5... iOS comes with a pre-installed stock application so I won't be working on an iOS version of mine any time soon.&lt;br /&gt;
&lt;br /&gt;
So now I'm not going to use &lt;i&gt;Longhorn&lt;/i&gt; anymore. The application is already in &lt;a href="https://play.google.com/store/apps/details?id=com.svpino.longhorn"&gt;Google Play&lt;/a&gt; and the &lt;a href="http://www.amazon.com/Santiago-Valdarrama-Stocktile/dp/B008KSJPAU/ref=sr_1_1?ie=UTF8&amp;amp;qid=1350927671&amp;amp;sr=8-1&amp;amp;keywords=stocktile"&gt;Amazon Marketplace&lt;/a&gt;, but I felt like I wasn't done with it. I really like it and I'd like a better life for it.&lt;br /&gt;
&lt;br /&gt;
So that's why I decided to open source it. Click below to go to my GitHub account and grab it:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/svpino/longhorn" target="_blank"&gt;Download Stocktile (Longhorn) source code here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Yup, you can download the code, re-compile it, change it, and do whatever you want with it (well, at least whatever the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank"&gt;Apache License version 2&lt;/a&gt; let's you do with it).&lt;br /&gt;
&lt;br /&gt;
To give you a preview of what cool stuff you'll find:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Drag and drop (for Android 4.0+)&lt;/li&gt;
&lt;li&gt;Search autocomplete&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Talk to search&lt;/li&gt;
&lt;li&gt;Automatic market updates&lt;/li&gt;
&lt;li&gt;Battery optimization techniques (Read more about this &lt;a href="http://blog.svpino.com/2012/07/connectivity-and-battery-life-in.html"&gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Support all the way up from Android 2.2&lt;/li&gt;
&lt;li&gt;A very nice UI layout&lt;/li&gt;
&lt;li&gt;Gracefully handling device orientations&amp;nbsp;&lt;/li&gt;
&lt;li&gt;And way more stuff...&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
For me it was a real pleasure to work on this app. I hope you can use the code to make something amazing. If that's the case, &lt;a href="https://plus.google.com/102420615329557248749/about" target="_blank"&gt;let me know&lt;/a&gt;. I'd love to hear about it.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=DTmMFomtW_I:-GzcHJ5CIRg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=DTmMFomtW_I:-GzcHJ5CIRg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=DTmMFomtW_I:-GzcHJ5CIRg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=DTmMFomtW_I:-GzcHJ5CIRg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/DTmMFomtW_I" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-22T13:43:50.118-04:00</app:edited><media:thumbnail url="http://3.bp.blogspot.com/-fb2-fB909lg/UIVa8pXTDWI/AAAAAAAAG58/MQIIsVZvFVw/s72-c/longhorn.jpg" height="72" width="72" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/10/open-sourcing-my-android-app-go-grab-it.html</feedburner:origLink></item><item><title>A Blow To HTML5</title><link>http://feedproxy.google.com/~r/svpino/~3/8JnHXR30pQY/a-blow-to-html5.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 25 Aug 2012 07:49:02 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-7586541828194655162</guid><description>&lt;a href="http://branch.com/b/a-blow-to-html5" target="_blank"&gt;A Blow To HTML5&lt;/a&gt; is a super interesting discussion about HTML5 versus native code for mobile applications. Stop by if you want to read different takes on the subject from different people. I'm really enjoying it.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=8JnHXR30pQY:Lx0tNNASbRY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=8JnHXR30pQY:Lx0tNNASbRY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=8JnHXR30pQY:Lx0tNNASbRY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=8JnHXR30pQY:Lx0tNNASbRY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/8JnHXR30pQY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-25T10:49:02.600-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/a-blow-to-html5.html</feedburner:origLink></item><item><title>My Chromebook is winning me over my MacBook Pro</title><link>http://feedproxy.google.com/~r/svpino/~3/df8Bq8YKPEw/my-chromebook-is-winning-me-over-my.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Wed, 08 Aug 2012 12:07:08 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-2986174707500232153</guid><description>I'm a die-hard fan of my MacBook Pro 15.4". It's the best computer I've ever had and I think it's only behind the new&amp;nbsp;Retina&amp;nbsp;MacBook. I use it daily and it's essential for my work.&lt;br /&gt;
&lt;br /&gt;
But...&lt;br /&gt;
&lt;br /&gt;
At home, I've found myself going back to my &lt;a href="http://www.google.com/intl/en/chrome/devices/" target="_blank"&gt;Google Chromebook&lt;/a&gt;. It's all about the weight. With 3.02 lbs only, it's a no brainer to pick it up and move around the house. An incredible battery life plus the fastest wake-up from off I've ever seen complete the perfect I-need-more-than-an-iPad scenario.&amp;nbsp;Obviously, this works only when I'm reading or doing something else browser-only. As soon as I need Eclipse or any other non-browser app I need to go back to my Mac.&lt;br /&gt;
&lt;br /&gt;
Anyway, I think it's interesting how spoiled I've got with the time. The latest Windows laptop I had was an HP Pavilion dvd5 and that thing was heavier than a brick. With the introduction of the iPad in my life, everything now feels too&amp;nbsp;clumsy&amp;nbsp;to carry around... even my MacBook Pro. That's why the Chromebook is winning me over.&lt;br /&gt;
&lt;br /&gt;
Good news are: from now on, on such a fierce market, everything will be even lighter... can't wait to see what comes next.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=df8Bq8YKPEw:Zg7-D3SW97s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=df8Bq8YKPEw:Zg7-D3SW97s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=df8Bq8YKPEw:Zg7-D3SW97s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=df8Bq8YKPEw:Zg7-D3SW97s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/df8Bq8YKPEw" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-08T15:07:08.466-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/my-chromebook-is-winning-me-over-my.html</feedburner:origLink></item><item><title>Integral data types in Java and C#</title><link>http://feedproxy.google.com/~r/svpino/~3/rhV-H10v-dY/integral-data-types-in-java-and-c.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 11 Aug 2012 10:38:55 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3131214599573527716</guid><description>Here is something not super interesting, but that usually comes in handy: what's the range of the integral types in Java and C#?&lt;br /&gt;
&lt;br /&gt;
Let's start by saying that integral data types are those that represent only whole numbers. Each number will have a well defined successor. So floating point numbers are not integral data types (what comes after 0.1? 0.11 or 0.111?) but integers are.&lt;br /&gt;
&lt;br /&gt;
That being said, Java supports the following integral data types: &lt;code&gt;byte&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, and &lt;code&gt;long&lt;/code&gt;. On the other hand, C# supports &lt;code&gt;sbyte&lt;/code&gt;, &lt;code&gt;byte&lt;/code&gt;, &lt;code&gt;short&lt;/code&gt;, &lt;code&gt;ushort&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;uint&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt;, and &lt;code&gt;ulong&lt;/code&gt;. On purpose, I'm leaving outside of this conversation the &lt;code&gt;char&lt;/code&gt; data type since, despite it can be considered an integral type, I don't want to confuse anyone by mixing characters with numbers. So a total of 4 types in Java and 8 types in C#.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The interesting part is the range of numbers that each one of these types supports. To calculate this range, let's first take a look to the size of each one of these types:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;sbyte - 8 bits (1 Byte)
byte - 8 bits (1 Byte)
short - 16 bits (2 Bytes)
ushort - 16 bits (2 Bytes)
int - 32 bits (4 Bytes)
uint - 32 bits (4 Bytes)
long - 64 bits (8 Bytes)
ulong - 64 bits (8 Bytes)
&lt;/code&gt;&lt;/pre&gt;This is true for both Java and C# (remember that only a subset of these types is supported in Java). Having these sizes, there's a simple formula to compute the range of each type. In the case of C# we'll also have to pay attention to the prefix (if any) of the type. This prefix can be "s" (&lt;code&gt;sbyte&lt;/code&gt;), "u" (&lt;code&gt;uint&lt;/code&gt;), or none (&lt;code&gt;long&lt;/code&gt;). This hints us whether the range is going to include negative numbers or not: "s" means "signed" so it will include negative numbers, "u" means "unsigned" so it will include only positive numbers, and when nothing is specified, assume negative numbers are included. So let's see the formula:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;If the number includes negative values, the lower bound is going to be - 2^(bits - 1).&lt;/li&gt;
&lt;li&gt;If the number includes negative values, the upper bound is going to be 2^(bits - 1) - 1.&lt;/li&gt;
&lt;li&gt;If no negative numbers are included, the lower bound is going to be 0.&lt;/li&gt;
&lt;li&gt;If no negative numbers are included, the upper bound is going to be 2^bits.&lt;/li&gt;
&lt;/ul&gt;The reason why in negative numbers we need to use bits - 1 as the exponential part of the formula is because the sign (+ or -) is going to be stored on the same value and it will take 1 bit (1 meaning negative and 0 meaning positive). Let's run the numbers and define the ranges:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;sbyte [-2^7 .. 2^7 - 1] = [-128 .. 127] 
byte &lt;i&gt;(Java)&lt;/i&gt; [-2^7 .. 2^7 - 1] = [-128 .. 127]
byte &lt;i&gt;(C#)&lt;/i&gt; [0 .. 2^8] = [0 .. 255]
short [-2^15 .. 2^15 - 1] = [-32,768 .. 32,767]
ushort [0 .. 2^16] = [0 .. 65,535]
int [-2^31 .. 2^31 - 1] = [-2,147,483,648 .. 2,147,483,647]
uint [0 .. 2^32] = [0 .. 4,294,967,295]
long [-2^63 .. 2^63 - 1] = [-9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807]
ulong [0 .. 2^64] = [0 .. 18,446,744,073,709,551,615]
&lt;/code&gt;&lt;/pre&gt;So here are some things to notice. First, if you use both C# and Java, be careful when you use the &lt;code&gt;byte&lt;/code&gt; data type because it doesn't have the same range in both languages. An equivalent for the Java's &lt;code&gt;byte&lt;/code&gt; in C# is &lt;code&gt;sbyte&lt;/code&gt;. Second, note that in case of signed types, the upper bound is always 1 less than the lower bound (32,767 vs 32,768 for an &lt;code&gt;int&lt;/code&gt;). This is because the value 0 is always considered a positive number. Third, try to say the name of the number represented by a &lt;code&gt;long&lt;/code&gt; value. It will probably take you a while.&lt;br /&gt;
&lt;br /&gt;
Another point that is usually misunderstood is the fact that &lt;b&gt;&lt;i&gt;the size of these data types is going to be always the same regardless of the architecture our program is running on&lt;/i&gt;&lt;/b&gt;. So you might be running your program in a 64 bit machine, but an &lt;code&gt;int&lt;/code&gt; is going to be always 32 bit long so it will have the same range. This is true for both C# and Java.&lt;br /&gt;
&lt;br /&gt;
Finally, I would like to know why in hell the C# design team decided to break the pattern creating an &lt;code&gt;sbyte&lt;/code&gt; and &lt;code&gt;byte&lt;/code&gt; instead &lt;code&gt;byte&lt;/code&gt; and &lt;code&gt;ubyte&lt;/code&gt; respectively. It doesn't make any sense to me unless they were really really drunk that night (or because any other obscure compatibility thing that I can't think of right now).&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=rhV-H10v-dY:2NLmhPx-lfs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=rhV-H10v-dY:2NLmhPx-lfs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=rhV-H10v-dY:2NLmhPx-lfs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=rhV-H10v-dY:2NLmhPx-lfs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/rhV-H10v-dY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-11T13:38:55.413-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/integral-data-types-in-java-and-c.html</feedburner:origLink></item><item><title>Where do I want my phone to be in 5 years?</title><link>http://feedproxy.google.com/~r/svpino/~3/s-ybLzQpfVI/where-do-i-want-my-phone-to-be-in-5.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 11 Aug 2012 10:39:57 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3438520567200759288</guid><description>In the past 3 years my phone went from a dumb-down Nokia I-can't-remember-the-model to an iPhone 4S and a Galaxy Nexus running Jelly Bean (Nokia N95, Blackberry World Edition, iPhone 3GS, and Nexus One along the way). This goes fast, so before the future gets here, here are the 10 main things I want my phone to be / do in the next 5 years.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Crazy good battery life&lt;/b&gt;. I'm talking about &lt;i&gt;days&lt;/i&gt; of battery life, not hours. I just don't want to think about charging my phone anymore. I want wireless charging so just by getting closer to a power station my phone will charge itself without me even noticing.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Incredible lighter and thiner&lt;/b&gt;. They still feel bulky sometimes. A lot of progress has been made in this regard but so much can still be done. Imagine a phone that fits in your wallet (and I don't know why I would want to put it there, but you get the point).&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;100% voice controlled&lt;/b&gt;. I hate &lt;a href="http://blog.svpino.com/2012/08/if-you-make-your-product-interfaces.html" target="_blank"&gt;buttons and complicated interfaces&lt;/a&gt;. Voice is the natural replacement of these. Humans communicate using voice and we have seen already pretty compelling voice interfaces (read Siri and Google Now). They are good, but not great. I want to tell whatever I want to my phone and I want it to do it. No questions asked.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Full-featured payment mechanism&lt;/b&gt;. No more plastic. At all. Bye. I want to pay everything and everywhere with my phone. It's with me all the time and I shouldn't have to carry anything else in my pockets. Google Wallet et. al. are doing a good job, but we are still not quite there.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Again, no plastic&lt;/b&gt;. Following on the previous point, I don't want &lt;i&gt;any&lt;/i&gt; plastic, including my ID. Any form of identification should be built into our phones. If I open my wallet right now, I can't find anything that can't be easily discarded in favor of an electronic replacement.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Key replacement&lt;/b&gt;. My car keys? Nope, my phone should open my car. My home keys? Same thing. Office? Mailbox? Yup. A bluetooth-type key-less system would be awesome: get close enough and the "thing" will open without having you to say / do anything.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;An electronic identity&lt;/b&gt;. I didn't have a better name for this one. Basically, I'd like the phone to identify me everywhere I go (if I choose to, of course). At the bank the clerk will know about me without asking 20 questions. The cops won't have to ask for your "registration and license" anymore, and we'll save ton of time just by electronically answering / filling every form we have to. All this by just pressing a button.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;No more paper&lt;/b&gt;. Plane tickets? Nope. Movie tickets? Concert tickets? Invitations? Checks? Receipts? You name it. Answer is no for all of them. Everything that requieres you to carry &lt;i&gt;something&lt;/i&gt; should be replaced. The phone should take care. Magically.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Better shopping experience&lt;/b&gt;. Imagine going to a store, scanning (or touching?) the products you want and have someone instantly packing them at the front door for you to pick them up when you are done. No payment processing, no carrying carts around. Or real targeted ads showing only what I care about (yes, as seen on Minority Report).&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Easily reemplazable and secure&lt;/b&gt;. Since our life will be so tightly coupled to our phone, we'll have to make them easily reemplazable and bullet-proof secure. Loosing your phone shouldn't be a pain other than having to buy a new one.&lt;/li&gt;
&lt;/ol&gt;Think about it. We are not that far. I can even say we are &lt;i&gt;almost&lt;/i&gt; there. Is more about the entire ecosystem evolving than the phones themselves.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s-ybLzQpfVI:XIt_jiA-NJo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s-ybLzQpfVI:XIt_jiA-NJo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=s-ybLzQpfVI:XIt_jiA-NJo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s-ybLzQpfVI:XIt_jiA-NJo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/s-ybLzQpfVI" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-11T13:39:57.344-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/where-do-i-want-my-phone-to-be-in-5.html</feedburner:origLink></item><item><title>YouTube is not going to be part of iOS 6</title><link>http://feedproxy.google.com/~r/svpino/~3/5Q99szPuAc4/youtube-is-not-going-to-be-part-of-ios-6.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Mon, 06 Aug 2012 15:15:17 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-2901410124187251032</guid><description>&lt;a href="http://www.theverge.com/2012/8/6/3223775/apple-youtube-ios6" target="_blank"&gt;Apple: YouTube app will not be included in iOS 6&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Obviously you will be able to install it from the App Store. This is Apple showing more hate to everything Google-related.&amp;nbsp;They told The Verge that this is because the license rights to include YouTube as a default application was not renewed, but I'm wondering who didn't want to renew it in the first place.&lt;br /&gt;
&lt;br /&gt;
I&amp;nbsp;particularly don't care besides the extra 30 seconds that I will have to spend to install the application, but it's scary how far away from Google Apple is getting. Starting from Gmail there are some Google products that I personally can't live without, and I have the feeling that more than few people feel the same. If Apple starts banning each one of them without a compelling replacement, they will hurt their sales. A lot.&lt;br /&gt;
&lt;br /&gt;
Anyway, I'm hoping that Google have the app ready for the lunch of iOS 6 probably next month, and I'm also hoping that this Apple vs Google cancer doesn't spread anymore.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5Q99szPuAc4:36ERz0lHCvw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5Q99szPuAc4:36ERz0lHCvw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=5Q99szPuAc4:36ERz0lHCvw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5Q99szPuAc4:36ERz0lHCvw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/5Q99szPuAc4" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-06T18:15:17.797-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/youtube-is-not-going-to-be-part-of-ios-6.html</feedburner:origLink></item><item><title>If you make your product interfaces obvious, everyone wins.</title><link>http://feedproxy.google.com/~r/svpino/~3/iVbkpRfjMaU/if-you-make-your-product-interfaces.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 11 Aug 2012 10:40:38 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-9023556698026232757</guid><description>Key-less interfaces. This is where technology is going, and I love it. However, some people still don't get it and they still make horribly complex interfaces. The notion that a product is better if it has 100+ options is totally wrong, and the market its proving it. Make a simpler product, and you will destroy your competition.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;My laundry machine has a speed-deal type control that I still don't know how to properly use after 2 years washing my clothes. I don't care either. It's fixed in one of the steps and that's what I've been using. Remove that thing and add one "start" button. I'm sold.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;li&gt;I bought a blender yesterday with 2 possible options: start and pulse. I paid $30+ bucks over other models with 20 non-sense buttons. I love it and I will gladly buy it over again next time. Do you know how much pain it removes from my life? I know how to use it without having to read any manual!&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My iPhone has one button. Love it. My Galaxy Nexus has three. Why? I have to think every time before pressing one of them. I usually screw it by pressing the wrong one (I might be an idiot). I've never being confused with my iPhone, but I need to complain about my Android. Some phone makers re-order these buttons, so every phone could be different adding more confusion.&amp;nbsp;I've also seen some models that make things worse by turning off the backlit making the buttons invisible to the user! You have to guess-press them to realize that you fucked it up and pressed the wrong one. Nice touch!&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;I used to hate those Windows keyboards with ~200 keys. Somebody thought that it was nice to add a key for every Windows pre-installed application on your hard drive. So you had a key for pulling up Notepad, one for IE, one for the calculator, and a huge painful bulky and confusing keyboard sitting on your desk. Not for me.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;My former Honda Accord panel looked like a piano. You can easily get killed yourself trying to find the right button while driving. My new Audi A4 has 20 more features and uses less than half of the buttons. Needless to say how better it is and how much I like it.&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Guess why I moved from Microsoft Office to Google Docs... Well, at least that's one of the reasons.&lt;/li&gt;
&lt;/ul&gt;The list goes on and on.&lt;br /&gt;
&lt;br /&gt;
Looking around I can find hundreds of examples where technology is getting simpler for users. Every button (option) counts and adds certain stress to the person that needs to use it. Complexity it's never welcomed and people recognize it by going more and more with the easiest product. I consider myself a pretty technical person, and nothing bugs me more than having to deal with a manual before using something. Make it simple and obvious and you'll save tons of paper!&lt;br /&gt;
&lt;br /&gt;
I think that's the future. Key-less interfaces where products are easier to use and work without requiring so many configuration and input instructions. Look at Siri on iOS and the new Google Now on Jelly Bean. We are moving there very quickly.&lt;br /&gt;
&lt;br /&gt;
And for you... please go ahead and rethink whatever is what you're doing. It probably can be simpler. It probably doesn't need so many options. Make us&amp;nbsp;(and yourself)&amp;nbsp;a favor and trim it down until you get rid of every "needed" instruction.&lt;br /&gt;
&lt;br /&gt;
If you make it obvious, everyone wins.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=iVbkpRfjMaU:QF3iQqm-zOM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=iVbkpRfjMaU:QF3iQqm-zOM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=iVbkpRfjMaU:QF3iQqm-zOM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=iVbkpRfjMaU:QF3iQqm-zOM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/iVbkpRfjMaU" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-11T13:40:38.680-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/if-you-make-your-product-interfaces.html</feedburner:origLink></item><item><title>Yes, he was hacked. Hard.</title><link>http://feedproxy.google.com/~r/svpino/~3/7t6dC-34Xvo/yes-he-was-hacked-hard.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 04 Aug 2012 18:01:22 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-6100604868098641524</guid><description>&lt;a href="http://www.emptyage.com/post/28679875595/yes-i-was-hacked-hard" target="_blank"&gt;Yes, I was hacked. Hard.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ouch.&lt;br /&gt;
&lt;br /&gt;
This made me re-think my personal policy for passwords.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=7t6dC-34Xvo:z5YK-_TihqM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=7t6dC-34Xvo:z5YK-_TihqM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=7t6dC-34Xvo:z5YK-_TihqM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=7t6dC-34Xvo:z5YK-_TihqM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/7t6dC-34Xvo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-04T21:01:22.474-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/08/yes-he-was-hacked-hard.html</feedburner:origLink></item><item><title>Access to protected and default (package) members in Java</title><link>http://feedproxy.google.com/~r/svpino/~3/vgB1Z95zov0/access-to-protected-and-default-package.html</link><category>java</category><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 11 Aug 2012 10:35:36 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-48748307081271747</guid><description>Regarding visibility, &lt;code&gt;protected&lt;/code&gt; is one of the most misunderstood modifiers in Java. It's always tricky to get it right, and when combined with the default (or package) visibility, it can become really confusing. Here is my attempt to cover every single possibility of these two access levels.&lt;br /&gt;
&lt;br /&gt;
Let's start with some code:&lt;br /&gt;
&lt;pre class="prettyprint linenums:1"&gt;&lt;code class="language-java"&gt;package com.svpino.snippets.white;

public class Parent {
    void method0() {
        System.out.println("Parent::method0");
    }
 
    protected void method1() {
        System.out.println("Parent::method1");
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Here we are defining two methods, &lt;code&gt;method0&lt;/code&gt; has default visibility (since no modifier is specified), and &lt;code&gt;method1&lt;/code&gt; is protected. So far, so good. Let's see now the other class:&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;&lt;code class="language-java"&gt;package com.svpino.snippets.white;

public class Child1 extends Parent {
 
    public void method2() {
        System.out.println("Child1::method2");
        method0();
        method1();
    }
}&lt;/code&gt;&lt;/pre&gt;The class &lt;code&gt;Child1&lt;/code&gt; is inheriting from &lt;code&gt;Parent&lt;/code&gt; and its located on the same package. This means, that lines 7 and 8 are perfectly valid. Line 7 can be executed because &lt;code&gt;method0&lt;/code&gt; has package visibility and &lt;code&gt;Child1&lt;/code&gt; is located on the same &lt;code&gt;com.svpino.snippets.white&lt;/code&gt; package as &lt;code&gt;Parent&lt;/code&gt;. Line 8 is valid because &lt;code&gt;method1&lt;/code&gt; is protected so &lt;code&gt;Child1&lt;/code&gt; can access it through inheritance. &lt;br /&gt;
&lt;br /&gt;
But, what if we try these methods from a different package? Let's see:&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;&lt;code class="language-java"&gt;package com.svpino.snippets.black;

import com.svpino.snippets.white.Parent;

public class Child2 extends Parent {
 
    public void method2() {
        System.out.println("Child2::method2");
        method0(); // Error! This doesn't compile!
        method1();
    }
}&lt;/code&gt;&lt;/pre&gt;Now in this case, Line 9 is not valid anymore. We can't call &lt;code&gt;method0&lt;/code&gt; because we are on a different package than &lt;code&gt;Parent&lt;/code&gt;. However, Line 10 is still valid since we are accessing a protected member through inheritance.&lt;br /&gt;
&lt;br /&gt;
Now let's spice things up a little bit:&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;&lt;code class="language-java"&gt;package com.svpino.snippets.white;

import com.svpino.snippets.black.Child2;

public class Neighbor1 {

    public void method3() {
        Parent parent = new Parent();
        parent.method0();
        parent.method1();

        Child1 child1 = new Child1();
        child1.method0();
        child1.method1();
        child1.method2();

        Child2 child2 = new Child2();
        child2.method0(); // Error! This doesn't compile!
        ((Parent) child2).method0();
        child2.method1();
        child2.method2();
    }
}&lt;/code&gt;&lt;/pre&gt;Line 9 has no problem to compile, since we are on the same package than &lt;code&gt;Parent&lt;/code&gt;. Line 10 also compiles (and this is interesting) since the protected visibility in Java works the same as the package visibility. Keep that in mind all the time: &lt;i&gt;A protected member has essentially package-level or default access to all classes except for subclasses.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Moving to the next block, Line 13 and Line 14 will also compile for the same reasons Line 9 and 10 compile respectively. Line 14 is calling a public method from &lt;code&gt;Child1&lt;/code&gt; so it will also compile. Nothing fancy here.&lt;br /&gt;
&lt;br /&gt;
Let's see what happens in the last block. Line 18 doesn't compile because we are trying to access &lt;code&gt;method0&lt;/code&gt; through the &lt;code&gt;Child2&lt;/code&gt; class. If you go back to that class you'll see it's defined in a different package than &lt;code&gt;Neighbor1&lt;/code&gt;, and because &lt;code&gt;method0&lt;/code&gt; has default visibility, it won't be visible at this point. However, casting &lt;code&gt;child2&lt;/code&gt; to a &lt;code&gt;Parent&lt;/code&gt; will let us access &lt;code&gt;method0&lt;/code&gt;. The compiler will validate that we do have access to everything defined with package visibility in the &lt;code&gt;Parent&lt;/code&gt; class, so Line 19 won't be a problem.&lt;br /&gt;
&lt;br /&gt;
Now, think about Line 20. It will compile, but why? It was kind of shocking for me discovering this. Supposedly, &lt;code&gt;method1&lt;/code&gt; should behave exactly as &lt;code&gt;method0&lt;/code&gt; since package visibility acts like default visibility, however there's another subtle difference between them. I had to check the &lt;a href="http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf" target="_blank"&gt;Java specification&lt;/a&gt; to find the key:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;6.6.1 (...) if the member or constructor is declared protected, then access is&amp;nbsp;permitted only when one of the following is true:&lt;br /&gt;
* &lt;i&gt;Access to the member or constructor occurs from within the package&amp;nbsp;containing the class in which the protected member or constructor is&amp;nbsp;declared.&lt;/i&gt;&lt;br /&gt;
(...)&lt;/blockquote&gt;Now compare that to the following about default access:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;6.6.1 (...) Otherwise, we say there is default access, which is permitted &lt;i&gt;only when the access occurs from within the package in which the type is declared.&lt;/i&gt;(...)&lt;/blockquote&gt;So the difference is that a protected member will be always accessible when the access occurs from within the package where the class containing the member was declared, meanwhile default access is only possible when the access occurs from the same package where the type (the type of the object we are using to access the member) was declared. In our case, the member &lt;code&gt;method1&lt;/code&gt; was declared in the package &lt;code&gt;com.svpino.snippets.white&lt;/code&gt;, and we are accessing it from &lt;code&gt;Neighbor1&lt;/code&gt; which happens to be on the same package, so the access will be allowed even though we are using &lt;code&gt;Child2&lt;/code&gt; (the type) to do it.&lt;br /&gt;
&lt;br /&gt;
It sounds complicated, and I had to read it more than once myself to make sense out of it. But if you pay careful attention to the wording, you'll see it. Finally, it's not surprising than Line 21 will compile since &lt;code&gt;method2&lt;/code&gt; has public access.&lt;br /&gt;
&lt;br /&gt;
The code for our last test is as follows:&lt;br /&gt;
&lt;pre class="prettyprint linenums"&gt;&lt;code class="language-java"&gt;package com.svpino.snippets.black;

import com.svpino.snippets.white.Child1;
import com.svpino.snippets.white.Parent;

public class Neighbor2 {

    public void method3() {
        Parent parent = new Parent();
        parent.method0(); // Error! This doesn't compile!
        parent.method1(); // Error! This doesn't compile!

        Child1 child1 = new Child1();
        child1.method0(); // Error! This doesn't compile!
        child1.method1(); // Error! This doesn't compile!
        child1.method2();

        Child2 child2 = new Child2();
        child2.method0(); // Error! This doesn't compile!
        ((Parent) child2).method0(); // Error! This doesn't compile!
        child2.method1(); // Error! This doesn't compile!
        child2.method2();
    }
}&lt;/code&gt;&lt;/pre&gt;Lines 10 and 11 will not compile since we are accessing them from outside the package where they were defined. Same thing happens with lines 14 and 15, meanwhile line 16 is a simple public access.&lt;br /&gt;
&lt;br /&gt;
Now, line 19 is trying to access a default member that was defined in a different package, so it won't compile. The cast in line 20 won't compile because &lt;code&gt;Parent&lt;/code&gt; still belongs to a different package, and look how interesting is line 21. We can't access &lt;code&gt;method1&lt;/code&gt; even though it is inherited by &lt;code&gt;Child2&lt;/code&gt; from &lt;code&gt;Parent&lt;/code&gt;. The reason is because &lt;i&gt;once a subclass outside the package inherits a protected member, that member becomes private to any code outside the subclass with the exception of subclasses of the subclass&lt;/i&gt;. Yes, another tongue-twister, so you might want to read it again. Basically, as soon as &lt;code&gt;method1&lt;/code&gt; is inherited, its visibility becomes private to any outsider (like our &lt;code&gt;Neighbor2&lt;/code&gt; class). &lt;br /&gt;
&lt;br /&gt;
So that's about it. Impressive how tricky these modifiers can be, specially the &lt;code&gt;protected&lt;/code&gt; access. It took some time to wrap my head around all these concepts, but now I have it pretty clear.&lt;br /&gt;
&lt;br /&gt;
Hope it helps.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=vgB1Z95zov0:lq3h0ZNMd18:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=vgB1Z95zov0:lq3h0ZNMd18:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=vgB1Z95zov0:lq3h0ZNMd18:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=vgB1Z95zov0:lq3h0ZNMd18:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/vgB1Z95zov0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-11T13:35:36.262-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><media:content url="http://feedproxy.google.com/~r/svpino/~5/pDwbT4lqjA0/jls7.pdf" fileSize="3119180" type="application/pdf" /><feedburner:origLink>http://blog.svpino.com/2012/08/access-to-protected-and-default-package.html</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/svpino/~5/pDwbT4lqjA0/jls7.pdf" length="3119180" type="application/pdf" /><feedburner:origEnclosureLink>http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf</feedburner:origEnclosureLink></item><item><title>Google delays launch of Nexus Q, gives free Q to those who pre-ordered</title><link>http://feedproxy.google.com/~r/svpino/~3/dU-rpYcRcM0/google-delays-launch-of-nexus-q-gives.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Tue, 31 Jul 2012 18:54:08 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-1086347692403431652</guid><description>&lt;a href="http://androidcommunity.com/google-delays-launch-of-nexus-q-gives-free-q-to-those-who-pre-ordered-20120731/" target="_blank"&gt;Google delays launch of Nexus Q, gives free Q to those who pre-ordered&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I thought from the beginning that the Nexus Q was a half-baked product. It wasn't only pricey (due to being manufactured in U.S) but it offered 1/10th of the features found in competitor products. It was going to have a hard time to compete with so many more mature choices on the market.&lt;br /&gt;
&lt;br /&gt;
I don't think Google is killing it. They are just taking it back to the drawing table. They need to rethink how the Q is going to fit in the consumer living-room where there's probably a Google TV / Apple TV / Roku Player / TiVo / XBox / you name it.&lt;br /&gt;
&lt;br /&gt;
People don't want another gadget. Nobody is going to spend $300+ for a funny-looking ball that queues music from their friends' phones. They want something that solves a real problem and stands still next to the competition.&lt;br /&gt;
&lt;br /&gt;
After the Google TV fiasco, the Q had an open ticket to the same party. I'm glad somebody stood and spoke and now Google backtracked to rethink their strategy. It's awesome they are honoring the pre-orders. Well done!﻿&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=dU-rpYcRcM0:8XbiI-DkWiw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=dU-rpYcRcM0:8XbiI-DkWiw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=dU-rpYcRcM0:8XbiI-DkWiw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=dU-rpYcRcM0:8XbiI-DkWiw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/dU-rpYcRcM0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-31T21:54:08.221-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/google-delays-launch-of-nexus-q-gives.html</feedburner:origLink></item><item><title>Verizon faces $1.25m fine for blocking third-party tethering apps</title><link>http://feedproxy.google.com/~r/svpino/~3/qqeOZEtOBGc/verizon-faces-125m-fine-for-blocking.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Tue, 31 Jul 2012 18:50:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-2653794874455503791</guid><description>&lt;a href="http://androidcommunity.com/verizon-faces-1-25m-fine-for-blocking-third-party-tethering-apps-20120731/" target="_blank"&gt;Verizon faces $1.25m fine for blocking third-party tethering apps&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Uh oh... more about the carriers. Since I'm following technology I've never ever heard anything about carriers doing well for their customers. Unfortunately they are a necessary evil and they are taking advantage of that.&lt;br /&gt;
&lt;br /&gt;
But nothing lasts forever. Carriers will change. They have to. At some point someone will do it differently and they will find themselves out of business. See the Google Fiber now getting into the TV provider arena. Same thing is going to happen with telephony at some point, and all the big guys are digging their own holes right now... they will miserably pay for that.&lt;br /&gt;
&lt;br /&gt;
Wait and see.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=qqeOZEtOBGc:7eD9KjHYCRQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=qqeOZEtOBGc:7eD9KjHYCRQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=qqeOZEtOBGc:7eD9KjHYCRQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=qqeOZEtOBGc:7eD9KjHYCRQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/qqeOZEtOBGc" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-31T21:50:11.349-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/verizon-faces-125m-fine-for-blocking.html</feedburner:origLink></item><item><title>Still waiting for Google+ comments on Blogger</title><link>http://feedproxy.google.com/~r/svpino/~3/j26pwtTn2z0/still-waiting-for-google-comments-on.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Mon, 30 Jul 2012 18:14:37 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-7618635535514176600</guid><description>&lt;a href="http://buzz.blogger.com/2012/07/socialize-with-googleplus.html" target="_blank"&gt;More Google+ integration into Blogger&lt;/a&gt;, but still not integrated comments. I've been &lt;a href="https://plus.google.com/102420615329557248749/posts/XacrbJWFw35"&gt;requesting&lt;/a&gt;, &lt;a href="http://blog.svpino.com/2012/01/blogger-i-appreciate-your-changes-but.html"&gt;this&lt;/a&gt;, &lt;a href="http://blog.svpino.com/2012/01/comments-are-off-on-blog-but-you-can.html"&gt;forever&lt;/a&gt;, but is still not here. Obviously is going to happen at some point because it's a natural transition for a product like Blogger. Question is &lt;i&gt;when&lt;/i&gt;...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=j26pwtTn2z0:zYhpJLIU8rM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=j26pwtTn2z0:zYhpJLIU8rM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=j26pwtTn2z0:zYhpJLIU8rM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=j26pwtTn2z0:zYhpJLIU8rM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/j26pwtTn2z0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-30T21:14:37.997-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/still-waiting-for-google-comments-on.html</feedburner:origLink></item><item><title>Is Computer Science overrated? Should we google stuff instead?</title><link>http://feedproxy.google.com/~r/svpino/~3/Ah3kqRfHNQk/is-computer-science-overrated-should-we.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sat, 28 Jul 2012 09:30:39 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-8500983960926967120</guid><description>Lot of people say so. Apparently every successful technology company nowadays is started by drop-offs or folks that never went to college. Or at least that's what the press says. It's becoming a trend that everyone talks about and adepts strongly defend.&lt;br /&gt;
&lt;br /&gt;
Bullshit. &lt;br /&gt;
&lt;br /&gt;
Sorry but you are wrong. College is more important than ever. Computer Science has been, &lt;i&gt;is&lt;/i&gt;, and will be the way to go. &lt;i&gt;It will always make sense&lt;/i&gt;. It doesn't matter how many successful people you can count that didn't go to college, there are far more that went but they are not as exciting to talk about like the former.&lt;br /&gt;
&lt;h4&gt;But... they only teach you old stuff&lt;/h4&gt;
&lt;span style="background-color: white;"&gt;Sure they do. Technology advances faster than any other industry in the world. Computer Science changes by the minute, but the foundation is the same. If every school changes their program every time a new framework-paradigm-tool sees the light, there won't be professors that can teach each new subject. It's not sustainable nor practical. This is not the way it works and it shouldn't be.&lt;/span&gt;&lt;br /&gt;
&lt;br/&gt;
Instead, college is supposed to teach you the basis that you'll need to have a successful career. Stuff that you might think is old, or not useful, but that opens your mind and teaches you how to approach problems and find solutions for them. They make you think, analyze, understand... and you can't just simply google that. Solutions are out there, but if you don't know the root of the problem you will always be a good short-term copy-and-paste developer.&lt;br /&gt;&lt;br /&gt;

&lt;span style="background-color: white;"&gt;In every conversation I've had about this matter, I always refer back to &lt;i&gt;algorithms&lt;/i&gt;. Think for a second about everything contained in such a simple word. This is not related with the latest and the greatest paradigms out there, or the best tools or frameworks. This refers to the basic ABC steps to tackle a problem and give a compelling solution. This knowledge stays and never fades off with the time. Instead, it gets better as you gain more experience, and it's&amp;nbsp;precisely&amp;nbsp;one of the main focus of every Computer Science school. Books about this could be from 1980 but they are still valuable, sometimes &lt;i&gt;more than ever&lt;/i&gt;. And the perfect way to reach all this knowledge is by attending school.&lt;/span&gt;&lt;br /&gt;
&lt;h4&gt;But... 4 - 5 years is still a long time&lt;/h4&gt;
Yup, it's the perfect period to make you mature and give you everything you need to have a successful start out there. If you are waiting for a program that's going to make you proficient in the latest technology paradigm you might better get&amp;nbsp;comfortable&amp;nbsp;because it's never going to happen. Instead, use these years to suck everything valuable and complement all that with today's advances.&lt;br /&gt;
&lt;br&gt;If you go to school only to listen and read, you'll fail. Be proactive. Be always one step ahead. Read and then ask. Listen and then compare. Think about how you can apply everything that you've been taught to what you want to do. There's going to be hundreds of people smarter than you around, so use them to get every piece of knowledge you can out of them. During school is OK to fail, try and fail again, research, innovate, everything is allowed and everything will make you better. Real life is full of real problems and you won't have such a&amp;nbsp;luxury. Use the time, and use it wisely.&amp;nbsp;&lt;br /&gt;
&lt;h4&gt;But... but...&lt;/h4&gt;
There's always going to be &lt;i&gt;another reason&lt;/i&gt; not to go. And if you can't or won't it's alright, but you'll have to make up for that time in a different way. 90% of the smarter people that I know went to college, but the other 10% are as good as everyone else. That happens, but it doesn't mean that works for everyone.&lt;br /&gt;
&lt;br /&gt;
Way before college I knew how to solve some problems. Heck, even some complicated ones. But most of the time I didn't know &lt;i&gt;why the damn thing worked&lt;/i&gt;. Was more like a trial - error approach. College helped me with that and made me a far better engineer than what I was before. I was lucky, but I helped a ton my luck studying. And you can also do it instead of thinking that you'll be wasting your time.&lt;br /&gt;
&lt;br /&gt;
There has never been a better time to go to school. Stop thinking that you're going to be the next Mark Zuckerberg or Steve Jobs if you don't go or drop off. Chances are that you won't, and you will hurt your formation in a very bad way during the process.&lt;br /&gt;
&lt;br /&gt;
So, think again.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ah3kqRfHNQk:bRD2y7KrUrE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ah3kqRfHNQk:bRD2y7KrUrE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=Ah3kqRfHNQk:bRD2y7KrUrE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ah3kqRfHNQk:bRD2y7KrUrE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/Ah3kqRfHNQk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-28T12:30:39.773-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/is-computer-science-overrated-should-we.html</feedburner:origLink></item><item><title>Design and test. Go back and start the same process over and over again</title><link>http://feedproxy.google.com/~r/svpino/~3/2HNGWMc8XkY/design-and-test-go-back-and-start-same.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Fri, 27 Jul 2012 20:23:32 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3111298307881176437</guid><description>Yes, this is the &lt;i&gt;Nth&lt;/i&gt; time I play with the look 'n feel of the blog, but I really like to explore new things. Unfortunately I'm not a designer, so it takes me more time than normal to settle with something that I really like.&lt;br /&gt;
&lt;br /&gt;
Today I can go to bed feeling that the site looks better than ever (it doesn't mean I'm 100% happy though). A huge accomplishment was adding &lt;a href="http://code.google.com/p/google-code-prettify/" target="_blank"&gt;Prettify&lt;/a&gt; to format the source code. Neat, but I'd have to go through every single post in my archive and add some styles to get it working. Not gonna happen today... but it will.&lt;br /&gt;
&lt;br /&gt;
The next goal will be to fix some navigation issues and add links to the &lt;a href="http://feeds.feedburner.com/svpino"&gt;RSS&lt;/a&gt; of the blog, &lt;a href="http://www.twitter.com/svpino" target="_blank"&gt;Twitter&lt;/a&gt;, and &lt;a href="https://plus.google.com/102420615329557248749/about" target="_blank"&gt;Google+&lt;/a&gt; (middle finger to &lt;a href="http://blog.svpino.com/2012/07/bye-facebook-hello-google.html"&gt;Facebook&lt;/a&gt;). Hope to get it done by this coming week, will see.&lt;br /&gt;
&lt;br /&gt;
If you have something to say about my extra-minimalist design, &lt;a href="https://plus.google.com/102420615329557248749/about"&gt;go ahead&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=2HNGWMc8XkY:TembAZ9-4TI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=2HNGWMc8XkY:TembAZ9-4TI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=2HNGWMc8XkY:TembAZ9-4TI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=2HNGWMc8XkY:TembAZ9-4TI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/2HNGWMc8XkY" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-27T23:23:32.211-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/design-and-test-go-back-and-start-same.html</feedburner:origLink></item><item><title>If you really want to get something done, you have to stand up and make it happen</title><link>http://feedproxy.google.com/~r/svpino/~3/Ug8R2Lmx3og/if-you-really-want-to-get-something.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Thu, 26 Jul 2012 20:10:30 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-2693903921204005981</guid><description>Not surprising, but still I'm amazed how easy is to loose track of things and let time pass by without accomplishing anything. Too bad the default setting for people is to drag their feet on everything they don't like to do (or care for).&lt;br /&gt;
&lt;br /&gt;
Probably you have to deal with this every day. Maybe you are on the lazy side most of the time (I've been there too!). That's the moment when somebody else will show up and&amp;nbsp;embarrass&amp;nbsp;you by getting done 90 percent of the work in the time it took you to get through the initial 10 percent.&lt;br /&gt;
&lt;br /&gt;
If you want to make a difference, go and start showing everyone else how it should be done. It's so easy to do it differently, to do it better. It's so worth it and so well compensated. Still, very few people seem to care.&lt;br /&gt;
&lt;br /&gt;
There hasn't been a better time to shine. Go!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ug8R2Lmx3og:S92I4XHekEY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ug8R2Lmx3og:S92I4XHekEY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=Ug8R2Lmx3og:S92I4XHekEY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=Ug8R2Lmx3og:S92I4XHekEY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/Ug8R2Lmx3og" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-26T23:10:30.391-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/if-you-really-want-to-get-something.html</feedburner:origLink></item><item><title>Bye Facebook. Hello Google+</title><link>http://feedproxy.google.com/~r/svpino/~3/y0b00hMlrtU/bye-facebook-hello-google.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Mon, 16 Jul 2012 15:45:52 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-4787986405436614999</guid><description>On my email today:

&lt;br /&gt;
&lt;blockquote&gt;
Hi Santiago,

You have deactivated your Facebook account. You can reactivate your account at any time by logging into Facebook using your old login email and password. You will be able to use the site like you used to.

Thanks,
The Facebook Team
&lt;/blockquote&gt;
Yes I did. Sorry. Too many invitations to FarmVille and cute little cats on my feed. I would rather move to a &lt;a href="https://plus.google.com/102420615329557248749/about" target="_blank"&gt;safer place&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y0b00hMlrtU:5HbNe1L3_fg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y0b00hMlrtU:5HbNe1L3_fg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=y0b00hMlrtU:5HbNe1L3_fg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=y0b00hMlrtU:5HbNe1L3_fg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/y0b00hMlrtU" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-16T18:45:52.743-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/bye-facebook-hello-google.html</feedburner:origLink></item><item><title>Connectivity and Battery Life in Android. Making them play nicely.</title><link>http://feedproxy.google.com/~r/svpino/~3/T_OSQw5bmpk/connectivity-and-battery-life-in.html</link><category>android</category><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Fri, 27 Jul 2012 19:48:26 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-719140743146372422</guid><description>Last week I announced &lt;a href="http://goo.gl/LxFr5" target="_blank"&gt;Stocktile&lt;/a&gt;, a stock market application to make my life easier and enjoy checking on my tickers even more. At the end of that &lt;a href="http://blog.svpino.com/2012/07/stocktile-sees-light.html" target="_blank"&gt;post&lt;/a&gt;, I wrote the biggest lesson I learnt while I was developing the app:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Main challenge: The web is always online. Mobile applications are not. It's an entire layer of complexity added to our applications.&lt;/blockquote&gt;
Indeed. Not having a reliable and fast Internet connection all the time is something traditional developers are not used to. Mobile imposes this restriction, and we have to deal with it if we want to make our applications solid options for consumers.&lt;br /&gt;
&lt;h4&gt;





But it's not just about connectivity&lt;/h4&gt;
There's another challenge though that we don't need to worry about outside the mobile ecosystem: battery life. In such small devices, there's a very small battery and dozen of applications competing to use a pice of it. Unfortunately, technology is still not where we can stop&amp;nbsp;worrying&amp;nbsp;about how much power our application sucks, so we need to use it carefully or face the anger of our users.&lt;br /&gt;
&lt;br /&gt;
So&amp;nbsp;connectivity&amp;nbsp;and battery life are the main two players. They need to play&amp;nbsp;seamlessly and safe. Unfortunately is difficult to get it right, so a lot of developers don't pay attention to these details. That's mainly why tons of Android apps are battery and data-plans killers. They just don't care.&lt;br /&gt;
&lt;br /&gt;
On the Android developers site there are two awesome articles explaining the ins and outs of developing and application that properly takes care of &lt;a href="http://developer.android.com/training/efficient-downloads/index.html" target="_blank"&gt;connectivity&lt;/a&gt; and &lt;a href="http://developer.android.com/training/monitoring-device-state/index.html" target="_blank"&gt;battery life&lt;/a&gt;. I'm not going to reproduce here everything said, but I strongly recommend any developer to read those training sessions. I want to focus instead in the code that powers &lt;a href="http://goo.gl/LxFr5" target="_blank"&gt;Stocktile&lt;/a&gt;, and how I combined different techniques to make the application a good citizen in Android-land.&lt;br /&gt;
&lt;h4&gt;



Setting our rules&lt;/h4&gt;
First of all, take into account that every application is different and requires a different level of thinking. What works for me, might not work for a news application or any other category. However, the approach is very similar, so I hope to help more than one out there.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://goo.gl/LxFr5" target="_blank"&gt;Stocktile&lt;/a&gt; downloads the market information for every stock ticker added to your dashboard. You can have 3 tickers, or hundreds of them. Not matter how many, you surely want them to display the latest market information available all the time. That's the point, and that was my goal. However, because I'm feeding my app using the Yahoo! Finance API, there's going to be a minimum delay of 15 minutes between market updates. That's the first constraint I have to play with: &lt;b&gt;no updates will be requested if the latest one was less than 15 minutes ago&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
But what happens if the user is not using the application? Do we want to keep updating it? Remember that every update will impact the user's data-plan and the battery life of the device, so the answer is no. If the users don't care about our app, why bothering them with updates they are not going to see? So that's the second rule: &lt;b&gt;the application will be updated only if users are actively using it&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
However, downloading information from the network takes time, and we don't want our users waiting from fresh data to come when they open our app. So we should rethink our updates policies: what about &lt;b&gt;updating automatically &lt;/b&gt;even if the user is not actively using the app but&lt;b&gt; only when the device is plugged to a power source and connected to a WiFi network&lt;/b&gt;? That sounds better!&lt;br /&gt;
&lt;br /&gt;
There are two more use cases that I had to take care of: &lt;b&gt;when the user adds a new ticker to the dashboard, we want to update it&amp;nbsp;immediately&lt;/b&gt;. And, &lt;b&gt;if during an update an error occurs&lt;/b&gt;, we need to &lt;b&gt;re-schedule the next update as soon as possible&lt;/b&gt;. However, it might be the case that something is wrong with the server so a&amp;nbsp;continuous update will further damage the battery life of the device. To solve this, we need to employ a back-off pattern as explained on the Android training classes.&lt;br /&gt;
&lt;br /&gt;
So let's put everything together:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The minimun time between updates will be 15 minutes.&lt;/li&gt;
&lt;li&gt;If the user is not using the application, new information is going to be downloaded only when the device is plugged to a power source and running on a WiFi network.&lt;/li&gt;
&lt;li&gt;If the user adds a new ticker, an update will be performed immediately only for that ticker.&lt;/li&gt;
&lt;li&gt;If an error occurs while updating, a new back-off update will be scheduled as soon as possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;h4&gt;


The BatteryBroadcastReceiver&lt;/h4&gt;
Let's take a look to all the code pieces that make up these guidelines. Let's start with our second rule above. For that one, we need to create two different &lt;a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html" target="_blank"&gt;BroadcastReceivers&lt;/a&gt;, one for monitoring the battery and the other to monitoring connectivity changes. Look at the following lines in our manifest file:&lt;/div&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-xml"&gt;&amp;lt;receiver
    android:name=".BatteryBroadcastReceiver"
    android:exported="false" &amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name="android.intent.action.ACTION_POWER_CONNECTED" /&amp;gt;
        &amp;lt;action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" /&amp;gt;
    &amp;lt;/intent-filter&amp;gt;
&amp;lt;/receiver&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
Then our Java class:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public class BatteryBroadcastReceiver extends BroadcastReceiver {

    private final static String LOG_TAG = BatteryBroadcastReceiver.class.getName();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (isTheBatteryPluggedIn(context)) {
            if (areWeUsingWiFi(context)) {
                Log.d(LOG_TAG, "On WiFi and charging, let's update");

                Intent intent = new Intent(context, MarketCollectionReceiver.class);
                intent.setAction(Constants.SCHEDULE_BACKGROUND);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 
                    PendingIntent.FLAG_UPDATE_CURRENT);

                ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
                    .setInexactRepeating(AlarmManager.RTC_WAKEUP,
                        System.currentTimeMillis(),
                        AlarmManager.INTERVAL_HALF_HOUR,
                        pendingIntent);
            }
   
            ComponentName componentName = new ComponentName(
                context,
                ConnectivityBroadcastReceiver.class);          
            context.getPackageManager()
                .setComponentEnabledSetting(componentName,
                 PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                 PackageManager.DONT_KILL_APP);
        }
        else {
            Log.d(LOG_TAG, "Not charging anymore. Hold off in any new updates");
                
            Intent intent = new Intent(context, MarketCollectionReceiver.class);
            intent.setAction(Constants.SCHEDULE_BACKGROUND);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 
                PendingIntent.FLAG_UPDATE_CURRENT);

            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
                .cancel(pendingIntent);
   
            SharedPreferences pref = context.getSharedPreferences(
                Constants.PREFERENCES, Context.MODE_PRIVATE);

            boolean areWeWaitingForConnectivity = 
                pref.getBoolean(Constants.PREFERENCE_STATUS_WAITING_FOR_CONNECTIVITY, false);
   
            if (!areWeWaitingForConnectivity) {
                ComponentName componentName = new ComponentName(context, 
                    ConnectivityBroadcastReceiver.class);
                context.getPackageManager().setComponentEnabledSetting(
                   componentName, 
                   PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
                   PackageManager.DONT_KILL_APP);
            }
        }
    }
}
&lt;/code&gt;
&lt;/pre&gt;
Looks more complicated than what really is. Let's go step by step. The very first line asks whether the battery is plugged in or not. Here is that code:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public boolean isTheBatteryPluggedIn(Context context) {
    Intent batteryIntent = context.getApplicationContext()
        .registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
 
    int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    return plugged == BatteryManager.BATTERY_PLUGGED_AC 
        || plugged == BatteryManager.BATTERY_PLUGGED_USB;
}
&lt;/code&gt;&lt;/pre&gt;
Then we ask whether we are using WiFi:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public static boolean areWeUsingWiFi(Context context) {
    ConnectivityManager connectivityManager = 
        (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
  
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    boolean isConnected = networkInfo != null ? networkInfo.isConnected() : false;
    boolean isWiFi = isConnected 
        ? networkInfo.getType() == ConnectivityManager.TYPE_WIFI : false;

    return isWiFi;
}
&lt;/code&gt;&lt;/pre&gt;
In case both conditions are true updates are safe, so we can schedule a regular update using the &lt;a href="http://developer.android.com/reference/android/app/AlarmManager.html" target="_blank"&gt;AlarmManager&lt;/a&gt; service. Note how these updates will be performed every 30 minutes since the user is not necessarily using the application.&lt;br /&gt;
&lt;br /&gt;
After the update is scheduled, another important thing is done in the code: a BroadcastReceiver for connectivity updates is enabled. Why? Because we need to be notified as soon as the user is not longer connected to the WiFi network. Since connectivity updates are very&amp;nbsp;frequent, we don't want to keep the BroadcastReceiver enabled all the time, so we enable and disable it as needed.&lt;br /&gt;
&lt;br /&gt;
Now, what happens if the battery is not plugged in? Well, we need to hold off in any new updates, so we go ahead and cancel any pending schedule. Also, if we are not actively waiting for the device to go back online, we can also disable the connectivity BroadcastReceiver until we get back plugged in to the wall. Pay special attention to the &lt;code&gt;areWeWaitingForConnectivity&lt;/code&gt; flag. This is going to be true in case an error&amp;nbsp;occurred&amp;nbsp;while updating and we are waiting for the connectivity to come back to re-run the update.&lt;br /&gt;
&lt;h4&gt;

The ConnectivityBroadcastReceiver&lt;/h4&gt;
First, we need to declare our receiver in the manifest file. Note how we want it to be disabled by default. Our code will take care of enabling it only when necessary:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-xml"&gt; &amp;lt;receiver
    android:name=".receivers.ConnectivityBroadcastReceiver"
    android:enabled="false"
    android:exported="false" &amp;gt;
    &amp;lt;intent-filter&amp;gt;
        &amp;lt;action android:name="android.net.conn.CONNECTIVITY_CHANGE" /&amp;gt;
        &amp;lt;/intent-filter&amp;gt;
&amp;lt;/receiver&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
Then the Java class:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public class ConnectivityBroadcastReceiver extends BroadcastReceiver {
    private final static String LOG_TAG = ConnectivityBroadcastReceiver.class.getName();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (areWeOnline(context)) {
            SharedPreferences pref = context.getSharedPreferences(Constants.PREFERENCES, 
                Context.MODE_PRIVATE);
            boolean wereWeWaitingForConnectivity = sharedPreferences.getBoolean(
                Constants.PREFERENCE_STATUS_WAITING_FOR_CONNECTIVITY, false);

            if (wereWeWaitingForConnectivity) {
                Log.d(LOG_TAG, "Connectivity was just re-established, let's update.");
            
                DataProvider.startStockQuoteCollectorService(context, null);

                ComponentName componentName = new ComponentName(
                    context, ConnectivityBroadcastReceiver.class);
                context.getPackageManager().setComponentEnabledSetting(
                   componentName, 
                   PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
                   PackageManager.DONT_KILL_APP);
            }       
            else {
                if (areWeUsingWiFi(context)) {
                    if (isTheBatteryPluggedIn(context)) {
                        Log.d(LOG_TAG, "We are on WiFi and charging, so let's update");

                        Intent intent = new Intent(context, MarketCollectionReceiver.class);
                        intent.setAction(Constants.SCHEDULE_BACKGROUND);
                        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                            intent, 
                            PendingIntent.FLAG_UPDATE_CURRENT);

                        ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
                            .setInexactRepeating(AlarmManager.RTC_WAKEUP,
                                System.currentTimeMillis(),
                                AlarmManager.INTERVAL_HALF_HOUR,
                                pendingIntent);
                   }
               }
               else {
                   Log.d(LOG_TAG, "We aren't using WiFi, so don't update");

                   Intent intent = new Intent(context, MarketCollectionReceiver.class);
                   intent.setAction(Constants.SCHEDULE_BACKGROUND);
                   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                       intent, 
                       PendingIntent.FLAG_UPDATE_CURRENT);

                   ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
                       .cancel(pendingIntent);
               }
           }
       }
       else {
           Log.d(LOG_TAG, "We aren't online so don't update.");

           Intent intent = new Intent(context, MarketCollectionReceiver.class);
           intent.setAction(Constants.SCHEDULE_BACKGROUND);
           PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 
               PendingIntent.FLAG_UPDATE_CURRENT);

           ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
               .cancel(pendingIntent);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
Very similar to the BatteryBroadcastReceiver, but in this case we start asking if we are online (not only on a WiFi, but with any Internet access):
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public boolean areWeOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager)     
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    return networkInfo != null ? networkInfo.isConnected() : false;
}
&lt;/code&gt;&lt;/pre&gt;
If we are, and we were waiting for the connectivity to come back (an error occurred while updating), then we run an update immediately and disable the BroadcastReceiver. If we don't need an immediate update, then we ask whether the battery is plugged in, and we are on a WiFi connection. From there, everything is pretty much the same to the BatteryBroadcastReceiver.&lt;br /&gt;
&lt;h4&gt;
Receiving alarms and firing updates&lt;/h4&gt;
These two BroadcastReceivers work pretty well in&amp;nbsp;conjunction&amp;nbsp;to schedule our background updates, but there's another piece they need to fire up the updates: another BroadcastReceiver that's going to be kicked off by the scheduled alarms. Round of&amp;nbsp;applauses&amp;nbsp;for our MarketCollectionReceiver:&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;public class MarketCollectionReceiver extends BroadcastReceiver {
    private final static String LOG_TAG = MarketCollectionReceiver.class.getName();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Constants.SCHEDULE_RETRY)) {
            SharedPreferences pref = context.getSharedPreferences(
                Constants.PREFERENCES, Context.MODE_PRIVATE);

            boolean retrying = pref.getBoolean(
                Constants.PREFERENCE_COLLECTOR_RETRYING, false);

            if (retrying) {
                Log.d(LOG_TAG, "Retrying update...");
                DataProvider.startStockQuoteCollectorService(context, null);
            }
            else {
                Log.d(LOG_TAG, "Update was already successfully performed");
            }
        }
        else if (intent.getAction().equals(Constants.SCHEDULE_BACKGROUND)) {
            if (isTheBatteryPluggedIn(context) &amp;amp;&amp;amp; areWeUsingWiFi(context)) {
                Log.d(LOG_TAG, "Performing background update...");
                DataProvider.startStockQuoteCollectorService(context, null);
            }
            else {
                Log.d(LOG_TAG, "We are not longer able to perform background updates");
                Intent intent = new Intent(context, MarketCollectionReceiver.class);
                intent.setAction(Constants.SCHEDULE_BACKGROUND);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                    intent, 
                    PendingIntent.FLAG_UPDATE_CURRENT);

                ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE))
                    .cancel(pendingIntent);
            }
        }
        else if (intent.getAction().equals(Constants.SCHEDULE_AUTOMATIC)) {
            Log.d(LOG_TAG, "Performing automatic update");
            DataProvider.startStockQuoteCollectorService(context, null);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
If you take a closer look to the code above, you'll notice that this BroadcastReceiver is using the action of the passed Intent to determine what kind of update was scheduled. In our Battery and Connectivity broadcast receivers we only use "BACKGROUND" updates, but the application uses three different types: BACKGROUND, RETRY, and AUTOMATIC. When the device is plugged in, and is on WiFi, we fire a BACKGROUND update. If an error occurs while updating, we fire a RETRY update. If the user is actively using the application or a new ticker is added, we fire an AUTOMATIC update. The rest of the code, should be self-explanatory.&lt;br /&gt;
&lt;h4&gt;Now, what about our back-off updates?&lt;/h4&gt;

That happens when the update occurs. I'm not going to post the entire &lt;a href="http://developer.android.com/reference/android/app/Service.html" target="_blank"&gt;Service&lt;/a&gt; that takes care of the updates, but just the relevant sections:
&lt;br /&gt;
&lt;pre class="prettyprint"&gt;&lt;code class="language-java"&gt;...
int retries = sharedPreferences.getInt(Constants.PREFERENCE_COLLECTOR_RETRIES, 0);
...                 

if (retrying || wereWeWaitingForConnectivity || areWeUpdatingOnlyOneTicker 
    || (!areWeUpdatingOnlyOneTicker 
        &amp;amp;&amp;amp; currentTime - lastUpdate &amp;gt; Constants.COLLECTOR_MIN_REFRESH_INTERVAL)) {
    try {
        update(...);
 Log.d(LOG_TAG, "Update was successfully completed");
 ...
    }
    catch (Exception e) {
        Log.e(LOG_TAG, "Update failed.", e);
    
 if (areWeOnline(this)) {
     Log.d(LOG_TAG, "Scheduling an alarm for retrying the update...");

            retries++;

            Editor editor = sharedPreferences.edit();
            editor.putBoolean(Constants.PREFERENCE_COLLECTOR_RETRYING, true);
            editor.putInt(Constants.PREFERENCE_COLLECTOR_RETRIES, retries);
            editor.commit();

            long interval = Constants.COLLECTOR_MIN_RETRY_INTERVAL * retries;
            if (interval &amp;gt; Constants.COLLECTOR_MAX_REFRESH_INTERVAL) {
                interval = Constants.COLLECTOR_MAX_REFRESH_INTERVAL;
            }                     
  
            Intent intent = new Intent(context, MarketCollectionReceiver.class);
            intent.setAction(Constants.SCHEDULE_RETRY);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                intent, 
                PendingIntent.FLAG_UPDATE_CURRENT);
     
            ((AlarmManager) getSystemService(Context.ALARM_SERVICE))
                .set(AlarmManager.RTC, 
                    System.currentTimeMillis() + interval, 
                    pendingIntent);
        }
 else {
     Log.d(LOG_TAG, "We are not online.");
     
            Editor editor = sharedPreferences.edit();
     editor.putBoolean(
                Constants.PREFERENCE_STATUS_WAITING_FOR_CONNECTIVITY, true);
            editor.commit();
     
            ComponentName componentName = 
                new ComponentName(this, ConnectivityBroadcastReceiver.class);
            getPackageManager().setComponentEnabledSetting(
                componentName, 
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
        }
    }
} 
&lt;/code&gt;&lt;/pre&gt;
First, note the &lt;code&gt;retries&lt;/code&gt; variable. Every time an error occurs, we increment a counter and save it in our preferences. The next update will use this value to delay every update and avoid retries when the server is&amp;nbsp;continuously&amp;nbsp;failing. Note how in this case we set up the alarm with a RETRY action. In case we are online when the error occurs, then we set the flag &lt;code&gt;WAITING_FOR_CONNECTIVITY&lt;/code&gt; and enable our ConnectivityBroadcastReceiver to get notified as soon as we are back online.
&lt;br /&gt;
&lt;br /&gt;
The other bit of code to pay attention is the flag &lt;code&gt;areWeUpdatingOnlyOneTicker&lt;/code&gt;. Although I didn't post the section where this flag gets initialized, it means than the user added a new ticker to the dashboard and we need to run an update just for it.&lt;br /&gt;
&lt;h4&gt;It's a lot, I know&lt;/h4&gt;

Yes, it gets tricky, verbose, and it's easy to loose track of every component. By reading back what I just wrote I'm realizing how painful is for developers to take care of so many details. Some day this will get done for us under the hood, or we won't need to worry anymore when technology gets to a point where battery and connectivity are not longer a concern. Unfortunately we are not there yet, and this topic is really important if we want to develop an application that doesn't kill our devices.&lt;br /&gt;
&lt;br /&gt;
Read closely. Try for yourself, and &lt;a href="https://plus.google.com/102420615329557248749/posts" target="_blank"&gt;ask&lt;/a&gt; if you get lost.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=T_OSQw5bmpk:sEp1P7ncIbM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=T_OSQw5bmpk:sEp1P7ncIbM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=T_OSQw5bmpk:sEp1P7ncIbM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=T_OSQw5bmpk:sEp1P7ncIbM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/T_OSQw5bmpk" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-27T22:48:26.157-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/connectivity-and-battery-life-in.html</feedburner:origLink></item><item><title>It just works</title><link>http://feedproxy.google.com/~r/svpino/~3/mcA9b3tkZ-g/it-just-works.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Sun, 15 Jul 2012 19:18:09 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-6148528693646059844</guid><description>From the Android &lt;a href="http://developer.android.com/tools/device.html" target="_blank"&gt;documentation&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;
If you're developing on Windows, you need to install a USB driver for adb. For an installation guide and links to OEM drivers, see the OEM USB Drivers document.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;If you're developing on Mac OS X, &lt;b&gt;it just works&lt;/b&gt;. Skip this step.&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
If you're developing on Ubuntu Linux, you need to add a udev rules file that contains a USB configuration for each type of device you want to use for development. In the rules file, each device manufacturer is identified by a unique vendor ID, as specified by the ATTR{idVendor} property. For a list of vendor IDs, see USB Vendor IDs, below.&lt;/blockquote&gt;
See where I'm going here?&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=mcA9b3tkZ-g:exOdazOPtws:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=mcA9b3tkZ-g:exOdazOPtws:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=mcA9b3tkZ-g:exOdazOPtws:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=mcA9b3tkZ-g:exOdazOPtws:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/mcA9b3tkZ-g" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-15T22:18:09.441-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/it-just-works.html</feedburner:origLink></item><item><title>Stocktile sees the light</title><link>http://feedproxy.google.com/~r/svpino/~3/s1K_FDoaAGQ/stocktile-sees-light.html</link><category>android</category><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Fri, 27 Jul 2012 19:59:54 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-2554584254030774186</guid><description>&lt;a href="https://plus.google.com/102420615329557248749/posts/GvLeVPZUBFN" target="_blank"&gt;Finally! Stocktile is out!&lt;/a&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;After 4 weeks of long nights in front of my computer, Stocktile is live on Google Play in two different versions: &lt;/span&gt;&lt;a href="http://goo.gl/WymqT" style="background-color: white;" target="_blank"&gt;Lite&lt;/a&gt;&lt;span style="background-color: white;"&gt; and &lt;/span&gt;&lt;a href="http://goo.gl/LxFr5" style="background-color: white;" target="_blank"&gt;HD&lt;/a&gt;&lt;span style="background-color: white;"&gt;. Mostly, I'm glad because now I get to use an application that does exactly what I want... nothing less, nothing more. If you want to see some screenshots, follow any of the links above.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
What I've learnt has been huge. Lots and lots of things to share about the Android platform. Let's see what can I put together when I get my strength back from this past month.&lt;br /&gt;
&lt;br /&gt;
Before going to bed, I do want to share the main lesson from these days. Copied from a tweet I posted 4 days ago:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Main challenge: The web is always online. Mobile applications are not. It's an entire layer of complexity added to our applications.&lt;/blockquote&gt;
Think about it.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s1K_FDoaAGQ:kfxpd2HkHS0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s1K_FDoaAGQ:kfxpd2HkHS0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=s1K_FDoaAGQ:kfxpd2HkHS0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=s1K_FDoaAGQ:kfxpd2HkHS0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/s1K_FDoaAGQ" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-27T22:59:54.261-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/stocktile-sees-light.html</feedburner:origLink></item><item><title>Playing a little bit with functional programming</title><link>http://feedproxy.google.com/~r/svpino/~3/nWNCJETthr0/playing-little-bit-with-functional.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Mon, 02 Jul 2012 23:25:38 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-421578804242244787</guid><description>You should start reading "&lt;a href="http://blog.csnmedia.me/functional-programming-why-should-we-care/" target="_blank"&gt;Functional Programming - Why should we care?&lt;/a&gt;" and take a look to the example C# code at the end of the article.&lt;br /&gt;
&lt;br /&gt;
Then, if you are more of a Java fan, move onto "&lt;a href="http://blog.csnmedia.me/functional-programming-rewriting-the-example-in-java/" target="_blank"&gt;Functional Programming - Rewriting the example in Java&lt;/a&gt;" to see how to do the same thing without delegates and Lambda expressions.&lt;br /&gt;
&lt;br /&gt;
Yes, the second article is mine (not the first one, though). I will be posting from time to time in my company's blog and linking the articles here.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=nWNCJETthr0:XVcDkbdBPqo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=nWNCJETthr0:XVcDkbdBPqo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=nWNCJETthr0:XVcDkbdBPqo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=nWNCJETthr0:XVcDkbdBPqo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/nWNCJETthr0" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-03T02:25:38.236-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/07/playing-little-bit-with-functional.html</feedburner:origLink></item><item><title>Google I/O is about to start...</title><link>http://feedproxy.google.com/~r/svpino/~3/5ZNrFeIR5qo/google-io-is-about-to-start.html</link><author>noreply@blogger.com (Santiago L. Valdarrama)</author><pubDate>Tue, 26 Jun 2012 22:00:00 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-680221312449535657.post-3841481855443246551</guid><description>Just a few more hours... I'm super excited about the Android sessions. Can't wait to see what Google pulls off.

We'll see soon enough.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5ZNrFeIR5qo:gfZfLD5SnNk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5ZNrFeIR5qo:gfZfLD5SnNk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?i=5ZNrFeIR5qo:gfZfLD5SnNk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/svpino?a=5ZNrFeIR5qo:gfZfLD5SnNk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/svpino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/svpino/~4/5ZNrFeIR5qo" height="1" width="1"/&gt;</description><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-27T01:00:00.180-04:00</app:edited><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentSource" value="1" /><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://blog.svpino.com/2012/06/google-io-is-about-to-start.html</feedburner:origLink></item><media:rating>nonadult</media:rating></channel></rss>
