<?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/"
	>

<channel>
	<title>centresource blog &#187; Development</title>
	<atom:link href="http://blog.centresource.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.centresource.com</link>
	<description>the thoughts and ramblings of centresource</description>
	<lastBuildDate>Wed, 19 Jun 2013 17:13:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>A Culture of Learning</title>
		<link>http://blog.centresource.com/2013/06/18/a-culture-of-learning/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-culture-of-learning</link>
		<comments>http://blog.centresource.com/2013/06/18/a-culture-of-learning/#comments</comments>
		<pubDate>Tue, 18 Jun 2013 15:07:17 +0000</pubDate>
		<dc:creator>Max Beizer</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4706</guid>
		<description><![CDATA[I&#8217;m pretty new here at Centresource; I&#8217;m pretty new to development in general and Centresource took a chance by hiring a Junior Developer. I&#8217;m glad they did&#8211;I like it here. I like it for a number of reasons: the people are great, the space is comfortable, ROWE is sweet, and the work is challenging. More...]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m pretty <img src="http://blog.centresource.com/content/uploads/2013/06/culturelearning.png" alt="Culture of Learning" width="250" height="200" class="alignright size-full wp-image-4930" />new here at Centresource; I&#8217;m pretty new to development in general and Centresource took a chance by hiring a Junior Developer. I&#8217;m glad they did&#8211;I like it here. I like it for a number of reasons: the people are great, the space is comfortable, <a title="Rowe III {The Review}" href="http://blog.centresource.com/2011/04/19/rowe-iii-the-review/">ROWE is sweet</a>, and the work is challenging. More than anything, I love the culture of learning.</p>
<p>Every Wednesday morning, we have a Development Team meeting. When I first heard about this practice, I must admit I was a little wary. I don&#8217;t know anyone (especially of the developer stripe) who gets excited at the thought of a weekly meeting. I was relieved to find that these meetings would not only be painless, but that they would become something I actually look forward to (and blog about).</p>
<p>Our weekly meeting consists of each member of the team doing a quick blurb on what he/she has been working on and what he/she has learned in the past week. Lately, we have even been encouraged to throw onto the projector for all to see what we have learned or written recently. This is so fascinating to me for a number of reasons.</p>
<h3>Experience Through Osmosis</h3>
<p>Since my experience level is so low compared to my peers, it is a chance for me pick up a lot from a wide range of talented people. I have never bothered to tally up the collective years of experience in that room, but it&#8217;s certainly in the decades range. It&#8217;s safe to assume that the people in that meeting have forgotten more about development than I have learned at this point. And I get to sit there and soak in as much as my brain will hold. Even if I don&#8217;t use any of what I learn today, tomorrow, or next year, it&#8217;s in there somewhere.</p>
<h3>The Learning is Never Over</h3>
<p>It serves as a reminder that even the senior level devs still spend most of their days learning new things. One of the best thing about the development field is that it is constantly changing. The technologies we work with are fluid. New features for existing tools and new tools altogether make it an exciting space to work in. When I am in the dumps and feel like I&#8217;ll never be any good at development, it&#8217;s nice to know that ours best devs still learn new things. The Wednesday meeting serves as a reminder that, in software, &#8220;you never know enough&#8221; (and that&#8217;s a good thing).</p>
<h3>You&#8217;ve Gotta Have Something for Show-and-Tell</h3>
<p>I like that I have to have something to share every Wednesday. If the work I do for Centresource ever becomes so routine that I don&#8217;t learn something new each week, I have to go out and find something to learn. As a member of the Development Team, it is my duty to find something to bring to table for all of us. It causes me to think about where my weaknesses are and to keep a tally of new things I learn. In a job where the most seemingly minor task may require multiple Google searches, I think it&#8217;s important to not lose sight of how much I learn day-to-day.</p>
<p>Like I said, I&#8217;m pretty new to the field and to Centresource, but I love what I do and where I get to do it. What I love most about this place is the emphasis that is put on learning. We are not a culture where you don&#8217;t want to expose how little you know for fear of being canned (which would be a real concern for me elsewhere, I imagine). We embrace learning on the job and growing as a developer&#8211; and, dare I say, growing as a person.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2013/06/18/a-culture-of-learning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using ember-auth with Rails 3 and Authlogic</title>
		<link>http://blog.centresource.com/2013/06/04/using-ember-auth-with-rails-3-and-authlogic/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-ember-auth-with-rails-3-and-authlogic</link>
		<comments>http://blog.centresource.com/2013/06/04/using-ember-auth-with-rails-3-and-authlogic/#comments</comments>
		<pubDate>Tue, 04 Jun 2013 17:46:08 +0000</pubDate>
		<dc:creator>Travis Roberts</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[authlogic]]></category>
		<category><![CDATA[ember]]></category>
		<category><![CDATA[rails3]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4713</guid>
		<description><![CDATA[ember-auth is an authentication library for Ember.js that allows you to keep track of logged-in users. If you have a Rails 3 api backend powering your Ember front-end, you can use ember-auth with authlogic to authorize each request quite easily. If you would rather use devise with your Rails app, there is already a demo...]]></description>
				<content:encoded><![CDATA[<p><a title="ember-auth" href="https://github.com/heartsentwined/ember-auth" target="_blank">ember-auth</a> is an authentication library for <a title="EmberJS" href="http://emberjs.com/" target="_blank">Ember.js</a> that allows you to keep track of logged-in users. If you have a Rails 3 api backend powering your Ember front-end, you can use ember-auth with authlogic to authorize each request quite easily. If you would rather use devise with your Rails app, there is already a <a href="https://github.com/heartsentwined/ember-auth-rails-demo" target="_blank">demo app</a> for that.</p>
<h4>Include the Necessary Gems</h4>
<script src="https://gist.github.com/f84f0f5208eb35fb1f8b.js"></script><noscript><p>View the code on <a href="https://gist.github.com/f84f0f5208eb35fb1f8b">Gist</a>.</p></noscript>
<h4>Setting Up Authlogic</h4>
<p>You can follow <a title="Authlogic Tutorial" href="https://github.com/binarylogic/authlogic_example#tutorial-on-how-to-create-this-app-and-easily-setup-authlogic" target="_blank">this tutorial</a> for getting Authlogic set up in a Rails 3 app.</p>
<h4>Adding to an Existing Authlogic App</h4>
<p>The only extra authlogic database column that your user model needs is the <code>single_access_token</code> field. If you don&#8217;t have it already, you can add it with the following migration:</p>
<script src="https://gist.github.com/31d302f03da8816c2f9b.js"></script><noscript><p>View the code on <a href="https://gist.github.com/31d302f03da8816c2f9b">Gist</a>.</p></noscript>
<h4>Add ember-auth to your Ember App</h4>
<p>Make sure to include ember-auth in your application.js manifest.</p>
<script src="https://gist.github.com/85ea78d5e6b125b05c8c.js"></script><noscript><p>View the code on <a href="https://gist.github.com/85ea78d5e6b125b05c8c">Gist</a>.</p></noscript>
<p>Create an auth.js.coffee file (or auth.js if you&#8217;re not using CoffeeScript) where you&#8217;ll define the ember-auth settings. Notice the auth file has already been included in the above javascript manifest.</p>
<script src="https://gist.github.com/7f67caa5f8988b4974eb.js"></script><noscript><p>View the code on <a href="https://gist.github.com/7f67caa5f8988b4974eb">Gist</a>.</p></noscript>
<h4><span style="font-size: 1.17em;">Add API Authentication</span></h4>
<p>I have my auth code in the api/user_sessions controller.</p>
<script src="https://gist.github.com/684c4c4b4fb01d103797.js"></script><noscript><p>View the code on <a href="https://gist.github.com/684c4c4b4fb01d103797">Gist</a>.</p></noscript>
<p>You&#8217;ll notice that I&#8217;m inheriting from <code>API::BaseController</code> instead of <code>ApplicationController</code>. I do this because the <code>require_user</code> auth method needs to be unique to the way ember-auth works. Here&#8217;s my <code>API::BaseController</code></p>
<script src="https://gist.github.com/38e4cdc8731c381f671a.js"></script><noscript><p>View the code on <a href="https://gist.github.com/38e4cdc8731c381f671a">Gist</a>.</p></noscript>
<h4>Set Authlogic to use Single Access Authentication</h4>
<p>This will tell Authlogic that each request will contain a token, which it will use to authenticate the user. When using single access authentication, Authlogic does not keep track of the user session.</p>
<script src="https://gist.github.com/7078240114ba9ee1bb73.js"></script><noscript><p>View the code on <a href="https://gist.github.com/7078240114ba9ee1bb73">Gist</a>.</p></noscript>
<p>Now, you can protect any of your api controller actions by inheriting from API::BaseController and adding a before filter.</p>
<script src="https://gist.github.com/3de909983a39e7a99d41.js"></script><noscript><p>View the code on <a href="https://gist.github.com/3de909983a39e7a99d41">Gist</a>.</p></noscript>
<p>That&#8217;s it for the Rails side! Any further implementation will take place in Ember, and you can follow the excellent <a title="ember-auth Documentation" href="http://ember-auth.herokuapp.com/docs" target="_blank">ember-auth documentation</a> for that.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2013/06/04/using-ember-auth-with-rails-3-and-authlogic/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using Codekit</title>
		<link>http://blog.centresource.com/2013/05/29/using-codekit-md/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-codekit-md</link>
		<comments>http://blog.centresource.com/2013/05/29/using-codekit-md/#comments</comments>
		<pubDate>Wed, 29 May 2013 16:18:49 +0000</pubDate>
		<dc:creator>Winston Hearn</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4615</guid>
		<description><![CDATA[Here in the Front-End Department at Centresource, we&#8217;ve started using Codekit for organizing assets and precompiling the Sass and Coffeescript files we&#8217;re writing. Codekit works a little like Rail&#8217;s Asset Pipeline for sites that don&#8217;t have that functionality built in. We were initially attracted to the app mainly because it will watch *.coffee and *.sass files (and...]]></description>
				<content:encoded><![CDATA[<p>Here in the Front-End Department at Centresource, we&#8217;ve started using <a href="http://incident57.com/codekit/" target="_blank">Codekit</a> for organizing assets and precompiling the Sass and Coffeescript files we&#8217;re writing. Codekit works a little like Rail&#8217;s Asset Pipeline for sites that don&#8217;t have that functionality built in.</p>
<p>We were initially attracted to the app mainly because it will watch *.coffee and *.sass files (and *.less) and as they are saved, Codekit automatically compiles them and, if you have the feature turned on, injects them into your browser (with CSS files it autoupdates the page, no reload, with JS files it auto-reloads). This alone was worth the price of the app as often times you could hit save and by the time you&#8217;d flipped to your browser the page was updated with the new styles. But as we&#8217;ve spent more time with the app, we&#8217;ve found a few other features that really make our lives better. Here are 4 of them:</p>
<h2><a href="https://gist.github.com/wnstn/03fe334d42c60ed5791e#1-optimization-of-images" name="1-optimization-of-images"></a>1. Optimization of images</h2>
<p>Our design department creates really spiffy looking designs all the time that we in the Front-End <img class="alignright" alt="" src="http://f.cl.ly/items/3q1I3a3r3r293z1g2H1T/Screen%20Shot%202013-04-15%20at%208.36.30%20AM.png" width="286" height="521" />group then slice up with Photoshop for inclusion in web pages. It used to be that you had some ability to optimize .JPG&#8217;s and .GIF&#8217;s with Photoshop, but PNG&#8217;s required other tools or magic voodoo dust. No longer! Codekit can optimize all image files, reducing cruft without any reduction in visible quality. I find this most handy with PNG&#8217;s, I can save out of Photoshop to the directory in my project I want the file in, Codekit will find it automatically, and then it&#8217;s just one click to optimize. The results can be astounding. To the right is a screenshot I just took of the window I&#8217;m writing this post in, and codekit&#8217;s optimizations. You&#8217;ll notice that&#8217;s a Retina screenshot (2878 x 2374px) that Codekit chopped almost in half, file-size.</p>
<h2><a href="https://gist.github.com/wnstn/03fe334d42c60ed5791e#2-automatic-inclusion-of-bourbon" name="2-automatic-inclusion-of-bourbon"></a>2. Automatic inclusion of Bourbon</h2>
<p>We love Thoughtbot&#8217;s Bourbon framework. It&#8217;s super lightweight, easy to work with, and extremely flexible as we build custom solutions for our clients. Codekit loves Bourbon too &#8211; you can add the framework to any project with just a couple clicks. <img class="alignleft" alt="" src="http://f.cl.ly/items/3R1X2J3n3S130d1u3T2m/Screen%20Shot%202013-04-15%20at%208.40.43%20AM.png" width="772" height="355" /></p>
<h2><a href="https://gist.github.com/wnstn/03fe334d42c60ed5791e#3-setting-output-paths-for-compiled-assets" name="3-setting-output-paths-for-compiled-assets"></a>3. Setting output paths for compiled assets</h2>
<p>When organizing files, it&#8217;s often easier to separate the uncompiled files from the compiled files. Codekit makes that easy. Just right click a file, and hit &#8220;Set Output Path&#8221; and define where you&#8217;d like the compiled file to go. This is handy and helpful, but it becomes even more powerful when used with the next tip.</p>
<h2><a href="https://gist.github.com/wnstn/03fe334d42c60ed5791e#4-organization-of-coffee-and-less-files" name="4-organization-of-coffee-and-less-files"></a>4. Organization of coffee and less files</h2>
<p>Just being able to set the output path of files is great, but often times you want to do more than just compile the files to a different directory. When worrying about page speed for your rendered pages, one of the easiest things to do is reduce HTTP requests being made on load. This is often done by concatenating all your JS and CSS files into one larger file, a process that Codekit makes really easy.</p>
<p>At Centresource, we&#8217;re used to working with the Asset Pipeline in Rails now, so we like to keep our coffee and css files small and organized in a structure similar to the views. This has carried over into development of Static HTML sites and Drupal projects as well. In the past, because wanted as few files as possible, we might have been tempted to just put all our Javascript in to one scripts.js file. Now, with Coffeescript and Codekit, we can break things down into small, semantically named, easy-to-read files.</p>
<p>The easiest way to do this (when you factor in source control and working with multiple developers) is to make a manifest file, say app.coffee, or screen.scss, and use the proprietary &#8220;codekit-prepend&#8221; and &#8220;code kit-append&#8221; statements to organize your file. Say you have three coffee classes: Foo, Bar, Baz, and you want them to be concatenated into app.coffee. You put each class in a semantically named .coffee file: foo.coffee, bar.coffee, and baz.coffee. Then, in app.coffee, you&#8217;d put this at the top of your file:</p>
<div>
<pre># @codekit-prepend 'foo.coffee'
# @codekit-prepend 'bar.coffee'
# @codekit-prepend 'baz.coffee'</pre>
</div>
<p>These statements are not valid Coffeescript so you need to comment them out, but Codekit will catch them none-the-less.</p>
<p>This is great for creating a utilities.js that has all your plugins and frameworks concatenated and minified, or for organizing all your css by pages but only including one css file in the actual page. We love it!</p>
<p>Codekit is a great tool. If you use it, I&#8217;d love to hear of other cool ways it helps you improve your workflow. To find out more, check out the <a href="http://incident57.com/codekit/" target="_blank">Codekit page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2013/05/29/using-codekit-md/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Confederacy of OSes, Part III</title>
		<link>http://blog.centresource.com/2012/10/19/a-confederacy-of-oses-part-iii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-confederacy-of-oses-part-iii</link>
		<comments>http://blog.centresource.com/2012/10/19/a-confederacy-of-oses-part-iii/#comments</comments>
		<pubDate>Fri, 19 Oct 2012 15:34:26 +0000</pubDate>
		<dc:creator>Jeremy Holland</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4452</guid>
		<description><![CDATA[Read Part I and Part II So my strategy is as follows: I use Windows to run web browsers, the odd desktop app like Photoshop, handy GUI utilities like calculators, media playback, and the like. On top of all this, I have installed VirtualBox and the easy-to-install Windows version of Vagrant, running a VM with...]]></description>
				<content:encoded><![CDATA[<p>Read <a href="http://blog.centresource.com/2012/10/15/a-confederacy-of-oses-part-i/">Part I</a> and <a href="http://blog.centresource.com/2012/10/17/a-confederacy-of-oses-part-ii/">Part II</a></p>
<p>So my strategy is as follows: I use Windows to run web browsers, the odd desktop app like Photoshop, handy GUI utilities like calculators, media playback, and the like. On top of all this, I have installed VirtualBox and the easy-to-install Windows version of Vagrant, running a VM with the Ubuntu server distribution (I have no need of the gnome or any other GUI therein.. yet. That may change when I need to start running Selenium-based tests, but it&#8217;ll do for now). I use two PuTTY windows &#8211; one on each monitor &#8211; to connect to the VM, which is configured to startup at boot. I forward the necessary ports from the host to the guest (made easily configurable by Vagrant) and provision the whole affair with Chef.</p>
<p>Internally, I use tmux, vim, and all the usual CLI tools of the trade to ply my own. Servers, databases, services and the like all run internally to the VM, and the only crosstalk I&#8217;ve yet needed to make use of is accessing guest-hosted websites with my host-based browser, a feat easily enabled by Vagrant&#8217;s port forwarding. RDBMS GUIs will likely be needed soon enough, and the same solution will presumably apply thereto.</p>
<p>So, how has it been? So far, the experience has actually been pretty pleasant. After getting the VM&#8217;s hardware and the general translation and keyboard layout bells &amp; whistles configured to my liking, I feel for the most part that I&#8217;m back in my native Linux land when developing. No issues arising from the system being a VM have yet reared their heads, and aside from the MS chrome peeking around the corners of my terminals, I could almost be convinced that I&#8217;d never left. As far as the desktop bit goes, I&#8217;m still acclimating. However, the fact that the sound, the graphics, the power management &#8211; all the hardware in general &#8211; works perfectly without my having to tweak arcane configuration settings is a very great improvement over my earlier experience; and not having to forcefully implement hacky workarounds is a weight off of my shoulders.</p>
<p>That all said, I do have a few qualms. If you know of an acceptable solution to any of these, please comment and share!</p>
<ol>
<li>PuTTY is the best SSH client out of all those I&#8217;ve tried, and it&#8217;s not that great. It&#8217;s profile saving/loading system is nightmarish from a UX standpoint, the built-in fonts are fugly (though I can presumably use others once installed on the OS), but the thing that irks me the most is that I can&#8217;t go fullscreen! I have absolutely no need to see any of that garish MS chrome on the edges of my screen, and having it present detracts from the real estate available to me for tasks of actual importance, as well as simply clashing aesthetically.</li>
<li>The price of the full-featured Windows is prohibitive. There are certain features available only in the Professional or Business or whatever-they&#8217;re-called versions of Windows 7 that I would&#8217;ve found quite useful, but that I don&#8217;t really count as being worth the extra few hundred I&#8217;d have to lay out so to acquire (group policy editing comes to mind).</li>
<li>No real shell script to speak of. Sure, there&#8217;s VBScript and whatever that trash is that passes for a shell in cmd, but these simply don&#8217;t possess the power and terseness of bash.</li>
<li>The godforsaken automatic restart after update. I understand that Windows needs to update itself frequently in order for the boys in Redmond to have the slightest hope of plugging security leaks as fast as they&#8217;re discovered, but I do not at all appreciate having my viewing of some video on Hulu interrupted without discernible warning by my computer suddenly rebooting itself. Turning this trash off is apparently one of the features they reserved for the &#8220;Professional&#8221; users, and I quite frankly don&#8217;t see how this isn&#8217;t a bigger issue among Windows users at large. I understand they&#8217;ll &#8220;fix&#8221; this garbage in Windows 8, but for now, it is pretty off-putting.</li>
</ol>
<p>Anyway, those rants aside, all in all my experience has not been unsatisfactory. Neither, however, has it been revelatory, and I believe I&#8217;ll need more time to make a decision one way or the other. I&#8217;ll keep you all posted!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2012/10/19/a-confederacy-of-oses-part-iii/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>A Confederacy of OSes, Part II</title>
		<link>http://blog.centresource.com/2012/10/17/a-confederacy-of-oses-part-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-confederacy-of-oses-part-ii</link>
		<comments>http://blog.centresource.com/2012/10/17/a-confederacy-of-oses-part-ii/#comments</comments>
		<pubDate>Wed, 17 Oct 2012 18:04:20 +0000</pubDate>
		<dc:creator>Jeremy Holland</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4450</guid>
		<description><![CDATA[Continued from Part I Due to many factors, setting up Linux turned out to be Hell. Both the kernel and GRUB wouldn&#8217;t have the ability to recognize the aforementioned pseudo-RAID array as a single disk until later (I&#8217;m still not sure if GRUB does), so I first had to effectively wipe the filesystem in its...]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.centresource.com/2012/10/15/a-confederacy-of-oses-part-i/">Continued from Part I</a></p>
<p>Due to many factors, setting up Linux turned out to be Hell. Both the kernel and GRUB wouldn&#8217;t have the ability to recognize the aforementioned pseudo-RAID array as a single disk until later (I&#8217;m still not sure if GRUB does), so I first had to effectively wipe the filesystem in its entirety and destroy all partitions; turn off the pseudo-RAID functionality in the BIOS (a miracle they allowed me to do so, considering everything else they expressly hid therefrom), re-partition the two drives as truly separate devices, and reinstall Windows on one disk while setting up Linux on the other. That was a night of my life I&#8217;ll never get back, and I considered dropping Windows from the lot entirely, but figured it might be handy to have as a last resort / testing platform and so opted to keep it at the last moment.</p>
<p>Finally having completed the installation, I booted up Linux for the first time and went about the standard post-installation rigamarole of bringing in my dotfiles and configuration settings, installing the basic tools I use everyday, etc. There were other problems during the process, but I cannot fairly lay the blame for them at HP&#8217;s feet. Switchable graphics &#8211; as this machine possessed &#8211; were still a relatively new and uncommon affair, and the distro kernel hadn&#8217;t been built to include certain systems associated therewith. So that&#8217;s <em>one</em> kernel rebuild right there, and I can assure you there were many more as time went on. Other issues include ACPI issues that <em>to this day</em> have not been completely resolved and reappear intermittently and seemingly randomly, a total inability to recognize the microphone, and other hardware-related woes. Still, I persisted, expending the elbow grease to fix what I could and resigning to live with the rest. When finished, I had a perfectly usable little hi-res Linux machine upon which to do my development that I could call 100% my own.</p>
<p>I have now used this machine for a year, and have thoroughly enjoyed it&#8230; when those issues I said I&#8217;d &#8220;live with&#8221; weren&#8217;t driving me absolutely insane. Lately, however, I been having doubts about my choice of OS, cataloged as follows:</p>
<ol>
<li>I had started to miss certain proprietary software that is not made readily available on Linux (Photoshop comes to mind &#8211; I need it rarely, but when I do, GIMP simply isn&#8217;t an adequate substitute). I could run it on Wine, sure, but all my experience with Wine has been less than pleasant, and I didn&#8217;t want to go through that business again.</li>
<li>I was becoming sick of the desktop quirks. I love Linux, and the developers of the various distros have my absolute and utmost respect; but the unfortunate fact is that drivers for hardware show up there last. Due to its low marketshare among PC OSes vendors have little incentive to develop them themselves, and in many cases, open-source and initially imperfect options are all that is available. That said, give it year or so, and you&#8217;ll likely see solid drivers made available; but that year is one in which I&#8217;m not getting my full money&#8217;s worth.</li>
<li>Honestly, I was doing a bit of introspection and reexamining my prejudices against Windows. Why do I hate it so? Could it be that I&#8217;m not giving it a fair chance, not having used it in nearly 10 years? Windows 7 is purportedly a vast improvement to Vista; maybe it was time to give it a chance.</li>
</ol>
<p>Because of these and other thoughts, I decided to try an experiment: I would switch back to the Windows 7 installation on my other, nigh-forgotten drive and try it out as my primary desktop for a few weeks, and see how it went. This post is the story of the start of that journey, and how i reached a place where I was at least not anthropomorphizing my machine in the most violent of fashions.</p>
<p>Now, Windows has its problems: certainly it&#8217;s an absolute crap development environment if you want any real, low-level control of a machine, or if you want to do any development in a language that wasn&#8217;t pinched off from the Great Golden Sphincter of Redmond. The registry&#8217;s a horrid design that &#8211; despite purportedly being recognized as such by its own engineers &#8211; has stubbornly persisted through multiple versions and will almost certainly be there in the next. The built-in command-line interface (cmd) and nearly every third-party one I have yet discovered are all so underpowered as to be little more than curiosities and toys. I won&#8217;t even get <em>started</em> about security. However, it does do one thing quite well: provide an ultimately pleasant, consistently usable desktop environment. For everything else &#8211; as they say &#8211; there&#8217;s Linux.</p>
<p><a href="http://blog.centresource.com/2012/10/19/a-confederacy-of-oses-part-iii/">Continued in Part III!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2012/10/17/a-confederacy-of-oses-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Confederacy of OSes, Part I</title>
		<link>http://blog.centresource.com/2012/10/15/a-confederacy-of-oses-part-i/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-confederacy-of-oses-part-i</link>
		<comments>http://blog.centresource.com/2012/10/15/a-confederacy-of-oses-part-i/#comments</comments>
		<pubDate>Mon, 15 Oct 2012 21:42:08 +0000</pubDate>
		<dc:creator>Jeremy Holland</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux/BSD]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4440</guid>
		<description><![CDATA[So, recently I&#8217;ve been trying an experiment: I&#8217;ve been using Windows 7 as a base OS for my primary development box. Why did I do this, and how has it been? Allow me to explain. I have been a *-nix man for many years, starting with Mac OS X and it&#8217;s largely-FreeBSD/NetBSD-derived platform. I have...]]></description>
				<content:encoded><![CDATA[<p>So, recently I&#8217;ve been trying an experiment: I&#8217;ve been using Windows 7 as a base OS for my primary development box. Why did I do this, and how has it been? Allow me to explain.</p>
<p>I have been a *-nix man for many years, starting with Mac OS X and it&#8217;s largely-FreeBSD/NetBSD-derived platform. I have literally nothing bad to say about the software of Mac OS X. Nothing. I adore it. What I <em>don&#8217;t</em> adore is the inflated price of the hardware. Certainly, it is of excellent quality; but I in my frugality have this crazy idea that I shouldn&#8217;t have to pay what Neal Stephenson referred to poetically as &#8220;&lt;expletive-redacted&gt;-you money&#8221; (e.g. $2500+) for a laptop with ultimately mediocre specs. I can get a laptop with just about *twice* the power for virtually <em>half</em> the price from a fully reputable manufacturer if I make what I consider to be the relatively small sacrifice of a sexy, top-of-the-line desktop experience and the social mating plumage that is that familiar, brushed aluminum case.</p>
<p>Up until recently the cost wasn&#8217;t really a factor, as my development machines were supplied largely by my employers, including Centresource. My first day on the job, CS set me up with a brand-new, perfectly splendid little 13&#8243; MBP, 4GB RAM, 250GB HD (this was before they were offered with SSDs) and all the other usual trimmings; in addition to a new 27&#8243; external monitor and even one of those mini-display-port-to-VGA adapters. This machine was an absolute pleasure to develop upon for nearly any task I was asked to complete. Unfortunately, as the size and scope of my workload increased (both as commissioned by CS as well as my own, personal, &#8220;for-fun&#8221; work), I began feeling the pinch of those 4GB. So, of my own volition, I sent out to NewEgg and got myself a couple of 8GB chips for a total of 16GB RAM. Good heavens, did that machine fly now.</p>
<p>However, I was now faced with a few issues:</p>
<ol>
<li>CS owned the machine, but I owned the RAM. This isn&#8217;t really a tangible problem since I don&#8217;t expect to be leaving any time soon, but it was nevertheless an admittedly personal reservation based largely in my perhaps-paranoid concerns for privacy and security.</li>
<li>Being that I have crap eyesight to begin with and like viewing multiple documents simultaneously, 13&#8243; was becoming a bit of a pinch-point for my own development whilst away from a desktop station with its extra monitor, whether at home or the office. I frequent coffee shops quite often as remote work environments, and the degree to which my productivity faltered as a result of being limited to the resolution possible on this machine was becoming unacceptable to me (note: I have what some might consider to be ridiculously high standards for my own productivity). In short, I wanted more real estate on the go &#8211; much more; something like 17&#8243;</li>
</ol>
<p>This being the case, I decided it was high time I bought my own computer, since my last personal purchase of same had been nearly 4 years back and a desktop unit besides (as well as now lying disemboweled and largely forgotten upon a table in my garage). I looked at the prices for an Apple laptop with the specs I desired (even the refurbished models), and almost immediately made the decision to buy a PC and switch to Linux as my main desktop environment &#8211; a decision I had toyed with in the past but never really committed to.  However, in order to maximize my very recent investment in the aforementioned memory, I had to find a machine that would accept the same chips in the same configuration.</p>
<p>I found several candidates, but for the money I settled upon an HP Envy 17&#8243;. I will say here that I will never buy another HP computer again: they had loaded down Windows with a truckload of proprietary crapware, they lock out almost every part of the BIOS worth mentioning, and they had taken up all 4 permitted primary partitions on the weird Intel pseudo-RAID array (one with a restore disk-image because they&#8217;re too cheap to print the thing to a DVD, the other with something called HP_TOOLS the purpose of which I cannot readily fathom and have no desire to learn lest it anger me further). Of course, my usage of Windows while in possession of this machine was intended to be minuscule if present at all, and so I quickly set out about installing my preferred Linux desktop distro, Linux Mint (then version 12).</p>
<p><a href="http://blog.centresource.com/2012/10/17/a-confederacy-of-oses-part-ii/">Continued in Part II!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2012/10/15/a-confederacy-of-oses-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WOW! Now playing on Spotify!</title>
		<link>http://blog.centresource.com/2012/09/26/wow-now-playing-on-spotify/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wow-now-playing-on-spotify</link>
		<comments>http://blog.centresource.com/2012/09/26/wow-now-playing-on-spotify/#comments</comments>
		<pubDate>Wed, 26 Sep 2012 13:45:32 +0000</pubDate>
		<dc:creator>Chip Hayner</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[spotify]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=4404</guid>
		<description><![CDATA[Last year, we had the opportunity to work with WOW, a collaboration of the top Christian and Gospel music from EMI Christian Music Group, Provident Label Group, and Word Entertainment, by redesigning their website. This year, they asked us to come back and help them create an app for Spotify, an online music service. The...]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.centresource.com/content/uploads/2012/09/spotify-wow.png"><img src="http://blog.centresource.com/content/uploads/2012/09/spotify-wow-300x233.png" alt="" title="spotify-wow" width="300" height="233" class="alignright size-medium wp-image-4406" /></a>Last year, we had the opportunity to work with WOW, a collaboration of the top Christian and Gospel music from EMI Christian Music Group, Provident Label Group, and Word Entertainment, by redesigning <a href="http://wowilovechristianmusic.com/" target="_blank">their website</a>. This year, they asked us to come back and help them create an app for <a href="http://spotify.com" target="_blank">Spotify</a>, an online music service.</p>
<p>The goal was to create a music discovery application that provided users a unique experience in finding the best in Christian and Gospel music. We&#8217;re pretty excited with the results!</p>
<p><a href="http://smarturl.it/WOWapp?IQid=csblog" target="_blank">Check out the new app &#8212; now playing on Spotify</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2012/09/26/wow-now-playing-on-spotify/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freakin&#8217; asymptotic notation: How does that work?</title>
		<link>http://blog.centresource.com/2012/01/23/freakin-asymptotic-notation-how-does-that-work/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freakin-asymptotic-notation-how-does-that-work</link>
		<comments>http://blog.centresource.com/2012/01/23/freakin-asymptotic-notation-how-does-that-work/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 18:15:32 +0000</pubDate>
		<dc:creator>Jeremy Holland</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Theory]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=3623</guid>
		<description><![CDATA[OK, I&#8217;ll be the first to admit it &#8211; math is my favorite subject. I know that makes me weird &#8211; even among fellow working software engineers &#8211; but it&#8217;s the truth. It&#8217;s also the truth that while they may be boring to many, knowing even a little bit about the numbers of computer science...]]></description>
				<content:encoded><![CDATA[<p>OK, I&#8217;ll be the first to admit it &#8211; math is my favorite subject. I know that makes me weird &#8211; even among fellow working software engineers &#8211; but it&#8217;s the truth. It&#8217;s also the truth that while they may be boring to many, knowing even a little bit about the numbers of computer science can help make you a better software engineer. Today, we&#8217;re going to look at a little piece of applied discrete math &#8211; the analysis of algorithms &#8211; and how we can empirically describe the performance of one algorithm with respect to another using something called &#8220;asymptotic notation&#8221;. If you already know what this is and how to read the various sub-notations, skip the rest of this post: it&#8217;s old news. If you do not know what this is, and would like to, read on! If you do not know what this is and don&#8217;t care, read on anyway &#8211; I promise you it&#8217;ll be worth it.</p>
<p>Now, while I&#8217;m totally guilty of bandying around big scary terms like &#8220;asymptotic notation&#8221; (I&#8217;m a notorious stickler for nomenclature), what this boils down to is the following mathematical notation (and its related brothers, which we&#8217;ll get to later):</p>
<p>[O(g(n))]</p>
<p>Most typically, you&#8217;ll see this used and referred to not as (O(g(n))), which doesn&#8217;t serve much purpose unless we know already what (g(n)) is, but rather in terms of a <strong>specific</strong> (g(n)), say, (n^2):</p>
<p>[O(n^2)]</p>
<p>Moreover, for the purposes of this discussion, we&#8217;re going to look primarily at the following notation style:</p>
<p>[f(n) = O(n^2)]</p>
<p>So what on earth does this mean? Well, let&#8217;s think about algorithms. What is an algorithm? Simply a series of instructions for performing some task, right? In computing specifically an algorithm is implemented as an actual, written program in your language of choice. But under the hood, mathematically, an algorithm is a <strong>function</strong> (sometimes pure, sometimes not): it takes some input(s) and delivers some output. In the above block o&#8217; math, let us equate (f(n)) with some algorithm we would like to implement, say, sorting an array of integers from least to greatest. With an algorithm such as that, you would give it an array of dubiously sorted values, and it would give you back an array containing exactly the same elements but in sorted order. Represented mathematically, we have:</p>
<p>[s(a)]</p>
<p>where (s) is the algorithm function itself, and (a) is the array to be sorted. Now, let&#8217;s keep in mind that there are many different ways of going about sorting an array &#8211; naturally, we would like to pick the fastest one for the task at hand. So in order to know anything about the <em>performance</em> of an algorithm, we should probably come up with some way to represent how long it takes to run. To wit:</p>
<p>[T(s(a))]</p>
<p>represents the &#8220;time&#8221; (T) it takes to run algorithm (s) on input (a). OK. So, how can we begin to reason about what the range of this function might be? Actually, perhaps that&#8217;s jumping the gun &#8211; what would really be the <em>domain</em> of this function? What measurement of your general work-a-day sorting algorithm would dictate how long it takes to run? The answer, my friend, is the size of the input: it should make sense to anybody who&#8217;s actually had to do it that sorting a 10-element array is a heck of a lot faster than sorting a 10,000,000-element array. So, really, our (T) function can be abstracted further as a function of (n), where (n) is the size of the array to be sorted:</p>
<p>[T(n)]</p>
<p>Since the value of (T(n)) will grow as (n) grows (presumably), this seems like a solid footing to start our thinking upon.</p>
<p>Alrighty. Now that we&#8217;ve got some notation to start thinking about how we&#8217;ll build this bad boy, let&#8217;s actually pick a real, concrete algorithm and think through it. For the purposes of simplicity and succinctness (cue laughter), I&#8217;m going to go with <a href="http://en.wikipedia.org/wiki/Bubble_sort">Bubble Sort</a>. If you want to learn more about the actual algorithm, I suggest you read the wikipedia article linked to above, because I&#8217;m gonna skip over a fat exposition on what it actually does and how it does it in favor of thinking about how long it <em>takes</em> to do it, and specifically how long it takes to do it to the worse possible case of input: an array that&#8217;s already been sorted, but reversed. Please note I have copied the following pseudocode directly from wikipedia, and credit therefor is due directly to the author of the page linked to above.</p>
<div style="float: right; text-align: right; line-height: 20px;">(c_{1})<br />
(c_{2})<br />
(c_{3}n)<br />
(c_{4}n)<br />
(c_{5}n(n-1))<br />
(c_{6}n(n-1))<br />
(c_{7}n(n-1))</p>
<p>(c_{8}n)</p></div>
<div style="line-height: 20px;">procedure bubbleSort( A : list of sortable items )<br />
repeat<br />
swapped = false<br />
for i = 1 to length(A) &#8211; 1 inclusive do:<br />
if A[i-1] &gt; A[i] then<br />
swap( A[i-1], A[i] )<br />
swapped = true<br />
end if<br />
end for<br />
until not swapped<br />
end procedure</div>
<p>OK, so that&#8217;s the algorithm from wikipedia &#8211; but what&#8217;s all that nasty-looking business on the right? Put quite simply, that&#8217;s our best guess as to how long that line of code takes to execute! Note that each line is some function of (n) and some constant (c_{i}). Now if we wanted to figure out <em>exactly</em> how long this algorithm takes to run, we&#8217;d need to know the value of those contants, e.g. (c_{1} = 12.2ms) or something. You&#8217;ll notice that some lines <em>only</em> seem to take a constant time to run; that&#8217;s because those lines are only executed once <em>regardless of how big the input is</em>. Other lines are the associated constant multiplied by (n) &#8211; those lines will execute once for every unit of input. Still others are multiplied by (n(n-1)) &#8211; these lines are executed (n-1) times for each input. Now, handily, we can figure out our overall formula by just adding all these things together:</p>
<p>[T(n) = c_{1} + c_{2} + c_{3}n + c_{4}n + c_{5}n(n-1) + c_{6}n(n-1) + c_{7}n(n-1) + c_{8}n]<br />
[T(n) = c_{1} + c_{2} + c_{3}n + c_{4}n + c_{5}n^{2}-n + c_{6}n^{2}-n + c_{7}n^{2}-n + c_{8}n]<br />
[T(n) = (c_{5} + c_{6} + c_{7})n^{2} + (c_{3} + c_{4} + c_{8} - 3)n + (c_{1} + c_{2})]</p>
<p>But it turns out that the precise value of each constant is practically useless &#8211; the constants in question represent such complex matters and concrete facts of the real world as language of implementation, hardware specs, how many other processes are fighting for CPU time, etc. Remember that we only really care about the performance of the <em>algorithm</em> &#8211; not the performance of the hardware or implementation thereof, which is not affected by the algorithm itself. So we can happily simplify our job by just getting rid of all those pesky constants!</p>
<p>[T(n) = n^{2} + n]</p>
<p>Wow, much nicer! But guess what: it gets even simpler. Since, for large enough inputs, the contribution of the lower-order term (n) makes virtually no difference to the output number, we can happily drop that too:</p>
<p>[T(n) = n^{2}]</p>
<p>And voilá! Unfortunately, we&#8217;ve boiled this timing function down so far and stripped so much from it that we can&#8217;t really say that (T(n)) is <em>exactly</em> (n^{2}), just that (in the worst case) it follows a similar curve. More precisely, we have virtually guaranteed that, for large enough inputs, it can never be bigger than some constant (c) <em>times</em> (n^{2}). This is the crux of asymptotic notation &#8211; specifically what is referred to as &#8220;Big-O notation&#8221;. As such, when we say that:</p>
<p>[T(n) = O(n^{2})]</p>
<p>What we mean is that there are some constants (c) and (a), such that for all (n) where (0 le a &lt; n), we know that (T(n) le cn^{2}).</p>
<p>It should also be pointed out that the notation&#8217;s use of the &#8220;equals sign&#8221; is a little unusual &#8211; we&#8217;re not saying that (T(n)) <em>is equal to</em> (O(n^{2})), but that it is of equal or lesser <em>order</em> to (n^{2}). This might be a bit of a trick to wrap your head around at first (it certainly was to me). If I&#8217;d have written the notation myself, I&#8217;d have tried to use some symbol that didn&#8217;t already carry all the connotations and denotations the &#8220;equals sign&#8221; itself does; but c&#8217;est la vie &#8211; this is the way it&#8217;s done. Another way (in fact, the proper way) to think of it is to think of (O(n^{2})) being some set of functions that follow the above definition, and for the notation</p>
<p>[T(n) = O(n^{2})]</p>
<p>to in fact mean</p>
<p>[T(n) in O(n^{2})]</p>
<p>i.e. that (T(n)) is an <em>element</em> of the set (O(n^{2})).</p>
<p>OK, so we&#8217;ve been able to put an upper bound on some hypothetical order of our function (T(n)), but what does that really tell us? Not a whole lot, in isolation. But it really comes into play when you consider other algorithms, such as, say <a href="http://en.wikipedia.org/wiki/Merge_Sort">Merge Sort</a>, which is bounded on top not by (O(n^{2})), but by (O(nlog_{2}n))! Graph those two functions and here&#8217;s what you get ((n^{2}) is in black, (nlog_{2}n) is in red):</p>
<p><a href="http://blog.centresource.com/wordpress/../wp-content/uploads/2012/01/graph-e1327292605398.png"><img class="alignnone size-medium wp-image-4131" title="graph" src="http://blog.centresource.com/content/uploads/2012/01/graph-e1327292808431-300x173.png" alt="" width="300" height="173" /></a></p>
<p>This is a bit of an oversimplification, but sufficient to demonstrate the idea &#8211; notice that very quickly, (n^{2}) begins to overtake (nlog_{2}n), and continues to do so, the gap getting ever wider as n gets ever bigger; and just like in golf, the lower score is the one you want.</p>
<p>So, in what I hope was nutshell-ish if not perfectly so, that&#8217;s the basics of asymptotic notation! There are other, related notations like &#8220;Big Theta&#8221; (Theta(g(n))), &#8220;Big Omega&#8221; (Omega(g(n))), and the lower-case versions of omega and o, but I&#8217;ll leave those to you to explore.</p>
<p>Finally, as a disclaimer, I have tried to make the math herein as simple as possible for the purposes of the demonstration, and I could easily have borked something up terribly (I&#8217;m still getting the hang of LaTeX). If you spot an error, comment and I&#8217;ll see that it&#8217;s corrected. Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2012/01/23/freakin-asymptotic-notation-how-does-that-work/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSSOff</title>
		<link>http://blog.centresource.com/2011/12/13/cssoff/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cssoff</link>
		<comments>http://blog.centresource.com/2011/12/13/cssoff/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 16:57:22 +0000</pubDate>
		<dc:creator>Michael Calhoun</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=3885</guid>
		<description><![CDATA[Recently, Unmatched Style sponsored some &#8220;Friendly Markup Fisticuffs&#8221; where they issued design files to whoever wanted to compete, and the competitors would have two weeks to create a website using only their brains and their computers.  The rules were pretty straightforward: one page only necessary, all external libraries (jQuery, et al.) had to be included,...]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.centresource.com/content/uploads/2011/12/CSSOFF2011-Design_small.png"><img class="alignright size-full wp-image-3962" title="CSSOff Design" src="http://blog.centresource.com/content/uploads/2011/12/CSSOFF2011-Design_small.png" alt="" width="250" height="706" /></a>Recently, <a title="Unmatched Style" href="http://unmatchedstyle.com/" target="_blank">Unmatched Style</a> sponsored some &#8220;Friendly Markup Fisticuffs&#8221; where they issued design files to whoever wanted to compete, and the competitors would have two weeks to create a website using only their brains and their computers.  The rules were pretty straightforward: one page only necessary, all external libraries (jQuery, et al.) had to be included, and your submission had to run locally. Otherwise, go nuts.</p>
<p>The <a title="CSSOff Judges" href="http://www.unmatchedstyle.com/cssoff/judges.php" target="_blank">judges</a> would then review your work and score it based on code (cleanliness, semantics, and validation); user experience (respect for design, good choice points, interactions); and support (modern browsers, legacy browsers, size of project, resource optimization).  In the judges hands rests the responsibility of deciding one grand prize winner, 2 second place winners, 2 third place winners, and 20 runners-up.</p>
<p>A few Centresourcers were up to the challenge, here is what they had to say about the experience:</p>
<h3>Mike Calhoun</h3>
<p>The big thing that jumped out at me with this design was how EVERYTHING had a textured background associated with it. After that initial shock, my attention turned to points that seemed like they could have some kind of user interaction. There were none specified by the designer and the rules had specified that it was left to the coder to decide what (if any) they would like.  The obstacles section was an obvious choice for some kind of hover/transition.  The count down clock and form area also seemed like something that would have an room to explore with whatever I came up with while creating the markup. After a closer look, a few other smaller nuances caught my eye such as the small transparent border at the end and beginning of each section, the text shadows and many of the headings, or (again) the textured background.  In the end, I made a conscious decision to try and keep this as small as possible in terms of the file size and sacrifice complete compatibility for items like the above nuances in legacy browsers.  Although this probably hurt me in terms of scoring, I thought it would be more beneficial to learn newer practices for HTML5 and CSS3 versus supporting Internet Explorer 6 (which honestly has not been something I’ve thought about for a few years).  The trade off worked out well for modern browsers as everything looked pretty close to the design and I was able to use lots of CSS3 properties to accomplish the gradient background effects (rgba transparent backgrounds with a gradient image), font face properties for all the non standard fonts (allowed for the ticking clock), and extensive use of the jQuery animate property for my transition effect on the prizes section. In all, this was a  great experience that should pay off in the long run for applying new process to future work.</p>
<h3>Travis Roberts</h3>
<p>Mike went over the different sections/elements of the design, so I&#8217;ll talk about some of the tricks I used to accomplish the design while still keeping file sizes nice and small.</p>
<p>First, I exported all of my images as transparent GIFs instead of PNGs. The judging gives points for compatibility with older browsers, and everyone&#8217;s favorite browser to hate, Internet Explorer 6, doesn&#8217;t support transparent PNGs. The image quality of the exported assets were comparable as GIFs, the file sizes were much smaller, and they work with IE6 without having to do any weird hacks. By using GIFs, the total size for all image assets clocked in around 868KB.</p>
<p>Second, I used a CSS3 library (<a href="http://daneden.me/animate" target="_blank">Animate</a> by <a href="http://daneden.me/" target="_blank">Daniel Eden</a>) to accomplish all of the effects/transitions. This may seem counterintuitive to my previous paragraph about older browser compatibility. My thought was that effects/transitions are progressive enhancements. The site will still work fine without them, but they add a little polish to browsers that understand them. Because I used the CSS3 library for my effects, the only external javascript file I included was jQuery. This allowed my total project size to be relatively small (~1.1MB zipped).</p>
<p>My entry: <a href="http://cssoff.csclientsite.com/troberts/">http://cssoff.csclientsite.com/troberts/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2011/12/13/cssoff/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Technology Agnosticism and its Significance to Me</title>
		<link>http://blog.centresource.com/2011/11/07/technology-agnosticism-and-its-significance-to-me/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=technology-agnosticism-and-its-significance-to-me</link>
		<comments>http://blog.centresource.com/2011/11/07/technology-agnosticism-and-its-significance-to-me/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 18:27:57 +0000</pubDate>
		<dc:creator>Michael Calhoun</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.centresource.com/?p=3747</guid>
		<description><![CDATA[Starting out in web development, one fundamental truth that was difficult for me to understand is that there is no silver bullet for all client challenges. It was initially very easy to get comfortable building one kind of website with one tool; however, when a new challenge came along that tool wasn’t always the right...]]></description>
				<content:encoded><![CDATA[<p>Starting out in web development, one fundamental truth that was difficult for me to understand is that there is no silver bullet for all client challenges.  It was initially very easy to get comfortable building one kind of website with one tool; however, when a new challenge came along that tool wasn’t always the right one for the job.  As a nascent programmer, I fell into the “when all you have is a hammer, then everything looks like a nail” mindset for one reason: I was pretty unsure of my skills. If I was able to do something well, fast, and it made clients happy then I did not want to stray from that comfort zone.  But that model was unsustainable in a constantly changing field.  Fundamentally, after a few years of development work, if all you have is a hammer then it may be time to consider a job besides carpentry.  To move beyond this hammer mindset, a sense of aloofness and open mindedness are necessary.</p>
<p>I started out programming Drupal which endeared it to me because it was my first job, I understood it, and my employer thought highly enough of my skills to pay me.  What I needed to better understand was that Drupal was not the only game in town.  When presented with a new problem one must always consider what the problem looks to solve and what best accomplishes that solution.  For me, I was confronted with a project that needed a pretty extensive custom database that, as hard as I tried, I could not get to work well with Drupal.  After extensive research I (begrudgingly) decided that Ruby on Rails was my best option.  This reflects another fact of life in web development: things advance very quickly (and usually for the better).  When I started my first job, Rails was still in version 1.x with syntax that was not immediately understandable to me and was lacking in the documentation or as big a community as PHP and Drupal.  By the time I came back to Rails, much had changed.  Rails was older, the documentation was great, and it made complete sense for this problem. In the end, the only hurdle to overcome were my preconceived notions about frameworks and how I understood them to work.  I had to  consider that something had gotten better, and realize the goal wasn’t to build a site in Drupal, but to build a site that thoughtfully considered the clients&#8217; needs and best addressed the goal of the project.</p>
<p>Much has been said about what technology agnosticism means or if it is even something at all.  For me, it means rationally and carefully thinking of the problem and how to best solve it, where best does not mean “something with which I’m most comfortable”. This is true in all facets, be it language, framework, Drupal module, Ruby gem, or Rails plugin.  We can use that with which we are most comfortable to start with, but from that point find other tools which improve our skills and improve our process.  As Marshal McLuhan, said in his book <em>The Medium is The Message</em>, “we shape our tools and thereafter our tools shape us.”</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.centresource.com/2011/11/07/technology-agnosticism-and-its-significance-to-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
