<?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>Wagger Designs</title>
	<atom:link href="http://www.waggerdesigns.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.waggerdesigns.com</link>
	<description>Northern Virginia Web Design, Development &#38; Marketing</description>
	<lastBuildDate>Mon, 18 Mar 2013 01:14:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>My Journey on Rails, Part 5: Tests</title>
		<link>http://www.waggerdesigns.com/blog/2012/08/09/my-journey-on-rails-part-5/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/08/09/my-journey-on-rails-part-5/#comments</comments>
		<pubDate>Thu, 09 Aug 2012 19:21:08 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1703</guid>
		<description><![CDATA[Last time, I was in the middle of plotting and scheming the addition of UJS to my search form and decided that now would be a great time to stop procrastinating my test harness. I&#8217;ve had some experience with TDD in the past, but as I&#8217;m the sole developer with limited time I can commit, I&#8217;m going to be hard ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/08/minitrain.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/08/minitrain.jpg&#038;w=320&#038;h=320&#038;zc=1&#038;q=100" title="" alt="" width="320" height="320" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:320px;" class="image_shadow"></span><p>Last time, I was in the middle of plotting and scheming the addition of UJS to my search form and decided that now would be a great time to stop procrastinating my test harness.  I&#8217;ve had some experience with <a href="http://www.agiledata.org/essays/tdd.html" title="Introduction to Test Driven Development (TDD)" target="_blank">TDD</a> in the past, but as I&#8217;m the sole developer with limited time I can commit, I&#8217;m going to be hard pressed to work it in to the capacity that I&#8217;d like, make rapid progress, and blog along the way.</p>
<p>If you&#8217;re just joining, this is Part 5 of N.  You can catch up here:</p>
<ul>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/" title="My Journey on Rails, Part 1" target="_blank">Part 1: Setup and Data Import/Export via CSV</a>
</li>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/07/10/my-journey-on-rails-part-2/" title="My Journey on Rails, Part 2" target="_blank">Part 2: Adding Custom Authentication</a>
</li>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/07/18/my-journey-on-rails-part-3/" title="My Journey on Rails, Part 3" target="_blank">Part 3: Advanced Search Form</a>
</li>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/07/31/my-journey-on-rails-part-4/" title="My Journey on Rails, Part 4" target="_blank">Part 4: ERB to Haml</a>
</li>
</ul>
<p>In the end, I decide that I&#8217;m going to start with some solid functional tests and backfill with unit and integration tests as time permits.  My data model is not particularly complex, so pragmatism wins out.</p>
<p>I know I&#8217;m jumping into a rather in-depth foray, so I revisit Code School to get the overview via <a href="http://www.codeschool.com/courses/rails-testing-for-zombies" title="Rails Testing for Zombies" target="_blank">Rails Testing for Zombies</a>.  Seems reasonably straightforward for straightforward tasks, but I can see where some bits of code will be tricky.</p>
<p>Luckily, if I can just catch up on tests now, writing new ones moving forward should be considerably easier and I&#8217;ll fall into a rhythm.  Filling in tests for existing functionality I don&#8217;t yet have coverage on is going to be a bit of a tedious exercise in brainstorming, which I imagine to be much of the inertia that prevents test suites from being retrofitted on many existing projects.</p>
<p>By the end, I have a few addition gems in my Gemfile:</p>
<pre class="fancy_code_box">group :test do
  gem 'shoulda'
  gem 'mocha'
  gem 'capybara'
end

group :development, :test do
  gem 'factory_girl_rails'
end</pre>
<p>&#8230;and Capybara requires some extra code added to test/test_helper.rb:</p>
<pre class="fancy_code_box">
require 'capybara/rails'

class ActionDispatch::IntegrationTest
  include Capybara::DSL
  
  def teardown
    Capybara.reset_sessions!
	Capybara.use_default_driver
  end
end</pre>
<p>And so, I start hacking away at some tests for my Listings page, which is the most complex of the set thus far.  I run into trouble early, as I have custom authentication residing in my application_controller.rb that&#8217;s being called from the listings page via before_filter for any destructive operation.</p>
<p>I spend a ton more time on this than I want to.  In the end, it&#8217;s only a scant couple lines of code, but getting there is hairy:</p>
<p>(test/test_helper.rb)</p>
<pre class="fancy_code_box">class ActiveSupport::TestCase
  fixtures :all

  def load_user(user)
    @user = users(user)
    <strong>@controller.stubs(:current_user).returns(@user)</strong>
  end

  def load_admin_user
    load_user(:one)
  end
  
  def load_regular_user
    load_user(:two)
  end
end</pre>
<p>(Not shown: in fixtures/users.yml, I have &#8220;one&#8221; and &#8220;two&#8221; users, where &#8220;one&#8221; has the admin bit set.)</p>
<p>Then, anywhere I want to test a specific user type, I can just call the appropriate load_x_user method first and it does what it needs to.  I saw some recommendations that I just use the Capybara/integration side of testing to simulate user browser interaction with the page (and I&#8217;ll get to implementing those tests in time) but I really want to be able to write good functional tests for my roles as well.</p>
<p>I spend some time writing up (what I believe to be!) good tests around the authentication and also authorization (to the limited degree that I have it!) and decide to move on.  TDD purists wouldn&#8217;t be pleased, but the best tools are those that help developers, right?  What I&#8217;ve written so far helps me plenty!</p>
<p>Next up: Fetch latitude/longitude on save or update of the listing address, and switch over to Mongo for the free <a href="http://www.mongodb.org/display/DOCS/Geospatial+Indexing/" title="Geospatial Indexing - MongoDB" target="_blank">geospatial indexing</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/08/09/my-journey-on-rails-part-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wagger Offers New Client Referral Bonus!</title>
		<link>http://www.waggerdesigns.com/blog/2012/08/01/wagger-offers-new-client-referral-bonus/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/08/01/wagger-offers-new-client-referral-bonus/#comments</comments>
		<pubDate>Wed, 01 Aug 2012 16:24:03 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Graphics Design]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Website Design]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1686</guid>
		<description><![CDATA[Everybody&#8217;s happy with a little extra cash in their pocket, and we&#8217;re happy building great websites and applications! Let&#8217;s work together and make some happy! Announcing Wagger&#8217;s New Client Referral Bonus Program Throughout the months of August and September, Wagger is offering a $250 referral bonus to anyone who brings us a new prospective client leading to a signed agreement ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/08/referral-bonus.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/08/referral-bonus.jpg&#038;w=200&#038;h=200&#038;zc=1&#038;q=100" title="" alt="" width="200" height="200" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:200px;" class="image_shadow"></span><p>Everybody&#8217;s happy with a little extra cash in their pocket, and we&#8217;re happy building great websites and applications!  Let&#8217;s work together and make some happy!</p>
<h3>Announcing Wagger&#8217;s New Client Referral Bonus Program</h3>
<p>Throughout the months of August and September, Wagger is offering a $250 referral bonus to anyone who brings us a new prospective client leading to a signed agreement for $1,000 in work or more.  We also aren&#8217;t putting a cap on the number of referral bonuses you can collect, so feel free to send us anyone you think could benefit from our services!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/08/01/wagger-offers-new-client-referral-bonus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Journey on Rails, Part 4: ERB to Haml</title>
		<link>http://www.waggerdesigns.com/blog/2012/07/31/my-journey-on-rails-part-4/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/07/31/my-journey-on-rails-part-4/#comments</comments>
		<pubDate>Tue, 31 Jul 2012 19:17:35 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1661</guid>
		<description><![CDATA[Note: This installment was planned, originally, to cover a twofer of topics. I&#8217;ll talk about why I chose not to at the end of the article. Haml ALL the ERBs! I have a couple of lingering hesitations over adopting Haml, which are reinforced by an article from Chris Eppstein. However, he provides several workarounds, the easiest of which is to ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/07/traintraks.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/07/traintraks.jpg&#038;w=320&#038;h=240&#038;zc=1&#038;q=100" title="" alt="" width="320" height="240" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:320px;" class="image_shadow"></span><p><strong>Note:</strong> This installment was planned, originally, to cover a twofer of topics.  I&#8217;ll talk about why I chose not to at the end of the article.<span id="more-1661"></span></p>
<h3>Haml ALL the ERBs!</h3>
<p>I have a couple of lingering hesitations over adopting <a href="http://haml.info/" title="#haml" target="_blank">Haml</a>, which are reinforced by <a href="http://chriseppstein.github.com/blog/2010/02/08/haml-sucks-for-content/" title="Haml Sucks for Content" target="_blank">an article from Chris Eppstein</a>.  However, he provides several workarounds, the easiest of which is to <strong>just go ahead and inline HTML where you need to</strong>.  Huh!  Who knew?  Chris Eppstein, apparently.</p>
<p>Aside from the minor oddities when it comes to formatted text, Haml is a particularly graceful markup language that mirrors the presentation CSS &mdash; even more so when using Haml together with <a href="http://sass-lang.com/" title="Sass - Syntactically Awesome Stylesheets" target="_blank">Sass</a>, also created by <a href="http://www.hamptoncatlin.com/" title="Hampton Catlin | Ruby, Haml, Wikipedia, iPhone Development" target="_blank">Hampton Catlin</a>.</p>
<p>So!  I&#8217;ve come this far in my Rails application using ERBs.  How can I change direction now?</p>
<p>I find a <a href="http://www.deploymentzone.com/2012/03/12/rake-task-to-convert-erb-to-haml/" title="Rake task to convert ERb to Haml" target="_blank">Rake task</a> to do this with almost zero effort.  I need to refer back to the <a href="http://databasically.com/2010/09/19/converting-erb-to-haml-in-rails3/" title="Converting erb to haml in rails3" target="_blank">original referenced post</a> to figure out that I&#8217;m missing the [code]ruby_parser[/code] gem, but there isn&#8217;t any more to it than that.</p>
<p>It converts all of the files recursively in the app/views directory of my Rails app, but continues using the ERBs by default.  This means that I can verify the conversion for each file and then remove the corresponding ERB, and everything should just continue to work.</p>
<p>Running through, I find a few cases where indentations aren&#8217;t correct (my <a href="http://www.waggerdesigns.com/blog/2012/07/18/my-journey-on-rails-part-3/" title="My Journey on Rails, Part 3: Advanced Search Form" target="_blank">advanced search form</a>) or the html2haml parser escapes things where it shouldn&#8217;t.  I fix, smoke test, and check in!</p>
<h3>Speaking of Testing</h3>
<p>And now to why I&#8217;m not tackling the <a href="http://net.tutsplus.com/tutorials/javascript-ajax/using-unobtrusive-javascript-and-ajax-with-rails-3/" title="Using Unobtrusive JavaScript and AJAX with Rails 3" target="_blank">UJS</a> topic I promised last blog: I&#8217;ve been neglecting putting test harnessing in place.  This is going to come back and bite me soon if I don&#8217;t get tests set up and backfill for the limited functionality I already support.</p>
<p>Who&#8217;s up for a detour?  Next installment: ramping up on testing in Rails!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/07/31/my-journey-on-rails-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Journey on Rails, Part 3: Advanced Search Form</title>
		<link>http://www.waggerdesigns.com/blog/2012/07/18/my-journey-on-rails-part-3/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/07/18/my-journey-on-rails-part-3/#comments</comments>
		<pubDate>Wed, 18 Jul 2012 14:05:57 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1596</guid>
		<description><![CDATA[On to my next task! An advanced search form. Following along to the revised version of RailsCasts Episode #111, I find that most of my newbie stumbles are around what to pluralize and when (between the classes themselves and the collections of instances themselves) and so much of my debugging effort ends up focused on adding or removing an &#8216;s&#8217;, ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/07/rails3.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/07/rails3.jpg&#038;w=300&#038;h=235&#038;zc=1&#038;q=100" title="" alt="" width="300" height="235" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:300px;" class="image_shadow"></span><p>On to my next task! An advanced search form.</p>
<p>Following along to the revised version of <a title="RailsCasts #111, Advanced Search Form" href="http://railscasts.com/episodes/111-advanced-search-form" target="_blank">RailsCasts Episode #111</a>, I find that most of my newbie stumbles are around what to pluralize and when (between the classes themselves and the collections of instances themselves) and so <span id="more-1596"></span> much of my debugging effort ends up focused on adding or removing an &#8216;s&#8217;, rather than what the rest of the code is doing. Ruby is pretty awesome that way.</p>
<p>If you&#8217;re just joining, this is Part 3 of N.  You can catch up here:</p>
<ul>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/" title="My Journey on Rails, Part 1" target="_blank">Part 1: Setup and Data Import/Export via CSV</a>
</li>
<li>
<a href="http://www.waggerdesigns.com/blog/2012/07/10/my-journey-on-rails-part-2/" title="My Journey on Rails, Part 2" target="_blank">Part 2: Adding Custom Authentication</a>
</li>
</ul>
<h3>Back on Track (Sorry!)</h3>
<p>Some of the fields on my search form are for geolocation: address, zip code, and radius in miles; at some point in the looming future, I&#8217;ll need to dig into online mapping tools to get those pieces assembled, and geolocation stuff will be its own episode.  I&#8217;ll also need to get some client-side validations involved so that I have enough information (ideally!) to actually perform the search.</p>
<p>In addition to location fields, I also have a set of boolean values I&#8217;m tracking.  In the context of a search form, checkboxes do a poor job of representing a boolean true/false properly.  To be completely accurate, I&#8217;ll also need to capture an &#8220;I don&#8217;t care whether this value is true or false&#8221; field here &mdash; which, hey! &mdash; is succinctly represented as a blank first entry in a drop-down select control.</p>
<p>Along the way, I get the chance to tinker with some <a href="http://guides.rubyonrails.org/form_helpers.html" title="Rails Form helpers" target="_blank">Rails Form helpers</a>: <code>text_field</code>, <code>number_field</code>, <code>select</code>, and <code>collection_select</code>.  You can find more information in the API, under ActionView::Helpers::FormHelper, ActionView::Helpers::FormOptionsHelper, and ActionView::Helpers::FormTagHelper. It was initially a tad confusing as to why the helpers were separated out that way; as the API has plenty of pontification and less materialization on how these work in practice, I look a few things up on <a href="http://stackoverflow.com/" title="StackOverflow" target="_blank">StackOverflow</a> to fill in the gaps.  Building your form views doesn&#8217;t get much easier!</p>
<p>I drop a constant array into my Search model to represent the Yes and No options (and their associated values) for reuse across the form.  The <code>select</code> Form helper handles choosing my blank option by default, so it&#8217;s literally a single statement to wire up each of the drop-downs.</p>
<p>All of the criteria on the form may eventually become (as I mentioned before) a tree view where the user can filter listings one criteria at a time, but it will depend &mdash; it may not be great usability once we expand to many listings and geographical regions.  Whatever we build will end up being solid and fancy, nonetheless!</p>
<p>The Advanced Search RailsCast I&#8217;m referencing specifically creates a new DB-backed model for the Search object, which then queries the Listing collection and filters based on what the user is searching on.  <a href="http://austinschneider.com/" title="Austin Schneider, Programmer" target="_blank">Austin Schneider</a>, in the revised episode&#8217;s comments, writes about an approach that uses the session to store the most recent search parameters, versus storing each search as a record in the DB.</p>
<p>Normally, the RESTful, CRUDdy way to go about this in Rails is along the path of New (the form) -> Create (validating and saving the model to the DB) -> Show (attractively present the newly created record.)  This is the approach the RailsCast takes with the Search model.</p>
<h3>Switching Tracks</h3>
<p>There&#8217;s no practical reason for us to store searches in the DB at this point (in fact, there may even be <a href="https://www.eff.org/deeplinks/2009/09/what-information-personally-identifiable" title="What Information is 'Personally Identifiable'?" target="_blank">PII</a> concerns!)  Austin&#8217;s idea is to substitute a <a href="http://blog.steveklabnik.com/posts/2011-09-06-the-secret-to-rails-oo-design" title="The Secret to Rails OO Design" target="_blank">PORO</a> instead of an ActiveModel, and then <a href="http://corelib.rubyonrails.org/classes/YAML.html" title="YAML for Ruby on Rails" target="_blank">store/retrieve</a> the search form parameters in the user&#8217;s session using <a href="http://www.yaml.org/" title="YAML Ain't Markup Language" target="_blank">YAML</a>.  The alternative would be to let user searches fill up the DB (including their street addresses&#8230;) and run a cron job fairly frequently to clear them out; that approach has a serious smell!</p>
<p>FAILING!  FLAILING!  I run into trouble and try to hack my way out of it.  Using a PORO in place of an ActiveModel, Rails starts complaining about things it expects normal models to know how to do already.  I look a couple of them up (ActiveModel::Naming provides at least <code>model_name</code> and <code>param_key</code>, ActiveModel::Conversion provides <code>to_key</code>) and add some appropriate includes.  Part of the session-converting instructions entail singularizing the resource name (because we&#8217;re now doing a one-off search each time rather than tracking and saving search<i>es</i>) but that throws a monkey wrench in my whole business.</p>
<p>I spend some time trying to do additional work in routes.rb, tinker with parameters to the <code>form_for</code> helper on my search form, and eventually give in and email Austin.  He offers reassurances that I&#8217;m on the right track.  I spend some more time fiddling and don&#8217;t get very far.</p>
<p>It eventually occurs to me that I can simplify this whole process by using the <code>form_tag</code> helper (instead of <code>form_for</code>) and just build the search functionality into the existing Listings controller.  <code>form_tag</code> allows you to define an arbitrary HTML form without binding to a model.  I sit down to implement it, and it makes my Spidey sense tingle in that &#8220;there has to be a cleaner way to do this!&#8221; way.  I&#8217;ll take one more stab at fixing up the session-based approach.</p>
<div class="titled_box">
<h6 class="titled_box_title"><span>Segue: Getting the Debugger Working</span></h6>
<div class="titled_box_content">
A couple of the problems I&#8217;m working through (loss of the ActiveModel intelligent constructor, some routing issues) would be well-served with a debugger for poking and prodding.  I&#8217;ve been getting along without one as there&#8217;s a <a href="https://jira.appcelerator.org/browse/APSTUD-3435" title="Show better error messages when invoking a command without the proper Ruby gem Installed" target="_blank">nasty Java stack trace when you try to run Aptana&#8217;s debugger</a> out of the box.  It wouldn&#8217;t be a problem if I was working in Ruby 1.8.7, but&#8230; I&#8217;m not.</p>
<p>Support for Ruby 1.9.X appears not to be up to snuff yet, and there&#8217;s some <a href="http://www.rubytips.org/2011/12/20/installing-ruby-on-windows-7-ruby-1-9-x-guide/" title="http://www.rubytips.org/2011/12/20/installing-ruby-on-windows-7-ruby-1-9-x-guide/" target="_blank">manual messing around you need to do</a> to get it going.</p>
<p>I followed the common wisdom and still ran into problems, and so threw my hands skyward and proclaimed, &#8220;Why NOT <a href="http://www.jetbrains.com/ruby/" title="JetBrains RubyMine: The Most Intelligent Ruby and Rails IDE" target="_blank">RubyMine</a>?&#8221;</p>
<p>And so, my love affair with Rails in Aptana is officially over. It&#8217;s great for its PHP support; not having working Rails debug tools for current version Ruby without tinkering is not ok.  I install RubyMine, and the debugger just <strong>works</strong> out of the box. Plus: great autocompletion!
</div>
</div>
<p>Working debugger in place, I have most of the problems figured out in an hour&#8217;s time with a couple of interesting solutions.  Since I&#8217;m cramming YAML from the dehydrated search form into the session, I get the bright idea of doing some <a href="http://pullmonkey.com/2008/01/06/convert-a-ruby-hash-into-a-class-object/" title="Convert a Ruby hash into a Class object" target="_blank">unpacking of search attributes back onto the Search object itself</a>.  This then allows me to treat the Search object more like the ActiveModel equivalent, since passing a hash to an ActiveModel&#8217;s constructor will set instance variables appropriately wherever <code>attr_accessible</code> matches.</p>
<p>The problem with this approach?  I don&#8217;t really know what&#8217;s coming across the HTTP wire in the hash I&#8217;m being sent.  I could check to make sure that the <a href="http://www.prateekdayal.net/2007/10/16/rubys-responds_to-for-checking-if-a-method-exists/" title="Ruby's Responds_to for Checking if a Method Exists" target="_blank">class already knows</a> about what it&#8217;s assimilating, but it still wouldn&#8217;t take much evil to start overwriting things by manipulating the form post. Argh!</p>
<p>Also, the default code for serializing/deserializing with YAML isn&#8217;t saving my types, which is messing up the way the parameters are being evaluated against the listings.  I do some halfhearted searching and end up overriding the String class by <a href="http://jeffgardner.org/2011/08/04/rails-string-to-boolean-method/" title="Rails String to Boolean Method" target="_blank">adding a to_b (boolean cast) method to parse back the checkboxes</a>.  It works ok, but it seems cheap to have to explicitly cast them.  ActiveRecord::Base infers type from the DB table itself; wouldn&#8217;t that be handy instead?</p>
<p>In the meantime, my routing problems won&#8217;t go away.  I&#8217;m trying to have a singular &#8220;/search&#8221; resource, a &#8220;searches&#8221; controller (it&#8217;s mentioned in the Rails routing guide that singular models still map to plural controllers), and a &#8220;Search&#8221; model.  Should work, but rails keeps looking for &#8220;searches_path&#8221; instead of &#8220;search_path&#8221; when I hand it my Search object.  What&#8217;s going on here?  Is it me? RAILS, WHY DON&#8217;T YOU LOVE ME?!</p>
<h3>The Light at the End of the Tunnel</h3>
<p>(I&#8217;m running out of train euphemisms, and there&#8217;s a long way to go.  That&#8217;s the last one, promise!)</p>
<p>Nope, it&#8217;s not me.  It&#8217;s a known outstanding bug, seemingly only documented <a href="https://github.com/rails/rails/issues/1769" title="link_to / form_for doesn't work for singular resource" target="_blank">in a github issue</a> and there are plenty of comments in regard to this fact.  Ouch.</p>
<p>I&#8217;m getting ready to accept that a PORO isn&#8217;t an ActiveModel and just fudge the rest.  But wait!  I find <a href="https://github.com/cgriego/active_attr" title="ActiveAttr" target="_blank">ActiveAttr</a>, which will largely protect my delicate sensibilities.  There&#8217;s even <a href="http://railscasts.com/episodes/326-activeattr" title="RailsCasts - ActiveAttr" target="_blank">another RailsCast</a> for putting that in place!</p>
<p>Looking through the comments (lest I paint myself into a bit of a corner again), there&#8217;s another project &mdash; <a href="https://github.com/6twenty/modest_model" title="ModestModel" target="_blank">ModestModel</a> &mdash;  which may be better and cleaner.  This is the one I&#8217;m going to try first, and hope.  I really need to move on!</p>
<p>It works like a charm.  I don&#8217;t get the type inference for free, so I still have to explicitly cast a few ints and bools; big deal!  The rest of the code works great, and I manage to simplify back down to something that looks very much like the Rails way to do things.  I opt to simplify the New -> Create -> Show page flow into New -> Create/Show instead.  This takes the YAML and session code out of the picture entirely, and I&#8217;m now just handling the search request and displaying results.  Far more graceful for what it needs to be.</p>
<p>This session has certainly been longer than I had expected or hoped.  But I&#8217;m excited over the progress made (in a concise and elegant amount of code) and the things I&#8217;ve learned along the way.</p>
<p>Next time: I&#8217;m going to convert the <a href="http://ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html" title="Class: ERB (Ruby 1.9.3)" target="_blank">ERB</a>s to <a href="http://haml.info/" title="#haml" target="_blank">HAML</a> and wire up the search form to use AJAX via <a href="http://net.tutsplus.com/tutorials/javascript-ajax/using-unobtrusive-javascript-and-ajax-with-rails-3/" title="Using Unobtrusive JavaScript and AJAX with Rails 3" target="_blank">UJS</a>.  This will support my geolocation code and allow me to update maps client side.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/07/18/my-journey-on-rails-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hyperion Interactive Reporting Online Training</title>
		<link>http://www.waggerdesigns.com/blog/2012/07/11/hyperion-interactive-reporting-online-training/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/07/11/hyperion-interactive-reporting-online-training/#comments</comments>
		<pubDate>Wed, 11 Jul 2012 13:51:06 +0000</pubDate>
		<dc:creator>Emily Vose</dc:creator>
				<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Hyperion EPM Suite]]></category>
		<category><![CDATA[Interactive Reporting]]></category>
		<category><![CDATA[IR Tutorial]]></category>
		<category><![CDATA[Brio]]></category>
		<category><![CDATA[Hyperion Interactive Reporting]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1585</guid>
		<description><![CDATA[We&#8217;ve been toying with the idea of bringing our expert-level on-site Oracle Hyperion Interactive Reporting training to the online arena and we&#8217;re looking for feedback from our visitors. If offered online, through a series of live web conference style presentations, with a focus on the topics covered in my expert Hyperion Interactive Reporting guide, would you take Hyperion Interactive Reporting ...]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve been toying with the idea of bringing our expert-level on-site Oracle Hyperion Interactive Reporting training to the online arena and we&#8217;re looking for feedback from our visitors.  If offered online, through a series of live web conference style presentations, with a focus on the topics covered in <a href="http://www.waggerdesigns.com/blog/2011/12/29/expert-hyperion-interactive-reporting-guide/" title="Expert Hyperion Interactive Reporting guide">my expert Hyperion Interactive Reporting guide</a>, would you take Hyperion Interactive Reporting online training? </p>
<p>The team and I think the best approach would be to present a serious of presentations starting with basic introductions to the IR interface, IR querying and section types, before working our way up to advanced dashboard development, performance tuning, and system automation.  Also, with the recognition that developers have specific and immediate concerns that they are dealing with right now, I&#8217;m wondering if providing web conference blocks to brainstorm ideas or train specific to issues unique to your workplace challenges would be a service our IR community would gain further value from. </p>
<p>What are your thoughts?  Would you take Hyperion Interactive Reporting online training and/or would you be interested in one-on-one IR online consulting sessions? You can leave comments on this post or send me an email (emily(at)waggerdesigns.com)  to let me know! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/07/11/hyperion-interactive-reporting-online-training/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Journey on Rails, Part 2: Authentication Model</title>
		<link>http://www.waggerdesigns.com/blog/2012/07/10/my-journey-on-rails-part-2/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/07/10/my-journey-on-rails-part-2/#comments</comments>
		<pubDate>Tue, 10 Jul 2012 20:52:00 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1551</guid>
		<description><![CDATA[Alas; work happens! I also took time out to skim some of the UC Berkeley SaaS class. The quality of the course is good, but I found myself ahead of many of the software engineering concepts and ended up toying with several of the exercises instead of following every moment. Back Down to Brass Tacks Last time, I left off ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/07/rails2.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/07/rails2.jpg&#038;w=300&#038;h=235&#038;zc=1&#038;q=100" title="" alt="" width="300" height="235" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:300px;" class="image_shadow"></span><p>Alas; work happens! I also took time out to skim some of the <a href="https://www.coursera.org/course/saas" title="Software Engineering for SaaS" target="_blank">UC Berkeley SaaS class</a>. The quality of the course is good, but I found myself ahead of many of the software engineering concepts and ended up toying with several of the exercises instead of following every moment.</p>
<p><span id="more-1551"></span></p>
<h3>Back Down to Brass Tacks</h3>
<p><a href="http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/" title="My Journey on Rails, Part 1">Last time</a>, I left off on <a href="https://www.ruby-toolbox.com/categories/rails_authentication" title="Rails Authentication plugins @ The Ruby Toolbox" target="_blank">authentication</a> and <a href="https://www.ruby-toolbox.com/categories/rails_authorization" title="Rails Authorization plugins @ The Ruby Toolbox" target="_blank">authorization</a>.  There are a ton of canned options available, but upon further reading, they all appear to be overkill for where we want our product to start.</p>
<p>In context, what we&#8217;re building is a directory of sorts, with listings based on public data which people will be able to claim either through email verification or manual process.  Once a listing has been claimed and when the associated user is logged in, there will be a handful of functions available for correcting/updating information or subscribing to paid services.  Outside of additional support for a couple of administrative users, the scope of the user authorization model (i.e. who can do what, and when) is actually very limited.</p>
<p>So!  We can investigate migrating to a more robust solution if we eventually find the need, but for now, the practice of setting it up from scratch in Rails will do me good.  I check out a new branch in <code>git</code> and go to town.</p>
<h3>At Last! A Town!</h3>
<p>Falling back on letting someone do the heavy lifting for me again, I&#8217;m definitely getting my money&#8217;s worth from my RailsCasts subscription.  I check out their <a href="http://railscasts.com/episodes/250-authentication-from-scratch" title="Authentication from Scratch" target="_blank">Authentication from Scratch</a> screencast (well, the <a href="http://railscasts.com/episodes/250-authentication-from-scratch-revised?view=asciicast" title="Authentication from Scratch (Revised, Subscriber Only)" target="_blank">revised edition</a>) and implement as directed.  It&#8217;s definitely just enough for me to then wrap a couple of <a href="http://stackoverflow.com/questions/3992659/in-rails-what-exactly-do-helper-and-helper-method-do" title="Helpers and Helper Methods on StackOverflow" target="_blank">helper methods</a> to restrict the destructive operations to admins only.</p>
<p>The neat part about letting Rails 3 handle the details is that simply by declaring <code>has_secure_password</code> on an ActiveRecord class, the password digest and salting magic is taken care of via BCrypt.  It&#8217;s not that these things are actually that difficult to implement, but it certainly saves some time to be able to roll in the security and have it just <em>work</em>.</p>
<p>I only hit one snag while following along with the screencast: the Rails 3 scaffolding doesn&#8217;t seem to include a block for flash notifications in application.html.erb.  I add one above the <code>&lt;%= yield =%&gt;</code>:</p>
<pre class="fancy_pre_box"><% flash.each do |name, msg| %>
  <%= content_tag :div, msg, id: "flash_#{name}" %>
<% end %></pre>
<div class="titled_box">
<h6 class="titled_box_title"><span>Squirrel!</span></h6>
<div class="titled_box_content">
A distraction from the SaaS class: <a href="http://haml.info/tutorial.html" title="Haml Tutorial" target="_blank">Haml</a>!  This is an extremely elegant and downright pretty markup which plays nicely with rendering data through the Rails pipeline.  I bookmark it with the intent of working it into the project soon, before the frontend UI development gets too far along.</div>
</div>
<p>I finish implementing the basic authentication and add some nifty <a href="http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_true" title="Custom Validation in Rails 3" target="_blank">email address validation</a> while I&#8217;m at it.  I run into the <code>invalid multibyte escape</code> error referenced in the comments&#8230; and I have a little trouble interpreting the fix.  No worries!  After reading up on <a href="http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings" title="Ruby 1.9's Three Default Encodings" target="_blank">the available encodings</a> and what&#8217;s up with that, it was easy enough to add:</p>
<pre class="fancy_pre_box"># encoding: BINARY</pre>
<p>&#8230;to the top of the EmailValidator class to let the pesky regexp definition slide.  The only other hitch is that Rails 3 doesn&#8217;t, by default, automatically load the root/lib directory contents anymore (this is apparently a change from the past!)  Also an easy fix.  Add to application.rb:</p>
<pre class="fancy_pre_box">    config.autoload_paths += %W(#{Rails.root}/lib)</pre>
<h3>Next Up</h3>
<p>Authentication and authorization are glued together sufficiently for the moment; next time, I&#8217;ll be walking through the <a href="http://railscasts.com/episodes/111-advanced-search-form/" title="RailsCasts - Advanced Search Form" target="_blank">setup of the advanced search form as a separate model</a> and attempt a nice, shmexy <a href="http://net.tutsplus.com/tutorials/javascript-ajax/using-unobtrusive-javascript-and-ajax-with-rails-3/" title="Using Unobtrusive JavaScript and AJAX with Rails 3" target="_blank">AJAX interface using Unobtrusive JavaScript</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/07/10/my-journey-on-rails-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Journey on Rails, Part 1: Tools and Importing Data</title>
		<link>http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/#comments</comments>
		<pubDate>Wed, 23 May 2012 13:50:46 +0000</pubDate>
		<dc:creator>Jake Vose</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1497</guid>
		<description><![CDATA[We at Wagger Designs have been brewing up a custom web application for some time now.  This blog series, in several parts, will follow my research and development process of taking our app from idea to reality. I&#8217;ll be sharing techniques and workarounds to issues that arise along the way. Finding the Tracks A couple of years ago, I did some ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/05/johnny_automatic_electric_train_scene.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/uploads/2012/05/johnny_automatic_electric_train_scene.png" title="" alt="" width="300" height="235" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:300px;" class="image_shadow"></span><p>We at Wagger Designs have been brewing up a custom web application for some time now.  This blog series, in several parts, will follow my research and development process of taking our app from idea to reality.  I&#8217;ll be sharing techniques and workarounds to issues that arise along the way.</p>
<p><span id="more-1497"></span></p>
<h3>Finding the Tracks</h3>
<p>A couple of years ago, I did some preliminary tinkering with <a title="Ruby on Rails" href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a> and took <a title="Learn by Doing - Code School" href="http://www.codeschool.com/" target="_blank">Code School</a>&#8216;s excellent free online course, <a title="RailsForZombies" href="http://railsforzombies.org/" target="_blank">Rails for Zombies</a>.  I was extremely interested in the technology at the time (having been a <a title="CLISP - an ANSI Common Lisp Implementation" href="http://www.clisp.org/" target="_blank">Lisp</a> geek in college, I&#8217;m a little all over the place) but due to my full-time and after-hours commitments at that point, not much traction was made.</p>
<p>More recently (on a related tangent), I started working more with <a title="git" href="http://git-scm.com/" target="_blank">git</a> for SCM during some internal iOS development, and become quite comfortable with it for revision control.</p>
<p>In the first week of May, I decided that Rails would be a good candidate for our new web application, and found myself interested in returning to Code School to take <a title="Rails for Zombies 2 - Code School" href="http://www.codeschool.com/courses/rails-for-zombies-2" target="_blank">Rails for Zombies 2</a>.  Some of the reasons I pegged Rails as a contender:</p>
<ul>
<li>It&#8217;s a mature, well-structured <a title="Model View Controller" href="http://c2.com/cgi/wiki?ModelViewController" target="_blank">MVC</a> framework</li>
<li>Rails features robust <a title="Object-relational mapping - Wikipedia" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a> with quite a bit of <a title="Active Record -- Object-relation mapping put on rails" href="http://ar.rubyonrails.org/" target="_blank">convenience functionality</a> built in</li>
<li><a title="How I Explained REST to My Wife" href="http://tomayko.com/writings/rest-to-my-wife" target="_blank">REST</a>- and <a title="Search Engine Optimization (SEO) - Webmaster Tools Help" href="http://support.google.com/webmasters/bin/answer.py?hl=en&amp;answer=35291" target="_blank">SEO</a>-friendly routing with little effort</li>
<li>Huge, active, knowledgeable community</li>
<li>Do you really need a reason to [re-]read <a title="why’s (poignant) guide to ruby" href="http://mislav.uniqpath.com/poignant-guide/" target="_blank">why&#8217;s (poignant) guide to ruby</a>?</li>
</ul>
<p>There was a slight problem, in that I didn&#8217;t really remember anything from the original Rails for Zombies course.  After a refresher, I went back over our collective app brainstorming notes and hobbled together a first swipe at the data model.</p>
<p>Raring to go, I subscribed to Code School.  Rails for Zombies 2 was such a great class that I also powered through <a title="Rails Best Practices - Code School" href="http://www.codeschool.com/courses/rails-best-practices" target="_blank">Rails Best Practices</a> and finished <a title="CSS Cross-Country - Code School" href="http://www.codeschool.com/courses/css-cross-country" target="_blank">CSS Cross-Country</a> for dessert.</p>
<p>If you&#8217;re looking to follow along but don&#8217;t have any experience with Rails, I highly recommend Code School&#8217;s classes; however, there are also plenty of other free resources available, including rubyonrails.org&#8217;s own <a title="Rails Guides: Getting Started With Rails" href="http://guides.rubyonrails.org/getting_started.html" target="_blank">Getting Started with Rails</a> guide.  There are, in fact, a large number of useful guides there, which you can even download from the main <a title="Ruby on Rails Guides" href="http://guides.rubyonrails.org/index.html" target="_blank">Rails Guides</a> page in .mobi format for Kindle reader apps.</p>
<div class="titled_box">
<h6 class="titled_box_title"><span>Tools Note</span></h6>
<div class="titled_box_content">While many Rails veterans swear by <a title="TextMate — The Missing Editor for Mac OS X" href="http://macromates.com/" target="_blank">TextMate</a> for developing on Mac OS X, I&#8217;ve been using <a title="Aptana Studio 3" href="http://aptana.com/products/studio3" target="_blank">Aptana Studio 3</a> for the past few years for my PHP, HTML, CSS, and JavaScript editing.  Rails and git support are both pretty extensive, and Aptana is a solid cross-platform IDE choice with some handy features for working remotely.  Just an FYI, you may want to keep your regular terminal solution handy, as Aptana has <a title="[#APSTUD-3336] Terminal always scrolls back to bottom - Appcelerator JIRA " href="https://jira.appcelerator.org/browse/APSTUD-3336?page=com.atlassian.jira.plugin.system.issuetabpanels:changehistory-tabpanel" target="_blank">a low-priority bug logged in JIRA</a> where windows keep autoscrolling while you&#8217;re trying to view scrollback.  Annoying!  Not a showstopper, though.</div>
</div>
<h3>Get This Train Rolling!</h3>
<p>After a couple more meetings to sort out a few details and prioritize, we were ready to start writing real code.  First things first, we needed a way to import and export batches of spreadsheet data.  Our initial data sources will largely be coming from public records and require a decent amount of manual massage to be useful; therefore, it doesn&#8217;t make sense to over-architect a solution when CSV via Excel will work just fine in the initial stages.</p>
<p>I go ahead and checkout a new branch for this purpose, and start looking up CSV import/export functionality I can borrow.  One of the very first projects I find is <a title="Database import / export Rake tasks" href="https://github.com/synbioz/database.rake" target="_blank">database.rake from Synbioz</a>.  This project provides the ability import directly into a model table, or allows export of one/all tables in a single shot.  I get nervous when I see that it&#8217;s over 2 years old, but it&#8217;s so close to what I need that I throw caution to the wind and push forward; after all, if it doesn&#8217;t pan out, I can just discard my git branch and try again.  I clone it per the README into /lib/tasks/database and try to run rake:</p>
<pre class="fancy_pre_box">cannot load such file -- fastercsv</pre>
<p>Oh, right!  I forgot to add it to the Gemfile.  I do so, and run &#8220;bundle install&#8221; from the root project folder.  Trying again, I discover that my initial fears of the project being stale may have been founded after all:</p>
<pre class="fancy_pre_box">Please switch to Ruby 1.9's standard CSV library.  It's FasterCSV plus support for
Ruby 1.9's m17n encoding engine.</pre>
<p>That actually sounds&#8230; hopeful!  I do a simple find/replace in the rake task code, changing &#8220;fastercsv&#8221; to &#8220;csv&#8221; and &#8220;FasterCSV&#8221; to &#8220;CSV&#8221; — and it works like a charm!  We&#8217;re in business. I export my main model to CSV and upload it to Google Docs. I remove a few fields (autogenerated id and the created_at/updated_at timestamps) and add the column types into the second row for reference purposes; now we have a spreadsheet import template we can just clone off to add data as needed. Allons-y!</p>
<p>I check in the changes (commit -am &#8216;message here&#8217;) and receive a funny message:</p>
<pre class="fancy_pre_box">
# On branch csvIOTask
# Changes not staged for commit:
#   (use "git add &lt;file&gt;..." to update what will be committed)
#   (use "git checkout -- &lt;file&gt;..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   lib/tasks/database (modified content)
#
</pre>
<p>Git is seeing the cloned &#8220;database&#8221; repository as a submodule of sorts.  (More specifically, it&#8217;s reading the .git in that directory.)  Since I didn&#8217;t <a title="Git Tools - Submodules" href="http://git-scm.com/book/en/Git-Tools-Submodules" target="_blank">add it properly as a real submodule</a>, I can&#8217;t just <a title="How to ignore changes in git submodules" href="http://www.nils-haldenwang.de/frameworks-and-tools/git/how-to-ignore-changes-in-git-submodules" target="_blank">hide the changes</a> and go about my merry way.  I eventually just remove the .git directory from /lib/tasks/database, and that fixes the problem as well.</p>
<p>Data import/export is up and running!  Next time, I&#8217;ll be working through our authentication model.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/05/23/journey-rails-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wagger Grows Websites</title>
		<link>http://www.waggerdesigns.com/blog/2012/04/26/wagger-grows-websites/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/04/26/wagger-grows-websites/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 14:39:44 +0000</pubDate>
		<dc:creator>Emily Vose</dc:creator>
				<category><![CDATA[Website Design]]></category>
		<category><![CDATA[Consulting]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1192</guid>
		<description><![CDATA[While anyone can make a website, our team specializes in truly cultivating the growth your business&#8217; website.  What does cultivating a website even mean?  Excellent question!  Our process of website cultivation is an end-to-end process to continually evaluate the needs of your customers, your business, and — very importantly — your budget to maximize the Return On Investment (ROI) a ...]]></description>
			<content:encoded><![CDATA[<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/WaggerGrowsWebsites.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/WaggerGrowsWebsites.png&#038;w=590&#038;h=234&#038;zc=1&#038;q=100" title="" alt="" width="590" height="234" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:590px;" class="image_shadow"></span></div><p>While anyone can make a website, our team specializes in truly cultivating the growth your business&#8217; website.  What does cultivating a website even mean?  Excellent question!  Our process of website cultivation is an end-to-end process to continually evaluate the needs of your customers, your business, and — very importantly — your budget to maximize the Return On Investment (ROI) a website can bring to the success of your business.  The constant assessment of our website cultivation process is especially important in the Northern Virginia DC Metro area where so many start-ups and small businesses are competing for the attention of the same customers.</p>
<h2>1. Interviews &amp; Information Sessions</h2>
<p>I&#8217;ve always thought this first phase to be the most important of all, as it sets the tone for everything else moving forward.  This phase is a lot like a first date because we want to know about you, your business, your customers, and anything else you feel like sharing, along with answering as much as you want to know about us.  Among the questions you should expect us to ask:</p>
<ul>
<li>Where did the name of your business come from?</li>
<li>Why did you start a business, and what sets you apart from your competitors?</li>
<li>What types of customers do you currently attract and do you want to attract other types?</li>
<li>How do you currently advertise, and how successful to do you think that is?</li>
<li>What are your expectations from a website?</li>
</ul>
<p>These questions help us gain a better understanding of your goals and help you to get to know us better.  This type of interview will be ongoing throughout each phase to ensure the process, progress, and project milestones are understood and agreed upon by all involved.   Our stance of open communication, supported by our customer portal, helps avoid unnecessary changes down the road caused by uncomfortable requirement and functional misunderstandings.</p>
<h2>2. Website Design and Web Architecture</h2>
<p>Once we&#8217;ve got an idea of the design and functional requirements of your site, our graphic artists come aboard to start creating website design mocks while our web architecture team gets the ball rolling with technical specifications and wireframes.</p>
<p>For the majority of websites, this will be the most time-consuming phase of development because this is where the website is actually designed.  While large scale revisions can and should occur in this phase, we&#8217;re experienced with empowering you to make the decisions required to move smoothy and efficiently through the process.</p>
<h2>3. Functional Specifications</h2>
<p>With the big concerns tackled in the website design and web architecture phase, this phase is the nitty gritty details such as navigation effects, CSS enhancements, JavaScript and jQuery behaviors, and advanced enhancements such as Flash.  While we are hashing out these details, our development team is busy staging your testing environment, identifying hosting requirements, and readying the troops for the next phase: Website Development.</p>
<h2>4. Website Development</h2>
<p>With the other phases behind us, the website development is surprisingly fast.  Historically, this marks is a little more than the 3/4 point of a project budget and is a lot like approaching 3rd base on the diamond.   With the design mocks, wireframes, and functional specs in-hand our team of industry-leading developers translate the site requirements into an actual website.</p>
<p>Starting with a Content Management System (CMS), such as WordPress, our application developers and graphics designers work in parallel to execute on the website design and functional requirements to build the site to our agreed-upon specifications.</p>
<p>As this phase progresses, our usability team steps up to make sure the site meets usability standards and is easy for your customers to use.  Depending on the scope of the website, this may include marketing surveys and beta testing to make sure your customers can find your services and ultimately do business with your company.</p>
<h2>5. SEO/SEM and other Marketing</h2>
<p>Towards the halfway point of the website development phase, our Search Engine Optimization (SEO) and Search Engine Marketing (SEM) team kicks into high gear to identify content and editorial requirements and begin optimizing the site for search engine visitors.</p>
<p>While SEM and other marketing &#8211; such as email marketing or print media &#8211; are optional site enhancements, we do not believe that SEO is an option for business in the Northern Virginia, DC Metro area.  As this area is especially ripe for entrepreneurs and is therefore rife with competition, we include a base SEO package with all of our websites and launch you with the best chances of being found.   Learn more about our SEO and SEM services from our <a title="Digital Marketing" href="http://www.waggerdesigns.com/services/marketing-service/">Digital Marketing Service page</a>.</p>
<h2>6. Cultivation</h2>
<p>This is what happens after your site goes live and is a lot like growing grass.  Up until this point, we readied the earth for your site by laying the foundation, placing the seeds, and preparing it to thrive.  The next step is to maintain the website by performing traffic analysis, providing regular updates, and performing routine maintenance.  While we will train you to keep your site up and running, we&#8217;re here to fill in any gaps or clear to-do&#8217;s off your list along the way.</p>
<p>Happy growing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/04/26/wagger-grows-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips for Pediatric Websites</title>
		<link>http://www.waggerdesigns.com/blog/2012/04/24/tips-for-pediatric-dentist-websites/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/04/24/tips-for-pediatric-dentist-websites/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 16:08:44 +0000</pubDate>
		<dc:creator>Emily Vose</dc:creator>
				<category><![CDATA[Website Design]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Graphics Design]]></category>
		<category><![CDATA[Internet Marketing]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1152</guid>
		<description><![CDATA[While we formed the legal structure of Wagger Designs in 2009, our founding members were doing business under the name of Wagger Designs for several years before that.  While going through our customer archives I came across our very first customer, a Pediatric Dentist operating in the Adams Morgan area of Washington DC seeking a pediatric website for his practice that was unique ...]]></description>
			<content:encoded><![CDATA[<p>While we formed the legal structure of Wagger Designs in 2009, our founding members were doing business under the name of Wagger Designs for several years before that.  While going through our customer archives I came across our very first customer, a Pediatric Dentist operating in the Adams Morgan area of Washington DC seeking a pediatric website for his practice that was unique and inspiring for his little patients and thier parents. While reminiscing on how much fun it was working with him to create a website tailored to parents with children, it reminded me of a few tips that medical and dental professionals, in general, could benefit from when looking for ideas for pediatric websites focused on the needs of these little patients and their parents.</p>
<h2>Remember Your Audience</h2>
<p>Don&#8217;t forget that as a pediatric dentist, your <a title="Website Design Services" href="http://www.waggerdesigns.com/services/website-services/">website design</a> should appeal primarily to parents with children — not the children.  Don&#8217;t fall into the trap of ignoring the needs of your patients&#8217; parents while trying to make something childish and fun.  This means that a pediatric website must be easy to read and navigate, but should still be as fun and creative as your practice.  A website that balances the same fun-but-professional atmosphere your practice does will go a long way to setting you apart from the fierce competition amongst pediatric medical and dental professionals in Northern Virginia.</p>
<h2>Show REAL Pictures</h2>
<p>While seemingly cost-effective, the use of stock imagery is something that tends to turn off parents. Those parents researching professionals through their pediatric websites will pick up on reoccurring generic children very, very quickly and wonder what&#8217;s wrong with your people or practice that makes you not want to show real pictures.</p>
<div class="one_half">
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/avoid-stock-images-a.png" title="This baby and Mom are in TX"><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/avoid-stock-images-a.png&#038;w=250&#038;h=160&#038;zc=1&#038;q=100" title="This baby and Mom are in TX" alt="Generic Baby and Mom A" width="250" height="160" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:250px;" class="image_shadow"></span></div></div>
<div class="one_half last">
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/avoid-stock-images-b.png" title="This baby and Mom are in FL"><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/avoid-stock-images-b.png&#038;w=250&#038;h=168&#038;zc=1&#038;q=100" title="This baby and Mom are in FL" alt="Generic Baby and Mom B" width="250" height="168" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:250px;" class="image_shadow"></span></div></div>
<div class="clearboth"></div>
<p>Quality webdesign firms, such as <a title="Contact Us" href="http://www.waggerdesigns.com/contact-wagger-designs/">Wagger Designs located in Northern Virginia</a>, have photographers on staff who will take pictures of your actual staff and practice to alleviate the need for stock photography.</p>
<h3>Show Images of Your Practice</h3>
<p>Showing actual pictures of the examination area, operatories, waiting areas, and exterior location is very important for a pediatric website.  Parents who visit your site want to see that the areas are clean and in good repair.  Beyond knowing you keep up with your physical location, a sneak peak of your kid-friendly facilities also allows parents to get a feel for how you will interact with the children in your care.  Practices with kid-friendly features will leave a great impression with parents and a pediatric website is a excellent place to show these features to the parents of perspective patients.</p>
<p>Typically forgotten, an exterior shot, great on a directions or contact pages, make it easier for parents to find your pediatric practice by giving them a visual idea of your practice&#8217;s exterior.</p>
<h3>Show Pictures of Your Team</h3>
<p>Never substitute stock-imagery for your actual team members or actual patients.  One way to get great action shots of your staff interacting with children is to host an open house night for children you know well.  Throw a little party and provide exams for them while you and your staff operate like you would in a typical day.  The pictures from this event will yield incredible shots of your friendly staff and happy children throughout your practice.  When parents researching pediatric professionals arrive at your website, they will notice the uniqueness of these pictures and will appreciate having the opportunity to see you in action.</p>
<h2>Easy on the &#8220;Fun&#8221; and &#8220;Cute&#8221;</h2>
<p>Some &#8220;fun&#8221; deigns elements are usability nightmares for parents.  One prime example is the use of a mouse cursor trails.  These seem SO CUTE! — but they are not only incredibly annoying when browsing a site, but are also horrible for parents browsing pediatric websites with disabilities.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/trailing-cursor.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/uploads/2012/04/trailing-cursor.png" title="" alt="" width="285" height="201" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:285px;" class="image_shadow"></span></div><p>Another element that gets professionals in trouble is a pediatric website that plays sounds. Having a pediatric website automatically play safari noises is the quickest way to encourage a parent to leave your site — especially if they are at work.</p>
<p>The last &#8220;fun&#8221; and &#8220;cute&#8221; example to stay away from is overly creative navigation.   Having stared at a few pediatric websites trying to find the navigation, I can attest that parents who cannot find the information they are looking for will quickly move on.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/ambigious-navigation.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/ambigious-navigation.png&#038;w=600&#038;h=250&#038;zc=1&#038;q=100" title="" alt="" width="600" height="250" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:600px;" class="image_shadow"></span></div><h2>Wagger&#8217;s Pediatric Website Packages</h2>
<p><a title="Contact Us" href="http://www.waggerdesigns.com/contact-wagger-designs/">Contact us</a> to learn more about how our team can partner with you to build a pediatric website that compliments the uniqueness of your practice and encourages parents to convert from a website visitor to a patient.  We know technology and also understand how to integrate with leading third-party vendors, such as Dentrix, to get new patients into your practice systems quickly.</p>
<p>Find out how our strategy of levering a modern website design, <a title="Digital Marketing" href="http://www.waggerdesigns.com/services/marketing-service/">SEO techniques</a>, and fully customized graphics and photography will contribute to your practice&#8217;s success today!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/04/24/tips-for-pediatric-dentist-websites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How You Can Avoid Google’s “Over Optimization” Algorithm</title>
		<link>http://www.waggerdesigns.com/blog/2012/04/22/avoiding-over-optimization-algorithm-penalities/</link>
		<comments>http://www.waggerdesigns.com/blog/2012/04/22/avoiding-over-optimization-algorithm-penalities/#comments</comments>
		<pubDate>Sun, 22 Apr 2012 20:11:04 +0000</pubDate>
		<dc:creator>Colleen Clark</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Internet Marketing]]></category>
		<category><![CDATA[Keywords]]></category>

		<guid isPermaLink="false">http://www.waggerdesigns.com/?p=1156</guid>
		<description><![CDATA[During SXSW, Matt Cutts (a high profile search engine quality member of Google), was interviewed about a new algorithm change directed towards addressing people who are optimizing a site to “trick” the search engines into ranking the site well. Now before we all get our panties in a twist, chances are, if you’re considered to be a “white-hat” SEO, you ...]]></description>
			<content:encoded><![CDATA[<span class="shadow_frame alignright"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/google-penguin-update.jpg" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/google-penguin-update.jpg&#038;w=200&#038;h=266&#038;zc=1&#038;q=100" title="" alt="" width="200" height="266" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:200px;" class="image_shadow"></span><p>During SXSW, Matt Cutts (a high profile search engine quality member of Google), was <a href="http://www.seroundtable.com/google-over-seo-update-14887.html">interviewed</a> about a new algorithm change directed towards addressing people who are optimizing a site to “trick” the search engines into ranking the site well.</p>
<p>Now before we all get our panties in a twist, chances are, if you’re considered to be a “white-hat” <a title="Digital Marketing" href="http://www.waggerdesigns.com/services/marketing-service/">SEO</a>, you probably don’t have to worry about any “over optimization penalty.”  However, if you find you’re asking yourself, “Am I really doing something sketchy even though it’s getting me to Page 1?” The most likely answer is yes; yes, you are, and you bet your ass Google is going to figure it out.  But what exactly is “over optimization” anyway and how does one avoid such a penalty?</p>
<p>Here at Wagger Designs, we’ve compiled a checklist of issues and examples that may trigger Google’s over optimization penalty.<span id="more-1156"></span></p>
<h2>1. Excessive Internal Linking in Content</h2>
<p>For years, SEOs have been talking about keyword to content ratio, but what they fail to mention is the importance of the internal anchor text link to content ratio.  While content on a page is one of the most essential elements of SEO, it’s also just as important &#8212; if not more so &#8212; not to make the mistake of having a high percentage of links vs actual HTML content.  This general HTML content is considered to be anything located within &lt;p&gt; (paragraph) tags.</p>
<p>In the “Women’s Cardigans” example below, the link to content ratio is approximately 51%.  This means that 51% of all words in this paragraph are internal links.  This is something search engines could easily red flag and penalize the site for over optimization.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-excessive-linking-example.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-excessive-linking-example.png&#038;w=590&#038;h=68&#038;zc=1&#038;q=100" title="" alt="" width="590" height="68" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:590px;" class="image_shadow"></span></div><div class="info_box">Create relevant unique content to every page with 3-4 links to every 500 or so words. This will not only reduce your chances of getting dinged by search engines, but will also help increase user readability and time spent on site. Also, make sure to switch up your internal link naming scheme so that the keywords are similar but varied when targeting the same page.</div>
<h2>2. Highly Targeted Links in Footer</h2>
<p>Historically speaking, <a title="Website Design Services" href="http://www.waggerdesigns.com/services/website-services/">web designers</a> have used footers to display only the very most important pages on the site such as an HTML sitemap or an “about us” page since top-level navigation will include most if not all sub-navigation pages.</p>
<p>In order to increase the relevance of internal page topics, websites will place an excessive number of keyword stuffed anchor links at the bottom of a web page.  These “over optimized” websites try to position deeper pages as the “footer.”</p>
<p>A prime example of keyword stuffed footers can be found on the screenshot of a wedding site below.  Not only does it contain optimized links within the footer, the site lists out a highly detailed list of links at the bottom of every page.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-highly-targeted-footer-links-example.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-highly-targeted-footer-links-example.png&#038;w=590&#038;h=328&#038;zc=1&#038;q=100" title="" alt="" width="590" height="328" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:590px;" class="image_shadow"></span></div><div class="info_box">Review the links listed at the bottom of each landing page and ask yourself three questions:</p>
<ol>
<li>Is the number of links listed in my footer (or at the bottom of my page) more than 10-15?</li>
<li>Are my anchor links making it easier or harder for my user to find key pages?</li>
<li>Are the links highly optimized to target keywords?</div>
</li>
</ol>
<h2>3. Link Stuffed Navigation</h2>
<p>Over optimizing primary navigation to be filled with targeted keywords may also flag search engines that the site was intended to optimize against search engine algorithms and not be tailored to the end user.  We uncovered two primary examples of navigation “over optimization”:  Sub-Categories and Breadcrumb structure.</p>
<p>Breadcrumbs were initially created with the intent to help a user find their way back to the home page or go back to a higher level category.  Later on, search engines began to use this breadcrumb navigation as a cue and began to utilize the <a title="The Art of Keyword Categorization" href="http://www.waggerdesigns.com/blog/2012/01/16/the-art-of-keyword-categorization/">keyword category structure</a> within search engine listings.  Some websites have begun to take advantage of this breadcrumb navigation and create more than one path home.  While this type of navigation may ultimately help search engines associate products with multiple categories, users may become confused.</p>
<p>For example, the screenshot of the clothing site below uses three separate link paths for users and search engines to retreat backwards.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-link-stuffed-breadcrumbs-example.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-link-stuffed-breadcrumbs-example.png" title="" alt="" width="345" height="79" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:345px;" class="image_shadow"></span></div><p>A more common “over optimization” technique for navigation is targeting and creating a page for every product under the sun and then labeling it using optimized keywords with a clear intent to boost search engine rankings and no regards to the user.  The funny thing about this technique is search engines understand category relations.  In other words, search engines understand that if the primary navigation is “Women’s Wakeboard Shop,” all links placed underneath are related to “Women’s” and do not need to contain “Women’s.”  This technique also makes it harder for a user to browse the site, which is something a search engine, like Google, may counter with this new “over optimization” penalty.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-link-stuffed-navigation-example1.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-link-stuffed-navigation-example1.png&#038;w=590&#038;h=246&#038;zc=1&#038;q=100" title="" alt="" width="590" height="246" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:590px;" class="image_shadow"></span></div><div class="info_box">If your website has a high volume of pages, you may want to re-evaluate your navigation to ensure it relates first and foremost to a user and not a search engine. Consider installing an online survey or asking your friends and business partners to give you their opinion of your website. This will not only help you combat getting pinged in future search engine algorithm changes, but may also assist increasing KPIs such as page views and time-on-site.</div>
<h2>4. Keyword Stuffing</h2>
<p>One may say, “Wow… keyword stuffing?  People really do that?  Isn’t that sooooo 1999?  …Even more importantly, it works?”  Yes, people still do it on the sly, and it seems to still help websites (coupled with other optimization tricks) rank in the Top 30 to this day.</p>
<p>For example the footer on this Northern Virginia/DC Metro Web Design site lists out top targeted keywords.  While it’s not entirely hidden and done in a classy way, these are the kinds of things the “over optimization” algorithm may intend to target:</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-keyword-stuffing-example.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/themes/echelon/lib/scripts/timthumb/thumb.php?src=http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-keyword-stuffing-example.png&#038;w=590&#038;h=183&#038;zc=1&#038;q=100" title="" alt="" width="590" height="183" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:590px;" class="image_shadow"></span></div><div class="info_box">Evaluate your site content to see if it contains a high number of lists containing targeted keywords. Typically these lists are located at the bottom and may be hidden using CSS formatting.</div>
<h2>5. Keyword Filled Title and Meta Tags</h2>
<p>Another issue related to “keyword stuffing” as noted above, is injecting a long line of keywords into title and meta description tags.  Title tags should always be limited to include just one primary keyword and 2-3 supporting keywords when relevant.  Titles should look natural to entice the searcher and meta descriptions should be written to promote a call to action while occasionally including keywords.  Since search engines want all aspects of a site intended for a user and not the search engine, the new Google algorithm may begin to identify when too many words are stuffed into a title or meta description and deplete the value of such a site.</p>
<p>The example below attempts to target every “Green Tea” related keyword into the Title and Description.</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-keyword-filled-title-and-meta-tags.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-keyword-filled-title-and-meta-tags.png" title="" alt="" width="560" height="88" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:560px;" class="image_shadow"></span></div><div class="info_box">If you find your landing page title and meta descriptions are targeting too many keywords, you may want to consider building out content to target each keyword instead of “over optimizing” the title and description by stuffing them with multiple keywords. Instead, try targeting one keyword and minor variations such as adding the plural version.</div>
<h2>6. External Linking</h2>
<p>Historically speaking, Google has come down hard on individually high-profiled cases noted in sources such as the NY Times about abusing external link algorithm.  Such examples include <a href="www.nytimes.com/2011/02/13/business/13search.html?pagewanted=all">JC Penny’s paid link buying</a> or <a href="http://online.wsj.com/article/SB10001424052748704520504576162753779521700.html">discounts offered by Overstock.com</a> in exchange for a link.  Smaller businesses have managed to shield themselves in the fact they don’t have the amount of budget or customer leverage to drastically increase links to the scope of JCPenny or aren&#8217;t big enough to gain the spotlight for shady schemes.  However, Google’s new “over optimization” algorithm may be coming to get these smaller players in the upcoming months.</p>
<p>The thing that has always baffled me is how the all-mighty stock-splitting Google has enough money to investigate these notorious link-buying companies and their web networks, but has clearly never taken action to detect them and wreak havoc.</p>
<p>For example, many websites and their targeted backlink anchor text are featured under a WordPress blogroll and other similar side bar of links:</p>
<div class="aligncenter"><span class="shadow_frame"><a rel="prettyPhoto" href="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-external-linking-example.png" title=""><img class="framed" src="http://www.waggerdesigns.com/wp-content/uploads/2012/04/over-optimization-external-linking-example.png" title="" alt="" width="210" height="306" /></a><img alt="" src="http://www.waggerdesigns.com/wp-content/themes/echelon/images/shortcodes/image_shadow.png" style="width:210px;" class="image_shadow"></span></div><div class="info_box">If you’re currently link buying, you may want to consider either heavily reducing the amount of links you’re purchasing (JCPenny got into hot water since the amount of links purchased daily was enormous). You can also request these companies completely remove all historical links pointing to your site immediately.</div>
<h2>What Would Wagger Do?</h2>
<p>While Wagger Designs believes SEO is a core component of web design, we believe it’s most important every website we build is intended for the end user.  While it’s important to get users to your site, it’s even more important not to forget that your users are your customers.  After all, search engines aren&#8217;t going to pay your rent.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waggerdesigns.com/blog/2012/04/22/avoiding-over-optimization-algorithm-penalities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
