<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8399696686143107112</atom:id><lastBuildDate>Sat, 17 Oct 2009 12:07:09 +0000</lastBuildDate><title>wtamatap</title><description /><link>http://www.wtamatap.com/blog/</link><managingEditor>noreply@blogger.com (Mick)</managingEditor><generator>Blogger</generator><openSearch:totalResults>105</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Wtamatap" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-4021389941977655108</guid><pubDate>Sat, 17 Oct 2009 11:53:00 +0000</pubDate><atom:updated>2009-10-17T07:07:09.829-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">requirements</category><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">documentation</category><title>Quantity vs. Quality of Requirements</title><description>I have had to get better lately at writing requirements.  In a recent project, there were two mistakes that came about because the requirements were not robust enough.  The mistakes were caught late in development, and the problem was that the developer could not complete the requirement as stated.  Ironically, it was the developer that had not thoroughly considered the requirement when agreeing to the task, and postponed all thought about it until it was too late.  We had to notify the customer that we could not deliver what was agreed to.&lt;br /&gt;&lt;br /&gt;It is well known that the requirements must be reviewed carefully with the customer to ensure their desires are well represented.  The requirements must be reviewed with equal care with the entire development team, including third party contractors, to ensure that the requirements are technically feasible.  Testers can bring clarity early, and developers often connect gaps in the requirements from their own familiarity with the systems.&lt;br /&gt;&lt;br /&gt;It had not been my intention to produce requirements in a vacuum, but it worked out that way on a particular project.  The third-party contractor reviewed the requirements, gave an estimate for the work and then, five months later when we finally moved to develop the project, the contractor could not deliver.  It was like they threw a number out at us without considering how they might solve the problem.&lt;br /&gt;&lt;br /&gt;So I am instituting explicit reviews to give people an opportunity to challenge the requirements.  It had been my habit to distribute them and solicit comments, but that's too passive.  I have to challenge people to challenge the requirements.&lt;br /&gt;&lt;br /&gt;At the same time, I've needed to produce them faster, and so I have found myself cranking lots of words in short, focused times.  This is usually at the end of the day when my goals for the day are at risk, and I need to produce.  I am simply surprised how much I get done in the last forty-five minutes before I leave, but other people are winding down, and the interruptions stop, and I can sit and think.&lt;br /&gt;&lt;br /&gt;I wish I had an office with a door, but at least I don't sit outside the men's room, where it's busy, noisy, and smelly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-4021389941977655108?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/trXNz8vGPHQ/quantity-vs-quality-of-requirements.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/10/quantity-vs-quality-of-requirements.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-6350466564738311514</guid><pubDate>Sat, 10 Oct 2009 01:03:00 +0000</pubDate><atom:updated>2009-10-09T20:18:26.920-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>Ogres Have Layers, Like Onions</title><description>I use Ubuntu on my laptop.  Specifically, I use Xubuntu.  I really like, but on rare occasions, I need to use Windows to get to Internet Explorer so that I can make a remote desktop connection; specifically, it's making a Terminal Services connection, and that just won't run under Linux.&lt;br /&gt;&lt;br /&gt;In the past, I have used rdesktop on Xubuntu to connect to a Windows box on my network, but I can't use this here to cross the firewall involved.  But I could then leap from my Windows box across the firewall to the desktop I desired.&lt;br /&gt;&lt;br /&gt;I decided to cut out the middle man, sort of, and installed Windows under Sun VirtualBox on my Xubuntu laptop, and it worked great.  It took the better part of a day to get all the service packs installed, but, now that it works, it's a very cool bit of technology to fire up the Windows virtual machine from this Linux laptop, and put it into full screen mode, and then use Remote Desktop from there to cross that firewall using Terminal Services.&lt;br /&gt;&lt;br /&gt;It's a little slice of cool to put all of that together.  It's one fairly amazing technology piled on top of the other.  Like the layers of onions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-6350466564738311514?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/ybYE64lSc0w/ogres-have-layers-like-onions.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/10/ogres-have-layers-like-onions.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-5731876934443059457</guid><pubDate>Sun, 04 Oct 2009 13:56:00 +0000</pubDate><atom:updated>2009-10-04T09:36:29.801-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>A Bigot's Approach to Web Development</title><description>I have mentioned (at length) that I am working on an application for Facebook, and using Dojo Toolkit for the browser interface.  It works great in Firefox.  I did all my development and unit testing in Firefox.  Dojo Toolkit is supposed to handle the compatibilities between browsers.  That's really great when it works.&lt;br /&gt;&lt;br /&gt;I have also mentioned that the Dojo Grid does not render correctly in IE 6 or 7.  Like an idiot, I never tried it until one of my Facebook friends mentioned that it doesn't work.  So I have finally checked it out with IE8 and discovered, much to my horror, that the grid doesn't render at all.&lt;br /&gt;&lt;br /&gt;I scoured the Dojo Toolkit website for clues, and I did find a couple, but nothing that applied to my situation.  I'm hoping they magically release a new version but, in the meantime, I'm going to release a very different version with simpler controls.  It breaks my heart a little bit, but I need to get something released.&lt;br /&gt;&lt;br /&gt;What I've learned is that I would have been much better off paying attention to the browser of my user base (IE -- still 70%) and not the one I like (Firefox).  I was bigoted; but I've got that out of my system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-5731876934443059457?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/KGGHlGdlA2k/bigots-approach-to-web-development.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/10/bigots-approach-to-web-development.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-592959217317183403</guid><pubDate>Wed, 23 Sep 2009 10:53:00 +0000</pubDate><atom:updated>2009-09-23T06:04:43.259-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><title>The Ways of Analysis</title><description>I have a variety of project at work, and so I must use a variety of techniques in conducting my analysis.  What pangs me is that not all techniques are as fun as others.  Here is my rough draft list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New Solution&lt;/li&gt;&lt;li&gt;Modify Existing Solution&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Implement Existing Vendor Solution&lt;/li&gt;&lt;li&gt;Implement Off-The-Shelf Solution&lt;/li&gt;&lt;li&gt;Implement Hosted Solution&lt;/li&gt;&lt;li&gt;Modify Hosted Solution&lt;/li&gt;&lt;/ul&gt;That's fairly reasonable order in terms of fun.  The most fun is to solve a problem with a brand new solution, the least fun is to request a fix or change to something completely out of your control.  It's hard to make your needs known and to schedule the solution.  That's just an all around pain.&lt;br /&gt;&lt;br /&gt;When you're solving a problem that, at least where you work, has not yet been solved, you have the thrill of invention combined with the discovery of a business domain.  You are Edison and Magellan, rolled into one.  If you're very lucky, you get to be Patton, as well, and lead the troops to victory.&lt;br /&gt;&lt;br /&gt;Of course, the "solution" itself has a range of fun-ness.  Some tiny, pain-in-the-butt utilities are no fun when only two people use it, and they don't even like it; it's difficult to get those modified when everyone would rather ignore it, and use something else.&lt;br /&gt;&lt;br /&gt;I happen to be working in the realm of content management at the moment, so that's a reasonably fun set of solutions.  I ain't complaining.  If I were to complain, it'd be because I'm not able to use my Cooper training at the moment, or to program in Python.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-592959217317183403?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/QNjRWWn60kA/ways-of-analysis.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/09/ways-of-analysis.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-6734141330947443662</guid><pubDate>Wed, 02 Sep 2009 10:32:00 +0000</pubDate><atom:updated>2009-09-02T05:40:15.955-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><title>Command Line Blogging</title><description>Occasionally, my creative side and my technical side complement each other.  I am preparing to write a long, long story—a work of fiction.  I intend on serializing the story on a blog, but I don't want to sign into Blogger.com and leave all the original work there, in its system.  It also doesn't feel right to just cut and paste (although, really, it would be simple enough).  I want to have the text on my Ubuntu laptop where I can be responsible for it.&lt;br /&gt;&lt;br /&gt;My first thought was to post the blog entries directly from VIM, but the nice person who figured out how to do it did not post his work anywhere that I can find it.  It really used Python to talk to google and blogger, which was fine.  There is also a version that uses Ruby in a similar fashion, but I don't want to get started with Ruby at this moment.&lt;br /&gt;&lt;br /&gt;So I found out that there is a Python recipe for talking to blogger, and I may need to wrap that in some command line options, but I'll use that to post entries to Blogger.com.  I can even do it from vim with the good old bang (!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-6734141330947443662?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/J0dDFCozMCo/command-line-blogging.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/09/command-line-blogging.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-8979448464465053535</guid><pubDate>Tue, 01 Sep 2009 02:12:00 +0000</pubDate><atom:updated>2009-08-31T21:15:52.243-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">administrative</category><category domain="http://www.blogger.com/atom/ns#">documentation</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Blog Post From the Desktop</title><description>For a variety of reasons, I am interested in posting to this blog from the desktop.  Ideally, I'd like to create text files that I store on my hard drive, then post them to Blogger.&lt;br /&gt;&lt;br /&gt;I looked at vim-blogger, but it requires VIM with Python compiled into it (I suppose I should just do that and quit goofing around).&lt;br /&gt;&lt;br /&gt;I was very hopeful for TomBoy with its Blogpost plugin, but it has not been able to connect to Blogger.&lt;br /&gt;&lt;br /&gt;Any ideas appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-8979448464465053535?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/kOodfDK0uyk/blog-post-from-desktop.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/08/blog-post-from-desktop.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-3453744408681902273</guid><pubDate>Fri, 28 Aug 2009 10:32:00 +0000</pubDate><atom:updated>2009-08-28T05:50:29.868-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Increasing Timeouts</title><description>I made a silly mistake the other day with a database query.  On my test system, it took a rather long time.  &lt;span style="font-style: italic;"&gt;Three Minutes&lt;/span&gt;.  Three minutes are an eternity if you're waiting for a database query.  Minutes give you time to think that your entire career has been a mistake, and you should have entered the priesthood.  Three minutes gives you enough time to mentally undress everyone in your cubicle isle, and then you wish you'd stayed in the priesthood fantasy.&lt;br /&gt;&lt;br /&gt;In spite of the long run time for this query, it actually seemed reasonable to me, so I moved it into my production system.  I thought that, because the production hardware is more robust than the test system, it would run faster.  I was wrong.  In fact, it took longer.  In fact, it took ten minutes and only stopped because of the timeout setting on the web server running database queries.  In ten minutes, if you're waiting for a database query, you can question the validity of the U.S. Constitution, and wonder if the Founding Fathers, some of them slave owners, drunkards, or adulterers, were reasonable human beings with a legitimate right to create a new form of government.  But ten minutes is also long enough to realize that, given similar circumstances, you'd probably own slaves, drink too much if only to avoid the diseased and putrid water, and sleep with anything that wanted to sleep with you, so maybe the separation of powers in the federal government in fine just the way it is, especially due process and double jeopardy.  (You never know when you might incriminate yourself after an arrest, and risk standing trial twice for murder.)&lt;br /&gt;&lt;br /&gt;I decided to consider the query once more.  It was, in fact, three queries in parallel, so I ran each one separately and found the offending code.  I compared it to the others that ran so much faster, and realized I was missing one of the where clauses to limit the amount of data.  This query runs against a single table with sixty million records in it.  I added the clause and, lo and behold, the query ran in a single second.&lt;br /&gt;&lt;br /&gt;I am somewhat embarrassed at the speed improvement.  This is a hey-your-fly-is-open kind of moment, and oh by the way, I'm not wearing underwear.  I'll get past it.&lt;br /&gt;&lt;br /&gt;I went to make coffee after that, and I had to brew a fresh pot.  It takes four minutes to brew fresh coffee.  &lt;span style="font-style: italic;"&gt;Four minutes!&lt;/span&gt; You know what I can consider in four minutes?  I questioned the Emancipation Proclamation, the Declaration of Independence, and the Magna Carta.  But my reasoning will be revealed in another post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-3453744408681902273?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/1J36CoEJX0M/increasing-timeouts.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/08/increasing-timeouts.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-5436069041360563158</guid><pubDate>Thu, 27 Aug 2009 10:53:00 +0000</pubDate><atom:updated>2009-08-27T06:00:29.970-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">administrative</category><title>W8 Monitr is dead -- Long Live W8 Loss</title><description>This is a notice that my interactive web site, w8monitr.com, will no longer be available at that address.  I'm pulling it down for re-tooling.&lt;br /&gt;&lt;br /&gt;However, I have also had a series of articles there that discuss my weight loss, nutrition, and healthy lifestyle.  Those I want to persist, and they'll be available over at &lt;a href="http://mickeyhadick.nfshost.com/articles/w8loss/index.html"&gt;MickeyHadick.com &lt;/a&gt;in the&lt;a href="http://mickeyhadick.nfshost.com/articles/w8loss/index.html"&gt; articles section&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-5436069041360563158?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/t0jDbeQ_r_A/w8-monitr-is-dead-long-live-w8-loss.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/08/w8-monitr-is-dead-long-live-w8-loss.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-3272784619555906276</guid><pubDate>Sat, 15 Aug 2009 11:27:00 +0000</pubDate><atom:updated>2009-08-15T06:32:40.276-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><title>Dojo Toolkit Grid Failure in Internet Explorer</title><description>For my &lt;a href="http://apps.facebook.com/toptenbeta/"&gt;facebook application&lt;/a&gt;, I use a grid embedded within a border container.  I use several grids, in fact, each on its own tab control.  I have been developing and testing with Firefox exclusively.  I invited a friend to try the app, and the crazy knucklehead discovered that it fails upon opening.  He can't touch the thing, and it turns out he uses IE.&lt;br /&gt;&lt;br /&gt;If I refresh the web page, it actually works fine.  However, each grid fails consistently the first time.  It's not like we can ask people to immediately refresh the page the first time they visit.&lt;br /&gt;&lt;br /&gt;I checked the dojo forums, and there are others with the same problem.  They have suggested various solutions that worked in their case, but none of those have worked for me.  Anyone have any experience with the dojo toolkit grid failing with IE?&lt;br /&gt;&lt;br /&gt;Please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-3272784619555906276?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/tSbtzoSePVk/dojo-toolkit-grid-failure-in-internet.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/08/dojo-toolkit-grid-failure-in-internet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-2324001934639960260</guid><pubDate>Sat, 25 Jul 2009 16:30:00 +0000</pubDate><atom:updated>2009-07-25T11:34:27.561-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Classic Debugging Situation</title><description>I released a new version of &lt;a href="http://apps.facebook.com/toptenbeta/"&gt;List Lust on Facebook&lt;/a&gt;.  One of the new features is a ready-for-print layout of the data, and it fails in one, isolated set of circumstances.  The real trick is that it's difficult to get the log running on my webserver, so I don't see the error message directly; just the 500 error displayed in the browser.&lt;br /&gt;&lt;br /&gt;But because the error scenario is isolated, and can walk through the code with what I know about the data in mind.  Wish me luck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-2324001934639960260?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/NCwCUkBIdrc/classic-debugging-situation.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/07/classic-debugging-situation.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-8491690028680031427</guid><pubDate>Mon, 20 Jul 2009 16:06:00 +0000</pubDate><atom:updated>2009-07-20T11:09:23.877-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>VIM and Tabs</title><description>This is just a short homage to a great page that reminded me of my ignorance: &lt;a href="http://www.linux.com/archive/articles/59533"&gt;Vim Tips&lt;/a&gt;.  I use gvim, and I use tabs a lot, but I hadn't gone beyond any defaults to make it better.  This web page has it all.&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;img src="img/blank.gif" alt="Link" class="gl_link" border="0" /&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/8399696686143107112-8491690028680031427?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/u0OtuzDd9YE/vim-and-tabs.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/07/vim-and-tabs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-6612114288443169370</guid><pubDate>Sat, 18 Jul 2009 12:13:00 +0000</pubDate><atom:updated>2009-07-18T07:30:38.561-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Python and CSV Processing of Unicode Text</title><description>I had a cool moment this week in that we had a challenge at work to process a file of comma-separated-values with one million records in it.  Each record had twelve values, and we only needed the eighth one.  The fact that it had over a million records made Excel quit when we tried to use that.  I volunteered to extract what we needed using Python.&lt;br /&gt;&lt;br /&gt;I happened to have Python 2.5.2 installed.  I knew there was CSV module available, but had only used it once, and that was to create a CSV.  A quick search revealed &lt;a href="http://docs.python.org/library/csv.html"&gt;this web page&lt;/a&gt;.  I also perused &lt;a href="http://effbot.org/zone/index.htm"&gt;EffBot.org&lt;/a&gt;, which was even better.  But I immediately hit a snag because the source file turned out to be Unicode.&lt;br /&gt;&lt;br /&gt;The Python docs have an example on how to deal with Unicode, but I a) didn't know the encoding, and, b) preferred if it wasn't in Unicode at all.&lt;br /&gt;&lt;br /&gt;To figure out the encoding, I used &lt;a href="http://farmdev.com/talks/unicode/"&gt;this web page, which was nothing short of brilliant&lt;/a&gt;.  I was able to list out the BOM using a simple read of the first four bytes, and deduced it was UTF-16.&lt;br /&gt;&lt;br /&gt;I then used the other examples to encode the text as simple ASCII while reading the CSV, and I was oh-so-happy.&lt;br /&gt;&lt;br /&gt;Because this was bottom-up software development, I had to wrap the small chunk of code in something manageable, so I &lt;a href="http://code.activestate.com/recipes/528877/"&gt;used this as an example&lt;/a&gt;, although there are plenty of others.  This was a nice skeleton example with command line arguments.  We expect more of these files, so I have to manage this on a regular basis.&lt;br /&gt;&lt;br /&gt;I finished it off by having the program create new files of no more than 100,000 records, and just included the one value we want, and included a heartbeat so that I knew it was working.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-6612114288443169370?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/7WebKyj3K9k/python-and-csv-processing-of-unicode.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/07/python-and-csv-processing-of-unicode.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-5462190180882699147</guid><pubDate>Sun, 28 Jun 2009 16:20:00 +0000</pubDate><atom:updated>2009-06-28T11:30:29.563-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>VIM and Me</title><description>Have I mentioned that I returned to my roots by forcing myself to use VIM.  It's really not a burden, but did challenge me to recall long forgotten thought patterns.  Your brain works differently when you use VIM, and that's what I wanted to experience again.&lt;br /&gt;&lt;br /&gt;One of the tools that kept me away from VIM was the Programmer's File Editor (PFE).  It had a number of cool macro features that are straight forward and highly effective.  However, VIM has a macro feature too, and I'm enjoying it.&lt;br /&gt;&lt;br /&gt;There are better tools out there, and maybe UltraEdit is better overall, but I kind of like being a Unix Zealot again, and using VIM as much as possible is a big part of that.&lt;br /&gt;&lt;br /&gt;The real point of the post is that, among many great tutorials on VIM, here is a nice, comprehensive one: &lt;a href="http://tottinge.blogsome.com/use-vim-like-a-pro/"&gt;Using VIM Like a Pro&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-5462190180882699147?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/8Ib4XjG5B4s/vim-and-me.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/06/vim-and-me.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-1601132333765753292</guid><pubDate>Fri, 26 Jun 2009 12:17:00 +0000</pubDate><atom:updated>2009-06-26T07:25:33.149-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">facebook</category><title>Making my Facebook Application More Viral</title><description>I have basic functionality in my facebook app, but the friends to whom I've suggested it don't use it.  It seems that it flat out is not infectious.  I had harbored dreams that it would be like those "Living Social" applications.  Just before I started inviting my friends, the "Top Five" application was released, and I definitely had that sick feeling in my stomach about because it worked well, was cute and clever with the pictures, and moved from friend to friend like a cold through a children's daycare center.&lt;br /&gt;&lt;br /&gt;What I'm working on now is the newsfeed features so that, if any of my friends ever do use it, it will be streamed on their wall.  I'm hoping that may encourage other users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-1601132333765753292?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/4migd-A4lW4/making-my-facebook-application-more.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/06/making-my-facebook-application-more.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-2443919502114895842</guid><pubDate>Fri, 12 Jun 2009 11:11:00 +0000</pubDate><atom:updated>2009-06-12T06:15:49.962-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">turbogears</category><title>Nested facebook screens</title><description>My iFrame Facebook application suffers from nested screens on a few occasions, and I haven't been able to fix that yet.  I don't understand enough of the subtleties of HTML, iFrames, and anchor to know what is going on.  And the way Facebook embeds your application deep within their DOM structure, I'm at a loss.&lt;br /&gt;&lt;br /&gt;So a call to the lazy web: anyone have any luck with this.  If you want to see what I'm talking about, add my application at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://apps.facebook.com/toptenbeta/"&gt;http://apps.facebook.com/toptenbeta/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and when you are through, my app will be nested in a facebook double-image.  Refreshing the browser makes it all good.&lt;br /&gt;&lt;br /&gt;The way I invite friends does the same thing.&lt;br /&gt;&lt;br /&gt;I need help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-2443919502114895842?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/DO-DTYeUM_s/nested-facebook-screens.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/06/nested-facebook-screens.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-8120507243259112400</guid><pubDate>Wed, 03 Jun 2009 10:50:00 +0000</pubDate><atom:updated>2009-06-04T05:26:39.662-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">turbogears</category><title>Multi-Friend Selector</title><description>I had said I'd post my multi-friend selector code, and someone finally asked, so here it is:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.developers.facebook.com/index.php/Multi_friend_selector"&gt;http://wiki.developers.facebook.com/index.php/Multi_friend_selector&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm delivering it directly from my web server, rather than messing with KID.&lt;br /&gt;&lt;br /&gt;I'm going to figure out how to do it entirely in javascript, next.  That should be better.&lt;br /&gt;&lt;br /&gt;Also note that the xd_receiver is being served from a sub-directory of the main web server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-8120507243259112400?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/rEBoXanz-Ws/multi-friend-selector.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/06/multi-friend-selector.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-8888285596943978356</guid><pubDate>Thu, 02 Apr 2009 22:59:00 +0000</pubDate><atom:updated>2009-04-02T18:08:28.258-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">turbogears</category><title>Rendering a Multi-Friend Selector in a Facebook iFrame Application using XFBML</title><description>I struggled with the problem of rendering a multi-friend-selector in a Facebook iFrame application.  In fact, it was stopping me ice cold in my project, because I couldn't translate the PHP examples into TurboGears, Python, and DojoToolkit.  Well now I've done it.&lt;br /&gt;&lt;br /&gt;The most embarrassing part is that I ultimately stepped through the &lt;a href="http://wiki.developers.facebook.com/index.php/XFBML"&gt;XFBML introduction on Facebook&lt;/a&gt; to make it work.  It was really all there, I just had to remove my fear of the unknown and persist.  I made it a bit easier for myself by serving up the HTML directly from my TurboGears controller using Python, and that helped me work through it.&lt;br /&gt;&lt;br /&gt;It also depended on the Django example of Facebook integration to encode the embedded XML within the text.&lt;br /&gt;&lt;br /&gt;If interested, drop me a line.  I'm not publishing it here only because it's a lot of code, and will not look good.  I'd rather put it on the Facebook developers wiki.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-8888285596943978356?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/MfPDzyXgkrk/rendering-multi-friend-selector-in.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/04/rendering-multi-friend-selector-in.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-1928393189493316797</guid><pubDate>Mon, 23 Mar 2009 12:05:00 +0000</pubDate><atom:updated>2009-03-23T07:05:00.943-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">administrative</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>The Big Celtx Workaround -- WebDAV on Xubuntu</title><description>My next big problem is using Celtx 2.0 on Xubuntu.  It works pretty well, but the feature needed to typeset the script into industry standard format needs to be online, and that is not working on my Xubuntu system (a problem shared with other Linux and Windows users).  It is vexing and stubborn.&lt;br /&gt;&lt;br /&gt;So I'm attempting to install WebDAV to create my own online repository.  I'll use my laptop to edit, and when I need to print, I'm going to copy the script to a web site with WebDAV and use a different computer to access it and print.&lt;br /&gt;&lt;br /&gt;Silly, but it'll get me past this problem.  I've lost about four days spinning my wheels on this.&lt;br /&gt;&lt;br /&gt;I'm posting the instructions I'm using for posterity sake (to help me remember in the future).  This is what I used....&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linuxquestions.org/linux/answers/Applications_GUI_Multimedia/Setting_up_davfs2_with_the_Ubuntu_package"&gt;http://www.linuxquestions.org/linux/answers/Applications_GUI_Multimedia/Setting_up_davfs2_with_the_Ubuntu_package&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;a href="http://www.howtoforge.com/davfs_ubuntu"&gt;&lt;br /&gt;http://www.howtoforge.com/davfs_ubuntu&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-1928393189493316797?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/Xw2iiFEocsM/big-celtx-workaround-webdav-on-xubuntu.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/03/big-celtx-workaround-webdav-on-xubuntu.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-1189396182717626828</guid><pubDate>Sun, 22 Mar 2009 11:56:00 +0000</pubDate><atom:updated>2009-03-22T07:05:06.528-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><title>The First Big Workaround</title><description>I'm struggling with my two main interests right now: the web project for Facebook, and using Celtx as scriptwriting software for Linux (Xubuntu).&lt;br /&gt;&lt;br /&gt;The first one is my problem in figuring out how to invite friends to use my (wonderful) application on Facebook.  There are suggested ways, but I need a solid example on how to do this for an iFrame application.  Nothing is complete, and I haven't the time to figure out the missing pieces.  I'm really quite desperate on this one.&lt;br /&gt;&lt;br /&gt;How desperate?  I am asking for help here on the internet.  That's how bad.  I'm sure that if I had a job I didn't really care about, I'd take a few days off and work it out.&lt;br /&gt;&lt;br /&gt;If you have an example on how to render a multi-friend selector with an invitation to use a Facebook application in an iFrame, do let me know.  Thanks in advance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-1189396182717626828?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/PZ7BjgBIgok/first-big-workaround.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/03/first-big-workaround.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-6967037701066192612</guid><pubDate>Sun, 15 Mar 2009 11:47:00 +0000</pubDate><atom:updated>2009-03-15T07:21:03.879-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">webfaction</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">turbogears</category><title>When Persistence Becomes Silly Obsession</title><description>I noticed that it has been exactly six months since &lt;a href="http://www.wtamatap.com/blog/2008/09/building-pyramid-one-darned-block-at.html"&gt;I declared in a posting&lt;/a&gt; that my web project was beginning to take shape.  It really is, now, starting to take shape, but I made a huge detour in making it &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Facebook&lt;/span&gt; compatible.&lt;br /&gt;&lt;br /&gt;From a strictly programming-technology point of view, the project uses &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Dojo&lt;/span&gt; Toolkit to present the interaction framework, which includes tabs, grids, accordion things, drop-down &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;tooltip&lt;/span&gt; dialogs, and modal dialogs.  Those elements use AJAX to talk to the Python and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;TurboGears&lt;/span&gt; server with a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;PostgreSQL&lt;/span&gt; database, which is now hosted on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;WebFaction&lt;/span&gt;.  It does all of this in a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Facebook&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;iFrame&lt;/span&gt;.  Oddly enough, I now feel like I'm more of a JavaScript programmer than I am a Python programmer, and I really miss Python.&lt;br /&gt;&lt;br /&gt;My final mystery is figuring out the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;XFBML&lt;/span&gt; necessary to create an "Invite Friends" dialog.  I really think I want to do it with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Facebook's&lt;/span&gt; AJAX object, but I haven't found great documentation on it.  &lt;a href="http://wiki.developers.facebook.com/index.php/JavaScript_Client_Library"&gt;There is some documentation, here, though.&lt;/a&gt;  So I'm going to give that a try right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-6967037701066192612?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/6Tfu1vIOEb8/when-persistence-becomes-silly.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/03/when-persistence-becomes-silly.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-2034536249178474353</guid><pubDate>Fri, 27 Feb 2009 01:55:00 +0000</pubDate><atom:updated>2009-02-26T21:40:17.288-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Persistence of the Programmer</title><description>I haven't blogged in a month, but that's because the few scant moments I can spare for this hobby I have been struggling with several Dojo features.  The most troubling has been drag and drop (DnD).&lt;br /&gt;&lt;br /&gt;As is often the case, the simple examples work great, especially those using declared, rather than programmatic, HTML.  They drag, they drop, and everything is great.  But when I tried to make things happen they way I wanted them to, to implement the functionality I wanted, using javascript and the Dojo libraries, and the fancy-schmancy creator functions, errors are getting thrown left and right.&lt;br /&gt;&lt;br /&gt;So here is what I learned about Dojo DnD: you have to destroy any existing sources before creating a new one to attach to the same DOM node.  In some program architectures it wouldn't matter, say, if the web page was reloaded all the time, but my approach is a single page and javascript does all the interaction.  That one source was hanging around, and trying to reuse the DOM node failed.&lt;br /&gt;&lt;br /&gt;It took me four weeks to figure that out as I experimented with different techniques, and eliminated possible causes.  I'm not really proud of my accomplishment, but I am surprised at my own persistence.&lt;br /&gt;&lt;br /&gt;Dojo is really a fun approach to web programming.  I'm using the grid, tabs, border container, tool tips, dialog boxes, and DnD, all jammed onto a single HTML page.  It's probably a mess, but because I wrote it, I can still find things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-2034536249178474353?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/tJm2GeP7F9Q/persistence-of-programmer.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/02/persistence-of-programmer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-4936954968194605110</guid><pubDate>Sun, 25 Jan 2009 18:02:00 +0000</pubDate><atom:updated>2009-01-25T13:17:25.066-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Dojo Toolkit: ItemFileReadStore vs. QueryReadStore in a Grid</title><description>My web project uses a Dojo grid backed by a data store.  The data stores calls a web service (a URL) to retrieve data.  The data store passes it to a model (dojox.data.grid.DojoData) which then lays out the data for the grid.  I had a heck of a time getting the grid to refresh its data when the server data was updated.&lt;br /&gt;&lt;br /&gt;Given a grid with a JavaScript variable name of "grid", I tried &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;grid.refresh()&lt;/span&gt;&lt;/span&gt;, but to no avail.  I then tried &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;grid.model.refresh()&lt;/span&gt;&lt;/span&gt;; again, nothing.  I also tried &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;grid.model.store.fetch()&lt;/span&gt;&lt;/span&gt;.  Still no update to the grid on the screen.&lt;br /&gt;&lt;br /&gt;The books and articles make it sound like all the plumbing takes care of everything, and it will notice these things.  In fact, the grid examples often use the ItemFileReadStore to fetch the data.  However, as &lt;a href="http://dojocampus.org/content/2008/06/04/refreshing-a-data-store/"&gt;this article explains&lt;/a&gt;, ItemFileReadStore will only fetch once.  It's nearly impossible to force it to go back to the server.&lt;br /&gt;&lt;br /&gt;I pursued the suggestion of using QueryReadStore instead.  By watching the server traffic, I confirmed that &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;grid.model.store.fetch()&lt;/span&gt;&lt;/span&gt; did retrieve the data, but again the grid view was unchanged.  Finally, I added &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;grid.model.refresh()&lt;span style="font-family: times new roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;and the grid view was correct.&lt;br /&gt;&lt;br /&gt;It took me about a day of exploring to get it right.  I hope I never, ever forget.&lt;br /&gt;&lt;br /&gt;By the way, I'm reading &lt;a href="%3Ca%20href=%22http://www.amazon.com/gp/product/1934356115?ie=UTF8&amp;amp;tag=mickhadi-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1934356115%22%3EMastering%20Dojo:%20JavaScript%20and%20Ajax%20Tools%20for%20Great%20Web%20Experiences%20%28Pragmatic%20Programmers%29%3C/a%3E%3Cimg%20src=%22http://www.assoc-amazon.com/e/ir?t=mickhadi-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1934356115%22%20width=%221%22%20height=%221%22%20border=%220%22%20alt=%22%22%20style=%22border:none%20%21important;%20margin:0px%20%21important;%22%20/%3E"&gt;"Mastering Dojo" by Gill, Riecke, and Russell&lt;/a&gt;.  It's quite good, and if I had more time to concentrate an what they wrote, would answer all my questions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-4936954968194605110?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/j084ou49_QU/dojo-toolkit-itemfilereadstore-vs.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/01/dojo-toolkit-itemfilereadstore-vs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-2453807772482093827</guid><pubDate>Fri, 23 Jan 2009 11:55:00 +0000</pubDate><atom:updated>2009-01-23T07:01:22.992-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">dojotoolkit</category><category domain="http://www.blogger.com/atom/ns#">programming</category><title>Dojo Toolkit Examples on DojoCampus</title><description>I was struggling mightily with Dojo, specifically to get a TabContainer to work inside a BorderContainer, and even before that, to get just a BorderContainer to display correctly.  It was a mess, and entering the example provided in &lt;a href="http://dojotoolkit.org/book/dojo-book-1-0"&gt;the book of Dojo&lt;/a&gt; didn't do much.  That was very annoying, and made me wonder if I had gone down the wrong road.&lt;br /&gt;&lt;br /&gt;Enter google.  Persistent searches for examples brought me to the DojoCampus.org, specifically &lt;a href="http://dojocampus.org/explorer/"&gt;the Explorer, &lt;/a&gt;where I found some examples that worked great.&lt;br /&gt;&lt;br /&gt;And just like that, I'm happy and productive again, troubled only by own lack talent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-2453807772482093827?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/jCjuQvEfuko/dojo-toolkit-examples-on-dojocampus.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/01/dojo-toolkit-examples-on-dojocampus.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-8107442003446934443</guid><pubDate>Thu, 22 Jan 2009 00:32:00 +0000</pubDate><atom:updated>2009-01-21T20:45:55.113-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">requirements</category><category domain="http://www.blogger.com/atom/ns#">analysis</category><category domain="http://www.blogger.com/atom/ns#">cooper</category><title>Goal-Directed Design: Analyzing the Interviews</title><description>After the interviews, the next step in goal-directed design is to analyze them for the underlying behaviors and characteristics.  Based on the interview strategy, and what was discussed in the interviews (especially unanticipated characteristics), determine up to 25 characteristics common to your interviewees, but which differ in degree.&lt;br /&gt;&lt;br /&gt;For instance, all your users have an age, so that is the characteristic, and you would plot their different ages on a horizontal scale.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;AGE:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;|--------------------------------------------|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Young......................................Old&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Your users have a certain amount of experience using computers:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;EXPERIENCE:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;|--------------------------------------------|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Little...................................A Lot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If the educational backgrounds of the users is pertinent to the solution, plot that as well:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;EDUCATION:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;|--------------------------------------------|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;High School...............................Ph.D&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And so on.  It is the particulars of the interview pool and the questions asked that determine the specific data items.&lt;br /&gt;&lt;br /&gt;Once all the interviewees have been plotted on these scales, you then look for patterns.  As clusters emerge, the characteristics of the archetypal user is defined.&lt;br /&gt;&lt;br /&gt;The next step is to define the primary and secondary personas, basing those personality traits on the behaviors and characteristics determined by the patterns discovered in the interviews.&lt;br /&gt;&lt;br /&gt;It is the strength of these personas that give greater strength to the design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-8107442003446934443?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/Io7THPxOszs/goal-directed-design-analyzing.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/01/goal-directed-design-analyzing.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8399696686143107112.post-1131732415497142522</guid><pubDate>Mon, 19 Jan 2009 12:29:00 +0000</pubDate><atom:updated>2009-01-19T07:46:51.340-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">requirements</category><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">turbogears</category><title>TurboGears, Visits in the Identity Module, and Facebook</title><description>For the record, one of the problems I was experiencing with creating an iFrame application with TurboGears and Dojo Toolkit for Facebook was that the Visit cookie was not being sent.  It took me weeks to realize this, and I had simply ignored it for a while to work on other things, but finally had enough functionality to really need to solve that problem.&lt;br /&gt;&lt;br /&gt;A little background for the search engine crawlers: the Identity module for TurboGears generates a unique Visit identifier, and that must be sent as a cookie from the browser to associate the user with the login.  It preserves the state of the login, essentially, with that cookie.  I am trying to run an application in a Facebook iFrame, and could not preserve the state of the login.  It's also very, very difficult to debug this, even with FireBug.&lt;br /&gt;&lt;br /&gt;I suspected that the cookie with the Visit key was not being sent, and this led me to the APP.CFG settings, where I realized the settings were wrong--but fixing the settings did not fix the problem.  I did more research, and found the answer in &lt;a href="http://docs.turbogears.org/1.0/Configuration"&gt;docs.turbogears.com&lt;/a&gt;.  The answer, as it often is, was there the whole time. &lt;br /&gt;&lt;br /&gt;I could manually send the Visit key in each GET or POST request as a parameter.  I needed two settings:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;visit.source - set it to "form" (or "cookie, form")&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;visit.form.name - set it to the name of the parameter to be sent ("tg_visit")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I now include that parameter on every request, and get the key in the KID template by referencing:&lt;br /&gt;&lt;ul&gt;&lt;li style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;${tg.identity.visit_key}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;${tg.config('visit.form.name','tg_visit')}&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I set those to JavaScript variables, and use them with everything sent back to the server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8399696686143107112-1131732415497142522?l=www.wtamatap.com%2Fblog%2Findex.html'/&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Wtamatap/~3/rO2LZbfpoJE/turbogears-visits-in-identity-module.html</link><author>noreply@blogger.com (Mick)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.wtamatap.com/blog/2009/01/turbogears-visits-in-identity-module.html</feedburner:origLink></item></channel></rss>
