<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Brightbit]]></title>
  <link href="http://brightb.it/atom.xml" rel="self"/>
  <link href="http://brightb.it/"/>
  <updated>2013-05-03T09:52:59-05:00</updated>
  <id>http://brightb.it/</id>
  <author>
    <name><![CDATA[Brightbit]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[We are looking for a Full Stack Developer]]></title>
    <link href="http://brightb.itblog/2013/05/02/we-are-looking-for-a-full-stack-developer/"/>
    <updated>2013-05-02T12:01:00-05:00</updated>
    <id>http://brightb.itblog/2013/05/02/we-are-looking-for-a-full-stack-developer</id>
    <content type="html"><![CDATA[<h2>Full Stack Developer</h2>

<p>Full time position in Oklahoma City</p>

<p>Brightbit is looking for a Full Stack Developer (some front-end and back-end) to build well-crafted web applications at our Oklahoma City headquarters. As a member of our development team, you’ll build responsive and elegant interfaces using Ruby on Rails and similar technologies, while possessing a deep understanding of our entire application stack.</p>

<div><strong>You must possess</strong></div>


<ul>
<li>Between 3 and 5 years development experience</li>
<li>Basic proficiency jQuery and Javascript</li>
<li>Understanding of best practices for HTML5 &amp; CSS3</li>
<li>Experience working in MVC frameworks and templating languages (Ruby on Rails)</li>
<li>Proficiency in Git and using Github for pull requests</li>
<li>Experience testing your code (e.g. rspec, minitest, Jasmine)</li>
<li>Self managing and ready to be the lead on a project if necessary</li>
<li>You already live in the Oklahoma City area or can relocate</li>
</ul>


<div><strong>Bonus Points</strong></div>


<ul>
<li>Proficiency in using Heroku to host and scale web applications</li>
<li>You know what zeus, simple_form and pry are.</li>
<li>Experience freelancing and handling client communication</li>
<li>Contributions to open source software</li>
<li>Show us some projects and sites you have built on your own</li>
<li>You enjoy comfortable mexican sofas</li>
</ul>


<div><strong>Benefits</strong></div>


<ul>
<li>Competitive salary</li>
<li>We’ll have a MacBook Pro ready for you (and other Apple equipment)</li>
<li>2 days in the office / 3 days telecommute per week</li>
<li>We’ll pay for lunch on office days</li>
<li>Flexible hours/schedule</li>
<li>Relaxed and friendly office atmosphere</li>
<li>2 weeks paid time off</li>
</ul>


<p>Send your resume and references to <a href="&#109;&#97;&#x69;&#x6c;&#116;&#111;&#58;&#x68;&#x65;&#108;&#108;&#x6f;&#x40;&#98;&#114;&#x69;&#x67;&#104;&#x74;&#98;&#105;&#x74;&#x2e;&#99;&#111;&#x6d;">&#x68;&#101;&#x6c;&#x6c;&#x6f;&#x40;&#x62;&#x72;&#105;&#103;&#x68;&#116;&#x62;&#105;&#x74;&#x2e;&#x63;&#111;&#x6d;</a> * we’d love to work together!</p>

<p>Brightbit is an application development studio with years of experience crafting apps of all sizes. We are passionate about making the web a better place to live.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[We are looking for a Sales Consultant]]></title>
    <link href="http://brightb.itblog/2013/05/02/we-are-looking-for-a-sales-consultant/"/>
    <updated>2013-05-02T12:00:00-05:00</updated>
    <id>http://brightb.itblog/2013/05/02/we-are-looking-for-a-sales-consultant</id>
    <content type="html"><![CDATA[<h2>Sales Consultant</h2>

<p>Full time position in Oklahoma City</p>

<p>Brightbit is looking for an experienced salesperson to help us continue to grow our company. The ideal candidate for this position possesses excellent communication skills and is passionate about innovation and web technology.</p>

<div><strong>You must possess</strong></div>


<ul>
<li>At least one year of sales experience</li>
<li>Basic familiarity with the processes and tools used to build web and mobile applications</li>
<li>Enthusiasm for design, technology and the internet</li>
<li>Strong writing and editing skills</li>
<li>You already live in the Oklahoma City area or can relocate</li>
<li>Honesty, integrity, and a good work ethic</li>
</ul>


<div><strong>Bonus Points</strong></div>


<ul>
<li>Experience with the sales process of large development projects</li>
<li>You have managed an online ad campaign</li>
</ul>


<div><strong>Benefits</strong></div>


<ul>
<li>Competitive salary</li>
<li>We’ll have a MacBook Pro ready for you (and other Apple equipment)</li>
<li>2 days in the office / 3 days telecommute per week</li>
<li>We’ll pay for lunch on office days</li>
<li>Flexible hours/schedule</li>
<li>2 weeks paid time off</li>
<li>Relaxed and friendly office atmosphere</li>
</ul>


<p>Send your resume and references to <a href="&#x6d;&#97;&#105;&#x6c;&#116;&#111;&#x3a;&#x68;&#101;&#108;&#108;&#111;&#x40;&#98;&#114;&#105;&#103;&#x68;&#116;&#98;&#x69;&#116;&#x2e;&#99;&#x6f;&#109;">&#104;&#101;&#x6c;&#108;&#111;&#64;&#98;&#x72;&#x69;&#103;&#x68;&#116;&#x62;&#x69;&#x74;&#x2e;&#99;&#111;&#x6d;</a> - we’d love to work together!</p>

<p>Brightbit is an application development studio with years of experience crafting apps of all sizes. We are passionate about making the web a better place to live.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jonathan Camenisch Joins Brightbit]]></title>
    <link href="http://brightb.itblog/2013/02/11/jonathan-camenisch-joins-brightbit/"/>
    <updated>2013-02-11T10:33:00-06:00</updated>
    <id>http://brightb.itblog/2013/02/11/jonathan-camenisch-joins-brightbit</id>
    <content type="html"><![CDATA[<p>We welcome Jonathan Camenisch to the Brightbit team as our first
developer/programmer hire. Jonathan has over 3 years of experience
building Ruby apps small and large ranging from Sinatra to Rails, with
the ability to handle programming on the backend as well as frontend
skills to put it all together.</p>

<p>Jonathan joins us after spending a good amount of time freelancing, and
we&#8217;re anxious for him to put his self-motivatied work ethic and
entrepreneurial skills to use for us and our clients.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Matt Blackwell Joins Brightbit]]></title>
    <link href="http://brightb.itblog/2012/09/18/matt-blackwell-joins-brightbit/"/>
    <updated>2012-09-18T14:10:00-05:00</updated>
    <id>http://brightb.itblog/2012/09/18/matt-blackwell-joins-brightbit</id>
    <content type="html"><![CDATA[<p>We would like to welcome Matt Blackwell to the Brightbit team as our new
Sales and Business Operations Manager. Matt comes to us with over 3
years of experience in Sales, Project Management, and Business
Operations as the COO at his previous employer.</p>

<p>Matt&#8217;s focus will be helping us grow as a full-service web and mobile
development studio by handling all the sales and day-to-day business
operations work, allowing us to focus more on creating awesome things
for our customers. We look forward to a great 2013 with Matt on board
(assuming the apocalypse doesn&#8217;t come).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testing Custom Validations in Ruby on Rails with RSpec]]></title>
    <link href="http://brightb.itblog/2012/06/25/testing-custom-activerecord-validations-in-ruby-on-rails-with-rspec/"/>
    <updated>2012-06-25T10:57:00-05:00</updated>
    <id>http://brightb.itblog/2012/06/25/testing-custom-activerecord-validations-in-ruby-on-rails-with-rspec</id>
    <content type="html"><![CDATA[<p>Often on a project, you will have some custom business logic that
requires custom validations to be created. Rails has a great built-in
way to create custom validations with ease, but doesn&#8217;t fully
document how to test the custom validators that you add so you can
ensure they are working properly. We recently did this on a client
project, and outlined the steps we took to do it.</p>

<p>This post will cover how to add a custom validation, how to translate
error message strings (including translating custom error message
strings), and how to test for the existence of your custom validation
error message with RSpec.</p>

<h2>Add Your Custom Validator</h2>

<p>This is the easy part. Add your custom validator like normal to the
model you want to put it on using the <code>validate</code> method.</p>

<figure class='code'><figcaption><span>models/booking.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Booking</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:listing</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validates_date</span> <span class="ss">:check_in</span><span class="p">,</span> <span class="n">before</span><span class="p">:</span> <span class="ss">:check_out</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:listing_available?</span><span class="p">,</span> <span class="k">if</span><span class="p">:</span> <span class="ss">:listing</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">listing_available?</span>
</span><span class='line'>    <span class="c1"># Our actual logic in this case is on the related listing model</span>
</span><span class='line'>    <span class="k">if</span> <span class="o">!</span><span class="n">listing</span><span class="o">.</span><span class="n">available?</span><span class="p">(</span><span class="n">check_in</span><span class="o">.</span><span class="n">.check_out</span><span class="p">)</span>
</span><span class='line'>      <span class="c1"># Add to :base when no specific single :field is applicable</span>
</span><span class='line'>      <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:base</span><span class="p">,</span> <span class="ss">:not_available</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note we are using the symbol <code>:not_available</code> instead of an actual error
message string. This is because the text of this error message will be
in the Rails locale file instead of hard-coded in the model. We are also
using the excellent
<a href="https://github.com/adzap/validates_timeliness">validates_timeliness</a>
gem to get the <code>validates_date</code> method.</p>

<h2>Add your Validation Message to the Locale File</h2>

<p>Your custom validation should be added to the locale file so that it can
be translated and is more resilient to wording changes (i.e. updating
the wording of the error message won&#8217;t break your tests). If you&#8217;re
just getting started with locales, this is located in
<code>config/locales/en.yml</code> by default (or you can create a new one for
your target language in the same location like <code>de.yml</code>).</p>

<p>Full locale example with YAML indentation for both errors above:</p>

<figure class='code'><figcaption><span>config/locales/en.yml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">en</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">activerecord</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">errors</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">models</span><span class="p-Indicator">:</span>
</span><span class='line'>        <span class="l-Scalar-Plain">booking</span><span class="p-Indicator">:</span>
</span><span class='line'>          <span class="l-Scalar-Plain">attributes</span><span class="p-Indicator">:</span>
</span><span class='line'>            <span class="l-Scalar-Plain">base</span><span class="p-Indicator">:</span>
</span><span class='line'>              <span class="l-Scalar-Plain">not_available</span><span class="p-Indicator">:</span>  <span class="s">&#39;Listing</span><span class="nv"> </span><span class="s">is</span><span class="nv"> </span><span class="s">not</span><span class="nv"> </span><span class="s">available</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">specified</span><span class="nv"> </span><span class="s">date</span><span class="nv"> </span><span class="s">range&#39;</span>
</span><span class='line'>            <span class="l-Scalar-Plain">check_in</span><span class="p-Indicator">:</span>
</span><span class='line'>              <span class="l-Scalar-Plain">before</span><span class="p-Indicator">:</span> <span class="s">&#39;must</span><span class="nv"> </span><span class="s">be</span><span class="nv"> </span><span class="s">before</span><span class="nv"> </span><span class="s">check</span><span class="nv"> </span><span class="s">out&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Accessing the Translation Strings in Your App</h2>

<p>To access the translation strings in your app and in your tests, use the
translate library provided by Rails: <code>I18n.t</code> (see the <a href="http://guides.rubyonrails.org/i18n.html">Rails
Guide</a> for more info).</p>

<p>Expected locale error format:<br/>
<code>activerecord.errors.models.&lt;MODEL&gt;.attributes.&lt;FIELD_OR_BASE&gt;.&lt;ERROR_KEY&gt;</code></p>

<p>Take note of the model name, field name, and key name where you are
adding your custom validators, because you will need all of them when
accessing your error message string for testing.</p>

<h3>Examples</h3>

<p>Booking model error on <code>base</code> (validates multiple fields):<br/>
<code>I18n.t('activerecord.errors.models.booking.attributes.base.not_available')</code></p>

<p>Booking model error on <code>check_in</code> (one specific field):<br/>
<code>I18n.t('activerecord.errors.models.booking.attributes.check_in.before')</code></p>

<h2>Ensure the Validation Exists with RSpec</h2>

<p>Now we need to make a test to ensure that our new custom validation is
working properly. We use <a href="https://github.com/rspec/rspec-rails">RSpec</a> for writing &amp; running tests, and
<a href="https://github.com/thoughtbot/factory_girl">FactoryGirl</a> for creating our test objects, which are both available as gems.</p>

<figure class='code'><figcaption><span>spec/models/booking_spec.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="n">describe</span> <span class="s2">&quot;my custom validation&quot;</span>
</span><span class='line'>  <span class="n">it</span> <span class="s2">&quot;will not create a booking that overlaps another accepted booking in date range&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="c1"># We have previously setup a booking in this date range in our test fixtures, so this will error</span>
</span><span class='line'>    <span class="n">booking</span> <span class="o">=</span> <span class="no">FactoryGirl</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="ss">:booking</span><span class="p">)</span>
</span><span class='line'>    <span class="n">booking</span><span class="o">.</span><span class="n">check_in</span>  <span class="o">=</span> <span class="no">Date</span><span class="o">.</span><span class="n">today</span> <span class="o">-</span> <span class="mi">2</span>
</span><span class='line'>    <span class="n">booking</span><span class="o">.</span><span class="n">check_out</span> <span class="o">=</span> <span class="no">Date</span><span class="o">.</span><span class="n">today</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">booking</span><span class="o">.</span><span class="n">valid?</span> <span class="c1"># trigger validation to run (without saving)</span>
</span><span class='line'>    <span class="n">booking</span><span class="o">.</span><span class="n">errors</span><span class="o">[</span><span class="ss">:base</span><span class="o">].</span><span class="n">should</span> <span class="kp">include</span> <span class="no">I18n</span><span class="o">.</span><span class="n">t</span><span class="p">(</span><span class="s1">&#39;activerecord.errors.models.booking.attributes.base.not_available&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Run Your RSpec Tests</h2>

<p>Now we can run the tests to ensure everything is working and that our
validator is doing its job (or not). In practice, you will want to
ensure the test fails by writing it first and verifying a failing test
run result. You then write the code the makes the test pass, and re-run
the tests to ensure it passes.</p>

<p>We use <a href="https://github.com/guard/guard">Guard</a> on all our Rails projects
so that our tests are automatically run after any filesystem changes. It
can be easily integrated into your Rails project by adding it to your
Gemfile. Check out the <a href="http://railscasts.com/episodes/264-guard">Guard
RailsCast</a> by <a href="http://twitter.com/rbates">Ryan Bates</a> if you want to learn
more about how to use Guard with RSpec and Rails.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving Downtown]]></title>
    <link href="http://brightb.itblog/2012/06/08/brightbit-moves-to-a-new-office/"/>
    <updated>2012-06-08T10:29:00-05:00</updated>
    <id>http://brightb.itblog/2012/06/08/brightbit-moves-to-a-new-office</id>
    <content type="html"><![CDATA[<p>Our good friends at the Oklahoma City Coworking Collaborative (<a href="http://okccoco.org">OKCCoCo</a>) are moving to a new location! That means Brightbit was going to be without a home while they secure a new space, and at the last minute we were invited to set up our new office at The Exhange, just a few blocks away in the Arts District in downtown Oklahoma City.</p>

<p>The new office is in the beautiful historic Film Exchange building on Film Row, one of the iconic brick buildings downtown. <a href="http://http://venturespur.com/">Venture Spur</a> is one of our neighbors, and their startup accelerator starts up in August so we look forward to being around the excitement.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SportsVault launches]]></title>
    <link href="http://brightb.itblog/2012/01/30/sportsvault-launches/"/>
    <updated>2012-01-30T00:00:00-06:00</updated>
    <id>http://brightb.itblog/2012/01/30/sportsvault-launches</id>
    <content type="html"><![CDATA[<p>Fantasy Sports just got a lot less painful. Fourward Labs teamed up with Brightbit to launch <a href="http://sportsvault.net">SportsVault</a>, a league payment and communication app.</p>

<p>About 10% of fantasy leagues don&#8217;t get paid out at the end of the season due to bad communication and questionable commissioners. SportsVault aims to help make sure that fantasy sports leagues stay active and team owners feel secure.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing Kikuchat]]></title>
    <link href="http://brightb.itblog/2011/10/06/introducing-kikuchat/"/>
    <updated>2011-10-06T16:34:00-05:00</updated>
    <id>http://brightb.itblog/2011/10/06/introducing-kikuchat</id>
    <content type="html"><![CDATA[<p>We are proud to announce that <a href="http://kikuchat.com">Kikuchat</a> is now available for purchase. It is a self-hosted team chat application that is installable on your own servers. It is positioned as an alternative to hosted chat services like Campfire and Hipchat, which have ongoing monthly fees. So if you are looking for a great way to collaborate with your team or staff and want an application you can host and control yourself, Kikuchat is for you.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Brightbit Office]]></title>
    <link href="http://brightb.itblog/2011/09/01/brightbit-office/"/>
    <updated>2011-09-01T16:34:00-05:00</updated>
    <id>http://brightb.itblog/2011/09/01/brightbit-office</id>
    <content type="html"><![CDATA[<p><a href="http://brightb.it">Brightbit</a> has been a company since 2010 for all of us (Vance, Eric, and Joshua) to work on our own projects together (like <a href="http://kikuchat.com">Kikuchat</a> and <a href="http://keynot.es">Keynot.es</a>), but now that half of 2011 has elapsed, we have made the leap and are now officially all fulltime self-employed partners in Brightbit. We are taking client work doing web sites, web applications, mobile applications, REST APIs, and basically anything interactive that has to do with the internet.</p>

<p>I’m not sure what it is about getting an office, but it makes thing seem more real to actually have a dedicated place of doing business. It somehow legitimizes your business for both you and your customers. Keeping expenses low is a concern, but it’s important to start things off in the right frame of mind. Fortunately, we were able to keep both concerns in check by getting a private office at the <a href="http://okccoco.com">OKC Coworking Collaborative</a> - a local tech-focused co-working space with good rates and great company. We pay a single monthly rate that covers the office, internet, electricity, and even coffee. It’s a great place to start a business that doesn’t require applications or approval like incubators. Come check us out if you’re in the area. We have a flexible schedule and we work from home sometimes, but there’s always at least one of us in the office on Tuesdays and Thursdays.</p>

<p>Brightbit
723 North Hudson Ave
Oklahoma City, OK 73102</p>

<p><a href="mailto:hello@brightb.it">hello@brightb.it</a></p>

<p>Here&#8217;s to a long and successful future for Brightbit.</p>
]]></content>
  </entry>
  
</feed>
