<?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>A Beautiful Blog</title>
	
	<link>http://www.abeautifulsite.net/blog</link>
	<description />
	<lastBuildDate>Wed, 13 Mar 2013 05:16:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/abeautifulsite" /><feedburner:info uri="abeautifulsite" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Coda and Transmit Can’t Delete Files</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/mUaMKgcIL1A/</link>
		<comments>http://www.abeautifulsite.net/blog/2013/03/coda-and-transmit-cant-delete-files/#comments</comments>
		<pubDate>Wed, 13 Mar 2013 05:15:41 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1877</guid>
		<description><![CDATA[I recently came across an issue where Coda and Transmit would just appear to hang when deleting files on my local machine. Fortunately, the good folks at Panic were able to identify the issue. Turns out, it&#8217;s a OS X bug. Here was their response via Twitter: It&#8217;s a bug in Mac OS X. It affects a <a class="more-link" href="http://www.abeautifulsite.net/blog/2013/03/coda-and-transmit-cant-delete-files/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>I recently came across an issue where Coda and Transmit would just appear to hang when deleting files on my local machine. Fortunately, the good folks at <a href="http://www.panic.com/">Panic</a> were able to identify the issue. Turns out, it&#8217;s a OS X bug.<span id="more-1877"></span></p>
<p>Here was their <a href="https://twitter.com/panic/status/299962419038535680">response</a> via Twitter:</p>
<blockquote><p>It&#8217;s a bug in Mac OS X. It affects a lot of seemingly unrelated things. We&#8217;re hoping Apple fixes it shortly.</p></blockquote>
<p>The workaround is to run this from the terminal:</p>
<pre>sudo killall -KILL appleeventsd</pre>
<p>I&#8217;m posting it here because I keep having to hunt for it every time the issue comes up, and there are bound to be others that need it. For more details on the bug, check out <a href="http://d43.me/blog/1511/show-in-finder-not-working-in-mountain-lion/">this post</a>.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/mUaMKgcIL1A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2013/03/coda-and-transmit-cant-delete-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2013/03/coda-and-transmit-cant-delete-files/</feedburner:origLink></item>
		<item>
		<title>Scheduled Tasks Not Running on Media Temple DV 4.0</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/TD1DAUqALy8/</link>
		<comments>http://www.abeautifulsite.net/blog/2013/02/scheduled-tasks-not-running-on-media-temple-dv-4-0/#comments</comments>
		<pubDate>Tue, 26 Feb 2013 08:16:37 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1863</guid>
		<description><![CDATA[Scheduled tasks (or &#8220;cronjobs&#8221;) are useful for executing scripts on your server at various intervals of time. They&#8217;re fairly easy to setup in Plesk 11, which comes with Media Temple&#8217;s Dedicated Virtual (DV) 4.0 systems. However, if you&#8217;re using something like curl in your task, it may not appear to work. Your first thought will probably be, <a class="more-link" href="http://www.abeautifulsite.net/blog/2013/02/scheduled-tasks-not-running-on-media-temple-dv-4-0/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Scheduled tasks (or &#8220;cronjobs&#8221;) are useful for executing scripts on your server at various intervals of time. They&#8217;re fairly easy to setup in Plesk 11, which comes with Media Temple&#8217;s Dedicated Virtual (DV) 4.0 systems. However, if you&#8217;re using something like <code>curl</code> in your task, it may not appear to work.<span id="more-1863"></span></p>
<p>Your first thought will probably be, &#8220;why isn&#8217;t my cronjob running?&#8221; So you check the settings and they all look good. You verify the command letter-by-letter, and even paste the URL into a browser to make sure it&#8217;s right. And it is. What the&#8230;?</p>
<p>Actually, your cronjob probably <em>is</em> running as expected. The problem is that the FTP user doesn&#8217;t have permission to run bash commands. Luckily, that&#8217;s easy to fix.</p>
<ol>
<li><span style="line-height: 13px;">Login to Plesk</span></li>
<li>Select <code>Domains</code></li>
<li>In the section with your domain, select <code>Manage Hosting</code></li>
<li>Under <code>Websites &amp; Domains &gt; More</code>, select <code>Web Hosting Access</code></li>
<li>Change the <code>Access to the Server over SSH</code> dropdown to <code>/bin/bash</code>, as shown here:</li>
</ol>
<p style="text-align: center;"><img class=" wp-image-1864 aligncenter" alt="scheduled-task-fix" src="http://abeautifulsite.net/blog/wp-content/uploads/2013/02/scheduled-task-fix.png" /></p>
<p>That&#8217;s it, hit <code>OK</code> and your cronjobs will start running as expected. Just keep in mind that this assumes you&#8217;re using the Service Provider view in Plesk. You&#8217;ll have to dig around if you&#8217;re using another view, but the option shouldn&#8217;t be too hard to find.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/TD1DAUqALy8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2013/02/scheduled-tasks-not-running-on-media-temple-dv-4-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2013/02/scheduled-tasks-not-running-on-media-temple-dv-4-0/</feedburner:origLink></item>
		<item>
		<title>Sending Emails with Postmark and PHP</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/Lmu0tmS2uBc/</link>
		<comments>http://www.abeautifulsite.net/blog/2013/02/sending-emails-with-postmark-and-php/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 03:07:58 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1854</guid>
		<description><![CDATA[Sending emails from your app can suck. Half the time, messages that get sent from your own server just get dumped into the recipient&#8217;s junk folder. The truth is, successfully delivering emails from your app to your users can be a painstaking task. That&#8217;s why we decided to use Postmark for one of our latest projects. <a class="more-link" href="http://www.abeautifulsite.net/blog/2013/02/sending-emails-with-postmark-and-php/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Sending emails from your app can suck. Half the time, messages that get sent from your own server just get dumped into the recipient&#8217;s junk folder. The truth is, successfully delivering emails from your app to your users can be <a href="http://stackoverflow.com/questions/371/how-do-you-make-sure-email-you-send-programmatically-is-not-automatically-marked">a painstaking task</a>. That&#8217;s why we decided to use <a href="https://postmarkapp.com/">Postmark</a> for one of our latest projects.</p>
<p><span id="more-1854"></span></p>
<p>Postmark is an app that makes sending emails from your own app easy. Once you get things setup, your emails are almost guaranteed to hit your users&#8217; inbox. They take care of all the difficult stuff:</p>
<blockquote><p>We handle things like whitelisting, ISP throttling, reverse DNS, feedback loops, content scanning, and delivery monitoring to ensure your emails get to the inbox.</p></blockquote>
<p>Once you create an account and get things setup on Postmark&#8217;s website, sending an email is a simple call to their API. (Bonus feature: Postmark also handles <a href="https://postmarkapp.com/inbound">inbound emails</a> if you need that capability.)</p>
<p>The only problem is that they don&#8217;t have a PHP SDK, so they rely on third party libraries to get the job done. Here is our take on writing a minimalistic function to send emails using the Postmark API.</p>
<h2>The Code</h2>
<p>Before we start, we&#8217;ll need to define our Postmark API key. Let&#8217;s do that with a constant:</p>
<pre>define('POSTMARK_API_KEY', 'YOUR-API-KEY-HERE');</pre>
<p>Now for the function. For the sake of simplicity, we&#8217;re going to call it <code>send_email</code>. The function accepts an array to determine what to send. A quick glance at the function will show you all the options you can specify, which are mapped to the values found in the <a href="http://developer.postmarkapp.com/developer-build.html#message-format">documentation</a>. Optionally, you can specify <code>$response</code> and <code>$http_code</code> to get the resulting JSON response and HTTP code that Postmark sends back:</p>
<pre class="php">function send_email($email, &amp;$response = null, &amp;$http_code = null) {

    $json = json_encode(array(
        'From' =&gt; $email['from'],
        'To' =&gt; $email['to'],
        'Cc' =&gt; $email['cc'],
        'Bcc' =&gt; $email['bcc'],
        'Subject' =&gt; $email['subject'],
        'Tag' =&gt; $email['tag'],
        'HtmlBody' =&gt; $email['html_body'],
        'TextBody' =&gt; $email['text_body'],
        'ReplyTo' =&gt; $email['reply_to'],
        'Headers' =&gt; $email['headers'],
        'Attachments' =&gt; $email['attachments']
    ));

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://api.postmarkapp.com/email');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Accept: application/json',
        'Content-Type: application/json',
        'X-Postmark-Server-Token: ' . POSTMARK_API_KEY
    ));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    $response = json_decode(curl_exec($ch), true);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $http_code === 200;

}</pre>
<p>And here&#8217;s how we send an email:</p>
<pre class="php">$sent = send_email(array(
    'to' =&gt; 'you@yourdomain.com',
    'from' =&gt; 'Me &lt;me@mydomain.com&gt;',
    'subject' =&gt; 'That was easy',
    'text_body' =&gt; 'This will be shown to plain-text mail clients',
    'html_body' =&gt; '&lt;html&gt;&lt;body&gt;But &lt;em&gt;this&lt;/em&gt; will be shown to HTML mail clients&lt;/body&gt;&lt;/html&gt;'
), $response, $http_code);

// Did it send successfully?
if( $sent ) {
    echo 'The email was sent!';
} else {
    echo 'The email could not be sent!';
}

// Show the response and HTTP code
echo '&lt;pre&gt;';
echo 'The JSON response from Postmark:&lt;br /&gt;';
print_r($response);
echo 'The HTTP code was: ' . $http_code;
echo '&lt;/pre&gt;';</pre>
<h2>Room For Improvement</h2>
<p>This function could easily be transformed into a PHP class, and probably should for more serious applications. As-is, you still need to manually handle base64 encoding for file attachments, there&#8217;s no programmatic way to use SSL (just change the <code>http</code> to <code>https</code> in the URL), and there&#8217;s no timeout for the cURL operation. However, this will get you started using Postmark quickly, so feel free to use it as a starting point in your own app!</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/Lmu0tmS2uBc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2013/02/sending-emails-with-postmark-and-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2013/02/sending-emails-with-postmark-and-php/</feedburner:origLink></item>
		<item>
		<title>Tips for the Aspiring Web Developer</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/K7Mv-aN12nQ/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/12/tips-for-the-aspiring-web-developer/#comments</comments>
		<pubDate>Mon, 17 Dec 2012 08:34:10 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1777</guid>
		<description><![CDATA[So you want to be a web developer&#8230;excellent choice! It&#8217;s a very rewarding position that can be a lot more fun than most other programming jobs. However, before you take the plunge into a career in web development, there are a few things you should probably consider. A Different Way of Life I&#8217;m not going <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/12/tips-for-the-aspiring-web-developer/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>So you want to be a web developer&#8230;excellent choice! It&#8217;s a very rewarding position that can be a lot more fun than most other programming jobs. However, before you take the plunge into a career in web development, there are a few things you should probably consider.</p>
<p><span id="more-1777"></span></p>
<h2>A Different Way of Life</h2>
<p>I&#8217;m not going to start by telling you that you&#8217;ll be working in at least five different programming languages on a daily basis. Nor am I going to talk about the rapidly changing technologies and standards that you&#8217;ll need to keep up with. And I&#8217;m not even going to mention the multitude of browser quirks that will keep you up into early hours of the morning. All that will come with experience. My goal is to help you understand the type of career—or perhaps the <em>lifestyle</em>—that you&#8217;re about to undertake.</p>
<p>As a web developer, the type of organization you work for makes a huge difference in how your career will evolve. Chances are, if you&#8217;re seriously considering web development as a career, you&#8217;ve already spent some of your own time dabbling in HTML, CSS, JavaScript, and one or more server-side scripting languages. You probably discovered how much fun it can be to make something that millions of people could potentially see. If so, you have passion&#8230;and that&#8217;s a good thing.</p>
<h2>It&#8217;s OK to be Passionate</h2>
<p>Passion drives creativity. It&#8217;s what keeps you working on something for hours on end simply because you want to. It&#8217;s what eats away at your nights and weekends. It&#8217;s what sucks the spirit out of your social life. If you don&#8217;t have that drive, chances are you&#8217;re not going to enjoy being a web developer.</p>
<p>In my experience, passionate people tend to have their own way of doing things. The countless hours they spend educating themselves outside the realm of academia gives them insight that people without that dedication will never understand. They change their methods as technology evolves, are generally forward-thinking, and appreciate the &#8220;laws&#8221; of the web. They take their time to do things right. They care about quality, their user&#8217;s experience, and the final product. Employers don&#8217;t always like that, but that doesn&#8217;t mean it&#8217;s a bad thing.</p>
<h2>&#8220;Right&#8221; is Not Always Right</h2>
<p>Over the past decade, I&#8217;ve had the opportunity to work (as a web developer) for a manufacturing company, an academic institution, numerous web design firms (as a contractor), and for myself. I surround myself as much as possible with individuals who are in the same field as I am. Through many experiences and many discussions, I&#8217;ve come to realize that doing the &#8220;right&#8221; thing is not always what employers want you to do, particularly when budgets and deadlines are involved.</p>
<p>That&#8217;s a hard realization to come to when you&#8217;re passionate about what you do. Maybe you wanted to spend extra time refactoring that code you wrote—it &#8220;works&#8221;, but there&#8217;s a better way to do it—except the budget doesn&#8217;t allow for it. Maybe the client needed it out yesterday and you don&#8217;t have time to finish polishing off the interface you&#8217;ve been working on. Everyone&#8217;s going to know you&#8217;re responsible for it, but it&#8217;s not perfect yet and people may think your work is substandard. These things can be hard to deal with as a developer, so be prepared to sacrifice the quality of your work—or put in extra time off-the-clock—when budgets and timelines don&#8217;t permit.</p>
<h2>Never Stop Learning</h2>
<p>Where you work also plays a role in how your skills as a web developer evolve. Organizations tend to have their own standards and best practices in place that may or may not be as current as the rest of the world. I&#8217;ve seen design firms who are at least 10 years behind in their development methodologies. Their employees aren&#8217;t encouraged and, in some cases, aren&#8217;t permitted to use modern technologies and techniques. While this is obviously terrible for the organization, it&#8217;s also detrimental to the development of its employees.</p>
<p>If you find yourself in this position at any point in your career, you should talk to your management about the policies that are holding your organization back. If they&#8217;re too close-minded to consider anything outside their comfort zone, it may be time to find a position elsewhere. When there&#8217;s no opportunity to learn new things, you&#8217;ll likely get burned out and fall behind new trends in technology. That makes you less attractive to future employers, and overall, it&#8217;s really not much fun.</p>
<p>Additionally, it&#8217;s OK to make mistakes provided you learn from them. Always, always, always learn from your mistakes. And don&#8217;t be afraid to admit when you screw up. You&#8217;re human. It will happen. Owning up to things will garner you far more respect and wisdom than placing the blame on someone or something else.</p>
<h2>Be Prepared to Give Up Sleep</h2>
<p>There have been many, many, many nights where I&#8217;ve watched the sun set, then rise, and then set again. It doesn&#8217;t happen every day, but it happens. It&#8217;s something you have to expect as a developer. Whether it&#8217;s your own product launch or a really long workday that got prolonged because a server crashed, it&#8217;s going to happen.</p>
<p>Even when I had an eight-to-five job, there were still nights where important things needed to be done. A lot of times that meant working through the night. In fact, many tech positions share this quality, and developers are definitely no exception.</p>
<h2>Find a Routine</h2>
<p>It&#8217;s not always possible, but following a routine as often as you can will reduce stress, anxiety, and fatigue. Eat at the right times and try to get enough sleep. If you get caught up in a day from hell that shatters your daily routine (which you will at some point), do what you can to get back on track.</p>
<p><em>I can&#8217;t stress this point enough</em>.</p>
<p>Put down your phone when it&#8217;s bedtime. Wake up when your alarm goes off. If you set aside some time for your significant other or your friends, give yourself that time to recenter. This may seem to contradict some of the points I&#8217;ve made previously, but this type of career isn&#8217;t just a career—it&#8217;s a lifestyle. You have to know how to balance things. Realize your limits and know when to keep going, but also know when to stop.</p>
<p>It&#8217;s not as easy as it sounds. In fact, it&#8217;s something that I continue to have problems with after many years in the field. However, when I do get back into a routine, I notice a clear difference in my attitude, health, performance, and overall well-being. This is really more of an issue for freelancers and startups, but even the eight-to-fiver can benefit from following a good daily routine.</p>
<h2>Exercise Your Mind <em>and </em>Your Body</h2>
<p>This is another thing that a lot of web developers who I meet seem to neglect. No matter how many hours you spend doing it, a code marathon isn&#8217;t going to make your body healthy. And if your body isn&#8217;t healthy, your mind will suffer.</p>
<p>Make it part of your routine. Spend <em>at least</em> 30 minutes a day doing some kind of exercise. Even if you just walk around outside for 30 minutes, it&#8217;s better than nothing.</p>
<h2>Get in the Zone</h2>
<p>Any web developer knows what it&#8217;s like, and how frustrating it can be when a distraction takes you out of the zone and blows your developmental buzz. Discover what helps you get in the zone and make it happen. Turn on the right type of music (to me, techno does the trick; anything else and I find myself getting caught up in the lyrics). Turn off your email and only check it at scheduled times. Turn off your cell phone (Android and iOS both have awesome do-not-disturb features). Turn off your instant messager.</p>
<p>Find your zen. Become one with your code. And then watch your productivity rage.</p>
<h2>Keep Your Drive</h2>
<p>No matter where you work or who you work for, it&#8217;s important to keep your drive. A successful developer will put in the extra hours to make an amazing product that impresses his manager and clients. Don&#8217;t get discouraged by a missed deadline—rectify it and explain how you needed the extra time to finish it properly&#8230;then try harder to be punctual next time. Learn new things as much as possible and integrate them into your projects when applicable. This keeps you up to date with technology and makes you more valuable to potential employers. If your organization fears new technology, stand up for what you believe in and encourage them to evolve their policies and practices.</p>
<p>Just remember, the job you have now is just a stepping stone in the river of your career. Don&#8217;t let anyone pull you into the water and drown out your dreams.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/K7Mv-aN12nQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/12/tips-for-the-aspiring-web-developer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/12/tips-for-the-aspiring-web-developer/</feedburner:origLink></item>
		<item>
		<title>Down with the “Share” Widget!</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/_pxnANHf8U8/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/12/down-with-the-share-widget/#comments</comments>
		<pubDate>Fri, 14 Dec 2012 00:55:05 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1758</guid>
		<description><![CDATA[In a world dominated by social media, it&#8217;s natural to want visitors to share your content with friends and followers. This really isn&#8217;t a bad thing, but how you go about encouraging them can actually be discouraging. The Rise of the &#8220;Share&#8221; Widget Six years ago, Twitter wasn&#8217;t all over the news. Facebook had just <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/12/down-with-the-share-widget/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>In a world dominated by social media, it&#8217;s natural to want visitors to share your content with friends and followers. This really isn&#8217;t a bad thing, but how you go about encouraging them can actually be <em>discouraging</em>.<span id="more-1758"></span></p>
<h2>The Rise of the &#8220;Share&#8221; Widget</h2>
<p>Six years ago, Twitter <em>wasn&#8217;t</em> all over the news. Facebook had <em>just</em> opened itself up to any user over the age of 13. You didn&#8217;t see social media logos on television commercials or on every box of cereal at the supermarket. The guy on the radio wasn&#8217;t screaming at you to &#8220;like&#8221; this and that. Those were the good old days.</p>
<p>Today, everyone from the kid next door to <a href="http://twitter.com/pontifex">the pope</a> has a Twitter account. Major retailers and brands are reaching out to their customers through Facebook, providing them with offers and incentives faster than they ever could before. Companies are tackling customer support by responding within hours or even minutes to angry consumers who voice their opinions to the world. Social media is good stuff, and even our technophobic grandmothers are getting on board.</p>
<p>The point is, everyone knows about social media now. It&#8217;s built into our desktops, tablets, and phones. There are a multitude of apps that make posting content to your favorite service a breeze. So why are we still plastering &#8220;share&#8221; widgets all over our sites?</p>
<p>I was recently speaking with a good friend of mine about this. We both have websites, and we both had those tacky, distracting &#8220;share&#8221; widgets on them at some point. We were social when social wasn&#8217;t cool.</p>
<p>But now, it seems like every site we come across has some kind of obtrusive social-sharing widget included on every single page. <em>Share this, tweet that, blah, blah, blah</em>&#8230;it&#8217;s just as distracting and tacky as a big ugly banner ad—and people become desensitized by that sort of thing.</p>
<h2>It&#8217;s Usually Not Worth It</h2>
<p>That&#8217;s a pretty bold statement, but let&#8217;s use the very popular tech blog <a href="http://mashable.com/">Mashable</a> as an example. Mashable reaches out to tech nuts—people who use social media on an unhealthy basis. There&#8217;s no shortage of social media sharing in Mashable&#8217;s audience, so if anyone can pull this off, it would be them.</p>
<p>Considering Mashable <a href="http://mashable.com/about/">boasts</a> 20 million monthly visitors (as well as six million social media followers), you&#8217;d think their &#8220;share&#8221; widgets would have staggering numbers. On the contrary, the average post only appears to get between 500 and 900 collective &#8220;shares&#8221; in its first 48 hours of existence (an article&#8217;s prime exposure period). Here&#8217;s an example from an article posted a couple days ago:</p>
<p style="text-align: center;"><img class="aligncenter" alt="Mashable Shares" src="http://abeautifulsite.net/blog/wp-content/uploads/2012/12/mashable-share.png" /></p>
<p>While it&#8217;s impossible to determine the actual number of visits to each article on Mashable, it quickly becomes obvious that the percentage of visitors who bother sharing them is extremely low.</p>
<p>If a news giant such as Mashable—who garners over 20 million visitors a month—can only pull in a few thousand shares per article, how many do you think your site will be able to pull in?</p>
<h2>Encourage Them Without Encouraging Them</h2>
<p>So how do you encourage users to share your content without slapping an annoying badge or button on your site? The answer comes down to the most fundamental rule of successful bloggers:</p>
<p><em>Post awesome stuff that people want to read!</em></p>
<p>No matter how many &#8220;like&#8221; or &#8220;share&#8221; widgets you put on your page, if your content sucks, people aren&#8217;t going to pass it along to their friends. But if your content is interesting, people will share it whether or not those widgets even exist.</p>
<p>If you think it&#8217;s all about making it easier for users to share your content&#8230;think again. Social integration is built right into most devices these days. You can Tweet directly from the <a href="http://www.cultofmac.com/194772/enable-twitter-in-mountain-lion-notification-center-os-x-tips/">Notification Center</a> in OS X. iOS has both <a href="http://mashable.com/2011/06/06/apple-twitter-ios5/">Twitter</a> and <a href="http://mashable.com/2012/06/11/apple-facebook/">Facebook</a> integrated right into the operating system. Windows 8 connects with those and many more services through its <a href="http://www.pcworld.com/article/2013554/windows-8-deep-dive-get-to-know-the-people-app.html">People App</a>. And all of that goes without mentioning the <a href="https://play.google.com/store/apps/category/SOCIAL?feature=category-nav">many</a>, <a href="https://itunes.apple.com/us/genre/ios-social-networking/id6005?mt=8">many</a> apps that are available on every platform to do the very same things.</p>
<p>Six years ago, when the average person had no idea what social media was, &#8220;share&#8221; widgets became a fad. Now, since social media is more than apparent in all our lives, they serve little more than to beg people to do something they would already have done if they really wanted to. Remember, quality is far more important than quantity when it comes to blogging. Besides, wouldn&#8217;t you rather have people <em>want</em> to share your content instead of <em>begging</em> them to?</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/_pxnANHf8U8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/12/down-with-the-share-widget/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/12/down-with-the-share-widget/</feedburner:origLink></item>
		<item>
		<title>Feature Detection for CSS Transitions via jQuery $.support</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/1MFKNUbOS8s/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/12/feature-detection-for-css-transitions-via-jquery-support/#comments</comments>
		<pubDate>Sun, 09 Dec 2012 00:41:04 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1748</guid>
		<description><![CDATA[When working with CSS transitions, the need to detect whether or not the browser supports them may arise.  It can be of particular use when working with the transitionend event, which won&#8217;t fire in unsupportive browsers. After finding a number of questionable solutions, I came across this gist that extends jQuery&#8217;s $.support nicely. $.support.transition = (function(){ var thisBody <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/12/feature-detection-for-css-transitions-via-jquery-support/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>When working with CSS transitions, the need to detect whether or not the browser supports them may arise.  It can be of particular use when working with the <a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_transitions#Detecting_the_completion_of_a_transition"><code>transitionend</code></a><strong> </strong>event, which won&#8217;t fire in unsupportive browsers.</p>
<p>After finding a number of questionable solutions, I came across this <a href="https://gist.github.com/373874">gist</a> that extends jQuery&#8217;s <code>$.support</code> nicely.</p>
<p><span id="more-1748"></span></p>
<pre class="javascript">$.support.transition = (function(){
    var thisBody = document.body || document.documentElement,
        thisStyle = thisBody.style,
        support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined;
    return support;
})();</pre>
<p>The value of <code>$.support.transition</code> will be <code>true</code> or <code>false</code> depending on the browser&#8217;s capabilities.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/1MFKNUbOS8s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/12/feature-detection-for-css-transitions-via-jquery-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/12/feature-detection-for-css-transitions-via-jquery-support/</feedburner:origLink></item>
		<item>
		<title>Why SaaS is Cheaper Than Installable Software</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/OExXF9So8v0/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/03/why-saas-is-cheaper-than-installable-software/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 03:51:55 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Surreal CMS]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1416</guid>
		<description><![CDATA[Overview As a software as a service (SaaS) provider, the question comes up all the time: &#8220;Is there an installable version of your software that I can put on my own server?&#8221; In all honesty, I cringe every time I hear this.  It&#8217;s not that I have a personal vendetta against installable software, it&#8217;s because <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/03/why-saas-is-cheaper-than-installable-software/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<h2>Overview</h2>
<p>As a <a href="http://en.wikipedia.org/wiki/Software_as_a_service">software as a service</a> (SaaS) provider, the question comes up all the time: &#8220;Is there an installable version of your software that I can put on my own server?&#8221;</p>
<p>In all honesty, I cringe every time I hear this.  It&#8217;s not that I have a personal vendetta against installable software, it&#8217;s because I know what the asker is usually thinking:</p>
<ol>
<li>I can save money if I only have to pay for it once</li>
<li>It&#8217;s safer because it&#8217;s on my own server</li>
<li>I can tweak it to do what I need it to do</li>
</ol>
<p>The truth is, in almost every case, SaaS is a better solution that will save them more time and money than an installable system—they just don&#8217;t realize it yet.</p>
<p><span id="more-1416"></span></p>
<h2>I can save money if I only have to pay for it once</h2>
<p>It seems like a logical argument at first, but there are hidden costs with installable software that are often neglected.  For example, time.  Time is money, and as a designer, you probably get paid by the job.  This means that one-time costs are very appealing to you when quoting potential work.  If it&#8217;s free, that&#8217;s even better.  That&#8217;s why so many people use WordPress, right?</p>
<p>In cases like these, you become the systems administrator.  That means when something breaks, you&#8217;re the one clients are calling to fix it.  This may not seem like a big deal if you&#8217;re just getting started, but as you grow your business, that becomes a lot of overhead.  We have one customer who uses our service to manage over 1,500 websites.  Could you imagine having to update 1,500 individual WordPress sites?  As you grow, the overhead for each installed system becomes more obvious and the time it takes to maintain them becomes staggering.  Since time is money, your cost goes up with each new client you bring on board.</p>
<h2>It&#8217;s safer because it&#8217;s on my own server</h2>
<p>Alright, so you&#8217;re OK with eating that extra cost.  Let&#8217;s imagine that you chose to install WordPress to power a client&#8217;s new website.  You get everything setup, go through a few revision cycles, launch the site, and then you get paid.  All is well and everyone is happy.</p>
<p><a href="http://codex.wordpress.org/FAQ_My_site_was_hacked">And then this happens.</a></p>
<p>You get a frantic call one evening from your client who is panicking that their site has been hacked and they want it fixed immediately.  The culprit?  Some script kiddie took advantage of a known exploit because someone forgot to update to the latest version of WordPress last week.  No problem, you can just restore the site from a recent backup and update WordPress to patch the vulnerability.</p>
<p>Wait&#8230;you mean you haven&#8217;t been keeping backups?</p>
<p>Now you&#8217;re stuck wading through infected pages and database entries trying to repair all the damage.  Don&#8217;t forget to change all your users&#8217; passwords, the database password, your API keys, and for good measure, your FTP password.  Oh, and your client just emailed you saying that <a href="http://www.stopbadware.org/home/faq#why_flagged">Google blacklisted the site</a> for serving badware.  And they&#8217;re missing the story that they just posted a couple hours ago—and some other articles that were really important.  The entire cleanup process can take a long time, especially if the attacker was clever.  And this is just <em>one site</em>.</p>
<p>When the dust settles after hours of your time is wasted because of a simple oversight, you then seek compensation from your client for the time you spent restoring their site.  Of course, they&#8217;re going to be a bit sour that the site <em>you built</em> was hacked and, even though it&#8217;s not your fault, they think it is.  Your relationship with them gets a bit salty at this point, and they become less likely to recommend your services to others.  This can cost you a lot of money, too.</p>
<p>But how much is your time worth?  A conservative designer might say $40 an hour.  Add those hours up, and I guarantee you&#8217;ll find the overall cost of an equivalent SaaS product to be comparatively less—especially if multiple incidents happen throughout the year.</p>
<p>Granted, just about any site can harbor exploits and become a victim, but installable software makes it much easier for attackers to find vulnerabilities since the entire code base is exposed and living on your server.  That is a huge advantage of SaaS—it&#8217;s much harder to hack what you can&#8217;t see.</p>
<p>Another advantage of SaaS is that, if a service discovers a bug or an exploit in their system, it gets fixed automatically.  You don&#8217;t have to update multiple systems. You don&#8217;t have to reset all your passwords.  You don&#8217;t have to remove malicious code from your site.  In fact, since there are many other users, it&#8217;s likely that the problem will be noticed and fixed before you ever even realize it was there.</p>
<h2>I can tweak it to do what I need it to do</h2>
<p>Despite all of that, some folks still think that installable software is better because you can change the code when you need something to work in a way that it&#8217;s not intended to work.  This is usually a bad idea, especially if you don&#8217;t stick to the API.</p>
<p>Why?  Because most people that like to tinker with code don&#8217;t have a complete understanding of how everything works.  Software is complex, and without a solid understanding of the code base, you risk introducing bugs and vulnerabilities that didn&#8217;t exist in the original version.  It&#8217;s also very easy to make changes that hinder the application&#8217;s usability.</p>
<p>Aside from that, if you&#8217;re not coding off an API, you&#8217;ll probably need to make those changes each time an update comes out.  If your changes are significant, you will inevitably be reluctant to perform the update which will lead to what I just talked about in the previous section.</p>
<p>Again, this is usually a bad idea.</p>
<h2>I can just roll my own service</h2>
<p>And then there are the code rogues who would rather spend weeks working on a halfhearted equivalent just to avoid paying a nominal monthly fee, despite the value it would bring to them and their clients.</p>
<p>While I don&#8217;t doubt a talented developer&#8217;s ability to create an app, it will never be as cost effective as an already-available SaaS product.  You might be able to produce a quick-fix system that gets the job done, but it won&#8217;t be as maintainable or reusable as it should be, and it won&#8217;t be as polished as something that&#8217;s been around for awhile.  Even if you take the time to turn it into a service that all your clients can use, you&#8217;ll be spending more time developing features and fixing bugs than you will finding new clients.  You&#8217;ll have a new full time job that you don&#8217;t even get paid for.</p>
<p>Again, time is money, and while it may seem like an easy thing to do, building and maintaining your own system won&#8217;t be as cost efficient as going with an existing SaaS service.  It&#8217;s just not economical, and it will end up costing much more than what your clients are willing to pay you for.</p>
<h2>In the end&#8230;</h2>
<p>Being in the content management industry, I have the opportunity to interface with established web designers from all over the world.  Many of them have tried both installable and SaaS solutions and, while a handful will always prefer the former, the majority who try our service never look back.  They would rather spend their time doing what they love instead of being a systems administrator or developing their own applications.  The benefits outweigh the cost, and that&#8217;s the whole purpose of SaaS.</p>
<p>Ultimately, it&#8217;s up to you to decide what tools and services you&#8217;d like to use to power your business.  Many people find comfort using traditional software applications, but it&#8217;s important to consider their disadvantages as well.  If there&#8217;s a SaaS equivalent that does the job, you might consider taking another look at it for your next project.  You might just find that you&#8217;ll get more value than what you&#8217;re actually paying for.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/OExXF9So8v0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/03/why-saas-is-cheaper-than-installable-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/03/why-saas-is-cheaper-than-installable-software/</feedburner:origLink></item>
		<item>
		<title>jQuery Bootstrap-style Dropdowns</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/MJ7cy3cz2y8/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/03/jquery-bootstrap-style-dropdowns/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 08:37:11 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1408</guid>
		<description><![CDATA[A really awesome framework called Bootstrap was recently released by a couple of guys at Twitter. You probably already heard of it by now. And you probably already fell in love with it.  Today I made a plugin that replicates the features of Bootstrap’s dropdown to better suit my needs. Backstory One of my favorite <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/03/jquery-bootstrap-style-dropdowns/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>A really awesome framework called <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> was recently released by a couple of guys at Twitter. You probably already heard of it by now. And you probably already fell in love with it.  Today I made a plugin that replicates the features of Bootstrap’s dropdown to better suit my needs.</p>
<p><span id="more-1408"></span></p>
<h2>Backstory</h2>
<p>One of my favorite Boostrap plugins is <a href="http://twitter.github.com/bootstrap/javascript.html#dropdowns">dropdowns</a>, but I had a bit of difficulty getting started with them. The docs say you can apply a dropdown to <em>nearly any element</em>, but they really seem to work best with Bootstrap’s navbar, tab, and pill components. Since I was retrofitting an app that was around long before Bootstrap, this wasn’t going to work for me. That and I was hoping to get a scrollable dropdown (with tips!) and a few other features out of the deal. Thus, <a href="http://labs.abeautifulsite.net/jquery-dropdown/">this plugin</a> was born.</p>
<p>While the appearance of these dropdowns is almost identical to those of Bootstrap’s, it’s important to note that JavaScript for this plugin was developed entirely from scratch. Some CSS was borrowed, however, especially for generating those gorgeous tips.</p>
<p>Wanna see what they look like? <a href="http://labs.abeautifulsite.net/jquery-dropdown/">Try it!</a> Wanna contribute to this project? <a href="https://github.com/claviska/jquery-dropdown">It’s on GitHub</a></p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/MJ7cy3cz2y8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/03/jquery-bootstrap-style-dropdowns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/03/jquery-bootstrap-style-dropdowns/</feedburner:origLink></item>
		<item>
		<title>Access Pages Without the PHP Extension Using .htaccess</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/ZEiXCAnaKnA/</link>
		<comments>http://www.abeautifulsite.net/blog/2012/02/access-pages-without-the-php-extension-using-htaccess/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 02:46:30 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.abeautifulsite.net/blog/?p=1389</guid>
		<description><![CDATA[There are a number of ways to make &#8220;clean URLs&#8221; work on your site, but this one is pretty straight forward.  It allows you to access /any-page.php by simply going to /any-page.  Just place the following into your .htaccess file (and make sure that mod_rewrite is enabled): RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php <a class="more-link" href="http://www.abeautifulsite.net/blog/2012/02/access-pages-without-the-php-extension-using-htaccess/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>There are a number of ways to make &#8220;clean URLs&#8221; work on your site, but this one is pretty straight forward.  It allows you to access <code>/any-page.php</code> by simply going to <code>/any-page</code>.  Just place the following into your <code>.htaccess</code> file (and make sure that <code>mod_rewrite</code> is enabled):</p>
<p><span id="more-1389"></span></p>
<pre>RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,L]</pre>
<p>The nice thing about this is that it doesn&#8217;t affect querystrings.  With this solution, both of these URLs are effectively the same:</p>
<pre>http://example.com/page.php?id=123</pre>
<pre>http://example.com/page?id=123</pre>
<p>Of course, the caveat is that you don&#8217;t have &#8220;clean querystrings&#8221;, but it&#8217;s a reasonable trade-off between &#8220;clean&#8221; and configuration.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/ZEiXCAnaKnA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2012/02/access-pages-without-the-php-extension-using-htaccess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2012/02/access-pages-without-the-php-extension-using-htaccess/</feedburner:origLink></item>
		<item>
		<title>Surreal CMS No Longer on UserVoice</title>
		<link>http://feedproxy.google.com/~r/abeautifulsite/~3/IppORBXAbdE/</link>
		<comments>http://www.abeautifulsite.net/blog/2011/12/surreal-cms-no-longer-on-uservoice/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 01:43:05 +0000</pubDate>
		<dc:creator>Cory LaViska</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Surreal CMS]]></category>

		<guid isPermaLink="false">http://abeautifulsite.net/blog/?p=1384</guid>
		<description><![CDATA[We would like to inform the Surreal CMS community that as of today, December 13th 2011, we will no longer be accepting feedback through our UserVoice account.  This isn&#8217;t to say that we don&#8217;t want or value your opinions, it just means that we want to hear them from you directly.  For a long time, <a class="more-link" href="http://www.abeautifulsite.net/blog/2011/12/surreal-cms-no-longer-on-uservoice/">Continue&#160;&#187;</a>]]></description>
				<content:encoded><![CDATA[<p>We would like to inform the Surreal CMS community that as of today, December 13th 2011, we will no longer be accepting feedback through our <a href="http://uservoice.com/">UserVoice</a> account.  This isn&#8217;t to say that we don&#8217;t want or value your opinions, it just means that we want to hear them from you directly.  <span id="more-1384"></span></p>
<p>For a long time, we&#8217;ve been asking for your feedback and directing you to post them on our UserVoice page.  In theory, this was a good idea, as it allowed the community to suggest new features and vote on their priority.  This gave us a good insight into where you wanted us to take Surreal.  However, over time, we&#8217;ve come to realize that UserVoice isn&#8217;t the solution we were really looking for.</p>
<p>For one, you were thrown into an entirely new interface and required to register a separate username and password.  Many users simply stopped at this point, which means that if they didn&#8217;t contact us directly we never got the chance to hear their feedback.  You shouldn&#8217;t be forced to register with another site just to tell us what you think about our service.</p>
<p>We also felt that UserVoice&#8217;s interface doesn&#8217;t fit well with Surreal&#8217;s mantra.  Surreal is simple.  Providing feedback to us should be just as simple.  So from now on, we encourage you to send all your comments, suggestions, and all other feedback directly to us through Surreal&#8217;s Help &amp; Support section.</p>
<p>We want to hear from you directly, and we want to take back that personal touch that we lost when we started sending folks elsewhere to tell us how we were doing.</p>
<img src="http://feeds.feedburner.com/~r/abeautifulsite/~4/IppORBXAbdE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.abeautifulsite.net/blog/2011/12/surreal-cms-no-longer-on-uservoice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.abeautifulsite.net/blog/2011/12/surreal-cms-no-longer-on-uservoice/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.187 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-26 09:20:41 -->
