<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.techknowme.com/blog/wp-atom.php">
	<title type="text">Rob Z's Web Geek Blog</title>
	<subtitle type="text">Random rants and tips on website programming and marketing - for geeks by a geek</subtitle>

	<updated>2010-02-02T18:01:25Z</updated>
	<generator uri="http://wordpress.org/" version="2.9.2">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://www.techknowme.com/blog" />
	<id>http://www.techknowme.com/blog/feed/atom/</id>
	

			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/RobZsWebGeekBlog" /><feedburner:info uri="robzswebgeekblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>RobZsWebGeekBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[HipHop: Transform Your PHP Into C++]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/Hd0wdZw63ds/" />
		<id>http://www.techknowme.com/blog/?p=61</id>
		<updated>2010-02-02T18:01:25Z</updated>
		<published>2010-02-02T18:01:25Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>This is a VERY interesting post from the Facebook Engineering team. Tonight, they&#8217;ll be releasing a project they call HipHop to the open source community. HipHop generates semantically compatible C++ from PHP code and compiles it to machine code using the g++ compiler. This results is significantly faster and more efficient code running on a [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2010/02/hiphop-transform-your-php-into-c/">&lt;p&gt;This is a VERY interesting post from the Facebook Engineering team. Tonight, &lt;a href="http://www.facebook.com/note.php?note_id=280583813919&amp;amp;id=9445547199&amp;amp;ref=nf"&gt;they&amp;#8217;ll be releasing a project they call HipHop to the open source community&lt;/a&gt;. HipHop generates semantically compatible C++ from PHP code and compiles it to machine code using the g++ compiler. This results is significantly faster and more efficient code running on a web server.&lt;/p&gt;
&lt;p&gt;Aside from this announcement, I know little about the project, but you can be sure it&amp;#8217;s something I&amp;#8217;ll be checking out as soon it&amp;#8217;s released.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/Hd0wdZw63ds" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2010/02/hiphop-transform-your-php-into-c/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2010/02/hiphop-transform-your-php-into-c/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2010/02/hiphop-transform-your-php-into-c/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[Tracking and Protecting Web-Based Downloads (In PHP)]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/drSfGxQel7k/" />
		<id>http://www.techknowme.com/blog/?p=52</id>
		<updated>2010-01-13T00:16:27Z</updated>
		<published>2010-01-13T00:16:27Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>There&#8217;s a consistent need to either protect a file from being downloaded unless a user has been properly authorized/authenticated to access it or to track those files using a JavaScript tracking system like Google Analytics. I ran into this issue a few years ago and came up with what I thought was an elegant solution [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2010/01/tracking-and-protecting-web-based-downloads-in-php/">&lt;p&gt;There&amp;#8217;s a consistent need to either protect a file from being downloaded unless a user has been properly authorized/authenticated to access it or to track those files using a JavaScript tracking system like Google Analytics. I ran into this issue a few years ago and came up with what I thought was an elegant solution given the parameters &amp;#8211; access those files using a PHP page.&lt;/p&gt;
&lt;p&gt;The idea is simple: Send the filename as part of a request to a specified php page (in this case, download.php). That page will perform whatever authorization/authentication checks are necessary, ensure the file exists and &amp;#8211; if everything passes muster &amp;#8211; immediately begin sending the file to the user&amp;#8217;s browser. You can use Google Analytics to track these downloads as well either by using the PHP CURL library or creating a redirect page.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s some generic code to show this in action. &lt;strong&gt;Please Note:&lt;/strong&gt; this code is an edited version from a full set of code. I&amp;#8217;ve tried to make this standalone, but I haven&amp;#8217;t actually tested it. You&amp;#8217;ll want to fill in the blanks and give this a shot yourself &amp;#8211; this is not a simple drop-and-go solution.&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?php
	//If you need to confirm that this user is logged in, etc.
	//you should handle the authentication/authorization stuff
	//here

	//Set this to wherever you will be storing the actual files
	define('DOWNLOAD_PATH', '/home/username/protected_files');

	//Format of URL: http://www.mysite.com/download.php?f=&lt;filename&gt;
	$filename = $_REQUEST["f"];
	$filePath = DOWNLOAD_PATH."/".$filename;

	//Handle this error however you want.
	if(file_exists($filePath)) {
		trigger_error("Could not find file: ".$filePath, E_USER_ERROR);
		exit();
	}

	$pathParts = pathinfo($filePath);

	header("Server: Apache/PHP", true);
	header("Cache-Control: no-store, no-cache, must-revalidate", true);
	header("Keep Alive: timeout=15; max=89", true);
	header("Connection: Keep-Alive", true);
	//NOTE: mime_type is a custom function - see below
	header("Content-Type: ".mime_type($filePath), true);
	header("Content-Disposition: attachment; filename=\"".$pathParts["basename"]."\"", true);

	//readfile() outputs the given file directly to the buffer which, in this case, goes to the browser.
	if(!@readfile($filePath)) {
		//Handle this error however you want
		trigger_error("Failed to open and read file ".$filePath, E_USER_ERROR);
		exit();
	}

	/**
	 Determines the MIME type of the given file. Requires a valid mime types file.

	 @param $file The file name/filepath fo the file being checked.
	 @returns string a mime-type string for a content header based on the file extension if found, otherwise returns false.
	*/
