<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13977355</id><updated>2011-12-14T21:06:23.456-06:00</updated><category term='motivation'/><category term='linux'/><category term='coffee'/><category term='ubuntu'/><category term='attitude'/><title type='text'>fognl</title><subtitle type='html'>Get off my lawn.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default?start-index=101&amp;max-results=100'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>190</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13977355.post-5161811753918481929</id><published>2011-11-06T09:50:00.000-06:00</published><updated>2011-11-06T09:50:03.956-06:00</updated><title type='text'>How to use the LookSee Encoder API</title><content type='html'>A few people have been asking about how to use the LookSee Encoder API, so I thought I would post something about it. I hadn't really planned on other people wanting to use it, but apparently I'm not the only person who wants to encode a video out of a series of JPG images.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LookSee Encoder&lt;/b&gt;&lt;br /&gt;&lt;a href="https://market.android.com/details?id=com.fognl.android.service.looksee.encoder" target="_blank"&gt;LookSee Encoder&lt;/a&gt; is essentially a slimmed-down &lt;a href="http://ffmpeg.org/" target="_blank"&gt;FFmpeg&lt;/a&gt; implementation that runs on Android. It can encode a video from a series of images, create a series of images from a video file, and convert videos between formats. It's packaged as a standalone application that you download to your device. Once downloaded, an application communicates with it via broadcast Intents. Some example code illustrating how to use it can be downloaded &lt;a href="http://fognl.com/files/EncodeExample.java" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you're encoding a series of images into a video, be sure and&amp;nbsp;name the image files sequentially as 9-digit 0-padded numbers, for example &lt;b&gt;000000005.jpg&lt;/b&gt;. The numbers cannot skip. FFmpeg finds the files to include the video as "%09d.jpg". It will run through the list of files in sequence until it can't find any more files. If the file names skip a number (e.g. 000000005.jpg, 000000007.jpg), FFmpeg will stop at #5.&lt;/li&gt;&lt;li&gt;Following the link to LookSee Encoder, you'll notice a low rating. This is the result of a total of &lt;b&gt;1&lt;/b&gt;&amp;nbsp;rating from someone named "kristhian" who tried to convert a 2-hour movie on his Android device. It took a very long time. If kristhian had tried to perform the same task on a dual-core desktop PC, it's likely it would have taken more than the hour he complained about. Honestly, I hadn't considered someone trying to convert a feature-length film with it. So, just a note. If you write an app that handles long videos, you might want to warn the user about the time required to extract all the frames from Lord Of The Rings.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you want to see LookSee Encoder in action, try &lt;a href="https://market.android.com/details?id=com.fognl.android.apps.looksee" target="_blank"&gt;LookSee Animator&lt;/a&gt; or &lt;a href="https://market.android.com/details?id=com.fognl.android.apps.looksee.draw" target="_blank"&gt;LookSee Draw&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5161811753918481929?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5161811753918481929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5161811753918481929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5161811753918481929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5161811753918481929'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2011/11/how-to-use-looksee-encoder-api.html' title='How to use the LookSee Encoder API'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5289846134877840905</id><published>2011-09-03T01:41:00.001-05:00</published><updated>2011-09-03T01:41:35.463-05:00</updated><title type='text'></title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px;"&gt;Monday morning before last, I wrecked my car, an '01 Acura Integra. I was driving down a rural highway on my way to work like I do every morning, when an 80-year-old man crossed the road in front of me. He had no idea I was there, and I had no time to react. I hit him at about 45mph, and totaled my car.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The strange thing is, I was actually driving it to work just that one day that week. I had a meeting scheduled with a guy I was going to buy another car from, a Civic hatchback that I would use as a commuter car so I could keep the Integra in the garage and "save" it. I figured if it spent the majority of its time in the garage, it wouldn't get worn out, stolen, scratched, etc. I guess I took care of that problem...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I got several injuries out of the wreck. I broke my heel (surgery is coming up next week), bit through my tongue, cracked a rib, got stabbed in the knee by my ignition key, and got a mild concussion. But for some reason, I keep thinking of the loss of my car as the worst part of the whole thing. Maybe that will change after I've spent 3 months on crutches struggling to do simple things like carrying a cup of coffee while I walk. Who knows?&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, I had the car for 6 years, and drove it almost exactly 100,000 miles during that time. It had 45,684 miles on it when I got it, and it had 146,548 miles on it when it died. During that time, I took it on a few trips, drove it back and forth to work, washed it, serviced it, and had a lot of fun driving it. It was quick for a FWD 4cyl. car, sounded good, and never left me stranded. I got to where I enjoyed the Saturday or summer-evening ritual of pushing it out of the garage, opening the hood, looking around at things, and making sure everything was working properly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was just a piece of machinery, but I'm going to miss it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-j2Ma8eFmYn0/TmHMDLLkIGI/AAAAAAAAAxs/Tu88vRKhOKM/s1600/rip-sweet-car.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="142" src="http://1.bp.blogspot.com/-j2Ma8eFmYn0/TmHMDLLkIGI/AAAAAAAAAxs/Tu88vRKhOKM/s320/rip-sweet-car.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5289846134877840905?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5289846134877840905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5289846134877840905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5289846134877840905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5289846134877840905'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2011/09/monday-morning-before-last-i-wrecked-my.html' title=''/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-j2Ma8eFmYn0/TmHMDLLkIGI/AAAAAAAAAxs/Tu88vRKhOKM/s72-c/rip-sweet-car.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2006866478674519291</id><published>2011-07-30T10:25:00.004-05:00</published><updated>2011-07-30T10:40:37.120-05:00</updated><title type='text'>Quick and dirty distributed Git repository</title><content type='html'>A friend told me about a cool trick for using DropBox as a distributed Git repository, and I adapted the approach for use with Ubuntu One. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In your ~/Ubuntu One directory, do this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;mkdir -p repo/myproject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;cd repo/myproject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;git init --bare&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then in your project directory, do this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;git remote add uone $HOME/Ubuntu\ One/repo/myproject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, when you want to push changes to your Ubuntu One directory, just do this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;git push uone master&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and it will be shared according to Ubuntu One's upload settings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can share your repo directory with others, and they can get your changes by doing this in a project directory (once their sync directory is populated with the shared folder's contents):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;git clone $HOME/Ubuntu\ One/repo/myproject&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...and that appears to be it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously, it's not what you'd typically do for a big project, but for small things you want to share with specific people, it works pretty well (not to mention providing a handy backup).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2006866478674519291?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2006866478674519291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2006866478674519291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2006866478674519291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2006866478674519291'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2011/07/quick-and-dirty-distributed-git.html' title='Quick and dirty distributed Git repository'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8200964631931172104</id><published>2011-02-10T09:31:00.001-06:00</published><updated>2011-02-10T09:31:48.189-06:00</updated><title type='text'>Blogger for Android</title><content type='html'>&lt;div&gt;&lt;p&gt;Cool... a blogging app for Android just appeared. Test 123...&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8200964631931172104?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8200964631931172104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8200964631931172104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8200964631931172104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8200964631931172104'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2011/02/blogger-for-android.html' title='Blogger for Android'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7259526399455771914</id><published>2010-10-20T23:33:00.002-05:00</published><updated>2010-10-20T23:35:50.632-05:00</updated><title type='text'>Greed 2: Dark Theme</title><content type='html'>I just posted a Greed update that adds a "Dark Theme" option in the preferences. When selected, the article list and article viewer switch to a dark theme, better for reading at night.&lt;br /&gt;&lt;br /&gt;Note that the article viewer does this by manipulating the styles in the HTML it's displaying in articles. This means that it works for the most part, but there will inevitably be some pages that display in their original colors, since the HTML contains style rules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7259526399455771914?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7259526399455771914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7259526399455771914' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7259526399455771914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7259526399455771914'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/10/greed-2-dark-theme.html' title='Greed 2: Dark Theme'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6130771023388934620</id><published>2010-10-16T00:48:00.002-05:00</published><updated>2010-10-16T00:53:42.409-05:00</updated><title type='text'>Greed 2: Initial Signup screen</title><content type='html'>A co-worker downloaded Greed today while I was sitting right beside him in an iPhone programming class and tried to log into it. He got his credentials wrong, and Greed locked up. So I decided to fix it. It turns out I had done something kind of stupid at the point where an authentication attempt had failed. Having removed the offending code, it appears to work better.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6130771023388934620?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6130771023388934620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6130771023388934620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6130771023388934620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6130771023388934620'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/10/greed-2-initial-signup-screen.html' title='Greed 2: Initial Signup screen'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4088486930683093274</id><published>2010-10-13T23:20:00.003-05:00</published><updated>2010-10-13T23:22:06.850-05:00</updated><title type='text'>Greed 2: Oops</title><content type='html'>I just realized (thanks to Fnord) that I had been running an updated version of Greed on my phone, but hadn't pushed it to the Market yet. Oops! &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This version removes an unneeded permission for the phone (making calls, which actually never get made), and an issue with the feed list going black and not loading. I've been running it for months, and didn't realize I hadn't updated it so everyone else could use it. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4088486930683093274?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4088486930683093274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4088486930683093274' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4088486930683093274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4088486930683093274'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/10/greed-2-oops.html' title='Greed 2: Oops'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8672178458563149469</id><published>2010-08-05T23:12:00.002-05:00</published><updated>2010-08-05T23:14:31.830-05:00</updated><title type='text'>Greed 2: Manual Polling</title><content type='html'>I just pushed an update to the Market for Greed 2 that adds a manual polling option. This effectively stops the Feed Notification service from running unless you press the (new) "Manual Refresh" menu item in the main screen.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, I added a configurable widget update interval so you can control how often the widget updates.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8672178458563149469?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8672178458563149469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8672178458563149469' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8672178458563149469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8672178458563149469'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/08/greed-2-manual-polling.html' title='Greed 2: Manual Polling'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3577210905132338850</id><published>2010-06-29T23:02:00.002-05:00</published><updated>2010-06-29T23:05:34.773-05:00</updated><title type='text'>Greed 2: More widgets</title><content type='html'>While I'm on a kick to write widgets, both at home and at work, I thought I would put a couple more of them in Greed. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Both of the new widgets fall into the "large" category. One of them shows the latest article title and a short summary of the article. The other one shows a list of the article titles in the feed/label/state you've selected for the feed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also changed the background for the widgets to something simpler and cleaner. There's no "Greed" icon in the top left of the widgets anymore, but I kind of like the fact that they're cleaner looking and sort of transparent.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3577210905132338850?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3577210905132338850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3577210905132338850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3577210905132338850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3577210905132338850'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/06/greed-2-more-widgets.html' title='Greed 2: More widgets'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-9199322221697467624</id><published>2010-06-20T22:20:00.003-05:00</published><updated>2010-06-20T22:21:19.721-05:00</updated><title type='text'>Greed 2: Widget</title><content type='html'>Greed 2 now has a widget. I added it this weekend. There will be an update later this week which adds some configurability to it for things like update interval, etc. In the meantime, happy Father's Day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-9199322221697467624?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/9199322221697467624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=9199322221697467624' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/9199322221697467624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/9199322221697467624'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/06/greed-2-widget.html' title='Greed 2: Widget'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1860356355191870306</id><published>2010-06-16T22:20:00.002-05:00</published><updated>2010-06-16T22:26:14.986-05:00</updated><title type='text'>Greed 2: Feeds fix</title><content type='html'>Just put up a quick update to Greed, which includes 2 things.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, the feed lists, labels, unread counts, and other ephemera associated with reading Google Reader feeds are stored as XML files now, instead of the binary format I was using before. This was the apparent cause of the slow/interminable load times for the feed list. It should work faster now.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another item that made it into this update is the "mobile article" option, which uses the Google page compressor URL to allow the download of slimmed-down articles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it for this update, but I'm working on integrating the Widget for an update appearing soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1860356355191870306?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1860356355191870306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1860356355191870306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1860356355191870306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1860356355191870306'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/06/greed-2-feeds-fix.html' title='Greed 2: Feeds fix'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4189683017611331302</id><published>2010-06-05T02:02:00.005-05:00</published><updated>2010-06-06T01:22:53.059-05:00</updated><title type='text'>Greed 2: Instapaper</title><content type='html'>The latest version of Greed adds a few features:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Where Was I? &lt;/b&gt;&lt;/div&gt;&lt;div&gt;A few people asked for the Where was I feature introduced in the last update to be automatic: Instead of starting at the main menu, just return to the last-read article. I can see how some people would want to do this, but I also realize others (me, for example) wouldn't necessarily want to all the time. So there is a new option to return to Where was I automatically, under the Article Reading section. So you can have it either way.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Instapaper&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I also added Instapaper integration. If you haven't heard of it, &lt;a href="http://instapaper.com/"&gt;Instapaper&lt;/a&gt; is a handy place to store links for later reading. I implemented this via the Share menu, so it's available to all applications on your phone. So, for example, you can select "Share Page" in the Browser, and the Instapaper option will be available there as well. Essentially anything that lets you share a URL via the Android "SEND" intent should be able to make use of this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that Instapaper integration in Greed is &lt;u&gt;send-only&lt;/u&gt;: Greed does not provide an interface for reading Instapaper articles. Of course, you could subscribe to your Instapaper RSS feed and read the articles that way, but that would be a bit redundant I would think.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Subscribe to RSS:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Another action available from external applications is "Subscribe to RSS". For example, in the Browser, select "Share Page" from the menu, and select the "Subscribe to RSS" item. Greed passes the site's URL to Google Reader, and it returns the stream ID of the new feed. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunate side effect: The "Subscribe to RSS" item appears on the chooser when "Share" is selected from within an RSS article, which is redundant.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4189683017611331302?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4189683017611331302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4189683017611331302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4189683017611331302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4189683017611331302'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/06/greed-2-instapaper.html' title='Greed 2: Instapaper'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6972953370998095539</id><published>2010-05-28T23:55:00.003-05:00</published><updated>2010-05-31T00:18:15.204-05:00</updated><title type='text'>Greed 2: Where was I</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just pushed a Greed update that includes something I had been thinking about, and then got a request for from a user. Basically, the ability to return to the article you were reading before you got interrupted and had to do something else on your phone. Not a big thing, but I think it's kind of handy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a "Where was I?" item on the main menu. If you click on it immediately after starting this update of Greed, you'll be greeted by a message saying it can't remember where you were. You have to read an article before you can return to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you've read an article (any article, in a feed, label, attached to a "friend", etc.), its location will be saved, and you can return to it from the main menu by clicking "Where was I?". That's basically all there is to it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also in this update is the addition of a couple of things from Greed 1, namely the ability to rename feeds, delete feeds, and manage labels. Long-press on a feed in the Feed List to see the options. These are only enabled if there's a network connection.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6972953370998095539?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6972953370998095539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6972953370998095539' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6972953370998095539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6972953370998095539'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/05/greed-2-where-was-i.html' title='Greed 2: Where was I'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3067499663685138128</id><published>2010-05-19T16:14:00.002-05:00</published><updated>2010-05-19T16:33:54.072-05:00</updated><title type='text'>Greed 2: Authentication errors</title><content type='html'>I've noticed a number of remarks in the Market about authentication errors with Greed in the past few days.&lt;br /&gt;&lt;br /&gt;I've also been contacted a few times about it. One person mentioned having some authentication issues trying to get into Google Reader on her laptop.&lt;br /&gt;&lt;br /&gt;I'd be interested to know if anyone is having trouble of this kind with Greed, and if so, what are the exact symptoms? I've been unable to reproduce the problem here.&lt;br /&gt;&lt;br /&gt;Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3067499663685138128?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3067499663685138128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3067499663685138128' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3067499663685138128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3067499663685138128'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/05/greed-2-authentication-errors.html' title='Greed 2: Authentication errors'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-559887822704244760</id><published>2010-05-08T23:34:00.004-05:00</published><updated>2010-05-09T00:12:41.117-05:00</updated><title type='text'>Greed 2: More updates, and another app</title><content type='html'>I just pushed another update of Greed to the Market.&lt;br /&gt;&lt;br /&gt;There are several updates here, a few of them that could be called "features."&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;UI C&lt;/b&gt;&lt;b&gt;lutter&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;A few people mentioned the UI looking cluttered recently. I have thought the same thing for a while, but there's only so much time in the day, so I hadn't gotten around to fixing it.&lt;br /&gt;&lt;br /&gt;Toward the goal of reducing the clutter, I removed the little lightbulb and floppy-disk icons from the feed list, and replaced them with tiny color-coded dots. When you click on the checkbox on a feed item, a menu of colored buttons pops up at the bottom. It looks like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/S-Y9DzKP0oI/AAAAAAAAAMA/Gy6-HDeagNg/s1600/buttons1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 41px;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/S-Y9DzKP0oI/AAAAAAAAAMA/Gy6-HDeagNg/s200/buttons1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5469125932970136194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The one with the light bulb is what you click when you want to mark a feed for notification. The one with the floppy is what you click when you want to include a feed in the list of feeds to download when you select "Cache All" from the main menu.&lt;br /&gt;&lt;br /&gt;The dark green "download" button downloads the contents of the feed(s) you've picked, including articles, attachments, and images (when possible). The red one clears downloads for the selected feeds, and the blue one marks the feeds as read.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, the dots... You'll see a purple dot on feeds that are marked for notification, a green one for feeds that are marked for caching, and a blue one for feeds which have downloaded articles in them. Something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/_nYlZRe4bfLk/S-ZD9g5WUqI/AAAAAAAAAMI/VDtqsTTXDwc/s200/dots.png" style="cursor:pointer; cursor:hand;width: 49px; height: 89px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5469133521569600162" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The article list uses a similar approach for the read/unread, starred, liked, and shared attributes of articles. There are "download" and "clear" items for articles, and a "share" button. &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Overall, I think it's less cluttered, although I'm still looking at ways to make it better looking. I'm not a graphic artist, so drawing those buttons (yes, I drew them, don't blame anyone else) takes some time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Prefer Network Setting&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A previous version of Greed added offline content. When downloading articles, that version would download them straight to the SD card and then read them from there, showing the contents in the UI. It makes the UI faster, and enables Greed to display previously-loaded articles when there's no network connection. The downside is that it also doesn't update from the web automatically, so you have to manually hit "refresh" to see updates. I added a new "Prefer Network" setting (on by default) that reads articles from the web when there's a network connection. They're still saved to the SD card as well. The idea is that it will still be able to function without a network connection, but the articles will be up to date when possible.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ads&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Greed Lite has ads in it, like a lot of free apps do. The Greed Full key app can be downloaded and installed to prevent the ads from showing. Originally, I had Greed set up to check for the presence of the key application on startup, and prevent ads from displaying. As it happens, some people were downloading the key application and Greed wouldn't notice it was there until it was completely stopped and restarted. I fixed this. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Images in downloaded articles&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have a &lt;i&gt;start&lt;/i&gt; on image downloads for articles. When you download an article to the SD card, Greed will retrieve all the images it can and store them along with the article so you can see them when you read it. I intend to flesh this feature out soon, adding download of stylesheets and other linked items so the articles look better when you view them locally. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Other than the above and a few minor performance improvements and bug fixes, that's about it for this update. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The Other App&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In case anyone's interested, the thing that's been keeping me busy during the day is another Android application I've been working on for a few months. It's out on the market as of Monday 5/3. It's called Garmin Voice Studio, and it has a better-looking UI than Greed does. (That's what I get when I have a crack team of graphics experts working with me. Those people are &lt;i&gt;good.&lt;/i&gt;) &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Garmin Voice Studio lets you create your own navigation voice for any Garmin GPS device that supports VPM-type voices (any GarminFone as well as nuvis). If you're on O2 in Germany, the voices will work on the A50.&lt;/div&gt;&lt;div&gt;Later this month, there will be an announcement for T-Mobile in the US for the same phone. More are coming. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's similar in concept to the "Own Voice" application that Nokia released this week for Ovi Maps. But what I learned this week is that Own Voice actually ships your voice files off to a server for them to be turned into a voice pack, and you also have to give Nokia permission to use your voice however they see fit. I thought both of those things were kind of strange... Voice Studio keeps the whole thing on your phone and does the Ogg encoding and voice generation on board. It also lets you decide who gets to use your voice. I'm a little partial to it obviously, but I think it's a cool app. I had a great time writing it, and learned a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, you should be able to run Voice Studio on any Android phone running Android 1.6 or above. Feel free to check it out, and leave some feedback about it in the comments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-559887822704244760?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/559887822704244760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=559887822704244760' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/559887822704244760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/559887822704244760'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/05/greed-2-more-updates.html' title='Greed 2: More updates, and another app'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nYlZRe4bfLk/S-Y9DzKP0oI/AAAAAAAAAMA/Gy6-HDeagNg/s72-c/buttons1.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6223356032778785650</id><published>2010-05-02T09:36:00.002-05:00</published><updated>2010-05-02T09:38:32.856-05:00</updated><title type='text'>Greed 2: Key application</title><content type='html'>I just uploaded the key application for Greed, which unlocks features in it and makes it the "full" application.&lt;br /&gt;&lt;br /&gt;I did this earlier than I planned to, because people were asking for access to it. &lt;br /&gt;&lt;br /&gt;Please note that the widget in Greed has not been updated to the new code base yet. That will happen as soon as possible, ideally within the next couple of weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6223356032778785650?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6223356032778785650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6223356032778785650' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6223356032778785650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6223356032778785650'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/05/greed-2-key-application.html' title='Greed 2: Key application'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3308150042723165819</id><published>2010-04-26T22:40:00.002-05:00</published><updated>2010-04-26T22:59:14.432-05:00</updated><title type='text'>Greed 2: ClientLogin</title><content type='html'>Just pushed a Greed update. The main point of this update is the conversion of the authentication to Google's ClientLogin API. The old SID-based authentication is going away soon.&lt;br /&gt;&lt;br /&gt;Also, I read a couple of comments on the Market today, one of which was about the "useless clutter" on the UI. For people who feel offended by the clutter, there's a new option under the "User Interface" section of the preferences, aptly named "Hide Clutter." Check it, and the items in the feed, folder and article lists contain nothing but the title and unread counts. Can't get less cluttered than that...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3308150042723165819?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3308150042723165819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3308150042723165819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3308150042723165819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3308150042723165819'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/greed-2-clientlogin.html' title='Greed 2: ClientLogin'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8533095473545653463</id><published>2010-04-23T22:39:00.001-05:00</published><updated>2010-04-23T22:40:37.830-05:00</updated><title type='text'>Greed 2: Offline access</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Just pushed an update to Greed that contains what a few have been waiting for, offline access. &lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;Articles&lt;/b&gt;&lt;br /&gt;Basically, it allows you to read articles (including RSS articles and the articles they link to) offline. All articles are cached to your SD card when you read them. The old version of Greed did the same thing, and would try to "magically" update articles automatically, by reading a list of articles cached on disk and then turning around and reading from the web and updating the disk. It was trying to strike a balance between "fast" and "up to date", but mostly struck a balance between "annoyance" and "irritation." So this new version doesn't do that. If you want to get a fresh list of articles in a given feed, select "Refresh", and the articles for that feed will be downloaded again. Simple.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to download&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To download a single article&lt;/b&gt;'s contents, go to the article and click the "Download" item in the options menu. This will download the page the article is linked to, and any attachments on the article that can be downloaded will be downloaded. For now, images aren't downloaded along with the article, but that's coming.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To download multiple articles&lt;/b&gt;, go to the article list and click the little check mark next to each article you want to download. When you've got them all, click the "download" icon in the panel at the bottom. The download starts immediately. If you're so inclined, you can watch the download progress in the Downloads screen (accessible from the Downloads item on the main menu).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To download whole feeds&lt;/b&gt;, go to the "Feeds" list and click the little checkbox to the left of each feed you want to download. As you do this, a little panel will appear at the bottom of the list. Click the "cache" icon [image]. Linked pages and attachments for each article in the feed will be downloaded.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To download everything:&lt;/b&gt; You have a few choices here. You can go into the preferences and set it to download all feeds and all content, and let it rip. However, if you have a lot of feeds with attachments, you could end up filling up your SD card, and it will take a long time. I'd suggest plugging it into a charger, and doing this overnight. You can also set Greed to download only what you've selected. In this case, the "download everything" action will only download the contents of feeds that have the little "disk" icon turned on. To use this feature, go into the Feeds list and click the checkmark next to each item you want to select for caching, then click the little "disk" icon so it's on (white, not gray). Then go to the main menu and select "Cache All." d&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;How to see downloads:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To look at a downloaded page&lt;/b&gt; for an article, go to the article you're interested in, and click "Saved Article."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To look at an attachment:&lt;/b&gt; This depends on the type of attachment. If it's a podcast, you can access it from the Music player application. It should show up in your list of songs. You can also access attachments by clicking the paper-clip icon in an article. However, from here, the music player will stop when you press "back" to go somewhere else. (I'm working on this.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to remove downloads:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You can do this from pretty much the same places as you download things from.&lt;br /&gt;&lt;br /&gt;In the Feeds list, click the check box on a given feed or set of feeds, and hit the [icon] button. All downloads for the selected feeds (including articles and attachments) will be cleared out. You can do the same thing for articles in the Article list.&lt;br /&gt;&lt;br /&gt;Within a single article, you can clear the downloads for the article from items on the options menu. For attachments, you can long-press an attachment in the list and select "Clear Download" to get rid of it.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;b&gt;In other news:&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Ads. I'm giving them a try. The Full version of Greed won't have them.&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Icons on the main menu: Something to look at, I suppose...&lt;/div&gt;&lt;br /&gt;A few other near-trivial items.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Next up: I need to fix the authentication Greed uses when getting to Google Reader. I'm going to do that next. Then, I'm going to work on some of the graphics. I'm not an artist, so the graphics in some places look pretty bad. Also, a widget will happen in there somewhere.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8533095473545653463?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8533095473545653463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8533095473545653463' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8533095473545653463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8533095473545653463'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/greed-2-offline-access.html' title='Greed 2: Offline access'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7919882943153124903</id><published>2010-04-07T21:52:00.005-05:00</published><updated>2010-04-07T22:00:10.993-05:00</updated><title type='text'>Greed 2: Friends</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nYlZRe4bfLk/S71FjpwrMCI/AAAAAAAAAL4/xbQP_mzmNK0/s1600/friend_details.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 133px; height: 200px;" src="http://1.bp.blogspot.com/_nYlZRe4bfLk/S71FjpwrMCI/AAAAAAAAAL4/xbQP_mzmNK0/s200/friend_details.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5457594802250657826" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nYlZRe4bfLk/S71FjpwrMCI/AAAAAAAAAL4/xbQP_mzmNK0/s1600/friend_details.png"&gt;&lt;/a&gt;I just pushed an update to Greed that replaces the "Friends' Shared Items" view with a "Friends" item that displays a list of Google Reader users you're associated with either by following them or being followed by them. Each Friend is treated as a feed, with its own unread count, etc. You can see the details or a friend (and optionally un-follow them) by long-pressing and selecting "Details" on an item in the list. From there, you can see a rudimentary set of their information (e-mail addresses, listed websites, location). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's pretty much it for this update.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7919882943153124903?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7919882943153124903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7919882943153124903' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7919882943153124903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7919882943153124903'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/greed-2-friends.html' title='Greed 2: Friends'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nYlZRe4bfLk/S71FjpwrMCI/AAAAAAAAAL4/xbQP_mzmNK0/s72-c/friend_details.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8837658669223334583</id><published>2010-04-03T23:29:00.002-05:00</published><updated>2010-04-04T00:01:53.832-05:00</updated><title type='text'>Greed 2: Happy Easter</title><content type='html'>It's a long weekend, today's my birthday, and tomorrow's Easter.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To commemorate all of this, I did the obvious thing and pushed another Greed update. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Folders:&lt;/b&gt; This screen is now tabbed. There's a tab for the existing "Folders" list, plus another one with the folders in a "flat" list. The tabs are kind of cool looking too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Notifications: &lt;/b&gt;I did some testing and verified that the service definitely runs reliably. I changed the way it tracks updates to unread items. It now accumulates updated feeds until you open the notification. So, for example, if you have notifications set to cycle every hour and you get 3 notifications, you'll get all of them when you read the updated feeds. Before, you'd get the ones from the last cycle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Article List:&lt;/b&gt; I took a cue from Gmail and added a little panel to the article list that pops up whenever you select the check mark on the left of one or more articles in the article list. The panel contains read/starred/shared/liked checkboxes, plus a "share" button. When you click one of the items on the panel, whatever you click is applied to the selected articles, and the panel disappears. I kind of like it for doing a specific thing to multiple items.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8837658669223334583?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8837658669223334583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8837658669223334583' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8837658669223334583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8837658669223334583'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/greed-2-happy-easter.html' title='Greed 2: Happy Easter'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3579057891917347364</id><published>2010-04-02T21:46:00.001-05:00</published><updated>2010-04-02T21:46:32.139-05:00</updated><title type='text'>another test post</title><content type='html'>just testing notifications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3579057891917347364?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3579057891917347364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3579057891917347364' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3579057891917347364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3579057891917347364'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/another-test-post.html' title='another test post'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7476208193925833310</id><published>2010-04-02T18:26:00.000-05:00</published><updated>2010-04-02T18:27:10.269-05:00</updated><title type='text'>test post</title><content type='html'>test post&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7476208193925833310?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7476208193925833310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7476208193925833310' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7476208193925833310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7476208193925833310'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/test-post.html' title='test post'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5534219291365735113</id><published>2010-04-01T12:56:00.003-05:00</published><updated>2010-04-01T13:09:12.813-05:00</updated><title type='text'>So, I'm reading news articles...</title><content type='html'>April Fool's Day is a pretty annoying day. I'm reading through some news articles while I work, and I seriously can't tell (at a glance) which ones are true, and which ones aren't.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The iPad has been reviewed in a few places, and reports are that the battery life is really good and it will actually change computing forever.&lt;/li&gt;&lt;li&gt;Truckers are going to be banned from texting while driving.&lt;/li&gt;&lt;li&gt;Obama wants to drill for oil off of America's shores.&lt;/li&gt;&lt;li&gt;There's a company giving away body piercings with the purchase of a server.&lt;/li&gt;&lt;li&gt;Microsoft is accusing Google Chrome of being insecure because it combines the URL bar and search fields into one.&lt;/li&gt;&lt;li&gt;Lawmakers are asking for an FTC investigation of Google Buzz because the rollout of same exposed users' private information to outsiders.&lt;/li&gt;&lt;li&gt;Will Smith is reportedly "in" for Independence Day 2 and 3.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Each of these has at least one aspect of "huh?" to it. As in "Huh? Obama wants to drill for oil? &lt;span style="font-style: italic;"&gt;Obama?&lt;/span&gt;", or "Huh? Microsoft seriously thinks the combining of two fields into one is cause for security concerns in a competitor's product? &lt;span style="font-style: italic;"&gt;Microsoft?&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;It's annoying either way. Either everybody (specifically, Slashdot) is running the whole "April Fool's Day Joke" thing into the ground by publishing nothing but jokes, or humanity is so short of things to do that the above counts as actual news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5534219291365735113?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5534219291365735113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5534219291365735113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5534219291365735113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5534219291365735113'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/04/so-im-reading-news-articles.html' title='So, I&apos;m reading news articles...'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-710434836394576021</id><published>2010-03-31T22:21:00.003-05:00</published><updated>2010-03-31T22:26:41.552-05:00</updated><title type='text'>Greed 2: Quick fix</title><content type='html'>A few people have been getting the dreaded "invalid token" error over the past day or so, so I pushed an update just now. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I added the "Clear Tokens" item in the main menu specifically for this problem. Trouble is, even though it cleared the tokens, it didn't actually log out of of Google Reader, so the only way to refresh the login was to exit the app. Oops! That's fixed now. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, unread counts are updated more aggressively, so they're more accurate as you read articles. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also made a change to the background so "edit tag" tokens are re-used as long as possible, eliminating 50% of the web traffic related to read/write operations. So it's faster, basically.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notifications should also be working now, informing you of new feeds on the interval you specify in the preferences.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-710434836394576021?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/710434836394576021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=710434836394576021' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/710434836394576021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/710434836394576021'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2-quick-fix.html' title='Greed 2: Quick fix'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2695220552140008150</id><published>2010-03-27T23:15:00.003-05:00</published><updated>2010-03-27T23:29:03.487-05:00</updated><title type='text'>Greed 2: Weekend update!</title><content type='html'>&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;T&lt;/span&gt;his weekend's update of Greed 2 adds a few new things, and fixes a couple of ones that needed fixing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Removed the fading "read/unread"&lt;/b&gt; panels from the tops of the Feed list, Folder list, and Article list. They were getting in peoples' way, and weren't as cool looking as I'd hoped. Those items are now safely out of the way, on the options menu.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Mark all as read:&lt;/b&gt; You can now mark all the articles in a feed or label as read. Pick the "Mark all as read" option menu item in the Article list.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Filtering for all/unread&lt;/b&gt; items in article list now works correctly.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Changes to request headers&lt;/b&gt; sent to Google Reader to get GZipped content. Download times should be quicker. It's very quick on my Nexus One. Then again, everything I've tried so far is. (I guess I could test this on my G1, but that would take away from the time I get to hold the sweet Nexus One in my hand.)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;New "default share address" preference&lt;/b&gt;. Specify an e-mail address here, and when you share an article, the "to" field will be populated with this value by default. I could have (perhaps should have) tied this into the contacts on the phone, and probably will at some point. For now, it's a free-form text field. So if you don't feel comfortable typing a valid e-mail address into this space, well... Get a relative to do it or something.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Preferences&lt;/b&gt; for "follow links" and "scale articles." These options affect the appearance &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;of articles in the viewer. By default, "follow links" is turned off, which means you won't accidentally follow a link when you're touching the article. You can long-press any item in the article viewer (e.g. picture, link) to toggle these settings on and off for the current session.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Next up&lt;/b&gt;, I've got an experiment I want to try with Google Reader requests, which should make Greed somewhat faster for some operations. Also, a few UI improvements and fulfilling some feature requests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;H&lt;/span&gt;ave fun, and let me know what you think.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2695220552140008150?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2695220552140008150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2695220552140008150' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2695220552140008150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2695220552140008150'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2-weekend-update.html' title='Greed 2: Weekend update!'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1571103109193080125</id><published>2010-03-24T21:11:00.003-05:00</published><updated>2010-03-24T21:34:46.226-05:00</updated><title type='text'>Gadget Lust</title><content type='html'>I got home this evening to find a FedEx package containing a new Nexus One.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Woo hoo!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've bought Apple stuff before, and what impressed me about it (besides the shiny surface and the Apple logo on it) was the way it was packaged. Apple puts their stuff in boxes that are so nice, you almost feel bad opening them and taking the merchandise out. It makes you feel like you're getting your money's worth.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've no doubt that Apple has a patent on the notion of putting merchandise in nice boxes. If that's the case, then I think Google's going to get sued. The N1 came in a very nice box, the same sort of packaging that makes you want to be as careful as possible when ripping it open. Not only that, but the little manuals inside the box seem to be made out of some kind of rubberized paper. Hard to explain unless you've seen it. It looks like paper, feels like rubber. It feels expensive. In any case, I was impressed with the box (and the paper, obviously).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Not as impressed, however, as I was with what came inside the box. This is a sleek phone. It does pinch-zoom, it's fast, the little track ball thing lights up when you get a new e-mail, and it has Live Wallpapers. I realize they don't actually do anything, but they're cool looking. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, Google sent me this as part of their Device Seeding Program. I guess the idea is that by sending free phones to Android developers, it will spur them into working on new and crazy ideas for Android apps. All I can say is, thanks Google, I'm on it! Seriously, this was a very nice thing of them to do. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What a cool thing this is. I've wanted a Nexus One ever since I saw one at work. Now I've got one. Dang. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If Google runs for President in '12, I'm voting for them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1571103109193080125?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1571103109193080125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1571103109193080125' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1571103109193080125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1571103109193080125'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/gadget-lust.html' title='Gadget Lust'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1885565627011506176</id><published>2010-03-23T22:54:00.002-05:00</published><updated>2010-03-23T23:00:30.012-05:00</updated><title type='text'>Greed 2: Label articles, etc...</title><content type='html'>Just pushed another update to the Market. This update is pretty basic... It adds the ability to read all of the articles within a label from the Folders view instead of having to read the articles in the individual feeds. Eventually, this option will be more extensive, probably offering the option to replace the standard folder/feed arrangement with a list of "flat" folders, with no hierarchy. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, the article viewer scrolls to the top when loading a new article. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the back end, Greed now logs in automatically when working in the background. (This is something I forgot to do earlier.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, you can configure the "gulp size", or the number of articles that are downloaded in a single request (e.g., each occurrence of the "Loading items..." event in the article list). I'll eventually change the name of this option.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1885565627011506176?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1885565627011506176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1885565627011506176' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1885565627011506176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1885565627011506176'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2-label-articles-etc.html' title='Greed 2: Label articles, etc...'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7465870177061388561</id><published>2010-03-16T22:56:00.002-05:00</published><updated>2010-03-16T23:00:40.934-05:00</updated><title type='text'>Greed 2: Sharing, unread counts</title><content type='html'>Just put another update of Greed on the Market. This one fixes the "Share" menu item, an occasional force-close in the Article List, hooking up of the "cache" and "notify" icons in the feed and folder lists, and fixes unread counts not displaying correctly in the "Updated Feeds" screen. This update also adds a BOOT_COMPLETED receiver for scheduling the notifications on device startup. That's about it for this update!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7465870177061388561?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7465870177061388561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7465870177061388561' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7465870177061388561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7465870177061388561'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2-sharing-unread-counts.html' title='Greed 2: Sharing, unread counts'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6100689581185708334</id><published>2010-03-16T08:15:00.002-05:00</published><updated>2010-03-16T08:19:20.464-05:00</updated><title type='text'>Greed 2: Blank Folder List</title><content type='html'>If you downloaded last night's update of Greed 2, you might have noticed that the folder list comes up blank. This is due to a change I made in the Feed list.&lt;br /&gt;&lt;br /&gt;"Folders" in Google reader are actually labels applied to feeds. Greed populates its folder list based on the tags applied to Feeds. Because of last night's change, the Folder list may appear blank or empty.&lt;br /&gt;&lt;br /&gt;To fix this, go to the Feed list in Greed, and hit "Refresh" from the options menu. Then open the Folder list, and hit "Refresh" there. The folders should appear at that point.&lt;br /&gt;&lt;br /&gt;Also, I noticed that the "Share" menu item in the article viewer isn't displaying a list of clients. Oops! I'll get that fixed at the earliest opportunity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6100689581185708334?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6100689581185708334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6100689581185708334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6100689581185708334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6100689581185708334'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2-blank-folder-list.html' title='Greed 2: Blank Folder List'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5220846232262804553</id><published>2010-03-15T23:16:00.003-05:00</published><updated>2010-03-15T23:22:50.111-05:00</updated><title type='text'>Greed2: Notifications</title><content type='html'>I just pushed an update to the Market for Greed 2, this one containing more complete notifications logic.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You should now be able to do the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Turn notifications on and off (in the preferences).&lt;/li&gt;&lt;li&gt;Get notified on any updated feed, or specific ones (in preferences, and selecting individual feeds' "light bulb" icon).&lt;/li&gt;&lt;li&gt;See a little green highlight on the left edge of feeds when they're updated since the last time the unread counts were checked.&lt;/li&gt;&lt;li&gt;Set Greed to notify you with sound, vibrate, or just the notification icon.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Next up, some updates to the article viewer, and more options for managing feeds and articles. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5220846232262804553?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5220846232262804553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5220846232262804553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5220846232262804553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5220846232262804553'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed2-notifications.html' title='Greed2: Notifications'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-120045246935265188</id><published>2010-03-14T23:50:00.006-05:00</published><updated>2010-03-15T00:06:51.214-05:00</updated><title type='text'>Greed 2</title><content type='html'>&lt;div&gt;I've had a pretty busy couple of months working on an Android application for a big company. It's due on the Market sometime next month. It's going to be a pretty cool application, I think. I'm kind of excited about it. It uses JNI to talk to a number of C/C++ libraries, and does some fairly interesting things. I think people in its intended audience are going to have a lot of fun with it. It's probably the first project I've worked on for a paying client or employer where the design specification mentions "fun" as one of the requirements!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;I've been very busy as a result of this work, and unable to devote much time to Greed. But in the last couple of weeks, I've had some time to do something I've wanted to do for a while: Rewrite Greed.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Over the last year, Greed turned into a somewhat complicated beast. It was one of the first Android applications I wrote, and one of its main underpinnings was a library I had written very early for doing asynchronous requests (e.g. pulling items from RSS feeds, etc.). It was a pretty simple library. &lt;i&gt;Too&lt;/i&gt; simple, actually. Applications using it had to do a lot of work in order to use it, and they would end up being more complex than they need to be. A Google Reader client isn't totally simple anyway, so using this library resulted in Greed getting big and unwieldy (not to mention slow, and a memory hog). On top of that, I had piled a lot of features on in a relative hurry, continuing to build on the complicated-library approach I mentioned earlier (which didn't help matters). Finally, I had essentially copied Greed Lite's source code to a new project and diverged from it in order to make Greed Full. Any maintenance I did on Greed Lite would have to be copied to Greed Full, which tended to discourage my doing working on both of them. &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I'm happy to report that all of that has changed. Once I decided to take the leap and rewrite Greed, it only took about 8 evenings to get to where I was after 2 &lt;i&gt;months&lt;/i&gt; the first time around. I reused the UI layouts, and the underlying API. Everything in the "app" layer is brand new. That part of the code is now about 1/5 the size (or smaller) of the original Greed Lite. It's faster, a little nicer-looking, and is going to be easier to work on.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, I would like to ask for testers. If anyone is interested in giving Greed Lite, please feel free to do so, and let me know what you think. I need to know how it runs on all possible Android phones. I've tested it on a G1 running cyanogenmod, and it's running well. I hope to try it on a Droid and a Nexus One in the next couple of weeks. I've run it on a phone I'm using that's not available on the market yet (also appearing sometime soon, probably in May), and it's &lt;i&gt;really&lt;/i&gt; quick on that. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bear in mind, there are still plenty of things to work on. For example, the notifications right now are unconditionally notifying on all updated feeds, instead of only the ones you specify. This is the next item on the list. If you'd like to contribute items to the list, I'd be glad to hear them. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-120045246935265188?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/120045246935265188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=120045246935265188' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/120045246935265188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/120045246935265188'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/03/greed-2.html' title='Greed 2'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1833117622040846311</id><published>2010-01-19T22:10:00.003-06:00</published><updated>2010-01-19T22:14:44.847-06:00</updated><title type='text'>Greed update: Hope this helps</title><content type='html'>I just put up a Greed update that I hope will help with the problems people have been having with the "invalid token" error.&lt;br /&gt;&lt;br /&gt;I have only been able to reproduce the problem once. Watching the logs, I noticed that the problem appeared when Greed was prevented from logging in, but I had already accounted for that situation several months ago. In my case, Greed did what it was supposed to do: That is, throw away its stored credentials and re-authenticate. After that, I didn't see the problem agian.&lt;br /&gt;&lt;br /&gt;Judging by the e-mails I've been getting (and the new low ratings Greed is getting on the market), this isn't working for everyone.&lt;br /&gt;&lt;br /&gt;So the update I just posted is a bit of a shot in the dark. It contains a workaround for the authentication. It should always login at startup using fresh credentials, which should prevent the problem I saw earlier today from happening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1833117622040846311?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1833117622040846311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1833117622040846311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1833117622040846311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1833117622040846311'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/01/greed-update-hope-this-helps.html' title='Greed update: Hope this helps'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8640694548069458319</id><published>2010-01-19T08:21:00.002-06:00</published><updated>2010-01-19T08:26:37.715-06:00</updated><title type='text'>Greed Troubles Update</title><content type='html'>This just in: I can reproduce the problem people have been seeing with Greed.&lt;br /&gt;&lt;br /&gt;Well, to be more accurate, I was able to reproduce the issue &lt;span style="font-style: italic;"&gt;once&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The problem appears to be related to login failures when trying to access Google Reader through the API. Google Reader returns some HTML describing the error, which Greed has trouble parsing. I have some logic in place for re-trying the login, which must not be working for some people. In my case, I was able to see it work.&lt;br /&gt;&lt;br /&gt;I've been pretty busy at a new job, but I will look at this further and post an update as soon as possible.&lt;br /&gt;&lt;br /&gt;Thanks to everyone who sent logs, and to Mariano Kamp for some good insights into the issue as well!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8640694548069458319?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8640694548069458319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8640694548069458319' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8640694548069458319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8640694548069458319'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/01/greed-troubles-update.html' title='Greed Troubles Update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7867776288437170946</id><published>2010-01-18T07:43:00.002-06:00</published><updated>2010-01-18T07:47:32.900-06:00</updated><title type='text'>Greed Troubles</title><content type='html'>I've been getting a lot of reports lately about Greed having trouble loading feeds. The issue seems to be with XML parsing, with an error message making mention of "invalid token."&lt;br /&gt;&lt;br /&gt;It seems to be happening pretty much everywhere, except on my own phone. Try as I might, I cannot reproduce this error. If I could, I would be able to post a fix, and would do so immediately.&lt;br /&gt;&lt;br /&gt;So, I'd like to ask for help with this. If you are getting this error and are comfortable with hooking your phone up to your computer with the USB cable and running logcat on it, I'd like to see the log messages you're getting. I'm hoping it will help me diagnose the problem and get a fix out.&lt;br /&gt;&lt;br /&gt;Thanks...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7867776288437170946?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7867776288437170946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7867776288437170946' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7867776288437170946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7867776288437170946'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/01/greed-troubles.html' title='Greed Troubles'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5761236483557320349</id><published>2010-01-02T08:20:00.003-06:00</published><updated>2010-01-02T08:21:45.592-06:00</updated><title type='text'>Quick PokeSite update</title><content type='html'>I just posted an update to PokeSite, to address a bug. When you create a site with a host name of something like "https://foosite.com", the Site Edit screen would save it as "http://https://foosite.com." Anyway, it doesn't do that anymore...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5761236483557320349?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5761236483557320349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5761236483557320349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5761236483557320349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5761236483557320349'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2010/01/quick-pokesite-update.html' title='Quick PokeSite update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4658732858061101640</id><published>2009-12-28T17:04:00.001-06:00</published><updated>2009-12-28T17:05:28.504-06:00</updated><title type='text'>Greed 1.1.15</title><content type='html'>I just updated Greed for the second time today, to fix another issue I noticed. When clicking "update" on the folders or feeds list, the unread counts weren't getting updated. Now they are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4658732858061101640?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4658732858061101640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4658732858061101640' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4658732858061101640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4658732858061101640'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/12/greed-1115.html' title='Greed 1.1.15'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1712098643058422518</id><published>2009-12-28T15:19:00.002-06:00</published><updated>2009-12-28T15:21:26.912-06:00</updated><title type='text'>Greed 1.1.14</title><content type='html'>I just found and fixed a device-slowing bug in Greed's entry update logic. I noticed my G1 getting sluggish not long ago, and couldn't figure out why. I looked at its log output to see if I could find anything wrong, and noticed that Greed's entry updater was stuck trying to mark an article as read. It would fail, wait a few seconds, and try again. That's obviously now how it's supposed to work, so I updated Greed on the Market. Sorry everyone!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1712098643058422518?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1712098643058422518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1712098643058422518' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1712098643058422518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1712098643058422518'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/12/greed-1114.html' title='Greed 1.1.14'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3381029499837623187</id><published>2009-11-21T21:06:00.001-06:00</published><updated>2009-11-21T21:07:30.352-06:00</updated><title type='text'>PokeSite: Import/Export</title><content type='html'>I just uploaded an update to PokeSite. This version has a section in the Settings screen that lets you export the list of sites to an XML file on the SD card, and import the list from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3381029499837623187?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3381029499837623187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3381029499837623187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3381029499837623187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3381029499837623187'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/pokesite-importexport.html' title='PokeSite: Import/Export'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-730497418885516843</id><published>2009-11-17T12:27:00.002-06:00</published><updated>2009-11-17T12:35:20.671-06:00</updated><title type='text'>Mis-quoted in Wired</title><content type='html'>I just got mis-quoted in an article in Wired magazine about &lt;a href="http://www.wired.com/gadgetlab/2009/11/android-fragmentation/"&gt;Android fragmentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Not a huge deal, but I don't remember actually saying that the iPhone is easier to develop on than Android. (I honestly wouldn't know, since I haven't built any iPhone applications.)&lt;br /&gt;&lt;br /&gt;What I &lt;span style="font-style: italic;"&gt;did&lt;/span&gt; say was that there is an advantage to the iron grip Apple keeps on development of iPhone hardware and software, in that there's likely less fragmentation in that space than there is in the Android space.&lt;br /&gt;&lt;br /&gt;Just thought I'd clarify that for anyone mistaking me for an Apple fanboy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-730497418885516843?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/730497418885516843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=730497418885516843' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/730497418885516843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/730497418885516843'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/mis-quoted-in-wired.html' title='Mis-quoted in Wired'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7594067056969679988</id><published>2009-11-14T21:08:00.002-06:00</published><updated>2009-11-14T21:15:06.572-06:00</updated><title type='text'>Greed: Quick update</title><content type='html'>I just posted an update to Greed. This one is a quick fix for the Feeds list layouts in the Euro HTC Hero.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7594067056969679988?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7594067056969679988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7594067056969679988' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7594067056969679988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7594067056969679988'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/greed-quick-update.html' title='Greed: Quick update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5312140232875622077</id><published>2009-11-08T16:18:00.003-06:00</published><updated>2009-11-08T16:23:40.718-06:00</updated><title type='text'>Greed sharing -- clarification</title><content type='html'>I just got an e-mail from an angry someone named Steven who purchased Greed and found that he was unable to use it to share an article to Twitter.&lt;br /&gt;&lt;br /&gt;I should have clarified in Greed's description: It doesn't share to Twitter (or Facebook, or e-mail) by itself. It uses the Android ACTION_SEND Intent, like most applications do. Thus, you need to have a Twitter client on your phone that responds to the ACTION_SEND Intent. Twidroid is an example of a Twitter client that does this. The same goes for the Android Facebook client. It works for sharing articles, because it responds to the ACTION_SEND intent. Gmail as well.&lt;br /&gt;&lt;br /&gt;This is the first time I've heard a complaint about this, so I'm guessing most people haven't been downloading Greed expecting it to feature hard-wired sharing to every conceivable outlet. But I thought I would at least clarify the issue for people that might.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5312140232875622077?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5312140232875622077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5312140232875622077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5312140232875622077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5312140232875622077'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/greed-sharing-clarification.html' title='Greed sharing -- clarification'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3356443733656408322</id><published>2009-11-07T10:03:00.002-06:00</published><updated>2009-11-07T10:05:44.140-06:00</updated><title type='text'>PokeSite: Update for Donut</title><content type='html'>I just posted an update for PokeSite, the app that monitors websites.&lt;br /&gt;&lt;br /&gt;Improvements include layout and font-size changes for Droid compatibility, as well as performance improvements. The Site definitions are now stored in a database instead of a serialized file on the SD card. So, if you're upgrading from the previous version of PokeSite, you'll need to re-define your sites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3356443733656408322?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3356443733656408322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3356443733656408322' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3356443733656408322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3356443733656408322'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/pokesite-update-for-donut.html' title='PokeSite: Update for Donut'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-744366072267776306</id><published>2009-11-07T00:24:00.003-06:00</published><updated>2009-11-07T00:27:37.403-06:00</updated><title type='text'>Greed: Update for Droid</title><content type='html'>The Motorola Droid appeared today, and I got a few reports of the fonts in the article list appearing very tiny, almost unreadable.&lt;br /&gt;&lt;br /&gt;I actually got an e-mail from someone at Google a couple of weeks ago about this. They were apparently testing apps, and noticed mine looked weird on the Droid. The person who e-mailed me told me how to fix it, but I had forgotten to update a styles.xml file that was still specifying the font size in points instead of "sp"'s. I wasn't able to see any difference on the emulator I'm using here, so I had to rely on a couple of users to tell me how it was looking as I updated Greed and put it on my server to download it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-744366072267776306?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/744366072267776306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=744366072267776306' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/744366072267776306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/744366072267776306'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/11/greed-update-for-droid.html' title='Greed: Update for Droid'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-9013720952871655994</id><published>2009-10-27T23:19:00.004-05:00</published><updated>2009-10-27T23:39:06.928-05:00</updated><title type='text'>Greed 1.1.11</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nYlZRe4bfLk/SufJqzysaVI/AAAAAAAAALE/HpcbRiKQTRY/s1600-h/icons.png"&gt;&lt;img style="cursor: pointer; width: 78px; height: 30px;" src="http://1.bp.blogspot.com/_nYlZRe4bfLk/SufJqzysaVI/AAAAAAAAALE/HpcbRiKQTRY/s200/icons.png" alt="" id="BLOGGER_PHOTO_ID_5397504415721351506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just rolled out an update to Greed, and here are the release notes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Slightly spruced-up UI:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nothing major, but I was getting kind of sick of looking at Greed's main screen. So now it looks a bit different.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nYlZRe4bfLk/SufIpc1_mzI/AAAAAAAAAK8/yhHF2R4ubzM/s1600-h/main_screen.png"&gt;&lt;img style="cursor: pointer; width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_nYlZRe4bfLk/SufIpc1_mzI/AAAAAAAAAK8/yhHF2R4ubzM/s200/main_screen.png" alt="" id="BLOGGER_PHOTO_ID_5397503292869679922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Click-to-toggle:&lt;/span&gt; In the Feed and Article lists, the star, share, like, notify and cache attributes can be toggled on and off by clicking on the individual icons under the items' titles. If you're like me and your fingers are larger than 1/4" in diameter, you can still manage these attributes by long-pressing an item and using the context menu for it.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Like/unlike support:&lt;/span&gt; Greed supports the "like this" feature found on the web-based version of Google Reader. The little square smiley icon indicates when you've marked an article as "liked".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Layout Changes:&lt;/span&gt; Some layout optimizations in some of the views should result in lower memory consumption. Also, I changed the way font sizes are specified so they will work on WVGA resolutions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Zoom Controls:&lt;/span&gt; The article viewer now has zoom controls on it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Donut-specific Force-close issue:&lt;/span&gt; The Donut-level Android API throws an exception if you update an adapter's contents in a background thread. Since I was under the impression that's how adapters are &lt;span style="font-style: italic;"&gt;supposed&lt;/span&gt; to work, Greed was force-closing pretty regularly when opening the Feed list or Folder list. That should be fixed now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-9013720952871655994?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/9013720952871655994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=9013720952871655994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/9013720952871655994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/9013720952871655994'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/10/greed-1111.html' title='Greed 1.1.11'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nYlZRe4bfLk/SufJqzysaVI/AAAAAAAAALE/HpcbRiKQTRY/s72-c/icons.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-771798308878192585</id><published>2009-10-19T13:58:00.001-05:00</published><updated>2009-10-19T13:59:08.744-05:00</updated><title type='text'>RingControl updates</title><content type='html'>I've been ramping down lately on the Big Android Project(tm) I was working on for two months. It's out on the market now, and I'm getting back into updating my own apps.&lt;br /&gt;&lt;br /&gt;The first thing to do is get them all updated so they run well on Donut. The first app I'm working on is RingControl, the app that sets ringer mode based on the phone's physical position. I'm looking for suggestions.&lt;br /&gt;&lt;br /&gt;I've seen some complaints about force-closes when using the "shake to wake" feature. That feature seemed like a cool idea at the time I added it, but now that the in-call UI has been updated to be less annoying in Cupcake and Donut, I'm thinking of taking the shake-to-wake feature out of RingControl. Seems kind of pointless to have that in there now. Anyone using RingControl, let me know: Would you feel ripped off or anything if that feature were to&lt;br /&gt;disappear in a future update?&lt;br /&gt;&lt;br /&gt;Another thing I'm thinking of removing is the SMS-command response function. I think it's a cool feature, but it's kind of out of place in RingControl. No one seems to know it's there. There's an application called SMS Commander that does a similar thing. The guy who wrote it actually claims to have a patent pending on the idea of having a phone do things in response to SMS messages. (Too bad for him... I happen to hold a patent on the use of the letter "L" in SMS messages.)&lt;br /&gt;&lt;br /&gt;I don't know how many RingControl users read this blog, but if any do, let me know what you'd like to see in a RingControl update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-771798308878192585?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/771798308878192585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=771798308878192585' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/771798308878192585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/771798308878192585'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/10/ringcontrol-updates.html' title='RingControl updates'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-514549237818323016</id><published>2009-10-11T00:56:00.002-05:00</published><updated>2009-10-11T01:32:08.204-05:00</updated><title type='text'>Artists in law enforcement</title><content type='html'>Earlier, I posted &lt;a href="http://fognl.blogspot.com/2009/05/artists.html"&gt;this article&lt;/a&gt; about a security guard at the building where I work.&lt;br /&gt;&lt;br /&gt;There are about 80 people in my office in the building he guards the entrance to, all of whom get their network connections from a 100-port router in a rack next to the office door. That router came up missing a few months ago. The Federal Asset Protection Team (or whatever they're called) came in to investigate the theft. They returned almost immediately after that, when some additional equipment came up missing from a closet.&lt;br /&gt;&lt;br /&gt;An occasional visitor to that office was a man to whom I'll refer as "Gragg" in this story, in order to protect his privacy. (Note the unusual spelling I use here. You're free to assume I'm spelling it that way &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; because that's his actual name, but for some other unknown reason.)&lt;br /&gt;&lt;br /&gt;Gragg was the federally-appointed Computer Technician, in charge of all cable plugging and unplugging, monitor picking up and setting down, and other technical tasks that no one in the office besides him is qualified to do. He would hang around the developers from time to time, and tell us how he could type Java code in Notepad without the aid of syntax highlighting. At one point, I spent considerable time wondering why someone with that kind of talent didn't write software instead of spending their days wheeling computer equipment around and plugging in cables. (Total time spent wondering: 2.5ms)&lt;br /&gt;&lt;br /&gt;Anyway, during the robbery investigation, the Team asked the guard if he had seen anything unusual. He said "There was some guy in here the other day for about an hour, and he left with a big box." They asked him what the guy looked like. Being the great illustrator that he is, he drew them a totally realistic picture of the guy. It was so good that when the Team showed it to the man reporting the robbery, he instantly said "Oh yeah. That's Gragg." So they arrested Gragg and got all of the equipment back.&lt;br /&gt;&lt;br /&gt;The leader of the Team got a commendation for his excellent investigative work, and the guard got nothing.&lt;br /&gt;&lt;br /&gt;Moral[0]: If you're planning to sneak stolen goods past a guard in a federal, be sure to stop and chat with him. Verify that he is A) blind, B)  unable to remember faces, C) unable to draw well, or some combination of A, B, or C before proceeding.&lt;br /&gt;&lt;br /&gt;Moral[1]: If you're an investigator, be sure you're the guy in charge, so you will be properly recognized for your efforts (and those of others).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-514549237818323016?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/514549237818323016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=514549237818323016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/514549237818323016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/514549237818323016'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/10/artists-in-law-enforcement.html' title='Artists in law enforcement'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6555776486163636453</id><published>2009-08-30T09:51:00.003-05:00</published><updated>2009-08-31T22:14:06.320-05:00</updated><title type='text'>Greed Newsgroup</title><content type='html'>I just started a newsgroup for Greed. It's at http://groups.google.com/group/greedrss. Feel free to stop by and comment on/discuss Greed. I've been busy with another project lately, but I'm going to be resuming work on Greed within the next couple of weeks. It's time for some updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6555776486163636453?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6555776486163636453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6555776486163636453' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6555776486163636453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6555776486163636453'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/08/greed-newsgroup.html' title='Greed Newsgroup'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2375549974165172385</id><published>2009-08-10T14:20:00.004-05:00</published><updated>2009-08-10T14:24:43.126-05:00</updated><title type='text'>Rock the Vote</title><content type='html'>As I mentioned earlier, Greed has been nominated for "Best News App" in the &lt;a href="http://androidnetworkawards.com/" target="_blank"&gt;Android Network Awards&lt;/a&gt;. I had planned to drive a Lamborghini into a swimming pool to celebrate, but decided to hold off until the votes are in. I'm embedding the voting widget so you can go vote for Greed if you're so inclined. Thanks!&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" language="javascript" charset="utf-8" src="http://static.polldaddy.com/p/1817751.js"&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href="http://answers.polldaddy.com/poll/1817751/"&gt;Best News App&lt;/a&gt;&lt;/noscript&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2375549974165172385?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2375549974165172385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2375549974165172385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2375549974165172385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2375549974165172385'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/08/rock-vote.html' title='Rock the Vote'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3073866262236595284</id><published>2009-08-01T02:06:00.002-05:00</published><updated>2009-08-01T02:14:03.436-05:00</updated><title type='text'>Greed: External integration</title><content type='html'>I've been a bit busy lately with a new Android project I can't talk about, and I'm also overdue for an update to Greed I've been working on with someone.&lt;br /&gt;&lt;br /&gt;This update won't really have much effect on you if you're a user, but if you're a developer, you can launch Greed for a specific feed ID now with code similar to the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;String feedId = "feed/http://fognl.blogspot.com/feeds/default"; // or similar&lt;br /&gt;&lt;br /&gt;startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("rss://" + feedId)));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If Greed is installed on the phone, this code will launch into Greed's Article List for the specified feed.&lt;br /&gt;&lt;br /&gt;Note that the feed ID has to be part of your list of subscribed feeds in Google Reader, or Greed won't know what to do with it. When I have more time, I would like to make Greed smarter about this scenario, and add a subscription for the feed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3073866262236595284?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3073866262236595284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3073866262236595284' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3073866262236595284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3073866262236595284'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/08/greed-external-integration.html' title='Greed: External integration'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4089995786857962750</id><published>2009-07-31T15:47:00.002-05:00</published><updated>2009-07-31T15:51:48.939-05:00</updated><title type='text'>Fame == Cool</title><content type='html'>I just read &lt;a href="http://androidguys.com/?p=6205"&gt;this post&lt;/a&gt; on AndroidGuys.com regarding the First Ever ANA Nominees, and noticed that Greed is one of the candidates for "best news app." Cool. I am now officially famous, and the time has come for me to buy a Lamborghini and drive it into a swimming pool. I suggest all the other nominees do the same. Congratulations to all of you! &lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4089995786857962750?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4089995786857962750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4089995786857962750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4089995786857962750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4089995786857962750'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/07/fame-cool.html' title='Fame == Cool'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6192327216744265898</id><published>2009-07-24T00:10:00.006-05:00</published><updated>2009-07-24T09:28:31.706-05:00</updated><title type='text'>das keyboard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/SmlCV22pm6I/AAAAAAAAAK0/gKDBo41fnzE/s1600-h/front-view-ult-1050.png"&gt;&lt;img style="cursor: pointer; width: 300px; height: 149px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/SmlCV22pm6I/AAAAAAAAAK0/gKDBo41fnzE/s320/front-view-ult-1050.png" alt="" id="BLOGGER_PHOTO_ID_5361889774630706082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I'm kind of picky about keyboards.&lt;br /&gt;&lt;br /&gt;Most of the time when I'm looking for a keyboard, I have a hard time finding something I like. Most newer keyboards that cost more than about $15 are loaded down with extra crap I don't need, usually in lieu of keys that actually type well, or are located in a sensible place. Out of all of the keyboards I see on the shelves of my local MicroCenter, 90% are something I would be totally useless on. I really just want a keyboard with the basic keys (home/end/delete/etc.) in their normal places, so I don't have to re-learn their locations and slow my typing down. Most of the keyboards I see in stores have those keys in some kind of weird backwards jumble, usually to make room for a big volume knob or a "bass boost" button. Lame.&lt;br /&gt;&lt;br /&gt;To get around that problem, I've tried a lot of the $15 keyboards I mentioned. Those are so cheap, their makers apparently see no point in trying to pimp them out. But they're also junk, so I'm basically buying a keyboard I'll end up replacing in 3 months with another junker.&lt;br /&gt;&lt;br /&gt;So today, I broke the cycle and got a das keyboard. I should have done that a long time ago. This thing is cool. It's shiny black, and heavy enough to feel like it's worth actual money. Each key makes a satisfying "click" when I press it. I like using it. It's nice to type on. &lt;span style="font-style: italic;"&gt;Really&lt;/span&gt; nice. In fact, the only reason I'm putting something on my blog about it is so I'll have an excuse to type on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6192327216744265898?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6192327216744265898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6192327216744265898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6192327216744265898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6192327216744265898'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/07/das-keyboard.html' title='das keyboard'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nYlZRe4bfLk/SmlCV22pm6I/AAAAAAAAAK0/gKDBo41fnzE/s72-c/front-view-ult-1050.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5141266892479355969</id><published>2009-07-04T21:20:00.003-05:00</published><updated>2009-07-04T21:33:31.624-05:00</updated><title type='text'>Pike's Peak is waiting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/SlAQorCmFtI/AAAAAAAAAKg/8f3l-QlT1XI/s1600-h/peugeot_pikes_peak.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 194px;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/SlAQorCmFtI/AAAAAAAAAKg/8f3l-QlT1XI/s320/peugeot_pikes_peak.jpg" alt="" id="BLOGGER_PHOTO_ID_5354798247877940946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We're heading out tomorrow to Colorado Springs, CO. The kids are psyched, and so am I. I don't think I've been this excited about driving 11-12 hours in a long time. I think it's going to be fun.&lt;br /&gt;&lt;br /&gt;I've been debating on whether to drive up the mountain or just take the cog train. I have a vehicle that's capable of making the trek, but I've noticed my love of heights has diminished a LOT since I was a kid. When I was 8 years old, my dad would pay me $5 to climb to the top of a 100' elevator leg and tighten bolts or whatever. I had no problem whatsoever with it. Now, though, I don't know. I probably wouldn't do it. I don't know if sitting behind the wheel of a car would make a difference. The last time I went there, I was about 10 years old and my dad drove us up. In front of us, a VW bus had to turn around because its engine didn't have enough power at that altitude to climb to the peak. The guy turned it around in the middle of the road, and my mom almost had a heart attack when his front end was hanging over the cliff. I think I'll probably do it. It's just a mountain. Not like it's going to reach out and slap me.&lt;br /&gt;&lt;br /&gt;In other news: I have seen the Shamwow commercials. I made a mental note to buy one if presented with a convenient opportunity, as I am the kind of guy who can't live without towels that can soak up 100x their own weight in liquids. Today I saw a 2-back of mini Shamwows and bought them. My take: Save your $6. They're about like paper towels, honestly. I don't know if the "Sham" in the name is supposed to evoke "Chamois" or "Sham", but I'm betting it's the latter. As for the "wow" part, not so much. Maybe they should have called it "Sham... Meh."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5141266892479355969?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5141266892479355969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5141266892479355969' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5141266892479355969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5141266892479355969'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/07/pikes-peak-is-waiting.html' title='Pike&apos;s Peak is waiting'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nYlZRe4bfLk/SlAQorCmFtI/AAAAAAAAAKg/8f3l-QlT1XI/s72-c/peugeot_pikes_peak.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1663459402833150550</id><published>2009-06-21T23:06:00.006-05:00</published><updated>2009-06-21T23:20:53.860-05:00</updated><title type='text'>Greed: Big News</title><content type='html'>In my last post, I mentioned the big marketing push going on here at Fognl, and the goal of using pictures to increase the impact of a given post. The idea is to use pictures to reinforce the message. In the last Greed update, there were several noteworthy, but somewhat small, updates. A picture of several kittens lined up in a row seemed like an appropriate way to really drive the message home. (Also, a picture of kittens was pretty easy to find.)&lt;br /&gt;&lt;br /&gt;This time, there's only one noteworthy item, and it's bigger. Thus, the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nYlZRe4bfLk/Sj8DbFIfFfI/AAAAAAAAAKA/V1ENedQv_0k/s1600-h/angrybear_tphq.jpg"&gt;&lt;img style="cursor: pointer; width: 294px; height: 320px;" src="http://1.bp.blogspot.com/_nYlZRe4bfLk/Sj8DbFIfFfI/AAAAAAAAAKA/V1ENedQv_0k/s320/angrybear_tphq.jpg" alt="" id="BLOGGER_PHOTO_ID_5349998646108558834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The big news is a widget. Greed now has its own widget, in case you want one.&lt;br /&gt;&lt;br /&gt;To create a new Greed widget, just do what you normally do to create one, and you'll see a Greed item on the Widgets menu.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/Sj8Dn6GSx6I/AAAAAAAAAKI/rWfR2V9tiCg/s1600-h/widget_menu.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/Sj8Dn6GSx6I/AAAAAAAAAKI/rWfR2V9tiCg/s320/widget_menu.png" alt="" id="BLOGGER_PHOTO_ID_5349998866484873122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Select that item then select either the feed, label, or state you want to see in the widget from the feed selector screen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sj8DzOJOrKI/AAAAAAAAAKQ/5AdH5vJNiRM/s1600-h/select_feed.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sj8DzOJOrKI/AAAAAAAAAKQ/5AdH5vJNiRM/s320/select_feed.png" alt="" id="BLOGGER_PHOTO_ID_5349999060844457122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then, um... There's the widget.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sj8D7fqxDwI/AAAAAAAAAKY/eaLsffY2-Zw/s1600-h/widget_running.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sj8D7fqxDwI/AAAAAAAAAKY/eaLsffY2-Zw/s320/widget_running.png" alt="" id="BLOGGER_PHOTO_ID_5349999202987478786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The widget updates once per hour, and shows the most recent headline in the chosen feed. You can create as many Greed widgets as you want, with a separate feed in each one. When you touch a widget, it loads the article list for the feed it's watching so you can read all the items.&lt;br /&gt;&lt;br /&gt;For now, there's only one widget size. I'm thinking of creating a "tiny" widget as well, which may just show unread counts or something. This wide one seems to take up a fair amount of space.&lt;br /&gt;&lt;br /&gt;Well, that's all for now, enjoy the widget...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1663459402833150550?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1663459402833150550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1663459402833150550' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1663459402833150550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1663459402833150550'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/06/greed-big-news.html' title='Greed: Big News'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nYlZRe4bfLk/Sj8DbFIfFfI/AAAAAAAAAKA/V1ENedQv_0k/s72-c/angrybear_tphq.jpg' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1306023638276759534</id><published>2009-06-16T23:36:00.020-05:00</published><updated>2009-06-17T23:37:26.596-05:00</updated><title type='text'>Greed: A few notable improvements</title><content type='html'>I just put out an update to Greed with a few notable features. As part of a new high-powered marketing plan here at Fognl, I'm going to include pictures in my posts to give them more visual impact. Brace yourselves.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nYlZRe4bfLk/Sjh6jNki4rI/AAAAAAAAAJ4/y_ewudkA8tk/s1600-h/kittens.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 217px;" src="http://1.bp.blogspot.com/_nYlZRe4bfLk/Sjh6jNki4rI/AAAAAAAAAJ4/y_ewudkA8tk/s320/kittens.jpg" alt="" id="BLOGGER_PHOTO_ID_5348159302859416242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure which feature is the most noteworthy, so I'll list them in order of how recently I worked on them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Customizable Menus &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As of this release, you can customize the main Greed menu. If you have certain feeds you always go to first, or other things on the main menu that you never use, you can now change the menu to suit your way of using Greed. Not only that, you can create any number of custom menus and switch between them with just a couple of clicks. Here's an example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sjh2DkY1zgI/AAAAAAAAAJQ/DYSGjUSHQG8/s1600-h/main_custom_menu.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sjh2DkY1zgI/AAAAAAAAAJQ/DYSGjUSHQG8/s320/main_custom_menu.png" alt="" id="BLOGGER_PHOTO_ID_5348154361182014978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The "Folders" item is the same "Folders" item you know and love from the standard Greed menu. The "Podcasts" item is a Google Reader label, and the remaining 3 items are regular old feed items. Clicking one of them takes you directly to the article list in that feed.&lt;br /&gt;&lt;br /&gt;Editing a menu is pretty simple. Just click the "Menu" button from the main screen's options menu, and follow the prompts. Use the options menu to create new menus and menu items, and long-press to manage items that are already there. Here's a picture of the menu editor:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sjh3Kcy0MGI/AAAAAAAAAJY/pYX2GSWZvds/s1600-h/menu_edit.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/Sjh3Kcy0MGI/AAAAAAAAAJY/pYX2GSWZvds/s320/menu_edit.png" alt="" id="BLOGGER_PHOTO_ID_5348155578914189410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Picking a feed, label, or state item is straightforward. Just click the "Add item" option and pick the feed, label, or state item from this screen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/Sjh3qhWmgHI/AAAAAAAAAJg/DHrBeKwcjo4/s1600-h/select_feeds.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/Sjh3qhWmgHI/AAAAAAAAAJg/DHrBeKwcjo4/s320/select_feeds.png" alt="" id="BLOGGER_PHOTO_ID_5348156129893843058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To use a given menu, just long-press it in the menu list and select "Use this menu". To go back to the default main menu, just click the cleverly-named "Default menu" option in the menu list screen.&lt;br /&gt;&lt;br /&gt;I've been experimenting with exposing Greed's functionality as objects that can be used via a JavaScript interface in HTML inside the WebView component. My initial idea for a customizable UI was to make it where you could supply your own HTML-based view, for example on the SD card, and set an option for Greed to use that. I tried out the idea, and it worked well enough. The problem was avoiding making it too fiddly to use. That's how I arrived at the idea to just make the main menu customizable. I'd be interested in knowing peoples' thoughts on whether the&lt;br /&gt;HTML idea seems like it's worth pursuing. Personally, I think it's kind of cool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;YouTube Videos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This update also adds YouTube video support. If you have a Podcast with an attached YouTube video, you should be able to navigate to the link in the "Attachments" dialog box and select it to view it in the YouTube player.&lt;br /&gt;&lt;br /&gt;Note that you can't download a YouTube video to your SD card the same way you can download an audio file. Who knows? It might be useful to have the ability to convert and download videos. I don't know if that violates some kind of licensing agreement or something, but if it's legal, I think it would be useful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Podcast Support&lt;/span&gt;&lt;br /&gt;A recent comment about Greed reads as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Good RSS reader, lamentable podcast support. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maybe it was the fact that the commenter was articulate enough to make good use of the word "lamentable", but something about his/her comment inspired me to improve Greed's Podcast support.&lt;br /&gt;&lt;br /&gt;The main improvement here is that now when you download a Podcast, it shows up in the Music application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sjh46i_JqPI/AAAAAAAAAJo/WwRThQFnOoc/s1600-h/podcasts.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sjh46i_JqPI/AAAAAAAAAJo/WwRThQFnOoc/s320/podcasts.png" alt="" id="BLOGGER_PHOTO_ID_5348157504721889522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The audio file is downloaded to &lt;code&gt;/sdcard/Music/Podcasts/Greed&lt;/code&gt;, and the Media Scanner is used to scan the file for any ID information it might have. Thus, in most cases it shows up in the music application with a proper title, "artist" information, and even an album cover. The best part is that when you play the Podcast from there, the Music player acts like it should: You get a call, it pauses. Hang up the call, it resumes. Is it just me, or is this a lot less lamentable than the old approach?&lt;br /&gt;&lt;br /&gt;There is also an option you can set to have Greed manage the Podcast files. When it's set, you can clear downloads from within Greed, and the Media database is updated properly. When the option is turned off, you can manage the Podcast files yourself in the Music application.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Compressed Pages&lt;/span&gt;&lt;br /&gt;There's also a new option for caching compressed (mobile) versions of pages. When you select it, Greed downloads a reduced-content version of a given page instead of the full version. (Thanks to Stephane for the suggestion.)&lt;br /&gt;&lt;br /&gt;That's about it for the new features. The one remaining update has to do with &lt;span style="font-weight: bold;"&gt;Feed Notifications&lt;/span&gt;. The last update included a definitive fix for new feed notification. The method it uses for detecting new feeds is much more reliable than the previous method was. However, a few people notified me that the Updated Feeds screen was no longer acting right. I discovered a problem there with the way it was updating the unread counts, and fixed that. That should be working correctly now.&lt;br /&gt;&lt;br /&gt;As always, suggestions are appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1306023638276759534?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1306023638276759534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1306023638276759534' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1306023638276759534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1306023638276759534'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/06/greed-few-notable-improvements.html' title='Greed: A few notable improvements'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nYlZRe4bfLk/Sjh6jNki4rI/AAAAAAAAAJ4/y_ewudkA8tk/s72-c/kittens.jpg' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8724866799798789507</id><published>2009-06-07T22:30:00.001-05:00</published><updated>2009-06-07T22:40:19.634-05:00</updated><title type='text'>Greed: A few incremental updates</title><content type='html'>I think I've mentioned about 3 times already that my next planned activity WRT Greed is to write a widget for it. Soon after that, I find something else either more pressing or more interesting to work on, so I do that instead.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Folders View&lt;/span&gt;&lt;br /&gt;This time, it was the folders view. I had always intended to eventually make the folders list into an actual hierarchical view of folders with feeds nested in them, and I got around to doing that. As a result, I think the folders view is a lot more useful than it was before.&lt;br /&gt;&lt;br /&gt;Along the way to putting that in place, I discovered a number of things I could do to make the feeds and folders load faster, so I put that in place too. The UI in those areas should be a lot snappier now, with the feed and folder lists loading instantly.&lt;br /&gt;&lt;br /&gt;I also realized that although my HTTP client code was checking for a "Content-Encoding" header with a value of "gzip", I wasn't actually taking advantage of it. I am now, so network performance should be faster.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Feed Notifications&lt;/span&gt;&lt;br /&gt;Several people had mentioned that they weren't getting notified on new feeds properly, and I found a defect in that area of Greed which I fixed. You should be notified reliably whenever one of your feeds has a new item.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Android 1.5 updates&lt;/span&gt;&lt;br /&gt;I noticed that the fonts on the Android 1.5 update where really big, making Greed look like some kind of cartoon app. I adjusted the sizes of the fonts down in some of Greed's UI elements to compensate. There are other 1.5-specific updates to take advantage of some new WebKit features (more on this to come).&lt;br /&gt;&lt;br /&gt;Other than that, a small list of updates and bug fixes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Next up:&lt;/span&gt; NOT a widget. I'll get to that eventually, but I've got an experiment I want to try. I think people will be more interested in the experiment than a widget anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8724866799798789507?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8724866799798789507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8724866799798789507' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8724866799798789507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8724866799798789507'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/06/greed-few-incremental-updates.html' title='Greed: A few incremental updates'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2809715563699632070</id><published>2009-05-29T00:14:00.003-05:00</published><updated>2009-05-29T00:17:49.496-05:00</updated><title type='text'>Artists</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sh9v7WJrfAI/AAAAAAAAAIw/98qWwr6zN60/s1600-h/space-guy.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 317px;" src="http://2.bp.blogspot.com/_nYlZRe4bfLk/Sh9v7WJrfAI/AAAAAAAAAIw/98qWwr6zN60/s320/space-guy.png" alt="" id="BLOGGER_PHOTO_ID_5341110748433841154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On occasion, I've had opportunity to talk to people who are really into what they do. Musicians, programmers, people who paint, people who roast their own coffee beans, recording engineers, etc. The ones who really stand out and are really good at something usually react a certain way when you bring up their topic of interest. They practically light up. A lot of the time, they'll immediately launch into a conversation about it, talking about the finer points of what they do. It's pretty easy to tell that they spend a lot of time thinking about it, and really like talking about it to someone. What they have to say is usually pretty informative, and it's also cool to see someone so enthused and excited about what they're doing.&lt;br /&gt;&lt;br /&gt;Today, I had a conversation like that with the security guard who sits at the entrance to the building where I work. I've walked past this guy at least 200 times sitting at his desk. He's a pretty quiet guy. I figured if he daydreamed about anything, it was probably bass boats or Megan Fox or something (not that there's anything wrong with any of that). Anyway, he was drawing a picture of a raygun similar to the one in the picture above. I said "Hey, cool gun", and he reacted like I described above. He pulled out a small notebook full of pictures he'd been drawing and started showing them to me. There was a Robinson Crusoe beach scene in full color. Another picture showed a crew on the bridge of a huge spaceship looking out the window at another (burning) spaceship in orbit around a planet. There was a post-it note with a pencil drawing of a guy's face on it, some variations on the picture above, and a lot more. Just one amazing picture after another.  I took a few pictures of his pictures with my phone (hence the blurry quality) and brought them home.&lt;br /&gt;&lt;br /&gt;He said he drew the one above while he was talking on the phone. That probably sounds like bragging, but some of the pictures in his book had phone numbers and other notes scibbled on them, like they were phone-doodles he decided to keep. I do know that I watched him demonstrate how to draw a convincing-looking eye, and it took him all of 40 seconds to do it. From what I saw, a guy with his apparent level of talent could crank out a space-guy picture like the one above in 10 minutes while on the phone.&lt;br /&gt;&lt;br /&gt;He said he does some work for hire too. He does portraits, and he's working on artwork for a sci-fi comic right now. If you're looking for someone who can draw really well, I know someone...&lt;br /&gt;&lt;br /&gt;I think it's pretty interesting, finding people and things like this in unexpected places.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2809715563699632070?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2809715563699632070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2809715563699632070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2809715563699632070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2809715563699632070'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/05/artists.html' title='Artists'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nYlZRe4bfLk/Sh9v7WJrfAI/AAAAAAAAAIw/98qWwr6zN60/s72-c/space-guy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-287429634940934750</id><published>2009-05-25T18:04:00.001-05:00</published><updated>2009-05-25T18:05:51.601-05:00</updated><title type='text'>Greed update: Scaled Images</title><content type='html'>I just put out another Greed update. Since I just flashed my phone with the Cupcake update, this is probably the last version of Greed to not require Cupcake. (Of course, I think I said that about 2 updates ago.)&lt;br /&gt;&lt;br /&gt;Some new features:&lt;br /&gt;&lt;br /&gt;Compressed pages: Well, not actually "compressed"... Essentally, there's a new option in the article viewer (and on the context menu in the article list) you can use to view a "mobile" version of a given page. This uses Google's site compressor to strip the fluff out of web pages so they load faster on a mobile device.&lt;br /&gt;&lt;br /&gt;"Cache All" improvements: Up till now, the "Cache all" action executed from the main menu could not be canceled.  That is fixed now, and a progress dialog displays while the caching operation takes place. Canceling the progress dialog cancels the caching operation. "Cache All" is still a work in progress.&lt;br /&gt;&lt;br /&gt;Image Scaling: The article viewer now (optionally) scales images so you don't have to scroll the viewer to see all them. You can long-press a link or an image in the article viewer to toggle these settings.&lt;br /&gt;&lt;br /&gt;Follow Links: The last update included a change to keep the article viewer from opening links you accidentally click on while scrolling through the article. This feature has been added to the context menu in the article viewer. If you want to follow a specific link in the article viewer, you can long-press it, select "Follow Links", then the link will open in the browser when you click on it. Note that this doesn't change the setting, just the behavior for the article you're viewing.&lt;br /&gt;&lt;br /&gt;Improved German Translation: Many thanks to Sascha, who translated the resources to German. &lt;br /&gt;&lt;br /&gt;That's about it for this update. I'm going to start working on a widget now, so Greed can be Cupcake-compliant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-287429634940934750?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/287429634940934750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=287429634940934750' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/287429634940934750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/287429634940934750'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/05/greed-update-scaled-images.html' title='Greed update: Scaled Images'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-361976052120554701</id><published>2009-05-17T22:16:00.002-05:00</published><updated>2009-05-17T22:27:15.705-05:00</updated><title type='text'>Greed: More incremental stuff</title><content type='html'>Another Sunday, another group of Greed updates. I had plans to change a couple of other things, like YouTube link support and a Widget in preparation for Cupcake, but there were a couple of annoyances I wanted to take care of first.&lt;br /&gt;&lt;br /&gt;The first one was the issue of performance. Greed sometimes seems kind of sluggish, especially when navigating through a list of large articles. The reason for this is that up until this update, Greed has been loading up all of the articles in the article list, along with their content. As you scroll down through the list, more and more articles get loaded into memory. If the articles are long, that takes a lot of memory, which makes the whole device slow down. So what I do now is separate the content from the articles as they're downloaded, and only load the content when it's needed. I think it makes it a lot snappier. I'd be interested to know if you see the same results. A side benefit is that Greed should now be more stable and less apt to die for lack of memory.&lt;br /&gt;&lt;br /&gt;By the way, you might want to clear your cache if you notice Greed acting weird.&lt;br /&gt;&lt;br /&gt;The second issue was the "read/unread items" radio buttons at the top of the feeds and folders lists, and the article list. These were taking up screen space, so I did the "animated panel" trick with them. They display for a few seconds when the screen is first displayed, then they fade out of view. To get them back, just touch the area where you expect to see them, and they'll reappear.&lt;br /&gt;&lt;br /&gt;One last thing that I put up earlier this week, but didn't bother posting about: Greed's annoying tendency to follow every link in the article viewer. Man, I hated that. In an article with a lot of links in it, navigating through an article was like walking through a small (and admittedly totally non-lethal) minefield. I had developed a habit of always looking for a "safe" place to touch the screen. Then I remembered it was possible to suppress that behaviour in the WebView component, so I did that. Duh. If you prefer to have this "feature" enabled, you can do so in the preferences screen with the "Follow Links" option. I worked on the idea of putting a context-menu handler in the view to turn this feature on and off on the fly, but didn't like the way that turned out. It's on my list...&lt;br /&gt;&lt;br /&gt;That's about it for this week's updates. Stay tuned for YouTube link support and a Widget!&lt;br /&gt;&lt;br /&gt;Also, thanks to everyone sending feedback on Greed. The criticism is always constructive, and the compliments have been appreciated too.&lt;br /&gt;&lt;br /&gt;Finally: My apologies to the German user community for the translations. I built a GWT application for translating Android resources to different languages, and tested it on Greed. I've been notified by a couple of users that the translations leave a little bit to be desired. I believe the exact words were "Simply Horrible", which I assume is German for "sub-optimal." In any case, one of them kindly offered to translate them for me. On that subject, if any of you reading this know of other languages you'd like to see Greed translated to, there's a free copy of Greed and a big strings.xml file in it for you. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-361976052120554701?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/361976052120554701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=361976052120554701' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/361976052120554701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/361976052120554701'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/05/greed-more-incremental-stuff.html' title='Greed: More incremental stuff'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6813679901622102317</id><published>2009-05-12T23:54:00.002-05:00</published><updated>2009-05-12T23:58:25.624-05:00</updated><title type='text'>Greed: Offline Support</title><content type='html'>I just released a new version of Greed, 1.1.2.  The big update for this version is improvements in the offline support.&lt;br /&gt;&lt;br /&gt;My goal with Greed was to make offline support as seamless as possible, where you wouldn't really notice it was in any sort of "offline" mode when it was. If it had a connection, it would try to keep things up to date, and otherwise read content from the SD card and synchronize it. That's why you see it do things like load articles from disk, then update from the network as soon as it has a chance.&lt;br /&gt;&lt;br /&gt;Anyway, this version of Greed has several updates in it toward the goal of good offline support.&lt;br /&gt;&lt;br /&gt;First, the "Cache All" function (accessible from the main menu) works better now, and is more conservative with memory. When you click "Cache All", you get all of the articles that can be downloaded, plus the content and attachments of any feeds you've explicitly marked for caching.&lt;br /&gt;&lt;br /&gt;Second, Greed now takes a bit more of an explicit "offline" approach when a network connection isn't available. It sticks strictly with pre-saved content, and doesn't try to update automatically until it can do so smoothly.  There's an option in the preferences that tells Greed to assume it's offline if the network connection is weak or slow. If you're in some kind of "1 bar" area or something, Greed will assume you're offline, and stick with the content saved to the SD card. You should be able to read feeds without disruption in areas with low-or-no-quality network access. (Provided you've downloaded them beforehand, obviously.)&lt;br /&gt;&lt;br /&gt;For update operations such as "mark as read", "add star", etc.,  Greed takes care of that by queueing all such operations while it's offline, and then "playing back" those actions when a network connection becomes available.&lt;br /&gt;&lt;br /&gt;Besides that, I'm also working on some feature requests (embedded browser, built-in media player, share with note), as well as new features for Cupcake when it finally arrives.&lt;br /&gt;&lt;br /&gt;Suggestions and feedback are welcome as always.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6813679901622102317?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6813679901622102317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6813679901622102317' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6813679901622102317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6813679901622102317'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/05/greed-offline-support.html' title='Greed: Offline Support'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6023031121527307702</id><published>2009-04-03T15:59:00.003-05:00</published><updated>2009-04-03T16:34:49.216-05:00</updated><title type='text'>Neon Guitar</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/SdZ43RsGSfI/AAAAAAAAAIo/pjy129vZVEc/s1600-h/neon-guitar.png"&gt;&lt;img style="cursor: pointer; width: 234px; height: 320px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/SdZ43RsGSfI/AAAAAAAAAIo/pjy129vZVEc/s320/neon-guitar.png" alt="" id="BLOGGER_PHOTO_ID_5320572900821322226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think my first post on this blog was about my friend Randy down the street, who makes neon signs. Even before watching him make one, I've always wanted one of his signs. I think neon signs are cool anyway, and it would be even cooler to get a one that is one of a kind.&lt;br /&gt;&lt;br /&gt;Problem is, I usually have a lot on my mind (or at least enough to fill the cramped space therein). So although something like "get a neon sign from Randy" is on my mental list of things to eventually do, the list in question is quite long, and printed in a small font (again, to save space). The cramped space, the small font, and the high level of noise and distractions elsewhere in my mind manifests itself as what psychologists refer to as "so forgetful, he would forget his own butt if it wasn't bolted to his body." I keep forgetting to do it.&lt;br /&gt;&lt;br /&gt;There's also the issue of what kind of sign to get. Neon signs aren't cheap, so it would be stupid to just toss out some kind of idea like a Bud Light sign or something and then not like it. Neon signs are like tattoos. I've never gotten a tattoo, mostly because I can't think of anything worth committing to ink on my body. Kind of the same with neon.&lt;br /&gt;&lt;br /&gt;Anyway, there was an auction at our church for the youth group or something, and Randy made the sign shown above for the auction. I mentioned thinking it was cool to my wife, who secretly bought it for my birthday.&lt;br /&gt;&lt;br /&gt;It's perfect. I wouldn't have thought of a guitar, but I've been a guitar player since I was a little kid, so it's a good conceptual fit.&lt;br /&gt;&lt;br /&gt;So, the sign: It's neon. I don't know too much about that, except that it's the glowing gas in the glass tube. Another thing I think is cool is the white base. I thought it was some kind of enclosure Randy got at a neon-sign-making supply house, but he made the thing out of PVC. He just cuts out the pieces, puts them in hot water, bends them into the right shape, glues them together, and out pops something that looks like it was designed by Steve Jobs.&lt;br /&gt;&lt;br /&gt;Except that this is way cooler. It's a one-of-a-kind art piece hand-made by a friend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6023031121527307702?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6023031121527307702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6023031121527307702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6023031121527307702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6023031121527307702'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/04/neon-guitar.html' title='Neon Guitar'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nYlZRe4bfLk/SdZ43RsGSfI/AAAAAAAAAIo/pjy129vZVEc/s72-c/neon-guitar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3300779224085538173</id><published>2009-03-28T00:20:00.006-05:00</published><updated>2009-03-28T00:58:23.934-05:00</updated><title type='text'>RingControl Release 1.0.8</title><content type='html'>I just put up a new version of RingControl, with a few new features:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SMS Commands:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The biggest new feature is SMS commands. These are basically SMS messages you send to the phone to make it do things. The general idea is that if the phone gets lost or stolen, you can send it commands to help you retrieve it. More commands will be added as I think of them, or get suggestions for them.&lt;br /&gt;&lt;br /&gt;The first thing to know about SMS commands is that they have to be specially formatted so RingControl knows you're sending it a command, and not just sending a regular SMS message.&lt;br /&gt;&lt;br /&gt;In the Preferences screen, navigate to the "SMS Commands" page, and click "Password/Prefix." Here, you can specify a prefix that RingControl will look for in SMS messages. You could think of this as a password, although no pretenses are made toward this being a "secure" service. Again, it's just a prefix.&lt;br /&gt;&lt;br /&gt;The default prefix is "RC." So, assuming you leave the prefix at the default setting, you can send an SMS command to RingControl using this format:&lt;br /&gt;&lt;br /&gt;RC.[command] [arguments]&lt;br /&gt;&lt;br /&gt;...where [command] is one of the commands described below, and [arguments] is an optional argument specified to the command.&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;ping&lt;/span&gt;" command does nothing but send a response to let you know the phone is turned on. If you send this and receive an "ok" message in response, you know the phone can accept other SMS commands.  &lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.ping&lt;br /&gt;&lt;br /&gt;You can send a "&lt;span style="font-weight: bold;"&gt;beep&lt;/span&gt;" command to make the phone beep so you can find it if it's nearby (or a "&lt;span style="font-weight: bold;"&gt;ring&lt;/span&gt;" command to do the same thing and you think just calling the phone is too much work). &lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.beep or RC.ring.&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;service&lt;/span&gt;" command takes an argument: on or off. This starts and stops the RingControl service. &lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.service on&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;call&lt;/span&gt;" command takes a phone number as an argument, and tells your phone to call the specified number. &lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.call 5551212&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;callme&lt;/span&gt;" command tells your phone to call the phone sending the SMS message. &lt;span style="font-style: italic;"&gt;&lt;br /&gt;Example:&lt;/span&gt; RC.callme&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;speaker&lt;/span&gt;" command turns the speaker on or off while the phone is in a call.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.speaker on&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;vibrate&lt;/span&gt;" command vibrates the phone for the specified number of milliseconds. It's useful for annoying a pet, or lining up two G1s on a smooth/slanted surface next to each other, and having a race.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.vibrate 1000&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;volume&lt;/span&gt;" command takes two arguments. The first specifies which volume to adjust (ringer, beep, voice, music, system), and the second specifies the volume. The range is 0 to 10.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.volume voice 10&lt;br /&gt;&lt;br /&gt;You can send the phone a "&lt;span style="font-weight: bold;"&gt;where&lt;/span&gt;" command, and it will send back an SMS message telling you the street address of the phone's location, plus the lat/long. If it can't retrieve the address for some reason, it will send back a link to Google Maps that you can use to tell where the phone is. If your GPS receiver is turned off when you send this command, RingControl turns it on, retrieves the phone's location, then turns the GPS off again. (If it's on already, the GPS setting is left alone.)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Example:&lt;/span&gt; RC.where&lt;br /&gt;&lt;br /&gt;The "&lt;span style="font-weight: bold;"&gt;help&lt;/span&gt;" command just sends back a list of available commands.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why it is a Powerful Enterprise Feature&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;(tm):&lt;/span&gt;&lt;br /&gt;Several of the audio and speaker commands can be used in combination to perform useful activities at work. For example, suppose you're in a meeting. You can excuse yourself for a moment, conveniently leaving your phone on the table. From another phone in a separate location, you can send the "RC.callme" command, and your phone will silently call you. You can then turn the voice volume up via "RC.volume voice 10" to listen in on the conversation taking place in your absence. Then, when one of your coworkers says something stupid, you can send "RC.speaker on" and make fun of them through your phone's speaker. They will be bowled over by your god-like omnipresence. Most of the time, that is. If your voice booming out of the 1/2" speaker fails to grab their attention, you can follow your announcement up with "RC.vibrate 30000", as a subtle show of force.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vibrate then Ring:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some people were asking for a way to make the phone vibrate for a few seconds, then ring, like a Motorola V300. RingControl does this now.&lt;br /&gt;&lt;br /&gt;That's all for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3300779224085538173?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3300779224085538173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3300779224085538173' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3300779224085538173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3300779224085538173'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/03/ringcontrol-release-107.html' title='RingControl Release 1.0.8'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5443599010806104154</id><published>2009-03-19T15:59:00.002-05:00</published><updated>2009-03-19T21:07:58.883-05:00</updated><title type='text'>Leaving town</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://2.bp.blogspot.com/_nYlZRe4bfLk/ScKyIisLQMI/AAAAAAAAAIg/lv3OuSMxkPU/s1600-h/1237425714306-754295.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_nYlZRe4bfLk/ScKyIisLQMI/AAAAAAAAAIg/lv3OuSMxkPU/s320/1237425714306-754295.jpg" alt="" id="BLOGGER_PHOTO_ID_5315006370071396546" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Some friends of ours left town today to start a new job in IL. The local Sonic gave them a nice send-off.&lt;/p&gt; &lt;p&gt;sent from my g1&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5443599010806104154?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5443599010806104154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5443599010806104154' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5443599010806104154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5443599010806104154'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/03/leaving-town.html' title='Leaving town'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nYlZRe4bfLk/ScKyIisLQMI/AAAAAAAAAIg/lv3OuSMxkPU/s72-c/1237425714306-754295.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-567845914534691382</id><published>2009-03-07T22:29:00.003-06:00</published><updated>2009-03-07T22:34:50.702-06:00</updated><title type='text'>Mud Run</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nYlZRe4bfLk/SbNKytBQGPI/AAAAAAAAAIY/rOFWidX_OR8/s1600-h/1236455641453.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_nYlZRe4bfLk/SbNKytBQGPI/AAAAAAAAAIY/rOFWidX_OR8/s320/1236455641453.jpg" alt="" id="BLOGGER_PHOTO_ID_5310670620538706162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have a 2001 Toyota 4Runner. It's a pretty decent vehicle. It seems to be very well-built, having over 100K miles on it now with no squeaks or rattles, and being totally reliable. I actually took it to my mechanic once to see if there was any maintenance to be performed on it, since it had been so long since I had been there. He cleaned some dust off of the engine, and put a new set of spark plugs in it. That was all it needed.&lt;br /&gt;&lt;br /&gt;However: As good a vehicle as it is, it is not what one might call "fun." There's something stodgy about the way it moves around. It has stability and traction control, and it won't let you slide around corners, peel out, or anything that might be viewed by others as irresponsible behavior. (or "fun.") It's probably a good thing it has these features, because it seems like it might slide out of control and crash without them. Since it's my wife's car, I'm happy to have those features on it, but it would be nice if you could turn them off.&lt;br /&gt;&lt;br /&gt;Non-defeatable traction control is probably the stupidest imaginable feature you could possibly add to a 4WD vehicle. It's outfitted like an "off-road" machine, with body-on-frame construction, big tires, beefy axles, a low-range transfer case, and a locking center differential. You're supposed to be able to get anywhere you want to go in the thing. But the fact that you can't turn the traction control off makes it next to useless in situations where the only way you can move is to spin the tires. You can lock the center diff and at least defeat the stability control, but that's it. All that does is prevents it from minding too much if you put it into a slide. You still can't spin the tires. It's like having a really strict mom embedded in your car.&lt;br /&gt;&lt;br /&gt;On the way back from my daughter's basketball game today, my son suggested we turn off on a road he was familiar with and take a look at a "4-wheeling" area he'd been told about. I was game, and followed his directions to a muddy little road with a big puddle in the middle of it. I put it in 4WD, locked the center differential, and charged ahead. As soon as we hit the mud, the tires started to spin. Immediately, the 4Runner throttled back, put on the brakes, and stopped right in the middle of the mud hole. As it happens, locking the center differential takes a few minutes of screwing around to actually turn on. It wasn't actually on yet, so the stability control decided it was time to stop before someone did something crazy (like spinning a tire).&lt;br /&gt;&lt;br /&gt;Anyway, we got really stuck, and I was pretty sure I was going to be getting out and stepping into a foot of mud. I finally got the center diff locked, and was able to spin the tires. The trick to doing that is apparently to just floor it, and let the brakes try to stop you. The brakes have a hard time doing their job when they're submerged in mud, so you're able to move forward. We shot mud at least 20 ft. in the air, so I know we were spinning. At one point, we got a little bit inside the car when it rained in through the sunroof (which was barely open).&lt;br /&gt;&lt;br /&gt;Eventually, we got out of the mud hole and made it to the end of the road. The only way out was up a really steep rutted hill that was (thankfully) dry. I did find that my 4Runner is pretty good at climbing. It just doesn't like mud.&lt;br /&gt;&lt;br /&gt;I spent the rest of the afternoon cleaning the mud and crap out of it. It had so much mud packed into the wheel wells, it was squeezing out under the headlights.&lt;br /&gt;&lt;br /&gt;That's my first experience 4-wheeling in the mud, and I'm pretty sure that's the must destructive thing you can do to a car, short of blowing it up with dynamite. I think it would be a lot better if the traction control could be turned off. What a stupid "feature."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-567845914534691382?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/567845914534691382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=567845914534691382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/567845914534691382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/567845914534691382'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/03/mud-run.html' title='Mud Run'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nYlZRe4bfLk/SbNKytBQGPI/AAAAAAAAAIY/rOFWidX_OR8/s72-c/1236455641453.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-635074067243201102</id><published>2009-03-02T21:35:00.004-06:00</published><updated>2009-03-02T21:40:29.607-06:00</updated><title type='text'>Greed II: A Full version</title><content type='html'>I just released a new version of Greed, with some updates.&lt;br /&gt;&lt;br /&gt;First off, Greed is now a paid application. I experimented with the idea of supporting Greed's development through donations, reasoning that people that liked it would be inclined to donate, and people that didn't care too much wouldn't donate. That worked, but I think the conventional approach of making it a paid application works better. Greed is now called "Greed Full", and will co-exist on your phone alongside the original version. Why you would want to do that is anyone's guess, but the ability is there in any case.&lt;br /&gt;&lt;br /&gt;As for actual new features:&lt;br /&gt;&lt;br /&gt;The main new feature off-line caching support. You can now long-touch a feed and cache its articles to the SD card in your phone, so you can read the articles off line. The next thing I want to do is add support for caching the actual articles. I held off doing that in this release, since I wanted to iron out the question of how to download a bunch of content in the background without dragging the phone down. Having gotten that to work well, I think it's going to get more interesting now, since downloading the content to the phone will make things like the Media player work better for podcasts and such.&lt;br /&gt;&lt;br /&gt;Also new is a new article viewer with cool controls that fade into view when you touch the screen, and fade out after a while. There's also a "Friends' Shared Items" option on the main menu, some optimizations in the way feed lists are displayed, and some other minor bug fixes.&lt;br /&gt;&lt;br /&gt;The next version will have the aforementioned offline support, and also a series of pop-up windows that ask you if you're sure you want to do X (where "X" is pretty much anything that requires internet access). I'm going to call it "Greed Vista Ultimate."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-635074067243201102?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/635074067243201102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=635074067243201102' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/635074067243201102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/635074067243201102'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/03/greed-ii-full-version.html' title='Greed II: A Full version'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3576308967404691977</id><published>2009-02-20T21:26:00.002-06:00</published><updated>2009-02-20T22:05:32.337-06:00</updated><title type='text'>Android Paid App Support is here</title><content type='html'>After a long wait, the Android Market is now taking applications that cost money.&lt;br /&gt;&lt;br /&gt;I've been waiting for this event with some interest. The Android platform has a lot of powerful features. Coupled with a phone equipped like the T-Mobile G1, it's a pretty good combination. The phone has more in the way of sensors and communication options than the average laptop. Together, they make a great platform for innovation.&lt;br /&gt;&lt;br /&gt;Up to now, the main limitation for Android (at least in my opinion) has been the lack of support for paid applications. Most developers with great ideas aren't going to just release their applications into the world for free. The satisfaction of writing great software is nice and all, but being rewarded financially for your efforts as a developer is nice too. I think it's crucial, actually. I can't think of any other industry where anything good has been built and just given away for free.&lt;br /&gt;&lt;br /&gt;So anyway, I was waiting for this with some anticipation. I was curious as to what I would see once paid-app support was added. Universal Translators? Apps that turn your phone into a neck massager? Something to attract and destroy mosquitoes while you're out camping? There are a lot of possibilities. I was thinking a whole raft of ground-breaking applications would appear along with paid-app support.&lt;br /&gt;&lt;br /&gt;Boy, was I ever right! Browsing through the Entertainment section of the Android Market just now, I found no less than 12 different apps to play fart sounds. There's "Pull My Finger", "FartTools", "iFart", "PhartDroid", the list goes on and on. It's a veritable gold mine of digitized flatulence. Also, there are some apps that make gun sounds, one that swears, another that lets you develop your own "yo mama" jokes, and one that goes "waaaaaa."&lt;br /&gt;&lt;br /&gt;If you ever doubted the potential of the mobile-computing movement, or the power of the Android platform, doubt no further. If Captain James T. Kirk happened upon an alien planet where this kind of technology existed, he would crap his pants. Actually, he would probably do a sensor sweep of the planet, determine that everyone had some kind of horrible stomach disorder, and lob a couple of photon torpedoes at the surface to put the population out of their misery.&lt;br /&gt;&lt;br /&gt;Oh, also: I put a paid version of Ring Control out. It's called "RingControl (Full Version)", which I think has a nice ring to it. It does the same thing Ring Control the elder did, except it also lets you specify certain numbers to always ring the phone whether the phone is on vibrate/silent, and also has an option to keep the phone screen on during a call. The screen is dimmed, and you can shake the phone to wake it up to full brightness. I'm thinking of adding a feature to make farting sounds when you plug something into the USB port, just to keep it cutting-edge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3576308967404691977?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3576308967404691977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3576308967404691977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3576308967404691977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3576308967404691977'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/02/android-paid-app-support-is-here.html' title='Android Paid App Support is here'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4873316652226928325</id><published>2009-02-09T17:21:00.000-06:00</published><updated>2009-02-09T17:22:32.428-06:00</updated><title type='text'>Greed: Another update</title><content type='html'>Another update just went up for Greed, and it contains several updates and fixes.&lt;br /&gt;&lt;br /&gt;The updates are as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UI update for feed list and folder list:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There wasn't really much point in those big radio buttons on the feed and folder lists, which is Android's default "single-select list" look and feel. They probably do that since it would look lame if there was nothing on a list item besides text. So I updated the feed and folder list items so they have little icons depicting their status, and they display in bold if there are unread items.&lt;br /&gt;&lt;br /&gt;Also, both lists have headers now so you can click to show all feeds (or labels), or only those with unread items.&lt;br /&gt;&lt;br /&gt;Hmmm, actually, that's it for the updates. The rest were bug fixes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Force-close errors when returning from the browser:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This should actually be called "force-close errors in low-memory scenarios", since that's what was causing the problem. Greed now handles this situation the right way, and doesn't blow up when you return from a big fat browsing session.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Empty "Updated Feeds" list:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you got a notification from Greed about new news items, you'd click on the notification to be presented with an empty list. Sometimes. It was annoying, and should be fixed now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No notifications:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Because of the way Greed was handling "unread counts" updates, it was failing to notify when a feed was updated, until it had more than one unread item.&lt;br /&gt;&lt;br /&gt;Anyway, have fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4873316652226928325?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4873316652226928325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4873316652226928325' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4873316652226928325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4873316652226928325'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/02/greed-another-update.html' title='Greed: Another update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5946731166113206213</id><published>2009-02-03T22:19:00.002-06:00</published><updated>2009-02-03T22:23:19.170-06:00</updated><title type='text'>Greed quick mid-week update</title><content type='html'>I just put a new version of Greed out.&lt;br /&gt;&lt;br /&gt;The main thing in this release is that Greed clears the WebView's cache when you're done reading a feed item. This keeps Greed's size down to around 760K, whereas before it was showing up as large as 7MB!&lt;br /&gt;&lt;br /&gt;Also in this update:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mark all items as read within a folder (not just in a feed).&lt;/li&gt;&lt;li&gt;Mark all items in all feeds as read.&lt;/li&gt;&lt;li&gt;Mark all items in all labels as read.&lt;/li&gt;&lt;li&gt;Fix crash when selecting "mark all as read" in the article list, then immediately exiting.&lt;/li&gt;&lt;li&gt;Update notification: Next time there's a new version of Greed available, you'll be notified.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5946731166113206213?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5946731166113206213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5946731166113206213' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5946731166113206213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5946731166113206213'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/02/greed-quick-mid-week-update.html' title='Greed quick mid-week update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1632580701299298651</id><published>2009-02-01T12:00:00.004-06:00</published><updated>2009-02-01T13:43:34.682-06:00</updated><title type='text'>Greed Update: Notifications</title><content type='html'>I just put out another update to Greed, and this one supports a few items that people have been asking for.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Notifications:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aside from the ability to mark all items in a feed as read, this was the most-requested feature. You can set Greed to notify you when &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; feed is updated, or only for specific feeds.&lt;br /&gt;&lt;br /&gt;If you want to be notified whenever &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; feed is updated, go into the settings from the main screen and make sure that "Notify on any feed" is selected.&lt;br /&gt;&lt;br /&gt;If you only want to be notified when &lt;span style="font-style: italic;"&gt;specific&lt;/span&gt; feeds are updated, make sure the above setting is turned off. Then, go into the Feed list (main screen-&gt;Feeds), and long-touch a feed item. A context menu will appear with an item labeled "Notify on updates". To turn updates for a given feed off, long-touch an item in the Feed list, and select "Stop notifying."&lt;br /&gt;&lt;br /&gt;You can set Greed to start checking for new feed items when the phone boots, by selecting "Start on Boot" in the settings. The "Poll Interval" option controls how often Greed checks for new feed items. As with anything like this, more conservative settings are easier on the battery. If you set it to check for updates every minute, it will work your device harder and use more battery power. Unless you're a real hound for news updates, I would suggest an interval of at least 30 minutes (the default).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mark all as read:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This feature has been in Greed for a while, but people didn't seem to notice it due to its location in the UI. You can long-touch a feed in the Feed list and select "mark feed as read" from the context menu. As of this update, you can also select the "Mark all as read" item from the options menu from within the article list.&lt;br /&gt;&lt;br /&gt;At this point, I'm not sure it's possible to mark all of the items in a folder as read. If it is possible, I'll add that feature in the next update.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caching&lt;/span&gt; almost made it into this update. The feature is actually there, but it's turned off for now. Once I stabilize it, an update will appear with the ability to cache feeds and read them offline. If nothing else, I'll make it an option you can set in the preferences.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other updates:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Folders list now displays a count of unread items for each Folder. &lt;/li&gt;&lt;li&gt;A few efficiency improvements.&lt;/li&gt;&lt;/ul&gt;Donations:&lt;br /&gt;&lt;br /&gt;In Greed's "About" box, you'll notice some information about donating. I'm experimenting with this idea to see if it's a viable way to of supporting Greed's (and other apps') future development.&lt;br /&gt;&lt;br /&gt;I like this approach more than just making applications you have to pay for in order to use. The reason is mainly because in order to make a paid application, you can't just put a price tag on it and expect people to pay for it. You usually have to spend a couple of weeks making modifications to an app to create a "free version" and a "paid version". This usually takes the form of limiting features, and building nag screens or other enticements into the free version to incite people to pay you for the app. It complicates the application, and results in one version that's annoying to use, and another one you have to pay for. Then, you have to think about "piracy" and other BS.&lt;br /&gt;&lt;br /&gt;I'd rather just build an app the way I want, and keep improving it if I can tell it's worth the effort to do so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1632580701299298651?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1632580701299298651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1632580701299298651' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1632580701299298651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1632580701299298651'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/02/greed-update-notifications.html' title='Greed Update: Notifications'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5091199035675280787</id><published>2009-01-20T22:34:00.003-06:00</published><updated>2009-01-20T23:00:56.412-06:00</updated><title type='text'>Another amp joins the family</title><content type='html'>...or should I say, "the fleet." Although I only own a couple of guitars of each type (electric, acoustic, bass), I've managed to amass a sizable pile of amplifiers over the past decade, along with another pile of things that merely sound like amplifiers.&lt;br /&gt;&lt;br /&gt;So far, the list includes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tech21 Trademark 60 &lt;/li&gt;&lt;li&gt;Tech21 Tri-AC &lt;/li&gt;&lt;li&gt;Tech21 GT2 &lt;/li&gt;&lt;li&gt;Tech21 PSA-1 &lt;/li&gt;&lt;li&gt;Boss GX-700 &lt;/li&gt;&lt;li&gt;Rocktron Pirhana &lt;/li&gt;&lt;li&gt;Vox AC-1 &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I should get them all together for a picture sometime.&lt;br /&gt;&lt;br /&gt;In case you hadn't noticed, I'm kind of a fan of Tech21 gear. Each of the Tech21 products listed above is useful for something, and has a sound of its own. They all sound good on recordings, and are pretty versatile. The Boss GX-700 is good for super-clean or heavily-effected sounds. The Rocktron Pirhana is really well-built, and useful for 1 thing: Smashing walnuts. It's in storage, as I buy my walnuts pre-hulled.&lt;br /&gt;&lt;br /&gt;Notice that none of these is a "modeling" amp (except the GX-700, and that's debatable). Modeling amps digitize your guitar's signal and run it through a software simulation of a desirable guitar amp. Then the signal is sent to a power amp, and on to the speakers.&lt;br /&gt;&lt;br /&gt;I've never been a fan. First of all, for something as wild and woolly as a guitar amp is supposed to be, the idea of digitizing the signal and sending it through a computer seems cold and clinical. It's about as much fun to play through as it sounds like it is. Modeling amps usually sound pretty credible, but playing through them is nothing like playing through a real guitar amp. It's more like playing a recording of a guitar amp. It's like the difference between being chased by a charging rhino, and watching a guy being chased by a rhino on TV. The former is exciting and motivational, the latter, not so much. I also notice a latency in modeling amps that's pretty annoying. With some, I would swear it's a good 30ms between the time I play a note and when the note comes out of the amp. It's not enough to make it hard to play in time or anything like that, but it's enough to make the amp feel sluggish. You feel like you're always pushing things uphill. Overall, playing through one just isn't a very musical-sounding experience. At best, you can aspire to imitate someone by playing through an amp that sounds like theirs. But it's not the kind of thing that inspires creativity.&lt;br /&gt;&lt;br /&gt;It's a total contrast to the way a good tube amp works. Notes jump out of a good tube amp in a startling way. A good tube amp is very responsive. If you play softly, it calms down and sounds clean. If you play hard, it gets more aggressive sounding. Everything you do with your hands has an immediate effect on the sound. So as much as the sound, it's the "feel" of good tube amps that makes them so popular with guitar players, I think. It's inspiring to play through one.&lt;br /&gt;&lt;br /&gt;There's something else a good tube amp does that I have noticed, but haven't been able to really describe. It's hard to explain, but under some conditions, it's like the physical sensation of the strings under your fingers changes when you're playing through one. They seem to become kind of rubbery, and playing becomes really easy. Obviously, the strings don't take on new physical properties when a tube amp is involved, but something about the way the notes come out of the amp makes the act of playing those notes feel different than it does when playing through a solid-state amp. It's almost like the amp knows what you're going to play before you play it. Not all tube amps do it, but when you encounter one that does, you'll remember it, and you're basically spoiled for playing through anything else. You just want to keep playing and playing and playing. You feel like you can play better than normal. And to verify that you haven't suddenly turned into a better musician, you can just unplug the guitar and plug it into a solid-state or modeling amp in the same room, and play through it. It will feel as stiff and lifeless as a piece of plywood, most likely. I've tried it.&lt;br /&gt;&lt;br /&gt;It seems like a stupid thing, but I know it's not just me. Terms like "sponginess", "push back", "bloom" and other inadequate terms have been invented to try to describe the sensation in numerous articles I've read on the subject. The effect I'm talking about is most pronounced when playing with a really distorted or overdriven sound. Having experienced it, I think I understand why so many rock guitar players grow their hair long and have a weird expression on their face when they play. It's the amp. I can prove that what I'm saying is true simply by referring you to any video featuring Peter Frampton playing an acoustic guitar. In those videos, notice that he looks like just a normal guy playing a guitar. Make a mental note of his facial expression. Now, find a video of him playing a solo on an electric guitar. Notice the change in his expression. His mouth is contorted into all kinds of strange shapes. At first you think, "The poor guy is choking on something, or getting ready to hurl." But those facial expressions are actually what it looks like when Peter Frampton is being pleasured by a guitar amp.&lt;br /&gt;&lt;br /&gt;None of my amps do that. Except for the Rocktron Pirhana, they're all solid-state. The Tech21 pieces sound authentic enough. But the feel isn't the same. It's not the mere presence of tubes that makes it happen. Of my amps, the Tech21 pieces most "tube-like" in the way they sound, and in the way that they play. The closest thing to a tube in a piece of Tech21 gear is a MOSFET. My Rocktron generates its distortion through tubes exclusively, but they're preamp tubes, in a &lt;span style="font-style: italic;"&gt;preamp&lt;/span&gt;. There's nothing there in the way of a tube amp driving a speaker, or a simulation thereof. So the feel is as lifeless and stiff as a crappy solid-state amp from Sears. It doesn't do anything that an $80 stompbox can't do. It's a total bore to play through.&lt;br /&gt;&lt;br /&gt;The squishy feeling you get from a tube amp comes in part from the power tubes not being able to keep up with the work they have to do. They're trying to amplify their input signal, and they can't keep up, so the output gets compressed, clipped, distorted, and so on. The speaker's voice coil generates current that feeds back into the amp and causes weird things to happen. All kinds of subtle things go on that have a cool effect on the sound and feel of the amp. One way to make it happen is to turn a tube amp up really loud, which is impractical for most applications. I had a 33-watt tube amp once, and the thing was LOUD. I put a wall of cardboard boxes in front of it once to muffle the sound, and it just knocked them out of the way. Pete Townsend used to play in front of a wall of 100-watt Marshalls. No wonder he's deaf.&lt;br /&gt;&lt;br /&gt;So, about the new amp. It's a Vox VT30 Valvetronix. My wife couldn't decide what to get me for Christmas this year. I was in a music store and saw the amp sitting there. I had never played through one, but for some reason, I suggested she get me that. (I still like getting toys for Christmas, even though I'm supposed to be a grown-up.)&lt;br /&gt;&lt;br /&gt;It's a modeling amp, with 22 different amp models. There's the obvious selection of Vox amps, including an AC-15, a couple of AC-30s, an AC50, and a "Brian May" amp, which sounds exactly like the guitar sound on "Tie your Mother Down." It also has a couple of Dumble models, 3 or 4 Marshalls, some Fenders, something called "Metal Bull", a Peavey 5150, a Mesa Rectifier, an Engl, and another one modelled on a $25K custom-made amp, called "Express Train." I don't know what amp it's trying to emulate. &lt;br /&gt;&lt;br /&gt;Aside from the "amp" knob, it has the standard complement of knobs: Gain, Volume, Treble, Mid, Bass, Reverb, and Master. On the back, it also has a "power level" knob. This is handy, because it lets you control how much power the amp actually sends to the speaker. Full up, it's 30 watts, which is way too loud for my office, but about right when you're jamming with a drummer. All the way down, it's 0.5 watts, which is about as loud as someone whispering.&lt;br /&gt;&lt;br /&gt;Somewhere between the output of the modeling section and the power amp, there's a little tube-based power amp running a 12AX7 preamp tube.&lt;br /&gt;&lt;br /&gt;It's an ingenious idea, and it's not new. The ADA Ampulator did the same thing 12 years ago. The idea behind using a preamp tube to do a power tube's job is that it doesn't really amplify the signal to a level sufficient to drive a speaker. It stays at line level, suitable for input to a solid-state power amp. The nice thing about this is that you can crank the amp by turning the Master volume knob up, but keep the amp quiet by limiting the power output. So you get some of the same benefits of a cranked amp, without the wall-toppling volume.&lt;br /&gt;&lt;br /&gt;So, it's a modeling amp. It generates its sound through a computer. But wow. I am impressed. The models are pretty good. The Dumble ones sound great. The Vox ones sound great. All of them do really, except for the "Express Train" one. If I paid $25K for an amp that sounded like that, I'd feel pretty stupid. (Especially now, knowing I could get the same sound for $200 along with 21 other amps that sound better.)&lt;br /&gt;&lt;br /&gt;As far as the feel, I'd have to say it's got at least part of it. There's no latency that I can tell. It's not sluggish. You can get a really distorted sound with the guitar's volume all the way up, then turn it down, and the sound is clean. The distortion isn't harsh-sounding, even on the most aggressive models (5150, Engl, etc). To my knowledge, it hasn't caused my face to contort into something awful to look at, although I am thinking about cancelling my upcoming haircut. It's only a small amp. If I had a wall of them or something, I would have already turned into Dimebag Darrell.&lt;br /&gt;&lt;br /&gt;Quality-wise, I don't think I'll be cracking walnuts with it. It seems kind of fragile. When I was in Jr. high, I found a piece of steel grating that I made a speaker grill out of for an amp I had then. My installation more professional than the grill on the front of this amp. The input jack looks like it's probably going to break at some point. But when it poops out, I'll probably buy another one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5091199035675280787?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5091199035675280787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5091199035675280787' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5091199035675280787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5091199035675280787'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/01/another-amp-joins-family.html' title='Another amp joins the family'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3421786632793677135</id><published>2009-01-17T17:55:00.003-06:00</published><updated>2009-01-17T18:01:48.181-06:00</updated><title type='text'>Android: Greed update #1</title><content type='html'>I just put a Greed update up on Android Market. It contains a few new features, and fixes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Read vs. unread items:&lt;/span&gt; Previously, when you selected "unread items" and there were fewer unread items in the feed than would show in the article list, the unread items would be accompanied by read items. These were coming from Google Reader that way, and Greed now filters the read items out of the list for consistency's sake.&lt;br /&gt;   &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wrapped article titles:&lt;/span&gt; Some people didn't like the fact that article titles were single-line items that got truncated if their width went beyond the width of the article list, so now there's an option for allowing them to be wrapped multi-line items.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mark Feed as Read:&lt;/span&gt; You can now mark all of the items in a feed as read. Long-touch a feed, and select "Mark feed as read" from the context menu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scrolling:&lt;/span&gt; When scrolling through articles in the article viewer with the soft buttons, the previous version would stop once it reached the end of the downloaded articles. This update downloads new articles as you scroll forward, allowing you to read all of a feed's items without leaving the article viewer if you want to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Flip Orientation:&lt;/span&gt; The article viewer now has a "flip orientation" option, so you can read articles in "big-screen TV" mode without popping the keyboard out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Shared Items:&lt;/span&gt; You can now put items in your "Shared" area, either by long-clicking in the article list, or clicking a check box in the article viewer. "Share with note" isn't supported yet, but I might do that soon.&lt;br /&gt;&lt;br /&gt;A couple of minor performance improvements.&lt;br /&gt;&lt;br /&gt;New layouts for some of the list item views.&lt;br /&gt;&lt;br /&gt;That's about it for this update.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3421786632793677135?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3421786632793677135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3421786632793677135' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3421786632793677135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3421786632793677135'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/01/android-greed-update-1.html' title='Android: Greed update #1'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6475087999171574134</id><published>2009-01-15T21:41:00.003-06:00</published><updated>2009-01-15T22:00:31.030-06:00</updated><title type='text'>The Great Google Credentials Controversy</title><content type='html'>So, I just released Greed, an RSS reader application that integrates with Google Reader. So far, it seems to be getting some decent reviews. I've gotten a lot of good feedback in the form of ideas from people, and most of them are things I was either working on already, or will be soon.&lt;br /&gt;&lt;br /&gt;One big item: Google Credentials. In order to connect to Google Reader, Greed has to log into Google Reader. In order to do that, it needs the user's Google credentials. The best way to do this would obviously be to take the pre-existing Google credentials off of the phone (they're already there, somewhere), and use those to log into Google Reader. Problem is, there's nothing I can find anywhere in the API for retrieving those credentials. I've scoured the Android source code looking for clues, I've looked through the API documentation, and I've looked in the Google Android Developer's Group, and found precisely ...nothing.&lt;br /&gt;&lt;br /&gt;Google says they're going to release an API at some point that allows developers to get to these credentials, but they haven't yet. They're keeping kind of quiet about it. For good reason, too, I think.&lt;br /&gt;&lt;br /&gt;I've seen a lot of comments in the Market saying things like "No way am I giving you my Google credentials." I think that's fair... I'm not here to make people do things they have a moral objection to. If there was some other way to log you into Google Reader, I'd prefer to be doing that. I wonder, though: What is the difference between me getting your credentials from you directly, and me getting your credentials from the hidden place (wherever it is) on your phone? Either way, I would have them. Not only me, but the author of any other application you install. At least this way, you know I need them for some good reason.&lt;br /&gt;&lt;br /&gt;As soon as I have a way to get them in a more politically-correct manner, I will do so. Until then, here are the choices:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use Greed, and understand that your credentials are kept as safe and secure as it's possible to keep them; or&lt;/li&gt;&lt;li&gt;Don't use Greed.&lt;/li&gt;&lt;/ul&gt;Having laid it out so explicitly, I wonder if I'll see some sort of huge drop in sales volume now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6475087999171574134?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6475087999171574134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6475087999171574134' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6475087999171574134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6475087999171574134'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/01/great-google-credentials-controversy.html' title='The Great Google Credentials Controversy'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2365013400533006717</id><published>2009-01-13T21:29:00.002-06:00</published><updated>2009-01-13T21:32:49.776-06:00</updated><title type='text'>Android: Greed</title><content type='html'>I just uploaded another Android app, this one called "Greed."&lt;br /&gt;&lt;br /&gt;It's basically an RSS reader that integrates with Google Reader. It started out as a feature in Handstand that grew to immense size and didn't really fit with that application, so I removed it and turned it into its own application. I also fixed a lot of things that were wrong with it when it was part of Handstand.&lt;br /&gt;&lt;br /&gt;As a result of this release, there will be a new release of Handstand with that feature removed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2365013400533006717?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2365013400533006717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2365013400533006717' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2365013400533006717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2365013400533006717'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/01/android-greed.html' title='Android: Greed'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7633515951943001599</id><published>2009-01-03T22:17:00.002-06:00</published><updated>2009-01-03T22:55:57.920-06:00</updated><title type='text'>Handstand: Google Reader integration</title><content type='html'>I've been getting a lot of feedback on Handstand lately, and one thing a lot of people have asked for is the ability to define their own RSS feeds.&lt;br /&gt;&lt;br /&gt;It's a feature I wanted too. However, something like an Android-based RSS reader seemed a little too obvious. I'm a frequent Google Reader user, and I thought it might be cool to integrate Handstand with it in some way. That way, you could have all of your feeds in one place, whether you're on the phone or on your desktop.&lt;br /&gt;&lt;br /&gt;My first idea was to let someone manage all of their feeds in Google Reader and merely read them in Handstand. I tried that, and it seemed too limiting. It didn't give me the ability I wanted... which is to have full Google Reader access on the phone, and not through a browser. I want to be able to add feeds, edit them, remove them, shuffle them around, mark items read/unread, starred/not-starred, e-mail them, etc.&lt;br /&gt;&lt;br /&gt;So, since the last update, I've been banging out code until my knuckles are hot to the touch (and a little sore). And now, Handstand includes all of the above. You can add feeds, edit and remove them, and mark items as read/unread, and add or remove stars from items, and every change is reflected in Google Reader.&lt;br /&gt;&lt;br /&gt;There are a few wrinkles at this point, which I'm going to fix in the next couple of days:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screen flow:&lt;/span&gt; Currently, the screen right under "News/My Feeds" in Handstand goes to the article list. If you haven't selected a feed yet, you get the feed selection screen. If you have, the last feed you were reading is the one that pops up. I don't like this, because I'm always hitting the "back" button to back out of the article list and into a feed selector. This is how it's going to work in the next update. I'm also going to add the ability to browse by folder, starred items, and the "reading list", the list of new items Google Reader shows you when you first log into it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Performance:&lt;/span&gt; Some of the feeds I read take a while to load. I think I can make it work faster, or at least appear to. Caching is coming.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Error messages:&lt;/span&gt; Oh yes. You'll be seeing some error messages in this release. Things like "Credentials are not set!" and various "Socket timeout" errors. I get these occasionally when I'm sitting on my deck in the no-man's land between my Wi-fi connection, my neighbor's Wi-fi, and the EDGE network. I think I can at least make the error messages less startling... Perhaps a nice picture of some cuddly kittens to go with them. In the meantime, just click "OK" on the error message, and maybe "update", and it will usually right itself. That is, unless you're out in the middle of the desert without network coverage. In which case, you should be using the compass and GPS to get yourself back to someplace with a Wi-fi connection.&lt;br /&gt;&lt;br /&gt;Finally, there's the way the Google Reader integration sticks out of Handstand like a... I don't know, thing that's out of place. (My "witty comparison generator" seems to be broken.) Having it there is like the same old Handstand, but with Google Reader tacked on to it. I need to think about this. Either I come up with a better way to integrate it into the app, or I make a separate app out of it now. Until I decide, enjoy this version of Handstand, and let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7633515951943001599?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7633515951943001599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7633515951943001599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7633515951943001599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7633515951943001599'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2009/01/handstand-google-reader-integration.html' title='Handstand: Google Reader integration'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8433900071861478872</id><published>2008-12-21T23:46:00.003-06:00</published><updated>2008-12-21T23:53:03.085-06:00</updated><title type='text'>Android: Handstand Update</title><content type='html'>I just put up an updated version of Handstand with a few fixes, amid Christmas activities popping up all around. They're interim updates while I work on the next big feature.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Plain-looking UI: Don't worry, it's still plain, just a little less so in places. Still working on this.&lt;/li&gt;&lt;li&gt;Apparently, it wasn't obvious to some users that you have to configure the zip code in the preferences. An update ensures that you've set a zip code properly, or at least been prompted to do so.&lt;/li&gt;&lt;li&gt;A few people complained that the sports scores screen only showed NCAA Men's/Women's Basketball. Those choices were what we in the industry refer to as a "default setting." Other than putting a "Sports" item on the options menu, I didn't make it obvious that you can select other sports besides the two that display by default. The update shows the sports-selection screen if the user hasn't seen it before, thereby making it pretty obvious that it's possible to select other sports to view.&lt;/li&gt;&lt;li&gt;Added "Nearby Restaurants" to the "Location" section. &lt;/li&gt;&lt;li&gt;Fixed the "Delete Symbol" command in the Stock Quotes screen.&lt;/li&gt;&lt;li&gt;Updated the Sports Scores screen to show the game date.&lt;/li&gt;&lt;li&gt;Updated the background thread logic for faster/more complete cancellations.&lt;/li&gt;&lt;li&gt;Addressed some of the complaints about network error messages.&lt;/li&gt;&lt;li&gt;Replaced the location-awareness service with one that uses far fewer resources.&lt;/li&gt;&lt;/ul&gt;That's about it. Just some fixes for some annoyances.&lt;br /&gt;&lt;br /&gt;The next update will contain something more interesting than fixes. I actually can't wait to have access to the feature myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8433900071861478872?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8433900071861478872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8433900071861478872' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8433900071861478872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8433900071861478872'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/12/android-handstand-update.html' title='Android: Handstand Update'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2522913336646012975</id><published>2008-12-13T23:06:00.003-06:00</published><updated>2008-12-13T23:34:21.924-06:00</updated><title type='text'>Android: Handstand</title><content type='html'>I just put another app out on the Android Market, called "Handstand".&lt;br /&gt;&lt;br /&gt;It's pretty conventional as Android applications go. Its intended audience is people who might want to keep up with current events, check on the weather, look at stock quotes, sports scores, see movies, and the like. It's not really geek-oriented, which I think limits its appeal (to me at least).&lt;br /&gt;&lt;br /&gt;It's a work in progress, and I'm interested in input: Suggestions, bug reports, annoyances, feature requests, ideas anyone might think fit with the overall concept, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Icons&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I had an idea of using a monochrome theme for the icons. It turned out like I thought it would, but I'm not as enamored with the idea as I was now that I've seen it. Part of that is due to the fact that I'm not really very good drawing with a mouse. So here's a question: Would a more conventional set of Android-type icons be more appropriate? Or perhaps keep the monochrome idea, with the ability to change the background color (e.g. green, gray, magenta, etc.)? If the general consensus is that the icons should be more conventionally Android-themed, are there any hotshot graphics designers out there interested in creating 30 or so icons? Call me, let's do lunch!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;News Feeds&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The news feeds are mostly from Reuters. I like those because they update often, and there's a lot of them. Handstand does not (currently) allow you to set your own RSS feeds, import OPML, etc. So input here is appreciated: Would you rather see this feature added to Handstand, or a dedicated news reader application that allows that? My thinking here was that some members of its intended audience would probably not be all that interested in setting up their own feeds, or maybe even know what RSS feeds are.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stock Quotes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This feature could use some work. What would make this more interesting? If it could manage Google Finance transactions or something, would that make it more appealing? Inquiring minds want to know.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Weather&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can see the weather in your area, plus forecasts for other locations. Meh. Maybe if a little talking guy would tell me the weather forecast for my area, it would be cooler. In any case, you can view weather forecasts for whatever cities you specify, and view detailed forecast info on Wunderground with it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Movie Times&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This one, I kind of like. Given your current location, the "Movie Times" screen shows theaters within 15 miles or so of your location, and lists the movies playing there. From this screen, you can call the theater, show it on a map (and subsequently get directions to it), see the movies playing there (and their times, hence the name "Movie Times"), plus see info about the movie if it's listed in IMDB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sports Scores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This screen shows you a set of recent sports scores. You can pick which sports you're interested in seeing, e.g. NCAA Men's Basketball. It only shows the scores for recent games, so you can pick all available sports.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Location&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes, I find myself in a location where I don't know the address. This screen shows that, which I've found useful at times. The information comes from Google's reverse geocoder. Where I live and where I work are separated by a vast expanse of pastoral rurality. When passing through that area, sometimes the "My Location" screen tells me I'm in "North America." All I can say is, thanks Google! Good to know that my route to/from work doesn't take me through Afghanistan or France!&lt;br /&gt;&lt;br /&gt;In any case, the accuracy of the information shown in "My Location" improves with movement, assuming your GPS is turned on. The relevance of the information improves if you're on a street with numbers and such as well.&lt;br /&gt;&lt;br /&gt;The My Location screen also shows the nearest intersection, which can be useful. It even works out in the middle of the aforementioned rural expanse.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nearby Places&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you find yourself wondering what might be nearby, the "Nearby Places" screen can be handy. It shows a list of nearby cities. You can touch any of them and see the location on the map. This information comes from Geonames.org. I originally used the Google geocoder for this information, since it can give you the names of places of interest, like "Golden Gate Bridge" or "Place where that guy in Google's Street View was caught on camera peeing beside a road sign." But in my area, the information is less interesting. I get things like my own zip code, the name of a nearby creek, the town I live in, and of course "North America". There's something a little disappointing about clicking on an item in this list, and seeing a map of the world. So, Geonames.org it is. I wonder if making this selectable would be useful? I could do that easily enough.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Having spent a month writing this application in my spare time, I'm a little bored with it. I don't know if my boredom with it stems from the fact that I've been messing with it for so long, or if it's just a boring application.&lt;br /&gt;&lt;br /&gt;Anyway, it's a work in progress. It will be interesting to see what people think of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2522913336646012975?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2522913336646012975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2522913336646012975' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2522913336646012975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2522913336646012975'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/12/android-handstand.html' title='Android: Handstand'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4168492351222188534</id><published>2008-11-28T11:19:00.001-06:00</published><updated>2008-11-28T11:21:48.852-06:00</updated><title type='text'>To/From Ibex</title><content type='html'>Whenever a new version of Ubuntu comes out, I usually write some kind of post about it after I upgrade, talking about it. In every case so far, the upgrade brings new functionality, better ease-of-use, a cooler-looking user interface, and other minutiae that no one really cares about, but still represents progress.&lt;br /&gt;&lt;br /&gt;So, a couple of weeks ago, I installed the latest Ubuntu, Ibex (8.10), on my big supercollider machine in my house. I use that machine mostly for audio recording. It has an M-Audio sound card with variable sample rate, 12 in/outs, gold-plated connectors, 2ms latency, etc. In the world of "Machines in my Basement", this one is fairly important, and one of the cooler ones.&lt;br /&gt;&lt;br /&gt;Before doing the upgrade, I took the opportunity to move my home directory to a separate physical partition on the drive. Having done this, I highly recommend it, since now I can upgrade the OS without touching the data in my home directory (read as "pretty much everything but the OS and applications").&lt;br /&gt;&lt;br /&gt;Having done that, on to the upgrade. I did a clean installation on the non-home partition, formatting the partition first.&lt;br /&gt;&lt;br /&gt;The installation started out smoothly enough, then stopped with a message:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Unable to copy files. It may be that your CD-ROM is defective, or your CD burner is defective, or your machine has overheated, or is running in a hot environment.  Also, you could have burned the CD you're installing from at too high a rate. That can cause problems. You might want to burn another one at a lower rate.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...or something like that. Huh? What a weird error message. My interpretation:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Unable to copy files. You may be installing this OS in a jungle, or on a machine that should probably be thrown away. That's probably it. Either way, it sucks to be you. If the problems I've mentioned aren't the cause of this problem, well..... Go away and burn a CD, and take your time doing it. That may take your mind off the fact that your new OS installation isn't going so well. Sorry about that. Please don't be mad at us.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It sounded like a tech-support guy with no answers, trying to get someone off the phone. (Like those nice people who work for Embarq in residential DSL support.)&lt;br /&gt;&lt;br /&gt;No other options were available to me, so I did as the message suggested and burned a CD on another machine at the slowest possible rate, to really bake those files into the plastic. (Rule #1 with Linux machines: NEVER EVER have just one machine. You'll need a second machine for emergency support at some point.)&lt;br /&gt;&lt;br /&gt;With my new fully-cooked/half-melted CD in the drive, I attempted the installation again. This time it worked without any complaints. It was able to copy all of the files, and the installation completed successfully. I guess that error message was helpful after all.&lt;br /&gt;&lt;br /&gt;Having completed the installation, I booted into the new OS. Here's what I found:&lt;br /&gt;&lt;br /&gt;. The new "Ibex" wallpaper looks bad. It's as if someone got a monkey to stand next to a concrete wall, and then smashed into the wall with tractor, crushing the monkey against it. Then they came back a few weeks later after things had dried, hosed the broken bones, hair and teeth off the wall, and took a sepia-toned photograph of the crime scene.&lt;br /&gt;&lt;br /&gt;. There's a new "Guest" account, which is great if you have a coffee shop or something where people want to come in and surf the web in style while enjoying a $4 latte. Except the window manager was using some crappy-looking theme from 1998, so it wasn't that stylish.&lt;br /&gt;&lt;br /&gt;. Audio is completely broken. I couldn't get anything related to audio to work at all, ever, under any circumstances, unless I used mplayer from the command line to play movies, or jackd to play "pro" audio stuff.&lt;br /&gt;&lt;br /&gt;. Shortcut keys still don't work. Starting with 8.04, all of the shortcut keys I defined in System/Preferences/Shortcut Keys&lt;br /&gt;stopped working. I had to manually define them in the GConf editor, or use UbuntuTweak to do it. This was broken in Ibex too.&lt;br /&gt;&lt;br /&gt;. I found out that there's no SMP real-time kernel support, so even if the audio worked, it wouldn't work as well in Ibex as it did in Hardy.&lt;br /&gt;&lt;br /&gt;Last night, I downgraded. It took about 45 minutes to put the old version back on, get it configured the way I want it, and get the machine back into a useable state. Audio is working fine again, all my stuff is there, and I'm happy with it. Thank God for separate home partitions.&lt;br /&gt;&lt;br /&gt;I guess this Ubuntu release is intended more for mobile users, and there are some improvements in the UI, but it didn't constitute an improvement for me. I guess this is still a sign of progress... When the OS gets to the point where it works great and an upgrade offers little to no benefit, you could say it's getting pretty good and hard to improve on.&lt;br /&gt;&lt;br /&gt;Dang... I sound like a fan boy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4168492351222188534?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4168492351222188534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4168492351222188534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4168492351222188534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4168492351222188534'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/11/tofrom-ibex.html' title='To/From Ibex'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1628601060964539992</id><published>2008-11-27T01:36:00.005-06:00</published><updated>2008-11-27T01:43:59.859-06:00</updated><title type='text'>Android: net-handler-android</title><content type='html'>I built a library that I've been using in Android applications for dealing with long-running background operations where you need to retrieve data from an external source, and getting the data might take a while.&lt;br /&gt;&lt;br /&gt;I thought about writing a bunch of stuff about it here, but decided against it. It's a library, pretty simple, and is thus boring. If you disagree, you can check it out &lt;string,&gt;on Google Code at &lt;a href="http://code.google.com/p/net-handler-android/"&gt;http://code.google.com/p/net-handler-android/&lt;/a&gt;.&lt;/string,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1628601060964539992?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1628601060964539992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1628601060964539992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1628601060964539992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1628601060964539992'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/11/android-net-handler-android.html' title='Android: net-handler-android'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3737403551636394044</id><published>2008-11-25T12:49:00.001-06:00</published><updated>2008-11-25T12:49:41.399-06:00</updated><title type='text'>Picture post</title><content type='html'>&lt;p class="mobile-photo"&gt;&lt;a href="http://1.bp.blogspot.com/_nYlZRe4bfLk/SSxIxV8N4aI/AAAAAAAAAGI/Q_2PZ6MQ8dc/s1600-h/1227482483968-781401.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_nYlZRe4bfLk/SSxIxV8N4aI/AAAAAAAAAGI/Q_2PZ6MQ8dc/s320/1227482483968-781401.jpg"  border="0" alt="" id="BLOGGER_PHOTO_ID_5272669276284510626" /&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/13977355-3737403551636394044?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3737403551636394044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3737403551636394044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3737403551636394044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3737403551636394044'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/11/picture-post.html' title='Picture post'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nYlZRe4bfLk/SSxIxV8N4aI/AAAAAAAAAGI/Q_2PZ6MQ8dc/s72-c/1227482483968-781401.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7573221418821528380</id><published>2008-11-25T12:36:00.003-06:00</published><updated>2008-11-25T16:31:51.568-06:00</updated><title type='text'>Android: Ring Control</title><content type='html'>I've been playing around with a little Android application for a few weeks now, while taking occasional breaks from working on other, more "real" Android projects.&lt;br /&gt;&lt;br /&gt;It's called Ring Control, and it puts your phone on vibrate (or silent, depending on your preferences) mode if you put it upside-down in your pocket, or lay it face-down on a table (again, depending on your preferences).&lt;br /&gt;&lt;br /&gt;The idea is pretty simple, and the implementation was too, at least initially. It's easy: Get a reference to the SensorManager, tell it you want to know about orientation changes, calculate the degrees of pitch in the orientation, and set the ringer mode depending on the pitch value. I gave it about 50 degrees of latitude (or is that longitude) in either direction to keep it from being too touchy about device orientation.&lt;br /&gt;&lt;br /&gt;The app consists mainly of two parts: The UI screen (for starting and stopping Ring Control and setting preferences), and the background service that actually controls the ringer. Probably the smallest Android app I've written since that "Hello World" app back in '08.&lt;br /&gt;&lt;br /&gt;As I said, the idea is simple, but it turns out to be kind of a tricky problem. The "hard" part (well, not hard, now that I know what to do) is making it work like you would expect it to work.&lt;br /&gt;&lt;br /&gt;As it happens, Android is pretty conservative about things like memory and battery power, and isn't keen on letting background services just sit there and nibble on the CPU while doing nothing else. ("nothing else" in this case defined as "not having any clients asking them for things"). So after about 1/2 hour, my background service would just stop, with no notifications or anything else. Since the whole point of Ring Control is to turn your ringer to vibrate and keep the phone quiet, it doesn't seem too useful to have it just stop suddenly, letting your phone spew out a loud "riiiiinnng..." (or other obnoxious ringtone) while you're in a funeral or something and need for it to be quiet.&lt;br /&gt;&lt;br /&gt;I started reading about the various ways to tackle the problem, and read about "wake locks" and other things that you can use to poke at the phone's CPU to keep it alive so your service will work. That seemed like a good way to eat up batteries, and there was still nothing in the idea that would seem to actually ensure that the service kept working.&lt;br /&gt;&lt;br /&gt;So, no.&lt;br /&gt;&lt;br /&gt;As it turns out, there is an accepted way to keep a background service running, and that is to use the AlarmManager system service. Essentially, you schedule a repeating alarm, say, every 5-10 minutes, and the "alarm" is an "Intent" (Android-speak for "thing that runs something") telling the AlarmManager to start your service (or activity or broadcast message). It seems like kind of a goofy way to do it, really. I read about it, and thought "Seriously? I have the AlarmManager start me at regular intervals?" Whatever works, I guess. In any case, I set it up so the "start" signal just keeps the service running if it's already running, instead of starting another copy.&lt;br /&gt;&lt;br /&gt;Having done that, the service now runs as long as it's supposed to, and doesn't poop out spontaneously.&lt;br /&gt;&lt;br /&gt;Ring Control turned out to be pretty popular on the Android Market, with a lot of people downloading it and e-mailing me about it and commenting on it in the Android Market. (Best comment so far: "I give it 3 stars. I wish it would show movie times." Huh?) One feature people asked for was the ability to run it automatically when the phone boots.&lt;br /&gt;&lt;br /&gt;Like a lot of things with Android, I seem to look in the wrong place initially for information about how to do something. I started thinking about some kind of "startup folder" metaphor somewhere, found nothing.&lt;br /&gt;&lt;br /&gt;The way to get a service or application to run at startup is to create a "BroadcastReceiver", a class that receives a broadcast notification from the OS when something happens, and assign to it a key. There are keys for all kinds of events (e.g. incoming call, SMS message, blah blah blah). The one I was interested in was "android.intent.action.BOOT_COMPLETED." This notification gets sent to applications that want to know about it, even if they're not running. Android pulls a BroadcastReceiver out of bed and calls its onReceive() method, passing it some info about what's starting it. In my case, I just start the Ring Control service in my BroadcastReceiver, and that's it.&lt;br /&gt;&lt;br /&gt;Now that that's done, I've got some other ideas on how to use the orientation sensor for something interesting.&lt;br /&gt;&lt;br /&gt;Overall, I kind of enjoy walking around with a device with all this stuff on it. It has a compass, orientation sensors, GPS, internet access, audio and video playback (makes a good iPod), functions as a mirror when the screen's turned off, makes a good hand warmer if you surf the web a lot, is heavy and chunky enough to ward off an attacker, and has changed my life in general: I no longer have time to sit in meetings getting annoyed at people playing with their fancy phones. I'm too busy playing with my phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7573221418821528380?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7573221418821528380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7573221418821528380' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7573221418821528380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7573221418821528380'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/11/android-ring-control.html' title='Android: Ring Control'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-474757173794455222</id><published>2008-11-14T22:27:00.001-06:00</published><updated>2008-11-14T22:27:43.281-06:00</updated><title type='text'>Post from my phone</title><content type='html'>&lt;p&gt;Hey there&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-474757173794455222?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/474757173794455222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=474757173794455222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/474757173794455222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/474757173794455222'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/11/post-from-my-phone.html' title='Post from my phone'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6551395591867609704</id><published>2008-10-03T11:17:00.003-05:00</published><updated>2008-10-03T11:43:05.643-05:00</updated><title type='text'>The Un-Mac</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/SOZKfH6OIRI/AAAAAAAAAGA/teifsp9dWus/s1600-h/vaio.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/SOZKfH6OIRI/AAAAAAAAAGA/teifsp9dWus/s320/vaio.jpg" alt="" id="BLOGGER_PHOTO_ID_5252967913933906194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the "un mac", a laptop I bought last week. My old HP was a reliable machine, but was getting slower and slower with each new Ubuntu release. I figured 4 years was a pretty good run for a machine, but it was time to upgrade.&lt;br /&gt;&lt;br /&gt;I suppose someday I'll just give up and get a Macbook Pro, but at this point, it feels like giving in somehow. I decided I would try to find a laptop that didn't have Vista or XP already installed on it, since I inteded to put Ubuntu on it anyway. There are a few companies that sell Linux laptops, like Dell, System76, etc. But I don't know... those machines are either high-priced, or cheap-looking. In any event, I didn't see anything online that I wanted. I eventually decided to just find a cheap Windows laptop and wipe Vista off of it first thing.&lt;br /&gt;&lt;br /&gt;Call me crazy, but if I'm going to spend money on something like a laptop, I want it to look cool. Looking for Windows machines at the local Best Buy/Micro Center-type stores, I was surprised at A) how ugly most Windows machines are, and B) how expensive some of them are. Asus machines are nice-looking, but wow. I think they must stuff them with gold coins or something. The run-of-the-mill HP/Compaq/Dell/Acer/Toshiba machines look like they were designed to be as cheap as possible. Some of them look like they were spray-painted, and the paint even has the same kind of orange-peel you find on a low-priced car. Acer makes one that looks like a cross-breed between a laptop and the inside of a toilet-seat cover.&lt;br /&gt;&lt;br /&gt;The exception to this seemed to be Sony machines. They have a range of machines that look pretty nice, with magnesium chassis, nice screens, and a keyboard like a Macbook. In fact, they look a lot like a Macbook Pro, except with more curves. Most of them were priced higher than I was inclined to pay.&lt;br /&gt;&lt;br /&gt;I happened across one at the end of a display, a discontinued model. It was marked down about $400 off it's original price, had good specs, and the keyboard I liked. I made a mental note of the hard-to-memorize model number (VGN-FW139E), and left to look it up and find out more about it. I liked it, and returned the next day to look at it again. I found they had marked it down another $60, so I bought it.&lt;br /&gt;&lt;br /&gt;One universal thing about all Windows laptops is that they're plastered with stupid looking stickers. They're eveywhere; on the lid, on the surface in front of the keyboard, on the back, bottom, etc. They look like cheap boom boxes from Wal-Mart.&lt;br /&gt;&lt;br /&gt;Mine was also loaded with Windows Vista, of course. The first thing I did was boot it to make some recovery disks. That's really the first time I'd used Vista. My impression: Wow. I can see why people get annoyed with it. It's like your mom. Well, not yours specifically, but like someone's mom. As soon as it boots, it starts yelling at you. Make some backup disks. Fix your security issues. Make some adjustments. Someone wants internet access, better make sure that's okay. Something is looking at the hard disk. You sure you want to allow that? Clean your room. Take out the trash. Restart. NOW. At one point, it booted, loaded the UI, displayed the "Security Center" or whatever it's called, and immediately popped up a message box saying it was time to restart. Overall, I wouldn't be able to stand something like that every day. It's highly annoying, although it is kind of pretty. (Just like some moms, now that I think about it.)&lt;br /&gt;&lt;br /&gt;If there's one thing I've learned about Microsoft, is that whenever you're annoyed by one of their products, all you have to do is follow their instructions and wait for the next version, which will be REALLY COOL. Five years later, when the REALLY COOL product has been released (with 80% of the anticipated features missing), you just wait some more. Simple. Overall, I think Vista will be a lot better once they rename it to Windows 7 and take out the media player.&lt;br /&gt;&lt;br /&gt;While I wait, I figure I might as well make the machine useful. So I made some recovery disks, and installed Ubuntu on it. As usual, the installation went well, except this was the first time Ubuntu didn't know what to do with the wi-fi card. I had to actually install drivers for it. Then wireless access seemed really slow. It took forever to get anywhere. The wireless card has an Atheros AR928x-something chipset, and the Linux drivers for it have only been around for about 2 months. I played around with ndiswrapper, but didn't see any improvement. Then I noticed my other laptop's wireless was painfully slow. The problem turned out to be my 6-year-old Linksys router. With that problem fixed, there is no wireless issue.&lt;br /&gt;&lt;br /&gt;So, after getting the machine set up the way I like it, and removing a total of 14 stickers from the surface of it, it looks like it's going to make a pretty cool laptop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6551395591867609704?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6551395591867609704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6551395591867609704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6551395591867609704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6551395591867609704'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/10/un-mac.html' title='The Un-Mac'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nYlZRe4bfLk/SOZKfH6OIRI/AAAAAAAAAGA/teifsp9dWus/s72-c/vaio.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2519322823343426501</id><published>2008-09-18T15:44:00.004-05:00</published><updated>2008-10-02T00:02:11.140-05:00</updated><title type='text'>Mistaken Identity</title><content type='html'>I got a "thanks for your order"-type message from the publisher of some kind of engineering magazine the other day, thanking me for signing up for a subscription. It came to an e-mail account that I don't use very often.&lt;br /&gt;&lt;br /&gt;Apparently, someone mis-typed their e-mail address when signing up for a subscription to this magazine, specifying my address instead of their own. The message didn't appear to be spam, and I took no action in response to it.&lt;br /&gt;&lt;br /&gt;It's been kind of interesting to see the kinds of e-mails I'm getting on that account since then. Apparently, the person who signed up for the engineering magazine subscription is also a trucker, and is being asked to participate in a lot of surveys for the "American Trucker's perspective" on various issues. This person also does some woodworking, and apparently lives in the SF Bay area. And, his subscription to "Out Magazine" is about to run out.&lt;br /&gt;&lt;br /&gt;So if you are reading this and you know any "alternate lifestyle" truck-driving engineers who do woodworking for a hobby and are complaining that their issues of engineering and lifestyle magazines haven't been showing up at their home in the SF Bay area, I may have an idea about that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2519322823343426501?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2519322823343426501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2519322823343426501' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2519322823343426501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2519322823343426501'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/09/mistaken-identity.html' title='Mistaken Identity'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-5204134381610715793</id><published>2008-09-11T10:09:00.004-05:00</published><updated>2008-09-11T10:40:44.063-05:00</updated><title type='text'>Dirty little secret</title><content type='html'>I've been a fan of &lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge's blog&lt;/a&gt; for awhile now.&lt;br /&gt;&lt;br /&gt;A new post from Steve Yegge is like getting a huge erector set for Christmas. It's going to be useful and pleasant, and it's going to take time. The guy's blog posts are &lt;span style="font-style: italic;"&gt;long&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Whenever one arrives, I think "okay, I'll set aside some time to read this", because although they're long, they're usually pretty funny, and they make a good point.&lt;br /&gt;&lt;br /&gt;So this latest post arrived, with a provocative title: &lt;a href="http://steve-yegge.blogspot.com/2008/09/programmings-dirtiest-little-secret.html"&gt;"Programming's Dirtiest Little Secret"&lt;/a&gt;. Given what I've read from him in the past,  I thought it was going to be something nice and deep, like the fact that most bad programmers are socially liberal yet fiscally conservative, or some kind of tie-in between good programming skills and an awareness of a higher power.&lt;br /&gt;&lt;br /&gt;But, no. It was about the fact that some people can't type. You know, press keys on a keyboard and make letters and such appear on the screen. I didn't see that coming.&lt;br /&gt;&lt;br /&gt;Typing is such a fundamental skill for someone in the tech industry that I haven't even thought about the necessity of having that ability for someone in my line of work. But it's true, now that I think of it. There are plenty of people who can't do it very well. What a joke that is. I don't care how good a programmer/designer/architect you are, showing up to the computer party without typing skills is like a race-car driver waxing all poetic about the "racing line", the "limit of adhesion", "taking them on the outside", etc., and then mentioning "oh, by the way, I don't know how to drive a stick."&lt;br /&gt;&lt;br /&gt;As a developer/designer/architect, you're in the business of making a computer do your bidding. I don't know how you could expect to do that effectively at all if you haven't yet discovered an efficient means of talking to the computer to start with. I'm going to make a point of asking about typing skills the next time I interview someone for a programming job.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I see that you have Spring WebFlow, Axis, XFire, Ajax, Flex, and SWT experience. You've impressed me with your opinions about what makes a good architecture. Your thoughts on thread safety, resource contention, and race conditions appear to be well thought-out. So... Can you type? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The reaction should be interesting.&lt;br /&gt;&lt;br /&gt;Also, the aforementioned blog post gave me some insight into why Steve Yegge's posts are so long and verbose. The guy can type 120wpm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-5204134381610715793?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/5204134381610715793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=5204134381610715793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5204134381610715793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/5204134381610715793'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/09/dirty-little-secret.html' title='Dirty little secret'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6581192289198880853</id><published>2008-09-09T15:43:00.001-05:00</published><updated>2008-09-09T15:43:42.812-05:00</updated><title type='text'>A post from e-mail: Test</title><content type='html'>&lt;div dir="ltr"&gt;Hello, this is a test of posting to a blog from e-mail.&lt;br&gt;&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6581192289198880853?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6581192289198880853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6581192289198880853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6581192289198880853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6581192289198880853'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/09/post-from-e-mail-test.html' title='A post from e-mail: Test'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7467213560484982180</id><published>2008-09-04T22:57:00.008-05:00</published><updated>2008-09-09T14:07:21.070-05:00</updated><title type='text'>OSGi Bundle Deployer</title><content type='html'>&lt;div id="i9:51"&gt;I wrote a little tool for development with OSGi (specifically Equinox), which I've been playing a lot with lately. I thought I would post it here in case anyone found it useful. It's similar to the &lt;a href="http://cwiki.apache.org/FELIX/apache-felix-file-install.html"&gt;File Install&lt;/a&gt; bundle available for Apache Felix (as a commenter on this post pointed out).&lt;br /&gt;&lt;br /&gt;The tool in question here is an OSGi bundle that manages the installation, update and un-installation of other OSGi bundles. It bears the unimaginative name of "bundle deployer".&lt;br /&gt;&lt;br /&gt;Essentially, its job is to monitor one or more directories on the file system and install, update, or uninstall bundles being manipulated there.&lt;br /&gt;&lt;br /&gt;Once you've configured and started it, you can install a bundle in the OSGi environment just by copying it to a monitored directory. To update an installed bundle, update the corresponding file. To uninstall it, delete the corresponding file.&lt;br /&gt;&lt;br /&gt;I find this useful, since I've been spending a considerable amount of time updating bundles on a remote machine I'm testing on. I can just scp all of the bundle files I'm dealing with onto a specific directory on the remote machine, and they get loaded and updated automatically.&lt;br /&gt;&lt;br /&gt;&lt;div id="h2io55"&gt;Here is the "user manual":&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;   &lt;div id="gj9g"&gt;&lt;span style="font-weight: bold;"&gt;First:&lt;/span&gt; download the bundle from here:&lt;br /&gt;&lt;a href="http://fognl.com/osgi/bundle_deployer_1.0.0.jar"&gt;http://fognl.com/osgi/bundle_deployer_1.0.0.jar&lt;/a&gt; &lt;/div&gt; &lt;div id="r0vm"&gt;&lt;br /&gt;You can get the source from here:&lt;br /&gt;&lt;a href="http://fognl.com/osgi/bundle_deployer_1.0.0-src.zip"&gt;http://fognl.com/osgi/bundle_deployer_1.0.0-src.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div id="r0vm1"&gt;&lt;span style="font-weight: bold;"&gt;Second:&lt;/span&gt; In your OSGi console, set a property:&lt;/div&gt; &lt;div id="gj9g1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;code&gt; osgi&gt;setprop bundle.deployer.dir.names=/home/fred/my_bundles:/home/fred/my_other_bundles&lt;/code&gt; &lt;div id="r22j"&gt;&lt;br /&gt;&lt;/div&gt; &lt;div id="r22j1"&gt;The format of the property value is just like your OS's PATH statement. The example shown here is for Linux, with a ":" between directory names. On Windows, the path-separator character is ";", e.g:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; c:\my_bundles;c:\my_other_bundles&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="ei.v1"&gt;You can also specify this property in your OSGi environment's config.ini file. If you use this bundle on Linux, you can create a config file at &lt;code&gt;/etc/bundle-deployer.conf&lt;/code&gt; with the property in it. In this case, the bundle deployer will use property values specified there, but actual system properties you specify will take precedence.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; The "\" character is an escape in a properties file. So if you specify a Windows path with backslashes in a properties file or in config.ini (which is also a properties file), be sure to use two backslashes (\\) for the path separators. Better yet, just use forward slashes (e.g. c:/my_bundles). This works fine on the Windows platform too. Cmd.exe is the only component of Windows that doesn't know what to do with "/" path separators.&lt;br /&gt;&lt;/div&gt; &lt;div id="gj9g4"&gt;&lt;br /&gt;&lt;/div&gt; &lt;div id="gj9g6"&gt;Once you've set this property, install and start the bundle deployer:&lt;/div&gt;&lt;br /&gt;&lt;div id="gj9g9"&gt;&lt;code&gt;osgi&gt;install file:/home/path/to/download/bundle_deployer_1.0.0.jar&lt;/code&gt;&lt;/div&gt; &lt;div id="gj9g10"&gt;&lt;code&gt;Bundle id is (something)&lt;/code&gt;&lt;/div&gt; &lt;div id="r22j5"&gt;&lt;code&gt;osgi&gt;start (something)&lt;/code&gt;&lt;/div&gt; &lt;div id="r22j6"&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div id="b_0y"&gt;When the bundle deployer starts, it will scan the directories you specified, and install all of the bundles found there. After installing all of them, it starts them all. If a bundle is already installed, installing it again has no effect.&lt;br /&gt;&lt;br /&gt;That's basically all there is to using it.&lt;br /&gt;&lt;/div&gt;&lt;div id="g_it1"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;I typically configure Equinox to use this bundle in the conventional way (specifying it in the config.ini file), so that when I stop/restart Equinox, it loads this bundle (along with others that are already in use). When the bundle deployer starts, it loads the bundles I'm working on. This approach would most likely work in a production environment, but that's not the point. I think you'd want to use the recommended approach for your OSGi environment for loading a production set of bundles.&lt;br /&gt;&lt;br /&gt;One last thing: This has only been tested with the Equinox environment, and not on Knopflerfish or Apache Felix.&lt;br /&gt;&lt;h3 id="ncan"&gt;Bugs&lt;/h3&gt; &lt;b id="ds1u"&gt;Update Exceptions:&lt;/b&gt; It's possible for an update operation to result in an exception in the OSGi environment where it complains about "X.jar is not a valid zip file". What's happening here is that my directory scanner notices that the file's modification time has updated and signals an "update" event to its listener, without bothering to make sure the file isn't still being updated before it fires the event. This wouldn't be hard to fix, and I'll post an update once I fix it. In the meantime, just update the file again if you get this error message.&lt;br /&gt;&lt;br /&gt;If you see this happening frequently, you can reduce the likelihood of it happening by adjusting the &lt;span style="font-weight: bold;"&gt;bundle.deployer.sleep.interval&lt;/span&gt; property to a higher value. This property controls how long the bundle deployer waits between checks for updates in the monitored directories. It's specified in milliseconds. So:&lt;br /&gt;&lt;br /&gt;&lt;code&gt; osgi&gt;setprop bundle.deployer.sleep.interval=10000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...results in a directory scan every 10 seconds (instead of the default of 2 seconds).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;You can set the bundle.deployer.sleep.interval property in any of the places mentioned above (console, /etc/bundle-deployer.conf, config.ini).&lt;br /&gt;&lt;/div&gt; &lt;div id="bhcb"&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div id="bhcb3"&gt;&lt;b id="t3t1"&gt;The tree-chopping-itself-down bug:&lt;/b&gt; The bundle deployer does not exclude its own jar file from installation or update (or delete) operations. If you do something weird like putting the bundle deployer's jar file in a directory that it's monitoring, it will have no effect. If the bundle deployer isn't started already, simply copying the file into a directory won't do anything. If it is already running, it will attempt to install itself, but since it's already installed, the install operation will have no effect.&lt;br /&gt;&lt;br /&gt;However, if you delete the bundle deployer's jar file from a directory it's monitoring, it will uninstall itself. OSGi's APIs are smart enough to prevent this from being the black-hole-inducing disaster it sounds like it would be, so I don't think there would be any serious effect. I frankly haven't tested that. This isn't really how the bundle deployer is meant to be used.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;System Properties:&lt;/span&gt; While it's running, the bundle deployer doesn't notice changes you might make to system properties and update its configuration. You have to restart it via an update operation at the console. Not really a "bug", but something to bear in mind.&lt;br /&gt;&lt;br /&gt;So there it is. I hope you find it useful.&lt;br /&gt;&lt;br /&gt;The more I work with OSGi, the more I appreciate it as a server environment. It incorporates internal pub/sub messaging, dynamic load/unload of modules, the ability to monitor changes within the environment itself, and a host of other things, not to mention a legitimate component model for Java.&lt;br /&gt;&lt;br /&gt;The next thing I plan to do is get a &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt; embedded database running on it. That should be handy.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7467213560484982180?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7467213560484982180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7467213560484982180' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7467213560484982180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7467213560484982180'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/09/osgi-bundle-deployer.html' title='OSGi Bundle Deployer'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8369684555436772365</id><published>2008-09-02T16:19:00.001-05:00</published><updated>2008-09-02T17:05:07.044-05:00</updated><title type='text'>Chrome</title><content type='html'>(No, not the shiny metal that comes on aftermarket Harley parts, or the idiotic &lt;a href="http://www.cowboylyrics.com/lyrics/adkins-trace/chrome-2580.html"&gt;Trace Adkins song&lt;/a&gt; that makes me want to stab myself in the ears with an icepick.)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm also not referring to the "chrome" that lurks in the belly of the Firefox web browser. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;"Chrome" is Google's new browser that they apparently developed either in total secret, or cranked out overnight between Labor Day and today. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm using it right now, on Windows. I haven't formed an educated opinion about it yet, but I'm not letting that stop me from posting something about it for the whole world to read. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's what I know in the 2 minutes I've used it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, it's fast. Firefox 3 was a noticeable improvement in browser speed over Firefox 2, which itself is many times faster (and better) than Internet Explorer. This is a big improvement over Firefox 3, even on this Windows box I'm using, which typically feels a little bit sluggish.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chrome runs each tab in a separate process. Right now, I have one Chrome browser running with 4 tabs open, and there's a separate chrome.exe process running for each tab. There's a couple of other ones too, and I figure they're probably just there because it's a Windows tradition to run extra stuff for the purpose of junking things up a bit. (Nice job, Google.) Google chose to run each tab in its own process to help prevent memory fragmentation, which results in eventual memory bloat when the browser has been running a long time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Most of the shortcut keys I'm familiar with in Firefox seem to work here. Except F11 for full-screen. In any case, the familiarity is a good thing, because there's no menu at the top of the Chrome window. I have no idea how I'm going to get into the preferences window and screw around with Chrome's settings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No, wait... scratch that. There's no menu, but there is a little picture of a wrench, which gets you to a bunch of settings. There's also a picture of a document, which for some reason is the entry point for a plethora of other things. These include a JavaScript console, a debugger, and a task manager so you can kill tabs that are running wild on your system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Google has published a &lt;a href="http://www.google.com/googlebooks/chrome/"&gt;whole document&lt;/a&gt; about the design of Chrome, with hand-drawn appearances by some of the industry's leading minds in browser design. Pretty informative, and it also reminds me of those Gospel tracts that &lt;a href="http://www.chick.com/"&gt;Chick Publications&lt;/a&gt; has been putting out for 40 years.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chrome features the ability to open an "incognito window" for anonymous web surfing. It deletes all cookies after an incognito session, and doesn't remember anything about what you've been doing (unless you download a file or something). This is analogous to a feature Microsoft is calling "Porn Mode" in its upcoming browser, IE8. Firefox doesn't have that feature, that I know of.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far, I'm impressed. It seems to be a pretty cool browser, for people who get excited about that kind of thing. &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8369684555436772365?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8369684555436772365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8369684555436772365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8369684555436772365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8369684555436772365'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/09/chrome.html' title='Chrome'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-3240738150055565701</id><published>2008-08-17T20:51:00.001-05:00</published><updated>2008-09-06T23:01:38.723-05:00</updated><title type='text'>A Tale of 2 Bucks</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nYlZRe4bfLk/SKjVvG3gVAI/AAAAAAAAAFE/QnfWynHGvPU/s1600-h/Photo-0083.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_nYlZRe4bfLk/SKjVvG3gVAI/AAAAAAAAAFE/QnfWynHGvPU/s320/Photo-0083.jpg" alt="" id="BLOGGER_PHOTO_ID_5235669572092187650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I spotted this pair of buck heads mounted on a wooden fixture today at the State Fair. The Ranger sitting beside the display said that the two bucks were found with their antlers locked together. They apparently got tangled up while they were fighting. When they were found, one was dead from starvation, and the other was almost dead. The Ranger said the antlers were so tangled up, they couldn't be pulled apart without breaking one or both of them. Kind of a tragedy, really.&lt;br /&gt;&lt;br /&gt;I'm no deer psychologist, but I'm guessing there were some regrets shortly after the impact shown above:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Buck A:&lt;/span&gt; Oops.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Buck B:&lt;/span&gt; Oh, nice job.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;I'm sure animals communicate with each other in their own way, so I'm really curious as to what these two talked about in the hours and days following their little misunderstanding. I'm guessing they probably struggled for a while to get apart, then cooperated trying to get a drink out of a creek, then eventually became pretty good friends.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-3240738150055565701?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/3240738150055565701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=3240738150055565701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3240738150055565701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/3240738150055565701'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/08/tale-of-2-bucks.html' title='A Tale of 2 Bucks'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nYlZRe4bfLk/SKjVvG3gVAI/AAAAAAAAAFE/QnfWynHGvPU/s72-c/Photo-0083.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-99087917933062668</id><published>2008-08-08T13:52:00.000-05:00</published><updated>2008-08-08T14:00:54.253-05:00</updated><title type='text'>SDDM: Qt event handling with Signals and Slots</title><content type='html'>This is the second installment in a series of posts on my pet project, &lt;a title="SDDM" target="_blank" href="http://fognl.blogspot.com/2008/08/sddm-series-intro.html" id="do0r"&gt;SDDM&lt;/a&gt;, coming soon to a Linux distro near you.&lt;br /&gt; &lt;br /&gt; I chose &lt;a title="Qt" href="http://doc.trolltech.com/3.0/index.html" id="o6my"&gt;Qt&lt;/a&gt; as the UI library I would use for SDDM, after reading about its features.&lt;br /&gt;&lt;br /&gt;Qt is kind of unique in that it's a pretty good C++ UI class library, but also features a "meta-object compiler" to allow things like runtime reflection, events, properties, and other features not supported natively by C++. It also includes a lot of non-UI things like XML parsing, URLs, filesystem access, container classes, in addition to a large set of UI elements. Custom controls are pretty easy to create as well.&lt;br /&gt;&lt;br /&gt;&lt;b id="u3l2"&gt;Events&lt;/b&gt;&lt;br /&gt;In any desktop UI library, you need the notion of "events" so that UI elements on a window can communicate their status to the parent window, where the application-level logic is written. For example, take a window with a button on it. What you need is some mechanism for a button (or any other control) to tell its parent window (in effect): "Hey, this thing just happened, take whatever action you need to." This is basic "observer pattern" stuff, and there's a variety of approaches used by the various UI environments.&lt;br /&gt;&lt;br /&gt;The "Java approach", used in AWT, Swing, and SWT, is to define interfaces for "listeners", which respond to events posted by controls. In effect, what you do is create a class that implements a specific "listener" interface, with the implementation providing the application-level event handling, for each event you need to intercept. As you might imagine, this adds up to a lot of classes, since a separate class is needed in most cases to handle every different event. However, Java provides a way to define anonymous inline classes. This makes it unnecessary to actually create a new class, decide on a name for it, and so on.Typically, the code you write to listen to an event from a control is pretty concise, looking something like this (fictional) example:&lt;br /&gt;&lt;br /&gt;&lt;span id="j2qv" style="font-family: Courier New;"&gt;myButton.addListener(new ButtonListener() {&lt;/span&gt;&lt;br /&gt;&lt;span id="j2qv0" style="font-family: Courier New;"&gt;    public void clicked(Event evt)&lt;/span&gt;&lt;br /&gt;&lt;span id="j2qv1" style="font-family: Courier New;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span id="j2qv2" style="font-family: Courier New;"&gt;        // process the click.&lt;/span&gt;&lt;br /&gt;&lt;span id="j2qv3" style="font-family: Courier New;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span id="j2qv4" style="font-family: Courier New;"&gt;});&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is still kind of messy, but much cleaner than having to write a discrete class for each case where you need to handle an event from a control. &lt;br /&gt;&lt;br /&gt;Languages like VB and Delphi are tailor-made for desktop UI programming, and incorporate the notion of "events" right into the language. Delphi's approach involves assigning function addresses to event pointers on controls, so the controls can call the functions directly to communicate their status. This is probably the most efficient approach of all, since there's no intermediate layer between the control and the function it's calling. &lt;br /&gt;&lt;br /&gt;VB's approach, I don't really care about. Last time I used VB, it achieved events through some "mystery meat" process involving COM and OLE, which probably resembles the manufacture of sausage. It wasn't nearly as flexible as Delphi's approach. Delphi allows one event-handling function to be assigned to potentially many event-handler pointers in one or more controls, whereas VB didn't. In my experience, it (like VB itself) was minimally useful at best.&lt;br /&gt;&lt;br /&gt;In the case of C++, none of these approaches is practical. C++ doesn't allow the inline definition of an anonymous class like Java does, so if you take the Java approach to events with listeners and the like, you end up with lots of little single-purpose classes lying around. You can adopt the function-pointer approach that Delphi uses, but it gets messy pretty quickly too. One problem is the fact that C++ member functions don't actually have an address that you can assign to a pointer. Actually, they do, but in order to take a member function's address, you have to include the name of the class in the address, using this syntax:&lt;br /&gt;&lt;br /&gt;&lt;span id="g1ur" style="font-family: Courier New;"&gt;// simple class with a function to point to&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur0" style="font-family: Courier New;"&gt;struct someClass {&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur1" style="font-family: Courier New;"&gt;    int f(int a, int b) { return a+b; }&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur2" style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="g1ur3" style="font-family: Courier New;"&gt;someClass inst;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="g1ur4" style="font-family: Courier New;"&gt;// take the address&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur5" style="font-family: Courier New;"&gt;int (someClass::*func)(int,int) = &amp;amp;someClass::f;&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur6" style="font-family: Courier New;"&gt;// call the function through the pointer&lt;/span&gt;&lt;br /&gt;&lt;span id="g1ur7" style="font-family: Courier New;"&gt;int result = (inst.*func(3,4));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Straightforward enough I guess, but notice how the name of the class has to be included in the pointer declaration. The pointer named "func" isn't just a pointer to a function, it's a &lt;i id="n7fl"&gt;pointer to a function in someClass&lt;/i&gt;. An important distinction. In an application with a UI, it's a pointer to a function in your application's parent (window/dialog/widget) class. Which means a reference to the parent widget class has to appear in the class of the control you're listening for events on. This is something you definitely don't want in a reusable component.&lt;br /&gt;&lt;br /&gt;There might be some kind of macro-based voodoo you could perform to get around this limitation. It would work fine I'm sure, except for the "macro-based voodoo" part. I can't think of how it would work, in any case.&lt;br /&gt;&lt;br /&gt;That leaves templates. Essentially, you define the control as a template class, with the type parameter referring to your application-level class the control will call through function pointers.&lt;br /&gt;&lt;br /&gt;This definitely works, but also adds a lot of bulk to an application. Consider a button class like this:&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv" style="font-family: Courier New;"&gt;template &lt;class&gt; MyButton: public BaseWidget&lt;t&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv0" style="font-family: Courier New;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv1" style="font-family: Courier New;"&gt;    // function pointer&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv2" style="font-family: Courier New;"&gt;    void (T::*clickFunction)(const MyButton&lt;t&gt;*);&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv3" style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consider a nominal-sized application with, say, 30 classes representing various kinds of parent widgets in it, doing this sort of thing:&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv4" style="font-family: Courier New;"&gt;class MyWindow: public Window {&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv5" style="font-family: Courier New;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv6" style="font-family: Courier New;"&gt;    MyButton&lt;mywindow&gt; okButton;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv7" style="font-family: Courier New;"&gt;    MyWindow(const char *caption): Window(caption)&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv8" style="font-family: Courier New;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv9" style="font-family: Courier New;"&gt;        // Assign the "click" event to our handler&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv10" style="font-family: Courier New;"&gt;        okButton.clickFunction = &amp;amp;MyWindow::okButtonClicked;&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv11" style="font-family: Courier New;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="dzqv12" style="font-family: Courier New;"&gt;    void okButtonClicked(const MyButton&lt;mywindow&gt; *button)&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv13" style="font-family: Courier New;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv14" style="font-family: Courier New;"&gt;        // handle button click&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv15" style="font-family: Courier New;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span id="dzqv16" style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The compiler generates a separate class for each different window class which uses the MyButton template class. In the example above, you get a "MyButton_MyWindow" class (or a class with some similarly-mangled name), and 29 or so others, one for each class that makes use of the button. Follow that example for every other kind of control you can have, and you get the idea.&lt;br /&gt;&lt;br /&gt;In case you somehow didn't get the idea, it's this: You end up with Mt. Everest-sized executables. See &lt;a title="Visual Be++" href="http://www.bebits.com/app/369" id="x2vu"&gt;Visual Be++&lt;/a&gt; for an example of this approach. In that GUI designer's host environment, you can create an application the "native" way with a couple of buttons and some edit controls, and the finished executable will be around 20kB in size. Use Visual Be++'s templated-based UI library (which adds events, properties, and some other Delphi-isms) for the same application, and you end up with an executable about 240kB in size.&lt;br /&gt;&lt;br /&gt;Put simply, C++ doesn't support a convenient way for controls on windows to notify their parent windows of something. To do this sort of thing without using an old-skool Windows-style window procedure (driving yourself nuts in the process) or any of the approaches noted above, you almost have to resort to some sort of language augmentation and specialized tool set.&lt;br /&gt;&lt;br /&gt;That is exactly what Qt does. Qt's approach to the problem falls deeply into the "mystery meat" zone. Trust me, there is a &lt;i id="nkkr"&gt;lot&lt;/i&gt; of sausage manufactured here. It involves a combination of specialized tools (the aforementioned "meta-object compiler" and &lt;b id="lveb"&gt;qmake&lt;/b&gt;), and some Qt-centric quasi-keywords.&lt;br /&gt;&lt;br /&gt;I'm not generally a fan of language augmentation. It ties you to a specific tool set, I'm also not crazy about specialized tools being required for a build, since it limits support for a certain type of program by available build tools.&lt;br /&gt;&lt;br /&gt;But, hey, so what? If I stopped with that, this would be a short and pointless blog entry where I did nothing but gripe about the suckiness of C++'s support for UI events. Qt has a lot of features I want to use. The tool set, though specialized, is easy to use. The benefit I get from Qt far outweighs the annoyance of having to stick with a specific tool chain. The "sausage" in this case is tasty enough that I'm willing to overlook the manufacturing process and keep my mind off of what (or who) might have fallen into the sausage press.&lt;br /&gt;&lt;br /&gt;&lt;b id="yl1-0"&gt;Signals and Slots&lt;/b&gt;&lt;br /&gt;The Qt Meta layer adds the notion of "signals" and "slots". A "signal" is something emitted by an object to whoever might be listening. A "slot" is something employed to listen for signals. So, for example, a button emits a "clicked" signal, and a dialog box with a button on it can define a slot to capture that signal.&lt;br /&gt;&lt;br /&gt;Here is a simple Qt control class declaration, showing the additional Qt keywords and macros in use:&lt;br /&gt;&lt;br /&gt;&lt;span id="kmc1" style="font-family: Courier New;"&gt;class SomeWidget: public QWidget&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc10" style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc11" style="font-family: Courier New;"&gt;    &lt;b id="kmc12"&gt;Q_OBJECT&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="kmc13" style="font-family: Courier New;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc14" style="font-family: Courier New;"&gt;    SomeWidget(QWidget * parent = 0, const char *name = 0);&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc15" style="font-family: Courier New;"&gt;    virtual ~SomeWidget();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="kmc16" style="font-family: Courier New;"&gt;    // Respond to a Qt mouse event.&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc17" style="font-family: Courier New;"&gt;    virtual void mouseEvent(QMouseEvent *evt);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b id="kmc18"&gt;&lt;span id="kmc19" style="font-family: Courier New;"&gt;signals:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span id="kmc110" style="font-family: Courier New;"&gt;    void clicked(int);&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc111" style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the implementation, you "emit" an event signal when something of interest takes place:&lt;br /&gt;&lt;br /&gt;&lt;span id="kmc112" style="font-family: Courier New;"&gt;void SomeWidget::mouseEvent(QMouseEvent *evt)&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc113" style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc114" style="font-family: Courier New;"&gt;    // blah blah, decide whether to emit a "clicked&lt;/span&gt;" event, because the user clicked in this control's client area.&lt;br /&gt;&lt;br /&gt;&lt;span id="kmc115" style="font-family: Courier New;"&gt;    // This is basically it. The keyword "emit", followed by a function call.&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc116" style="font-family: Courier New;"&gt;    &lt;b id="kmc117"&gt;emit&lt;/b&gt; clicked();&lt;/span&gt;&lt;br /&gt;&lt;span id="kmc118" style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b id="kmc119"&gt;Q_OBJECT&lt;/b&gt; macro marks the widget as something the MOC (meta-object compiler) should generate extra MOC code for. You'll find the extra MOC code in your project directory as .cpp files with names beginning with "moc_". One of these files is generated for each C++ translation unit where the Q_OBJECT macro is used. (Take a look in there. There's a sausage press, a large cage full of frightened-looking cats, and a crew of sweaty men in stovepipe hats, furiously smelting.)&lt;br /&gt;&lt;br /&gt;A parent widget with the SomeWidget control on it would be defined something like this:&lt;br /&gt;&lt;br /&gt;&lt;span id="dv4b" style="font-family: Courier New;"&gt;class ParentWidget: public QWidget {&lt;/span&gt;&lt;br /&gt;     &lt;b style="font-family: Courier New;" id="qewp0"&gt;Q_OBJECT&lt;/b&gt;&lt;br /&gt;&lt;span id="dv4b0" style="font-family: Courier New;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b1" style="font-family: Courier New;"&gt;    ParentWidget(QWidget * parent);&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b2" style="font-family: Courier New;"&gt;    ...&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b3" style="font-family: Courier New;"&gt;private:&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b4" style="font-family: Courier New;"&gt;    SomeWidget *someWidget;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="dv4b5" style="font-family: Courier New;"&gt;private &lt;b id="mgst"&gt;slots&lt;/b&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b6" style="font-family: Courier New;"&gt;    void someWidgetClicked();&lt;/span&gt;&lt;br /&gt;&lt;span id="dv4b7" style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b id="zth0"&gt;slots&lt;/b&gt; Qt-keyword indicates that the methods below are intended to be called by controls emitting events with the &lt;b id="y3t_"&gt;emit&lt;/b&gt; Qt-keyword.&lt;br /&gt;&lt;br /&gt;In the constructor, you another quasi-keyword, &lt;b id="oxfv"&gt;connect&lt;/b&gt;, to join the signals emitted by various controls to handlers in the parent widget.&lt;br /&gt;&lt;br /&gt;&lt;span id="ywbz" style="font-family: Courier New;"&gt;ParentWidget::ParentWidget(QWidget *parent): QWidget(parent)&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz0" style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz1" style="font-family: Courier New;"&gt;    // initialize someWidget&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz2" style="font-family: Courier New;"&gt;    this-&gt;someWidget = new SomeWidget(this);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="ywbz3" style="font-family: Courier New;"&gt;    // connect someWidget's clicked signal to our slot&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz4" style="font-family: Courier New;"&gt;    &lt;b id="j7y4"&gt;connect&lt;/b&gt;(someWidget, SIGNAL(clicked()), this, SLOT(someWidgetClicked()));&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz5" style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="ywbz6" style="font-family: Courier New;"&gt;// This gets called whenever someWidget emits a clicked() event.&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz7" style="font-family: Courier New;"&gt;void ParentWidget::someWidgetClicked()&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz8" style="font-family: Courier New;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span id="ywbz9" style="font-family: Courier New;"&gt;&lt;/span&gt;    // someWidget was clicked&lt;br /&gt;&lt;span id="ywbz10" style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And that's basically it. It's pretty clean, and probably more convenient than the approach used by any UI library I've used to date. &lt;br /&gt;&lt;br /&gt;&lt;b id="rego"&gt;Next up:&lt;/b&gt; Custom controls in Qt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-99087917933062668?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/99087917933062668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=99087917933062668' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/99087917933062668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/99087917933062668'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/08/sddm-qt-event-handling-with-signals-and.html' title='SDDM: Qt event handling with Signals and Slots'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2355481599332696231</id><published>2008-08-05T14:28:00.000-05:00</published><updated>2008-08-05T15:07:28.064-05:00</updated><title type='text'>SDDM Series Intro</title><content type='html'>I have been following a series of articles on &lt;a href="http://byteworksinc.blogspot.com/"&gt;Steve Mitchell's blog&lt;/a&gt; about using Amazon EC2, and found the information there useful. Deploying something to the "cloud" is something I've been interested in doing for a while. Steve's articles go into considerable detail about the nuts and bolts of the process, which eliminates that part of the mystery for me.&lt;br /&gt;&lt;br /&gt;After reading Steve's entries, I got to thinking about using my own blog for articles more useful than my norm, which consists largely of making fun of crappy movies or displaying pictures of cute dogs. I guess there's no harm in inflicting my writing on people for a useful cause, so I'm inspired to write a series now, too. Some of the information in this post would have been useful when I was looking for it, so why not?&lt;br /&gt;&lt;br /&gt;I'm going to write one about a project I've been working on at home lately, for my home project studio. It's interesting enough to keep me, well, interested, and who knows, maybe someone else will find it interesting too.&lt;br /&gt;&lt;br /&gt;I guess after that, I'll return to my regularly-scheduled programming with a nice picture of some kittens.&lt;br /&gt;&lt;br /&gt;Anyway, the project I'll write about involves an application called SDDM. It's a MIDI-triggered sample player for Linux. The difference between it and the several other MIDI-triggered sample players out there (there doesn't appear to be many) is that this one is designed to meet the following criteria:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Allow the arbitrary mapping of MIDI note numbers to "instruments", and MIDI velocity ranges to individual samples.&lt;/li&gt;&lt;li&gt;Allow completely arbitrary definition of sample sets, with no limits on the number of samples assigned to instruments.&lt;/li&gt;&lt;li&gt;Be able to play samples at least as fast as incoming MIDI messages appear, with no audible latency.&lt;/li&gt;&lt;li&gt;Allow for the playback of one instrument to cancel the playback of an arbitrary set of other instruments.&lt;/li&gt;&lt;li&gt;Allow for the arbitrary definition of "sub mixes", so a single sample set can play back on any arbitrary set of ports, and be recorded in the same manner as a multiplicity of "real" instruments (e.g. a drumset with the snare on one track, kick on another, cymbals on another).&lt;/li&gt;&lt;li&gt;Present itself as a normal "Jack" client, so other audio applications can interact with it through the Jack service (for those of you who don't know, &lt;a href="http://jackaudio.org/"&gt;Jack&lt;/a&gt; is sort of "SOA for audio").&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Speed&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;A primary concern for SDDM was speed. Above all else, it has to be fast, because my primary use for this is to play back hi-resolution samples of a real drum set recorded in a studio, including ghost notes, fast rolls, double-bass work, etc, in addition to playing multiple samples at the same time. The effect on a complete recording is a set of MIDI-triggered drums, with a sound indistinguishable from real drums.&lt;br /&gt;&lt;p&gt;With those goals in mind, SDDM is written as a native Linux application in C++.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Object Model&lt;/h3&gt;SDDM's object model is pretty simple.&lt;br /&gt;&lt;br /&gt;For the Drumkit itself, there's a &lt;code&gt;Drumkit&lt;/code&gt; class, which maintains a mapping of MIDI note numbers to &lt;code&gt;Instrument&lt;/code&gt;s. An &lt;code&gt;Instrument&lt;/code&gt; maintains a mapping of velocity ranges (e.g. 0-15, 16-32, 33-55, etc.) to a set of &lt;code&gt;Layer&lt;/code&gt;s. A &lt;code&gt;Layer&lt;/code&gt; maintains a reference to a &lt;code&gt;Sample&lt;/code&gt;, which contains a buffer for the actual sample data loaded from .wav files on disk. There's more to it than that (sub mixes, etc.), but that's the general layout.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;In addition to that, a MIDI driver and an Audio driver class are needed. I defined these as abstract classes, with a starter set of implementations (&lt;code&gt;AlsaMidiDriver&lt;/code&gt; and &lt;code&gt;JackAudioDriver&lt;/code&gt;, respectively).&lt;br /&gt;&lt;p&gt;These implementations each start their own threads and register themselves as clients of the ALSA MIDI subsystem and the Jack audio subsystem. These communicate to the application through a set of listener interfaces (abstract classes in C++), &lt;code&gt;IMIDIListener&lt;/code&gt; and &lt;code&gt;IAudioListener&lt;/code&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Finally, there is the &lt;code&gt;SDDM&lt;/code&gt; class, which implements both of the interfaces and handles the details of processing incoming MIDI notes and playing the samples associated with them. The SDDM class fills the role of both "midi client" and "audio client".&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Note Queue&lt;/h3&gt;Shared between the driver threads is an STL queue called "playingNotes", which maintains a list of the &lt;code&gt;Note&lt;/code&gt; objects representing individual sample instances to be played.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When the MIDI client receives a MIDI note-on message, it looks up the Instrument in the active &lt;code&gt;Drumkit&lt;/code&gt; object with a matching note number, and finds the &lt;code&gt;Layer&lt;/code&gt; in the found Instrument (if any) with a velocity range which includes the velocity of the played note. It extracts the sample data from the Layer's sample, and creates a Note object. It locks the playingNotes queue, and inserts the Note.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Audio client thread gets a periodic callback from the Jack subsystem. The Jack callback function takes a list of buffers (pointers to floating-point numbers), and a number of "frames" to fill. The audio client's reponsibility is to take all of the current sample data and fill the supplied buffers for the specified number of frames. It is VITAL that this process proceed as quickly as possible. Any delays in this loop are audible as a stuttering sound. Since Jack's callback into the application is synchronous, a delay in any application slows not only the application's&lt;br /&gt;performance, but the whole collection of applications connected to Jack as well. If you want your application to become very unpopular Jack and its friends, print something to stdout for each iteration of your buffer-processing loop. :-)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The SDDM audio client locks down the playingNotes queue, extracts all of the Notes and loops through them (most-recently-played first), mixing all of them, altering their volume, pan, and pitch as it goes. As it plays the samples, it tracks the position of the individual samples so it can later decide when to remove them from the queue and delete them. (It performs this operation right after playing the samples.)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Mixing Audio&lt;/h3&gt;The process of mixing audio was, to me, a complete mystery when I started playing with this idea. I had no idea how to do it, but it turns out to be pretty intuitive. A sample buffer (at least in this system) is a pointer to floating-point data, so to mix two samples together and put them in the buffer, you add the two samples' values together, and store them in the buffer. Something like this:&lt;br /&gt;&lt;pre&gt;*audioL++ = (sample1 + sample2);&lt;br /&gt;&lt;/pre&gt;Simple!&lt;br /&gt;&lt;h3&gt;Controlling Volume and Pan&lt;/h3&gt;This also turns out to be pretty simple. You control a sample's volume by multiplying its value by a number from 0 (silent) to 1 (full volume). So 70% would be 0.7. If you want to "amplify" a sample, just multiply it by a value greater than 1. You can increase the volume of a sound in this way up until the point where the loudest sample in the sound exceeds 0dB, at which point the sample will be truncated. One of these is not noticeable, but too many of these results in a "zipping" sound coming from the speakers.&lt;br /&gt;&lt;p&gt;Since all of the samples are stereo (and if they're not, you simulate it by copying a mono sample's data into both channels), you have to perform the volume-control operation on the "left" and "right" buffers. So you control the pan as expected, by multiplying left and right's value by a number as above, whose value is determined by the pan setting for the instrument:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;short pan = note-&gt;getInstrument()-&gt;getPan(); // A value between -100 and 100&lt;br /&gt;&lt;br /&gt;volumeR += pan;&lt;br /&gt;volumeL -= pan;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;Controlling Pitch&lt;/h3&gt;Pitch control is almost as simple as level and pan. You control pitch by controlling how "fast" you step through a set of samples. Suppose you have 1024 frames you need to play. If you want to play them at their pre-defined speed, you just step through, frame by frame, and perform the operations as shown above. To play at higher-than-normal pitch, you skip some of the frames. Lower-pitch playback involves playing the same frame two or more times before moving onto the next one.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;Note&lt;/code&gt; class in SDDM has a &lt;code&gt;samplePosition&lt;/code&gt; member that's updated by the audio client as it's playing the samples. This is just a floating-point number, and the audio client's processing loop factors in the defined pitch of the Instrument it's playing, and increments the sample-position counter accordingly. So the pitch-control logic amounts to this:&lt;br /&gt;&lt;pre&gt;float step = 1.0f + (((float)note-&gt;getInstrument()-&gt;getPitch()) / 100);&lt;br /&gt;&lt;br /&gt;// populate the main buffers, etc.&lt;br /&gt;&lt;br /&gt;note-&gt;samplePosition += step;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;The End Result&lt;/h3&gt;The initial iteration of SDDM worked better than I imagined it would. As I mentioned, my primary concern was speed. I wrote it as a stripped-down Formula1-style app, as fast as I knew how to make it. It appears to have worked. On a worn-out old Pentium 4 running Ubuntu with the Gnome interface, SDDM keeps up without any hiccups while playing 20-25 tracks in &lt;a href="http://ardour.org/"&gt;Ardour&lt;/a&gt;, with the CPU running at about 60%. Beyond that, it starts to show timing problems. The effect of this is a "jerkiness" to the sound of the performance, like a drummer who keeps dropping his/her sticks. On a more realistic machine (dual-core 2.7Ghz Pentium), it does fine while playing back around 60 tracks, with the CPU showing about 10% load.&lt;br /&gt;&lt;br /&gt;SDDM is definitely not a "real time" application. It pre-loads all of the audio files it plays, and keeps dynamic memory allocation to an absolute minimum while the audio engine is processing, but there are still processes going on that aren't guaranteed to happen within a certain time. I'll address this at some point, but it's not a high priority at this point. If they're affecting the application's performance, I can't hear it.&lt;br /&gt;&lt;h3&gt;Future&lt;/h3&gt;There is a lot to do to SDDM. I'm already working on a user interface for it, and I plan to add support for sample-rate conversion (load a 48kHZ sample on a system running at 96kHZ, get playback at the right speed), as well as support for other audio formats in addition to .wav (ogg, mp3, flac, and so on). I'll most likely do this using gstreamer or similar. I'll also open-source it. It should be fun.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Next up&lt;/h3&gt;Writing a UI in Qt for SDDM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2355481599332696231?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2355481599332696231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2355481599332696231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2355481599332696231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2355481599332696231'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/08/sddm-series-intro.html' title='SDDM Series Intro'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6912268781089152519</id><published>2008-06-09T10:52:00.003-05:00</published><updated>2008-09-09T13:05:03.449-05:00</updated><title type='text'>Friendly dog face</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_nYlZRe4bfLk/SE1R2UuFHtI/AAAAAAAAAE8/eVHVrQOI8XQ/s1600-h/eddie.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp1.blogger.com/_nYlZRe4bfLk/SE1R2UuFHtI/AAAAAAAAAE8/eVHVrQOI8XQ/s320/eddie.jpg" alt="" id="BLOGGER_PHOTO_ID_5209910337654300370" border="0" /&gt;&lt;/a&gt;This little guy was sitting on the couch at a friend's house the other day, watching me play a guitar. He has the friendliest face I've seen on a dog. I think he's actually smiling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6912268781089152519?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6912268781089152519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6912268781089152519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6912268781089152519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6912268781089152519'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/06/friendly-dog-face.html' title='Friendly dog face'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_nYlZRe4bfLk/SE1R2UuFHtI/AAAAAAAAAE8/eVHVrQOI8XQ/s72-c/eddie.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-2946853512241470050</id><published>2008-05-14T16:12:00.000-05:00</published><updated>2008-05-14T16:22:48.346-05:00</updated><title type='text'>It's good to be king</title><content type='html'>Sometimes I think I must be quite a powerful force in the universe. It seems I have some kind of general control over the direction of everything, without even trying.&lt;br /&gt;&lt;br /&gt;For example, I have worn shorts the last 3 Fridays. On each of those days, the temperature dropped to somewhere near 40 degrees and the sun went behind clouds the second I put them on and went outside, even though the weather had been sunny and nice just before then.&lt;br /&gt;&lt;br /&gt;I once put a set of black wheels on my car, thinking they would look cool. Within 3 days of my doing so, I noticed that about every 3rd car on the road had the same thing, even though I only know of one car maker (Porsche) who offers black wheels. Most of them are aftermarket wheels. Which means that once I made my decision, millions of other people felt compelled to go out and do the same thing. I doubt they did it to try and emulate me, but I think some voice from outer space appeared in their heads one day and said "You know, today would be a great day to put some black wheels on your car." I think the voice may have said it to me before it mentioned anything to anyone else.&lt;br /&gt;&lt;br /&gt;The latest thing? OSGi. It's a standard that has been around in some form or another since about 1995, and no one has ever heard of it. Eclipse is an OSGi environment, and all of the plug-ins on which it's based are OSGi bundles. But they don't really refer to them as OSGi bundles, so if you'd never heard of the spec, you'd probably gloss over the passing mention OSGi gets in the Eclipse developer documentation and never notice it.&lt;br /&gt;&lt;br /&gt;But I recently became interested in OSGi for a project. I read up on the spec, built a couple of small bundles, and got pretty interested in the whole idea of a dynamic environment with components that start, stop, install, upgrade, uninstall, etc. without ever stopping the environment. Cool.&lt;br /&gt;&lt;br /&gt;Well, guess what? Suddenly, SpringSource has released a whole &lt;span style="font-style: italic;"&gt;application server&lt;/span&gt; based on OSGi. Jetty, the open-source web server, is available as an OSGi bundl. And every 3rd developer article I read on the whole internet is about OSGi. The world has forgotten Ruby on Rails, and is apparently now in love with OSGi. Every thing is "Build an OSGi bundle this, Equinox that".&lt;br /&gt;&lt;br /&gt;Why? Me, of course. I don't know how SpringSource was able to build a complete OSGi-based application server in the short time I've had an interest in OSGi, but somehow they've done it. Kudos to you, SpringSource.&lt;br /&gt;&lt;br /&gt;So if you find yourself wondering who to blame (or thank) for the general direction the world seems to be taking, I'm pretty sure it's me. Sorry about that. Or, you're welcome, depending on how things are going for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-2946853512241470050?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/2946853512241470050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=2946853512241470050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2946853512241470050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/2946853512241470050'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/05/sometimes-i-think-i-must-be-quite.html' title='It&apos;s good to be king'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-4621193921094067568</id><published>2008-04-15T13:53:00.000-05:00</published><updated>2008-04-15T13:57:35.109-05:00</updated><title type='text'>Blue Jeans Cable</title><content type='html'>&lt;a href="http://monstercable.com/" target="_blank"&gt;Monster Cable&lt;/a&gt;, long-time purveyors of overpriced gold-plated guitar cords, has a history of bringing lawsuits against smaller operators in an apparent attempt to intimidate them. Their recent cease-and-desist letter to a company named &lt;a href="http://bluejeanscable.com/" target="_blank"&gt;Blue Jeans Cable&lt;/a&gt; over some alleged patent infringements, is an example.&lt;br /&gt;&lt;br /&gt;But what's interesting about this instance is that Blue Jeans Cable is run by a former lawyer with lots of litigation experience. In response to Monster's letter, which featured several allegations of patent infringements, he wrote &lt;a href="http://www.audioholics.com/news/industry-news/blue-jeans-strikes-back" target="_blank"&gt;this letter&lt;/a&gt;. The word "pwned" comes to mind when I read this. Awesome.&lt;br /&gt;&lt;br /&gt;If I ever find myself in need of a high-priced cord of any kind, I'm going to do my best to buy it from Blue Jeans Cable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-4621193921094067568?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/4621193921094067568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=4621193921094067568' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4621193921094067568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/4621193921094067568'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/04/blue-jeans-cable.html' title='Blue Jeans Cable'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8097547903209652203</id><published>2008-04-03T16:08:00.000-05:00</published><updated>2008-04-03T16:09:27.065-05:00</updated><title type='text'>Cops on the road</title><content type='html'>My morning commute is approximately 32 miles. (Oddly, my evening commute is exactly the same.) The first part of the trip in the morning involves driving down Highway 71, a recently-refinished curvy 4-lane highway with light traffic. That part of the drive is typically uneventful.&lt;br /&gt;&lt;br /&gt;Yesterday, I took the usual entrance ramp onto the highway. At the next exit, a Sheriff's car entered the highway. I settled into the right lane with my cruise control set to the speed limit. The Sheriff moved to the right lane and set his speed to match mine, plus approximately 0.0000000004 mph. Over the course of 15 miles, he slowly crept up on me, until he was right in my blind spot. Here we are on a big, wide-open highway, very little traffic other than us, and&lt;br /&gt;he chooses to park his car 3 feet from my left rear fender. I slowed down slightly to give him a chance to pass, and he did. As he went past, I noticed that he was busy using the "cop laptop" mounted on his dashboard for something. He was splitting his attention between his driving task and some kind of important thing he was doing on his computer.&lt;br /&gt;&lt;br /&gt;I'm not sure, but I think that kind of thing is illegal for everyone else. I'm pretty sure I would get a ticket for driving like a dipstick and using a computer when I was supposed to be watching the road. I wonder if it's illegal for cops. I also wonder what he was doing on that computer. He wasn't laughing, so he probably wasn't watching videos on YouTube or something. My guess: He was using Twitter, letting all of his "buds" and fellow cops know what he was doing moment to moment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8097547903209652203?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8097547903209652203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8097547903209652203' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8097547903209652203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8097547903209652203'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/04/cops-on-road.html' title='Cops on the road'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1759154541668348029</id><published>2008-02-19T13:24:00.003-06:00</published><updated>2008-09-09T10:57:04.791-05:00</updated><title type='text'>What in the world?</title><content type='html'>&lt;a href="http://msdn.microsoft.com/events/hero/sfbio/"&gt;Here&lt;/a&gt; is a link to maybe the stupidest web page ever seen.&lt;br /&gt;&lt;br /&gt;If you're too lazy or disinterested to click on the link, here's what it is:&lt;br /&gt;A playset containing action figures from Microsoft, representing various Microsoft products or product suites. There's an action figure called "Office Master", a vaguely oriental-looking bearded guy with a ponytail in a bathrobe, with the MS Office logo on his stomach. There's a "Windows Vista Sensei", a blond/gloved Steven Segall action figure wearing pajamas with the Windows Vista flag on his stomach. There's SQL Server Gal, another vaguely-oriental figurine in night-time clothes. Each figure is accompanied by a bio, telling what kind of food they like to eat, what kind of humanitarian efforts they've been involved in, and how they fight the evil in the world.&lt;br /&gt;&lt;br /&gt;I think the bios themselves are the worst. Read the one for "Virtual Labs Guy". He has wheels for feet, see? He likes cars. He likes them so much, in fact, that his favorite band is "The Cars", and his favorite song is "Drive" by The Cars.&lt;br /&gt;&lt;br /&gt;You can apparently collect the figurines, as indicated by a link at the top of the page. I didn't click the link to find out what I have to do to get them, because A) &lt;span&gt;I don't want them&lt;/span&gt;&lt;span style="font-style: italic;"&gt;,&lt;/span&gt; and B) if I did, I would probably have to buy something from MS to get them.&lt;br /&gt;&lt;br /&gt;The figurines are lame I guess, but it's this page that talks about them that puts it over the top. It's just so... &lt;span style="font-style: italic;"&gt;dumb&lt;/span&gt;. Who is this supposed to appeal to?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kids?&lt;/span&gt; I have two kids. One is 12, and the other is 5. Both of them would think these figurines were dumb, and give them to the dog to play with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dogs?&lt;/span&gt; Perhaps. I think my dog might sincerely enjoy chewing up these figurines, but only because he sincerely enjoys chewing up all things. Maybe that's it. Microsoft's target audience is dogs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Grown-ups?&lt;/span&gt; I don't know a single adult who would look at these and think "Oh  look! A cute promotional gimmick. I've got to buy SQL Server &lt;span style="font-style: italic;"&gt;right now!&lt;/span&gt;" Surely there's no hope that someone would be compelled to spend money on something because of these things.&lt;br /&gt;&lt;br /&gt;Remember the Christmas movie that featured the Abominable Snowman, Rudolph, and the elf that wanted to be a dentist? In the movie, they all go to the island of misfit toys and talk to a train with square wheels, a doll with a hog's face, and a boat with bulldozer tracks. Well, what they didn't talk about in the movie is that in the "Misfit Toys Island" universe, Bulldozer Boat and co. are actually the cool toys. They're weird, but likable and unique, with their square wheels, bulldozer tracks, and shrieking voices. People remember them.&lt;br /&gt;&lt;br /&gt;The movie doesn't tell you about the toys on the other side of the island. That's where the Happy Meal toys live. The Happy Meal toys are not unique, and no one remembers them. Even if people wanted to, they couldn't. They serve no function, they're not well-made, and sometimes they don't even manage to depict objects that make sense. (I saw a Happy Meal once where the toy was a little plastic tree stump.) They also smell a little like toxic fumes. They don't really have much of a reason to exist, except to add weight to a box of food at McDonald's and give my daughter a reason to say that McDonald's is a great place to eat (okay, maybe they do have a point).&lt;br /&gt;&lt;br /&gt;Now imagine that this bunch of figurines from Microsoft shows up on Misfit island in their oriental pajamas, to tout their MS Certifications and set up a SharePoint server. I think the poor Happy Meal toys would come out of the shadows, and beat up and ostracize the MS figurines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1759154541668348029?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1759154541668348029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1759154541668348029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1759154541668348029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1759154541668348029'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/02/what-in-world.html' title='What in the world?'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1466059364814092327</id><published>2008-01-19T01:04:00.002-06:00</published><updated>2008-09-09T11:04:23.062-05:00</updated><title type='text'>Cloverfield</title><content type='html'>Just got back a while ago from seeing &lt;span style="font-style: italic;"&gt;Cloverfield&lt;/span&gt;, the hugely hyped monster movie from JJ Abrams that came out today.&lt;br /&gt;&lt;br /&gt;The basic plot is this: A bunch of people are at a party in New York city, and something roars in the distance. Whatever it is, it's big. It roars so loud that it breaks windows, and people soil themselves. Then the creature starts throwing things, and things get totally out of hand.&lt;br /&gt;&lt;br /&gt;These kind of movies are supposed to be kind of a roller-coaster ride I think, but most of them seem to fall kind of flat. The whole movie is filmed with a handheld camera, from the point of view of someone with a camcorder: One of the people who is about to get stomped by the monster. So there's a lot of wild camera swinging, and it makes you a bit dizzy. Kind of like a roller-coaster ride, I guess...&lt;br /&gt;&lt;br /&gt;But it turned out to be a pretty good movie. The movie is from the point of view of a small group of people just trying to get away from a walking doomsday machine covered in man-eating lice. There's no music, no narration, and there's just enough character development to make it feel like you'd just met some Hugo Boss models at a party when all hell broke loose and you all had to go home. There's no sort of tie-in with anything, no attempt to explain where such a monster might have come from, etc. It's just as it would be if you were part of the small group of people trying to avoid being killed. The camcorder point of view works pretty well in this context. There are even some points in the movie where the camcorder itself is used to good effect. In one part, the guy using the camcorder gets smashed to death by the monster, and you see the scene from his point of view. So, basically, "sky-ground-sky-ground-Uh!-squish-ground-sky-Uh!". Then the camcorder ends up lying in the grass looking at the dead former camera operator. Everything goes quiet, and the camcorder sits there in auto-focus, trying to decide whether to look at the grass in front of its lens, or the dead guy 2 feet away. You hear nothing but the "bzzt-bzzt-bzzt" of the focusing apparatus in the camera.&lt;br /&gt;&lt;br /&gt;The monster is pretty impressive too. It's kind of like a new version of Godzilla: Big, weird, gross, and crazy.&lt;br /&gt;&lt;br /&gt;Seems like it's going to be successful to warrant the obligatory sequel, but I'm not sure how they would pull that off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1466059364814092327?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1466059364814092327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1466059364814092327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1466059364814092327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1466059364814092327'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2008/01/cloverfield.html' title='Cloverfield'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6353353122493336533</id><published>2007-11-08T17:07:00.000-06:00</published><updated>2007-11-08T17:22:31.275-06:00</updated><title type='text'>Yahoo Answers</title><content type='html'>Ever messed around with Yahoo Answers? Instead of just searching for text on the web, you can ask an actual question, and other people answer it. Kind of a neat idea, and not exactly unique.&lt;br /&gt;Google had an Answers site, but mothballed it. There's a site called "cha cha" that features a Google-like search page, with an extra button: Search with Guide. Clicking that button goes beyond the realm of search engines and into the realm of human expertise.&lt;br /&gt;&lt;br /&gt;Anyway, I got bored a little while ago, so I went out and messed around on Yahoo Answers. I think I see why Google mothballed their Answers site. Here's a sampling of some of the questions on Yahoo Answers (bearing in mind that the point of an "answers" site is so people can help you with questions you may have about various things):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Human Rights! What does it mean to you?&lt;/li&gt;&lt;li&gt;Could it be true?&lt;/li&gt;&lt;li&gt;What's the deal?&lt;/li&gt;&lt;li&gt;Help!&lt;/li&gt;&lt;li&gt;Why you be hatin?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sometimes I'm happy sometimes I'm sad I'm a tomboy whazup?&lt;/li&gt;&lt;/ul&gt;Oh... I get it. I was thinking there would be questions like "What's the best way to sharpen a pencil" and other questions for which there are actual &lt;span style="font-style: italic;"&gt;answers&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I may sign up as an "answer" guy and just give the answer "42" to all questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6353353122493336533?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6353353122493336533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6353353122493336533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6353353122493336533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6353353122493336533'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2007/11/yahoo-answers.html' title='Yahoo Answers'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-1896681018454028911</id><published>2007-10-20T22:28:00.001-05:00</published><updated>2008-09-09T11:12:35.000-05:00</updated><title type='text'>Build-tool smackdown: Maven vs. Ant</title><content type='html'>Throughout history, things of a type with differing kinds have been going to war with each other. There's Ford vs. Chevy, Honda vs. Yamaha, boxers vs. briefs, Alien vs. Predator, and so on. Today's topic is the battle of the 21st century for Java build tools: Ant vs. Maven.&lt;br /&gt;&lt;br /&gt;The difference between Ant and Maven is not really like the difference between Ford and Chevy, as noted above. It's more like the difference between a hand tool and a sophisticated futuristic robot.&lt;br /&gt;&lt;br /&gt;Suppose you're building a birdhouse, and you have a bolt with a nut on it that needs to be tightened. Using Ant is like using a wrench. You reach into your toolbox, pull out the right wrench, put it on the nut, apply pressure, and tighten the nut. You have to know which way to push on the wrench, but that's something you learn almost instantly if you've never done it before. It makes sense, and having learned it, you don't have to think about it any more. And if there's a problem (say, the wrong-size wrench), you know it immediately.&lt;br /&gt;&lt;br /&gt;Maven is more like a refrigerator-sized black box on casters that you wheel into the room, plug into a wall socket, and point toward the birdhouse. If the magic box "knows" what to do given the situation, it will be impressive: Lights on the box will blink, there will be an ominous low hum, the sun will darken, you'll hear thunder in the distance, and the nut and bolt will magically screw together. You'll also get a log file with charts in it to tell you how tight the nut was, before and after the operation, what the magic box did, and if there is anything wrong with the nut or bolt.&lt;br /&gt;&lt;br /&gt;And all you have to do in order to get the robot to know where the nut and bolt are is to write a short description of them, and make sure they're in the right place. Very cool.&lt;br /&gt;&lt;br /&gt;On the other hand, what happens if if the bolt and nut have left-hand threads? With Ant, you go through the same simple procedure but with a twist. With any intelligence at all, you'll notice that turning the nut to the right has the opposite effect you want, so you'll pull the other way on the wrench. Using the Maven approach, the nut will spin off and roll across the room, and fall into the floor drain. Then the robot will call the Police to report a robbery, and melt into a pool of slag on your garage floor.&lt;br /&gt;&lt;br /&gt;I get the point. Maven is relatively sophisticated, and it can do a lot of things for you automatically. As long as you and your project both play by Maven's rules, you're in great shape. I recently did some work for a company where Maven is the required build tool. You ought to see it. People sit around for 10-15 minutes running massive Maven builds and looking bored, waiting for the builds to finish. Maven sure is doing a lot for them. I talked to the architecture team at the company about their choice of build tools. For them, the main reason for using Maven is for the reports it can generate to show to management. So essentially, in essence, programmer productivity has been de-prioritized in the name of some reports. Someone in management probably stated a desire to see these reports, but after looking at one of them (with their dependency lists and tables of test-coverage results), thought "oh, programmer stuff" and ignored them after that.&lt;br /&gt;&lt;br /&gt;As a tool for developers, I'm not convinced of Maven's value. The dependency-management feature is great. But you buy a lot of complexity and rigidity to do along with it. What I like about Ant is that it's &lt;span style="font-style: italic;"&gt;simple&lt;/span&gt;. Simple in the way that the C language is simple. Out of the box, it does almost nothing for you. But it's easy to learn how to use it, and it's easy to look at an Ant script and see what it's supposed to do, just like looking at C code. And over time, as you get better at using it, you learn how to make it do more and more things. My Ant environment, for example, runs off of a set of "master" scripts that contain a lot of functionality. When I write a build script for a specific component in my environment, it's typically very small and succinct compared to a Maven POM. I have a repository, I have standardized locations for resources, and I have automated builds and unit tests. Recently, I added the ability to put Groovy scripts in a build to do more difficult things. Now it's not only simple, but it's really pretty smart. And best of all, my build scripts typically run in about 2 seconds on my machine, vs. the 45-second thrash for the same goal performed by Maven.&lt;br /&gt;&lt;br /&gt;It seems to be gaining momentum with the "Enterprise Actualization Patterns" crowd, so it's beneficial to know Maven. But for simple stuff where I have a choice, I'll stick with a simple wrench.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-1896681018454028911?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/1896681018454028911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=1896681018454028911' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1896681018454028911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/1896681018454028911'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2007/10/build-tool-smackdown-maven-vs-ant.html' title='Build-tool smackdown: Maven vs. Ant'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-8293023890741848485</id><published>2007-09-29T23:42:00.000-05:00</published><updated>2007-09-29T23:45:25.817-05:00</updated><title type='text'>Fanboy Swag</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_nYlZRe4bfLk/Rv8pc1wMOmI/AAAAAAAAACM/IAn0tWj5VkM/s1600-h/DSC03514.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_nYlZRe4bfLk/Rv8pc1wMOmI/AAAAAAAAACM/IAn0tWj5VkM/s320/DSC03514.JPG" alt="" id="BLOGGER_PHOTO_ID_5115853277158455906" border="0" /&gt;&lt;/a&gt;Finally!&lt;br /&gt;&lt;br /&gt;After waiting 3 weeks for my Ubuntu coffee cup to show up, it arrived today. Here's a picture of it, filled with hot coffee.&lt;br /&gt;&lt;br /&gt;I also got a propeller hat and some stickers for my car. Kidding...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-8293023890741848485?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/8293023890741848485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=8293023890741848485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8293023890741848485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/8293023890741848485'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2007/09/fanboy-swag.html' title='Fanboy Swag'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_nYlZRe4bfLk/Rv8pc1wMOmI/AAAAAAAAACM/IAn0tWj5VkM/s72-c/DSC03514.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-7335881875924164910</id><published>2007-09-23T00:09:00.001-05:00</published><updated>2007-09-23T00:20:22.968-05:00</updated><title type='text'>Windows XP on Ubuntu Linux</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_nYlZRe4bfLk/RvX17VwMOlI/AAAAAAAAACE/u-lEKZ1Jxos/s1600-h/ballmer-vbox-fognl-sm.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_nYlZRe4bfLk/RvX17VwMOlI/AAAAAAAAACE/u-lEKZ1Jxos/s320/ballmer-vbox-fognl-sm.png" alt="" id="BLOGGER_PHOTO_ID_5113263351749425746" border="0" /&gt;&lt;/a&gt;I was recently sort of inspired by something I saw on the interweb: &lt;a href="http://www.flickr.com/photos/kevinmacdowell/1388844524/"&gt;An image&lt;/a&gt; of Dale Cooper's Mac running a copy of Ubuntu Linux in a Parallels session. What was it that inspired me? The fact that a Mac is so powerful it can run a whole other OS inside it? No. It was the sight of Ubuntu Linux of course. I was so inspired that I had to virtualize Windows XP on my Ubuntu box, as seen here.&lt;br /&gt;&lt;br /&gt;I used VirtualBox to virtualize XP, and it was pretty easy. I think I'll try installing a copy of VirtualBox on a virtualized copy of Windows XP, and running a copy of Ubuntu inside it. Then, from within that doubly-virtualized copy, I'll SSH into the host machine and run &lt;tt&gt;sudo reboot&lt;/tt&gt; and see how long before it disconnects my session.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-7335881875924164910?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/7335881875924164910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=7335881875924164910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7335881875924164910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/7335881875924164910'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2007/09/windows-xp-on-ubuntu-linux.html' title='Windows XP on Ubuntu Linux'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_nYlZRe4bfLk/RvX17VwMOlI/AAAAAAAAACE/u-lEKZ1Jxos/s72-c/ballmer-vbox-fognl-sm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13977355.post-6419075679966953689</id><published>2007-09-19T21:29:00.000-05:00</published><updated>2007-09-20T09:55:45.454-05:00</updated><title type='text'>New Machine</title><content type='html'>I've been wanting a new machine for awhile. I didn't want to buy a machine off the shelf. Any fully-configured  PC you buy these days has Windows Vista on it, which I have no use for. Somehow, the mental image of Steve Ballmer buying something nice for himself with the money I spent on his crap OS just makes me want to kick something. I didn't want to buy a pre-built Linux box, since I hadn't seen any that appealed to me. And as much as I like my wife's Mac, I&lt;br /&gt;didn't want one of those either. I wanted more horsepower and expandability than is available in an iMac, and a Power Mac is too expensive.&lt;br /&gt;&lt;br /&gt;That left the "build-my-own" option. I've built a machine before, but that was back when I had the time and inclination to research every available option: Chipsets, video cards, memory type, clock speed, FSB speed, etc. I don't find that stuff interesting anymore, and I can't really keep up with it.&lt;br /&gt;&lt;br /&gt;So I went to MicroCenter, and found the nearest teenage mutant ninja geek. Those guys are really into all of the hardware minutiae, and they "research" this stuff all the time. Let me tell you, that's the way to shop for computer parts. I told the guy what I wanted the machine for, and asked him what the price/performance sweet spot is for CPUs. He showed me a 2.66Ghz Core2 Duo. Then he picked out a motherboard, a video card, a sound card, RAM, a hard drive, and an optical drive. I picked out the case. The whole process took about 30 minutes, and I ended up with a machine made out of parts known to work great out of the box with Linux. The sound card is an M-Audio Audiophile, known to have 1ms latency on Linux. That's about as good as it gets! Here are the parts:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Core2 Duo E6750 &lt;/li&gt;&lt;li&gt;2GB Corsair DDR2 RAM &lt;/li&gt;&lt;li&gt;500GB Seagate SATA II hard drive &lt;/li&gt;&lt;li&gt;Sony DVD+RW &lt;/li&gt;&lt;li&gt;GigaByte GA-P35-DS3 &lt;/li&gt;&lt;li&gt;Antec Sonata III case (500W power supply) &lt;/li&gt;&lt;li&gt;EVGA 7600GT video card &lt;/li&gt;&lt;li&gt;M-Audio Audiophile sound card &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Anyway, I put the machine together Friday night, and had it up and running in about 1 hour.&lt;br /&gt;&lt;br /&gt;The first thing I did was install Ubuntu Feisty. That went without a hitch, right up until the point where I tried to intall a video driver. I was installing stuff like mad at the time, and I remembered a command I had typed once to install the video driver. I installed it, restarted the UI, and my X server refused to start. I had no UI. I went online, found an article about installing NVidia drivers. It said that the "normal" way of installing drivers isn't as good as installing the driver straight from the NVidia site. I tried that. It worked great, until I rebooted the machine. Then, nothing. I was getting all kinds of errors about the kernel version being different than the driver version, ABI mismatches, GLX modules failing to load, and other annoying crap that no one with kids and a mortgage should ever have to think about.&lt;br /&gt;&lt;br /&gt;I was starting to kind of hate Linux. Saturday morning, I decided to start the installation over, from scratch. This time, I followed the "normal" way of installing a video driver: Look at the "restricted driver manager" panel, enable the "restricted driver" you want, and reboot. That process amounted to 1 mouse click, and a reboot. I could have saved myself 10 hours of grief doing that the first time. Duh!&lt;br /&gt;&lt;br /&gt;The next thing to fix was the sound card issue. Modules are loaded by the OS in the order they're found, which is basically at random. My machine was loading the sound card drivers that way. So about every other time I would boot, I had sound, and the other times, I had none (The M-Audio card wasn't hooked to anything resembling a speaker). So I started researching that problem, digging through config files, and googling everywhere. I found a lot of information&lt;br /&gt;about module loading, ALSA and other low-level stuff until I found a package that lets you select your default sound card by clicking a button. I chose that approach, having come to prefer it over the others.&lt;br /&gt;&lt;br /&gt;That left the final problem, thermal management. The Core2 Duo CPU is about the size of a half-dollar coin. It's clamped onto the motherboard under a big aluminum heatsink with an 80mm fan on top. The motherboard controls the fan speed and also features alarms you can set to alert you if a fan fails. So I set it to alert me if the CPU temp gets too high, and also if the CPU fan fails. Problem is, the fan is controlled by the motherboard. In idle state, the motherboard stops the fan automatically. Then it sounds an alarm to tell you that the fan is stopped. Stupid.&lt;br /&gt;&lt;br /&gt;That part was easy enough to fix, but the fan itself had a problem. It seemed to run reliably at startup, right up until the point where the machine goes idle. It would keep the CPU at about 40C, the idle temp of the CPU without a fan, only running when necesssary. But if I let the machine sit for an hour or so in idle state, the fan would refuse to start, no matter what. If I started some process which heats the CPU to the point where it requires cooling, the fan would just sit there. Several times, I watched the temperature climb and climb, and the fan would just sit there, fiddling while Rome burned. Finally, at about 180 degrees F, I flicked the fan blades and the fan started.&lt;br /&gt;&lt;br /&gt;I took the CPU/fan back and exchanged them for another one.&lt;br /&gt;&lt;br /&gt;I noticed the same problem with the new one. As it turns out, the problem seems to lie with the motherboard's notion of "automatic" fan management. If you let the motherboard figure out when and how to run the fan, it doesn't do anything. So I set it to control fan speed based on temperature. Now the fan never stops. It just idles at around 700 rpm at idle, keeping the CPU at right around room temperature or about 20C cooler than before.&lt;br /&gt;&lt;br /&gt;I also installed an extra fan to suck air past the hard drive and blow it past the video card. That dropped the temperature of the HD about 20C.&lt;br /&gt;&lt;br /&gt;During this process, I found a cool package of sensors that allow me to have a set of temp guages and fan tachometers on my desktop. It's like running some kind of hi-tech steam engine, including the built-in tendency to burn up/blow up if left alone.&lt;br /&gt;&lt;br /&gt;I've never run Linux on a machine with up-to-date components on it. This machine is almost comically fast. Things that took 2-3 minutes on my old machine take a few seconds on this one, and the CPUs don't even scale up to max speed in the process. To test video performance with the video driver, I used glxgears. It displays a set of turning GL gears in a window, and the current framerate. On my old machine, I was able to get 1500 FPS in a small window, and 12 FPS full-screen. On this machine, the numbers are 10,500 FPS in a small window, 4850 full screen. I downloaded and compiled some audio software and the process went so fast I had to verify that it actually happened. I started 4 processes converting 500MB avi files into 50GB dv files to test the cooling, and was still able to write some code in Eclipse while the machine was grinding away on 4 other tasks, any one of which would have kept my old P4 totally busy.&lt;br /&gt;&lt;br /&gt;So, what I've learned: Modern Linux distributions are getting pretty easy to install and configure, as long as you know which buttons to click. The process is probably as simple as it's possible for it to be, outside of buying an OS pre-installed on a machine made to work with it.&lt;br /&gt;&lt;br /&gt;Also, building a machine from the ground up is a big pain in the butt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13977355-6419075679966953689?l=fognl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fognl.blogspot.com/feeds/6419075679966953689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13977355&amp;postID=6419075679966953689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6419075679966953689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13977355/posts/default/6419075679966953689'/><link rel='alternate' type='text/html' href='http://fognl.blogspot.com/2007/09/new-machine.html' title='New Machine'/><author><name>Kelly</name><uri>http://www.blogger.com/profile/09042925463854783474</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
