Archive for December, 2008

The top 100 Blogs and top 50 Twitterers for developers

Wednesday, December 31st, 2008

‘Tis the season for lists, of course, and a colleague recently pointed me to two lists of resources out there for developers:

No, we’re not on either list… but regardless they are good lists of other folks out there writing about software and development. Kudos to Jurgen Appelo for taking the time to put these lists together.

Happy New Year to you all!


If you found this post interesting or helpful, please consider either subscribing via RSS or following on Twitter.



If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


New Early Access version of Prophecy 9 available

Tuesday, December 30th, 2008

If you have been experimenting with the Early Access version of Prophecy 9, or were thinking about trying it out, you should know that we just recently released a new early access version of P9 (9.0.32254) at:

http://www.voxeo.com/prophecy/

P9 is available for download now on Windows, Linux or Mac OS X.

PLEASE BE SURE TO READ THE RELEASE NOTES!

Particularly that part about, oh, how previous early access versions of P9 must be uninstalled first.

With this version, we move closer to providing full functionality. The release notes provide information about what is still in development.

NOTE: Based on reading the release notes, I have had a couple of people ask me about why we are removing CallXML and CCXML from Prophecy 9. We are very definitely NOT! What we have done is remove support for the older and deprecated CallXML 2.0 and what we called “CCXML Voxeo”, which was our interim implementation of CCXML while the specification was still being developed. CallXML is definitely there at the CallXML 3.0 specification and CCXML is there at the W3C-ratified CCXML 1.0 specification. No worries… we are still providing the best support in the industry for CCXML as well as our own CallXML.

If you are not familiar with Prophecy 9, you may find this overview blog post useful and/or our video screencast about the new management console.


If you found this post interesting or helpful, please consider either subscribing via RSS or following on Twitter.



If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


Leveraging a CCXML Wrapper for Post-call Cleanup

Wednesday, December 17th, 2008

The default CCXML wrapper that quietly powers many VoiceXML applications on Voxeo’s Prophecy platform is certainly sufficient for many simple applications. So why should I bother diving into yet another markup language to do re-invent the wheel? Because your application isn’t that simple and you’re a control freak. Or maybe I am. Who knows.

Typically, we can handle post-call cleanup in VoiceXML easily enough by using the <submit> or <data> elements to our server-side cleanup scripts.

  <catch event="connection.disconnect">
     <submit next="cleanup.php" method="POST"/>
  </catch>

While this is a valid way to handle this, VoiceXML requires that we either transfer control to another document(<submit>) or respond with valid XML(<data>). Instead, we can leverage the disconnect event and any other portion of the application that we’d like the call to end to send this data back to our CCXML handler and let it do all the work asynchronously. The bonus here is we can have unfettered control of our voice applications. Once we have this in place, it’s simple work to leverage CCXML to control call duration, pre/post-processing and more.

When using a custom CCXML wrapper to handle post-call cleanup, our VoiceXML disconnect handler will look something like this:

  <catch event="connection.disconnect">
     <exit namelist="my_var1 my_var2 my_var3"/>
  </catch>

Here we’re using the namelist attribute of <exit> to send back our values back to CCXML. We can now handle this inside our CCXML wrapper with a dialog.exit transition:

  <transition event="dialog.exit">
    <log expr="'**** DIALOG COMPLETE - SENDING POST CALL CLEANUP'"/>
    <assign name="dialog_active" expr="false"/>
      <log expr="'my_var1 = ' + event$.values.my_var1"/>
      <log expr="'my_var2 = ' + event$.values.my_var2"/>
      <log expr="'my_var3 = ' + event$.values.my_var3"/>
      <assign name="my_var" expr="event$.values.my_var1"/>
      <!-- sends a POST to our cleanup script -->
    <disconnect connectionid="conn_id"/>
      <send name="'user.call.cleanup'" target="'cleanup.php'" targettype="'basichttp'" namelist="my_var1"/>
  </transition>

The values of our VXML variables are stored in the object event$.values. We can then grab them from the event$.values object by referencing them as event$.values.variablename – in this case, event$.values.my_var1. Since our VoiceXML dialog is complete, we’re ready to end the call. We issue a disconnect to the caller’s connectionid and send our post call cleanup. CCXML’s <disconnect>, unlike VoiceXML’s, physically disconnects the call leg. So now the call leg is ended, we’re free to handle our post-processing without paying to keep that call leg up. Brilliant!

Now that we’ve shot off our post-processing request, we can handle the send.successful event and close the session out, right? Well, we could do that, but how do we know the request was received successfully? Note, this next portion is a Voxeo specific extension and is not part of the W3C spec and requires the Voxeo namespace - <ccxml version=”1.0″ xmlns:voxeo=”http://community.voxeo.com/xmlns/ccxml”>.

Instead of assuming everything went swimmingly with our post-processing, we can be sure by having our server-side send back an event to the CCXML browser if we format the body of the response like this:

  user.cleanup.successful
  my_var1=foo
  my_var2=bar

Note that we can inject not only an event here, but name/value pairs, though they are entirely optional. Now that my server side has responded, with an event, I’ll need to handle this in my CCXML:

  <transition event="user.cleanup.successful">
    <log expr="'**** POST CALL CLEANUP COMPLETED SUCCESSFULLY'"/>
    <log expr="'**** EXITING SESSION'"/>
     <exit/>
  </transition>