.
	function mime_type($file) {
		//Replace with the location of your mime.type file (I got mine from Apache)
		$mimeFile = "./mime.type";
		$mimeFound = false;
		$mime = -1;
		$fileInfo = pathinfo($file);
		if(is_file($mimeFile)) {
			if($fp = fopen($mimeFile, 'r')) {
				while ((!feof($fp)) &amp;#038;&amp;#038; !$mimeFound) {
					$string = fgets($fp, 4096);
					$tempArray = preg_split("/\s+/", $string);
					//Eliminate comment lines
					if(!(strstr($tempArray[0], '#') == 1)) {
						for ($n = 1; $n &lt; sizeof($tempArray); $n++) {
							if(strtolower($tempArray[$n]) == strtolower($fileInfo["extension"])) {
								//Found the mime type!
								$mime = $tempArray[0];
								$mimeFound = true;
								break;
							}
						}
					}
				}
				fclose($fp);
			} else {
				trigger_error("Cannot open ".$mimeFile, E_USER_WARNING);
			}
		} else {
			trigger_error("Cannot find ".$mimeFile, E_USER_WARNING);
		}
		return $mime;
	}

?&amp;gt;&lt;/pre&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/drSfGxQel7k" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2010/01/tracking-and-protecting-web-based-downloads-in-php/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2010/01/tracking-and-protecting-web-based-downloads-in-php/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2010/01/tracking-and-protecting-web-based-downloads-in-php/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[Career Changes and Such]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/1EeQYOlZABs/" />
		<id>http://www.techknowme.com/blog/?p=46</id>
		<updated>2010-01-11T18:08:30Z</updated>
		<published>2010-01-11T18:03:12Z</published>
		<category scheme="http://www.techknowme.com/blog" term="General News" />		<summary type="html"><![CDATA[<p>Been quiet here lately. Too quiet. I&#8217;m hoping to fix that.</p>
<p>In September, I was presented an opportunity to begin working for a company for which I have a great deal of respect in a position that was ideally suited to my unique set of skills as both a programmer and a strategist. In October, I [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2010/01/career-changes-and-such/">&lt;p&gt;Been quiet here lately. Too quiet. I&amp;#8217;m hoping to fix that.&lt;/p&gt;
&lt;p&gt;In September, I was presented an opportunity to begin working for a company for which I have a great deal of respect in a position that was ideally suited to my unique set of skills as both a programmer and a strategist. In October, I began working full time for &lt;a href="http://www.verticalresponse.com" target="_blank"&gt;VerticalResponse&lt;/a&gt; as their Partner Integration Manager. I support &lt;a href="http://partners.verticalresponse.com/vr-for-developers" target="_blank"&gt;the Partner API&lt;/a&gt;, which represents an incredible revenue opportunity to those offering software as a service who are looking quickly and easily add email marketing services to their mix of offerings.&lt;/p&gt;
&lt;p&gt;This is the first job I&amp;#8217;ve had where programming was not one of my chief duties, though I&amp;#8217;m still producing a lot of code for testing, support and proof-of-concept purposes. This has freed me up a bit to explore some other topics of programming in my spare time &amp;#8211; specifically, programming for my new &lt;a href="http://www.htc.com/us/products/hero-sprint" target="_blank"&gt;HTC Hero with Google Android&lt;/a&gt;. I&amp;#8217;m also being tasked with creating a developer community around our API, which is, perhaps, the one opportunity that has me the most excited about this big change.&lt;/p&gt;
&lt;p&gt;My goal here is to continue writing about programming and web development topics as I see fit, as well as discuss some of my experiences facing the challenges of my new position. I hope you&amp;#8217;ll stick with me through the ride and let me know what you&amp;#8217;d like to talk about. I&amp;#8217;m also working on a couple of WordPress plugins that I hope to release soon that I will continue supporting here. If you&amp;#8217;re not already subscribing to this blog via email, &lt;a href="http://twitter.com/rzazueta" target="_blank"&gt;Twitter&lt;/a&gt; or &lt;a href="http://www.techknowme.com/blog/feed/atom/" target="_blank"&gt;RSS&lt;/a&gt;, why not start now?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/1EeQYOlZABs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2010/01/career-changes-and-such/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2010/01/career-changes-and-such/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2010/01/career-changes-and-such/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[American Sign Language and User Interfaces]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/zgEroPATwvw/" />
		<id>http://www.techknowme.com/blog/?p=44</id>
		<updated>2009-08-25T19:43:09Z</updated>
		<published>2009-08-25T19:43:09Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>I&#8217;ve recently become intrigued by the concept of &#8220;Baby Sign Language&#8221; and the idea that my 10-month-old son, who&#8217;s not quite yet up to walking, may be able to communicate with me using his hands. To explore this, I sat down with a baby signing book that described pictorially many of the signs that could [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/08/american-sign-language-and-user-interfaces/">&lt;p&gt;I&amp;#8217;ve recently become intrigued by the concept of &amp;#8220;&lt;a href="http://www.babies-and-sign-language.com/" target="_blank"&gt;Baby Sign Language&lt;/a&gt;&amp;#8221; and the idea that my 10-month-old son, who&amp;#8217;s not quite yet up to walking, may be able to communicate with me using his hands. To explore this, &lt;a href="http://www.amazon.com/gp/product/1401921604?ie=UTF8&amp;amp;tag=robzazuetaonl-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1401921604" target="_blank"&gt;I sat down with a baby signing book&lt;/a&gt; that described pictorially many of the signs that could be useful to teach to my son. In order that we both learn a useful skill, all of the signs are taken directly from American Sign Language (ASL).&lt;/p&gt;
&lt;p&gt;What really struck me about ASL is how easy it is to learn new words. Just about every sign has a real-life analogue that makes it easy to remember. &lt;a href="http://www.lifeprint.com/asl101/pages-signs/b/ball.htm" target="_blank"&gt;The sign for &amp;#8220;ball&amp;#8221;&lt;/a&gt; for instance is made by putting your hands together as if you&amp;#8217;re holding an invisible ball. &lt;a href="http://www.lifeprint.com/asl101/pages-signs/b/boygirl.htm" target="_blank"&gt;The sign for &amp;#8220;boy&amp;#8221;&lt;/a&gt; has you drawing your hand away from your forehead as if you&amp;#8217;re stroking the bill to a baseball cap.&lt;/p&gt;
&lt;p&gt;This all came to mind this morning as I was building a small, simple database in Microsoft Access for a client. I had two Excel files that I needed to match using the email column in each of them. I imported both tables into Access, then went to create a query using the query designer. Identifying which fields to include in the output for the query was a no-brainer &amp;#8211; for each field I wanted, I just double clicked on it in the table at the top and it appeared in the query below. Figuring out how to set the criteria for each table, however, was not so simple.&lt;/p&gt;
&lt;p&gt;I tried clicking on the first criteria row for the email output column for table A, then double clicking on the email column in table B to signify that I needed them to be equal. That didn&amp;#8217;t work. I thought through all of the ways that should work, then realized there was a SQL view I could be using. Thank God I know SQL &amp;#8211; I&amp;#8217;d think a majority of the target market for Access does not.&lt;/p&gt;
&lt;p&gt;The key and mouse combinations I was using in the design view are what made me think of ASL &amp;#8211; I was using my hands to communicate with the program instead of my words. When I switched to SQL, it was like I was speaking in the program&amp;#8217;s native tongue. I&amp;#8217;m certain there&amp;#8217;s a way to use gestures to fill in the criteria for each column, but none of the ones I&amp;#8217;m familiar with seemed to work.&lt;/p&gt;
&lt;p&gt;In ASL, if I&amp;#8217;m speaking with someone who&amp;#8217;s deaf and I don&amp;#8217;t know a particular sign, I can either spell out the word using the ASL alphabet or pantomime what I&amp;#8217;m trying to say. In either case, the meaning is likely to come through. User interface designers could take a cue from this &amp;#8211; they should consider all the ways in which a user, communicating with the program using only a keyboard and mouse, might be able to convey their meaning to the program and attempt to implement as many of these as feasible. It&amp;#8217;s definitely a lot of work, but the increase in usability would be worth it. Not every Access user knows to type in the table name and field name in the criteria box to indicate equality. My act of trying to drag a field or click on the field I wanted to appear in that box is not at all an unreasonable assumption for communicating my desire to the program. Adding a function to properly react to that gesture wouldn&amp;#8217;t be a huge burden, and it would have made the process of creating this query so much faster.&lt;/p&gt;
&lt;p&gt;Perhaps it should be a requirement of UI designers to learn some ASL.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/zgEroPATwvw" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/08/american-sign-language-and-user-interfaces/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/08/american-sign-language-and-user-interfaces/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/08/american-sign-language-and-user-interfaces/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[How To Program Like Mahatma Gandhi]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/x95APqXTMF8/" />
		<id>http://www.techknowme.com/blog/?p=42</id>
		<updated>2009-07-02T23:39:53Z</updated>
		<published>2009-07-02T23:39:53Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>&#8220;Be the change you want to see in the world.&#8221;</p>
<p>If you work with software long enough, especially open source software, you&#8217;ll find yourself saying the words, &#8220;This is great, but it would be INCREDIBLE if it could&#8230;&#8221; If you work with closed source software &#8211; that is, software that you&#8217;re not allowed to modify &#8211; [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/07/how-to-program-like-mahatma-gandhi/">&lt;p&gt;&lt;em&gt;&amp;#8220;Be the change you want to see in the world.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you work with software long enough, especially open source software, you&amp;#8217;ll find yourself saying the words, &amp;#8220;This is great, but it would be INCREDIBLE if it could&amp;#8230;&amp;#8221; If you work with closed source software &amp;#8211; that is, software that you&amp;#8217;re not allowed to modify &amp;#8211; the best you can hope for is to let the development team know of your wishes and hope and pray they add them to the next release.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re working with open source software, you have an opportunity to make actual change. You may have noticed that I&amp;#8217;ve recently posted a couple of downloads for WordPress plugins. I&amp;#8217;ve been working on &lt;a href="http://www.getoutbayarea.com" target="_blank"&gt;a new site built entirely using WordPress and free plugins&lt;/a&gt;, all of which are open source. It&amp;#8217;s unbelievable what you can do with just these resources, but there were a few instances where I needed just a wee bit more than the plugin could provide.&lt;/p&gt;
&lt;p&gt;Since they were open source to begin with, and since I knew I wasn&amp;#8217;t the only one who would need them, I went in and made the changes myself. I&amp;#8217;m fortunate in that I&amp;#8217;m a PHP expert &amp;#8211; making these changes was a pretty trivial process once I understood how WordPress&amp;#8217;s plugin architecture worked. Still, it cost me time &amp;#8211; probably about five hours total &amp;#8211; which does directly translate into time taken away from paying client work. While it did cost me something, it was a rather small price to pay considering how much time I saved by using the original plugins to begin with. I felt these plugins needed something added, so I took the time and added them. Since they were open source to begin with, I re-released them on my own site with my added code intact so that others can use it and modify it as needed. I saw a change I felt needed to happen, I made it happen and now, the world benefits.&lt;/p&gt;
&lt;p&gt;But we&amp;#8217;re not here to talk about how awesome I am. This idea of improving on something and giving it back to the community is the core of the open source business model. If you don&amp;#8217;t have the money to contribute to something, you should contribute your time and talents. If you see a need in the software world, you should take steps to fill it. Too many people whine about what should be, not enough people take action to make it as it should be.&lt;/p&gt;
&lt;p&gt;But what if you&amp;#8217;re not a programmer? If a project you admire needs your talents &amp;#8211; marketing, evangelism, graphic design, etc. &amp;#8211; you can build a great reputation by pitching in. If that doesn&amp;#8217;t work, why not adopt a programmer? For example, if I was unable to modify the plugins I needed changed for my application, I could have hired a programmer to do it for me, then re-release those changes for all to use, thus strengthening the overall community. If that was cost prohibitive, perhaps I could have pooled my money with other non-programmers who need the same things and together we could hire someone who can make it happen. I could have found these like-minded souls in the comments sections on the plugin homepages &amp;#8211; they&amp;#8217;re frequently filled with messages saying, &amp;#8220;Great plugin, but I need it to&amp;#8230;&amp;#8221; with no offers of either talent or money.&lt;/p&gt;
&lt;p&gt;Open source software is never free. Programmers pay for it with their time and knowledge. They&amp;#8217;re compensated either with money from the clients they&amp;#8217;re working for or by using other open source code from like-minded programmers. It&amp;#8217;s that old time = money value exchange. If you value a project and want to see it evolve to better meet your needs, then take it upon yourself to make it happen!&lt;/p&gt;
&lt;input id="gwProxy" type="hidden" /&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/x95APqXTMF8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/07/how-to-program-like-mahatma-gandhi/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/07/how-to-program-like-mahatma-gandhi/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/07/how-to-program-like-mahatma-gandhi/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[Download: Widgetized PHPList Integration Plugin for WordPress]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/m7fhPKKQh6w/" />
		<id>http://www.techknowme.com/blog/?p=39</id>
		<updated>2009-06-15T18:32:04Z</updated>
		<published>2009-06-15T18:32:04Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>Can you guess that I&#8217;m working on a WordPress-driven site? I launched Get Out Bay Area quietly last week and have been slowly adding more functionality to it. One of the big pieces is a newsletter component, which I&#8217;ll be using PHPList to run. Jesse Heap took the time to write a plugin that integrates [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/06/download-widgetized-phplist-integration-plugin-for-wordpress/">&lt;p&gt;Can you guess that I&amp;#8217;m working on a WordPress-driven site? I launched &lt;a href="http://www.getoutbayarea.com"&gt;Get Out Bay Area&lt;/a&gt; quietly last week and have been slowly adding more functionality to it. One of the big pieces is a newsletter component, which I&amp;#8217;ll be using &lt;a href="http://www.phplist.com/" target="_blank"&gt;PHPList&lt;/a&gt; to run. &lt;a href="http://www.jesseheap.com/" target="_blank"&gt;Jesse Heap&lt;/a&gt; took the time to write &lt;a href="http://projects.jesseheap.com/all-projects/wordpress-plugin-phplist-form-integration?ver=1.0" target="_blank"&gt;a plugin that integrates PHPList with Wordpress&lt;/a&gt; and damned if it didn&amp;#8217;t work great out of the box. The only thing missing was the ability to add it as a widget. So, riding on the success of &lt;a href="/blog/2009/06/download-rob-zs-widgetized-wordpress-google-calendar/"&gt;widgetizing the Google Calendar Parser&lt;/a&gt;, I decided to widgetize this bad boy. So, here it is:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.techknowme.com/media/files/phplist-form-integration-widgetized.zip" target="_blank"&gt;Download the Widgetized PHPList Integration Plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I take no credit or responsibility for the original &amp;#8211; all I did was add the widget part. Thanks again to Jesse Heap for the original &amp;#8211; it was exactly what I needed.&lt;/p&gt;
&lt;input id="gwProxy" type="hidden" /&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/m7fhPKKQh6w" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/06/download-widgetized-phplist-integration-plugin-for-wordpress/#comments" thr:count="9" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/06/download-widgetized-phplist-integration-plugin-for-wordpress/feed/atom/" thr:count="9" />
		<thr:total>9</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/06/download-widgetized-phplist-integration-plugin-for-wordpress/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[Download: Rob Z&#8217;s Widgetized Wordpress Google Calendar]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/wy-uViaga6I/" />
		<id>http://www.techknowme.com/blog/?p=36</id>
		<updated>2009-06-08T19:09:24Z</updated>
		<published>2009-06-08T19:09:24Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>First off, I did NOT write the bulk of this code &#8211; the bulk of it was written by Justin Bennett and the original can be found on his site. I take no responsibility or credit for the original code, only for my modifications. Having said that, the original version totally kicks butt.</p>
<p>The Google Calendar [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/06/download-rob-zs-widgetized-wordpress-google-calendar/">&lt;p&gt;First off, I did NOT write the bulk of this code &amp;#8211; the bulk of it was written by &lt;a href="http://jmbennett.org" target="_blank"&gt;Justin Bennett&lt;/a&gt; and &lt;a href="http://jmbennett.org/2008/06/21/google-calendar-feed-parser/" target="_blank"&gt;the original can be found on his site&lt;/a&gt;. I take no responsibility or credit for the original code, only for my modifications. Having said that, the original version totally kicks butt.&lt;/p&gt;
&lt;p&gt;The Google Calendar Feed Parser takes a Google Calendar Feed URL and&amp;#8230; well, parses it for display on Wordpress. The original version required you to embed the code somewhere in your template, but Wordpress&amp;#8217; new widget infrastructure makes it so you shouldn&amp;#8217;t have to do that. Justin didn&amp;#8217;t get around to widgetizing his parser, so I did it for him &amp;#8217;cause I needed it NOW! &lt;img src='http://www.techknowme.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;You can download my version of his feed parser &amp;#8211; complete with widget &amp;#8211; by clicking here: &lt;a href="http://www.techknowme.com/media/files/google-calendar-feed-parser-0.4.zip" target="_blank"&gt;Wordpress Google Calendar Feed Parser Plugin with Widget&lt;/a&gt;.&lt;/p&gt;
&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;/input&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/wy-uViaga6I" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/06/download-rob-zs-widgetized-wordpress-google-calendar/#comments" thr:count="14" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/06/download-rob-zs-widgetized-wordpress-google-calendar/feed/atom/" thr:count="14" />
		<thr:total>14</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/06/download-rob-zs-widgetized-wordpress-google-calendar/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[The Importance of Following Code Conventions]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/C4SHGmukT8A/" />
		<id>http://www.techknowme.com/blog/?p=30</id>
		<updated>2009-05-28T19:32:39Z</updated>
		<published>2009-05-28T19:32:22Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Uncategorized" />		<summary type="html"><![CDATA[<p>I&#8217;ve found one of the trickiest issues in working with other people&#8217;s code is trying to decipher the way they do things programmatically. You can learn an awful lot about how a programmer thinks by reading their code. All too often, the first thing I learn is that they&#8217;re wildly disorganized.</p>
<p>Freelancers are frequently self-taught and [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/05/the-importance-of-following-code-conventions/">&lt;p&gt;I&amp;#8217;ve found one of the trickiest issues in working with other people&amp;#8217;s code is trying to decipher the way they do things programmatically. You can learn an awful lot about how a programmer thinks by reading their code. All too often, the first thing I learn is that they&amp;#8217;re wildly disorganized.&lt;/p&gt;
&lt;p&gt;Freelancers are frequently self-taught and lack the experience of working in an environment with a lot of other programmers. As a result, they only ever program for themself &amp;#8211; not for the poor schlep (me) who has to come along later and try to figure out just what the heck they were trying to do. There&amp;#8217;s a distinct lack of useful comments, consistent code structure or well-named functions and variables.&lt;/p&gt;
&lt;p&gt;When you work in an environment with a group of programmers, the project lead should define the code conventions that all the programmers need to follow, enforcing them during regular code reviews. This creates a discipline a lot of solo coders lack.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been lucky to work within groups of programmers, so I know how valuable setting such code conventions can be. When I went out to find freelancers to help us at TechKnowMe, the very first thing I did was set up a code conventions document I expected everyone to follow. It&amp;#8217;s very short and very simple. You can download it as a PDF here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.techknowme.com/blog/wp-content/uploads/2009/05/code_conventions_v08.pdf" target="_blank"&gt;The TechKnowMe Coding Conventions Document&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In it, I define my general programming philosophy so that those working with me understand where I&amp;#8217;m coming from and what I expect. I then go into the details of how functions and variables should be named and even where brackets should appear. Much of what is in this doc should not be uncommon to most professional programmers, but if you&amp;#8217;re a freelancer working alone, I&amp;#8217;d strongly recommend adopting either the policies laid out here or setting some of your own.&lt;/p&gt;
&lt;p&gt;Of course, creating code conventions is the easy part. Developing the discipline to actually stick to them is the real tricky bit. It&amp;#8217;s this discipline, however, that separates the amateur hobbyist from the professional developer.&lt;/p&gt;
&lt;input id="gwProxy" type="hidden" /&gt;
&lt;p&gt;&lt;!--Session data--&gt;&lt;/p&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;input id="gwProxy" type="hidden" /&gt;
&lt;p&gt;&lt;!--Session data--&gt;&lt;/p&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;input id="gwProxy" type="hidden" /&gt;
&lt;p&gt;&lt;!--Session data--&gt;&lt;br /&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;/input&gt;
&lt;input id="jsProxy" onclick="jsCall();" type="hidden" /&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/C4SHGmukT8A" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/05/the-importance-of-following-code-conventions/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/05/the-importance-of-following-code-conventions/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/05/the-importance-of-following-code-conventions/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[Why I Built The TKM Website Manager]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/Vp-bviyLk1I/" />
		<id>http://www.techknowme.com/blog/?p=22</id>
		<updated>2009-05-21T19:30:23Z</updated>
		<published>2009-05-22T17:00:50Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Tech Rants" /><category scheme="http://www.techknowme.com/blog" term="Uncategorized" /><category scheme="http://www.techknowme.com/blog" term="cms" /><category scheme="http://www.techknowme.com/blog" term="TKM Website Manager" />		<summary type="html"><![CDATA[<p>In the previous post, I railed against custom code, then made a wane effort to defend my decision to create a custom CMS. The TKM Website Manager, which is currently only available to my clients, but which I&#8217;ve been debating releasing under the GPL or MPL, was designed to address a fatal flaw I&#8217;ve seen [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/05/why-i-built-the-tkm-website-manager/">&lt;p&gt;In the previous post, &lt;a href="http://www.techknowme.com/blog/2009/05/the-problem-with-custom-code/"&gt;I railed against custom code,&lt;/a&gt; then made a wane effort to defend my decision to create a custom CMS. The &lt;a href="http://www.techknowme.com/small-business-websites/web-site-management-system/"&gt;TKM Website Manager&lt;/a&gt;, which is currently only available to my clients, but which I&amp;#8217;ve been debating releasing under the &lt;a href="http://www.gnu.org/copyleft/gpl.html" target="_blank"&gt;GPL&lt;/a&gt; or &lt;a href="http://www.mozilla.org/MPL/" target="_blank"&gt;MPL&lt;/a&gt;, was designed to address a fatal flaw I&amp;#8217;ve seen with most content management systems out there. Specifically &amp;#8211; it works the way users expect a website manager to work.&lt;/p&gt;
&lt;p&gt;We have trained users to think of web sites in terms of pages and URLs. In the past, when we worked primarily with static sites, we&amp;#8217;ve given our users tools like &lt;a href="http://www.adobe.com/products/dreamweaver/" target="_blank"&gt;Dreamweaver&lt;/a&gt; or &lt;a href="http://www.adobe.com/products/contribute/" target="_blank"&gt;Contribute&lt;/a&gt; to make content updates &amp;#8211; tools that are either wildly dangerous if the user doesn&amp;#8217;t have the time to really learn them or wildly inadequate, especially now that a majority of sites are dynamic and database-driven. Despite those flaws, they at least stuck with the page/URL paradigm.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.joomla.org/" target="_blank"&gt;&lt;span id="more-22"&gt;&lt;/span&gt;Joomla&lt;/a&gt; is all about articles, menu links and modules and is so byzantine in its structure that making even simple changes requires an intimate knowledge not only of Joomla&amp;#8217;s intricacies, but the entire structure of the site itself. To fit Joomla to our whims, we have had to make far too many compromises, and that&amp;#8217;s the hallmark of a bad solution.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.wordpress.org" target="_blank"&gt;Wordpress&lt;/a&gt; as a blogging platform is peerless. With every iteration, it just gets better. The folks who develop it are so well in tune with their intended audience that they do nothing but create value to make running a blog as easy as possible. As a content management system, however, it leaves a lot to be desired. Though it has the ability to create static pages, the content for the pages themselves is little more than a static blog post. The use of sidebars is a compromise to create more editable areas, but there&amp;#8217;s little flexibility and any major changes require a developer to make drastic changes to the templates themselves. And I&amp;#8217;m not a big fan of using PHP code in a template &amp;#8211; it breaks the rule of separating logic from display.&lt;/p&gt;
&lt;p&gt;Just about every other system purporting to be a CMS &amp;#8211; &lt;a href="http://drupal.org/" target="_blank"&gt;Drupal&lt;/a&gt;, &lt;a href="http://www.cmsmadesimple.org/" target="_blank"&gt;CMS Made Simple&lt;/a&gt;, &lt;a href="http://phpnuke.org/" target="_blank"&gt;PHPNuke&lt;/a&gt;, etc. &amp;#8211; forces the user to completely re-think how a website works. For a technical user, this may be considered an interesting challenge. For non-technical small business owners preoccupied with the hundreds of moving parts of a running business, there&amp;#8217;s no time for such a paradigm shift. It comes as little surprise then that they quickly get frustrated with their sites and let them lay fallow for so long, dropping them off of Google&amp;#8217;s rankings and leaving them open to potential attack from malicious hackers.&lt;/p&gt;
&lt;p&gt;The TKM Website Manager presents the user with all of the pages on their site laid out in the hierarchical navigational structure defined in their main navigation. The URLs for each page are plain to see when editing them so there&amp;#8217;s no questions as to what page they&amp;#8217;re editing. When they call up a page for editing, the areas they are allowed to change are outlined in red with a little box that reads &amp;#8220;Click to Edit&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I admit that, in the pursuit of flexibility, the module system has added a wee bit of complexity that some of my clients initially bristle against. However, once they click on a section of the page to edit and understand what their module choices mean, they can easily drop in forms, reuse content or simply add and update HTML content without requiring much technical knowledge at all. I find that, after an hour of training, a majority of my users just &amp;#8220;get it&amp;#8221;. And we&amp;#8217;re talking about some truly non-technical people here &amp;#8211; some of them outright technophobic.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not perfect, and it&amp;#8217;s not always pretty, but I&amp;#8217;m constantly refining it according to the feedback I get from my users. But it makes running a website dead easy. I&amp;#8217;ve built so much flexibility in to the code and structure that I&amp;#8217;m actually turning it into less of a website platform and more of a web application platform. I&amp;#8217;ve baked in SEO, access control lists and user management, form management and other features that most other CMSes require some serious plugins or re-coding to get working.&lt;/p&gt;
&lt;p&gt;Right now I&amp;#8217;m building a module for community profiles (to turn it into a mini-social networking site), a payment module (for paid subscription services and simple e-commerce functionality) and an email marketing module that will allow not only for &lt;a href="http://www.constantcontact.com" target="_blank"&gt;Constant Contact&lt;/a&gt;-style HTML email sends, but also trigger-driven drip email campaigns so that users can automate the process of sending a series of newsletters to each new subscriber. All of these are reactions to features requested by my clients, and all of them, though complex, are made much easier to develop because I&amp;#8217;ve built a solid foundation.&lt;/p&gt;
&lt;p&gt;Most importantly, the TKM Website Manager allows me to rapidly build websites that, out of the box, perform the functions small business clients request the most so I am able to focus my attention on helping them make the most of their site&amp;#8217;s content and enhance their online marketing efforts. I want my clients to be intimately involved with their websites, to be unafraid of updating their content on a regular basis to keep it fresh and dynamic so they are best able to service the needs of their customers.&lt;/p&gt;
&lt;p&gt;Yes, I&amp;#8217;m VERY proud of this thing.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/Vp-bviyLk1I" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/05/why-i-built-the-tkm-website-manager/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/05/why-i-built-the-tkm-website-manager/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/05/why-i-built-the-tkm-website-manager/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Rob Z.</name>
						<uri>http://www.techknowme.com</uri>
					</author>
		<title type="html"><![CDATA[The Problem With Custom Code]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RobZsWebGeekBlog/~3/AUFNDdewVSw/" />
		<id>http://www.techknowme.com/blog/?p=18</id>
		<updated>2009-05-21T19:10:31Z</updated>
		<published>2009-05-21T19:10:03Z</published>
		<category scheme="http://www.techknowme.com/blog" term="Tech Rants" /><category scheme="http://www.techknowme.com/blog" term="architechture" /><category scheme="http://www.techknowme.com/blog" term="cms" /><category scheme="http://www.techknowme.com/blog" term="programming" /><category scheme="http://www.techknowme.com/blog" term="TKM Website Manager" />		<summary type="html"><![CDATA[<p>It seems these days that 90% of my work is cleaning up after other programmers. My annoyance with this fact &#8211; and the solutions I think you as programmers, designers, etc. should use &#8211; will probably become one of the major themes of this blog.</p>
<p>There&#8217;s a desire among us to create, and that&#8217;s a worthy [...]]]></summary>
		<content type="html" xml:base="http://www.techknowme.com/blog/2009/05/the-problem-with-custom-code/">&lt;p&gt;It seems these days that 90% of my work is cleaning up after other programmers. My annoyance with this fact &amp;#8211; and the solutions I think you as programmers, designers, etc. should use &amp;#8211; will probably become one of the major themes of this blog.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a desire among us to create, and that&amp;#8217;s a worthy desire. However, the requirements for so many small business sites are so simple and common that creating new code from scratch to run them is not only inefficient, it&amp;#8217;s downright dangerous. There&amp;#8217;s no such thing and &amp;#8220;clean&amp;#8221; code &amp;#8211; all code is buggy to one degree or another. Custom code, which has been exposed to a much smaller audience of developers and seen limited public release, has the potential to be among the buggiest, most insecure code of all.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-18"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It seems every developer has tried to attack this problem by building their own content management system (&lt;a href="http://www.techknowme.com/small-business-websites/web-site-management-system/"&gt;guilty as charged&lt;/a&gt;). This, again, would seem an elegant solution, but you need to weigh the benefits against the real costs of such an undertaking. Are you willing to take the time to document your code, not only in the form of comments but also in the form of a user manual that also covers administration? Are you writing code that only you can understand, or are you taking into account the programmer who will come after you? Are you addressing a problem that could be easier solved by modifying something off the shelf?&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re building a site for a client that&amp;#8217;s nothing more than a sales letter and a lead generation form, or a few informational pages or any of the other common formats for a small business website, there&amp;#8217;s no reason in the world you should build it from scratch with completely custom code &amp;#8211; you&amp;#8217;re wasting your time and the client&amp;#8217;s money.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m riled up on this topic because of &lt;a href="http://www.techknowme.com/blog/2009/05/fighting-the-jsredir-r-gumblarcn-trojan/"&gt;the recent spate of Gumblar attacks&lt;/a&gt;. I&amp;#8217;ve now cleaned out several custom-built sites using a script I wrote that, thankfully, automates about 90% of the process, but still leaves quite a bit of hand-editing. Were these sites built on a common platform, it would be a simple matter of backing up the database, reinstalling the software, re-importing the database and cracking open a beer. Instead, I&amp;#8217;ve found myself wading through thousands of files looking for and deleting the lines that indicate an infection, then testing my work and praying I didn&amp;#8217;t miss anything.&lt;/p&gt;
&lt;p&gt;This may all seem hypocritical in light of the fact that I now advertise a CMS I built specifically for the audience I serve &amp;#8211; small business owners. My defense for building the TKM Website Manager is that there is no other CMS out there that presents a user interface to non-technical users in a way that makes immediate sense to them. Every other CMS is built for web geeks or bloggers or some other audience of hobbyists &amp;#8211; not a single one is built specifically for non-technical small business owners. In other words, the TKM Website Manager addresses a very specific need and a very specific audience and is intended to be reused again and again.&lt;/p&gt;
&lt;p&gt;The next time you&amp;#8217;re starting a project for a client, plan out the project before you start programming. Don&amp;#8217;t take shortcuts &amp;#8211; actually do the requirements gathering and needs analysis. If the deadline is too tight for this, I argue that the project is not worth doing. In the long term, it&amp;#8217;s far less expensive for the client if you take the time to really think the whole project through before you lay down a line of code. While you&amp;#8217;re planning, keep asking yourself, &amp;#8220;Is there something out there already that can do this for me?&amp;#8221; &lt;a href="http://c2.com/cgi/wiki?LazinessImpatienceHubris" target="_blank"&gt;Remember Larry Wall&amp;#8217;s three virtues of the programmer&lt;/a&gt; &amp;#8211; laziness, impatience and hubris. The client ultimately doesn&amp;#8217;t care about how clever a programmer you are; they care that you get the requirements met and the job done.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/RobZsWebGeekBlog/~4/AUFNDdewVSw" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.techknowme.com/blog/2009/05/the-problem-with-custom-code/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.techknowme.com/blog/2009/05/the-problem-with-custom-code/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.techknowme.com/blog/2009/05/the-problem-with-custom-code/</feedburner:origLink></entry>
	</feed>
