<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1901813988295366954</id><updated>2012-02-16T00:03:37.043-08:00</updated><category term='Python'/><category term='flash'/><category term='Code'/><category term='Google Chrome'/><category term='Languages'/><category term='css'/><category term='javascript'/><category term='design'/><category term='Humor'/><category term='communication'/><category term='overlay'/><category term='Lisp'/><category term='Video'/><category term='teams'/><category term='Education'/><category term='Scheme'/><title type='text'>devlishgenius</title><subtitle type='html'>Stuff related to Software Development, or being a developer</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-1301910213068163220</id><published>2010-11-29T19:04:00.000-08:00</published><updated>2010-11-29T19:06:03.098-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Cool git pic (tho I use hg)</title><content type='html'>http://panela.blog-city.com/git_supervisual_cheatsheet.htm

http://files.blog-city.com/files/F05/96843/p/f/gitcheat.png&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-1301910213068163220?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/1301910213068163220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=1301910213068163220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1301910213068163220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1301910213068163220'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2010/11/cool-git-pic-tho-i-use-hg.html' title='Cool git pic (tho I use hg)'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-3768096877708165442</id><published>2010-11-28T21:05:00.000-08:00</published><updated>2010-11-28T21:08:27.131-08:00</updated><title type='text'>A dead yacc</title><content type='html'>http://arxiv.org/abs/1010.5023

We present two novel approaches to parsing context-free languages. The first approach is based on an extension of Brzozowski's derivative from regular expressions to context-free grammars. The second approach is based on a generalization of the derivative to parser combinators. The payoff of these techniques is a small (less than 250 lines of code), easy-to-implement parsing library capable of parsing arbitrary context-free grammars into lazy parse forests. Implementations for both Scala and Haskell are provided. Preliminary experiments with S-Expressions parsed millions of tokens per second, which suggests this technique is efficient enough for use in practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-3768096877708165442?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/3768096877708165442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=3768096877708165442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3768096877708165442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3768096877708165442'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2010/11/cool-i-ought-to-w.html' title='A dead yacc'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-6954291473304440126</id><published>2009-12-24T09:18:00.001-08:00</published><updated>2009-12-24T09:20:14.843-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Hahaha!</title><content type='html'>http://www.joeydevilla.com/2009/12/16/how-fanboys-see-operating-systems/

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.joeydevilla.com/wordpress/wp-content/uploads/2009/12/howfanboysseeoperatingsystems.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 588px; height: 430px;" src="http://www.joeydevilla.com/wordpress/wp-content/uploads/2009/12/howfanboysseeoperatingsystems.jpg" border="0" alt="" /&gt;&lt;/a&gt;

http://www.rubyinside.com/holiday-fun-how-programming-language-fanboys-see-each-others-languages-2911.html

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rubyinside.com/wp-content/uploads/2009/12/language-fanboys.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 640px; height: 420px;" src="http://www.rubyinside.com/wp-content/uploads/2009/12/language-fanboys.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-6954291473304440126?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/6954291473304440126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=6954291473304440126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6954291473304440126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6954291473304440126'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2009/12/hahaha.html' title='Hahaha!'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-1554147747489645327</id><published>2009-01-13T22:46:00.000-08:00</published><updated>2009-01-13T22:46:07.896-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>w00t! The BDFL is Python history blogging!</title><content type='html'>&lt;a href="http://python-history.blogspot.com/2009/01/pythons-design-philosophy.html"&gt;Python's Design Philosophy&lt;/a&gt;:&lt;blockquote style="border: thick dotted purple; padding: 7px; font-family: courier new;"&gt;First of all, Python was originally conceived as a one-person &amp;#8220;skunkworks&amp;#8221; project &amp;#8211; there was no official budget, and I wanted results quickly, in part so that I could convince management to support the project (in which I was fairly successful). This led to a number of timesaving rules:&lt;ul&gt;&lt;li&gt; Borrow ideas from elsewhere whenever it makes sense.&lt;br /&gt;&lt;li&gt; &amp;#8220;Things should be as simple as possible, but no simpler.&amp;#8221; (Einstein)&lt;br /&gt;&lt;li&gt; Do one thing well (The "UNIX philosophy").&lt;br /&gt;&lt;li&gt; Don&amp;#8217;t fret too much about performance--plan to optimize later when needed.&lt;br /&gt;&lt;li&gt; Don&amp;#8217;t fight the environment and go with the flow.&lt;br /&gt;&lt;li&gt; Don&amp;#8217;t try for perfection because &amp;#8220;good enough&amp;#8221; is often just that.&lt;br /&gt;&lt;li&gt; (Hence) it&amp;#8217;s okay to cut corners sometimes, especially if you can do it right later.&lt;br /&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-1554147747489645327?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/1554147747489645327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=1554147747489645327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1554147747489645327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1554147747489645327'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2009/01/w00t-bdfl-is-python-history-blogging.html' title='w00t! The BDFL is Python history blogging!'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-7261925768954403430</id><published>2009-01-03T13:18:00.000-08:00</published><updated>2009-01-03T13:27:27.037-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>If Languages were ...</title><content type='html'>&lt;span style="font-family: arial;"&gt;Via &lt;/span&gt;&lt;a style="font-family: arial;" href="http://lambda-the-ultimate.org/node/3133"&gt;Lambda the Ultimate&lt;/a&gt;&lt;span style="font-family: arial;"&gt;. My favorite is "&lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.aegisub.net/2008/12/if-programming-languages-were-religions.html"&gt;If Languages were Religions&lt;/a&gt;&lt;span style="font-family: arial;"&gt;":&lt;/span&gt;&lt;blockquote style="border: thick dotted purple; padding: 7px; font-family: courier new;"&gt;&lt;p&gt;C would be Judaism - it's old and restrictive, but most of the world is familiar with its laws and respects them. The catch is, you can't convert into it - you're either into it from the start, or you will think that it's insanity. Also, when things go wrong, many people are willing to blame the problems of the world on it.&lt;/p&gt;

