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

    <title type="text">Updrift</title>
    <subtitle type="text">Updrift:</subtitle>
    <link rel="alternate" type="text/html" href="http://www.updrift.com/site/index/" />
    <link rel="self" type="application/atom+xml" href="http://www.updrift.com/site/atom" />
    <updated>2018-03-30T17:31:43Z</updated>
    <rights>Copyright (c) 2018, Wade Winningham</rights>
    <generator uri="http://expressionengine.com/" version="5.3.2">ExpressionEngine</generator>
    <id>tag:updrift.com,2018:03:30</id>

    <entry>
      <title>Our Journey from Rails v1 to v5</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/our_journey_from_rails_v1_to_v5" />
      <id>tag:updrift.com,2018:site/index/1.57</id>
      <published>2018-03-30T17:30:00Z</published>
      <updated>2018-03-30T17:31:43Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>New post up over at my personal blog: <a href="http://www.wadewinningham.com/2018/03/30/our-journey-from-rails-v1-to-v5/">http://www.wadewinningham.com/2018/03/30/our-journey-from-rails-v1-to-v5/</a></p> 
      ]]></content>
    </entry>    <entry>
      <title>Exciting work at a Boring&#45;Sounding Place</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/exciting_work_at_a_boring_sounding_place" />
      <id>tag:updrift.com,2018:site/index/1.56</id>
      <published>2018-02-28T16:48:00Z</published>
      <updated>2018-02-28T16:49:21Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>New post up over at my personal blog: <a href="http://www.wadewinningham.com/2018/02/28/exciting-work-at-a-boring-sounding-place/">http://www.wadewinningham.com/2018/02/28/exciting-work-at-a-boring-sounding-place/</a></p> 
      ]]></content>
    </entry>    <entry>
      <title>Together, we create</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/together_we_create" />
      <id>tag:updrift.com,2018:site/index/1.55</id>
      <published>2018-02-07T17:57:00Z</published>
      <updated>2018-02-07T17:59:40Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>I&#8217;m going to be writing more posts over at <a href="http://www.wadewinningham.com">http://www.wadewinningham.com</a>.</p>

<p> First up is <a href="http://www.wadewinningham.com/2018/01/16/together-we-create/">http://www.wadewinningham.com/2018/01/16/together-we-create/</a></p>

<p>While I&#8217;ll do some quick posts here to direct people I&#8217;ll eventually just have this site likely redirect over there at some point.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Power Home Remodeling Group in Fortune Magazine</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/power_home_remodeling_group_in_fortune_magazine" />
      <id>tag:updrift.com,2015:site/index/1.54</id>
      <published>2015-06-23T14:02:00Z</published>
      <updated>2015-06-23T14:52:20Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>Since the end of 2007, I&#8217;ve done most of my work for <a href="https://www.powerhrg.com" target="_blank">Power Home Remodeling Group</a>. Creating the application that runs just about their entire business, <i>Nitro</i>.</p>

<p> Fortune Magazine just named them the #1 <a href="http://fortune.com/2015/06/23/power-home-remodeling-millennials/" target="_blank">Best Workplace for Millennials</a>.</p>

<p> Our core development team is just a few people. We want more. If you want to be challenged. Are a UX/UI person, Ruby on Rails developer, Front-End developer, even interested in technical support, let me know.</p>

