<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom">
	<title type="text">SethCardoza.com</title>
	<link rel="alternate" type="text/html" href="http://sethcardoza.com" />
	<modified>2010-07-12T15:08:25Z</modified>
	<author>
		<name>Seth Cardoza</name>
	</author>
	<entry>
		<title>The Wonder Years Grooveshark Playlist</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/50/title/The-Wonder-Years-Grooveshark-Playlist" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Nature Valley National Parks Project</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/49/title/Nature-Valley-National-Parks-Project" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Misplaced Hate on Flash Based Websites</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/48/title/Misplaced-Hate-on-Flash-Based-Websites" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>jQuery Form Focus Plugin</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/47/title/jQuery-Form-Focus-Plugin" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Toolbars on the Bottom of the Page</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/46/title/Toolbars-on-the-Bottom-of-the-Page" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>CakePHP Image Helper</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/45/title/CakePHP-Image-Helper" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Dissecting Yahoo's 10 Things Not to Buy in 2010</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/44/title/Dissecting-Yahoo's-10-Things-Not-to-Buy-in-2010" />
		<content type="html"><![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 picturs 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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>jQuery Selectors Last and Last-Child</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/43/title/jQuery-Selectors-Last-and-Last-Child" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>eS Accel Shoes Are Painfully Uncomfortable</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/42/title/eS-Accel-Shoes-Are-Painfully-Uncomfortable" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Rest Assured, Your Hand Job Is on Its Way</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/41/title/Rest-Assured,-Your-Hand-Job-Is-on-Its-Way" />
		<content type="html"><![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>


]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Comcasts Buys NBC from GE: What Will It Mean for Hulu?</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/40/title/Comcasts-Buys-NBC-from-GE:-What-Will-It-Mean-for-Hulu?" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Driving the Company Vehicle</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/39/title/Driving-the-Company-Vehicle" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Revenge of the Swine Flu</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/38/title/Revenge-of-the-Swine-Flu" />
		<content type="html"><![CDATA[<p></p>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Smashing Magazine and Twitter Ads</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/37/title/Smashing-Magazine-and-Twitter-Ads" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Mythbusters Beer and Liquor Analysis</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/36/title/Mythbusters-Beer-and-Liquor-Analysis" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>CakePHP HasAndBelongsToMany (HABTM) Checkboxes Instead of Multiple Select</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/35/title/CakePHP-HasAndBelongsToMany-(HABTM)-Checkboxes-Instead-of-Multiple-Select" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Akismet API Component for CakePHP 1.2</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/34/title/Akismet-API-Component-for-CakePHP-1.2" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>CakePHP Reverse Routing</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/33/title/CakePHP-Reverse-Routing" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>If You Want to Charge for a Service Online, Make Sure You Engage Your Customers</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/32/title/If-You-Want-to-Charge-for-a-Service-Online,-Make-Sure-You-Engage-Your-Customers" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Disabling Layouts and Views in CakePHP</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/31/title/Disabling-Layouts-and-Views-in-CakePHP" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>CakePHP Image Helper for Front End Optimization</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/30/title/CakePHP-Image-Helper-for-Front-End-Optimization" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Image Resizing Class</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/29/title/Image-Resizing-Class" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Changing the Default Currency in DigiSHOP</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/24/title/Changing-the-Default-Currency-in-DigiSHOP" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Submitting a Form With jQuery</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/23/title/Submitting-a-Form-With-jQuery" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Kona on the Indo Board</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/22/title/Kona-on-the-Indo-Board" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>SVN - Creating a New Repository</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/21/title/SVN---Creating-a-New-Repository" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>SVN Copy - Creating a Branch or Tag</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/20/title/SVN-Copy---Creating-a-Branch-or-Tag" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Book Review: Beginning CakePHP From Novice to Professional</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/19/title/Book-Review:-Beginning-CakePHP-From-Novice-to-Professional" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Why the Wii Fit Works (and Why It Doesn't)</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/18/title/Why-the-Wii-Fit-Works-(and-Why-It-Doesn't)" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Animated Loading GIF Generator</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/17/title/Animated-Loading-GIF-Generator" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>SVN Merge - Merging a Branch Into the Trunk</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/16/title/SVN-Merge---Merging-a-Branch-Into-the-Trunk" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Book Review: Watchmen</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/15/title/Book-Review:-Watchmen" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Building for the Future</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/14/title/Building-for-the-Future" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>The Benefits of Agile Development</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/13/title/The-Benefits-of-Agile-Development" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Discover New Music With Last.fm</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/12/title/Discover-New-Music-With-Last.fm" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>K-Lite Codec Pack for Mac</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/11/title/K-Lite-Codec-Pack-for-Mac" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Achieving Your Goals</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/10/title/Achieving-Your-Goals" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Super Bowl Office Pool Sheet</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/9/title/Super-Bowl-Office-Pool-Sheet" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Integrating Akismet with CakePHP</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/8/title/Integrating-Akismet-with-CakePHP" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>CakePHP Upgrade from 1.1 to 1.2</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/7/title/CakePHP-Upgrade-from-1.1-to-1.2" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Visit A Comic Shop</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/6/title/Visit-A-Comic-Shop" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Amazon Discontinues 30-Day Price Guarantee</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/5/title/Amazon-Discontinues-30-Day-Price-Guarantee" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>SVN Switch - Switching to or from the Trunk to a Branch</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/4/title/SVN-Switch---Switching-to-or-from-the-Trunk-to-a-Branch" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Book Review: The Non-Designer's Design Book</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/3/title/Book-Review:-The-Non-Designer's-Design-Book" />
		<content type="html"><![CDATA[<p></p>
<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</p>
<p>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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Latest Version of Hotmail Lacking in Usability</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/2/title/Latest-Version-of-Hotmail-Lacking-in-Usability" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
	<entry>
		<title>Hello World!</title>
		<link rel="alternate" type="text/html" href="http://sethcardoza.com/posts/view/1/title/Hello-World!" />
		<content type="html"><![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>]]></content>
		<id></id>
		<issued></issued>
		<modified></modified>
	</entry>
</feed>

<!-- 0.4863s -->