<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:apple-wallpapers="http://www.apple.com/ilife/wallpapers" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel> 
	
	

<title>Kevin Bruce | Web and Print Designer/PHP Developer </title>
<link>http://www.kevinbruce.com</link>
<pubDate>Fri, 10 Sep 2010 00:00:00 -0400</pubDate>
<lastBuildDate>Fri, 10 Sep 2010 06:54:41 -0400</lastBuildDate>
<description>Kevin Bruce is a designer/developer that specializes in PHP, but also has extensive print skills.</description>
<image>
	<url>http://www.kevinbruce.com/images/icons/RSSmdsgtag.png</url>
	<title>Kevin Bruce | Web and Print Designer/PHP Developer </title>
	<link>http://www.kevinbruce.com</link>
</image>
<webMaster>kevin@brucecreative.com</webMaster>
<managingEditor>kevin@brucecreative.com (Kevin Bruce | Web and Print Designer/PHP Developer )</managingEditor>
<language>en-us</language>
<copyright>Copyright 2010 Kevin Bruce | Web and Print Designer/PHP Developer </copyright>
<generator>Bruce Creative WebEngine 6</generator>
<ttl>40</ttl>


	<item>
		<title>
		<![CDATA[ First OOP Sample ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/index.php?area_id=1&blog_id=3&ba_id=29 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;&lt;img style=&quot;border: 0pt none; margin: 10px; float: right;&quot; title=&quot;OOP&quot; src=&quot;members/kcbruce/images/oop.jpg&quot; alt=&quot;oop in Scrabble letters&quot; width=&quot;123&quot; height=&quot;150&quot; /&gt;Well, I've started my foray into object oriented programming, and I have to say that it's a totally different way of thinking than procedural. The sample of version 1.0 is located [&lt;a title=&quot;1st OOP example&quot; href=&quot;freescripts&quot;&gt;here&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;I have written a basic framework with a CMS built into it. The CMS allows for modules to be built for it. I've already create a couple of proprietary modules for Philips Hadco that can't be included here. I can say the it's fairly easy to build these modules (blog, forums, etc...). I'm already going to revise the parameter passing on the framework by passing a &quot;config&quot; object as a parameter that would include such things as &quot;site root&quot;, &quot;doc root&quot;,&quot;url&quot;, etc...&lt;br /&gt;&lt;br /&gt;I've tried to keep a MVC setup, let me know if I have! Feel free to comment and be totally critical- this is my first attempt and I have no ego to bruise!&lt;/p&gt;]]></description>
		
		<pubDate>
			Sun, 03 Jan 2010 12:16:44 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Happy New Year! ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=28 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;Just a quick &quot;Happy New Year&quot; to everyone out there! May 2010 be a wonderful and prosperous year for us all!&lt;/p&gt;]]></description>
		
		<pubDate>
			Fri, 01 Jan 2010 00:21:22 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ PHP5 - Recreating .NET's membership password hash algorithm ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=27 ]]></guid>
		
	
		<description><![CDATA[&lt;div class=&quot;smallfont&quot;&gt;&lt;strong&gt;Premise:&lt;/strong&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;I'm writing a php app that runs alongside ASP .NET site. I want to utilize the existing users and roles tables in the MSSQL server and can, except for one thing- matching the hashed passwords in the database. I found a blog that shows how .NET does the hashing (with salt) so I can try to recreate it in PHP.&lt;br /&gt;&lt;br /&gt;A developer on Twitter sent me this link which shows the .NET membership procedure for developing the hashes for passwords.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px; &quot;&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;private static HashAlgorithm passwordHasher = HashAlgorithm.Create(&quot;SHA1&quot;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;private bool ValidateUser(string username, string password)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;{&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding-left: 60px; &quot;&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;var user = GlobalApplication.Database.Users.FirstOrDefault(u =&amp;gt; u.UserName == username);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;if (user == null) return false;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;byte[] saltBytes = Convert.FromBase64String(user.Membership.PasswordSalt);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;byte[] passwordBytes = Encoding.UTF8.GetBytes(password);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;byte[] bytesToHash = new byte[saltBytes.Length + passwordBytes.Length];&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;saltBytes.CopyTo(bytesToHash, 0);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;passwordBytes.CopyTo(bytesToHash, saltBytes.Length);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;byte[] hash = passwordHasher.ComputeHash(bytesToHash);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;string base64Hash = Convert.ToBase64String(hash);&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;return user.Membership.Password == base64Hash;&lt;/span&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px; &quot;&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&lt;span style=&quot;font-family: mceinline;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;This was very useful is seeing what is done in C# and clues me into the procedures needed to replicate it in PHP&lt;br /&gt;I've gleemed over search results that SHA1 is the hash algorithm used (and PHP has implementations of this).&amp;nbsp;&lt;br /&gt;&lt;br /&gt;However a couple of hurdles I've run into:&lt;/div&gt;
&lt;div&gt;&lt;ol&gt;
&lt;li&gt;converting the UTF-8 password into bytes in PHP comes back as a string of 1's and 0's and the salt unpacks as true binary (returning +7&amp;ordf;&amp;aelig;tR&amp;lt;_9deji|&amp;Iuml;)&lt;/li&gt;
&lt;li&gt;not sure the &quot;copyTo()&quot; method is easily replaced by straight out concatenation&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;Thoughts?&lt;br /&gt;&lt;br /&gt;my PHP code version of above:&lt;br /&gt;----&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&lt;br /&gt;$hash_password = &quot;bgT8AutbQgtlec0VNhhtmAXdXxvI0V/96Vj48KRz26E=&quot;;&lt;br /&gt;$salt = &quot;KzeqXOZ0UjwYOWRlaml8zw==&quot;;&lt;br /&gt;&lt;br /&gt;$password = &quot;church&quot;;&lt;br /&gt;&lt;br /&gt;$salt = base64_decode($salt); //convert salt back to it's binary state&lt;br /&gt;&lt;br /&gt;$passwordBytes = bstr2bin(utf8_encode($password)); //convert password to utf8 then binary&lt;br /&gt;&lt;br /&gt;echo &quot;$salt&quot;; //prints &quot;+7&amp;ordf;&amp;aelig;tR&amp;lt;9deji|&amp;Iuml;&quot;&lt;br /&gt;echo &quot;$passwordBytes&quot;; //prints 11000110110100001110101011100100110001101101000&lt;br /&gt;&lt;br /&gt;$bytesToHash = $salt . $passwordBytes; //combine the 2 binary objs&lt;br /&gt;$hash = sha1($bytesToHash, true); //sha1 hash it&lt;br /&gt;$hashedpassword = base64_encode($hash); //base64 encode it into a string&lt;br /&gt;&lt;br /&gt;echo &quot;$hashedpassword&lt;br /&gt;$hash_password&quot;;&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;function bstr2bin($input)&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;// Binary representation of a binary-string&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;if (!is_string($input)) return null; // Sanity check&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;// Unpack as a hexadecimal string&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;$value = unpack('H*', $input);&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;// Output binary representation&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;return base_convert($value[1], 16, 2);&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;}&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;function bin2bstr($input)&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;// Convert a binary expression (e.g., &quot;100111&quot;) into a binary-string&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;{&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;if (!is_string($input)) return null; // Sanity check&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;// Pack into a string&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;&amp;nbsp;&amp;nbsp;return pack('H*', base_convert($input, 2, 16));&lt;/div&gt;
&lt;div style=&quot;padding-left: 30px;&quot;&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;---&lt;br /&gt;last &quot;echo&quot; prints:&lt;br /&gt;2mOfuA7gRcDEYNJF9fjN83em+Jw=&lt;br /&gt;bgT8AutbQgtlec0VNhhtmAXdXxvI0V/96Vj48KRz26E=&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;]]></description>
		
		<pubDate>
			Thu, 12 Nov 2009 16:53:32 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Twitter Down, 2012 Arrives Early ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=25 ]]></guid>
		
	
		<description><![CDATA[&lt;div&gt;Well, Twitter has been down for about an hour so far. I'm feeling a little weak, but I'm fine. The weakness is probably due to the lack of movement from my desk since I first started Tweeting. Life without Twitter is possible, because we have blogs! ;)&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;]]></description>
		
		<pubDate>
			Thu, 06 Aug 2009 10:03:04 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ The Problem with Discipline ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=22 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;Apparently evil must be inherent in humans, because what else would cause my little boy (light of my life and fruit of my loins) to laugh out loud at my wife's pained yelling after he scratches her face. *sigh* I know it's the terrible two's and all, but that's just plain evil!&lt;/p&gt;