<p> <a href="http://fortune.com/2015/06/23/power-home-remodeling-millennias/">http://fortune.com/2015/06/23/power-home-remodeling-millennias/</a></p> 
      ]]></content>
    </entry>    <entry>
      <title>RethinkDB is production ready</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/rethinkdb_is_production_ready" />
      <id>tag:updrift.com,2015:site/index/1.53</id>
      <published>2015-04-15T13:38:00Z</published>
      <updated>2015-04-15T14:36:59Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="News"
        scheme="http://www.updrift.com/site/C2"
        label="News" />
      <content type="html"><![CDATA[
        <p>​I’ve been following the development of <a href="http://rethinkdb.com/" target="_blank">RethinkDB</a> since I first heard about it a few years ago. My excitement over it has only grown over time.</p>

<p>  RethinkDB is an open source database that fits somewhere between a relational database like MySQL or PostgreSQL and newer schema-less databases like MongoDB. However, it’s got a few things I don’t think any other database has.</p>

<h2>RethinkDB pushes results to your app in real time</h2>

<p>  Typically, you’d need a separate Publish-Subscribe system in place to do this.</p>

<p>  With RethinkDB, you can start a query and request to get changes. Your app will automatically receive any changed data related to your query after that.</p>

<p>  If you want something that’s closer to current Publish-Subscribe methods, RethinkDB has you covered there, too, with their <i>repubsub</i> library.</p>

<h2>It’s insanely easy to cluster</h2>

<p>  This is right from their docs.</p>

<blockquote><p>First, start RethinkDB on the first machine:</p>

</blockquote>

<pre>$ rethinkdb --bind all</pre>

<blockquote><p>Then start RethinkDB on the second machine:</p>

</blockquote>

<pre>$ rethinkdb --join IP_OF_FIRST_MACHINE:29015 --bind all</pre>

<blockquote><p>You now have a RethinkDB cluster!</p>

</blockquote>

<p>  That’s it.</p>

<h2>RethinkDB’s web-based console is beautiful</h2>

<p>  RethinkDB comes with web-based console that most IT departments will want to display on the wall.</p>

<figure style="text-align: center;"><img alt="" src="http://www.updrift.com/images/uploads/webui.png"></figure>

<figure style="text-align: center;"><figure style="text-align: center;"><img alt="" src="http://www.updrift.com/images/uploads/shard.png"></figure>

<figure style="text-align: center;"><img alt="" src="http://www.updrift.com/images/uploads/failover2.png"></figure>

<p> </p>
</figure>

<p> <a href="http://rethinkdb.com/blog/2.0-release/" target="_blank">Read the official announcement at Rethink’s blog.</a></p> 
      ]]></content>
    </entry>    <entry>
      <title>Ben Klang to speak at RailsConf 2015 on WebRTC</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/ben_klang_to_speak_at_railsconf_2015_on_webrtc" />
      <id>tag:updrift.com,2015:site/index/1.52</id>
      <published>2015-04-13T14:06:00Z</published>
      <updated>2015-04-13T14:16:48Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>I&#8217;ve spent a lot of this year talking about Adhearsion and, at a functional level, how Power Home Remodeling Group integrates it into their workflow.</p>

<p>MojoLingo is our partner in regards to all things Adhearsion. And part of that is creating a custom chat client that does things no other chat client can do. And that&#8217;s offer things specific to our business that wouldn&#8217;t apply to just anyone. It&#8217;s about context.</p>