Last, but very definitely not least, we will want to ensure our session does not stay alive after the call leg has disconnected. Since we are doing a little post-processing, we don’t want to end the session immediately, as we’ll want to give that time to process. So, we’ll simply shoot off a delayed user event to kill the session 60 seconds after a disconnect and prevent the zombie apocalypse.

  <transition event="connection.disconnected">
     <!-- send to unconditionally end a runaway session -->
     <send name="'user.kill.unconditional'" target="session.id" delay="'60s'"/>
  </transition>

  <transition event="user.kill.unconditional">
     <log expr="'**** UNCONDITIONAL KILL - EXITING SESSION'"/>
       <exit/>
  </transition>

That’s it. Find the complete CCXML below.

<?xml version="1.0"?>
<ccxml version="1.0" xmlns:voxeo="http://community.voxeo.com/xmlns/ccxml">

      <meta name="author" content="Dustin Hayre"/>
      <meta name="maintainer" content="YOUR_EMAIL@HERE.COM"/>

<!-- how long to wait before assuming a session is a runaway and tearing it down -->
<var name="conn_id"/>
<var name="dialog_id"/>
<var name="my_var"/>

<eventprocessor>
  <transition event="connection.alerting">
    <assign name="conn_id" expr="event$.connectionid"/>
    <accept connectionid="conn_id"/>
  </transition>

  <transition event="connection.connected">
    <log expr="'**** STARTING DIALOG TO CONNECTION ID ' + conn_id"/>
     <!-- edit SRC attribute to point to VXML dialog -->
     <dialogstart src="'dialog.vxml'" connectionid="conn_id" dialogid="dialog_id"/>
  </transition>

  <transition event="dialog.exit">
    <log expr="'**** DIALOG COMPLETE - SENDING POST CALL CLEANUP'"/>
      <log expr="'event$.values.my_var1 = ' + event$.values.my_var1"/>
      <assign name="my_var" expr="event$.values.my_var1"/>
      <!-- sends a POST to our cleanup script -->
      <send name="'user.call.cleanup'" target="'cleanup.php'" targettype="'basichttp'" namelist="foo"/>
  </transition>

  <transition event="user.cleanup.successful">
    <log expr="'**** POST CALL CLEANUP COMPLETED SUCCESSFULLY'"/>
    <log expr="'**** EXITING SESSION'"/>
     <exit/>
  </transition>

  <transition event="error.*">
    <log expr="'**** ERROR - REASON: ' + event$.reason"/>
      <exit/>
  </transition>

  <transition event="connection.disconnected">
     <!-- send to unconditionally end a runaway session -->
     <send name="'user.kill.unconditional'" target="session.id" delay="'60s'"/>
  </transition>

  <transition event="user.kill.unconditional">
     <log expr="'**** UNCONDITIONAL KILL - EXITING SESSION'"/>
       <exit/>
  </transition>

  <transition event="connection.failed">
    <log expr="'**** CONNECTION FAILED - REASON: ' + event$.reason"/>
      <exit/>
  </transition>

</eventprocessor>
</ccxml>

Feel free to comment with any questions or suggestions.

-Dustin


If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


What the VoiceObjects acquisition by Voxeo means for voice application developers…

Tuesday, December 9th, 2008

VoiceObjectslogo.jpgWhat if there was an easier way to develop large-scale voice applications? What if there was a way to develop voice apps that fit in with many of your existing developer tools? What if you could write voice apps in a way that allowed you to easily re-use your components?

Today, we here at Voxeo are delighted to bring you such a solution through our acquisition of VoiceObjects, the world’s leading provider of self-service application development and analytics solutions.

For a brief intro, you can watch an Emerging Tech Talk video podcast where I interviewed VoiceObjects co-founder and CTO Michael Codini this morning about the acquisition.

From a developer point of view, VoiceObjects offers a very strong set graphical design tools based on the Eclipse development platform. Creating very advanced voice applications is now a very simple process – and you do have ways to easily re-use existing components, to link to external services and much, much more.

VoiceObjects provides a free download of their developer edition on their developers.voiceobjects.com developer portal. They also provide a wealth of great information to help developers get started:

We encourage our developers to check out all that information and to download and try out the VoiceObjects software. You can be sure that we’ll be posting more information, guides, screencasts/webcasts and so much more over the weeks and months ahead.

If you have any questions about this news, please feel free to leave a response to this post or to email me directly.

One final note – I have had a few people ask how this acquisition affects our Prophecy Designer tool. It doesn’t. Designer is a great tool for quickly and easily designing voice applications and it will continue to be part of our offerings. VoiceObjects now just brings some more advanced capabilities to build even larger and more complex voice applications. Being Eclipse-based, VoiceObjects also fits very nicely into customers’ development environments where they are already using Eclipse.

As I said, if you do have more questions, please feel free to send them along or post them here. We’re very excited about the acquisition and looking forward to the many great applications the combined companies will enable you to create!

Technorati Tags: , , , ,


If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.


SIPMethod 4.0 has been released

Monday, December 1st, 2008

SIPMethod Application Server 4.0 has been officially released. SIPMethod Application Server 4.0 is compliant with the new SIP Servlet Specification 1.1 and has passed the TCK.

SIPMethod 4.0 fully supports converged multi-model applications – mixing web, VoIP and web services capabilities in a single application. It supports SIP Servlet Specification 1.1, Java Servlet Specification 2.5 and Java API for Web Services 2.0.

SIPMethod 4.0 comes with the all-new Web Console to allow you easily manage and monitor the server and applications.

For production environment, SIPMethod 4.0 can be deployed as in clusters to provide high availability and load balance.

SIPMethod Application Server 4.0 can be downloaded for 30 day evaluation.


If you found this post interesting or helpful, please consider either subscribing via RSS, becoming a fan on Facebook, or following us on Twitter.