Our Adhearsion Environment

I mentioned in my last post that I’ve been working mostly for Power Home Remodeling Group for a while. Primarily on the app that runs their business. We call it Nitro. Initially, I plan to focus on our integration with Adhearsion. I’ll keep things to a functional level rather than getting too in-depth technically. 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.


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 Asterisk and Adhearsion. The transaction servers run cron jobs, background processes and our call loop which feeds our phone system with numbers to be called. More on that in a future post. On our Asterisk/Adhearsion server we also have a separate application running on it we call Talkbox. 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.

So what does Power Home Remodeling Group do?

PowerHRG sells windows, siding, doors, roofing and a few other products. We make a lot of phone calls to do that. The majority are appointment confirmations and marketing calls. Around 48,000 outgoing calls every day. Yes. All with a single Asterisk/Adhearsion server.


Adhearsion is described as an
open-source voice application development framework.
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. In my next post, I’ll start talking about some of our specific uses of Adhearsion. Stay tuned.

Happy New Year 2015

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. 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.

A long time ago…

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 Reggie Byers. 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 Shuriken. For the hell of it, I ended up writing scripts for a three issue story arc for Shuriken 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 The Blade of Shuriken and he wanted me to the be writer. Images are hard to find, but here’s one that has my name in the credits! 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 (Blade of Shuriken #2-#5). 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.

This year for this site…

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. Back in 2007, I started working with a company in the northeast, Power Home Remodeling Group. 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. 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. 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: telephony. Power’s app has strong ties to their phone system. The interface for this is Adhearsion. We are lucky enough to work closely together with the awesome team at Mojolingo, who are the current maintainers of the Adhearsion codebase. Stay tuned…

What I’ve been working on

For the past few years I've been working with Stephen P. Anderson on a few things.

The Mental Notes card deck is a brainstorming tool. “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.”

In addition to those, we've launched a few sites for a client.

After The Meeting is a site that helps you focus on what typically happens not during a meeting, but after. It helps attendees keep track of what action items they were assigned and pokes you at times to get them done if you're running late. It'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's been on what they committed to.

Part of After the Meeting 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.

Promise Play takes those formal agreements out of meetings so it's just you and one of your Facebook friends. We're still polishing it up, but it's free to use.

Other than that, I'm slowly working on a redesign of this site and looking forward to a project that's been on the back-burner for a little while.

Deploying a Rails app with Thinking Sphinx

Now that I'm using Thinking Sphinx I eventually had to deploy it. Since I didn't find much info about deploying it using Capistrano here's what I did to get deployments running smoothly.

If you're using or investigated full-text search options you've likely come across some really great comments about Sphinx. It's fast and has a lot of great features.

For a Rails application, there are a few plugins which make it easy to use Sphinx. The main two at this time are UltraSphinx and Thinking Sphinx. 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't seem to be as real-time at updating them as ThinkingSphinx. If I'm wrong, please correct me.

Now that I'm using Thinking Sphinx I eventually had to deploy it. Since I didn't find much info about deploying it using "Capistrano":https://capify.org here's what I did to get deployments running smoothly.

Sphinx Index Location

While Sphinx is fast, you still probably don't want to have to re-create your indexes on every deployment. I have my indexes getting created into my shared path and an :after_symlink task deals with making sure my app is pointing to the right place.

  desc "Re-establish symlinks"
  task :after_symlink do
    run <<-CMD
      rm -fr #{release_path}/db/sphinx &&
      ln -nfs #{shared_path}/db/sphinx #{release_path}/db/sphinx

Stopping and Starting Sphinx

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.

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's expected when you run the thinking_sphinx:start task. Luckily, there's another rake task called thinking_sphinx:configure which re-creates the configuration file without performing a full index.

While there is a thinkning_sphinx:restart task, that doesn't give me the opportunity to re-create the config file prior to starting Sphinx up again.

  desc "Stop the sphinx server"
  task :stop_sphinx , :roles => :app do
    run "cd #P10 && rake thinking_sphinx:stop RAILS_ENV=production"
  desc "Start the sphinx server" 
  task :start_sphinx, :roles => :app do
    run "cd #P10 && rake thinking_sphinx:configure RAILS_ENV=production && rake thinking_sphinx:start RAILS_ENV=production"
  desc "Restart the sphinx server"
  task :restart_sphinx, :roles => :app do

Restarting the App

Now that the Sphinx tasks are there, you just have to update the applications's :restart task to restart Sphinx when you restart your app.

  desc "Restart mongrel"
  task :restart, :roles => :app do
    sudo restart_mongrel

A full version of the example deploy.rb is pastied.

More Articles

Page 3 of 9 »  < 1 2 3 4 5 >  Last ›