<p>RailsConf 2015 is in Atlanta, GA. Ben Klang, from MojoLingo, will be presenting about <a href="https://mojolingo.com/event/rails-real-time/" target="_blank">using WebRTC to put real-time voice, video and text into your Rails application</a>.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Adhearsion: Call Recordings</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/adhearsion_call_recordings" />
      <id>tag:updrift.com,2015:site/index/1.51</id>
      <published>2015-03-06T11:33:00Z</published>
      <updated>2015-03-06T11:34:47Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Telephony"
        scheme="http://www.updrift.com/site/C13"
        label="Telephony" />
      <content type="html"><![CDATA[
        <p><a href="http://www.updrift.com/article/our_adhearsion_environment">Previously, I mentioned</a> that Power Home Remodeling Group makes around 48,000 calls per day. While a lot of those are no answers or answering machines we still make contact with a lot of people every day.</p>

<p> We record those calls.</p>

<p> If we don’t reach someone, we simply record whether or not we left a message on their machine, or if it was truly a no-answer.</p>

<p> When we do reach someone and talk to them, Adhearsion records it. We do inform the person that we are recoding the call.</p>

<p> When a call hangs up, our Talkbox Adhearsion application sends an API call to our main Nitro application. The path of the audio recording and the home it’s linked to are included so Nitro can put them together into that home’s overall communication history.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Adhearsion: Confirming Appointments</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/adhearsion_confirming_appointments" />
      <id>tag:updrift.com,2015:site/index/1.50</id>
      <published>2015-02-11T20:05:00Z</published>
      <updated>2015-02-11T20:06:25Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <category term="Telephony"
        scheme="http://www.updrift.com/site/C13"
        label="Telephony" />
      <content type="html"><![CDATA[
        <p>At <a href="https://www.powerhrg.com">PowerHRG</a>, appointments initially made with a live person. This could be at an event, some retailer where we have an area set up, or an employee who knocks on doors.</p>

<p> An appointment will get scheduled for a remodeling consultant to visit the homeowner. At the same time, we’ll also get any written permission we need in order to contact the homeowner. A confirmation email is sent as an appointment reminder.</p>

<p> Remember, it’s not legal to call a cell phone without prior written consent. Since many people only have cell phones, we wouldn’t be able to call them otherwise.</p>

<p> You can review more <a href="http://www.updrift.com/article/about_automating_outgoing_phone_calls">about the rules for automating phone calls</a> in my previous post.</p>

<h2>Why we confirm all appointments</h2>

<p> Life happens. We prefer to find out if the homeowner can’t make the appointment before we send somone out to see them.</p>

<p> In our experience, calling to confirm as close to the appointment time as we can is the most accurate way to ensure the appointment can be met.</p>

<h2>Automating the call</h2>

<p> Talkbox, our Adhearsion server, is constantly looking for upcoming appointments during business hours.</p>

<p> When it detects any <b>unconfirmed</b> appointments coming up within the next few hours, it will make sure we have agents signed in to take calls and then initiate calls to those homeowners.</p>

<p> Confirmation agents are signed in and waiting in a their own private audio conference room setup by Talkbox. This way the agent is instantly ready to talk. Otherwise, we waste time with Talkbox attempting to negotiate the call.</p>

<p> When the homeowner answers the phone, Talkbox bridges the call with an available agent’s conference room. The homeowner’s name and number appears on the agent’s desk phone. The agent can see instantly who they are talking with.</p>

<p> At the same time as the call is connected, Talkbox sends a message to Nitro to refresh the agent’s application window with the homeowner’s appointment info. This could take a few seconds so the desk phone display is useful because it’s quicker and offers confirmation that the information on the screen is the for the correct homeowner.</p>

<h2>What happens when we can’t reach the homeowner</h2>

<p> We obviously can’t reach the homeowner directly one hundred percent of the time.</p><ul>
    <li><b>No answer:</b> If the call isn’t answered at all, Talkbox will re-queue the appointment to call back in another twenty minutes before calling them back. We do this until about thirty minutes past the originally scheduled appointment time.</li>
    <li><b>Voicemail:</b> Talkbox will leave an automated message asking the homeowner to call someone back to confirm their appointment. Alternate numbers will be called as with a no answer.</li>
</ul>

<p> If we simply can’t reach the homeowner at all to confirm the appointment, we schedule a call for the next day to reschedule for another time.</p>

<h2>How does Talkbox know it reached a person or a machine?</h2>

<p> There are a few behaviors that can be key in an application detecting whether a live person or an answering machine is answering a call. Nothing is one hundred percent accurate.</p><ul>
    <li>People typically answer the phone by saying something right away. So if there’s a delay in hearing any audio at all there’s a good chance it’s an answering machine.</li>
    <li>Most people answer the phone by saying “Hello”. Answering machines tend to respond with a sentence or two at least. So the length of the initial greeting is another indicator.</li>
</ul>

<p> <a href="http://www.adhearsion.com">Adhearsion</a> has answering machine detection with configurable settings to adjust for the specific needs of a business.</p> 
      ]]></content>
    </entry>    <entry>
      <title>About Automating Outgoing Phone Calls</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/about_automating_outgoing_phone_calls" />
      <id>tag:updrift.com,2015:site/index/1.49</id>
      <published>2015-01-28T15:42:00Z</published>
      <updated>2015-01-28T15:44:44Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <category term="Telephony"
        scheme="http://www.updrift.com/site/C13"
        label="Telephony" />
      <content type="html"><![CDATA[
        <p>You can’t just load up a bunch of phone numbers into a database and start calling them. There are laws. Don’t break them.</p>

<p>  Our automated outbound calls fall into three categories which I’ll cover in follow up posts. For now, I wanted to touch on some information anyone should know about before hooking up an application to make phone calls. Particularly when it comes to telemarketing and autodialed calls.</p>

<h2>Federal Regulations</h2>

<p>  Back in 1991, the Telephone Consumer Protection Act was passed. It restricts phone solicitations and the use of automated dialing. It covers SMS messaging and faxing in addition to normal voice calls.</p>

<p>  Here are some of the primary restrictions. <a href="http://en.wikipedia.org/wiki/Telephone_Consumer_Protection_Act_of_1991">There are more</a>, so don’t take this as a complete list.</p><ul>
    <li>Don’t call anyone before 8am or after 9pm. If you do business across time zones, you need to deal with that.</li>
    <li>You need to maintain you’re own <i>do not call</i> list. If someone asks to be put on it, add their number. You have to honor it for at least five years.</li>
    <li>Honor the <a href="https://www.donotcall.gov">National Do Not Call Registry</a>. <i>See section below</i></li>
    <li>Tell people who you are and your phone number or address.</li>
    <li>Don’t call emergency lines or anyone who’d be charged for your phone call.</li>
    <li>Don’t call cell phones without prior written consent. <i>That’s right, you’re not allowed to make unsolicited calls to cell phones. Period.</i></li>
    <li>As I said above, there are a <b>lot</b> of other rules.</li>
</ul>

<p>  If you break any of the above rules, you can get taken to court.</p>

<h2>National Do Not Call Registry</h2>

<p>  The <a href="https://www.donotcall.gov">Do Not Call Registry</a> allows anyone to register their phone number. Telemarketers are never supposed to call any registered number unless the person has given you permission.</p>

<p>  You can register to access this database, either via an API or as a downloadable list at the <a href="https://telemarketing.donotcall.gov">Do Not Call Registry Telemarketer site</a>.</p>

<h2>Common Courtesy</h2>

<p>  Not all calls are unsolicited calls. You may just being trying to confirm a scheduled appointment. Regardless, you want to be courteous to the people you call.</p><ul>
    <li>Don’t make excessive calls.</li>
    <li>If you get voicemail, and leave a message, give the person some time to respond. Don’t call back every five minutes until you reach someone.</li>
    <li>If you talk to someone who requests a call back in three months, you should respect their request. Leave them alone for those three months.</li>
</ul>

<h2>More information</h2>

<h4>What is a Robocall?</h4>

<p>  Robocalls include automated phone calls made using <i>autodialers</i>. This includes calls that only contain pre-recorded messages and those where you speak to a live person.</p>

<h4>What is an Autodialer?</h4>

<p>  Any type of equipment or computer software that dials phone numbers without human intervention.</p>

<h4>How can you determine if a phone number is a landline or a cell phone?</h4>

<p>  A variety of sources exist to assist businesses and telemarketers to tell if a number is a mobile number. For example, <a href="http://en.wikipedia.org/wiki/Neustar"><b>NeuStar</b></a>, as the North American Numbering Plan Administrator, the National Pooling Administrator, and the LNP Administrator, makes information available for the purpose of identifying phone numbers assigned to wireless carriers.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Adhearsion: Click to Call</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/adhearsion_click_to_call" />
      <id>tag:updrift.com,2015:site/index/1.48</id>
      <published>2015-01-13T21:23:00Z</published>
      <updated>2015-01-13T21:26:14Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <category term="Telephony"
        scheme="http://www.updrift.com/site/C13"
        label="Telephony" />
      <content type="html"><![CDATA[
        <p>One of the most basic things you can do when you tie an application in with your phone system is implement click-to-call. You click a phone number on your web page, or within your application. It connects you to that phone number.</p>

<h2>What the user experiences</h2>

<p>  From the user’s perspective within our application it goes down like this:</p><ol>
    <li>Click a phone number link in the web page.</li>
    <li>In a few seconds your phone extension will ring.</li>
    <li>You pick it up and you’ll hear your phone number being dialed.</li>
</ol>

<p>  From that point on it’s just a normal phone conversation. You just didn’t have to dial the phone yourself.</p>

<h2>What happens behind-the-scenes</h2>

<p>  You’re logged in, so the application (Nitro for us) knows who you are and you’re phone extension. This is what happens from the application’s point of view:</p><ol>
    <li>It shoots an API call with the user info and phone number to our Talkbox (i.e. Adhearsion) server.</li>
    <li>The phone call is initated with Asterisk.</li>
    <li>The user’s phone extension is rung.</li>
    <li>As soon as the user picks it up, the outgoing phone call is initated.</li>
</ol>

<p>  That’s about it. All this assumes is that we have the user’s extension number stored properly in the database. This obviously isn’t much of a benefit if you’re away from your desk. It does alleviate issues with mis-dialed numbers and makes it a little less of a hassle for dialing when it’s an option.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Our Adhearsion Environment</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/our_adhearsion_environment" />
      <id>tag:updrift.com,2015:site/index/1.47</id>
      <published>2015-01-07T16:08:00Z</published>
      <updated>2015-01-07T16:09:42Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <category term="Telephony"
        scheme="http://www.updrift.com/site/C13"
        label="Telephony" />
      <content type="html"><![CDATA[
        <p>I mentioned in my <a href="http://www.updrift.com/article/happy_new_year_2015">last post</a> that I’ve been working mostly for <a href="https://www.powerhrg.com">Power Home Remodeling Group</a> for a while. Primarily on the app that runs their business. We call it <i>Nitro</i>.</p>

<p> Initially, I plan to focus on our integration with <a href="http://www.adhearsion.com">Adhearsion</a>. I’ll keep things to a functional level rather than getting too in-depth technically.</p>

<p> If you’d like more technical details about a topic leave a comment. I can get into specifics if there’s enough interest. The simple reason is that it takes longer to write a post with code examples. I think there’s sufficient value in describing what’s possible at a business level.</p>

<h2>Environment</h2>

<p> Our production environment lives on a number of virtual servers hosted in our corporate hosting center. Our current setup includes five web servers, five transaction servers and a single server which runs <a href="http://www.asterisk.org">Asterisk</a> and Adhearsion.</p>

<p> The transaction servers run cron jobs, background processes and our <i>call loop</i> which feeds our phone system with numbers to be called. More on that in a future post.</p>

<p> On our Asterisk/Adhearsion server we also have a separate application running on it we call <i>Talkbox</i>. This is a custom Adhearsion app with PowerHRG’s business logic. It runs as a service and communicates back and forth with our main Nitro application via API calls.</p>

<h2>So what does Power Home Remodeling Group do?</h2>

<p> PowerHRG sells windows, siding, doors, roofing and a few other products. We make a lot of phone calls to do that.</p>

<p> The majority are appointment confirmations and marketing calls. Around 48,000 outgoing calls every day. Yes. All with a single Asterisk/Adhearsion server.</p>

<h2>Adhearsion</h2>

<p> Adhearsion is described as an</p>

<blockquote><p> open-source voice application development framework.</p>

</blockquote>

<p> It actually does a bit more. We’ve tied it into our LDAP server so our phone systems and applications use the same info and security. Adhearsion can even integrate over XMPP (Jabber) to support stuff like instant messaging.</p>

<p> In my next post, I’ll start talking about some of our specific uses of Adhearsion. Stay tuned.</p> 
      ]]></content>
    </entry>    <entry>
      <title>Happy New Year 2015</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/happy_new_year_2015" />
      <id>tag:updrift.com,2015:site/index/1.46</id>
      <published>2015-01-01T17:06:00Z</published>
      <updated>2015-01-01T18:17:57Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>Now that 2015 is here I’m feeling more and more like a bad parent to my site. My new resolution is to change that.</p>

<p>  Actually, my full resolution is to get into a daily practice of writing. Writing creatively was something I really loved doing at one point and I want to start that again. While writing somewhat technical blog posts for this site isn’t out of my imagination, writing is writing. So I plan to mix it up.</p>

<h2>A long time ago…</h2>

<p>  Where did this come from? I’ve always loved reading. I’ve always loved comic books and would go to local conventions. One artist who worked for a company called Comico in the late 80’s frequented those local conventions. His name was <a href="http://www.comicvine.com/reggie-byers/4040-58819/" target="_blank">Reggie Byers</a>. For Comico, he was doing the art for some of their line of Macross comics. He started his own company and comic around a character named <i>Shuriken</i>.</p>

<p>  For the hell of it, I ended up writing scripts for a three issue story arc for <i>Shuriken</i> and just sent it to him. He liked it and wanted me to write more. In fact, Reggie was starting up a second series entitled <a href="http://www.comicvine.com/blade-of-shuriken/4050-29481/" target="_blank">The Blade of Shuriken</a> and he wanted me to the be writer. Images are hard to find, but <a href="http://www.comicartfans.com/gallerypiece.asp?piece=148799" target="_blank">here’s one</a> that has my name in the credits!</p>

<p>  Unfortunately, the series was short lived. One of the victims of an economic bubble bursting within the comics industry. I ended up writing about twelve scripts. Only four were published (<i>Blade of Shuriken #2-#5</i>). Regardless, I had a lot of fun writing them. I thank Reggie for giving me the opportunity. It was a very exciting experience for me.</p>

<h2>This year for this site…</h2>

<p>  Getting back to this technical site, I still am primarily a Ruby on Rails coder. A couple of side projects with PHP, but primarily Ruby.</p>

<p>  Back in 2007, I started working with a company in the northeast, <a href="https://www.powerhrg.com/" target="_blank">Power Home Remodeling Group</a>. At the time, they ran their business off a mixture of Excel spreadsheets and a Microsoft Access-based application that would have problems if more than one person was in it at the same time. I’m involved in writing the software that has taken them from that system, already having growing pains, to what is now a web-based application servicing over 1,300 employees company-wide. While I started alone, we’ve grown a small team of developers, but it’s still hard to keep up with the demand for what they want and need.</p>

<p>  PowerHRG doesn’t sound like an exciting company since they sell windows, roofing, siding and a couple of other products. But the complexity of the business and the technology required to support it can be quite interesting. I’m going to write about some of that over this year.</p>

<p>  What I’ll be focusing on in my first series of articles will be on something I don’t recall reading a lot of blog posts about in the recent past: <b>telephony</b>. Power’s app has strong ties to their phone system. The interface for this is <a href="http://www.adhearsion.com/" target="_blank">Adhearsion</a>. We are lucky enough to work closely together with the awesome team at <a href="http://mojolingo.com/" target="_blank">Mojolingo</a>, who are the current maintainers of the Adhearsion codebase.</p>

<p>  Stay tuned…</p> 
      ]]></content>
    </entry>    <entry>
      <title>What I&#8217;ve been working on</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/what_ive_been_working_on" />
      <id>tag:updrift.com,2012:site/index/1.41</id>
      <published>2012-04-05T03:37:55Z</published>
      <updated>2012-04-15T16:42:57Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Blogging"
        scheme="http://www.updrift.com/site/C1"
        label="Blogging" />
      <content type="html"><![CDATA[
        <p>For the past few years I&#8217;ve been working with <a href="http://poetpainter.com">Stephen P. Anderson</a> on a few things.</p>

<p>The <a href="http://getmentalnotes.com">Mental Notes</a> card deck is a brainstorming tool. &ldquo;Each card describes one insight into human behavior and suggests ways to apply this to the design of Web sites, Web apps, and software applications.&rdquo;</p>

<p>In addition to those, we&#8217;ve launched a few sites for a client.</p>

<p><a href="http://www.afterthemeeting.com">After The Meeting</a> is a site that helps you focus on what typically happens not <i>during</i> a meeting, but <i>after</i>. It helps attendees keep track of what action items they were assigned and pokes you at times to get them done if you&#8217;re running late. It&#8217;s particularly helpful to project managers who can, at a glance, get status updates. And after a few weeks, you get a report card report telling you how successful everyone&#8217;s been on what they committed to.</p>

<p>Part of <i>After the Meeting</i> is a way to make a formal agreement with someone. This is a bit stronger than a simple to-do item as there are stakes for the success or failure of the task.</p>

<p><a href="http://www.promiseplay.com">Promise Play</a> takes those formal agreements out of meetings so it&#8217;s just you and one of your Facebook friends. We&#8217;re still polishing it up, but it&#8217;s free to use.</p>

<p>Other than that, I&#8217;m slowly working on a redesign of this site and looking forward to a project that&#8217;s been on the back-burner for a little while.</p> 
      ]]></content>
    </entry>    <entry>
      <title>A Journey through Time, Date, DateTime and TimeWithZone</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/a_journey_through_time_date_datetime_and_timewithzone" />
      <id>tag:updrift.com,2012:site/index/1.40</id>
      <published>2012-04-05T03:35:22Z</published>
      <updated>2012-04-15T16:43:23Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Ruby On Rails"
        scheme="http://www.updrift.com/site/C5"
        label="Ruby On Rails" />
      <content type="html"><![CDATA[
        <p>Haven&#8217;t posted here in forever. Regardless, I&#8217;ve been keeping very busy. Last night I gave a presentation that walks through the various Date/Time classes in Ruby along with what ActiveSupport in Rails adds to them.</p>

<p>
<a href="http://speakerdeck.com/u/wadewinningham/p/a-journey-through-time-date-datetime-and-timewithzone">See the slides on SpeakerDesk</a>
</p> 
      ]]></content>
    </entry>    <entry>
      <title>Deploying a Rails app with Thinking Sphinx</title>
      <link rel="alternate" type="text/html" href="http://www.updrift.com/site/deploying_a_rails_app_with_thinking_sphinx" />
      <id>tag:updrift.com,2008:site/index/1.37</id>
      <published>2008-05-07T16:04:01Z</published>
      <updated>2008-05-07T12:19:14Z</updated>
      <author>
            <name>Wade Winningham</name>
            <email>wade@updrift.com</email>
            
      </author>

      <category term="Miscellaneous"
        scheme="http://www.updrift.com/site/C4"
        label="Miscellaneous" />
      <content type="html"><![CDATA[
        <p>
If you&#8217;re using or investigated full-text search options you&#8217;ve likely come across some really great comments about <a href="http://www.sphinxsearch.com" title="Sphinx">Sphinx</a>. It&#8217;s fast and has a lot of great features.
</p>
<p>
For a Rails application, there are a few plugins which make it easy to use Sphinx. The main two at this time are <a href="http://blog.evanweaver.com/files/doc/fauna/ultrasphinx/files/README.html" title="UltraSphinx">UltraSphinx</a> and <a href="http://ts.freelancing-gods.com" title="Thinking Sphinx">Thinking Sphinx</a>. I chose Thinking Sphinx for my project mostly because it can keep the Sphinx indexes current in close to real-time as things are added to the database using delta indexes. UltraSphinx can use delta indexes, but doesn&#8217;t seem to be as real-time at updating them as ThinkingSphinx. If I&#8217;m wrong, please correct me.
</p>
<p>
Now that I&#8217;m using Thinking Sphinx I eventually had to deploy it. Since I didn&#8217;t find much info about deploying it using &#8220;Capistrano&#8221;:http://capify.org here&#8217;s what I did to get deployments running smoothly.
</p>
<h2>Sphinx Index Location</h2>
<p>
While Sphinx is fast, you still probably don&#8217;t want to have to re-create your indexes on every deployment. I have my indexes getting created into my shared path and an <code>:after_symlink</code> task deals with making sure my app is pointing to the right place.
</p>
<pre>
  desc "Re-establish symlinks"
  task :after_symlink do
    run <<-CMD
      rm -fr #{release_path}/db/sphinx &amp;&amp;
      ln -nfs #{shared_path}/db/sphinx #{release_path}/db/sphinx
    CMD
  end
</pre>

<h2>Stopping and Starting Sphinx</h2>
<p>
Thinking Sphinx follows convention rather than configuration. Before any index Thinking Sphinx re-creates your configuration file based on the information in your models. Since it re-creates it, I have it ignored in my repository. As such, the configuration file does not exist on a fresh deploy.
</p>
<p>I created some tasks to stop, start and restart Sphinx using the rake commands that come with Thinking Sphinx. One problem I ran into right away was the absence of the config/production.sphinx.conf file that&#8217;s expected when you run the <code>thinking_sphinx:start</code> task. Luckily, there&#8217;s another rake task called <code>thinking_sphinx:configure</code> which re-creates the configuration file without performing a full index.
</p>
<p>While there is a <code>thinkning_sphinx:restart</code> task, that doesn&#8217;t give me the opportunity to re-create the config file prior to starting Sphinx up again.
</p>
<pre>
  desc "Stop the sphinx server"
  task :stop_sphinx , :roles => :app do
    run "cd #site/atom &amp;&amp; rake thinking_sphinx:stop RAILS_ENV=production"
  end
    
  desc "Start the sphinx server" 
  task :start_sphinx, :roles => :app do
    run "cd #site/atom &amp;&amp; rake thinking_sphinx:configure RAILS_ENV=production &amp;&amp; rake thinking_sphinx:start RAILS_ENV=production"
  end
  
  desc "Restart the sphinx server"
  task :restart_sphinx, :roles => :app do
    stop_sphinx
    start_sphinx
  end  
</pre>

<h2>Restarting the App</h2>
<p>
Now that the Sphinx tasks are there, you just have to update the applications&#8217;s <code>:restart</code> task to restart Sphinx when you restart your app.
</p>
<pre>
  desc "Restart mongrel"
  task :restart, :roles => :app do
    restart_sphinx
    sudo restart_mongrel
  end
</pre>
<p>
A full version of the example deploy.rb is <a href="http://pastie.caboo.se/193035" title="Pastie of the deploy.rb from this article">pastied</a>.
</p> 
      ]]></content>
    </entry>

</feed>