<?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'><id>tag:blogger.com,1999:blog-37264792</id><updated>2009-09-22T11:27:48.271-05:00</updated><title type='text'>An App A Week</title><subtitle type='html'>I plan on writing an application every week.  Some may be new applications, some may build upon what was developed during anappaday.com.  Sit back and relax, while I entertain.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default?start-index=26&amp;max-results=25'/><author><name>Dana Hanna</name><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-37264792.post-824863974170119325</id><published>2007-06-24T19:28:00.000-05:00</published><updated>2007-06-24T19:33:43.293-05:00</updated><title type='text'>I'm not ignoring you...</title><content type='html'>I've been incredibly busy with the paying work (technical translation) this year, and after getting the blog back up, it has literally been wall-to-wall translation ever since.  I have some nice ideas for little apps, but absolutely no time at all to implement them; very frustrating.&lt;br /&gt;&lt;br /&gt;I really do expect this to change relatively soon, but how long have I been saying that?&lt;br /&gt;&lt;br /&gt;Anyway, I was noodling around with some Markov chain code I wrote a year or so ago on a lark, and decided it would be funny to autopost a blog, because I've always thought the output (which is based on statistical analysis of my Toonbots cartoon blurbs, the discussion forum there, and the CNN and Yahoo headlines for the day) is at times hilarious, and if you've ever looked at Markov-chain output, it's really surreal at times.  It's like Dutch, it &lt;span style="font-style: italic;"&gt;almost&lt;/span&gt; makes sense...&lt;br /&gt;&lt;br /&gt;Anyway, if you're in the mood for random textual weirdness (and hey, who isn't?) cast your eyes over at &lt;a href="http://toonbotting.blogspot.com/"&gt;Toonbotting&lt;/a&gt;.  You ... well, I won't say you won't be sorry you did, because you might not be cool enough, and who could blame you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-824863974170119325?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/824863974170119325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=824863974170119325&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/824863974170119325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/824863974170119325'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/06/im-not-ignoring-you.html' title='I&apos;m not ignoring you...'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-8578765942892788436</id><published>2007-06-05T21:08:00.000-05:00</published><updated>2007-06-05T21:09:35.041-05:00</updated><title type='text'>We're back</title><content type='html'>OK, anappaweek.com is on a new server now, one I control with an iron fist.  And it &lt;span style="font-style: italic;"&gt;won't be going down again&lt;/span&gt;.  (Unless it does.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-8578765942892788436?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/8578765942892788436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=8578765942892788436&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8578765942892788436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8578765942892788436'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/06/were-back.html' title='We&apos;re back'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-7038269665466402589</id><published>2007-04-29T14:40:00.000-05:00</published><updated>2007-04-29T14:51:46.982-05:00</updated><title type='text'>The AppA{TimePeriod} community</title><content type='html'>Besides this modest blog, the PHP Jedi reminds me that there is an IRC channel on Freenode at #TheSoftwareJedi -- if, like me, you're IRC-challenged, you can also use a convenient Java client at the software Jedi's site: &lt;a href="http://www.thesoftwarejedi.com/modules/chat/"&gt;click here to get there&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-7038269665466402589?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/7038269665466402589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=7038269665466402589&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/7038269665466402589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/7038269665466402589'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/04/appa-community.html' title='The AppA{TimePeriod} community'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-4068803450587952244</id><published>2007-04-27T14:09:00.000-05:00</published><updated>2007-04-27T15:12:07.432-05:00</updated><title type='text'>Google counting</title><content type='html'>So as you may or may not know, I've been dabbling lately in the despamming of online forum posts, with more or less success. And I've been helping people &lt;span style="font-style: italic;"&gt;pro bono&lt;/span&gt; in despamming their own fora, if they're interested.&lt;br /&gt;&lt;br /&gt;This is in response to the wave of forum spam which has arisen since the availability of XRumer in November, 2006. XRumer has a number of tricks in its toolbag to get around spam blocking measures in place, because after all, if you don't actually track people down and shoot them when they spam, you must actively want "advertising" on your forum for cheap handbag knockoffs, Viagra, and lesbian porn, right? Right.&lt;br /&gt;&lt;br /&gt;So forum despamming is getting interesting. One of XRumer's little tricks is to post through HTTP proxies to make it difficult or impossible to do IP-based banning of posters. And that was really pretty effective -- until the very popularity of XRumer and similar spambots using HTTP proxies made traffic through HTTP proxies really, really prominent.&lt;br /&gt;&lt;br /&gt;The epiphany I had this week was that if a proxy is well-known by forum spammers, it's going to get indexed by Google a &lt;span style="font-style: italic;"&gt;whole lot&lt;/span&gt;.  So the natural next step is to check Google for the IP of an untrusted poster, right?&lt;br /&gt;&lt;br /&gt;Thus the &lt;a href="http://www.vivtek.com/google_count"&gt;Google counter&lt;/a&gt; was born (code presented &lt;a href="http://www.vivtek.com/projects/forum_despammer/google_count.html"&gt;here&lt;/a&gt;).  Very simple.  And it seems to block about 30% to 60% of forum spam so far.&lt;br /&gt;&lt;br /&gt;In other news, since the Big Move back down to the Caribbean, the translation work has been incredibly voluminous. I keep thinking, "Today I'm going to do some GUI work" but I still end up falling asleep translating. (And that's really weird: yesterday I tried to type "replacement and wearing parts" and typed "replacement and wearing turbans" instead. Typing while asleep is &lt;span style="font-style: italic;"&gt;very Zen&lt;/span&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-4068803450587952244?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/4068803450587952244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=4068803450587952244&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/4068803450587952244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/4068803450587952244'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/04/google-counting.html' title='Google counting'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-8214158304949361675</id><published>2007-04-01T15:39:00.000-05:00</published><updated>2007-04-01T15:52:20.468-05:00</updated><title type='text'>A file monitor</title><content type='html'>Well, lo and behold, it turns out I've implemented a very simple version of App #3, the file monitor. It's not very flexible -- if invoked from the command line with a source directory and a target directory, it will monitor the source directory and move anything and everything added to that directory into the target directory. It does no error checking. And it's too stupid to find the Desktop to monitor.&lt;br /&gt;&lt;br /&gt;But it's a file monitor, and in the next couple of days I'll post a more complete version.  The monitor thus far is just this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ui&gt;&lt;br /&gt;&amp;lt;frame id="main" title="File monitor 1"&gt;&lt;br /&gt; &amp;lt;args id="main"&gt;&lt;br /&gt;   &amp;lt;arg field="source" default="."/&gt;&lt;br /&gt;   &amp;lt;arg field="target" default=""/&gt;&lt;br /&gt; &amp;lt;/args&gt;&lt;br /&gt; &amp;lt;html field="html"/&gt;&lt;br /&gt; &amp;lt;timer field="timer" state="off" interval="1000" cmd="look"/&gt;&lt;br /&gt;&amp;lt;/frame&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;action id="initialize" lang="python"&gt;&lt;br /&gt;  if not [context]['target']:&lt;br /&gt;     : notify "You need to specify a target directory."&lt;br /&gt;     : exit&lt;br /&gt;&lt;br /&gt;  [context].list = set(os.listdir( [context]['source']))&lt;br /&gt;  [context]['timer'] = 'on'&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;action id="look" lang="python"&gt;&lt;br /&gt;  oldlist = [context].list&lt;br /&gt;  [context].list = set(os.listdir ( [context]['source']))&lt;br /&gt;&lt;br /&gt;  for f in [context].list:&lt;br /&gt;     if not f in oldlist:&lt;br /&gt;        shutil.move (f, [context]['target'])&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&amp;lt;/ui&gt;&lt;br /&gt;&lt;/pre&gt;To run this bad boy, you'll need the latest &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=26205&amp;package_id=220313"&gt;Pypop from SourceForge&lt;/a&gt; (v0.2) -- if you're still running 0.1, you'll run into some bugs I just fixed, and as I haven't done very good error handling, things will just fail silently and you won't know why.  Eventually I need to put some error handling into that beast.&lt;br /&gt;&lt;br /&gt;Anyway, this is just a taste.  I've also written up a nice tutorial on Pypop which goes over some of the design considerations in the apps so far, but it's not uploaded yet (I still have to write some formatting scripts to turn it into proper HTML.)  When I do that, I'll post here again, and hopefully sunny Ponce will keep me happy and productive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-8214158304949361675?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/8214158304949361675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=8214158304949361675&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8214158304949361675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8214158304949361675'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/04/file-monitor.html' title='A file monitor'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-8123351169341323690</id><published>2007-03-28T17:07:00.000-05:00</published><updated>2007-03-28T17:21:44.169-05:00</updated><title type='text'>Sorry for the hiatus -- I've moved again</title><content type='html'>Every few months, my family and I move household, just to stay in fighting trim.  Our current coordinates are now &lt;a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;amp;q=ponce+pr&amp;layer=&amp;amp;ie=UTF8&amp;z=18&amp;amp;ll=18.01211,-66.59808&amp;spn=0.002648,0.006781&amp;amp;t=k&amp;om=1"&gt;here&lt;/a&gt;. Ponce, Puerto Rico is a very strange place. It's ... it's like New Castle, Indiana, in that there are townies and non-townies, but the townies have been here for five hundred years. It's part of the United States. Kind of. It's a foreign country. Kind of. It's tropical, but dry. It's hot, but breezy.&lt;br /&gt;&lt;br /&gt;We're here because my son is healthier here. We're not sure why, but when you're talking about allergies and kidney disease, you don't argue, you just go with what works. For some reason, his physical health is better here.  &lt;span style="font-style: italic;"&gt;Socially&lt;/span&gt; things are different; we don't speak Spanish very well, and so things can get somewhat sparse.  But we do have a lot of friends in town (we've been here off and on for three years now) and so we get by.  But after about six months to a year, you start thinking of those libraries and restaurants in Bloomington, and then you decide to go back.  Or you start thinking about Europe.  That's the last two times we left Puerto Rico.  But proteinuria lab results bring us back every time.  We just wish we knew why...&lt;br /&gt;&lt;br /&gt;Anyway, all is not lost with respect to AppAWeek; as soon as I have a reliable Internet connection, now that the Indiana house has been made ready for the market and the Puerto Rico household has again been retrieved from the storage unit, I should be ready to reengage.  In the meantime, um, I dunno, go play Tetris or whatever the kids are doing this year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-8123351169341323690?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/8123351169341323690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=8123351169341323690&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8123351169341323690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/8123351169341323690'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/03/sorry-for-hiatus-ive-moved-again.html' title='Sorry for the hiatus -- I&apos;ve moved again'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-117091133709686207</id><published>2007-02-08T00:01:00.000-05:00</published><updated>2007-02-08T00:08:57.106-05:00</updated><title type='text'>Stupid PyPop tricks</title><content type='html'>I've been playing with timers in PyPop (the current version has them enabled) because I had originally thought I'd do the directory monitor with a timer. Here's a neat little application for PyPop:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;ui&gt;&lt;br /&gt;&amp;lt;frame id="main" title="File monitor" h="100" w="200"&gt;&lt;br /&gt; &amp;lt;html field="html"&gt;Nothing to see here, move along&amp;lt;/html&gt;&lt;br /&gt; &amp;lt;timer field="timer" interval="1000" cmd="tick"&gt;&lt;br /&gt;&amp;lt;/frame&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;action id="initialize" lang="command" parms=""&gt;&lt;br /&gt;  set state tick&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;action id="tick" lang="python" parms=""&gt;&lt;br /&gt;  state = [context]['state']&lt;br /&gt;  if state == 'tick':&lt;br /&gt;     : set state tock&lt;br /&gt;     : hide&lt;br /&gt;  else:&lt;br /&gt;     : set state tick&lt;br /&gt;     : show&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&amp;lt;/ui&gt;&lt;br /&gt;&lt;/pre&gt;All it does is to show the frame and set up a timer that calls a "tick" command. The "tick" hides the frame if the state is "tick", and shows it if the state is "tock". End of story. The frame appears and disappears every second. When you've had enough, click on the close button quickly before it disappears. Ha.&lt;br /&gt;&lt;br /&gt;Try it!  Remember: PyPop installer &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=26205&amp;amp;package_id=220313"&gt;here at SourceForge&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-117091133709686207?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/117091133709686207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=117091133709686207&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117091133709686207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117091133709686207'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/02/stupid-pypop-tricks.html' title='Stupid PyPop tricks'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-117081636873723479</id><published>2007-02-06T21:43:00.000-05:00</published><updated>2007-02-06T21:46:08.750-05:00</updated><title type='text'>Forum despamming</title><content type='html'>Well, it's not an official app, but I spent a little time correlating forum posts with my access logs over at my own site, and came up with &lt;a href="http://www.vivtek.com/projects/forum_despammer/"&gt;a nifty little script&lt;/a&gt; which is doing pretty well despamming my own very low-traffic forum at Toonbots.&lt;br /&gt;&lt;br /&gt;Now if I could just get admin access to the Software Jedi's forum...  Dana Hanna, Dana Hanna.  Would Mr. Hanna please come to the courtesy phone?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-117081636873723479?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/117081636873723479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=117081636873723479&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117081636873723479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117081636873723479'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/02/forum-despamming.html' title='Forum despamming'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-117039584759184727</id><published>2007-02-02T00:37:00.000-05:00</published><updated>2007-02-08T00:10:17.163-05:00</updated><title type='text'>Stick a fork in it, PyPop is done</title><content type='html'>Well, v0.1 isn't &lt;span style="font-style: italic;"&gt;done&lt;/span&gt;, really, but then is software ever &lt;span style="font-style: italic;"&gt;done&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;PyPop is a Python-based GUI interpreter capable of flexibly implementing an application represented as an XML file containing a description of:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Frames and dialogs used in the application&lt;/li&gt;   &lt;li&gt;The command-line arguments, if any&lt;/li&gt;   &lt;li&gt;The data file read/written by the app, if any&lt;/li&gt;   &lt;li&gt;The commands behind all button (and other) actions in the application&lt;/li&gt; &lt;/ul&gt; The commands are written in Python with some syntactic sugar to save typing.&lt;br /&gt;&lt;br /&gt;You can get PyPop v0.1 from its &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=26205&amp;package_id=220313"&gt;SourceForge download page&lt;/a&gt;. Because I like you so much, I took the trouble of building an NSIS installer for it -- so there's nearly no work for you, just click it and install.&lt;br /&gt;&lt;br /&gt;Once it's installed, get the &lt;a href="http://www.vivtek.com/projects/filetagger/filetagger.wftk"&gt;filetagger app definition&lt;/a&gt; and try it out. There is a "Help|Registry associations" menu item in the filetagger now which will register .ftg for use as a filetagger database file extension. It's crude but it works. Now if I had some more time, I'd go ahead and write code for a real installer, with a SendTo link and all. That will have to wait for another day.&lt;br /&gt;&lt;br /&gt;A day &lt;span style="font-style: italic;"&gt;after&lt;/span&gt; I finish v1.0 of the filemonitor application Cabin Tom's patiently waiting for.  Busy busy busy!&lt;br /&gt;&lt;br /&gt;Oh, a side note: Dana is still alive, or was a couple of days ago when last I heard from him. Just really distracted. And lame! Don't forget lame.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-117039584759184727?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/117039584759184727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=117039584759184727&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117039584759184727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/117039584759184727'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/02/stick-fork-in-it-pypop-is-done.html' title='Stick a fork in it, PyPop is done'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116995772410168758</id><published>2007-01-27T23:12:00.000-05:00</published><updated>2007-01-27T23:15:24.103-05:00</updated><title type='text'>Stringing the public along</title><content type='html'>Ha!  I simply haven't had time to look at publishing the PyPop framework yet, but I did go ahead and &lt;a href="http://www.vivtek.com/projects/filetagger/filetagger.html"&gt;post the filetagger&lt;/a&gt; translated into that framework.&lt;br /&gt;&lt;br /&gt;The expression of the filetagger now takes 310 lines of XML, and includes the specification of the UI, the commands behind it, the structure of the datafile, the handling of all command-line flags and arguments, the About dialog text, and the help file -- the Python code was about 340 lines and didn't include any of the textual resources.  More importantly, the expression of the commands is somewhat more readable in the interpreted version, or at least I find it more readable and certainly more writeable.&lt;br /&gt;&lt;br /&gt;The only sticky wicket is that I have no documentation framework for this style of coding yet.  I've got some ideas on how to manage it, but (as always) little time.&lt;br /&gt;&lt;br /&gt;Anyway, I'll get the interpreter for this little beastie up as soon as possible, and then things are going to start getting interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116995772410168758?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116995772410168758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116995772410168758&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116995772410168758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116995772410168758'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/stringing-public-along.html' title='Stringing the public along'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116993275865455738</id><published>2007-01-27T16:12:00.000-05:00</published><updated>2007-01-27T16:19:21.716-05:00</updated><title type='text'>WMI wizardry</title><content type='html'>So it turns out that there's an easier way to get to most of the Windows shell functionality, through the Windows scripting interface and -- even better -- WMI, the "Windows Management Interface" which is a huge, sprawling attempt to put all the administrative stuff in Windows into one scriptable place.  There's a truly inspired &lt;a href="http://tgolden.sc.sabren.com/python/winshell.html"&gt;Python wrapper from Tim Golden&lt;/a&gt; which provides wonderful introspection and scripting, and Microsoft also has an entertaining column on general scripting and WMI at &lt;a href="http://www.microsoft.com/technet/scriptcenter/resources/qanda/default.mspx"&gt;Hey, Scripting Guy&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;I've asked the Scripting Guys about how to move icons.  I still think it ain't possible, although the quest has reminded me of a lot of Windows API stuff and also brought home to me how many (half-assed implementations of) nice mechanisms have arisen in the fifteen years since last I tried all this.&lt;br /&gt;&lt;br /&gt;I almost have the PyPop GUI interpreter up and running for you.  It's up and running but I want to add one more feature (the ability to register file extensions) before I release v1.0.  Might happen today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116993275865455738?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116993275865455738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116993275865455738&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116993275865455738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116993275865455738'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/wmi-wizardry.html' title='WMI wizardry'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116979226385923580</id><published>2007-01-26T01:15:00.000-05:00</published><updated>2007-01-26T01:17:43.866-05:00</updated><title type='text'>App #3 slight redefinition</title><content type='html'>Oh, hey -- it occurred to me after posting the last post that if I modify the requirements just a tad for app #3 I can still do what Cabin Tom really wants to do.  Granted, it looks like it's just too durn much trouble to move icons on the Desktop, but I &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; easily monitor the Desktop and move all newly created files there into an incoming-download folder of arbitrary definition.&lt;br /&gt;&lt;br /&gt;So mote it be.  App #3 is now slighly adulterated, but at least possible.&lt;br /&gt;&lt;br /&gt;(But if you know how to script icon-moving-around on the Windows Desktop, I still want to hear from you.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116979226385923580?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116979226385923580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116979226385923580&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116979226385923580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116979226385923580'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/app-3-slight-redefinition.html' title='App #3 slight redefinition'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116978245123779668</id><published>2007-01-25T21:19:00.000-05:00</published><updated>2007-01-25T22:34:11.336-05:00</updated><title type='text'>Guter Gott...</title><content type='html'>Oh yeah.  &lt;span style="font-style: italic;"&gt;Now&lt;/span&gt; I remember why I always hated working with Microsoft Windows.  When I started delving into the guts of shell programming, for the first time in a very long time indeed, it was with a fairly relaxed notion that since the Desktop is a folder, the information about the location of the icons &lt;span style="font-style: italic;"&gt;on&lt;/span&gt; the Desktop must be in a relatively easy-to-find location or have relatively easy-to-use interfaces.&lt;br /&gt;&lt;br /&gt;I was wrong.  Oh, granted, I'm pretty sure I've found something (IShellView2 exposes a SelectAndPositionItem method) but it took a day's reading, and that just isn't time I had.  It escalated into a sort of obsession, and at the end of the day, all I have to show for it is &lt;span style="font-style: italic;"&gt;maybe&lt;/span&gt; I can move the fricking icons around on my Desktop, for &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; versions of Windows.&lt;br /&gt;&lt;br /&gt;I say "maybe" because there's no fricking documentation for it.  That's a situation I run across in open-source programming, of course, but in the open-source world I could look at the code for Explorer and see how Explorer does it.  Here, that avenue is closed to me, not because it's important for Microsoft to hide it, but because it's simply not important for Microsoft to divulge it.  The default is secrecy.  And that default is, at the heart of it, precisely what is wrong with the world in general.  I won't go into the obvious political ramifications because I'm pretty sure if I started in on it I'd shock Dana's maiden heart, but suffice it to say that Windows sucks.  Sure, it's usable -- has to be, to perfuse the market to this extent -- but it's just marginally programmable.  And for no real reason.&lt;br /&gt;&lt;br /&gt;Back in the Good Old Days, when I was doing a whole lot of VB programming under Microsoft Word 6.0, is when I first realized this about Microsoft's worldview.  Even then, Word was quickly establishing itself as the industry standard for document editing and storage, and so there was no alternative.  And I'll be the first to admit that exposing Word's innards in Visual Basic for programming was brilliant -- I loved it.  But whereas the motto of Perl (a language I learned much later) is to make easy things easy and hard things possible, the unstated motto of Word Basic was to make easy things possible and hard things unimaginable.  There were things I simply &lt;span style="font-style: italic;"&gt;could not do&lt;/span&gt;, no matter how many weeks I spent hacking on them.  (Back then, as a paid minion, I had the weeks to spend -- now it would simply be out of the question and on to the next project idea.)&lt;br /&gt;&lt;br /&gt;With open source, the documentation is of comparable quality, but when the documentation gives out, there is &lt;span style="font-style: italic;"&gt;at least&lt;/span&gt; some working example code in whatever product originally inspired the interface or function or what-have-you in the first place.  The thing was written to solve a problem, and the solution is an open book.  With closed-source, somebody obviously solved it, but they &lt;span style="font-style: italic;"&gt;will not tell you the solution&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ugh.  I hate them all.&lt;br /&gt;&lt;br /&gt;On the other hand, I &lt;span style="font-style: italic;"&gt;have&lt;/span&gt; found lots of nice pieces for app #3 -- for instance, I can still build a directory monitor using SHChangeNotifyRegister.  This installs a window to be passed messages from the Windows Shell (i.e. Explorer and the Desktop) whenever files are created, written, moved, deleted, etc.  Instead of polling a directory on a timer, therefore, I can just sit hidden in the background until something happens.  Much cheaper in terms of system resources.&lt;br /&gt;&lt;br /&gt;And really, just getting that much working would be a valuable addition to my framework; I'll probably just call that app #3 like the coward I am, and call the icon mover action app#4, unless somebody can show me an easier way of going about it.  The sticky wicket is that the Python COM model doesn't wrap IShellView2, so if I want to go that route I'll have to wrap it.  And I &lt;span style="font-style: italic;"&gt;don't want to&lt;/span&gt;.  So you Windows mavens, now's your chance to show me how much Windows doesn't suck.  If you can.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116978245123779668?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116978245123779668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116978245123779668&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116978245123779668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116978245123779668'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/guter-gott.html' title='Guter Gott...'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116944628330563557</id><published>2007-01-22T01:02:00.000-05:00</published><updated>2007-01-22T01:11:23.313-05:00</updated><title type='text'>Another detour!</title><content type='html'>Well, as I was mulling over how much larger wx had gotten since I last downloaded it (and once I realized the smallest of apps, compiled, becomes 5MB), I got to thinking.&lt;br /&gt;&lt;br /&gt;That's always a mistake.&lt;br /&gt;&lt;br /&gt;In this case, I thought: gee, it's nice that the UI of these programs is defined in the XML.  What if I defined the command-line argument handlers, too?  And loaded the external data file based on that description?&lt;br /&gt;&lt;br /&gt;What if ...&lt;br /&gt;&lt;br /&gt;Then the epiphany struck.  What if each of the commands in the CLI were to be defined &lt;span style="font-style: italic;"&gt;in the XML&lt;/span&gt;?  As Python, no wait, as &lt;span style="font-style: italic;"&gt;templates to generate Python&lt;/span&gt;?  So I researched it and bent my fevered brow to the task.  And lo! it works....  Really.&lt;br /&gt;&lt;br /&gt;If I define "filetagger.wftk" as a UI file, with an "action" tag for each command in the CLI, wxpywf can now read those, build the CLI class, and pass it back to pypop for instantiation in the main context.  It can't import Python files, but it could without a whole lot of work.  And will.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Now&lt;/span&gt; I can introduce a real Software Jedi toolkit: pypop.  As soon as it's cleaned up, anyway.  If pypop stores apps by name, you could download them with a pypop app manager, install them, and let'em go.  If the pypop then subsumes both the Jedi console and a directory monitor and stuff like that -- well, you'll have a handy-dandy Swiss army knife of a UI tool.  I kinda like this.&lt;br /&gt;&lt;br /&gt;Anyway, I'll clean this up and get it posted tomorrow or the next day.  And then continue with App #3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116944628330563557?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116944628330563557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116944628330563557&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116944628330563557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116944628330563557'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/another-detour.html' title='Another detour!'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116927100873251776</id><published>2007-01-20T00:27:00.000-05:00</published><updated>2007-01-20T00:30:08.733-05:00</updated><title type='text'>App #3 taxiing for takeoff</title><content type='html'>Today I got started on filemonitor, which is app #3.  I really haven't done much yet except to research timers under wxPython, add a nifty "later" command to the wxpywf GUI CLI, sketch out a timer pseudowidget for repeated, scheduled commands, add a "hide" and a "show" command to the CLI so that we can hide on the system bar when in monitoring mode, and that's about it.&lt;br /&gt;&lt;br /&gt;I don't yet have things set up to upload works in progress easily, so I haven't done that yet, but I'll probably do something along those lines over the next few days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116927100873251776?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116927100873251776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116927100873251776&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116927100873251776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116927100873251776'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/app-3-taxiing-for-takeoff.html' title='App #3 taxiing for takeoff'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116925131273524392</id><published>2007-01-19T18:21:00.000-05:00</published><updated>2007-01-19T22:10:49.440-05:00</updated><title type='text'>Wheel reinvention for fun and profit</title><content type='html'>It's come to my attention that some among you think it's a waste of time to reinvent the &lt;a href="http://www.vivtek.com/wftk/doc/code/python/wxpywf.html"&gt;XML-described UI&lt;/a&gt;.   Some such rot about "reinventing the wheel".&lt;br /&gt;&lt;br /&gt;Strunk and White's &lt;span style="font-style: italic;"&gt;Elements of Style&lt;/span&gt; has a nice little turn of phrase I've always liked: "Infinitives, like round stovewood, sometimes benefit from being split." To which I add that wheels occasionally benefit from judicious reinvention.&lt;br /&gt;&lt;br /&gt;There are three responses to this complaint, actually. First is why I believe that it's not a waste of time to reinvent the XML-described UI wheel, and it's the same as anything else in this venture: yeah, lots of people describe UI in XML, for the simple reason that XML is specifically designed to describe things. There are, in fact, a couple of XML UI description frameworks already out there for wxPython. As I said at an earlier point -- I don't like them because I didn't write them: the flippant version of saying, "I don't like them because they don't do everything I want and they don't express things as elegantly as I like." There's a great deal of machinery behind the &lt;a href="http://www.vivtek.com/wftk/doc/code/python/wxpywf.html"&gt;wxpywf&lt;/a&gt; that simply doesn't exist in any comparable framework I know of. The fact that it's XML-described is only the surface -- the thing is, by reinventing XML UI description &lt;span style="font-style: italic;"&gt;in the context of my existing &lt;a href="http://www.vivtek.com/wftk.html"&gt;workflow toolkit&lt;/a&gt;&lt;/span&gt;, I saw that there was a great deal more that could be done to encapsulate the UI in the first place.&lt;br /&gt;&lt;br /&gt;Essentially, the UI frame is itself now an XML-describable object &lt;span style="font-style: italic;"&gt;at runtime&lt;/span&gt;. It is an array -- I can effect changes to the UI simply by assigning a variable, and the framework takes care of figuring out how to implement the actual visual changes. If you take a look at the actual &lt;a href="http://www.vivtek.com/projects/filetagger/filetagger1.html"&gt;code for the filetagger&lt;/a&gt;, instead of carping about wheel reinvention, this elegance becomes more apparent&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;.  And so yes, I think that this particular wheel did not suffer from gratuitous reinvention.&lt;br /&gt;&lt;br /&gt;So that's one response, a nuts-and-bolts thing. The second is more of a philosophical nature, a simple refutation of the weird notion that There Can Be Only One. Is there only one database? Did anybody carp at the MySQL writers that PostgreSQL already existed, so they were just reinventing the goddamn wheel? Did sendmail's mere existence make it superfluous to consider any other mail handler? For that matter, what about Linux itself? Didn't Unix already exist? Didn't Windows already exist -- what's the point of writing a GUI environment for Linux, then? Python is a reinvention of Perl, Perl of C, Java of C++. wxPython is a waste of time given TK, and Tcl isn't a reinvention of &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt; recognizable but still manages to be a waste of time.  Or so it would seem to this humble wheel reinventor.&lt;br /&gt;&lt;br /&gt;A healthy ecosystem benefits from a great number of competing -- and symbiotic -- species. That's a point equally true of carbon and software. If you don't like my GUI framework, &lt;span style="font-style: italic;"&gt;don't use it&lt;/span&gt;.  But whatever you do, don't complain that I wasted "time" -- whatever the hell that is -- by writing it.  Because reinvention &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; progress. It was reinvention of the basic fabric of society that gave us the American Constitution, and a reinvention of our attitudes towards the universe itself that gave us the Enlightenment. I maintain that I &lt;span style="font-style: italic;"&gt;was not&lt;/span&gt; wasting time.&lt;br /&gt;&lt;br /&gt;And then the third and lowest-level response: who the hell are you to complain about wasting time, anyway? Why the hell do geeks think &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt; of a time-wasting nature is an affront? Do I complain about people playing RPGs or watching football? Is that stuff inherently more useful than my coding? What did &lt;span style="font-style: italic;"&gt;you&lt;/span&gt; do today that wasn't a waste of time? Still got a TV? Bet you watched 24. Talk about a waste of time! At least I have something to show for my time that's different from what ten million other oxygen sinks did.&lt;br /&gt;&lt;br /&gt;Waste of time.  I'll give you waste of time.&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116925131273524392?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116925131273524392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116925131273524392&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116925131273524392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116925131273524392'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/wheel-reinvention-for-fun-and-profit.html' title='Wheel reinvention for fun and profit'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116916948929877475</id><published>2007-01-18T20:08:00.000-05:00</published><updated>2007-01-18T20:18:09.313-05:00</updated><title type='text'>Welcome to the XXIst century!</title><content type='html'>Yeah, so I finally upgraded my Python and wxPython versions.  OK, so I hadn't upgraded since 1999, OK?  OK?  You got a problem with Python 2.1 and wxPython 2.3?  Hey, they were good enough for us back then.&lt;br /&gt;&lt;br /&gt;So now I'm on Python 2.4 and wxPython 2.8 and it only cost me a day of flailing around, realizing I hadn't compiled anything in C in an inordinately long time (two laptops ago, actually), trying Microsoft's new free MSVC environment, rejecting it due its stupid requirement of manifests for the &lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt; (who forces licensing for a &lt;span style="font-style: italic;"&gt;C runtime&lt;/span&gt;?  Microsoft, that's who) and switching back to MSVC 5.0, which was good enough for grandpa so it's good enough for me.  That kind of thing.  But now it all works again, and while the switch from Py2.1 to Py2.4 isn't going to get me much, there are a lot of fancy new widgets in wx2.8.&lt;br /&gt;&lt;br /&gt;(As soon as I have another day to spare for it, I'm seriously going to migrate over to MingW32 and be done with MSVC for good.  I've used MingW32, way &lt;span style="font-style: italic;"&gt;way&lt;/span&gt; back when you had to handroll and compile your own Perl to run it on Windows, and it's a dandy compiler.  But the &lt;a href="http://www.vivtek.com/wftk/"&gt;wftk &lt;/a&gt;has a rather complex build environment on Windows, and getting that all to work right with a new compiler felt rather daunting yesterday.  So I'll do it later.)&lt;br /&gt;&lt;br /&gt;Primary among the fancy novelties in wxPython 2.8 is a nice class to put an icon on the system tray in Windows, and that was really what made me break down and do it in the end.  Oh, no, I forgot -- the other reason is that to get to the Windows COM classes I need the Win32 classes but they don't support Python 2.1 any more.  Not even available for download!  So here I am, being dragged kicking and screaming into the new Python millennium.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116916948929877475?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116916948929877475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116916948929877475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116916948929877475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116916948929877475'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/welcome-to-xxist-century.html' title='Welcome to the XXIst century!'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116900508056759259</id><published>2007-01-16T22:33:00.000-05:00</published><updated>2007-01-16T22:38:00.576-05:00</updated><title type='text'>App #3 on the runway</title><content type='html'>OK, we have a winner in the app implementation lottery: &lt;a href="http://www.thesoftwarejedi.com/modules/newbb/viewtopic.php?topic_id=50&amp;forum=4"&gt;Cabin Tom's suggestion&lt;/a&gt; for a "file placement" utility.  The idea here is simple: when downloading things to the Desktop, Tom is bothered by the fact that the icons for these downloaded files get scattered all through his carefully set up working icons.  He'd prefer that the files get tossed into a separate part of the Desktop.&lt;br /&gt;&lt;br /&gt;Since the Desktop is of course just a directory which gets special treatment, my solution is a two-parter:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;Reimplement miechu's directory monitor in a more generalized way, so that a generically specified action is taken whenever the contents of a directory change&lt;/li&gt;   &lt;li&gt;Implement an action for that utility to take which consists of modifying the icon properties of the file in the directory, so that they get moved into a specified area of the screen.&lt;/li&gt; &lt;/ol&gt; This is going to be a bit of a challenge for me, because I'm not at all familiar with the Windows classes to get this kind of task done.  But in principle it ought to be easy.  Right?  Yeah!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116900508056759259?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116900508056759259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116900508056759259&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116900508056759259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116900508056759259'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/app-3-on-runway.html' title='App #3 on the runway'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116875179429370302</id><published>2007-01-14T00:00:00.000-05:00</published><updated>2007-01-14T00:16:34.300-05:00</updated><title type='text'>Whoops, documentation helps</title><content type='html'>Seems I neglected to mention that there is a command-line syntax for the filetagger (and didn't test it for absence of said command line). I've fixed both issues -- first, a new version is up that does the Right Thing if you don't give any command line arguments or naively click the executable, and second, there is a doc file attached to the zip which explains the command line, and it says this:&lt;br /&gt;&lt;br /&gt;This is run from the command line like this:&lt;br /&gt;&lt;br /&gt;filetagger1 -fcst[tag] [database name] [command]&lt;br /&gt;&lt;br /&gt;The flags are as follows:&lt;br /&gt;-f: show the Files tab when starting&lt;br /&gt;-c: show the Cloud tab when starting (default)&lt;br /&gt;-s: run silently, i.e. just execute the command given and quit&lt;br /&gt;-t[tag]: in the Files tab, filter for the tag given.&lt;br /&gt;&lt;br /&gt;The database name is required, hence the confusion. I hadn't tested for the case of no command line -- there's a new version up on my site which works better, assuming the database name 'default.ftg'. If you give a filename that doesn't exist, it'll be created when you add files.&lt;br /&gt;&lt;br /&gt;Finally, the command can be one of the following:&lt;br /&gt;&lt;br /&gt;add [filename] [filename]...&lt;br /&gt;&lt;br /&gt;(In silent mode, no dialog will appear to elicit extra info; in that case, give it a tag with -t[tag] and that tag will be attached to the files you've just added.) If you don't give any files, a common files dialog will come up to let you pick some.&lt;br /&gt;&lt;br /&gt;mod [filename]&lt;br /&gt;&lt;br /&gt;Pops up a dialog to edit that file&lt;br /&gt;&lt;br /&gt;del [filename] [filename] ...&lt;br /&gt;&lt;br /&gt;Deletes the file(s) listed.&lt;br /&gt;&lt;br /&gt;Here's what the Files tab (the file management half of the app) looks like:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.vivtek.com/projects/filetagger/ftfiles.gif" /&gt;&lt;br /&gt;&lt;br /&gt;And the Cloud tab (which comes up first by default) looks like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.vivtek.com/projects/filetagger/ftcloud.gif"/&gt;&lt;br /&gt;&lt;br /&gt;The whole thing is done with XML and mirrors and I'm really quite happy with the results.  Now on to app #3.  I'm not sure what I want to do next.  Any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116875179429370302?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116875179429370302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116875179429370302&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116875179429370302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116875179429370302'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/whoops-documentation-helps.html' title='Whoops, documentation helps'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116856464197946300</id><published>2007-01-11T20:07:00.000-05:00</published><updated>2007-01-11T20:17:21.996-05:00</updated><title type='text'>At long fricking last!  The filetagger is here!</title><content type='html'>OK, OK, I know this isn't anappamonth.com, but there was a lot I wanted to do right in this first serious application.  And I'm quite happy with it!  Tired, but happy.  You can see &lt;a href="http://www.vivtek.com/projects/filetagger/filetagger1.html"&gt;the results of my handiwork here&lt;/a&gt; (code and download available there, too).&lt;br /&gt;&lt;br /&gt;I did this app with my (now marginally working) &lt;a href="http://www.vivtek.com/wftk/doc/code/python/wxpywf.html"&gt;wxpywf framework&lt;/a&gt;, which combines wxPython GUI with my XML-oriented wftk project.  This framework started as a simple way to put together UIs for workflow applications under the wftk, but I lost development steam a few years ago due to many Real Life factors.  That seems to be changing (insert vigorous wood-knocking here).  The module has a few nice features:&lt;br /&gt;&lt;ul&gt; &lt;li&gt;XML definition of the entire UI of an application, using frames and dialogs.  In comparison with the traditional call-by-call     technique for setting up a wxPython UI, this is incredibly convenient. &lt;/li&gt;&lt;li&gt;Application-specific code grouped into simple commands. &lt;/li&gt;&lt;li&gt;Each frame and each dialog automatically binds to an XML record which can be     addressed on a field-by-field basis. &lt;/li&gt;&lt;li&gt;HTML can be used for more textual interfaces; links generate commands which can     have arbitrary effects on the UI (in this case, clicking on a link in the tag cloud     switches the tabbed frame to the file list and displays the files with the tag     selected.) &lt;/li&gt;&lt;li&gt;So far, the UI can include tabsets, list controls, HTML windows, rich text controls,     checkboxes, radio button groups and listboxes, command buttons, and static text.&lt;/li&gt; &lt;/ul&gt; Anyway, it works for this app.  The filetagger fulfills most of the &lt;a href="http://www.anappaweek.com/2006/12/requirements-for-file-tagger_21.html"&gt;requirements I posted last month&lt;/a&gt;, and can easily be added to the SendTo menu and assigned to a file extension (although I leave those as an exercise for the reader at this point -- did I mention I'm really tired?)  I didn't implement any export capabilities, for instance.  But it would be really easy to do so.&lt;br /&gt;&lt;br /&gt;It's a good first draft!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116856464197946300?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116856464197946300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116856464197946300&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116856464197946300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116856464197946300'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/at-long-fricking-last-filetagger-is.html' title='At long fricking last!  The filetagger is here!'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116805310684057231</id><published>2007-01-05T21:59:00.000-05:00</published><updated>2007-01-05T22:11:46.850-05:00</updated><title type='text'>Haven't forgotten you all</title><content type='html'>But it looks like I should next create an app-to-week ratio meter, sigh.&lt;br /&gt;&lt;br /&gt;The holidays did indeed intervene, and as I always suspected, getting my GUI framework into working shape was more work than I expected, but the task is near done.  So tomorrow or so, I'll be treating you to app #2, the file tagger.  It's kinda cool, and I find it elegant.  And since so much of the effort has gone into making the &lt;span style="font-style: italic;"&gt;framework&lt;/span&gt; elegant and reusable, my &lt;span style="font-style: italic;"&gt;next&lt;/span&gt; app should really be done in a week (or less!)  That's the game plan, anyway.  This egregious Yuletide disappearance has just been an excuse to do this right, something I've been planning for years.&lt;br /&gt;&lt;br /&gt;Onwards!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116805310684057231?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116805310684057231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116805310684057231&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116805310684057231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116805310684057231'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2007/01/havent-forgotten-you-all.html' title='Haven&apos;t forgotten you all'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116676735683333363</id><published>2006-12-21T23:11:00.001-05:00</published><updated>2006-12-22T01:09:51.166-05:00</updated><title type='text'>Requirements for the file tagger</title><content type='html'>So I've finally grabbed enough time to work out what I think the file tagger application should look like in more detail, and thought I'd at least blog that much before going on -- as you can see, this isn't going to be an app a week yet (more like a 0.5 app-to-week ratio), and I have no doubt that Dana will think that's evidence of the superiority of the .NET platform, but you and I know he's full of it.&lt;br /&gt;&lt;br /&gt;Here's how I envision it:&lt;br /&gt;&lt;br /&gt;The central data structure of the application is a list of managed files. These files can actually reside anywhere in the file system; adding a file to the list or removing it has no effect on the actual file. This is essentially a database &lt;span style="font-style: italic;"&gt;about&lt;/span&gt; the files.  We can store the following information about each file:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Where it is (the filename and full path)&lt;/li&gt;   &lt;li&gt;An optional nickname&lt;/li&gt;   &lt;li&gt;An optional descriptive text&lt;/li&gt;   &lt;li&gt;A list of tags for the file.&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; The application can run in command-line mode or in GUI mode. In command mode, you can add and delete files from the list of managed files, change their descriptive text, and import/export various things (the info for a file, the info for a tag, or the entire file database).&lt;br /&gt;&lt;br /&gt;In GUI mode, the frame consists of a menu bar, a status bar, and a tab set; the tabs are "Cloud", and "Files". (This bit of the specification may well change after I've implemented the first draft of the program.)&lt;br /&gt;&lt;br /&gt;The Cloud tab consists of the current display of the tag cloud; each tag is a link. The Files tab consists of a split screen; on the left is a bar specifying the tags displayed in the list on the right side. The right side is a columnar list with a subset of the information for each file (the name or nickname, at least some of the tags it belongs to, and the description. I guess.)&lt;br /&gt;&lt;br /&gt;When I add a file to the database, a dialog needs to appear asking me for more information about it: the nickname, tags, and description. The same dialog is used to edit information about the file. I can add a file in one of two modes -- either the dialog appears immediately, or the file added is added with a provisional tag (e.g. "new-files") and I can go back and organize all the new files at once. From the command line, the second, "silent" mode is the default. From the GUI, I can specify my preference. Note that the monitor application that miechu wrote (&lt;a href="http://www.thesoftwarejedi.com/modules/newbb/viewtopic.php?topic_id=42&amp;forum=4"&gt;see the Jedi forum&lt;/a&gt;) could invoke the file tagger in either mode, adding new files to the database automatically after, say, you download them.&lt;br /&gt;&lt;br /&gt;Anyway, in the Cloud tab, when I click on a tag, the app opens the Files tab with a list of the files in that tag. I can then edit them, etc.&lt;br /&gt;&lt;br /&gt;When I drag a file from the Explorer (or desktop, or whatever) into the application, it depends where I drop it. If I drop it when the Clouds tag is open, then the editor dialog opens for the file, allowing me to specify tags, unless I have specified silent adding. If I drop a file or files onto the Files tab, though, they're automatically added with all the tags currently shown on the Files tab (unless there's no filter active.) That way, when I've got a tag open, it acts just like a folder.&lt;br /&gt;&lt;br /&gt;I should be able to drag files &lt;span style="font-style: italic;"&gt;out&lt;/span&gt; of the app, too.  That shouldn't be hard.&lt;br /&gt;&lt;br /&gt;OK, what am I missing? Oh, yes -- import/export. Especially export. When I export a tag, I want to get a tab-delimited list of the files in it, say. Or the XML descriptions (optionally, either). And I also want to be able to export the entire tag cloud as a set of cross-linked HTML pages, so that each tag links to a page listing the contents of the tag. How that page should be formatted, I'm not sure -- I guess to make sense, each file should be able to link to some activity, but I'm open to suggestions as to what.&lt;br /&gt;&lt;br /&gt;So. That's your challenge. As usual, my main block is that I have specific ideas for extensions to my usual wxPython toolset to make this sort of UI development quick and easy, but I've never had the time to finish those tools (and as we know, I never use a tool if I can make it first. If I knew how to whittle a laptop, I wouldn't even be posting this at all -- it's all I can do to resist rewriting Blogger from scratch before starting, after all.) So the process is delayed.&lt;br /&gt;&lt;br /&gt;Incidentally, regarding my last post about deadlines -- when Sunday started, I had two very solid days of work ahead of me, but the deadline was actually Monday morning. I could live with a day's tardiness (translation customers &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; don't like lateness, but sometimes they just learn to live with it). But when I got into the work, I was totally in the Zone. I've been in the Zone when programming before -- when it all just flows, you instantly comprehend each problem, each snag, each bug, and every line you write works the first time. It's like a religious experience, except that afterwards you have something to show for it.&lt;br /&gt;&lt;br /&gt;In the four years I've been translating for a living, Sunday was the first time I hit the Zone. My fingers could do no wrong; I made next to no typos and my typing rate was some unheard of number. I didn't need to look up any words (well, it helped that the source text was very well written and all about XML as used in SAP ABAP). It just flowed. I usually figure on 4000 words translation per day as a full day. My personal record for a day was, until Sunday, about 8000 words. I don't really know. But Sunday, I translated no fewer than 16,300 words. Literally four days of work -- by 2 AM I just wanted to know how far I could take it, and at 6:30 AM, against all expectations, I simply ran out of text to translate. I actually made the deadline.&lt;br /&gt;&lt;br /&gt;All of which is a long-winded explanation (as you know, I'm incapable of any other kind) to explain why it is now Thursday and you haven't heard a peep out of me. When one does four days' work in one day, it takes time to recover. Also there were Christmas presents to wrap and still a few to obtain, packages to take to the post office to send out in &lt;span style="font-style: italic;"&gt;time&lt;/span&gt; for Christmas (largely the presents for our friends in Puerto Rico, along with one package for Hungary which won't make it in time), holiday break camps to schedule with Parks &amp; Rec for the kids, guitar strings to buy, that sort of thing.  But now I'm back.&lt;br /&gt;&lt;br /&gt;Anyway, Dana, you have your challenge -- can you write the app above in one day with .NET? (Ha, like I can write it in one day with wxPython -- I probably &lt;span style="font-style: italic;"&gt;could&lt;/span&gt;, but I won't, not this week.  I'm still ramping up.)  Maybe you could smack me around a bit about &lt;span style="font-style: italic;"&gt;that&lt;/span&gt;, since I seem to have been relatively unslappable this week.&lt;br /&gt;&lt;br /&gt;More tomorrow or on the weekend -- I really want to spend more time with my toolset before posting an app. Specifically, I've been working for a while on a simple resource-like overlay for wxPython which will allow me to express the above UI as XML, then instantiate it as an app. Yes, I know there are such things already for .NET, as painting the screen is kind of the point of rapid app development -- and actually, there's one for wxPython, too. But I don't like it. So I'm writing my own, because by God it's open source and I &lt;span style="font-style: italic;"&gt;can&lt;/span&gt;.  So.  More later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116676735683333363?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116676735683333363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116676735683333363&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116676735683333363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116676735683333363'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2006/12/requirements-for-file-tagger_21.html' title='Requirements for the file tagger'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116654314975474032</id><published>2006-12-19T10:44:00.000-05:00</published><updated>2006-12-19T10:45:49.756-05:00</updated><title type='text'>Feeds have been fixed</title><content type='html'>&lt;font color="red"&gt;Sorry for my disappearance, but have no fear - the feeds are fixed.  I'll log on later tonight and smack Michael around a little bit.&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116654314975474032?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116654314975474032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116654314975474032&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116654314975474032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116654314975474032'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2006/12/feeds-have-been-fixed.html' title='Feeds have been fixed'/><author><name>Dana Hanna</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00066765652382122256'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116632007709148622</id><published>2006-12-16T20:43:00.000-05:00</published><updated>2006-12-17T01:08:04.746-05:00</updated><title type='text'>Whew!  Busy, busy!</title><content type='html'>I've been trying to hit yesterday's job deadline today (sigh) and working with my Perl translation code to do it. My thinking is that this code is probably too specialized for general interest -- not to mention far too rough for public display -- but would anybody here be at all interested in one tech-geek professional translator's approach to language handling? If so, leave a comment and I'll see what I can do that doesn't make me look like a total linguistic amateur.&lt;br /&gt;&lt;br /&gt;Now I'm only two days behind to hit a Monday deadline for another chapter of German-to-English translation (on ABAP programming in SAP, actually) and so I'm unlikely to post much more on the file tagger app until Monday or Tuesday. Just so you're warned -- I wouldn't want anybody to suffer! (Unduly.)&lt;br /&gt;&lt;br /&gt;(Except Dana.  He's left us totally in the lurch.  So Dana should suffer.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116632007709148622?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116632007709148622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116632007709148622&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116632007709148622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116632007709148622'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2006/12/whew-busy-busy.html' title='Whew!  Busy, busy!'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37264792.post-116612604159893367</id><published>2006-12-14T14:53:00.000-05:00</published><updated>2006-12-14T16:55:24.346-05:00</updated><title type='text'>Note to self</title><content type='html'>More posts, but shorter ones.  Nobody comments on or links out of the windy ones...&lt;br /&gt;&lt;br /&gt;Dana still missing, film at 11.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37264792-116612604159893367?l=anappaweek.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://anappaweek.blogspot.com/feeds/116612604159893367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37264792&amp;postID=116612604159893367&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116612604159893367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37264792/posts/default/116612604159893367'/><link rel='alternate' type='text/html' href='http://anappaweek.blogspot.com/2006/12/note-to-self.html' title='Note to self'/><author><name>Michael</name><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='04237355372417813014'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry></feed>