&lt;p&gt;. . .&lt;/p&gt;

&lt;p&gt;C# would be Mormonism - At first glance, it's the same as Java, but at a closer look you realize that it's controlled by a single corporation (which many Java followers believe to be evil), and that many theological concepts are quite different. You suspect that it'd probably be nice, if only all the followers of Java wouldn't discriminate so much against you for following it.&lt;/p&gt;

&lt;p&gt;. . .&lt;/p&gt;

&lt;p&gt;Lisp would be Zen Buddhism - There is no syntax, there is no centralization of dogma, there are no deities to worship. The entire universe is there at your reach - if only you are enlightened enough to grasp it. Some say that it's not a language at all; others say that it's the only language that makes sense.&lt;/p&gt;

&lt;p&gt;Haskell would be Taoism - It is so different from other languages that many people don't understand how can anyone use it to produce anything useful. Its followers believe that it's the true path to wisdom, but that wisdom is beyond the grasp of most mortals.&lt;/p&gt;

&lt;p&gt;. . .&lt;/p&gt;

&lt;p&gt;Perl would be Voodoo - An incomprehensible series of arcane incantations that involve the blood of goats and permanently corrupt your soul. Often used when your boss requires you to do an urgent task at 21:00 on friday night.&lt;/p&gt;

&lt;p&gt;. . .&lt;/p&gt;

&lt;p&gt;Ruby would be Neo-Paganism - A mixture of different languages and ideas that was beaten together into something that might be identified as a language. Its adherents are growing fast, and although most people look at them suspiciously, they are mostly well-meaning people with no intention of harming anyone.&lt;/p&gt;

&lt;p&gt;Python would be Humanism: It's simple, unrestrictive, and all you need to follow it is common sense. Many of the followers claim to feel relieved from all the burden imposed by other languages, and that they have rediscovered the joy of programming. There are some who say that it is a form of pseudo-code.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-7261925768954403430?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/7261925768954403430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=7261925768954403430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/7261925768954403430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/7261925768954403430'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2009/01/if-languages-were.html' title='If Languages were ...'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-6550704574985617044</id><published>2008-11-19T20:57:00.000-08:00</published><updated>2008-11-19T21:11:58.864-08:00</updated><title type='text'>The 56, 5 Book Meme</title><content type='html'>&lt;blockquote&gt;These operators allow the specification, selection, and modification of fonts (descriptions of typefaces) and provide the means to render characters from those fonts onto the page.&lt;/blockquote&gt;

&lt;a href="http://www.amazon.com/Postscript-Language-Reference-Manual-Systems/dp/0201101696/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1227157456&amp;sr=8-2"&gt;PostScript&amp;trade; Language Reference Manual&lt;/a&gt;, &lt;a href="http://www.adobe.com/"&gt;Adobe Systems Incorporated&lt;/a&gt;
&lt;p&gt;
Pass it on:
&lt;p&gt;
  1. Grab the nearest book.
&lt;p&gt;
  2. Open it to page 56.
&lt;p&gt;
  3. Find the fifth sentence.
&lt;p&gt;
  4. Post the text of the sentence in your journal along with these # instructions.
&lt;p&gt;
  5. Don't dig for your favorite book, the cool book, or the intellectual one: pick the CLOSEST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-6550704574985617044?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/6550704574985617044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=6550704574985617044' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6550704574985617044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6550704574985617044'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/11/56-5-book-meme.html' title='The 56, 5 Book Meme'/><author><name>kbob</name><uri>http://www.blogger.com/profile/15597864779819551912</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-6748153471061062838</id><published>2008-10-25T13:37:00.000-07:00</published><updated>2008-10-25T15:07:53.177-07:00</updated><title type='text'>Announcing better-makefiles</title><content type='html'>Today I created a new open source project, &lt;a href="http://gitorious.org/projects/better-makefiles"&gt;better-makefiles&lt;/a&gt;.
It's a makefile schema that's significantly better than what most projects use.
&lt;p&gt;
I had two ideas, and I rubbed them together to make this.
The first idea is &lt;a href="http://miller.emu.id.au/pmiller/books/rmch/"&gt;Recursive Make Considered Harmful&lt;/a&gt;, Peter Miller's 1997 paper that argues that you shouldn't run make in each directory of the project.  Instead, you should run it at the project root and let it see dependencies through the whole project.  That lets make get the dependency analysis right, and it runs faster too.
But do use include files to keep make's info near the files.
&lt;p&gt;
The second idea is that I'd really like to get rid of as much noise as possible in the per-directory files.  I got it down to this.
&lt;p&gt;
Sample Dir.make:

&lt;pre&gt;
   dirs := sub1 sub2             # there are two subdirectories.
   programs := foo               # build one program, foo.
   libs := libfoo                # build one library, libfoo.

   foo_cfiles := foo.c           # build foo from foo.c...
   foo_libs := libbar            # ... and from libbar.  (make will find it.)

   libfoo_cfiles := lf.c other.c # build libfoo from two source files.
&lt;/pre&gt;

That's it.  Exactly zero boilerplate, just an explicit description of everything make should build.
&lt;p&gt;
Four stars.  kbob says check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-6748153471061062838?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/6748153471061062838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=6748153471061062838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6748153471061062838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6748153471061062838'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/10/announcing-better-makefiles.html' title='Announcing better-makefiles'/><author><name>kbob</name><uri>http://www.blogger.com/profile/15597864779819551912</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-3325394292927850184</id><published>2008-10-09T23:04:00.001-07:00</published><updated>2008-10-09T23:11:08.308-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>First Post!</title><content type='html'>checkman invited me to join this 'blog this morning.  Thanks, Casey.  It's great to be here.

