<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Dash of Web and Mobile Development</title>
	<atom:link href="http://blog.iangclifton.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.iangclifton.com</link>
	<description>Discussing trends and technologies in web and mobile development</description>
	<lastBuildDate>Fri, 03 Feb 2012 05:15:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Working Conditions In Chinese Factories</title>
		<link>http://blog.iangclifton.com/2012/02/02/working-conditions-in-chinese-factories/</link>
		<comments>http://blog.iangclifton.com/2012/02/02/working-conditions-in-chinese-factories/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 05:15:35 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Opinion / Just Talking]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[china]]></category>
		<category><![CDATA[foxconn]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[motorola]]></category>
		<category><![CDATA[samsung]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=531</guid>
		<description><![CDATA[The average user never really sees the internals of a phone; those of us who care a little more might look through the latest photos from an ifixit teardown. But how often do we really think about the process that &#8230; <a href="http://blog.iangclifton.com/2012/02/02/working-conditions-in-chinese-factories/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The average user never really sees the internals of a phone; those of us who care a little more might look through the latest photos from an <a href="http://www.ifixit.com/Teardown">ifixit teardown</a>.  But how often do we really think about the process that goes into making our devices?</p>
<p>I made the assumption that the chips were designed by very smart people with the aid of computers, the construction of each component was done by sophisticated machines, and the human workers along the process were largely limited to final assembly and testing.  I was quite wrong.<span id="more-531"></span></p>
<p>By now you&#8217;ve surely heard of (and hopefully read) the New York Times article <a href="http://www.nytimes.com/2012/01/26/business/ieconomy-apples-ipad-and-the-human-costs-for-workers-in-china.html?_r=2&#038;pagewanted=1">Apple&#8217;s iPad and the Human Costs for Workers in China</a>.  Another good source for information about the topic is <a href="http://www.thisamericanlife.org/radio-archives/episode/454/transcript">Mike Daisey and the Apple Factory</a>.  Both of these tell of the horrendous factory conditions in China.</p>
<p>Although Foxconn is the most common manufacturer that we see complaints about, it&#8217;s not the only one with problems and Apple isn&#8217;t the only company that uses Foxconn (both Motorola and Samsung employ Foxconn for some of their work).  Regardless, Foxconn has had the most major, publicized problems, including deadly accidents and worker suicides, and many of those have been tied to Apple&#8217;s iOS products in particular.  As outraged as I was after learning more about these conditions, I figured Apple&#8217;s users would be even more upset, so I browsed some sites looking at forums and comments and was rather disheartened.</p>
<p>AppleInsider published an article called <a href="http://www.appleinsider.com/articles/12/01/25/former_executives_accuse_apple_of_ignoring_supplier_labor_abuses.html">Former executives accuse Apple of ignoring supplier labor abuses</a> that outlined a few of the points from the NYT article.  Here are some example responses:</p>
<blockquote><p>So cowards are willing to make accusations without providing evidence or their manes[sic].<br />
What a joke.</p>
<p>Give us name and dates&#8230;. &#8212; Patranus</p></blockquote>
<p>Apparently anonymity means the info is invalid (well, except in the latest iDevice rumors, of course).</p>
<blockquote><p>&#8230;.what&#8217;s even more pitiful is to blame Apple for a Chinese Corporations[sic] bylaws and worker right conditions&#8211;China is responsible for them. &#8212; mdriftmeyer</p></blockquote>
<p>In other words, humanity doesn&#8217;t cross borders.</p>
<blockquote><p>The truth is 99.9999% of those workers are thankful of Apple for their jobs. Their standard of living has increased tremendously since having worked in the rice paddies for a third of the pay. &#8212; Dickprinter</p></blockquote>
<p>I doubt this, but even if it were true, it doesn&#8217;t validate the terrible conditions for these workers.</p>
<blockquote><p>Why? Is Apple guilty of everything they are accused of until we prove them innocent?<br />
Or is it the job the shadowy accusers to bring the proof? &#8212; Suddenly Newton</p></blockquote>
<p>No, they&#8217;re not guilty of everything unless there is proof, which has already surfaced and is continuing to be revealed.  There&#8217;s at least enough evidence to warrant an investigation, and not just of the production lines that develop Apple&#8217;s devices.  I doubt if Apple is guilty of violating any laws, but laws and morals aren&#8217;t always aligned.</p>
<p>To be fair, AppleInsider tends to be extremely pro-Apple and highly focused on the value of Apple as a company (as opposed to Apple&#8217;s values).  Comments there often focus on stocks and profits as the only measurements of success for a company.  So I checked MacRumors article <a href="http://www.macrumors.com/2012/01/26/former-apple-executives-address-working-conditions-in-suppliers-factories/">Former Apple Executives Address Working Conditions in Suppliers&#8217; Factories</a></p>
<blockquote><p>The sad truth is that we want cheaper products so they use countries with lower wages and worse working/living environments. If we&#8217;d all accept a 300% jump in the cost of electronics we could manufacturer everything locally. &#8212; AppleDroid</p></blockquote>
<p>Finally, a reasonable post!  The thing is, we don&#8217;t <em>need</em> to manufacture electronics locally.  Apple has about $100,000,000,000.00 ($100 billion) in the bank, so they can clearly afford to pay manufacturers extra and build in clauses to their contracts with these manufacturers requiring that extra amount is used to improve workers&#8217; conditions.</p>
<blockquote><p>&#8230;news like this sheds light on corporate responsibility being more of a marketing term than a way of doing business. As a company currently sitting with $97.6 BILLION dollars in CASH ON HAND, they should dramatically improve the working conditions and lives of people who make their products, not have an attitude of &#8220;well everyone else does it.&#8221; While their position is popular on this forum, it&#8217;s not right. &#8212; theheadguy</p></blockquote>
<p>Well said!</p>
<blockquote><p>Looks like the Times is aiming for a Pulitzer. No coincidence that they released the story after Apple announced earnings. </p>
<p>While this is a huge problem, it is not an Apple problem; it&#8217;s a worldwide one. The media likes to attach Apple&#8217;s name to these stories because Apple stories = eyeballs. &#8212; rdowns</p></blockquote>
<p>I&#8217;m sure it isn&#8217;t a coincidence.  Apple pulling in $13 billion dollars in profit and workers dying, being subject to neurotoxins, etc. makes for a harse contrast.  The extra eyeballs can help bring change, and Apple is in the best position of any tech company to make changes.</p>
<blockquote><p>Americans may not be so inclined to complain about conditions elsewhere when they realize how much more they would have to pay for the crap they buy if everything was like conditions in America. &#8212; Undecided</p></blockquote>
<p>In other words, Americans might care more about money than human lives.  Sure, some will, but I think that&#8217;s a very tiny portion of people when the real situation is brought to light.  We&#8217;re talking about the cost of making manufacturing conditions <em>safe</em> instead of working people >60 hours per week in hazardous environments.</p>
<p>All-in-all the Mac Rumors comments were far more informed and intelligent responses than the AppleInsider comments; further, most of the heartless comments were downvoted to some extent.  9to5mac had comments fairly similar to those of Mac Rumors.</p>
<p>Finally, responses from a couple of big Apple fans.  The first comes from MG Siegler&#8217;s <a href="http://parislemon.com/post/16561630035/this-is-why-we-cant-have-nice-things">This Is Why We Can&#8217;t Have Nice Things</a> post; the second is from <a href="http://daringfireball.net/linked/2012/january">John Gruber&#8217;s site</a> (he doesn&#8217;t appear to make direct links available).</p>
<blockquote><p>The post focuses on Apple because Apple is now arguably the most successful company on the planet. If they were, say, the 8th largest computer manufacturer, they probably wouldn’t have even been mentioned&#8230;.</p>
<p>Does that excuse Apple’s behavior in some situations? Not at all. But there also isn’t enough background here to know if Apple is even the worst enabler of these poor working conditions. </p>
<p>&#8230;The fact of the matter is that we live in a world that demands amazing technology delivered to us at low costs and at great speed. That world leads to Foxconn. &#8212; MG Siegler</p></blockquote>
<p>I felt like Siegler&#8217;s post tries to satisfy both parties, the pro-Apple side and the let&#8217;s-do-something-about-it side.  His comments boil down to &#8220;Well, it sounds bad, but we can&#8217;t fully trust NYT and plus there are probably some other companies that are worse.  Also, we want cheap electronics.&#8221;  I disagree that this has to lead to Foxconn, and I also think it&#8217;s likely that Apple is among the worst offenders because they have more clout than a smaller company and a few of the quotes indicate as much.  Regardless of who is the worst, Apple is making more than enough money to do something without raising the cost of their electronics, so it&#8217;s not a matter of &#8220;Is Apple the worst&#8221; but rather &#8220;What can we do about it?&#8221;</p>
<blockquote><p><a href="http://9to5mac.com/2012/01/26/tim-cook-responds-to-claims-of-factory-worker-mistreatment-we-care-about-every-worker-in-our-supply-chain/">Tim Cook responded</a> in a company-wide email. &#8212; John Gruber</p></blockquote>
<p>Either Gruber simply doesn&#8217;t care about the NYT story or he fully supports Tim Cook&#8217;s (Apple&#8217;s) position.  He tends to be a man of few words when it comes to commenting on many stories, but he will write more than a sentence when it&#8217;s important to him (such as like how he thinks the Android buttons are &#8220;broken&#8221;).</p>
<p>Cook basically said, &#8220;We do a lot and anyone who says otherwise is lying.&#8221;  He points to the <a href="http://www.apple.com/supplierresponsibility/">Apple supplier responsibility site</a>, which (even if 100% accurate) still shows only 38% of the companies Apple audited meet the working hours requirements established in Apple&#8217;s Code of Conduct.  In 2011 it was 32%.  In 2010 it was 46%.  In 2009 it was 41%.  Not great numbers.</p>
<p>The simple fact of the matter is that Apple has been pointed out as they&#8217;ve got more than enough money to do something about it and many of the major articles related to deaths and injuries at these manufacturing companies have been tied to Apple.  Is that fair?  Probably not.  Does it matter if it&#8217;s fair?  No.  The point is, awareness of the issue needs to be raised in order to make something happen.  After all, when enough people compained about the iPhone 4 dropping calls, Apple gave in and offered free bumper cases.  If enough people complain about the dangerous conditions at manufacturers, Apple will be willing to do more about the conditions.  Hopefully Apple won&#8217;t have to lead the way for technology companies to expect more from their suppliers, but it&#8217;s better than ignoring the issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2012/02/02/working-conditions-in-chinese-factories/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Android Lover&#8217;s Take On The iPhone 4S</title>
		<link>http://blog.iangclifton.com/2011/12/18/an-android-lovers-take-on-the-iphone-4s/</link>
		<comments>http://blog.iangclifton.com/2011/12/18/an-android-lovers-take-on-the-iphone-4s/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 02:57:24 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Mobile Devices]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[galaxy nexus]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ice cream sandwich]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ios 5]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[parody]]></category>
		<category><![CDATA[sarcasm]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=526</guid>
		<description><![CDATA[So what about the iPhone 4S? First and foremost, the iPhone is way too small. The 3.5 inch screen is nice when I&#8217;m holding it 8 inches from my eye, but out and about it feels like my hands belong &#8230; <a href="http://blog.iangclifton.com/2011/12/18/an-android-lovers-take-on-the-iphone-4s/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So what about the iPhone 4S?</p>
<p>First and foremost, the iPhone is way too small.  The 3.5 inch screen is nice when I&#8217;m holding it 8 inches from my eye, but out and about it feels like my hands belong to Andre the Giant.  I try to touch the screen and my thumb covers at least 10% of the surface area.  How can you have accurate touches like that?  I guess I should file down my thumbs and fingers.  It&#8217;s so tiny that it killed all two-handed operations for me (especially since you can barely fit two thumbs side by side).  I&#8217;ll admit that for some pockets, having a tiny screen is nice, but 4.3 inches might be better.  This is just too small.</p>
<p>While the screen is too small, I&#8217;m happy that Apple has stuck to their decision to have one button that does different things depending on what version of the OS you have and how many times you press it and even how slow your presses are.  It&#8217;s like opening a Christmas present every time I press the home button.  Will I go to the home screen?  The search screen?  The recent apps?  The Siri frontend for Wolfram Alpha?  The music app?</p>
<p>To be fair, the small screen on the iPhone did introduce me to some new people.  I heard that you can do a five-finger swipe to bring up the multitasking bar, but I couldn&#8217;t fit five fingers on the screen, so I had to go to Starbucks to find some fellow Apple users with smaller fingers to try.  Then I found out that gesture just works on iPad.  When will Apple develop a consistent user experience?</p>
<p>I like the missing software back button that is always in one place like on the Galaxy Nexus.  On the iPhone, you can have it sometimes be in the top left with the word &#8220;Back&#8221; or &#8220;Home&#8221; or something else, or at the top right with the word &#8220;Done&#8221; or at the bottom as a &#8220;Cancel&#8221; button.  This forces the user to be much more aware of the UI and whether something is a modal dialog, an action sheet, or whatever else.  (Of course, the iPhone still has a power/wake button on the top.)</p>
<p>I also like the lack of indicator light on the iPhone.  It&#8217;s helpful because I can make sure everyone knows I use Apple products since I have to always hold up my phone to turn it on to check for messages and people can see my important Apple logo and know that I&#8217;m creative.  Why Samsung included a multi-color indicator light that tells me exactly what I missed without turning on the device, I will never understand.</p>
<p>The rest of the iPhone hardware leaves something to be desired.  The Galaxy Nexus feels like a completely and thoughtfully designed product.  By comparison, the iPhone is made of glass, something we intuitively think of as fragile.  It&#8217;s also heavy/dense, giving it the consistant feeling of 80s technology that goes well with the click of the home button (or double click or long click or&#8230;).  It&#8217;s not awful, but you&#8217;d think Apple could do better at this point.  Some people will like not having the option to remove the back to get at the battery because that makes the iPhone almost as thin and as light as the Galaxy Nexus and gives you an excuse to buy a new phone every year.</p>
<p>The battery life itself is very good.  I felt like the iPhone was lasting at least as long as the Galaxy Nexus on a fully charged battery, perhaps even a bit longer in some cases.  Of course, I don&#8217;t have to worry about having the option of using it on 4G and possibly lowering the battery life.</p>
<p>The camera on the iPhone 4S is definitely worse than the Galaxy Nexus in both terms of front-facing camera (the 4S has a measly VGA camera and the Galaxy Nexus has a front-facing camera capable of 720p&#8230; a resolution the iPhone can&#8217;t even display) and in speed.  If you want to get a picture of where something exciting was happening two seconds ago, the iPhone 4S will not let you down.  Just press the shutter button when the scene is composed and you&#8217;ll get the scene that happens two seconds later.  It&#8217;s like time travel.</p>
<p>And let&#8217;s talk about iOS 5.  There is no question that the software is much improved over previous iterations in terms of copying Android&#8217;s notification system (though improved with X close buttons that are polished so much that they shrank to a size where you need a 2-year-old&#8217;s pinky to press them) and supporting Twitter.  You know an OS has improved when Twitter is a selling point.</p>
<p>Unfortunately, the system still lacks much of the features that Android users enjoy.  The majority of iOS users will probably think such criticism is bullshit, but that has always been the case.  I imagine it&#8217;s probably pretty hard for a person who bought the car that made the most sense to him or her to explain to the person who bought a Prius because it was popular how perception affects the driving experience.  The person with a personally-fitting car can attempt to explain why he or she likes a stick or more room, but the Prius owner will just believe that having the car pick gears for you is the best and would never spend enough time with any other car to appreciate the differences.</p>
<p>Still, if the iOS team ever wants to convert (or at least convice) most Android users, they still have quite a bit of work to do here.  Then again, they probably don&#8217;t (or shouldn&#8217;t) care too much about converting Android users over to iOS.  All the non-smartphone users out there remain the much bigger prize to go after (for both Apple and Google).</p>
<p>Other things that will sound like nits but drove me crazy with iOS 5 included having widgets only in the notification center.  If I am adding a widget, I clearly want to see it where I want it.  Why should I have to have it sit somewhere invisible that requires an extra swipe?  What&#8217;s the different between being on my homescreen and having to open a full weather app (iOS4) and being on the home screen and having to swipe down the notifications to see the weather widget (iOS5)?</p>
<p>Another: why do I have to go into the Google Voice app to make a phone call using my Google Voice number?  Google baked in support for alternate dialers into their OS; why didn&#8217;t Apple?  If they&#8217;re worried about competition, why did they finally approve the app after a year-and-a-half and an FCC inquiry?  Why is Siri letting people look at my private calendar while my phone is locked?  And why on Earth is the web browser not the desktop version of Safari yet!?</p>
<p>The new WiFi-syncing is nice &#8212; I love not having to find the proprietary cable.  But my god Apple needs help with iTunes.  I have to reboot my computer into an OS they support and leave it on while my phone is plugged into a power outlet.  As if iTunes weren&#8217;t already the worst software on the planet, I also have to waste a bunch of electricity keeping my computer on all the time in one of the two OSes Apple supports just to sync my data?</p>
<p>Apple&#8217;s universal support of voice dictation is a joke compared to Ice Cream Sandwich.</p>
<p>Some other authors have noted that iOS is ahead of Android when it comes to custom settings for apps, but I have to disagree.  Why do I have to leave an app to go find the settings app to change the settings for the app I was just in?  That&#8217;s completely illogical.  Of course, some apps support changing their settings within the app and others don&#8217;t, so now we get back to the inconsistancy problem present in the iOS experience.</p>
<p>When it comes to web browsers, arguably the most important feature of any of these devices, there is no question that Android still has a big edge here.  I&#8217;ve seen arguments on both sides for why iOS does not support third-party plugins&#8211;but doing a simple test proves that much of the web is still inaccessible from iOS.  Worse, many pages render as large missing tiles featuring a checkerbox to keep the illusion of scrolling smoothly, even beyond the point at which the actual page ends.  You try pinching to zoom and everything just stays fuzzy until your fingers stop moving.  How am I supposed to know if the text is large and clear enough if it just zooms in and out on fixed pixels?</p>
<p>You&#8217;ll also see a bit of impossibility in iOS when you do simple things like trying to attach a file to an existing email draft or trying to attach a second file or trying to store any arbitrary data on your device.  For the most part, iOS 5 does a good job of hiding its limitations, but there are plenty of times that you&#8217;ll still hit your head on a wall here and there.</p>
<p>The main problem I have with apps on iOS is that, well, they aren&#8217;t on iOS.  I try to find my favorite keyboard replacement (SwiftKey) and it&#8217;s nowhere to be found.  I try to get the ever-useful Wifi Analyzer, also not available.  I&#8217;ve heard that the entire experience has a lot more polish on iOS, especially with the Twitter integration, so I gave it a try.  I found one of my favorite links online and decided to open it on the Galaxy Nexus and the iPhone to verify it looked right.  For the Galaxy Nexus, I simply clicked the Chrome to Phone button and it instantly popped up on my device.  It looked good, so I long-pressed on the URL within the browser, picked share, selected my favorite Twitter app (hint: not the official one), and sent it with a tweet and a comment.  I tried that on iOS, which involved trying to type the long URL in by hand in the stock keyboard.  That was a pain, so I decided to long-press it in the Android browser again, share, and send it via Google Voice to the iPhone.  I opened it in the iPhone, it looked pretty much the same as on the Galaxy Nexus (though tiny), so I copied the URL, pressed the clicky home button (just once), scrolled to the right through ten screens of apps, opened a Twitter app, pasted it into the new tweet box along with a comment, and tweeted.</p>
<p>It&#8217;s these tangibles where Android holds the huge advantage.  And just like in sports, you can clearly teach the fundamentals.  At some point, Apple may simple have to acknowledge that Android works better than iOS because Android&#8217;s entire open concept is woven into the product.  Apps can properly communicate to each other without having to know of the other apps.  The user can do what he or she wants.  Even the launcher app can be replaced.  Apple&#8217;s strengths are elsewhere; they should embrace that.</p>
<p>Apple has done some very nice work here.  Both the iPhone 4S and iOS5 are a new pinnacle of the iOS platform.  But in the end, it still comes down to something very simple: which device do I want to use day-to-day?  Which phone do I reach for when I&#8217;m not doing a review?  It&#8217;s still an Android phone.  Without question.</p>
<p>Keep at it, Apple.</p>
<p>(For those who don&#8217;t know, this is a parody on the post MG Siegler did called &#8220;<a href="http://techcrunch.com/2011/12/14/iphone-galaxy-nexus-review/">An iPhone Lover&#8217;s Take On The Galaxy Nexus</a>.&#8221;  I strongly recommend that you buy the phone that makes the most sense to you, whether it&#8217;s an Android phone, an iPhone, a Windows phone, or whatever.  Any useful review will highlight the strengths and weaknesses of a given device and never tell you that it&#8217;s the one-size-fit-all solution.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/12/18/an-android-lovers-take-on-the-iphone-4s/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Current Job And Projects</title>
		<link>http://blog.iangclifton.com/2011/11/01/current-job-and-projects/</link>
		<comments>http://blog.iangclifton.com/2011/11/01/current-job-and-projects/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 05:01:23 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Opinion / Just Talking]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[developer]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=517</guid>
		<description><![CDATA[I had expected to write this post quite a while ago. In fact, I mentioned my intent to write it at the end of my An Evolving Career Path post, but that career path changed more rapidly than I had &#8230; <a href="http://blog.iangclifton.com/2011/11/01/current-job-and-projects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I had expected to write this post quite a while ago.  In fact, I mentioned my intent to write it at the end of my <a href="/2011/08/09/an-evolving-career-path/">An Evolving Career Path</a> post, but that career path changed more rapidly than I had expected.  I am still doing Android development, but I am not doing any web dev (other than my personal projects).  I&#8217;m also taking on some other projects&#8230; but I&#8217;ll get to that shortly.<span id="more-517"></span></p>
<p>At the end of July, I moved on from Treemo Labs.  I already had a one-month contract in place for some simple Android developer work, so I was not taking any time off (well, after the extent to which I had been working, dropping to 8 hours a day felt like taking time off).  CBS Interactive also contacted me and talked to me about the possibility of a position there.  I flew down to Los Angeles to quickly meet everyone and get a more detailed explanation of what they were looking for (and let them know what I was looking for).  It was a great trip, and I finally got to put faces to many of the names I had worked with while at Treemo Labs via email and conference calls.</p>
<p>After a bit of negotiation, I accepted a position at CBS Interactive as a mobile developer, and I started to pack up, reserve an apartment, etc.  That&#8217;s the position I alluded to at the end of the other post.  Well, things changed rather suddenly when some contract agreements got in the way (business protection agreement legalese) that removed the posibility of me holding that position.  It was an unfortunate and unexpected turn of events that forced me to take a seat and consider my options.</p>
<p>There is no shortage of mobile development positions out there, but I wasn&#8217;t interested in making unexciting apps and I started to question whether moving out of the Seattle area would be worth it for me.  I was bombarded by recruiter emails offering great clients, unbeatable opportunities, and pleas to contact all my developer friends on the recruiters&#8217; behalf.  A few were interesting on the surface, and I pursued them while simultaneously considering the possibility of working for myself full time.</p>
<p>I created wireframes and documentation for a game I decided to develop (and <a href="http://twitter.com/#!/IanGClifton/status/107955561080950784">tweeted about it</a>).  With my excitement for that app growing, I determined a timeline for the game with a <a href="http://twitter.com/#!/IanGClifton/status/108413952928649216">mid-October alpha</a> and calculated out how long I could live without income.  Things were looking very positive.  Even if I didn&#8217;t make much on the game, I had plenty of time to ensure it was done well before having to consider looking for a job.  If nothing else, it would teach me a lot and be another bullet on the resume.</p>
<p>Then I was contacted by <a href="http://aro.com/">ARO</a>, a stealth-mode startup in Seattle.  I was intrigued, so I interviewed and found out about their goals&#8211;definitely some exciting stuff that could push mobile beyond where it is today.  I received an offer from them the next day.  Considering their goals, offer, and ability to move fast (vital for anywhere I work), I accepted the position.</p>
<p>So, I am a salaried employee at ARO, working on some awesome stuff and, now that I have time outside of work as well, I&#8217;ve been taking on some outside projects.  I wrote about <a href="http://blog.iangclifton.com/2011/10/23/android-for-programmers-an-app-driven-approach/">reviewing Android for Programmers</a> recently.  I am also going to be creating an Android video series for developers (details to come) that I&#8217;m very excited about.  In the near future, the app I&#8217;ve been developing for <a href="http://androidpolice.com">Android Police</a> will be coming out, and then I&#8217;ll spend a little more time on the Disease to Dust game (though I don&#8217;t expect a beta this year).  I&#8217;m sure I&#8217;ll spend a little time here and there on other projects (such as prepping <a href="http://iangclifton.com/apps/android/predator-clock-widget/">Predator Clock Widget</a> for improvements), but life is good right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/11/01/current-job-and-projects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android for Programmers: An App-Driven Approach</title>
		<link>http://blog.iangclifton.com/2011/10/23/android-for-programmers-an-app-driven-approach/</link>
		<comments>http://blog.iangclifton.com/2011/10/23/android-for-programmers-an-app-driven-approach/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 18:57:59 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Mobile Development]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[app]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[programmers]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=506</guid>
		<description><![CDATA[For the past few months, I spent some of my off time working as a technical editor/reviewer for an Android book called &#8220;Android for Programmers: An App-Driven Approach.&#8221; From a reader&#8217;s perspective, this is a great book to dive right &#8230; <a href="http://blog.iangclifton.com/2011/10/23/android-for-programmers-an-app-driven-approach/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.iangclifton.com/wp-content/uploads/2011/10/androidfp1.jpg"><img src="http://blog.iangclifton.com/wp-content/uploads/2011/10/androidfp1-114x150.jpg" alt="" title="Android for Programmers" width="114" height="150" class="alignleft size-thumbnail wp-image-510" /></a>For the past few months, I spent some of my off time working as a technical editor/reviewer for an Android book called &#8220;<a href="http://bit.ly/AndroidFP">Android for Programmers: An App-Driven Approach</a>.&#8221;  From a reader&#8217;s perspective, this is a great book to dive right into Android development because it actually creates an app in each chapter to explain specific concepts.  Other books often take the approach of pseudo-code or simplistic examples that demonstrate syntax but don&#8217;t really show how code is <em>actually used</em>.  Android for Programmers demonstrates each topic with real code.<span id="more-506"></span></p>
<p>As a reviewer, I found it interesting to see other people&#8217;s approaches, offering just a bit of guidance here and there to follow common/best practices used my most Android developers.  In one chapter in particular, you learn how to create a game called SpotOn that makes use of property animation (from Honeycomb) to create moving targets.  This is a great use of property animation that not only demonstrates a core feature in Honeycomb, it also shows how easily you can use the SDK to accomplish what would otherwise take a lot more code.</p>
<p>If you&#8217;re considering learning Android app development or know the basics but want to broaden your understanding, definitely take a look at <a href="http://bit.ly/AndroidFP">Android for Programmers: An App-Driven Approach</a>.  (And I don&#8217;t earn any royalties; I just love the &#8220;real code&#8221; approach that this book takes.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/10/23/android-for-programmers-an-app-driven-approach/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Lasik: Three Months Later</title>
		<link>http://blog.iangclifton.com/2011/09/17/lasik-three-months-later/</link>
		<comments>http://blog.iangclifton.com/2011/09/17/lasik-three-months-later/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 23:46:40 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Opinion / Just Talking]]></category>
		<category><![CDATA[lasik]]></category>
		<category><![CDATA[surgery]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/2011/09/17/lasik-three-months-later/</guid>
		<description><![CDATA[Some time around middle school, I realized that my eyes were pretty bad.  I prefered to sit toward the back of the classroom, so that meant I couldn&#8217;t read the whiteboard.  Eventually, I got glasses and contacts.  When I first &#8230; <a href="http://blog.iangclifton.com/2011/09/17/lasik-three-months-later/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Some time around middle school, I realized that my eyes were pretty bad.  I prefered to sit toward the back of the classroom, so that meant I couldn&#8217;t read the whiteboard.  Eventually, I got glasses and contacts.  When I first wore them, I remember being suprised that the Simpsons characters were drawn with a harsh black outline.  For me, they had always been fuzzy, soft-edged creations and the difference was striking.</p>
<p>For a variety of reasons, I finally decided to have Lasik surgery a bit over three months ago.  I had heavily researched it before, but I kept debating with myself before I determined that I should go through with it.  This post is a reflection on the surgery, recovery period, and overall experience.  This post might help you decide to have or not have Lasik surgery.  Note that prior to the examination that determines if you&#8217;re elligible for Lasik, you should be out of contacts for at least a week (and two weeks before the operation itself).<span id="more-501"></span></p>
<p>The first eye checkup I had, my eyes were carefully examined and topographically mapped by the technician.  Then I met with the doctor to review the options and discuss the fact that I have slightly larger-than-average pupils.  There are a variety of corrective eye surgeries to consider and, even after deciding on a specific one, there are options to evaluate.  Lasik essentially revolves around the idea of cutting a flap in the surface tissue of your eye that can be folded back so that a laser can reshape the cornea underneath.  The flap is then positioned back in place, which is what allows the healing process to be relatively fast.  You can choose to have the flap cut by a blade or by a laser (I opted for the precision of a laser) and then you can choose which type of reshaping treatment you have done, traditional or wavefront (which was my choice because it offers more precise and personal eye corrections).  Note that the checkup involved having my eyes dilated, so I recommend you either have some good sunglasses or a driver for the trip home.</p>
<p><strong>The Operation</strong><br />
The day of the operation, I didn&#8217;t have to worry about eating anything specific (though they did recommend avoiding alcohol for a few days as it can dry out the eyes).  I simply had to show up and have transportation available, since you cannot drive after the operation.  They did another quick check of my eyes to ensure that the measurements were the same and nothing had come up, and then they gave me some numbing drops in my eyes.</p>
<p>I sat and waited, relaxed but excited.  After fifteen minutes or so, the drops had done their job and I was led into the operating room.  I was told to lie down and get into position, so I did.  They did another quick check of my eyes before beginning.  The first step was to put some kind of clamps in place that would prevent me from blinking.  Once they were in place, I felt like my blinking was restricted but not in a painful or uncomfortable way.  Next, they applied a corneal suction ring.  As it was being applied, by vision dimmed and the laser cut the flap.  They lifted the flap and pulled it back, a strange process to experience.  I didn&#8217;t feel anything, but it was somewhat disconcerting to have all focus lost from my eyes.  I thought briefly, &#8220;This is what being blind could be like.&#8221;  Of course, I could still see a general sense of color but no detail at all.</p>
<p>I was then told that I would need to stay focused on the light for fifteen seconds while my cornea (more specifically, the stroma) was reshaped by the laser.  At that point I thought the light was just some kind of guide light, but it occurred to me later that it was probably the laser itself.  The light was so blurred that it took up much of my vision.  Imagine seeing a light through a foggy window and then blur that even more to have some concept of how unclear vision is at that point.  Once or twice, I had a hint of the smell of burning but never enough to really confirm that I was definitely smelling it and not just imagining it, since that had been one of my worries before the procedure (I really hate when you can smell burning tissue of any kind, even at the dentist&#8217;s office).  The other eye took a little longer since vision was slightly worse, but it was the same experience.</p>
<p>The flaps were positioned back over my eyes and double-checked, then they took off the clamps from my eyes, so that I was again free to blink.  They had me get up and sit at another location where I could rest my chin and have the doctor do a full examination of my eyes to verify the flaps were in place and there was no debris or any other issue.  Satisfied everything was okay, I was given a seat in a nice, relaxing room to rest my eyes while waiting for my ride to arrive.  When he did, they helped guide me back to the entryway to meet with him.  At that point, my eyes were definitely much better, but they felt rough and I had sensitivity to light and some difficulty focusing (all normal).  I had a bit of excitement in me after realizing that my vision was already improved.</p>
<p><strong>Post-Op</strong><br />
On the way home, I alternated between resting and trying out my new vision from behind a pair of dark sunglasses.  I kept finding myself mesmerised by the ability to see details, license plates, far away signs.  I was satisfied, but blinking felt rough.  People often describe it as feeling like sand is in your eyes, but it wasn&#8217;t as severe for me.  It was more like dry eyes plus a sense of, well, a flap having been cut in my eye.  It wasn&#8217;t sharp or stinging, just not smooth.  When I arrived home, I thanked my driver and rested on the couch.  I put drops in my eyes, put on protective eyeware (similar to safety glasses to prevent you from accidentally rubbing your eyes), and fell asleep.</p>
<p>When I awoke a few hours later, I was already feeling much better.  I was told to try to avoid anything that requires focusing (reading, TV, basically everything), but I couldn&#8217;t help myself and kept testing my ability to focus clearly and quickly.  I was surprised at how fast my eyes could already focus on anything as I looked around the room.  The one problem that I noticed was lights were extremely hazy and brighter lights had &#8220;starbursts&#8221; around them, but I had been told that was normal.</p>
<p>I had to use steroid eye drops once every three hours as well as antibiotic eye drops at the same interval (though not at the same time in order to avoid one drop flushing out the other).  Those were for speeding up the healing process and preventing infection respectively.  One of the drops caused a bit of irritation in my right eye; apparently I had a very minor cut in my bottom eyelid (felt like a paper cut), but it wasn&#8217;t too bad.  I also had some redness around my eyes from where the suction had been applied.  I regularly used artificial tears (eye drops that are individiually packaged), which helped a lot.</p>
<p>The day after the operation was a Saturday, and I had a relatively early (I think 8am) appointment to get a quick checkup.  I had to have a ride for this trip as well, though I felt like I could have driven just fine.  The checkup was quick and painless, really intended just to catch any potential problems as soon after the surgery as possible, and I had a follow-up appointment scheduled for the next Friday.</p>
<p><strong>Continuing Recovery</strong><br />
I was fine for work that next Monday morning, though I was still taking the eye drops regularly.  At times, I found focusing to be slightly difficult and at other times it was not.  I think my eyes were still getting used to their new ability to actually focus on their own.</p>
<p>I found myself having a tough time falling asleep for a while.  Part of it was because of the annoying safety glasses (which I stopped wearing a bit early) and part of it was because right as I was about to fall asleep I would get the urgent thought &#8220;You need to take out your contacts!&#8221;  I would bolt awake only to realize I wasn&#8217;t wearing contacts.  If you have never worn contacts, you probably do not realize how much it can suck to fall asleep in them.  When you wake, your eyes are completely dry and the contacts are glued in place.  It&#8217;s not pleasant, especially if you need to remove them.</p>
<p>It was strange being able to just <em>see</em>.  I could clearly see the smoke detector light at night.  I often woke up and looked out my window to see very sharp and clearly defined leaves from trees, whereas before I could barely tell a window was even there.  I saw details on mountains far in the distance.  My vision was definitely better after surgery than it was with contacts before.</p>
<p>I had my one-week checkup, my one-month checkup, and my three-month checkup with no issues.</p>
<p><strong>Final Thoughts</strong><br />
Vision is amazing, particularly good vision.  Prior to surgery, I couldn&#8217;t read the giant &#8220;E&#8221; on the eye charts; hell, I couldn&#8217;t even tell there was anything on the chart.  Now I am seeing better than 20/20.  The surgery cost me about $3400 out of pocket, plus probably $50-$75 more for the eye drops, so it definitely wasn&#8217;t cheap (don&#8217;t expect much help from insurance, since it&#8217;s an &#8220;elective&#8221; procedure).</p>
<p>For some time after the surgery, you have to avoid certain activities such as rubbing your eyes or swimming, but I think the inconvenience was minimal given the amazing benefit of having naturally good vision.  I can wake up in the middle of the night and just see things.  It sounds far from amazing if you have never had terrible vision, I know, but I definitely consider this to be one of the best things I&#8217;ve ever done with my money.</p>
<p>The only problem I have had from the surgery is that I still see starbursts, mostly on bright lights at night.  The doctor said I would probably experience this more than average because my pupils are a bit larger than average (I think 8mm vs. the average 5-7mm).  The starbursts have slowly gone down some and I have gotten a bit more used to the problem, but it is more prevalent than before the surgery.</p>
<p>That said, I would absolutely make the decision to have Lasik again without hesitation.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/09/17/lasik-three-months-later/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patents To Stifle Innovation</title>
		<link>http://blog.iangclifton.com/2011/09/05/patents-to-stifle-innovation/</link>
		<comments>http://blog.iangclifton.com/2011/09/05/patents-to-stifle-innovation/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 23:28:13 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Opinion / Just Talking]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[galaxy tab]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[patents]]></category>
		<category><![CDATA[samsung]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=493</guid>
		<description><![CDATA[In Article 1 Section 8 of the United States Constitution, Congress is given the power to &#8220;&#8230;promote the Progress of Science and useful Arts, by securing for limited Times to Authors and Inventors the exclusive Right to their respective Writings &#8230; <a href="http://blog.iangclifton.com/2011/09/05/patents-to-stifle-innovation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In Article 1 Section 8 of the United States Constitution, Congress is given the power to &#8220;&#8230;promote the Progress of Science and useful Arts, by securing for limited Times to Authors and Inventors the exclusive Right to their respective Writings and Discoveries.&#8221; This is essentially from where patent and copyright laws (in the United States) originated.  Clearly, the purpose in regards to technology should be to promote innovation; unfortunate, the opposite has been happening.<span id="more-493"></span></p>
<p>There are three types of patents (this applies to the United States; my knowledge of patent laws in other countries is minimal): utility, design, and plants.  Utility patents cover what you&#8217;d typically think of as an invention, everything from Velcro to turbines.  Design patents cover &#8220;a new, original, and ornamental design for an article of manufacture,&#8221; essentially, the appearance of a manufactured product.  Finally, plant patents actually cover plants&#8230; invent a new and distinct plant that can reproduce on its own and you can patent it.</p>
<p>Unfortunately, applying patents to software is a difficult practice and has significant repercussions.  This is the very reason that there is no standardized way to play video on the web.  Proponents largely fall into two camps: ones that support the well-known, highly efficient H.264 codec and ones those who support an open, freely-available codec such as VP8.  The H.264 codec is heavily patented and can prove to cost millions for a non-profit company like Mozilla; however, the patents are known and so the expense is clear.  Codecs such as VP8 and Theora are freely available, so they are excellent options for companies that have limited funds and/or choose to promote open software; the alternate argument is that these codecs are less efficient because they had to be specifically written to not do things similarly to H.264 but they still <em>might</em> infringe on a patent.  When you consider that H.264 is covered by 70 pages worth of patents (70 pages listing the patent numbers and corresponding owners, not counting the actual patents themselves), it&#8217;s not hard to imagine that other codecs could infringe somewhere without knowing it.  The very process of patenting that&#8217;s supposed to help innovation is scaring people away from using (and even creating) inventions.</p>
<p><a href="http://blog.iangclifton.com/wp-content/uploads/2011/09/samsung-picture-frame-ipad-galaxy-tab-10.1.jpg"><img src="http://blog.iangclifton.com/wp-content/uploads/2011/09/samsung-picture-frame-ipad-galaxy-tab-10.1-110x300.jpg" alt="" title="Samsung Picture Frame, iPad, Galaxy Tab 10.1" width="110" height="300" class="alignleft size-medium wp-image-495" /></a>Apple has filed multiple suits against Samsung for their phones and tablets.  Now, an injunction is in place that prevents Samsung from offering the Galaxy Tab 10.1 in Australia and in Europe (well, they can&#8217;t sell their tablets in Germany and have to seek a new import strategy for the rest of Europe) while the lawsuits continue.  I don&#8217;t see how anyone could use a Galaxy Tab and then an iPad and consider the user experience to be the same, so how valid can the patents be?  And as far as design patents go, that graphic I have included shows a digital picture frame that Samsung made in 2006, then the iPad (from 2010), and then the new Galaxy Tab 10.1 (2011).  The user experiences are different, Samsung came up with the design first (and didn&#8217;t sue Apple), so let both the products go to market and create a benefit for all consumers.</p>
<p>I was going to write a lot more on this subject, but I think the message is clear: software patents don&#8217;t work.  They stifle innovation and harm the consumer.  The only people who truly like software patents seem to be major corporations that can use them to kill competition and lawyers.  The system needs to be fixed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/09/05/patents-to-stifle-innovation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RenderScript 101, Part 2: RenderScript Interaction</title>
		<link>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/</link>
		<comments>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 02:38:20 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Code Samples]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[honeycomb]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[renderscript]]></category>
		<category><![CDATA[renderscript-tutorial-101]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=477</guid>
		<description><![CDATA[Note: This tutorial continues on from RenderScript 101, Part 1: RenderScript Basics Tutorial. If you have not yet read that tutorial, you should do so before starting this one. The previous tutorial ended with a simple app built that could &#8230; <a href="http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><i>Note: This tutorial continues on from <a href="http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/">RenderScript 101, Part 1: RenderScript Basics Tutorial</a>.  If you have not yet read that tutorial, you should do so before starting this one.</i></p>
<p>The previous tutorial ended with a simple app built that could display a green screen with RenderScript.  The next step to making RenderScript more useful is understanding how to interact with it when it&#8217;s already running.  We want to be able to pass values to the RenderScript code and we also want to pick up on user interactions with the view.<span id="more-477"></span></p>
<p>Since we already know how to set a background color within the <code>init</code> method in the RenderScript file, lets build on that by learning how to set it from the Java side.  Here&#8217;s where our <code>RenderScript101RS</code> class comes in handy.  Just add this method:</p>
<pre class="brush: java; title: ; notranslate">
	public void setBackgroundColor(Float4 color) {
		mScript.set_bgColor(color);
	}
</pre>
<p>This simple method takes a <a href="http://developer.android.com/reference/android/renderscript/Float4.html">Float4</a> and passes it directly to the <code>set_bgColor</code> method.  That method is automatically generated in the glue class and lets you set the <code>bgColor</code> value in <code>RenderScript101.rs</code> from Java.</p>
<p>In the <code>RenderScript101View</code>, we need to override onTouchEvent:</p>
<pre class="brush: java; title: ; notranslate">
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        if (mRenderScript == null) {
        	return true;
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
        	final Random random = new Random();
        	final Float4 newColor = new Float4(random.nextFloat(), random.nextFloat(), random.nextFloat(), 1.0f);
        	mRenderScript.setBackgroundColor(newColor);
        }

        return true;
    }
</pre>
<p>If the <code>RenderScript101RS</code> reference is not yet set, don&#8217;t do anything.  If it is set, check to see if we&#8217;re getting an <code>ACTION_DOWN</code> event (e.g., touching the screen).  If we are, then we create a new <code>Float4</code> using three random float values and one hard-coded to 1.0f (the transparency/opacity to make sure it is fully opaque).  Then, we just trigger our newly created <code>setBackgroundColor</code> method with the generated <code>Float4</code>.</p>
<p>If you run the app now, you can tap the RenderScript view to watch it change colors.</p>
<p><a href="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-02.png"><img src="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-02-1024x640.png" alt="" title="RenderScript Tutorial Screenshot 02" width="640" height="400" class="aligncenter size-large wp-image-481" /></a></p>
<p>Well, that wasn&#8217;t too bad, was it?  The next part is going to be a bit more challenging, so we will have a crash course on computer graphics terminology.</p>
<h2>The Difficult Part</h2>
<p>Three-dimensional graphics revolve around vertices (vertex is the singular form).  These are essentially points in space that can be used to construct more complicated graphics.  Moving the vertices around is called &#8220;transformation.&#8221;  The mathematical construct that accomplishes this is called a &#8220;transformation matrix.&#8221;  There have been many, many books written on these concepts, so it&#8217;s impossible to condense everything down into a blog post; however, here are some specific terms for understanding RenderScript for Android:</p>
<ul>
<li><a href="http://developer.android.com/reference/android/renderscript/ProgramStore.html">ProgramStore</a> &#8211; This controls how the framebuffer is used.  For instance, you can enable or disable depth testing which controls what happens when one pixel is closer to the camera than another (e.g., whether it should blend or just overwrite).</li>
<li><a href="http://developer.android.com/reference/android/renderscript/Sampler.html">Sampler</a> &#8211; Samplers are used by ProgramFragments to determine how to get the pixels of a texture</li>
<li><a href="http://developer.android.com/reference/android/renderscript/ProgramFragment.html">ProgramFragment</a> &#8211; The Android-equivalent of a <a href="http://en.wikipedia.org/wiki/Pixel_shader">fragment shader</a></li>
<li><a href="http://developer.android.com/reference/android/renderscript/ProgramVertex.html">ProgramVertex</a> &#8211; The Android-equivalent of a <a href="http://en.wikipedia.org/wiki/Vertex_shader">vertex shader</a></li>
</ul>
<p>If you want to learn more about computer graphics, I recommend learning about OpenGL.  It&#8217;s extremely valuable to learn and many of the concepts from OpenGL apply to RenderScript.</p>
<p>Here is the updated <code>RenderScript101.rs</code> file:</p>
<pre class="brush: cpp; title: ; notranslate">
#pragma version(1)
#pragma rs java_package_name(com.iangclifton.tutorials.renderscript);

#include &quot;rs_graphics.rsh&quot;

float4 gBgColor; // Background color as xyzw 4-part float
rs_allocation gBgImage; // Background image
rs_sampler gLinearClamp; // Sampler used by the program fragment
rs_program_fragment gSingleTextureFragmentProgram; // fragment shader
rs_program_store gProgramStoreBlendNone; // blend none, depth none program store
rs_program_vertex gProgramVertex; // Default vertex shader

static const float3 gBgVertices[4] = {
        { -1.0, -1.0, -1.0 },
        { 1.0, -1.0, -1.0 },
        { 1.0, 1.0, -1.0 },
        {-1.0, 1.0, -1.0 }
};

static void drawBackground() {
	if (gBgImage.p != 0) {
		rs_matrix4x4 projection, model;
		rsMatrixLoadOrtho(&amp;projection, -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f);
		rsgProgramVertexLoadProjectionMatrix(&amp;projection);

		rsMatrixLoadIdentity(&amp;model);
		rsgProgramVertexLoadModelMatrix(&amp;model);

		rsgBindTexture(gSingleTextureFragmentProgram, 0, gBgImage);

	    rsgDrawQuad(
			gBgVertices[0].x, gBgVertices[0].y, gBgVertices[0].z,
			gBgVertices[1].x, gBgVertices[1].y, gBgVertices[0].z,
			gBgVertices[2].x, gBgVertices[2].y, gBgVertices[0].z,
			gBgVertices[3].x, gBgVertices[3].y, gBgVertices[0].z
		);
	} else {
		rsgClearColor(gBgColor.x, gBgColor.y, gBgColor.z, gBgColor.w);
	}
}

void init() {
	gBgColor = (float4) { 0.0f, 1.0f, 0.0f, 1.0f };
	rsDebug(&quot;Called init&quot;, rsUptimeMillis());
}

int root() {
	rsgBindProgramVertex(gProgramVertex);
	rsgBindProgramFragment(gSingleTextureFragmentProgram);
	rsgBindProgramStore(gProgramStoreBlendNone);

	drawBackground();
	return 16;
}
</pre>
<p>Note that I&#8217;ve updated all of the global variables to start with &#8220;g&#8221; in order to keep things a bit more clear.  The <code>root()</code> method has been updated to bind the <code>ProgramVertex</code>, <code>ProgramFragment</code>, and <code>ProgramStore</code> right away.  Looking at the <code>drawBackground()</code> method, you can see that the old code falls under the <code>else</code> statement.  Everything else happens when <code>gBgImage.p</code> is not equal to zero (in other words, the <code>gBgImage</code> has been set).</p>
<p>We create a four-by-four projection matrix and model matrix.  The projection matrix is passed by reference and is turned into an orthographic matrix with <code>rsMatrixLoadOrtho</code>.  An orthographic matrix is essentially a flat representation of points in space (e.g., the <acronym title="Heads-up Display">HUD</acronym> in a first-person shooter</acronym>).  Most commonly, the points are -1 to +1 in each dimension (though we use 0-1 for one here).  In graphics hardware, it is common to represent everything with floats because they give more precision than an arbitrary system (e.g., think of how colors are commonly represented by 0-255; in OpenGL and other languages, they are represented by floats because hardware can create an unknown number of unique colors in the future).  Then the matrix is passed to <code>rsgProgramVertexLoadProjectionMatrix</code> so that the 3D points can be flattened to 2D points.</p>
<p>We pass <code>model</code> by reference to <code>rsMatrixLoadIdentity</code> which makes <code>model</code> an <a href="http://en.wikipedia.org/wiki/Identity_matrix">identity matrix</a>.  An identity matrix is essentially a matrix that does not affect other matrices in multiplication (think of it like a 1 where 1 times X results in X).  With this identity matrix, we call <code>rsgProgramVertexLoadModelMatrix</code> to avoid manipulating the vertices.</p>
<p>Next, we call <code>rsgBindTexture</code>, which takes a program fragment, an unsigned <code>int</code> (slot), and an <code>rs_allocation</code>.  This is essentially where we are setting up our texture (<code>Bitmap</code>) to be drawn.  Now that the texture has been set up, we can draw the quad on which it will appear.  The <code>gBgVertices</code> are defined on lines 13-18 but we&#8217;re essentially passing the top left, top right, bottom left, and bottom right points of the screen.  The Z position for all of them is -1, which we set as the maximum Z-depth in our <code>rsMatrixLoadOrtho</code> call.  Therefore, this texture spans the whole view but appears at the very &#8220;back&#8221; of it.</p>
<p>Now we have to update <code>RenderScript101RS</code> to set these new values:</p>
<pre class="brush: java; title: ; notranslate">
package com.iangclifton.tutorials.renderscript;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Float4;
import android.renderscript.Matrix4f;
import android.renderscript.ProgramFragment;
import android.renderscript.ProgramFragmentFixedFunction;
import android.renderscript.ProgramStore;
import android.renderscript.ProgramVertex;
import android.renderscript.ProgramVertexFixedFunction;
import android.renderscript.RenderScriptGL;
import android.renderscript.Sampler;

public class RenderScript101RS {

	private Sampler mLinearClamp;
    private ProgramStore mProgramStoreBlendNone;
    private ProgramVertex mProgramVertex;
	private RenderScriptGL mRS;
	private ScriptC_RenderScript101 mScript;
    private ProgramFragment mSingleTextureFragmentProgram;

	public RenderScript101RS(RenderScriptGL rs, Resources res, int resId) {
		mRS = rs;
		mScript = new ScriptC_RenderScript101(rs, res, resId);

		initProgramStore();
		initSampler();
		initProgramFragment();
		initProgramVertex();
		mRS.bindRootScript(mScript);

	}

	public void setBackgroundBitmap(Bitmap bitmap) {
		if (bitmap == null) {
			return;
		}
		final Allocation bitmapAllocation = Allocation.createFromBitmap(mRS, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);
		mScript.set_gBgImage(bitmapAllocation);
	}

	public void setBackgroundColor(Float4 color) {
		mScript.set_gBgColor(color);
	}

	private void initProgramFragment() {
        final ProgramFragmentFixedFunction.Builder pfBuilder = new ProgramFragmentFixedFunction.Builder(mRS);
        pfBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
        mSingleTextureFragmentProgram = pfBuilder.create();
        mScript.set_gSingleTextureFragmentProgram(mSingleTextureFragmentProgram);
	}

    private void initProgramStore() {
        mProgramStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS);
        mScript.set_gProgramStoreBlendNone(mProgramStoreBlendNone);
    }

	private void initProgramVertex() {
        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
        mProgramVertex = pvb.create();
        ProgramVertexFixedFunction.Constants pva = new ProgramVertexFixedFunction.Constants(mRS);
        ((ProgramVertexFixedFunction)mProgramVertex).bindConstants(pva);
        Matrix4f proj = new Matrix4f();
        proj.loadProjectionNormalized(1, 1);
        pva.setProjection(proj);
        mScript.set_gProgramVertex(mProgramVertex);
	}

	private void initSampler() {
		mLinearClamp = Sampler.CLAMP_LINEAR(mRS);
		mScript.set_gLinearClamp(mLinearClamp);
	}
}
</pre>
<p>Looking at the constructor, we can see that first the <code>ProgramStore</code> is initialized, then the <code>Sampler</code>, then the <code>ProgramFragment</code>, and finally the <code>ProgramVertex</code>.  Each of these has an <code>init___</code> method that you can look at.  The <code>initProgramStore</code> just sets a <code>ProgramStore</code> that does no blending and no depth testing since they are not needed for the background.  Then <code>initSampler</code> just creates a <code>CLAMP_LINEAR</code> <code>Sampler</code>.  The <code>initProgramFragment</code> method creates a simple fragment shader.  Lastly, the <code>initProgramVertex</code> method creates a simple <code>ProgramVertexFixedFunction</code> (vertex shader) without any custom GLSL.</p>
<p>If you&#8217;ve never done any OpenGL or other 3D computer graphics, you&#8217;re probably lost by now.  Sorry!  It would take a few hundred pages to truly clarify all of this, but hopefully some of it is making sense.</p>
<p>Finally, we just updated the <code>RenderScript101View</code> class&#8217;s <code>onTouchEvent</code> method:</p>
<pre class="brush: java; title: ; notranslate">
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        if (mRenderScript == null) {
        	return true;
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
        	mRenderScript.setBackgroundBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
        }

        return true;
    }
</pre>
<p>We simply update this method so that tapping the view will set the background <code>Bitmap</code> to the default icon.  Yup, it looks terrible, but you&#8217;ve now experimented with the key features of RenderScript and you might even understand a thing or two.</p>
<p><a href="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-03.png"><img src="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-03-1024x640.png" alt="" title="RenderScript Tutorial Screenshot 03" width="640" height="400" class="aligncenter size-large wp-image-486" /></a></p>
<p>Note: The <a href="https://github.com/IanGClifton/Android-RenderScript-Tutorials">source code</a> for this tutorial is available in on GitHub.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RenderScript 101, Part 1: RenderScript Basics Tutorial</title>
		<link>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/</link>
		<comments>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 22:33:05 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Code Samples]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[honeycomb]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[renderscript]]></category>
		<category><![CDATA[renderscript-tutorial-101]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=464</guid>
		<description><![CDATA[A couple of months ago, I had to do a lot of work with RenderScript. Unfortunately, there was not much documentation available then and there isn&#8217;t much more now. The purpose of this post is to provide the foundations for &#8230; <a href="http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A couple of months ago, I had to do a lot of work with RenderScript.  Unfortunately, there was not much documentation available then and there isn&#8217;t much more now.  The purpose of this post is to provide the foundations for actually using RenderScript for graphical purposes.  You should have already read about RenderScript and understand the overall concept (just not necessarily implementation details).  I assume that you know Android and Java and aren&#8217;t scared of some basic C-style code.  An understanding of computer graphics (or a graphics library such as OpenGL) definitely helps but is not a requirement.<span id="more-464"></span></p>
<p>We&#8217;ll be creating four files:</p>
<ul>
<li>RenderScript101.rs &#8211; The actual RenderScript code</li>
<li>RenderScript101RS.java &#8211; A helper class to simplify interaction with RenderScript</li>
<li>RenderScript101View.java &#8211; An RSSurfaceView that handles setting up the view and can capture touch events</li>
<li>RenderScript101Activity.java &#8211; Main Activity and it&#8217;s even simpler than a typical one</li>
</ul>
<p>When you create a new project, select a target of at least 11 and let Eclipse generate the Activity for you (ignore it for now).  We&#8217;re diving right into the actual RenderScript code, so create the <code>RenderScript101.rs</code> text file (in the same folder/package as the Activity).  The first things we have to do are to specify the version of RenderScript we&#8217;re using (1) and specify the package (I&#8217;m using <code>com.iangclifton.tutorials.renderscript</code>).</p>
<pre class="brush: cpp; title: ; notranslate">
#pragma version(1)
#pragma rs java_package_name(com.iangclifton.tutorials.renderscript);

#include &quot;rs_graphics.rsh&quot;

float4 bgColor; // Background color as xyzw 4-part float

static void drawBackground() {
	rsgClearColor(bgColor.x, bgColor.y, bgColor.z, bgColor.w);
}

void init() {
	bgColor = (float4) { 0.0f, 1.0f, 0.0f, 1.0f };
	rsDebug(&quot;Called init&quot;, rsUptimeMillis());
}

int root() {
	drawBackground();
	return 16;
}
</pre>
<p>When your RenderScript code is first initialized, the <code>init()</code> method will run once.  Then the <code>root()</code> method will run repeatedly.  The return value for the <code>root</code> method is an int specifying the number of milliseconds before <code>root()</code> should run again.</p>
<p>Looking first at <code>init()</code>, you can see we are setting the <code>bgColor</code> (a 4-part float defined on line 6) to 0, 1, 0, 1.  This is in RGBA format, so we&#8217;re saying no red, maximum green, no blue, and full opacity.  In the next line we call <code>rsDebug</code> with the message &#8220;Called init&#8221; and the current uptime in milliseconds.  Think of this as an easy way to call <code>Log.d("RenderScript", your_message_here)</code>.  This call is not necessary, but you should definitely get used to adding debug messages into your RenderScript early on.  For reference, <code>rsDebug</code> is defined in <code>rs_core.rsh</code> and <code>rsUptimeMillis</code> is defined in <code>rs_time.rsh</code> (both are available in your sdk directory under <code>platforms/android-11/renderscript/include</code> and are included automatically for you).</p>
<p>Jumping down to the <code>root</code> method, we see that it calls <code>drawBackground()</code> and returns 16 (16ms for a frame is close to 60 frames per second).  The drawBackground() call only does one thing right now; it clears the screen using the <code>bgColor</code> we set in <code>init()</code>.  The <code>rsgClearColor</code> method takes four floats (R, G, B, A) and is defined in <code>rs_graphics.rsh</code>.  Remember that RenderScript can also be used for calculations, so you have to specifically include the graphics header file (line 4).  If you&#8217;re new to computer graphics, the use of the x, y, z, and w properties of <code>bgColor</code> might seem strange.  Without getting into the details, this is a convention in graphics where a four-part float is represented with these four letters (as you can probably guess, x, y, and z are typically coordinates.  The w is usually for projection where the values are actually represented as x/w, y/w, and z/w.  There&#8217;s a lot more to it than that, but the important part is knowing the letters right now).</p>
<p>Alright, so all that code does is define a background color from four floats (x, y, z, and w) and then it clears the screen to that color every 16-ish milliseconds.  Pretty simple, but it&#8217;s a good start.</p>
<p>Next, you want to create the <code>RenderScript101RS.java</code> file to simplify interaction with the RenderScript.  It should look like this:</p>
<pre class="brush: java; title: ; notranslate">
package com.iangclifton.tutorials.renderscript;

import android.content.res.Resources;
import android.renderscript.RenderScriptGL;

public class RenderScript101RS {
    private RenderScriptGL mRS;
    private ScriptC_RenderScript101 mScript;

    public RenderScript101RS(RenderScriptGL rs, Resources res, int resId) {
    	mRS = rs;
    	mScript = new ScriptC_RenderScript101(rs, res, resId);
    	mRS.bindRootScript(mScript);
    }
}
</pre>
<p>All we are doing for now is setting a reference to the <a href="http://developer.android.com/reference/android/renderscript/RenderScriptGL.html">RenderScriptGL</a> (the graphics derivative of RenderScript), instantiating the &#8220;glue&#8221; class <code>ScriptC_RenderScript101</code>, and binding the script.  The glue class is generated for you by Eclipse.  If you have automatic builds on and saved the <code>.rs</code> file we just worked on, you might have noticed the class being added to the gen folder along with your <code>R</code> class.  This glue class lets you interact with your RenderScript code via Java (such as if you want to set the background color from Java instead of within the RenderScript).  We&#8217;ll get to it later.  The <code>bindRootScript()</code> method simply tells Android which script should handle rendering to the surface.</p>
<p>Next up, <code>RenderScript101View.java</code>:</p>
<pre class="brush: java; title: ; notranslate">
package com.iangclifton.tutorials.renderscript;

import android.content.Context;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScriptGL;

public class RenderScript101View extends RSSurfaceView {
	private Context mContext;
	private RenderScript101RS mRenderScript;
	private RenderScriptGL mRS;

	public RenderScript101View(Context context) {
	    super(context);
	    mContext = context;
	    ensureRenderScript();
    }

	private void ensureRenderScript() {
		if (mRS == null) {
			final RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
			mRS = createRenderScriptGL(sc);
		}
		if (mRenderScript == null) {
			mRenderScript = new RenderScript101RS(mRS, mContext.getResources(), R.raw.renderscript101);
		}
	}
}
</pre>
<p>This is the <a href="http://developer.android.com/reference/android/renderscript/RSSurfaceView.html">RSSurfaceView</a> that essentially works like other views in Android.  In fact, it extends <a href="http://developer.android.com/reference/android/view/SurfaceView.html">SurfaceView</a>, so if you&#8217;ve used SurfaceView or <a href="http://developer.android.com/reference/android/opengl/GLSurfaceView.html">GLSurfaceView</a>, you have a pretty good idea of what this is.</p>
<p>All we&#8217;re doing here is following the convention of having an <code>ensureRenderScript()</code> method that sets up the RenderScriptGL and <code>RenderScript101RS</code> class instances.  This method can be called when the view is first set up or when it changes.  If <code>mRS</code> is null, we create a <a href="http://developer.android.com/reference/android/renderscript/RenderScriptGL.SurfaceConfig.html">SurfaceConfig</a> (this can be used to control the bit-depth for colors, the depth buffer, etc., but we&#8217;re just using the defaults).  We use the <code>SurfaceConfig</code> in our call to <code>createRenderScriptGL()</code> to generate the <code>RenderScriptGL</code>.  If the <code>mRenderScript</code> reference is null, we simply construct a new one by passing the <code>RenderScriptGL</code>, a reference to the <a href="http://developer.android.com/reference/android/content/res/Resources.html">Resources</a>, and the resource identifier for our RenderScript file (this bytecode file is automatically generated for you in res/raw).</p>
<p>And, finally, <code>RenderScript101Activity.java</code>:</p>
<pre class="brush: java; title: ; notranslate">
package com.iangclifton.tutorials.renderscript;

import android.app.Activity;
import android.os.Bundle;

public class RenderScript101Activity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new RenderScript101View(this));
    }
}
</pre>
<p>Yeah, that&#8217;s all there is to this <code>Activity</code>.  We&#8217;re simply constructing a new <code>RenderScript101View</code> and using it as the layout.  Run the app on your Honeycomb device and you should see a horrendous green screen like this:</p>
<p><a href="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-01.png"><img src="http://blog.iangclifton.com/wp-content/uploads/2011/08/renderscript-tutorial-screenshot-01-1024x640.png" alt="" title="RenderScript Tutorial Screenshot" width="640" height="400" class="aligncenter size-large wp-image-470" /></a></p>
<p>If your eyes are burning, you did it right.  If you don&#8217;t see a green screen, check DDMS for anything suspicious in the logs.</p>
<p>That concludes part one of the RenderScript 101 tutorial.  Next up, <a href="http://blog.iangclifton.com/2011/08/24/renderscript-101-part-2-renderscript-interaction/">RenderScript 101, Part 2: RenderScript Interaction</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/08/24/renderscript-101-part-1-renderscript-basics-tutorial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An Evolving Career Path</title>
		<link>http://blog.iangclifton.com/2011/08/09/an-evolving-career-path/</link>
		<comments>http://blog.iangclifton.com/2011/08/09/an-evolving-career-path/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 01:44:10 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Opinion / Just Talking]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[developer]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=458</guid>
		<description><![CDATA[As you can probably guess, I&#8217;ve always been interested in technology.  My career didn&#8217;t lead directly to mobile development though. I worked with tactical satellite communications in the Air Force and even earned a degree and certification for teaching English &#8230; <a href="http://blog.iangclifton.com/2011/08/09/an-evolving-career-path/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>As you can probably guess, I&#8217;ve always been interested in technology.  My career didn&#8217;t lead directly to mobile development though.  I worked with tactical satellite communications in the Air Force and even earned a degree and certification for teaching English at the secondary level (essentially, high school).<span id="more-458"></span></p>
<p>I ended up at Treemo Labs by way of a buddy I had worked with at Western Washington University where we were web developers.  I had finished my teaching internship, but the economy was weak and teaching jobs (particularly for someone with such limited experience) were not easy to come by.  Fortunately, I started up at Treemo doing web development and ended up leaning toward my current passion, mobile development.</p>
<p>I truly enjoy learning and tackling new challenges as well as working with technology and sharing that knowledge and experience with others.  One of the great things about mobile development is the unbelievable pace of change.  It wasn&#8217;t long ago that I could name all relevant Android devices and their specs, now it&#8217;s simply impossible to keep up.  Now I focus more on the software side of things, playing with all the newest OS features both announced and slipped in.</p>
<p>When I started at Treemo, the G1 and iPhone 3G were the primary devices.  The G1 could do far more than the iPhone and even had some features current iPhones still don&#8217;t have, but the iPhone&#8217;s narrower list of capabilities was generally executed much more smoothly.  The contrast was intriguing to me&#8211;and still is.  In 2009, we saw the Palm Pre come and go, the 3G update to the 3GS, and the G1&#8242;s angular cousin, the Motorola Droid, take off.  I had the opportunity to work with all of these devices and many more while at Treemo.  I also got to see the evolution of my skills alongside these changing devices.  I worked on the CBS News app for both Android and iOS as my intro into mobile development, not a bad start!  I developed a variety of Android apps (CNET News, Survivor, Rick Steves&#8217; Audio Europe, etc.), learning from each experience.  Even the last app I developed at Treemo Labs was an opportunity to learn and grow; developing Big Brother gave me the chance to learn more about Honeycomb (and RenderScript in particular) than I would have thought possible, given the time constraints.</p>
<p>As much as I enjoyed working with the people at Treemo, it came time for me to move on.  I won&#8217;t go into the details, but a lot of signs pointed to the need for a change.  Fortunately, Android developers are in high demand, and an excellent opportunity has already come my way.  I&#8217;ll have a separate post about that later on.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/08/09/an-evolving-career-path/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asus Transformer Review</title>
		<link>http://blog.iangclifton.com/2011/07/17/asus-transformer-review/</link>
		<comments>http://blog.iangclifton.com/2011/07/17/asus-transformer-review/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 19:29:25 +0000</pubDate>
		<dc:creator>Ian G. Clifton</dc:creator>
				<category><![CDATA[Mobile Devices]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[asus]]></category>
		<category><![CDATA[eee pad]]></category>
		<category><![CDATA[honeycomb]]></category>
		<category><![CDATA[tablet]]></category>
		<category><![CDATA[transformer]]></category>

		<guid isPermaLink="false">http://blog.iangclifton.com/?p=452</guid>
		<description><![CDATA[I received my Asus Eee Pad Transformer more than a month ago, and I have to say that I am very impressed with it. The ability to add on the keyboard dock adds a huge amount of value to the &#8230; <a href="http://blog.iangclifton.com/2011/07/17/asus-transformer-review/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I received my Asus Eee Pad Transformer more than a month ago, and I have to say that I am very impressed with it. The ability to add on the keyboard dock adds a huge amount of value to the device, allowing for productivity that is not matched by stand-alone tablets. Of course, there are times when the tablet alone is better (such as for presentations or certain games), and the Transformer makes it easy to pull the tablet out of the dock and just keep using it.</p>
<p>I wrote a review called <a href="http://www.androidpolice.com/2011/07/15/review-asus-transformer-more-than-a-month-with-a-tablet-in-disguise/">[Review] ASUS Eee Pad Transformer &#8211; A Month With A Tablet In Disguise</a> at <a href="http://www.androidpolice.com/">Android Police</a>, so I will not go into excessive detail here. If you are looking for a tablet that can actually be used to create real content, particularly for typing on the go, take a look at the Asus Eee Pad Transformer.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iangclifton.com/2011/07/17/asus-transformer-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.501 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-04 19:36:50 -->

