<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6288641086087262491</id><updated>2012-01-01T14:05:28.010-06:00</updated><category term='mobile'/><category term='translate'/><category term='books'/><category term='kitchensink'/><category term='progressbar'/><category term='singleton'/><category term='perl'/><category term='dallas'/><category term='imaging'/><category term='droidworks'/><category term='library'/><category term='lazy'/><category term='location'/><category term='agile'/><category term='maxim'/><category term='youth'/><category term='tunewiki'/><category term='sweater'/><category term='android 2.2'/><category term='tdd'/><category term='xhtml'/><category term='brain unit testing'/><category term='i18n'/><category term='interent'/><category term='election'/><category term='java'/><category term='mysql'/><category term='personal'/><category term='php'/><category term='cpan'/><category term='politics'/><category term='programming'/><category term='tutorial'/><category term='example'/><category term='startup'/><category term='economy'/><category term='home improvement'/><category term='android AsyncTask'/><category term='IO2008'/><category term='context'/><category term='fios'/><category term='thread'/><category term='employment'/><category term='hacker'/><category term='httpclient'/><category term='gps'/><category term='webservice'/><category term='android'/><category term='restlet'/><category term='jobs'/><category term='software'/><category term='dayton'/><category term='google io fail'/><category term='angle grinder'/><category term='hackjob'/><category term='jboss'/><category term='blogging'/><category term='google'/><title type='text'>a blog called foo</title><subtitle type='html'>write code, have fun, change the world</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4918519622604033002</id><published>2011-03-02T09:54:00.007-06:00</published><updated>2011-03-02T17:34:34.884-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google io fail'/><title type='text'>Google, please stop giving away hardware at your events!</title><content type='html'>I just read via engadget that Google is &lt;a href="http://pulsene.ws/13JCa"&gt;giving away Xoom tablets to attendees at the GDC&lt;/a&gt;. Originally, giving away free hardware was a great way to get devs to play around and build cool apps, but this cute gimmick has run it's course. &amp;nbsp;People now expect to get free hardware from Google, and since the value of the hardware tends to exceed the ticket price of the conference, &lt;a href="http://twitter.com/#!/vicgundotra/status/34680121109516288"&gt;everyone and their mother are signing up&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had planned on going to Google IO this year, and was patiently waiting for registration to open. &amp;nbsp;I made the mistake of walking across the street to Panera for lunch with some co-workers, and by the time I got back registration had already opened and closed. &amp;nbsp;Who cares you say? Maybe I'm just bitter because I wasn't one of the lucky few that made it.&lt;br /&gt;&lt;br /&gt;Sorry, but there is more too it than that, dev conferences are supposed to be &lt;b&gt;&lt;i&gt;for developers.&lt;/i&gt;&lt;/b&gt;&amp;nbsp;It's a chance to learn new stuff and get some important networking done. The job I have now at TuneWiki, in fact, came from a random encounter I had during a lunch break at a previous Google IO. &amp;nbsp;Signing up for a Google IO event, should not be the online equivalent of going to Walmart on Black Friday.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh5.googleusercontent.com/-2UVwfUiOuPk/TW5i3Lf-bhI/AAAAAAAAAd8/FzB49nBGDfg/s1600/black-friday-electronics.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="https://lh5.googleusercontent.com/-2UVwfUiOuPk/TW5i3Lf-bhI/AAAAAAAAAd8/FzB49nBGDfg/s320/black-friday-electronics.bmp" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Yes, I'm also aware of the Google IO Pre-Sale VIP list, which supposedly was to give deserving developers a guaranteed spot at the conference. &amp;nbsp;Except that it failed, miserably, imo. &amp;nbsp;Using myself as an example, I attended &lt;a href="http://foo.jasonhudgins.com/2008/01/android-campfire.html"&gt;the very first Android event on the Google campus&lt;/a&gt;. &amp;nbsp;I worked on two android projects that won top 10 placement in the first ADC (find someone else who can claim that). &amp;nbsp;I attended the first device&amp;nbsp;readiness&amp;nbsp;event before the G1 was released. &amp;nbsp;I sat front row at the G1 announcement press-conference as a special guest of T-mobile. &amp;nbsp;My current work efforts not only include TuneWiki, but also &lt;a href="http://www.facebook.com/l.php?u=http%3A%2F%2Fmobiputing.com%2F2011%2F01%2Fleaked-motorola-music-app-for-android-is-amazing%2F&amp;amp;h=c48e7"&gt;the media player that's baked into every motorola device&lt;/a&gt; (before US carriers replace it with their crapware). &amp;nbsp;Despite all this, &lt;b&gt;&lt;i&gt;I did not receive a VIP pre-sale invite&lt;/i&gt;&lt;/b&gt;. &amp;nbsp;And if I didn't get an invite, you can bet your ass there are plenty of other deserving developers who didn't either.&lt;br /&gt;&lt;br /&gt;In short, Google, &lt;a href="http://knowyourmeme.com/memes/son-i-am-disappoint"&gt;I am&amp;nbsp;disappoint&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE&lt;/b&gt;:  For the record, I already have stacks of android devices on my desk, including unreleased evaluation devices, &lt;a href="http://www.reddit.com/r/Android/comments/fvx6n/google_please_stop_giving_away_free_hardware/c1j24fd"&gt;so anyone who thinks that I'm butthurt over not getting a tablet&lt;/a&gt; is only re-enforcing my point. People are now assuming getting a device is the &lt;b&gt;&lt;i&gt;reason&lt;/i&gt;&lt;/b&gt; I want to go to these events.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4918519622604033002?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4918519622604033002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4918519622604033002'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2011/03/google-please-stop-giving-away-hardware.html' title='Google, please stop giving away hardware at your events!'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-2UVwfUiOuPk/TW5i3Lf-bhI/AAAAAAAAAd8/FzB49nBGDfg/s72-c/black-friday-electronics.bmp' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-3067459457435867690</id><published>2010-05-30T10:37:00.002-05:00</published><updated>2010-05-30T10:40:38.200-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android AsyncTask'/><title type='text'>The limitations of AsyncTask</title><content type='html'>&lt;a href="http://developer.android.com/intl/zh-TW/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt; is a fine API, it's been said that it "holds your hand", and makes performing background operations painless.  It pulls this off so well in fact, that I see people overusing it in situations where it's not really appropriate.&lt;br /&gt;&lt;br /&gt;It's particularly unsuited for situations when you have a multiple tasks to perform concurrently. Imagine an Activity that needs to download about 30 small images from a remote server, and update the UI as these become available.  AsyncTask uses a static internal work queue with a hard-coded limit of 10 elements.  That means if you were to create an AsyncTask instance for each image, the work queue would quickly overflow and many of your tasks would get rejected.  The best solution in this case is to create your own &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html"&gt;ThreadPoolExecutor&lt;/a&gt; instance that uses a queue that's large enough to hold all your tasks, if you need an unbounded queue, a &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html"&gt;LinkedBlockingQueue&lt;/a&gt; will work just fine.&lt;br /&gt;&lt;br /&gt;Another severe limitation is that an AsyncTask can't survive your Activity being torn down and recreated on the other side.&amp;nbsp; Even if you pass it to the new instance via &lt;a href="http://developer.android.com/intl/zh-TW/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29"&gt;onRetainNonConfigurationState&lt;/a&gt;, the internal Handler inside the AsyncTask is still going to be stale and it's not going to behave correctly.&amp;nbsp; This is important to consider, and the Android documentation makes no mention of it all.&amp;nbsp; I've already blogged this scenario &lt;a href="http://foo.jasonhudgins.com/2010/02/rebel-without-context.html"&gt;in detail&lt;/a&gt;, so I won't flog a dead horse here.&lt;br /&gt;&lt;br /&gt;There are a few other minor issues, such as the fact that you can't change the background threads execution priority. It's hard-coded to a low priority, which granted, is the sensible default.&amp;nbsp; Also, exception handling is not very well supported.&lt;br /&gt;&lt;br /&gt;So just to reiterate, AsyncTask is a nice API, but you should understand it's limitations and apply it appropriately.&amp;nbsp; If you're serious about writing mobile apps, then you're going to need a few more tools in the toolbox to get the job done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-3067459457435867690?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3067459457435867690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3067459457435867690'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/05/limitations-of-asynctask.html' title='The limitations of AsyncTask'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4787459394443034817</id><published>2010-05-22T15:24:00.002-05:00</published><updated>2010-05-22T15:28:22.216-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android 2.2'/><title type='text'>Android 2.2 Highlights, A developer's perspective</title><content type='html'>Android 2.2 is the most significant upgrade to the Android OS that I can remember.  Chock full of new goodies for both users and developers.&lt;br /&gt;&lt;br /&gt;I thought I'd just do a quickie post to highlight the features for developers I'm most interested in.&lt;br /&gt;&lt;br /&gt;1) Android Cloud to Device Messaging - this is one feature that's been sorely lacking from the Android platform and it's a welcomed addition.  The demo at Google IO demonstrated how you can push a message to a device in real time, and have it fire off an Intent which can kick off any number of interesting and yet to be dreamed of services.  This also opens up a new way for devices to communicate with each other in real time over the internet, I expect interesting things to come of this.&lt;br /&gt;&lt;br /&gt;2) Android Application Error Reports - logging exceptions remotely that occur on a users device is a very useful thing and every mobile company I've worked at has done this in some form or another.  The typically way to do it is to override the default exception handler and replace it with something that will log the exception.  I myself just started building a new&amp;nbsp; GAE project for this a few weeks ago &lt;a href="http://github.com/jasonhudgins/Remote-Incident-Logger"&gt;http://github.com/jasonhudgins/Remote-Incident-Logger.&lt;/a&gt;  The initial usefulness of this will be somewhat limited, due to the fact that many devices are going to be running older versions of android for the foreseeable future.&lt;br /&gt;&lt;br /&gt;3) Stagefright media framework - I don't know much about Stagefright, I'll admit that right off the bat, what I do know is that I'm dreadfully tired with the limitations of the current MediaPlayer framework, and I'm really hopeful this can serve as an improvement / replacement for the API's we've been using up til now.  &lt;br /&gt;&lt;br /&gt;And lastly, I'd also like to mention the new support for &lt;a href="http://developer.android.com/intl/zh-TW/guide/developing/eclipse-adt.html#libraryProject"&gt;Android Library Projects&lt;/a&gt; that are available in the newest SDK tools (SDK Tools r6).  We will finally be able to share common resources between multiple projects, and since it's just build time magic, these new library projects are going to be backwards compatible with older platform versions.&lt;br /&gt;&lt;br /&gt;Wrapping up, I'm really excited about android 2.2.&amp;nbsp; Google has really raised the bar with this release, and it's going to be interesting to see how other mobile technologies evolve in response to this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4787459394443034817?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4787459394443034817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4787459394443034817'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/05/android-22-highlights-developers.html' title='Android 2.2 Highlights, A developer&apos;s perspective'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-1174491596836320491</id><published>2010-03-31T17:57:00.007-05:00</published><updated>2010-03-31T18:41:59.311-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='progressbar'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>A Simple ProgressBar Tutorial</title><content type='html'>I came across another &lt;a href="http://www.helloandroid.com/tutorials/progressbar-updating-using-message-handler"&gt;ProgressBar tutorial&lt;/a&gt; a few days back posted on helloandroid.com, and while it's certainly good enough to get someone started, it doesn't really go into any detail about how your non-ui thread should work, and how it should gracefully handle Activity restarts and what not.  It uses a message handler to send notifications to the ui thread, but what if the Activity is paused and the message handler becomes stale?&lt;br /&gt;&lt;br /&gt;So I'm taking this as a good opportunity to follow up on my previous &lt;a href="http://foo.jasonhudgins.com/2010/02/rebel-without-context.html"&gt;Rebel Without A Context&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;The code is fairly short, so I won't go into a line-by-line explanation of it, but the general idea is that you have your own Thread implementation that maintains state, and you pass it from the old activity to the new activity via onRetainNonConfigurationInstance(). Also rather than updating the UI directly by sending a message from the background thread, the UI thread actively polls the background thread every 50 milliseconds with a handler loop, which updates the progress bar as necessary. &lt;br /&gt;&lt;br /&gt;With this kind of approach, you can for example, flip orientations back and forth gracefully with no stale handlers or leaky window exceptions.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://pastie.org/898036.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-1174491596836320491?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1174491596836320491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1174491596836320491'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/03/simple-progressbar-tutorial.html' title='A Simple ProgressBar Tutorial'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2328391867096958602</id><published>2010-03-20T14:25:00.004-05:00</published><updated>2010-05-25T08:25:14.406-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='httpclient'/><category scheme='http://www.blogger.com/atom/ns#' term='singleton'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>HTTP Connections revisited</title><content type='html'>In a previous post entitled, &lt;a href="http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html"&gt;HTTP connection reuse in android&lt;/a&gt;, I tossed out a code snippet for an HttpClientFactory that would spit out a DefaulHttpClient implementation suitably configured for re-using already open HTTP connections to serve multiple requests across multiple threads.&lt;br /&gt;&lt;br /&gt;My hasty implementation from that post leaves a few things to be desired.  Primarily, it's a singleton implementation which can lead to some problems.  Since it's effectively a global resource, doing things like modifying the time out value, or forcibly closing the connection manager (as one commenter pointed out), could lead to the HttpClient to be in an invalid or undesired state when reused at a different time or a different part of your application. &lt;br /&gt;&lt;br /&gt;So here's a simplified version without the singleton garbage:&lt;br /&gt;&lt;br /&gt;&lt;script src='http://pastie.org/976170.js'&gt;&lt;/script&gt;&lt;br /&gt;The ideal place to use something like this is when you want to download multiple items from a single remote source, for example, if I needed to download a bunch of thumbnails to be displayed in a ListView, I could have a thread pool downloading images concurrently and all sharing this one HttpClient instance, reusing HTTP connections as they became available (all managed inside the HttpClient)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2328391867096958602?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2328391867096958602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2328391867096958602'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/03/http-connections-revisited.html' title='HTTP Connections revisited'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2914144686909256864</id><published>2010-02-05T16:33:00.021-06:00</published><updated>2010-02-07T19:02:37.469-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='context'/><category scheme='http://www.blogger.com/atom/ns#' term='thread'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Rebel Without A Context</title><content type='html'>The scenario is common enough.  You want to implement some task in a background worker thread, like fetching data from an HTTP server or whatnot, and then at a future point the UI needs to be updated, based on whatever has or is happening in the worker thread.&lt;br /&gt;&lt;br /&gt;So here's your naive Thread/Runnable implementation :&lt;br /&gt;&lt;script src="http://pastie.org/814045.js"&gt;&lt;/script&gt;&lt;br /&gt;And there you have it.  That's the most succinct implementation of the anti-pattern many people use. And certainly I must concede my own guilt of having used it.&lt;br /&gt;&lt;br /&gt;The problem is that your background thread, in order to update the UI, is now tightly coupled to the Activity/Context that created it.  So when/if an event occurs (such as an orientation change) that causes your Activity to be restarted, your background thread will continue to happily chug along and then try to update the UI even though it's still referencing the old Activity/Context.  Your app is then likely to experience leaked window exceptions and other types of nastiness.&lt;br /&gt;&lt;br /&gt;I've seen this problem attacked in different ways, generally trying to enable the background thread to update the UI on the new Context.  The droidfu library has an AsyncTask implementation called BetterAsyncTask that does exactly that.&lt;br /&gt;&lt;br /&gt;But this isn't a perfect solution in my opinion.  Imagine that an important event occurs in the background thread, one that is serious enough that the user absolutely should be informed if they continue to use the app.  What if it happens in the &lt;span style="font-weight: bold; font-style: italic;"&gt;middle&lt;/span&gt; of an orientation change, after the old Activity has been destroyed, yet before the new Activity is fully initialized?  A quick glance at BetterAsyncTask's source suggests that the message would never get delivered:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://pastie.org/814046.js"&gt;&lt;/script&gt;&lt;br /&gt;Now before I get into what I don't like about this, I just want to say that I applaud the creators of droidfu for releasing an open source library, and I've never used it myself, but that's my five second synopsis of it's implementation.  It probably works fine for a lot of people, but I demand something more robust.&lt;br /&gt;&lt;br /&gt;The way I see it, this just doesn't escape the anti-pattern.  The core point that I'm trying to make here is this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;It's your Activity's responsibility to update the UI, not the responsibility of the worker thread.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Let me say that again, your background thread should not try to update the UI. What it can and should do is track it's own internal state, and allow itself to be queried by the active Activity instance. The simplest way to accomplish this is to use onRetainNonInstanceConfiguration to pass your Thread/AsyncTask implementation to the newly created Activity.  The Activity can then query the state of your thread and deal with any impending UI events that it needs to process.&lt;br /&gt;&lt;br /&gt;A simple, but effective way to accomplish this is with a polling Handler loop running in the UI thread. Something like this will work fine as long as you remember to shutdown the loop as your activity exits.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://pastie.org/814047.js"&gt;&lt;/script&gt;&lt;br /&gt;If this isn't realtime enough for you, then another approach would be to have your Activity register listeners with your thread, much like binding to a service and registering a remote callback.  In fact, that's exactly how you should think about your background thread, as a lightweight service, that is decoupled from any direct UI interaction.&lt;br /&gt;&lt;br /&gt;And just a quick warning as I wrap up, If you go the listener route, you still must be aware that events can occur when your Activity is being restarted, and before the new activity can register another listener instance.&lt;br /&gt;&lt;br /&gt;I hope this article helps a few of you out there, or at the very least, shows you a different approach to a common problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2914144686909256864?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2914144686909256864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2914144686909256864'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/02/rebel-without-context.html' title='Rebel Without A Context'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7065015466080872086</id><published>2010-02-01T10:56:00.003-06:00</published><updated>2010-02-01T15:41:34.068-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sweater'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Sweater</title><content type='html'>We didn't want to be left out of the Android arts and crafts mania, you know, the&lt;br /&gt;various android &lt;a href="http://www.etsy.com/view_listing.php?listing_id=39538713"&gt;pillows&lt;/a&gt; and &lt;a href="http://www.androidguys.com/2009/12/31/how-to-make-your-own-android-doll/"&gt;dolls&lt;/a&gt;, so grandma hand knitted this sweater for Maxim.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sC8pULSl4lQ/S2cKd6Dtr0I/AAAAAAAAAVY/ciFAfcG9B5w/s1600-h/070.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_sC8pULSl4lQ/S2cKd6Dtr0I/AAAAAAAAAVY/ciFAfcG9B5w/s200/070.JPG" alt="" id="BLOGGER_PHOTO_ID_5433322984363110210" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7065015466080872086?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7065015466080872086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7065015466080872086'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/02/android-sweater.html' title='Android Sweater'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_sC8pULSl4lQ/S2cKd6Dtr0I/AAAAAAAAAVY/ciFAfcG9B5w/s72-c/070.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-176462361583443645</id><published>2010-01-02T11:29:00.005-06:00</published><updated>2010-01-02T11:52:23.657-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='droidworks'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='kitchensink'/><title type='text'>droidworks library announcement</title><content type='html'>One of the best things a developer can do to increase productivity is to build yourself up a nice code library.  I've decided to open source mine.  As a tradition, I've typically called such libraries "kitchensink", because of the hodge-podge of code they typically contain.&lt;br /&gt;&lt;br /&gt;In the past whenever I created a library like this I have always used maven.  I grew quite fond of maven (and remain so) during my stint as an enterprise java developer. However since this library is primarily for android development, it's just going to be bundled as a simple eclipse project.&lt;br /&gt;&lt;br /&gt;I just started this library so there's not a whole lot of useful stuff in it, but the primary things of interest are a RSS 2.0 parser and a gdata parser for youtube video feeds.  Neither of these is 100% complete.  It's so new I haven't even bothered with versioning yet, and I'm not sure if I ever will.&lt;br /&gt;&lt;br /&gt;I'm hosting this project on github here :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/jasonhudgins/droidworks-android-kitchensink"&gt;http://github.com/jasonhudgins/droidworks-android-kitchensink&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-176462361583443645?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/176462361583443645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/176462361583443645'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2010/01/droidworks-library-announcement.html' title='droidworks library announcement'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-8644037327043962160</id><published>2009-11-30T10:43:00.006-06:00</published><updated>2009-11-30T11:35:23.615-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brain unit testing'/><title type='text'>Unit Testing Your Brain</title><content type='html'>This post has been stewing around in my brain for awhile. I've wanted to write about memorization and it's role in being a productive programmer.  For many a developer, the web acts as a useful crutch (and I'm as guilty as anyone).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.quickblogcast.com/2/5/3/6/8/197122-186352/Human_Memory.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 255px; height: 277px;" src="http://images.quickblogcast.com/2/5/3/6/8/197122-186352/Human_Memory.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As an example, I noticed that every time I wanted to do some type of regular expression operation in java, I almost always resorted to googling for a java regex tutorial to relearn how to do it.  It's really quite an easy api to use, but it was one of those things that just wouldn't stick in my head for more than a few days at most.&lt;br /&gt;&lt;br /&gt;There is a class of general programming tasks that I don't do frequently enough to have them automatically committed to memory, but at the same time I do use them frequently enough that I found myself wasting time relearning things over and over again.  After relearning the same thing 3 or more times, I started asking myself if there wasn't some tool I could use to improve the situation.&lt;br /&gt;&lt;br /&gt;I had a discussion about this with &lt;a href="http://a-preponderance-of-pondering.blogspot.com/"&gt;Curtis Dunham&lt;/a&gt;, who introduced me to a really neat, but hard to pronounce application called &lt;a href="http://www.mnemosyne-proj.org/"&gt;Mnemosyne&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mnemosyne is a GUI app, written in Python and runs on all the popular platforms.  It acts as a system of flash cards.  You create a "deck" of cards with questions and answers, and invest a few minutes of your time each day answering them.  As you answer each question, you rate your memorization on scale of 1-5. Mnemosyne then uses this information to create a dynamic schedule of questions for you based on what you're having the most trouble memorizing.&lt;br /&gt;&lt;br /&gt;The way I use it is analogous to a common unit testing technique, where whenever you have a program fault, you create a unit test for that specific fault, and then implement a fix.  I apply this same technique with Mnemosyne.  If I am faced with a programming task that I can't remember how to perform, but I at least know that it was something I had already learned once before (a memory fault), into the deck it goes.  The deck acts as a suite of unit tests for my brain this way.&lt;br /&gt;&lt;br /&gt;Now if I want to do a pattern match in Java, I no longer spend time looking for examples in old source code or hitting up search engines.  Mnemosyne is a free app, that with a small investment, can pay large dividends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-8644037327043962160?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8644037327043962160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8644037327043962160'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/11/unit-testing-your-brain.html' title='Unit Testing Your Brain'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2243324413466564309</id><published>2009-11-21T10:32:00.005-06:00</published><updated>2009-11-21T12:03:54.581-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='tunewiki'/><category scheme='http://www.blogger.com/atom/ns#' term='dallas'/><category scheme='http://www.blogger.com/atom/ns#' term='dayton'/><title type='text'>Personal Update</title><content type='html'>I've been too busy lately to keep the blog updated, but  life will be getting back to normal shortly.  My family has just finished relocating from Dallas, TX to Dayton, OH.&lt;br /&gt;&lt;br /&gt;I've been working fulltime at TuneWiki Inc since August, developing some very exciting products. I'm now working out of their central development hub with fellow Android hacker Zach Hobbs.&lt;br /&gt;&lt;br /&gt;The team here is great, I expect to be both contributing and learning a lot. I've got a backlog of blog articles I need to hammer out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2243324413466564309?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2243324413466564309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2243324413466564309'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/11/personal-update.html' title='Personal Update'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-8275515515949391353</id><published>2009-08-22T09:03:00.011-05:00</published><updated>2009-08-22T20:55:43.776-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='location'/><category scheme='http://www.blogger.com/atom/ns#' term='gps'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Building location aware applications</title><content type='html'>There are 3 basic ways your typical smart phone can acquire a location fix, these being :&lt;ul&gt;&lt;li&gt;Cell Tower Triangulation&lt;/li&gt;&lt;li&gt;GPS&lt;/li&gt;&lt;li&gt;WiFi Scanning&lt;/li&gt;&lt;/ul&gt;Cell Tower Triangulation is the least accurate of the 3 methods. The accuracy varies by about 2-5 km in my experience. But it does have a couple of advantages, it works fine indoors and is quick to compute.&lt;br /&gt;&lt;br /&gt;GPS is the one most people are familiar with, and it offers the highest accuracy. It can pinpoint your location down to a few meters.  However, it typically doesn't work well indoors (if at all), and acquiring an accurate fix can take up to several minutes.  The longer the GPS is running the more accurate a fix can be obtained.&lt;br /&gt;&lt;br /&gt;WiFi Scanning is relatively a new idea and is pretty interesting one.  Imagine sending out a fleet of vehicles down every major thoroughfare, each armed with sensitive WiFi detection equipment. You then record the location of every WAP they detect along with the relative signal strength.  Once you've collected enough data, any WiFi enabled device in the area can look around at the nearby WAPs (it doesn't actually have to connect to them), and use the data to deduce a reasonable approximation of the device's current position.  It's fast to compute, it works indoors, and has decent accuracy (I typically get about 200m).  Another interesting aspect of this type of system is that it can correct/improve itself. If you have a WiFi fix and a GPS fix at the same time, that information can be recorded to improve accuracy in the future.&lt;br /&gt;&lt;br /&gt;You want to avoid writing any type of application that requires continuous/real-time location data for extended periods of time.  The bottom line is, if you're crunching GPS data, the CPU is not sleeping, and you're running down the battery. The best you can do is to wake the device up at repeated intervals, get a fix, and then let it go back to sleep.  This is a realistic technique and it works, but is not without limitations.  An application designed to alert you when a friend is "nearby", would always have the chance of not polling for a fix was while your friend was within range.  So you have to find a balance between the polling frequency, and the granularity that your app requires.  &lt;br /&gt;&lt;br /&gt;Also never underestimate the finicky nature of users regarding battery life.  If they feel their device's battery is suddenly under-performing, they will look for an application to blame.  If they see a  flashing GPS icon, it's usually the first thing that raises an eyebrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-8275515515949391353?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8275515515949391353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8275515515949391353'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/08/building-location-aware-applications.html' title='Building location aware applications'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-3758374706954547234</id><published>2009-08-19T10:53:00.003-05:00</published><updated>2009-08-19T10:55:57.393-05:00</updated><title type='text'>blog relocation</title><content type='html'>This blog has been relocated to &lt;a href="http://foo.jasonhudgins.com/"&gt;http://foo.jasonhudgins.com/&lt;/a&gt;, if you try and hit the old blog page you'll be redirected here.  I'm currently swamped with work and falling behind on my blogging, but I've got a couple of new posts floating around in my head.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-3758374706954547234?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3758374706954547234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3758374706954547234'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/08/blog-relocation.html' title='blog relocation'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-6302457470518647899</id><published>2009-08-03T00:10:00.012-05:00</published><updated>2009-08-03T13:00:44.131-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='httpclient'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>HTTP connection reuse in Android</title><content type='html'>Alright, time for something new and hopefully useful, re-using HTTP connections in your application. &lt;br /&gt;&lt;br /&gt;I've yet to write an Android application that doesn't make any HTTP requests, and they tend to do it frequently. Since all of my applications are also heavily concurrent, passing around a default HttpClient instance will give you thread contention issues and possibly bad dreams later that night. Establishing a new TCP connection to the same server for each request is wasteful, so I'd like to be able to re-use those connections, via the same HttpClient, and do so in a thread safe way.  &lt;br /&gt;&lt;br /&gt;This is easily accomplished with a singleton/factory thingy like so:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public class HttpClientFactory {&lt;br /&gt;&lt;br /&gt;    private static DefaultHttpClient client;&lt;br /&gt;&lt;br /&gt;    public synchronized static DefaultHttpClient getThreadSafeClient() {&lt;br /&gt;  &lt;br /&gt;        if (client != null)&lt;br /&gt;            return client;&lt;br /&gt;         &lt;br /&gt;        client = new DefaultHttpClient();&lt;br /&gt;        &lt;br /&gt;        ClientConnectionManager mgr = client.getConnectionManager();&lt;br /&gt;        &lt;br /&gt;        HttpParams params = client.getParams();&lt;br /&gt;        client = new DefaultHttpClient(&lt;br /&gt;        new ThreadSafeClientConnManager(params,&lt;br /&gt;            mgr.getSchemeRegistry()), params);&lt;br /&gt;  &lt;br /&gt;        return client;&lt;br /&gt;    } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Now whenever you need an HttpClient instance in your app, you can just do this:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;  HttpClient client = HttpClientFactory.getThreadSafeClient();&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Like most things in HttpClient 4.x, it's very easy to do, the hardest part is just figuring out exactly how to do it. A buddy @google told me that 4.x just performs so better than 3.x that was the reason for the behind switch (early versions of Android used the 3.x releases). Until next weekend..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-6302457470518647899?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6302457470518647899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6302457470518647899'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html' title='HTTP connection reuse in Android'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-8308885429778239051</id><published>2009-07-25T18:19:00.005-05:00</published><updated>2009-07-25T18:25:43.204-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Blogging Again</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sC8pULSl4lQ/SmuUDk558DI/AAAAAAAAATM/d4D2HKfdpwY/s1600-h/lazybear.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_sC8pULSl4lQ/SmuUDk558DI/AAAAAAAAATM/d4D2HKfdpwY/s200/lazybear.jpg" alt="" id="BLOGGER_PHOTO_ID_5362542570481774642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've been neglecting this blog for far too long, so it's time for me to get off my lazy butt and write some posts.  To kick things off I've revamped the TrivialGPS tutorial I did back in Xmas 2007.  I thought it looked trivial then, now it's really trivial, but here's a link to that old post entitled '&lt;a href="http://jasonhudgins.blogspot.com/2007/12/cruising-around-with-android.html"&gt;Crusing around with android&lt;/a&gt;'&lt;br /&gt;&lt;br /&gt;I'm also promising myself that I'll write up a new blog post every weekend.  I don't know if I'll actually be motivated enough to pull this off with all the other stuff I've got going on, but feel free to send me a scolding email if you think I'm getting too much like the above pictured bear... Rawr..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-8308885429778239051?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8308885429778239051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8308885429778239051'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/07/blogging-again.html' title='Blogging Again'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_sC8pULSl4lQ/SmuUDk558DI/AAAAAAAAATM/d4D2HKfdpwY/s72-c/lazybear.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2457458344292588837</id><published>2009-02-03T11:20:00.003-06:00</published><updated>2009-02-03T11:26:06.141-06:00</updated><title type='text'>Startup Happy Hour</title><content type='html'>I met Paul Urbanas at the startup happy hour last night, who created the game &lt;a href="http://en.wikipedia.org/wiki/Parsec_(video_game)"&gt;Parsec&lt;/a&gt; for the first computer I ever had, the &lt;a href="http://en.wikipedia.org/wiki/Texas_Instruments_TI-99/4A"&gt;TI-994a&lt;/a&gt;.  That game came out in 82, way back when I was in second grade, and I played the hell out of it.&lt;br /&gt;&lt;br /&gt;If you're in Dallas and haven't checked out the &lt;a href="http://www.texasstartupblog.com/2008/06/23/announcing-springstage-startup-happy-hour-dallas/"&gt;startup happy hour&lt;/a&gt; events at the infomart, you should definitely consider attending, you never know who you'll run into!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2457458344292588837?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2457458344292588837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2457458344292588837'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2009/02/startup-happy-hour.html' title='Startup Happy Hour'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-6524881179828858858</id><published>2008-10-12T16:09:00.007-05:00</published><updated>2008-10-12T16:26:49.531-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='election'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>On the election and politics</title><content type='html'>I usually don't post about anything political, but what the hell, the election looms and I do have a few opinions.&lt;br /&gt;&lt;br /&gt;  The only thing I care about when it comes to this election and our candidates is the economy.  If you chose your candidate based on any other issue, I think you should seriously reconsider your priorities.  If the economy keeps plummeting towards disaster (and if things don't change it definitely will), you're not going to have much time left to protest in front of your local Walmart or an abortion clinic, you'll be too busy holding your place in line at the soup kitchen.&lt;br /&gt;&lt;br /&gt;People need to wake up and start listening to the Austrian economists. They've been warning us for a long time now.  Just listen to what Peter Schiff had to say back in 06.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IU6PamCQ6zw&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IU6PamCQ6zw&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-6524881179828858858?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6524881179828858858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6524881179828858858'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/10/on-election-and-politics.html' title='On the election and politics'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-8559644838520479778</id><published>2008-10-07T11:47:00.006-05:00</published><updated>2008-10-07T17:24:31.399-05:00</updated><title type='text'>The September Roundup</title><content type='html'>Okay, I admit, this post is at least a week late, but I've been so ridiculously busy that I just haven't had any time for blogging.  As everyone knows by now, the first Android phone, the G1, will hit the shelves on October 22nd, so I've been working very hard to fix any outstanding issues that I can in our app, most of them are small, UI annoyances and such, but it's still work.  The application is already polished nicely, but there's always more you can do.&lt;br /&gt;&lt;br /&gt;The last week of September was exhausting, and I don't care to see the inside of an airport again anytime soon.  T-Mobile put us up in the &lt;a href="http://www.parkermeridien.com/"&gt;Le Parker Meridien&lt;/a&gt;, a fairly posh hotel not far from Central Park. WTF, that place is expensive.  In the bar downstairs a draft beer will cost you $16, and don't be late checking out, or they'll hit you up with a $350 half-day charge.  Not the kind of hotel I'd pick for myself, but I did appreciate the royal treatment that T-Mobile gave us.&lt;br /&gt;&lt;br /&gt;This was my first time in Manhattan, and it felt like an alien world, so many people and structures scrunched up together.  I can't imagine myself living there, I like my space. The UN was in session and the traffic was just absurd.  As in, quickly roll down your window to fold in your side mirror so you don't scrape the car next to you kind of absurd.&lt;br /&gt;&lt;br /&gt;The press conference itself was quite an event, I've never been a part of anything like it. They put our team on the very front row (the whole idea was to highlight us and the EcoRio guys as 3rd party developers leveraging Android's open platform model).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sC8pULSl4lQ/SOun_1YGebI/AAAAAAAAAPc/Upg33Fqugj4/s1600-h/photo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_sC8pULSl4lQ/SOun_1YGebI/AAAAAAAAAPc/Upg33Fqugj4/s320/photo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254478105359579570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After the press conference itself, &lt;a href="http://www.t-mobileg1.com/g1-announcement.aspx"&gt;viewable here&lt;/a&gt;, I would have loved to get a five second introduction to Sergei and Larry, but no such luck! The press was herded downstairs, and we manned our kiosk giving demos and answering questions.&lt;br /&gt;&lt;br /&gt;It was very interesting watching the press reactions to the G1.  Some of these guys were all business. They would walk up to our kiosk and furiously study the device for several minutes without uttering a word.  Others were much more friendly, asking questions, etc.  I usually did fine until they brought out the cameras and then I would lose about 10 IQ points.  Thankfully Alex and Rylan handled the video demos just fine.&lt;br /&gt;&lt;br /&gt;We finally returned to Dallas very late Tuesday night.  I managed to spend a little bit of time with my family, and then it was back to the airport.  Google held a two day device readiness hackathon, the intent of which was to put a lot of the ADC 50 winners together in a room, and let us mix it up with the Google engineers and knock out difficult bugs/issues in our apps.  It was an amazing amount of fun.  &lt;br /&gt;&lt;br /&gt;I had plenty of time to converse with a lot of the Google engineers that have been so helpful on the google Android groups, Justin, Megha Joshi, Diane Hackbod, Jason Chen, Dan Morrill, Dan Bornstein, and several others whose names I can't think of right now.&lt;br /&gt;&lt;br /&gt;I also had the chance to hang out with a lot of the ADC winners, the Locale guys from MIT, Michael DeJadon (Safety Net), my friends Zach Hobbs and Amnon Sarig (TuneWiki), Anthony Stevens (Pocket Journey), Virgil Dobjanschi (Maverick IM), Jeff Sharkey (Compare Everywhere), Philipp Breuss (Wikitude), Mary Ann Cotter (Cooking Capsules).  &lt;br /&gt;&lt;br /&gt;We went out for drinks on Saturday night and had a good time, but despite all the socializing, I did manage to get some code written and have some very insightful conversations regarding android.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Sharkey and Rylan, scanning barcodes of course.&lt;/span&gt;&lt;/center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_sC8pULSl4lQ/SOuoLOe-RGI/AAAAAAAAAPk/-ld6egNh2qY/s1600-h/photo(3).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_sC8pULSl4lQ/SOuoLOe-RGI/AAAAAAAAAPk/-ld6egNh2qY/s320/photo(3).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254478301077849186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;span style="font-weight:bold;"&gt;After hours at the Tied House Cafe and Brewery&lt;/span&gt;&lt;/center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sC8pULSl4lQ/SOuoQj2jPLI/AAAAAAAAAPs/1M6gMnEov04/s1600-h/photo(4).jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_sC8pULSl4lQ/SOuoQj2jPLI/AAAAAAAAAPs/1M6gMnEov04/s320/photo(4).jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254478392713231538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now it's well into October and there's still plenty to be done, so I better get back to it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-8559644838520479778?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8559644838520479778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8559644838520479778'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/10/september-roundup.html' title='The September Roundup'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_sC8pULSl4lQ/SOun_1YGebI/AAAAAAAAAPc/Upg33Fqugj4/s72-c/photo.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7376083641511254653</id><published>2008-09-21T22:43:00.006-05:00</published><updated>2008-09-22T04:07:21.711-05:00</updated><title type='text'>Off to Manhattan</title><content type='html'>I'm all packed up and ready to catch my early morning flight to Manhattan for the &lt;a href="http://www.crunchgear.com/2008/09/16/t-mobile-officially-announces-android-press-conference-on-september-23rd/#comments"&gt;T-mobile&lt;/a&gt; press conference.&lt;br /&gt;&lt;br /&gt;This will be my first ever trip to New York, and I'm really excited. It's not going to be a very long trip, so I doubt I'll have any time for site seeing.  I'm hopeful that I'll at least be able to soak up the aura of the town a bit.&lt;br /&gt;&lt;br /&gt;The world at large is going to get their first glimpse of the first Android phone.  It will be interesting to see how people react to it.  I hope it receives a warm reception.  Many people (including myself) have waited almost a year for this unveiling.&lt;br /&gt;&lt;br /&gt;It's going to be an action packed week, following the press conference, I'm off to Mountain View for 3 days to rub shoulders with some Google folk and try and put some more polish on ShopSavvy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7376083641511254653?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7376083641511254653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7376083641511254653'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/09/off-to-manhattan.html' title='Off to Manhattan'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7643294650315038692</id><published>2008-09-16T07:08:00.005-05:00</published><updated>2008-09-16T08:41:23.525-05:00</updated><title type='text'>Android gaining momentum!</title><content type='html'>Judging by the number of job solicitations I've been receiving lately, I'd say that Android is building up some steam.  Not surprisingly, most of them are for short contracts (6 months or less) on the west coast.  However, if you jump back a couple months, there is virtually nothing on the radar.&lt;br /&gt;&lt;br /&gt;Of course, since I just co-founded a new mobile development firm called &lt;a href="http://www.biggu.com/about-big-in-japan/"&gt;Big In Japan&lt;/a&gt; with &lt;a href="http://www.linkedin.com/in/rylanbarnes"&gt;Rylan Barnes&lt;/a&gt; (author of &lt;a href="http://code.google.com/android/adc_gallery/app.html?id=17"&gt;GoCart&lt;/a&gt;) and &lt;a href="http://www.texasstartupblog.com/"&gt;Alexander Muse&lt;/a&gt; (evil startup mastermind), It's unlikely that I'll be entertaining offers anytime soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7643294650315038692?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7643294650315038692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7643294650315038692'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/09/android-gaining-momentum.html' title='Android gaining momentum!'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-561492358688006325</id><published>2008-08-28T23:44:00.006-05:00</published><updated>2008-08-28T23:52:13.492-05:00</updated><title type='text'>Trying to update TrivialGPS</title><content type='html'>As far as I can tell, the Android SDK's mock gps provider is broken in 0.9b, or at least, I haven't been able to get it to work.  I spent a couple hours tonight trying to update the TrivialGPS tutorial, so if you're looking for a new version, you'll have to wait until this gets sorted out.&lt;br /&gt;&lt;br /&gt;Nonetheless, I've committed some updates to svn, so maybe one of you out there can figure this out.&lt;br /&gt;&lt;br /&gt;You can grab the source from here :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/trivial-gps/source/checkout"&gt;http://code.google.com/p/trivial-gps/source/checkout&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-561492358688006325?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/561492358688006325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/561492358688006325'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/08/trying-to-update-trivialgps.html' title='Trying to update TrivialGPS'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7376019358405904467</id><published>2008-07-26T20:06:00.004-05:00</published><updated>2010-04-03T14:59:33.799-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><title type='text'>Agile Java by Jeff Langr</title><content type='html'>&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=ablogcallefoo-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0131482394&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;I finished reading &lt;a href="http://www.amazon.com/Agile-Java-TM-Test-Driven-Development/dp/0131482394/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1217120885&amp;amp;sr=8-1"&gt;Agile Java&lt;/a&gt; by Jeff Langr several nights ago, so it's time for another book review.&lt;br /&gt;&lt;br /&gt;The aim of this book is to teach the art of java programming using &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; (Test Driven Development), and it does so wonderfully.  I would not, however, recommend this book to a first time programmer.  If you have &lt;span style="font-weight: bold;"&gt;some&lt;/span&gt; programming experience, and would like to learn Java, then this book wouldn't be bad choice.&lt;br /&gt;&lt;br /&gt;Writing good unit tests is a skill like any other, and that's the primary reason I picked up this text.  Besides from the obvious, Jeff offers great practical advice on coding style and even naming things (the hardest thing in programming!).  The book reads like sagely advice from a battle hardened coder, he's been there, done it, and this is the distillation of what works.&lt;br /&gt;&lt;br /&gt;I'm not going to lie and say I'm disciplined enough to always use TDD, but this book helped me recognize the value of it.  Now I'm actively trying to avoid falling into my old TAD (Test After Development) habits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7376019358405904467?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7376019358405904467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7376019358405904467'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/07/agile-java-by-jeff-langr.html' title='Agile Java by Jeff Langr'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-6757082052254165842</id><published>2008-07-08T10:36:00.002-05:00</published><updated>2008-07-08T10:55:19.902-05:00</updated><title type='text'>Dallas Startup Happy Hour</title><content type='html'>I attended the &lt;a href="http://www.texasstartupblog.com/2008/06/23/announcing-springstage-startup-happy-hour-dallas/"&gt;Startup Happy Hour&lt;/a&gt; last night and had a blast.  I met some really cool people and received plenty of good advice. Here's a few of the people I met:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eknauth Persuad and Abdhullah Jibaly from &lt;a href="http://www.ayokasystems.com/"&gt;Ayoka&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Stormy Shippy, from &lt;a href="http://bigsight.org/stormy_shippy"&gt;UNT/Denton&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Christopher St John who runs a great &lt;a href="http://artofsystems.blogspot.com/"&gt;blog&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ayoka is sponsering the next startup happy hour, which is scheduled for the 21st.  If you're into startups at all, then I highly recommend this event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-6757082052254165842?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6757082052254165842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6757082052254165842'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/07/dallas-startup-happy-hour.html' title='Dallas Startup Happy Hour'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-5880194917969399273</id><published>2008-06-25T14:22:00.005-05:00</published><updated>2008-06-25T14:59:03.400-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startup'/><category scheme='http://www.blogger.com/atom/ns#' term='hacker'/><category scheme='http://www.blogger.com/atom/ns#' term='dallas'/><title type='text'>Improving the startup eco-system in Dallas</title><content type='html'>This is my response to Alex's post, &lt;a href="http://www.texasstartupblog.com/2008/06/25/building-a-better-startup-eco-system-in-dallas/"&gt;Building a better startup eco-system in Dallas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think part of the problem is that there doesn't appear to be much of a "hacker" culture here in Dallas.  Today's hackers could be tomorrow's investors (assuming they can get their companies off the ground).  I've gone out looking for fellow hackers at several local user group meetings. I even did a &lt;a href="http://www.dallastechfest.com/Speakers/tabid/56/Default.aspx"&gt;presentation on Android&lt;/a&gt; at the Dallas Tech Fest in the hopes of drawing some out. I've only met one person, &lt;a href="http://blackdilbert.blogspot.com/"&gt;Will (aka The Black Dilbert)&lt;/a&gt; who'd I potentially call a hacker (I still don't know him very well, but he seems cool.)&lt;br /&gt;&lt;br /&gt;By hacker, I mean, you're the opposite of a shopcoder. You don't stop coding at 5:00 pm. You go home and work on stuff that you find fun and interesting. You're likely contribute to open source projects.  You probably have a website where others can download your code. I know there has to be more of you in Dallas than what I've seen, where are you guys?  We need to get together and share ideas.&lt;br /&gt;&lt;br /&gt;I get jealous when my friend &lt;a href="http://www.rockstarprogrammer.org/"&gt;Dustin&lt;/a&gt;, who lives Santa Clara, tells me about hacker-centric events like the &lt;a href="http://superhappydevhouse.org/"&gt;Supper Happy Dev House&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SYLekr6fsiY&amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/SYLekr6fsiY&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Why can't we have events like this in Dallas? I'd host one myself if I had the space available, does anyone want to step up and host/sponser an all night hackathon?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-5880194917969399273?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/5880194917969399273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=5880194917969399273' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5880194917969399273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5880194917969399273'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/06/improving-startup-eco-system-in-dallas.html' title='Improving the startup eco-system in Dallas'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7684580908837536714</id><published>2008-06-24T14:51:00.004-05:00</published><updated>2008-06-24T16:07:30.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='youth'/><category scheme='http://www.blogger.com/atom/ns#' term='interent'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The impact of the internet.</title><content type='html'>I was just ruminating about how my life could have evolved differently, had the internet been available in it's present form when I was growing up.  My son is just 10 months old, and the internet will have a huge impact on his development.&lt;br /&gt;&lt;br /&gt;I'm struggling to remember how old I was when I wrote my first real computer programs. My earliest adventures in programming were on my father's TRS-80 Model IV.  This was probably in 1983/84 which puts me at around 9 or 10 years old. It came with a very simple introduction to programming manual, and I picked it up and learned the basics of basic in a few days.  The earliest programs I wrote were very simple, I think one of my favorites was a text based wrestling game, where you could be Ric Flair or something like that.  My little brother really enjoyed playing it, watching wrestling was a favorite pastime.&lt;br /&gt;&lt;br /&gt;When I was in my early teens, my father bought an 8086 PC.  It came with MS-DOS (can't remember the version), and GW-BASIC.  I kept writing silly things in basic. I used basic for a very long time,  it was all I knew.&lt;br /&gt;&lt;br /&gt;Eventually I heard about this language called C, I don't remember where or when I heard about it, but I thought it was such a cool name for a programming language.  I remember going to a book store and looking at some books about C, but I didn't have access to a compiler or any other tools.  The idea of programming without line numbers fascinated me.  I wanted to learn more about this thing called a "compiler".&lt;br /&gt;&lt;br /&gt;It wasn't until much later, when I was in college, that I was finally able to get my hands on all this cool stuff and start learning to write code without line numbers.  First in pascal, and then later in C and C++.&lt;br /&gt; &lt;br /&gt;Nowadays, almost anyone can download free compilers and developer tools from the internet, there are a plethora of great free tutorials online to teach you just about anything you want to know. Jumping back to when I was about 13 years old, if I had access to these resources in 1987, I can only imagine the impact it would have had on me.  I could have potentially already been an experienced programmer by the time I entered college.  Maybe I would have even written a game or two back when one person could do something interesting on the limited hardware of the day.&lt;br /&gt;&lt;br /&gt;Of course, there's always the chance that instead of learning C at age 13, I would have discovered what many consider to be the true purpose of the internet, porn, and never written a line of code again!!!&lt;br /&gt;&lt;br /&gt;I guess the point I'm trying to make, is that the internet has made the world smaller in many ways.  My son is going to be exposed to a far more diverse set of ideas and information than I ever had access to when I was growing up. I want to help him leverage this vast resource as much as possible. I don't want him to ever feel like I did, wanting to learn more about a subject but having nowhere to turn.  This is certainly an exciting time to be alive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7684580908837536714?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/7684580908837536714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=7684580908837536714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7684580908837536714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7684580908837536714'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/06/impact-of-internet.html' title='The impact of the internet.'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2432789612943769414</id><published>2008-05-30T21:14:00.005-05:00</published><updated>2008-05-31T00:21:28.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IO2008'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Google IO Report</title><content type='html'>So now that I'm back from San Francisco and relaxing on my big comfy couch, it's time to get down to business and do a writeup on what I saw, heard, tasted and smelled at Google IO.&lt;br /&gt;&lt;br /&gt;I flew into SJC on Tuesday night and stayed at a friends place.  The next morning I hopped on the Caltrain and made my way to the Moscone center in downtown SF where I was greeted by massive lines of developers all trying to get registered.&lt;br /&gt;&lt;br /&gt;Someone with authority rightly recognized that registration was so backlogged that there was no way they could get the bulk of us processed in time for the opening keynote.  So they allowed us to bypass the registration disaster, but warned us that we would need to register before 2:00 pm, or they'd throw us out or something.  Almost immediately I heard a guy on a cell phone call his friend and say, "Hey, you can get into Google IO for FREE until 2:00!!!"&lt;br /&gt;&lt;br /&gt;The keynote was an exposition on the web as the next big platform, and how Google wanted to help evolve it at a faster pace. They highlighted all their major projects like Gears, Google App Engine, Android, etc.  You can probably read all about the keynote on a hundred other blogs, the place was packed.&lt;br /&gt;&lt;br /&gt;The one and only moment, where an "oooooooh" rolled through the crowd, was during an Android demo where they pulled up a street view and then panned it around in real time using a compass built into the handset.  It looked really slick, and it instantly reminded me of the &lt;a href="http://www.enkin.net/"&gt;Enkin&lt;/a&gt; project (which SHOULD have been an ADC winner , what were the judges smoking?).&lt;br /&gt;&lt;br /&gt;I managed to catch the Jason Chen's Android introductory session.  It was decent enough, but remedial for me at this point. I was hoping to socialize with some fellow Android nerds and that just seemed like the place to be.  Afterwards, some nervous looking guy asked me if I would answer a few questions about Android, I said, "sure" and suddenly a camera crew teleported in, and I spent about 2/3 minutes being interviewed by a Japanese TV station (NHK or something like that).&lt;br /&gt;&lt;br /&gt;About 30 minutes later I started feeling really ill and felt a brutal headache coming on, so I walked to my hotel (&lt;a href="http://www.parc55hotel.com/"&gt;the parc 55&lt;/a&gt;) and tried to sleep it off.  (Side note: This hotel sucked, their inet access was broken, as was the TV remote, and the paper thin walls ensure that you here every obnoxious person that stomps down the hallway).&lt;br /&gt;&lt;br /&gt;When I finally made my way back to the conference the sessions were over for the day and the after hours event had started.  I felt bummed, since I missed out on some really good sessions.  I briefly talked to Dan Morrill and a few other Android developers, and just enjoyed the party with everyone else.  I left in better spirits, it was a good time.&lt;br /&gt;&lt;br /&gt;The next day went much better, I caught two more Android sessions, the first was on Dalvik, and it was very good, although I felt out of my depth more than once during the talk.  The next was Dan's session on Android Anatomy, and this one was very useful indeed.  I walked out of that one with a much better understanding of Android's lifecycle events and how to use them correctly.&lt;br /&gt;&lt;br /&gt;I then grabbed a late lunch, and as luck would have it, some guy with a TuneWiki t-shirt sat down right across from me, so of course I struck up a conversation.  Turns out he was hobbs, from &lt;a href="http://helloandroid.com/"&gt;helloandroid.com&lt;/a&gt; and we had a really interesting chat, probably one of the coolest people I met during the conference.&lt;br /&gt;&lt;br /&gt;I would have liked to stay around for a couple more sessions, but I had to get to the caltrain in order to catch my flight back to Dallas, I'll definitely want to give myself a larger time buffer next time so I don't have to rush about so much.&lt;br /&gt;&lt;br /&gt;So to recap, it was a great event, and I look forward to next year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2432789612943769414?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/2432789612943769414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=2432789612943769414' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2432789612943769414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2432789612943769414'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/05/google-io-report.html' title='Google IO Report'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4468460553845384734</id><published>2008-04-16T13:53:00.014-05:00</published><updated>2008-04-17T11:29:54.548-05:00</updated><title type='text'>living  fully leveraged</title><content type='html'>I'm fully throttled and punching the afterburner. So many little projects going on and it's not going to let up for another three weeks at least. Time to take a little respite and update my personal blog.&lt;br /&gt;&lt;br /&gt;  I don't think I've mentioned it on this blog, but I've launched a micro-startup called Droidworks, specializing in mobile products for the Android platform.  I've put together a team of four developers and we're trying to get the ball rolling.  We're just getting started and don't even have a website yet.  Well, that's not exactly true, I do have a blog up and running at &lt;a href="http://blog.droidworks.com/"&gt;http://blog.droidworks.com/&lt;/a&gt;.  We have two projects under heavy development, and a couple more in the planning stages.  &lt;br /&gt;&lt;br /&gt;  My first project is a location-based information service called GeoMata. You can read all about it on the &lt;a href="http://blog.droidworks.com/"&gt;droidworks blog&lt;/a&gt;, so I won't repeat that information here.  It's my official entry for the &lt;a href="http://code.google.com/android/adc.html"&gt;Android Developer Challenge&lt;/a&gt;, and thankfully the deadline has finally arrived (April 14th).  I don't know how many more 3:00 am hackathons in a row I can stand.&lt;br /&gt;&lt;br /&gt;  My good pal and illustrious new product manager at Novell, &lt;a href="http://www.beyondfocus.com/"&gt;Joseph Hill&lt;/a&gt;, has skillfully persuaded me into doing a presentation on Android at the &lt;a href="http://www.dallastechfest.com/"&gt;Dallas Techfest 2008&lt;/a&gt;. I plan to cover some general topics, do two or three code walk-throughs, and then wrap up with a QA session. I might have a co-presenter as well do a short OpenGL segment, we'll see how this plays out.  SSShhh, don't tell anyone, but this is my first time presenting, and I'm probably going to be nervous and red-faced as hell.  You think I could have picked a smaller venue for my debut, eh? &lt;br /&gt;&lt;br /&gt;  I'll also be attending &lt;a href="http://code.google.com/events/io/"&gt;Google IO&lt;/a&gt; in the later end of May, but thankfully I won't be presenting.  I'll just be another guy with a laptop, taking notes, having fun, and cramming as much google loot into my backpack as possible.&lt;br /&gt;&lt;br /&gt;  On top of all this my in-laws are in town for a month from Russia.  My Russian is pretty terrible, and they speak practically no English at all, so we have some real communication difficulties when my bi-lingual wife isn't around.  But I'm glad they're here, they've taken away some of the day to day stress and that's helped me focus more on my projects, this weekend I'm hoping to take some time and visit the &lt;a href="http://www.scarboroughrenfest.com/"&gt;Scarbourough Fair in Waxahachie&lt;/a&gt;, I've always heard it was fun.&lt;br /&gt;&lt;br /&gt;  I hope to do a couple more android tutorials in the next few weeks as I ramp up for my presentation.  Pretty basic stuff, I'd like to do a small one one related to  ContentProviders and another one on ProgressDialogs.  Things that are both very simple to convey, but useful for beginners as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4468460553845384734?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/4468460553845384734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=4468460553845384734' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4468460553845384734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4468460553845384734'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/04/living-fully-leveraged.html' title='living  fully leveraged'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4679156793730573230</id><published>2008-02-13T09:30:00.007-06:00</published><updated>2008-07-02T14:13:58.110-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='employment'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>7 years required!!!</title><content type='html'>Recently one of my favorite bloggers, Jeff Atwood, posted a piece called &lt;a href="http://www.codinghorror.com/blog/archives/001054.html"&gt;"The Years of Experience Myth"&lt;/a&gt;.  His analysis is dead on. I previously &lt;a href="http://jasonhudgins.blogspot.com/2007/07/dumb-it-hiring-managers.html"&gt;blogged&lt;/a&gt; about my aggravation when I received a recruitment email for a position that required 10 years of J2EE experience (even thought at the time, J2EE was only 8 years old).&lt;br /&gt;&lt;br /&gt;Java has evolved quite a bit since it's early releases, unlike languages such as C which has stayed pretty much the same for the last 15 years (perhaps longer, but I didn't get my first glimpse of C until 1993).   I was reminded of this recently when I  started looking at some old java code replete with vectors, hand made enumerations, and nary a Collection to be found.  That's just how it was done when this code was written.  My point is, if today you were writing the same application using Java 1.5/6 it would be done quite a bit differently.&lt;br /&gt;&lt;br /&gt;I've worked with &lt;span style="font-weight: bold;"&gt;many&lt;/span&gt; java developers that can easily claim five years of J2EE/java experience.  Frightfully, a huge chunk of them still don't understand generics, don't do any unit testing, don't know about some of Java 1.5's other features such as foreach constructs, C-style variable argument lists, annotations, etc, I could go on and on.  They  don't read about software design, they dont' code on their own time for fun, and when they are working they pound out 700+  line methods that are hellishly complicated and break quite often. What happens when Java 1.7 gets here and gives us goodies like &lt;a href="http://en.wikipedia.org/wiki/Monkey_patch"&gt; monkey patching&lt;/a&gt; and &lt;a href="http://www.javac.info/"&gt;closures&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Despite this, if you ask any technical recruiter in the DFW metroplex, these guys are going to be regarded as "senior" java developers.  For a guy like me, that can be quite aggravating if your seeking employment.&lt;br /&gt;&lt;br /&gt;I don't claim to be the greatest developer ever, quite the contrary, I know I have a lot to learn, or as Jeff once wrote, &lt;a href="http://www.codinghorror.com/blog/archives/000530.html"&gt;try to suck less every year&lt;/a&gt;.  But one thing I can say is that I care about my craft. I decided that that if I was going to be a software engineer, that I was going to be good at it.&lt;br /&gt;&lt;br /&gt;Perhaps I'm being overly harsh, or maybe this type of thinking is just more pervasive in DFW than in other places.  I've heard on many occasions that the bay area is a much saner place for IT professionals.  Whatever may be the case, for now I've learned that the best way to find a satisfying job is to widen your social network and to become friends with as many people in your industry as possible.  Talking to recruiters and using  job boards is fine if you have to, but it's just a lot harder.  There are companies, even in DFW, where there are some pretty smart people working, but they still use shabby recruiting firms. If they would just adjust their candidate screening processes, our industry would be a lot better off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4679156793730573230?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/4679156793730573230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=4679156793730573230' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4679156793730573230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4679156793730573230'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/02/7-years-required.html' title='7 years required!!!'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-3999783666531579419</id><published>2008-01-30T20:32:00.000-06:00</published><updated>2008-11-15T02:02:57.001-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='angle grinder'/><category scheme='http://www.blogger.com/atom/ns#' term='hackjob'/><category scheme='http://www.blogger.com/atom/ns#' term='home improvement'/><title type='text'>n00b home improvement</title><content type='html'>I just bought my first home this past April. I have great ambitions to fix up my place, but zero experience with this kind of thing. I wanted to share my non-experience for all to mock and deride.&lt;br /&gt;&lt;br /&gt;So here's the problem. I want to update all the electrical face plates in my dining room to these nice looking metal ones that I bought at Lowes. But this one pesky outlet is too close to the baseboards and the face plate won't fit.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E1Q7miLtI/AAAAAAAAAKk/nHB7E6Scx5g/s1600-h/IMG_1009.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E1Q7miLtI/AAAAAAAAAKk/nHB7E6Scx5g/s200/IMG_1009.jpg" alt="" id="BLOGGER_PHOTO_ID_5161465212936793810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;For anyone who has spent more than 30 minutes in a high school shop class, this is probably as easy as it gets, but for a guy who can't find the on switch on most power tools, I'm thinking to myself, "Damn. This is going to be stupid hard."&lt;br /&gt;&lt;br /&gt;Lucky for me there's the internet, and I found some helpful people on a home improvement forum.  The best advice I found was to get a grinder and slowly grind down the face plate until it fits.  Sounds good, lets do it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_sC8pULSl4lQ/R6E2VrmiLuI/AAAAAAAAAKs/r2w2rAARqmg/s1600-h/IMG_1004.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_sC8pULSl4lQ/R6E2VrmiLuI/AAAAAAAAAKs/r2w2rAARqmg/s200/IMG_1004.jpg" alt="" id="BLOGGER_PHOTO_ID_5161466394052800226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I like buying tools, even ones I have no idea how to use, I think that's just a male instinct.  After scrutinizing the reviews on Amazon I settled on a Bosch angle grinder.  It sounded like a very versatile tool and everyone who bought one praised it's durability, power, safety features, yada-yada- ya...&lt;br /&gt;&lt;br /&gt;I un-boxed it, read the instructions, clamped the face plate down on my $80 plastic work bench, and got to grinding.  Oh yeah, I was also wearing a pair of work gloves and some cheap plastic goggles. That's mandatory when using a grinder (according to the manual, anyway).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sC8pULSl4lQ/R6E3dbmiLvI/AAAAAAAAAK0/71rxsUcLh_E/s1600-h/IMG_1005.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_sC8pULSl4lQ/R6E3dbmiLvI/AAAAAAAAAK0/71rxsUcLh_E/s200/IMG_1005.jpg" alt="" id="BLOGGER_PHOTO_ID_5161467626708414194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wow, that looks like crap.  This thing is harder to control than I thought it would be.  The only way I'm going to be able to smooth this thing out, is to get up close and personal.  But when I try to squat down eye-level with it , little chunks of metal are flying off and impacting with my face.  Surprisingly, this is both distracting AND painful. So it's back to Lowes again.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_sC8pULSl4lQ/R6E4yLmiLwI/AAAAAAAAAK8/SIeVtf-e82U/s1600-h/IMG_1006.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_sC8pULSl4lQ/R6E4yLmiLwI/AAAAAAAAAK8/SIeVtf-e82U/s200/IMG_1006.jpg" alt="" id="BLOGGER_PHOTO_ID_5161469082702327554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Plan 'B'.  This face shield worked a lot better than those lame goggles. With these on I can get down to eye-level and do some detail grinding.  Just be prepared for your wife to tease you a bit when your trying to figure out how to put the thing on.  By now I'm getting the hang of things, what angle to hold the grinder at, how much pressure to apply, etc.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E5r7miLxI/AAAAAAAAALE/3BN5FjZdG4s/s1600-h/IMG_1007.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E5r7miLxI/AAAAAAAAALE/3BN5FjZdG4s/s200/IMG_1007.jpg" alt="" id="BLOGGER_PHOTO_ID_5161470074839772946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's a lot straighter now, but it still probably looks like an amateurish hack job.  Unfortunately there is no undo button with this kind of thing.  I've decided I can live with it for now.  At some point I might go to Lowes, buy another face plate, and try again.  For now I'd like to see what kind of comments this can generate.  After all, if this was a perfect job, then that would make this post a lot less fun, wouldn't it?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E507miLyI/AAAAAAAAALM/1BIPNaszuwU/s1600-h/IMG_1011.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E507miLyI/AAAAAAAAALM/1BIPNaszuwU/s200/IMG_1011.jpg" alt="" id="BLOGGER_PHOTO_ID_5161470229458595618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My next project is going to involve a hammer drill, which is another tool that I have zero experience with.  That sounds fun and moderately dangerous.  Wish me luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-3999783666531579419?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/3999783666531579419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=3999783666531579419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3999783666531579419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3999783666531579419'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/01/n00b-home-improvement.html' title='n00b home improvement'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_sC8pULSl4lQ/R6E1Q7miLtI/AAAAAAAAAKk/nHB7E6Scx5g/s72-c/IMG_1009.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7459745232674269637</id><published>2008-01-27T11:07:00.001-06:00</published><updated>2008-11-15T02:02:57.178-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android Campfire</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_sC8pULSl4lQ/R5y6brmiLsI/AAAAAAAAAKY/qgN9P3tLUAM/s1600-h/android_pic_small.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_sC8pULSl4lQ/R5y6brmiLsI/AAAAAAAAAKY/qgN9P3tLUAM/s320/android_pic_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5160204257783328450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://android-developers.blogspot.com/2008/01/who-wants-cocoa-smores.html"&gt;android campfire&lt;/a&gt; was definitely worth going to. It was much more intimate than I anticipated. There couldn't have been more than 75 people there.&lt;br /&gt;&lt;br /&gt;Google takes the campfire term seriously. They had a simulated campfire, and served hot cocoa and smores from inside a tent.&lt;br /&gt;&lt;br /&gt;The first hour was a QA session. Developer advocate Dan Morrill fielded the questions.  There was a common theme throughout.  People don't want to pour resources into the platform, only to see carriers gut out parts of android that might threaten their bottom line.  Google hasn't made any such promises.  Dan stressed that distributing a crippled platform was very contrary to the spirit of the &lt;a href="http://www.openhandsetalliance.com/"&gt;OHA&lt;/a&gt;, and isn't likely to be an issue.&lt;br /&gt;&lt;br /&gt;If I ran a big shop and was paying out large gobs of cash, then I would probably be worried too.  But as a lonely independent pounding out my applications in my spare time, it costs less to make a leap of faith.&lt;br /&gt;&lt;br /&gt;After the QA we broke up and mingled for a couple hours.  Developers are natural introverts, so starting up a conversation with a random person is scary.  It is well worth it to come out of your shell though.  Everyone is very friendly once you break the ice, and you can get  valuable feedback about your ideas. That, in my mind, is the whole point of a meeting like this.&lt;br /&gt;&lt;br /&gt;A few people were secretive about their &lt;a href="http://code.google.com/android/adc.html"&gt;android challenge&lt;/a&gt; entries, but I took some good advice from &lt;a href="http://www.texasstartupblog.com/"&gt;Alex Muse&lt;/a&gt;, and was completely open.  I received a lot of great feedback, and it was very interesting to see what others were working on.  Ironically, the people who were the most secretive usually had the worst ideas.&lt;br /&gt;&lt;br /&gt;So now I'm looking forward to the code day in Boston, coming up on February 23rd.  That will be a good idea to meet even more developers, learn some stuff in a couple workshops, and of course grab more android swag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7459745232674269637?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/7459745232674269637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=7459745232674269637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7459745232674269637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7459745232674269637'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/01/android-campfire.html' title='Android Campfire'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_sC8pULSl4lQ/R5y6brmiLsI/AAAAAAAAAKY/qgN9P3tLUAM/s72-c/android_pic_small.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2642755944218926880</id><published>2008-01-16T10:28:00.000-06:00</published><updated>2008-01-17T08:25:43.964-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Have laptop, will travel...</title><content type='html'>I've been hard at work on a project for the &lt;a href="http://code.google.com/android/adc.html"&gt;android developer challenge&lt;/a&gt; since December.  I hope to submit two entries, but that all depends on how much I can get done in the next month and a half.&lt;br /&gt;&lt;br /&gt;A couple days ago, Dan Morrill announced an &lt;a href="http://android-developers.blogspot.com/2008/01/who-wants-cocoa-smores.html"&gt;Android campfire&lt;/a&gt;, on the 23rd.  I've been looking for an excuse to get my &lt;a href="http://www.amazon.com/Ogio-711109-280-Metroid-Pack-Indigo/dp/B000NDN2RM/ref=pd_bbs_1?ie=UTF8&amp;amp;s=sporting-goods&amp;amp;qid=1200503800&amp;amp;sr=8-1"&gt;new ogio backpack&lt;/a&gt; out of the closet and jump on a plane.  It will be fun to visit the googleplex again, chat about my new favorite hobby and see what kinds of cool applications everyone else is working on.&lt;br /&gt;&lt;br /&gt;I hang out on #android (freenode) and try to keep up with the developer lists, but I've yet to meet many android developers in my area (DFW).  If you are in my area and are doing anything with android, feel free to contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2642755944218926880?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/2642755944218926880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=2642755944218926880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2642755944218926880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2642755944218926880'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2008/01/have-laptop-will-travel.html' title='Have laptop, will travel...'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-9193339858780159003</id><published>2007-12-25T22:05:00.028-06:00</published><updated>2010-07-12T09:57:15.808-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Cruising around with Android</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.droidworks.com/images/trivial-gps.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 334px; height: 624px;" src="http://www.droidworks.com/images/trivial-gps.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy holidays, my fellow code slingers! For the past three weeks, I've plunged myself into the world of &lt;a href="http://developer.android.com/index.html"&gt;Android&lt;/a&gt;, the new mobile-platform SDK from our friends at Google.  I'm really excited about the possibilities of this platform.  The telephony API will be broken wide open for our fun and amusement.&lt;br /&gt;&lt;br /&gt;Do you want to sync your phone contacts to a remote data source?  No problem, use the bundled HttpClient and write a service.  Do you have a buddy that likes to drunk dial you at 3:00 a.m.? Why not have a service that can filter his calls out during certain hours.  Things like this would be hard or downright impossible in the past. Now we have Android!&lt;br /&gt;&lt;br /&gt;I thought I'd do a little tutorial showcasing the Location API that ships with android. This is definitely a fun API to play with, so allow me to introduce the TrivialGPS application.&lt;br /&gt;&lt;br /&gt;The aptly named TrivialGPS application will display a &lt;a href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html"&gt;MapView&lt;/a&gt;, and center it on our current location as we move through the bay in "real-time".  We use the observer pattern with the &lt;a href="http://code.google.com/android/reference/android/location/LocationManager.html"&gt;LocationManager&lt;/a&gt;, so our application can receive updates about changes in our current position and update the MapView accordingly.&lt;br /&gt;&lt;br /&gt;At this point, I'm going to assume that you have either looked at the Android tutorials and have at least a rudimentary understanding of the framework, or that you're so damn intelligent that you don't need to.&lt;br /&gt;&lt;br /&gt;First off, your manifest file must declare a couple of permissions for this application to work.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;INTERNET&lt;/li&gt;&lt;li&gt;ACCESS_FINE_LOCATION&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The TrivialGPS is a single activity that displays a map, so to do this our activity must extend MapActivity.&lt;br /&gt;&lt;br /&gt;We need three member fields: The MapView which we will be displaying, a &lt;a href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html"&gt;MapController&lt;/a&gt; which can center the map, and a &lt;a href="http://code.google.com/android/reference/android/location/LocationManager.html"&gt;LocationManager&lt;/a&gt; which we can query for providers and request geo information from.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class TrivialGPS extends MapActivity {&lt;br /&gt;&lt;br /&gt;private MapController mapController;&lt;br /&gt;private MapView mapView;&lt;br /&gt;private LocationManager locationManager;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Our onCreate method starts out very simple.  We create a new MapView, set the zoom level to 22 (pretty close up, so we can see the streets), store a reference to the MapController, and then tell Android to display the map. We'll be revisiting this method a little bit later.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle icicle) {&lt;br /&gt;super.onCreate(icicle);&lt;br /&gt;&lt;br /&gt;mapView = new MapView(this);&lt;br /&gt;mapController = mapView.getController();&lt;br /&gt;mapController.zoomTo(22);&lt;br /&gt;setContentView(mapView);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;In order to receive notifications about location updates, we need a LocationListener&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;.&lt;/a&gt;  A LocationListener is basically a callback that will be executed whenever there's a location change event.  The simplest way to do this is with an inner class. The class must implement several methods, but the onLocationChanged method is the only one that will actually do any work. Will receive the coordinates, convert them to microdegrees, int a GeoPoint instance from these, and then uses the MapController to center the view on the new point.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class LocationUpdateHandler implements LocationListener {&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onLocationChanged(Location loc) {&lt;br /&gt;int lat = (int) (loc.getLatitude()*1E6);&lt;br /&gt;int lng = (int) (loc.getLongitude()*1E6);&lt;br /&gt;GeoPoint point = new GeoPoint(lat, lng);&lt;br /&gt;mapController.setCenter(point);&lt;br /&gt;setContentView(mapView);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onProviderDisabled(String provider) {}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onProviderEnabled(String provider) {}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void onStatusChanged(String provider, int status, &lt;br /&gt;Bundle extras) {}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;As promised, we now return to onCreate method.&lt;br /&gt;&lt;br /&gt;The first thing we've added is a call to initialize the LocationManager.  We do this with a simple getSystemService call.  After this we just tell the locationManager that we wish to receive continous updates (the 0,0 parameters), from the hardware GPS and pass it a reference to our LocationListener.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public void onCreate(Bundle icicle) {&lt;br /&gt;super.onCreate(icicle);&lt;br /&gt;&lt;br /&gt;// create a map view&lt;br /&gt;mapView = new MapView(this);&lt;br /&gt;mapController = mapView.getController();&lt;br /&gt;mapController.zoomTo(22);&lt;br /&gt;setContentView(mapView);&lt;br /&gt;&lt;br /&gt;// get a hangle on the location manager&lt;br /&gt;locationManager =&lt;br /&gt;(LocationManager) getSystemService(Context.LOCATION_SERVICE);&lt;br /&gt;&lt;br /&gt;locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,&lt;br /&gt;new LocationUpdateHandler());&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I hope some of you can find this useful. It took me several hours to figure this stuff out and get it working in my own application, so perhaps this tutorial will be a nice time saver for some of you out there, that way you can get back to your eggnog and Xmas toys.&lt;br /&gt;&lt;br /&gt;The complete source for this tutorial is available here :&lt;br /&gt;&lt;a href="http://code.google.com/p/trivial-gps/"&gt;http://code.google.com/p/trivial-gps/&lt;/a&gt;&lt;br /&gt;or on github if you prefer:&lt;br /&gt;&lt;a href="http://github.com/jasonhudgins/TrivialGPS/tree/master"&gt;http://github.com/jasonhudgins/TrivialGPS/tree/master&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-9193339858780159003?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/9193339858780159003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=9193339858780159003' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/9193339858780159003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/9193339858780159003'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/12/cruising-around-with-android.html' title='Cruising around with Android'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-3457707538161959382</id><published>2007-10-30T16:10:00.000-05:00</published><updated>2007-12-25T23:22:46.125-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='translate'/><title type='text'>A Google Translate API?</title><content type='html'>I got all excited today when my favorite podcasters, the &lt;a href="http://javaposse.com/" _fcksavedurl="http://javaposse.com/"&gt;Java Posse&lt;/a&gt; announced in episode #148 that Google had released an API for their translate service.&lt;br /&gt;&lt;br /&gt;I've had my own implementation going on for several months now, and I was all ready to post that I was going to discontinue my  Google Translate Scraper.  Who wants to use a scraper when you've got a real robust interface, right?&lt;br /&gt;&lt;br /&gt;Then I looked at the code, and there is no way this is an official Google API, because it's nothing more than a &lt;a href="http://google-api-translate-java.googlecode.com/svn/trunk/src/com/google/api/translate/" _fcksavedurl="http://google-api-translate-java.googlecode.com/svn/trunk/src/com/google/api/translate/"&gt;two class scraper&lt;/a&gt; that's far more immature than &lt;a href="http://www.incantations.net/%7Ejason/software/" _fcksavedurl="http://www.incantations.net/~jason/software/"&gt;my own implementation.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A couple of key differences between this one and mine.  MIne has some basic test coverage, this one doesn't.  My implementation will throw a TranslationException if you try to send more data than Google will process (you can't just send them an arbitrary amount of text).  My implementation includes a real XML parser so if Google radically changes their HTML structure I can can still parse it cleanly.&lt;br /&gt;&lt;br /&gt;So for now I'll keep my project going, hopefully one day Google really will release an API for their translate service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-3457707538161959382?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/3457707538161959382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=3457707538161959382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3457707538161959382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3457707538161959382'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/10/google-translate-api.html' title='A Google Translate API?'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-5985867411680310184</id><published>2007-10-11T16:07:00.000-05:00</published><updated>2007-12-25T23:28:17.031-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='maxim'/><title type='text'>Return of the Coder</title><content type='html'>It feels good to get some coding done, even if it isn't a whole lot.  I've had a long hiatus for the last two months and now I'm trying to pick things up where I left off.  The reason for my absence?&lt;br /&gt;&lt;br /&gt;&lt;img alt="Maxim Alexander Hudgins" src="http://farm3.static.flickr.com/2254/1544718358_b2bf5e478d.jpg?v=0" _fcksavedurl="http://farm3.static.flickr.com/2254/1544718358_b2bf5e478d.jpg?v=0" height="500" width="333" /&gt;&lt;br /&gt;&lt;br /&gt;Maxim Alexander Hudgins (7 lbs  10 oz) was born in Aug 20th, he's my first and I'm quite proud.  In fact I hear him cooing in the background as I write this.  I know what your thinking, but no, we did not name him after a men's magazine. His name is a very old Russian name and it's pronounced "mak seam".&lt;br /&gt;&lt;br /&gt;Plenty of photos here :  &lt;a href="http://www.flickr.com/photos/jasonhudgins/tags/maxim/" _fcksavedurl="http://www.flickr.com/photos/jasonhudgins/tags/maxim/"&gt;www.flickr.com/photos/jasonhudgins/tags/maxim/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Changing the subject, almost every java developer that I know uses &lt;a href="http://www.eclipse.org/" _fcksavedurl="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; as their primary IDE.  I listen to the &lt;a href="http://javaposse.com/" _fcksavedurl="http://javaposse.com/"&gt;javaposse&lt;/a&gt; podcast pretty religiously, and they have always said good things about &lt;a href="http://www.netbeans.org/" _fcksavedurl="http://www.netbeans.org/"&gt;NetBeans.&lt;/a&gt;  So I decided to take a serious look at it.&lt;br /&gt;&lt;br /&gt;The big thing for me is support for &lt;a href="http://maven.apache.org/" _fcksavedurl="http://maven.apache.org/"&gt;maven&lt;/a&gt;, I love it and I can't imagine not using it.  With eclipse you have two options, you can either use the internal maven plugin (mvn eclipse:* commands), to generate the project files for eclipse or you can use the &lt;a href="http://m2eclipse.codehaus.org/" _fcksavedurl="http://m2eclipse.codehaus.org/"&gt;maven eclipse plugin&lt;/a&gt;.  Bad things tend to happen if you try to use both at the same time.  Of the two I prefer the maven internal plugin, I've only experienced grief with the eclipse plugin.&lt;br /&gt;&lt;br /&gt;Getting maven to integrate cleanly with WTP in eclipse for developing web apps was a painful experience for me.  For one thing, you can't use the newest version of eclipse, europa,  because the maven internal plugin doesn't yet support WTP 2.0 yet  Even using 3.2.2 it seems like I was always having to much around .classpath and try to get things to work.&lt;br /&gt;&lt;br /&gt;There is also a maven plugin for NetBeans, it's called &lt;a href="http://mevenide.codehaus.org/m2-site/index.html" _fcksavedurl="http://mevenide.codehaus.org/m2-site/index.html"&gt;mavenide&lt;/a&gt;.  It also comes from CodeHaus, the makers of the eclipse plugin.  After installing the plugin and opening one of my maven projects, I was immediately aware that mavenide has a very tight integration with the NetBeans platform.  It's features are very well organized, and I have yet to do any mucking with config files, everything is just working, and I'm very happy.  The webapp support is really great.  NetBeans 6 is looking good too, but the maven support wasn't quite up to par, so I'm still using 5.5 at the moment.  I'm ready to say goodbye to eclipse for the time being, but I expect both apps to continue to improve so swearing fealty to either would be short sighted.&lt;br /&gt;&lt;br /&gt;And the final bit of news, I've released version 0.9.8 of the GoogleTranslateScraper, it's available on my &lt;a href="http://www.incantations.net/%7Ejason/software/" _fcksavedurl="http://www.incantations.net/~jason/software/"&gt;software page&lt;/a&gt;.  I've cleaned up the unit tests and put a cap on the amount of text you can submit for a translation job (30000 characters max).&lt;br /&gt;&lt;br /&gt;Somewhere around this point google stops translating.  My first idea was to just split up the input into smaller chunks and submit multiple jobs concurrently.  Sounds easy, but you can't just arbitrarily split the data, you have to try and do it on a sensible boundary, like the end of a sentence, otherwise your translation won't work very smoothly across the transitions.  A character followed by some punctuation would do it for English, but I don't know how to do it with non-western languages, Chinese, etc. So I took the easy way out and just punted the problem up to the next layer in the application.  So if your using my library and want to translate large globs of text, then it's your job to split the data into chunks in whatever way you feel is appropriate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-5985867411680310184?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/5985867411680310184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=5985867411680310184' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5985867411680310184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5985867411680310184'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/10/return-of-coder.html' title='Return of the Coder'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7439646238402774052</id><published>2007-07-25T16:03:00.000-05:00</published><updated>2007-12-25T23:28:02.479-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='translate'/><title type='text'>Google Translator Restlet published</title><content type='html'>You can find it &lt;a href="http://www.incantations.net:8080/translator/instructions" _fcksavedurl="http://www.incantations.net:8080/translator/instructions"&gt;here&lt;/a&gt;, including a complete tutorial for consuming the service using the &lt;a href="http://www.restlet.org/" _fcksavedurl="http://www.restlet.org"&gt;restlet&lt;/a&gt; framework.  Even if your language of choice is not java, it shouldn't be very difficult for you to write your own consumer using the the documentation I've provided.&lt;br /&gt;&lt;br /&gt;In brief, it's an asynchronous &lt;a href="http://en.wikipedia.org/wiki/RESTful" _fcksavedurl="http://en.wikipedia.org/wiki/RESTful"&gt;RESTful&lt;/a&gt; service that allows you to create a translation job by posting to a specific URL, and if the job is accepted it returns you a 201 Created status and a Location header telling you where you can pick up the results when processing has completed.  Then it's just a simple task of polling the result URL (a job resource).  The job resouce  will return an HTTP 102 Processing status until it completes, at which point you'll then get a 200 Okay, and your results in UTF-8 encoded text/plain.&lt;br /&gt;&lt;br /&gt;I posted about my service on the &lt;a href="http://news.gmane.org/gmane.comp.java.restlet" _fcksavedurl="http://news.gmane.org/gmane.comp.java.restlet"&gt;restlet list&lt;/a&gt; several days ago, in an effort to get some feedback on what I might have done better.  The biggest point of contention has been the jobs resource url that you post to when you create a job.  I chose the first option following the guidelines in the &lt;a href="http://www.oreilly.com/catalog/9780596529260/index.html" _fcksavedurl="http://www.oreilly.com/catalog/9780596529260/index.html"&gt;RWS book&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/jobs/en,fr&lt;/li&gt;&lt;li&gt;/jobs/en/fr&lt;/li&gt;&lt;/ul&gt; The idea here is that if you have have two pieces of scoping information that are ordered but not hierarchical (the from and to languages respectively), then you should seperate them with commas.  Several people, however, have presented a &lt;a href="http://article.gmane.org/gmane.comp.java.restlet/2576" _fcksavedurl="http://article.gmane.org/gmane.comp.java.restlet/2576"&gt;good case&lt;/a&gt; for looking at it at as a hierarchical set of folders.  I haven't completely made up my mind yet, so comments are welcome.&lt;br /&gt;&lt;br /&gt;The other minor point of contention is my choice to use a 102 status to indicate that a job is still being processed.  At least one person felt that a 202 Accepted would be more appropriate.  Personally I think that a 102 Processing status is a clearer way to express the resource state, if your not opposed to using the  WEBDAV extended status codes.&lt;br /&gt;&lt;br /&gt;Beyond stress testing this service, I don't intend to become a major service provider so I'll publish the source code to my translate restlet backend eventually.  The last two restlet framework releases, 1.0.2 and 1.0.3, both have problems with the &lt;a href="http://www.restlet.org/documentation/1.0/ext/com/noelios/restlet/ext/servlet/ServerServlet.html" _fcksavedurl="http://www.restlet.org/documentation/1.0/ext/com/noelios/restlet/ext/servlet/ServerServlet.html"&gt;servlet adapter&lt;/a&gt;. This piece of the framework allows you to run a restlet within any web container.   Because of this I've had to code in some workarounds that I'd rather not publish.  Hopefully these issues will be cleared up in the 1.0.4 release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7439646238402774052?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/7439646238402774052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=7439646238402774052' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7439646238402774052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7439646238402774052'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/07/google-translator-restlet-published.html' title='Google Translator Restlet published'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-5225400283260685856</id><published>2007-07-17T16:04:00.000-05:00</published><updated>2007-12-25T23:27:50.242-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='restlet'/><title type='text'>Google Translate Scraper 0.9.6 released</title><content type='html'>Available for download from my &lt;a href="http://www.incantations.net/%7Ejason/software/" _fcksavedurl="http://www.incantations.net/~jason/software/"&gt;software page&lt;/a&gt; and from my &lt;a href="http://repo.incantations.net/" _fcksavedurl="http://repo.incantations.net/"&gt;maven 2 repository&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is a minor release that improves the exception handling and a few other tweaks.  Probably the biggest change is the name, I felt that Google Translate Engine was not a good description.  This new title, while a bit less glamorous sounding, is more accurate.&lt;br /&gt;&lt;br /&gt;Very soon I'll publish a RESTful service that's build on top of the scraper.  Hopefully in the next day or so.&lt;br /&gt;&lt;br /&gt;In other news, I recently switched from jboss-4.0.2 to the &lt;a href="https://glassfish.dev.java.net/public/downloadsindex.html" _fcksavedurl="https://glassfish.dev.java.net/public/downloadsindex.html"&gt;Glassfish Application Server&lt;/a&gt;.  So far I'm really pleased with glassfish.  I've been running it under a 1.6 JVM with no problems.  The web based administration console is really slick.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-5225400283260685856?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/5225400283260685856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=5225400283260685856' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5225400283260685856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5225400283260685856'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/07/google-translate-scraper-096-released.html' title='Google Translate Scraper 0.9.6 released'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-6175635341914026498</id><published>2007-07-13T16:05:00.001-05:00</published><updated>2010-04-03T15:01:30.772-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='restlet'/><title type='text'>RESTful Web Services</title><content type='html'>&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=ablogcallefoo-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=0596529260&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;As promised, here's my quick book review for &lt;a _fcksavedurl="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=pd_bbs_sr_1/002-0365060-1493601?ie=UTF8&amp;amp;s=books&amp;amp;qid=1184335122&amp;amp;sr=8-1" href="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=pd_bbs_sr_1/002-0365060-1493601?ie=UTF8&amp;amp;s=books&amp;amp;qid=1184335122&amp;amp;sr=8-1"&gt;&lt;u&gt;RESTtful Web Services&lt;/u&gt;&lt;/a&gt; by Leonard Richardson and Sam Ruby.&lt;br /&gt;&lt;br /&gt;This book has a wealth of conceptual information for what the authors have dubbed "Resource Oriented Architecture".  They identify three different categories of web services, "Big" web services (those that use WSDL and SOAP stacks), REST-RPC hybrid services, and strictly RESTful web services.  They describe the pro's and cons of each, and present a good case for RESTful services.&lt;br /&gt;&lt;br /&gt;I set out to create my own RESTful service, and this book really helped me to clarify and design it correctly. For java developers, unless you know ruby or have a strong desire to learn it, feel free to skip Chapter 7, where the authors implement a RESTful service using &lt;a _fcksavedurl="http://www.rubyonrails.org/" href="http://www.rubyonrails.org/"&gt;RoR.&lt;/a&gt; The implentation details of this book aren't what makes it great, it's the concepts it describes, so don't get bogged down in the details if you don't need to.  In fact the restlet.org website has restlet implementations &lt;a _fcksavedurl="http://www.restlet.org/documentation/1.0/examples/" href="http://www.restlet.org/documentation/1.0/examples/"&gt;of all the examples in the book&lt;/a&gt;.  That's going to help a java guy much more than the ruby examples.  The section on &lt;a _fcksavedurl="http://www.restlet.org" href="http://www.restlet.org/"&gt;restlets&lt;/a&gt; is brief but useful for getting started,  I read this section at least three times.&lt;br /&gt;&lt;br /&gt;The restlet framework has been a joy to work with so far, and I'll probably be releasing the source to my restlet implementation very soon.&lt;br /&gt;&lt;br /&gt;If your interested in learning REST, and want to understand it in more developer-friendly language than Fielding's now famous &lt;a _fcksavedurl="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;dissertation&lt;/a&gt;, then I highly recommend reading this book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-6175635341914026498?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/6175635341914026498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=6175635341914026498' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6175635341914026498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/6175635341914026498'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/07/restful-web-services.html' title='RESTful Web Services'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4980004973838139116</id><published>2007-07-10T16:01:00.000-05:00</published><updated>2007-12-25T23:27:11.184-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>Dumb IT Hiring Managers</title><content type='html'>I've had a big pet peeve about IT hiring practices for several years now. I'll be perusing the IT job listings on a  board, and typically I always find at least one position with an absurd set of requirements.&lt;br /&gt;&lt;br /&gt;Today, I received an email from an unknown IT recruiter about a java position in Plano.  One of their &lt;b&gt;core&lt;/b&gt; requirements for the position was &lt;i&gt;9/10 years of J2EE experience&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The J2EE 1.0 specification and reference implementation was released sometime in 1999, and as far as I know, the first full implementations weren't shipping from vendors until 2000. Wikipedia has a J2EE timeline &lt;a href="http://en.wikipedia.org/wiki/Java_EE_version_history" _fcksavedurl="http://en.wikipedia.org/wiki/Java_EE_version_history"&gt;here&lt;/a&gt;.  If you started working with J2EE the very moment the 1.0 specification was released, you could at most have about 8 years experience.&lt;br /&gt;&lt;br /&gt;I also think that requiring X number of years with a particular technology is a dumb way to look for competent people.  I've seen plenty of developers  who've been doing java  for three or four years and still haven't figured out that the Collection interface has a built in iterator.&lt;br /&gt;&lt;br /&gt;What hiring managers should be looking for is scope and breadth of experience.  How many technologies have you worked with, and how many years have you been a developer overall?  Do you write code on your own time, or do you just reluctantly churn out enough lines to keep your manager from frowning at you? I wouldn't ever hire someone who doesn't enjoy programming, but then again, nobody's asking me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4980004973838139116?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/4980004973838139116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=4980004973838139116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4980004973838139116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4980004973838139116'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/07/dumb-it-hiring-managers.html' title='Dumb IT Hiring Managers'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-3030210926693307030</id><published>2007-06-27T15:59:00.000-05:00</published><updated>2007-12-25T23:26:53.429-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='restlet'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='translate'/><title type='text'>GoogleTranslateEngine 0.9.3  released</title><content type='html'>GoogleTranslateEngine 0.9.3 can be obtained from my &lt;a href="http://www.incantations.net/%7Ejason/software/" _fcksavedurl="http://www.incantations.net/~jason/software/"&gt;software page&lt;/a&gt;.  This is a minor release that in no way alters the functionality of the library.  Google is apparently tweaking their translation engine for better accuracy, and their tweaks broke a few of my unit tests.  I also fixed a null pointer exception that I was getting on occasion.&lt;br /&gt;&lt;br /&gt;I've been focusing on studying REST design for over a month now with brief excursions into ruby on rails.  I'll soon compose a review of the excellent book &lt;a href="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=pd_bbs_sr_1/002-0365060-1493601?ie=UTF8&amp;amp;s=books&amp;amp;qid=1182978230&amp;amp;sr=8-1" _fcksavedurl="http://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260/ref=pd_bbs_sr_1/002-0365060-1493601?ie=UTF8&amp;amp;s=books&amp;amp;qid=1182978230&amp;amp;sr=8-1"&gt;&lt;u&gt;RESTful Web Services&lt;/u&gt;&lt;/a&gt;, by Leonard Richardson and Sam Ruby, well, just as soon as I finish reading it.&lt;br /&gt;&lt;br /&gt;I initially attempted to craft my own &lt;a href="http://www.restlet.org/" _fcksavedurl="http://www.restlet.org"&gt;restlet&lt;/a&gt; interface for the GoogleTranslateEngine, however I quickly realized that I didn't understand HTTP and RESTful design as well as I thought I did.  This book has gone a long way towards correcting that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-3030210926693307030?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/3030210926693307030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=3030210926693307030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3030210926693307030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/3030210926693307030'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/12/googletranslateengine-093-released.html' title='GoogleTranslateEngine 0.9.3  released'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4181523443960340264</id><published>2007-05-06T15:57:00.000-05:00</published><updated>2007-12-25T23:26:33.183-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><title type='text'>Translate Webservice 100% functional</title><content type='html'>My mission to complete and deploy a SOAP webservice for my GoogleTranslateEngine is finally complete.  I had it partially working a month ago, but for several weeks I've been trying to understand why the jBossWS stack insisted on sending me garbage for non-latin encodings.&lt;br /&gt;&lt;br /&gt;My friend &lt;a href="http://rockstarprogrammer.org/" _fcksavedurl="http://rockstarprogrammer.org"&gt;Dustin &lt;/a&gt;had insisted that I write some unit tests, and that ended up being a very good thing.  I have been doing all my development with eclipse on a windows XP machine, and the unit tests were all passing perfectly.  The webservice is running under jBoss on a fedora core 6 box.   Because I'm using maven as my build system, it's trivial to do builds/tests on any other system, but I never though to run my unit tests on my linux box, I simply assumed they would work like they did on windows.&lt;br /&gt;&lt;br /&gt;When I finally got around to doing it, one of my unit tests was failing.  As it turns out I wasn't setting my encoding parameters properly when passing my InputStream into the tagSoup parser.  For some reason that I still don't understand, this was working just fine on windows, but not at all on linux.&lt;br /&gt;&lt;br /&gt;So, the point of this story is, don't be shy with unit tests.  They can be very helpful!&lt;br /&gt;&lt;br /&gt;I just released version 0.9.2 of the Google Translate Engine which can be found on my &lt;a href="http://incantations.net/%7Ejason/software" _fcksavedurl="http://incantations.net/~jason/software"&gt;software pag&lt;/a&gt;e.  This, of course, includes the bug fix that I mentioned.&lt;br /&gt;&lt;br /&gt;The glorious SOAP webservice that I've been working on is published &lt;a href="http://incantations.net:8080/GoogleTranslateRemoteJAXRPC/Translate?wsdl" _fcksavedurl="http://incantations.net:8080/GoogleTranslateRemoteJAXRPC/Translate?wsdl"&gt;here&lt;/a&gt;.  I'm keeping it open for now, unless a deluge of people start using it, but I don't think I have much to worry about.&lt;br /&gt;&lt;br /&gt;So my next project will to be a &lt;a href="http://www.restlet.org/" _fcksavedurl="http://www.restlet.org"&gt;restlet&lt;/a&gt; implementation.  This looks like the way of the future, so until next time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4181523443960340264?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/4181523443960340264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=4181523443960340264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4181523443960340264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4181523443960340264'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/05/translate-webservice-100-functional.html' title='Translate Webservice 100% functional'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-4541964628761365004</id><published>2007-04-30T15:55:00.000-05:00</published><updated>2007-12-25T23:26:08.669-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='webservice'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>webservice pain</title><content type='html'>I wish I could proudly announce that I have a slick new webservice for my Google Translator ready for public consumption.  It's been almost a month since I started working on the thing in my free time.  This should have been a relatively straight-forward project to implement, but alas, it's been hell every step of the way. SOAP is hard and ugly, and plenty of people warned me about it before I even started.  "Use REST!!", they proclaimed, and now I can see why.&lt;br /&gt;&lt;br /&gt;I started off on my journey with the intention of making a nice &lt;a href="http://en.wikipedia.org/wiki/POJO" _fcksavedurl="http://en.wikipedia.org/wiki/POJO"&gt;POJO&lt;/a&gt; backed &lt;a href="http://jcp.org/en/jsr/detail?id=109" _fcksavedurl="http://jcp.org/en/jsr/detail?id=109"&gt;JSR-109&lt;/a&gt; style webservice. The &lt;a href="http://en.wikipedia.org/wiki/Service_endpoint_interface" _fcksavedurl="http://en.wikipedia.org/wiki/Service_endpoint_interface"&gt;SEI &lt;/a&gt;was fairly trivial, and it works much like the &lt;a href="http://en.wikipedia.org/wiki/Java_remote_method_invocation" _fcksavedurl="http://en.wikipedia.org/wiki/Java_remote_method_invocation"&gt;RMI&lt;/a&gt; version that I did earlier.  Once you have your interface done, there isn't any more coding to do, it's all xml wiring, mapping, and magic. Which is far nastier than it should be.&lt;br /&gt;&lt;br /&gt;My first mistake was trying to attack the problem in a generic way.  Before you get started on a webservice, know what your target platform is and read the container specific documentation/examples.  My target platform is &lt;a href="http://labs.jboss.com/" _fcksavedurl="http://labs.jboss.com/"&gt;jBoss 4.0.5&lt;/a&gt;.  I would have saved myself a great deal of time and pain if I had started off on with the &lt;a href="http://labs.jboss.com/jbossws/user-guide/en/html/index.html" _fcksavedurl="http://labs.jboss.com/jbossws/user-guide/en/html/index.html"&gt;jBossWS&lt;/a&gt; examples.&lt;br /&gt;&lt;br /&gt;The reason your platform choice is so important is because of the tooling. Your platform will most likely provide some set of tools for generating all the nasty XML files that JSR-109 demands (jax-rpc mapping, WSDL, etc).  jBossWS comes with a little tool called wstool which takes a pretty simple xml config file and then spits out all the ugly XML files that you need for your webservice.  Having to generate these files by hand would give you nightmares, so good tooling is essential.  I also had to download and use the now out of date &lt;a href="https://jwsdp.dev.java.net/" _fcksavedurl="https://jwsdp.dev.java.net/"&gt;JWSDP-2.0&lt;/a&gt; for several things, including wscompile (more tooling).&lt;br /&gt;&lt;br /&gt;Once all that was done, everything worked, well almost.  As long as no non-latin character encodings were involved, everything was just peachy.  If, however, I want to translate English to Russian, and get UTF-8 Cyrillic returned to me, things don't work so well.  Somewhere inside the jBossWS code, it's mangling up my result string, and that's going to take some poking around. Hopefully I'll figure everything out and get the thing to behave correctly.&lt;br /&gt;&lt;br /&gt;So, maybe next month?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-4541964628761365004?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/4541964628761365004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=4541964628761365004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4541964628761365004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/4541964628761365004'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/12/webservice-pain.html' title='webservice pain'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-8402887408734234547</id><published>2007-04-11T15:54:00.000-05:00</published><updated>2007-12-25T23:25:47.526-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fios'/><title type='text'>The joys of FIOS</title><content type='html'>So there I was, all moved into the new house and excited about finally getting verizon fios data services and fiosTV.  I would love to tell you about the gross incompetence i had to deal with while using the  verizon avenue DSL service, but that's a whole other story.  Back to fios, for the average joe, all you have to do is call up their residential services, place an order, wait for the tech to come out, and your set.&lt;br /&gt;&lt;br /&gt;Myself, and probably anyone who reads this blog,  wouldn't fall in to the average joe category, and that's where the pain begins.  I like serving web accessible stuff from servers at my home office. It's cheaper than a using colo, and if something critical goes boom, I'm not driving 30 miles to my colo in my pajamas.  I like to be close to my hardware.&lt;br /&gt;&lt;br /&gt;After placing my residential order for everything, I discovered that the residential fios data service,  blocks all inbound traffic on ports 25 and 80.  Of course,  I should have researched this before I placed my order, but I like living dangerously, or it could be that I'm just lazy about that kind of thing.&lt;br /&gt;&lt;br /&gt;Verizon, with an abundance of marketing genius, has determined that if you need inbound web traffic, then you must be a business, and should be forced to get a static IP, even though you might not need one.  I guess they have never heard of dynamic DNS.  You have to order it through their business services, which is a totally separate department.&lt;br /&gt;&lt;br /&gt;Annoying, but easily remedied by a call to their office...&lt;br /&gt;&lt;br /&gt;So they canceled my residential order, and after 30 minutes we've got my new business service order in place, the tech will come out on April 9th.  I'm all happy, right up until  the part where I say, "Great! l'd also like to setup fiosTV now too."  Lo and behold, because I use the business service with a static IP, they refuse to sell me fiosTV.  I demand to know why, and it's not because of any technical limitation.  The reason is that the marketing wizards have determined that if your a business, then you probably have a lot of employees, and you shouldn't be able to provide cheap fiosTV to them, instead you have to get some business directTV package which probably  has an astronomical price tag.  I guess verizon has never heard of a home office either.&lt;br /&gt;&lt;br /&gt;So here I am a couple weeks later, I have nice speedy fios data service, but I'm reduced to using rabbit ears on all my TV's until I figure out what kind of cable/satellite setup will suit my needs.&lt;br /&gt;&lt;br /&gt;Fios is a good deal faster than DSL, no complaints in the speed department.   The router they give you is pretty damn nice too.  However, I still haven't been able to setup my outbound email, because it requires some kind of user/password that they failed to mention to me at any point during this entire process.&lt;br /&gt;&lt;br /&gt;Well, at least I can get back to coding, who needs TV.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-8402887408734234547?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/8402887408734234547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=8402887408734234547' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8402887408734234547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/8402887408734234547'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/04/joys-of-fios.html' title='The joys of FIOS'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-1577053239867035484</id><published>2007-03-23T15:53:00.000-05:00</published><updated>2007-12-25T23:25:16.100-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='translate'/><title type='text'>Google Translate Engine 0.8.0 released</title><content type='html'>For some of my upcoming projects, I was hoping to find some publicly available translation web service.  I managed to find one, but it seemed to be under fairly heavy load and unavailable at times.&lt;br /&gt;&lt;br /&gt;Google has a very nice, simple web interface for performing &lt;a href="http://www.google.com/translate_t" _fcksavedurl="http://www.google.com/translate_t"&gt;text translations&lt;/a&gt;.  Unfortunately they don't offer an API for it.  Since I couldn't find a suitable web service, it made sense to do my own implementation by scraping google's site. Besides, I could always use more experience with web services.&lt;br /&gt;&lt;br /&gt;Before I could do any of that, I had to write  the core library.  It's not a web service, but it's completely usable in a java application.  I haven't had an opportunity to test it out very much, but I decided to share it anyway.  You can find the Google Translate Engine v 0.8,  &lt;a href="http://www.incantations.net/%7Ejason/software/" _fcksavedurl="http://www.incantations.net/~jason/software/"&gt;here on my software page&lt;/a&gt;.  It appears to work fine, but I've had a real hard time getting my workstation to properly output unicode on the console, so it definitly requires more testing.&lt;br /&gt;&lt;br /&gt;I  played with lots of new stuff while making this: maven, javadoc, SAX, unit testing to name a few.  I'm using John Cowan's nice &lt;a href="http://home.ccil.org/%7Ecowan/XML/tagsoup/" _fcksavedurl="http://home.ccil.org/~cowan/XML/tagsoup/"&gt;tagSoup&lt;/a&gt; library to web scrape.  It allows me to use a SAX handler even on badly formed html.&lt;br /&gt;&lt;br /&gt;Now I'm in the process of trying to figure out how to best implement an old school JSR-109 servlet driven JAX-RPC web service.  My target platform at the moment is Jboss.  As a pre-requisite exercise I'll probably make a tiny RMI service that hooks into the translate engine.  Hopefully I can get that done in the next couple of days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-1577053239867035484?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/1577053239867035484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=1577053239867035484' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1577053239867035484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1577053239867035484'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/03/google-translate-engine-080-released.html' title='Google Translate Engine 0.8.0 released'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-7140987563970395350</id><published>2007-03-05T15:30:00.000-06:00</published><updated>2007-12-25T23:25:00.089-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><title type='text'>i18n'ing it up!</title><content type='html'>I plan on working on some multi-lingual websites, so what better encoding to use, than UTF8, right?  You get dozens of languages and character sets all supported by a single encoding, like on &lt;a href="http://www.columbia.edu/kermit/utf8.html" _fcksavedurl="http://www.columbia.edu/kermit/utf8.html"&gt;this site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So what's it take to get all this set up?  Let's start with the most obvious thing you can do, like sticking this into your html header.&lt;br /&gt;&lt;pre&gt;&amp;lt;meta equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;&lt;br /&gt;&lt;/pre&gt;That's not nearly enough however, because most browsers will also check your &lt;i&gt;&lt;b&gt;http&lt;/b&gt;&lt;/i&gt; header, and if it doesn't agree with your meta tag, then the http header value takes precedence.   This is fairly easy to correct.  In JSP I can do it with a page directive :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;%@ page contentType="text/html; charset=utf-8" %&gt;&lt;br /&gt;&lt;/pre&gt;What about sending/recieving form data?&lt;br /&gt;&lt;br /&gt;Most browsers will send in the same encoding that the page is in, but for an added guarantee you can specify an encoding type in your form tag :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;form charset="utf-8" method="post" action="postArticle.do"&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;Things can get a little more tricky on the receiving end however.  A servlet will check the character encoding, with request.getCharacterEncoding(), and if it's null, you won't get what your expecting.  I'm not enough of a container expert to understand what's going on behind the scenes, but in my case it was necessary to tweak things to tell java  to use utf8 encoding.  I did this with a simple modification to my ActionForm bean.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public void setContent(String content) throws Exception {&lt;br /&gt;  this.content = new String(content.getBytes("8859_1"),"UTF8");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Granted, there are probably much better ways to do this (request filters, etc) and I'd be more than willing to listen to anyone else's expertise on the subject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-7140987563970395350?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/7140987563970395350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=7140987563970395350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7140987563970395350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/7140987563970395350'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/03/i18ning-it-up.html' title='i18n&apos;ing it up!'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-2068664948732776527</id><published>2007-03-02T15:28:00.000-06:00</published><updated>2007-12-25T23:24:40.318-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xhtml'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Good books, bad books</title><content type='html'>I thought I'd share my thoughts on 4 books I've read lately.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.amazon.com/Head-First-HTML-CSS-XHTML/dp/059610197X/ref=pd_bbs_sr_5/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856233&amp;amp;sr=8-5" _fcksavedurl="http://www.amazon.com/Head-First-HTML-CSS-XHTML/dp/059610197X/ref=pd_bbs_sr_5/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856233&amp;amp;sr=8-5"&gt;&lt;span class="srTitle"&gt;Head First HTML with CSS &amp;amp; XHTML&lt;/span&gt;&lt;/a&gt; - &lt;/b&gt;I wanted to teach my wife XHTML/CSS and this book was fantastic.  Thorough and well organized, and funny.  It's as about as interesting as you could make the subject.  I highly recommend it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.amazon.com/PHP-MySQL-Programming-Absolute-Beginner/dp/1931841322/ref=sr_1_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856164&amp;amp;sr=8-1" _fcksavedurl="http://www.amazon.com/PHP-MySQL-Programming-Absolute-Beginner/dp/1931841322/ref=sr_1_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856164&amp;amp;sr=8-1"&gt;&lt;span class="srTitle"&gt;PHP/MySQL Programming for the Absolute Beginner&lt;/span&gt;&lt;/a&gt; - &lt;/b&gt;Now I'm trying to teach my wife PHP development.  From the title of this book, and several decent reviews, it seemed like a good choice.  Boy was I wrong!  I think most of the reviews written at amazon.com were by amateur coders who don't know any better.  The author makes niave assumptions about your development environment, writes bad html, and doesn't use best practices.  Some of the examples are so nasty that they made my head hurt trying to explain them to my wife.  Avoid this book!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/PHP-MySQL-Dynamic-Web-Sites/dp/0321336577/ref=pd_bbs_sr_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172855495&amp;amp;sr=8-1" _fcksavedurl="http://www.amazon.com/PHP-MySQL-Dynamic-Web-Sites/dp/0321336577/ref=pd_bbs_sr_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172855495&amp;amp;sr=8-1"&gt;&lt;b class="sans"&gt;PHP and MySQL for Dynamic Web Sites: Visual QuickPro Guide&lt;/b&gt;&lt;/a&gt; - So back to amazon I went and this time I did a lot more research.  This book is very highly recommended and quite a few of the book reviewers know what they are talking about.   We've just started into it, but the examples use proper XHTML, are fairly concise and well organized.  He doesn't just assume that your environment has auto register globals enabled (yuck) and covers important topics like magic quotes early on, that tend to confuse people.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596005407/ref=pd_bbs_sr_3/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856233&amp;amp;sr=8-3" _fcksavedurl="http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596005407/ref=pd_bbs_sr_3/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172856233&amp;amp;sr=8-3"&gt;&lt;span class="srTitle"&gt;Head First Servlets and JSP&lt;/span&gt;&lt;/a&gt; - &lt;/b&gt;I just finished this book myself and I'm quite pleased by it.  It's narrative is along the same style as the other books in the series.  It's funny (sometimes cynical) and informative.  The Kung-fu movie captions are awesome.  This is one of the few IT books that I've ever read in it's entirety.  I highly recommend!&lt;br /&gt;&lt;br /&gt;I've just ordered &lt;b&gt;&lt;a href="http://www.amazon.com/Maven-Developers-Notebook-Timothy-OBrien/dp/0596007507/ref=pd_bbs_sr_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172857083&amp;amp;sr=8-1" _fcksavedurl="http://www.amazon.com/Maven-Developers-Notebook-Timothy-OBrien/dp/0596007507/ref=pd_bbs_sr_1/002-1192688-6868805?ie=UTF8&amp;amp;s=books&amp;amp;qid=1172857083&amp;amp;sr=8-1"&gt;&lt;span class="srTitle"&gt;Maven: A Developer's Notebook&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;. That will be my next book to tackle.  Now that I'm doing J2EE development, I'm looking for tools that will take the sting out of packaging and deployment.  Maven seems to handle a lot of those issues for you.  I'm looking foward to learning more about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-2068664948732776527?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/2068664948732776527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=2068664948732776527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2068664948732776527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/2068664948732776527'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/03/good-books-bad-books.html' title='Good books, bad books'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-5865320801860210260</id><published>2007-02-28T15:26:00.000-06:00</published><updated>2007-12-25T23:24:13.283-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cpan'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='imaging'/><title type='text'>Image-TestJPG-1.0 released to CPAN</title><content type='html'>Today I released a new version of &lt;a href="http://search.cpan.org/%7Ejhudge/Image-TestJPG-1.0/" _fcksavedurl="http://search.cpan.org/~jhudge/Image-TestJPG-1.0/"&gt;Image-TestJPG&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I fixed some build errors that prevented it from building on the newer incarnations of gcc.  Updated some bad documentation for it's usage, and that kind of stuff.&lt;br /&gt;&lt;br /&gt;I've tested it, but only &lt;b&gt;very&lt;/b&gt; lightly.&lt;br /&gt;&lt;br /&gt;Truth be told , I don't use enough perl anymore to really care how well this works so long as it works.  Coding in xs, the language which binds perl to C is painful.  The perlxstut is out of date, so instead of recreating a whole new module structure with h2xs I just fixed the existing one, which is 10 years old now.  But hey, it works!  I haven't practiced much with C since college.  I just don't work on application tiers where C is needed very often.&lt;br /&gt;&lt;br /&gt;Oh yeah, what's this thing do?  It's very simple really, it tells you if a jpg is corrupted or not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-5865320801860210260?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/5865320801860210260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=5865320801860210260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5865320801860210260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/5865320801860210260'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/02/image-testjpg-10-released-to-cpan.html' title='Image-TestJPG-1.0 released to CPAN'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6288641086087262491.post-1968414607762051644</id><published>2007-02-27T23:13:00.000-06:00</published><updated>2007-12-25T23:23:37.475-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Here we go...</title><content type='html'>Being the masochist I am, when I finally got around to startup up a blog, I decided to host and install the blogger system myself.  I have a basic jboss server up and running.  All I had to do is chose which java blogging app to use, preferably the one that causes me the least amount of headache.&lt;br /&gt;&lt;br /&gt;I looked at three different java based, blogging webapps tonight :&lt;br /&gt;&lt;div align="left"&gt; &lt;ul&gt;&lt;li&gt;&lt;a href="http://pebble.sourceforge.net/" _fcksavedurl="http://pebble.sourceforge.net/"&gt;Pebble&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rollerweblogger.org/project/" _fcksavedurl="http://rollerweblogger.org/project/"&gt;Roller&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.blojsom.com/wiki/display/blojsom3/About+blojsom" _fcksavedurl="http://wiki.blojsom.com/wiki/display/blojsom3/About+blojsom"&gt;Blojsom&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; I ultimately chose Pebble, because it's the lightest weight, and the least painful to setup.  I had to nuke the log4j.jar from the pebble jar, as it didn't get along to well with jboss,  so the install wasn't completely painless. Of the three, however, pebble was definitly the easiest.  Not requiring a database is nice, this isn't a high-traffic, multi-user blog.  So why worry with the overhead?&lt;br /&gt;&lt;br /&gt;Pebble is working well so far, it will be interesting to see how far along I can get with it.  I wonder how easily I could extend it.  I'm also a notriously bad speller, and as I'm entering this, I don't see any type of spell check, that's something I could add.  Of course it might be in here somewhere, I've only been using pebble for about 10 minutes now.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6288641086087262491-1968414607762051644?l=foo.jasonhudgins.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://foo.jasonhudgins.com/feeds/1968414607762051644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6288641086087262491&amp;postID=1968414607762051644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1968414607762051644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6288641086087262491/posts/default/1968414607762051644'/><link rel='alternate' type='text/html' href='http://foo.jasonhudgins.com/2007/02/here-we-go.html' title='Here we go...'/><author><name>Jason</name><uri>http://www.blogger.com/profile/11854459261926460313</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/-McVhm2Wqthw/TwC8geDVEyI/AAAAAAAAAnU/z0GNbE8FdZ8/s220/standard_avatar.JPG'/></author><thr:total>0</thr:total></entry></feed>