I've been writing a Scheme interpreter in my spare time recently.  It's just one of those things a guy's got to do sometimes.  I've written a little about it in my own 'blog.  Here are some links.
&lt;ul&gt;&lt;li&gt;&lt;a href="http://kernelbob.wordpress.com/2008/10/09/scheming-part-2/"&gt;Scheming, part 2&lt;/a&gt;, October 9&lt;/li&gt;&lt;li&gt;&lt;a href="http://kernelbob.wordpress.com/2008/09/25/scheming-part-1/"&gt;Scheming, part 1&lt;/a&gt;, September 25&lt;/li&gt;&lt;li&gt;&lt;a href="http://kernelbob.wordpress.com/2008/09/11/not-another-scheme-interpreter/"&gt;Not another Scheme interpreter!&lt;/a&gt;, September 11&lt;/li&gt;&lt;/ul&gt;I'll keep working on it and writing about it occasionally.  I'll have to figure out what to post here and what to post there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-3325394292927850184?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/3325394292927850184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=3325394292927850184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3325394292927850184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3325394292927850184'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/10/first-post.html' title='First Post!'/><author><name>kbob</name><uri>http://www.blogger.com/profile/15597864779819551912</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-1564487109407704336</id><published>2008-10-07T12:30:00.001-07:00</published><updated>2008-10-07T13:37:28.749-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Google Chrome and Disk Activity</title><content type='html'>So far, I've been really impressed with &lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;, the new Web browser from Google.  As &lt;a href="http://blog.gadodia.net/google-chrome-pros-and-cons/"&gt;others have pointed out&lt;/a&gt;, it doesn't deliver all the features and extensibility of Firefox.  But, given that it is still in beta, it is relatively mature and stable.  That should not be too much of a surprise because it is built using pre-existing components, such as Apple WebKit, which have been around long enough to have achieved stability.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;At my work, all new Web projects are now being tested against Chrome in addition to the other popular browsers we are required to support (MSIE, Firefox, Safari, and sometimes Opera).  That's because we recognize that, before too long, Chrome will likely have significant market share, and we will be required to support it too.
&lt;div&gt;
&lt;/div&gt;&lt;div&gt;But, one thing that really concerned me about Chrome was that, every so often, my hard drive would go crazy with activity, and my computer would become nearly unusable.  I went searching for an answer, and naturally this problem has been reported and solved by others.  According to &lt;a href="http://impl.emented.com/2008/09/10/google-chrome-tips-reducing-high-disk-and-cpu-activity/"&gt;this source&lt;/a&gt; and &lt;a href="http://www.chromeplugins.org/google/chrome-talk/why-so-heavy-disk-i-o-37.html"&gt;this source,&lt;/a&gt; (and probably other more authoritative ones) the secret is to disable the "phishing and malware protection" option (see Customize &gt; Options &gt; Under the Hood &gt; Security).  Having done that, the problem instantly went away for me.  I cannot recommend this solution for others however, for obvious reasons.  &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This problem should underscore the fact that one should not use a Web browser for general Web surfing if it is not yet mature (e.g. Chrome) or it is has a long history of security problems (e.g. MSIE).  I do use MSIE to visit some Web sites if they use a media plugin that is not supported in other browsers (e.g. Netflix Watch Instantly), but I never use it for general surfing.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;It will be exciting to see Chrome mature, because it will surely influence future Web browser development, and, over time as new ideas introduced in Chrome are implemented across the industry, it will likely change the way we experience the Web.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-1564487109407704336?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/1564487109407704336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=1564487109407704336' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1564487109407704336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/1564487109407704336'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/10/google-chrome-and-disk-activity.html' title='Google Chrome and Disk Activity'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-2388195027692301930</id><published>2008-10-05T11:39:00.000-07:00</published><updated>2008-10-05T12:44:41.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Code'/><title type='text'>Logging in real time in Python</title><content type='html'>&lt;span style="font-family:arial;"&gt;I needed the ability to log the output of commands executed by my script as subprocesses. Two requirements made this more difficult than simply using&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;os.system&lt;/span&gt;&lt;span style="font-family:arial;"&gt;:&lt;/span&gt;
&lt;ul style="font-family: arial;"&gt;&lt;li&gt;The subprocess's output needs to be captured and logged (not just dumped to the terminal)&lt;/li&gt;&lt;li&gt;The subprocess's output needs to be captured and logged in real time
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:arial;"&gt;Searching the web did not come up with any good solutions. Python's existing&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;subprocess&lt;/span&gt; &lt;span style="font-family:arial;"&gt;module is very useful and almost works here: According to the docs you can send a subprocess's&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;STDOUT&lt;/span&gt; &lt;span style="font-family:arial;"&gt;and&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;STDERR&lt;/span&gt; &lt;span style="font-family:arial;"&gt;to a file-like object. But unfortunately, internally it seems to grab the file-like object's file descriptor, copy it, and write to it using &lt;span style="font-family:courier new;"&gt;os.write&lt;/span&gt;. This makes it impossible (for me at least! grin!) to intercept the subprocess's output while it is running.&lt;/span&gt;
&lt;p/&gt;
&lt;span style="font-family:arial;"&gt;So, here is what I came up with:&lt;/span&gt;
&lt;p/&gt;
&lt;span style="font-family:arial;"&gt;Code:&lt;/span&gt;
&lt;p/&gt;
&lt;blockquote style="white-space: pre; font-family: courier new; font-size: 75%;"&gt;#!/usr/bin/env python

import sys, os
import logging, subprocess

print

logFormat = "%(levelname)-8s : %(asctime)s : %(name)-10s : %(message)s"
logFormatter = logging.Formatter( logFormat )

consolehandler = logging.StreamHandler()
consolehandler.setLevel( logging.DEBUG )
consolehandler.setFormatter( logFormatter )

logFile = "runcmd.log"
try:
  os.unlink( logFile )
except: pass
filehandler = logging.FileHandler( logFile )
filehandler.setLevel( logging.DEBUG )
filehandler.setFormatter( logFormatter )

