<?xml version="1.0" encoding="UTF-8"?><rss version="2.0">
	<channel>
		<title>SethCardoza.com</title>
		<link>http://www.sethcardoza.com</link>
		<description>Posts - SethCardoza.com</description>
		<language>en-us</language>
		<copyright>2012 Seth Cardoza</copyright>
		<managingEditor>seth.cardoza@gmail.com</managingEditor>
		<webMaster>seth.cardoza@gmail.com</webMaster>
		<pubDate>Mon, 23 Jan 2012 15:04:09 EST</pubDate>
		<lastBuildDate>Mon, 23 Jan 2012 15:04:09 EST</lastBuildDate>
		<category>Web Development</category>
		<generator>SethCardoza.com</generator>
		<docs>http://www.sethcardoza.com/feeds/</docs>
		<item>
			<title>One Reason Why I Continually Shop Wtih Amazon</title>
			<link>http://www.sethcardoza.com/posts/view/63/title/One-Reason-Why-I-Continually-Shop-Wtih-Amazon</link>
			<description><![CDATA[<p>In short, their customer service.</p>
<p>Companies are bound to make mistakes. Orders will be misplaced, packages damaged during shipping, and products will malfunction or break. It's how a company responds to those problems that makes them great, and I have consistently had a great experience with Amazon.</p>
<p>Most recently, I had an issue with a DVD I purchased. I had bought the I Love Lucy Complete Series (affiliate link) for my then fiance in October of 2010 (over a year ago). Well, since it's 34 discs, we weren't able to watch it all right away. In fact, we are just now getting close to finishing it. The second to last disc of the set gave us problems. It would not play properly, getting stuck in a loop on one of the production logos. We were unable to navigate to the menu or any other part of the disc. I checked the disc, and there were a couple scratches, which I know we didn't cause because this was our first time handling it.</p>
<p>Since it was purchased over a year prior, I figured we were screwed, but I would try to contact the manufacturer. I checked the packaging, and found www.paramount.com/entertainment, so I try to bring up the page, but it doesn't exist anymore. I can't find any sort of useful link on the Paramount home page. I search for the CBS Home Entertainment website, which does have a contact page, but no contact form on it. They do have links to Twitter and Facebook, so I contact them through Twitter, and wait for a response.</p>
<p>In the mean time, I figure it won't hurt to contact Amazon, since they are often very helpful, and maybe can at least get me in contact with the manufacturer. I explain the issue with the disc in an email, and ask if they are able to replace the single disc. I get an email within a couple hours letting me know that they cannot replace the single disc, but are willing to replace the entire set for me. They sent me a replacement, and are paying for the return shipping on the defective set. Their service is much more than I asked for, and certainly more than I expected, but why I continue to buy with confidence from Amazon.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/63/title/One-Reason-Why-I-Continually-Shop-Wtih-Amazon</guid>
			<pubDate>Mon, 23 Jan 2012 15:04:09 EST</pubDate>
		</item>
		<item>
			<title>DC Comics Sea World Ad from 1977</title>
			<link>http://www.sethcardoza.com/posts/view/62/title/DC-Comics-Sea-World-Ad-from-1977</link>
			<description><![CDATA[<p>I thought this old ad from one of my comics was neat. There's a coupon to save $0.75 off each Sea World park ticket. It might not seem like a lot, but remember tickets were probably $20 a piece or less at the time.</p>
<p></p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/62/title/DC-Comics-Sea-World-Ad-from-1977</guid>
			<pubDate>Fri, 11 Nov 2011 08:44:52 EST</pubDate>
		</item>
		<item>
			<title>Walt Disney World Orlando VS Universal Orlando Resort</title>
			<link>http://www.sethcardoza.com/posts/view/61/title/Walt-Disney-World-Orlando-VS-Universal-Orlando-Resort</link>
			<description><![CDATA[<p>I was browsing Google Maps recently and noticed how large Walt Disney World Orlando is compared to Universal Orlando Resort. In the image below you can see Disney in the purple, and Universal in the red. To be fair, the purple is only the land Disney owns, and not necessarily their entire resort. With Universal, all that red is the entire resort. As you can see, they have no room to grow. Good planning on their part.</p>
<p>&nbsp;</p>
<p></p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/61/title/Walt-Disney-World-Orlando-VS-Universal-Orlando-Resort</guid>
			<pubDate>Mon, 08 Aug 2011 14:36:07 EDT</pubDate>
		</item>
		<item>
			<title>SVN Ignore</title>
			<link>http://www.sethcardoza.com/posts/view/60/title/SVN-Ignore</link>
			<description><![CDATA[<p>Telling SVN to ignore files and directories is crucial to keeping your repository clean, and to prevent it from needlessly bloating. It's rather simple to tell SVN what you want it to ignore with svn propset/propedit svn:ignore.</p>
<p>If you want SVN to ignore all files in a directory, you'd simply enter the following command:</p>
<p style="padding-left: 30px;">svn propset svn:ignore * /path/to/directory</p>
<p>Often times, you only want SVN to ignore a specific type of file, say .jpg uploads in your user profile pictures directory:</p>
<p style="padding-left: 30px;">svn propset svn:ignore *.jpg /path/to/directory</p>
<p>As you can see, it's easy to tell SVN what to ignore with propset svn:ignore, but what if you want to know what you or someone else has told SVN to ignore? It's simply:</p>
<p style="padding-left: 30px;">svn propget svn:ignore /path/to/directory</p>
<p>Often times, you will want to edit what you've already told SVN to ignore. This can be achieved with svn propedit svn:ignore.</p>
<p style="padding-left: 30px;">svn propedit svn:ignore /path/to/directory</p>
<p>This will allow you to edit your svn:ignore property in your default text editor. Multiple ignores can be added one per line. You can even run this command to setup the initial svn:ignore rather than using svn propset svn:ignore. I much prefer this method because it's cleaner, and I don't have to remember the syntax for the command line.</p>]]></description>
			<category>Version Control</category>
			<guid>http://www.sethcardoza.com/posts/view/60/title/SVN-Ignore</guid>
			<pubDate>Mon, 25 Jul 2011 16:59:13 EDT</pubDate>
		</item>
		<item>
			<title>Samsung Fascinate Screen Capture</title>
			<link>http://www.sethcardoza.com/posts/view/59/title/Samsung-Fascinate-Screen-Capture</link>
			<description><![CDATA[<p>With the recent update to Android 2.2 Froyo, the Samsung Fascinate has the ability to take screen shots. There's no need to root your phone, or even install other programs. Simply hold down the back button and push the power button. You will see a message stating "Screen captured. Saved as image file." At this point, if this is your first time taking a screen capture, a folder will be created on your micro SD card labeled ScreenCapture.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/59/title/Samsung-Fascinate-Screen-Capture</guid>
			<pubDate>Tue, 24 May 2011 09:43:28 EDT</pubDate>
		</item>
		<item>
			<title>USB Hub Guy</title>
			<link>http://www.sethcardoza.com/posts/view/58/title/USB-Hub-Guy</link>
			<description><![CDATA[<p>Since I use a computer at work, I'm the resident computer guy in my family. Yes, simply using a computer on a regular basis makes me the go-to guy for anything computer related. While I am a web developer, and know a decent amount about computers, I don't know everything about every computer, far from it actually. One of the more difficult things is trying to help a family member over the phone. Whether it's trying to hook up a new gadget, or troubleshooting an issue, descriptions are always as vague as possible. "My computer won't turn on" can mean the monitor won't turn on, the actual computer won't turn on, or a number of other things.</p>
<p>Something I found to ease my pain was this USB hub in the shape of a little man (Amazon affiliate link). I got it for less than $5 shipped online one day. I've set it up on the desk of several of my family members. I connect it to the computer for them. Now, any time they call me needing help connecting their camera, mp3 player, Kindle, or any other of the plethora of electronics that use USB, I simply tell them to plug it into the "little guy". It's made everything easier on everyone. Depending on who I was talking to, connecting a USB device sometimes meant climbing under the desk and finding the port in the back of the computer, finding the right port on the front of the computer (sometimes concealed by a door to hide all the "ugly" ports), or finding it along the sides of a laptop. Now, if the device doesn't work after they've connected it to the "little guy", I don't have to guess whether or not they've connected it to the right port or not.</p>]]></description>
			<category>Design</category>
			<guid>http://www.sethcardoza.com/posts/view/58/title/USB-Hub-Guy</guid>
			<pubDate>Tue, 26 Apr 2011 09:54:54 EDT</pubDate>
		</item>
		<item>
			<title>A Quick Tip for Easier CSS Editing</title>
			<link>http://www.sethcardoza.com/posts/view/57/title/A-Quick-Tip-for-Easier-CSS-Editing</link>
			<description><![CDATA[<p>A tip I picked up years ago, the source escapes me at this point in time, is alphabetize your CSS style properties. It makes it much easier to jump to the specific property later. Take the following 2 examples, and find the margin in each.</p>
<p> p {  &nbsp;&nbsp;&nbsp;&nbsp;width: 75%;  &nbsp;&nbsp;&nbsp;&nbsp;border: 1px solid #000;  &nbsp;&nbsp;&nbsp;&nbsp;overflow: hidden;  &nbsp;&nbsp;&nbsp;&nbsp;padding: 5px 10px;  &nbsp;&nbsp;&nbsp;&nbsp;color: #000;  &nbsp;&nbsp;&nbsp;&nbsp;background-color: #eee;  &nbsp;&nbsp;&nbsp;&nbsp;background-image: none;  &nbsp;&nbsp;&nbsp;&nbsp;margin: 10px 0;  &nbsp;&nbsp;&nbsp;&nbsp;text-align: left;  &nbsp;&nbsp;&nbsp;&nbsp;text-decoration: none;  &nbsp;&nbsp;&nbsp;&nbsp;font-size: 14px;  &nbsp;&nbsp;&nbsp;&nbsp;font-family: Helvetica, Arial, sans-serif; } </p>
<p> p {  &nbsp;&nbsp;&nbsp;&nbsp;background-color: #eee;  &nbsp;&nbsp;&nbsp;&nbsp;background-image: none;  &nbsp;&nbsp;&nbsp;&nbsp;border: 1px solid #000;  &nbsp;&nbsp;&nbsp;&nbsp;color: #000; font-size: 14px;  &nbsp;&nbsp;&nbsp;&nbsp;font-family: Helvetica, Arial, sans-serif;  &nbsp;&nbsp;&nbsp;&nbsp;margin: 10px 0;  &nbsp;&nbsp;&nbsp;&nbsp;overflow: hidden;  &nbsp;&nbsp;&nbsp;&nbsp;padding: 5px 10px;  &nbsp;&nbsp;&nbsp;&nbsp;text-align: left;  &nbsp;&nbsp;&nbsp;&nbsp;text-decoration: none;  &nbsp;&nbsp;&nbsp;&nbsp;width: 75%; } </p>
<p>Hopefully, you can find the margin property faster in the second, alphabetized, list. It can take some time to get into the habit of doing so, but it is worth it. After a while, you may forget the benefits of alphabetizing your CSS properties, but you'll quickly remember how valuable it is when editng another coder's CSS that does not have alphabetized properties.</p>]]></description>
			<category>Design</category>
			<guid>http://www.sethcardoza.com/posts/view/57/title/A-Quick-Tip-for-Easier-CSS-Editing</guid>
			<pubDate>Thu, 07 Apr 2011 16:31:32 EDT</pubDate>
		</item>
		<item>
			<title>The Trials and Tribulations of a Grooveshark User</title>
			<link>http://www.sethcardoza.com/posts/view/56/title/The-Trials-and-Tribulations-of-a-Grooveshark-User</link>
			<description><![CDATA[<p>If you don't know about Grooveshark, it's a really nice service that allows you to listen to just about any music your heart would desire. Unlike other free music streaming services, you can listen to the exact songs you want whenever you want, and however many times you want. Add music to a library, mark your favorites, make playlists and share them with friends.</p>
<p>They offer a VIP service for a monthly/yearly fee that provides an ad-free online experience, allows more songs to be added to your library and playlists, as well as access to their mobile apps. I've been so pleased with their service, that I signed up for their VIP service back in November, before I ever had a smartphone with a supported platform. They had planned to increase their subscription prices, but subscribers would be locked in at the price they initially paid forever. I knew I would eventually want to use their services on a mobile device, and didn't mind giving them my money to support the service while I wasn't using any of their mobile apps.</p>
<p>I've since purchased an Android phone and use their mobile app frequently. There's a small bug that won't update your playlists if you've added/removed songs via the website. It's a bug they know of, and they say a workaround is to rename the playlist via the website, and this will force the mobile application to update. It's an annoyance, but one I can deal with. I ran into another bug a little over a month ago. One of my playlists was emptied. I contacted them to figure out what happened and if there was a backup. They apologized, but they didn't have any backup. There's also no way for users to back up their playlists themselves. It wasn't too big of a deal, I mean, it's just some music. The playlists can be rebuilt, nothing of monetary value was lost. I rebuilt my playlists and moved on, until it happened again. I contacted Grooveshark again about the situation, and they apologized again, and added 3 months of VIP service to my account at no charge. There's really not much I could do other than rebuild the affected playlists again. It has since happened a third and fourth time over the past month and a half (I've been comped another 3 months of VIP service, giving me a total of 6 months for free), with Grooveshark still not backing up user data, nor providing users with a means to do it themselves.</p>
<p>Grooveshark really provided a great service, one that I raved about to friends frequently. As with many other Web 2.0 services, you might say I have little/no room to complain about issues with a free service, and I would agree, but I am a paying customer. Sure, it's just music, but I enjoy creating playlists of different types of music, different moods, etc. It's time consuming, and inexcusable for Grooveshark to not have backups of user data, especially for paying customers. At this point, I've stopped using Grooveshark, and won't use it again until the situation is resolved (even for free). I need to be assured that my data will not be lost, partially or totally, on a regular basis, or at the very least be provided with a way to back up my data if Grooveshark will not do it for me. It's a shame because Grooveshark had a truly great service, and one of the few that I would gladly pay for.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/56/title/The-Trials-and-Tribulations-of-a-Grooveshark-User</guid>
			<pubDate>Tue, 08 Mar 2011 16:56:55 EST</pubDate>
		</item>
		<item>
			<title>Boycott Valentine's Day</title>
			<link>http://www.sethcardoza.com/posts/view/55/title/Boycott-Valentine's-Day</link>
			<description><![CDATA[<p>Valentine's Day is a sexist, made up, capitalistic holiday. All advertisements aim at men buying stuff for women. No one ever talks about a woman buying something for their man, and why does anyone need to buy anything at all. Let's all band together and boycott Valentine's Day this year.*</p>
<p>*Disclaimer: Seth Cardoza is not responsible for temporary celibacy, sleeping on the couch, sleeping outside, sleeping in one's car, diarrhea, vomiting, nausea, upset stomach, lost or strained relationships, stabbings (accidental or intentional), or any other forms of bodily harm, both inflicted and/or received.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/55/title/Boycott-Valentine's-Day</guid>
			<pubDate>Wed, 02 Feb 2011 19:54:36 EST</pubDate>
		</item>
		<item>
			<title>Update Your Business Model</title>
			<link>http://www.sethcardoza.com/posts/view/54/title/Update-Your-Business-Model</link>
			<description><![CDATA[<p>If you haven't heard, I'm getting married this year. One of the fun things I get to do is talk to vendors, food vendors, photographers, videographers, DJs, and hotel/resort managers. I recently spoke with a wedding photographer, and a question I always have is "Who gets the rights to the photos?". This is very important to me for a few reasons. One, because the pictures are of me and my family, and I want to be able to do what I want with them. Two, what happens in 20 years when we want to get another photo album, or more prints, and your company no longer exists to get permission to do so or purchase from directly.</p>
<p>So, I ask the inevitable question, and this photographer tells me we are allowed to print the images ourselves, but cannot take them to a commercial printer. This means I can't even take my pictures to CVS, Walgreens, Walmart or the local developer to get a few 4x6's printed. She then goes on to say that</p>

<p>We do all the work, why should they be the ones to profit off of it.</p>

<p>This photographer is paid to photograph the wedding, and wedding photography is not cheap. If you feel your work is worth more than what you charge, and feel the need to retain the rights so that you can make more money off of printing, then you're doing it wrong. Charge more for your photography work if you truly have the talent to warrant it, and provide better service.</p>
<p>Times have changes, and you need to update your business model to follow suit. This outdated business model makes you look cheap, and your explanation makes you sound bitter.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/54/title/Update-Your-Business-Model</guid>
			<pubDate>Tue, 18 Jan 2011 20:43:58 EST</pubDate>
		</item>
		<item>
			<title>The Man Grooveshark Playlist</title>
			<link>http://www.sethcardoza.com/posts/view/53/title/The-Man-Grooveshark-Playlist</link>
			<description><![CDATA[<p>Here's another Grooveshark playlist I put together. All song titles have the word "man" somewhere in them. If you have any suggestions, I'll take them into consideration. One noted omission is Black Sabbath - Iron Man, as I hear it way too often, and it doesn't really add to the quality of the playlist.</p>
<p>Listen to "The Man" on Grooveshark.</p>]]></description>
			<category>Grooveshark Playlists</category>
			<guid>http://www.sethcardoza.com/posts/view/53/title/The-Man-Grooveshark-Playlist</guid>
			<pubDate>Wed, 15 Dec 2010 11:53:07 EST</pubDate>
		</item>
		<item>
			<title>Placeholder Image Generator</title>
			<link>http://www.sethcardoza.com/posts/view/52/title/Placeholder-Image-Generator</link>
			<description><![CDATA[<p>This is a great tool for placeholder images for wireframing a project.</p>
<p>A while back, a service called Placehold.it was posted to reddit. It received mixed reviews, most of the criticism being that the site owners themselves, or a hacker could replace all your placeholder images with something much less work appropriate. I decided to create my own placeholder image generator, and release the source code. That way, you can host the application. Sure, it could still get hacked and leave you in a sticky situation, but now it's your site, not another person's site. I assume most people put more trust in themselves than others.</p>
<p>Here's a quick example of how it works (default image):</p>
<p></p>
<p>You can view more examples as well as learn how to use it by reading the documentation. The source code is available at the bottom of the documentation, both with a generic version, and one specific to CakePHP.</p>]]></description>
			<category>Design</category>
			<guid>http://www.sethcardoza.com/posts/view/52/title/Placeholder-Image-Generator</guid>
			<pubDate>Tue, 09 Nov 2010 16:59:10 EST</pubDate>
		</item>
		<item>
			<title>The Wonder Years Grooveshark Playlist</title>
			<link>http://www.sethcardoza.com/posts/view/50/title/The-Wonder-Years-Grooveshark-Playlist</link>
			<description><![CDATA[<p>I made a Grooveshark playlist capturing most (it's really hard to get it all) of the music from the Wonder Years TV series. I used wonderyearsguide.com as a reference point. I'm not sure if the website is complete, but it covers quite a bit of music. Some songs that are notably missing are any Christmas songs. I thought they would take away from the playlist, since most people don't care to listen to Christmas music outside of the season.</p>
<p>There's a lot of great music from the 60s and 70s, and a few classical pieces as well. Let me know if there's something notable missing, and I will update the playlist so long as Grooveshark has it available.</p>]]></description>
			<category>Grooveshark Playlists</category>
			<guid>http://www.sethcardoza.com/posts/view/50/title/The-Wonder-Years-Grooveshark-Playlist</guid>
			<pubDate>Mon, 12 Jul 2010 15:08:25 EDT</pubDate>
		</item>
		<item>
			<title>Nature Valley National Parks Project</title>
			<link>http://www.sethcardoza.com/posts/view/49/title/Nature-Valley-National-Parks-Project</link>
			<description><![CDATA[<p>As I was eating my highly nutritious granola bar breakfast this morning, I noticed some writing on the wrapper. Nature Valley National Parks Project will donate $0.10 for each wrapper you mail in, through August 31, 2010. My first WTF was "why would I spend $0.42 on a stamp for you to donate $0.10?" I'm sure I could mail more than one per envelope, but it's still not very cost effective. Secondly, if this is about nature and preservation, wouldn't it be better to have a code on the wrapper that I can enter into a website so i don't have to waste a paper envelope, and fossil fuels don't need to be burned to deliver all these wrappers to your processing plant? I should note that they will donate a minimum of $250,000 (and a maximum of $500,00), but this seems more like a poorly done marketing campaign, and a mock effort at actually helping the environment.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/49/title/Nature-Valley-National-Parks-Project</guid>
			<pubDate>Thu, 17 Jun 2010 09:56:48 EDT</pubDate>
		</item>
		<item>
			<title>Misplaced Hate on Flash Based Websites</title>
			<link>http://www.sethcardoza.com/posts/view/48/title/Misplaced-Hate-on-Flash-Based-Websites</link>
			<description><![CDATA[<p>Flash receives a great deal of hate from the web development community, myself included. Common complaints include load times, performance, unnecessary animations/transitions, forcing users to watch (long) intro movies, inability to bookmark content or specific pages, inaccessibility (especially to mobile users), auto play audio, and that it is bad for SEO. The thing is, most of these same complaints can, and do arise from poor development using HTML, CSS, and Javascript.</p>
<p>I can easily include unnecessary animation and transition effects on my site with Javascript, especially with one of the many Javascript frameworks readily available now. I can load down the site with numerous images and other media, CSS and Javascript files, and bloated markup. I can make a website difficult to use for users, and especially mobile users. I can poorly use AJAX for everything making it difficult or impossible to link directly to anything but the home page.</p>
<p>Flash as a development tool does not require superfluous transition effects and animations (AFAIK). It doesn't force the developer to include an intro to the site, or to auto play some audio file. There are ways to make sites more accessible in Flash, allowing for bookmarking or directly linking to inner content. The website doesn't have to take an SEO hit just because it uses Flash. Flash would be less resource intense if there were fewer animations and transitional effects. A secondary, light weight version of the site can be made for mobile users, and others that either don't have Flash or don't want to use it.</p>
<p>In my experience, the blame for poor Flash sites often rests in the hands of the developer. It is a poor choice to load up a website with animations. It isn't user friendly to force users to watch an intro movie that you think is super awesome. The lack of bookmarking, direct linking, and the hit to SEO are all avoidable and to allow for otherwise is laziness. Remember, Flash is just another technology that is often used improperly through no fault of its own.</p>]]></description>
			<category>Design</category>
			<guid>http://www.sethcardoza.com/posts/view/48/title/Misplaced-Hate-on-Flash-Based-Websites</guid>
			<pubDate>Fri, 19 Feb 2010 15:26:53 EST</pubDate>
		</item>
		<item>
			<title>jQuery Form Focus Plugin</title>
			<link>http://www.sethcardoza.com/posts/view/47/title/jQuery-Form-Focus-Plugin</link>
			<description><![CDATA[<p>This jQuery plugin will add a background color to text, password, and textarea input fields in forms when focused, and then revert to the original background color on blur. It is a one line call, with one (optional) parameter, the background color.</p>
<p>You can target all forms on the page with this simple line:</p>
<p>$('form').formFocus();</p>
<p>This will default the focused background color to: #f0f0c0</p>
<p>You can specify the background color as follows:</p>
<p>$('form').formFocus({backgroundcolor:'#ff0000});</p>
<p>which would make the focused background color a very bright red. You can also target forms specifically, whether you only want to use it on a single form, or if you want to specify different background colors for each.</p>
<p>$('#demo1').formFocus({backgroundcolor:'#ff0000});</p>
  
<p>$('#demo2').formFocus({backgroundcolor:'#0000ff});</p>
  
<p>Download jQuery Form Focus Plugin</p>]]></description>
			<category>jQuery</category>
			<guid>http://www.sethcardoza.com/posts/view/47/title/jQuery-Form-Focus-Plugin</guid>
			<pubDate>Wed, 17 Feb 2010 21:05:52 EST</pubDate>
		</item>
		<item>
			<title>Toolbars on the Bottom of the Page</title>
			<link>http://www.sethcardoza.com/posts/view/46/title/Toolbars-on-the-Bottom-of-the-Page</link>
			<description><![CDATA[<p>Adding a toolbar pinned to the bottom of the view port is becoming more common for websites. The idea is to add a bit of functionality, making common links easily accessible at any time. The problem is that it can often give the site a false footer, as is the case with CNET.</p>
<p></p>
<p>As you can see with the image above, scrolling to this point of the article can give the reader the impression that this is the end of the article (as it did with me). But, viewing the image below will show you that there is a large amount of content below this point.</p>
<p></p>
<p>Because of the design of the rest of the site, mainly the appearance of the header, a reader can mistakenly assume that an article has ended, when they have yet to read the bulk of the content. When adding functionality such as a toolbar like this, make sure you aren't decreasing the usability of the site in the process.</p>]]></description>
			<category>Usability</category>
			<guid>http://www.sethcardoza.com/posts/view/46/title/Toolbars-on-the-Bottom-of-the-Page</guid>
			<pubDate>Tue, 16 Feb 2010 11:20:45 EST</pubDate>
		</item>
		<item>
			<title>CakePHP Image Helper</title>
			<link>http://www.sethcardoza.com/posts/view/45/title/CakePHP-Image-Helper</link>
			<description><![CDATA[<p>I've rewritten my image helper to extend off of CakePHP's built in HTML helper, rather than reinvent the wheel. The major benefit of using this helper is that it determines the image dimensions, if not specified, and applies them to the image tag, which is one of Google's rules to optimize browser rendering.</p>
<p>&lt;?php/**&nbsp;* This class builds an image tag. The main purpose of this is to get the image dimensions and&nbsp;* include the appropriate attributes if not specified. This will improve front end performance.&nbsp;* &nbsp;* @author Seth Cardoza &lt;seth.cardoza@gmail.com&gt;&nbsp;* @category image&nbsp;* @package helper&nbsp;*/class HtmlImageHelper extends AppHelper{&nbsp;&nbsp;&nbsp; var $helpers = array('Html');&nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp;&nbsp; * Builds html img tag determining width and height if not specified in the&nbsp;&nbsp;&nbsp;&nbsp; * attributes parameter.&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; * @param string $src relative path to image including the 'img' directory&nbsp;&nbsp;&nbsp;&nbsp; * @param array $attributes array of html attributes to apply to the image&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; * @access public&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; * @return no return value, outputs the img tag&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp; public function image($src, $attributes = array()) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //get width/height via exif data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //build image html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(file_exists(WWW_ROOT . $src)) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $image_size = getimagesize(WWW_ROOT . $src);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!array_key_exists('width', $attributes) &amp;&amp; array_key_exists('height', $attributes)) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $attributes['width'] = ($image_size[0] * $attributes['height']) / $image_size[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } elseif(array_key_exists('width', $attributes) &amp;&amp; !array_key_exists('height', $attributes)) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $attributes['height'] = ($image_size[1] * $attributes['width']) / $image_size[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $attributes['width'] = $image_size[0];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $attributes['height'] = $image_size[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $this-&gt;Html-&gt;image($src, $attributes);&nbsp;&nbsp;&nbsp; }}</p>
<p>Download CakePHP HTML Image Helper</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/45/title/CakePHP-Image-Helper</guid>
			<pubDate>Tue, 09 Feb 2010 15:21:43 EST</pubDate>
		</item>
		<item>
			<title>Dissecting Yahoo's 10 Things Not to Buy in 2010</title>
			<link>http://www.sethcardoza.com/posts/view/44/title/Dissecting-Yahoo's-10-Things-Not-to-Buy-in-2010</link>
			<description><![CDATA[<p>Yahoo has an article in finance listing 10 items that are pointless to buy in 2010. There are several items on the list that I will definitely still purchase in 2010 despite Yahoo's flawed logic. The first being DVDs. The article states:</p>

<p>On average, DVDs sell for at least $20 each. That's pricier than signing up for Netflix or renting movies from cable providers' on-demand channels.</p>

<p>I've never paid $20 or more for a DVD. Maybe if you are an idiot and go to a specialty shop to buy the DVD the week it comes out, you will end up paying this much for a DVD. I rarely pay more than $10 for DVDs because I don't mind waiting for them to drop in price after their initial release. It's similar for TV shows on DVD. I've never even paid $20 for a season of a TV show on DVD. While I do expect there to be a further decline in DVD purchase because of Blu-ray, Netflix, and Redbox, I see no reason not to buy a DVD if it's something you will enjoy over and over again.</p>
<p>External hard drives are another item listed, stating that online backup services are the way to go. First, never put all your eggs in one basket. You should have more than one backup, and never rely on someone else to do it for you. Secondly, the article even contradicts itself by stating these online backup services are more expensive than external hard drives. These online services have their benefits, but if you just need a backup of documents and pictures get a couple cheap external hard drives, or even better internal hard drives and an external enclosure.</p>
<p>Next up is compact digital cameras. It seems that in 2010 smaller is not better. Yahoo would have you believe that compact digital cameras are going the way of the pager because of bigger and better DSLR cameras. The problem is that DSLR cameras are much more expensive, and much much larger. While I would love to have a DSLR because I enjoy photography, no one is going to want to bring a these to the club, restaurant, party, etc. to take casual pictures with friends and family.</p>
<p>Update: Gareth makes a great point in the comments, while DSLR cameras probably won't replace compact point and shoot models, cell phone cameras are getting better with each generation. I expect them to be a much more likely replacement as it is a device almost everyone has on them at all times anyway.</p>
<p>Last up is CDs. This is the toughest one for me to argue for continuing buying, and is more of a personal preference. I still haven't paid for a digital download of any audio, but have purchased a few CDs as recently as a week ago. Just like DVDs, CDs can be found rather cheap if you don't mind looking around. I like the fact that I have a physical good for my money, for the same or even a lower price than its digital counterpart. It's easy for me to grab one disc and bring it wherever if that's all I want, but I will most likely rip it to my computer and put it on my mp3 player as well.</p>
<p>The average person will most likely be purchasing these items well through this year. While some are adopting newer and better technologies, not everyone needs to, or has the money to as newer technologies are often more expensive.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/44/title/Dissecting-Yahoo's-10-Things-Not-to-Buy-in-2010</guid>
			<pubDate>Thu, 07 Jan 2010 09:46:44 EST</pubDate>
		</item>
		<item>
			<title>jQuery Selectors Last and Last-Child</title>
			<link>http://www.sethcardoza.com/posts/view/43/title/jQuery-Selectors-Last-and-Last-Child</link>
			<description><![CDATA[<p>jQuery has a plethora of selectors, two of which being :last and :last-child. It should be very obvious that these do not achieve the same goal. Well, I spent the better part of an hour figuring that out. I went down the page of selectors knowing jQuery has a selector for :last-child, and saw :last first. I toyed around with it a bit to no avail. I finally did a couple searches on jQuery last selectors and found out that jQuery also has a :last-child selector, which is what I was really looking for.The :last selector selects the last element on the page matching the entire selector. The :last-child selector selects all last children matching the entire selector.$('div p:last') would select the paragraph highlighted in red:&lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;while $('div p:last-child') would select the paragraphs highlighted in red: &lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&nbsp;&nbsp; &nbsp;&lt;p&gt;Paragraph&lt;/p&gt;&lt;/div&gt;</p>]]></description>
			<category>jQuery</category>
			<guid>http://www.sethcardoza.com/posts/view/43/title/jQuery-Selectors-Last-and-Last-Child</guid>
			<pubDate>Thu, 17 Dec 2009 22:57:28 EST</pubDate>
		</item>
		<item>
			<title>eS Accel Shoes Are Painfully Uncomfortable</title>
			<link>http://www.sethcardoza.com/posts/view/42/title/eS-Accel-Shoes-Are-Painfully-Uncomfortable</link>
			<description><![CDATA[<p>I've had these shoes for a little over 6 months now. I wear them everyday, but the most I will do with them is a lot of walking at the mall or theme park. Not long after I got them, my heels and the balls of my feet would hurt if I stood for more than a few minutes or walked for a long period of time. I contributed it to the fact that I've been getting lazier and lazier with age. I recently got some Dr. Scholl's insoles though, and in the midst of removing the ones that came with my shoes, I notice that they have become almost paper thin. These things have completely broken down with moderate wear. I threw in the Dr. Scholl's insoles and my feet are feeling great again. Don't buy these shoes, ever.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/42/title/eS-Accel-Shoes-Are-Painfully-Uncomfortable</guid>
			<pubDate>Wed, 16 Dec 2009 13:18:44 EST</pubDate>
		</item>
		<item>
			<title>Rest Assured, Your Hand Job Is on Its Way</title>
			<link>http://www.sethcardoza.com/posts/view/41/title/Rest-Assured,-Your-Hand-Job-Is-on-Its-Way</link>
			<description><![CDATA[<p>I got this letter from Hand Job customer support today, letting me know that they are working around the clock to deliver my Hand Job, hopefully by Christmas.</p>



<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Dearest Handjob Consumers,</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Thank you so much for your orders!</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Due to many recent inquiries, we would like to take this opportunity to assure you that yes, this is a real product. And yes, you will be receiving your very own genuine Handjobs shortly.</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">We were taken by surprise at the overwhelming response and the number of orders we've received thus far, and we are working very hard to try to get all of your orders to you by Christmas time. Please note that we can make no guarantees, but we will be working around the clock between now and then in an effort to satisfy your wants and desires.</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">We take Handjobs very seriously, and we truly do appreciate each and every one of you for supporting us. And look forward to many new and exciting developments on the HJ front!</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Thank you again, and we look forward to hearing about all the pleasure your heartwarming Handjobs provide this season!&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 19px;">&nbsp;</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Cheers,</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Lisa Q.</p>
<p style="font-family: Times; font-style: normal; font-variant: normal; font-weight: normal; font-size: 16px; line-height: normal; font-size-adjust: none; font-stretch: normal;">Handjob! Customer Service</p>


]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/41/title/Rest-Assured,-Your-Hand-Job-Is-on-Its-Way</guid>
			<pubDate>Tue, 15 Dec 2009 22:29:07 EST</pubDate>
		</item>
		<item>
			<title>Comcasts Buys NBC from GE: What Will It Mean for Hulu?</title>
			<link>http://www.sethcardoza.com/posts/view/40/title/Comcasts-Buys-NBC-from-GE:-What-Will-It-Mean-for-Hulu?</link>
			<description><![CDATA[<p>You can read the details over at Gizmodo</p>
<p>This is a big deal as Comcast already is a large telecommunications company, and fully or partly owns numerous networks already. The really interesting piece is how this will play out for Hulu. NBC owns a part of it along with Fox Entertainment Group and ABC Inc. It could play out any number of ways, but the two big scenarios I see are:</p>
<p>Comcast could take Hulu and run with it giving it a great head start on the competition. Streaming video content will happen whether the cable companies want it or not. Comcast could nurture the already flourishing product and make a ton of money while staying current with technology.</p>
<p>Comcast could do everything in its power to kill Hulu. This is a likely scenario as Comcast already sees it as competition to its traditional cable services, and rightly so. Comcast could hinder further development for Hulu in order to keep traditional cable afloat, thus setting back quality streaming video content in overall as Hulu is one of the largest providers. After all, why innovate when you can just buy the competition.</p>
<p>While I would prefer the former, as it would benefit everyone the most, given Comcast's track record, I expect the latter to be the more likely scenario.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/40/title/Comcasts-Buys-NBC-from-GE:-What-Will-It-Mean-for-Hulu?</guid>
			<pubDate>Tue, 01 Dec 2009 20:01:46 EST</pubDate>
		</item>
		<item>
			<title>Driving the Company Vehicle</title>
			<link>http://www.sethcardoza.com/posts/view/39/title/Driving-the-Company-Vehicle</link>
			<description><![CDATA[<p>The reputation of your business is very important, especially so when you are a small business. Business big and small have branding on their company vehicles, and many small business have advertising on their personal or family vehicles. If you are one of them, remember this next time are on the road. Make sure you are a responsible and courteous driver, and make sure your employees do the same while in a company vehicle. You might think nothing of cutting someone off, or speeding excessively, or not letting someone into your lane, but they might remember that the Joe's Plumbing truck is the one that cut them off, or nearly caused an accident.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/39/title/Driving-the-Company-Vehicle</guid>
			<pubDate>Thu, 26 Nov 2009 00:16:04 EST</pubDate>
		</item>
		<item>
			<title>Revenge of the Swine Flu</title>
			<link>http://www.sethcardoza.com/posts/view/38/title/Revenge-of-the-Swine-Flu</link>
			<description><![CDATA[<p></p>]]></description>
			<category>Comics</category>
			<guid>http://www.sethcardoza.com/posts/view/38/title/Revenge-of-the-Swine-Flu</guid>
			<pubDate>Thu, 19 Nov 2009 16:57:08 EST</pubDate>
		</item>
		<item>
			<title>Smashing Magazine and Twitter Ads</title>
			<link>http://www.sethcardoza.com/posts/view/37/title/Smashing-Magazine-and-Twitter-Ads</link>
			<description><![CDATA[<p>Yesterday, we saw our first ads via @smashingmag's Twitter feed. There was some outrage about it. People stating they were no longer following them because of it, which I find ridiculous. Smashing Magazine has provided valuable content, tutorials, and information at no charge to its readers. Smashing Magazine needs some way to pay the bills. There may be better ways than advertisements on its site and Twitter feed, but the amount of ads and their placement is by no means unreasonable. I didn't see any of the protesters state that they would gladly pay money for their content for it to be ad free. Smashing Mag quickly posted a poll following the backlash. Initially, it weighed heavily on "No way, I'll unfollow right away!", but the pool seems to have leveled out with the majority of people understanding that "Yes, you need to pay bills eventually." You can view the poll, and let your voice be heard too.The tweet in question can be found here. As you can see, @smashingmag clearly states that this is an ad. They could have easily pushed this service as something they value without stating that it was a paid advertisement. I like the fact that they are up front about it. Think about how many tweets promote products and services, and now think about how many of them could have been paid for without your knowledge. Think about how many people you follow, and how many tweets come through your stream everyday. I currently follow a modest 59 people, and receive about 200 tweets per day. I don't have time to read every single one of them. Most of any twitter ads will get overlooked as many other tweets do. Twitter ads are not ideal, but depending on their frequency, they are a tolerable way for content providers to make money.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/37/title/Smashing-Magazine-and-Twitter-Ads</guid>
			<pubDate>Wed, 18 Nov 2009 14:24:28 EST</pubDate>
		</item>
		<item>
			<title>Mythbusters Beer and Liquor Analysis</title>
			<link>http://www.sethcardoza.com/posts/view/36/title/Mythbusters-Beer-and-Liquor-Analysis</link>
			<description><![CDATA[<p>The Mythbusters had a recent episode testing if drinking beer and liquor would make you more sick thann drinking just beer. They got the myth wrong in the first place. The real myth is that if you drink beer before liquor you will get sick, but not if you drink liquor before beer.</p>
<p>Their test had Tory and Grant drink the exact same amount of alcohol whether they were drinking beer or mixing beer and liquor. It should be pretty obvious that consuming the exact same amount of alcohol should yeild the same results.</p>
<p>The reason the real myth holds is because, generally, when someone starts drinking beer, and then switches to liquor, they usually have consumed several beers and have a buzz, and then consume a significant amount of liquor. Liquor usually goes down quicker because it is in more concentrated quantities. When someone drinks beer and then liquor, they generally have a stronger buzz, and aren't downing beers left and right. It doesn't matter if you mix beer and liquor, and in what order you mix them in, if you drink too much alcohol, you will pay the price.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/36/title/Mythbusters-Beer-and-Liquor-Analysis</guid>
			<pubDate>Tue, 03 Nov 2009 22:34:59 EST</pubDate>
		</item>
		<item>
			<title>CakePHP HasAndBelongsToMany (HABTM) Checkboxes Instead of Multiple Select</title>
			<link>http://www.sethcardoza.com/posts/view/35/title/CakePHP-HasAndBelongsToMany-(HABTM)-Checkboxes-Instead-of-Multiple-Select</link>
			<description><![CDATA[<p>Changing CakePHP's default multiple select for HasAndBelongsToMany (HABTM) relationships to use multiple checkboxes used to be an arduous task. It is now a simple option as follows.</p>
<p>If you have a Post model that has a HABTM relationship with a Tag model, you would use the following line to display multiple checkboxes instead of the default multiple select:</p>
<p>&lt;?php echo $form-&gt;input('Tag', array('multiple' =&gt; 'checkbox')); ?&gt;</p>
<p>The magic is the array('multiple' =&gt; 'checkbox').</p>
<p>As you probably already know, and the reason you were searching for this solution, the multiple checkboxes are much more user friendly than the multiple select.</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/35/title/CakePHP-HasAndBelongsToMany-(HABTM)-Checkboxes-Instead-of-Multiple-Select</guid>
			<pubDate>Wed, 07 Oct 2009 21:58:04 EDT</pubDate>
		</item>
		<item>
			<title>Akismet API Component for CakePHP 1.2</title>
			<link>http://www.sethcardoza.com/posts/view/34/title/Akismet-API-Component-for-CakePHP-1.2</link>
			<description><![CDATA[<p>This is a component for CakePHP 1.2 and PHP 5+ that utilizes the Akismet API to fight comment SPAM. You will need an API key, which can be retrieved from wordpress.com.</p>
<p>&lt;?php/**&nbsp;* This is a component for CakePHP that utilizes the Akismet API&nbsp;* &nbsp;* See http://akismet.com/development/api/ for more information.&nbsp;* &nbsp;* Licensed under The MIT License&nbsp;* Redistributions of files must retain the above copyright notice.&nbsp;* &nbsp;* @author Seth Cardoza &lt;www.sethcardoza.com&gt;&nbsp;* @category akismet&nbsp;* @package component&nbsp;**/class AkismetComponent extends Object {&nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* @var string&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; private $http;&nbsp;&nbsp;&nbsp; const API_KEY = '';&nbsp;&nbsp;&nbsp; const BASE_URL = 'rest.akismet.com';&nbsp;&nbsp;&nbsp; const API_VERSION = '1.1';&nbsp;&nbsp;&nbsp; const VERIFY_KEY_ACTION = 'verify-key';&nbsp;&nbsp;&nbsp; const COMMENT_CHECK_ACTION = 'comment-check';&nbsp;&nbsp;&nbsp; const SUBMIT_SPAM_ACTION = 'submit-spam';&nbsp;&nbsp;&nbsp; const SUBMIT_HAM_ACTION = 'submit-ham';&nbsp;&nbsp;&nbsp; const APP_USER_AGENT = 'CakePHP/1.2 | Akismet Model 1.0';&nbsp;&nbsp;&nbsp; public function __construct() {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; App::Import('Core', 'HttpSocket');&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;http =&amp; new HttpSocket();&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; public function verifyKey($data) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $data = array();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($data['blog'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $data['blog'] = FULL_BASE_URL;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($data['key'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $data['key'] = self::API_KEY;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $uri = 'http://' . self::BASE_URL . '/' . self::API_VERSION . '/' . self::VERIFY_KEY_ACTION;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $request = array('header' =&gt; array('User-Agent: ' . self::APP_USER_AGENT));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;http-&gt;post($uri, $data, $request);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* This is just a wrapper function for Akismet::commentCheck(). the return result makes more sense calling this function.&nbsp;&nbsp;&nbsp; &nbsp;* The two functions can be used interchangeably&nbsp;&nbsp;&nbsp; &nbsp;* @param array $comment&nbsp;&nbsp;&nbsp; &nbsp;* @return string&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; public function isSpam($comment) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;commentCheck($comment);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* returns true if comment is spam, false otherwise&nbsp;&nbsp;&nbsp; &nbsp;* &nbsp;&nbsp;&nbsp; &nbsp;* From API Documentation: If you are having trouble triggering you can send "viagra-test-123" as the author and it will trigger a true response, always.&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @param array $comment&nbsp;&nbsp;&nbsp; &nbsp;* @return string&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; public function commentCheck($comment) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;__makeRequest($comment, self::COMMENT_CHECK_ACTION);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* @param array $comment&nbsp;&nbsp;&nbsp; &nbsp;* @return string&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; public function submitSpam($comment) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;__makeRequest($comment, self::SUBMIT_SPAM_ACTION);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* @param array $comment&nbsp;&nbsp;&nbsp; &nbsp;* @return string&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function submitHam($comment) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;__makeRequest($comment, self::SUBMIT_HAM_ACTION);&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* this is where the magic happens. this makes the call to get the default info if not set, and &nbsp;&nbsp;&nbsp; &nbsp;* makes the request, passing the necessary data&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; private function __makeRequest($comment, $action) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $comment = $this-&gt;__getDefaultData($comment);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $request = array('header' =&gt; array('User-Agent: ' . self::APP_USER_AGENT));&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $uri = 'http://' . self::API_KEY . '.' . self::BASE_URL . '/' . self::API_VERSION . '/' . $action;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $return = $this-&gt;http-&gt;post($uri, $comment, $request);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $return;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function __getDefaultData($comment) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; App::import('Component', 'RequestHandler');&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($comment['blog'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $comment['blog'] = FULL_BASE_URL;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($comment['user_ip'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $comment['user_ip'] = RequestHandlerComponent::getClientIP();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($comment['referrer'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $comment['referrer'] = RequestHandlerComponent::getReferrer();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!isset($comment['user_agent'])) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $vars['user_agent'] = env('HTTP_USER_AGENT');&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $comment;&nbsp;&nbsp;&nbsp; }}?&gt;</p>
<p>Download Akismet Component for CakePHP 1.2</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/34/title/Akismet-API-Component-for-CakePHP-1.2</guid>
			<pubDate>Sat, 05 Sep 2009 22:32:33 EDT</pubDate>
		</item>
		<item>
			<title>CakePHP Reverse Routing</title>
			<link>http://www.sethcardoza.com/posts/view/33/title/CakePHP-Reverse-Routing</link>
			<description><![CDATA[<p>CakePHP provides a very strong and flexible routing engine, for both routing, and reverse routing. Creating a route for the home page is as simple as adding the following line to your routes.php configuration file.</p>
<p>Router::connect('/about_us', array('controller' =&gt; 'pages', 'action' =&gt; 'display', 'about_us'));</p>
<p>Now, anyone visiting http://example.com/about_us page, will see the view defined in your Pages controller, and the about_us view. This is a very simple example, but leads us to the topic of reverse routing.</p>
<p>We can easily create a link to the about_us page in our markup very easily with the following:</p>
<p>&lt;a href="/about_us"&gt;About Us&lt;/a&gt;</p>
<p>However, CakePHP provides us with a way to do this through reverse routing and the HTML helper.</p>
<p>&lt;?php $html-&gt;link('About Us', array('controller' =&gt; 'pages', 'action' =&gt; 'display', 'about_us'); ?&gt;</p>
<p>Will generate the following output.</p>
<p>&lt;a href="/about_us"&gt;About Us&lt;/a&gt;</p>
<p>And, if we later update the route defined in the beginning to a more detailed url, for SEO purposes:</p>
<p>Router::connect('/about-seth-cardoza', array('controller' =&gt; 'pages', 'action' =&gt; 'display', 'about_us'));</p>
<p>We will not have to update the $html-&gt;link(); because the reverse routing takes care of that for us.</p>
<p>This is just a brief introduction to the power and capabilities of CakePHP's routing and reverse routing. I recommend you read more about CakePHP's routing in their online manual.</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/33/title/CakePHP-Reverse-Routing</guid>
			<pubDate>Mon, 31 Aug 2009 13:50:44 EDT</pubDate>
		</item>
		<item>
			<title>If You Want to Charge for a Service Online, Make Sure You Engage Your Customers</title>
			<link>http://www.sethcardoza.com/posts/view/32/title/If-You-Want-to-Charge-for-a-Service-Online,-Make-Sure-You-Engage-Your-Customers</link>
			<description><![CDATA[<p>I recently switched my invoicing system from Simply Invoices to Fresh Books. Simply Invoices was great while I used it, but the complete lack of customer service forced me to switch. Admittedly, I was using their services for free, but I repeatedly requested/suggested new features that would not only benefit me, but all users, with no feedback whatsoever. Maybe this was because I was not a paying customer, but I doubt that even if I was paying for the service, I would have received any feedback. I switched to Fresh Books because they had the features I was looking for. Upon switching, I received a phone call and an email from their customer service making sure that I was satisfied with their services thus far.</p>
<p>If you expect people to pay for your services online, you need to engage your customers. People want to know that there is someone behind the curtain. I don't mean to single out Simple Invoices, they provided a good service to me for free. The problem is that there is plenty of competition on the web. I can easily go elsewhere if I am not satisfied with your service. In this case, I switched to Fresh Books. They not only had the features I was looking for, but followed up with human contact.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/32/title/If-You-Want-to-Charge-for-a-Service-Online,-Make-Sure-You-Engage-Your-Customers</guid>
			<pubDate>Tue, 25 Aug 2009 13:08:57 EDT</pubDate>
		</item>
		<item>
			<title>Disabling Layouts and Views in CakePHP</title>
			<link>http://www.sethcardoza.com/posts/view/31/title/Disabling-Layouts-and-Views-in-CakePHP</link>
			<description><![CDATA[<p>It is easy to disable both the layout and view in CakePHP by putting the following line in your controller action:</p>
<p>$this-&gt;autoRender = false;</p>
<p>If you want to disable just the layout, use the following line in your controller action:</p>
<p>$this-&gt;layout = false;</p>
<p>And if you only want to disable the view for this action, use the following line in your controller:</p>
<p>$this-&gt;render(false);</p>
<p>Note that using $this-&gt;layout = false; and $this-&gt;render(false); together in your controller action will give you the same results as $this-&gt;autoRender = false;</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/31/title/Disabling-Layouts-and-Views-in-CakePHP</guid>
			<pubDate>Tue, 28 Jul 2009 23:33:44 EDT</pubDate>
		</item>
		<item>
			<title>CakePHP Image Helper for Front End Optimization</title>
			<link>http://www.sethcardoza.com/posts/view/30/title/CakePHP-Image-Helper-for-Front-End-Optimization</link>
			<description><![CDATA[<p>Going along with one of the many ways to optimize front end performance, I created an image helper for CakePHP that will get the image dimensions and include them as html attributes.</p>
<p>&lt;?php /**&nbsp;* This class builds an image tag. The main purpose of this is to get the image dimensions and&nbsp;* include the appropriate attributes if not specified. This will improve front end performance.&nbsp;*&nbsp; &nbsp;* @author Seth Cardoza &lt;seth.cardoza@gmail.com&gt;&nbsp;* @category image&nbsp;* @package helper&nbsp;*/class ImageHelper extends Helper{&nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* Builds html img tag determining width and height if not specified in the&nbsp;&nbsp;&nbsp; &nbsp;* attributes parameter.&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @param string $src relative path to image including the 'img' directory&nbsp;&nbsp;&nbsp; &nbsp;* @param array $attributes array of html attributes to apply to the image&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @access public&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @return no return value, outputs the img tag&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; public function displayImage($src, $attributes = array()) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //get width/height via exif data&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //build image html&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(file_exists(WWW_ROOT . $src)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $image_size = getimagesize(WWW_ROOT . $src);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!array_key_exists('width', $attributes) &amp;&amp; array_key_exists('height', $attributes)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $attributes['width'] = ($image_size[0] * $attributes['height']) / $image_size[1]; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } elseif(array_key_exists('width', $attributes) &amp;&amp; !array_key_exists('height', $attributes)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $attributes['height'] = ($image_size[1] * $attributes['width']) / $image_size[0]; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $attributes['width'] = $image_size[0];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $attributes['height'] = $image_size[1];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $html = '&lt;img src="' . $src . '"';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; foreach($attributes as $key =&gt; $value) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $html .= ' ' . $key . '="' . htmlentities($value, ENT_COMPAT, 'ISO-8859-1', false) . '"';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $html .= ' /&gt;';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo $html;&nbsp;&nbsp;&nbsp; }}?&gt;</p>
<p>Download CakePHP Image Helper</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/30/title/CakePHP-Image-Helper-for-Front-End-Optimization</guid>
			<pubDate>Fri, 24 Jul 2009 16:19:02 EDT</pubDate>
		</item>
		<item>
			<title>Image Resizing Class</title>
			<link>http://www.sethcardoza.com/posts/view/29/title/Image-Resizing-Class</link>
			<description><![CDATA[<p>This is a simple script to resize images with PHP. It uses the GD Library functions, and is currently not compatible with ImageMagick. It will automatically determine the image type and use the appropriate functions to resize.</p>
<p>&lt;?php/**&nbsp;* This class handles image resizing. It will automatically determine the image&nbsp;* type and use the appropriate php resize functions. It uses GD libs and is not &nbsp;* currently compatibly with ImageMagick.&nbsp;*&nbsp; &nbsp;* @author Seth Cardoza &lt;seth.cardoza@gmail.com&gt;&nbsp;* @category image&nbsp;* @package component&nbsp;*/class Image {&nbsp;&nbsp;&nbsp; public $name = 'Image';&nbsp;&nbsp;&nbsp; private $__errors = array();&nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;* Determines image type, calculates scaled image size, and returns resized image. If no width or height is&nbsp;&nbsp;&nbsp; &nbsp;* specified for the new image, the dimensions of the original image will be used, resulting in a copy&nbsp;&nbsp;&nbsp; &nbsp;* of the original image.&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @param string $original absolute path to original image file&nbsp;&nbsp;&nbsp; &nbsp;* @param string $new_filename absolute path to new image file to be created&nbsp;&nbsp;&nbsp; &nbsp;* @param integer $new_width (optional) width to scale new image (default 0)&nbsp;&nbsp;&nbsp; &nbsp;* @param integer $new_height (optional) height to scale image (default 0)&nbsp;&nbsp;&nbsp; &nbsp;* @param integer $quality quality of new image (default 100, resizePng will recalculate this value)&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @access public&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp; &nbsp;* @return returns new image on success, false on failure. use ImageComponent::getErrors() to get an array&nbsp;&nbsp;&nbsp; &nbsp;* of errors on failure&nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; public function resize($original, $new_filename, $new_width = 0, $new_height = 0, $quality = 100) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($image_params = getimagesize($original))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'Original file is not a valid image: ' . $orignal;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $width = $image_params[0];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $height = $image_params[1];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(0 != $new_width &amp;&amp; 0 == $new_height) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_width = $new_width;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_height = floor($new_width * $height / $width);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } elseif(0 != $new_height &amp;&amp; 0 == $new_width) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_height = $new_height;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_width = floor($new_height * $width / $height);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } elseif(0 == $new_width &amp;&amp; 0 == $new_height) { //assume we want to create a new image the same exact size&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_width = $width;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_height = $height;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else { //assume we want to create an image with these exact dimensions, most likely resulting in distortion&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_width = $new_width;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $scaled_height = $new_height;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //create image&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $ext = $image_params[2];&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch($ext) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case IMAGETYPE_GIF:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $return = $this-&gt;__resizeGif($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case IMAGETYPE_JPEG:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $return = $this-&gt;__resizeJpeg($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case IMAGETYPE_PNG:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $return = $this-&gt;__resizePng($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $return = $this-&gt;__resizeJpeg($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $return;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function getErrors() {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $this-&gt;__errors;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function __resizeGif($original, $new_filename, $scaled_width, $scaled_height, $width, $height) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = false;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($src = imagecreatefromgif($original))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your resized image (gif).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($tmp = imagecreatetruecolor($scaled_width, $scaled_height))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (gif).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!imagecopyresampled($tmp, $src, 0, 0, 0, 0, $scaled_width, $scaled_height, $width, $height)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (gif).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($new_image = imagegif($tmp, $new_filename))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error writing your image to file (gif).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagedestroy($tmp);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(false == $error) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $new_image;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function __resizeJpeg($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = false;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($src = imagecreatefromjpeg($original))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your resized image (jpg).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($tmp = imagecreatetruecolor($scaled_width, $scaled_height))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (jpg).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!imagecopyresampled($tmp, $src, 0, 0, 0, 0, $scaled_width, $scaled_height, $width, $height)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (jpg).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($new_image = imagejpeg($tmp, $new_filename, $quality))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error writing your image to file (jpg).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagedestroy($tmp);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(false == $error) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $new_image;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function __resizePng($original, $new_filename, $scaled_width, $scaled_height, $width, $height, $quality) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = false;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* we need to recalculate the quality for imagepng()&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* the quality parameter in imagepng() is actually the compression level, &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* so the higher the value (0-9), the lower the quality. this is pretty much&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* the opposite of how imagejpeg() works.&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*/&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $quality = ceil($quality / 10); // 0 - 100 value&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(0 == $quality) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $quality = 9;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $quality = ($quality - 1) % 9;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($src = imagecreatefrompng($original))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your resized image (png).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($tmp = imagecreatetruecolor($scaled_width, $scaled_height))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (png).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagealphablending($tmp, false);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!imagecopyresampled($tmp, $src, 0, 0, 0, 0, $scaled_width, $scaled_height, $width, $height)) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error creating your true color image (png).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagesavealpha($tmp, true);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!($new_image = imagepng($tmp, $new_filename, $quality))) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $this-&gt;__errors[] = 'There was an error writing your image to file (png).';&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $error = true;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagedestroy($tmp);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(false == $error) {&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return $new_image;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp; }}?&gt;</p>
<p>I originally wrote this as a CakePHP component and added it to the Bakery. The script is general enough that I was able to remove the few bits of code that were CakePHP specific. If/when the article is published, I will link it here.</p>
<p>Download Image Resizing Class</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/29/title/Image-Resizing-Class</guid>
			<pubDate>Tue, 21 Jul 2009 22:20:02 EDT</pubDate>
		</item>
		<item>
			<title>Changing the Default Currency in DigiSHOP</title>
			<link>http://www.sethcardoza.com/posts/view/24/title/Changing-the-Default-Currency-in-DigiSHOP</link>
			<description><![CDATA[<p>DigiSHOP is not one to let you do things on your own. The code has little comments, and none of them are useful to developers wanting to customize the shopping cart. As always, any customizations you make will void your warranty, so customize at your own risk.</p>
<p>If you have already installed your shopping cart, but want a different default currency than the current one, SumEffect says you need to call them and have them do it, or void your warranty. It's actually very simple to accomplish though. All it takes is a few changes to the settings.</p>
<p>First, connect to the database, and bring up the ds_settings table. For this tutorial, I am going to assume that the current default currency is USD. You will need to change the following settings, from their values below.</p>
<p>locale = "en_US"locale.admin.date = "en_US"locale.showIntCurrSymbol = "N"mCountry = "United States"merchantCountry = "US"taxCountry = "US"</p>
<p>For this tutorial, I am going to change the default currency to Canadian dollars. I will have to change these settings as follows:</p>
<p>locale = "en_CA" locale.admin.date = "en_CA" locale.showIntCurrSymbol = "Y" mCountry = "Canada" merchantCountry = "CA" taxCountry = "CA"</p>
<p>Really, not all of these settings need to be changed, but this will ensure fewer issues later on. The locale.showIntCurrSymbol setting only needs to be changed from N to Y if you want the international currency symbol to be displayed, instead of the dollar (US) sign. Further, the mCountry, merchantCountry and taxCountry only need to be changed if the store's billing address is located outside of the current country.</p>]]></description>
			<category>DigiSHOP</category>
			<guid>http://www.sethcardoza.com/posts/view/24/title/Changing-the-Default-Currency-in-DigiSHOP</guid>
			<pubDate>Sat, 20 Jun 2009 21:30:51 EDT</pubDate>
		</item>
		<item>
			<title>Submitting a Form With jQuery</title>
			<link>http://www.sethcardoza.com/posts/view/23/title/Submitting-a-Form-With-jQuery</link>
			<description><![CDATA[<p>On a recent project I was working on, I had to have a form submit when the option was changed on a select box. This is a simple task with jQuery. I just had to add a the change() event listener to the appropriate select boxes, and then submit the form. It didn't work though. The event listener worked, but the form would not submit. I tried several solutions, all pretty much the same in the end. None of them worked, and then I realized that I named my submit button "submit". It's a force of habit, something I do without even thinking. It is what caused my solution to break though. "Submit" is a reserved word and it prevented jQuery from submitting my form.</p>
<p>Naming your submit buttons "submit' is not a good idea anyway. It is a bad habit I have, and will now be broken from this point forth. Remember, if you want to submit your form with jQuery, don't name your submit buttons "submit". Better yet, avoid using reserved words at all.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/23/title/Submitting-a-Form-With-jQuery</guid>
			<pubDate>Tue, 05 May 2009 13:59:32 EDT</pubDate>
		</item>
		<item>
			<title>Kona on the Indo Board</title>
			<link>http://www.sethcardoza.com/posts/view/22/title/Kona-on-the-Indo-Board</link>
			<description><![CDATA[<p>My dog, Kona, used to be terrified of my Indo Board. He wouldn't even go near it when it was stationary. But, a few treats and he rides on it with me now.</p>
<p>






</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/22/title/Kona-on-the-Indo-Board</guid>
			<pubDate>Fri, 17 Apr 2009 20:59:55 EDT</pubDate>
		</item>
		<item>
			<title>SVN - Creating a New Repository</title>
			<link>http://www.sethcardoza.com/posts/view/21/title/SVN---Creating-a-New-Repository</link>
			<description><![CDATA[<p>Creating a new repository with Subversion is simple. Just run the following command on your svn server:</p>
<p style="padding-left: 30px;">svnadmin create /path/to/svn/example.com</p>
<p>This will create a new, blank repository with the name "example.com". Now you will want to do one of two things, import an existing project, or setup the initial directory structure for your new repository. To import an existing project, simply run the following command:</p>
<p style="padding-left: 30px;">svn import /local/path/to/existing/project http://svn.example.com/path/to/svn/example.com</p>
<p>Now, if you are not importing an existing project you will want to setup your initial directory structure, most likely in the following fashion.</p>
<p style="padding-left: 30px;">/path/to/svn/example.com/branches</p>
<p style="padding-left: 30px;">/path/to/svn/example.com/tags</p>
<p style="padding-left: 30px;">/path/to/svn/example.com/trunk</p>
<p>All you have to do is, checkout the project, create the necessary directories, and commit them to the repository. A friend of mine created a shell script to automate creating a new svn repository, and setting up the initial directory structure and/or importing an existing project.</p>]]></description>
			<category>Version Control</category>
			<guid>http://www.sethcardoza.com/posts/view/21/title/SVN---Creating-a-New-Repository</guid>
			<pubDate>Tue, 07 Apr 2009 14:29:52 EDT</pubDate>
		</item>
		<item>
			<title>SVN Copy - Creating a Branch or Tag</title>
			<link>http://www.sethcardoza.com/posts/view/20/title/SVN-Copy---Creating-a-Branch-or-Tag</link>
			<description><![CDATA[<p>Tagging and branching with svn are as simple as using the copy command. For this tutorial, I will assume that your repository has the following structure:</p>
<p>/path/to/repository/branches</p>
<p>/path/to/repository/tags</p>
<p>/path/to/repository/trunk</p>
<p>To create a tag of the trunk, run the following command:</p>
<p style="padding-left: 30px;">svn copy http://svn.example.com/path/to/repository/trunk http://svn.example.com/path/to/repository/tags/snapshot-of-trunk</p>
<p>To create a tag of your current working copy (assuming you are in that directory on your local machine):</p>
<p style="padding-left: 30px;">svn copy . http://svn.example.com/path/to/repository/tags/working-copy-seth</p>
<p>To tag a branch, say before merging the branch back into the trunk, run the following command:</p>
<p style="padding-left: 30px;">svn copy http://svn.example.com/path/to/repository/branches/branch-seth/ http://svn.example.com/path/to/repository/tags/snapshot-branch-seth</p>
<p>To create a branch of the trunk:</p>
<p style="padding-left: 30px;">svn copy http://svn.example.com/path/to/repository/trunk http://svn.example.com/path/to/repository/branches/branch-seth</p>
<p>To create a branch of your current working copy:</p>
<p style="padding-left: 30px;">svn copy . http://svn.example.com/path/to/repository/branches/branch-seth</p>
<p>Tags should only be used to create snapshots of the repository. No development should be done on a tag, meaning you should never commit code to a tag. Branches are used for development that you do not want to interfere with everyday activity. They can be used for experimental code, code that you may only want to have run on your local machine, but still would like to have the power of version control behind your code. There are many other situations in which you would want to use a tag or a branch. You can read more about subversion and tags and branches on Wikipedia.</p>]]></description>
			<category>Version Control</category>
			<guid>http://www.sethcardoza.com/posts/view/20/title/SVN-Copy---Creating-a-Branch-or-Tag</guid>
			<pubDate>Thu, 02 Apr 2009 18:21:26 EDT</pubDate>
		</item>
		<item>
			<title>Book Review: Beginning CakePHP From Novice to Professional</title>
			<link>http://www.sethcardoza.com/posts/view/19/title/Book-Review:-Beginning-CakePHP-From-Novice-to-Professional</link>
			<description><![CDATA[<p>I have been getting into CakePHP development more and more recently. With all the CakePHP books that have come out in the past year, I was hoping I could find one that would be a pretty comprehensive guide to CakePHP. I was looking for something that would basically tell me everything that Cake's online manual would. I know I will get the usual "why not just read the manual?". Well, if I have time to read a book, I'm not usually around a computer, and reading off the computer screen for an extended period of time isn't pleasant.</p>
<p>Beginning CakePHP From Novice to Professional does a decent job covering the basics of CakePHP. Having built even the simplest of applications with Cake before reading this book, I was able to breeze through the first half of the book. Much of it covers the very basics, including installation and setup, naming conventions, and etc. Most of the code examples in the book extend Cake's blog tutorial, which most Cake developers will be familiar with.</p>
<p>The book covers CakePHP 1.2, which is currently the latest major release. I was surprised it does not include documentation on how to upgrade a site from 1.1 to 1.2. Of course, it is different for every site, but some general instructions would be a good idea. The book has a paragraph on ACL with CakePHP, but no more than that. ACL is one of the more complex paradigms in Cake, and it would have been nice to have some documentation on this subject.</p>
<p>I learned a few tricks from this book, but nothing I couldn't have learned anywhere else. Beginning CakePHP From Novice to Professional would be great for those brand new to CakePHP, but it definitely does not cover more than the basics. If you are already familiar with Cake and have been working with it for a while, this book will be of little use to you. Hopefully one of the other CakePHP books out there will go into more depth than this one. As I read them, I will review them here, so be on the look out for them.</p>]]></description>
			<category>Book Reviews</category>
			<guid>http://www.sethcardoza.com/posts/view/19/title/Book-Review:-Beginning-CakePHP-From-Novice-to-Professional</guid>
			<pubDate>Wed, 25 Mar 2009 20:09:39 EDT</pubDate>
		</item>
		<item>
			<title>Why the Wii Fit Works (and Why It Doesn't)</title>
			<link>http://www.sethcardoza.com/posts/view/18/title/Why-the-Wii-Fit-Works-(and-Why-It-Doesn't)</link>
			<description><![CDATA[<p>In case you don't know, the Wii Fit is an exercise game for the Wii. There is much debate as to whether or not it is a viable source for exercise. Today, I will explain why both sides are correct.</p>
Why It Works:

Allows you to set goals for BMI and body weight, and track your progress toward those goals
It provides a variety of Aerobic, Isotonic, and Isometric exercises.
It promotes competition, whether it be to beat your own high score, or beat those that also use your Wii Fit

Why It Doesn't Work:

It is easy to "cheat" at the games, meaning you can still do well but with minimal physical effort.
If you spend most of your time playing the Balance Games, you will not get much exercise.
You have to use the Wii Fit for it to work. Just like any other exercise, it only works if you do it.

<p>The Wii Fit should not be seen as a replacement for a full exercise regiment. In my opinion it is best for times when you cannot make it to the gym, or the weather prevents you from running or biking. It is definitely better than no exercise at all though. Just remember to stay motivated and set achievable goals.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/18/title/Why-the-Wii-Fit-Works-(and-Why-It-Doesn't)</guid>
			<pubDate>Tue, 24 Mar 2009 12:38:39 EDT</pubDate>
		</item>
		<item>
			<title>Animated Loading GIF Generator</title>
			<link>http://www.sethcardoza.com/posts/view/17/title/Animated-Loading-GIF-Generator</link>
			<description><![CDATA[<p>I found this nifty little application that lets you generate a custom animated "loading" GIF. There are over 30 different images to choose from, with the ability to customize the color.</p>
<p>Animated Loading GIF Generator</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/17/title/Animated-Loading-GIF-Generator</guid>
			<pubDate>Mon, 16 Mar 2009 20:27:10 EDT</pubDate>
		</item>
		<item>
			<title>SVN Merge - Merging a Branch Into the Trunk</title>
			<link>http://www.sethcardoza.com/posts/view/16/title/SVN-Merge---Merging-a-Branch-Into-the-Trunk</link>
			<description><![CDATA[<p>So you've created a branch for one reason or another, mainly to make sure that the trunk stays stable and doesn't create chaos for the other developers on your team. You've committed several changes to this branch and thoroughly tested them to make sure everything is in working order. Now how do you get them back into the trunk? This is how.</p>
<p>You should have a local copy of the branch since that is where you have done the development.</p>
<p style="padding-left: 30px;">/local/path/to/repository/branch</p>
<p>Now, if you don't already have a copy of the trunk locally, get one. Navigate to your local copy of the trunk.</p>
<p style="padding-left: 30px;">/local/path/to/repository/trunk</p>
<p>You will need the revision number of the revision when you created the branch. For the sake of this example, I will say that the branch was at revision 100. Now run the following command to merge the branch into your local copy of the trunk.</p>
<p style="padding-left: 30px;">svn merge -r 100:HEAD https://svn.example.com/path/to/repository/branch/my-dev-branch</p>
<p>You should now see that the files modified in your branch have been merged in your local copy of the trunk. Some files may be in conflict, and will have a "C" next to them in the file list after the merge command was run. You can also run an svn status to see if any files are in conflict. Resolve all conflicts, manually if necessary. Now make sure everything is working on your local copy of the trunk. If so, check your changes into the trunk.</p>
<p>On a side note, I like to tag the trunk before I merge a branch back into it. It just puts my mind at ease knowing I have a snapshot of a known working copy of the trunk.</p>]]></description>
			<category>Version Control</category>
			<guid>http://www.sethcardoza.com/posts/view/16/title/SVN-Merge---Merging-a-Branch-Into-the-Trunk</guid>
			<pubDate>Fri, 06 Mar 2009 21:04:02 EST</pubDate>
		</item>
		<item>
			<title>Book Review: Watchmen</title>
			<link>http://www.sethcardoza.com/posts/view/15/title/Book-Review:-Watchmen</link>
			<description><![CDATA[<p>Watchmen is a graphic novel based in an alternate 1985, where Richard Nixon is still President. Costumed heroes have been outlawed, except for those sponsored by the government. The fear is that people with that much power can wreak havoc if unchecked. The story starts off with the death of The Comedian, a costumed hero that has done a great deal of work for the government. Rorschach, another costumed hero, one that is not government sponsored, finds his death very suspicious. He investigates his death, and the eventual deaths of other costumed heroes. The character profiles and personalities are not particularly original, especially to those big into comic books, but they are based on tried and true characters that work.</p>
<p>The time setting is obviously dated, but story itself could easily be adapted to the present day. There is plenty of detail, both in the writing and the artwork, that will make you want to read this over so that you don't miss anything. There are some excerpts from an biography written by one of the characters that do give some important details to the back story, but they can be a bit long and dry. It would have been nice if these details were worked in more seamlessly with some artwork, rather than the excerpts used.</p>
<p>Overall, the book is a great work of art. With the movie due out in less than a week, I recommend reading it before seeing the movie. I think the movie will be good, but will not do the book justice. It will be a tough story to adapt to film. The excerpts I mentioned earlier will have to be told instead of read. Something I neglected to mention, the comic within the comic, will hopefully make it into the film in some way or another. It is not key to the story, but it is one of those little touches of detail that makes the book great.</p>]]></description>
			<category>Book Reviews</category>
			<guid>http://www.sethcardoza.com/posts/view/15/title/Book-Review:-Watchmen</guid>
			<pubDate>Fri, 27 Feb 2009 23:18:27 EST</pubDate>
		</item>
		<item>
			<title>Building for the Future</title>
			<link>http://www.sethcardoza.com/posts/view/14/title/Building-for-the-Future</link>
			<description><![CDATA[<p>If you're building for the future, you're doing it wrong. That isn't to say that you should cut corners wherever possible. The key is to spend your time building what you need now. If you concentrate on building what you need now, you will be able to do a better job. You will be able to refine every subtle detail, catch most bugs (create fewer bugs in the first place), and finish on time.</p>
<p>Building for the future rarely ends well. Time and resources are spent on building for something that might never be used. Can you guarantee that your product will make it to the future for which you are planning? Can you guarantee that the features you are prepping your system for will make it to fruition? How often to specifications and requirements change during a product's life cycle? There is a chance your product will fall. It is highly likely that new ideas will come about and features you planned on building are no longer wanted.</p>
<p>Rather than spend your time building for the future, build for what you need now, and spend the time to do it right. Making a small, but robust, set of features work properly will give your product a higher success rate than building for features you might add later.</p>]]></description>
			<category>Agile Development</category>
			<guid>http://www.sethcardoza.com/posts/view/14/title/Building-for-the-Future</guid>
			<pubDate>Thu, 26 Feb 2009 21:28:50 EST</pubDate>
		</item>
		<item>
			<title>The Benefits of Agile Development</title>
			<link>http://www.sethcardoza.com/posts/view/13/title/The-Benefits-of-Agile-Development</link>
			<description><![CDATA[<p>Note: If you are completely new to the Agile Development methodology, I suggest you read up on it first as I will use quite a bit of terminology particular to the methodology.</p>
<p>While I think Agile Development is a better approach to web development when compared to the waterfall approach, and loosely practice it in my personal projects, we only just recently implemented it at work. We finished our first sprint this week, and completed a block of work in 9 days that I thought would take months with our old process. To be fair, we doubled our team from 3 developers to 6. While we did greatly increase the size of our team, the biggest factors were having a concrete set of tasks for the sprint, and not wasting hours per week in status meetings like we had in the past.</p>
<p>The best thing about the switch to the Agile Development process was that fact that everyone is happier. We are a large publishing/media company with limited web development resources. The business units are constantly fighting to get their work done. Now, they get to pick what gets done within a given sprint. In the end, there's no reason for them not to be happy anymore, and they are much happier now. I have been working on this project for 9+ months, and only recently have started to receive praise from the business units for our hard work. On the other side of things, developers are equally as happy, if not more. We are not being constantly pulled in every direction, our highest priorities no longer change on a day-to-day basis. We are able to concentrate on a specific set of tasks during the sprint, and are able to see those tasks completed. We can see the fruits of our labor. And, if there are interruptions, it is understood that a change in priorities will affect the time of completion for our tasks.</p>
<p>Another great thing about this methodology is that it is understood that no one get 8 hours of work done in an 8-hour day. There are interruptions, meetings, time is taken to help team member solve their tasks, and etc. Currently, it is assumed that we can complete 6 hours of work in an 8-hour day, and we plan the work items in the sprint accordingly. If at the end of the sprint, it is determined that we can complete more or less work in a given day, we plan accordingly for the next sprint.</p>
<p>It has only been a couple weeks since we started implementing Agile Development, and there will be plenty of kinks to work out, but it has already made a tremendous difference. The business units are happier, and are in more control of their products. The developers are happier and in more control of their code and how things get done. Realistic expectations are set, and goals can finally be met.</p>]]></description>
			<category>Agile Development</category>
			<guid>http://www.sethcardoza.com/posts/view/13/title/The-Benefits-of-Agile-Development</guid>
			<pubDate>Sat, 21 Feb 2009 23:18:35 EST</pubDate>
		</item>
		<item>
			<title>Discover New Music With Last.fm</title>
			<link>http://www.sethcardoza.com/posts/view/12/title/Discover-New-Music-With-Last.fm</link>
			<description><![CDATA[<p>If you don't know, Last.fm is an internet radio station. You can learn more about the general stuff on the website. This post is about how to discover new music now that you are using Last.fm. Here's a list of some ways to discover new music with Last.fm</p>

Last.fm recommended music station
Listen to an artist
Listen to friend's radio stations
Listen to tags

<p>The easiest way to discover new music is to listen to the Last.fm recommended music station. This is tailored to you based on the music you already listen to. Depending on how diverse your taste in music is, this will play music from numerous genres</p>
<p>Selecting a specific artist will usually play at least one song from that artist, and then similar artists, usually in the same, or similar genres. So if I were to start listening to Rolling Stones, this station would most likely not play Ludacris.</p>
<p>You can befriend people on Last.fm and listen to their radio station. This is a great way to discover new music, especially if your friends have different tastes than you do.</p>
<p>Last, but my favorite, is tags. You can type in a tag, and listen to music that has been tagged with whatever you've typed in. This can be as general as basic genre like, rock, rap, hip-hop, techno, and etc. The really interesting thing is putting in more obscure tags. Some of my recent favorite are, progressive metal, video game rock, mega man, and underground.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/12/title/Discover-New-Music-With-Last.fm</guid>
			<pubDate>Fri, 06 Feb 2009 22:28:56 EST</pubDate>
		</item>
		<item>
			<title>K-Lite Codec Pack for Mac</title>
			<link>http://www.sethcardoza.com/posts/view/11/title/K-Lite-Codec-Pack-for-Mac</link>
			<description><![CDATA[<p>I had to do a bit of searching to find this, so I figured it would be useful for others. If you're newer to OS X and Quicktime, and are used to using the K-Lite Codec packs for Windows, you're probably wondering what to do for your Mac. Download Perian, and install it. It will be all that you need.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/11/title/K-Lite-Codec-Pack-for-Mac</guid>
			<pubDate>Sun, 01 Feb 2009 20:00:02 EST</pubDate>
		</item>
		<item>
			<title>Achieving Your Goals</title>
			<link>http://www.sethcardoza.com/posts/view/10/title/Achieving-Your-Goals</link>
			<description><![CDATA[<p>Having a hard time losing the weight? Just can't seem to find the time to start learning a new programming language? Make it a contest. Find a friend that wants to achieve a similar goal, and make a friendly competition out of it. Set a goal, lose 5 pounds in a month, write a basic application in the new language in a month's time, the loser buys lunch. It's enough of an incentive to want to beat your friend, but nothing that will ruin the friendship*.</p>
<p>*Seth Cardoza provides no warranty as to the status of your friendship at the end of the contest.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/10/title/Achieving-Your-Goals</guid>
			<pubDate>Sat, 31 Jan 2009 14:08:50 EST</pubDate>
		</item>
		<item>
			<title>Super Bowl Office Pool Sheet</title>
			<link>http://www.sethcardoza.com/posts/view/9/title/Super-Bowl-Office-Pool-Sheet</link>
			<description><![CDATA[<p>It's that time of year again. Yep, time for some office gambling. I whipped up a quick sheet and figured I would share it with the world. I'm sure someone will need one, and this will look somewhat professional. Click here to view and print, and see below for a preview.</p>
<p></p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/9/title/Super-Bowl-Office-Pool-Sheet</guid>
			<pubDate>Mon, 26 Jan 2009 20:54:26 EST</pubDate>
		</item>
		<item>
			<title>Integrating Akismet with CakePHP</title>
			<link>http://www.sethcardoza.com/posts/view/8/title/Integrating-Akismet-with-CakePHP</link>
			<description><![CDATA[<p>Fighting comment SPAM is an ongoing battle. When I first created the ability to add comments, I used a simple hidden field and session token thinking that would handle most of the SPAM. That failed quickly. I soon had hundreds of comments linking to Viagra and the like. I put a bandage in place flagging any comment posted that had more than one link. I didn't expect it to work forever, but hoped it would hold up longer than it did. But, my site soon had SPAM comments all over again. I had to do something more permanent, and fast. I found a class written by Felix Geisend&ouml;rfer, integrating CakePHP with Akismet.</p>
<p>I quickly downloaded and added it to my project. It didn't work! Luckily it just needed to be updated to work with CakePHP 1.2. It was a simple fix and I was on my way to turning the tides in the fight against comment SPAM. After updating the class to work with CakePHP 1.2, it was as simple as making a few calls to the class, passing the necessary information. I posted the updated class to CakeForge, allowing me to give back to the open source community for the first time.</p>
<p>All of this functionality is built into the latest version of Wordpress, but being the stubborn person that I am, I'm sticking to CakePHP, loving every minute of it, and learning a great deal along the way.</p>]]></description>
			<category>Don't Rewrite Wordpress</category>
			<guid>http://www.sethcardoza.com/posts/view/8/title/Integrating-Akismet-with-CakePHP</guid>
			<pubDate>Thu, 22 Jan 2009 20:53:23 EST</pubDate>
		</item>
		<item>
			<title>CakePHP Upgrade from 1.1 to 1.2</title>
			<link>http://www.sethcardoza.com/posts/view/7/title/CakePHP-Upgrade-from-1.1-to-1.2</link>
			<description><![CDATA[<p>CakePHP 1.2 has finally released, but how do you upgrade site your site running CakePHP 1.1? It is a fairly simple process with brief formal instructions on cakephp.org. Most will only have to make a few changes as CakePHP 1.2 is not backwards compatible. All of the html helper form element methods have been moved to a form helper. This means that this:</p>
<p>&nbsp;&nbsp;&nbsp; &lt;?php echo $html-&gt;input('username'); ?&gt;</p>
<p>becomes this:</p>
<p>&nbsp;&nbsp;&nbsp; &lt;?php echo $form-&gt;input('username'); ?&gt;</p>
<p>One other big change was the removal of the generateList() method used to create an array for later use in select elements. The change in code is as follows:</p>
<p>&nbsp;&nbsp;&nbsp; &lt;?php $this-&gt;ModelName-&gt;generateList($conditions, $order, $limit, $keyPath, $valuePath); ?&gt;</p>
<p>becomes this:</p>
<p>&nbsp;&nbsp;&nbsp; &lt;?php $this-&gt;ModelName-&gt;find('list', $params); ?&gt;</p>
<p>The upgrade instructions provide a possible migration approach suggested in the documentation. It was a relatively simple process, only taking a few hours, including a good deal of testing.</p>]]></description>
			<category>CakePHP</category>
			<guid>http://www.sethcardoza.com/posts/view/7/title/CakePHP-Upgrade-from-1.1-to-1.2</guid>
			<pubDate>Sat, 10 Jan 2009 23:32:18 EST</pubDate>
		</item>
		<item>
			<title>Visit A Comic Shop</title>
			<link>http://www.sethcardoza.com/posts/view/6/title/Visit-A-Comic-Shop</link>
			<description><![CDATA[<p>If you are in the Orlando area and enjoy comics, A Comic Shop is the place for you. It's small, but has a great selection of current comics. If you're looking for something a bit older, they'll be more than happy to find it for you. All the employees there are knowledgeable about their products and often give great recommendations for something new.</p>
<p>If you aren't into comic books but want to get started, A Comic Shop has a great program for you. Most comic shops have one free comic book day each year, where you have to wait in line with everyone else to get a staff selected free comic book, which will not suit every one's interests. A Comic Shop updates free comic book day for today's generation with My Free Comic Book Day. If you follow the link, you can print out a coupon for a free comic book up to a $3.99 value. You can pick out anything in the store, and if you don't know what might interest you, ask the staff and they will be glad to help you find something.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/6/title/Visit-A-Comic-Shop</guid>
			<pubDate>Mon, 29 Dec 2008 21:31:10 EST</pubDate>
		</item>
		<item>
			<title>Amazon Discontinues 30-Day Price Guarantee</title>
			<link>http://www.sethcardoza.com/posts/view/5/title/Amazon-Discontinues-30-Day-Price-Guarantee</link>
			<description><![CDATA[<p>While it was some time ago, I recently found out that Amazon.com has discontinued it's 30-day price guarantee as of September 1, 2008. For those of you who may not know what this is or the incredible value of it, it was an excellent service that allow you receive a refund of the price difference within 30-days of the purchase if the price of an item had decreased. This made many people feel more comfortable purchasing from Amazon, since their prices fluctuate on a regular basis. Coupled with Amazon Prime (free 2 day shipping on most orders), it was a system that almost guaranteed people would return to Amazon often. I think this is a mistake on Amazon's part. I'm sure they didn't make as much money in the short term, with having to issue refunds often. One thing it did do though, was give people confidence in doing business with Amazon, and most likely created many return customers, something that is very difficult to do online.</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/5/title/Amazon-Discontinues-30-Day-Price-Guarantee</guid>
			<pubDate>Sat, 27 Dec 2008 20:35:31 EST</pubDate>
		</item>
		<item>
			<title>SVN Switch - Switching to or from the Trunk to a Branch</title>
			<link>http://www.sethcardoza.com/posts/view/4/title/SVN-Switch---Switching-to-or-from-the-Trunk-to-a-Branch</link>
			<description><![CDATA[<p>I recently had to make my first branch on a project using svn. Making a branch is easy enough with svn copy, but where do you go from there? You could check out a fresh copy of the branch from the repository, but you already have the environment setup and working for the trunk copy. There is an easy and elegant solution, and it lies within svn switch. First navigate to your working copy via the command line. Now to switch to a branch, or tag, in the repository, simply type:</p>
svn switch http://svn.example.com/project/path/to/repo/branch .
<p>Your working copy will now be the branch copy, and any committed changes will go to the branch. It is a simple and easy to use command that should speed up your development.</p>]]></description>
			<category>Version Control</category>
			<guid>http://www.sethcardoza.com/posts/view/4/title/SVN-Switch---Switching-to-or-from-the-Trunk-to-a-Branch</guid>
			<pubDate>Sun, 21 Dec 2008 23:40:23 EST</pubDate>
		</item>
		<item>
			<title>Book Review: The Non-Designer's Design Book</title>
			<link>http://www.sethcardoza.com/posts/view/3/title/Book-Review:-The-Non-Designer's-Design-Book</link>
			<description><![CDATA[<p> I am more of a developer than a designer. However, web development does not allow me the luxury of focusing only on development. My work constantly forces me to make design decisions, big and small. One of the best resources that I have found is "The Non-Designer's Design Book". It is a great book and perfect for its target audience. The Non-Designer's Design Book does an excellent job of covering the basics of design, and is an invaluable resource to those that have no design skills.</p>
<p>It covers four basic design principles:</p>

Contrast,
Repetition,
Alignment,
Proximity,

<p>and notes the unusual acronym created, and that it only makes it easier to remember. Each principle is analyzed and reviewed in detail, providing numerous examples for each. The abundance of examples is great, especially since each example covers a slightly different nuance to the design principle. Even the most skilled designer could learn something from this book.</p>]]></description>
			<category>Design</category>
			<guid>http://www.sethcardoza.com/posts/view/3/title/Book-Review:-The-Non-Designer's-Design-Book</guid>
			<pubDate>Sun, 09 Nov 2008 16:46:31 EST</pubDate>
		</item>
		<item>
			<title>Latest Version of Hotmail Lacking in Usability</title>
			<link>http://www.sethcardoza.com/posts/view/2/title/Latest-Version-of-Hotmail-Lacking-in-Usability</link>
			<description><![CDATA[<p>Recently, Microsoft has done a great deal of remodeling to Hotmail. Most is just the transition to Windows Live Mail. The first revision was hard to get used to, as change usually is, but I eventually grew to like it more than the original. There's all kinds of AJAX functionality to make it more modern and to keep up with GMail.</p>
<p>Microsoft's latest changes make Hotmail almost impossible to use. It seems like they were trying for a more minimalistic approach, but went to far. As you can see in this screen shot,
 buttons are almost impossible to decipher from the rest of the page. The buttons are little more than text links, lacking and sort of hover event other than an underline. My folders on the left hand side blend in with the rest of the sidebar and even the message pane. What Microsoft needs to do, is accentuate the borders on the individual panes more, create larger, more discernible buttons, and have a hover event that clearly lets me know which button I am about to click on. Microsoft needs to make improvements to their system, not worsen it, or it will never be able to keep it's customers from moving on to better services like GMail.</p>]]></description>
			<category>Usability</category>
			<guid>http://www.sethcardoza.com/posts/view/2/title/Latest-Version-of-Hotmail-Lacking-in-Usability</guid>
			<pubDate>Wed, 05 Nov 2008 22:45:48 EST</pubDate>
		</item>
		<item>
			<title>Hello World!</title>
			<link>http://www.sethcardoza.com/posts/view/1/title/Hello-World!</link>
			<description><![CDATA[<p>This is my first blog post. I'm building my blog from scratch. I get to learn the hard way why you should use WordPress, or other blogging software, rather than build your own from scratch. As you can see, it's a pretty bare-bones system right now. Basically there are posts (only this one right now), and you can filter by category (only General at this point in time).</p>
<p>I wanted to get something out there for now. If I wanted to release a full-featured product with all the bells and whistles, I'd never be done. There would always be something I wanted to add before launch. So, I chose to get something out there and build upon it. I plan on adding a commenting system, a tagging system, and a side bar with some relevant content in the coming months, as well adding new posts, so keep coming back to see the new features</p>]]></description>
			<category>General</category>
			<guid>http://www.sethcardoza.com/posts/view/1/title/Hello-World!</guid>
			<pubDate>Tue, 28 Oct 2008 12:49:28 EDT</pubDate>
		</item>
	</channel>
</rss>
