<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>BlogChuck</title>
	
	<link>http://blogchuck.com</link>
	<description>how much blog can blogchuck blog</description>
	<lastBuildDate>Fri, 28 Oct 2011 14:06:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JustChuck" /><feedburner:info uri="justchuck" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Apple TV Feature Set</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/wflZ6M6GqB4/</link>
		<comments>http://blogchuck.com/2011/10/apple-tv-feature-set/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 14:06:03 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=397</guid>
		<description><![CDATA[I do not pretend to know anything about the potential of Apple TV. However, if Steve Jobs said he &#8220;cracked the code&#8221; for the interface, it must have a feature set that average person would not only find easy to use, but would actually want in a TV. I am going to present my take [...]]]></description>
			<content:encoded><![CDATA[<p>I do not pretend to know anything about the potential of Apple TV. However, if Steve Jobs said he &#8220;cracked the code&#8221; for the interface, it must have a feature set that average person would not only find easy to use, but would actually want in a TV. I am going to present my take on what the &#8220;perfect&#8221; TV feature set would be.<span id="more-397"></span></p>
<p>It is rumored that the Apple TV will debut at $2000. If that is the case, there are at least 2 areas of quality where the Apple TV will have to cover. To get me to buy one anyway. Service and Technology.</p>
<p><strong>Quality of Service</strong></p>
<p>The Apple TV will need to be compatible with multiple types of service. Apple could do like they did with the iPhone and provide a limited release for a specific service like Comcast, Dishnetwork, or DirectTV. But that doesn&#8217;t seem likely. It is more likely it will be compatible with all of the major services. Meaning, all cable companies and standard satellite companies. It must have something other TVs do not typically have besides a built in operating system.</p>
<p><strong>Quality of Technology</strong></p>
<p>This is where things get a bit more exciting. I envision the ability to record any show that can play on the Apple TV. It will have a built-in DVR that will store your programs indefinitely on iCloud. As a result, these shows will be accessible from any device you own iPod, iPhone, iPad, Mac, and Apple TV. I also anticipate the ability to stream programming to any of your devices so you can watch programming not only from anywhere in your house, but anywhere you have a wireless connection.</p>
<p>Controlling the Apple TV will be just as easy. Some speculation indicates there will be a Siri interface so all you have to do is talk to your TV. This may be true. I would also suspect that you will have access to Apps that run on other devices like your iPod, iPhone, iPad and Mac that will control the Apple TV as well. Steve Jobs would not change a paradigm that drastically by removing what everyone is used to.</p>
<p>Of course Apple TV will have the other standard features that we have all seen like parental controls, iTunes rentals / purchases, YouTube access, etc. I would also suspect it will have a social quality built in. This will allow you to post what you are watching and how you rate it to social media such as Twitter and Facebook.</p>
<p>There is my take on what the Apple TV will be, if it is in fact going to be a product.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Xegatz2Ma9qy1dxzVNLCki4oSBY/0/da"><img src="http://feedads.g.doubleclick.net/~a/Xegatz2Ma9qy1dxzVNLCki4oSBY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Xegatz2Ma9qy1dxzVNLCki4oSBY/1/da"><img src="http://feedads.g.doubleclick.net/~a/Xegatz2Ma9qy1dxzVNLCki4oSBY/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/wflZ6M6GqB4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2011/10/apple-tv-feature-set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2011/10/apple-tv-feature-set/</feedburner:origLink></item>
		<item>
		<title>Serving Localhost from Mac OSX to Parallels</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/DuUGVACpK6E/</link>
		<comments>http://blogchuck.com/2011/04/serving-localhost-from-mac-osx-to-parallels/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 19:33:03 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=385</guid>
		<description><![CDATA[On occasion during development, I like to check how my .css and javascript functionality works in IE. Right now, IE only has about 25% of the total internet market for browsers (w3schools.com) for 2011; and it is slowly deteriorating. But I don&#8217;t want to disparage users for using inferior products, so I like to test [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogchuck.com/wp-content/uploads/2011/04/mamp-1.png"><img class="alignright size-thumbnail wp-image-387" title="MAMP Server Mac OSX" src="http://blogchuck.com/wp-content/uploads/2011/04/mamp-1-150x150.png" alt="MAMP Logo" width="150" height="150" /></a>On occasion during development, I like to check how my .css and javascript functionality works in IE. Right now, IE only has about 25% of the total internet market for browsers (<a title="browser stats" href="http://www.w3schools.com/browsers/browsers_stats.asp">w3schools.com</a>) for 2011; and it is slowly deteriorating. But I don&#8217;t want to disparage users for using inferior products, so I like to test against them. Besides, 25% of market share is not ALL bad.</p>
<p>I did some digging on Google and found a few helps, but nothing as specific as I wanted. So here I present how to get Parallels to server up MAMP pages from my OSX MacBook Pro. <span id="more-385"></span></p>
<p><strong>First, </strong>you need to setup Parallels to host-only networking by going to preferences:</p>
<ul>
<li>preferences-&gt;network-&gt;Connection type: Host-only networking</li>
<li>also, check the Show in System Preferences checkbox</li>
</ul>
<p><strong>Next,</strong> go to your Mac System Preferences under the Interent &amp; Wireless section click on:</p>
<ul>
<li>sharing-&gt;internet sharing-&gt;share your connection from: Parallels Host-Only&#8230;</li>
<li>check the Ethernet box</li>
<li>check the Internet Sharing Box again, and click yes</li>
</ul>
<p>Now you are setup. However, if you are doing virtual local hosting and setting up multiple hosts, you will need a way to call them from windows. The way to do that is by inserting the host information into your hosts file on windows, the same way you do for the mac.</p>
<p>For this example, if you have a localhost called mysite.local you want to access in IE on Parallels, after following all of the setup above, you need to do the following:</p>
<ul>
<li>point IE in Parallels to localhost (it will reveal the IP address of the localhost)</li>
<li>add a record to c:\windows\system32\drivers\etc\hosts for the localhost virtual host setting</li>
<li>example:  192.168.0.10  mysite.local</li>
</ul>
<p>Now you should be able to access the localhost virtual host in IE on Parallels.</p>
<p>Happy coding!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/vOkK6XGIKNvQAxhGI248EB7ehOs/0/da"><img src="http://feedads.g.doubleclick.net/~a/vOkK6XGIKNvQAxhGI248EB7ehOs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vOkK6XGIKNvQAxhGI248EB7ehOs/1/da"><img src="http://feedads.g.doubleclick.net/~a/vOkK6XGIKNvQAxhGI248EB7ehOs/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/DuUGVACpK6E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2011/04/serving-localhost-from-mac-osx-to-parallels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2011/04/serving-localhost-from-mac-osx-to-parallels/</feedburner:origLink></item>
		<item>
		<title>Goal Driven Relevant Decision Making</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/wQcLnP3ybMo/</link>
		<comments>http://blogchuck.com/2011/03/goal-driven-relevant-decision-making/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 06:03:42 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=376</guid>
		<description><![CDATA[I had a real epiphany today. I suddenly realized that I am so busy doing work at work, I don&#8217;t have time for growth. I find that there is no room for judgment or creativity on my part. I am told what to do, how to do it, and the order to do it in. [...]]]></description>
			<content:encoded><![CDATA[<p>I had a real epiphany today. I suddenly realized that I am so busy doing work at work, I don&#8217;t have time for growth. I find that there is no room for judgment or creativity on my part. I am told what to do, how to do it, and the order to do it in. And the priorities may change from one day to the next. I am not allowed to provide input or innovation. It&#8217;s almost mechanical. The only thing I really get to decide is determining how long it&#8217;s going to take, but even that gets negotiated. To make matters worse, I get thrown the task of fixing other coders bugs. I feel like an extension of someone else. Like I am there to be the clone of someone who feels they need another body. They decide what needs to get done, how they want it done, whether or not it sounds too difficult, and how to implement: design, function, and format. In a word, micromanaged. Didn&#8217;t that go out of style with the 90&#8242;s?</p>
<p>How did I come to that realization? It has taken some time to realize, but it hit me full force today when I couldn&#8217;t even think outside the box for a simple reordering algorithm. I was given the opportunity for a brief moment and I froze! I have allowed myself to get to this point. It&#8217;s not from lack of effort however. I always put forth ideas, best practices, and user interaction improvements. The problem is, someone else has control and I always get overridden. I don&#8217;t even know if my ideas get passed on to the powers that be. I am not included in any discussion, asked what I think, or allowed to propose designs or functionality. Again, I am told what to do, every step of the way.<span id="more-376"></span></p>
<p>I find that I enjoy writing code on my terms. Meaning, I like to be given a set of problems, business rules, requirements, or manual processes that need automation and then being turned loose to come back with a proposal. We can then take the proposal and discuss any relevant feedback and start the process. I say relevant because currently most of the feedback I get is, &#8220;because I think this is better.&#8221; Really?</p>
<p>I have spent a long time in the IT industry. Since 1997 to be exact. I don&#8217;t claim to know everything and I at times can be sloppy if I am not careful. Quality is always at the top of my priorities as someone I respect has taught me. But one thing I am really good at and that is logic. I can think down paths that others don&#8217;t think about. Most times I can see the beginning from the end. I will try to demonstrate.</p>
<p>We are working on a project. On Feb 3th, I see something in the project that is a concern. I raise the concern. As I recall from the follow-up phone call (from over a month ago), the instruction given is &#8220;It won&#8217;t matter.&#8221; Fast forward to March 28th. A bug gets filed saying it is an issue. When I raise the concern again, I get asked for proof of the follow-up phone call. Really?</p>
<p>To prove to myself I am not fabricating these topics mentally, I did some footwork over the past week to test the waters. I sent an email to push back on the user interaction design of a checkbox in a form. This checkbox can be used for two separate things. It can be used to archive a process or to roll back the process. I proposed a more straightforward solution. One that will reduce the usage of the checkbox to a single function, thus not requiring the user to have to think about what they are selecting and how it will affect each button. The response I got back was, &#8220;It sounds too complicated. Besides, the business has already signed off on it.&#8221;</p>
<p>To make my case further, I had a discussion today about a bug filed on the project we are working on. It turns out that on one of the forms, if you submit a file that is too large, the form will go blank. This is how it works in the current production environment as well. So I fixed the code. I did some further examination and there is another form that does the same thing. So I file a ticket on that and raised the issue. However, that set of code was written in a way where the file upload is tightly integrated multiple times within each of the processes. So in order to fix it would take a little more effort. The response I got was to push it to a future project. Both scenarios were exactly the same. One was bumped and one had to be fixed. When I asked how we determine what gets fixed and what gets bumped to a future project, I was told, &#8220;Well, I decide that.&#8221;</p>
<p>I don&#8217;t have a problem with someone making decisions. But to say a bug is of high priority when the same bug exists in another piece of code is not high priority sounds horrifyingly capricious. I lose respect for individuals who cannot qualify the decision making process based on things that are relevant to the overall goal, i.e. quality, performance, usability. The basic reasoning I was given for decisions made in this project were based on time available to hit a specified release date and complexity of the code. Neither of which aim for the over all goal of quality. In fact, they will do more harm to quality than good. This was proven today when two bugs issue found today. One getting fixed and one not. These types of decisions can send mixed messages to a team. Maybe that is why I am always confused about what we are working on. I cannot see any logic or patterns to the decisions that are made. This veils my clarity. Did I mention I am very logical?</p>
<p>In conclusion, what does this all mean to me? What exactly am I trying to say? Maybe I am just going through the motions at work. At least that is what I feel like. I am afforded very little creativity and it is stifling. Maybe that&#8217;s why I spend off hours writing my own coding projects. Am I dissatisfied with my employment? No. I enjoy the people I work with and the work I do. But I do need to think of a way to try to change the environment. Specifically HOW we work. It will be difficult, but I need to approach it carefully. I am the David against the Goliath. I may or may not succeed. But something has got to change. I need to feel more like a contributor and less like a robot to really enjoy my job. Do you have any suggestions on how I can assert myself without getting myself fired?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Kvj0iUH_y8XhERgoOZE0udzAxD8/0/da"><img src="http://feedads.g.doubleclick.net/~a/Kvj0iUH_y8XhERgoOZE0udzAxD8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Kvj0iUH_y8XhERgoOZE0udzAxD8/1/da"><img src="http://feedads.g.doubleclick.net/~a/Kvj0iUH_y8XhERgoOZE0udzAxD8/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/wQcLnP3ybMo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2011/03/goal-driven-relevant-decision-making/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2011/03/goal-driven-relevant-decision-making/</feedburner:origLink></item>
		<item>
		<title>Poor Service From Bert Murdock Music in Orem Utah</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/fJbhmmhZwY8/</link>
		<comments>http://blogchuck.com/2010/09/poor-service-from-bert-murdock-music-in-orem-utah/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 00:05:26 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=368</guid>
		<description><![CDATA[Wow! I had the WORST customer service ever from Bert Murdock Music in Orem, Utah. I am still in shock about the whole thing. I thought these stories were always made up. To bring you up to speed, I went to Bert Murdock Music in Orem to purchase some microphones. We want to do some [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogchuck.com/wp-content/uploads/2010/09/photo.jpg"><img class="alignright size-thumbnail wp-image-370" title="Bad Microphone" src="http://blogchuck.com/wp-content/uploads/2010/09/photo-150x150.jpg" alt="Bad Microphone" width="150" height="150" /></a>Wow! I had the WORST customer service ever from Bert Murdock Music in Orem, Utah. I am still in shock about the whole thing. I thought these stories were always made up.</p>
<p>To bring you up to speed, I went to Bert Murdock Music in Orem to purchase some microphones. We want to do some recording with family members. We got the idea from <a title="http://storycorps.org/" href="http://storycorps.org/" target="_blank">storycorps.org</a>. We thought it would be a great idea to interview family members. So I found a place to purchase microphones.</p>
<p>I purchases two microphones on Saturday, Sep. 11, 2010. My receipt says 1:59pm. I brought them home, hooked them up and played with them on GarageBand and my Mac through my <a title="4-port m-audio fast track ultra" href="http://bit.ly/agtmEB" target="_blank">4 port m-audio fast track ultra</a> over the weekend. They worked great and I was able to make a few recordings. Then the unthinkable&#8230;<span id="more-368"></span>I had to work Monday morning and I had the microphone set up in front of my computer. I needed to move it so it wouldn&#8217;t interfere with my work. So I started to put everything away. I started to disconnect the cables. When I disconnected the XLR cable from the microphone, the pins were stuck in the end of the cable and pulled the wires out of the microphone. What!? I couldn&#8217;t believe it.</p>
<p>At this point I was frustrated that I had to drive back to Bert Murdock Music in Orem to get a replacement. So I drove down there on Tuesday, Sep. 14, 2010 on my lunch break. Little did I know what I was in for. I walked in with the broken mic and immediately started getting the run around. I ended up having to wait for 20 minutes while one of the employees tried to get Ryan Murdock on the phone. Of course the whole time I am thinking, &#8220;this is simple guys. Replace the mic, send the broken one back, and I can get on with my day.&#8221; At least that is what anyone would expect to have happen, right? Wrong!</p>
<p>Then next thing I know, I am told they can&#8217;t do anything for me. Ryan needed to get the microphone rep. on the phone to know what to do. So not only did I waste 40 minutes of my time, I was sent packing without a replacement and no resolution.</p>
<p>How did it all turn out? Ryan sent me an email with a Repair Correspondence Form that I need to fill out and sent to the microphone company who will in turn determine if they will repair or replace the microphone. Wow! I am floored. So what does all of this mean?</p>
<p>DO NOT PURCHASE ANYTHING FROM Bert Murdock Music in Orem, Utah. That&#8217;s what it means. And yes, I am screaming. I cannot believe that a company would treat it&#8217;s customers like this, not in this day and age. It totally caught me by surprise. I of course wrote Ryan an email to let him know how I felt. I&#8217;m not certain I will even get a response, but if I do, you can be sure I will let you know what happens. If they have a change of heart, I may even take this post down. But to be honest, I don&#8217;t think they even care.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/7cXDdCHtes-Sn7md_M4uLgwbUhE/0/da"><img src="http://feedads.g.doubleclick.net/~a/7cXDdCHtes-Sn7md_M4uLgwbUhE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/7cXDdCHtes-Sn7md_M4uLgwbUhE/1/da"><img src="http://feedads.g.doubleclick.net/~a/7cXDdCHtes-Sn7md_M4uLgwbUhE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/fJbhmmhZwY8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/09/poor-service-from-bert-murdock-music-in-orem-utah/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/09/poor-service-from-bert-murdock-music-in-orem-utah/</feedburner:origLink></item>
		<item>
		<title>Install SpamAssassin on Mac OSX 10.6</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/Y15B9TjZSFw/</link>
		<comments>http://blogchuck.com/2010/08/install-spamassassin-on-mac-osx-10-6/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 02:12:03 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=363</guid>
		<description><![CDATA[I had an interesting conversation with a colleague of mine today. You see, we are working with a company that is going to do some marketing for us. The issue we are facing is their IT guy is a Microsoft kool-aide drinker. He knows just enough to get himself in trouble, but couldn&#8217;t code his [...]]]></description>
			<content:encoded><![CDATA[<p>I had an interesting conversation with a colleague of mine today. You see, we are working with a company that is going to do some marketing for us. The issue we are facing is their IT guy is a Microsoft kool-aide drinker. He knows just enough to get himself in trouble, but couldn&#8217;t code his way out of a paper bag. But we have to work through him to get any email sent. We are being blocked because he looks at the content we want to send and says, &#8220;There is not enough content, it will be marked as spam. We need more content.&#8221;</p>
<p>Someone please correct me if I am wrong, but spam filtering does not necessarily only look at the quantity of the content, but the quality and specific words the contained within it. For example, spamassassin uses filtering that will check the content and apply a score based on multiple things like: relays, headers, subject line, dates, etc. So the first question I asked was, &#8220;How can this Microsoft loving IT guy eyeball the content and be able to tell it will be marked as spam?&#8221;</p>
<p><span id="more-363"></span>Clearly he cannot. But because he is the resident geek at this organization, he is in control. This led me to realize, I need to get hard data. In order to combat his nonsensical approach to spam checking (by using his eyeballs), I figured I need something a little more concrete. So I set out to install SpamAssassin on my MacBookPro. Would it work? I didn&#8217;t know but I had to try. Not only because I needed something to run spam scores against, but it sounded challenging and fun at the same time.</p>
<p><strong>Easy? So it seems</strong></p>
<p>I did some searching on the web, and there was not a lot about HOW to get it installed on a Mac. So I did a little more digging and came across an article written in back in 2007 that lead me down the right path. My Linux knowledge started ti kick in again and before you know it, I am in business. I now have spamd (and spamc) running on my Mac. Here is what I did.</p>
<p><strong>The Install</strong></p>
<p>First, you need a handful of perl modules to meet the dependencies for Mail::SpamAssassin. I used the following command from the terminal:</p>
<blockquote><p>perl -MCPAN -e shell</p></blockquote>
<p>This brought up the<em> cpan&gt;</em> prompt. I tried running <strong><em>install Mail::SpamAssassin</em></strong> which failed because of the dependencies. But I paid attention to the output and pulled down the list and installed the dependencies one by one from the span shell.</p>
<blockquote><p>NetAddr::IP<br />
Mail::SPF<br />
IP::Country<br />
Razor2<br />
Net::Ident<br />
Mail::DKIM<br />
Encode::Detect</p></blockquote>
<p>A few things to note. First, Razors2 is not found in cpan. I have to <a title="Razor2" href="http://sourceforge.net/projects/razor/files/razor-agents/2.84/razor-agents-2.84.tar.bz2/download" target="_blank">download</a> it from sourceforge and install it by hand. Once I downloaded it, I uncompressed it, went to the uncompressed directory in terminal, and ran the following:</p>
<blockquote><p>perl Makefile.PL &amp;&amp; make</p>
<p>sudo make install</p></blockquote>
<p>Second, once all of the dependencies were installed, I then ran the install for SpamAssassin from the cpan shell:</p>
<blockquote><p>install Mail::SpamAssassin</p></blockquote>
<p>The problem is, I got some errors. I did what came natural to me and decided to go into the actual directory ~/.cpan/build/{spamassassin} and run the same perl Makefile&#8230; commands. Wouldn&#8217;t you know it worked?</p>
<p><strong>Did It Really Work?</strong></p>
<p>What do you know, from the same terminal I ran <strong><em>spamd &amp; </em></strong>and guess what? SpamAssassin is running on my Mac! I now have the ability to test spam scores for email messages. So now, on the command line I can run:</p>
<blockquote><p>spamc -R &lt; <em>{emailfile}</em></p></blockquote>
<p>Now all I need to do is write my custom PHP script to pass email files to spamc via the exec() and I am good to go. In the meantime, I plan on combating evil Microsoft fanboy by showing him sctual spam scores to compare with his eyeball by running them manually in my terminal. Question is, will be pull a Microsoft and try to change the standard from spam score to evil eyeball of said IT fanboy? We will soon find out.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/8qCuuVqgREolmohkVh9EG1y8GcA/0/da"><img src="http://feedads.g.doubleclick.net/~a/8qCuuVqgREolmohkVh9EG1y8GcA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/8qCuuVqgREolmohkVh9EG1y8GcA/1/da"><img src="http://feedads.g.doubleclick.net/~a/8qCuuVqgREolmohkVh9EG1y8GcA/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/Y15B9TjZSFw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/08/install-spamassassin-on-mac-osx-10-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/08/install-spamassassin-on-mac-osx-10-6/</feedburner:origLink></item>
		<item>
		<title>How To Treat A Coder (a Geek)</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/gRPBkRlQGs0/</link>
		<comments>http://blogchuck.com/2010/08/how-to-treat-a-coder-a-geek/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 03:52:17 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Musings]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=356</guid>
		<description><![CDATA[I have been thinking a lot lately about what it means to write code. What is a coder exactly? I have asked myself the question, &#8220;Why are there some companies who understand how to treat coders, and others who do not?&#8221; A coder is someone who can speak to a computer through text. The computer [...]]]></description>
			<content:encoded><![CDATA[<p>I have been thinking a lot lately about what it means to write code. What is a coder exactly? I have asked myself the question, &#8220;Why are there some companies who understand how to treat coders, and others who do not?&#8221;</p>
<p><span id="more-356"></span>A coder is someone who can speak to a computer through text. The computer understands what the coder is saying and will perform specific tasks as outlined. Think of it as any foreign language with one caveat. The language of computers is typed not spoken. In addition, it must be spoken flawlessly, or the computer will not understand.</p>
<p>When I think of a coder (also called a developer or programmer), I think of a journalist. Day in and day out, coders write content. This content is translated into some form of application, but it is still written.</p>
<p>Coders do not produce widgets on an assembly line. But they write the software that automates the robots that produce the widgets. They write the software that runs the packaging machinery for the widgets. They write the software that labels, ships, and tracks the packages the widgets are sent in.</p>
<p>When I thought about coders in this way, I came to a stark realization. I finally understood what made the difference between a &#8220;coder friendly&#8221; company and one that is not. Allow me to explain.</p>
<p><strong>Technical vs. Non-Technical</strong></p>
<p>We first must understand the differences between a technical and a non-technical company as they relate to coders. I will use easy straight forward comparisons to show what I mean. Take <a title="Google" href="http://www.google.com" target="_blank">Google</a> or <a title="Yahoo!" href="http://www.yahoo.com" target="_blank">Yahoo</a> for example. Both are technical companies. The primary focus of their company revolves around code. You can put other companies into this same category like <a title="Digg" href="http://www.digg.com" target="_blank">Digg</a>, <a title="Facebook" href="http://www.facebook.com" target="_blank">Facebook</a>, <a title="ebay" href="http://www.ebay.com" target="_blank">ebay</a>, and the list goes on. While one could say the focus of these companies is not technology, the fact remains that without the technology, these companies would not exist.</p>
<p>A non-technical company my use technology, but their primary business it not necessarily the technology. It merely uses technology to promote their business. Take <a title="ESPN" href="http://www.espn.com" target="_blank">ESPN</a> for example. They have a very large presence on the Internet and use lots of great technology, but their primary business is Sports. However, if the internet were to disappear tomorrow, ESPN would still continue broadcasting and putting out their sports magazine.</p>
<p><strong>Industrial Age vs Information Age</strong></p>
<p>If we think back to the industrial age, how were things produced? That&#8217;s right. An assembly line. The old manufacturing plant. Quoting from one <a title="Manufacturing Methodology" href="http://businessmanagement.suite101.com/article.cfm/manufacturing_methodology_influencing_factors" target="_blank">manufacturing methodology</a>:</p>
<blockquote><p><em>Manufacturing involves transforming raw materials into finished products. These products might be consumer or industrial products, or intermediate products used in further manufacture to produce consumer or industrial products. Manufacturing started as handicrafts by skilled craftsmen and has now become mainly a capital intensive activity that uses plant and machinery.</em></p></blockquote>
<p>So for centuries, all of our business schools have been teaching MBAs and managers how to manage within a manufacturing setting. Raw materials in, product out. The non-technical managers try to manage coders like they are on an assembly line. This was it! The reason behind the disconnect! Non technical managers do NOT understand how to work with and treat coders. Yet companies persist in putting them in charge of the coders.</p>
<p><strong>Path to Utpoia</strong></p>
<p>Coders are a unique breed of individual.  Most are completely happy to sit behind a flickering screen for 8-16 hours a day writing code. That is, until they feel like they are not appreciated. Most companies don&#8217;t care. They treat their employees much like manufacturing plants treat machinery. Work it to death with very little maintenance. When it breaks down, try to fix it. If it cannot be fixed, replace it. What these companies need to realize is, coders are NOT machinery.</p>
<p>A company who puts a technical manager in charge and offers great benefits (insurance and otherwise) to their coders is the place to work if you are looking for a salaried position. Anywhere else will be miserable. As soon as companies start to realize this, they will reduce turn over and begin to build a stronger company. This is why coders flock to companies like Google. They know how to treat the coders.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/eaBtd888NISOT-73JihXYbR5AbM/0/da"><img src="http://feedads.g.doubleclick.net/~a/eaBtd888NISOT-73JihXYbR5AbM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/eaBtd888NISOT-73JihXYbR5AbM/1/da"><img src="http://feedads.g.doubleclick.net/~a/eaBtd888NISOT-73JihXYbR5AbM/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/gRPBkRlQGs0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/08/how-to-treat-a-coder-a-geek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/08/how-to-treat-a-coder-a-geek/</feedburner:origLink></item>
		<item>
		<title>CakePHP Shell Not Seeing MySQL with MAMP Pro MAC</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/ghvACbpO81o/</link>
		<comments>http://blogchuck.com/2010/07/cakephp-shell-not-seeing-mysql-with-mamp-pro-mac/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 15:55:17 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=344</guid>
		<description><![CDATA[Connecting to MySQL on MAC with MAMP and CakePHP shells.]]></description>
			<content:encoded><![CDATA[<p>MAMP is a great product. It makes using the MAMP stack on MAC very easy. I liked it so much I actually purchased MAMP Pro. Installing was a breeze, configuration is simple, and it is up and running in no time. However, for some reason, when I am trying to connect to MySQL from a CakePHP shell, the database connection cannot be found.<span id="more-344"></span></p>
<p>The error I was getting was:</p>
<p><strong><em>Warning: mysql_connect(): [2002] No such file or directory (trying to<br />
connect via unix:///tmp/mysql.sock) in /Users/myuser/Sites/cakephp/cake/libs/model/datasources/dbo/dbo_mysql.php<br />
on line 540</em></strong></p>
<p>So I had to figure out what the issue was and resolve it. The solution was very simple. The error gives a clue. It turns out that CakePHP is looking for the mysql socket in <em>/tmp</em>. However, MAMP is running the socket in <em>/Applications/MAMP/tmp</em>. We just have to symbolically link the socket that CakePHP is looking for to the actual socket MySQL is running on in MAMP. This can be accomplished with the following command after MAMP Pro is running:</p>
<pre class="brush: sql; title: ; notranslate">
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
</pre>
<p>This will resolve the issue and MAMP will run as expected for CakePHP shell applications. I hope this helps.</p>
<p>Happy Coding!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/ShRtygokwD2AjjwadWgupWcdI0g/0/da"><img src="http://feedads.g.doubleclick.net/~a/ShRtygokwD2AjjwadWgupWcdI0g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ShRtygokwD2AjjwadWgupWcdI0g/1/da"><img src="http://feedads.g.doubleclick.net/~a/ShRtygokwD2AjjwadWgupWcdI0g/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/ghvACbpO81o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/07/cakephp-shell-not-seeing-mysql-with-mamp-pro-mac/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/07/cakephp-shell-not-seeing-mysql-with-mamp-pro-mac/</feedburner:origLink></item>
		<item>
		<title>Limit Data by User with CakePHP</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/jMzDsvjGF94/</link>
		<comments>http://blogchuck.com/2010/06/limit-data-by-user-with-cakephp/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 00:03:03 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Musings]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=331</guid>
		<description><![CDATA[How to limit data to a specific user in CakePHP]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-thumbnail wp-image-313" title="cake-logo" src="http://blogchuck.com/wp-content/uploads/2010/03/cake-logo-150x150.jpg" alt="CakePHP" width="150" height="150" />Through the years, I have realized there are two types of web applications.</p>
<ul>
<li>Community</li>
<li>Single User</li>
</ul>
<p>While there are certainly some hybrid combination&#8217;s of these classifications, all applications can be categorized into these two categories. For example PHPNuke. It&#8217;s a single login to a community. As a user, you can use all of the functionality in the application AND you can see other users, etc. While something like FaceBook for example is a Hybrid of community and single user. While you can allow other users to see your data and content, they cannot modify your data or settings. You own that and nobody else has access to it without your username and password.</p>
<p>So comes the question. How can I limit data to a specific user with CakePHP? I love the CakePHP framework. But I have never been able to get a straight answer from anyone on the proper &#8220;cakeish&#8221; way to limit data to a specific user. For example. Let&#8217;s say I want to build a check book balancing application. I want it to be available to multiple subscribers. While all subscribers have access to the same functionality, they do not all see or modify the same data. While their data should be limited, they may all have access to the same Bank. This means that any user should be able to see all the banks we currently support&#8230; for example.</p>
<p>I have searched the internet and posted to <a title="StackOverflow.com" href="http://stackoverflow.com/questions/3030209/how-to-limit-data-to-users-who-own-it-without-limiting-admin-users-in-cakephp" target="_blank">stackoverflow.com</a> trying to find the answer to this question. It is apparent that I am not the only one trying to figure this out. Add in the potential complexity to provide ADMIN routing and what you potentially have is a complicated mess of code if it is not done properly.</p>
<p>Well, search no more my Internet Friends! I think I have figured out the mess. I have been able to use a combination of things I have learned from <a title="Teknoid" href="http://teknoid.wordpress.com/2009/01/12/462/" target="_blank">here</a> and <a title="StudioCanaria" href="http://www.studiocanaria.com/articles/cakephp_auth_component_users_groups_permissions_revisited" target="_blank">here</a>. But ultimately, I had to build this with good old ingenuity and a lot of trial and error. Keep Reading!<span id="more-331"></span></p>
<p><strong>The Code</strong></p>
<p>To start out with, there has to be a way to determine if the user is an ADMIN or just a standard USER. This will require that we put a &#8216;roll&#8217; field in the users table. Here is what my table looks like.</p>
<pre class="brush: sql; title: ; notranslate">
--
-- Table structure for table `users`
--

CREATE TABLE `users` (
`id` char(36) NOT NULL,
`username` varchar(255) NOT NULL,
`password` varchar(40) NOT NULL,
`first_name` varchar(35) NOT NULL,
`last_name` varchar(35) NOT NULL,
`role` enum('admin','user') NOT NULL DEFAULT 'user',
`active` tinyint(4) NOT NULL DEFAULT '0',
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
</pre>
<p>There is nothing really new about this table. It&#8217;s fairly straight forward and a typical users table. I use an email address for the username.</p>
<p>Now, the thing to keep in mind is I want to limit all of the data a USER sees to her own data while allowing any global data. This means there are a few checks that must occur each time the user accesses the site. Now for the &#8220;magic&#8221; piece that will accomplish this.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class AppController extends Controller {
beforeFilter() {
 if ($this-&gt;isAdmin()) {
     $this-&gt;beforeAdminFilter();
 } else {
     $this-&gt;beforeUserFilter();
 }
}

function beforeAdminFilter() {
 if ($this-&gt;Auth-&gt;user('role') !== 'admin') {
   $this-&gt;Session-&gt;setFlash(sprintf(__('%s is not authorized!', true), 'User'));
   $this-&gt;redirect('/users');
 }
}

 function beforeUserFilter() {
   Configure::write('user_id', $this-&gt;Session-&gt;read('Auth.User.id'));
 }

 function isAdmin() {
   return (isset($this-&gt;params['admin']) &amp;&amp; $this-&gt;params['admin']) ? true : false;
 }
}
</pre>
<p>A few things I need to point out here. I use the <a title="StudioCanaria" href="http://www.studiocanaria.com/articles/cakephp_auth_component_users_groups_permissions_revisited" target="_blank">StudioCanaria</a> method for ACL. This is a great solution in my opinion. But I am not showing all of the code for that solution. It would make it more obscure and difficult to understand. This is just the vanilla portions I added in for my &#8220;limiting data&#8221; purposes.</p>
<p>Now for the more complicated part.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class AppModel extends Model {
 var $user_id;

function beforeFind($queryData) {
  if($this-&gt;user_id = Configure::read('user_id')){  // must be a user (not admin)
   if(isset($this-&gt;_schema['user_id'])) {
    if(isset($this-&gt;user_id)) {
     $queryData['conditions'][$this-&gt;name.'.user_id'] = $this-&gt;user_id;
    }
   }
   if($this-&gt;name == 'User') {
    $queryData['conditions'][$this-&gt;name.'.id'] = $this-&gt;user_id;
   }
  }
  return $queryData;
}

function beforeSave() {
 if($this-&gt;user_id = Configure::read('user_id')){    // must be a user (not admin)
  if(isset($this-&gt;_schema['user_id'])) {
   $this-&gt;data[$this-&gt;name]['user_id'] = $this-&gt;user_id;
  }
 }
 return true;
}

}
?&gt;
</pre>
<p>Isn&#8217;t this how it is suppose to be? The heaviest part of the code should be in the models? Well this is the part that does the heavy lifting. Basically this will restrict anything that is associated to a USER. Ok, let&#8217;s dive in and I will explain how it works.</p>
<p><strong>beforeFind</strong></p>
<p>This is the function that is called before any search is done on the data. Now, keep in mind the two caveats to this configuration. 1- Not all data is associated to a USER and 2) ADMIN users are not limited. With that in mind, let&#8217;s analyze this code.</p>
<pre class="brush: php; title: ; notranslate">
if($this-&gt;user_id = Configure::read('user_id')){  // must be a user (not admin)
</pre>
<p>This line establishes that we are in fact dealing with a USER. Notice I am using a &#8220;global variable&#8221;? This is so I can easily pass the data back and forth between the APP_CONTROLLER and MODEL_CONTROLLER.</p>
<p>Now comes the first part of the magic. Does this schema (Model) require a user_id field?</p>
<pre class="brush: php; title: ; notranslate">
if(isset($this-&gt;_schema['user_id'])) {
</pre>
<p>This will determine if we need to actually &#8220;limit&#8221; the data. It will prevent the user from seeing anything accept the users data. How? Because if we detect a USER_ID, we set the condition to limit the data by the current user_id of the user looking at the data.</p>
<pre class="brush: php; title: ; notranslate">
$queryData['conditions'][$this-&gt;name.'.user_id'] = $this-&gt;user_id;
</pre>
<p>The line before it is just because I am paranoid about my code breaking. So feel free to flame me about this:</p>
<pre>if(isset($this-&gt;user_id)) {</pre>
<p>But I will still leave it in. If you are comfortable taking it out, feel free. So there you have it. You are now limiting your $this-&gt;{MODEL}-&gt;find queries to a specific user. You will note that for the USER model, the user id is actually ID so I account for that in the next few lines. It is also important to note I use the standard foreign-key ID configuration common to good SQL practices. Any table associated to a user has the USER_ID as the foreign-key. I wont go into the horror stories of some of the things I have seen. (Including some of the work I have seen at Yahoo! while I have been consulting there.)</p>
<p>One more thing. If you have a beforeFilter in your model, it will override your app_model.beforeFilter. so you need to add the following:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class YourModel extends Model {
   // your code

  function beforeFilter(){
    parent::beforeFilter();  // &lt;==== this is the important part
    // your filter code here
  }

  // your code
}
?&gt;
</pre>
<p>Let&#8217;s continue.</p>
<p><strong>beforeSave</strong></p>
<p>This function is basically the same thing. However, as you may have guessed, it is to prevent a user from saving over another users data by chance they were able to randomly guess the ID.</p>
<p><strong>Conclusion</strong></p>
<p>There you have it! The only &#8220;user control&#8221; process for CakePHP that exists on the entire internet, at least that I am aware of. If you happen to know of another one that is more elegant, or you have a way to better improve this one, please drop a note in the comments. I find that many times I tend to overlook even some of the more simple solutions.</p>
<p>Happy Coding!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/9Og8iRFuAIyc24o6b2teLmgr6q0/0/da"><img src="http://feedads.g.doubleclick.net/~a/9Og8iRFuAIyc24o6b2teLmgr6q0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9Og8iRFuAIyc24o6b2teLmgr6q0/1/da"><img src="http://feedads.g.doubleclick.net/~a/9Og8iRFuAIyc24o6b2teLmgr6q0/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/jMzDsvjGF94" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/06/limit-data-by-user-with-cakephp/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/06/limit-data-by-user-with-cakephp/</feedburner:origLink></item>
		<item>
		<title>Single Login For Multiple User Types with CakePHP</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/rZhRKImgbqc/</link>
		<comments>http://blogchuck.com/2010/04/single-login-for-multiple-user-types-with-cakephp/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 13:11:07 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=326</guid>
		<description><![CDATA[Limit models to a specific subset of data using multiple models pointing to the same table.]]></description>
			<content:encoded><![CDATA[<p>I started working on a project that requires a single login for multiple user types. Because of the way my mind organizes things, I was having difficulty getting my mind around multiple models pointing to the same table in the database. It just felt messy. But I found this to be the best solution. I can provide single user login and keep the user functionality separated.</p>
<p>In this case, I have managers and tenants both pointing to the users table. I simply add a &#8216;type&#8217; column to the user table to track what type of user it is. Then in my callback methods on the models, I set the conditions for the beforeFind and the beforeSave within each model to it&#8217;s corresponding type. This keeps both the data it displays and the data it saves in check and accurate. Here is what my manager model looks like.</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
class Manager extends AppModel {

 var $name = 'Manager';
 var $useTable = 'users';

 // only return users where type = Manager
 function beforeFind($queryData) {
$queryData['conditions']['Manager.type'] = 'Manager';
return $queryData;
 }

 // Ensure the Type is set to Manager before saving this record
 function beforeSave() {
$this-&gt;data['Manager']['type'] = 'Manager';
return true;
 }

}

?&gt;
</pre>
<p>The same would apply to the tenants model. This works like a charm. It helps to provide excellent separation between user types without writing a lot of extra code to manage and check for the differences in user types.</p>
<p>Happy coding!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/zfKCFmRDTMjAW5Kqa_6Ab0mcfnQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/zfKCFmRDTMjAW5Kqa_6Ab0mcfnQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/zfKCFmRDTMjAW5Kqa_6Ab0mcfnQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/zfKCFmRDTMjAW5Kqa_6Ab0mcfnQ/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/rZhRKImgbqc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/04/single-login-for-multiple-user-types-with-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/04/single-login-for-multiple-user-types-with-cakephp/</feedburner:origLink></item>
		<item>
		<title>Is the customer always right?</title>
		<link>http://feedproxy.google.com/~r/JustChuck/~3/wSGlGADf9mM/</link>
		<comments>http://blogchuck.com/2010/03/is-the-customer-always-right/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 15:38:54 +0000</pubDate>
		<dc:creator>Chuck Burgess</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Ranting]]></category>

		<guid isPermaLink="false">http://blogchuck.com/?p=321</guid>
		<description><![CDATA[How do you bridge the gap between the customer (who doesn't know) and the developer (who should)?]]></description>
			<content:encoded><![CDATA[<p>I have had some discussions with a project manager about how we use technology and the decision making process behind it. During one such discussion I raised issues with the choice of technologies for the development of some tools we were developing. The debate came to an abrupt end when he said, &#8220;The customer is always right.&#8221; This got me thinking. Is that true? Should it be that way? <span id="more-321"></span>After we hung up the phone, I began doing research as to why the choice of technology was bad and why my suggestion was better. But I kept coming back to his statement, &#8220;The customer is always right.&#8221; How would I explain that this should NOT be held as a truth? In this case, I can&#8217;t. It will fall on deaf ears. However, I can still point out why that should NOT be used as a reason to do something &#8220;wrong&#8221; because the customer said so.</p>
<p>While reading an article at <a href="http://www.phparch.com/2010/03/10/programming-youre-doing-it-wrong/" target="_blank">PHP|Architect</a>, the author (<a href="http://twitter.com/mtabini" target="_blank">Marco Tabini</a>) said, &#8220;we’re moving from fad to fad without stopping to consider that  technology is a <em>tool</em> and not a substitute for our own  responsibility to make choices.&#8221; Yet when you take the path of &#8220;the customer is always right,&#8221; you remove from the equation what I consider part of your responsibility as the expert; the reason you were hired in the first place.</p>
<p>Allow me to provide an example for clarity. You are hired to build a website by Company Y. The business owner (the person you work for) say, &#8220;Chuck, I am a big fan of Cobol. I learned it in my college days. I can&#8217;t remember much about it except that there are 4 function areas or something like that, and it is good at crunching numbers. So your task is to build me a website that will crunch my analytics data and I want it done in Cobol. Go!&#8221;</p>
<p>What?! So is the customer right? Or do I have an obligation to explain why this is a bad thing? Where does the business owners request end and my obligation begin? Anyone in the computer industry today could say multiple things to this request like:</p>
<ul>
<li>it&#8217;s impossible</li>
<li>not gonna happen</li>
<li>this is a very bad idea</li>
<li>I quit</li>
</ul>
<p>But I cannot fathom anyone saying, &#8220;The customer is always right!&#8221; So what is the alternative?</p>
<p><strong>My Perspective</strong></p>
<p>I think the perspective &#8220;the customer is always right&#8221; does have some merit. But this does not mean the customer is God. Here is a better way to state it, &#8220;You can ask for WHAT you want, and I will tell you HOW you will get it.&#8221; This can sound a bit abrasive as it is so I will clarify.</p>
<p>No developer can go into a situation and pretend to know what the requirements of a project is without first talking about them with the customer. (The WHAT) Once a fair assessment of the situation is made, the developer SHOULD then be able to formulate the HOW to fulfill the requirements. When the customer defines the WHAT and the HOW, it&#8217;s akin to a Judge overseeing the trial of her brother who is being accused of murder. A HUGE conflict of interest to say the least. The customer (like the judge) should recuse themselves from the decision making process.</p>
<p>To help the customer recuse themselves, you need to be able to explain the WHY of the situation. Granted, most of us geeks tend to be social misfits and have difficulty explaining technology in &#8220;layman&#8221; terms. So it typically comes out something like, &#8220;Are you kidding? Cobol went out with New Coke and the TRS-80. It won&#8217;t support HTML, AJAX, or SQL. There are no existing APIs, so XML, JSON, and RESTful services are out. Not to mention it cannot use HTTP protocol and it wont send email whether it&#8217;s POP, IMAP, or otherwise. So why do you want to use Cobol?&#8221;</p>
<p>The customer will then do one of two things: 1- stare at you with glossy eyes as if he just visited a far away place on a very wonderful day dream -or- 2- do the unthinkable and say, &#8220;Make it happen!&#8221;</p>
<p><strong>The Dichotomy</strong></p>
<p>There seems to be dichotomy between the developer and the customer. This gap as it were, does not seem to be narrowing much. The average customer has no real desire to walk up to the edge of the technological precipice and peer in, and the developer usually lacks the skill to communicate things to those &#8220;not in the know&#8221; in an understandable way.</p>
<p>What can be learned from all of this? No! The customer is NOT always right. But it is the responsibility and obligation of the developer to say why in a way that the customer will understand. What do you think?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/19ZjGlg4C9T-iNHtkTs6payl0yE/0/da"><img src="http://feedads.g.doubleclick.net/~a/19ZjGlg4C9T-iNHtkTs6payl0yE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/19ZjGlg4C9T-iNHtkTs6payl0yE/1/da"><img src="http://feedads.g.doubleclick.net/~a/19ZjGlg4C9T-iNHtkTs6payl0yE/1/di" border="0" ismap="true"></img></a></p><img src="http://feeds.feedburner.com/~r/JustChuck/~4/wSGlGADf9mM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blogchuck.com/2010/03/is-the-customer-always-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blogchuck.com/2010/03/is-the-customer-always-right/</feedburner:origLink></item>
	</channel>
</rss>