logging.getLogger( '' ).addHandler( consolehandler )
logging.getLogger( '' ).addHandler( filehandler )

mainlog = logging.getLogger( "main" )
mainlog.setLevel( logging.DEBUG )

def mkLocalLog( f ):
  # Could set _localLog as an attribute on the function:
  #   f._localLog = ..., but user would have to access it
  #  as an attribute: &amp;lt;func&amp;gt;._localLog( "&amp;lt;msg&amp;gt;" ).
  # Instead we add it to the function's globals dict.
  # If someone knows how to add it to the function's locals
  #  that would be great!

  ll = logging.getLogger( f.__name__ )
  ll.setLevel( logging.DEBUG )

  f.__globals__[ "_localLog" ] = ll
  return f

@mkLocalLog
def foo():
  _localLog.info( "test" )

foo()

@mkLocalLog
def runCmd( cmd, log ):

  try:
      os.unlink( "out_fifo" )
  except: pass

  os.mkfifo( "out_fifo" )

  try:
    
      fifo = os.fdopen( os.open( "out_fifo",
                                 os.O_RDONLY | os.O_NONBLOCK ) )

      newcmd = "( %s ) 1&gt;out_fifo 2&gt;&amp;amp;1"%( cmd, )

      process = subprocess.Popen( newcmd, shell = True,
                                  stdout = subprocess.PIPE,
                                  stderr = subprocess.STDOUT )

      _localLog.debug( "Running: %s"%( cmd, ) )

      while process.returncode == None:
          # None means process is still running

          # need to poll the process once so the returncode
          # gets set (see docs)
          process.poll()

          try:
              line = fifo.readline().strip()
          except:
              continue

          if line:
              log.info( line )

      remaining = fifo.read()

      if remaining:
          for line in [ line
                        for line in remaining.split( "\n" )
                        if line.strip() ]:
              log.info( line.strip() )

      if process.returncode:
          _localLog.critical( "Return Value: %s"%( process.returncode, ) )
      else:
          _localLog.debug( "Return Value: %s"%( process.returncode, ) )

  finally:

      os.unlink( "out_fifo" )


mainlog.debug( os.getcwd() )

print
runCmd( "echo 'bye'", mainlog )

print
runCmd( "/usr/bin/false", mainlog )

print
runCmd( "ls -l; sleep 5; echo 'hi!'; sleep 5; ls -l", mainlog )

print
runCmd( "this_should_not_exists", mainlog )&lt;/msg&gt;&lt;/func&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;Output:&lt;/span&gt;
&lt;blockquote style="white-space: pre; font-family: courier new; font-size: 75%;"&gt;Macintosh:python scripts user$ ./runcmd.py

INFO     : 2008-10-05 11:29:00,651 : foo        : test
DEBUG    : 2008-10-05 11:29:00,652 : main       : /Users/user/Documents/Q/python scripts

DEBUG    : 2008-10-05 11:29:00,657 : runCmd     : Running: echo 'bye'
INFO     : 2008-10-05 11:29:00,660 : main       : bye
DEBUG    : 2008-10-05 11:29:00,662 : runCmd     : Return Value: 0

DEBUG    : 2008-10-05 11:29:00,666 : runCmd     : Running: /usr/bin/false
CRITICAL : 2008-10-05 11:29:00,670 : runCmd     : Return Value: 1

DEBUG    : 2008-10-05 11:29:00,674 : runCmd     : Running: ls -l; sleep 5; echo 'hi!'; sleep 5; ls -l
INFO     : 2008-10-05 11:29:00,680 : main       : total 24
INFO     : 2008-10-05 11:29:00,682 : main       : drwxr-xr-x   5 user  user   170 Sep 25 20:32 helloworld
INFO     : 2008-10-05 11:29:00,682 : main       : prw-r--r--   1 user  user     0 Oct  5 11:29 out_fifo
INFO     : 2008-10-05 11:29:00,682 : main       : -rw-r--r--   1 user  user   586 Oct  5 11:29 runcmd.log
INFO     : 2008-10-05 11:29:00,682 : main       : -rwxrwxrwx@  1 user  user  2856 Oct  5 11:28 runcmd.py
INFO     : 2008-10-05 11:29:05,686 : main       : hi!
INFO     : 2008-10-05 11:29:10,693 : main       : total 24
INFO     : 2008-10-05 11:29:10,694 : main       : drwxr-xr-x   5 user  user   170 Sep 25 20:32 helloworld
INFO     : 2008-10-05 11:29:10,694 : main       : prw-r--r--   1 user  user     0 Oct  5 11:29 out_fifo
INFO     : 2008-10-05 11:29:10,695 : main       : -rw-r--r--   1 user  user  1599 Oct  5 11:29 runcmd.log
INFO     : 2008-10-05 11:29:10,695 : main       : -rwxrwxrwx@  1 user  user  2856 Oct  5 11:28 runcmd.py
DEBUG    : 2008-10-05 11:29:10,695 : runCmd     : Return Value: 0

