<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-7061944</id><updated>2009-11-10T08:06:43.435-08:00</updated><title type="text">(The Scheme Way)</title><subtitle type="html">A blog on Scheme, Erlang, and voice application development.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://theschemeway.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default?start-index=26&amp;max-results=25" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>188</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/blogspot/schemeway" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-7061944.post-2346551101530272067</id><published>2009-11-06T19:44:00.000-08:00</published><updated>2009-11-06T19:49:13.491-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="network servers" /><category scheme="http://www.blogger.com/atom/ns#" term="mslug" /><category scheme="http://www.blogger.com/atom/ns#" term="lisp" /><title type="text">Vladimir Sedach on high-performance network servers in Lisp</title><content type="html">At our upcoming meeting of the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;Montreal Scheme/Lisp User Group&lt;/a&gt; (MSLUG) on Tuesday, November 17th, &lt;a href="http://carcaddar.blogspot.com/"&gt;Vladimir Sedach&lt;/a&gt; will talk about developing high-performance network servers in Lisp. Here is the abstract:&lt;br /&gt;&lt;blockquote&gt;This talk will cover techniques for developing high-performance network servers in Lisp, with examples and lessons from the TPD2, Antiweb, and the speaker's own soon-to-be-released&lt;br /&gt;Common Lisp HTTP servers. Topics covered will include techniques for efficient input handling and output generation, vectored IO, thread pool design, and asynchronous IO management using continuations and state machines.&lt;/blockquote&gt;&lt;br /&gt;See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2346551101530272067?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/2346551101530272067/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=2346551101530272067&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/2346551101530272067" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/2346551101530272067" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/gA5lRKkSBU4/vladimir-sedach-on-high-performance.html" title="Vladimir Sedach on high-performance network servers in Lisp" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/11/vladimir-sedach-on-high-performance.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2835252166172525712</id><published>2009-10-25T18:28:00.000-07:00</published><updated>2009-10-27T07:16:10.712-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web server" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="yaws" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><title type="text">Dynamically setting the Yaws log level</title><content type="html">Debugging a web-based application is more often than not done by first analyzing log files. Even when you can attach a REPL to a running application. They are an integral part of the developer's tool set.&lt;br /&gt;&lt;br /&gt;But production applications usually do not enable tracing by default, because this could degrade performance and waste essential resources (memory, CPU time, disk, etc.). Would you dump the content of every HTTP request received by a web server on disk? Of course, when problems occur, trace level is simply raised, with the hope that the logs will contain some useful debugging info.&lt;br /&gt;&lt;br /&gt;With the &lt;a href="http://yaws.hyber.org/"&gt;Yaws&lt;/a&gt; Erlang-based web server, the log level can be set programmatically like this:&lt;br /&gt;&lt;pre&gt;-module(my_yaws_utils).&lt;br /&gt;-export([set_yaws_trace_level/1]).&lt;br /&gt;&lt;br /&gt;set_yaws_trace_level(Level) -&gt;&lt;br /&gt;  {ok, GC, Groups} = yaws_api:getconf(),&lt;br /&gt;  yaws_config:hard_setconf(GC#gconf{trace=Level}, Groups).&lt;/pre&gt;&lt;br /&gt;with &lt;code&gt;Level&lt;/code&gt; being either &lt;code&gt;none&lt;/code&gt;, &lt;code&gt;{true, http}&lt;/code&gt;, or &lt;code&gt;{true, traffic}&lt;/code&gt;. The first value disables tracing, the second enables tracing of the HTTP requests in file &lt;code&gt;trace.http&lt;/code&gt;, while the last enables tracing of the whole traffic (requests and responses).&lt;br /&gt;&lt;br /&gt;It is certainly possible to attach to the Yaws server from another Erlang node to call this function. But if your application is administered by someone not really used to Erlang, it may be more appropriate to provide a command-line script for that purpose.&lt;br /&gt;&lt;br /&gt;Basically, the script would connect to the Yaws node (named &lt;code&gt;yaws_daemon@lelouch&lt;/code&gt;) and invoke the function with the appropriate log level:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;node=yaws_daemon@lelouch&lt;br /&gt;# we should check the number of arguments to the script here...&lt;br /&gt;case $1 in&lt;br /&gt;  none) level=none;;&lt;br /&gt;  http) level="{true, http}";;&lt;br /&gt;  traffic) level="{true, traffic}"&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;erl -sname trace_script -noinput \&lt;br /&gt;    -setcookie &lt;span style="font-style: italic;"&gt;ErlangCookie&lt;/span&gt; \&lt;br /&gt;    -eval "rpc:call($node, my_yaws_utils, set_yaws_trace_level, [$level])." \&lt;br /&gt;    -s init stop&lt;/pre&gt;&lt;br /&gt;The call to &lt;code&gt;rpc:call&lt;/code&gt; does the actual RPC call to set the log level on the Yaws server.&lt;br /&gt;&lt;br /&gt;The cool thing is the fact that this technique can be applied to a whole bunch of other utility tools, like scripts to stop the server, to reload the application configuration, etc. And this applies to all Erlang applications as well, this is in no way specific to Yaws. &lt;br /&gt;&lt;br /&gt;And there are probably other ways to do the same thing. Let me know if you have a better solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2835252166172525712?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/2835252166172525712/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=2835252166172525712&amp;isPopup=true" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/2835252166172525712" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/2835252166172525712" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/cwJteszAIF0/dynamically-setting-yaws-log-level.html" title="Dynamically setting the Yaws log level" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/10/dynamically-setting-yaws-log-level.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-9086556124156397561</id><published>2009-10-19T16:32:00.000-07:00</published><updated>2009-10-20T06:07:53.181-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="schemescript" /><title type="text">SchemeScript 1.3.0.alpha9</title><content type="html">On the &lt;a href="http://schemeway.sourceforge.net/"&gt;SchemeWay&lt;/a&gt; blog, I posted an &lt;a href="http://sourceforge.net/apps/wordpress/schemeway/2009/10/19/schemescript-1-3-0-alpha9/"&gt;entry&lt;/a&gt; describing the latest features I have added to SchemeScript. In particular, I have modified the indentation strategy for comments. SchemeScript now behaves more like the Emacs Scheme mode. I have also added some support for the Clojure maps syntax. I wrote some Clojure code lately and desperately needed that feature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-9086556124156397561?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/9086556124156397561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=9086556124156397561&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/9086556124156397561" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/9086556124156397561" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/hiwJ_FiwEEs/schemescript-130alpha9.html" title="SchemeScript 1.3.0.alpha9" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/10/schemescript-130alpha9.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-918813913847143044</id><published>2009-09-11T17:34:00.000-07:00</published><updated>2009-09-11T19:02:00.826-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="web service" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><title type="text">Accessing HTTP/JSON services with JVM-based languages</title><content type="html">Lately, I have been working on a number of client APIs for a REST-like service &lt;a href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt; offers for &lt;a href="http://www.grammarserver.com/"&gt;managing dynamic speech recognition grammars&lt;/a&gt;. (The APIs will soon be available on github.) This experience made me realize how difficult it is to provide an API in different programming languages using only the core language (i.e. without having to depend on third-party libraries).&lt;br /&gt;&lt;br /&gt;To put you in context, my goal was to provide the same API for accessing an web-based, REST-like service in Java, JavaScript (ECMAScript), Python/Jython, Ruby/JRuby, and eventually Groovy and Clojure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First problem: Base64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since the web service uses Basic Authorization on most HTTP requests, the username:password string must be encoded using the Base64 algorithm before being added to the HTTP headers. Believe it or not, there is no standard public class in Java to encode/decode Base64 strings. Fortunately, most scripting languages provide one. Except JavaScript (rhino in my case). So I had to include an implementation of the Base64 algorithm in both the Java API and the JavaScript API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Second problem: JSON&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For simplicity, and the best integration possible with JavaScript, the web service can encode its responses in &lt;a href="http://json.org"&gt;JSON&lt;/a&gt; format instead of XML. (The service was first intended to be used from VoiceXML applications, whose scripting language is ECMAScript.) I thought it would be relatively easy to encode/decode data structures in JSON in all the languages I wanted to support. WRONG!&lt;br /&gt;&lt;br /&gt;Of course, Java does not have native JSON support. But I knew that from the start. So no surprise there. And JavaScript, through the &lt;span style="font-family: courier new;"&gt;eval&lt;/span&gt; function, supports JSON natively. Again, no surprise.&lt;br /&gt;&lt;br /&gt;The first real surprise came from Python. There is no default JSON library that comes with Python 2.5/2.6 (I haven't tried Python 3). I had to install the &lt;a href="http://code.google.com/p/simplejson"&gt;simplejson&lt;/a&gt; library (which is very nice btw). Unfortunately, it cannot run on Jython 2.2, only on Jython 2.5. Since one of my goals was to run the APIs on &lt;a href="http://tropo.com"&gt;Tropo&lt;/a&gt;, which only supports Jython 2.2, I had a difficult choice to make. I even tried to simply convert Python dictionaries to strings. But although the Python syntax for constant values is very close to JSON, it uses single quotes instead of double quotes for encoding dictionary keys. (The Python constant {'a': 1, 'b': 2} is written as {"a":1, "b": 2} in JSON.)&lt;br /&gt;&lt;br /&gt;In the end, I decided to stick with simplejson for greater portability. (The Tropo guys will probably upgrade to Jython 2.2 one of these days.)&lt;br /&gt;&lt;br /&gt;On the Ruby side, there is no standard JSON library. You have to install the 'json' Ruby gem. But it is really easy to install in both Ruby and JRuby. My main complaint is that it is not installed by default with [J]Ruby. And services like Tropo do not necessarily provide all the Ruby gems. (They do provide the 'json' gem, to my greatest surprise.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When designing NuGram Hosted Server's web service, I thought it would really straightforward to provide APIs in most (scripting) languages running on the JVM. HTTP + Basic Authentication + JSON seemed so &lt;span style="font-style: italic;"&gt;en vogue&lt;/span&gt;... But clearly, it was harder than expected and the code had to depend on classes/modules that don't come with the core language or the standard library.&lt;br /&gt;&lt;br /&gt;I strongly believe that JSON should be more widely supported (natively) by all the major scripting languages, much as XML is. Their own syntax for constant data structures (maps, strings, arrays) is so close to JSON that they should encourage people to use JSON instead of XML. Or at least not discourage its use.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer:&lt;/span&gt; I am fairly new to most JVM-based scripting languages: Python, Ruby, Groovy. I may have missed something trivial. If so, please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-918813913847143044?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/918813913847143044/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=918813913847143044&amp;isPopup=true" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/918813913847143044" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/918813913847143044" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/lQWVDstUSWI/accessing-httpjson-services-with-jvm.html" title="Accessing HTTP/JSON services with JVM-based languages" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/09/accessing-httpjson-services-with-jvm.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1978732112569430442</id><published>2009-09-02T18:57:00.000-07:00</published><updated>2009-09-02T19:34:53.961-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voxeo" /><category scheme="http://www.blogger.com/atom/ns#" term="voicexml" /><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="yaws" /><category scheme="http://www.blogger.com/atom/ns#" term="blogging" /><category scheme="http://www.blogger.com/atom/ns#" term="IM" /><category scheme="http://www.blogger.com/atom/ns#" term="IMified" /><title type="text">Back to our regular program</title><content type="html">Wow! I'm back from vacation, summer is (almost) over, &lt;a href="http://www.speechtek.com/"&gt;SpeechTEK 2009&lt;/a&gt; is over, kids are back to school. Hope I'll finally have some spare time for small pet projects. &lt;br /&gt;&lt;br /&gt;In particulary, I'll try to continue working on a small &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt; framework for developing communication applications that can be used across several channels: phone, IM, web. I used it for developing demos I gave at SpeechTEK.&lt;br /&gt;&lt;br /&gt;The framework offers a simple synchronous API to write dialog-based applications, à la &lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt;. In a matter of days (thanks to Erlang, &lt;a href="http://yaws.hyber.org/"&gt;Yaws&lt;/a&gt;, and &lt;a href="https://support.process-one.net/doc/display/EXMPP/exmpp+home"&gt;exmpp&lt;/a&gt;), I have been able to make the framework&lt;br /&gt;&lt;ul&gt;&lt;li&gt;generate VoiceXML for the &lt;a href="http://www.voxeo.com/"&gt;Voxeo&lt;/a&gt; platform,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;interact with &lt;a href="http://www.imified.com/"&gt;IMified&lt;/a&gt; and &lt;a href="http://ejabberd.im/"&gt;ejabberd&lt;/a&gt;,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;do some outbound calling by interfacing to the Asterisk gateway interface, and&lt;/li&gt;&lt;li&gt; use &lt;a href="http://www.grammarserver.com/"&gt;NuGram Hosted Server&lt;/a&gt; for dynamic grammar generation and semantic interpretation of text-based interactions.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And a few more things. (I'll blog about this framework on our corporate blog in the upcoming weeks.)&lt;br /&gt;&lt;br /&gt;I used the framework to develop a complete application for monitoring web sites. When a web site fails to answer, the application tries to reach me. It first tries to reach me on my preferred IM account. If I'm not available, it then tries to call me. If I don't answer, it sends me an SMS message. I also have a web interface that mimics an IM client.&lt;br /&gt;&lt;br /&gt;This is, IMO, a very cool project. Unfortunately, most of the code I wrote has been completely obsoleted by some of the recent Voxeo announcements (&lt;a href="http://blogs.voxeo.com/tropo/2009/08/25/add-sms-and-im-to-any-existing-tropo-application-in-ruby-python-php-javascript-or-groovy-today/"&gt;here&lt;/a&gt; and &lt;a href="http://blogs.voxeo.com/voxeotalks/2009/08/25/unlocking-communications-with-voxeos-prophecy-10/"&gt;here&lt;/a&gt;): their Prophecy platform and Tropo can now be used for text-based channels... Unless you want to run everything on your own server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1978732112569430442?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/1978732112569430442/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=1978732112569430442&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1978732112569430442" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1978732112569430442" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/vtsFobLKDiE/back-to-our-regular-program.html" title="Back to our regular program" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/09/back-to-our-regular-program.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8372307206898316311</id><published>2009-07-07T04:37:00.000-07:00</published><updated>2009-07-07T04:46:30.567-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="schemescript" /><title type="text">SchemeScript: git and wordpress</title><content type="html">In the last few days, I migrated the CVS repository of the &lt;a href="http://schemeway.sourceforge.net"&gt;SchemeScript&lt;/a&gt; plugin to git. We have started experimenting with git at work and I thought it would be a good idea to use it for my personal projects too. &lt;br /&gt;&lt;br /&gt;Also, the web page for the project was old, ugly, and clearly not up-to-date. So I switched to Wordpress. This will ease the maintenance of the site. This is where I will post news announcements, describe features, try to create some buzz (!), etc.&lt;br /&gt;&lt;br /&gt;I hope this is all for the best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8372307206898316311?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/8372307206898316311/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=8372307206898316311&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8372307206898316311" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8372307206898316311" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/9M_a8I7MX-E/schemescript-git-and-wordpress.html" title="SchemeScript: git and wordpress" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/07/schemescript-git-and-wordpress.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-743360657567470276</id><published>2009-05-23T04:56:00.000-07:00</published><updated>2009-05-26T10:35:51.088-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="tropo" /><category scheme="http://www.blogger.com/atom/ns#" term="voice applications" /><title type="text">My first Tropo JavaScript application</title><content type="html">As promised in a &lt;a href="http://theschemeway.blogspot.com/2009/05/voicephp-and-tropo-first-impressions.html"&gt;previous post&lt;/a&gt;, I will show you the code of my first &lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt; application, a simple voice application that gives me the status of the web sites I maintain and monitor.&lt;br /&gt;&lt;br /&gt;Why such an application? Well, I have a Python script that pings my web sites every half hour (a simple HTTP GET request to the site's entry point). But sometimes the latency is so high that the script believes the site is down. So I receive an SMS on my cell phone. If I'm outside the office or home, I cannot check whether there is a real problem or not. So I decided to write a very simple voice application I could call from anywhere.&lt;br /&gt;&lt;br /&gt;The VUI (voice user interface) of the application is simple: it asks me for a site name and, on a valid choice, makes an HTTP request to ping the site again. If the response code is 200, it tells me that the site is up and running, otherwise it tells me the site is down. The application loops and asks me for a site name again. At any time, I can ask for help by saying "what are my options" or "help me", or I can quit by either hanging up or say "quit".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The main application&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The main part of the application begins with the initialization of a number of global variables:&lt;br /&gt;&lt;pre&gt;var sitesUrl = "http://schemeway.dyndns.org/voiceapps/sites.json";&lt;br /&gt;var sites = JSON.parse(http_request(sitesUrl, 'GET'));&lt;br /&gt;&lt;br /&gt;var grammar = buildGrammar(sites);&lt;br /&gt;var helpOption = sites.length;&lt;br /&gt;var quitOption = sites.length + 1;&lt;br /&gt;&lt;br /&gt;var helpPrompt = buildHelpPrompt(sites);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;sitesUrl&lt;/code&gt; variable holds the URL of a JSON document giving the names and URLs of the sites I can ping. The &lt;code&gt;grammar&lt;/code&gt; variable holds a string representation of the grammar used for speech recognition (in a Tropo-specific syntax). Finally, &lt;code&gt;helpPrompt&lt;/code&gt; holds a TTS (text-to-speech) string for the help message.&lt;br /&gt;&lt;br /&gt;Once the variables are initialized, the application answers the call and play a welcome message (calls to the Tropo API are in bold):&lt;br /&gt;&lt;pre&gt;&lt;b&gt;answer();                                                                                                                                                                 &lt;br /&gt;say("Hi! Welcome to the web site monitoring application.");&lt;/b&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It then enters a loop that repeatedly asks for a site name and handles the outcome of the interaction:&lt;br /&gt;&lt;pre&gt;var exit = false;&lt;br /&gt;while (!exit) {&lt;br /&gt; &lt;b&gt;ask("Choose a site.", {&lt;/b&gt;&lt;br /&gt;   choices: grammar,&lt;br /&gt;   maxTime: 10,&lt;br /&gt;   onChoice: function(choice) {&lt;br /&gt;     if (choice.value == helpOption) {&lt;br /&gt;        &lt;b&gt;say (helpPrompt);&lt;/b&gt;&lt;br /&gt;        return;&lt;br /&gt;     }&lt;br /&gt;     else if (choice.value == quitOption)  {&lt;br /&gt;        &lt;b&gt;say("Thanks for calling!");&lt;/b&gt;&lt;br /&gt;        exit = true;&lt;br /&gt;        return;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     var site = new Site(sites[choice.value]);&lt;br /&gt;     &lt;b&gt;say("The application " + site.name + " is ");&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;     var responseCode = site.test().status;&lt;br /&gt;     if (responseCode == 200) {&lt;br /&gt;       &lt;b&gt;say("up and running.");&lt;/b&gt;&lt;br /&gt;     }&lt;br /&gt;     else {&lt;br /&gt;       &lt;b&gt;say("not reachable. The response code is " + responseCode + ".");&lt;/b&gt;&lt;br /&gt;     }&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   onBadChoice: function() {&lt;br /&gt;       &lt;b&gt;say("Please try again.");&lt;br /&gt;       say(helpPrompt);&lt;/b&gt;&lt;br /&gt;   },&lt;br /&gt;&lt;br /&gt;   onTimeout: function() {&lt;br /&gt;       &lt;b&gt;say(helpPrompt);&lt;/b&gt;&lt;br /&gt;   }&lt;br /&gt; });&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;ask&lt;/code&gt; function takes as its second argument a set of options, like the grammar, various timeouts, and callback functions. For example, when a valid choice has been made, the &lt;code&gt;onChoice&lt;/code&gt; property is called with a single argument, the selected choice. The &lt;code&gt;onBadChoice&lt;/code&gt; callback is called when the caller says something that is not covered by the grammar (a "no match"), while the &lt;code&gt;onTimeout&lt;/code&gt; callback is called when the caller says nothing (what we usually call a "no input").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Some helper functions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The functions used to create the grammar and the help prompt are given here:&lt;br /&gt;&lt;pre&gt;function buildGrammar(sites) {&lt;br /&gt;  var grammar = "";&lt;br /&gt;  var index = 0;&lt;br /&gt;  for(index in sites) {&lt;br /&gt;    var site = sites[index];&lt;br /&gt;    grammar += (", " + index + "(" + index + ", " + site.name + ")");&lt;br /&gt;  }&lt;br /&gt;  grammar += (", " + (++index) + "(what are my options, help, help me)");&lt;br /&gt;  grammar += (", " + (++index) + "(bye, quit)");&lt;br /&gt;  grammar = grammar.substring(1);&lt;br /&gt;  return grammar;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function buildHelpPrompt(sites) {&lt;br /&gt;  var prompt = "Your options are: ";&lt;br /&gt;  var index = 0;&lt;br /&gt;  for(index in sites) {&lt;br /&gt;    var site = sites[index];&lt;br /&gt;    prompt += (site.name + ", ");&lt;br /&gt;  }&lt;br /&gt;  prompt += "help me, or quit.";&lt;br /&gt;  return prompt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally, the &lt;code&gt;Site&lt;/code&gt; constructor function and the &lt;code&gt;test&lt;/code&gt; property are given here:&lt;br /&gt;&lt;pre&gt;function Site(obj) {&lt;br /&gt;  this.name = obj.name;&lt;br /&gt;  this.url = obj.url;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Site.prototype.test = function () {&lt;br /&gt;  var connection = (new java.net.URL(this.url)).openConnection();&lt;br /&gt;  connection.setConnectTimeout(3000);&lt;br /&gt;  var responseCode = 500;&lt;br /&gt;  try {&lt;br /&gt;    responseCode = connection.getResponseCode();&lt;br /&gt;    connection.disconnect();&lt;br /&gt;  }&lt;br /&gt;  catch (e) {&lt;br /&gt;  }&lt;br /&gt;  return {status: responseCode};&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The whole source code can be accessed &lt;a href="http://schemeway.dyndns.org/voiceapps/appstatus.js"&gt;here&lt;/a&gt;. Feel free to comment, suggest enhancements, or even steal my code!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2006-05-26 11AM EST) Update:&lt;/b&gt; My home internet access seems flacky today, so the above link may not work. Stay tuned, I am working on getting it back to normal.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2006-05-26 1PM EST) Update:&lt;/b&gt; The link should be working now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-743360657567470276?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/743360657567470276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=743360657567470276&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/743360657567470276" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/743360657567470276" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/vQ79JylJUuw/my-first-tropo-javascript-application.html" title="My first Tropo JavaScript application" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/05/my-first-tropo-javascript-application.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8366092811560537270</id><published>2009-05-12T06:12:00.000-07:00</published><updated>2009-08-23T04:27:34.992-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web server" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="gambit-c" /><title type="text">A new module system for Gambit-C</title><content type="html">&lt;a href="http://andrewwhaley.blogspot.com/"&gt;Andrew Whaley&lt;/a&gt; commented on my post titled "&lt;a href="http://theschemeway.blogspot.com/2007/03/erlang-or-gambit-ctermite-practitioners.html"&gt;Erlang or Gambit-C: A practitioner's perspective&lt;/a&gt;"&lt;br /&gt;&lt;blockquote&gt;As a slight update to the situation, we now have the fantastic &lt;a href="http://dynamo.iro.umontreal.ca/%7Egambit/wiki/index.php/Black_Hole"&gt;Black Hole module system for Gambit&lt;/a&gt; that includes both a continuations web server and a web client that addresses your point 8. Also I have recently released a pure &lt;a href="http://dynamo.iro.umontreal.ca/%7Egambit/wiki/images/7/79/Gambit-mysql.zip"&gt;Scheme mySQL interface for Gambit&lt;/a&gt; that addresses point 5.&lt;br /&gt;So whilst it may not be Erlang yet - it's edging in the right direction.&lt;br /&gt;&lt;/blockquote&gt;Sounds promising!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: Black Hole is now on github: &lt;a href="http://github.com/pereckerdal/blackhole/tree/master"&gt;http://github.com/pereckerdal/blackhole/tree/master&lt;/a&gt; and the documentation can be found on the Gambit-C &lt;a href="http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Black_Hole"&gt;wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8366092811560537270?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/8366092811560537270/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=8366092811560537270&amp;isPopup=true" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8366092811560537270" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8366092811560537270" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/lUWSFpGalwA/new-module-system-for-gambit-c.html" title="A new module system for Gambit-C" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/05/new-module-system-for-gambit-c.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6735972138162307012</id><published>2009-05-11T22:00:00.000-07:00</published><updated>2009-05-11T19:16:38.608-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tropo" /><category scheme="http://www.blogger.com/atom/ns#" term="voice applications" /><category scheme="http://www.blogger.com/atom/ns#" term="voicephp" /><title type="text">VoicePHP and Tropo - first impressions</title><content type="html">In a &lt;a href="http://theschemeway.blogspot.com/2009/05/voicexml-vs-scripting-approach.html"&gt;previous post&lt;/a&gt;, I discussed a number of issues regarding the scripting approach taken by a number of new telephony platforms. But my opinions were somewhat uninformed, as they were based solely on the provided documentation and not on real experience with those platforms.&lt;br /&gt;&lt;br /&gt;So I decided to try two of them: &lt;a href="http://www.voicephp.com/"&gt;VoicePHP&lt;/a&gt; and &lt;a href="http://www.tropo.com/"&gt;Tropo&lt;/a&gt;. Here are my first impressions. (These are not necessarily profound thoughts, since I played with both platforms for a few hours each.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;VoicePHP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;VoicePHP is a voice platform provided by &lt;a href="http://tringme.com/"&gt;TringMe&lt;/a&gt;, an Indian company. To use it you have to register for a 7 day beta period.&lt;br /&gt;&lt;br /&gt;As its name implies, voice applications are written in PHP. You configure the script URL in your TringMe account and call the application. You have to host your scripts on your own web server.&lt;br /&gt;&lt;br /&gt;To call the application, TringMe offers several choices:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Call a provided phone number in the US. (I reside in Canada, so it's a no go for me. I don't want to make long distance calls  just to test small script changes.)&lt;/li&gt;&lt;li&gt;Call using a standard SIP phone. That's what I did. Works quite well.&lt;/li&gt;&lt;li&gt;Call the application using a Flash-based widget on a web page. That's really cool. Makes it very easy to develop a voice application and make it available to a large audience.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I tried to implement a small sample application making use of voice recognition. VoicePHP is supposed to support ABNF grammars. Unfortunately, all I got were "no match" events (or were they?). So I didn't get very far. Since there is no debugger or log files I can inspect, I quickly abandoned without knowing whether the fault was mine or not. The platform may be great for DTMF applications, but support for speech recognition did not convince me. And documentation is very light.&lt;br /&gt;&lt;br /&gt;At least, their support team was quick at answering my questions. So I'm sure VoicePHP will get better over time. But for now, they did not convince me that the approach is superior to VoiceXML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tropo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tropo is a voice platform in the cloud, provided by &lt;a href="http://www.voxeo.com/"&gt;Voxeo&lt;/a&gt;, a Florida-based company. It's kind of a GoogleApp Engine for voice applications. It offers support for five scripting languages: PHP, Python, Ruby, JavaScript, and Groovy. Your applications can be hosted on their servers or you can serve them from your own web/application server.&lt;br /&gt;&lt;br /&gt;You can add any number of applications to your account. Each application is assigned a separate Skype/SIP/&lt;a href="http://www.inum.net/"&gt;INum&lt;/a&gt; phone number. As there is a local number for INum in Montreal, I can easily test my applications using either the PSTN or a SIP phone. Both for free.&lt;br /&gt;&lt;br /&gt;To test the platform, I implemented a simple application that tells me the status of the web sites I maintain (I get SMS messages once in a while from a ping-like program telling me that one of my applications is down, but its usually due to unusual latency in the network. When this happens, I want a quick way to check if the web application is up and running.) The application asks me for the name of one of my web sites using speech recognition, and fetches the main page of the selected site. If the status code is 200, it tells me that the site is up and running, otherwise it tells me that the site is down. (I'll show you the code in my next post.)&lt;br /&gt;&lt;br /&gt;I implemented the application in JavaScript, since it is the language among the supported ones I know best. Tropo uses Rhino, the Mozilla Java-based ECMAScript interpreter underneath, with support for E4X (ECMAScript for XML, an extension to ECMAScript that adds native support for XML).&lt;br /&gt;&lt;br /&gt;In contrast to VoicePHP, Tropo provides a good web-based debugger and log viewer. That's an essential part of any development environment. It makes it easy to spot bugs and problems in your application. (I have not been able to stop the execution of an application, as advertised, though. But I have not contacted their support team yet to get help on this issue.)&lt;br /&gt;&lt;br /&gt;Speech recognition works great, but my main complain is that the syntax for grammars is quite limited when you're used to developing grammars in ABNF or GrXML format. You cannot ask for dates or numbers, for example. Once they support those formats, sites like &lt;a href="http://www.grammarserver.com/"&gt;&lt;span style="text-decoration: underline;"&gt;NuGram Hosted Server&lt;/span&gt;&lt;/a&gt; (shameless plug) will become usable to make great mashups with robust dynamic grammars. (I already have a working JavaScript API to generate dynamic grammars using  NuGram Hosted Server that I have tested on Tropo. It's just that Tropo cannot use the generated grammars yet.)&lt;br /&gt;&lt;br /&gt;Overall, developing a small application on Tropo was really fun!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although both platforms are quite promising, I found Tropo to be much more mature than VoicePHP. Their website is well designed, effective, without too many bell and whistles. And they provide the right balance of features and tools to help test and debug applications.&lt;br /&gt;&lt;br /&gt;So these were very first impressions on VoicePHP and Tropo. I know there are lot of issues I did not mention. I may address them in future posts.&lt;br /&gt;&lt;br /&gt;So what is your experience with these platforms? Please share your thoughts in the comments below!&lt;br /&gt;&lt;br /&gt;[Disclaimer: although Voxeo owns VoiceObjects, a Nu Echo partner, I based this very informal review solely on my experience using both platforms for a couple of hours each.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6735972138162307012?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/6735972138162307012/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=6735972138162307012&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/6735972138162307012" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/6735972138162307012" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/X7kIDOm8bWg/voicephp-and-tropo-first-impressions.html" title="VoicePHP and Tropo - first impressions" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/05/voicephp-and-tropo-first-impressions.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3656360453531786181</id><published>2009-05-11T06:59:00.000-07:00</published><updated>2009-05-11T07:09:50.670-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voxeo" /><category scheme="http://www.blogger.com/atom/ns#" term="voicexml" /><category scheme="http://www.blogger.com/atom/ns#" term="tropo" /><category scheme="http://www.blogger.com/atom/ns#" term="scripting" /><title type="text">Tropo on your local machine</title><content type="html">In my &lt;a href="http://theschemeway.blogspot.com/2009/05/voicexml-vs-scripting-approach.html"&gt;previous post&lt;/a&gt; (about scripting alternatives to VoiceXML), I wrote:&lt;br /&gt;&lt;blockquote&gt;So I think the best of both worlds is to have a scripting language-based API that sits on top of a VoiceXML platform, with good support for speech recognition.&lt;/blockquote&gt;It seems that the &lt;a href="http://www.voxeo.com/"&gt;Voxeo&lt;/a&gt; guys are already &lt;a href="http://www.tropo.com/forums/?xt=1242050253395&amp;amp;&amp;amp;bb-cid=100&amp;amp;bb-statusBitToShow=0&amp;amp;bb-tid=870034#bb"&gt;planning that&lt;/a&gt; with &lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt;:&lt;br /&gt;&lt;span class="bb-messageText"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="bb-messageText"&gt;Yes, we fully plan on making the Tropo platform available for local installation. Unfortunately I do not have even a ball park guess to give you. There's a good bit of work for us to do in Tropo for a while to flesh it out properly. &lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3656360453531786181?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3656360453531786181/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3656360453531786181&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3656360453531786181" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3656360453531786181" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/Pd0w4uNNpfQ/tropo-on.html" title="Tropo on your local machine" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/05/tropo-on.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-7241764446110718924</id><published>2009-05-05T07:47:00.000-07:00</published><updated>2009-05-05T10:12:50.850-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voicexml" /><category scheme="http://www.blogger.com/atom/ns#" term="scripting" /><title type="text">VoiceXML vs the scripting approach</title><content type="html">[&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer&lt;/span&gt;: I am partner at &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, but the opinions expressed here are mine only and do not necessarily reflect the opinions of my co-workers and partners.&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;Fact of life: developing good IVR (interactive voice response) applications is hard. If it was easy, the &lt;a href="http://www.voiceingov.org/blog/?p=486"&gt;GetHuman&lt;/a&gt; project would not have gotten so much attention in the past years. And more often than not, VoiceXML is blamed (not without some good reasons) for this. Just look at the number of new XML languages/scripting APIs out there that try to &lt;span style="font-style: italic;"&gt;simplify&lt;/span&gt; the development of these applications: &lt;a href="http://voicephp.com/"&gt;VoicePHP&lt;/a&gt;, &lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt;, &lt;a href="http://public.ifbyphone.com/"&gt;IfByPhone&lt;/a&gt;, &lt;a href="http://twilio.com/"&gt;Twilio&lt;/a&gt;, and many more.&lt;br /&gt;&lt;br /&gt;But as Mark Headd &lt;a href="http://www.voiceingov.org/blog/?p=486"&gt;pointed out&lt;/a&gt;, the problem is not so much with the language itself (VoiceXML), but rather with the fact that developing good interfaces (speech-enabled or visual) is difficult. Providing simpler interfaces will not automatically give us better applications. In fact, they make it more difficult to implement high performance voice user interfaces (VUIs) that take advantage of the speech-recognition technologies.&lt;br /&gt;&lt;br /&gt;For example, most of these new APIs/languages, although they provide speech recognition, will not return multiple recognition results, with confidence scores and structured semantic results. That's a unfortunate because very clever dialog strategies can be implemented when you have such information:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;confirming with the second hypothesis when the first has been rejected by the caller (unless its score is under a certain threshold, of course);&lt;br /&gt;&lt;/li&gt;&lt;li&gt;deciding whether the application accepts the answer, confirms it, or rejects it based on the confidence scores;&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;(But I may not get it, plain and simple. Are these new platforms targeting the large call centers or only the mass of web developers so they can experiment with telephony applications? And this is only the first generation of such APIs, they will certainly evolve over time and offer some more complex features.)&lt;br /&gt;&lt;br /&gt;But although I think VoiceXML is here to stay in the call-center industry (too much investments to displace it anytime soon), I think a programmatic approach to IVR development is superior to a meta-language one:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The barrier to entry is lower in terms of development tools. One can reuse his preferred tools: editor, debugger, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is much easier to provide different implementations of the API, for unit testing purposes, integration with existing platforms.&lt;/li&gt;&lt;li&gt;The language's abstraction mechanisms (classes, higher-order functions, procedures, etc.) can be used to develop libraries of reusable dialog components.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is a single language involved, instead of dealing with VoiceXML + ECMAScript + (PHP | JSP | ...).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;So I think the best of both worlds is to have a scripting language-based API that sits on top of a VoiceXML platform, with good support for speech recognition. But that's a framework, right?&lt;br /&gt;&lt;br /&gt;Or use a graphical VoiceXML service creation environment... &lt;a href="http://www.voiceobjects.com/"&gt;VoiceObjects&lt;/a&gt;, &lt;a href="http://openmethods.com/"&gt;OpenVXML&lt;/a&gt;, &lt;a href="http://www.vicorp.com/products/xmp-studio"&gt;xMP Studio&lt;/a&gt;, &lt;a href="http://support.avaya.com/japple/css/japple?PAGE=Product&amp;amp;temp.productID=251589"&gt;Avaya Dialog Designer&lt;/a&gt;, &lt;a href="http://www.cisco.com/en/US/products/ps7235/index.html"&gt;Cisco Unified Call Studio&lt;/a&gt;, etc. etc. You'll certainly find one that meets your needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-7241764446110718924?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/7241764446110718924/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=7241764446110718924&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7241764446110718924" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7241764446110718924" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/yqMLqlF_VT0/voicexml-vs-scripting-approach.html" title="VoiceXML vs the scripting approach" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/05/voicexml-vs-scripting-approach.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8628567623232095994</id><published>2009-03-13T18:27:00.000-07:00</published><updated>2009-03-13T18:48:43.043-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gamerizon" /><category scheme="http://www.blogger.com/atom/ns#" term="jobs" /><category scheme="http://www.blogger.com/atom/ns#" term="scheme" /><title type="text">Gamerizon and QuantZ</title><content type="html">This morning, I paid a visit to the guys at &lt;a href="http://www.gamerizon.com/"&gt;Gamerizon&lt;/a&gt; (they have a number of &lt;a href="http://theschemeway.blogspot.com/2009/03/scheme-job-openings-at-gamerizon.html"&gt;jobs openings for seasoned Schemers&lt;/a&gt;). They gave me a demo of QuantZ, their flagship product. Wow! That is an amazing game! I'm not sure how much I can tell you, but just go to their website and look at the screencast. (In fact,&lt;br /&gt;&lt;br /&gt;So if you are looking for a challenging Scheme job, send your CV. It's a strong, talented team (they have a lot of experience in game development), and they are highly passionate about their work and Scheme in general. I have a lot of respect for what they do. And it's nice to see places where Scheme is endorsed first and foremost by the founders/company executives.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8628567623232095994?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/8628567623232095994/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=8628567623232095994&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8628567623232095994" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8628567623232095994" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/QuaTFFokKx4/this-morning-i-paid-visit-to-guys-at.html" title="Gamerizon and QuantZ" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/03/this-morning-i-paid-visit-to-guys-at.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3615017657018054251</id><published>2009-03-11T12:46:00.000-07:00</published><updated>2009-03-11T12:50:09.054-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jobs" /><category scheme="http://www.blogger.com/atom/ns#" term="scheme" /><title type="text">Scheme job openings at Gamerizon</title><content type="html">Just seen on the MSLUG mailing list, a message from Robert Lizée about 2 openings at Gamerizon:&lt;br /&gt;&lt;blockquote&gt;&lt;span class="EC_Apple-style-span"    style="font-family:Times;font-size:130%;color:#144fae;"&gt;&lt;span class="EC_Apple-style-span" style="font-size: 16px;"&gt;&lt;div style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span class="EC_Apple-style-span" style="font-family: Times; font-size: 14px;"&gt;&lt;span class="EC_Apple-style-span" style="font-size: 16px;"&gt;&lt;div style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span class="EC_Apple-style-span"  style="color:#000000;"&gt;We are currently finishing the development of a game called "QuantZ" that has been mostly written in Scheme using Gambit-C. A video of the game can be seen at &lt;/span&gt;&lt;a href="http://www.gamerizon.com/" target="_blank" onclick="onClickUnsafeLink(event);"&gt;&lt;span style=""&gt;&lt;span class="EC_Apple-style-span" style="text-decoration: none;"&gt;&lt;span class="EC_Apple-style-span"  style="color:#000000;"&gt;www.gamerizon.com&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="EC_Apple-style-span"  style="color:#000000;"&gt;.  The current version of the game runs on Windows and Mac OS.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal; min-height: 14px;"&gt;&lt;span class="EC_Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&lt;span class="EC_Apple-style-span"  style="color:#000000;"&gt;In the short term, we are looking for 2 developers: a game programmer with good optimization skills and a Scheme programmer with good understanding of compiling techniques to work on the iPhone version and smaller versions of the game in Flash, Java and BREW. For these versions, the objective would be to reuse/adapt parts of the current code base, in order to gradually implement a system on which we could develop games on many platforms at once using the same code base.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3615017657018054251?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3615017657018054251/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3615017657018054251&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3615017657018054251" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3615017657018054251" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/bB3fB2OgkdM/scheme-job-openings-at-gamerizon.html" title="Scheme job openings at Gamerizon" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/03/scheme-job-openings-at-gamerizon.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3361466731454099611</id><published>2009-03-11T03:58:00.001-07:00</published><updated>2009-03-11T07:02:45.769-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voxeo" /><category scheme="http://www.blogger.com/atom/ns#" term="tropo" /><category scheme="http://www.blogger.com/atom/ns#" term="speech applications" /><title type="text">Tropo - a new platform for developing speech applications</title><content type="html">Last week, at &lt;a href="http://ecommconf.com/"&gt;eComm&lt;/a&gt;, Voxeo has launched &lt;a href="http://www.tropo.com/"&gt;Tropo&lt;/a&gt;, a platform for developing speech applications in a variety of dynamic programming languages. They provide a (synchronous) API to interact with the callers of your application. You can do things like playing prompts, asking questions (DTMF/speech recognition), transfering calls, and so on. All this in your language of choice, without having to mess with VoiceXML, CCXML, low level telephone APIS, and the like.&lt;br /&gt;&lt;br /&gt;Tropo currently supports JavaScript, Groovy, Ruby, Python, and PHP. They expect to add support for new languages in the future. And if you follow my &lt;a href="http://twitter.com/dboucher"&gt;Twitter feed&lt;/a&gt;, you noticed that they are open to supporting Scheme/Lisp. I even volunteered to help them. What cool guys they are! (It seems I am not the only one &lt;a href="http://blogs.voxeo.com/voxeotalks/2009/03/10/voxeos-launch-of-tropocom-an-update-one-week-later/"&gt;who asked about Lisp&lt;/a&gt;...)&lt;br /&gt;&lt;br /&gt;Now, which Lisp dialect would make most sense on the Tropo platform? Given the state of the Scheme community and the variety of implementations, the answer may not be as simple as you would expect. Here are a few possibilities, with their respective pros and cons.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JVM-based systems&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, there are a number of Lisp implementations on the Java platform: &lt;a href="http://sisc.sourceforge.net/"&gt;SISC&lt;/a&gt;, &lt;a href="http://www.gnu.org/software/kawa/"&gt;Kawa&lt;/a&gt;, and &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;. With these implementations, their foreign interface to Java compensates for their lack of libraries.&lt;br /&gt;&lt;br /&gt;SISC is a fully R5RS-compliant implementation of Scheme. It can interface to Java, optimizes all tail-calls, fully supports call/cc, etc. It is a mature implementation, but there has not been any new release since the end of 2007.  Unfortunately, it does not implement optional and keyword arguments, and does not have a compact syntax for hash maps. I am not sure how elegant code will be in SISC compared to what we can do in JavaScript or the other scripting languages.&lt;br /&gt;&lt;br /&gt;Kawa is a less compliant Scheme implementation than SISC and does not seem to have a lot of community support. It does have DSSSL-based optional and key arguments, which is nice, but it does not provide a clean, compact syntax for hash maps natively. But since the reader can be extended, this is not really a big deal.&lt;br /&gt;&lt;br /&gt;Clojure, the newest Lisp on the block, may be a good choice. I am not really familiar with it, but from what I saw in the documentation, it supports objects, multi-methods, special syntax for hash maps, optional and keyword arguments, and much more. It does not optimizes tail-calls but, hey, it's a Lisp, not a Scheme. And there seems to have a strong community behind it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Native implementations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, if we now turn to native implementations of Scheme (i.e. not running on the JVM), there are many more choices. I won't list them all, but if we consider the size of their respective community, the clear choices (from my point of view) are &lt;a href="http://plt-scheme.org/"&gt;PLT-Scheme&lt;/a&gt;, &lt;a href="http://dynamo.iro.umontreal.ca/%7Egambit/wiki/index.php/Main_Page"&gt;Gambit-C&lt;/a&gt;, and &lt;a href="http://www.call-with-current-continuation.org/"&gt;Chicken&lt;/a&gt;. As you know, I have a preference for Gambit-C. It is a robust, fast implementation of Scheme (R5RS). It has very good debugging tools, supports DSSSL-based optional and keyword arguments. The readtable can be modified. Etc. Etc. Add &lt;a href="http://code.google.com/p/termite"&gt;Termite&lt;/a&gt; and you have a strong platform for developing amazing next-generation multi-modal voice-enabled applications. But on the down side, it cruelly lacks libraries.&lt;br /&gt;&lt;br /&gt;Of course, PLT-Scheme and Chicken do have a lot of libraries, with a language support for using them. Chicken has most of the features of Gambit-C, except good debugging tools (and Termite, of course, which only runs on Gambit-C). PLT-Scheme, on the other hand, does not have runtime debugging tools as good as Gambit-C, but it comes with a great development environment, DrScheme.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;And the winner is...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, I don't know. From a programmer point of view, I would hesitate between Clojure and Gambit-C. But there may be some other issues that I did not consider, like the architecture of the Tropo platform, the interpreter start time, memory footprint, etc. that would affect how the application could scale. Is there a new interpreter launched for each new call?&lt;br /&gt;&lt;br /&gt;So tell me, what would be your ideal Scheme/Lisp implementation on the Tropo platform?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3361466731454099611?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3361466731454099611/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3361466731454099611&amp;isPopup=true" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3361466731454099611" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3361466731454099611" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/TTN-kLvvT5c/tropo-new-platform-for-developing.html" title="Tropo - a new platform for developing speech applications" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/03/tropo-new-platform-for-developing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-7770968492685390802</id><published>2009-02-22T17:43:00.000-08:00</published><updated>2009-02-22T19:14:45.555-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="parsing" /><category scheme="http://www.blogger.com/atom/ns#" term="lalr-scm" /><category scheme="http://www.blogger.com/atom/ns#" term="parser generator" /><title type="text">On the use of parser/lexer generators</title><content type="html">Today, I came across a blog post on Advogato about the &lt;a href="http://www.advogato.org/person/apenwarr/diary/482.html"&gt;use of parser and lexer generators&lt;/a&gt;. The author makes a case about writing hand-crafted lexers (in his case, a lexer for XML). As the maintainer of a &lt;a href="http://code.google.com/p/lalr-scm"&gt;LALR(1) parser generator for Scheme&lt;/a&gt;, I could not resist and wanted to share my thoughts on this subject.&lt;br /&gt;&lt;br /&gt;First and foremost, let me say I have mixed feelings about the article. Although it addresses important issues, it concludes with a very simple lexing problem, not a challenging one. I think this alone greatly diminishes the strength of his argument.&lt;br /&gt;&lt;br /&gt;Now let me give my own list of pros and cons of parser/lexer generators.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pros&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am a big fan of DSLs. And parser/lexer generators obviously fall in this category of tools. They operate on a high level, declarative description of the language we wish to parse. This results in more maintainable software, with less bugs (most popular generators have been used extensively, so you can already be confident on the correctness of generated code).&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt;, I wrote two parsers for a language called ABNF (it's a language for defining grammars used in speech recognition applications), one using an LALR(1) parser generator and the other one being an hand-crafted recursive-descent parser. The latter is certainly faster and give better error diagnostics (I'll get back to this in a moment), but from a maintenance point of view, the former wins.&lt;br /&gt;&lt;br /&gt;Another important aspect of parser generators is that they often support different parsing &lt;i&gt;technologies/drivers&lt;/i&gt;. For instance, &lt;a href="http://www.gnu.org/software/bison/"&gt;bison&lt;/a&gt; can generate LALR(1) or GLR parser (&lt;i&gt;lalr-scm&lt;/i&gt; can, too). And &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; supports LL(1) but also LL(k) grammars. Without having to rewrite the source grammar. You can't do that with an hand-crafted parser. (Of course, you must stay in the same "family" of parsing technologies. A grammars written for an LR parser generator may not be appropriate for an LL parser generator, and vice versa.)&lt;br /&gt;&lt;br /&gt;A corollary to this is that you can concentrate on offering the best interface to your users: the language itself. You don't have to adapt the language to a parsing technique. This is very important from a design point of view. Usability is (or should be?) one of the driving goals when designing a new language.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cons&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, they are more pragmatic issues that can preclude the use of parser/lexer generators. Here are a few:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My experience with parser generators showed me that they are nice for command-line tools, but they do not produce good parsers for use in interactive environments (like an editor). (I must confess that I have almost exclusively used LR parser generators a la yacc/bison, so this argument may be a bit stretched. And I know that there have been quite a lot of work on interactive programming environments and incremental parsing.) Error recovery mechanisms are often limited and tend to produce cryptic error messages.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hand-crafted parsers are often much easier to debug. Ever tried to understand what a shift/reduce conflict is? And tried to figure out how to rewrite your grammar to resolve it? You have to understand the parsing technology. Talk about an abstraction leak!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Generated parsers are derived resources in a development project (i.e. resources obtained from other resources). This means they are usually not kept in the CVS/git/SVN/... repository. This can complicate the build process. This may not be a big deal, but in some projects this can be trickier.&lt;br /&gt;&lt;br /&gt;In some languages other than C/C++/Java, like Scheme, this may not be a problem since the parser generator can be called at macro-expansion time.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Et voilà! I'm surely missing a lot of other equally important aspects, but it's getting late and I am tired. And you? What are you reasons for using or not using a parser generator/lexer generator?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-7770968492685390802?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/7770968492685390802/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=7770968492685390802&amp;isPopup=true" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7770968492685390802" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7770968492685390802" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/Mz-ud9Z-Ys0/on-use-of-parserlexer-generators.html" title="On the use of parser/lexer generators" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/02/on-use-of-parserlexer-generators.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1286179011745874930</id><published>2009-02-22T15:00:00.000-08:00</published><updated>2009-02-22T15:23:44.099-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="scheme" /><title type="text">Nils Holm's textbooks  for free</title><content type="html">Nils Holm is offering &lt;a href="http://t3x.org/books/ "&gt;most of his text books&lt;/a&gt; online free of charge. I have not read any of them yet, but judging from their title, I'm definitely missing something!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1286179011745874930?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/1286179011745874930/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=1286179011745874930&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1286179011745874930" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1286179011745874930" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/nsNLtMTXwGc/nils-holm-free-textbooks.html" title="Nils Holm's textbooks  for free" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/02/nils-holm-free-textbooks.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1213793527536062824</id><published>2009-01-28T06:15:00.000-08:00</published><updated>2009-01-28T17:08:52.296-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="optimization" /><category scheme="http://www.blogger.com/atom/ns#" term="kawa" /><category scheme="http://www.blogger.com/atom/ns#" term="scheme" /><title type="text">Reflection can be costly</title><content type="html">At least in Java.&lt;br /&gt;&lt;br /&gt;A few days ago, I wanted to optimize a piece of code written in Kawa Scheme. You know how that works: you write something that seems to be good enough in most cases in terms of performance. Then you try it on a large input (a file several several megabytes long). And your code chokes. It does not crash, but takes way too much time to be usable in practice. But that's ok. Premature optimization is the root of all evil.&lt;br /&gt;&lt;br /&gt;So I ran the profiler on my code to find out that it was using the Java reflection routines like hell. I was astonished, to say the least. My code was carefully written, with lots of type declarations (which are optional in Kawa) to prevent calls to the reflection API by the Kawa runtime. It seems that I was not careful enough. Or that I was expecting more from the Kawa compiler (I use a very old release, btw).&lt;br /&gt;&lt;br /&gt;The problem was this. In a single static Kawa module, I was defining some classes and a few helper functions. Something along the lines of:&lt;pre&gt;&lt;br /&gt;(module-name &amp;lt;mymodule&amp;gt;)&lt;br /&gt;(module-static 'init-run)&lt;br /&gt;&lt;br /&gt;(define-simple-class &amp;lt;ClassA&amp;gt; (&amp;lt;Object&amp;gt;)&lt;br /&gt;  (some-field))&lt;br /&gt;&lt;br /&gt;(define (helper-function (an-a :: &amp;lt;ClassA&amp;gt;))&lt;br /&gt;  (do-something-with (field an-a 'some-field)))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Surprisingly, the reference to the &lt;code&gt;some-field&lt;/code&gt; must be done through reflection! I'm not sure why, I don't master the inwards of the Kawa compiler.&lt;br /&gt;&lt;br /&gt;Is there a solution to this problem? Yes. Put the class definitions in a  module an the helper functions in a separate one. By doing this, the run time of my code dropped by 50% (a speedup of 2). There are many other possible improvements to speedup my code even further (data structures, algorithms, etc). But at least my code is now compiled the way I expect it to be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1213793527536062824?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/1213793527536062824/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=1213793527536062824&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1213793527536062824" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/1213793527536062824" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/WP13jJvF9zI/reflection-can-be-costly.html" title="Reflection can be costly" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/01/reflection-can-be-costly.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3396099974356587732</id><published>2009-01-12T06:53:00.000-08:00</published><updated>2009-01-12T07:05:11.220-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="compiz" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title type="text">Extended desktops and Compiz</title><content type="html">This morning, I realized that &lt;a href="http://www.freedesktop.org/wiki/Software/Compiz"&gt;Compiz&lt;/a&gt; was not working anymore. I could not remember when it stopped working, but I remembered having a similar problem a month ago, when using my Wubi-based install of Ubuntu.&lt;br /&gt;&lt;br /&gt;After a few minutes of googling around, I found that this probably happened after &lt;a href="https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/306400"&gt;connecting a projector (or another monitor) on my laptop&lt;/a&gt;. If that happens again, I just need to issue the following command:&lt;br /&gt;&lt;pre&gt;  % sudo dpkg-reconfigure -phigh xserver-xorg&lt;/pre&gt;&lt;br /&gt;and restart X (by just logging out and in).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3396099974356587732?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3396099974356587732/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3396099974356587732&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3396099974356587732" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3396099974356587732" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/nae-lvhluJo/dual-screens-and-compiz.html" title="Extended desktops and Compiz" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/01/dual-screens-and-compiz.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-519953108941878842</id><published>2009-01-07T06:40:00.000-08:00</published><updated>2009-01-07T07:27:52.153-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voicexml" /><category scheme="http://www.blogger.com/atom/ns#" term="ide" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title type="text">A case for voice test cases</title><content type="html">To me, the future of voice service creation environments (SCEs) is in IDEs that will offer ways to test applications without having to resort on a VoiceXML platform, that will ease the creation of test cases. Testing voice applications manually by calling the application is costly (in both time and money) and the more you can do in your development environment, the better.&lt;br /&gt;&lt;br /&gt;Think about how easy it is to run JUnit tests from Eclipse. In a fraction of a second, you can run hundreds of test cases. And you can use the power of Java to factor large portions of your tests and reuse lots of code. Doing the same for voice applications would be a killer app. (Of course, you can certainly do that when using a well-designed custom VoiceXML framework with a strong underlying model. But most SCEs have not been designed with this in mind.)&lt;br /&gt;&lt;br /&gt;In a tough economy, environments that will help us deliver better and more robust applications in a more cost-effective way will clearly have a competitive advantage.&lt;br /&gt;&lt;br /&gt;At least, some companies &lt;a href="http://developers.voiceobjects.com/2009/01/07/handling-test-case-data-in-voiceobjects-74/"&gt;understand that&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-519953108941878842?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/519953108941878842/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=519953108941878842&amp;isPopup=true" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/519953108941878842" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/519953108941878842" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/_rKl1FbeSv0/case-for-voice-test-cases.html" title="A case for voice test cases" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2009/01/case-for-voice-test-cases.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4292730405423176657</id><published>2008-12-18T03:34:00.000-08:00</published><updated>2008-12-18T09:00:17.214-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title type="text">How I switched to Ubuntu</title><content type="html">Yesterday, I decided to install &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; on it own dedicated, ext3 partition, to get full performance (sometimes, on my &lt;a href="http://wui-installer.org/"&gt;Wubi&lt;/a&gt;-based install, a process called &lt;span style="font-style: italic;"&gt;mount.ntfs&lt;/span&gt; takes 00% CPU and freezes most applications).&lt;br /&gt;&lt;br /&gt;But prior to installing Ubuntu, I first had to shrink my Windows (ntfs) partition. Here is what I did, only using free software:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Removed unnecessary data to from Windows (I removed about 14 Gb of junk!)&lt;/li&gt;&lt;li&gt;Made a backup of my Windows partition. I first tried ghost but our corporate version is old and I did not succeed in detecting my Samba shares on my home server (CentOS). So I dowloaded and installed &lt;a href="http://www.macrium.com/"&gt;Macrium Reflect Free Edition&lt;/a&gt;. Great software. Run flawlessly.&lt;/li&gt;&lt;li&gt;I shrunk my Windows partition. To do this, I used &lt;a href="http://www.partition-tool.com/personal.htm"&gt;EASUS Partition Manager&lt;/a&gt;. Again, this worked flawlessly.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;At 10h30PM, I finally realized I didn't have any blank CD to write my Ubuntu installation CD! So I decided to use my USB key. To write the ISO file to my USB key, I used &lt;a href="http://http//lubi.sourceforge.net/unetbootin.html"&gt;UNetbootin&lt;/a&gt;. It was very simple to use and I was able to boot the Ubuntu installed just a few minutes later.&lt;br /&gt;&lt;br /&gt;That's it. Now I run Ubuntu natively. It's so fast, now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4292730405423176657?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/4292730405423176657/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=4292730405423176657&amp;isPopup=true" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/4292730405423176657" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/4292730405423176657" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/KMl7wKZoEn4/how-i-swtiched-to-ubuntu.html" title="How I switched to Ubuntu" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/12/how-i-swtiched-to-ubuntu.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-7006440336580547417</id><published>2008-12-15T19:52:00.000-08:00</published><updated>2008-12-15T20:04:27.663-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="wubi" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title type="text">A new fan of Ubuntu</title><content type="html">I installed Ubuntu (using the Wubi installer) on my Dell Latitude last week. It just rocks!&lt;br /&gt;&lt;br /&gt;I was still under the impression that installing and configuring a Linux system was not an easy task (I have been a Linux user since the early '90s, I installed CentOS 5 just a few weeks ago on a server at home). I was just plain wrong. Installing Ubuntu 8.10 took just matter of minutes. Configuring the internet (wireless access + openvpn) is as intuitive as it can be.&lt;br /&gt;&lt;br /&gt;Moreover, In the past couple of years, it took me hours to configure my HP printer on Windows XP. With Ubuntu, all I had to do was inserting the USB cable in my laptop &lt;span style="font-style: italic;"&gt;et voilà!&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I'm sold to Ubuntu!&lt;br /&gt;&lt;br /&gt;Now if I can take the time to ghost my machine and install Ubuntu on a native ext3 filesystem... I would unleash the full potential of my laptop (Wubi installs Ubuntu on a virtual drive, a file on an ntfs partition.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-7006440336580547417?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/7006440336580547417/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=7006440336580547417&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7006440336580547417" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/7006440336580547417" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/8tYViNmGFJA/new-fan-of-ubuntu.html" title="A new fan of Ubuntu" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/12/new-fan-of-ubuntu.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3005135843784733318</id><published>2008-12-10T09:41:00.000-08:00</published><updated>2008-12-10T09:58:06.264-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="voxeo" /><category scheme="http://www.blogger.com/atom/ns#" term="voiceobjects" /><title type="text">VoiceObjects acquired by Voxeo</title><content type="html">&lt;a href="http://www.voxeo.com/"&gt;Voxeo&lt;/a&gt;, a company I mentioned a few times in the past, &lt;a href="http://blogs.voxeo.com/voxeodeveloperscorner/2008/12/09/what-the-voiceobjects-acquisition-by-voxeo-means-for-voice-application-developers/"&gt;announced yesterday&lt;/a&gt; the acquisition of &lt;a href="http://www.voiceobjects.com/"&gt;VoiceObjects&lt;/a&gt;, a company located in Cologne, Germany, with which &lt;a href="http://www.nuecho.com"&gt;Nu Echo &lt;/a&gt;has developed a great relationship in the past eighteen months.&lt;br /&gt;&lt;br /&gt;I'm very excited by this acquisition. This will certainly create new opportunities for VoiceObjects in the US, and Voxeo will extend its reach on the old continent. &lt;br /&gt;&lt;br /&gt;But more importantly, I'm very happy for the all the people I know at VoiceObjects. I have a lot of respect for their work, their attitude,  and their professionalism. Voxeo not only acquired a great technology and platform, they have joined their forces to a great team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3005135843784733318?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3005135843784733318/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3005135843784733318&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3005135843784733318" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3005135843784733318" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/HylynDlcrGs/voiceobjects-acquired-by-voxeo.html" title="VoiceObjects acquired by Voxeo" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/12/voiceobjects-acquired-by-voxeo.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3070577879916602795</id><published>2008-11-12T16:19:00.000-08:00</published><updated>2008-11-13T03:37:54.015-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mslug" /><category scheme="http://www.blogger.com/atom/ns#" term="jazzscheme" /><title type="text">Jazz night at the MSLUG</title><content type="html">I just added a new meeting announcement to the next &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG website&lt;/a&gt;, to be held on November 27th. Here is an excerpt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;As some of you know, Guillaume Cartier has been working for the past 12 years on his Jazz Scheme system.  It is a powerful and complete development environment for Scheme applications.  You can read about it here: &lt;a href="http://www.jazzscheme.org/"&gt;www.jazzscheme.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A couple of years ago, he decided to port the whole Jazz kernel to Gambit-C Scheme and to eventually release Jazz under an Open Source License.  With the near completion of X11 support, the time to do a full public release is coming very close.&lt;br /&gt;&lt;br /&gt;In order to help spot and iron out the remaining issues for a full public release, Guillaume will be doing a "Closed Beta" release to the participants of the MSLUG.  The release will take place at the MSLUG meeting on November 27th.  You are encouraged to bring your own laptop, as Guillaume will walk us through the installation of Jazz and the creation of a simple application.  Note that Jazz should run on Windows *and* on systems featuring an X11 server.&lt;br /&gt;&lt;br /&gt;Thanks to Marc Feeley,  WiFi Internet access will be available at the meeting, which should help with the whole process.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Don't miss it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3070577879916602795?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3070577879916602795/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3070577879916602795&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3070577879916602795" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3070577879916602795" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/anwEacyq0ig/jazz-night-at-mslug.html" title="Jazz night at the MSLUG" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/11/jazz-night-at-mslug.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8992185156714467748</id><published>2008-09-24T18:53:00.000-07:00</published><updated>2008-11-12T16:18:33.508-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="yaws" /><title type="text">Erlang impressions (in French)</title><content type="html">François Pinard, a colleague of mine, reveals his first &lt;a href="http://pinard.progiciels-bpi.ca/erlang/impressions.html"&gt;impressions&lt;/a&gt; on &lt;a href="http://www.erlang.org"&gt;Erlang&lt;/a&gt;. François has worked on Erlang stuff for the past 4 months and explored a lot of dark corners of both Erlang and &lt;a href="http://yaws.hyber.org"&gt;Yaws&lt;/a&gt;. The only caveat: it's in French.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8992185156714467748?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/8992185156714467748/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=8992185156714467748&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8992185156714467748" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/8992185156714467748" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/Tppb4q5-zFA/erlang-impressions-in-french.html" title="Erlang impressions (in French)" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/09/erlang-impressions-in-french.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3855238866839816448</id><published>2008-09-17T16:23:00.000-07:00</published><updated>2008-09-17T16:33:16.397-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="erlang" /><category scheme="http://www.blogger.com/atom/ns#" term="yahoo" /><title type="text">Erlang @ Yahoo</title><content type="html">Too bad I cannot make it... Mike Gerakines will talk about the use of &lt;a href="http://www.bayfp.org/blog/2008/09/09/septemeber-meeting-nick-gerakines-developing-erlang-at-yahoo/"&gt;Erlang at Yahoo&lt;/a&gt; at the &lt;a href="http://www.bayfp.org/"&gt;BayFP&lt;/a&gt;. Hope the slides will be available afterward...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3855238866839816448?l=theschemeway.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://theschemeway.blogspot.com/feeds/3855238866839816448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7061944&amp;postID=3855238866839816448&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3855238866839816448" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7061944/posts/default/3855238866839816448" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/schemeway/~3/Ch4MEzn4OXY/erlang-yahoo.html" title="Erlang @ Yahoo" /><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10906903748022391038" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://theschemeway.blogspot.com/2008/09/erlang-yahoo.html</feedburner:origLink></entry></feed>
