<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chat Clussman &#187; Web Development</title>
	<atom:link href="http://clussman.com/category/web-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://clussman.com</link>
	<description>A father, design technologist and would-be writer.</description>
	<lastBuildDate>Fri, 03 Sep 2010 00:08:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Vendor Client Relationships</title>
		<link>http://clussman.com/vendor-client-relationships/</link>
		<comments>http://clussman.com/vendor-client-relationships/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 04:58:43 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Science]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://clussman.com/?p=187</guid>
		<description><![CDATA[Found:

]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.vendorclientvideo.com/">Found:</a></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/R2a8TRSgzZY&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/R2a8TRSgzZY&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/vendor-client-relationships/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UX Team of One Panel (Unedited Notes from Presentation)</title>
		<link>http://clussman.com/ux-team-of-one-panel-unedited-notes-from-presentation/</link>
		<comments>http://clussman.com/ux-team-of-one-panel-unedited-notes-from-presentation/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 16:34:56 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[SXSW]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://clussman.com/?p=164</guid>
		<description><![CDATA[These are the unedited notes I took during the SXSW panel. Sub-lists aren&#8217;t indented so I&#8217;ll need to come back and format later.  No guarantee I&#8217;ll actually do that so hopefully she&#8217;ll publish her presentation.

Put away the computer
Start with a six-up template:

A piece of paper with six thumbnail boxes

      [...]]]></description>
			<content:encoded><![CDATA[<p>These are the unedited notes I took during the SXSW panel. Sub-lists aren&#8217;t indented so I&#8217;ll need to come back and format later.  No guarantee I&#8217;ll actually do that so hopefully she&#8217;ll publish her presentation.</p>
<ul>
<li>Put away the computer</li>
<li>Start with a six-up template:
<ul>
<li>A piece of paper with six thumbnail boxes</li>
<li>
            </li>
<li>Designers tend to come up with only 1 or 2 ideas at first<br />
	          Usually influenced by tools and recent designs</li>
<li>Six-up template forces you past that wall</li>
<li>Don&#8217;t limit yourself to six</li>
</ul>
</li>
</ul>
<ul>
<li>Conceptual frameworks:
<ul>
<li>Spectrums: explore 1-dimension of project<br />
		Ex: Experience Level: Beginner to Expert</p>
<ul>
<li>First timer: how-to guide</li>
<li>Intermediate: Choose template, step-by-step process</li>
<li>Expert: DB stuff with past evites, invitees, etc. (control panel)</li>
</ul>
</li>
</ul>
</li>
<li>2&#215;2: spectrum on top of a spectrum
<ul>
<li>First-Timer/Expert plotted against Manual/Automatic
<ul>
<li>Quadrant A: First-Timer/Automatic</li>
<li>Quadrant B: First-Timer/Manual</li>
<li>Quadrant C: Expert/Automatic</li>
<li>Quadrant D: Expert/Manual</li>
</ul>
</li>
</ul>
</li>
<li>Grids: plotting all the spectrums across x/y axis</li>
</ul>
<ul>
<li>Word Association:
<ul>
<li>accordian, auto-complete, bookshelf, breadcrumbs, carousel, cart, collapsible, comments, comparison, configurator, &#8230;, icons, &#8230;, modules, &#8230;</li>
</ul>
</li>
</ul>
<ul>
<li>Inspiration Library:
<ul>
<li>Use screengrab tool for Firefox to grab screenshots of things that are interesting.</li>
<li>Use iPhoto to catalog them</li>
</ul>
</li>
</ul>
<ul>
<li>Assemble an ad-hoc team:
<ul>
<li>Make sketchboards
<ul>
<li>Post sketches by group to a large board (like a mood board!)
<ul>
<li>Ex: requirements, home page, create invitiation, re-visit invitation</li>
</ul>
</li>
</ul>
</li>
<li>Run template-based workshops
<ul>
<li>Design the box: front, back</li>
<li>Concept Sheet: title, draw a picture, &#8230;</li>
<li>Design the experience: title, &#8230;</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Decorate your space with your project sketches and materials while you are working on it (not after). Invite people into the process.</p>
<p>When someone starts describing something to you, give them a pen. Ask them to draw it out.</p>
<ul>
<li>Have a black-hat sessions:
<ul>
<li>Get everybody together for a fixed period of time and play a game where everybody has to take a turn being a villian and they have to go through and point out every possible objection they could possibly have.  Gets people who won&#8217;t shut up about their concerns and let them feel heard.  Takes people who were too afraid to give you their criticisms and gets them to open up and voice their concerns.</li>
</ul>
</li>
</ul>
<p>Get rid of the idea of a genius designer (d&#8217;oh!)</p>
<ul>
<li>Use design principles (5-7 pithy statements about the essence of the experience):
<ul>
<li>Tivo Ex:
<ul>
<li>It&#8217;s entertainment stupid.</li>
<li>It&#8217;s TV, stupid.</li>
<li>It&#8217;s video, damnit.</li>
<li>Everything is smooth and gentle.</li>
<li>No modality at deep heirarchy.</li>
<li>Respect the viewers privacy.</li>
<li>It&#8217;s a robust appliance, like a TV.</li>
</ul>
</li>
<li>Google Calendar Ex:
<ul>
<li>Fast, visually appealing, and joyous to use.</li>
<li>Drop dead simple to get information</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Quiddity (great Scrabble word): a statement of what you want the essence of the experience to be. You will not create a great experience unless you define what the quiddity is.</p>
<ul>
<li>Evite was the case study used for the session:
<ul>
<li>Three step process:
<ul>
<li>Choose design from the design gallery</li>
<li>Add recipients</li>
<li>Send evite</li>
</ul>
</li>
<li>How would you improve this process?</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/ux-team-of-one-panel-unedited-notes-from-presentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>class.pagination.php</title>
		<link>http://clussman.com/classpaginationphp/</link>
		<comments>http://clussman.com/classpaginationphp/#comments</comments>
		<pubDate>Fri, 20 Apr 2007 23:02:04 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://clussman.com/2007/04/20/classpaginationphp/</guid>
		<description><![CDATA[I've been meaning to simplify my work / life by creating some classes that I can use to streamline a lot of the projects that I work on.  I found myself with some time this week and finally took a small step in that direction by creating a pagination class.  Up until now I've used a function that I wrote way back when for paging.  It was clunky, kludgy, and limited.  I looked around at what was available online and what I found was, for the most part, clunky, kludgy, and limited.]]></description>
			<content:encoded><![CDATA[<style type="text/css">
.entry ul.pagination li:before {
   content: none;
}
html > body .entry ul.pagination li { 
   display: inline; 
   border: 0; 
   list-style-type: none;
   margin: 0;
}
ul.pagination li a { 
   margin-right: 5px;
   padding: 3px 6px;
   font-weight: bold;
   color: #33F;
   background: #FFF;
   border: 1px solid #CCC;
   text-decoration: none;
}
.pagination li a:hover { color: #FFF; background: #33F; border-color: #000 }
.pagination li a.currentPage { color: #999; border: 0; }
.pagination li a.currentPage:hover { 
   color: #999; background: #FFF; cursor: default;
}
</style>
<p><a href="/files/pagination.zip">Download this file</a></p>
<p>I&#8217;ve been meaning to simplify my work / life by creating some classes that I can use to streamline a lot of the projects that I work on.  I found myself with some time this week and finally took a small step in that direction by creating a pagination class.</p>
<p>Up until now I&#8217;ve used a function that I wrote way back when for paging.  It was clunky, kludgy, and limited.  I looked around at what was available online and what I found was, for the most part, clunky, kludgy, and limited.</p>
<p>Starting from my existing code, I laid out some goals for how I wanted my new pagination object to work:</p>
<ul>
<li>It had to be very simple to integrate.  I wanted to be able to drop it into a file and have it just work.</li>
<li>The output had to be semantic, valid (X)HTML that would be easy to style with CSS.</li>
<li>I wanted options for how the links would display.</li>
<li>It needed to have options to output clean URLs (for when I&#8217;m using mod rewrite) or normal URLs with ugly query strings.</li>
<li>It needed the option of using sessions to store SQL queries since, much of the time, this would be necessary when using clean URLs.</li>
<li>It had to be drop-dead simple to configure options, such as how many pages to display per page, enabling mod rewrite functionality, enabling the use of session data, etc.</li>
</ul>
<p><em>The idea for using sessions and clean URLs came from <a href="http://www.benjamieson.com/">Ben Jamieson</a> / <a href="http://www.thyme-online.com">Thyme Online</a></em>.  I&#8217;m also going to credit him with the idea for highly compartmentalizing the code used in the class (he has a highly compartmentalized pagination class of his own with sessions and clean URLs&#8230;) even though I remember what his code looked like when I first met him and I think this may be a case of the student becoming the master!</p>
<p>If you&#8217;re wondering why I wrote my own class instead of just using his, well, there were a couple of reasons:</p>
<ul>
<li>I wanted the practice (I re-read the chapter on OOP in my PHP book before starting).</li>
<li>I&#8217;m an idiot: I was concerned about security and I didn&#8217;t realize the session data was only storing a session ID in the client side cookie and not the actual SQL queries.  I initially wrote this class to include Alexander Valyalkin&#8217;s <a href="http://www.php.net/manual/en/function.md5.php#43696">most excellent md5_ encryption and decryption functions</a>.</li>
<li>There were some things I wanted to do differently.</li>
<li>And because I already had my own paging code that I wanted to adapt.</li>
</ul>
<p>If you already have something in place to handle pagination, a lot of this code will probably look familiar &mdash; there aren&#8217;t that many ways to skin this particular cat &mdash; but hopefully this code is clean enough and reusable enough that some people will find it useful.</p>
<h4>A Simple Example</h4>
<pre><span style="color:#000000"><span style="color:#0000BB">&lt;?php
   </span><span style="color:#007700">include_once(</span><span style="color:#DD0000">'class.pagination.php'</span><span style="color:#007700">);
   </span><span style="color:#0000BB">$sql </span><span style="color:#007700">= </span><span style="color:#DD0000">"SELECT * FROM table_name"</span><span style="color:#007700">;
   </span><span style="color:#0000BB">$paging </span><span style="color:#007700">= new </span><span style="color:#0000BB">pagination</span><span style="color:#007700">();
   </span><span style="color:#0000BB">$result </span><span style="color:#007700">= </span><span style="color:#0000BB">mysql_query</span><span style="color:#007700">(</span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">paginate</span><span style="color:#007700">(</span><span style="color:#0000BB">$sql</span><span style="color:#007700">));
   while (</span><span style="color:#0000BB">$record </span><span style="color:#007700">= </span><span style="color:#0000BB">mysql_fetch_assoc</span><span style="color:#007700">())
   {
      </span><span style="color:#FF8000">// Output records here
   </span><span style="color:#007700">}
   print(</span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">getLinks</span><span style="color:#007700">());
   print(</span><span style="color:#DD0000">"&lt;p&gt;"</span><span style="color:#007700">.</span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">getCount</span><span style="color:#007700">().</span><span style="color:#DD0000">"&lt;/p&gt;"</span><span style="color:#007700">);
</span><span style="color:#0000BB">?&gt;</span></span></pre>
<p>The above example is the simplest usage.  The class is included, the object is initialized, the SQL code is passed and returned with the LIMIT clause appended (note: it will replace any existing limit clause) and the links are output.</p>
<h4>Sample Output</h4>
<div class="pageLinks">
<ul class="pagination">
<li><a href="/test.php?page=1" class="currentPage">1</a></li>
<li><a href="javascript:;">2</a></li>
<li><a href="javascript:;">3</a></li>
<li><a href="javascript:;" class="nextPage">Next &gt;</a></li>
</ul>
<p>Displaying 1 to 5 of 13</p>
<hr />
<ul class="pagination">
<li><a href="javascript:;" class="firstPage">&laquo; First</a></li>
<li><a href="javascript:;" class="previousPage">&lt; Previous</a></li>
<li><a href="javascript:;">4</a></li>
<li><a href="javascript:;">5</a></li>
<li><a href="javascript:;" class="currentPage">6</a></li>
<li><a href="javascript:;">7</a></li>
<li><a href="javascript:;">8</a></li>
<li><a href="javascript:;" class="nextPage">Next &gt;</a></li>
<li><a href="javascript:;" class="lastPage">Last &raquo;</a></li>
</ul>
<p>Displaying 81 to 90 of 130</p>
<hr />
</div>
<p>For large sets of data, ten or more pages, first and last links are added to let users quickly jump to the beginning or end of the data set.  Otherwise, just the pages and previous/next links are displayed.  You can change that by passing an optional variable to the <strong>getLinks()</strong> function or, if you&#8217;re going to output multiple sets of paging links on a page, you can override the default format via the <strong>setDisplayOptions()</strong> function (see description of this function below for more details).</p>
<h4>Available Functions</h4>
<p><strong style="color:#C00">paginate($sql)</strong> &#8211; This function initializes several variables and returns a modified SQL statement with a LIMIT clause appended to it.</p>
<p><strong style="color:#C00">setDisplayOptions($x)</strong> &#8211; This function changes how pagination links are output for a given page.  It takes a numeric value between 1 and 4:</p>
<ol>
<li>Only show the first and last links for large data sets (ten or more pages).  Only show previous link when not on the first page.  Only show next link when not on the last page.  <em>This is the default setting.</em></li>
<li>Always show first and last links.  Always show previous and next links.</li>
<li>Never show first and last links but always show previous and next links (the Flickr option).</li>
<li>Never show first and last links.  Only show previous link when not on the first page.  Only show next link when not on the last page.</li>
</ol>
<p>You can achieve the exact same functionality by passing this variable in the <strong>getLinks()</strong> function.  Both of the following examples output the same thing:</p>
<pre><span style="color:#000000"><span style="color:#0000BB">&lt;?php
   </span><span style="color:#FF8000">// Example one
   </span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">setDisplayOptions</span><span style="color:#007700">(</span><span style="color:#0000BB">3</span><span style="color:#007700">);
   print(</span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">getLinks</span><span style="color:#007700">());

   </span><span style="color:#FF8000">// Example two
   </span><span style="color:#007700">print(</span><span style="color:#0000BB">$paging</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">getLinks</span><span style="color:#007700">(</span><span style="color:#0000BB">3</span><span style="color:#007700">));
</span><span style="color:#0000BB">?&gt;</span></span></pre>
<p><strong style="color:#C00">setPageSize($x)</strong> &#8211; Override the default number of items to display per page.  The default is 25.</p>
<p><strong style="color:#C00">setModRewrite(TRUE)</strong> &#8211; The default value is FALSE.  Override this if you plan to use mod_rewrite to create clean URLs.  If you don&#8217;t know what this is, leave it alone.</p>
<p><strong style="color:#C00">setUseSessions(TRUE)</strong> &#8211; The default value is FALSE.  Override this if you have complex SQL statements that you don&#8217;t want to pass via query strings.  You&#8217;ll probably need to enable this if you&#8217;re using clean URLs.</p>
<p><strong style="color:#C00">setSessionName($name)</strong> &#8211; This just exists to prevent any possible conflicts with existing code.  The default session name is &#8216;<em>searchdata</em>&#8216;.  If, by any chance, you already use a session variable with that name, you can override the name used by the pagination class.</p>
<p>This function can also be used if you plan to store multiple SQL queries by assigning a unique session name for each query.</p>
<p><strong style="color:#C00">getSQL()</strong> &#8211; What goes up, must come down &mdash; or better put: what is input, must be output.  You pass a SQL statement to the pagination object; this function returns that SQL statement to you with the LIMIT clause appended to it.</p>
<p><strong style="color:#C00">getCount()</strong> &#8211; This returns the &#8220;Displaying from x to y of z&#8221; string.  It gets its own function so that it is easy to omit if don&#8217;t want to display it.</p>
<p><strong style="color:#C00">getLinks($x)</strong> &#8211; This is the meat and potatoes.  This function returns the list of links for output.  It accepts the same numeric option that <strong style="color:#C00">setDisplayOptions($x)</strong> uses.</p>
<h4>Miscellaneous Notes</h4>
<p>Regardless of whether you use clean URLs or not, the the current page is determined by the $_GET['page'] variable.  The page variable always needs to be the last part of the query string or path.  Examples:</p>
<ul>
<li>domain.com/articles/title/5/</li>
<li>domain.com/article.php?name=title&amp;page=5</li>
<li>domain.com/search.php?keywords=xyz&amp;sort=desc&amp;page=2</li>
</ul>
<p><em>The first example above is using mod_rewrite.</em></p>
<hr />
<p>To use sessions, you first have to initialize the session data with:</p>
<pre><span style="color:#000000"><span style="color:#0000BB">&lt;?php
session_start</span><span style="color:#007700">();
</span><span style="color:#0000BB">?&gt;</span></span></pre>
<p>If you are using cookie-based sessions, you must call <strong>session_start()</strong> before anything is output to the browser.  For more information on how to use <strong>session_start()</strong>, <a href="http://www.php.net/manual/en/function.session-start.php">see the php.net website</a>.</p>
<hr />
<p>You can view the source code of this page and the associated stylesheet to see how the links are output and how I&#8217;ve styled them.</p>
<p><em>If you have suggestions regarding this class, please leave a comment.  Also, this isn&#8217;t heavily tested, so if you find a bug (I&#8217;m sure there will be some) please let me know about it.</em></p>
<p><a href="/files/pagination.zip">Download this file</a></p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/classpaginationphp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SXSWi 2007: Hey Everybody</title>
		<link>http://clussman.com/sxswi-2007-hey-everybody/</link>
		<comments>http://clussman.com/sxswi-2007-hey-everybody/#comments</comments>
		<pubDate>Sat, 10 Mar 2007 21:04:33 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[SXSW]]></category>

		<guid isPermaLink="false">http://clussman.com/2007/03/10/sxswi-2007-hey-everybody/</guid>
		<description><![CDATA[This weekend I'm misssing my favorite event: SXSWi.  I start looking forward to the next one the day the current one ends and I usually have more fun during those four or five days than I do when Karina and I go on vacation.  But I'm missing it for a very good reason: Karina is due any day now and it turns out there are a (very) few things that are more important than south-by.]]></description>
			<content:encoded><![CDATA[<p>This weekend I&#8217;m misssing my favorite event: SXSWi.  I start looking forward to the next one the day the current one ends and I usually have more fun during those four or five days than I do when Karina and I go on vacation.</p>
<p>But I&#8217;m missing it for a very good reason: Karina is due any day now and it turns out there are a (very) few things that are more important than south-by.</p>
<p>To all of our friends who are in town: we both want to say &#8216;hi&#8217;.  Even though we probably won&#8217;t see any of you, we will think of all of you with envy for the next four days.  Enjoy south-by and send us the cliff notes!  (If you have my cell or email, drop me a line &#8212; I am hoping to make it downtown for an hour or two tomorrow if we&#8217;re not in the hospital.)</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/sxswi-2007-hey-everybody/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The need for project planning</title>
		<link>http://clussman.com/the-need-for-project-planning/</link>
		<comments>http://clussman.com/the-need-for-project-planning/#comments</comments>
		<pubDate>Tue, 12 Sep 2006 20:57:26 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/09/12/the-need-for-project-planning/</guid>
		<description><![CDATA[I've been working on a largish website project and I've been falling steadily behind schedule.  The reasons for the delays fall into two categories: data conversion and code conversion.  Both turned out to be more complicated than I expected.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on a largish website project and I&#8217;ve been falling steadily behind schedule.  The reasons for the delays fall into two categories: data conversion and code conversion.  Both turned out to be more complicated than I expected.</p>
<p>Data Conversion (Filemaker to MySQL)</p>
<p>Filemaker is a weird sort of database.  Instead of tables you have &#8220;layouts&#8221; that show certain fields but all fields exist in the same bucket.  The database is the table.  In this case the Filemaker database had hundreds of fields in it that were spread across 16 layouts and all of it needed to be converted to MySQL.  Unfortunately this was not an a => b scenario for several reasons:</p>
<p>- A lot of calculations and data manipulation are taking place in Filemaker<br />
- The LDML code made extensive use of lists built into Filemaker<br />
- A lot of data had to be translated<br />
- Certain restrictions were placed on the MySQL databases (see below)</p>
<p>The data conversion is part of the larger conversion from Filemaker/LDML to MySQL/PHP.  On the PHP side the client already has a database structure and code built out for several of the portions of the site being converted.  In those cases some data has to be split across multiple tables, so data has to be converted to new formats, and various other tweaks had to be performed.</p>
<p>This is a longer term project (four months). Because the data conversion will have to be done several times, I chose to write a script to handle it.  Again, because it will have to be run over and over again, it first starts by emptying the existing tables and resetting all of the auto_increment counters to 1.  When the site has been fully converted and is ready to relaunch, we&#8217;ll be able to run the script again and at the push of a button grab the most recent data from the previous site.  Whenever data turns out to need more &#8220;massaging&#8221; during the code translation process (i.e. something turns out to be wrong) I can make the changes and re-run the script without having to perform a lot of manual labor.</p>
<p>I&#8217;ll outline the conversion script another day &#8212; it&#8217;s about 800 lines of code.  It took about a week to write and get right and since this project is ongoing it will almost certainly require more tweaks as the project moves forward.  That&#8217;s a lot more than the one day I had estimated for the conversion.</p>
<p>Code Conversion</p>
<p>Once I had the data poured into 19 MySQL tables I could start setting up the website.  First thing was converting the new layout into XHTML and CSS.  No problemo.  The second step was to setup the new navigation structure.  A little bit more work and planning here but again, no problemo.  The third step was to create pages for all of the static content.  This was the easiest step in the process.  The fourth step was, and is, where I get my hands dirty and start mucking around with the site code.</p>
<p>Now, it seemed easiest to start with the pre-existing PHP modules from the client and get those up and running.  Unfortunately, this is where I ran headfirst into one of my own great shortcomings.  I have a hard enough time reading my own well-formatted and well-documented code.  In this case I&#8217;m reading someone else&#8217;s code with functions and classes that are spread across 25 different files.  Everything is being generated or manipulated by something else.  Coming into this from the outside it&#8217;s very hard to figure out what is going on.  For me this has led to a lot of confusion, a lot of delays, and a lot of sleepless nights.</p>
<p>Finally, this weekend I decided that something had to give.  I was trying to take the short route and fumble through things.  Define a task, tackle it, and when it doesn&#8217;t work try to trace the code back through the various files to find out why.  Fix, try again, run into another problem, trace it back through, etc.</p>
<p>For most people this would actually work.  They can just learn from doing something hands on.  For me that doesn&#8217;t work.  I have to first read a manual, then get hands on and refer back to the manual as I&#8217;m going along.  It&#8217;s not enough for me to know how something works, I have to understand <i>why</i> it works.</p>
<p>I determined that I needed to write a manual.  In doing so I would develop a deep understanding of how everything in the various files worked.</p>
<p>Yesterday I spent the day printing out most of a ream (500 pages) of code.  I got a binder and a bunch of tabbed inserts.  I created tabs for each document, hole punched everything and assembled my book.  Then I started the two day process of reading the book.  For each file I created an outline of each class and function.  I also outlined the structure for each include.  This is my table of contents and is in the front of the book.</p>
<p>Now I have a much greater understanding of what is going on because I&#8217;ve read through everything once.  I also now have a quick reference to any section of code without having to open five different files to track function calls.  At a glance I can see what is going on and if I&#8217;m passing data to a function in the correct format or using a function in the correct way.  This took two days and it could have saved me weeks of sleepless nights.</p>
<p>Planning and organization are incredibly important when working on projects.  It may seem like wasted time but in the end it saves more time than it consumes.</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/the-need-for-project-planning/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Just Plain Weird</title>
		<link>http://clussman.com/just-plain-weird/</link>
		<comments>http://clussman.com/just-plain-weird/#comments</comments>
		<pubDate>Sat, 29 Apr 2006 21:54:35 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/04/29/just-plain-weird/</guid>
		<description><![CDATA[<object codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="480" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" height="376"><param name="src" value="http://media.revver.com/broadcast/19542/video.mov" /><param name="controller" value="True" /><param name="cache" value="False" /><param name="autoplay" value="False" /><param name="kioskmode" value="False" /><param name="scale" value="tofit" /><embed src="http://media.revver.com/broadcast/19542/video.mov" pluginspage="http://www.apple.com/quicktime/download/" scale="tofit" kioskmode="False" qtsrc="http://media.revver.com/broadcast/19542/video.mov" cache="False" height="376" width="480" controller="True" type="video/quicktime" autoplay="False"></embed></object>

More <a href="http://www.firefoxflicks.com/flicks/?sort=">Firefox commercials here</a>.]]></description>
			<content:encoded><![CDATA[<p><object codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="480" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" height="376"><param name="src" value="http://media.revver.com/broadcast/19542/video.mov" /><param name="controller" value="True" /><param name="cache" value="False" /><param name="autoplay" value="False" /><param name="kioskmode" value="False" /><param name="scale" value="tofit" /><embed src="http://media.revver.com/broadcast/19542/video.mov" pluginspage="http://www.apple.com/quicktime/download/" scale="tofit" kioskmode="False" qtsrc="http://media.revver.com/broadcast/19542/video.mov" cache="False" height="376" width="480" controller="True" type="video/quicktime" autoplay="False"></embed></object></p>
<p>More <a href="http://www.firefoxflicks.com/flicks/">Firefox commercials here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/just-plain-weird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You can&#8217;t see it but&#8230;</title>
		<link>http://clussman.com/you-cant-see-it-but/</link>
		<comments>http://clussman.com/you-cant-see-it-but/#comments</comments>
		<pubDate>Sat, 22 Apr 2006 21:13:08 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/04/22/you-cant-see-it-but/</guid>
		<description><![CDATA[I just updated my <a href="http://wordpress.org/">WordPress</a> admin interface to use the <a href="http://orderedlist.com/wordpress-plugins/wp-tiger-administration/">WP Tiger Administration</a> plugin.  Take that.]]></description>
			<content:encoded><![CDATA[<p>I just updated my <a href="http://wordpress.org/">WordPress</a> admin interface to use the <a href="http://orderedlist.com/wordpress-plugins/wp-tiger-administration/">WP Tiger Administration</a> plugin.  Take that.</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/you-cant-see-it-but/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You know CSS is mainstream when&#8230;</title>
		<link>http://clussman.com/you-know-css-is-mainstream-when/</link>
		<comments>http://clussman.com/you-know-css-is-mainstream-when/#comments</comments>
		<pubDate>Thu, 30 Mar 2006 18:03:56 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/03/30/you-know-css-is-mainstream-when/</guid>
		<description><![CDATA[I'm a little behind on my reading (and posting) but work has been busy and taking time off for SXSW didn't help things.  I found myself reading the February issue of How while I ate my lunch today.  February was the issue on typography.  I was surprised to find an article on web typography but even more surprised by what it wrote:]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a little behind on my reading (and posting) but work has been busy and taking time off for SXSW didn&#8217;t help things.  I found myself reading the February issue of How while I ate my lunch today.  February was the issue on typography.  I was surprised to find an article on web typography but even more surprised by what it wrote:</p>
<blockquote><p>Of course, you can create text as a graphic using any font in your arsenal.  The drawbacks to this tactic are that it&#8217;s not easily changed later, it can&#8217;t be copied and pasted with other text on a page, it doesn&#8217;t scale in size when the user chooses a different default font size for the browser, and it&#8217;s not accessible to people with visual impairments who use text-speaking devices.  The benefit, however, is that the text you create in Photoshop appears exactly as you want it to appear, with your font of choice and any graphic effects or other visual stylings.</p></blockquote>
<p>Now, there was a little bit of FUD there about the screen readers (text-speaking devices).  If you provide the text in an alt attribute for the image it will be perfectly accessible.  However, I found it amazing that a magazine for designers, primarily print designers, would be so astute as to point out all of the failings of using images for text.</p>
<p>Later in the article was another paragraph, this one about Flash:</p>
<blockquote><p>When designing Flash projects, most of the same typographical rules mentioned above still apply; you&#8217;re simply gaining the freedom to use whatever font you like.  However, Flash isn&#8217;t nearly as accessible as HTML, and certainly not as flexible as CSS if you want to change the appearance.  Frankly, waiting for Flash animations to load can be annoying to site users, even those with broadband internet connections.</p></blockquote>
<p>Steering designers away from Flash because of accessibility and load times?  I&#8217;m not religious but Hallelujah!  I take this article as a sign of the maturity of the online design community, our tools and our pool of knowledge.  We&#8217;ve come a long way in the last 10 years and pieces like this give me hope for the next 10.</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/you-know-css-is-mainstream-when/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX Tutorials</title>
		<link>http://clussman.com/ajax-tutorials/</link>
		<comments>http://clussman.com/ajax-tutorials/#comments</comments>
		<pubDate>Fri, 17 Mar 2006 19:16:12 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/03/17/ajax-tutorials/</guid>
		<description><![CDATA[<a href="http://blog.wired.com/monkeybites/">Monkey Bites</a> has a quick post up called "<a href="http://wiredblogs.tripod.com/monkeybites/index.blog?entry_id=1437490">A heap of AJAX tutorials</a>" which links to 30 tutorials + one.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.wired.com/monkeybites/">Monkey Bites</a> has a quick post up called &#8220;<a href="http://wiredblogs.tripod.com/monkeybites/index.blog?entry_id=1437490">A heap of AJAX tutorials</a>&#8221; which links to 30 tutorials + one.</p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/ajax-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>James is inside my head</title>
		<link>http://clussman.com/james-is-inside-my-head/</link>
		<comments>http://clussman.com/james-is-inside-my-head/#comments</comments>
		<pubDate>Fri, 17 Mar 2006 02:32:37 +0000</pubDate>
		<dc:creator>Chat</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Microformats]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://clussman.com/2006/03/16/james-is-inside-my-head/</guid>
		<description><![CDATA[I donâ€™t know how he did it but somehow he managed to steal this list straight out of my brain. Sure he added a few things like move to New York and picking up music again, but itâ€™s basically my list.]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t know how he did it but somehow he managed to steal <a href="http://cookiecrook.com">this list</a> straight out of my brain.  Sure he added a few things like move to New York and picking up music again, but it&#8217;s basically my list.  Compare:</p>
<ul>
<li>Start drawing (both offline and with a <a href="http://www.wacom.com/lcdtablets/index_21UX.cfm">sweet pen tablet</a>)</li>
<li>Write those stories I keep starting (and participate in this year&#8217;s <a href="http://www.nanowrimo.org/">National Novel Writing Month</a></li>
<li>Look out for myself (okay I&#8217;m stealing that one from him)</li>
<li>Stay in better touch with my friends &#8212; and get out more</li>
<li>Practice my Spanish*</li>
<li>Design more and code less &#8212; including designing some t-shirts</li>
<li>Start blogging about things I&#8217;m passionate about (design and the web)</li>
<li>Redesign my site &#8212; I&#8217;m using someone else&#8217;s design!</li>
</ul>
<p>See?  Same damn list.  He might have tried to customize it a bit to &#8220;make it his own&#8221; but we all know the truth.  James Craig reads minds.  I don&#8217;t know if he has to get close to you to do it, so I want to make sure I get these out now:</p>
<ul>
<li>Finally create my web-based cartoon &#8212; it&#8217;s been six years</li>
<li>Start a t-shirt company (hey, everybody else is)</li>
<li>Create some sweet WordPress plugins:
<ul>
<li>Real estate listings</li>
<li>Events calendar using the <a href="http://microformats.org/wiki/hcalendar">hCalendar microformat</a></li>
<li>Contact list using the <a href="http://microformats.org/wiki/hcard">hCard microformat</a></li>
</ul>
</li>
</ul>
<p>Okay, it appears that <a href="http://structuredblogging.org/formats.php">Structured Blogging</a> is way ahead of me on the whole microformats-for-WordPress thing, so I&#8217;ll have to check that out.</p>
<p><small>* This one is major since my wife&#8217;s family doesn&#8217;t speak English and we visit them several times a year.  I would also like to learn German since my own extended family doesn&#8217;t speak English either.  As it stands right now I can&#8217;t communicate with her family or mine.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://clussman.com/james-is-inside-my-head/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
