<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Skookum Blog</title>
	
	<link>http://skookum.com</link>
	<description>We're a web development firm jumping into product development and sharing everything we learn about design, development, and marketing as we go.</description>
	<lastBuildDate>Mon, 14 May 2012 11:05:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/skookum/blog" /><feedburner:info uri="skookum/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>35.227192</geo:lat><geo:long>-80.844193</geo:long><item>
		<title>The Guinea Pig Speaks: Skookum’s Internship Program</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/k5V3f6EoYRQ/</link>
		<comments>http://skookum.com/blog/the-guinea-pig-speaks-skookums-internship-program/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 18:41:09 +0000</pubDate>
		<dc:creator>Raquel</dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=2059</guid>
		<description><![CDATA[Roughly six weeks ago or so, I arrived at Skookum Digital Works as its first-ever participant in the Official Internship Program. (There have been other interns before me, but they flew ad-hoc routes.) As a former robotics engineer, my love of code was high, but my actual knowledge of HTML/CSS/JavaScript/allThingsWeb was rather low. Fortunately, the [...]]]></description>
			<content:encoded><![CDATA[<p>Roughly six weeks ago or so, I arrived at Skookum Digital Works as its first-ever participant in the Official Internship Program. (There have been other interns before me, but they flew ad-hoc routes.)</p>
<p>As a former robotics engineer, my love of code was high, but my actual knowledge of HTML/CSS/JavaScript/allThingsWeb was rather low. Fortunately, the good folks at Skookum saw my potential and gave me a shot at pursuing my new-found passion, web development!</p>
<p>There are six major components to the Skookum Internship Program:</p>
<ol>
<li>Projects
<ol type="a">
<li>Internal
<ul>
<li>On this project, I didn&#8217;t have to answer to any clients; instead, I worked with <a href="http://www.twitter.com/joshoakhurst" target="_blank">Josh</a>, our Creative Director, to build something AWESOME. (And learn some skills on my own.)</li>
<li>Sometimes these projects are academic in nature, but they&#8217;re all good opportunities to get some good learning in.</li>
</ul>
</li>
<li>Client-focused
<ul>
<li>These real, client-based projects, are what make Skookum tick. Clients want the best product they can get for their hard-earned money, and I got to help make them happen.</li>
</ul>
</li>
</ol>
</li>
<li>Location
<ol type="a">
<li>Working at <a href="http://maps.google.com/maps?q=trade+and+tryon,+clt+nc&#038;hl=en&#038;ll=35.226778,-80.842445&#038;spn=0.006091,0.013111&#038;sll=37.0625,-95.677068&#038;sspn=49.624204,107.402344&#038;t=h&#038;hnear=N+Tryon+St+%26+W+Trade+St,+Charlotte,+Mecklenburg,+North+Carolina&#038;z=17&#038;layer=c&#038;cbll=35.227201,-80.84309&#038;panoid=FEKVpxRU5eUrM8Ve26pmFA&#038;cbp=12,284.86,,0,-36.71" target="_blank">Trade &#038; Tryon</a> in Uptown Charlotte is pretty sweet. </li>
<li>With a real office, too.
<ul>
<li>I didn&#8217;t get stuck in a closet away from all the cool kids; I actually worked right alongside the rest of the Skookum team. I worked on the same teams looked at the same code and ate the same lunch as everyone else. </li>
</ul>
</li>
</ol>
</li>
<li>Compensation
<ol type="a">
<li>Skookum&#8217;s Internship program <strong>is a paid position</strong>—how often does that happen in other industries?</li>
</ol>
</li>
<li>Hours
<ol type="a">
<li>Just like the big kids, I got to work normal hours. In the web dev world, that&#8217;s not necessarily 9-5, which is awesome. But it&#8217;s full-time, not part-time, which means 40 hours/week of intense learning.</li>
</ol>
</li>
<li>Mentors
<ol type="a">
<li>Every member of the Skookum team was accessible to me. I think the original point of the mentors was to have one mentor per intern, but I&#8217;m pretty non-traditional and I made <em>everyone</em> my mentor. For me, asking everyone for help was a good way to get to know the team and learn as much as I possibly could. Skookumites come in a wide variety of flavors: we&#8217;ve got Ruby pros, sick PHP devs, Node.js champions, and jQuery gurus, to name a few. To <em>not</em> take advantage of the diversity would be a huge mistake.</li>
</ol>
</li>
<li>End-game
<ol type="a">
<li>The goal of the program is to transition interns into full-on (junior) developers. In some ways, it&#8217;s like the longest interview ever. But it&#8217;s also an amazing opportunity to get into the web development game, with a pretty low amount of risk for everyone.</li>
<li>I&#8217;ll be honest—I wasn&#8217;t entirely sure that web development would be the right career for me when I started; it turns out I&#8217;ve been a closet web developer my whole life! The Skookum Internship program helped me find that out.</li>
<li>It&#8217;s with that notion that I&#8217;m thrilled and honored now to be Skookum&#8217;s latest Junior Developer, hot off the presses.</li>
</ol>
</li>
</ol>
<p>All said and done, being an intern was crazy fun—I got to work with some really smart folks in hands-down the most relaxed and productive environment I&#8217;ve ever known. I&#8217;m shipping real code and making a real contribution to the team. Huzzah!</p>
<p>Now, if you&#8217;ll excuse me, I&#8217;ve got to get back to building a better Internet.</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/k5V3f6EoYRQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/the-guinea-pig-speaks-skookums-internship-program/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/the-guinea-pig-speaks-skookums-internship-program/</feedburner:origLink></item>
		<item>
		<title>Using WordPress as a User and Authentication Database</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/NDWExhxhF-E/</link>
		<comments>http://skookum.com/blog/using-wordpress-as-a-user-and-authentication-database/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 13:35:03 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code Samples]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=2041</guid>
		<description><![CDATA[WordPress is a great tool and you can hack all sorts of functionality into it, but have you ever thought about using it as a user authentication database for content on your server that is outside the realm of WordPress? Maybe a wiki or media server application that you only want your registered WordPress users [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress is a great tool and you can hack all sorts of functionality into it, but have you ever thought about using it as a user authentication database for content on your server that is outside the realm of WordPress? Maybe a wiki or media server application that you only want your registered WordPress users to access.</p>
<p>There are some really awesome authentication tools built right into WordPress that you can use verify a username and password within your WordPress install. You can even look at that user&#8217;s specific capabilities to determine if they get access or not based on their role or capabilities.</p>
<p>In the following example, I use PHP&#8217;s ability to present the user with a basic HTTP authentication dialog box, and then it&#8217;s authenticated against the WordPress database.</p>
<script src="https://gist.github.com/2304788.js"></script><noscript><p>View the code on <a href="https://gist.github.com/2304788">Gist</a>.</p></noscript>
<p>Only thing I haven&#8217;t done is set a cookie that keeps them logged in across browser sessions.</p>
<p>This works great if you&#8217;ve got an application that has a rewrite to a single index.php file to serve everything, or else put it into a header file that gets served on every page (above any HTML output since it sends our HTTP headers).</p>
<p>And remember: this security is only as good as WordPress security–which is to say &#8220;<a href="http://www.securiteam.com/cgi-bin/htsearch?config=&amp;restrict=&amp;exclude=&amp;method=and&amp;format=long&amp;sort=revtime&amp;words=wordpress">not very secure</a>&#8221; but it sure beats an internal non-password protected server that anyone could access simply by plugging into your physical network and browsing around.</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/NDWExhxhF-E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/using-wordpress-as-a-user-and-authentication-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/using-wordpress-as-a-user-and-authentication-database/</feedburner:origLink></item>
		<item>
		<title>Tech Talk: Consistency In Interactive Design</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/OtLiH_K9cRA/</link>
		<comments>http://skookum.com/blog/tech-talk-consistency-in-interactive-design/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 18:32:51 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Tech Talks]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=2003</guid>
		<description><![CDATA[In case you missed SDW designer Rich Robinson&#8217;s Tech Talk on Consistency in Interactive Design, the entire transcript of the presentation (as well as pretty slides and pictures) is now online. Rich&#8217;s cool talk covers internal vs. external design consistency, the Clear and Path iOS UI, Android designer woes, and a guy named Oscar (the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://skookum.com/consistency-in-interactive-design/"><img src="http://skookum.com/wp-content/uploads/2012/03/Rick_Talk_small-300x199.jpg" alt="" title="design talk" width="300" height="199" class="alignright size-medium wp-image-1967" /></a>In case you missed SDW designer <a href="http://twitter.com/rrobinson81">Rich Robinson&#8217;s</a> Tech Talk on Consistency in Interactive Design, the entire transcript of the presentation (as well as pretty slides and pictures) <a href="http://skookum.com/consistency-in-interactive-design/">is now online</a>.</p>
<p>Rich&#8217;s cool talk covers internal vs. external design consistency, the Clear and Path iOS UI, Android designer woes, and a guy named Oscar (the Grouch).</p>
<p><a href="http://skookum.com/consistency-in-interactive-design/">Check out the Skookum Digital Works Tech Talk on Consistency in Interactive Design.</a> </p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/OtLiH_K9cRA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/tech-talk-consistency-in-interactive-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/tech-talk-consistency-in-interactive-design/</feedburner:origLink></item>
		<item>
		<title>The Kitchen Sink of Developer Productivity</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/3r_VUQrIxiE/</link>
		<comments>http://skookum.com/blog/developer-productivity/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 18:02:51 +0000</pubDate>
		<dc:creator>Corey Ballou</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1882</guid>
		<description><![CDATA[The development community as a whole is growing in leaps and bounds. We have far more languages, frameworks, libraries, modules, and plugins at our disposal than ever before. The decision making process of choosing the right tool for the task is becoming increasingly difficult. Our toolchain is growing at a blistering pace; we have to [...]]]></description>
			<content:encoded><![CDATA[<p>The development community as a whole is growing in leaps and bounds. We have far more languages, frameworks, libraries, modules, and plugins at our disposal than ever before. The decision making process of choosing the right tool for the task is becoming increasingly difficult. Our toolchain is growing at a blistering pace; we have to be diligent in order to keep up to date. </p>
<p><span id="more-1882"></span></p>
<p>There&#8217;s been a drastic increase in the number of developer productivity tools as of late; particularly for frontend developers. These tools come in many shapes or forms, whether they be software, a command line interface, a domain-specific language (DSL), framework, database, etc. Below, I&#8217;ve created an abridged list of some of the top tools (my picks, I can&#8217;t speak on behalf of everyone). It&#8217;s quite lengthy, so each section is itself a collapsible accordion.</p>
<h3 style="margin-top: 32px;">Popular Development Tools for Polyglots</h3>
<p><small><em style="color:#777">Hint: Click on a particular topic heading to expand/view it&#8217;s children.</em></small></p>
<div id="accordion">
<h4><a href="#">Frameworks and DSLs</a></h4>
<div>
<ul>
<li><a href="http://expressjs.com/" rel="nofollow" target="_blank">Express</a><br />
Express is a high performance, high class web development framework for Node.js.</li>
<li><a href="http://www.senchalabs.org/connect/" rel="nofollow" target="_blank">Connect</a><br />
Connect is a middleware framework for node, shipping with over 18 bundled middleware and a rich selection of 3rd-party middleware.</li>
<li><a href="http://framework.zend.com/" rel="nofollow" target="_blank">Zend Framework</a><br />
Zend Framework is based on simplicity, object-oriented best practices, corporate friendly licensing, and a rigorously tested agile codebase. Zend Framework is focused on building more secure, reliable, and modern Web 2.0 applications &amp; web services, and consuming widely available APIs.</li>
<li><a href="http://www.symfony-project.org/" rel="nofollow" target="_blank">Symfony</a><br />
Symfony is a full-stack framework, a library of cohesive classes written in PHP. It provides an architecture, components and tools for developers to build complex web applications faster. Choosing symfony allows you to release your applications earlier, host and scale them without problem, and maintain them over time with no surprise.</li>
<li><a href="http://kohanaframework.org/" rel="nofollow" target="_blank">Kohana</a><br />
An elegant HMVC PHP5 framework that provides a rich set of components for building web applications.</li>
<li><a href="http://codeigniter.com/" rel="nofollow" target="_blank">CodeIgniter</a><br />
CodeIgniter is a powerful PHP framework with a very small footprint, built for PHP coders who need a simple and elegant toolkit to create full-featured web applications.</li>
<li><a href="http://rubyonrails.org/" rel="nofollow" target="_blank">Ruby on Rails</a><br />
Ruby on Rails is an open-source web framework that&#8217;s optimized for programmer happiness and sustainable productivity. It lets you write beautiful code by favoring convention over configuration.</li>
<li><a href="http://www.sinatrarb.com/" rel="nofollow" target="_blank">Sinatra</a><br />
Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort.</li>
<li><a href="https://www.djangoproject.com/" rel="nofollow" target="_blank">Django</a><br />
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Django was designed to handle two challenges: the intensive deadlines of a newsroom and the stringent requirements of the experienced Web developers who wrote it. It lets you build high-performing, elegant Web applications quickly.</li>
<li><a href="http://coffeescript.org" rel="nofollow" target="_blank">CoffeeScript</a><br />
CoffeeScript is a little language that compiles into JavaScript. Underneath all those awkward braces and semicolons, JavaScript has always had a gorgeous object model at its heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way. The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime.</li>
</ul>
</div>
<h4><a href="#">Traditional Databases (RDBMs)</a></h4>
<div>
<ul>
<li><a href="http://www.mysql.com/" rel="nofollow" target="_blank">MySQL</a><br />
The world&#8217;s most popular open source database. It is available under the GPL license and is supported by a huge and active community of open source developers. MySQL also released MySQL Cluster, which is a write-scalable, real-time, ACID-compliant transactional database, designed to deliver 99.999% availability. With a distributed, multi-master architecture and no single point of failure, MySQL Cluster scales horizontally on commodity hardware with auto-sharding (partitioning) to serve read and write intensive workloads, accessed via SQL and NoSQL interfaces.</li>
<li><a href="http://www.postgresql.org/" rel="nofollow" target="_blank">PostgreSQL</a><br />
PostgreSQL is a powerful, open source object-relational database system. It has more than 15 years of active development and a proven architecture that has earned it a strong reputation for reliability, data integrity, and correctness. It runs on all major operating systems.</li>
<li><a href="http://www.oracle.com/us/products/database/index.html" rel="nofollow" target="_blank">Oracle 11g</a><br />
Oracle Database 11g delivers industry leading performance, scalability, security, and reliability on a choice of clustered or single-servers running Windows, Linux, and UNIX.</li>
<li><a href="http://www.oracle.com/us/products/database/index.html" rel="nofollow" target="_blank">SQL Server</a><br />
Microsoft SQL Server is a cloud-ready information platform that will help organizations unlock breakthrough insights across the organization and quickly build solutions to extend data across on-premises and public cloud, backed by mission critical confidence.</li>
<li><a href="http://www.sqlite.org/" rel="nofollow" target="_blank">SQLite</a><br />
SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite is the most widely deployed SQL database engine in the world. The source code for SQLite is in the public domain.</li>
</ul>
</div>
<h4><a href="#">NoSQL</a></h4>
<div>
<ul>
<li><a href="http://www.mongodb.org/" rel="nofollow" target="_blank">MongoDB</a><br />
MongoDB (from &#8220;humongous&#8221;) is a scalable, high-performance, open source NoSQL database. Written in C++, MongoDB features document-oriented storage, full index support, replication &amp; high availability, auto-sharding, querying, fast in-place updates, and map/reduce.</li>
<li><a href="http://redis.io/" rel="nofollow" target="_blank">Redis</a><br />
Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.</li>
<li><a href="http://couchdb.apache.org/" rel="nofollow" target="_blank">CouchDB</a><br />
Apache CouchDB is a document-oriented database that can be queried and indexed using JavaScript in a MapReduce fashion. CouchDB also offers incremental replication with bi-directional conflict detection and resolution.</li>
</ul>
</div>
<h4><a href="#">HTML Templating</a></h4>
<div>
<ul>
<li><a href="http://jade-lang.com" rel="nofollow" target="_blank">Jade</a><br />
Jade is a high performance HTML template engine heavily influenced by Haml and implemented with JavaScript for node. It has implementations written in Node.JS, PHP, Scala, and Python.</li>
<li><a href="http://haml-lang.com/" rel="nofollow" target="_blank">HAML</a><br />
Haml is a markup language that’s used to cleanly and simply describe the HTML of any web document without the use of inline code. Haml functions as a replacement for inline page templating systems such as PHP, ASP, and ERB, the templating language used in most Ruby on Rails applications. However, Haml avoids the need for explicitly coding HTML into the template, because it itself is a description of the HTML, with some code to generate dynamic content.</li>
<li><a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html" rel="nofollow" target="_blank">ERB</a><br />
ERB provides an easy to use but powerful templating system for Ruby. Using ERB, actual Ruby code can be added to any plain text document for the purposes of generating document information details and/or flow control.</li>
<li><a href="http://slim-lang.com/" rel="nofollow" target="_blank">SLIM</a><br />
Slim is a fast, lightweight template engine for Ruby whose goal is reduce the syntax to the essential parts without becoming cryptic. Slim uses Temple and Tilt. If you want to learn how Slim works, you&#8217;ll need to study these projects.</li>
</ul>
</div>
<h4><a href="#">Dynamic CSS</a></h4>
<div>
<ul>
<li><a href="http://lesscss.org/" rel="nofollow" target="_blank">LESS</a><br />
LESS extends CSS with dynamic behavior such as variables, mixins, operations and functions. LESS runs on both the client-side (IE 6+, Webkit, Firefox) and server-side, with Node.js and Rhino.</li>
<li><a href="http://learnboost.github.com/stylus/" rel="nofollow" target="_blank">Stylus</a><br />
Stylus is expressive, dynamic, and robust CSS for node. It provides an efficient, dynamic, and expressive way to generate CSS. Supporting both an indented syntax and regular CSS style.</li>
<li><a href="http://sass-lang.com/" rel="nofollow" target="_blank">SASS</a><br />
Sass is an extension of CSS3, adding nested rules, variables, mixins, selector inheritance, and more. It’s translated to well-formatted, standard CSS using the command line tool or a web-framework plugin.</li>
</ul>
</div>
<h4><a href="#">JavaScript Template Engines</a></h4>
<div>
<ul>
<li><a href="http://mustache.github.com/" rel="nofollow" target="_blank">Mustache.JS</a><br />
Simple and fast templating tool to generate HTML from JSON data. Mustache is a logic-less template syntax. It can be used for HTML, config files, source code &#8211; anything. It works by expanding tags in a template using values provided in a hash or object.</li>
<li><a href="http://embeddedjs.com/" rel="nofollow" target="_blank">EJS</a><br />
EJS cleans the HTML out of your JavaScript with client side templates. After EJS gets its rubber gloves on dirty code, you&#8217;ll feel organized and uncluttered.</li>
<li><a href="http://handlebarsjs.com/" rel="nofollow" target="_blank">Handlebars.js</a><br />
Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Mustache templates are compatible with Handlebars, so you can take a Mustache template, import it into Handlebars, and start taking advantage of the extra Handlebars features.</li>
<li><a href="http://beebole.com/pure/" rel="nofollow" target="_blank">pure</a><br />
Simple and ultra-fast templating tool to generate HTML from JSON data. The representation and the logic remain totally separated. Works standalone or with dojo, DomAssistant, jQuery, Mootools, Prototype, Sizzle and Sly.</li>
<li><a href="https://github.com/BorisMoore/jsrender" rel="nofollow" target="_blank">JsRender</a><br />
Next-generation jQuery Templates which is optimized for high-performance pure string-based rendering, without DOM or jQuery dependency. It integrates with JsViews, to provide interactive data-driven views.</li>
<li><a href="https://github.com/BorisMoore/jsviews" rel="nofollow" target="_blank">JsViews</a><br />
Interactive data-driven views, built on top of JsRender templates. JsViews is not yet Beta, and there may be frequent changes to APIs and features in the coming period.</li>
</ul>
</div>
<h4><a href="#">Frontend MVC and Modularization</a></h4>
<div>
<ul>
<li><a href="http://knockoutjs.com/" rel="nofollow" target="_blank">Knockout.JS</a> &#8211; Simplify dynamic JavaScript UIs by applying the Model-View-View Model (MVVM) Pattern.</li>
<li><a href="http://backbonejs.org/" rel="nofollow" target="_blank">Backbone.JS</a> &#8211; Backbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.</li>
</ul>
</div>
<h4><a href="#">JavaScript Utilities</a></h4>
<div>
<ul>
<li><a href="http://jquery.com/" rel="nofollow" target="_blank">jQuery</a><br />
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.</li>
<li><a href="http://jqueryui.com/" rel="nofollow" target="_blank">jQuery UI</a><br />
jQuery UI provides abstractions for low-level interaction and animation, advanced effects and high-level, themeable widgets, built on top of the jQuery JavaScript Library, that you can use to build highly interactive web applications.</li>
<li><a href="http://documentcloud.github.com/underscore/" rel="nofollow" target="_blank">Underscore.JS</a><br />
Underscore is a utility-belt library for JavaScript that provides a lot of the functional programming support that you would expect in Prototype.js (or Ruby), but without extending any of the built-in JavaScript objects. It&#8217;s the tie to go along with jQuery&#8217;s tux, and Backbone.js&#8217;s suspenders.</li>
<li><a href="http://ender.no.de/" rel="nofollow" target="_blank">Ender</a><br />
Ender is a full featured package manager for your browser. It allows you to search, install, manage, and compile front-end javascript packages and their dependencies for the web. We like to think of it as NPM&#8217;s little sister.</li>
<li><a href="http://www.modernizr.com/" rel="nofollow" target="_blank">modernizr</a><br />
Modernizr is an open-source JavaScript library that helps you build the next generation of HTML5 and CSS3-powered websites. It gives you finer control over the experience through JavaScript-driven feature detection.</li>
<li><a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills" rel="nofollow" target="_blank">Polyfills</a><br />
A polyfill represents a JavaScript shim that backports standard API features found in modern browsers to older, dated browsers.</li>
</ul>
</div>
<h4><a href="#">CSS3</a></h4>
<div>
<ul>
<li><a href="http://html5please.com/" rel="nofollow" target="_blank">CSS3</a> includes all of the tricks and goodies that come along with it. We&#8217;re talking about animations, gradients, drop shadows, selectors, responsive design via media queries, browser support, etc.</li>
</ul>
</div>
<h4><a href="#">HTML5</a></h4>
<div>
<ul>
<li><a href="http://html5please.com/" rel="nofollow" target="_blank">HTML5</a> includes a slew of new and improved browser based advances. Canvas and OpenGL, Web Storage, Video, Web Workers, Web Sockets, Geolocation, Browser State Management, etc. These technologies are constantly molding and expanding with each new browser release.</li>
</ul>
</div>
<h4><a href="#">Deployment Tools</a></h4>
<div>
<ul>
<li><a href="https://github.com/capistrano/capistrano/wiki/" rel="nofollow" target="_blank">Capistrano</a><br />
Capistrano is a developer tool for deploying web applications. It is typically installed on a workstation, and used to deploy code from your source code management (SCM) to one, or more servers</li>
<li><a href="http://docs.fabfile.org/en/1.4.0/index.html" rel="nofollow" target="_blank">Fabric</a><br />
Fabric is a Python (2.5 or higher) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks. It provides a basic suite of operations for executing local or remote shell commands (normally or via sudo) and uploading/downloading files, as well as auxiliary functionality such as prompting the running user for input, or aborting execution.</li>
<li><a href="http://www.opscode.com/chef/" rel="nofollow" target="_blank">Chef</a><br />
Chef is an open-source systems integration framework built specifically for automating the cloud. No matter how complex the realities of your business, Chef makes it easy to deploy servers and scale applications throughout your entire infrastructure. Because it combines the fundamental elements of configuration management and service oriented architectures with the full power of Ruby, Chef makes it easy to create an elegant, fully automated infrastructure.</li>
<li><a href="http://puppetlabs.com/" rel="nofollow" target="_blank">Puppet</a><br />
Puppet Enterprise 2.0 gives systems administrators the operational agility, efficiency, and insight they need to manage dynamic infrastructure, on-premise or in the cloud.</li>
</ul>
</div>
<h4><a href="#">Continuous Integration Tools</a></h4>
<div>
<ul>
<li><a href="http://hudson-ci.org/" rel="nofollow" target="_blank">Hudson CI</a><br />
Hudson monitors executions of repeated jobs, such as building a software project or jobs run by cron. Among those things, current Hudson focuses on the following two jobs: Building/testing software projects continuously and monitoring executions of externally-run jobs.</li>
<li><a href="http://travis-ci.org/" rel="nofollow" target="_blank">Travis CI</a><br />
A hosted continuous integration service for the open source community.</li>
<li><a href="http://jenkins-ci.org/" rel="nofollow" target="_blank">Jenkins CI</a><br />
Jenkins is an extendable open source continuous integration server. It is the leading open-source continuous integration server. Built with Java, it provides over 400 plugins to support building and testing virtually any project.</li>
<li><a href="http://www.atlassian.com/software/bamboo/overview" rel="nofollow" target="_blank">Bamboo CI</a><br />
Continuous integration, continuous deployment and release management.</li>
<li><a href="http://www.testling.com/" rel="nofollow" target="_blank">testling</a><br />
A cross-browser testing platform that lets you automate away your QA.</li>
<li><a href="http://cruisecontrol.sourceforge.net/" rel="nofollow" target="_blank">CruiseControl CI</a><br />
CruiseControl is both a continuous integration tool and an extensible framework for creating a custom continuous build process.</li>
<li><a href="http://needle.readthedocs.org/en/latest/?redir" rel="nofollow" target="_blank">needle</a><br />
Needle is a tool for testing your CSS with Selenium and nose. It checks that CSS renders correctly by taking screenshots of portions of a website and comparing them against known good screenshots. It also provides tools for testing calculated CSS values and the position of HTML elements.</li>
</ul>
</div>
<h4><a href="#">TDD, BDD, Functional Tests, Acceptance Tests, etc.</a></h4>
<div>
<ul>
<li><a href="http://pivotal.github.com/jasmine/" rel="nofollow" target="_blank">Jasmine</a><br />
Jasmine is a behavior-driven development framework for testing your JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.</li>
<li><a href="http://vowsjs.org/" rel="nofollow" target="_blank">Vows</a><br />
Vows provides asynchronous behaviour driven development for Node.JS. It executes your tests in parallel when it makes sense, and sequentially when there are dependencies.</li>
<li><a href="http://visionmedia.github.com/expresso/" rel="nofollow" target="_blank">Expresso</a><br />
Expresso is a JavaScript TDD framework written for Node.JS. Expresso is extremely fast, and is packed with features such as additional assertion methods, code coverage reporting, CI support, and more.</li>
<li><a href="http://behat.org/" rel="nofollow" target="_blank">Behat</a><br />
Behat was inspired by Ruby&#8217;s Cucumber project and especially its syntax part (Gherkin). It tries to be like Cucumber with input (Feature files) and output (console formatters), but in core, it has been built from the ground on pure php with Symfony2 components.</li>
<li><a href="http://www.phpunit.de/manual/3.6/en/" rel="nofollow" target="_blank">PHPUnit</a><br />
PHPUnit is the de-facto standard for unit testing in PHP projects. It provides both a framework that makes the writing of tests easy as well as the functionality to easily run the tests and analyse their results.</li>
<li><a href="http://cukes.info/" rel="nofollow" target="_blank">Cucumber</a><br />
Cucumber lets software development teams describe how software should behave in plain text. The text is written in a business-readable domain-specific language and serves as documentation, automated tests and development-aid. It works with Ruby, Java, .NET, Flex or web applications written in any language.</li>
<li><a href="http://rspec.info/" rel="nofollow" target="_blank">RSpec</a><br />
Rspec is a testing tool for the Ruby programming language. It provides a behaviour driven development framework for the language, allowing to write application scenarios and test them</li>
<li><a href="http://seleniumhq.org/" rel="nofollow" target="_blank">Selenium</a><br />
Selenium automates browsers and is primarily used for automating web applications for testing purposes.</li>
</ul>
</div>
</div>
<h3 style="margin-top: 40px;">To Increase Productivity, Pick Your Niche</h3>
<p>Given the plethora of tools listed above, I would personally recommend that you try to focus your attention on a small subset of competencies. The concept of a jack-of-all-trades-developer is diminishing. Our core skills are forking into distinct roles and disciplines. Companies are now looking for cutting edge <em>frontend developers</em>, <em>backend developers</em>, <em>developers of operations</em>, <em>mobile developers</em>, <em>testing leads</em>, and the list goes on and on&#8230; </p>
<p>If you&#8217;re looking to increase your productivity, you&#8217;ll likely benefit from becoming a specialist in a few areas above as opposed to a generalist in all. This doesn&#8217;t mean that you shouldn&#8217;t be reading up no new technologies and testing the waters. You should instead focus your attention on the tools that will help get the job done efficiently; knowing the trade-offs of each. </p>
<h3 style="margin-top:32px">Never Stop Learning</h3>
<p>Our industry grows at a pace inconceivable in other industries. To be honest, I&#8217;m pretty sure that&#8217;s why most of us are in the field to begin with. <em>We love learning</em>. If you believe that learning a new tool is going to benefit you in the long run and increase productivity, take the short-term hit and go do some research and development. You&#8217;ll be glad you did later. </p>
<p><script type="text/javascript" src="/wp-content/themes/skookum/js/jquery.accordion.js"></script><script type="text/javascript" src="/wp-content/themes/skookum/js/customAccordion.js"></script><br />
<script type="text/javascript">// <![CDATA[
 jQuery(function() { customAccordion(); });
// ]]&gt;</script></p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/3r_VUQrIxiE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/developer-productivity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/developer-productivity/</feedburner:origLink></item>
		<item>
		<title>ESPN Developer Center a Small Step in the Right Direction</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/89og8ASy8pM/</link>
		<comments>http://skookum.com/blog/espn-developer-center-a-small-step-in-the-right-direction/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 18:45:52 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1904</guid>
		<description><![CDATA[Earlier this week, ESPN launched the ESPN Developer Center, solidifying the geekiness of sports with the geekiness of technology. For all you tech types out there that take pride in not knowing anything about sports, this is potentially a pretty big deal. ESPN is the &#8216;worldwide leader in sports&#8217; and has a vast store of [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this week, ESPN launched the <a href="http://developer.espn.com/" target="_blank">ESPN Developer Center</a>, solidifying the geekiness of sports with the geekiness of technology.</p>
<p>For all you tech types out there that take pride in not knowing anything about sports, this is potentially a pretty big deal. ESPN is the &#8216;worldwide leader in sports&#8217; and has a vast store of information, both current and historical, about all major sports (even hockey).</p>
<p><span id="more-1904"></span></p>
<p><img src="http://skookum.com/wp-content/uploads/2012/03/espndevelopercenterscreen.jpg" alt="" title="ESPN Devloper Center Screenshot" width="560" height="398" class="alignleft size-full wp-image-1908" /></p>
<p><a href="http://developer.espn.com/docs" target="_blank">Six APIs have been released</a>: the Headlines API, Research Notes API, Athletes API, Scores &#038; Schedules API, Standings API and Teams API. Headlines and Research Notes are official releases, while the other four APIs are still in Beta. ESPN has divided the availability of the APIs into 4 tiers: public, partner, premium partner and ESPN.</p>
<p>The only API available to the public is the Headlines API (more on this later).</p>
<p>Using the API is pretty straightforward. A user signs up for a key and then uses that key to retrieve information in either an xml or json response. Error handling is built in, and a few examples are provided to guide the developer along. There is a limit of 2,500 calls per day and 1 call per second at the public tier. Apps must be branded appropriately as using the ESPN APIs.</p>
<p>Popular mobile/tablet apps like Pulse and Flipboard were given early access to the APIs and are featured in the <a href="http://developer.espn.com/showcase" target="_blank">Showcase</a> section of the site  to highlight how the Headlines API is already being used.</p>
<p>As an equal parts sports and technology fan, I&#8217;m excited about the potential of having access to one of the many things that ESPN does well &#8211; information about sports.</p>
<p>I am, however, a little disappointed with this initial offering. Though six APIs have been released, only one is available to the public, and it is by far the least sexy of the offerings.</p>
<p>Further, it is not clear on the procedure to become a partner or premium partner, save emailing an API opportunities address to get more information. According to the overview page, only <em>&#8216;an ESPN moderator can upgrade your access to a different group.&#8217;</em> I&#8217;d like to see a clear description of what a relationship with ESPN would look like to an app or developer in the long term at each of the different tiers.</p>
<p>The <a href="http://developer.espn.com/terms" target="_blank">terms and conditions</a> state that the API, at least at the public tier, can only be used in apps that are non-commercial and do not feature in-app purchases. While I agree that any app that would blatantly rip off the information that ESPN provides and be for sale is deplorable, what about apps that may use any of the APIs as supplemental information in an existing sports-related app? If that app charges a fee for use, it can&#8217;t utilize any of the ESPN APIs as a value-add to its already existing offering.</p>
<p>Also, 2,500 calls per day is fairly low. Sure, calls can be cached, and sports does not happen that fast, but Google Maps caps their daily API calls at tens times the amount that ESPN offers. To me, that&#8217;s a significant difference.</p>
<p>Despite misgivings on the initial rollout of the APIs, I think the potential of the ESPN Developer Center is too great to not take advantage of in some capacity. Overall this new endeavor from ESPN will probably prove to be successful. </p>
<p>Tell us what you think. Are the ESPN Developer APIs exciting, or do you think they&#8217;re kinda lame at this stage? How big is the developer/sports fan Venn diagram overlap?</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/89og8ASy8pM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/espn-developer-center-a-small-step-in-the-right-direction/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/espn-developer-center-a-small-step-in-the-right-direction/</feedburner:origLink></item>
		<item>
		<title>Dynamic Screenshots on the Server with PhantomJS</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/BOVWkHY1KzE/</link>
		<comments>http://skookum.com/blog/dynamic-screenshots-on-the-server-with-phantomjs/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 12:22:33 +0000</pubDate>
		<dc:creator>Chad</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1751</guid>
		<description><![CDATA[Scraping Data from websites is pretty cool. But what if we could not only grab and parse the markup from external websites, but take full-blown screenshots and even modify that markup before we take that screenshot? We can do all that with an excellent package called PhantomJS. A Browser without the Browser. PhantomJS describes itself [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/blog/scraping-poorly-formatted-data-with-curl-and-phpquery/">Scraping Data</a> from websites is pretty cool. But what if we could not only grab and parse the markup from external websites, but take full-blown screenshots and even modify that markup before we take that screenshot? We can do all that with an excellent package called <a href="http://www.phantomjs.org/" target="_blank">PhantomJS</a>.</p>
<h3>A Browser without the Browser.</h3>
<p>PhantomJS describes itself as a &#8220;headless WebKit with JavaScript API&#8221;. For those that are not familiar, <a href="http://www.webkit.org/" target="_blank">WebKit</a> is the open-source web browsing engine that powers popular browsers including Chrome and Safari. &#8220;Headless&#8221; refers to fact that the program can be run from the command line without a window system, making it perfect for the server environment. The JavaScript API means that we can easily write scripts that interact with PhantomJS in the language of the web, allowing us to modify the browser output on the fly, just like you can do with Firebug or Developer Tools locally!</p>
<h3>Installation</h3>
<p>The hardest part of working with PhantomJS is getting it installed. Because of the requirements you are not going to be able to run this on a standard shared host, but an average vps will handle it fine. The following instructions are for getting things up and running with Ubuntu 11.10 on Linode.</p>
<p><span id="more-1751"></span></p>
<h4>Step1: Install PhantomJS Requirements</h4>
<p>This will install everything we need to compile PhantomJS, along with the ability to run it virtually without a window system.<br />
<script type="text/javascript" src="https://gist.github.com/1872144.js?file=install.sh"></script></p>
<h4>Step2: Install Browser Goodies</h4>
<p>Installs flash plugin and windows fonts so sites appear more accurate.<script type="text/javascript" src="https://gist.github.com/1877794.js?file=browserstuff.sh"></script></p>
<h4>Step3: Compile!</h4>
<p>Clone the repo and build from source.<br />
<script type="text/javascript" src="https://gist.github.com/1872160.js?file=compile.sh"></script>After everything finishes we should now have the program installed. Test it at the command-line by typing &#8220;phantomjs&#8221;</p>
<h3>Taking Screenshots</h3>
<p>Since PhantomJS scripts are simply javascript with some extra api calls baked in, the barrier to entry for web developers is zero! Create the following script and save it somewhere on your server as &#8220;shotty.js&#8221;. Check out the comments for an explanation of what is happening.<script type="text/javascript" src="https://gist.github.com/1872266.js?file=shotty.js"></script><br />
To run this script, navigate to where the script lives on your server and run the following command. We run &#8220;Xvfb -screen 0 1024x768x24&amp;&#8221;  first to set the parameters of our Xvfb screen buffer. This is basically a virtual screen that allows us to emulate a window environment. Then we call the script with &#8220;DISPLAY=:0 phantomjs &#8211;load-plugins=yes shotty.js&#8221; to ensure Phantom runs in the buffer. PhantomJS will execute our script and save our screenshot in the same folder the script is in. If everything went well our screenshot of espn.com should look just like the real thing. How cool is that?</p>
<p><a href="http://skookum.com/wp-content/uploads/2012/02/ss1.png"><img class="alignnone size-full wp-image-1818" title="ss1" src="http://skookum.com/wp-content/uploads/2012/02/ss1.png" alt="" width="944" height="760" /></a></p>
<h3>Muck&#8217;n with Markup</h3>
<p>Because PhantomJS scripts are JavaScript, that means we can easily perform actions on the result of a page, and then take a screenshot of the results! Below we have created a script that grabs a page, embeds jQuery, and then performs some DOM manipulation before finally taking a screenshot. Priceless. The following code will allow us to edit the headline on espn.com to say whatever we want.<br />
<script type="text/javascript" src="https://gist.github.com/1877653.js?file=shotty2.js"></script><br />
<a href="http://skookum.com/wp-content/uploads/2012/02/ss2.png"><img class="alignnone size-full wp-image-1819" title="ss2" src="http://skookum.com/wp-content/uploads/2012/02/ss2.png" alt="" width="944" height="759" /></a></p>
<p>I&#8217;m sure by now your gears are already turning on fun uses of this technology. In Part II of this series I will go over how to integrate with Node.js to create a Phantom powered web app.</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/BOVWkHY1KzE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/dynamic-screenshots-on-the-server-with-phantomjs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/dynamic-screenshots-on-the-server-with-phantomjs/</feedburner:origLink></item>
		<item>
		<title>Skookum Digital Works has The Fire. We Will Share it with You.</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/mwL5uXf5JAY/</link>
		<comments>http://skookum.com/blog/skookum-digital-works-has-the-fire-we-will-share-it-with-you/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:15:44 +0000</pubDate>
		<dc:creator>Chris</dc:creator>
				<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1763</guid>
		<description><![CDATA[While attending NodeSummit in San Francisco a couple weeks ago, I was approached by very sweet older lady named Gretchen. She was strolling through the exhibition area for unrelated reasons and stopped in her tracks when she saw the word “Skookum” on our banner. Gretchen is a retired school teacher from the Pacific Northwest, and [...]]]></description>
			<content:encoded><![CDATA[<p>While attending <a href="http://nodesummit.com/">NodeSummit</a> in San Francisco a couple weeks ago, I was approached by very sweet older lady named Gretchen. She was strolling through the exhibition area for unrelated reasons and stopped in her tracks when she saw the word “Skookum” on our <a href="https://twitter.com/#!/Skookum/media/slideshow?url=pic.twitter.com%2Fo4JqFoay">banner</a>. Gretchen is a retired school teacher from the Pacific Northwest, and she told me a story about the “Skookums” that her students loved to hear and that she had told for many years. </p>
<p><img src="http://skookum.com/wp-content/uploads/2012/02/blog_illus_1_b.png" alt="" title="Skookum Digital Works Space Mountain Fire Volcano Logo" width="555" height="230" class="aligncenter size-full wp-image-1787" /></p>
<p>At the beginning of the world, people had no fire. The only fire anywhere was on top of a high mountain, guarded by the Skookums. You see, these Skookums were not like the fine and friendly Skookums we have today, these Skookums were total hoarders. They didn’t want the people to have fire, because if they did, then maybe they would become as powerful as the Skookums. </p>
<p><img src="http://skookum.com/wp-content/uploads/2012/02/blog_illus_3.png" alt="" title="Skookum Digtial Works Coyote Face" width="555" height="230" class="aligncenter size-full wp-image-1768" /></p>
<p>A coyote thought he’d be sly and go steal a brand of fire and bring it to the people. After consulting his three sisters for advice, (in an odd twist of events, the three sisters lived in the coyote&#8217;s stomach in the form of huckleberries&#8230;but I digress), the coyote lined up all the animals in strategic places along the mountainside in a line between the Skookum’s fire and the people. </p>
<p><img src="http://skookum.com/wp-content/uploads/2012/02/blog_illus_4.png" alt="" title="Skookum Digital Works relay race" width="555" height="230" class="aligncenter size-full wp-image-1769" /></p>
<p>The coyote stole some fire while the Skookum’s were chillaxing, then the animals basically relayed raced the fire until eventually an antelope gave the fire to a frog, who swallowed it. The frog then spat out the fire onto a piece of wood. The Skookum’s—kinda mad at this point—couldn’t figure out how undo the frog-fire-wood-spit, so they went back to the top of the mountain, presumably to resume chillaxing. The coyote then showed the people how to get the fire out of the wood by rubbing sticks together—and that’s why you can eat and be warm now. </p>
<p><img src="http://skookum.com/wp-content/uploads/2012/02/blog_illus_5.png" alt="" title="Skookum Digital Works Fire Sticks" width="555" height="230" class="aligncenter size-full wp-image-1770" /></p>
<p>So, why did I tell you this story? Because today’s Skookums aren&#8217;t hoarders. We don’t want to withhold our technology expertise, our “fire” if you will, from the people.</p>
<p><img src="http://skookum.com/wp-content/uploads/2012/02/blog_illus_2.png" alt="" title="Skookum Digital Works Coyote" width="555" height="230" class="aligncenter size-full wp-image-1767" /></p>
<p>We don’t want coyotes up in our business either. So trust me, we’ll give you the fire. Just ask. Or come to a <a href="http://techtalk.skookum.com/events/calendar/">Friday Tech Talk</a>.</p>
<p><em>*Illustrations by <a href="https://twitter.com/#!/rrobinson81">Rich</a>!</em></p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/mwL5uXf5JAY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/skookum-digital-works-has-the-fire-we-will-share-it-with-you/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/skookum-digital-works-has-the-fire-we-will-share-it-with-you/</feedburner:origLink></item>
		<item>
		<title>Non-Programmer to Programmer: Introducing Case-Study Jason</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/HePfSYt2was/</link>
		<comments>http://skookum.com/blog/introducing-jason-snodgrass/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 15:05:24 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[new hire]]></category>
		<category><![CDATA[tech talks]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1706</guid>
		<description><![CDATA[Jason started working at Skookum about five months ago. Before that, he worked at a company that installed and seviced ShoreTel VoIP phone systems. We asked Jason to introduce himself and talk about what he&#8217;s learned coming from a non-programming (though still technical) career into software development. Take it away, Jason. At my last job, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-1712" title="skookum man" src="http://skookum.com/wp-content/uploads/2012/02/skookum-man-300x179.jpg" alt="" width="300" height="179" /></p>
<p><em>Jason started working at Skookum about five months ago. Before that, he worked at a company that installed and seviced ShoreTel VoIP phone systems.</em></p>
<p>We asked Jason to introduce himself and talk about what he&#8217;s learned coming from  a non-programming (though still technical) career into software development. Take it away, Jason.</p>
<hr />
<p>At my last job, along with installing the phone systems, diagnostics and upgrades to the current network were almost always needed to get the needed voice quality. The company was just five people including the owner. The relationships formed within a small team like that are awesome. So why move to NC and take a new job then? <em><a href="http://countrystudies.us/united-states/weather/north-carolina/charlotte.htm">The weather</a>!</em> I lived in north central Ohio&#8230;and like a lot of other NC transplants, I&#8217;d have a hard time going back to grey skies and bad winters.</p>
<p>But from a technical angle, I also was excited about the challenge of doing and learning something new. I&#8217;ve had a desire to improve my knowledge and toolset for some time. Coming to Skookum Digital Works, I really didn&#8217;t know what I would be doing, but it was clear they thought I had the capacity to grow if surrounded with the right teammates.</p>
<p>SDW does software development. I had some experience&#8230;mostly with ASP Classic (no laughing). No PHP. No node, No JavaScript, No CSS. No HTML5. Basically, no experience. Would I measure up? Would I really pick up those languages with the right guides?</p>
<p>Well here I am, five months in. I have not done any ASP Classic programming, but that&#8217;s (more than) OK. What I have done is learned a whole lot. I&#8217;ve picked up more programming skills in the last five months than I had in the rest of my previous jobs combined. I have used PHP, JavaScript and jQuery, node, knockout, CSS, and HTML5. I&#8217;ve also picked up some design and layout tricks, and I&#8217;ve even learned how to stretch and use WordPress as way-more-than a simple CMS.</p>
<p>And, do I like it here? Well, the work environment has a very similar feel to the small company I was at before. Everyone at SDW is awesome, smart, and willing to help when asked. Everyone here likes to operate out of their comfort zone and continue learning new things. And when someone makes a breakthrough, there&#8217;s usually a <a title="Skookum Tech Talks" href="http://techtalk.skookum.com/" target="_blank">tech talk</a> to coincide.</p>
<p>Looking toward the future, I hope to learn as much about new technologies and languages as I can. I want to learn more <a href="http://nodejs.org/" target="_blank">node</a>, and wouldn&#8217;t mind learning Ruby at some point. I also would like to build an iPhone, iPad, or Mac app. There are things I need to be better at, and I am trying hard. My CSS, javascript, and code testing all need improving. I am learning as fast as I possibly can and look forward to learning even more. And as I move forward, a goal of mine is to help keep people informed of the new awesomeness that I find, because we all know, we will never know it all.</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/HePfSYt2was" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/introducing-jason-snodgrass/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/introducing-jason-snodgrass/</feedburner:origLink></item>
		<item>
		<title>Scraping Poorly Formatted Data with cURL and phpQuery</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/PsQGUMG7J6Q/</link>
		<comments>http://skookum.com/blog/scraping-poorly-formatted-data-with-curl-and-phpquery/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 16:55:31 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Code Samples]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[data scraping]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpQuery]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1716</guid>
		<description><![CDATA[cURL is a fantastic way to scrape data from websites. It&#8217;s pretty ubiquitous on LAMP servers nowadays, so you probably don&#8217;t even have to do anything to enable it and start using it. You can essentially get data that&#8217;s behind a login form by spoofing a browser logging into the site. I&#8217;m not going to do a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://skookum.com/wp-content/uploads/2012/02/poorly_formatted_data.png"><img class="alignright size-medium wp-image-1720" title="poorly_formatted_data" src="http://skookum.com/wp-content/uploads/2012/02/poorly_formatted_data-300x153.png" alt="" width="300" height="153" /></a><a href="http://curl.haxx.se/" target="_blank">cURL</a> is a fantastic way to scrape data from websites. It&#8217;s pretty ubiquitous on LAMP servers nowadays, so you probably don&#8217;t even have to do anything to enable it and start using it. You can essentially get data that&#8217;s behind a login form by spoofing a browser logging into the site.</p>
<p>I&#8217;m not going to do a dissertation on the nuances of using cURL. Instead, I&#8217;d like to discuss how to process data after you&#8217;ve gotten the HTML string from a page using the <span style="font-family: monospace;">curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);</span> setting. The general process using cURL to get the data from a password protected site goes something like this:</p>
<ol>
<li>Make sure your &#8220;cookie jar&#8221; is set up and working so that your session can be saved while you&#8217;re scraping other pages after login.</li>
<li>Get the HTML for the login page.</li>
<ol>
<li>Get the form post location.</li>
<li>Get any special tokens or hidden variables.</li>
</ol>
<li>Post to the login script with your authorized username and password.</li>
<li>Scrape any pages you need to get and process them.</li>
</ol>
<h2>Getting auth tokens and stuff</h2>
<p>Sometimes login pages make it difficult to figure out what to post because of &#8220;authentication tokens&#8221; or similar variables that change every time a page is hit and then have to be posted <em>back</em> along with the username and password. This is most common among .NET applications since it&#8217;s built right in to the .NET form creation classes. The process of finding these variables is made a lot easier if you use <a href="http://code.google.com/p/phpquery/" target="_blank">phpQuery</a>. It&#8217;s a project that attempts to replicate what jQuery does but with PHP. You pass phpQuery a string with all the HTML content in it and then you can perform <a href="http://api.jquery.com/category/selectors/" target="_blank">selectors</a> and <a href="http://api.jquery.com/category/traversing/" target="_blank">traverse</a> the DOM just like with jQuery. What you do with the HTML after that is up to you.</p>
<script src="https://gist.github.com/1752657.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1752657">Gist</a>.</p></noscript>
<p>In the above example, I already had the HTML string of the login page and simply used phpQuery to get all the inputs on the page with a very jQuery-like selector syntax and then looped through the results to get all my input fields for the form so I could use them in my next call to post the data back to the login script.</p>
<h2>Getting poorly formatted data and stuff</h2>
<p>I consider &#8220;well formatted&#8221; data to be in formats like JSON, XML, CSV, etc. that are specifically meant for data transfer. But what heppens when you need to scrape data from HTML tables or DIVs?</p>
<p>phpQuery to the rescue! You can do the same thing as above but parse the newly acquired HTML string of the data you&#8217;re looking for. Here&#8217;s an example of looking at a two column table of data to get all sorts of neat stuff and format it into an array. Then I check for an element outside of the table loop and set another variable.</p>
<script src="https://gist.github.com/1752759.js"></script><noscript><p>View the code on <a href="https://gist.github.com/1752759">Gist</a>.</p></noscript>
<h2>Using the data and stuff</h2>
<p>After you&#8217;re done with that, you have all this useful data in an array and you can basically do whatever you want to it. Since this example I created originated from code used in a real life client project (with variable names changed to protect the innocent), I went on to take that array and save it out to a JSON file that I could easily read in and do what I wanted to with the data.</p>
<p>You may need to go through some tests to get the right kind of cleaning or data sanitization for your values, but phpQuery makes it really easy to scrape this kind of data if you&#8217;re used to jQuery&#8217;s selectors and traversing. Instead of scraping the site each time to get the data, I like saving out the html string to a file and then playing with selectors and traversing to get the data I want form a local file so I don&#8217;t put a lot of strain on the server.</p>
<h2>And don&#8217;t forget stealth&#8230;</h2>
<p>If you&#8217;re not sure how friendly the server (or serveradmin) is to you doing this, make sure you set the cURL user agent for each request. I like  pretending I&#8217;m GoogleBot, but any common user agent string would suffice so that the server doesn&#8217;t explicitly know you&#8217;re PHP trying to log in.</p>
<p>By default, cURL spits out a user agent like this (changes based on operating system and version of cURL):</p>
<pre>curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5</pre>
<p>If a serveradmin sees that in their logs, they might freak out&#8230; so  I like these user agent strings for sneaky data pulls:</p>
<pre>Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7</pre>
<h2>Audience participation</h2>
<p>How do you use cURL and phpQuery? Any useful scripts or resources to point people to other than their respective documentation sites?</p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/PsQGUMG7J6Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/scraping-poorly-formatted-data-with-curl-and-phpquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/scraping-poorly-formatted-data-with-curl-and-phpquery/</feedburner:origLink></item>
		<item>
		<title>Charlotte Programming Company Helps Business Clients Go Digital</title>
		<link>http://feedproxy.google.com/~r/skookum/blog/~3/O3Z3EHs4Le4/</link>
		<comments>http://skookum.com/blog/charlotte-programming-company-helps-business-clients-go-digital/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 20:17:08 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Culture]]></category>

		<guid isPermaLink="false">http://skookum.com/?p=1693</guid>
		<description><![CDATA[Along with being ranked one of the Best Places to Work in Charlotte, North Carolina, James Hartsell—SDW&#8217;s co-founder and CEO, was recently profiled by the Charlotte Business Journal. The Q&#038;A is reprinted below. Tell us a little about what Skookum Digital Works does and how it was founded? Skookum Digital Works is a technical partner [...]]]></description>
			<content:encoded><![CDATA[<p><em>Along with being ranked one of the <a href="http://www.bizjournals.com/charlotte/print-edition/2011/11/11/best-places-to-work-top-ranked-small.html?page=all">Best Places to Work in Charlotte, North Carolina</a>, James Hartsell—SDW&#8217;s co-founder and CEO, was recently profiled by the <a href="http://www.bizjournals.com/charlotte/print-edition/2012/01/27/helping-business-clients-go-digital.html">Charlotte Business Journal</a>. The Q&#038;A is reprinted below.</em></p>
<p><img src="http://skookum.com/wp-content/uploads/2012/01/james_headshot_wide.jpg" alt="Charlotte, North Carolina computer software mobile programming" title="James Hartsell, CEO of Skookum Digital Works" width="620" height="423" class="aligncenter size-full wp-image-1695" /></p>
<p><strong>Tell us a little about what Skookum Digital Works does and how it was founded?</strong><br />
Skookum Digital Works is a technical partner for anyone with a startup dream. We mainly work with entrepreneurs—building out their products or customizing software for businesses. </p>
<p>My co-founder and I, Bryan Delaney, founded Skookum in 2005. We were roommates at UNC Charlotte, both graduated with computer science degrees, and both went to work for the Department of Defense for a few years before deciding we had a better mousetrap. </p>
<p>Bryan and I are Charlotte natives, and we&#8217;re happy to have located our office Uptown. </p>
<p><strong>Do you specialize in any particular types of apps or client base?</strong><br />
I don&#8217;t think its crass of me to say we like to work with <em>funded</em> startups. Our typical client is the non-technical entrepreneur; someone with business skills and ideas but with no programming background. We allow a non-technical entrepreneur to get started on their digital product without having to find a technical co-founder or trying to hire engineers they are not qualified to vet. </p>
<p>Our clients have often heard the word &#8220;No&#8221; elsewhere. We have expertise in the mobile web, complicated software integrations, and real-time web collaboration. </p>
<p><strong>What are some examples of apps Skookum has created?</strong><br />
A publishing company wanted a marketing tool to promote their books. SDW gave them a <a href="http://itunes.apple.com/us/app/mascot-talk/id420673475?mt=8">digital revenue stream</a>.</p>
<p>Some D.C. folks knew independent voters were eager to take collective action. <a href="http://ruck.us">SDW built them a data mining and people matching system</a>.</p>
<p>A group of investors-and-avid-golfers hated the 100+ scoring apps already available. <a href="http://gtgapp.com/">We made players&#8217; phones talk to each other</a>. (!)</p>
<p>A neighborhood of New York businesses disliked Groupon keeping their margins. We created a <a href="http://www.inbundles.com/">localized model they collectively controlled</a>. </p>
<p><strong>What do you think will be the next innovation in smartphone applications?</strong><br />
Mobile apps are going to be easier to download and live outside the walls of the Apple iTunes store and the Android Marketplace. <a href="http://vimeo.com/35539107">Companies can now place their applications on iPhones and iPads without Apple taking 30% of the cut</a>. </p>
<p>Mobile applications are also slowing making their way into retail. Most stores know they can use smartphones and tablet devices to enhance their store experience, but the smaller chains (and certainly the local guys) are waiting to see what the big guys do before making the investment. </p>
<p><strong>Charlotte isn’t really seen as a tech town. Will that ever change?</strong><br />
It&#8217;s fundamentally a marketing problem and one that <a href="http://www.flickr.com/photos/skookumdigitalworks/sets/72157627684737754/">we and 70+ other Charlotte tech leaders have addressed face to face with Mayor Foxx</a>. Aside from numerous <a href="http://www.quora.com/What-are-the-top-startups-in-the-Charlotte-NC-area">local startups</a> and technical partners like ourselves, all of the banks are essentially technology companies. </p>
<p>For just one example, If you took all the programmers out of Bank of America, they would comprise the tenth largest tech company in the world. BoA has technology needs that make engineers at IBM cry. </p>
<p>We like to think we&#8217;re doing our part recruiting talent to the area and flying the flag in front of national entrepreneurs. We have clients all over the place happy to come see us and come visit Charlotte. </p>
<p>Charlotte is already a tech hub, but the city definitely needs to get better about spreading that message. </p>
<img src="http://feeds.feedburner.com/~r/skookum/blog/~4/O3Z3EHs4Le4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://skookum.com/blog/charlotte-programming-company-helps-business-clients-go-digital/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://skookum.com/blog/charlotte-programming-company-helps-business-clients-go-digital/</feedburner:origLink></item>
	</channel>
</rss>

