<?xml version="1.0"?>
<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title>Copy of Consolidate Adhearsion Blogs</title>
      <description>Pipes Output</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=7d727342ec97cb855c218e5daba3843c</link>
      <atom:link rel="next" href="http://pipes.yahoo.com/pipes/pipe.run?_id=7d727342ec97cb855c218e5daba3843c&amp;_render=rss&amp;page=2"/>
      <pubDate>Sat, 25 May 2013 23:10:37 +0000</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <item>
         <title>Adhearsion Survey Results</title>
         <link>http://mojolingo.com/blog/2013/adhearsion-survey-results/</link>
         <description>&lt;p&gt;A few weeks ago we put together a survey to gather data on how Adhearsion is being used in the wild, and what factors are important to the people and projects using it. This survey closed on Friday 10th May, &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/adhearsion-survey-results/&quot;&gt;view more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/adhearsion-survey-results/&quot;&gt;Adhearsion Survey Results&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com&quot;&gt;Mojo Lingo&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://mojolingo.com/?p=1381</guid>
         <pubDate>Wed, 22 May 2013 20:59:58 +0000</pubDate>
         <content:encoded><![CDATA[<p>A few weeks ago we put together a survey to gather data on how Adhearsion is being used in the wild, and what factors are important to the people and projects using it. <img src="http://mojolingo.com/wp-content/uploads/2013/05/6035506731_fcf1d99c80_o-300x182.jpg" alt="Image Courtesy Mark Hillary http://www.flickr.com/photos/markhillary/" width="300" height="182" class="alignright size-medium wp-image-1423"/> This survey closed on Friday 10th May, and we've got the results for you right here in full (minus identifying information) to browse through. Below please find our high-level takeaways from the survey responses that we are now using to process our next steps in Adhearsion and to consider the content for Adhearsion Conf 2013 (stay tuned):</p>

<ul>
<li>Respondents appear to love Adhearsion – it’s true.  (We have not missed the fact that the only people who knew about the survey may have been Adhearsion fans by definition as subscribers of our dist list…but, still!)</li>
<li>While Asterisk is still the most-used platform, FreeSWITCH shows a lot of growth in a short amount of time, and many people appear to be considering a move from Asterisk to FreeSWITCH</li>
<li>Roughly half of you have moved an application from some other solution (mostly Asterisk dialplan or Perl scripts) to Adhearsion</li>
<li>Dynamic IVR and Dynamic routing are the most popular uses of Adhearsion, compared to their static counterparts</li>
<li>Manual integration testing is still the most common approach, with automated unit testing second in line</li>
<li>A large majority of people have found that Adhearsion has saved them time and/or money compared to alternatives they used or considered</li>
<li>You guys love Ruby, but don't love our documentation. We are still trying to figure out where the gap lies - is it that people are not finding <a rel="nofollow" target="_blank" href="http://adhearsion.com/docs">the long-form documentation</a> that was launched with Adhearsion 2, or <a rel="nofollow" target="_blank" href="http://adhearsion.com/api">our API documentation</a>?  Or is this documentation easy enough to find, but unsatisfactory to you.  In either event, this is a great way to contribute to the project in a non-technical way. Please do feel free to <a rel="nofollow" target="_blank" href="http://github.com/adhearsion/adhearsion/issues">file documentation bug reports</a> or even pull requests</li>
<li>Most of you work in small teams (between 1-3 people) on Adhearsion projects</li>
<li>A lot more of you use JRuby than we had realised - this is awesome</li>
<li>A Web UI is a very popular app component, but native (desktop &amp; mobile) apps are rare</li>
<li>There are still a lot of Asterisk pre-1.8 deployments out there. This is surprising, since <a rel="nofollow" target="_blank" href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+Versions">Asterisk 1.6.2 was EOL'ed more than a year ago</a>. You guys who admitted to still using something prior to 1.8, be wary! There are known security issues and other bugs.  The longer you wait to upgrade, the harder that upgrade will be.  For those of you using Asterisk 1.8, note that 11 is now the current LTS release.  We know from experience that the upgrade is pretty straightforward, especially if you are using Asterisk with Adhearsion exclusively.  You'll also benefit from a bunch of bugs fixed that are still present in 1.8, along with many other improvements (notably ConfBridge!).</li>
</ul>

<p>Over the next few weeks and months we'll be studying this data in more detail to extract any lessons we can, and apply those to our decision-making process with regards to the future of the project. This is an exciting time, and we look forward to where this may lead us, as well as keeping you all in the loop.</p>

<p>Please don't hesitate to continue to send us feedback about Adhearsion whenever you like. You can <a rel="nofollow" target="_blank" href="https://groups.google.com/forum/?fromgroups#!forum/adhearsion">post on the mailing list</a>, <a rel="nofollow" target="_blank" href="http://github.com/adhearsion/adhearsion/issues">file feature requests or bug reports</a> or <a rel="nofollow" target="_blank" href="http://adhearsion.com/get-help">get in touch with Mojo Lingo</a> to discuss how we might help your project further.</p>

<p>Go ahead and take a <a rel="nofollow" target="_blank" href="http://mojolingo.com/wp-content/uploads/2013/05/Adhearsion-Survey-April-2013.pdf">look through the results</a> for yourself. Let us know if you spot anything interesting.</p>
<p>The post <a rel="nofollow" target="_blank" href="http://mojolingo.com/blog/2013/adhearsion-survey-results/">Adhearsion Survey Results</a> appeared first on <a rel="nofollow" target="_blank" href="http://mojolingo.com">Mojo Lingo</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Cloud vs. Premise: How to choose a Voice Application Platform</title>
         <link>http://mojolingo.com/blog/2013/cloud-vs-premise-how-to-choose-a-voice-application-platform/</link>
         <description>&lt;p&gt;Recently, a question was posed on a telephony mailing list: &quot;can anyone recommend a fast time-to-market development platform for voice apps? (Not LAMP + Asterisk)&quot; My answer: It depends a bit on your requirements. Let's take a look at two &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/cloud-vs-premise-how-to-choose-a-voice-application-platform/&quot;&gt;view more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/cloud-vs-premise-how-to-choose-a-voice-application-platform/&quot;&gt;Cloud vs. Premise: How to choose a Voice Application Platform&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com&quot;&gt;Mojo Lingo&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://mojolingo.com/?p=1329</guid>
         <pubDate>Wed, 24 Apr 2013 15:51:56 +0000</pubDate>
         <content:encoded><![CDATA[<p>Recently, a question was posed on a telephony mailing list:</p>

<blockquote>
  <p>"can anyone recommend a fast time-to-market development platform for voice apps? (Not LAMP + Asterisk)"</p>
</blockquote>

<p>My answer: It depends a bit on your requirements.  Let's take a look at two high-level options: Cloud vs. Premise.</p>

<h2>Cloud</h2>

<p>For a pure-cloud system, lets take a look at the likes of <a rel="nofollow" target="_blank" href="http://tropo.com">Tropo</a> or <a rel="nofollow" target="_blank" href="http://twilio.com">Twilio</a>.</p>

<h3>Pros</h3>

<ul>
<li><strong>Nice feature list.</strong>  Especially for Tropo, you have immediate, no-extra-cost Text-to-speech and Speech Recognition, phone numbers in area codes around the world, and support for several programming languages</li>
<li><strong>Simple pricing.</strong>  Last I checked they're both around $0.03/min -- yes, that's expensive relative to wholesale SIP, but you have no other costs</li>
<li><strong>No infrastructure to run.</strong>  Combine something like Twilio or Tropo with an app running on Heroku and you have zero infrastructure to manage. In Tropo's case, you can even run the app directly on their servers</li>
<li><strong>Best for simple apps.</strong>  Low complexity lends itself to small, self-contained functionality, like a simple IVR or a call recording feature</li>
</ul>

<h3>Cons</h3>

<ul>
<li><strong>Service/pricing options limited.</strong>  In both cases you can't bring in 3rd party providers.  We've had customers in the past who wanted DIDs from regions not served by the cloud host.  There's no (good) way around that: you get whatever service they provide, nothing more.  You also cannot shop around for better termination rates, or make quality/cost tradeoffs</li>
<li><strong>Limited to simple applications.</strong>  Twilio covers probably 80% to 90% of telephony use cases, but that leaves a lot of interesting applications out in the cold.  Tropo is better about this, but there are still limits to the API.  Call progress analysis (answering machine detection) is one example: it's not available on either platform.  Twilio also does not allow some interesting interactions between two live calls that are possible when you control the whole stack like a premise system</li>
</ul>

<h2>Premise</h2>

<p>For many people, the right choice is to run the infrastructure themselves.  Here are some reasons why.  We will focus on <a rel="nofollow" target="_blank" href="http://adhearsion.com">Adhearsion</a> in tandem with one of the supported telephony engines: <a rel="nofollow" target="_blank" href="http://asterisk.org">Asterisk</a>, <a rel="nofollow" target="_blank" href="http://freeswitch.org">FreeSWITCH</a> or <a rel="nofollow" target="_blank" href="http://voxeolabs.com/prism">PRISM</a>.</p>

<h3>Pros</h3>

<ul>
<li><strong>Functionality.</strong> Really sophisticated voice apps are possible in a real programming language (as opposed to extensions.conf or dialplan.xml).  This means modern practices like unit testing, functional testing, access to a HUGE library of pre-built functionality (Rubygems), and easy integration with web services and/or databases, including databases behind your firewall</li>
<li><strong>Control.</strong> Provides the most control possible over phone calls.  You can bridge two calls together, tear them apart, redirect them, record media, play media, do ASR and TTS, integrate with instant messaging and web dashboards, etc.</li>
<li><strong>Self-hosted or cloud.</strong> Adhearsion apps can run on your own infrastructure, if that is a requirement (for PCI or SOX or other compliance reasons, or simply as a matter of choice).  Note that while you can self-host, you can also run Adhearsion in the cloud. We've done it on both <a rel="nofollow" target="_blank" href="http://aws.amazon.com">Amazon AWS</a> and <a rel="nofollow" target="_blank" href="http://heroku.com">Heroku</a></li>
<li><strong>Shop around for rates.</strong>  You can purchase VoIP services from whatever service providers you choose, and you can mix-and-match.  Especially important at high volume or in obscure markets, or when you need different origination and termination providers</li>
</ul>

<h3>Cons</h3>

<ul>
<li><strong>Learning Curve.</strong>  You may already be familiar with Asterisk or FreeSWITCH.  You may have to learn Adhearsion. These packages have a steeper curve (due to their capabilities) than either cloud offering above</li>
<li><strong>Infrastructure costs.</strong> Most people who chose to employ Adhearsion end up running it themselves, whether hosted at facility or in their offices.  Someone will need to manage these servers</li>
<li><strong>Too much power.</strong>  I'm not being flippant here: For some jobs the simpler tool is the right one.  We use and love Adhearsion for most of our apps, but we're usually doing more complicated things that need the functionality.  I probably wouldn't start out with Adhearsion if all I wanted to do was make a simple call recording app</li>
<li><strong>Licenses needed for ASR and TTS.</strong>  There are no good open source/free ASR or TTS engines available.  If you need them, you'll have to license them</li>
</ul>

<h2>Know Thyself</h2>

<p>Informed decisions are the best decisions.  Hopefully the above provides a starting point for more discussion about your own needs.  Knowing exactly what features you need, and what regulatory or policy requirements to meet, will help guide the decision.  Not every voice application is created equal, and not one size will fit all.</p>

<h2>Want to hear more?</h2>	
<div id="mc_signup">
	<form target="_blank" method="post" id="mc_signup_form">
		<input type="hidden" id="mc_submit_type" name="mc_submit_type" value="html"/>
		<input type="hidden" name="mcsf_action" value="mc_submit_signup_form"/>
		<input type="hidden" id="_mc_submit_signup_form_nonce" name="_mc_submit_signup_form_nonce" value="02298284a8"/>		
			<div id="mc_subheader">
			<p>If you like what you've just read, sign up for our low-volume mailing list. Adam will make sure you get a copy of the good stuff as soon as it's ready.  Just leave your email address for him here.</p>		</div>
			
	<div class="mc_form_inside">
		
		<div class="updated" id="mc_message">
					</div>

		
<div class="mc_merge_var">
		<label for="mc_mv_EMAIL" class="mc_var_label">Email Address<span class="mc_required">*</span></label>
	<input type="text" size="18" value="" name="mc_mv_EMAIL" id="mc_mv_EMAIL" class="mc_input"/>
</div>
<div class="mc_merge_var">
		<label for="mc_mv_FNAME" class="mc_var_label">First Name</label>
	<input type="text" size="18" value="" name="mc_mv_FNAME" id="mc_mv_FNAME" class="mc_input"/>
</div>
<div class="mc_merge_var">
		<label for="mc_mv_LNAME" class="mc_var_label">Last Name</label>
	<input type="text" size="18" value="" name="mc_mv_LNAME" id="mc_mv_LNAME" class="mc_input"/>
</div>			<div id="mc-indicates-required">
				* = required field			</div>
					<div class="mergeRow">
			<label>Preferred Format</label>
		    <div class="field-group groups">
		        <ul class="mc_list">
			        <li><input type="radio" name="email_type" id="email_type_html" value="html" checked><label for="email_type_html">HTML</label></li>
			        <li><input type="radio" name="email_type" id="email_type_text" value="text"><label for="email_type_text">Text</label></li>
			        <li><input type="radio" name="email_type" id="email_type_mobile" value="mobile"><label for="email_type_mobile">Mobile</label></li>
		        </ul>
			</div>
		</div>	

		
		<div class="mc_signup_submit">
			<input type="submit" name="mc_signup_submit" id="mc_signup_submit" value="I want to know!" class="button"/>
		</div>
	
	
				
	</div>
	</form>
</div>
	
<p>The post <a rel="nofollow" target="_blank" href="http://mojolingo.com/blog/2013/cloud-vs-premise-how-to-choose-a-voice-application-platform/">Cloud vs. Premise: How to choose a Voice Application Platform</a> appeared first on <a rel="nofollow" target="_blank" href="http://mojolingo.com">Mojo Lingo</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Using `git bisect` to troubleshoot Ruby gems</title>
         <link>http://mojolingo.com/blog/2013/using-git-bisect-to-troubleshoot-ruby-gems/</link>
         <description>&lt;p&gt;Occasionally, something added to a gem used by one of your projects will break your application. Finding out where, when, and how it broke can be a challenge, especially if you upgrade several point releases at once. For example, if &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/using-git-bisect-to-troubleshoot-ruby-gems/&quot;&gt;view more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/using-git-bisect-to-troubleshoot-ruby-gems/&quot;&gt;Using `git bisect` to troubleshoot Ruby gems&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com&quot;&gt;Mojo Lingo&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://mojolingo.com/?p=1039</guid>
         <pubDate>Thu, 21 Mar 2013 15:00:00 +0000</pubDate>
         <content:encoded><![CDATA[<p>Occasionally, something added to a gem used by one of your projects will break your application.  Finding out where, when, and how it broke can be a challenge, especially if you upgrade several point releases at once.  For example, if you're updating a dependency gem from (for example) version 2.0.0 to the latest release, 2.2.1, you've got dozens of commits that MIGHT be what broke something.  Understand what changed will often reveal the source of the bug more quickly than debug statements or debugger consoles.  This post will walk you through the process of taking a Ruby gem and slicing up the commits ("bisecting" it) to figure out what went wrong.</p>

<h2>What is <code>git bisect</code>?</h2>

<p>Git bisect will iterate through each commit between two points, but rather than going sequentially, hitting every single commit, it intellegently divides them - it will start halfway through the begin and end commit, and then iterate by halving the distance between the known good commit and the known bad commit.  In computer science terms, this technique is sometimes called a "binary search".  The point, though, is that it will save you a lot of time over inspecting every commit to find the one that breaks.</p>

<h2>An example: Upgrading Adhearsion</h2>

<p>Here’s a real issue I encountered not long ago. It happened to me when I moved from Adhearsion 2.1 to 2.2, but to make the example more dramatic, let’s upgrade all the way from 2.0.0 to 2.2.1. Say you're running along on 2.0 in production, all your tests pass, and there are no known issues. But when you upgrade to 2.2.0 to get a new feature,  all hell breaks loose. Suddenly, you notice that certain conditions cause the logger to quit logging, and you get no feedback on your app. Here's how to use git bisect to track down which change to the Adhearsion project broke it.</p>

<h3>Step 1: Check out gem sources</h3>

<p>This should work for any gem which:</p>

<ol>
<li>Uses git; and,</li>
<li>Has a checked in gemspec</li>
</ol>

<p>The gemspec is needed so that Bundler can treat the checkout as a gem.  For the purposes of our example, we'll use <a rel="nofollow" target="_blank" href="https://github.com/adhearsion/adhearsion">Adhearsion</a>:</p>

<pre>
git clone git://github.com/adhearsion/adhearsion.git
</pre>

<h3>Step 2: Edit your project's Gemfile</h3>

<p>Open up your project's Gemfile, and change the line that brings Adhearsion into the project to read:</p>

<pre>
gem "adhearsion", path: "/home/jaiken/gems/adhearsion" 
</pre>

<p>Be sure to put in the actual path to which you have cloned Adhearsion</p>

<p>At this point, it's probably helpful to have two terminal tabs open: one in your project and one in the directory in which you cloned Adhearsion.</p>

<h3>Step 3: Find the last known "good" version's commit hash</h3>

<p>Finding the commit where the bug began requires knowing two points: one "good" (working, non-broken) version, and one "bad" (broken) version.  Hopefully the project you are using has tagged releases, like <a rel="nofollow" target="_blank" href="https://github.com/adhearsion/adhearsion/tags">Adhearsion does</a>.  If not, you may need to look through the Git commit logs to find the hashes that correspond to the version release.  For example, here is a small list of commit hashes that go with each Rubygems release for Adhearsion:</p>

<ul>
<li>2.2.1 - 9542998</li>
<li>2.2.0 - c46473d</li>
<li>2.1.3 - 63b1201</li>
<li>2.1.2 - 1f342fd</li>
<li>2.1.1 - 94a601c</li>
<li>2.1.0 - f843284</li>
<li>2.0.1 - 372237d</li>
<li>2.0.0 - e6e1d6e</li>
</ul>

<p>In the Adhearsion tab, you'll want to checkout a known good commit.  Since we started with a working application on version 2.0.0, let’s use that hash to start:</p>

<pre>
git checkout e6e1d6e
</pre>

<p>In the terminal tab for your own app, we'll run <code>bundle install</code> on your project to bring that first version of Adhearsion into the review. Now either run your tests or start up your app and verify that everything works. It should, since your project Gemfile is using that same version of Adhearsion that you were using before.</p>

<h3>Step 4: Check out the first known "bad" commit</h3>

<p>Now head back to the Adhearsion tab in your terminal, and checkout the commit where something went wrong. If it were the latest version you tried, in our example Adhearsion 2.2.1, you'd do</p>

<pre>
git checkout 9542998 
</pre>

<p>Back in your application tab, you can run the test suite or start the app up and try it out.  This step should fail.</p>

<h3>Step 5: Set up git bisect</h3>

<p>At this point, we have a choice. We can manually checkout each commit between where we were and where we are, checking each one for errors. This can be a lengthy process - especially if a simple test suite run doesn’t reveal the problem and you’re forced to go through a 5-minute process to recreate the bug. Unfortunately for me, this is exactly what I did before I knew about git bisect. It made for a very long afternoon!</p>

<p>To begin the process the <code>git bisect</code> way, enter these 3 commands:</p>

<pre>
git bisect
git bisect good e6e1d6e # the commit hash from Adhearsion 2.0.0
git bisect bad 9542998 # the commit hash from Adhearsion 2.2.1
</pre>

<p>For bisect good, we put the hash for the known working one, and for bisect bad we put the hash of the version we first noticed causing a problem. Immediately after entering the <code>git bisect bad</code> command into the terminal, git checkouts a commit halfway between the two. Flip over to the tab for your application and run the app/tests to determine whether this is a good or bad commit. Occasionally, you may run into a dependency issue if the Adhearsion .gemspec has changed and requires gems that conflict with versions requested in your application - in this case, you can fix it with a <code>bundle install</code>. Fortunately these case are rare. Once your tests results are back, flip to the Adhearsion tab and inform git of the results of your test:</p>

<ul>
<li>If the tests pass, type <code>git bisect good</code></li>
<li>If the tests fail, type <code>git bisect bad</code></li>
</ul>

<p>By narrowing down the commits by halving, Git bisect will take 4 or 5 attempts before it finds the first bad commit—not the 20 to 30 attempts it would take manually.</p>

<h3>Step 6: Use git bisect to iterate through commits</h3>

<p>Now we can begin the process of using git bisect's intelligent iteration to find the first known bad commit. Whenever you inform git of whether the current iteration is good or bad, it immediately checks out a new commit for you to try. Keep bouncing back and forth between rebundling, testing your app, and informing git of whether it's good or bad. Stop when git  recognizes the first bad commit:</p>

<pre>
357646fa193b0f431a1ae5298c61f3c8c9efe6ff is the first bad commit 
</pre>

<p>Now we have a nice pointer to a single commit where the error occurred.  Since most commits (and hopefully the one you just found) are relatively small amounts of code, this should make troubleshooting much easier.</p>

<h3>Step 7: Do your civic duty</h3>

<p>Adhearsion is Open Source, and you've just found a bug.  Since this bug probably affects other people too, you can help out your fellow developer by letting the gem's maintainers know.  Extra credit (and glory, and fame!) if your report includes a fix.  For our example, Adhearsion uses Github to track such problems. You might file an <a rel="nofollow" target="_blank" href="https://github.com/adhearsion/adhearsion/issues">Adhearsion issue on Github</a> or pull request that identifies the problem.</p>

<p>With that done, you can stop the bisecting process with:</p>

<pre>
git bisect reset
</pre>

<p>Don't forget to restore your app's Gemfile to point to the correct version of Adhearsion!</p>
<p>The post <a rel="nofollow" target="_blank" href="http://mojolingo.com/blog/2013/using-git-bisect-to-troubleshoot-ruby-gems/">Using `git bisect` to troubleshoot Ruby gems</a> appeared first on <a rel="nofollow" target="_blank" href="http://mojolingo.com">Mojo Lingo</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Adhearsion Voice Platforms: A Comparison</title>
         <link>http://mojolingo.com/blog/2013/adhearsion-voice-platform-comparison/</link>
         <description>&lt;p&gt;When I’m at conferences or working with Mojo Lingo clients, I’m often asked about voice application projects that use the Adhearsion framework. I’ve noticed that the majority of newcomers to the Adhearsion community have already chosen the VoIP platform they &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/adhearsion-voice-platform-comparison/&quot;&gt;view more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/adhearsion-voice-platform-comparison/&quot;&gt;Adhearsion Voice Platforms: A Comparison&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com&quot;&gt;Mojo Lingo&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://mojolingo.com/?p=939</guid>
         <pubDate>Thu, 14 Mar 2013 15:45:49 +0000</pubDate>
         <content:encoded><![CDATA[<p>When I’m at conferences or working with Mojo Lingo clients, I’m often asked about voice application projects that use the Adhearsion framework. I’ve noticed that the majority of newcomers to the Adhearsion community have already chosen the VoIP platform they want to use. While I don’t have exact numbers, anecdotal evidence suggests that more often than not, their choice of platform is based almost entirely on their experience and not necessarily on the technical merits of the supported platforms or their suitability to the project at hand.</p>

<p>In an effort to help my fellow developers and their clients, I want to describe the VoIP platforms supported by Adhearsion — Asterisk, FreeSWITCH, and Voxeo PRISM — and highlight the key differences between them. Hopefully by providing an overview of the main decision points, you’ll be able to arrive at the most sensible choice of platform for your Adhearsion project.</p>

<h2>Asterisk</h2>

<p><a rel="nofollow" target="_blank" href="http://asterisk.org"><img src="http://mojolingo.com/wp-content/uploads/2013/02/asterisk_logo-300x168.png" alt="Asterisk logo" width="300" height="168" class="alignright size-medium wp-image-863"/></a>Asterisk is the quintessential open-source PBX. Ask a non-telephony person about open-source telephony and chances are he’ll know about Asterisk. Asterisk has been around for a very long time, and is used by an extraordinary number of people to implement SOHO PBXs, as well as some larger projects. Asterisk is very easy to install, with several appliance-like distributions available such as <a rel="nofollow" target="_blank" href="http://www.freepbx.org/freepbx-distro">FreePBX</a> and <a rel="nofollow" target="_blank" href="http://www.elastix.org/">Elastix</a>. Most people who use Asterisk set it up once and — with the exception of occasionally adding extensions — never touch it again. Used for basic call routing, voicemail, inbound queues and occasionally IVRs, Asterisk can be utilized for more complex scenarios. Unfortunately, elaborate applications (and external integrations) quickly become un-maintainable and/or too complex to understand. And some things are just plain impossible with Asterisk.</p>

<p>Adhearsion, which began as a “niceness” layer on top of Asterisk (helping to avoid the frustration caused by trying to write complex applications in extensions.conf), has always supported Asterisk; in fact, v1 <em>only</em> supported Asterisk. The advent of Adhearsion meant developers could write sophisticated Asterisk applications in a real programming language, with all the attendant benefits.</p>

<p>Then developers, myself included, starting asking for FreeSWITCH support.</p>

<h2>FreeSWITCH</h2>

<p><a rel="nofollow" target="_blank" href="http://freeswitch.org"><img src="http://mojolingo.com/wp-content/uploads/2012/08/FreeSWITCH_logo-300x73.png" alt="FreeSWITCH logo" width="300" height="73" class="alignright size-medium wp-image-552"/></a>FreeSWITCH is ‘the other' open source PBX. While it began as a fork of Asterisk, FreeSWITCH is more than just another open source PBX. A "soft-switch", FreeSWITCH is designed for flexibility. It’s highly configurable, and can be bent to be almost anything you want it to be, although this sometimes means writing C/C++ code.</p>

<p>As a result of the platform-independent design of Adhearsion 2 and Punchblock, FreeSWITCH support was added in Adhearsion 2.1. And it was easy to add, thanks in part to the incredibly clean and comprehensive API of FreeSWITCH (EventSocket). There are, however, still some things incomplete in our implementation, and work is underway to improve this support (Further details on this work will be available soon, so sit tight.). The good news is that, in the near future and over time, FreeSWITCH support will become more comprehensive.</p>

<h2>Voxeo PRISM</h2>

<p><a rel="nofollow" target="_blank" href="http://voxeolabs.com/prism"><img src="http://mojolingo.com/wp-content/uploads/2013/03/PRISM-logo.png" alt="Voxeo PRISM logo" width="187" height="248" class="alignright size-full wp-image-1026"/></a>Voxeo PRISM is a communications application server with support for SIP, HTTP &amp; XMPP, as well as a rich media server for TTS and ASR, among other things. Produced by Voxeo Labs, a sister company of Voxeo Corporation, one of the biggest providers of IVR technology in the world, Voxeo PRISM is a commercial product and comes with all that being a commercial product entails.</p>

<p>Unlike Asterisk and FreeSWITCH, PRISM <em>is not</em> a PBX, although it is possible to write applications for PRISM to provide PBX features such as voicemail, intelligent routing, queuing, and so forth. In the Adhearsion 2.0 release by way of the Rayo protocol, we added support for PRISM. Many of the apps mentioned above can now be written using Adhearsion rather than by dropping down to SIP servlets. Of the three platforms I’ve mentioned — Asterisk, FreeSWITCH and PRISM, users of PRISM enjoy the most comprehensive set of features currently available in Adhearsion.</p>

<table>
  <thead>
    <td colspan="2"><h3>Asterisk</h3></td>
  </thead>
  <thead>
    <td>Benefits</td>
    <td>Drawbacks</td>
  </thead>
  <tr>
    <td>
      <ul>
        <li>Free</li>
        <li>Widely used - large ecosystem of Asterisk compatible software and community of consultants</li>
        <li>Good availability of operating system packages or full distributions bundling Asterisk with an admin UI</li>
        <li>Most error messages can be answered by Google</li>
      </ul>
    </td>
    <td>
      <ul>
        <li>Not designed for complex applications</li>
        <li>Least performant of supported platforms</li>
        <li>Missing API support for some Adhearsion features, especially for TTS and ASR</li>
        <li>No real clustering options</li>
        <li>Scattershot documentation in places</li>
      </ul>
    </td>
  </tr>
  <thead>
    <td colspan="2"><h3>FreeSWITCH</h3></td>
  </thead>
  <thead>
    <td>Benefits</td>
    <td>Drawbacks</td>
  </thead>
  <tr>
    <td>
      <ul>
        <li>Free</li>
        <li>Good performance with Adhearsion</li>
        <li>Well documented</li>
        <li>Good mailing list support</li>
        <li>Implements nearly all Adhearsion features</li>
      </ul>
    </td>
    <td>
      <ul>
        <li>Smaller community than Asterisk</li>
        <li>Official packages not available, must be built from source</li>
        <li>History of poor versioning policy</li>
      </ul>
    </td>
  </tr>
  <thead>
    <td colspan="2"><h3>Voxeo PRISM</h3></td>
  </thead>
  <thead>
    <td>Benefits</td>
    <td>Drawbacks</td>
  </thead>
  <tr>
    <td>
      <ul>
        <li>Vendor supported</li>
        <li>Well documented</li>
        <li>Good clustering capability</li>
        <li>PCI compliant</li>
        <li>Highly scaleable</li>
        <li>Excellent ASR &#038; TTS built in</li>
        <li>Implements all Adhearsion features</li>
      </ul>
    </td>
    <td>
      <ul>
        <li>Non-free</li>
        <li>Closed source</li>
        <li>Few community resources available</li>
      </ul>
    </td>
  </tr>
</table>

<h2>Questions to Help You Choose a Platform</h2>

<h3>Are reliability, good support and an SLA more important to you than cost?</h3>

<p>If the answer is “Yes”, go for PRISM or be sure to find a support provider for one of the other platforms. Keep in mind that your Adhearsion application will likely not be covered under a platform deal. This is because Adhearsion uses an abstraction on top of the Asterisk and FreeSWITCH APIs that many support providers are unfamiliar with or unable to support. Consider taking out support contracts with a provider that will cover your whole stack, including your application code.</p>

<h3>Do you have a philosophical affinity with Open Source software or require the ability to make modifications to your platform in-house?</h3>

<p>If yes, use Asterisk or FreeSWITCH. While Asterisk has the longer open-source legacy, in our experience, getting patches in to FreeSWITCH tends to be quicker and the code easier to understand and modify.</p>

<h3>Do you need easy integration with ASR and TTS engines?</h3>

<p>If so, go with Voxeo PRISM or maybe FreeSWITCH (though be aware that not all combinations are known to work, we'll provide more details on this soon). The most comprehensive support for ASR and TTS in Adhearsion is currently only available on Voxeo PRISM; we do not yet support MRCP-based ASR on Asterisk or FreeSWITCH, although this is coming very soon. Unfortunately, Asterisk's UniMRCP adapter is missing several features, and getting it compiled is difficult. The situation is improving, but the other platforms have a head start here.</p>

<h3>Do you need free simple TTS?</h3>

<p>Then consider FreeSWITCH. It comes bundled with flite, which produces fairly terrible text to speech, but is completely free.</p>

<h3>Do you have a large deployed infrastructure or significant level of in-house experience with a particular platform?</h3>

<p>While it is tempting to 'go with the flow' on new projects, it is my firm belief that your company’s history and comfort level with a particular platform should be carefully and critically weighed against the technical fit of the platform and project. This mostly applies to choosing between Asterisk and FreeSWITCH, and I strongly suggest that anyone tempted to use Asterisk simply out of habit give FreeSWITCH a try and evaluate the fit. One of the benefits of Adhearsion’s platform independence is that the same application should be deployable to any of the supported platforms and should work similarly, save a small collection of differing features (for example, Asterisk and FreeSWITCH currently do not support mixers or whisper functionality). And note also that multiple platforms can happily coexist in a datacenter; just because your other apps run on one platform doesn't mean the next one couldn't run on another <img src='http://mojolingo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley'/> </p>

<p>If any of you have input or feel differently about my logic, leave a comment; I’d love to hear from you. Likewise if anyone feels they need further help choosing the correct platform for their application or selecting any other components of their stack, feel free to reach out to us at Mojo Lingo to see how we can help your project succeed.</p>
<p>The post <a rel="nofollow" target="_blank" href="http://mojolingo.com/blog/2013/adhearsion-voice-platform-comparison/">Adhearsion Voice Platforms: A Comparison</a> appeared first on <a rel="nofollow" target="_blank" href="http://mojolingo.com">Mojo Lingo</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>In Memorial: David Ryder</title>
         <link>http://mojolingo.com/blog/2013/in-memorial-david-ryder/</link>
         <description>&lt;p&gt;Earlier this week I received a phone call with tragic news: David Ryder had passed away on Monday, Feb 4th, 2013. David was a visible and energetic member of the Adhearsion community, having presented at both the 2011 and 2012 &amp;#8230; &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/in-memorial-david-ryder/&quot;&gt;view more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com/blog/2013/in-memorial-david-ryder/&quot;&gt;In Memorial: David Ryder&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://mojolingo.com&quot;&gt;Mojo Lingo&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">https://mojolingo.com/?p=632</guid>
         <pubDate>Thu, 07 Feb 2013 16:00:13 +0000</pubDate>
         <content:encoded><![CDATA[<p>Earlier this week I received a phone call with tragic news: David Ryder had passed away on Monday, Feb 4th, 2013.</p>

<p>David was a visible and energetic member of the Adhearsion community, having presented at both the 2011 and 2012 AdhearsionConfs as well as contributing lots of testing, feedback, pull requests, documentation fixes, and more to the Adhearsion platform. &nbsp;What makes this news even harder for us at Mojo Lingo is that David had accepted our offer of employment just days earlier, and was scheduled to be in Atlanta in less than two weeks. &nbsp;We were all very impressed by David and excited to have his skills and easygoing humor join our small team.</p>

<p>As a memorial to his legacy, I've included the video from his presentation at AdhearsionConf 2012. &nbsp;In addition to infusing his creative and genuine style throughout the presentation, he talks a lot about how he improved his skills through applied practice in Ruby, and how important the process of continual improvement is to being a good developer. &nbsp;Perhaps David was providing us more than a lesson for development, and we are grateful he shared it with us.</p>

<p></p> 

<p><a rel="nofollow" target="_blank" href="http://vimeo.com/55280553">Lessons Learned from 1.x to 2.x - David Ryder</a> from <a rel="nofollow" target="_blank" href="http://vimeo.com/adhearsion">Adhearsion Foundation, Inc.</a> on <a rel="nofollow" target="_blank" href="http://vimeo.com">Vimeo</a>.</p>

<p>The Adhearsion community has lost a great resource and a great friend. &nbsp;Our hearts and prayers go to his family, especially his wife and very young son, at this most difficult time.</p>
<p>The post <a rel="nofollow" target="_blank" href="http://mojolingo.com/blog/2013/in-memorial-david-ryder/">In Memorial: David Ryder</a> appeared first on <a rel="nofollow" target="_blank" href="http://mojolingo.com">Mojo Lingo</a>.</p>]]></content:encoded>
      </item>
      <item>
         <title>Its official – Adhearsion &amp; Voxeo</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/oKoBervUDRE/</link>
         <description>Adhearsion is effective in making telephony applications easy to develop. The next phase is to make deployment and scaling of these applications easy while increasing choice of development environments. The first step in accelerating this phase was announced today, Adhearsion and Voxeo Launch Voxeo Labs! It is time to take Adhearsion to the cloud. Some [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=456&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=456</guid>
         <pubDate>Wed, 22 Jul 2009 17:44:14 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="size-full wp-image-457 alignright" title="Picture 1" src="http://jsgoecke.files.wordpress.com/2009/07/picture-1.png?w=600" alt="Picture 1"/><a rel="nofollow" target="_blank" href="http://adhearsion.com">Adhearsion</a> is effective in making telephony applications easy to develop. The next phase is to make deployment and scaling of these applications easy while increasing choice of development environments. The first step in accelerating this phase was announced today, <a rel="nofollow" target="_blank" href="http://news.yahoo.com/s/prweb/20090722/bs_prweb/prweb2668014">Adhearsion and Voxeo Launch Voxeo Labs</a>! It is time to take Adhearsion to the cloud.</p>
<p>Some of you that have been following along closely, may already have noticed our involvement with <a rel="nofollow" target="_blank" href="http://tropo.com">Tropo.com</a>. We worked closely with Voxeo at the inception of Tropo which was subsequently launched at <a rel="nofollow" target="_blank" href="http://www.youtube.com/watch?v=K7bX8OzZe9Y">eComm in March of 2009</a>. The goal of Tropo.com is to bring a scalable telephony cloud infrastructure to the broadest group of developers by allowing development directly in dynamic languages. Languages included are: Javascript, Groovy, PHP, Python and Ruby. We will now be focused on bringing Tropo and Adhearsion together to offer the power of Adhearsion with the scale of Tropo, while extending capabilities in the other languages.</p>
<p>Jay and I as founding members of Voxeo Labs is no accident. The DNA of Voxeo Labs is a commitment to open-source. Adhearsion will continue to evolve as an open-source framework with continued support for <a rel="nofollow" target="_blank" href="http://asterisk.org">Asterisk</a> along with Tropo and others. Our goal is to provide the widest possible set of deployment choices for the Adhearsion community, while eliminating friction for those who want effortless deployment and scaling.</p>
<p>Stay tuned as we have lots of interesting announcements just around the corner. In the meantime, thanks to the entire Adhearsion community for the support that allowed us to pursue this next step.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/456/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=456&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=oKoBervUDRE:LqaNwy9kggM:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=oKoBervUDRE:LqaNwy9kggM:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=oKoBervUDRE:LqaNwy9kggM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=oKoBervUDRE:LqaNwy9kggM:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/oKoBervUDRE" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/07/picture-1.png">
            <media:title type="html">Picture 1</media:title>
         </media:content>
      </item>
      <item>
         <title>Adhearsion (アドヒアジョン) &amp; Tropo presentation at Ruby Kaigi – Tokyo 2009</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/hn33khwQBh4/</link>
         <description>I just gave my talk at Ruby Kaigi in Tokyo Japan. The event is well organized and attended. I suppose that is a bit easier since Tokyo is the home of Ruby, and filled with 13 million people. Here are the slides:&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=451&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=451</guid>
         <pubDate>Fri, 17 Jul 2009 08:29:43 +0000</pubDate>
         <content:encoded><![CDATA[<p>I just gave my talk at Ruby Kaigi in Tokyo Japan. The event is well organized and attended. I suppose that is a bit easier since Tokyo is the home of Ruby, and filled with 13 million people.</p>
<p>Here are the slides:</p>
 
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/451/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/451/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=451&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=hn33khwQBh4:y8tKZpg2vbQ:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=hn33khwQBh4:y8tKZpg2vbQ:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=hn33khwQBh4:y8tKZpg2vbQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=hn33khwQBh4:y8tKZpg2vbQ:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/hn33khwQBh4" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
      </item>
      <item>
         <title>Behavior Driven Systems Monitoring for Telephony</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/z3WRnmFLanw/</link>
         <description>While attending Euruko several weeks ago, I had the opportunity to see @aslak_hellesoy present the Cucumber Behavior Driven Development (BDD) framework. BDD is a part of Agile software development focused on bringing the domain expert into the specification process through the use of natural language. This is done through the users and developers creating a [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=417&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=417</guid>
         <pubDate>Wed, 10 Jun 2009 18:15:59 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://cukes.info/"><img class="alignright size-full wp-image-421" title="CucumberLogo" src="http://jsgoecke.files.wordpress.com/2009/06/picture-13.png?w=600" alt="CucumberLogo"/></a></p>
<p>While attending <a rel="nofollow" target="_blank" href="http://www.euruko2009.org/">Euruko</a> several weeks ago, I had the opportunity to see <a rel="nofollow" target="_blank" href="http://twitter.com/aslak_hellesoy">@aslak_hellesoy</a> present the <a rel="nofollow" target="_blank" href="http://cukes.info/">Cucumber</a> <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Behavior_driven_development">Behavior Driven Development (BDD)</a> framework. BDD is a part of <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Agile_software_development">Agile software development</a> focused on bringing the domain expert into the specification process through the use of natural language. This is done through the users and developers creating a story that is directly parsed by the code for tests.</p>
<p>Aslak&#8217;s <a rel="nofollow" target="_blank" href="http://www.slideshare.net/railsconf/quality-code-with-cucumber-presentation">presentation</a> was well done, giving some compelling reasons to adhere to BDD principals, showing that using Cucumber made it a joy. Thing is, Cucumber is already a part of testing for  the <a rel="nofollow" target="_blank" href="http://adhearsion.com">Adhearsion</a> framework and some specific projects we are working on. What was new to me, was a lightning talk given at the end of the day on <a rel="nofollow" target="_blank" href="http://github.com/auxesis/cucumber-nagios">Cucumber-Nagios</a>.</p>
<p><span id="more-417"></span></p>
<p>Cucumber-Nagios is a project developed by <a rel="nofollow" target="_blank" href="http://twitter.com/auxesis">@auxesis</a> that bridges Cucumber test results into the <a rel="nofollow" target="_blank" href="http://www.nagios.org/">Nagios</a> monitoring tool. This allows you to take any test you have written and allow the steps to become part of an on-going systems monitoring strategy. While Cucumber-Nagios is geared towards web application testing, you may use this beyond to test virtually any application.</p>
<p>Naturally I have started using Cucumber-Nagios to create a series of tests to do application level monitoring of Adhearsion and <a rel="nofollow" target="_blank" href="http://asterisk.org">Asterisk</a>. This now allows one to not only ensure that these processes are running, but they are working as defined by the BDD specification.</p>
<p>To start, I created a couple of <a rel="nofollow" target="_blank" href="http://wiki.github.com/aslakhellesoy/cucumber/feature-introduction">features</a> that will connect to Adhearsion and/or Asterisk. Then ping the <a rel="nofollow" target="_blank" href="http://www.voip-info.org/wiki/view/Asterisk+manager+API">Asterisk Manager Interface (AMI)</a> looking for a corresponding pong, ensuring the systems are still responsive.</p>
<p>The feature to ping the AMI uses the straight forward <a rel="nofollow" target="_blank" href="http://wiki.github.com/aslakhellesoy/cucumber/gherkin">Gherkin</a> language to create a feature file with the test specification:</p>
<p><img class="aligncenter size-full wp-image-428" title="PingAsteriskFeature" src="http://jsgoecke.files.wordpress.com/2009/06/picture-1.jpg?w=600&#038;h=139" alt="PingAsteriskFeature" width="600" height="139"/></p>
<p>The feature file is then parsed by the <a rel="nofollow" target="_blank" href="http://wiki.github.com/aslakhellesoy/cucumber/step-definitions">steps definitions</a> as set out in the step file:</p>
<p><img class="aligncenter size-full wp-image-430" title="cukes steps" src="http://jsgoecke.files.wordpress.com/2009/06/steps.jpg?w=600" alt="cukes steps"/></p>
<p>The methods called in the step definitions then invoke the system testing library I wrote specifically for these <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Telephony">telephony</a> systems. The result is having a standalone test framework that may provide direct input at an application level to Nagios, as well as provide plain English feedback to anyone looking to track down the cause of the problem.</p>
<p>First, if Asterisk is down we may see the result of running the Cucumber plain English test:</p>
<p><img class="aligncenter size-full wp-image-433" title="cuke-fail" src="http://jsgoecke.files.wordpress.com/2009/06/cuke-fail1.jpg?w=600&#038;h=504" alt="cuke-fail" width="600" height="504"/>Then the corresponding Cucumber-Nagios test that also fails with a &#8216;Critical&#8217; error:</p>
<p><img class="aligncenter size-full wp-image-434" title="nagios fail" src="http://jsgoecke.files.wordpress.com/2009/06/nagios-fail.jpg?w=600&#038;h=403" alt="nagios fail" width="600" height="403"/></p>
<p>Now, if Asterisk is up and all is fine we may see these same tests pass. First, for Cucumber all is green:</p>
<p><img class="aligncenter size-full wp-image-437" title="cuke-success" src="http://jsgoecke.files.wordpress.com/2009/06/cuke-success1.jpg?w=600&#038;h=403" alt="cuke-success" width="600" height="403"/>Then for Cucumber-Nagios we see all 3 tests passed:</p>
<p><img class="aligncenter size-full wp-image-438" title="nagios success" src="http://jsgoecke.files.wordpress.com/2009/06/nagios-success.jpg?w=600&#038;h=403" alt="nagios success" width="600" height="403"/></p>
<p>The great thing about this approach is that it may be used to test systems using a standard open source dynamic language like <a rel="nofollow" target="_blank" href="http://www.ruby-lang.org/">Ruby</a>. These tests are not limited to testing Ruby systems though, as you may see in this case I am testing the Asterisk open source telephony engine. Further, I may test not only the standard interfaces of various systems, but that the behavior of my application deployed within these systems is behaving as required from a specification perspective. This is a powerful approach to systems monitoring and troubleshooting, pulling the system administrators directly into the development process.</p>
<p>You may check out my <a rel="nofollow" target="_blank" href="http://github.com/jsgoecke/telephony-system-tests">telephony-system-tests</a> project on Github. My plan is to greatly extend this system testing framework over time in order to have a stable of standard tests for Adhearsion, Asterisk, Freeswitch and others in the future. One of the next steps will be to integrate <a rel="nofollow" target="_blank" href="http://sipper.agnity.com/">SIPr</a> into the framework for testing <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Session_initiation_protocol">SIP</a> dialogs as well.</p>
<p>Another interesting item from Euruko that I will be posting about soon is <a rel="nofollow" target="_blank" href="http://wiki.opscode.com/display/chef/Home">Chef</a>, which was presented by <a rel="nofollow" target="_blank" href="http://diluvia.net/">Joshua Sierles</a> of <a rel="nofollow" target="_blank" href="http://37signals.com/">37Signals</a> at the conference. So much more to come on this front.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/417/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=417&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=z3WRnmFLanw:wFDk4DAWhi4:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=z3WRnmFLanw:wFDk4DAWhi4:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=z3WRnmFLanw:wFDk4DAWhi4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=z3WRnmFLanw:wFDk4DAWhi4:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/z3WRnmFLanw" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/picture-13.png">
            <media:title type="html">CucumberLogo</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/picture-1.jpg">
            <media:title type="html">PingAsteriskFeature</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/steps.jpg">
            <media:title type="html">cukes steps</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/cuke-fail1.jpg">
            <media:title type="html">cuke-fail</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/nagios-fail.jpg">
            <media:title type="html">nagios fail</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/cuke-success1.jpg">
            <media:title type="html">cuke-success</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/06/nagios-success.jpg">
            <media:title type="html">nagios success</media:title>
         </media:content>
      </item>
      <item>
         <title>Using C#/.Net to Invoke the Adhearsion API via REST</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/XT6ibpZZ0mY/</link>
         <description>Recently an Adhearsion community member, David Lawal, built upon the PHP/REST example I posted back in February. David comes from a C#/.Net background and was beginning to learn Ruby in order to use Adhearsion. Then, in his own words: &amp;#8220;&amp;#8230;I needed to leverage &amp;#8216;all the work&amp;#8217; done in .Net&amp;#8230;As I discovered, the marriage of .Net [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=410&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=410</guid>
         <pubDate>Mon, 08 Jun 2009 19:01:12 +0000</pubDate>
         <content:encoded><![CDATA[<p>Recently an <a rel="nofollow" target="_blank" href="http://adhearsion.com">Adhearsion</a> community member, David Lawal, built upon the <a rel="nofollow" target="_blank" href="http://blog.goecke.net/2009/02/20/using-php-to-invoke-the-adhearsion-api-via-rest/">PHP/REST example</a> I posted back in February. David comes from a <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)">C#</a>/<a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/.NET_Framework">.Net</a> background and was beginning to learn Ruby in order to use  Adhearsion. Then, in his own words:</p>
<blockquote><p>&#8220;&#8230;I needed to leverage &#8216;all the work&#8217; done in .Net&#8230;As I discovered, the marriage of .Net and Adhearsion was lovely, thanks to the <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a> <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Remote_procedure_call">RPC</a> [API of Adhearsion]&#8220;</p></blockquote>
<p>So David created an example and has graciously shared it with the rest of us. The example includes a component in Adhearsion that has this method extending the &#8216;methods_for :rpc&#8217;:</p>
<p><span id="more-410"></span><br />
<pre>
def launch_call_rpc(vars)
  ahn_log.ami vars   
  
  channel = vars[&quot;src&quot;]
  exten = vars[&quot;dest&quot;]
  options = { &quot;Channel&quot; =&gt; channel,
              &quot;Context&quot; =&gt;  &quot;callback&quot;,
              &quot;Exten&quot; =&gt;    exten,
              &quot;Priority&quot; =&gt; “1”,
              &quot;Callerid&quot; =&gt; “33333” }
  result = Adhearsion::VoIP::Asterisk.manager_interface.originate options
  
  ahn_log.ami &quot;status: call Queued&quot; 
  ahn_log.ami result   
end
</pre></p>
<p>Following the full <a rel="nofollow" target="_blank" href="http://github.com/jsgoecke/adhearsion_csharp_example">README and example here</a>, this C# code may then be used to invoke the Adhearsion REST API:</p>
<p><pre>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JSONSharp;
using System.Net;
using System.IO;

namespace adhearsion
{//adhearsion server is http://192.168.1.62:5000
    class Program
    {
        static void Main(string[] args)
        {
            Program.connect();
        }
        static void connect()
        {
            try
            {     
                ahnparams ahn = new ahnparams();
                ahn.src = @&quot;SIP/4031234567@192.168.1.200&quot;;
                ahn.dest = @&quot;7801234567&quot;;
                //Pass it to our static reflector, which will build
                JSONReflector jsonReflector = new JSONReflector(ahn);   //JSONSharp converts the class to JSON format
                //Console.WriteLine(jsonReflector.ToString());
                NetworkCredential myCred = new NetworkCredential(&quot;jicksta&quot;, &quot;roflcopterz&quot;);

                CredentialCache myCache = new CredentialCache();

                myCache.Add(new Uri(&quot;http://192.168.1.62:5000&quot;), &quot;Basic&quot;, myCred);


                WebRequest request = WebRequest.Create(&quot;http://192.168.1.62:5000/launch_call_rpc&quot;);
                request.Credentials = myCache;
                string postData = &quot;[&quot;+jsonReflector.ToString()+&quot;]&quot;;  //had to add the [] for it to work with restful_rpc just like php json
                Console.WriteLine(postData);
                request.Method = &quot;POST&quot;;
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                // Set the ContentType property of the WebRequest.
                request.ContentType = &quot;application/x-www-form-urlencoded&quot;;
                // Set the ContentLength property of the WebRequest.
                request.ContentLength = byteArray.Length;
                // Get the request stream.
                Stream dataStream = request.GetRequestStream();
                // Write the data to the request stream.
                dataStream.Write(byteArray, 0, byteArray.Length);
                // Close the Stream object.
                dataStream.Close();

                WebResponse response = request.GetResponse();
                // Display the status.
                Console.WriteLine(((HttpWebResponse)response).StatusDescription);
                // Get the stream containing content returned by the server.
                dataStream = response.GetResponseStream();
                // Open the stream using a StreamReader for easy access.
                StreamReader reader = new StreamReader(dataStream);
                // Read the content.
                string responseFromServer = reader.ReadToEnd();
                // Display the content.
                Console.WriteLine(responseFromServer);
                // Clean up the streams.
                reader.Close();
                dataStream.Close();
                response.Close();
            }
            catch (Exception e)
                {
                    throw e;
                }

        }
    }
}
</pre></p>
<p>This is a great example of the cross-platform capabilities of Adhearsion that you get for free via REST. You do not have to be a Ruby-ist to take advantage of adding voice capabilities to your web applications. You may use virtually any language and platform that may consume web services.</p>
<p>We definitely appreciate it when our community takes the time to share their Adhearsion experiences with the rest of us. Thanks David, and for the rest of you the full example with his README is available <a rel="nofollow" target="_blank" href="http://github.com/jsgoecke/adhearsion_csharp_example/">here</a>.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/410/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/410/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=410&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=XT6ibpZZ0mY:fW_Jnfi4uKc:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=XT6ibpZZ0mY:fW_Jnfi4uKc:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=XT6ibpZZ0mY:fW_Jnfi4uKc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=XT6ibpZZ0mY:fW_Jnfi4uKc:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/XT6ibpZZ0mY" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
      </item>
      <item>
         <title>Mashing up Tripit with Adhearsion</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/RPUMVHITl9I/</link>
         <description>A friend of mine in Barcelona who travels frequently, and runs his own business, recently asked me if he could tie his Tripit location to his business phone routing. Even when he is traveling across the Atlantic, he must be able to provide telephone support to his clients but only based on a reasonable time [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=403&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=403</guid>
         <pubDate>Fri, 22 May 2009 01:26:12 +0000</pubDate>
         <content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://tripit.com"><img class="alignright size-full wp-image-405" title="Picture 3" src="http://jsgoecke.files.wordpress.com/2009/05/picture-31.png?w=600" alt="Picture 3"/></a>A friend of mine in Barcelona who travels frequently, and runs his own business, recently asked me if he could tie his <a rel="nofollow" target="_blank" href="http://tripit.com">Tripit</a> location to his business phone routing. Even when he is traveling across the Atlantic, he must be able to provide telephone support to his clients but only based on a reasonable time in the timezone he is in.</p>
<p>Of course you could setup routing rules in your phone system each time you move to a new timezone, but good luck remembering to do this. Tripit now makes a <a rel="nofollow" target="_blank" href="http://www.tripit.com/uhp/helpFaq#bb0">blog badge</a> available that reports your current location based on city, state or country:</p>
<p><img class="aligncenter size-full wp-image-406" title="Picture 2" src="http://jsgoecke.files.wordpress.com/2009/05/picture-2.png?w=600&#038;h=227" alt="Picture 2" width="600" height="227"/>My <a rel="nofollow" target="_blank" href="http://github.com/jsgoecke/tripit">Tripit Adhearsion Comonponent</a> on <a rel="nofollow" target="_blank" href="http://github.com">Github</a> allows you to mashup the details from your badge and use them in your <a rel="nofollow" target="_blank" href="http://docs.adhearsion.com/display/adhearsion/Dialplan">dialplan</a>. Now, you may add this component to your project and add something like this to your Adhearsion dialplan:</p>
<p><pre>
adhearsion {
  user_time = tripit_user_time?('jdoe')
  if user_time
    ahn_log.tripit.debug user_time
  else
    ahn_log.tripit.debug 'Error'
  end
}
</pre></p>
<p>You may then use this information to decide whether to dial your mobile at your destination, or send it straight to voicemail. This is a great example of using Adhearsion to mashup data available on the web and use it to control your communications.</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/403/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=403&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=RPUMVHITl9I:uU_lI8RYdFs:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=RPUMVHITl9I:uU_lI8RYdFs:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=RPUMVHITl9I:uU_lI8RYdFs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=RPUMVHITl9I:uU_lI8RYdFs:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/RPUMVHITl9I" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/05/picture-31.png">
            <media:title type="html">Picture 3</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/05/picture-2.png">
            <media:title type="html">Picture 2</media:title>
         </media:content>
      </item>
      <item>
         <title>Adhearsion Website and Sandbox Migration Complete</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/ZfQHmm5ehV0/</link>
         <description>Over the last week we have been working to migrate various Adhearsion services to new homes. This could not have come a moment too soon, as during the migration one of the hard drives in our server in Texas gave up the ghost. Of course we used RAID, so we did not miss a beat, [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=380&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=380</guid>
         <pubDate>Tue, 07 Apr 2009 14:41:38 +0000</pubDate>
         <content:encoded><![CDATA[<p><img class="alignright size-full wp-image-381" title="sandbox1" src="http://jsgoecke.files.wordpress.com/2009/04/sandbox1.gif?w=600" alt="sandbox1"/>Over the last week we have been working to migrate various <a rel="nofollow" target="_blank" href="http://adhearsion.com">Adhearsion</a> services to new homes. This could not have come a moment too soon, as during the migration one of the hard drives in our server in Texas gave up the ghost. Of course we used <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/RAID">RAID</a>, so we did not miss a beat, but clearly it was time to move along.</p>
<p>To this end we have now migrated the Adhearsion <a rel="nofollow" target="_blank" href="http://adhearsion.com">website</a>, <a rel="nofollow" target="_blank" href="http://docs.adhearsion.com">wiki</a> and <a rel="nofollow" target="_blank" href="http://api.adhearsion.com">API docs</a> to <a rel="nofollow" target="_blank" href="http://aws.amazon.com/ec2/">Amazon EC2</a>. Leveraging <a rel="nofollow" target="_blank" href="http://aws.amazon.com/s3/">S3</a> and <a rel="nofollow" target="_blank" href="http://aws.amazon.com/ebs/">EBS</a> we have a great solution that allows us to quickly fire up more servers if and when needed. The cloud is great.</p>
<p>We have also moved the <a rel="nofollow" target="_blank" href="http://adhearsion.com/getting_started">Sandbox</a> to a new hosted server. <a rel="nofollow" target="_blank" href="http://www.voxeo.com"><img class="alignleft" title="Voxeo" src="http://www.voxeo.com/images/top/logo.gif" alt="" width="183" height="43"/></a>Our friends at <a rel="nofollow" target="_blank" href="http://voxeo.com">Voxeo</a> have provided a great server for us and are now sponsoring the Adhearsion Sandbox. It is great to have a <a rel="nofollow" target="_blank" href="http://tropo.com/">visionary</a> leader in the telephony cloud space involved with the Adhearsion community.</p>
<p>I would like to take this opportunity to remind folks what the Adhearsion Sandbox provides. We have provided a hosted system that takes away the need to install your own Asterisk to get started developing Adhearsion applications. Simply install Adhearsion, <a rel="nofollow" target="_blank" href="http://adhearsion.com/getting_started">sign-up for a Sandbox account</a> and get started writing apps. Our goal is to lower all the barriers to make it easy for developers to realize the possibilities of voice in modern web development.</p>
<p>Enjoy the new servers!</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/380/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=380&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=ZfQHmm5ehV0:WI28x_DMALc:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=ZfQHmm5ehV0:WI28x_DMALc:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=ZfQHmm5ehV0:WI28x_DMALc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=ZfQHmm5ehV0:WI28x_DMALc:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/ZfQHmm5ehV0" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
         <media:content medium="image" url="http://jsgoecke.files.wordpress.com/2009/04/sandbox1.gif">
            <media:title type="html">sandbox1</media:title>
         </media:content>
         <media:content medium="image" url="http://www.voxeo.com/images/top/logo.gif">
            <media:title type="html">Voxeo</media:title>
         </media:content>
      </item>
      <item>
         <title>Click to Call on stage with Sinatra, Rack and Passenger</title>
         <link>http://feedproxy.google.com/~r/WarheadsStackedInTheKitchen/~3/cVmZA7DwXMY/</link>
         <description>I have been preparing an Amazon Machine Image (AMI) with Adhearsion, Asterisk and all of the available components installed and pre-configured to be made public soon. For the AMI I decided to get the Sinatra web app included with the Click To Call component up and running as a daemon. I used a combination of [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&amp;#038;blog=3974561&amp;#038;post=371&amp;#038;subd=jsgoecke&amp;#038;ref=&amp;#038;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot;/&gt;</description>
         <guid isPermaLink="false">http://jsgoecke.wordpress.com/?p=371</guid>
         <pubDate>Fri, 03 Apr 2009 20:41:11 +0000</pubDate>
         <content:encoded><![CDATA[<p>I have been preparing an <a rel="nofollow" target="_blank" href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=171">Amazon Machine Image (AMI)</a> with Adhearsion, Asterisk and all of the available components installed and pre-configur<img class="alignright" src="http://www.modrails.com/images/site_body_eyecatcher_bg.png" alt="" width="327" height="145"/>ed to be made public soon. For the AMI I decided to get the <a rel="nofollow" target="_blank" href="http://www.sinatrarb.com/">Sinatra</a> web app included with the <a rel="nofollow" target="_blank" href="http://github.com/jsgoecke/restful_clicktocall">Click To Call</a> component up and running as a <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Daemon_(computer_software)">daemon</a>.</p>
<p>I used a combination of <a rel="nofollow" target="_blank" href="http://rack.rubyforge.org/">Rack</a> and <a rel="nofollow" target="_blank" href="http://www.modrails.com/">Passenger</a>, since they make the process so easy and production ready. To this end I have updated the README and Click To Call component I covered in my <a rel="nofollow" target="_blank" href="http://blog.goecke.net/2009/02/03/restful-click-to-call-with-adhearsion/">previous blog post</a> to include the how to and Rack configuration file required.</p>
<p>To get this up and running do the following:</p>
<ul>
<li>Install the Apache Webserver</li>
<li>sudo gem install rack</li>
<li>sudo gem install passenger (follow instructions <a rel="nofollow">here</a> for compiling the Apache module)</li>
</ul>
<p>Copy the files and directories in ~ahn-project/components/restful_clicktocall/web directory to the appropriate file system location for your Apache web server. Add these virtual host settings to your Apache configuration (ie &#8211; /etc/httpd/conf/httpd.conf):</p>
<p><pre>
&lt;VirtualHost *:80&gt;
  ServerName ec2-174-129-89-20.compute-1.amazonaws.com
  DocumentRoot /var/www/restful_clicktocall_web/public
&lt;/VirtualHost&gt;
</pre><br />
Change line three to reflect your configuration. Restart your Apache web server and then connect to the site you configured. For more options I recommend referring to the Passenger documentation found <a rel="nofollow" target="_blank" href="http://www.modrails.com/documentation/Users%20guide.html">here</a>.</p>
<p>Stay tuned for the upcoming Amazon Machine Image!</p>
<br />  <a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/jsgoecke.wordpress.com/371/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jsgoecke.wordpress.com/371/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jsgoecke.wordpress.com&#038;blog=3974561&#038;post=371&#038;subd=jsgoecke&#038;ref=&#038;feed=1" width="1" height="1"/><div class="feedflare">
<a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=yIl2AUoC8zA" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=dnMXMwOfBR0" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=cVmZA7DwXMY:Bol08Wc04J0:F7zBnMyn0Lo" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=cVmZA7DwXMY:Bol08Wc04J0:V_sGLiPBpWU" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?d=qj6IDK7rITs" border="0"></a> <a rel="nofollow" target="_blank" href="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?a=cVmZA7DwXMY:Bol08Wc04J0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/WarheadsStackedInTheKitchen?i=cVmZA7DwXMY:Bol08Wc04J0:gIN9vFwOqvQ" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/WarheadsStackedInTheKitchen/~4/cVmZA7DwXMY" height="1" width="1"/>]]></content:encoded>
         <media:content medium="image" url="http://1.gravatar.com/avatar/4f295d5bdebbf607ad32f7ce5036aded?s=96&amp;amp;d=identicon&amp;amp;r=G">
            <media:title type="html">jasongoecke</media:title>
         </media:content>
         <media:content medium="image" url="http://www.modrails.com/images/site_body_eyecatcher_bg.png"/>
      </item>
   </channel>
</rss>
<!-- fe2.yql.bf1.yahoo.com compressed/chunked Sat May 25 23:10:35 UTC 2013 -->