DEBUG    : 2008-10-05 11:29:10,699 : runCmd     : Running: this_should_not_exists
INFO     : 2008-10-05 11:29:10,705 : main       : /bin/sh: this_should_not_exists: command not found
CRITICAL : 2008-10-05 11:29:10,706 : runCmd     : Return Value: 127&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-2388195027692301930?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/2388195027692301930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=2388195027692301930' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/2388195027692301930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/2388195027692301930'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/10/logging-in-real-time-in-python.html' title='Logging in real time in Python'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-544489640552666879</id><published>2008-07-21T09:21:00.001-07:00</published><updated>2008-07-21T09:26:06.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Education'/><title type='text'>Everything Should Know How To Think</title><content type='html'>&lt;span style="font-family: trebuchet ms;"&gt;I pretty much agree with &lt;/span&gt;&lt;a style="font-family: trebuchet ms;" href="http://www-2.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf"&gt;this&lt;/a&gt;&lt;span style="font-family: trebuchet ms;"&gt;: Computational Thinking&lt;/span&gt;
&lt;blockquote style="border: thick dotted purple; padding: 7px; font-family: courier new;"&gt;Computational thinking is a fundamental skill for everyone, not just for computer scientists. To reading, writing, and arithmetic, we should add computational thinking to every child’s analytical ability. Just as the printing press facilitated the spread of the three Rs, what is appropriately incestuous about this vision is that computing and computers facilitate the spread of computational thinking.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-544489640552666879?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/544489640552666879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=544489640552666879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/544489640552666879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/544489640552666879'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/07/everything-should-know-how-to-think.html' title='Everything Should Know How To Think'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-4512380195547791427</id><published>2008-07-01T13:32:00.000-07:00</published><updated>2008-07-01T13:33:03.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Old'ish but Funny!</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BcQ7RkyBoBc&amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/BcQ7RkyBoBc&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-4512380195547791427?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/4512380195547791427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=4512380195547791427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/4512380195547791427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/4512380195547791427'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/07/oldish-but-funny.html' title='Old&apos;ish but Funny!'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-6441190479974873359</id><published>2008-02-25T07:54:00.000-08:00</published><updated>2008-02-25T12:00:30.430-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teams'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Interdependencies between Components cont.</title><content type='html'>&lt;p&gt;Our group uses Subversion as our repository. So, mechanically the most obvious solution is to implement a &lt;a href="http://svnbook.red-bean.com/en/1.4/svn-book.html#svn.reposadmin.create.hooks"&gt;post-commit hook&lt;/a&gt;. Is this enough? It is not clear that there needs to be any complimentary cultural practice put into place. What is further gained?&lt;/p&gt;
&lt;p&gt;Of course in this case nothing or very little. It might be preferable to also institute a daily 15min stand-up meeting (a la Agile) between the interdependencies, but if limited to resolving build failures, this adds little value over and above the mechanical solution.&lt;/p&gt;
&lt;p&gt;The benefit, and a great one, would be to improve communication within the team. So, I have suggested just this. First and foremost, a synchronization meeting should be established. Second, if requested the build team can put together a system for change notification based on SVN post-commit hooks.&lt;/p&gt;
Am I missing anything important?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-6441190479974873359?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/6441190479974873359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=6441190479974873359' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6441190479974873359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6441190479974873359'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/02/interdependencies-between-components_25.html' title='Interdependencies between Components cont.'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-5628012854437519369</id><published>2008-02-23T13:43:00.000-08:00</published><updated>2008-02-23T16:58:45.391-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teams'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Interdependencies between Components</title><content type='html'>&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Like all projects ours has to deal with dependencies between code. Here is a recent email regarding a breakdown in this area:
&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 153, 0);font-family:trebuchet ms;font-size:100%;"  &gt;This is the second time we have been bit by  one of our upstream dependency components making a change and causing our  component to fail. Is there something I as a developer can do  to prevent this? We gave the build team suggestions for policies and procedures  how to prevent, but the build team says it’s not your responsibility to manage  such policies. But I think it should be owned by the build team…at least  defining and communicating BKMs.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;
&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;The code failed to compile, stopping the build of the complete product, because a component it depends on changed its API. I was copied on this message because I am on the build team; in fact I run the builds.

So I responded with:
&lt;/span&gt;&lt;/span&gt;&lt;blockquote style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Compile failures due  to changes in APIs between interdependent components is symptomatic of  incomplete communication between the dependencies.

There are two ways to  deal with it:
&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Mechanically through processes;  OR&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Culturally through  relationships.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;If you believe that  this issue ought to be resolved mechanically, then I can see how that falls  &lt;b&gt;solely&lt;/b&gt; to the build team. But I do  not, so I resist this solution.

I am willing to  accept that there can be processes in place that facilitate a cultural solution.  In this case, we can discuss adding these to a communication model mostly worked  out within and between the developer/SQE teams.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;The original author followed with:
&lt;blockquote&gt;&lt;span style="color: rgb(0, 153, 0);font-size:100%;" &gt;But I &lt;i&gt;think&lt;/i&gt; the build team should  take the lead in trying to get everyone on the same page by suggesting  policies.
&lt;/span&gt;&lt;/blockquote&gt;And I returned with:
&lt;blockquote&gt;&lt;span style="color: rgb(0, 153, 0);font-size:100%;" &gt;Well, I am happy to  suggest policies, but I think we all know what is gonna happen! Grin!

I certainly do not  know the personality of the teams, so y’all are gonna hate my suggestions! But  that is ok, as long as it initiates discussion I am happy come up with something  and to participate.
&lt;/span&gt;&lt;/blockquote&gt;So at this point, I think I need to come up with a cultural solution. Ideas?
&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/1901813988295366954-5628012854437519369?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/5628012854437519369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=5628012854437519369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/5628012854437519369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/5628012854437519369'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/02/interdependencies-between-components.html' title='Interdependencies between Components'/><author><name>czrpb</name><uri>http://www.blogger.com/profile/05411515424273328980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_M_j1C59bgdg/SzOhgCA4DDI/AAAAAAAAALA/JgxPOGmBR8c/s1600-R/Ducreux1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-6529190992133757061</id><published>2008-02-19T21:41:00.000-08:00</published><updated>2008-02-19T22:38:55.824-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Outsourcing Web Design</title><content type='html'>&lt;p&gt;We recently acquired a contract to implement part of a social networking site.  The company that hired us to do this part simply did not have the resources to finish the entire project within the time frame they were given, so it was a win-win situation for both companies.&lt;/p&gt;

&lt;p&gt;We quickly got going on the back-end code, and as a result there were only about three weeks remaining on the project when we started working on the front-end design work.  We had a relatively decent spec to work from: A mock-up created by one of their designers.  Within a few days we had much of the design work finished, as we are somewhat experienced with such work.&lt;/p&gt;

