<?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/opensearch/1.1/' xmlns:georss='http://www.georss.org/georss' xmlns:thr='http://purl.org/syndication/thread/1.0' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/&quot;DkYERH05fSp7ImA9Wx9aEEk.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576</id><updated>2011-03-01T22:35:05.325-07:00</updated><title>TECHHEAD Blog</title><subtitle type='html'>The blog for All Things Tech. Use technology to make your life easier, and learn how to deal with it when things go awry.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.techhead.biz/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default?redirect=false&amp;v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry gd:etag='W/&quot;DkcNQHwyeCp7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-223337676237463831</id><published>2009-04-02T22:48:00.000-06:00</published><updated>2009-04-02T22:48:11.290-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:48:11.290-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='about'/><title>About this blog</title><content type='html'>&lt;p&gt;This blog will be updated periodically with informative articles on topics like computer security, data backup and recovery, general troubleshooting, useful tools, cool websites, etc. Pretty much anything in the category of "All Things Tech" is fair game. Use the sidebar section titled "Labels" to navigate to the information of interest to you.&lt;/p&gt;&lt;p&gt;If you are interested in more &lt;em&gt;advanced level&lt;/em&gt; topics such as computer programming, software design, web development, etc., this blog is not for you. Discussion of those topics will now take place on the &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;TECHHEAD Development Blog&lt;/a&gt;, found here: devblog.techhead.biz.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-223337676237463831?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/223337676237463831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=223337676237463831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/223337676237463831?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/223337676237463831?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2009/04/about-this-blog.html' title='About this blog'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;CUYFR3Yzeip7ImA9WxVSE00.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-4143717026859103254</id><published>2009-01-06T16:17:00.003-07:00</published><updated>2009-01-06T21:38:36.882-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-01-06T21:38:36.882-07:00</app:edited><title>Simple bookmarklet for creating Amazon Affiliate links</title><content type='html'>&lt;p style="clear: both;"&gt;For those who don't know, a &lt;a href="http://en.wikipedia.org/wiki/Bookmarklet" target="_blank"&gt;bookmarklet&lt;/a&gt; is just a "fancy" link that you install in your web-browser toolbar, usually by dragging it there. (In IE you must right click it, select "Add to Favorites" and then save it in the "Links" folder.) When clicked, bookmarklets &lt;i&gt;do something&lt;/i&gt; with the currently viewed document.&lt;/p&gt;&lt;p style="clear: both;"&gt;Got it? Good. Moving on...&lt;/p&gt;&lt;p style="clear: both;"&gt;I am an &lt;a href="https://affiliate-program.amazon.com/gp/associates/join?tag=techhead-20" target="_blank"&gt;Amazon Affiliate&lt;/a&gt;, and I wanted a simple way to create affiliate links to Amazon products. I found a &lt;a href="http://crazybob.org/2008/10/how-to-create-simple-amazon-affiliate.html" target="_blank"&gt;very straightforward tutorial over at crazybob.org&lt;/a&gt;. But I'm still too lazy. I want to be able to browse &lt;a href="http://www.amazon.com/?tag=techhead-20" target="_blank"&gt;Amazon.com&lt;/a&gt; and when I find what I am looking for, I want to be able to simply click a button to generate the appropriate HTML.&lt;/p&gt;&lt;p style="clear: both;"&gt;So I made the following bookmarklet:&lt;/p&gt;&lt;p style="clear: both;"&gt;&lt;a href="javascript:void(prompt('Copy%20Affiliate%20Link','&amp;lt;a%20href=&amp;quot;http://www.amazon.com/dp/'+document.handleBuy.ASIN.value+'/?tag=techhead-20&amp;quot;&amp;gt;'+document.getElementById('btAsinTitle').innerHTML+'&amp;lt;/a&amp;gt;'))"&gt;Amazon Affiliate Link&lt;/a&gt;&lt;/p&gt;&lt;p style="clear: both;"&gt;Install it, and head over to &lt;a href="http://www.amazon.com/?tag=techhead-20" target="_blank"&gt;Amazon.com&lt;/a&gt; to try it out. Of course, you'll want to make sure that the affiliate links it creates refer to &lt;i&gt;your&lt;/i&gt; Amazon Associate ID and not mine.&lt;/p&gt;&lt;p style="clear: both;"&gt;To create your own customized bookmarklet, use this &lt;a href="http://techhead.biz/aalink/generator.html" target="_blank"&gt;tool here&lt;/a&gt;.&lt;/p&gt;&lt;p style="clear: both;"&gt;Happy linking! And remember, &lt;a href="http://tipjoy.com/u/techhead" onclick="if (window.tipjoyOpenLightbox) {tipjoyOpenLightbox();return false} else return true" target="_blank"&gt;tipping is easy with Tipjoy&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-4143717026859103254?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/4143717026859103254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=4143717026859103254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/4143717026859103254?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/4143717026859103254?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2009/01/simple-bookmarklet-for-creating-amazon.html' title='Simple bookmarklet for creating Amazon Affiliate links'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;CkQESH48eSp7ImA9WxVSEkU.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-2029451904441036298</id><published>2009-01-06T15:18:00.001-07:00</published><updated>2009-01-06T15:18:29.071-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-01-06T15:18:29.071-07:00</app:edited><title>Apple TV, Boxee and Hulu</title><content type='html'>&lt;p style="clear: both"&gt;I bought an &lt;a href="http://www.amazon.com/dp/B000MQNMQ6/?tag=techhead-20" target="_blank"&gt;Apple TV&lt;/a&gt; about a year ago. (Merry Christmas to me.) I used it a little, but it mostly sat on the shelf collecting dust.&lt;/p&gt;&lt;p style="clear: both"&gt;Out of the box, the Apple TV is little more than novelty. You can watch &lt;a href="http://youtube.com" target="_blank"&gt;YouTube&lt;/a&gt; videos, movie &lt;em&gt;previews&lt;/em&gt;, or purchase expensive showings from the iTunes Store. Of course, you can also play whatever songs, podcasts, videos, etc. you have in your iTunes library on your TV, but in order for this to be useful... well, you have to have content in your iTunes library.&lt;/p&gt;&lt;p style="clear: both"&gt;I have ripped a few DVDs to my library -- mostly for my kids -- using the excellent and free &lt;a href="http://handbrake.fr/" target="_blank"&gt;Handbrake&lt;/a&gt;, but on my dual-core Macbook Pro, it still takes more than 45 minutes per rip, and I just haven't bothered with that many. The same goes with my music. It's not that I don't like music (who doesn't like music). It's just that I don't want to spend the bulk of my time nurturing my media library.&lt;/p&gt;&lt;p style="clear: both"&gt;So I watched &lt;a href="http://www.youtube.com/watch?v=dMH0bHeiRNg" target="_blank"&gt;Evolution of Dance&lt;/a&gt; and the &lt;a href="http://www.youtube.com/watch?v=MThEoxSWURA" target="_blank"&gt;Lego remake of Thriller&lt;/a&gt; a few times and then let the box gather dust.&lt;/p&gt;&lt;p style="clear: both"&gt;...A year passes...&lt;/p&gt;&lt;p style="clear: both"&gt;I knew of a small community of hackers toying with the Apple TV. That was one of the reasons I purchased it in the first place, but I had no real motivation to toy with my own until &lt;a href="http://www.boxee.tv/" target="_blank"&gt;Boxee&lt;/a&gt;. My invitation to test the alpha version of the platform arrived a couple of weeks ago. Yesterday, I could no longer resist the temptation to see what all the fuss was about.&lt;/p&gt;&lt;p style="clear: both"&gt;Boxee is currently available only for the Mac and Linux platforms, but my interest was getting it to run on my Apple TV (which is basically just a little Mac). A year ago, making any customizations to your Apple TV required some time consuming hacking. To my delight, the process has been simplified greatly by a tool called &lt;a href="http://code.google.com/p/atvusb-creator/" target="_blank"&gt;ATV USB Creator&lt;/a&gt; (I love the creative name).&lt;/p&gt;&lt;p style="clear: both"&gt;So here's how you install Boxee on your Apple TV: plug a spare &lt;a href="http://www.amazon.com/dp/B000ERAON2/?tag=techhead-20" target="_blank"&gt;thumb drive&lt;/a&gt; into your Mac, run ATV USB Creator, then plug the thumb drive into your Apple TV. &lt;/p&gt;&lt;p style="clear: both"&gt;That's basically it. You'll want to make sure that your ATV is off (unplugged) when you first insert the drive. Then you'll plug it in, let the installation finish, &lt;em&gt;unplug the thumb drive&lt;/em&gt; (very important) and reboot. Whoala! When your Apple TV comes back up again, you'll have a new option on the menu for Boxee.&lt;/p&gt;&lt;p style="clear: both"&gt;But wait! You haven't actually installed Boxee yet, just the bootstrapping process. You'll have to chose &lt;em&gt;Update&lt;/em&gt; from the menu and then select to install the latest version of Boxee. It will then be downloaded and installed automatically, and you can begin using it right away &lt;em&gt;provided that you have already registered an account&lt;/em&gt; (currently in closed alpha, &lt;a href="http://blog.boxee.tv/2008/12/21/opening-up-the-alpha/" target="_blank"&gt;opening Jan 8&lt;/a&gt;).&lt;/p&gt;&lt;p style="clear: both"&gt;This is where the real fun begins. You have options. &lt;em&gt;Lots&lt;/em&gt; of options. You can stream music, movies and videos from a number of well-known sites. You can install your own plugins and point to media-rich &lt;a href="http://blog.techhead.biz/2008/08/how-xml-rss-atom-feeds-will-change-your.html" target="_blank"&gt;RSS&lt;/a&gt; feeds. You can play files from your own local media library or from those available via shared resources on the network.&lt;/p&gt;&lt;p style="clear: both"&gt;But my favorite option is &lt;a href="http://www.hulu.com/" target="_blank"&gt;Hulu&lt;/a&gt;. Hulu is the product of a partnership with NBC, Fox and several other media giants. You can stream a wide variety of on-demand, full-length TV shows and movies. And now you can do it on your Apple TV. Sweet.&lt;/p&gt;&lt;p style="clear: both"&gt;But enough free praise for the media giants' lovechild. The streaming doesn't always work so well. And it's not my internet connection either. I've tried the service with a variety of bandwidth options from 5 Mbps to a verified 20 Mbps, and it doesn't seem to matter. It can be very difficult to get through a show without having to stop and "buffer" 50 times, and that's a real mood killer.&lt;/p&gt;&lt;p style="clear: both"&gt;The playback on Boxee itself can be a bit choppy when playing hi-res video from Hulu. (And Boxee does not provide you a way to choose "low res" vs "hi res". You have to do this from hulu.com.) TV-quality video, however, remains fluid when Hulu will feed it to you fast enough.&lt;/p&gt;&lt;p style="clear: both"&gt;Another gripe on the Boxee/Hulu combo is that Boxee does not provide you with a way to search for video, just browse. A workaround for this is to simply find what you want via your web browser on hulu.com and then add it to your queue.&lt;/p&gt;&lt;p style="clear: both"&gt;Boxee is not ready to the point where I can say, "The future of TV is here." But the platform is still only in alpha. &lt;a href="http://blog.boxee.tv/2008/11/21/you-told-us-what-you-want-now-we-need-to-make-it-happen/" target="_blank"&gt;According to their blog&lt;/a&gt;, they will soon be adding support for streaming shows from &lt;a href="http://abc.com" target="_blank"&gt;ABC.com&lt;/a&gt; (Lost!) as well as the &lt;a href="http://dsc.discovery.com/" target="_blank"&gt;Discovery Channel&lt;/a&gt;. When that happens, my satellite TV provider may find that they have one less customer.&lt;/p&gt;&lt;p style="clear: both"&gt;What You'll Need:&lt;/p&gt;&lt;ul style="clear: both"&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/dp/B000MQNMQ6/?tag=techhead-20" title="" target="_blank"&gt;Apple TV&lt;/a&gt; + &lt;a href="http://www.amazon.com/dp/B000ERAON2/?tag=techhead-20" target="_blank"&gt;USB thumb drive&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/atvusb-creator/" target="_blank"&gt;ATV USB Creator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href="http://www.boxee.tv/" target="_blank"&gt;Boxee&lt;/a&gt; account&lt;/li&gt;&lt;li&gt;A &lt;a href="http://www.hulu.com/" target="_blank"&gt;Hulu&lt;/a&gt; account&lt;/li&gt;&lt;/ul&gt;&lt;p style="clear: both"&gt;&lt;/p&gt;&lt;br class='final-break' style='clear: both' /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-2029451904441036298?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/2029451904441036298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=2029451904441036298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2029451904441036298?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2029451904441036298?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2009/01/apple-tv-boxee-and-hulu.html' title='Apple TV, Boxee and Hulu'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;C0QDSX84eip7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6939884889761988553</id><published>2008-12-31T14:15:00.002-07:00</published><updated>2009-04-02T22:02:58.132-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:02:58.132-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><title>jQuery vs Dojo Toolkit vs Prototype vs MooTools</title><content type='html'>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; If you enjoy reading articles on programming or web development, please see our sister blog here: &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;devblog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p style="clear: both"&gt;This is a very quick, unthorough rundown of the most popular Javascript frameworks at the time, and why I currently favor &lt;a href="http://jquery.org" target="_blank"&gt;jQuery&lt;/a&gt;.&lt;/p&gt;&lt;p style="clear: both"&gt;I did not make a significant time investment in my investigation, but there were a couple of factors I was interested in:&lt;/p&gt;&lt;p style="clear: both"&gt;&lt;ul style="clear: both"&gt;&lt;li&gt;I wanted a framework that &lt;em&gt;did not&lt;/em&gt; include a faux class-based object framework. Javascript is prototype based and very powerful that way. (I'll write my Javascript in Javascript, thank you.)&lt;/li&gt;
&lt;li&gt;I wanted a framework that imposed minimal littering of the current window's global namespace.&lt;/li&gt;
&lt;li&gt;I wanted a framework that was simple to learn and easy to use.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;p style="clear: both"&gt;jQuery best fit the bill. There are no false classes in jQuery; it leaves coding style up to you (not so in Prototype or MooTools). In jQuery, there is minimal littering of the global namespace -- the only exported symbols are &lt;em&gt;jQuery&lt;/em&gt; and the optional &lt;em&gt;$&lt;/em&gt;. (Again, this is not the case with Prototype and MooTools.) Lastly, jQuery wins hands down on ease of use. You could pick it up in five minutes if you are a seasoned web developer. The Dojo Toolkit looks promising -- I especially like its module packaging framework -- but it will require a more significant time investment than the elegant jQuery.&lt;/p&gt;&lt;p style="clear: both"&gt;Here's a closing thought: I would like to see an entirely independent module packaging framework for Javascript. Anyone know of one?&lt;/p&gt;&lt;p style="clear: both"&gt;I'm sure that this post will be controversial to some of you MooTools and Prototype zealots. Tell me why I'm wrong! I'd love to hear your take.&lt;/p&gt;&lt;br class='final-break' style='clear: both' /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6939884889761988553?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6939884889761988553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6939884889761988553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6939884889761988553?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6939884889761988553?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/12/jquery-vs-dojo-toolkit-vs-prototype-vs.html' title='jQuery vs Dojo Toolkit vs Prototype vs MooTools'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;D0QAQHg4eCp7ImA9WxVTFk8.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-2404011963247598332</id><published>2008-12-29T17:08:00.001-07:00</published><updated>2008-12-30T01:22:21.630-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-30T01:22:21.630-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title>Social Capital: Range of Influence vs Degree of Influence</title><content type='html'>&lt;p style="clear: both"&gt;The Twitter gods are at war.&lt;/p&gt;&lt;p style="clear: both"&gt;&lt;strong&gt;Foreward&lt;/strong&gt;: &lt;a href="http://twitter.com/loiclemeur" target="_blank"&gt;Loic Le Meur&lt;/a&gt; started it with &lt;a href="http://twitter.com/loiclemeur/status/1080477342" target="_blank"&gt;the tweet heard round the world&lt;/a&gt;. &lt;a href="http://twitter.com/Scobleizer" target="_blank"&gt;Robert Scoble&lt;/a&gt; led the outrage initiative, and &lt;a href="http://twitter.com/TechCrunch" target="_blank"&gt;Michael Arrington&lt;/a&gt; fanned the flames.&lt;/p&gt;&lt;p style="clear: both"&gt;And me? I'm just a wanna-be blogger who has been planning to write an article on "social capital" for a while now. Now seems like a good time.&lt;/p&gt;&lt;p style="clear: both"&gt;&lt;a href="http://twitter.com/jonathanhawkes" target="_blank"&gt;Follow me on Twitter&lt;/a&gt; (shameless plug).&lt;/p&gt;&lt;p style="clear: both"&gt;&lt;strong&gt;The Good Stuff&lt;/strong&gt;&lt;/p&gt;&lt;p style="clear: both"&gt;First off, go check out these guys' Twitter profiles and pay close attention to the number of followers they have. In fact, if you're reading this, there is a good chance that you are one of them. When these Twitans talk about social capital, it's like billionaires talking about money: you listen (and it makes you nauseous).&lt;/p&gt;&lt;p style="clear: both"&gt;The plot thickens when Le Meur is trying to think of a way to filter the firehouse that is Twitter. His idea is to add "authority" based search and filtering, where authority = the number of followers/twits a tweeter has.&lt;/p&gt;&lt;p style="clear: both"&gt;Scobleizer, being the white-knight geek that he is, vehemently opposed the idea although he has over 46,000 followers. Why? Because then guys like me would never be found in such a search.&lt;/p&gt;&lt;p style="clear: both"&gt;I personally do think that the whole issue was overblown. As an optional feature, "sort by followers" might be useful for us lemmings. Sometimes you just want to follow who everyone else is following, especially in the tech world. Why? Because we &lt;em&gt;at least&lt;/em&gt; want to know what everyone else knows.&lt;/p&gt;&lt;p style="clear: both"&gt;But this is also the problem. How do you discover anything new? If you follow any of the big tech blogs, you're familiar with the problem. It's like watching &lt;em&gt;news&lt;/em&gt; on all the networks. They all have the same stories, even if it's about a &lt;a href="http://www.youtube.com/watch?v=fXXaRECHHT4" target="_blank"&gt;heroic dog&lt;/a&gt;. (Cool, yes, but worthy of being a major piece on every channel?)&lt;/p&gt;&lt;p style="clear: both"&gt;So the big question still is, how do we sort all of this crap out? Le Meur said&lt;/p&gt;&lt;blockquote style="clear: both"&gt;&lt;p&gt;but when someone who has thousands, if not tens of thousands of followers starts to speak, you have to pay attention&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="clear: both"&gt;No, Le Meur, I really don't. It depends on what they are talking about. Tom Cruise may be more well known, but a good shrink &lt;em&gt;might&lt;/em&gt; be better advised &lt;s&gt;if&lt;/s&gt; when I get the blues.&lt;/p&gt;&lt;p style="clear: both"&gt;Tom (not Cruise) may be everyone's friend on MySpace, but I'm going to listen more closely to what one of my &lt;em&gt;real&lt;/em&gt; friends has to say.&lt;/p&gt;&lt;p style="clear: both"&gt;Kevin... Ok, I could go on all day with analogies, but I won't (because you would just stop reading).&lt;/p&gt;&lt;p style="clear: both"&gt;At the core of the problem is this: Range of Influence vs Degree of Influence. The Toms have a far greater range of influence than your average Joe, but &lt;em&gt;degree&lt;/em&gt;? I suspect not. (Unless they are talking about their respective fields.) That's why when Hollywood starts getting preachy, we all run for the toilets. &lt;s&gt;Nobody&lt;/s&gt; Few respect them as a moral authority.&lt;/p&gt;&lt;p style="clear: both"&gt;Erick Schonfeld of TechCrunch now suggests that&lt;/p&gt;&lt;blockquote style="clear: both"&gt;&lt;p&gt;&lt;a href="http://www.techcrunch.com/2008/12/29/its-not-how-many-followers-you-have-that-counts-its-how-many-times-you-get-retweeted/" target="_blank"&gt;It's Not How Many Followers You Have That Counts, It's How Many Times You Get Retweeted&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="clear: both"&gt;That's a nice thought. After all, if you retweet something, it means you found it useful/interesting, right? That could be a measure of &lt;em&gt;degree&lt;/em&gt; of influence, but then there are losers like me who never retweet anything. If I like it, I just bookmark it. (But I'm a Twitter newbie.)&lt;/p&gt;&lt;p style="clear: both"&gt;Counting retweets still doesn't solve the problem. Not just because it relies on user action, but also because those with a large range of influence have a large fan base, and fans are fanatical. BarackObama could tweet that he brushed his teeth and that information would be echoed all throughout the Twitosphere.&lt;/p&gt;&lt;p style="clear: both"&gt;So I agree with Scoble that number of followers does not equal authority on a wide range of topics. But it may mean &lt;em&gt;authority&lt;/em&gt; within a narrow field. How do we narrow the field guys? Social tagging for experts? (eg. Tag, you're an expert on acting but not psychiatry.) Now that might be interesting.&lt;/p&gt;&lt;p style="clear: both"&gt;But it'll still exclude me.&lt;/p&gt;&lt;br class='final-break' style='clear: both' /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-2404011963247598332?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/2404011963247598332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=2404011963247598332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2404011963247598332?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2404011963247598332?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/12/social-capital-range-of-influence-vs.html' title='Social Capital: Range of Influence vs Degree of Influence'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;Ak4CQn8_eyp7ImA9WxVTFU4.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-18013994393775025</id><published>2008-12-27T14:38:00.008-07:00</published><updated>2008-12-29T01:22:43.143-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-29T01:22:43.143-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title>Tipjoy post-icon widget for Blogger</title><content type='html'>&lt;p&gt;After my &lt;a href="http://blog.techhead.biz/2008/12/panhandling-20-money-goes-social.html" target="_blank"&gt;last post&lt;/a&gt; about micropayments (and &lt;a href="http://tipjoy.com/" target="_blank"&gt;Tipjoy&lt;/a&gt; in particular), I had several inquiries as to how I added the "Tip 25 cents" icon below each blog entry.&lt;/p&gt;&lt;p&gt;It's pretty simple really.&amp;nbsp; First go to &lt;a href="http://tipjoy.com/banners/custom/" target="_blank"&gt;http://tipjoy.com/banners/custom/&lt;/a&gt; to create your custom Tipjoy button. You can then place it anywhere you want on your site and even style it with custom CSS... Or you can forget the default button and CSS and just make your own (like on &lt;a href="http://flyingpizzakitty.com/" target="_blank"&gt;flyingpizzakitty.com&lt;/a&gt; and &lt;a href="http://blog.techhead.biz/" target="_blank"&gt;this website&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;My button code looks like this.&lt;/p&gt;&lt;pre class="prettyprint code xml"&gt;&amp;lt;script language="javascript" src="http://tipjoy.com/socnet/widget?username=techhead&amp;amp;url=blog.techhead.biz&amp;amp;message=Thank's%20for%20your%20support!&amp;amp;amount=0.25"&amp;gt;script&amp;gt;&lt;/pre&gt;&lt;p&gt;And I didn't bother copying the CSS portion because I didn't really want to show the default button. So to avoid showing the button, I wrapped the button code in...&lt;/p&gt;&lt;pre class="prettyprint code xml"&gt;&amp;lt;div style="display:none"&amp;gt;...&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;p&gt;To add a Tipjoy icon to the bottom of each entry, I wrote a short &lt;a href="http://jquery.org/" target="_blank"&gt;jQuery&lt;/a&gt; script, so you'll need to make sure that jQuery gets loaded sometime prior to the script being executed.&lt;/p&gt;&lt;p&gt;Your blog may be loading jQuery already. If not, add the following to the  section of your template or just directly above the icon script:&lt;/p&gt;&lt;pre class="prettyprint xml code"&gt;&amp;lt;script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;Once you have jQuery available, you can add a "tip reminder" icon to each blog entry by copying the below script either directly into your blog template or by adding an HTML/Javascript Page Element to your Layout.&lt;/p&gt;&lt;pre class="prettyprint xml code"&gt;&amp;lt;script type="text/javascript"&amp;gt;
(function($) {
&amp;nbsp; $(function() {
&amp;nbsp;&amp;nbsp;&amp;nbsp; $('.hentry').each(function() { // for each blog entry
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var icon = $('&amp;lt;span&amp;gt;&amp;lt;a href="javascript:tipjoyOpenLightbox()"&amp;gt;Tip 25&amp;amp;#162;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;');
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; $('a', icon).css({
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 'padding':'1px 5px 5px 22px',
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 'background':'url(http://techhead.biz/tipjoy/tipjoystar.gif) no-repeat scroll 0 0'});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).find('.post-icons').append(icon); // add the Tipjoy icon
&amp;nbsp;&amp;nbsp;&amp;nbsp; });
&amp;nbsp; });
})(jQuery);
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;p&gt;And that should do the trick! Of course, you may want to change the figure from "25 cents" to something else. If you do, just remember to change it in both the Tipjoy button script and in the icon script.&lt;/p&gt;&lt;p&gt;If you would like to place an additional tip reminder in the text of your blog post itself, here is another little formula.&lt;/p&gt;&lt;pre class="prettyprint xml code"&gt;&amp;lt;a href="http://tipjoy.com/u/myusername" onclick="if (window.tipjoyOpenLightbox) {tipjoyOpenLightbox();return false} else return true"&amp;gt;TEXT OR IMAGE HERE&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://tipjoy.com/u/techhead" onclick="if (window.tipjoyOpenLightbox) {tipjoyOpenLightbox();return false} else return true" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="Mariachi Monkey" border="0" src="http://techhead.biz/images/el_monkeyachi_md_wht.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Speaking of which, if you found this article helpful, please help keep the monkey playing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-18013994393775025?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/18013994393775025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=18013994393775025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/18013994393775025?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/18013994393775025?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/12/tipjoy-post-icon-widget-for-blogger.html' title='Tipjoy post-icon widget for Blogger'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;DkUDQH8-fSp7ImA9WxVTFEw.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-1036254530887202348</id><published>2008-12-26T22:00:00.017-07:00</published><updated>2008-12-27T14:44:31.155-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-27T14:44:31.155-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title>Panhandling 2.0. Money goes social.</title><content type='html'>&lt;p&gt;&lt;b&gt;Short version: &lt;/b&gt;&lt;/p&gt;&lt;p&gt;This could change &lt;i&gt;everything&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Long version:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Starbucks is &lt;i&gt;not&lt;/i&gt; my favorite coffee. But Tuesday I didn't care. When it's 20 degrees out and the snow is coming in sideways, I'll drink burned, week-old coffee as long as it's hot and caffeinated.&lt;/p&gt;&lt;blockquote&gt;I'll take a double, non-fat latte mochachino, light on the foam.&lt;/blockquote&gt;&lt;p&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;(Not my actual order. &lt;i&gt;I don't know you.&lt;/i&gt;)&lt;/p&gt;&lt;p&gt;I swear that the pink-haired girl behind the counter -- who &lt;span id="query"&gt;incidentally&lt;/span&gt; prefers &lt;i&gt;not&lt;/i&gt; to be called "barista" -- looked at &lt;i&gt;me&lt;/i&gt; funny. Like out of the scores of customers she serves each day, she's never seen a dude order coffee that way. So feeling slightly emasculated by my beverage choice, I averted my eyes and groped for my wallet with my usual deep sense of shame...&lt;/p&gt;&lt;p&gt;Uh oh. After changing wet pants three times that day in a vain attempt to stay warm and dry (twice wet from snow and once from... well...), I now found myself &lt;i&gt;sans walletus&lt;/i&gt;, which is of course Latin for no form of payment.&lt;/p&gt;&lt;p&gt;My thumb was on the panic button.&amp;nbsp; I was about to pretend that someone was trying to steal my car when my friend offered, "I've got that." (Yes, I have a friend.) Not wanting to lose my friend, I assured him that I would repay him promptly.&lt;/p&gt;&lt;blockquote&gt;What about now?&lt;/blockquote&gt;&lt;p&gt;I quipped that just because I ordered &lt;i&gt;that&lt;/i&gt; &lt;i&gt;beverage&lt;/i&gt; did not mean that I swung &lt;i&gt;that way&lt;/i&gt;, and besides he was no Rob Lowe. He admitted that he also finds Rob Lowe strangely appealing but said that he was actually talking about me &lt;i&gt;texting&lt;/i&gt; him payment.&lt;/p&gt;&lt;p&gt;I didn't understand.&lt;/p&gt;&lt;blockquote&gt;You're on Twitter, right? Just use your cell phone and text "pay @roblowefan $6 for girly caffeinated beverage" to 40404, and we'll call it even. Remember to go to &lt;a href="http://tipjoy.com/" target="_blank"&gt;tipjoy.com&lt;/a&gt; and tie in your &lt;a href="http://twitter.com/jonathanhawkes" target="_blank"&gt;Twitter&lt;/a&gt; account with their service.&lt;/blockquote&gt;&lt;p&gt;Cool.&lt;/p&gt;&lt;p&gt;As I left the coffee haus, an urban outdoorsman -- who incidentally prefers not to be called "vagrant" -- approached me for change, to which I quite truthfully replied that I had none but that if he provided me with a Twitter account name, I would happily tweet the twitt a twenty. To my surprise, he responded with &lt;a href="http://twitter.com/jonathanhawkes" target="_blank"&gt;@jonathanhawkes&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://twitter.com/home?status=pay+%40jonathanhawkes+%241+for+entertaining+and+informative+blog+post+http%3A%2F%2Fbit.ly%2F2Q6v" target="_blank"&gt;pay @jonathanhawkes $1 for entertaining and informative blog post http://bit.ly/2Q6v&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;Epilogue&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Ok, so I made the whole thing up -- which makes the part about the friend especially sad. But what was not fabricated is my excitement about the potential of micropayments, which according to Ivan Kirigin of Tipjoy are "&lt;a href="http://twitter.com/tipjoy/status/1066151926" target="_blank"&gt;the next small thing&lt;/a&gt;."&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Micropayments" target="_blank"&gt;Micropayments&lt;/a&gt;, in brief, are exactly what they sound like: small payments (think a couple of bucks or less).&amp;nbsp; Micropayment services make such miniscule payments feasible.&amp;nbsp; Whereas, if you wanted someone to send you 25 cents on PayPal, not only would it be a major pain for that someone (requiring them to leave your site and go through PayPal's multistep process), PayPal also charges a blanket 30 cent transaction fee in addition to the percentage they take. With a service like Tipjoy, you can gather small donations on your site (or over Twitter), and the user doesn't skip a beat.&amp;nbsp; They don't even have to leave your page!&lt;/p&gt;&lt;p&gt;So why is this so revolutionary? How could this change &lt;i&gt;everything&lt;/i&gt;? It has long afflicted me that the world seems to be run by advertising. Take television for example: all your favorite programs are created with the sole intention of &lt;i&gt;capturing&lt;/i&gt; your attention so people can try to sell you stuff. Google, YouTube, MySpace, Facebook, etc. all have a similar focus.&amp;nbsp; The business model of the digital world seems to be based almost entirely on advertising. And when a business sells advertising, what do you think they are really selling?&lt;/p&gt;&lt;p&gt;Hint: It's you.&lt;/p&gt;&lt;p&gt;Even if you don't object to being bought and sold like so much cattle, let me tell you why the advertising model is not always ideal. &lt;i&gt;Quality&lt;/i&gt;. Whereas advertising revenues are generated by playing the numbers (eg. 1:1000 visitors will find the advertisement interesting enough to click on it), opt-in payments rely on the content being valuable enough to the consumer that they will be willing to part with a small sum in exchange for their life being somehow enriched. &lt;i&gt;Quality&lt;/i&gt; is now the control factor instead of quantity.&lt;/p&gt;&lt;p&gt;And that makes &lt;i&gt;me&lt;/i&gt; happy, because &lt;i&gt;you&lt;/i&gt; are now the second person to visit this very high quality blog.&lt;/p&gt;&lt;p&gt;&lt;a href="http://tipjoy.com/" target="_blank"&gt;Tipjoy&lt;/a&gt; is not the only micropayment service. There is also &lt;a href="http://tip.it/" target="_blank"&gt;Tip.It&lt;/a&gt; and &lt;a href="http://twitpay.me/" target="_blank"&gt;Twitpay.me&lt;/a&gt;. I imagine that there will soon be a dozen others as this is a relatively simple and potentially a very lucrative idea. I also wouldn't count out PayPal jumping on the bandwagon, but that is purely speculation.&lt;/p&gt;&lt;p&gt;I chose Tipjoy for my own personal use.&amp;nbsp; I like its Twitter integration better than the other two, and it is the only service (at the time of this writing) that offers a site widget that will accept donations directly from your web page or blog. It is also well funded and seems to be forming the kind of high-profile relationships that are crucial for a web 2.0 startup's success.&lt;/p&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://tipjoy.com/u/techhead" onclick="if (window.tipjoyOpenLightbox) {tipjoyOpenLightbox();return false} else return true" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img alt="Blind Monkey" border="0" src="http://techhead.biz/images/blindmonkey_md_wht.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;If you would like to give Tipjoy a test run, I would suggest clicking the monkey. He's had a rough go of it and could use your support.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-1036254530887202348?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/1036254530887202348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=1036254530887202348' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/1036254530887202348?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/1036254530887202348?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/12/panhandling-20-money-goes-social.html' title='Panhandling 2.0. Money goes social.'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>2</thr:total></entry><entry gd:etag='W/&quot;DkQGQ3c7eip7ImA9WxVTFEw.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-2922814605844115371</id><published>2008-08-11T15:05:00.013-06:00</published><updated>2008-12-27T14:45:22.902-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-27T14:45:22.902-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='social'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title>Use XML feeds to can family SPAM and other inbox cloggers</title><content type='html'>&lt;p&gt;This was originally going to be part of my &lt;a href="http://blog.techhead.biz/2008/08/how-xml-rss-atom-feeds-will-change-your.html" target="_blank"&gt;&lt;i&gt;How XML (RSS, Atom) feeds will change your life&lt;/i&gt;&lt;/a&gt; post, but I decided to curtail that article to a more merciful length.&lt;/p&gt;&lt;p&gt;If you need further introduction, please see &lt;a href="http://blog.techhead.biz/2008/08/how-xml-rss-atom-feeds-will-change-your.html" target="_blank"&gt;that article&lt;/a&gt; first.  To cut straight to the point, I find that XML feeds are an excellent way to declutter your email inbox by removing emails that are not personal (not authored with the intent of you being the sole recipient).  Items that typically fall into this category are forwards you get from your friends, family "newsletters" and other email lists you may have joined.&lt;/p&gt;&lt;p&gt;You may want to read these emails; you just may not want to be bothered with them when you are trying to focus on the job at hand.  Save these for when you have time to kill. (I like to read my feeds in the morning in lieu of a newspaper.)&lt;/p&gt;&lt;p&gt;You have a variety of options when it comes to transforming your time/space wasting emails into XML feeds.  One of the simplest is a free service called &lt;a href="http://www.mailbucket.org" target="_blank"&gt;Mailbucket&lt;/a&gt;.  It requires no signup. Just have your mail client forward your nuisance messages to anybox@mailbucket.org and you'll find them in feed form at http://www.mailbucket.org/anybox.xml.  For example, feel free to SPAM me at &lt;a href="mailto:jhawkesistechhead@mailbucket.org"&gt;jhawkesistechhead@mailbucket.org&lt;/a&gt; and see your offensive message at &lt;a href="http://www.mailbucket.org/jhawkesistechhead.xml" target="_blank"&gt;&lt;nobr&gt;http://www.mailbucket.org/jhawkesistechhead.xml&lt;/nobr&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A nearly identical service is &lt;a href="http://dodgit.com" target="_blank"&gt;dodgit.com&lt;/a&gt;.  Along the same lines &lt;a href="mailto:jhawkesistechhead@dodgit.com"&gt;jhawkesistechhead@dodgit.com&lt;/a&gt; ends up at &lt;a href="http://dodgit.com/run/rss?mailbox=jhawkesistechhead" target="_blank"&gt;http://dodgit.com/run/rss?mailbox=jhawkesistechhead&lt;/a&gt;.  However, Mailbucket messages seem to get there much faster.&lt;/p&gt;&lt;p&gt;If you use &lt;a href="http://www.bloglines.com" target="_blank"&gt;Bloglines&lt;/a&gt; as your feed reader, you can setup an email subscription.  Bloglines will create for you a "disposable" email address for subscribing to email lists (or forwarding your forwards to).&lt;/p&gt;&lt;p&gt;However, I prefer &lt;a href="http://www.google.com/reader" target="_blank"&gt;Google Reader&lt;/a&gt; to Bloglines.  Good news for Google fans; you can still use an "all Google" solution.  Log into &lt;a href="http://www.blogger.com" target="_blank"&gt;Blogger&lt;/a&gt; and create a blog for your impersonal messages.  Then look under Settings and Email for your Mail-to-Blogger Address.  Forward your messages here.&lt;/p&gt;&lt;p&gt;If you use an newsreader that supports Atom 0.3, SSL/HTTPS, and HTTP authentication (&lt;a href="http://mail.google.com/support/bin/answer.py?answer=13467&amp;ctx=sibling" target="_blank"&gt;here's a list&lt;/a&gt;), then you can setup Labels in your &lt;a href="http://mail.google.com" target="_blank"&gt;GMail&lt;/a&gt; and read new messages under those labels directly from your feed reader.  However, I find this less than useful since it only displays new messages and (oddly enough) doesn't work with Google Reader at this time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-2922814605844115371?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/2922814605844115371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=2922814605844115371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2922814605844115371?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/2922814605844115371?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/08/use-xml-feeds-to-can-family-spam-and.html' title='Use XML feeds to can family SPAM and other inbox cloggers'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;DkQGQ3c7eyp7ImA9WxVTFEw.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-7614111614503197889</id><published>2008-08-11T12:03:00.005-06:00</published><updated>2008-12-27T14:45:22.903-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-27T14:45:22.903-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='social'/><category scheme='http://www.blogger.com/atom/ns#' term='productivity'/><title>How XML (RSS, Atom) feeds will change your life.</title><content type='html'>&lt;p&gt;We all know someone -- some friend, relative or acquaintance -- that insists on keeping us up to date with every aspect of their life or forwarding us every email or article that they find interesting.  If you're tech savvy, you know that what these people really need is a &lt;a href="http://www.blogger.com/" target="_blank"&gt;blog&lt;/a&gt; or a &lt;a href="http://www.twitter.com" target="_blank"&gt;Twitter&lt;/a&gt; account so that you can follow them, or not follow them, at your convenience.&lt;/p&gt;&lt;p&gt;This article is both for you and your ignorant friend.  If you find yourself in the role of the ignorant, here's my suggestion: Stop spamming your friends.  If you like to keep your chums posted with many small updates throughout the day, go sign up for a &lt;a href="http://www.twitter.com" target="_blank"&gt;Twitter&lt;/a&gt; account.  If you are the more wordy type, get yourself a free &lt;a href="http://www.wordpress.com" target="_blank"&gt;Wordpress&lt;/a&gt; or &lt;a href="http://www.blogger.com" target="_blank"&gt;Blogger&lt;/a&gt; blog.  Both of these options with provide your loved ones with the ability to subscribe to your feed using their favorite feed reader.&lt;/p&gt;&lt;p&gt;So what is a feed? I'm so glad you asked. Chances are that you run into them all the time. Whenever you see a small image that says XML or RSS or "subscribe", it usually links to a feed.  Also, all modern web browsers have visual cues that notify you when a feed is available for a certain page.&lt;/p&gt;&lt;div&gt;Firefox 3.0&lt;br /&gt;
&lt;img src="http://4.bp.blogspot.com/_sWDhIgkDHHI/SKCb7BxFIUI/AAAAAAAAAGg/fOzfFUdVaVo/s320-R/Picture+1.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;Safari 3.0&lt;br /&gt;
&lt;img src="http://3.bp.blogspot.com/_sWDhIgkDHHI/SKCcCJK04FI/AAAAAAAAAGo/BrRvGAmnUb4/s320-R/Picture+2.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;Internet Explorer 7&lt;br /&gt;
&lt;img src="http://3.bp.blogspot.com/_sWDhIgkDHHI/SKCcH4vdtJI/AAAAAAAAAGw/Y-xhgXnuzfE/s320-R/Picture+3.png" /&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;A feed is an XML document (If you don't know what XML is, don't worry.) that is meant to be read by a feed reader.  A feed reader is a piece of software that periodically checks for updates to a subscribed feed.  When the information provided by the feed is updated, this software will let you know.  This saves you the time of having to go to all your friends' blogs and Twitter pages every day.  Your feed reader will let you know when something new is available.&lt;/p&gt;&lt;p&gt;If you can't wait to get started, try &lt;a href="http://www.google.com/reader" target="_top"&gt;Google Reader&lt;/a&gt; as your feed reader.  It supports both online and offline operation, it integrates seamlessly with &lt;a href="http://www.mozilla.com" target="_top"&gt;Firefox&lt;/a&gt; without any need for setup and of course, it's free.&lt;/p&gt;&lt;p&gt;If you already knew what a feed was and are already using a feed reader, it turns out that this post wasn't for you after all.  Your article is &lt;a href="http://blog.techhead.biz/2008/08/use-xml-feeds-to-can-family-spam-and.html" target="_blank"&gt;here&lt;/a&gt; (to keep this one from becoming painfully long).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-7614111614503197889?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/7614111614503197889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=7614111614503197889' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/7614111614503197889?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/7614111614503197889?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/08/how-xml-rss-atom-feeds-will-change-your.html' title='How XML (RSS, Atom) feeds will change your life.'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_sWDhIgkDHHI/SKCb7BxFIUI/AAAAAAAAAGg/fOzfFUdVaVo/s72-Rc/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;DUAMQ38zfyp7ImA9WxVTEUk.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-5628610188902857572</id><published>2008-08-10T22:36:00.005-06:00</published><updated>2008-12-24T12:43:02.187-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-24T12:43:02.187-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='games'/><title>Adventures in Time Wasting</title><content type='html'>&lt;p&gt;This is a Geek blog.  I admit it.  I like Star Trek (the Next Generation still reigns supreme), Star Wars (the original Star Wars) and even though I am against violence, I occasionally do wish that I had a lightsaber.&lt;/p&gt;&lt;p&gt;I'm also part of a generation that's just beginning to be old enough to wax nostalgic.  You may recall my &lt;a href="http://blog.techhead.biz/2008/07/what-is-techhead.html" target="_blank"&gt;first article&lt;/a&gt; in which I relived some of the good old days of BBS gaming. (And curiously, I ran across this &lt;a href="http://www.tradewarsrising.com/" target="_blank"&gt;Trade Wars remake&lt;/a&gt; yesterday.)&lt;/p&gt;&lt;p&gt;Ok, getting to the point...  Computer games used to be fun.  But ever since the FPS (first person shooter) killed the industry, I've been a much more productive person that wastes far less time on gaming, which is a real shame.&lt;/p&gt;&lt;p&gt;When my wife and I first got together, one of the activities we enjoyed was playing adventure games.  We beat &lt;a href="http://en.wikipedia.org/wiki/Myst" target="_blank"&gt;Myst&lt;/a&gt;, got pretty far in &lt;a href="http://en.wikipedia.org/wiki/Riven" target="_blank"&gt;Riven&lt;/a&gt; before losing interest, started playing &lt;a href="http://en.wikipedia.org/wiki/The_Dig" target="_blank"&gt;The Dig&lt;/a&gt; (before she went away to college and I beat it without her... whoops!), and then there was the fabulous &lt;a href="http://en.wikipedia.org/wiki/Monkey_Island_series" target="_blank"&gt;Monkey Island series&lt;/a&gt;. We had a great time.  It was something that we could do together and in my opinion, it beats vegging out in front of the TV.&lt;/p&gt;&lt;p&gt;So when my wife suggested that I find a game for us to play again, I was fully motivated in the task.  Unfortunately, &lt;a href="http://en.wikipedia.org/wiki/LucasArts" target="_blank"&gt;Lucas Arts&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Sierra_Entertainment" target="_blank"&gt;Sierra Games&lt;/a&gt;, the former titans of the adventure game, have decided that the genre is dead and have left their classic titles to rot.  Fortunately for me, their fans have not.&lt;/p&gt;&lt;p&gt;If you want to find a classic Lucas Arts adventure game (Monkey Island, The Dig, Full Throttle, Sam and Max, Maniac Mansion), you're probably going to have to check &lt;a href="http://www.ebay.com" target="_blank"&gt;eBay&lt;/a&gt;.  Lucas Arts no longer sells any of these titles in their online store. Softpedia has the first 2 Monkey Island adventures (&lt;a href="http://mac.softpedia.com/get/Games/The-Secret-of-Monkey-Island.shtml" target="_blank"&gt;The Secret of Monkey Island&lt;/a&gt; and &lt;a href="http://mac.softpedia.com/get/Games/Monkey-Island-2-Le-Chucks-Revenge.shtml" target="_blank"&gt;Monkey Island 2: Le Chuck's Revenge&lt;/a&gt;) available as a free Mac Classic download, but I am left wondering if the publisher is aware of this since this is the only place I have seen the game listed as "freeware".&lt;/p&gt;&lt;p&gt;Once you've obtained one of these timeless classics, however, the real adventure begins.  Most of them are DOS games and will not run on your ultra-modern operating system.  ...That is unless you use the very simple and free &lt;a href="http://www.dosbox.com/" target="_blank"&gt;DOSBox&lt;/a&gt; application.  (Yes it works for Mac and Linux users too!  Plus Mac users get to use the slick frontend &lt;a href="http://boxer.washboardabs.net/" target="_blank"&gt;Boxer&lt;/a&gt;.)&lt;/p&gt;&lt;p&gt;DOSBox should work with just about any of your classic DOS titles.  But Lucas Arts fans who have secured an adventure title also get the option of &lt;a href="http://www.scummvm.org/" target="_blank"&gt;ScummVM&lt;/a&gt;, which allows for better graphics scaling, sound, etc.  Also, it will allow you to play those Mac versions of Monkey Island even if you are on an Intel Mac or PC (as well as Linux, PS2, PSP, Nintendo DS, iPhone, etc.)&lt;/p&gt;&lt;p&gt;If you're a fan of the Sierra adventure games, your prospects for finding the games are a little less bleak.  Sierra is currently selling the collections for Space Quest, King's Quest, and Police Quest from their &lt;a href="http://classics.sierra.com/us/" target="_blank"&gt;online store&lt;/a&gt;.  They are PC only, but from what I hear, they simply packaged DOSBox with the original DOS versions in order to get them to run on Windows.  If that is the case, it should be just as simple to get them up and running on a Mac.  I'll let you know once I purchase the Space Quest collection. (I played Space Quest V years ago, and I was blown away.)&lt;/p&gt;&lt;p&gt;So what happens once you've beat all the classics?  Never fear, there are literally hundreds of NEW amateur adventure games available for free thanks to the &lt;a href="http://www.adventuregamestudio.co.uk/" target="_blank"&gt;Adventure Game Studio&lt;/a&gt;.  Heck, you can even build your own.  If you can never get tired of Monkey Island, there are many &lt;a href="http://www.boxofmystery.com/games/mi2complete.html" target="_blank"&gt;great&lt;/a&gt; (and many &lt;a href="http://www.boxofmystery.com/games/dtsite.html" target="_blank"&gt;not-so-great&lt;/a&gt;) fan-made games, but get 'em while they're hot.  Lucas Arts might not want to play with their toy, but like my three-year-old, they don't want anyone else to either.&lt;/p&gt;&lt;p&gt;Like this tip? Pay the monkey. &lt;a href="http://tipjoy.com/u/techhead" onclick="if (window.tipjoyOpenLightbox) { tipjoyOpenLightbox(); return false } else return true" target="_blank"&gt;&lt;img src="http://techhead.biz/images/blindmonkey_md_wht.gif" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-5628610188902857572?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/5628610188902857572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=5628610188902857572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/5628610188902857572?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/5628610188902857572?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/08/adventures-in-time-wasting.html' title='Adventures in Time Wasting'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;C0QBQ3Y5cSp7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-1912763426702402700</id><published>2008-07-16T21:05:00.012-06:00</published><updated>2009-04-02T22:02:32.829-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:02:32.829-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><title>Place a context-sensitive search on your website or blog</title><content type='html'>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; If you enjoy reading articles on programming or web development, please see our sister blog here: &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;devblog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Google is making it too easy for the modern web developer.  I remember writing a brute-force search engine in Perl for a small web site about 11 years ago.  It was slow, resource intensive, and would not scale well with a site of any size.&lt;/p&gt;&lt;p&gt;Skip forward a bit. Google now provides the ability to add a custom search to your site at no cost.  Unless yours is for a non-profit organization, displaying ads is mandatory, but you do have the option to share in the profit (or pay to have the ads removed).&lt;/p&gt;&lt;p&gt;Google Custom Search is really quite flexible.  You can tell it what sites to include or exclude.  You can have it boost the ranking of a given number or sites or simply filter out all the sites that don't meet your criteria.  Custom Search even gives you the ability to generate these rules on the fly so that results can be tailored to a particular user or a particular page of the site.&lt;/p&gt;&lt;p&gt;This article is not intended to be an in-depth tutorial on Custom Search.  For documentation, see here: &lt;a href="http://www.google.com/coop/docs/cse/" target="_blank"&gt;http://www.google.com/coop/docs/cse/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The definition of your search engine can either be Google hosted or you can host it yourself (This is termed a Linked CSE).  For context-sensitive search, yours must be a Linked CSE.&lt;/p&gt;&lt;p&gt;Custom Search Engines (CSEs) are defined by a simple &lt;a href="http://www.google.com/coop/docs/cse/cse_file.html" target="_blank"&gt;XML specification&lt;/a&gt;.  This specification may be generated dynamically for interesting results.  Below is a very simple example of a dynamically generated CSE which parses all of the links out of the referring page in order to include only those sites within the search results.  The code snippet is written in PHP.&lt;/p&gt;&lt;pre class="prettyprint code lang-php"&gt;&amp;lt;?php
  header('Content-type: text/xml');
  $url = $_SERVER['QUERY_STRING'];
  if (!$url) $url = $_SERVER['HTTP_REFERER'];
  echo &amp;lt;&amp;lt;&amp;lt;CSE
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;GoogleCustomizations&amp;gt;
&amp;lt;CustomSearchEngine keywords="" language="en"&amp;gt;
  &amp;lt;Title&amp;gt;TECHHEAD&amp;lt;/Title&amp;gt;
  &amp;lt;Description&amp;gt;The search for All Things Tech&amp;lt;/Description&amp;gt;
  &amp;lt;Context&amp;gt;
    &amp;lt;BackgroundLabels&amp;gt;
      &amp;lt;Label name="techhead_site" mode="FILTER"/&amp;gt;
    &amp;lt;/BackgroundLabels&amp;gt;
  &amp;lt;/Context&amp;gt;
&amp;lt;/CustomSearchEngine&amp;gt;
CSE;
  if ($url) {
    $url = urlencode(urldecode($url));
    echo &amp;lt;&amp;lt;&amp;lt;CSE
&amp;lt;Include type="Annotations"
href="http://www.google.com/cse/tools/makeannotations?url=$url&amp;amp;label=techhead_site"/&amp;gt;
CSE;
  }
  echo &amp;lt;&amp;lt;&amp;lt;CSE
&amp;lt;Annotations&amp;gt;
  &amp;lt;Annotation about="*.techhead.biz/*"&amp;gt;
    &amp;lt;Label name="techhead_site"/&amp;gt;
  &amp;lt;/Annotation&amp;gt;
&amp;lt;/Annotations&amp;gt;
&amp;lt;/GoogleCustomizations&amp;gt;
CSE;
?&amp;gt;
&lt;/pre&gt;&lt;p&gt;Notice how certain annotations are included dynamically based on $url (which is simply the HTTP referer of the script).  Annotations are for matching URL patterns with labels.  The CSE is set to FILTER out any site that isn't part of "techhead_site".  So the annotations define what is to be considered for inclusion in the search results.&lt;/p&gt;&lt;p&gt;Now we have a dynamic CSE definition.  To use it, paste the appropriate HTML code snippets (&lt;a href="http://www.google.com/coop/docs/cse/cref.html" target="_blank"&gt;http://www.google.com/coop/docs/cse/cref.html&lt;/a&gt;) into your web page or blog template.  You will need to substitute the value of the hidden form parameter "cref" for whatever the URL to your PHP program is.  For a more concrete example, simply look at the page source of this blog at &lt;a href="http://blog.techhead.biz" target="_blank"&gt;http://blog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For a much better Google Custom Search tutorial, see here: &lt;a href="http://www.free-your-mind.info/" target="_blank"&gt;http://www.free-your-mind.info/&lt;/a&gt;  Then come back to fill in the blanks and make your search engine context-sensitive.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-1912763426702402700?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/1912763426702402700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=1912763426702402700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/1912763426702402700?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/1912763426702402700?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/place-context-sensitive-search-on-your.html' title='Place a context-sensitive search on your website or blog'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;DkcDRn46fCp7ImA9WxRaFks.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6730391470297720312</id><published>2008-07-16T00:29:00.003-06:00</published><updated>2008-12-18T22:21:17.014-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-18T22:21:17.014-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='data recovery'/><title>Recover lost pictures from your memory card</title><content type='html'>&lt;p&gt;This one's going to be a short post for a change.&lt;/p&gt;&lt;p&gt;A few days ago a customer came to me saying that she had accidentally wiped out all of her family&amp;#8127;s vacation pictures from their digital camera&amp;#8127;s memory card.  I asked if she had taken any pictures since the inadvertent wipe, and she said &amp;#8220;no.&amp;#8221; So I told her to bring it in, and I&amp;#8127;d see what I could do.&lt;/p&gt;&lt;p&gt;After a little searching, I found two great (and free) programs to recover the pictures: &lt;a href="http://www.download.com/Art-Plus-Digital-Photo-Recovery/3000-12511_4-10513647.html" target="_blank"&gt;Art Plus Digital Photo Recovery&lt;/a&gt; and the generically named &lt;a href="http://www.download.com/Data-Recovery/3000-2094_4-10664893.html?tag=lst-6&amp;cdlPid=10664894" target="_blank"&gt;Data Recovery&lt;/a&gt;.  In the end, I used the Photo Recovery program which very easily recovered all pictures from the card.  It couldn&amp;#8127;t be simpler.&lt;/p&gt;&lt;p&gt;Footnote: Both are Windows programs. Anyone know any comparable Mac programs?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6730391470297720312?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6730391470297720312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6730391470297720312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6730391470297720312?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6730391470297720312?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/recover-lost-pictures-from-your-memory.html' title='Recover lost pictures from your memory card'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;C0QGQHs7fip7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-4379134278889819900</id><published>2008-07-15T16:13:00.019-06:00</published><updated>2009-04-02T22:02:01.506-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:02:01.506-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title>Building a true object-oriented system for Common Lisp</title><content type='html'>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; If you enjoy reading articles on programming or web development, please see our sister blog here: &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;devblog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;While the title of this post may be seen as inflammatory, allow me to elaborate before dashing off to the comment link and turning your flamethrower loose.&lt;/p&gt;&lt;p&gt;As you have probably been taught, &lt;a href="http://en.wikipedia.org/wiki/Alan_Kay" target="_blank"&gt;Dr. Alan Kay&lt;/a&gt; coined the term "object oriented" (OO).  His term, his rules (Which can be found here: &lt;a href="http://www.purl.org/stefan_ram/pub/doc_kay_oop_en" target="_blank"&gt;http://www.purl.org/stefan_ram/pub/doc_kay_oop_en&lt;/a&gt;).  The &lt;a href="http://en.wikipedia.org/wiki/CLOS" target="_blank"&gt;Common Lisp Object System&lt;/a&gt; (CLOS) does not fit the bill to be called object oriented, although it still arrives at many of the benefits of object-oriented principle (and perhaps more -- I will expound on this later).  But as Dr. Kay mentions in the above link, OO &lt;i&gt;can be done in Lisp&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;I have been exploring programming languages a great deal as of late.  One language in particular, &lt;a href="http://www.erlang.org" target="_blank"&gt;Erlang&lt;/a&gt;, has caught my attention because of its much hyped nothing-is-shared model of concurrency.  Erlang accomplishes scalability by breaking tasks into many lightweight processes that communicate with each other in the form of messages.  (Hmm. Where have I seen that before?)  There was something very OO looking about some of the code samples I saw.  Only instead of method names being "invoked" on an object, a process listens for messages of different types and those message types are represented by "atoms", which are essentially strings that contain some meaning to the program.  Communication between processes in Erlang fits with Dr. Kay's requirements for an OO language (messaging, late binding, etc).  It also fits the &lt;a href="http://en.wikipedia.org/wiki/Actor_model" target="_blank"&gt;Actor model&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It can be quite confusing to distinguish between the Actor model and that of OO programming.  The reason?  (And this will likely be a point of some dispute.)  There isn't really any difference.  The term "Actor model", I believe, just had to be invented because the term "object oriented" had come to represent something other than the original meaning.  OO programming has now become synonymous with stack-based models where messages are passed up and down the stack and "messages" are really just function calls conceptualized as messages.  Actors on the other hand are discrete (messages and responses don't traverse a call stack) and are therefore inherently concurrent.  Erlang processes and web services are good examples of the Actor model.&lt;/p&gt;&lt;p&gt;Now back to CL.  CLOS uses multi-methods instead of message passing, so it is not strictly OO.  However, as promised earlier, I'm going to stroke the CL users a little bit here and propose that perhaps the CLOS model is more appropriate to be called "object oriented" than Dr. Kay's model.  Why?  Because OO programming is (supposed to be) all about the encapsulation of behaviors, and objects don't &lt;em&gt;do&lt;/em&gt; anything.  But functions do.&lt;/p&gt;&lt;p&gt;What do you mean, "An object can't do anything"?  Well, in real life, an object (I think of a rock or a piece of wood) does not do anything.  A rock cannot skip itself, change its location, size, or color, or tell you any of these things about itself if you send it a message.  A rock is simply a rock.  If you think in procedural terms, it would be a data structure.&lt;/p&gt;&lt;p&gt;A data structure? Wha? I thought that "everything is an object?"  OO languages assign a sort of anthropomorphic view to objects (Objects are people too) which makes perfect sense if you look at the &lt;a href="http://users.ipa.net/~dwighth/smalltalk/byte_aug81/design_principles_behind_smalltalk.html" target="_blank"&gt;design principles behind Smalltalk&lt;/a&gt; (the language Dr. Kay invented to go along with the term).  One of the major design goals was to create a &lt;i&gt;human&lt;/i&gt; interface with the machine, to allow the programmer to think in an (arguably) more human way.&lt;/p&gt;&lt;p&gt;Along those lines (thinking like a human), I like the term Actor better than Object because it can be explained in a way that makes sense.  A rock cannot tell you anything about itself.  However, an actor portraying a rock can. (I'm not a rock. I just play one on TV.)  This way, everything can be an actor and the model stays coherent.  There is no data, only actors that portray it.  (Again, refer to Dr. Kay's letter above and where he talks about dataless programming.)&lt;/p&gt;&lt;p&gt;This makes sense to me as I often equate programming language models to models of the universe.  But the question remains how to best model the universe.  What is the essential building block of the universe?  Is there one?&lt;/p&gt;&lt;p&gt;So what is the building block of a program?  An object?  And what about not only modeling what an object can do but what can be done to it?  What rules?  What forces apply?&lt;/p&gt;&lt;p&gt;Enter functions.  In CLOS, a function (or group of functions called multi-methods) defines a behavior for an object.  And these behaviors govern object interactions.  Just as a rock has no knowledge of everything that can be done to it, the behaviors do not belong explicitly to the rock, but rather to the context in which the rock is to be used.&lt;/p&gt;&lt;p&gt;And this model is more coherent for "objects" (as I described them earlier).  But for our anthropomorphic figures, objects that DO, it makes more sense to just ask them (as in the messaging model).&lt;/p&gt;&lt;p&gt;Most modern programming languages have lost coherency in their model.  So when I ask what the building block of a program is, it's not simply rhetoric.  The answer will, of course, vary by model, but then is it even possible to introduce a model where there is a single coherent answer?  Well, of course it is possible.  But perhaps a better question should be, is it practical?  Is it a viable way to model our universe?&lt;/p&gt;&lt;p&gt;The question came to me when I realized that an object could be implemented as a function and vise versa, so it's sort of a chicken-and-egg problem.&lt;/p&gt;&lt;p&gt;In some languages (one of them is CL), a function may be curried with a particular parameter or live within an enclosing scope.  These functions are essentially just objects as we know them.  Here's a short example:&lt;/p&gt;&lt;script src="http://google-code-prettify.googlecode.com/svn/trunk/src/lang-lisp.js"&gt;&lt;/script&gt;&lt;pre class="prettyprint code lang-lisp"&gt;(let* ((privateVar 2)
       (methodDictionary
         `((set . ,(lambda (x) (setf privateVar x)))
           (+   . ,(lambda (x) (+ x privateVar)))
           (-   . ,(lambda (x) (- x privateVar))))))
  (defun simple-object (methodName &amp;rest args)
    (apply (cdr (assoc methodName methodDictionary)) args)))

(simple-object '+ 2) ; equals 4
(simple-object 'set 40)
(simple-object '+ 2) ; equals 42
&lt;/pre&gt;&lt;p&gt;A whole object system can be created using such closures.  In fact, that's exactly what I've done.  It may not have been the most practical exercise. (I'm certainly not advocating using it over CLOS.)  But for someone interested in language design, as I am, you may find it enlightening.  It is &lt;a href="http://en.wikipedia.org/wiki/Prototype-based_programming" target="_blank"&gt;prototype based&lt;/a&gt;, and state is kept private.  You can find it &lt;a href="http://code.google.com/p/blogcode/source/browse/trunk/YACLOS/L-object.lisp" target="_blank"&gt;here&lt;/a&gt; or on Wikipedia as &lt;a href="http://en.wikipedia.org/wiki/YACLOS" target="_blank"&gt;YACLOS&lt;/a&gt;, so feel free to improve on the code if you are so inclined.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-4379134278889819900?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/4379134278889819900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=4379134278889819900' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/4379134278889819900?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/4379134278889819900?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/building-true-object-oriented-system.html' title='Building a &lt;em&gt;true&lt;/em&gt; object-oriented system for Common Lisp'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>3</thr:total></entry><entry gd:etag='W/&quot;DkYDSHs5eip7ImA9WxRaFks.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6797863879076229461</id><published>2008-07-15T13:30:00.008-06:00</published><updated>2008-12-18T22:22:59.522-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-18T22:22:59.522-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><title>Remove a virus in 5,000 easy steps</title><content type='html'>&lt;p&gt;I do not post this with pride, but I post in the sincere hope that it will help someone else out.&lt;/p&gt;&lt;p&gt;TECHHEAD is a very small tech-support company located in the southern Rocky Mountains.  In fact, the entity known as TECHHEAD is oftentimes just me.  Other talented individuals cross my path from time to time but even then it is really more of a collaboration than an employer/employee relationship. And it usually doesn&amp;#8127;t last long.  Northern New Mexico is a very low tech area and a common harbor for hippies and corporate burnouts.  However, even hippies get computer viruses.&lt;/p&gt;&lt;p&gt;As it so happens, I get called to clean up viruses A LOT.  Interestingly enough, the client almost always has active virus protection, and I have come to think of programs such as McAfee, Norton, and AVG to be largely a scam.  They slow down machines to a sometimes intolerable level and give the user an unfounded sense of security.  No matter what kind of virus protection you have, don't open that Pamela Anderson screensaver, dips*#%.&lt;/p&gt;&lt;p&gt;Many other times, malware enters uninvited through an unpatched Windows system. Autoupdate is either off or broken or the shop they bought their computer from was giving away &lt;span style="font-style:italic;"&gt;free&lt;/span&gt; Windows licenses (until Microsoft put an end to it) and now their computer fails the Windows Genuine Advantage check.&lt;/p&gt;&lt;p&gt;It was an unpatched system I ran into the other day.  Usually these things are pretty straightforward.  I run &lt;a href="http://www.trendsecure.com/portal/en-US/tools/security_tools/hijackthis" target="_blank"&gt;HijackThis&lt;/a&gt; to get a more targeted view of the Windows registry and try to discover where the baddie is hiding.  Then, if it is a relatively uncomplicated attack, I simply remove the appropriate entries and see if &lt;a href="http://www.safer-networking.org/index2.html" target="_blank"&gt;Spybot S&amp;D&lt;/a&gt; can find anything additional to cleanup.  Whoala!  Sometimes I throw in a run of &lt;a href="http://www.ccleaner.com/" target="_blank"&gt;CCleaner&lt;/a&gt; (formerly Crap Cleaner) just to, er, clean up the residual crap left in the temporary folders or registry.  The aforementioned tools are all great and all free.&lt;/p&gt;&lt;p&gt;However, this time was not so simple.  Whenever the malware files were deleted, they would simply regenerate themselves.  There was a process running somewhere that would monitor these files obviously.  Usually in this case, I would simply reboot the machine and use a bootable CD to run an alternative operating system so that I could safely remove the files.  The Linux distribution, &lt;a href="http://www.sysresccd.org/Main_Page" target="_top"&gt;System Rescue CD&lt;/a&gt; is one of my favorite tools for this purpose.  However, it was not an option, because in this case, I did not have physical access to the computer.  These days I do most of my troubleshooting by remote using the fabulous &lt;a href="https://secure.logmeinrescue.com/HelpDesk/Home.aspx" target="_blank"&gt;LogMeIn Rescue&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So, while simply not booting up in Windows can be the easiest way to remove a Windows virus, I had to get a little more down and dirty with this one.&lt;/p&gt;&lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" target="_blank"&gt;Process Explorer&lt;/a&gt; is a great tool I discovered a while back.  It can show you what DLLs are actually involved with each running process.  A quick look into the WINDOWS and WINDOWS/system32 directories easily revealed the culprit DLLs.  The file names chosen by the attack were completely random and the timestamp revealed them to be created on the same day the client began having trouble.&lt;/p&gt;&lt;p&gt;Once I killed the processes utilizing these files, I was able to finally delete them. (The whole process was actually a little bit more complicated than that, but that's &amp;#8220;pretty much&amp;#8221; how it happened.)  However, do not assume, as I sincerely wanted to, that this is the end of the story.&lt;/p&gt;&lt;p&gt;What do you do when your virus protection software finds nothing, Spybot (which is usually a great tool) comes up clean, and Hijack This doesn't appear to show anything out of the ordinary?  Claim victory?  Perhaps you might until you open up your web browser and find that sites such as Windows Update and Spybot&amp;#8127;s update site seems to be selectively unreachable. Darnit.&lt;/p&gt;&lt;p&gt;We still have a DNS hijacker.&lt;/p&gt;&lt;p&gt;I know how to deal with a DNS hijacker.  I've done it before.  If it is a simple one, Hijack This will show it to me.  If it is more complicated, surely resetting the TCP/IP stack with a program like &lt;a href="http://www.majorgeeks.com/WinSock_XP_Fix_d4372.html" target="_blank"&gt;WinSock XP Fix&lt;/a&gt; will do the trick.&lt;/p&gt;&lt;p&gt;Well, don&amp;#8127;t call me surely. It didn&amp;#8127;t work.&lt;/p&gt;&lt;p&gt;Now by this point, I had already spent far more time than I care to admit in fighting this particularly malicious foe (it had already deleted the customer&amp;#8127;s System Restore points).  I was ready for some help.  I posted a description of the malware on &lt;a href="http://www.experts-exchange.com/" target="_blank"&gt;Experts Exchange&lt;/a&gt; and within five minutes, some snooty (I picture him an acne-faced teenager) suggested that I had been dealing with an attack called &amp;#8220;Windows Security 2008&amp;#8221; and suggested that I use Malwarebytes&amp;#8127; (also free) &lt;a href="http://www.malwarebytes.org/mbam.php" target="_blank"&gt;Anti-malware&lt;/a&gt; program to remove it.&lt;/p&gt;&lt;p&gt;No, not an acne-faced teenager, but perhaps some angelic being sent from above, this kid was.  It worked. In a matter of minutes, much faster than Spybot, Anti-malware had completely eliminated all traces of my mismatched foe.  I probably could have saved hours just by using the program to begin with.  I will definitely be adding the tool to my arsenal.&lt;/p&gt;&lt;p&gt;Footnote: This is not a paid advertisement.  It is a true story, and all of the aforementioned resources in my article come highly recommended by me.  Of course, it should (but unfortunately doesn&amp;#8127;t) go without saying that I am not responsible if you bugger up your system by using any of them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6797863879076229461?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6797863879076229461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6797863879076229461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6797863879076229461?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6797863879076229461?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/remove-virus-in-5000-easy-steps.html' title='Remove a virus in 5,000 easy steps'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;C0QERXc-eyp7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6537927816281130930</id><published>2008-07-12T13:28:00.004-06:00</published><updated>2009-04-02T22:01:44.953-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:01:44.953-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title>Beust Coding Challenge</title><content type='html'>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; If you enjoy reading articles on programming or web development, please see our sister blog here: &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;devblog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Once again I am late to the party.  Cedric posted a &lt;a href="http://beust.com/weblog/archives/000491.html" target="_blank"&gt;coding challenge&lt;/a&gt; on his blog.  It looks like &lt;a href="http://crazybob.org" target="_blank"&gt;Crazy Bob&lt;/a&gt; took the prize for most creative (and fastest) &lt;a href="http://crazybob.org/FastBeustSequence.java.html" target="_blank"&gt;implementation&lt;/a&gt;.  I would like to think that I could have come up with a similar solution, but then again, I also like to think that I could look like Schwarzenegger if I ever started working out.&lt;/p&gt;&lt;p&gt;However, Cedric posted a follow up, &amp;#8220;Port Bob's code to your language.&amp;#8221;  Bob&amp;#8217;s code was in Java.  However, I am a Java programmer, so that sort of rules out a port.  But I was able to make a few performance enhancements.  Instead of a doubly linked list, I used a singly linked list and thus was able to prevent a few unnecessary assignments and eliminate a few checks.  In addition, once the max has been found, I use a Throwable to unwind the stack.  On my Intel MacBook, I see performance enhancements of 10-20%.  The code can be found here: &lt;a href="http://code.google.com/p/blogcode/source/browse/trunk/BeustChallenge0708/src/beust/ModifiedBeustSequence.java" target="_blank"&gt;ModifiedBeustSequence&lt;/a&gt;. Or for the comparison, see here: &lt;a href="http://code.google.com/p/blogcode/source/browse/trunk/BeustChallenge0708/src/beust/CompareBeustSequence.java" target="_blank"&gt;CompareBeustSequence&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But sticking to the assignment, I did do a straight port of my modified version into Common Lisp, which I have been toying with lately (The port can be found here: &lt;a href="http://code.google.com/p/blogcode/source/browse/trunk/BeustChallenge0708/beust.lisp" target="_blank"&gt;beust.lisp&lt;/a&gt;). I&amp;#8217;m sure that any respectable Lisp programmer could come up with a much more Lisp-like solution.  If you go to the trouble, I would love to see it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6537927816281130930?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6537927816281130930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6537927816281130930' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6537927816281130930?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6537927816281130930?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/beust-coding-challenge.html' title='Beust Coding Challenge'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>2</thr:total></entry><entry gd:etag='W/&quot;C0UMQ3g5fyp7ImA9WxVbF04.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6670845171815816934</id><published>2008-07-09T10:28:00.008-06:00</published><updated>2009-04-02T22:01:22.627-06:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2009-04-02T22:01:22.627-06:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title>The Groovy Programming Language</title><content type='html'>&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; If you enjoy reading articles on programming or web development, please see our sister blog here: &lt;a href="http://devblog.techhead.biz" target="_blank"&gt;devblog.techhead.biz&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Long before &lt;a href="http://en.wikipedia.org/wiki/Guice" target="_blank"&gt;Guice&lt;/a&gt;, there was &lt;a href="http://www.picocontainer.org/" target="_blank"&gt;PicoContainer&lt;/a&gt;.  I used to lurk the mailing lists of PicoContainer and the &lt;a href="http://en.wikipedia.org/wiki/Apache_Avalon" target="_blank"&gt;Avalon Framework&lt;/a&gt; project back in the day when &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_Control" target="_blank"&gt;Inversion of Control&lt;/a&gt; (IoC) was a relatively hot topic. (In fact, if you &lt;a href="http://www.google.com/search?hl=en&amp;q=Jonathan+Hawkes" target="_blank"&gt;Google &amp;#8220;Jonathan Hawkes&amp;#8221;&lt;/a&gt; at this time, one of the very few mentions of me is one of my very few posts on the Avalon list.)  However, this article is not intended to be an introduction to IoC.&lt;/p&gt;&lt;p&gt;PicoContainer is how I discovered Groovy.&lt;/p&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Apache_Ant" target="_blank"&gt;Ant&lt;/a&gt; was at its hayday.  XML was still somewhat of a buzzword (if it is not now).  The folks at the NanoContainer project (PicoContainer&amp;#8217;s big brother) made the (gasp) startling realization that all of the configuration files required by Avalon and the &lt;a href="http://en.wikipedia.org/wiki/Spring_Framework" target="_blank"&gt;Spring framework&lt;/a&gt; &lt;span style="font-style: italic;"&gt;were actually code&lt;/span&gt;.  XML configuration files can be large and unwieldy.  Learning all of the correct tags and attributes can be a more daunting task for a programmer than simply learning a new API. So why not just write configuration code in&amp;#8230; well&amp;#8230; code?&lt;/p&gt;&lt;p&gt;One reason is that it&amp;#8217;s nice to be able to change configuration on the fly, or at least without a recompile.  This is where Groovy comes in.&lt;/p&gt;&lt;p&gt;Groovy is a language for the Java VM.  To call it a scripting language would be somewhat of a misnomer.  Groovy produces Java bytecodes.  It can call Java classes and be called by Java classes.  However, like a scripting language, you can change it.  You don't have to build it. (Unless you want your vanilla Java code to call it in a typesafe manner.)&lt;/p&gt;&lt;p&gt;Groovy essentially extends the syntax of Java.  In most cases, valid Java code will be valid Groovy code.  However, like a scripting language, Groovy does not force you to know the type of an object at &amp;#8220;compile time&amp;#8221;.  It supports closures and lots of other little goodies.&lt;/p&gt;&lt;p&gt;Go check it out.  If you are a Java programmer, you owe it to yourself.&lt;/p&gt;&lt;p&gt;&lt;a href="http://groovy.codehaus.org" target="_blank"&gt;http://groovy.codehaus.org&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6670845171815816934?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6670845171815816934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6670845171815816934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6670845171815816934?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6670845171815816934?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/groovy-programming-language.html' title='The Groovy Programming Language'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>0</thr:total></entry><entry gd:etag='W/&quot;DkQGQXc8fip7ImA9WxRaFks.&quot;'><id>tag:blogger.com,1999:blog-9140180332652418576.post-6120513894323036062</id><published>2008-07-09T01:01:00.004-06:00</published><updated>2008-12-18T22:25:20.976-07:00</updated><app:edited xmlns:app='http://www.w3.org/2007/app'>2008-12-18T22:25:20.976-07:00</app:edited><category scheme='http://www.blogger.com/atom/ns#' term='about'/><title>What is a TECHHEAD?</title><content type='html'>&lt;p id="lq96"&gt;&amp;#8220;When I was a child, I was quite adept at taking things apart.  Putting them back together on the other hand...&amp;#8221;&lt;/p&gt;&lt;p id="lq961"&gt;This is a story I casually tell clients as I have their notebook computer splayed out all over the room.  They think that I am teasing them, and I am in part, but as with most jesting, there lies a kernel of truth.  And the truth is, in my life I have taken apart many more things than I have put back together, caused myself more problems than I have fixed, and started more projects than I have finished.  I find that learning is bold, messy, and full of unforeseen consequences.  Mine is a tale of learning. &lt;/p&gt;&lt;p id="en6.1"&gt;My name is Jonathan Hawkes, and I am a TECHHEAD.&lt;/p&gt;&lt;p id="a..61"&gt;I began my odyssey into computer programming when I was seven years old. I started out by writing simple games in &lt;a title="BASIC" target="_blank" href="http://en.wikipedia.org/wiki/BASIC_programming_language" id="m2ds"&gt;BASIC&lt;/a&gt; on my friend&amp;#8217;s &lt;a title="Commodore 64" target="_blank" href="http://en.wikipedia.org/wiki/Commodore_64" id="vpb4"&gt;Commodore 64&lt;/a&gt;. We would spend the better hours of the day punching away at the integrated keyboard, testing, modifying and testing again. We would draw out &lt;a title="sprites" href="http://en.wikipedia.org/wiki/Sprite_%28computer_graphics%29" id="j9gn"&gt;sprites&lt;/a&gt; onto graph paper, convert our makeshift bitmap into hexadecimal, input the figures into our program and enjoy the fruits of our hard-earned artistic labor. Then long after sundown, we would give a simple salute, power down the machine, and say a solemn goodbye to our wasted day&amp;#8217;s effort. (At that time, my friend had no &lt;a title="floppy drive" href="http://en.wikipedia.org/wiki/Floppy_drive" id="gqyv"&gt;floppy drive&lt;/a&gt;.)&lt;/p&gt;&lt;p id="qdvr1"&gt;The subsequent years passed in similar fashion.  Games, robots, lasers, etc. &amp;#8212; Some were built; all were taken apart; few survived.  &lt;a title="BBS" target="_blank" href="http://en.wikipedia.org/wiki/Bulletin_board_system" id="n-7s"&gt;BBS&lt;/a&gt;s were the primary mode of communication. &lt;a title="L.O.R.D." target="_blank" href="http://en.wikipedia.org/wiki/Legend_of_the_Red_Dragon" id="k.zg"&gt;L.O.R.D.&lt;/a&gt; and &lt;a title="TradeWars" target="_blank" href="http://en.wikipedia.org/wiki/Trade_Wars" id="mtz3"&gt;TradeWars&lt;/a&gt; rocked. &lt;a title="Apogee" target="_blank" href="http://en.wikipedia.org/wiki/Apogee_Software" id="hf2k"&gt;Apogee&lt;/a&gt; was the coolest company &lt;i id="jzlk"&gt;ever&lt;/i&gt;.&lt;/p&gt;&lt;p id="c3yo1"&gt;Then Al Gore said, &amp;#8220;Let there be internet.&amp;#8221; And there was internet. The local college had a dial-up gateway that would allow terminal-based access to &lt;a title="Gopher" target="_blank" href="http://en.wikipedia.org/wiki/Gopher_%28protocol%29" id="ppqr"&gt;Gopher&lt;/a&gt;, &lt;a title="Usenet" target="_blank" href="http://en.wikipedia.org/wiki/Usenet" id="pfeu"&gt;Usenet&lt;/a&gt; and the WWW (through the &lt;a title="Lynx" target="_blank" href="http://en.wikipedia.org/wiki/Lynx_%28web_browser%29" id="eh9y"&gt;Lynx&lt;/a&gt; browser). Way cool.  I would page through binary Usenet groups while capturing output to a text file within HyperTerminal.  I wrote a &lt;a title="UUEncoder" target="_blank" href="http://en.wikipedia.org/wiki/UUEncode" id="myg1"&gt;UUEncoder&lt;/a&gt;/Decoder in &lt;a title="C" target="_blank" href="http://en.wikipedia.org/wiki/C_%28programming_language%29" id="oy72"&gt;C&lt;/a&gt; and had instant access to a far larger range of games and other content than any BBS to which I had been a member.&lt;/p&gt;&lt;p id="pl2g1"&gt;More years passed. My family subscribed to a &amp;#8220;real&amp;#8221; dial-up account.  It came with a finite amount of hosted web space and &lt;a title="CGI" target="_blank" href="http://en.wikipedia.org/wiki/Common_Gateway_Interface" id="d4.7"&gt;CGI&lt;/a&gt; access.  Bingo.  I soon discovered that &lt;a title="Perl" target="_blank" href="http://en.wikipedia.org/wiki/Perl" id="hpik"&gt;Perl&lt;/a&gt; was more suited to the challenge of building web applications than C, and my first Perl project was a sort of simple &lt;a title="wiki" target="_blank" href="http://en.wikipedia.org/wiki/Wiki" id="h703"&gt;wiki&lt;/a&gt; (circa 1995) called the ScrawlWall (which was just a text box that anyone could modify and save to leave a short note or &lt;a title="ASCII art" target="_blank" href="http://en.wikipedia.org/wiki/ASCII_art" id="vhs."&gt;ASCII art&lt;/a&gt;).  That same year, I also developed an &lt;a title="AJAX" target="_blank" href="http://en.wikipedia.org/wiki/Ajax_%28programming%29" id="in.2"&gt;AJAX&lt;/a&gt; precursor, the &lt;a title="JavaScript" target="_blank" href="http://en.wikipedia.org/wiki/JavaScript" id="d6xw"&gt;JavaScript&lt;/a&gt; ScrawlWall, which could be saved and loaded without ever leaving the page.  Before shutting the project down in 1998, I hosted over 8,000 ScrawlWalls.&lt;/p&gt;&lt;p id="e13e0"&gt;After that began my career.  As an independent contractor, I developed numerous web sites as well as a (then impressive) cross-browser &lt;a title="DHTML" target="_blank" href="http://en.wikipedia.org/wiki/DHTML" id="r3hk"&gt;DHTML&lt;/a&gt; library called Pane DOM.  This was back when &lt;a title="Netscape Navigator" target="_blank" href="http://en.wikipedia.org/wiki/Netscape_Navigator" id="r5ji"&gt;Netscape Navigator&lt;/a&gt; only allowed manipulation of content through &amp;#8220;layers&amp;#8221; and &lt;a title="Internet Explorer" target="_blank" href="http://en.wikipedia.org/wiki/Internet_Explorer" id="in_:"&gt;Internet Explorer&lt;/a&gt; had much of the same limited capabilities that it does now.  Being as impressive of a (still) teenager as I was, I was offered a full-time job by one of my clients. I was newly married (Yikes! Kids these days), so I jumped at the opportunity.  This was near the time the first dot com bubble burst.  My company proceeded to sink over 3 million dollars into advertising and not a tenth of that into development.  Though we had an economic development grant of over a half a million, the plug was pulled on our project before we ever had a finished product (or spent the money). Brilliant!&lt;/p&gt;&lt;p id="j5_41"&gt;However my boss, who was one of those really great guys you work for once in a lifetime, managed to keep the team working for a while on various other projects (with remarkably similar outcomes).  In the end, we did manage a &lt;a title="Cobol" target="_blank" href="http://en.wikipedia.org/wiki/Cobol" id="h0ur"&gt;Cobol&lt;/a&gt;-to-&lt;a title="Java" target="_blank" href="http://en.wikipedia.org/wiki/Java_%28programming_language%29" id="fe4h"&gt;Java&lt;/a&gt; rewrite of a popular online commodity futures and options trading platform.  And I led the development and maintenance for a number of years.&lt;/p&gt;&lt;p id="smpm0"&gt;&lt;i id="jhhq1"&gt;Salute. Power down. Say goodbye. &lt;/i&gt;&lt;/p&gt;&lt;p id="smpm3"&gt;The problem with having a job that requires your mind is that when you lose your mind, your job will soon follow.  So once my project no longer required my guardianship, and I could no longer stand the sight of it, I did what any reasonable person would do.  I quit my well-paying job and became a professional ski patroller. &lt;/p&gt;&lt;p id="h9sw1"&gt;For any other kind of person, this may have been the end of the story.  But for a select few there will always be a draw, an inexplicable force that compels one to the soft glow of a computer display and the distinctly stale aroma of the great indoors.  So a number of years later, I traded in my ski boots for house shoes and returned to the home office.  Thus TECHHEAD was (re)born. &lt;/p&gt;&lt;p id="uusc4"&gt;Are you seeing a pattern here?  I am a firm believer in reincarnation.  I just believe that we have one lifetime in which to accomplish it.  So now I am back where I started.  But I am learning.  I am building.  And starting with this, my first blog post, I am sharing.  Today I hope to build something truly great, scrap it, and start again tomorrow with the same enthusiasm and perhaps just a little bit wiser.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9140180332652418576-6120513894323036062?l=blog.techhead.biz' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.techhead.biz/feeds/6120513894323036062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=9140180332652418576&amp;postID=6120513894323036062' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6120513894323036062?v=2'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9140180332652418576/posts/default/6120513894323036062?v=2'/><link rel='alternate' type='text/html' href='http://blog.techhead.biz/2008/07/what-is-techhead.html' title='What is a TECHHEAD?'/><author><name>TECHHEAD</name><uri>http://www.blogger.com/profile/18441232171642024472</uri><email>noreply@blogger.com</email><gd:extendedProperty name='OpenSocialUserId' value='06887737144991222694'/></author><thr:total>1</thr:total></entry></feed>