<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Tech Tid-bits</title>
	<atom:link href="http://amasses.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://amasses.wordpress.com</link>
	<description>I&#039;m writing this down so I don&#039;t forget it...</description>
	<lastBuildDate>Thu, 29 Apr 2010 13:14:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='amasses.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Tech Tid-bits</title>
		<link>http://amasses.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://amasses.wordpress.com/osd.xml" title="Tech Tid-bits" />
	<atom:link rel='hub' href='http://amasses.wordpress.com/?pushpress=hub'/>
		<item>
		<title>The &#8216;hidden&#8217; costs of a Rails website</title>
		<link>http://amasses.wordpress.com/2010/04/29/the-hidden-costs-of-a-rails-website/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/the-hidden-costs-of-a-rails-website/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:38:30 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[IT Consulting]]></category>
		<category><![CDATA[budget]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[costs]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[services]]></category>
		<category><![CDATA[websites]]></category>

		<guid isPermaLink="false">https://amasses.wordpress.com/?p=277</guid>
		<description><![CDATA[I need to get something out on the &#8216;internets&#8217; &#8211; running a website isn&#8217;t cheap. Don&#8217;t get me wrong &#8211; you can get away with running a site on almost zero dollars, and we&#8217;ve all heard about those sites running on someone&#8217;s PC under their desk&#8230; but what I&#8217;m touching on here is a &#8216;real&#8217; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=277&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I need to get something out on the &#8216;internets&#8217; &#8211; running a website isn&#8217;t cheap.</p>
<p>Don&#8217;t get me wrong &#8211; you can get away with running a site on almost zero dollars, and we&#8217;ve all heard about those sites running on someone&#8217;s PC under their desk&#8230; but what I&#8217;m touching on here is a &#8216;real&#8217; website.</p>
<p>I&#8217;m the only developer on a website which is somewhat large. Its no where near the level of the big news sites, or the social sites etc, but we get a fair amount of traffic and the codebase is big enough to keep me busy all the time. And to be honest my life would be much easier if I could just push out the latest version of the site and ignore everything else.</p>
<p>But lets be honest &#8211; large websites are complicated, there is always the change (more often then not) that there might be some bugs laying around, and on top of this performance can be an issue. And don&#8217;t even get me started on email and advertising. So what I now hope to accomplish is an inventory of all the &#8216;extras&#8217; which seem to get over looked, but are quite important, for a production website.</p>
<p><span id="more-277"></span><strong>Exception Handling</strong></p>
<p>No one likes to see error messages, but they&#8217;re unfortunately one of those things we have to live with &#8211; lets be honest, no one is perfect (I&#8217;m certainly not) &#8211; but even though we cant guarantee that errors won&#8217;t be a problem we should be ready to handle them properly and log them, so when the time comes and you have angry users complaining that your website isn&#8217;t working you can be rest-assured that you have any error details available to you without the hassle of asking the user what the error message was, what they were doing, what color t-shirt they had on&#8230; you get the picture.</p>
<p>There are a couple of options here, but the one I use for <em>everything</em> is <a title="Hoptoad from Thoughtbot" href="http://www.hoptoadapp.com" target="_blank">HopToad</a> from <a title="Thoughtbot" href="http://www.thoughtbot.com" target="_blank">Thoughtbot</a> &#8211; this is an extremely simple tool to use. Once your signed up online they give you some quick instructions which includes installing a plugin into your Rails application, then running a generator with an api key for your project, and then thats it &#8211; once you go live and if an error occurs Hoptoad sends you a nice email and makes all the details, including a backtrace, the URL the error happened at, the referring page, the environment variables etc, online and within reach.</p>
<p>There are, of course, free alternatives around, and if you really wanted you could just have your app email you when an error occurs, but I&#8217;m sure most people can relate to the situation where your inbox becomes flooded because you forgot to check for a nil? Yeah, Hoptoad prevents this exact problem.</p>
<p>And the cost? <strong>$15/month, for 16 projects</strong> &#8211; very affordable for what it provides, and there&#8217;s some extra bonuses you&#8217;ll stumble upon which make you think &#8216;wow this is worth it&#8217;.</p>
<p><strong>Application Performance</strong></p>
<p>So, errors we&#8217;ve covered. Next question &#8211; do you know how well your website is running? How do you know which areas are the slowest to run, and do you know what the user experience is like?</p>
<p>On this front as well there are a few options &#8211; you could quite easily run <a title="Request Log Analyzer at GitHub" href="http://github.com/wvanbergen/request-log-analyzer" target="_blank">Request Log Analyzer</a> and pass it your latest production log file, but thats not really a real time view, and if you want to look through historical periods its somewhat difficult, involving splitting out your logs based on time stamps &#8211; not my idea of fun.</p>
<p>RPM to the rescue &#8211; <a title="NewRelic" href="http://www.newrelic.com" target="_blank">NewRelic RPM</a> to be exact. I suppose that this is probably the best known &#8216;Rails&#8217; application around. Mind you, its not cheap, but for what it provides its actually invaluable for popular websites.  And what does it provide? Real time metrics, drill down trouble shooting, pretty graphs and more. Really, I&#8217;d just recommend that you give their free version a go &#8211; I&#8217;d wager that you will want to upgrade to get the extra features once you get a taste.</p>
<p>And on top of providing a great product they also sponsored the <a title="Scaling Rails screen cast series" href="http://railslab.newrelic.com/scaling-rails" target="_blank">Scaling Rails</a> screen cast series with <a title="Gregg Pollack at Envy Labs" href="http://envylabs.com/team" target="_blank">Gregg Pollack</a> &#8211; I&#8217;d highly recommend everyone checks out this series.</p>
<p>So how much will this set you back? It varies based on pricing level, but currently we pay about <strong>$200/month &#8211; and its worth every cent.</strong></p>
<p><strong>Server Monitoring</strong></p>
<p>Now we have errors covered off and application performance is taken care of what about your hosting infrastructure? If your using a Rails hosting specialist like Engine Yard or Rails Machine or similar then they&#8217;ve got this covered, skip on to the next point, but if you&#8217;ve rolled your own, be it with your own hardware, or on cloud infrastructure like EC2, it would be very wize to start collecting some metrics about how your machines are actually running.</p>
<p>Of course, there is a myriad of options here, so let me just focus on what we use, which is <a title="Server Density" href="http://www.serverdensity.com/" target="_blank">Server Density</a> &#8211; these guys make monitoring, alerting and metric collection as simple as making a sandwich (well, as long as it isn&#8217;t some fancy sandwich which requires some weird condiment you can only get by milking deep sea predator fish&#8230;). Sign up for an account, setup a server in their system, and once you&#8217;ve installed the Server Density agent, drop in the config details and wait.</p>
<p>Its extremely easy to setup alerts based on thresholds (such as memory free, CPU load, number of request for nginx or apache, even connections to MySQL or MongoDB), and they support notifications via Email, SMS and iPhone push as well (though to be honest, if you publish something controversial which generates some traffic the alerts can become a bit irritating). And if you want to monitor something they don&#8217;t support, and your a bit of a dab hand at Python, they have a brand spanking new plugin framework for you to use.</p>
<p>This has saved me a few times, especially being able to look back in time, see a spike, check out what was happening on my system at that time, and the simplicity is just awesome. Plus, they&#8217;ve been public adopters of MongoDB for their data collection and feedback to the community with their experiences.</p>
<p>Server Density &#8211; <strong>$10 (per server)</strong>, being able to tell your boss that the servers aren&#8217;t really on fire&#8230; priceless (yeah thats kind of lame, sorry).</p>
<p><strong>Email</strong></p>
<p>I&#8217;ve unfortunately discovered, more often then not, that sending emails from web applications is a bit of a thorn in the side (sure, Rails makes this a lot easier with ActionMailer providing views etc). Its not actually the sending thats the issue &#8211; anyone can put together some content and use a library like tmail, Pony, even ActionMailer to shoot off a message &#8211; the real issue is dealing with delivery problems.</p>
<p>Running on Amazon EC2, while amazingly flexible and cost effective, has a slight issue &#8211; the same things that make EC2 appealing to me also make EC2 appealing to spammers. And as a result there are a lot of RBLs, block lists etc, which don&#8217;t like emails from the EC2 address space. Plus, PTR records, you have no control over them.</p>
<p>So why risk the emails not being sent? And what about bounces &#8211; soft and hard, plus do you know what happened with the email after it was received?</p>
<p>I was initially introduced to <a title="SendGrid" href="http://www.sendgrid.net" target="_blank">SendGrid</a> through <a title="Heroku" href="http://www.heroku.com" target="_blank">Heroku</a> (that is another topic all together) &#8211; before that I was hacking about with smtp-tls and Google Apps SMTP to get my emails out. For the site that I work on now there were two options &#8211; use the SMTP server provided by the hosting company (before we moved to EC2), setup our own MTA, or use an external service. The decision time there was less then a second &#8211; straight away I was on the SendGrid page and registering for the company.</p>
<p>SendGrid makes things simple &#8211; I tell my app which SMTP settings to use, which authenticate, of course, and then I get everything I need from SendGrid straight away &#8211; I can turn on open and click tracking, so I know if users are &#8216;doing things&#8217; with the emails we send out, we have domains keys enabled automatically, plus we also get to see if there are any bounces of emails, and compare that to our outgoing amount (more shiny graphs).</p>
<p>And the total cost for this is <strong>$9 per month </strong>- perfect.</p>
<p><strong>To summarize</strong> this hasn&#8217;t covered everything we pay for externally &#8211; there are tools like <a title="Basecamp - you really should use this" href="http://www.basecamphq.com" target="_blank">Basecamp</a> (for the higher level project management and collaboration), <a title="Unfuddle, for your source code hosting and ticket management" href="http://www.unfuddle.com" target="_blank">Unfuddle</a> (for the development project management), <a title="ZenDesk - SaaS Helpdesk software" href="http://www.zendesk.com" target="_blank">Zendesk</a> (for helpdesk.. those pesky users) and <a title="MailChimp - for email campaigns (aka EDM)" href="http://eepurl.com/uM7_" target="_blank">MailChimp</a> (for email campaigns) we use, but its a case of &#8216;different strokes for different folks&#8217; &#8211; but what I&#8217;ve mentioned above are just the basics.</p>
<p>The real take away message here is that there are always other things you need to factor in when your considering when you figure out how much running a website is actually going to cost you. And if your wondering why you don&#8217;t just build this stuff your self.. well, sure, I&#8217;m not stopping you, I just feel that most times its smarter to pay for something already available rather then spending time reinventing the wheel, only to realize what you finished up with is missing a whole lot of stuff.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/277/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=277&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/the-hidden-costs-of-a-rails-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>iPhone web apps, its really *that* simple&#8230;</title>
		<link>http://amasses.wordpress.com/2010/04/29/iphone-web-apps-its-really-that-simple/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/iphone-web-apps-its-really-that-simple/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:15:05 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Home]]></category>

		<guid isPermaLink="false">http://30/2010/01/19/iphone-web-apps-its-really-that-simple</guid>
		<description><![CDATA[I have recently been working on a website currently undergoing a redevelopment process, which has an attempt at an iPhone specific website providing mobile formatted access to the content the site provides. Unfortunately, the current attempt is very poorly done. I&#8217;m not blaming the developers, in fact I can quite easily see how this could [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=39&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I have recently been working on a website currently undergoing a redevelopment process, which has an attempt at an iPhone specific website providing mobile formatted access to the content the site provides.</p>
<p>Unfortunately, the current attempt is <strong>very</strong> poorly done. I&#8217;m not blaming the developers, in fact I can quite easily see how this could be an afterthought or something which wasn&#8217;t high up on the priorities for this project at the moment (after all, launching the new site is the first major step, providing content to mobile devices can come later&#8230;) &#8211; but, the good news is that there is a simple and quick fix&#8230;</p>
<p>Introducing&#8230; <a href="http://www.jqtouch.com">jQTouch</a> &#8211; its really as simple as writing some <span class="caps">HTML</span> (and, perhaps sometimes some Javascript&#8230;).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=39&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/iphone-web-apps-its-really-that-simple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>Effective Email Marketing</title>
		<link>http://amasses.wordpress.com/2010/04/29/effective-email-marketing/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/effective-email-marketing/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:15:04 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[IT Consulting]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[newsletters]]></category>

		<guid isPermaLink="false">http://30/2009/12/10/effective-email-marketing</guid>
		<description><![CDATA[Do you send out direct email marketing. Let me clarify that &#8211; no, I&#8217;m not talking about spam &#8211; but solicited emails providing details about specials, upcoming events, even a newsletter or a mail out with changes to business hours? Ok, so if you were nodding your head to the above question, do you craft [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=37&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Do you send out direct email marketing. Let me clarify that &#8211; no, I&#8217;m not talking about spam &#8211; but solicited emails providing details about specials, upcoming events, even a newsletter or a mail out with changes to business hours?</p>
<p>            <span id="more-37"></span></p>
<p>Ok, so if you were nodding your head to the above question, do you craft up your email in your desktop or web-based email editor, put all the recipient addresses in the <span class="caps">BCC</span> field and hit send?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=37&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/effective-email-marketing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>The reason why I charge extra for sites that work on IE6</title>
		<link>http://amasses.wordpress.com/2010/04/29/the-reason-why-i-charge-extra-for-sites-that-work-on-ie6/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/the-reason-why-i-charge-extra-for-sites-that-work-on-ie6/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:15:02 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[charges]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://30/2009/11/13/the-reason-why-i-charge-extra-for-sites-that-work-on-ie6</guid>
		<description><![CDATA[A mild rant/explanation about Internet Explorer 6 and why I charge extra to support it&#8230; &#8216;What!?&#8217; you say, &#8216;You shouldn&#8217;t be charging to support IE6, it should just be included!&#8217; Well, yes, it should be included &#8211; if this were still 2005. But, its now 2009, and Internet Explorer 6 is over 8 years old [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=31&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A mild rant/explanation about Internet Explorer 6 and why I charge extra to support it&#8230;</p>
<p>            <span id="more-31"></span></p>
<p><strong>&#8216;What!?&#8217;</strong> you say, &#8216;You shouldn&#8217;t be charging to support <span class="caps">IE6</span>, it should just be included!&#8217;</p>
<p>Well, yes, it should be included &#8211; if this were still 2005. But, its now 2009, and Internet Explorer 6 is over 8 years old (released in 2001), and its also due to finish its support lifetime with Microsoft next year &#8211; but its not just because it is old.</p>
<p>Internet Explorer 6 is a huge pain in the proverbial. Granted, things have gotten much better as <span class="caps">IE7</span> and now <span class="caps">IE8</span> have been released, however the problem still exists with the fact that a large number of government departments are still 100% reliant on <span class="caps">IE6</span> and are trying to avoid upgrading at any cost.</p>
<p>I could rant on about this for hours, but its probably best to put this into more of a fiscal perspective &#8211; where, exactly, does the fee for <span class="caps">IE6</span>-compatible sites go?</p>
<p>The normal process of taking a website from design as a Photoshop design and transforming it into <span class="caps">HTML</span> templates usually touches on the following steps:</p>
<ul>
<li>Review of the <span class="caps">PSD</span> file, and, if required, labeling and grouping layers to streamline the slicing process.</li>
<li>Performing layer slicing and element slicing, naming the slices (the &#8216;cut up&#8217; sections of the design) and then exporting as <span class="caps">PNG</span> files, or <span class="caps">JPEG</span> files if they are photographs.</li>
<li>Coding up the basic structure of the page, and the base stylesheets. If the design was done using a design-grid in mind this process can be sped up by using a <span class="caps">CSS</span> framework (basically a pre-rolled set of stylesheets for layout) such as Blueprint, 960 Grid System or otherwise.</li>
<li>Layout of image element, whether they are background images, positional images, navigation buttons etc.</li>
<li>Adjusting the text look &#038; feel (the typography), tweaking things like line spacing, letter spacing, font weights and margins between sections.</li>
<li>Final polish and testing, including browser tests across platforms. Usually for this I will use something like <a href="http://litmusapp.com">Litmus</a> which allows me to test a page over 20+ different browsers &#8211; or, if required I can test manually using virtual machines.</li>
</ul>
<p>Usually, this is all I need to do. The end result is then handed off to the client after they sign off, and the world is at peace. Unfortunately this isn&#8217;t all if <span class="caps">IE6</span> support is a requirement.</p>
<p><strong>First off</strong> the bat is <span class="caps">IE6</span>&#8217;s abysmal support for transparent PNGs. Back in 2001 <span class="caps">PNG</span> was still an obscure image format being developed to overcome licensing limitations of <span class="caps">GIF</span>. While it wasn&#8217;t unused, it wasn&#8217;t as popular as <span class="caps">GIF</span>, and therefor <span class="caps">IE6</span> didn&#8217;t have full support for PNGs features, such as full 8-bit transparency. The result? Viewing a <span class="caps">PNG</span> in <span class="caps">IE6</span> would show up with a nasty grey &#8216;thingie&#8217; wherever transparency was supposed to show up.</p>
<p>There is, however, a solution for this &#8211; there is a DirectX filter which can be loaded for the image which will apply the transparency. The problem is that it is a <span class="caps">HUGE</span> hack, and this has to be done for every <span class="caps">PNG</span> file loaded. The advent of JavaScript libraries such as PngFix or jQuery plugins to do the same thing help out here, but its still a bit dodgy and just doesn&#8217;t feel right.</p>
<p>The alternative here is to use GIFs instead of <span class="caps">PNG</span>, however <span class="caps">GIF</span> only supports 1 level of transparency (transparent, or opaque) which doesn&#8217;t give a whole lot of flexibility to the demands of modern web design.</p>
<p><strong>Another issue</strong> is the support for <span class="caps">CSS</span> standards in Internet Explorer 6. There are numerous hacks within <span class="caps">CSS</span> to workaround, fix or trick IE into working with certain styles. Now, I can&#8217;t claim that IE is the only wrong-doer here &#8211; back in the &#8216;day&#8217; it seemed that it was each to his own, but browsers are coming into line and &#8216;playing&#8217; nice with <span class="caps">CSS</span> standards now, and considering that the last service pack for <span class="caps">IE6</span> was released in 2008 you would think that maybe they could include somehow the ability to signal to the browser that we want them to render stuff properly?</p>
<p>Alas, the work around is: Develop your stylesheet, make sure it looks right in everything other then <span class="caps">IE6</span>. Then, look at it in <span class="caps">IE6</span>, and spend hours figuring out how to apply styles, hacks and whatever to get around the layout and presentational issues which <span class="caps">IE6</span> causes, which you would then need to put into a separate stylesheet only to be loaded if <span class="caps">IE6</span> is present, otherwise these adjustments will alter the &#8216;working&#8217; layout files.</p>
<p>One of the issues with this is that the tooling available for sorting out these issues is very lacking. Normally I would open up Firefox, load up Firebug and debug away, but in <span class="caps">IE6</span> the most we have is the Internet Explorer Developer Toolbar, which, while more useful then nothing, is still like trying to climb a very slippery slope.</p>
<p>There is one terrible work around for a lot of positional issues like this &#8211; use tables. But now, everyone knows (or should know) that tables should only be used for Tabular data, not for layouts. Sorry, but its <span class="caps">CSS</span> all the way for me <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>The final thing</strong> I think I should touch on is JavaScript. Once again, everything is different, but coding to support IE, Mozilla, Opera, Safari etc etc was just hell some times. And certain <span class="caps">DOM</span> calls would only work in certain browsers. I still have memories of the browser-detection scripts to try and get some insight as to what is running to try and be as error-free as possible.</p>
<p>Thankfully now there is jQuery, which, I think I can honestly say, is the <strong>best</strong> JavaScript abstraction layer around today &#8211; if something like this had been around when I first started playing with Web Development I think everything would have been a lot less frustrating.</p>
<p>So, I guess now you can probably see why the extra charge.. But maybe you are wondering why not just include it as extra hours? Well, the thing is that I feel, as a web developer, it is partially my responsibility to educate my clients about these issues &#8211; continuing to use <span class="caps">IE6</span> is hindering the web, development and growth. It encourages bad practices and it enables Government departments to be lazy with their web application development. If I could see a time where I never have to see a notice like &#8216;this website works best in Internet Explorer 6 or Netscape Navigator&#8217; it will be a very happy day indeed (yes, <span class="caps">ATO</span>, I am looking at you and the <span class="caps">ABR</span> portal).</p>
<p>So, putting a charge on my quotes which says &#8216;Internet Explorer 6 Support/Compatibility&#8217; is my way of raising awareness.</p>
<p>This actually turned into a bit of a rant, but I guess it couldn&#8217;t hurt to say my piece&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=31&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/the-reason-why-i-charge-extra-for-sites-that-work-on-ie6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>Website Analytics, Monitoring and Management</title>
		<link>http://amasses.wordpress.com/2010/04/29/website-analytics/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/website-analytics/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:14:56 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Home]]></category>

		<guid isPermaLink="false">http://30/2009/09/15/website-analytics</guid>
		<description><![CDATA[For pretty much all websites I work on I like to ensure that there are proper analytics in place Hoptoad Google Analytics RPM<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=18&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For pretty much all websites I work on I like to ensure that there are proper analytics in place</p>
<ul>
<li>Hoptoad</li>
<li>Google Analytics</li>
<li><span class="caps">RPM</span></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=18&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/website-analytics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>Marketing Options</title>
		<link>http://amasses.wordpress.com/2010/04/29/marketing-options/</link>
		<comments>http://amasses.wordpress.com/2010/04/29/marketing-options/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 09:14:52 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[referrals]]></category>

		<guid isPermaLink="false">http://30/2009/08/24/marketing-options</guid>
		<description><![CDATA[Generally I feel that the best way to find work is word of mouth advertising. If you have done a good job for your clients and they&#8217;re pleased with your services its entirely possibly that referrals will start coming in &#8211; its kind of like a sort of &#8216;business karma&#8217; if you will. However when [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=11&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Generally I feel that the best way to find work is word of mouth advertising. If you have done a good job for your clients and they&#8217;re pleased with your services its entirely possibly that referrals will start coming in &#8211; its kind of like a sort of &#8216;business karma&#8217; if you will.</p>
<p>However when you&#8217;re breaking into a new market its a bit hard to get referrals, word of mouth advertising, or even testimonials if you haven&#8217;t work for anyone in that market &#8211; so what do you do?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=11&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/04/29/marketing-options/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>Managing your unruly javascript files</title>
		<link>http://amasses.wordpress.com/2010/03/28/managing-your-unruly-javascript-files/</link>
		<comments>http://amasses.wordpress.com/2010/03/28/managing-your-unruly-javascript-files/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 04:33:00 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[cleanup]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[revision]]></category>

		<guid isPermaLink="false">http://30/2010/03/28/managing-your-unruly-javascript-files</guid>
		<description><![CDATA[With any large web project there is always a lot of javascript following along. There are always some exception to the rule, but lets be honest, if your building a rich, interactive website you really have no choice but to use Javascript (well, ok, you could use Flash, but if you do I will have [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=274&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>With any large web project there is always a lot of javascript following along. There are always some exception to the rule, but lets be honest, if your building a rich, interactive website you really have no choice but to use Javascript (well, ok, you <strong>could</strong> use Flash, but if you do I will have to hunt you down and hurt you&#8230;), and after a while things start getting messy.</p>
<p>I&#8217;ve ended up in this situation &#8211; the Swellnet website was a project I inherited and is running a combination of Prototype and jQuery, and the scripts are <ins>all over the place</ins>. So, tonights project, before I start making the changes I have queued up, will be to try and untangle this mess.</p>
<p>So lets dig into it &#8211; but some points to note first:</p>
<ul>
<li>I&#8217;m not unit testing &#8211; if there were JS unit tests setup originally I would, of course, continue using them, however to create them at this point would be a futile effort, and I&#8217;d much rather go back and do this after the clean up. </li>
<li>Number of files, and file sizes aren&#8217;t necessarily a concern &#8211; we use <a href="http://synthesis.sbecker.net/pages/asset_packager">asset_packager</a> to bundle and pack our files into defined singular files (e.g. base libs etc).</li>
<li>Your means might vary &#8211; what works for me may not make sense to you, or just feel awkward &#8211; this is just a suggestion and showing you how I&#8217;ve accomplished the task.</li>
</ul>
<p>Ok.</p>
<h2>Remove duplication</h2>
<p>First step is lets get rid of the extra framework. Personally I dislike Prototype &#8211; I looked at it a few times, but it always seemed much more verbose then jQuery, and the whole loading up 5 different files for effects etc? Sorry, not my idea of fun.</p>
<p>Currently we are running jQuery in compatibility mode, which means that all calls to jQuery use the <strong>jQuery</strong> function name, instead of the <strong>$</strong> alias. This is helpful because we can look for calls out to Prototype by identifying the <code>$</code> calls. (Keep in mind that jQuery plugins etc will reference $ internally through the anonymous function in the plugin pattern).</p>
<p>Files Removed: prototype.js, scriptaculous.js, controls.js, effects.js, sound.js, dragdrop.js, slider.js, builder.js, carousel.js</p>
<p>Pulling out these files now means that there are a bunch of things dependent on the <code>$</code> alias which now don&#8217;t work &#8211; good! If this wasn&#8217;t the case there&#8217;s something weird going on <img src='http://s0.wp.com/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' /> </p>
<p>So, first off one of the plugins we use for tabs is failing to run. The method used to initialize the tabs uses the <code>dom:loaded</code> event, which we replace with <code>jQuery(function(){ ... })</code> &#8211; however thats not all we need to fix.</p>
<h3>Fixing up plugins</h3>
<p>The prototype plugins I&#8217;ve come across in this project are more or less classes, with their own functions in the Class.prototype object, and while its entirely possible to mush this into working with jQuery the best option is to rewrite it into a jQuery plugin.</p>
<h4>The code before:</h4>
<h4>The code after:</h4>
<p>Not a huge change, but the main thing is that the initialization code, which is at the footer of the first Gist, has now become: <code>jQuery("#newstabs, #hometabs, #searchtabs, #livebuoytabs").fabtabs();</code> &#8211; and it lives in the application.js file. Much nicer <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>The loaded events and scattered methods</h3>
<p>I have a feeling that this is something I picked up a while ago which formed a bad habit. I&#8217;ve always hated the idea of the <code>body onload="..."</code> way of doing Javascript when the dom has loaded, and when jQuery came along and I was introduced to using <code>jQuery(function() { ... });</code> I was glad to get away from the body tag, or attaching event handlers at the top or bottom of files etc.</p>
<p>But, unfortunately once I started using this everything went into that anonymous function. Sure, most of the stuff was jQuery operations, but when you have 20+ calls to jQuery, each with their own set of arguments, and most of them being anonymous functions, well&#8230; it gets a bit messy, and very hard to find what you&#8217;re looking for.</p>
<p>So, enter the hash.</p>
<h4>From messy to somewhat organized.</h4>
<p>I originally stumbled across this while watching a screencast from <a href="http://peepcode.com">Peepcode</a> on <a href="http://peepcode.com/products/jquery-ajax">jQuery+AJAX</a> (by the way, I would highly recommend a <a href="http://peepcode.com/products/unlimited">yearly subscriptions</a> &#8211; completely worth it!). The idea is simple: create a hash object, and make the values anonymous functions:</p>
<p>There&#8217;s a lot of room for me to refactor this a lot more, especially with the anonymous functions for jQuery operations &#8211; but this is a good start. The main benefit is I can see all the initializers without the mess of the operational code, and its very easy to jump between calls in RubyMine (caret over the function name, Command+B, and you&#8217;re there).</p>
<p>The overall result is nicer code, easier to maintain and navigate, and I no longer try to avoid changing the javascript for this site (well, for the public section anyways, the admin side still needs to be looked at). And, on top of that, there was a size reduction of about 30k &#8211; not really a lot, but every little bit counts!</p>
<p>So, once I clean up the admin side of things (part of a bigger project) its onto refactoring our nasty nasty <span class="caps">CSS</span> into <span class="caps">SASS</span> &#8211; who wants to help? Its only ~10k lines (yes, I did say ten thousand lines&#8230; don&#8217;t ask&#8230;).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/274/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/274/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/274/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=274&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/03/28/managing-your-unruly-javascript-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>The ethics of using software for your business</title>
		<link>http://amasses.wordpress.com/2010/02/19/the-ethics-of-using-software-for-your-business/</link>
		<comments>http://amasses.wordpress.com/2010/02/19/the-ethics-of-using-software-for-your-business/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 04:21:00 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[ethics]]></category>
		<category><![CDATA[expenses]]></category>
		<category><![CDATA[piracy]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://30/2010/02/19/the-ethics-of-using-software-for-your-business</guid>
		<description><![CDATA[Quite recently a person I know (lets call him Joe) received a new laptop, which was purchased for him, by his business partner, in lieu of payment (its important to note that for all intent and purposes this is a &#8216;business laptop&#8217; as it was purchased with the business funds and was invoiced to the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=263&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quite recently a person I know (lets call him Joe) received a new laptop, which was purchased for him, by his business partner, in lieu of payment (its important to note that for all intent and purposes this is a &#8216;business laptop&#8217; as it was purchased with the business funds and was invoiced to the business).</p>
<p>            <span id="more-263"></span></p>
<p>I&#8217;ve touch on <a href="http://blog.amasses.net/2009/9/17/business-demands-dedicated-tools">business tools</a> before, about how you really should have dedicated infrastructure like internet services and phone lines for your business, and not share this infrastructure with the rest of your home when you are in a home office (of course,  certain things like electricity and water and heating etc are a bit hard to separate).</p>
<p>Today I&#8217;m going to cover a different angle &#8211; lets discuss the software you use on your business computer &#8211; and particularly &#8211; <em>did you pay for it</em>?</p>
<p>A question was posed to me by Joe about Microsoft Office, does it come with the laptop etc, which I answered explaining the licensing etc, and said person went out and bought a copy of office &#8211; all things are good in the world.</p>
<p>Then there was a need for Photoshop to be installed on the laptop &#8211; after all, the editing of graphics, photos etc are a core part of this persons business. This turned out to be quite an issue, because&#8230; well Photoshop is an expensive piece of software &#8211; the last time I checked it was retailing for about AU$1,200 &#8211; but hey, its a big important tool and I&#8217;m pretty sure it cost a lot of money to develop. However, Joe didn&#8217;t want to pay so much for this software, and I was asked if I had a copy, or where he could find it and so on.</p>
<p>Lets just take a step back for a minute and consider something &#8211; I am a software developer &#8211; my lively hood more or less relies on people paying for and using my software, either directly or indirectly &#8211; so if I were to assist Joe in obtaining this software without paying for it then I would pretty much be hurting other developers &#8211; do you believe in Karma?</p>
<p>So, as you might expect I told Joe he should purchase the software, which Joe didn&#8217;t like, and an argument started boiling up &#8211; and currently I don&#8217;t actually think a good outcome has been found (but that is neither here nor there&#8230;).</p>
<p>The point which I want to get across is: <em>Sure, the software is expensive, but you use this as a core part of your business why shouldn&#8217;t you pay for it?</em></p>
<p>Lets say Joe has a client paying him $6000 for a job, and 50% of that job involves graphics work with Photoshop &#8211; theoretically you could say that Joe is making $3000 by using Photoshop for the clients work (well, and the labour involved), and that if he didn&#8217;t use Photoshop, or any other tool, he wouldn&#8217;t really get that $3000. In this case, why should Adobe be expected to not receive payment for the product they created which is helping Joe make money?</p>
<p>Business is all about doing things properly &#8211; the right way, and keeping things legit. We&#8217;ve all seen companies go down because they tried to take dodgy shortcuts, done poor work, failed to look after their staff or clients &#8211; so if you are running a business then you should <strong>probably</strong> do it the right way, and pay for the tools you use, right?</p>
<p>Unfortunately the fallacy is that computers have become cheap &#8211; this may be right for home use, but for business they are still a very important tool and they still <em>cost money</em>.</p>
<p>So, my message to take home here is <em>if you are using a software product for your business, then you should pay for it and be properly licensed</em>- how would you feel, or how much would your business suffer, if people were taking your creations without paying you and then using them to make money for themselves? Eventually what goes around will come back around.</p>
<p>Take note of this Joe, seriously, just pay for the software &#8211; you <strong>wont</strong> actually miss the $1,200, and its actually a business expense, so use it for taxation purposes.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/263/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/263/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/263/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=263&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/02/19/the-ethics-of-using-software-for-your-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
		<item>
		<title>Grand Central Dispatch and MacRuby</title>
		<link>http://amasses.wordpress.com/2010/01/26/grand-central-dispatch-and-macruby/</link>
		<comments>http://amasses.wordpress.com/2010/01/26/grand-central-dispatch-and-macruby/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 00:32:00 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[macruby]]></category>
		<category><![CDATA[threading]]></category>
		<category><![CDATA[utilities]]></category>
		<category><![CDATA[\"grand central dispatch\"]]></category>

		<guid isPermaLink="false">http://30/2010/02/19/grand-central-dispatch-and-macruby</guid>
		<description><![CDATA[I recently put together a little utility application to bundle some repetitive tasks within a project I&#8217;ve been working on into a UI with a console output (namely push to git and then deploy with capistrano). Because I&#8217;m still not entirely comfortable with Objective-C, and I&#8217;m still reading up on the Cocoa framework I decided [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=40&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I recently put together a little utility application to bundle some repetitive tasks within a project I&#8217;ve been working on into a UI with a console output (namely push to git and then deploy with capistrano).</p>
<p>            <span id="more-40"></span></p>
<p><img src="http://amasses.net/files/MacRuby.jpg" width="480" align="left" alt="MacRuby image from http://blog.anthonyburns.co.uk/" /></p>
<p>Because I&#8217;m still not entirely comfortable with Objective-C, and I&#8217;m still reading up on the Cocoa framework I decided to build my app using MacRuby so I could blend what I&#8217;m good at with some new things as well, and a shiny interface.</p>
<p>The whole process was actually really good &#8211; XCode is set up with the MacRuby application templates when you install the latest build, and setting up <code>IBOutlets</code> and <code>IBActions</code> is as simple as using <code>attr_accessor <img src='http://s1.wp.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> utlet_name</code> and <code>def action_name(sender)</code> &#8211; how much simpler can you get?</p>
<p>So things were running pretty smoothly with my test commands, everything was returning quickly, the console output was being appended as expected&#8230; until I switched my commands to something which was a bit more longer running &#8211;
<pre>git push</pre>
<p>. Why is this an issue? It all comes down to Blocking, and UI Responsiveness&#8230;.</p>
<p><img src="http://amasses.net/files/beachball.png" alt="Spinning Beachball!" width="150" align="right" /> Unfortunately the backtick, popen and popen3 methods all hold onto the executing thread until they are done, and if this is in your main thread (the UI Thread), which would normally be the case if you are responding to a button click event, you going to see the &#8216;spinning beach ball of doom!&#8217;.</p>
<p>Fortunately in the latest release of MacRuby (currently 0.5 beta) support for Grand Central Dispatch (note: you&#8217;ll need Snow Leopard for this&#8230;) is included and makes the whole threading, synchronisation, locks etc as simple as a few lines of code&#8230; So how is it done?</p>
<pre>
    DISPATCH_QUEUE = Dispatch::Queue.new("net.amasses.app_name.queue_name")

    DISPATCH_QUEUE.dispatch do
        IO.popen(full_cmd) do |streamer|
          while line = streamer.gets
              Dispatch::Queue.main.dispatch { console_output.insertText line }
          end
        end

        Dispatch::Queue.main.dispatch do
          console_output.insertText "\r\r Done \r\r"
          go_button.setEnabled true
        end
    end
</pre>
<p>So, a few small points.<br />
1. The <code>DISPATCH_QUEUE.dispatch do</code> block basically tells the runtime to execute anything within this block on the new queue thread. Yes, it is that simple.<br />
2. If you want to do things with your UI you will need to switch back to the main (or UI) queue &#8211; this is done with <code>Dispatch::Queue.main</code> and it acts just like a regular dispatch queue.</p>
<p>Keep in mind that your means might vary, and I haven&#8217;t even dipped my toes into locks and synchronization with Semaphores, but from what I have seen (and how I understand it) it isn&#8217;t much harder then what you see here.</p>
<p>Enjoy!</p>
<p>MacRuby header image from <a href="http://blog.anthonyburns.co.uk/">http://blog.anthonyburns.co.uk/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=40&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2010/01/26/grand-central-dispatch-and-macruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>

		<media:content url="http://amasses.net/files/MacRuby.jpg" medium="image">
			<media:title type="html">MacRuby image from http://blog.anthonyburns.co.uk/</media:title>
		</media:content>

		<media:content url="http://amasses.net/files/beachball.png" medium="image">
			<media:title type="html">Spinning Beachball!</media:title>
		</media:content>
	</item>
		<item>
		<title>So, you&#8217;ve got a virus&#8230;.?</title>
		<link>http://amasses.wordpress.com/2009/12/09/so-you-ve-got-a-virus/</link>
		<comments>http://amasses.wordpress.com/2009/12/09/so-you-ve-got-a-virus/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 08:10:00 +0000</pubDate>
		<dc:creator>Matthew Savage</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Home]]></category>
		<category><![CDATA[IT Consulting]]></category>
		<category><![CDATA[it]]></category>
		<category><![CDATA[musings]]></category>
		<category><![CDATA[protection]]></category>
		<category><![CDATA[recommendations]]></category>
		<category><![CDATA[virus]]></category>
		<category><![CDATA[worm]]></category>
		<category><![CDATA[\"business continuity\"]]></category>

		<guid isPermaLink="false">http://30/2009/12/09/so-you-ve-got-a-virus</guid>
		<description><![CDATA[I am sure this is the dread of almost every company &#8211; computers start acting up, a large number of bouncing emails start happening, and suddenly things are looking unusual&#8230; Surprisingly enough, in 2009, this is still a very common occurrence &#8211; a virus or worm infection. If you&#8217;re running off one computer sometimes it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=36&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I am sure this is the dread of almost every company &#8211; computers start acting up, a large number of bouncing emails start happening, and suddenly things are looking unusual&#8230;</p>
<p>            <span id="more-36"></span></p>
<p>Surprisingly enough, in 2009, this is still a <strong>very</strong> common occurrence &#8211; a virus or worm infection. If you&#8217;re running off one computer sometimes it isn&#8217;t so bad, or, sometimes (if you forgot to backup) it can be a catastrophe. What is even worse is if you are running on a network, which is almost like virus heaven &#8211; one machine becomes infected and suddenly it is spreading everywhere.</p>
<p>Unfortunately I become aware of an incident this morning affecting a small-medium company with about 3 networked servers and an unknown number of workstations, and they are, for the most part, infected with a virus/worm which is propagating via network shares, <span class="caps">AND</span> email, so, a large number of bouncing back emails of course. The fix? At the moment we aren&#8217;t sure &#8211; while the systems had Antivirus running, it obviously wasn&#8217;t good enough &#8211; whether that was because it was out of date or otherwise &#8211; and the decision will be made tomorrow if I should go and visit them to work on the system directly and, if need be, prepare for a rebuild of their systems.</p>
<p>Working previously as a computer technician, and later as a consultant, I was amazed at the number of people who didn&#8217;t use Antivirus products, or, who had a system which was out of date. Unfortunately the problem seems to be one of money. It seems that once $1500+ has been forked out for a system, along with software like office etc, the idea of having to pay another $100 for Antivirus tools, as well as pay a fee each year to download the updates automatically seems to be kicking sand in the face of the consumer.</p>
<p>Perhaps the issue here is education? When you buy a car you are required to get compulsory third party insurance before being allowed to register it &#8211; what if Antivirus was advertised as the same? What if, when you bought a computer, you paid an &#8216;insurance&#8217; premium which included things like  your antivirus subscriptions and whatever else is needed now days?</p>
<p>So, what should you really do?</p>
<p>Before anything at all I&#8217;d really really recommend backups. People might read this and start off on the &#8216;it is too hard&#8217; excuse, but there are services which will backup all of your data, encrypted, off site for $5/month. Install it, set it up and forget &#8211; how hard can that be? And this kind of thing is really something you need <strong>before</strong> any potential problems occur &#8211; trust me on this one &#8211; there is no point backing up infected files&#8230;</p>
<p>The other thing is to keep your Antivirus tools up to date. Personally I don&#8217;t have a favourite at the moment &#8211; it has been a while since I&#8217;ve really been in the retail industry so I&#8217;m no longer qualified to give a full recommendation, but it isn&#8217;t hard to find what you need.</p>
<p>And if/when a virus strikes?</p>
<p><strong>Call a professional</strong> &#8211; if your data is important to you I don&#8217;t think it is really an option to be worrying about finances. The longer you continue to use your system, the more time that the virus has to cause damage or make changes to your files.</p>
<p>It might help to think about it in the following terms: How much will 2 days of downtime cost you (or if you loose everything, how much will it cost to get back on board?) &#8211; then compare it to how much it would cost to have a professional work on your system for half a day at a minimum. I think you might find that <strong>hiring a professional will be much more affordable</strong></p>
<p>As with everything, your means might vary, but its important to try and spend some time on this. I feel that people still see IT as an expense and something that doesn&#8217;t have a return, but now pretty much everything depends on IT you can&#8217;t afford to be without your systems&#8230;</p>
<p>One final thing I should probably mention is that 99.9% of the time when I deal with a virus infection I prefer to wipe the machine clean and start from scratch. While this seems somewhat drastic there is always a chance that reinfection will occur. So, something to keep in mind &#8211; you may be able to squash the infection but you never know when it might pop up again&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/amasses.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/amasses.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/amasses.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=amasses.wordpress.com&amp;blog=13387512&amp;post=36&amp;subd=amasses&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://amasses.wordpress.com/2009/12/09/so-you-ve-got-a-virus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b329ebd5f73143f70e2801dcfbfb914f?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">amasses</media:title>
		</media:content>
	</item>
	</channel>
</rss>