&lt;p&gt;However, we spent the next week or so struggling with a few problematic CSS issues, the biggest one being how to render arbitrary content inside a box that had a custom border (so, must be from an image), where the corners are rounded.  In this case, the border is used in multiple places on multiple different pages, and in some cases the box is of predetermined width and height, sometimes just the width, and sometimes it has to fit the page.  The difficulty was based upon the premise that one should not be using tables for layout of an HTML page.  The reasons sound plausible: It's not what tables are designed for.  It's mixing presentation with semantic content.  It's difficult for accessibility.  Etc.&lt;/p&gt;

&lt;p&gt;We know that, to the unexperienced, this problem sounds trivial to solve.  But, anyone who has tried it can tell you it is not easy.&lt;/p&gt;

&lt;p&gt;We did some research on ways that others have solved this and other problems, and eventually found solutions that we were able to implement in short order, and we were ready to deliver our work.&lt;/p&gt;

&lt;p&gt;However, it was then decided that the site in question would have to support MSIE6, the CSS designer's worst nightmare.  We struggled with that for a few days, and eventually took a step back:  We estimated that about 90% of the UI design time had been spent fiddling around with CSS to get the layout right.  What were we doing wrong?&lt;/p&gt;

&lt;p&gt;Our conclusion is simply that we did not have the experience needed to complete the design using CSS in a reasonable amount of time.  We should have hired a designer.&lt;/p&gt;

&lt;p&gt;We were fortunate to know of a designer who had recently quit his job to do contract work exclusively.  We got him into the office, signed the paperwork, gave him the specs, and he was off.  Three days later, while we now had time to focus on performance issues and take a closer look at our application architecture (and get three solid nights of sleep), he came back to us with most of the problems solved, the whole thing working in all supported browsers, and just a few minor tweaks to integrate his changes into the site.&lt;/p&gt;

&lt;p&gt;The moral: As a Web developer, you really need to know your limits.  And more importantly, you should find an experienced, trustworthy Web designer that you can consult with when you need help.&lt;/p&gt;

&lt;p&gt;During the estimation phase of the project, you should really take a look at what you are being asked to implement as far as UI design goes.  Estimate what you think it will take you.  Then, try to estimate how long it would take you if you really knew what you were doing when it comes to design.  Our proposed rule of thumb is that if the first number is more than twice the second number, you should probably at least consult a designer.&lt;/p&gt;

&lt;p&gt;Think of it this way: Even if you don't make a profit on the UI design because you outsourced it, it's probably worth it to you in future business to be able to make the customer happy.  The question is not whether or not you can be a designer.  The question is do you want to?  If the answer is yes, then you should focus on that as your career path, because there is a definite need for specialists in this area.  If not, then find someone who does, who you can trust with your project, and use them appropriately.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-6529190992133757061?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/6529190992133757061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=6529190992133757061' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6529190992133757061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/6529190992133757061'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/02/outsourcing-web-design.html' title='Outsourcing Web Design'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-7230767803858956260</id><published>2008-01-19T16:28:00.000-08:00</published><updated>2008-01-19T18:32:51.092-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='overlay'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Flash and Javascript Overlay</title><content type='html'>This article is based upon a project we recently worked on.  We learned a great deal and wanted to capture what we learned in a generic way so that it could be reapplied to future projects.

This article is organized in Problem/Solution format, where each problem is one that we encountered after implementing the prior solution.
&lt;h4&gt;Problem:&lt;/h4&gt;
You have a Flash movie, and you want some HTML content to be displayed as an overlay when a user clicks in a particular place within the movie.  There should be a "Close" button or link within the overlay that will hide the overlay when clicked.
&lt;h4&gt;Solution:&lt;/h4&gt;
Put the content into a text field that has its formatting style set as HTML. &lt;a href="http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_14808"&gt;See these instructions for more information about how to do this&lt;/a&gt;.
&lt;h4&gt;Problem (Additional Requirement):&lt;/h4&gt;
The client wants the content to be written using any arbitrary HTML and CSS for controlling the layout and style of the content once it is rendered.

Even in this day and age, there is no way to render arbitrary HTML and CSS in Flash, despite the fact that a need for it has existed for years.  Yes, you can render some limited HTML in such a text field, but the list of supported tags is fairly minimal.  For the list of HTML tags that are supported in a Flash text field, see the above link to instructions about how to format a text field as HTML.  If you don't need anything more complicated than the supported HTML, then this is not a problem for you, and you can use the solution immediately above.
&lt;h4&gt;Solution:&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Put the content in a hidden HTML div.&lt;/li&gt;
&lt;li&gt;Create a Javascript function that shows the div when it is called, and another that hides the div when it is called.&lt;/li&gt;
&lt;li&gt;Write ActionScript code to call the first Javascript function when the user clicks in the proper spot in the Flash movie.&lt;/li&gt;
&lt;li&gt;Put a button in the the div that when clicked will call the hide function.&lt;/li&gt;
&lt;/ol&gt;

Some code to see how it works:

In the Web page, add the following HTML:
&lt;code&gt;
&amp;lt;!-- Initially this div is hidden --&amp;gt;
&amp;lt;div id="overlayContainer" style="display:none; border: 1px solid white; background-color: black;"&amp;gt;
     &amp;lt;!-- The content to be displayed goes here --&amp;gt;
     ...

     &amp;lt;!-- close button hides the overlay --&amp;gt;
     &amp;lt;input type="button" value="close" onclick="hideOverlay(); return false;" /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;
Then, in the Web page, add the following Javascript:
&lt;code&gt;
var overlayContainerElt = document.getElementById('overlayContainer');
function showOverlay()
{
     overlayContainerElt.style.display = 'block';
}