&lt;p&gt;We're trying to raise him without the use of spanking, because we think it's a little hypocritical to hit him for... well, hitting people. I tell you, though- there are times I think a good, old-fashioned ass kick'n would get it into his head :P&amp;nbsp; We've tried reasoning, though with a 2.5 year old, it's fruitless. I've even tried a little home exorcism- &quot;In the name of Jesus Christ, begone from my son, ye demons of the underworld!&quot; (Dora and boots, coming to mind while I'm saying this). Nothing- he just laughs his merry little laugh. A jolly little demon, is he.&lt;/p&gt;
&lt;p&gt;Time-out seems to be the only thing that does any good. Though I see, it too, is waning in effect.&lt;/p&gt;
&lt;p&gt;At 2 and a half. the arsenal is getting a bit thin. I spoke with my big brother and he said if we were going to implement spanking, it'd better be soon or it'll freak him out much more than you'd want. I love this little guy to death and would throw myself in front of a bullet for him, but I want him raised right and raised to respect others.&lt;/p&gt;
&lt;p&gt;He's also been doing the &quot;it's fun to disobey mommy and daddy because I get a reaction&quot; thing, and this includes running away from Mommy in the parking lot! This has given us both of nightmares!&lt;/p&gt;
&lt;p&gt;UGH! I love being a Dad (sarcasm, optional)!&lt;/p&gt;]]></description>
		
		<pubDate>
			Mon, 22 Jun 2009 11:33:28 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Web Technology Group of Frederick ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=23 ]]></guid>
		
	
		<description><![CDATA[&lt;div style=&quot;margin:10px;float:right;position:relative&quot;&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center; width: 214px; font-family: tahoma,verdana,sans serif; font-size: 12px;&quot;&gt;
&lt;object width=&quot;214&quot; height=&quot;142&quot; data=&quot;http://www.meetup.com/swf/membership_badge.swf?chapterid=1463375&quot; type=&quot;application/x-shockwave-flash&quot;&gt;
&lt;param name=&quot;src&quot; value=&quot;http://www.meetup.com/swf/membership_badge.swf?chapterid=1463375&quot; /&gt;
&lt;/object&gt;
&lt;br /&gt;&lt;a href=&quot;http://flash.meetup.com/163/?track=i3/mu_el5vedfgcj&quot;&gt;Click here to check out&lt;br /&gt;The Web Technology of Frederick!&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After several conversations on Twitter, it was decided that Frederick, and the surrounding area was very underserved for geeky exchange groups. So I signed up a meetup group at meetup.com. For those that follw my sporratic blog, you know that I have occasioned the Columbia PHP meetup and have gotten alot out of the meetings. I feel that the web geeks of Frederick at least have the same talent. Frederick hosts several PHP only houses and a few design firms with PHP devs in them! Nick at Orases has graciously offer to host a few of the events and my wife has offered to bake some goodies :)&lt;/p&gt;]]></description>
		
		<pubDate>
			Sat, 30 May 2009 14:44:01 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Brush up on the Social! ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=21 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;When you're both the producer and the customer service (AKA &quot;freelancer&quot;), it's hard to switch hats. You work all day (and nights) on projects in solitude, answer and send emails, twitter and research. What is easy to forget is that customer service is king! You have to keep that line of communication open! In my years of dealing directly with customers, I've found that their main concern is being kept in the loop with their project. Daily emails, phone calls or even tweets do more to make the customer happy than making a deadline.&lt;/p&gt;
&lt;p&gt;I have an invoicing system that I wrote for myself and tweaked it to have an automatic email sent to the client when I posted what was done during the day, and the hours spent on the project. He was happier than a dog in a butcher shop!&lt;/p&gt;
&lt;p&gt;When the project is done, call the customer back occasionally to see how the site is going. Ask them what they would've done differently, having used the site for some time now. Give them freebies every once and a while- they LOVE that!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Have genuine interest in the project and their goals to success- after all, their success means your success.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;]]></description>
		
		<pubDate>
			Fri, 08 May 2009 16:48:26 -0400
		</pubDate>
		
	</item>
	<item>
		<title><![CDATA[ Ian's Hair ]]></title>
		
		<link><![CDATA[ http://www.kevinbruce.com/photos?cat_id=2&ph_id=7 ]]></link>
		<image>
			<url>http://www.kevinbruce.com/members/kcbruce/images/421011Ian.jpg</url>
			<title><![CDATA[ Ian's Hair ]]></title>
			<link>http://www.kevinbruce.com/members/kcbruce/images/421011Ian.jpg</link>
		</image>
		
		<description>
		<![CDATA[ Look at all of that hair! ]]>
		</description>
		<pubDate>Wed, 08 Apr 2009 13:25:16 -0400</pubDate>
		<category>kcbruce</category>
		<category>Ian's Hair</category>
		<guid><![CDATA[ http://www.kevinbruce.com/photos?cat_id=2&ph_id=7 ]]></guid>
		<apple-wallpapers:photoDate>2009-04-08T13:25:16</apple-wallpapers:photoDate>
		<apple-wallpapers:cropDate>2009-04-08 13:25:16 -14400</apple-wallpapers:cropDate>
		
		<apple-wallpapers:thumbnail>http://www.kevinbruce.com/members/kcbruce/images/thumb_421011Ian.jpg</apple-wallpapers:thumbnail>
		
		<apple-wallpapers:image>http://www.kevinbruce.com/members/kcbruce/images/421011Ian.jpg</apple-wallpapers:image>
		
		<apple-wallpapers:metadata>
			<PhotoDate>Wed, 08 Apr 2009 13:25:16 -0400</PhotoDate>
			<Comments>Look at all of that hair!</Comments>
		</apple-wallpapers:metadata>
	</item>
	<item>
		<title>
		<![CDATA[ Apple TV ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=19 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;Just got my new AppleTV this week. Pretty sweet! The downside is My old G4 (Dig Audio) has 802.11b and it has taken approximately 14 hours to get to 60% sync completion! I'm not upgrading anything on that Mac at this point. We'll just have to wait til a real upgrade.&lt;/p&gt;]]></description>
		
		<pubDate>
			Wed, 08 Apr 2009 13:17:05 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Happy Birthday to Me ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=18 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;Well, I spent my 41st birthday at home with a cold. Not all that bad a thing. I got to potter around the house, tinker with facebook and twitter. I also fit&amp;nbsp; a movie in (onDemand) - the 3rd Mummy movie. While the movie was entertaining, I really missed Rachel Weis. They replaced her with another actress, probably because Rachel had put her foot down.&lt;/p&gt;
&lt;p&gt;I made myself a cheesesteak and tomato soup and vegged in front of the movie. Not a bad day :)&lt;/p&gt;]]></description>
		
		<pubDate>
			Wed, 18 Mar 2009 21:21:04 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Volt ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=17 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;mmm.... Cathy and I went to volt restaurant here in Frederick tonight. It was the second time we've been there since it opened last summer. The first time we were there, the staff seemed professional, but a bit stilted. They had only been open for a month or so and I think they were still trying to find their center. This time we went, it was clear that they had. The staff was still professional, but warm and natural.&lt;/p&gt;
&lt;p&gt;It's going to be my birthday Wednesday, so this was my birthday meal. It was a spectacular trip into complex tastes and beautifully arranged dishes. We had A great Zin called Paradox (not sure it was spelled that way). Cathy had the lamb and I was totally unimaginative and had the same beef dish I had before (I really feel bad about that).&lt;/p&gt;
&lt;p&gt;To make a 2.5 hour meal short, it was fabulous. Fabulous food with a fabulous girl. I love our little boy, but I do miss going out with Cathy like we used to- at least we can do it twice a year:)&lt;/p&gt;]]></description>
		
		<pubDate>
			Sat, 14 Mar 2009 21:33:57 -0400
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Refactoring ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=16 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;I've been looking into what paths to take to refactor my communityCMS from procedural to OOP.&amp;nbsp; I'm setting up the code base to be below the web root as well as the uploads folder (having the file uploads below the web root plugs a common security hole).&amp;nbsp; This comes from reading the PHP In Action book. I'm finding that, while there are some new and strange (to me) concepts, OOP is quite doable and very interesting. The more I read, the more I want to tinker and build! &lt;br /&gt;&lt;br /&gt;I'm building a basic DB connection class that will enable you to use the same class with different Database engines (MySQL, Postgres, MSSQL). Of course, this is standard on alot of modern systems, but it's new in my system, which has mysql calls hard coded in.&lt;br /&gt;&lt;br /&gt;Th uploads folder being moved to below the web root will mean some changes to the current upload function (thank God I thought to make it a centrally located function!), but I thought it was time to update the WYSIWYG editor. I'm moving from Innova Studio (http://www.innovastudio.com/editor.asp) to tinyMCE. The downside is that, while the editor is free, the uploaded media center isn't. Seeing as I'm a cheap bastard and I love to build apps, I'm building a media manager to plug into it.&lt;br /&gt;&lt;br /&gt;I'm finding that code writing is alot like home remodeling- when you think it's going to take a couple of hours, count on 3 weeks!&lt;/p&gt;]]></description>
		
		<pubDate>
			Thu, 05 Mar 2009 13:27:41 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ old->new site mapping ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=14 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;&lt;!-- .code { 	background-color: #ECECEC; 	padding: 15px; 	width: 650px; 	font-size: 11px; 	overflow: auto; 	font-family: monospace; } .style1 {color: #FF9900} .style2 {color: #FF6600} .style3 {color: #000066} .style4 {color: #CC0000} .style5 {color: #006600} #textfunction { 	padding: 15px; 	width: 560px; 	font-size: 11px; 	overflow: auto; 	font-family: monospace; 	background-color: #CCFFFF; } .lookatthiscode { 	background-color: #FFFFCC; 	padding: 3px; 	border: thin dotted #999999; } --&gt;&lt;/p&gt;
&lt;p&gt;Two years ago while working at Sea Grant, Dan and I were creating   the new mdsg site. Sea Grant had hundreds of pages of existing content   in static html. The main concern was that many in the community had bookmarked   alot of the content and when we launched the new site, those bookmarks would   generate 404's (a very unhelpful content dead end).&lt;/p&gt;
&lt;p&gt;Since we were porting the exact same content into a database served by a PHP   CMS, we devised a fairly elegant (by &quot;elegant&quot;, I mean simple) solution.&lt;/p&gt;
&lt;p&gt;At launch time, we moved the old site to a hidden URL as a reference. This   was so the script that we'd create could reference the old site, parse the   title, search the current db of titles and return a list of suggested pages   they were looking for. When a person chose the correct page, it would map that   choice to the requested url and learn what page went where. The next time a   person hit that link, the error page would forward them to the mapped page.&lt;/p&gt;
&lt;p&gt;Of course, we knew that this kind of relied on the person choosing the correct   link in the first place, but it was close enough for government work (being   an educational institution) and the site had a search feature to help them   should they be lead astray.&lt;/p&gt;
&lt;div id=&quot;seecode&quot; class=&quot;addbutton&quot; onclick=&quot;showHide('showcode')&quot;&gt;Click to see Code&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;showcode&quot; style=&quot;display:none&quot;&gt;
&lt;p&gt;Tell Apache to go to a custom errorpage.php page which has the following code:&lt;/p&gt;
&lt;div id=&quot;cd&quot; class=&quot;code&quot;&gt;
&lt;p&gt;--errorpage.php--&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;style4&quot;&gt; &lt;/span&gt;&lt;br /&gt; include_once(&quot;includes/config.php&quot;);&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;style2&quot;&gt;//see if the site is setup for transistiong from an old version     of the site&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;style2&quot;&gt;//$_SESSION[old_site_url] is set in the config file-     this is were the old copy of the site can be accessed&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;style2&quot;&gt;//$_SESSION[enable_old_site_matching] is a boolean var     I've set up to see if we're running this site mapping script&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;if($_SESSION[enable_old_site_matching]==1 &amp;amp;&amp;amp; $_SESSION[old_site_url])&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$oldsitepath = str_replace(&quot;http://&quot;.$_SERVER['HTTP_HOST'],$_SESSION[old_site_url],$_SERVER['SCRIPT_URI']);&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style1&quot;&gt;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//see if this page has been mapped already&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$query = &quot;SELECT * FROM site_old_new_mapping WHERE old_link = '$oldsitepath' &quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result = mysql_query($query,$_GET[dbh])   OR die(mysql_error());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$row=mysql_fetch_assoc($result);&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($row[sm_id])&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($row[page_id]) &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//we found an entry, now send them to the previously mapped page&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;header(&quot;HTTP/1.1 301 Moved Permanently&quot;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;header(&quot;Location:  /goto.php?page_id=$row[page_id]&quot;);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;span class=&quot;style2&quot;&gt;//if this page hasn't been mapped yet, add it!&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$INquery = &quot;INSERT INTO site_old_new_mapping(old_link) VALUES('$oldsitepath')&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_query($INquery,$_GET[dbh])     OR die(mysql_error());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//save     this ID for the goto.php, where we will map this person's selection&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;$sitemap_id     = mysql_insert_id($_GET[dbh]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//read the old page, from the old site, into an array&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$phile = @file($oldsitepath);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(is_array($phile)) &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$page     = implode('',$phile);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$title = pagesTextBetween(&quot;:&quot;, &quot;&quot;,pagesTextBetween(&quot;title&amp;gt;&quot;, &quot;&lt;/p&gt;
&lt;div id=&quot;textfunction&quot; onmouseover=&quot;show('funct');&quot; onmouseout=&quot;Hide('funct');&quot;&gt;//function pagesTextBetween(); located in an included file of your choice
&lt;div id=&quot;funct&quot; style=&quot;display:none&quot;&gt;
&lt;p&gt;function pagesTextBetween($from,$to,$content,$firstoccur=1,$allownomatch=1,$debug=0)&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$content = str_replace(&quot;r&quot;,&quot;&quot;,stripslashes($content));&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$contentcheck = $content;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$from = str_replace(&quot;r&quot;,&quot;&quot;,$from);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$to = str_replace(&quot;r&quot;,&quot;&quot;,$to);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$from = strtolower($from);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$to = strtolower($to);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$L1 = strlen($from);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$contentcheck = strtolower($contentcheck);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($L1&amp;gt;0)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($firstoccur==1)     $pos1 = strpos($contentcheck,$from);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else $pos1 = strrpos($contentcheck,$from);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$pos1=0;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isset($pos1))&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($to == '') return     substr($content,$pos1+$L1);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($firstoccur)     $pos2 = strpos(substr($contentcheck,$pos1+$L1),$to);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else $pos2 = strrpos(substr($contentcheck,$pos1+$L1),$to);&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isset($pos2))     return substr($content,$pos1+$L1,$pos2);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($allownomatch==1)     return $content;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else $nosuchfile = 1;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($title)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;&amp;nbsp;//perform     search&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$searchwords = str_replace(&quot;&quot;&quot;,&quot;&quot;&quot;,$title);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$query = &quot;SELECT page_title,page_url,page_id FROM page WHERE (MATCH(page_title)     AGAINST('$title')) GROUP BY page_id&quot;; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result     = mysql_query($query) OR die(mysql_error());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$num   = mysql_num_rows($result);
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($num &amp;lt; 1)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$note   =  &quot;&lt;/p&gt;
&lt;span style=&quot;color: red;&quot;&gt;&lt;strong&gt;There are no items that     fit your search. Try using different search words.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$cnote     = 1; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$row[page_title] = stripslashes($row[page_title]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$row[page_summary] = stripslashes($row[page_summary]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while($row=mysql_fetch_array($result))&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$possibilities[]   = &quot;
&lt;p&gt;&lt;a href=&quot;goto.php?page_id=$row[page_id]&amp;amp;updatemapping=$sitemap_id&quot; target=&quot;_blank&quot;&gt;$row[page_title]     ($row[page_url])&lt;/a&gt;&lt;/p&gt;
&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &lt;br /&gt; }
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;style4&quot;&gt;?&amp;gt;&lt;/p&gt;
&lt;p&gt;--body of page--&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; &lt;span class=&quot;style3&quot;&gt;
&lt;div&gt;&lt;br /&gt;
&lt;h1&gt;I'm sorry, the page you're looking for (&lt;span class=&quot;style4&quot;&gt; echo $_SERVER['SCRIPT_URI'] &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;style3&quot;&gt;) no longer exists in that location.&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt; &lt;/span&gt;&lt;br /&gt; if(is_array($possibilities))&lt;br /&gt; {&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;br /&gt; &amp;nbsp;
&lt;div id=&quot;matcheshead&quot;&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;h2&gt;Here are some possible matches:&lt;/h2&gt;
&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;div id=&quot;matches&quot;&gt;&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;&lt;br /&gt; &lt;br /&gt; echo implode('',$possibilities);&lt;br /&gt; &lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;style3&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;h3&gt;&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;&lt;br /&gt; }&lt;br /&gt; elseif($nosuchfile)&lt;br /&gt; {&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;style3&quot;&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The page also doesn't seem to appear     to be in our old site. Check&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;that you have typed in the correct     address.&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;&lt;br /&gt; }&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Here is the goto.php page that inserts the selected page into the site mapping   table:&lt;/p&gt;
&lt;div id=&quot;gotopage&quot; class=&quot;code&quot;&gt;
&lt;p&gt;--goto.php page--&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;style4&quot;&gt;&lt;br /&gt; &lt;span class=&quot;style2&quot;&gt;//goto.php&lt;br /&gt; //takes a page_id, looks up the url path and sends them on their way&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; include_once(&quot;includes/config.php&quot;);&lt;br /&gt; if($_GET[page_id] || $_GET[page])&lt;br /&gt; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$page_id = $_GET[page_id];&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($_GET[anchor]) $extra = &quot;#$_GET[anchor]&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($_GET[queri]) $queri = &quot;?&quot; .     base64_decode(urldecode($_GET[queri]));&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;&amp;nbsp;&amp;nbsp;//get page location&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($_GET[page_id]) $query = &quot;SELECT     page_url, external_url FROM page WHERE page_id = '$page_id' &quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif($_GET[page]) $query = &quot;SELECT     page_url, external_url FROM page WHERE page_url LIKE '%$_GET[page]%' &quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$result = mysql_query($query,$_GET[dbh])     OR die(mysql_error());&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$row=mysql_fetch_assoc($result);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(is_array($row))&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($_SESSION[user_level]&amp;lt;2)     $url = &quot;$_GET[url]/$row[page_url]/index.php&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else     $url = &quot;$_GET[url]/$row[page_url]/&quot;;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;lookatthiscode&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//check     if this is sitemapping link. If so, insert the selection&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($_GET[updatemapping])&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;style2&quot;&gt;//update     URL in site_old_new_mapping table&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$Uq = &quot;UPDATE site_old_new_mapping SET page_id =  $_GET[updatemapping] &quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_query($Uq,$_GET[dbh]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if($row[external_url]&amp;gt;'')     header(&quot;Location: $row[external_url]&quot;.$queri.$extra);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else     header(&quot;Location: $url&quot;.$queri.$extra);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else header(&quot;Location: /index.php?page_id=$page_id&quot;.$queri.$extra);&lt;br /&gt; }&lt;br /&gt; &lt;span class=&quot;style4&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is the DB table for learning the site page mapping:&lt;/p&gt;
&lt;div id=&quot;cd2&quot; class=&quot;code&quot;&gt;
&lt;p&gt;--MySQL table `site_old_new_mapping`--&lt;/p&gt;
&lt;p class=&quot;style5&quot;&gt;&lt;br /&gt; CREATE TABLE `site_old_new_mapping` (&lt;br /&gt; `sm_id` bigint(20) NOT NULL auto_increment,&lt;br /&gt; `old_link` varchar(200) NOT NULL default '',&lt;br /&gt; `page_id` bigint(20) NOT NULL default '0',&lt;br /&gt; `manual_link` varchar(200) NOT NULL default '',&lt;br /&gt; `ignored` tinyint(1) NOT NULL default '0',&lt;br /&gt; `pages_with_old_link` varchar(255) NOT NULL default '',&lt;br /&gt; PRIMARY KEY (`sm_id`),&lt;br /&gt; KEY `old_link` (`old_link`),&lt;br /&gt; KEY `page_id` (`page_id`),&lt;br /&gt; KEY `ignore` (`ignored`),&lt;br /&gt; KEY `pages_with_old_link` (`pages_with_old_link`),&lt;br /&gt; KEY `manual_link` (`manual_link`)&lt;br /&gt; ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='maps 404 pages to existing pages'     AUTO_INCREMENT=31415 ;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This is all procedural and has no real error handling, but it illustrates   a possible solution to a common site upgrade issue. This was robust enough   to handle hundreds of pages to be mapped permanently.&lt;/p&gt;
&lt;/div&gt;]]></description>
		
		<pubDate>
			Mon, 02 Mar 2009 14:10:48 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ GEEK GEEK GEEK! ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=13 ]]></guid>
		
	
		<description><![CDATA[&lt;p&gt;Oh, how I envy the attendees of the &lt;a href=&quot;http://www.phpconference.co.uk/&quot;&gt;PHPUK&lt;/a&gt; conference! All day today, there's been geek chatter on Twitter from the attendees. For those of us that wear multiple hats and duties at work, such a narrowly focused conference is out of the question. Hell, in these times it would be, even if my job was pure PHP!&lt;br /&gt; &lt;br /&gt; Most people hate going to trade shows and conferences, but for me- I love them! It's a chance to see what others in your industry are doing. A chance to meet other fellow PHP geeks, compare geek notes and carry on geeky conversations that would make a mear mortal's eyes roll back in their heads before collapsing in a paralytic state of boredom! Those same conversations are electric for coders. To discuss the myrid ways to come to a solution through simple lines of text!&lt;br /&gt; &lt;br /&gt; You will never see such a display of geeky gadgetry as at a tech conference, and not on display by the vendors- but being carried around by the attendees. iPhones, Blackberries, netbooks and the latest laptops- not to mention a few prototypes! Don't be fooled by the outer casings though- that MacBook Pro is running CentOS and that Acer netbook is running Ubuntu- Now that's cool!&lt;br /&gt; &lt;br /&gt; I hope to go to another conference soon, but til then I get to hear the lucky bastards that are actually at one now... &lt;br /&gt; &lt;br /&gt; &lt;img style=&quot;width: 50px; height: 37px;&quot; src=&quot;members/kcbruce/images/elephpant.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; align=&quot;left&quot; /&gt;BTW- Whoever took the &quot;PHP Women's&quot; &lt;a href=&quot;http://twitpic.com/1smdb&quot; target=&quot;_blank&quot;&gt;elePHPant&lt;/a&gt;, please return it! Not cool!&lt;/p&gt;]]></description>
		
		<pubDate>
			Mon, 02 Mar 2009 10:49:46 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Events of life ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=2&ba_id=12 ]]></guid>
		
	
		<description><![CDATA[Why do bad things happen to good people? In this economy, this question is king. I've witnessed good, talented people get laid off or &quot;furloughed&quot; in my career and I remember having to ask &quot;why was it them and not me?&quot; Thank God that hasn't happened in my current job- at least, not yet- but in these times it's hard not to know someone that's been adversely affected by this economic downturn. &lt;br /&gt;
&lt;br /&gt;
I have been laid off before. In the fall of 2000, at while I was at Healent e-care solutions, I was laid off for two weeks. I took up freelance during that period and found that I loved it! It kind of freed me. It also prepared me for the two years of freelancing I did while in Oregon. I see that little stint of unemployment (the two week stint) as an opportunity rather than a terrible situation. Don't get me wrong- it always sucks when your employment is cut abruptly, I'm just saying that it might be opportunity knocking and that a better life is just around the bend.&lt;br /&gt;
&lt;br /&gt;
...or alot of waiting in an unemployment line.&lt;br /&gt;]]></description>
		
		<pubDate>
			Wed, 25 Feb 2009 21:32:47 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Legacy Code ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=11 ]]></guid>
		
	
		<description><![CDATA[It seems a neverending task to update legacy code. The site you're looking at right now has code in it that date as far back as 2004- which is ancient in web terms.&amp;nbsp; I constantly battle with updating parts of this engine, mostly because it's not written in OOP. I know this engine inside an out because I wrote every last line of it. God help anyone who might ever dive into it themselves :P&lt;br /&gt;



&lt;br /&gt;



This engine was written to be as versitile as I could make it. It allows you to create pages of content. You can also attach any one of the 20+ apps to each page (forum, chat room, document factory, private messenger, blogs [like this one], webcasting, etc..). It has groups and members functionality (with pay membership) as well as collaboration tools. The engine has served as a church site, education site, science site and a personal site. There have been times where I thought I've done everything I could with the direction of the code- then I find new possibilities. &lt;br /&gt;


&lt;br /&gt;


For instance- I'm creating a higher tier in this code that allows you to host many different sites on the same codeset using domain aliasing. This allows you to have a true network of sites that not only share the same database, but the same code files. It makes for easier and faster upgrades accross sites. I LOVE this stuff!&lt;br /&gt;


&lt;br /&gt;


I know that I'll need to eventually let this code go and build anew in OOP,&amp;nbsp; but it's kind of like my first car- Sure it was ugly, but it was my first and a hell of a lot of fun.&lt;br /&gt;


&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;


...God, I miss my Camaro.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;]]></description>
		
		<pubDate>
			Wed, 18 Feb 2009 22:04:00 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ SocialNet - old school ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=10 ]]></guid>
		
	
		<description><![CDATA[I love attending geek meetups like the PHP group I attended last night. It's always nice to meet others that do what you do, but in different companies. As PHP coders, we're all toolsmiths- but how we go about creating our tools can be completely different. Todd Marks (from MindGrub Technologies) has his &lt;a href=&quot;http://www.linkedin.com/pub/4/448/6a0&quot; target=&quot;_blank&quot;&gt;coders&lt;/a&gt; use 3rd party social networking tools like &lt;a href=&quot;http://kickapps.com&quot; target=&quot;_blank&quot;&gt;kickapps&lt;/a&gt; rather than reinventing the wheel. It makes sense from a practical standpoint, but I 
&lt;span style=&quot;font-style: italic;&quot;&gt;LOVE&lt;/span&gt; creating tools like that (as I'm sure &lt;a href=&quot;http://www.linkedin.com/pub/4/448/6a0&quot;&gt;Patrick&lt;/a&gt; does, as well) and would therefore waste alot of time doing so. Whereas Todd and his crew would've skinned a Drupal engine, embedded kickapps' widgets and launched the site- I would still be working on a better photo sharing solution than I created last year, and still have 3 more apps to go. I guess temperance does pay off- it's just not as fun;)&lt;br /&gt;]]></description>
		
		<pubDate>
			Wed, 11 Feb 2009 22:41:20 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Columbia PHP Meetup ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=9 ]]></guid>
		
	
		<description><![CDATA[I'm currently attending the Columbia PHP Meetup. The subject tonight: Social Networking and Drupa.&lt;br /&gt;
&lt;br /&gt;
Todd Marks from MindGrub Technologies talking about social media and Drupal implementations. &lt;br /&gt;
&lt;br /&gt;
A social networking framework provides a means for people with common interest to share ideas and content, or who may be interesting in the interests and activities of other users. Social networks have created a powerful new way to communicate They are mostly web based services which provide a platform to interactive using e-mail, instant messaging, chat rooms, discussion boards and sharing user generated videos and images.&lt;br /&gt;
&lt;br /&gt;
Mindgrub Technologies LLC was founded in 2002 to focus on the design and development of information display and instructional systems. We specialize in application and content development for web-based enterprise information delivery.&lt;br /&gt;
&lt;br /&gt;
Todd Marks is an information architect and user experience specialist, focusing on the design and development of cutting edge information display systems. Todd is the founder and President of Mindgrub Technologies, www.mindgrub.com, and co-founder of viaPlace, www.viaplace.com, a location based services and mobile social networking framework.&lt;br /&gt;
&lt;br /&gt;
kickapps.com - framework for drupal that offer social media widgets. Widget studio with video, photos, networks.&lt;br /&gt;]]></description>
		
		<pubDate>
			Wed, 11 Feb 2009 22:23:51 -0500
		</pubDate>
		
	</item>
	<item>
		<title><![CDATA[ Ian's Big Boy Bed ]]></title>
		
		<link><![CDATA[ http://www.kevinbruce.com/photos?cat_id=2&ph_id=6 ]]></link>
		<image>
			<url>http://www.kevinbruce.com/members/kcbruce/images/494575Idsm.jpg</url>
			<title><![CDATA[ Ian's Big Boy Bed ]]></title>
			<link>http://www.kevinbruce.com/members/kcbruce/images/494575Idsm.jpg</link>
		</image>
		
		<description>
		<![CDATA[ This is Ian's first night in his BBB (Big Boy Bed). He absolutely took to it! He slept through the whole night and got up at his normal time. In the morning, we heard his door open and he showed up in our room with a big smile on his face:) ]]>
		</description>
		<pubDate>Wed, 04 Feb 2009 21:43:37 -0500</pubDate>
		<category>kcbruce</category>
		<category>Ian's Big Boy Bed</category>
		<guid><![CDATA[ http://www.kevinbruce.com/photos?cat_id=2&ph_id=6 ]]></guid>
		<apple-wallpapers:photoDate>2009-02-04T21:43:37</apple-wallpapers:photoDate>
		<apple-wallpapers:cropDate>2009-02-04 21:43:37 -18000</apple-wallpapers:cropDate>
		
		<apple-wallpapers:thumbnail>http://www.kevinbruce.com/members/kcbruce/images/thumb_494575Idsm.jpg</apple-wallpapers:thumbnail>
		
		<apple-wallpapers:image>http://www.kevinbruce.com/members/kcbruce/images/494575Idsm.jpg</apple-wallpapers:image>
		
		<apple-wallpapers:metadata>
			<PhotoDate>Wed, 04 Feb 2009 21:43:37 -0500</PhotoDate>
			<Comments>This is Ian's first night in his BBB (Big Boy Bed). He absolutely took to it! He slept through the whole night and got up at his normal time. In the morning, we heard his door open and he showed up in our room with a big smile on his face:)</Comments>
		</apple-wallpapers:metadata>
	</item>
	<item>
		<title>
		<![CDATA[ Family Time! ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/index.php?area_id=1&blog_id=2&ba_id=8 ]]></guid>
		
	
		<description><![CDATA[I guess someone up there really wants me to put in family time. For the first time ever, I have to take my work computer in to be serviced. It will take about a week. It's a known issue with the NVidia cards on that MacBook Pro model. I should get it replaced (the graphics card) free of charge.&lt;br /&gt;
&lt;br /&gt;

&lt;img border=&quot;0&quot; align=&quot;right&quot; src=&quot;images/uploads/siteimages/Ians_big_boy_bedsm.jpg&quot; alt=&quot;Ian's BBB (Big Boy Bed)&quot; style=&quot;width: 148px; height: 148px;&quot; /&gt;As most of our friends have heard, Ian is now sleeping in his &quot;big boy bed.&quot; He LOVES it! We're going to get rid of the crib , but want to make sure he won't freak out if it's gone from his room.&lt;br /&gt;
&lt;br /&gt;
Cathy has been making such awesome, yummy and fattening food lately that I'm heading back to the gym pronto! I had lost 22 pounds this past year and don't want to gain it back &amp;lt;:P&lt;br /&gt;
&lt;br /&gt;
I think we all are ready for the spring to be here. I really want to take Ian on some hiking this summer and get him to the pool as well. He's developed a fondness for french fries which he definitely gets from his dad.&lt;br /&gt;]]></description>
		
		<pubDate>
			Sat, 31 Jan 2009 17:01:16 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ Social Networking? ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog/index.php?area_id=6&blog_id=3&ba_id=7 ]]></guid>
		
	
		<description><![CDATA[Having one leg in the marketing world and one leg in the coding world, you might know that I find the social networking industry 
&lt;span style=&quot;font-style: italic;&quot;&gt;VERY&lt;/span&gt; fascinating! The cross-linking of information and people networks is almost a study in Chaos Theory and definitely scientific proof of that we are all, indeed withing 6 degrees of Kevin Bacon.&lt;br /&gt;
&lt;br /&gt;
I've really just started in on the marketing side of web 2.0, even though I've been coding it for years. I've become a devoted fan of &lt;a href=&quot;http://sethgodin.typepad.com/&quot; target=&quot;_blank&quot;&gt;Seth Godin&lt;/a&gt; and read his blog daily. Being human, I love all of the interaction on &lt;a href=&quot;http://facebook.com&quot; target=&quot;_blank&quot;&gt;facebook&lt;/a&gt; and networking on &lt;a href=&quot;linkedin.com&quot; target=&quot;_blank&quot;&gt;linkedin&lt;/a&gt;. Haunting these networks has gotten me pumped, once again, to write code. To integrate my existing code with other networks and actually use ajax frameworks like &lt;a href=&quot;http://developer.yahoo.com/yui/&quot; target=&quot;_blank&quot;&gt;YUI&lt;/a&gt;. They've breathed new life into this grizzled veteran of Web 1.0 and pushed me to write with enthuseasm once again!&lt;br /&gt;
&lt;br /&gt;
I'm currently working on updating alot of my site engine's apps for &lt;a href=&quot;www.thejmigroup.com&quot; target=&quot;_blank&quot;&gt;JMI&lt;/a&gt;. We're on the verge of bringing one of the nation's biggest Christian Denominations into the 21st century! &lt;br /&gt;]]></description>
		
		<pubDate>
			Wed, 28 Jan 2009 21:14:04 -0500
		</pubDate>
		
	</item>
	<item>
		<title>
		<![CDATA[ The weekend ]]>
		</title>
		
		<guid><![CDATA[ http://www.kevinbruce.com/Blog?area_id=6&blog_id=2&ba_id=4 ]]></guid>
		
	
		<description><![CDATA[Well, another weekend at the Bruce's! This weekend, we saw Ian showing his more independent side with building blocks, Cathy started sanding the porch railing and Kevin grocery shopping with the little man. I went to church (Cathy and I try to go every weekend, and it was my turn) and prayed for our souls;) &lt;br /&gt;

&lt;br /&gt;

Yesterday (Saturday), Cathy did 2 exercise classes, then I went on a run and lifted weights. We all then proceeded to get a well-earned meal at &lt;a title=&quot;oh YUM!&quot; href=&quot;http://www.fiveguys.com&quot; target=&quot;_blank&quot;&gt;Five Guys Burgers&lt;/a&gt;. I wonder why I can't seem to lose weight...&lt;br /&gt;

&lt;br /&gt;

&lt;br /&gt;]]></description>
		
		<pubDate>
			Sun, 19 Oct 2008 15:46:17 -0400
		</pubDate>
		
	</item>	
</channel>

</rss>