function hideOverlay()
{
     overlayContainerElt.style.display = 'none';
}
&lt;/code&gt;
In ActionScript in the Flash movie, assuming "cont" is a class member that refers to the container on which the user can click:

&lt;code&gt;
cont.addEventListener(MouseEvent.CLICK, mouseClick);

private function mouseClick(e:MouseEvent):void
{
     ExternalInterface.call("showOverlay");
}
&lt;/code&gt;
&lt;h4&gt;Problem:&lt;/h4&gt;
There is no (cross-browser) way to show a div on top of a Flash movie.
&lt;h4&gt;Solution:&lt;/h4&gt;
Hide the Flash movie before displaying the div. Modify the Javascript as follows, assuming the Flash movie is displayed in a div named "flashContainer":
&lt;code&gt;
var overlayContainerElt = document.getElementById('overlayContainer');
&lt;b&gt;var flashContainerElt = document.getElementById('flashContainer');&lt;/b&gt;

function showOverlay()
{
    overlayContainerElt.style.display = 'block';
    &lt;b&gt;flashContainerElt.style.display = 'none';&lt;/b&gt;
}

function hideOverlay()
{
    overlayContainerElt.style.display = 'none';
    &lt;b&gt;flashContainerElt.style.display = 'block';&lt;/b&gt;
}
&lt;/code&gt;
&lt;h4&gt;Problem:&lt;/h4&gt;The Flash movie does not get properly hidden in all browsers.  [There is another problem here I can't remember]
&lt;h4&gt;Solution:&lt;/h4&gt;Hide the Flash movie by setting appropriate style attributes.  Modify the Javascript as follows, assuming the Flash movie embed element is named "flash":
&lt;code&gt;
var overlayContainerElt = document.getElementById('overlayContainer');
var flashContainerElt = document.getElementById('flashContainer');
&lt;b&gt;var flashElt = document.getElementById('flash');&lt;/b&gt;

function showOverlay()
{
    overlayContainerElt.style.display = '';

    &lt;b&gt;// Store the CSS attributes we are about to change
    flashContainerElt.cachedMargin = flashContainerElt.style.margin;
    flashContainerElt.cachedHeight = flashContainerElt.style.height;
    flashElt.cachedHeight = flashElt.style.height;

    // Hide the flash move by setting it to have no size
    flashContainerElt.style.margin = '0px';
    flashContainerElt.style.height = '0px';
    flashElt.style.height = '0px';&lt;/b&gt;
}

function hideOverlay()
{
    overlayContainerElt.style.display = 'none';

    &lt;b&gt;// Restore the size of the flash movie
    flashElt.style.height = flashElt.cachedHeight;
    flashContainerElt.style.height = flashContainerElt.cachedHeight;
    flashContainerElt.style.margin = flashContainerElt.cachedMargin;&lt;/b&gt;
}
&lt;/code&gt;
&lt;h4&gt;Problem:&lt;/h4&gt;
If the Flash movie has a background texture, gradient, or image, then the background abruptly disappears when the overlay is displayed.  If the overlay is smaller than the Flash movie, this can look strange.

&lt;h4&gt;Solution:&lt;/h4&gt;
Create a div with the same background as that used in the Flash movie, and put the overlayContainer and flashContainer divs inside it.  Use appropriate cross-browser CSS to position the div so that it sits exactly behind the Flash movie.

The HTML becomes:
&lt;code&gt;
&lt;b&gt;&amp;lt;div style="url(movie_background.png) no-repeat top center; margin: 10px auto;"&amp;gt;&lt;/b&gt;
    &amp;lt;!-- Initially this div is hidden --&amp;gt;
    &amp;lt;div id="overlayContainer" style="display:none; border: 1px solid white; background-color: black;"&amp;gt;
        &amp;lt;!-- The content to be displayed goes here --&amp;gt;
        ...

        &amp;lt;!-- close button hides the overlay --&amp;gt;
        &amp;lt;input type="button" value="close" onclick="hideOverlay(); return false;" /&amp;gt;
    &amp;lt;/div&amp;gt;
&lt;b&gt;&amp;lt;/div&amp;gt;&lt;/b&gt;
&lt;/code&gt;

&lt;h4&gt;Problem (Additional Requirement):&lt;/h4&gt;
There is no smooth transition between the Flash movie disappearing and the overlay appearing. This may or may not be a problem for you, but for this project the client wanted the overlay
to appear as though it was fading in on top of the Flash movie.
&lt;h4&gt;Solution:&lt;/h4&gt;
There are several steps to this solution:
&lt;ol&gt;
&lt;li&gt;In Flash, create a rectangle that has the same size, style, and position as the overlayContainer div.&lt;/li&gt;
&lt;li&gt;Add ActionScript code to cause the new rectangle to fade in before calling the showOverlayContainer() in Javascript. To accomplish this, you could use the Caurina &lt;a href="http://hosted.zeh.com.br/tweener/docs/en-us/"&gt;Tweener&lt;/a&gt; library.&lt;/li&gt;
&lt;li&gt;Add another ActionScript function to cause the rectangle to fade out.&lt;/li&gt;
&lt;li&gt;Modify the JavaScript code to call the new ActionScript function after the flashContainer has been displayed.
&lt;/li&gt;
&lt;/ol&gt;In ActionScript:
&lt;code&gt;
&lt;b&gt;
// Programmatically create the rectangle with the desired size and style
this.screenCover = new Shape();
this.screenCover.graphics.lineStyle(1.5,0xFFFFFF);
this.screenCover.graphics.beginFill(0x000000,1.0);
this.screenCover.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
this.screenCover.graphics.endFill();
this.screenCover.alpha = 0;
this.addChild(this.screenCover);
&lt;/b&gt;
cont.addEventListener(MouseEvent.CLICK, mouseClick);

private function mouseClick(e:MouseEvent):void
{
    &lt;b&gt;Tweener.addTween(
        this.screenCover,
        {
            alpha : 1.0,
            time : 0.5,
            transition : 'linear',
            onComplete : function()
            {
                &lt;/b&gt;ExternalInterface.call("showOverlay");&lt;b&gt;
            }
        }
    );&lt;/b&gt;
}

&lt;b&gt;private function hideScreenCover()
{
    Tweener.addTween(
        this.screenCover,
        {
            alpha : 0,
            time : 0.5,
            transition : 'linear',
        }
    );
}&lt;/b&gt;
&lt;/code&gt;

Modify the hideOverlay() function in Javascript as follows:

&lt;code&gt;
function hideOverlay()
{
    overlayContainerElt.style.display = 'none';

    // Restore the size of the flash movie
    flashElt.style.height = flashElt.cachedHeight;
    flashContainerElt.style.height = flashContainerElt.cachedHeight;
    flashContainerElt.style.margin = flashContainerElt.cachedMargin;

    &lt;b&gt;flashElt.hideScreenCover();&lt;/b&gt;
}
&lt;/code&gt;
&lt;h4&gt;Problem:&lt;/h4&gt;The content of the overlayContainer div still appears abruptly.
&lt;h4&gt;Solution:&lt;/h4&gt;There are several steps to this solution:
&lt;ol&gt;
&lt;li&gt;Create a div named overlayContent, and put the contents of the overlayContainer inside it.&lt;/li&gt;
&lt;li&gt;Put the new overlayContent div inside the overlayContainer div.&lt;/li&gt;
&lt;li&gt;Use a third-party effects library to cause the new overlayContent div to fade in. For our solution, we used the popular &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; library.&lt;/li&gt;
&lt;/ol&gt;

The HTML becomes:
&lt;code&gt;
&amp;lt;div style="url(movie_background.png) no-repeat;"&amp;gt;
    &amp;lt;!-- Initially this div is hidden --&amp;gt;
    &amp;lt;div id="overlayContainer" style="display:none; border: 1px solid white; background-color: black;"&amp;gt;
        &lt;b&gt;&amp;lt;div id="overlayContent" style="display:none"&amp;gt;&lt;/b&gt;
            &amp;lt;!-- The content to be displayed goes here --&amp;gt;
            ...

            &amp;lt;!-- close button hides the overlay --&amp;gt;
            &amp;lt;input type="button" value="close"
                       onclick="hideOverlay(); return false;" /&amp;gt;
        &lt;b&gt;&amp;lt;/div&amp;gt;&lt;/b&gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;

The Javascript becomes:
&lt;code&gt;
var overlayContainerElt = document.getElementById('overlayContainer');
&lt;b&gt;var overlayContentElt = document.getElementById('overlayContent');&lt;/b&gt;
var flashContainerElt = document.getElementById('flashContainer');
var flashElt = document.getElementById('flash');

function showOverlay()
{
    overlayContainerElt.style.display = '';

    // Store the CSS attributes we are about to change
    flashContainerElt.cachedMargin = flashContainerElt.style.margin;
    flashContainerElt.cachedHeight = flashContainerElt.style.height;
    flashElt.cachedHeight = flashElt.style.height;

    // Hide the flash move by setting it to have no size
    flashContainerElt.style.margin = '0px';
    flashContainerElt.style.height = '0px';
    flashElt.style.height = '0px';

    &lt;b&gt;Effect.Appear(overlayContentElt, { duration: 0.5 });&lt;/b&gt;
}

function hideOverlay()
{
&lt;b&gt;    // Hide the overlayContent div in 0.5 seconds, then call hideOverlayContainer()
    Effect.Fade(
        overlayContentElt,
        { duration: 0.5, afterFinish : hideOverlayContainer }
    );&lt;/b&gt;
}

&lt;b&gt;function hideOverlayContainer()&lt;/b&gt;
{
    overlayContainerElt.style.display = 'none';

    var flashContainerElt = flashContainerElt;

    // Restore the size of the flash movie
    flashElt.style.height = flashElt.cachedHeight;
    flashContainerElt.style.height = flashContainerElt.cachedHeight;
    flashContainerElt.style.margin = flashContainerElt.cachedMargin;

    flashElt.hideScreenCover();
}
&lt;/code&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;
There is more you can do to make this code more reusable and flexible, but those are the basic steps.  Someday I will modify this posting to include an actual example.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-7230767803858956260?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/7230767803858956260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=7230767803858956260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/7230767803858956260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/7230767803858956260'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/01/this-article-is-based-upon-project-we.html' title='Flash and Javascript Overlay'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-5849140249163989574</id><published>2008-01-18T21:58:00.001-08:00</published><updated>2008-01-18T21:58:40.183-08:00</updated><title type='text'>Encrypted IM</title><content type='html'>If you're a Pidgin user and you want your IM conversations to be secure and private, there's a new plugin called OTR.

Just in case you don't know, Pidgin is a replacement for all your IM clients (yes, including Google). It's better than all your other IM clients, so use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-5849140249163989574?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/5849140249163989574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=5849140249163989574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/5849140249163989574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/5849140249163989574'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/01/encrypted-im.html' title='Encrypted IM'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1901813988295366954.post-3971005919920538299</id><published>2008-01-18T21:00:00.000-08:00</published><updated>2008-01-19T18:22:51.757-08:00</updated><title type='text'>Introduction</title><content type='html'>This is a blog containing info related to being a software developer.  You won't find any fascinating personal tidbits here, but you might find something interesting you can use if you are a developer too.  Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1901813988295366954-3971005919920538299?l=devlishgenius.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devlishgenius.blogspot.com/feeds/3971005919920538299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1901813988295366954&amp;postID=3971005919920538299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3971005919920538299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1901813988295366954/posts/default/3971005919920538299'/><link rel='alternate' type='text/html' href='http://devlishgenius.blogspot.com/2008/01/introduction.html' title='Introduction'/><author><name>checkman</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
