<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/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:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7061944</id><updated>2012-01-19T04:03:02.885-08:00</updated><category term='wubi'/><category term='postgresql'/><category term='erlang'/><category term='nuecho'/><category term='html5'/><category term='books'/><category term='vacations'/><category term='recruiting'/><category term='termite'/><category term='mslug'/><category term='parsing'/><category term='linkedin'/><category term='syntax-case'/><category term='applications'/><category term='openfire'/><category term='web service'/><category term='network servers'/><category term='eclipse'/><category term='erlyweb'/><category term='IMified'/><category term='scripting'/><category term='facebook'/><category term='xml'/><category term='scheme'/><category term='business'/><category term='workshop'/><category term='xmpp'/><category term='java'/><category term='mysql'/><category term='nugram'/><category term='security'/><category term='arc'/><category term='lalr-scm'/><category term='scheme snow packages'/><category term='smack'/><category term='rest'/><category term='asterisk'/><category term='erlang user group'/><category term='android'/><category term='google code'/><category term='optimization'/><category term='dsl'/><category term='marketing'/><category term='oopsla'/><category term='fastagi'/><category term='fun'/><category term='ubuntu'/><category term='testing'/><category term='architecture'/><category term='blogging'/><category term='plugins'/><category term='conferences'/><category term='json'/><category term='ide'/><category term='open-source'/><category term='ruby'/><category term='couchdb'/><category term='parser generator'/><category term='yahoo'/><category term='voicexml'/><category term='technology'/><category term='kawa'/><category term='javascript'/><category term='debugging'/><category term='tropo'/><category term='sisc'/><category term='github'/><category term='skype'/><category term='socialmedia'/><category term='prophecy'/><category term='r6rs'/><category term='internship'/><category term='tuple spaces'/><category term='voxeo'/><category term='gamerizon'/><category term='ios'/><category term='python'/><category term='spark'/><category term='otp'/><category term='ivr'/><category term='web server'/><category term='compiz'/><category term='secondlife'/><category term='IM'/><category term='linux'/><category term='voice applications'/><category term='yaws'/><category term='voiceobjects'/><category term='interoperability'/><category term='voip'/><category term='lisp'/><category term='voicephp'/><category term='grammarserver'/><category term='instant messaging'/><category term='jazzscheme'/><category term='montreal'/><category term='hot code swapping'/><category term='gambit-c'/><category term='speech applications'/><category term='jobs'/><category term='schemescript'/><category term='snow'/><category term='linda'/><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='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default?max-results=100'/><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=101&amp;max-results=100'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>205</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7061944.post-8684598379707496593</id><published>2011-11-17T16:49:00.001-08:00</published><updated>2011-11-17T16:52:05.967-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><category scheme='http://www.blogger.com/atom/ns#' term='gambit-c'/><category scheme='http://www.blogger.com/atom/ns#' term='ios'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>MSLUG meeting next week</title><content type='html'>The MSLUG (Montreal Scheme/Lisp User Group) is rising from the ashes! Next week, Marc Feeley will talk about Gambit REPL, a version of Gambit-C for iOS and Android.&lt;br /&gt;&lt;br /&gt;More details can be found &lt;a href="http://www.meetup.com/Montreal-Scheme-Lisp-Users-Group/events/39894522/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8684598379707496593?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8684598379707496593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8684598379707496593&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8684598379707496593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8684598379707496593'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/11/mslug-meeting-next-week.html' title='MSLUG meeting next week'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3049591884419451709</id><published>2011-05-25T06:57:00.000-07:00</published><updated>2011-05-25T06:57:03.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grammarserver'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Session handling in NuGram Hosted Server</title><content type='html'>Some time ago, I wrote a description of how &lt;a href="http://theschemeway.blogspot.com/2009/11/1-session-per-process-some-comments-on.html"&gt;session&lt;/a&gt; &lt;a href="http://theschemeway.blogspot.com/2009/11/architecture-of-nugram-hosted-server.html"&gt;handling&lt;/a&gt; works in &lt;a href="http://www.grammarserver.com/"&gt;NuGram Hosted Server&lt;/a&gt;, which is implemented in &lt;a href="http://erlang.org/"&gt;Erlang&lt;/a&gt;. It's also briefly described on slide 15 of my &lt;a href="http://blog.nuecho.com/2011/05/20/slides-from-my-talk-at-the-erlang-montreal-meetup/"&gt;talk at the Erlang Montreal&lt;/a&gt; meetup. Over on the Nu Echo blog, I wrote a &lt;a href="http://blog.nuecho.com/2011/05/25/session-timeouts-in-nugram-hosted-server/"&gt;short post&lt;/a&gt; explaining how the session timeout mechanism can be implemented using a plain Erlang/OTP gen_server behaviour. It's not a very profound post, but it's one of those areas where OTP shines (a very simple solution to a very common problem, and no need to reinvent the wheel).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3049591884419451709?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3049591884419451709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3049591884419451709&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3049591884419451709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3049591884419451709'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/05/session-handling-in-nugram-hosted.html' title='Session handling in NuGram Hosted Server'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3299943369547041168</id><published>2011-05-20T04:19:00.000-07:00</published><updated>2011-05-20T04:19:42.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nugram'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang user group'/><category scheme='http://www.blogger.com/atom/ns#' term='nuecho'/><title type='text'>Slides from my talk at the first Erlang Montreal meetup</title><content type='html'>Over on our &lt;a href="http://blog.nuecho.com/2011/05/20/slides-from-my-talk-at-the-erlang-montreal-meetup/"&gt;corporate blog&lt;/a&gt;, I've put the slides from the talk I gave at the first &lt;a href="http://groups.google.com/group/erlang-montreal?hl=en"&gt;Erlang Montreal&lt;/a&gt; meetup. The talk was a summary of some lessons we've learned at Nu Echo building &lt;a href="http://www.grammarserver.com/"&gt;NuGram Hosted Server&lt;/a&gt; in Erlang.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3299943369547041168?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3299943369547041168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3299943369547041168&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3299943369547041168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3299943369547041168'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/05/slides-from-my-talk-at-first-erlang.html' title='Slides from my talk at the first Erlang Montreal meetup'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2975590947472319265</id><published>2011-05-11T19:29:00.000-07:00</published><updated>2011-05-13T13:35:03.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='user group'/><title type='text'>First Erlang Montreal meeting tomorrow</title><content type='html'>Tomorrow, May 12th, 2011, the &lt;a href="http://www.solea-research.com/blog/332/first-erlang-montreal-meeting"&gt;first meeting of the Erlang Montreal&lt;/a&gt; user group will take place at the Notman House from 6:30PM to 8PM. I will have the pleasure to give the first talk, in which I will share some of the lessons we learned at Nu Echo on building real applications in Erlang.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2975590947472319265?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2975590947472319265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2975590947472319265&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2975590947472319265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2975590947472319265'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/05/first-erlang-montreal-meeting-tomorrow.html' title='First Erlang Montreal meeting tomorrow'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3648145707536123168</id><published>2011-02-11T13:30:00.000-08:00</published><updated>2011-03-21T09:43:09.691-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Securing a couchdb database</title><content type='html'>&lt;div&gt;Last week, for a &lt;a href="http://blog.nuecho.com/2011/02/03/testing-your-dynamic-grammars/"&gt;post&lt;/a&gt; on our corporate blog, I created and populated a hosted &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; database (on &lt;a href="http://couchone.com/"&gt;CouchOne&lt;/a&gt;, now &lt;a href="http://www.couchbase.com/"&gt;CouchBase&lt;/a&gt;). Since I put the code on &lt;a href="http://github.com/nuecho/context-examples"&gt;github&lt;/a&gt; and it contains references to my publicly available database, I had to secure it a bit. Here is what I did.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;Note: &lt;/b&gt; this is not a tutorial on CouchDB security issues, only a list of steps I did to secure my database. For a comprehensive guide on CouchDB security, there are excellent &lt;a href="http://guide.couchdb.org/"&gt;online&lt;/a&gt; &lt;a href="http://blog.couchone.com/post/1027100082/whats-new-in-couchdb-1-0-part-4-securityn-stuff"&gt;sources&lt;/a&gt;.&lt;/i&gt;&lt;/div&gt;&lt;div style="font-weight: bold;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: 800;"&gt;1. &lt;/span&gt;&lt;b&gt;Creating the user/password&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first thing to do is to create a new user with an associated password on the instance.&lt;/div&gt;&lt;div&gt;&lt;pre&gt;% curl -X PUT 'https://dboucher.couchone.com/_config/admins/&lt;i&gt;username&lt;/i&gt;' -d '"&lt;i&gt;password&lt;/i&gt;"'&lt;/pre&gt;&lt;div&gt;&lt;b&gt;2. Configuring the user &lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next step is to configure the user account by setting its type and roles. In my case, I wanted to add the &lt;span class="Apple-style-span"&gt;editor&lt;/span&gt; role to my account so I could restrict the creation of new documents to this role (the validator below is kept in a document on the database itself, so it is readable by everyone and I don't want other people to know which user account to hack).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The user account configuration is done using another simple HTTP request:&lt;/div&gt;&lt;pre&gt;% curl -X PUT 'https://&lt;i&gt;username:password&lt;/i&gt;@dboucher.couchone.com/_users/org.couchdb.user:&lt;i&gt;username&lt;/i&gt;' -d@userdata.json&lt;/pre&gt;&lt;div&gt;where the file userdata.json contains the following text:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;{&lt;br /&gt;  "name": "newuser",&lt;br /&gt;  "type": "user",&lt;br /&gt;  "roles": ["editor"]&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;3. Validator&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, to prevent creation of new documents (and modifications or deletion as well) from unauthorized users, I created a design document for my database that only contains a &lt;span class="Apple-style-span"&gt;validate_doc_update&lt;/span&gt; function. The validation function checks that the user that tries to create/modify/delete a document has the role &lt;code&gt;editor&lt;/code&gt;. The code goes as follows:&lt;/div&gt;&lt;pre&gt;{&lt;br /&gt;  "_id": "_design/address",&lt;br /&gt;  "validate_doc_update": "function (newdoc, olddoc, userCtx) { if (userCtx.roles.indexOf(\"editor\") == -1) throw({unauthorized: \"illegal access\"});}"&lt;br /&gt;}&lt;/pre&gt;&lt;div&gt;To create the design document, I simply entered the following at the shell prompt:&lt;br /&gt;&lt;pre&gt;% curl -X PUT 'https://&lt;i&gt;username:password&lt;/i&gt;@dboucher.couchone.com/streets/_design/address' -d@designdoc.json&lt;/pre&gt;That's it. I could certainly have done something fancier, but that worked and that was really easy to setup.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3648145707536123168?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3648145707536123168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3648145707536123168&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3648145707536123168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3648145707536123168'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/02/securing-couchdb-database.html' title='Securing a couchdb database'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8854059846902198564</id><published>2011-01-06T19:09:00.000-08:00</published><updated>2011-01-07T04:56:43.264-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>My resolutions for 2011</title><content type='html'>First of all, I wish all of you a very happy new year 2011!&lt;br /&gt;&lt;br /&gt;My regular readers may have noticed that I did not publish a lot of posts in the last months. I've been quite busy at work and wrote a number of articles on &lt;a href="http://blog.nuecho.com/"&gt;Nu Echo's blog&lt;/a&gt; instead. And most of all, I have not done as much Scheme or Erlang programming as I would have liked to do.&lt;br /&gt;&lt;br /&gt;But I played a bit with a number of different technologies in the past months (&lt;a href="http://ruby-lang.org/"&gt;Ruby&lt;/a&gt;, &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, &lt;a href="http://nodejs.org/"&gt;NodeJS&lt;/a&gt;, websockets, etc.) and it be would worthwhile to write down my observations on these technologies. So my resolution for this new year (as far as this blog is concerned) is to write on a more regular basis about them. For example, I will try to explain:&lt;div&gt;&lt;ul&gt;&lt;li&gt;what I think of Ruby and Groovy for writing DSLs from a Scheme perspective (you know I'm a big fan of macros and DSLs);&lt;/li&gt;&lt;li&gt;what makes Erlang a great language for writing voice applications;&lt;/li&gt;&lt;li&gt;my (very) personal take on NodeJS&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;and many other things.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, there seems to be a growing interest for SchemeScript in the last 6 months. The number of downloads on SourceForge has surged. For this reason, I will take some time to write tutorials and make some screencasts on how to use SchemeScript effectively.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy New Year! &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8854059846902198564?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8854059846902198564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8854059846902198564&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8854059846902198564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8854059846902198564'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2011/01/my-plan.html' title='My resolutions for 2011'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5870750292776636282</id><published>2010-08-24T19:43:00.000-07:00</published><updated>2010-08-25T06:42:00.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>ECMAScript - turning a binary function into a variadic one</title><content type='html'>In my &lt;a href="http://theschemeway.blogspot.com/2010/08/small-exercise-with-html5-canvas-and.html"&gt;previous post&lt;/a&gt;, I mentioned that it's easy to take a binary JavaScript function and turn it into a variadic one. Here's the helper function to do that:&lt;pre&gt;&lt;div&gt;&lt;div&gt;function variadic(fun, val0f, val1f) {&lt;/div&gt;&lt;div&gt;  return function() {&lt;/div&gt;&lt;div&gt;    var len = arguments.length;&lt;/div&gt;&lt;div&gt;    if (len == 0) {&lt;/div&gt;&lt;div&gt;       return val0f();&lt;/div&gt;&lt;div&gt;    } else if (len == 1) {&lt;/div&gt;&lt;div&gt;       if (val1f != undefined) {&lt;/div&gt;&lt;div&gt;         return val1f(arguments[0]);&lt;/div&gt;&lt;div&gt;       }&lt;/div&gt;&lt;div&gt;       else {&lt;/div&gt;&lt;div&gt;         return arguments[0];&lt;/div&gt;&lt;div&gt;       }&lt;/div&gt;&lt;div&gt;    } else {&lt;/div&gt;&lt;div&gt;      var tmp = fun(arguments[0], arguments[1]);&lt;/div&gt;&lt;div&gt;      for (index = 2; index &amp;lt; len; index++) {&lt;/div&gt;&lt;div&gt;        tmp = fun(tmp, arguments[index]);&lt;/div&gt;&lt;div&gt;      }&lt;/div&gt;&lt;div&gt;      return tmp;&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;div&gt;  };&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;The 'variadic' function takes three parameters:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;the binary function;&lt;/li&gt;&lt;li&gt;a function that returns the value for the variadic version when called with zero arguments&lt;/li&gt;&lt;li&gt;a function that returns the value for the variadic version when called on a single. If not specified, the first argument to the variadic function is returned as is when called on a single argument.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;For example, the summation operator is defined as&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;div&gt;var sum = variadic(function(x,y) {return x+y;},&lt;/div&gt;&lt;div&gt;                   function() { return 0;},&lt;/div&gt;&lt;div&gt;                   function(x) { return x;});&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;while the equivalent of Scheme's / function is defined as&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;div&gt;var div = variadic(function(x,y) {return x/y; },&lt;/div&gt;&lt;div&gt;                   function() { throw "not enough arguments to div"; },&lt;/div&gt;&lt;div&gt;                   function(x) { return 1/x;});&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;It is now possible to call&lt;pre&gt;&lt;div&gt;div.apply(this, [1,2,3,4,5])&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;to get 0.008333333333333333. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5870750292776636282?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5870750292776636282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5870750292776636282&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5870750292776636282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5870750292776636282'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/08/ecmascript-turning-binary-function-into.html' title='ECMAScript - turning a binary function into a variadic one'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-335198108456352140</id><published>2010-08-24T16:54:00.000-07:00</published><updated>2010-08-25T06:47:26.868-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>A small experiment with HTML5 canvas and Scheme to JavaScript conversion</title><content type='html'>&lt;div style="text-align: left;"&gt;Lately, I've been playing around with some of the upcoming features of HTML5. Last week, I decided to try the HTML canvas. In order to make a realistic test, I tried to port the parse tree viewer in &lt;a href="http://nugram.nuecho.com/"&gt;NuGram IDE&lt;/a&gt;, one of &lt;a href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt;'s products, to JavaScript and the HTML canvas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To debug a speech recognition grammar with NuGram IDE, an &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; plugin, the developer simply enters a test sentence and get a parse tree in the Interpretation view:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_pZixvIM5pl0/THRhNCZ4QRI/AAAAAAAAAOY/DP5lF2l600U/s1600/interpretation.png"&gt;&lt;img src="http://3.bp.blogspot.com/_pZixvIM5pl0/THRhNCZ4QRI/AAAAAAAAAOY/DP5lF2l600U/s320/interpretation.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509135120792568082" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 214px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;NuGram IDE is written almost entirely in Kawa Scheme. The parse tree viewer does not use any graph layout toolkit, the layout algorithm has been written from scratch in Scheme (about 200 lines of commented code).  It was a good candidate for a rewrite in JavaScript. Here is what I ended up with (in Chrome):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_pZixvIM5pl0/THRj7WrRldI/AAAAAAAAAOg/5G_LXNQb9j8/s320/canvas-chrome.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509138115531478482" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 186px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The conversion process&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I translated the whole layout algorithm by hand. I did not use (or develop) any automatic translation tool. I wanted to see how different the JavaScript code would look like compared to the original Scheme code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I knew that JavaScript/ECMAScript is one of Scheme's very close cousins, but it was amazingly easy to convert the Scheme code into very similarly looking JavaScript code. For instance, take this procedure definition:&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;div&gt;(define (compute-nodes-size! gc tree-node level)&lt;/div&gt;&lt;div&gt;  (compute-node-size! gc (get-graph-node tree-node))&lt;/div&gt;&lt;div&gt;  (set-level! tree-node level)&lt;/div&gt;&lt;div&gt;  (for-each (lambda (child)&lt;br /&gt;       (compute-nodes-size! gc child (+ level 1)))&lt;/div&gt;&lt;div&gt;            (get-node-children tree-node)))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;It translates to the following JavaScript definition:&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;div&gt;function computeNodesSize(ctx, treeNode, level) {&lt;/div&gt;&lt;div&gt;    computeNodeSize(ctx, treeNode.graphnode);&lt;/div&gt;&lt;div&gt;    treeNode.level = level;&lt;/div&gt;&lt;div&gt;    treeNode.children.forEach(function(child) { &lt;/div&gt;&lt;div&gt;          computeNodesSize(ctx, child, level + 1); &lt;/div&gt;&lt;div&gt;    });&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;Granted, it's a very simple example. There were some pieces of code that demanded a more complex rewrite. Uses of the Scheme apply procedure is an example. I had to translate the call&lt;/div&gt;&lt;pre&gt;&lt;div&gt;(apply max nodes-y)&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;to&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;div&gt;var maxY = 0;&lt;/div&gt;&lt;div&gt;nodesY.forEach(function(y) { if (y &gt; maxY) { maxY = y; } });&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;In JavaScript, the max function is not variadic function. It accepts exactly two arguments. It would have been possible to write a function that takes a function of two arguments and turns it into a variadic version of it. But it wasn't worth it, since there was only a single usage of apply and max in the whole algorithm.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; &lt;i&gt;I was completely mistaken here, as pointed out by Jon-Carlos Rivera in another post. the max function &lt;/i&gt;&lt;b&gt;&lt;i&gt;is&lt;/i&gt;&lt;/b&gt;&lt;i&gt; variadic. I could instead have written:&lt;/i&gt;&lt;/div&gt;&lt;pre&gt;&lt;div&gt;&lt;i&gt;Math.max.apply(this, nodesY)&lt;/i&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;i&gt;My mistake was to not use apply properly. The first argument to apply must be an object, and not the list of arguments. I should have RTFM before writing such nonsense. &lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Canvas Support&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;I tried my parse tree viewer on 3 different browsers (Chrome 5.0.375.29 beta, Firefox 3.6.8, Opera 10.61) on Ubuntu 9.04. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How portable is the resulting widget? Not as much as advertised. I know, HTML5 is not a standards yet, but most of the major browsers claim to support HTML5 canvases. There were two majors aspects that differed between browsers: rendering and user experience.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the rendering side, Firefox is the worst. Here is what I get:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_pZixvIM5pl0/THRuZQ0qlVI/AAAAAAAAAOo/UM7-2zgUeRU/s1600/canvas-ff.png"&gt;&lt;img src="http://2.bp.blogspot.com/_pZixvIM5pl0/THRuZQ0qlVI/AAAAAAAAAOo/UM7-2zgUeRU/s320/canvas-ff.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509149624472606034" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 138px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Some lines appear on top of the nodes (boxes), even though they were drawn before.  Opera is not bad, but the texts are not always rendered properly for some font sizes. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the user experience side, Opera seems the fastest of the three. Chrome comes close. In Firefox, however, the canvas is not redrawn while dragging the parse tree. The parse tree is redrawn only when the button is released. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In conclusion, I've been fairly pleased by the overall experience. The conversion from Scheme to JavaScript was painless, and the result was nice looking. However, and even though it's only based on anecdotal evidence or my lack of experience with the HTML5 canvas, portability is clearly not there yet. My guess is that we'll have to devote a lot of our development time fixing portability issues (we're already spending too much time doing exactly that for plain HTML, right?).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; &lt;i&gt;I put the canvas demo online &lt;/i&gt;&lt;a href="http://schemeway.dyndns.org/html-canvas"&gt;&lt;i&gt;here&lt;/i&gt;&lt;/a&gt;&lt;i&gt;. Try it and let me know if portability can be improved, if I did things the wrong way, etc.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-335198108456352140?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/335198108456352140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=335198108456352140&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/335198108456352140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/335198108456352140'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/08/small-exercise-with-html5-canvas-and.html' title='A small experiment with HTML5 canvas and Scheme to JavaScript conversion'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pZixvIM5pl0/THRhNCZ4QRI/AAAAAAAAAOY/DP5lF2l600U/s72-c/interpretation.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5264434132377450914</id><published>2010-07-16T06:52:00.000-07:00</published><updated>2010-07-16T07:07:48.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>A blog post on SchemeScript in Russian</title><content type='html'>Pavel Samolisov wrote a very good &lt;a href="http://samolisov.blogspot.com/2010/07/schemescript-scheme-eclipse.html"&gt;blog post&lt;/a&gt; on how to get started with &lt;a href="http://schemeway.sf.net/"&gt;SchemeScript&lt;/a&gt;. It's in Russian, but Google can translate it to English (the translation is definitely not very good, but it is better than nothing).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pavel noted that SchemeScript does not work well on Eclipse Helios. I just pushed a fix on the github repository (and the sourceforge git repository as well) that makes the interpreters work. If you find problems with Eclipse Helios and SchemeScript, please let me know. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5264434132377450914?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5264434132377450914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5264434132377450914&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5264434132377450914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5264434132377450914'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/07/blog-post-schemescript-is-russian.html' title='A blog post on SchemeScript in Russian'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2145692627381254634</id><published>2010-05-25T05:43:00.000-07:00</published><updated>2010-05-25T05:53:39.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><category scheme='http://www.blogger.com/atom/ns#' term='workshop'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>2010 Workshop on Scheme and Functional Programming</title><content type='html'>This year's Workshop on Scheme and Functional Programming will be held in Montreal on August 21-22. The &lt;a href="http://www.iro.umontreal.ca/~sfp2010"&gt;call for papers&lt;/a&gt; is out and papers are due in three weeks (June 14th). Even for those of you not in the research community, it is possible to submit a 6-page paper on practical experience on using Scheme or functional programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2145692627381254634?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2145692627381254634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2145692627381254634&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2145692627381254634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2145692627381254634'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/05/2010-workshop-on-scheme-and-functional.html' title='2010 Workshop on Scheme and Functional Programming'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6960774346819236466</id><published>2010-05-14T21:41:00.000-07:00</published><updated>2010-05-14T18:44:08.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='skype'/><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='asterisk'/><title type='text'>My VoIP setup at home</title><content type='html'>Recently, I had to work from home a bit more. Email and IM is great for communicating with my colleagues and friends, but sometimes talking to them is much more effective. So I decided to finalize my VoIP setup.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Skype&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Of course, Skype is the obvious choice for calling friends and relatives. It works great for voice and video on both Windows and my Ubuntu 9.04 (yes, I'm still on Jaunty). My webcam (a cheap Microsoft LifeCam VX-100) is not that well supported on Ubuntu, but it's not so bad. And I use a FreeTalk Everyman USB headset (I got it free at ITExpo in January, thanks to &lt;a href="http://www.disruptiveconversations.com/"&gt;Dan York&lt;/a&gt;!).&lt;br /&gt;&lt;br /&gt;But Skype itself is not the ultimate answer, at least not for me. Not all my colleagues use Skype at work. So why use Skype Out and pay for local calls when I already have a land line? And I don't like holding a (traditional) phone for one hour when I'm on a conference call with customers or other people at the office. I want to be able to put both of my hands on my laptop keyboard to take notes.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SIP at home&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cisco.com/en/US/prod/voicesw/ps6790/gatecont/ps10024/ps10027/SPA3102-200x160.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 160px;" src="http://www.cisco.com/en/US/prod/voicesw/ps6790/gatecont/ps10024/ps10027/SPA3102-200x160.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The answer to this is SIP, and three components:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A VoIP adapter. Mine is a &lt;a href="http://www.blogger.com/post-edit.g?blogID=7061944&amp;amp;postID=6960774346819236466&amp;amp;pli=1"&gt;Linksys SPA 3102 ATA&lt;/a&gt;, a VoIP adapter and gateway from Cisco. This little box converts ordinary (land line) calls into VoIP (SIP) calls, and vice-versa.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.asterisk.org"&gt;Asterisk&lt;/a&gt;, a free open-source software PBX. A PBX is the kind of system that can play messages to callers, ask for input, route calls, hold conference calls, queue calls, etc. PBXs are usually costly pieces of hardware that you don't want to buy just for you personal needs.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A SIP softphone.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;So my land line is connected directly to the VoIP gateway, which is itself connected to my wired network. When I receive a call on my land line, if I do not answer after a predetermined amount of time, the call is converted to a VoIP call and transferred to Asterisk on my Linux server. Asterisk tries to transfer the call to my SIP phone. If I ignore the call or when I'm not available, the call is simply sent to Asterisk's voice mail module, which will send me a notification email with the recorded message attached to it.&lt;br /&gt;&lt;br /&gt;When I want to place a call, I simply enter the number on my softphone, press ENTER, &lt;i&gt;et voilà&lt;/i&gt;!&lt;br /&gt;&lt;br /&gt;Of course, this whole setup requires a bit of configuration and dialplan programming.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Receiving SIP calls&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The only thing that I did not explain is how I can receive SIP calls from outside my home network. I sometimes need the ability to receive calls when I test outbound telephony applications on platforms like &lt;a href="http://tropo.com/"&gt;Tropo&lt;/a&gt; or &lt;a href="http://www.teleku.com/"&gt;Teleku&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In order to do this, I created an account on &lt;a href="http://ekiga.net/"&gt;Ekiga.net&lt;/a&gt;, a free VoIP service provider. I then configured Asterisk to automatically register (login) to my Ekiga.net account and transfer all calls to my SIP phone when I'm available.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SIP phones&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I mainly use two different SIP phones, depending on which OS I boot. On Windows, I use &lt;a href="http://www.counterpath.com/x-lite.html"&gt;X-Lite&lt;/a&gt; free edition. It has a lot of features, has video, but it only supports one account. On Linux, I use &lt;a href="http://www.twinklephone.com/"&gt;Twinkle&lt;/a&gt;, which is also free. It does not support video, but it is more stable than the Ekiga softphone on my machine, supports two lines, and has some basic voicemail support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6960774346819236466?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6960774346819236466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6960774346819236466&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6960774346819236466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6960774346819236466'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/04/my-voip-setup-at-home.html' title='My VoIP setup at home'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1544455628517984930</id><published>2010-04-13T06:12:00.000-07:00</published><updated>2010-04-13T06:23:23.267-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>RabbitMQ acquired by SpringSource</title><content type='html'>&lt;a href="http://www.rabbitmq.com/about.html"&gt;Rabbit Technologies&lt;/a&gt;, a spin out of &lt;a href="http://www.lshift.net/"&gt;LShift Ltd.&lt;/a&gt; and &lt;a href="http://www.cohesiveft.com/"&gt;Cohesive FT&lt;/a&gt;, has just been acquired by SpringSource, a division of &lt;a href="http://www.vmware.com/"&gt;VMWare&lt;/a&gt;. Rabbit Technologies is the company behind RabbitMQ, a high-performance open-source enterprise messaging system based on the AMPQ protocol. &lt;br /&gt;&lt;br /&gt;For me, the most interesting thing about this acquisition is the fact that RabbitMQ is an Erlang-based product. This shows once again that Erlang is not an esoteric language anymore, that even large companies are not afraid of using it. This is another great success story for Erlang! And I wish the Rabbit Technologies team the best for the upcoming years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1544455628517984930?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1544455628517984930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1544455628517984930&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1544455628517984930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1544455628517984930'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/04/rabbitmq-acquired-by-springsource.html' title='RabbitMQ acquired by SpringSource'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2202182296949668157</id><published>2010-03-10T18:09:00.000-08:00</published><updated>2010-03-10T18:20:41.436-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>SchemeScript on Github</title><content type='html'>In addition to moving all the development of &lt;a href="http://schemeway.sourceforge.net/schemescript"&gt;SchemeScript&lt;/a&gt; to git a few months ago, I just pushed my development repository to github. The repository is here:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &lt;a href="http://github.com/schemeway/SchemeScript"&gt;http://github.com/schemeway/SchemeScript&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I did this essentially because &lt;a href="http://github.com"&gt;github&lt;/a&gt; really rocks. It offers a lot of excellent features for tracking parallel development. I also happen to have a number of other projects hosted there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2202182296949668157?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2202182296949668157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2202182296949668157&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2202182296949668157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2202182296949668157'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/03/schemescript-on-github.html' title='SchemeScript on Github'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8160394783501430482</id><published>2010-02-20T20:20:00.000-08:00</published><updated>2010-02-20T20:27:42.004-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>SchemeScript used in the Scheme4edu project</title><content type='html'>Here is a &lt;a href="http://www.youtube.com/watch?v=i1BJrptWPfA&amp;feature=player_embedded"&gt;short screencast&lt;/a&gt; of &lt;a href="http://wiki.eclipse.org/Eclipse_IDE_for_Education"&gt;Scheme4Edu&lt;/a&gt;, a version of Eclipse streamlined specifically for use by university and college students, featuring the SchemeScript plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8160394783501430482?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8160394783501430482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8160394783501430482&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8160394783501430482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8160394783501430482'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2010/02/schemescript-used-in-scheme4edu-project.html' title='SchemeScript used in the Scheme4edu project'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6477880658985413539</id><published>2009-12-25T15:56:00.001-08:00</published><updated>2009-12-25T15:57:50.734-08:00</updated><title type='text'>Best wishes</title><content type='html'>I'd like to wish you all a Merry Christmas and a Happy New Year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6477880658985413539?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6477880658985413539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6477880658985413539&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6477880658985413539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6477880658985413539'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2009/12/best-wishes.html' title='Best wishes'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4423545105187958435</id><published>2009-11-18T16:47:00.000-08:00</published><updated>2009-11-18T18:08:57.593-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nugram'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>1-session-per-process - some further comments on the NuGram architecture</title><content type='html'>In response to my &lt;a href="http://theschemeway.blogspot.com/2009/11/architecture-of-nugram-hosted-server.html"&gt;previous post&lt;/a&gt; on the &lt;a href="http://www.grammarserver.com"&gt;NuGram&lt;/a&gt; architecture, Ben Simon wrote a &lt;a href="http://benjisimon.blogspot.com/2009/11/nugram-architecture-worth-pondering.html"&gt;post&lt;/a&gt; in which he focused most exclusively on the idea of using a single process for handling all the requests for a given session. I wanted to add a few comments about this approach.&lt;br /&gt;&lt;br /&gt;First, the idea is not new at all. In fact, I'd say that this is a pretty standard approach in Erlang and the language facilitates its implementation. For instance, the open-source &lt;a href="http://www.process-one.net/en/ejabberd/"&gt;ejabberd&lt;/a&gt; XMPP server uses this approach. &lt;br /&gt;&lt;br /&gt;Also, it is true that it is completely transparent to the system whether the session's process runs in the same Erlang VM or on a remote machine. The syntax is exactly the same: &lt;code&gt;Process ! Message&lt;/code&gt;. That's it. In the case of NuGram Server, the database (which replicates the session table on all nodes) holds references to Erlang processes. Once it has obtained the reference to the session's process, it simply sends a message encapsulating the request to that process (using the &lt;code&gt;!&lt;/code&gt; notation).  &lt;br /&gt;&lt;br /&gt;Of course, there are some complications if the node on which the process runs suddenly crashes or becomes unavailable. Session replication is less trivial to implement. In our case, the system maintains, together with the session table, a table holding all the relevant data to recreate a session if needed. This was fairly easy to do in our server given our requirements and the nature of the API. For more complex APIs, this could be much more challenging.&lt;br /&gt;&lt;br /&gt;Although I'm a big fan of the &lt;i&gt;1-session-per-process&lt;/i&gt; approach (it is a very effective one for the implementation of comet-like servers), it has some limitations that the continuation-based approach do not suffer. The back-button/bookmarking problem immediately comes to mind. Serializable continuations can be put in a database for later retrieval. But the question remains whether this is a practical approach. For instance, for how long do you retain continuations in the database? What happens when the code changes? &lt;br /&gt;&lt;br /&gt;Another benefit of using the continuation-based approach is the fact that the code handling the request is written in a more direct style. By this, I mean that the application flow is coded in a more sequential way: do this, then do that, etc. You don't have to code using state machines or callbacks. &lt;br /&gt;&lt;br /&gt;But this can be achieved in Erlang as well using two processes per session. (Processes are so cheap in Erlang!) This approach can be used to implement dialog-based applications and providing the illusion of a synchronous API, à la &lt;a href="http://www.tropo.com"&gt;Tropo&lt;/a&gt;). I'll talk more about this in another post very soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4423545105187958435?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4423545105187958435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4423545105187958435&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4423545105187958435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4423545105187958435'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2009/11/1-session-per-process-some-comments-on.html' title='1-session-per-process - some further comments on the NuGram architecture'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8167865147024234653</id><published>2009-11-11T16:31:00.000-08:00</published><updated>2009-11-12T07:12:35.715-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grammarserver'/><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='kawa'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='nuecho'/><title type='text'>The architecture of NuGram Hosted Server</title><content type='html'>In the comments section of one of my &lt;a href="http://theschemeway.blogspot.com/2009/10/dynamically-setting-yaws-log-level.html"&gt;previous post&lt;/a&gt;, I mentioned that NuGram Hosted Server (&lt;a href="http://www.grammarserver.com/"&gt;www.grammarserver.com&lt;/a&gt;) is implemented in a mix of Erlang/Yaws, Java and Kawa Scheme. Alexandre Abreu then asked a few questions about some architectural aspects:&lt;quote style="font-style: italic;"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;how do erlang and kawa scheme interop? http / json ? ffi ?&lt;/li&gt;  &lt;li&gt;to follow up on that, why erlang / yaws and not scala / lift to have a better integration with the jvm ? &lt;/li&gt;  &lt;li&gt;the server part if hosted on 1 machine ? how do you handle the load (both the connection load and the computation load since grammar and the services provided by NuGram seem pretty heavy computation-wise)? Maybe you don't need to do much given the amount of people that uses your service and I know you don't offer any guarantees with people using this service in a commercial setup but I am just wondering&lt;/li&gt;&lt;/ul&gt;&lt;/quote&gt;These questions prompted for a long answer. So in the following sections I describe some aspects of the NuGram Hosted Server architecture at 10,000 feet high.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Context&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;NuGram Hosted Server is a grammar hosting server for use by communication applications (VoiceXML applications, IM bots, etc.). It provides various grammar-related services through a RESTful API, like dynamic grammar generation and semantic interpretation of text-based sentences (and it will soon provide robust parsing capabilities). It also provides a community-based HTML application to management and share grammars, consult application logs, etc., using standard AJAX techniques.&lt;br /&gt;&lt;br /&gt;When we started the project, we had some ambitious requirements in mind: &lt;ul&gt;  &lt;li&gt;High-performance HTTP server.&lt;/li&gt;  &lt;li&gt;Scalability. (We needed the possibility of dynamically adding nodes to our cluster without interruption of service.)&lt;/li&gt;  &lt;li&gt;Fault-tolerance.&lt;/li&gt;  &lt;li&gt;Hot code swapping.&lt;/li&gt;  &lt;li&gt;Distributed database.&lt;/li&gt;&lt;/ul&gt;Since I already had some experience with Erlang, I pushed the idea to the management team, after getting the buy-in from my development team. We decided  to use this project to evaluate Erlang in the context of a real project.&lt;br /&gt;&lt;br /&gt;To answer Alexandre's question more specifically, we did not consider Scala/lift mainly for the same reason we did not choose Java itself. Essentially, we could not use the usual session tracking mechanisms found in J2EE environments (jsessionid, cookies) for our RESTful API. Implementing a clustered solution would have required too much work. And using Erlang was a far better (and more elegant) approach.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. The architecture&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;At a very high level, grammarserver.com is composed of two subsystems:&lt;ul&gt;  &lt;li&gt;&lt;i&gt;An Erlang/Yaws front-end.&lt;/i&gt;&lt;br /&gt;This is the part handling the HTTP requests. &lt;/li&gt;&lt;li&gt;&lt;i&gt;A number of Java/Kawa workers.&lt;/i&gt;&lt;/li&gt; These workers implement the grammar-related services. There can be many workers running on a single machine. These workers implement the more computation-intensive stuff (parsing of text sentences, grammar template instantation, etc.)&lt;/ul&gt; Let me describe each subsystem separately.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Erlang/Yaws front-end&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This subsystem handles all the HTTP requests. It currently consists of a single Erlang node, but it has been designed to support the clustering of many Erlang nodes. In this case, we would need a load-balancer in front of the Erlang cluster.&lt;br /&gt;&lt;br /&gt;The Erlang system follows most OTP principles. It is a real Erlang application and provides a supervisor and a number of gen_servers. The application also starts an embedded yaws serving requests for several virtual hosts (the HTML websites at www.grammarserver.com, nugram.nuecho.com, with and without SSL support, and the RESTful API at www.grammarserver.com:8082).&lt;br /&gt;&lt;br /&gt;Most requests to the RESTful API are done in the context of a session. Each session is associated with an Erlang process and the application keeps a mapping between the session ID and the process for the session in the &lt;a href="http://www.erlang.org/doc/apps/mnesia/index.html"&gt;Mnesia&lt;/a&gt; database (it is rather cool to store things like process IDs in a database!). So when the application receives a request, it extracts the session ID from the request URI, finds the corresponding process in the database, and simply forwards the request to that process.&lt;br /&gt;&lt;br /&gt;When multiple Erlang nodes are running in a cluster, forwarding a request can involve sending the request to a different Erlang node. This is done completely transparently  in Erlang.&lt;br /&gt;&lt;br /&gt;Another interesting consequence of using processes to represent sessions is the fact that implementing session timeout becomes trivial. Each session process makes an explicit &lt;code&gt;receive&lt;/code&gt; ... &lt;code&gt;after&lt;/code&gt;. When the timeout is reached, the session is automatically terminated and removed from the database.&lt;br /&gt;&lt;br /&gt;The application also uses Mnesia for other purposes:&lt;ul&gt;  &lt;li&gt;It holds the user accounts, of course. &lt;/li&gt;  &lt;li&gt;All the instantiated grammars are held in the database.&lt;/li&gt;  &lt;li&gt;It holds the node IDs of the available Java/Kawa workers. Keeping that information in a persistent (disk-based) table of Mnesia makes it possible to shut down the Erlang application and reconnect it automatically to the Java nodes when we restart it. More on this below.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Java/Kawa workers&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The Java/Kawa workers implement the basic NuGram services. They are written in a mix of Java and Kawa Scheme because most of the code is also shared with NuGram IDE, an Eclipse plugin.&lt;br /&gt;&lt;br /&gt;The workers use &lt;a href="http://www.erlang.org/doc/apps/jinterface/index.html"&gt;jinterface&lt;/a&gt; to interface with Erlang. This has the advantage of exposing the workers as standard nodes to the Erlang application. In other words, the Erlang application does not even know that the workers are implemented in Java. This is completely transparent.&lt;br /&gt;&lt;br /&gt;Many workers can be started, independently of the number of Erlang nodes. The first thing they do is try to find an Erlang node and register with it. If they cannot find an Erlang node, they wait for a specified amount of time, then try again. After a number of retries, they simply stop with an error.&lt;br /&gt;&lt;br /&gt;Each grammar is assigned to a single worker. To distribute the load as evenly as possible across the workers, the Erlang system uses a round-robin strategy to assign workers to new grammars (if a session uses a grammar already loaded in a worker, requests are sent directly to that worker, of course).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Overall, our experience with Erlang has been excessively positive. (I have to confess that my team members already had some prior exposure to functional programming and Prolog, which helped a lot). Of course, we had to learn some things the hard way, we found some bugs in Yaws. But in the end the platform delivered on its promises. We have an architecture that can scale, we can hot swap code, dynamically change the database schema, add nodes dynamically, etc.&lt;br /&gt;&lt;br /&gt;Since NuGram Hosted Server is a free service, we do not guarantee any quality of service, but the platform is really robust and fast and that is very important for communication applications (especially telephony applications where latency translates to &lt;span style="font-style: italic;"&gt;dead-air&lt;/span&gt; during a conversation).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8167865147024234653?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8167865147024234653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8167865147024234653&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8167865147024234653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8167865147024234653'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2009/11/architecture-of-nugram-hosted-server.html' title='The architecture of NuGram Hosted Server'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>4</thr:total></entry><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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/11/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2835252166172525712&amp;isPopup=true' title='9 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://theschemeway.blogspot.com/2009/10/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>9</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/10/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/09/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>4</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/09/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/07/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/05/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/05/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>6</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/05/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/05/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=7241764446110718924&amp;isPopup=true' title='2 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://theschemeway.blogspot.com/2009/05/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/03/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/03/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/03/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>13</thr:total></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' alt='' /&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='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=7770968492685390802&amp;isPopup=true' title='11 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://theschemeway.blogspot.com/2009/02/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>11</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/02/nils-holm-free-textbooks.html' title='Nils Holm&apos;s textbooks  for free'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/01/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2009/01/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=519953108941878842&amp;isPopup=true' title='7 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://theschemeway.blogspot.com/2009/01/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>7</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/12/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>5</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/12/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/12/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/11/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/09/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></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' alt='' /&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='http://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://theschemeway.blogspot.com/2008/09/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:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3378732368400293505</id><published>2008-09-12T06:16:00.000-07:00</published><updated>2008-09-12T07:01:31.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hot code swapping'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Hot code swapping - take 2</title><content type='html'>This is a follow up on my &lt;a href="http://theschemeway.blogspot.com/2008/09/hot-code-swapping-pitfalls-in-erlang.html"&gt;previous article&lt;/a&gt;, in which I described a few problems with hot code swapping in &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a comment, Philip Robinson wrote:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;It sounds like you have another (&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;lost?&lt;/span&gt;) process running code from that module, running version 1, that never receives the switch_code message.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;And that was exactly the cause of my problem. We were having a process leakage. The &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;switch_code&lt;/span&gt; message was only sent to processes that we were tracking, not all processes belonging to the loaded module. Unfortunately, we were not careful enough and some of these processes were lost in the process of switching code, preventing future code swapping.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So we have no need for an &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;after&lt;/span&gt; clause anymore. And I think that if you need such a hack, then you may not be properly managing your processes. At least, send the &lt;code&gt;switch_code&lt;/code&gt; message to all the processes for a given module:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;  lists:foreach(fun(Pid) &lt;- Pid ! switch_code end,&lt;br /&gt;                [Pid || Pid &lt;- processes(), erlang:check_process_code(Pid, Module)])&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3378732368400293505?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3378732368400293505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3378732368400293505&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3378732368400293505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3378732368400293505'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/09/hot-code-swapping-take-2.html' title='Hot code swapping - take 2'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3392682138659210468</id><published>2008-09-11T17:36:00.001-07:00</published><updated>2008-09-12T07:09:13.989-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hot code swapping'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Hot code swapping pitfalls in Erlang</title><content type='html'>Hot code swapping is a very nice feature of &lt;a href="http://www.erlang.org/"&gt;Erlang&lt;/a&gt;. (Please, don't bother commenting that this can be done in other languages too... I already know.) But there is little documentation about it, making everybody believe that it is trivial to support in every application. &lt;a href="http://pinard.progiciels-bpi.ca/"&gt;François&lt;/a&gt; and I had a hard time today trying to get hot code swapping run smoothly in one of our applications.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We basically had two problems. One we found quite easily (although this was not documented anywhere). The other one is still mystifying us, although we found a work-around that we don't completely understand. Let me discuss them in turn.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;try-catch and tail calls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you write a process loop function, it must be tail-recursive in order to avoid memory leaks. So you typically write something like:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;server_loop(State) -&gt;&lt;br /&gt; receive&lt;br /&gt;   SomeMessage -&gt;&lt;br /&gt;     ...&lt;br /&gt;     server_loop(NewState);&lt;br /&gt;   ...&lt;br /&gt; end.&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;As you can see, the call to &lt;code&gt;server_loop&lt;/code&gt; is called in tail-recursive position. This is equivalent to a GOTO with parameters. This call does not consume any stack space. To make this server support hot code swapping, we just need to add a clause for a special message, and fully qualify the recursive call with the module name:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;server_loop(State) -&gt;&lt;br /&gt; receive&lt;br /&gt;   switch_code -&gt;&lt;br /&gt;     ?MODULE:server_loop(State);&lt;br /&gt;   SomeMessage -&gt;&lt;br /&gt;     ...&lt;br /&gt;     server_loop(NewState);&lt;br /&gt;   ...&lt;br /&gt; end.&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;So you have to make sure that all the recursive calls to the server loop have to be in tail-call position. In our application, we had something like that:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;     try&lt;br /&gt;      NewState = doSomething(State),&lt;br /&gt;      server_loop(NewState)&lt;br /&gt;   catch&lt;br /&gt;      Error -&gt;&lt;br /&gt;        server_loop(State)&lt;br /&gt;   end&lt;/pre&gt;We assumed that both calls to &lt;code&gt;server_loop&lt;/code&gt; were in tail-call position. We were wrong. Of course, the &lt;code&gt;try-catch&lt;/code&gt; form installs an exception handler for the whole dynamic extent of its body statements. Which means that some stack space is consumed, and probably with references to the current code. Even if we add support for the &lt;code&gt;switch_code&lt;/code&gt; message, this process will not switch to the new code and will eventually be killed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But this was easy to fix, once we figured all this out.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Use of an after clause&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other problem we had, we simply fixed it without understanding why. (If you know, please leave me a comment!!) We have a very simple process loop, coded exactly as I explained above. Unfortunately, the process get killed when we reload the code 3 times. Even if we send the &lt;code&gt;switch_code&lt;/code&gt; message. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The fix, suggested &lt;a href="http://spawnlink.com/articles/rules-of-hot-code-swapping/"&gt;here&lt;/a&gt; but without a satisfactory explanation, consisted in adding a &lt;code&gt;after&lt;/code&gt; clause to the &lt;code&gt;receive&lt;/code&gt; statement:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;server_loop(State) -&gt;&lt;br /&gt; receive&lt;br /&gt;   switch_code -&gt;&lt;br /&gt;     ?MODULE:server_loop(State);&lt;br /&gt;   SomeMessage -&gt;&lt;br /&gt;     ...&lt;br /&gt;     server_loop(NewState);&lt;br /&gt;   ...&lt;br /&gt; after&lt;br /&gt;    10 * 1000 -&gt;&lt;br /&gt;      ?MODULE:server_loop(State)&lt;br /&gt; end.&lt;br /&gt;&lt;/pre&gt;Now we can update our whole application without service interruption. But this was not as simple as it first seemed (and advertised ;-). &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt;I posted a &lt;a href="http://theschemeway.blogspot.com/2008/09/hot-code-swapping-take-2.html"&gt;follow-up&lt;/a&gt; explaining the problem we had.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3392682138659210468?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3392682138659210468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3392682138659210468&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3392682138659210468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3392682138659210468'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/09/hot-code-swapping-pitfalls-in-erlang.html' title='Hot code swapping pitfalls in Erlang'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6860911549969018125</id><published>2008-09-01T18:07:00.000-07:00</published><updated>2008-09-01T18:25:32.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voxeo'/><category scheme='http://www.blogger.com/atom/ns#' term='prophecy'/><title type='text'>Exceptional (and free) technical support</title><content type='html'>For one of the demos I did at &lt;a href="http://www.speechtek.com"&gt;SpeechTEK&lt;/a&gt; two weeks ago, I had to use &lt;a href="http://voxeo.com/developers/"&gt;Voxeo Prophecy&lt;/a&gt;. Unfortunately, only a few days before I got to vacation, I found that my installation was broken, and I didn't know why. I reinstalled the software a few times with no more success.&lt;br /&gt;&lt;br /&gt;I then contacted them on their technical support forums. What a great customer support experience it was! They were very responsive and pinpointed the problem in a matter of a few posts. But the most interesting thing is that it was completely free, for a free product. If at least we could get that level of support for most paying products... These guys are simpy amazing.&lt;br /&gt;&lt;br /&gt;If you want to experiment with VoiceXML, VoIP, and voice applications, go &lt;a href="http://evolution.voxeo.com"&gt;here&lt;/a&gt;. (It's just sad they don't support Canadian French... ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6860911549969018125?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6860911549969018125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6860911549969018125&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6860911549969018125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6860911549969018125'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/09/exceptional-and-free-technical-support.html' title='Exceptional (and free) technical support'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4058785408241184645</id><published>2008-09-01T17:08:00.000-07:00</published><updated>2008-09-01T17:30:57.432-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='nuecho'/><title type='text'>Our corporate blog</title><content type='html'>At &lt;a href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt;, we just launched our &lt;a href="http://blog.nuecho.com/"&gt;corporate blog&lt;/a&gt;. I will post articles there on a regular basis (in fact probably more often than here, unfortunately) as I will be one of the main contributors. I hope I will have the opportunity to describe (here) our use of some non-mainstream languages (I let you guess which ones ;-), our experience with interns learning and using them, and how they are perceived in the market place (as well as the show-stoppers, of course). I have learned a lot in the past months. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4058785408241184645?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4058785408241184645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4058785408241184645&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4058785408241184645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4058785408241184645'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/09/our-corporate-blog.html' title='Our corporate blog'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3283813081746667434</id><published>2008-08-24T18:56:00.000-07:00</published><updated>2008-08-25T04:25:25.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='nuecho'/><title type='text'>Back to blogging!</title><content type='html'>Wow! It's been 4 months since my last post. I've been really, really busy. But there's no excuse. I should have blogged a little, at least. It's just that now that I am a partner at &lt;a href="http://www.nuecho.com/"&gt;Nu Echo&lt;/a&gt;, I have more things to do. Not only that, Nu Echo has released a new line of products during the &lt;a href="http://www.speechtek.com/"&gt;SpeechTEK conference&lt;/a&gt; earlier this week, the &lt;a href="http://www.nuecho.com/content/view/52/174/lang,en/"&gt;NuGram platform&lt;/a&gt;. I worked like crazy in the last 3 months. (I even worked during my family vacations...)&lt;br /&gt;&lt;br /&gt;I hope I'll be able to blog on a more regular basis in the upcoming weeks, months. Probably on subjects other than Scheme (Erlang, startups, etc.), but not that far from the original spirit of this blog. (What is it, btw?) But I will also contribute to our corporate blog as well. So stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3283813081746667434?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3283813081746667434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3283813081746667434&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3283813081746667434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3283813081746667434'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/08/back-to-blogging.html' title='Back to blogging!'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2147525336567911604</id><published>2008-04-22T18:24:00.000-07:00</published><updated>2008-04-22T18:47:21.509-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='rest'/><title type='text'>REST support in Voxeo Prophecy</title><content type='html'>One of the nice additions of &lt;a href="http://www.w3.org/TR/voicexml21"&gt;VoiceXML 2.1&lt;/a&gt; to the 2.0 version of the standard is the ability to query XML data on other HTTP servers by means of the &amp;lt;data&amp;gt; element. The specification dictates support for the GET or POST HTTP methods. But it says nothing about the other methods (DELETE, PUT, etc.). This is rather limitating, IMO (and strange, given the fact that it was published last year). &lt;br /&gt;&lt;br /&gt;Last night, I wanted to start playing with this feature on the free, hosted &lt;a href="http://voxeo.com/developers/"&gt;Voxeo Prophecy &lt;/a&gt;platform. And I found that the DELETE method was also supported. I did not try the PUT method, but I guess it is supported too. I really think they did a great move implementing support for all the HTTP methods and not limit the platform to the plain VoiceXML standard. This way, they enable RESTful applications to be accessed/used directly from VoiceXML applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2147525336567911604?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2147525336567911604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2147525336567911604&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2147525336567911604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2147525336567911604'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/04/rest-support-in-voxeo-prophecy.html' title='REST support in Voxeo Prophecy'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6705478256874257130</id><published>2008-04-13T18:10:00.000-07:00</published><updated>2008-04-13T18:15:36.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google code'/><category scheme='http://www.blogger.com/atom/ns#' term='lalr-scm'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>lalr-scm on Google code</title><content type='html'>I've just put &lt;code&gt;lalr-scm&lt;/code&gt;, my LALR(1) parser generator for Scheme, on &lt;a href="http://code.google.com"&gt;Google Code&lt;/a&gt;. The project can be found &lt;a href="http://code.google.com/p/lalr-scm"&gt;here&lt;/a&gt;. The documentation is in the associated wiki.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6705478256874257130?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6705478256874257130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6705478256874257130&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6705478256874257130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6705478256874257130'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/04/lalr-scm-on-google-code.html' title='lalr-scm on Google code'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-7271973142534599909</id><published>2008-02-05T06:41:00.001-08:00</published><updated>2008-02-05T19:34:25.479-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arc'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>Arc support in SchemeScript - update</title><content type='html'>I've just released a new version of &lt;a href="http://sourceforge.net/projects/schemeway"&gt;SchemeScript&lt;/a&gt;. It's still an alpha release.&lt;br /&gt;&lt;br /&gt;The main feature of this new version is an optional support for &lt;a href="http://arclanguage.org"&gt;Arc.&lt;/a&gt; To activate it (this will be easier in a future release), unzip the dowloaded file in your Eclipse main directory. Then open &lt;span style="font-family: courier new;"&gt;$(eclipse_home)/plugins/org.schemeway.plugins.schemescript_1.3.0_alpha3/conf/user.scm&lt;/span&gt; and uncomment the last line (the one that loads &lt;span style="font-family: courier new;"&gt;"languages/arc.scm"&lt;/span&gt;). Restart Eclipse.&lt;br /&gt;&lt;br /&gt;If you have any problem, let me know. Note that it may not support all Arc primitive forms and functions. But if you put all the Arc implementations files in your workspace, you'll have access to all of them both for code completion and content assist. I think this makes SchemeScript a pretty neat IDE for Arc.&lt;br /&gt;&lt;br /&gt;Finally, note that I did not work a lot to optimize the indentation of all Arc special forms. Any help will be greatly appreciated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-7271973142534599909?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/7271973142534599909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=7271973142534599909&amp;isPopup=true' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/7271973142534599909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/7271973142534599909'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/02/arc-support-in-schemescript-update.html' title='Arc support in SchemeScript - update'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2453422189162647733</id><published>2008-02-04T19:32:00.000-08:00</published><updated>2008-02-05T19:43:18.794-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arc'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>Arc support in SchemeScript</title><content type='html'>Although I do not agree with &lt;a href="http://arclanguage.org/"&gt;Arc&lt;/a&gt;'s design goals (more on this in an upcoming post), I have decided to give it a try. As I usually say to my kids: you never know whether you don't like something unless you tried it first.&lt;br /&gt;&lt;br /&gt;So I do downloaded it this evening and installed it.&lt;br /&gt;&lt;br /&gt;Of course, since my main development environment for Scheme is my own Eclipse plugin, &lt;a href="http://sourceforge.net/projects/schemeway"&gt;SchemeScript&lt;/a&gt;, my first step was to add support for Arc (like adding proper indentation rules, support for most special forms, support for code assist - proposals, completion, etc.):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pZixvIM5pl0/R6fbDGReh0I/AAAAAAAAAFI/5yFqIzYcKMA/s1600-h/arc.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_pZixvIM5pl0/R6fbDGReh0I/AAAAAAAAAFI/5yFqIzYcKMA/s320/arc.bmp" alt="" id="BLOGGER_PHOTO_ID_5163336344073570114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If there is enough interest, I can package something and make it available.  Just let me know.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; I &lt;a href="http://theschemeway.blogspot.com/2008/02/arc-support-in-schemescript-update.html"&gt;just released a new version&lt;/a&gt; of SchemeScript that supports Arc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2453422189162647733?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2453422189162647733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2453422189162647733&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2453422189162647733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2453422189162647733'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/02/arc-support-in-schemescript.html' title='Arc support in SchemeScript'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pZixvIM5pl0/R6fbDGReh0I/AAAAAAAAAFI/5yFqIzYcKMA/s72-c/arc.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-7311097797009577982</id><published>2008-02-03T17:13:00.000-08:00</published><updated>2008-02-03T18:43:57.303-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internship'/><category scheme='http://www.blogger.com/atom/ns#' term='recruiting'/><title type='text'>Recruiting interns</title><content type='html'>It's that time of the year. For the second year in a row, &lt;a href="http://www.nuecho.com"&gt;Nü Echo&lt;/a&gt; is recruiting interns for next summer. We mainly advertise our projects at &lt;a href="http://www.polymtl.ca"&gt;École Polytechnique&lt;/a&gt;, an engineering school here in Montréal.  Since I am deeply involved in the whole recruiting process, I came to a number rules that proved very beneficial.&lt;br /&gt;&lt;br /&gt;First, let me set the context. Recruiting interns is not easy in Montreal. (I guess this is true in all major cities.) There are five times more internship projects than there are students competing for them. So competition is tough. Moreover, most co-op programs favor students in the recruiting process (this is not the case at École Polytechnique). Add to that the fact that Nü Echo is a small, not really well-known company among students (we are well-known in the call center and telecommunications industries, though)...&lt;br /&gt;&lt;br /&gt;Despite these pretty adverse conditions, last year's recruiting went really well, with great results at the end of summer. We filled all our positions and all students exceeded our expectations. And this year promises to be even better. We will have to decline great students.&lt;br /&gt;&lt;br /&gt;To achieve these results, I try to apply the following rules:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Offer exciting projects.&lt;/span&gt; Most companies consider interns as cheap resources and ask them to do the dirty, uninteresting stuff. Like coding test cases, running the tests, etc.&lt;br /&gt;&lt;br /&gt;When elaborating an internship project, I always ask myself: would I apply for the job? To me, the best project is self-contained, with a right balance between analysis, design, coding, testing. It shall also involve leading-edge technologies and be a project that will matter to the company. Not something that will be put on the shelf in September.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Be quick!&lt;/span&gt; As soon as you receive the students' resumes, screen them and schedule interviews.  And if the interview goes well, make an offer. At École Polytechnique, students have only 24h to accept/decline an offer. This can turn to your advantage. Bigger HR departments usually move more slowly, so a 2nd year student will accept a nice project early if they are not certain of being offered a better one later during the semester.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Supervise them&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;adequately&lt;/span&gt;. This should go without saying, but it is not always the case. Summer is usually the time of the year when regular employees and managers take their vacations. It may be difficult to supervise your students. But believe me. If you are not gonna be able to supervise them adequately, don't offer internship projects.&lt;br /&gt;&lt;br /&gt;Of course, we expect our students to be rather automonous, but don't forget that they are &lt;span style="font-style: italic;"&gt;students&lt;/span&gt;, they are with us to learn. I've seen companies where students were left almost unsupervised, not really knowing what to do. They waste time and money.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Treat them like regular employees&lt;/span&gt;. You want them to come back next year. So make them feel that they are part of the team, that they bring value to the company. They are your future.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Hire both 2nd year and 3rd students&lt;/span&gt;. The 3rd year students (given they are on a 4 years program) can make good candidates for your future job openings.&lt;br /&gt;&lt;br /&gt;The 2nd year students, even if they won't work for you during their 3rd year summer, will help cultivate the reputation of your company at school. They will talk about you. This is akin to viral marketing.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Internship projects, when done right, are a great way to advertise your company. Not to potential customers (although this could be), but to your future employees. Students will return to school at the end of the summer and will talk about your company if they appreciated their experience working with you. And good students usually attract other good students. This could definitely help your whole recruiting process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-7311097797009577982?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/7311097797009577982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=7311097797009577982&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/7311097797009577982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/7311097797009577982'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/02/recruiting-interns.html' title='Recruiting interns'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5996894980155221812</id><published>2008-02-02T06:21:00.001-08:00</published><updated>2008-02-04T07:48:15.948-08: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='prophecy'/><title type='text'>Voxeo Prophecy</title><content type='html'>Want to experiment with speech technologies, VoiceXML, VoIP? Give &lt;a href="http://voxeo.com/prophecy/"&gt;Prophecy&lt;/a&gt; a try. It's &lt;a href="http://voxeo.com/"&gt;Voxeo&lt;/a&gt;'s complete standards-based IVR solution. You can download a free, fully-functional, copy with decent speech recognition and text-to-speech (US english only), a SIP phone, a complete web-based application designer, and more. It supports VoiceXML 2.0, SRGS/SISR, CCXML, SSML, and MRCP. The free version supports 2 callers at once (2 ports in telephony jargon).&lt;br /&gt;&lt;br /&gt;I downloaded it two days ago and it installed out of the box and worked right away. I was deeply impressed!&lt;br /&gt;&lt;br /&gt;They also have a number of &lt;a href="http://blogs.voxeo.com/"&gt;corporate blogs&lt;/a&gt;, and they are very &lt;a href="http://blogs.voxeo.com/voxeodeveloperscorner/2008/01/28/certified-tech-tip-using-sisr-formatted-grammar-returns-with-prophecy-8/#comments"&gt;responsive&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The only drawback is that they don't support Canadian French (unless you buy the Nuance speech recognizer... but it's not cheap). I would have used it at home otherwise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5996894980155221812?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5996894980155221812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5996894980155221812&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5996894980155221812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5996894980155221812'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/02/voxeo-prophecy.html' title='Voxeo Prophecy'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4320661742668044993</id><published>2008-01-04T19:24:00.000-08:00</published><updated>2008-01-04T19:39:46.404-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>Renaming a symbol globally</title><content type='html'>A while ago, I implemented a feature in &lt;a href="http://schemeway.sourceforge.net/"&gt;SchemeScript&lt;/a&gt; that proved quite useful today: an action that renames a symbol in all the Scheme source files in the workspace.&lt;br /&gt;&lt;br /&gt;To do that, simply put the cursor on the symbol and press Alt-Shift-R G. The following dialog box will be shown:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pZixvIM5pl0/R375IKRteYI/AAAAAAAAAEI/BYxfWhG8XRs/s1600-h/rename.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_pZixvIM5pl0/R375IKRteYI/AAAAAAAAAEI/BYxfWhG8XRs/s320/rename.bmp" alt="" id="BLOGGER_PHOTO_ID_5151828942351333762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Press Ok to accept the new symbol name. All the files containing the modified references will be automatically saved (and this cannot be undone, so be warned!).&lt;br /&gt;&lt;br /&gt;This features is useful when you want to rename a function or constant globally, or (in my case) when you want to rename a module name and make sure all the importing modules are propertly updated. Of course, this is not a semantic-preserving transformation. It's only lexical. But nonetheless it proves useful once in a while.&lt;br /&gt;&lt;br /&gt;Note that two other renaming actions exist:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rename symbol in file: this action will rename all the symbol references, but only in the same file (Alt-Shift-R F);&lt;/li&gt;&lt;li&gt;rename symbol locally: this action will rename the symbol and its references in the same top-level definition (Alt-Shift-R L).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This feature is only available in the alpha version that can be downloaded from the SourceForge &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=118220"&gt;download section&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4320661742668044993?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4320661742668044993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4320661742668044993&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4320661742668044993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4320661742668044993'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/01/renaming-symbol-globally.html' title='Renaming a symbol globally'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pZixvIM5pl0/R375IKRteYI/AAAAAAAAAEI/BYxfWhG8XRs/s72-c/rename.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3407679511534790971</id><published>2008-01-02T16:32:00.001-08:00</published><updated>2008-01-02T17:07:43.146-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openfire'/><category scheme='http://www.blogger.com/atom/ns#' term='smack'/><category scheme='http://www.blogger.com/atom/ns#' term='xmpp'/><category scheme='http://www.blogger.com/atom/ns#' term='spark'/><category scheme='http://www.blogger.com/atom/ns#' term='instant messaging'/><title type='text'>Experiments with IM client and server</title><content type='html'>Yesterday, I installed &lt;a href="http://www.igniterealtime.org/projects/openfire/index.jsp"&gt;Openfire&lt;/a&gt;, a Java-based &lt;a href="http://xmpp.org"&gt;XMPP&lt;/a&gt; server from &lt;a href="http://www.igniterealtime.org/"&gt;Ignite Realtime&lt;/a&gt;. I also installed their XMPP client, &lt;a href="http://www.igniterealtime.org/projects/spark/index.jsp"&gt;Spark&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My first impression is very good. Both softwares were installed and made operational in a matter of seconds (really!). The server can be easily configured using a web-based interface. And it ships with hsql for light installs not requiring high volume or scalability.&lt;br /&gt;&lt;br /&gt;Ignite Realtime also provides a Java library for developing XMPP clients, &lt;a href="http://www.igniterealtime.org/projects/smack/index.jsp"&gt;Smack&lt;/a&gt;. And the documentation that comes with the API is very good. &lt;br /&gt;&lt;br /&gt;Of course, the first thing I did once everything was up and running was to develop a small client application in Kawa Scheme. The client is a very simple-minded bot that can evaluate Scheme expressions. Here is a screen shot:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pZixvIM5pl0/R3wy1KRteXI/AAAAAAAAAEA/WLzzslaQZCw/s1600-h/bot.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_pZixvIM5pl0/R3wy1KRteXI/AAAAAAAAAEA/WLzzslaQZCw/s320/bot.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5151047962678098290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It took about 45 lines of code to achieve that. And most of the code is declaring Kawa namespaces for Java/Scheme integration, and processing a message (converting the body to a string, reading the expression, evaluating it, handling errors, etc.).&lt;br /&gt;&lt;br /&gt;I don't know how long it would have taken me to write the same thing directly in Scheme, without the Smack library. Handling the XMPP stream is not trivial at all. One must be able to recover from many error situations and I'm not sure if the current XML libraries in Scheme (SSAX-SXML or the ones that come with PLT-Scheme) would be usable at all. Maybe. I don't know. If you have opinions on this, please share them with me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3407679511534790971?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3407679511534790971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3407679511534790971&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3407679511534790971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3407679511534790971'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/01/experiments-with-im-client-and-server.html' title='Experiments with IM client and server'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pZixvIM5pl0/R3wy1KRteXI/AAAAAAAAAEA/WLzzslaQZCw/s72-c/bot.bmp' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3961903239053849457</id><published>2008-01-02T16:24:00.000-08:00</published><updated>2008-01-02T16:32:16.379-08:00</updated><title type='text'>Happy New Year</title><content type='html'>I wish you all a very happy new year!&lt;br /&gt;&lt;br /&gt;I've been quite busy since the start of November, explaining the lack of interesting posts on this blog. I'm working on an internal project at &lt;a href="http://www.nuecho.com"&gt;Nü Echo&lt;/a&gt; that takes all my time. I will blog about it eventually, since it is all done in Scheme. (No, it does not involve Gambit-C nor Termite, only Kawa. But it's worth it anyway ;-) I may also give demos of the product at local &lt;a href="http://barcamp.org"&gt;DemoCamp/BarCamp&lt;/a&gt; events, here in Montreal, in a near future. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3961903239053849457?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3961903239053849457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3961903239053849457&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3961903239053849457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3961903239053849457'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2008/01/happy-new-year.html' title='Happy New Year'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1680586993298265003</id><published>2007-12-01T08:13:00.001-08:00</published><updated>2007-12-01T08:19:39.553-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>MSLUG meeting next week</title><content type='html'>The next meeting of the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; will be next Wednesday, December 5th. Four talks are scheduled and they will all cover the same subject, from different angles: the commercial use of Scheme/Lisp. I will talk about our experience using Scheme at &lt;a href="http://www.nuecho.com"&gt;Nü Echo&lt;/a&gt;, and in particular what pitfalls to avoid when introducing a non-mainstream language in the enterprise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1680586993298265003?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1680586993298265003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1680586993298265003&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1680586993298265003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1680586993298265003'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/12/mslug-meeting-next-week.html' title='MSLUG meeting next week'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8307395383152765825</id><published>2007-11-16T09:53:00.001-08:00</published><updated>2007-11-16T10:04:28.554-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>A new release of SchemeScript!</title><content type='html'>&lt;a href="http://sourceforge.net/projects/schemeway"&gt;SchemeScript&lt;/a&gt; 1.3.0 alpha 1 is out! This is the first release in more than a year now.&lt;br /&gt;&lt;br /&gt;The new noteworthy features are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Precise location of symbol definitions. All the symbol dictionary stuff has been reimplemented from scratch, and now mainly in Scheme. The outline now better reflects the structure of the code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for hyperlinks to jump to a symbol definition.&lt;/li&gt;&lt;li&gt;Support for #! on the first line of a Scheme file (typically used for Scheme shell scripts).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Punctuation tokens are now colorized independently.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Support for &lt;a href="http://snow.iro.umontreal.ca"&gt;Snow&lt;/a&gt; &lt;span style="font-family: courier new;"&gt;package*&lt;/span&gt; and &lt;a href="http://www.r6rs.org"&gt;R6RS&lt;/a&gt; &lt;span style="font-family: courier new;"&gt;library&lt;/span&gt; forms.&lt;/li&gt;&lt;li&gt;[] are treated like ().&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course, a few bugs have been fixed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; Since it is only an alpha version, a few things are lacking, especially regarding the documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8307395383152765825?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8307395383152765825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8307395383152765825&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8307395383152765825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8307395383152765825'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/11/new-release-of-schemescript.html' title='A new release of SchemeScript!'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5105085121542565385</id><published>2007-11-08T09:01:00.000-08:00</published><updated>2007-11-20T04:09:02.597-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>Video of Manuel Serrano's talk on HOP</title><content type='html'>A video of Manuel Serrano's talk at the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; is &lt;a href="http://video.google.com/videoplay?docid=-832112541104472707&amp;hl=en"&gt;available on Google Video&lt;/a&gt;, thanks to Daniel Caune.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; the link above has been modified. The previous one was broken.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5105085121542565385?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5105085121542565385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5105085121542565385&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5105085121542565385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5105085121542565385'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/11/video-of-manuel-serranos-talk-on-hop.html' title='Video of Manuel Serrano&apos;s talk on HOP'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1319979002767649225</id><published>2007-11-06T17:59:00.000-08:00</published><updated>2007-11-06T18:14:41.435-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><title type='text'>Domain-specific languages and GUIs</title><content type='html'>Phil Windley has a &lt;a href="http://www.windley.com/archives/2007/11/domain_specific_language.shtml"&gt;nice post on DSLs&lt;/a&gt; (found via &lt;a href="http://patricklogan.blogspot.com/2007/11/dsl-better-than-you-think.html"&gt;Patrick Logan&lt;/a&gt;). I share most of his thoughts on the subject, except regarding GUIs.&lt;br /&gt;&lt;br /&gt;I think that when they are well designed, GUIs can be a good substitute for the DSL itself. GUIs can be just another way of representing the same program but in a different form. They can even provide insights or different views on the program that may not be easily visualized by looking at the program text itself. Of course, this assumes that the GUI can give access to the full power of the underlying language and not be a pale substitute.&lt;br /&gt;&lt;br /&gt;That's why designing GUIs for DSLs can be really challenging. And fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1319979002767649225?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1319979002767649225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1319979002767649225&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1319979002767649225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1319979002767649225'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/11/domain-specific-languages-and-guis.html' title='Domain-specific languages and GUIs'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1817291159503310932</id><published>2007-11-02T18:42:00.000-07:00</published><updated>2007-11-02T18:49:49.350-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>A new beginning</title><content type='html'>Today, I resigned as the main organizer of the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt;. Here is the message I sent to the mailing-list:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Guys,&lt;br /&gt;&lt;br /&gt;the last few months have been very exciting. Our group has reached a critical mass and has now a lot of visibility. Many people have joined our group and we see more and more interest in Scheme/Lisp (as well as Erlang) in Montreal.&lt;br /&gt;&lt;br /&gt;Unfortunately, I have to resign as the main organizer. This was a tough decision. But I am currently working on other projects that require all of my spare time. I hate not being able to give the best I can on something. And I clearly don't have enough time to organize as good meetings as I'd like. And our group definitely deserves the best meetings.&lt;br /&gt;&lt;br /&gt;But I am please to announce that Guillaume Germain will, as of today, become the main organizer of the MSLUG. I am totally convinced that Guillaume will make a better job than I did. Thanks Guillaume!&lt;br /&gt;&lt;br /&gt;Thank you everyone for making the MSLUG one of the best Scheme/Lisp user group on the planet. All the effort was really worth it! Thanks especially to Marc Feeley who helped me organize the meetings.&lt;br /&gt;&lt;br /&gt;See you soon!&lt;br /&gt;&lt;br /&gt;Dominique&lt;br /&gt;&lt;br /&gt;P.S. Don't worry! I will still program (even professionally) in Scheme and attend the MSLUG meetings, although not necessarily as regularly as I used to.&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-1817291159503310932?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1817291159503310932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1817291159503310932&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1817291159503310932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1817291159503310932'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/11/new-beginning.html' title='A new beginning'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-521631119725622211</id><published>2007-10-25T05:48:00.000-07:00</published><updated>2007-11-02T18:47:36.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>What a meeting!</title><content type='html'>All I can say is that our &lt;a href="http://schemeway.dyndns.org/mslug/meeting/24"&gt;last meeting&lt;/a&gt; of the MSLUG was a true success! We had more than 60 attendees. Of course, since we held it during the OOPSLA conference, it was much easier to attract people that would not have come otherwise (like &lt;a href="http://research.google.com/pubs/author35958.html"&gt;Mark Miller&lt;/a&gt; from Google, the Smalltalkers from &lt;a href="http://cincom.com/us/eng/index.jsp?loc=usa"&gt;Cincom&lt;/a&gt;, &lt;a href="http://saxo.essi.fr/%7Egallesio/"&gt;Erick Gallesio&lt;/a&gt; from Nice University, &lt;a href="http://www.cs.brown.edu/%7Esk/"&gt;Shriram Krishnamurti&lt;/a&gt; from Brown University, &lt;a href="http://bc.tech.coop/"&gt;Bill Clementson&lt;/a&gt;, and the list goes on). Nonetheless, some came only to attend the MSLUG meeting, like &lt;a href="http://xach.livejournal.com/"&gt;Xach Beane&lt;/a&gt; from Maine, USA, and &lt;a href="http://factor-language.blogspot.com/"&gt;Slava Pestov&lt;/a&gt; from Ottawa, Canada.&lt;br /&gt;&lt;br /&gt;The meeting began at 7h45PM and lasted more than 2 hours. One third of the attendees then joined us at the pub.&lt;br /&gt;&lt;br /&gt;Both speakers really entertained their audience and they got a lot of insightful questions and remarks. Manuel Serrano presented its &lt;a href="http://hop.inria.fr/"&gt;HOP&lt;/a&gt; system, a programming language designed to help write interactive multimedia applications. Then Pascal Costanza presented ContextL, his extension to Common Lisp for context-oriented programming. Daniel Caune videotaped the first part and it should be available soon on Google Video.&lt;br /&gt;&lt;br /&gt;François Magnan was responsible for finding a conference room at UQAM and did a very good job. It was a really nice place and not too far from the Convention center. François also wrote a nice &lt;a href="http://categoricaldesign.com/cds/blog/"&gt;writeup&lt;/a&gt;. Thank you François!&lt;br /&gt;&lt;br /&gt;So thank you all for attending the meeting and making it a great event!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-521631119725622211?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/521631119725622211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=521631119725622211&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/521631119725622211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/521631119725622211'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/10/what-meeting.html' title='What a meeting!'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2033626108797687113</id><published>2007-10-19T18:04:00.000-07:00</published><updated>2007-10-19T18:11:28.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><category scheme='http://www.blogger.com/atom/ns#' term='oopsla'/><title type='text'>Montreal Guide for hackers</title><content type='html'>If you come to Montreal next week for &lt;a href="http://www.oopsla.org/"&gt;OOPSLA&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt; the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; (you can't miss that great event ;-), make sure to visit &lt;a href="http://ygingras.net/"&gt;Yannick Gingras&lt;/a&gt;' &lt;a href="http://gazdemo.ygingras.net/wiki/Montreal"&gt;Guide to Montréal for Hackers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2033626108797687113?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2033626108797687113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2033626108797687113&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2033626108797687113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2033626108797687113'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/10/montreal-guide-for-hackers.html' title='Montreal Guide for hackers'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1387042713042362224</id><published>2007-10-19T18:00:00.000-07:00</published><updated>2007-10-19T18:04:26.036-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>For those who won't be there</title><content type='html'>For those of you who won't be able to make it, our next meeting of the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt;, next Monday, will be videotaped and I will make it available on one of the popular video sites. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1387042713042362224?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1387042713042362224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1387042713042362224&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1387042713042362224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1387042713042362224'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/10/for-those-who-wont-be-there.html' title='For those who won&apos;t be there'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8743827402864936180</id><published>2007-10-08T07:02:00.000-07:00</published><updated>2007-10-08T16:37:03.807-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><category scheme='http://www.blogger.com/atom/ns#' term='oopsla'/><title type='text'>Why attend OOPSLA'2007</title><content type='html'>[Message from &lt;a href="http://dreamsongs.com/"&gt;Richard Gabriel&lt;/a&gt;, chair OOPSLA'2007]&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"The brightest minds in computer science will be at ooPSLA 2007, convening in chic, sophisticated, metropolitan Montreal, Quebec. Peter Turchi, author of "Maps of the Imagination," will use examples from writing and cartography to explore the challenges of discovery, the challenges of presenting those discoveries, and how the presentation itself is often the key to discovery (think Impressionism). Jim Purbrick and Mark Lentczner, also known as Babbage Linden and Zero Linden, will step away from reality into the virtual world of Second Life. Two Turing Award winners, Fred Brooks and John McCarthy, will be giving talks. Brooks will talk about collaboration and telecollaboration in design.&lt;br /&gt;McCarthy will be presenting Elephant 2000, a proposed programming language good for writing and verifying programs that interact with people (e.g., transaction processing) or interact with programs belonging to other organizations. Gregor Kiczales will deliver a talk on how different contexts affect developer perspectives on software. David Parnas examines the problem of documenting the behavior of systems and their components, and how precise documents can make validation and verification easier. Patti Maes, honored with the title "Global Leader for Tomorrow" by the World Economic Forum, will be speaking from her background in media arts and sciences. Also planned is a special reprise of Gabriel and Steele's keynote "50 in 50" from HOPL III. OOPSLA 2007 runs October 21 through 25"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;But, I would highlight this:&lt;br /&gt;&lt;br /&gt;Fred Brooks, Turing Award winner, Mythical Man Month, No Silver Bullet. He doesn't agree often to speak.&lt;br /&gt;&lt;br /&gt;John McCarthy, Turing Award winner, Lisp, AI. He doesn't speak often, and he's getting old.&lt;br /&gt;&lt;br /&gt;David Parnas, very early guy in software engineering, modularity, information hiding.&lt;br /&gt;Ornery. Doesn't speak much.&lt;br /&gt;&lt;br /&gt;Jim Purbrick &amp;amp; Mark Lentczner, these are the Second Life guys.&lt;br /&gt;&lt;br /&gt;Gregor Kiczales, Aspects, metaobjects, CLOS. Very good speaker. One of our most important thinkers.&lt;br /&gt;&lt;br /&gt;Pattie Maes, reflection, ambient intelligence.&lt;br /&gt;&lt;br /&gt;Guy Steele, Scheme, Fortress.&lt;br /&gt;&lt;br /&gt;Brian Foote, Big Ball of Mud, one of the most entertaining speakers in computer science.&lt;br /&gt;&lt;br /&gt;Richard Gabriel, Worse is Better&lt;br /&gt;&lt;br /&gt;special surprise keynote:&lt;br /&gt;&lt;br /&gt;Kathy Sierra, of creating passionate users fame.&lt;br /&gt;&lt;br /&gt;Most conferences would consider themselves lucky to see any one of these people at  their conference (except for me, of course). To have all of them is extraordinary. This is probably the best lineup of speakers at any CS conference in history.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8743827402864936180?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8743827402864936180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8743827402864936180&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8743827402864936180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8743827402864936180'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/10/why-attend-oopsla200.html' title='Why attend OOPSLA&apos;2007'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8238569965919653883</id><published>2007-10-04T17:26:00.000-07:00</published><updated>2007-10-05T11:45:03.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>October meeting of the MSLUG - the details</title><content type='html'>The &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; is a group developers of the Greater Montreal interested in the Scheme/Lisp family of programming languages and in functional programming in general.&lt;br /&gt;&lt;br /&gt;The October meeting will take place during the OOPSLA 2007 conference. For this special event, the MSLUG invited two well-known speakers: Manuel Serrano and Pascal Costanza. Don't miss this exceptional event!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where: &lt;/span&gt;UQAM, &lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;q=100+Rue+Sherbrooke+Ouest,+Montreal,+Montr%C3%A9al,+Quebec+H2X,+Canada&amp;amp;sll=45.507911,-73.563166&amp;amp;sspn=0.022737,0.045319&amp;amp;ie=UTF8&amp;amp;z=16&amp;amp;iwloc=addr&amp;amp;om=1"&gt;100 Sherbrooke West, Room SU-1550&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When: &lt;/span&gt;October 22nd, 2007 at 7h30PM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;a href="http://www-sop.inria.fr/mimosa/Manuel.Serrano/"&gt;Manuel Serrano&lt;/a&gt;, INRIA Sophia-Antipolis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Manuel Serrano holds a Ph.D. degree from the Université Pierre et Marie Curie (Paris 6), France, and works at INRIA Sophia-Antipolis as a research director. Most of his research activities are based, or use, the functional programming language Scheme. He is well-known for his highly-optimizing Scheme compiler, &lt;a href="http://www-sop.inria.fr/mimosa/fp/Bigloo/"&gt;Bigloo&lt;/a&gt;. Manuel Serrano served on several international conferences: ICFP, JFLA, Scheme workshops, and more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Title: &lt;/span&gt;Programming Multimedia Applications on the Web with &lt;a href="http://hop.inria.fr/"&gt;HOP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hop is a language dedicated to programming reactive and dynamic applications for the web, such as web agendas, web galleries, web mail clients, etc. In this presentation, we highlight the linguistic novelties introduced by Hop and its execution environment by describing Hop's user libraries, its extensions to the HTML-based standards, and its execution platform, the Hop web broker. The presentation will focus on presenting the development on multimedia applications with Hop. There will be several live demonstrations during the presentation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;a href="http://p-cos.net/"&gt;Pascal Costanza&lt;/a&gt;, Vrije Universiteit Brussel.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pascal Costanza has a Ph.D. degree from the University of Bonn, Germany, and works as a research assistant at the Programming Technology Lab of the Vrije Universiteit Brussel, Belgium. His past involvements include specification and implementation of the languages Gilgul and Lava, and the design and application of the JMangler framework for load-time transformation of Java class files. He has also implemented ContextL, the first programming language extension for Context-oriented Programming based on CLOS, and aspect-oriented extensions for CLOS. He has also co-organized numerous workshops on Unanticipated Software Evolution, Aspect-Oriented Programming, Object Technology for Ambient Intelligence, Lisp, and redefinition of computing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Title: &lt;/span&gt;Context-oriented Programming in ContextL&lt;br /&gt;&lt;br /&gt;There is an increased need for context-aware applications that can dynamically adjust their behavior to the context of their use. Two years ago, we have introduced ContextL, our first programming language extension that explicitly supports Context-oriented Programming (COP), based on the Common Lisp Object System (CLOS). In COP, programs consist of partial class and method definitions that can be selected and combined at runtime as needed. Employing runtime adaptations to class and method definitions, COP does not only allow expressing context-aware behavior, but encourages continually adjusting behavior&lt;br /&gt;of programs according to their context.&lt;br /&gt;&lt;br /&gt;In my presentation, I will show and discuss the following.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The basic language constructs of ContextL.&lt;/li&gt;&lt;li&gt;The development of non-trivial examples.&lt;/li&gt;&lt;li&gt;The current state of the art in COP: language extensions, example applications and support for the various stages in software development.&lt;/li&gt;&lt;li&gt;Future work: promising next steps that several researchers in our own groups and elsewhere are currently undertaking.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8238569965919653883?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8238569965919653883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8238569965919653883&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8238569965919653883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8238569965919653883'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/10/october-meeting-of-mslug-details.html' title='October meeting of the MSLUG - the details'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5721615176382847291</id><published>2007-09-12T17:07:00.000-07:00</published><updated>2007-09-12T17:17:05.041-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>October meeting of the MSLUG - Update</title><content type='html'>The &lt;a href="http://theschemeway.blogspot.com/2007/09/october-meeting-of-mslug.html"&gt;October meeting&lt;/a&gt; of the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;Montreal Scheme/Lisp User Group&lt;/a&gt;, initially scheduled for Thurdsay, October 25th, is moved to &lt;span style="font-weight: bold;"&gt;Monday, October 22nd&lt;/span&gt;. This is the same day as the &lt;a href="http://www.swa.hpi.uni-potsdam.de/dls07/"&gt;Dynamic Languages Symposium&lt;/a&gt; that will take place during the &lt;a href="http://www.oopsla.org/oopsla2007/"&gt;OOPSLA&lt;/a&gt; conference.&lt;br /&gt;&lt;br /&gt;I will post more details soon (time, location, etc.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5721615176382847291?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5721615176382847291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5721615176382847291&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5721615176382847291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5721615176382847291'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/09/october-meeting-of-mslug-update.html' title='October meeting of the MSLUG - Update'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2625974662264793188</id><published>2007-09-10T18:57:00.000-07:00</published><updated>2007-09-12T08:25:48.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='oopsla'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>October meeting of the MSLUG</title><content type='html'>Since this year's &lt;a href="http://www.oopsla.org/"&gt;OOPSLA conference&lt;/a&gt; (as well as the Dynamic Languages Symposium) will be held in Montreal in October, the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;Montreal Scheme/Lisp User Group&lt;/a&gt; will hold its monthly meeting on the last day of the conference, i.e. on Thursday, October 25th at 6PM.&lt;br /&gt;&lt;br /&gt;For this very special occasion, we will have two talks instead of just one. One by a well-known Schemer, &lt;a href="http://www-sop.inria.fr/mimosa/Manuel.Serrano/"&gt;Manuel Serrano&lt;/a&gt;, on Hop, and another one by a well-known Lisper, &lt;a href="http://p-cos.net/"&gt;Pascal Costanza&lt;/a&gt;, on Context-Oriented Programming.&lt;br /&gt;&lt;br /&gt;So don't miss this opportunity to join one of the most vibrant Scheme/Lisp Community!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; I make this early announcement only to let people schedule their flight accordingly. We plan to hold a regular meeting in September too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2625974662264793188?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2625974662264793188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2625974662264793188&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2625974662264793188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2625974662264793188'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/09/october-meeting-of-mslug.html' title='October meeting of the MSLUG'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2090246226672604367</id><published>2007-09-02T19:50:00.000-07:00</published><updated>2007-09-02T19:57:19.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socialmedia'/><category scheme='http://www.blogger.com/atom/ns#' term='linkedin'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>Now on Facebook</title><content type='html'>I don't know if it's a coincidence or not (maybe some old friends from the &lt;a href="http://www.college-montreal.qc.ca/fr/default.idigit"&gt;Collège de Montréal&lt;/a&gt; are reading my blog), but I received an invitation today to join a group on &lt;a href="http://facebook.com/"&gt;Facebook&lt;/a&gt;! So I now have an account on Facebook. I'll have to keep it up-to-date, like my account on &lt;a href="http://www.linkedin.com/pub/1/24/22a"&gt;LinkedIn&lt;/a&gt;. Hope this won't take too much of my time...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2090246226672604367?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2090246226672604367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2090246226672604367&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2090246226672604367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2090246226672604367'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/09/now-on-facebook.html' title='Now on Facebook'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4857646107418667193</id><published>2007-09-02T06:39:00.001-07:00</published><updated>2007-09-02T08:02:26.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='secondlife'/><title type='text'>Embarrassing, isn't it?</title><content type='html'>&lt;a href="http://www.getafirstlife.com/"&gt;Get a First Life&lt;/a&gt; is a parody of Second Life, which tries to put things in perspective. (Personally, I don't get this whole virtual reality thing myself. Maybe I'm getting too old - I don't even have a &lt;a href="http://www.facebook.com/"&gt;Facebook &lt;/a&gt;profile, can you imagine? At least, I have a blog...).&lt;br /&gt;&lt;br /&gt;But look at the Google ads at the lower right corner of the front page. Most ads are for Second Life itself. Seems to defeat the purpose!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4857646107418667193?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4857646107418667193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4857646107418667193&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4857646107418667193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4857646107418667193'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/09/embarrassing-isnt-it.html' title='Embarrassing, isn&apos;t it?'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5607901920669538294</id><published>2007-08-31T12:33:00.000-07:00</published><updated>2007-08-31T12:38:51.140-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 at AMARC</title><content type='html'>The &lt;a href="http://www.amarc.org"&gt;AMARC&lt;/a&gt; (the World Association of Community Radio Broadcasters) is seeking a &lt;a href="https://webmail.iro.umontreal.ca/pipermail/mslug/2007-August/000193.html"&gt;Scheme/Web developer&lt;/a&gt;. The job description is in French.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5607901920669538294?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5607901920669538294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5607901920669538294&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5607901920669538294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5607901920669538294'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/scheme-job-at-amarc.html' title='Scheme job at AMARC'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5679530512186880467</id><published>2007-08-30T19:14:00.000-07:00</published><updated>2007-09-01T06:03:21.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><title type='text'>A great MSLUG meeting</title><content type='html'>Yesterday's &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; meeting was a &lt;a href="https://webmail.iro.umontreal.ca/pipermail/mslug/2007-August/000188.html"&gt;true&lt;/a&gt; &lt;a href="https://webmail.iro.umontreal.ca/pipermail/mslug/2007-August/000190.html"&gt;success&lt;/a&gt;. About 25 people attended the meeting, and 15 of us went for a beer after the talks. And again, there were a few new faces. Maybe that's because it was our first meeting of the season, or because of the new format (that I called a SchemeCamp). Or both. But I know that many people liked the idea of having short presentations. A variety of subjects helps gather more people, I think.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pZixvIM5pl0/Rtli-ZqqHuI/AAAAAAAAACY/eHKyUTvDHbo/s1600-h/mslug-20070828-2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_pZixvIM5pl0/Rtli-ZqqHuI/AAAAAAAAACY/eHKyUTvDHbo/s320/mslug-20070828-2.jpg" alt="" id="BLOGGER_PHOTO_ID_5105220476782386914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Let me briefly summarize the 4 presentations:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://cdiggins.com/"&gt;Christopher Diggins&lt;/a&gt; talked about &lt;a href="http://www.cat-language.com/"&gt;Cat&lt;/a&gt;, a language he is currently developing. Cat is a stack-based language, like &lt;a href="http://factorcode.org/"&gt;Factor&lt;/a&gt;, but it is functional and statically-typed. The goal of the talk was to show how Scheme can be compiled to Cat, but Christopher went short of time. I'm sure he will give another presentation in a near future.&lt;br /&gt;&lt;br /&gt;The slides from his talk can be found &lt;a href="http://schemeway.dyndns.org/meetings/20070828/scheming_cats_2.ppt"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pZixvIM5pl0/RtfxoZqqHqI/AAAAAAAAAB4/OC9nOKO1yQI/s1600-h/mslug-20070828-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_pZixvIM5pl0/RtfxoZqqHqI/AAAAAAAAAB4/OC9nOKO1yQI/s320/mslug-20070828-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5104814379034615458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.iro.umontreal.ca/%7Ebergeret/"&gt;Étienne Bergeron&lt;/a&gt; presented a number of results from his Ph.D. thesis work. Étienne is working on a JIT synthesizer, i.e. a JIT that generates FPGA configurations from Scheme code. He mentioned that, in the course of his work, he had to reverse engineer the Xilinx protocol using innovative techniques, but which seems to cause a number of IP problems.  The JIT synthesizer is currently limited to small expressions, but the results are interesting and promising.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pZixvIM5pl0/Rtfx35qqHrI/AAAAAAAAACA/u2EqUGwvtYQ/s1600-h/mslug-20070828-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_pZixvIM5pl0/Rtfx35qqHrI/AAAAAAAAACA/u2EqUGwvtYQ/s320/mslug-20070828-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5104814645322587826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adrien Piérard presented part of his Master's thesis work, namely a portable interpreter of Scheme, with an emphasis on serialization/deserialization issues for mobile code. The ultimate goal of his work is to provide a portable and interoperable  implementation of Termite.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pZixvIM5pl0/RtfyEpqqHsI/AAAAAAAAACI/Lds36lImfyE/s1600-h/msug-20070828-4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_pZixvIM5pl0/RtfyEpqqHsI/AAAAAAAAACI/Lds36lImfyE/s320/msug-20070828-4.jpg" alt="" id="BLOGGER_PHOTO_ID_5104814864365919938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally, David St-Hilaire and Étienne Laurin described the implementation of the Tetris game in Scheme. Their implementation targets Tcl/Tk through &lt;a href="http://www.t3x.org/pstk/"&gt;PS/Tk&lt;/a&gt;, but they are now working on a &lt;a href="http://www.libsdl.org/"&gt;SDL&lt;/a&gt; port. It can be obtained from &lt;a href="http://snow.iro.umontreal.ca/"&gt;Snow&lt;/a&gt;. Note that David and Étienne are undergraduate students and they worked on this project in their spare time.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;In short, we had a great time! Thanks to all who contributed to this success.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_pZixvIM5pl0/RtfyXZqqHtI/AAAAAAAAACQ/6qVslRbvZmI/s1600-h/mslu-20070828-5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_pZixvIM5pl0/RtfyXZqqHtI/AAAAAAAAACQ/6qVslRbvZmI/s320/mslu-20070828-5.jpg" alt="" id="BLOGGER_PHOTO_ID_5104815186488467154" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5679530512186880467?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5679530512186880467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5679530512186880467&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5679530512186880467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5679530512186880467'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/great-mslug-meeting.html' title='A great MSLUG meeting'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pZixvIM5pl0/Rtli-ZqqHuI/AAAAAAAAACY/eHKyUTvDHbo/s72-c/mslug-20070828-2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8100974898578515643</id><published>2007-08-28T08:15:00.001-07:00</published><updated>2007-08-28T08:19:19.796-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='gambit-c'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Another Scheme job in Montreal</title><content type='html'>There is &lt;a href="https://webmail.iro.umontreal.ca/pipermail/mslug/2007-August/000185.html"&gt;another opening&lt;/a&gt; for a Scheme programmer in Montreal:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This person would work with Gambit to help in the development of the LORNET project. In particular, the initial project would be continue the development of  a workflow/dataflow engine (based on Termite). This work is part of the TELOS system which is a Semantic Web based OS. Taking place between research and applications, the work is very interesting and provides great challenges.&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-8100974898578515643?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8100974898578515643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8100974898578515643&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8100974898578515643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8100974898578515643'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/another-scheme-job-in-montreal.html' title='Another Scheme job in Montreal'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-222691590502818826</id><published>2007-08-26T17:15:00.001-07:00</published><updated>2007-08-26T17:22:43.830-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mslug'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Next meeting of the Montreal Scheme/Lisp User Group</title><content type='html'>Our next meeting will be this Wednesday, August 29th. The details of the meeting are not fully settled, but at least Christopher Diggins will talk about its translator from Scheme to a statically typed functional stacked-based language. The details will soon be posted to the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG web site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way, we will be experimenting with another meeting format this fall, inspired by the &lt;a href="http://barcamp.org"&gt;BarCamp and DemoCamp&lt;/a&gt; type of events. At each meeting, three or four people will give short talks (about 15 minutes) about one of their favorite projects (academic, commercial, open-source, or hobby). Many people have already showed an interest in giving such a talk. (I will certainly give one myself, about the grammar IDE we are currently developing at &lt;a href="http://www.nuecho.com"&gt;Nü Echo&lt;/a&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-222691590502818826?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/222691590502818826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=222691590502818826&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/222691590502818826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/222691590502818826'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/next-meeting-of-montreal-schemelisp.html' title='Next meeting of the Montreal Scheme/Lisp User Group'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5886047790215270990</id><published>2007-08-26T04:55:00.000-07:00</published><updated>2007-08-26T05:15:29.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open-source'/><category scheme='http://www.blogger.com/atom/ns#' term='gambit-c'/><title type='text'>Gambit-C 4.0 released</title><content type='html'>Gambit-C 4.0.0 &lt;a href="https://webmail.iro.umontreal.ca/pipermail/gambit-list/2007-August/001658.html"&gt;has finally been released&lt;/a&gt;. Its website has also been &lt;a href="http://www.iro.umontreal.ca/~gambit"&gt;revamped&lt;/a&gt;, and is powered by &lt;a href="http://www.mediawiki.org"&gt;MediaWiki&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This release is a very good step forward, in terms of community support. At last, Marc got it right this time. Welcome to the open-source world, Marc! What we really need now is a whole set of useful libraries to help the Gambit-C community grow and not reinvent the wheel for each new application. &lt;br /&gt;&lt;br /&gt;As users of open-source software, we should all give back to the community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5886047790215270990?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5886047790215270990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5886047790215270990&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5886047790215270990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5886047790215270990'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/gambit-c-40-released.html' title='Gambit-C 4.0 released'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-687732243646259030</id><published>2007-08-23T10:15:00.000-07:00</published><updated>2007-08-23T18:00:25.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sisc'/><category scheme='http://www.blogger.com/atom/ns#' term='applications'/><title type='text'>Musical composition program in Scheme</title><content type='html'>Kjetil Svalastog Matheussen just &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=Pine.LNX.4.58.0708231701150.14144%40notam02.uio.no&amp;forum_name=sisc-users"&gt;announced&lt;/a&gt; on the &lt;a href="http://sisc-scheme.org/"&gt;SISC&lt;/a&gt; mailing list that he has almost completed the implementation of a nice &lt;a href="http://www.notam02.no/hurtigmikser/DasApplet.html"&gt;musical composition program&lt;/a&gt; in Scheme (it's an applet that requires Java 1.5):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The applet/program is a special kind of composition program which is going&lt;br /&gt;to be used in music education in Norway, age 9 and up or something&lt;br /&gt;like that. It might look a little bit like a toy, but its not, and its&lt;br /&gt;also possible to make high quality music with it.&lt;br /&gt;&lt;br /&gt;Almost all of the graphics and gui is made directly in SISC, while the&lt;br /&gt;signal processing is programmed using Java. The source is GPL, placed&lt;br /&gt;&lt;a href="http://www.notam02.no/arkiv/src/hurtigmikser_23.8.2007.tar.gz"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I did not play a lot with it, but it seems really well done and demonstrates that even interpreted code can be fast enough for most GUI applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-687732243646259030?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/687732243646259030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=687732243646259030&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/687732243646259030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/687732243646259030'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/musical-composition-program-in-scheme.html' title='Musical composition program in Scheme'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8854324731405364929</id><published>2007-08-17T07:27:00.000-07:00</published><updated>2007-08-17T07:46:21.407-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='r6rs'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Disruptive change</title><content type='html'>In my &lt;a href="http://theschemeway.blogspot.com/2007/08/r6rs-preliminary-voting-results.html"&gt;previous post&lt;/a&gt;, I claimed that R6RS will break with the Scheme tradition. But don't get me wrong. I'm not against change. It's rather the opposite.&lt;br /&gt;&lt;br /&gt;But I see R6RS as a &lt;span style="font-weight: bold;"&gt;disruptive&lt;/span&gt; change w.r.t. the long-standing tradition. As I wrote, I think it will kill innovation in the Scheme community. Where will there be room for innovation? Development tools, maybe, libraries, of course, but there is not a lot of room left for new language features.&lt;br /&gt;&lt;br /&gt;And if an implementations doesn't implement it and is only R5RS/R4RS-compatible, I fear that it will eventually be regarded as an old implementation. Is this an intended side-effect of the Steering Committee? I doubt it. And I hope not.&lt;br /&gt;&lt;br /&gt;To me, the only reasonable thing to do with this standard is to call it something else. It is a successor of Scheme, clearly. Probably a good one. But it's not Scheme anymore.  Let's call it CommonScheme. Or Scheme 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8854324731405364929?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8854324731405364929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8854324731405364929&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8854324731405364929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8854324731405364929'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/disruptive-change.html' title='Disruptive change'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3484822780223721490</id><published>2007-08-16T18:41:00.000-07:00</published><updated>2007-08-17T06:40:41.667-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='r6rs'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>R6RS preliminary voting results</title><content type='html'>They're out. The &lt;a href="http://www.r6rs.org/ratification/preliminary-results.html"&gt;preliminary results&lt;/a&gt; of the ratification vote. Seems that the draft will be ratified. Congratulations to the R6RS committee! They did a really good PR job.&lt;br /&gt;&lt;br /&gt;When I look at the people who voted NO, I see a lot of big names: Jonathan Reese, Will Clinger, Marc Feeley, Felix Winkelmann, Jeffrey Mark Siskind, Aubrey Jaffer, Chris Hanson, Shiro Kawai. People who I have a lot of respect for. (I'm surprised Manuel Serrano did not vote at all.)&lt;br /&gt;&lt;br /&gt;What does this mean? Well, I think R6RS will break with tradition. The question is to know whether it's a good thing or not. I think it's not. R6RS will kill innovation, like Jeff Siskind pointed out. Every Scheme implementation, to be of practical interest, is itself a new language. But you could (almost always) run R4RS/R5RS compatible code on them. The previous standards allow really different (and divergent) systems to be developed. Simply consider how Gambit-C, Bigloo, Stalin, Chicken, and PLT-Scheme are different in their implementations strategies. I'm not sure R6RS will still allow this. This should not call this new language "Scheme" anymore.&lt;br /&gt;&lt;br /&gt;And the committee was so irrespective of the SRFI process, that's just disgusting. Many brilliant people contributed to this process.&lt;br /&gt;&lt;br /&gt;Finally, I don't understand why Matthias Felleisen qualifies the draft as "perfect". He probably means that it's good enough for ratification, but it's certainly not perfect.&lt;br /&gt;&lt;br /&gt;The only thing I'm sure is that R6RS will create a schism...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3484822780223721490?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3484822780223721490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3484822780223721490&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3484822780223721490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3484822780223721490'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/r6rs-preliminary-voting-results.html' title='R6RS preliminary voting results'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8379534129622389357</id><published>2007-08-14T04:07:00.001-07:00</published><updated>2007-08-14T04:26:59.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vacations'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='r6rs'/><title type='text'>Bye bye vacations</title><content type='html'>I'm back from vacations. I was in Gaspésie, a wonderful region of the Québec province in Canada, with my family. We had a really great time. But it's over. Now back to work!&lt;br /&gt;&lt;br /&gt;I noticed that Erlang is getting &lt;a href="http://www.cincomsmalltalk.com/userblogs/ralph/blogView?showComments=true&amp;amp;entry=3364027251"&gt;more&lt;/a&gt; and &lt;a href="http://www.clickcaster.com/channel/item/why-do-you-like-erlang"&gt;more&lt;/a&gt; &lt;a href="http://patricklogan.blogspot.com/2007/08/on-sequential-languages-and-concurrency.html"&gt;attention&lt;/a&gt;. Even Sam Ruby is &lt;a href="http://intertwingly.net/blog/2007/08/12/Long-Bets"&gt;betting on&lt;/a&gt; Erlang on the long term (5-10 years) for the implementation of web architecture. That's good.&lt;br /&gt;&lt;br /&gt;Also, I was unable to vote against the &lt;a href="http://www.r6rs.org"&gt;R6RS&lt;/a&gt; ratification. I didn't have access to the internet during my vacations, and arrived too late Sunday to send it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8379534129622389357?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8379534129622389357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8379534129622389357&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8379534129622389357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8379534129622389357'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/08/bye-bye-vacations.html' title='Bye bye vacations'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6139925309578417853</id><published>2007-07-16T18:31:00.000-07:00</published><updated>2007-07-16T19:20:07.337-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='recruiting'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>The recruiting secret weapon</title><content type='html'>At &lt;a href="http://www.nuecho.com"&gt;Nü Echo&lt;/a&gt;, we've been trying to fulfill several positions for a few months now. Our industry is growing at an incredible rate and there are lots of opportunities for people wanting to work on leading-edge technologies. We even hired a few head hunters to help us. But we've been unsuccessful. Until recently...&lt;br /&gt;&lt;br /&gt;Last week, I &lt;a href="http://theschemeway.blogspot.com/2007/07/scheme-developer-wanted-alive.html"&gt;published a post&lt;/a&gt; for &lt;a href="http://schemeway.dyndns.org/mslug/news/13"&gt;one of our&lt;/a&gt; &lt;a href="http://webmail.iro.umontreal.ca/pipermail/mslug/2007-July/000135.html"&gt;job openings&lt;/a&gt;, and we received several résumés. And from people who would not have considered working for us, if it was not for the word &lt;span style="font-style: italic;"&gt;Scheme&lt;/span&gt; in the job description. People who have stable jobs in much larger companies.&lt;br /&gt;&lt;br /&gt;It is well-known that great programmers are difficult to recruit. And that traditional ways of recruiting are broken. It is especially true when there is a shortage in supply of programmers, as we are beginning to experience right now. (New ways of recruiting are needed, and a new Montreal-based startup is innovating in this area, &lt;a href="http://www.standoutjobs.com/"&gt;Standout Jobs&lt;/a&gt;. Their approach is really interesting, both conceptually and operationally.)&lt;br /&gt;&lt;br /&gt;Great programmers are not looking for jobs. They already have one.  And they don't want to switch from one Java job to another, unless they are dissatisfied with other aspects of their job. But a fraction of them would easily consider another job if it involved Scheme, Lisp or Erlang programming (or other non-mainstream languages like OCaml, Prolog, Haskell, etc.).&lt;br /&gt;&lt;br /&gt;So I claim that it is easier to recruit Scheme, Lisp, or Erlang programmers, even in Montreal, than Java/C# programmers. Given that you use the right channels (Standout Jobs, or by advertising on group specific mailing lists/blogs). These languages are not only secret weapons for implementing new applications, but they are also secret weapons for finding new employees. I strongly advise new startups to consider these languages if they want to have an edge when looking for new employees. In Montreal, I am convinced that there is now a critical mass of Scheme/Lisp/Erlang developers to mitigate all the risks usually associated with the use of non-mainstream languages.&lt;br /&gt;&lt;br /&gt;(I would even add that Erlang is getting more and more attention from the programming community in Montreal, and that it would not be that difficult to find really good programmers for new Erlang projects.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6139925309578417853?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6139925309578417853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6139925309578417853&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6139925309578417853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6139925309578417853'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/recruiting-secret-weapon.html' title='The recruiting secret weapon'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6915927793246044978</id><published>2007-07-16T07:36:00.000-07:00</published><updated>2007-07-16T07:59:39.241-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='gambit-c'/><title type='text'>Scheme/Erlang interoperability - the sequel</title><content type='html'>James Long &lt;a href="http://webmail.iro.umontreal.ca/pipermail/gambit-list/2007-July/001537.html"&gt;announced today&lt;/a&gt; on the &lt;a href="http://www.iro.umontreal.ca/%7Egambit"&gt;Gambit-C&lt;/a&gt; mailing list the availability of an &lt;a href="http://dimlylitblog.com/projects/erlang-ffi.tar.gz"&gt;Erlang/Gambit interface&lt;/a&gt;, based on an &lt;a href="http://theschemeway.blogspot.com/2007/05/schemeerlang-interoperability-idea.html"&gt;idea I had&lt;/a&gt; a few months ago.&lt;br /&gt;&lt;br /&gt;The motivation behind this interface is to provide the ability to implement Erlang nodes directly in Gambit-C (James thinks that &lt;a href="http://toute.ca"&gt;Termite&lt;/a&gt; is a little too immature to base any production code on, a view that I share). This way, you have the best of both worlds:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Code in Scheme (for those who prefer its syntax over everything else, like me)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use the production-quality Erlang platform and OTP for the deployment of robust, scalable and fault-tolerant distributed applications,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Access the Mnesia database from Scheme (this would need a more complex proxy node in Erlang, but this is certainly doable).&lt;/li&gt;&lt;/ul&gt;Once I have a few minutes of spare time, I will certainly try to add a few functionalities to the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt; web site (which is written in Erlang) using this interface. This will provide a great proof of concept and a great migration path from Erlang to Termite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6915927793246044978?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6915927793246044978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6915927793246044978&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6915927793246044978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6915927793246044978'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/schemeerlang-interoperability-sequel.html' title='Scheme/Erlang interoperability - the sequel'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2023735279803681495</id><published>2007-07-12T12:21:00.000-07:00</published><updated>2007-07-12T13:58:20.896-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='oopsla'/><title type='text'>John McCarthy in Montreal</title><content type='html'>I just received an email from Dick Gabriel, the chair of the &lt;a href="http://www.oopsla.org/"&gt;OOPSLA&lt;/a&gt; conference, telling me that John McCarthy (the father of Lisp) will be in Montreal for a keynote at OOPSLA 2007 on Wednesday at 13:30, Oct 24. Don't miss that event!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2023735279803681495?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2023735279803681495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2023735279803681495&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2023735279803681495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2023735279803681495'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/john-mccarthy-in-montreal.html' title='John McCarthy in Montreal'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8437582309224078032</id><published>2007-07-12T04:00:00.000-07:00</published><updated>2007-07-12T04:21:53.554-07:00</updated><title type='text'>Work-life balance</title><content type='html'>&lt;a href="http://instigatorblog.com"&gt;Ben Yoskovitz&lt;/a&gt; has a great post on &lt;a href="http://www.instigatorblog.com/how-to-start-a-company-and-family-at-the-same-time/2007/07/11/"&gt;work-life balance&lt;/a&gt;. And he knows what he's talking about. He is starting a new company (&lt;a href="http://standoutjobs.com"&gt;Standout Jobs&lt;/a&gt;) and at the same time his wife gave birth to their second child.&lt;br /&gt;&lt;br /&gt;I think one of the great things of having a good work-life balance, especially when you have a family, is that both aspects of your like can benefit from each other. Great lessons from work can be applied to your family life and vice-versa. Here are two that I find particularly important:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Your family life needs projects. Short term projects (your next vacations, for example), as well as longer-term projects (buying a new house, planning renovations, etc.). This helps keep focus, create a family spirit (as opposed to a team spirit). And also to establish priorities, manage money, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Managing people is very similar to raising children. Every single book on management will tell you that. So becoming a better boss will certainly help you become a better parent (and vice-versa, of course). So take time with your kids, especially in their first fewweeks of life. This creates tremendous emotional links that will last forever.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have four kids myself and a very demanding job. But I still find time for my personal projects (organize meetings, blog, etc). Of course, I have a good employer and that's a very important term in the equation. And my wife is very supporting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8437582309224078032?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8437582309224078032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8437582309224078032&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8437582309224078032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8437582309224078032'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/work-life-balance.html' title='Work-life balance'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5013780848640293819</id><published>2007-07-11T12:46:00.001-07:00</published><updated>2007-07-11T13:06:37.161-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 developer wanted (alive)</title><content type='html'>&lt;a href="http://www.nuecho.com/"&gt;Nü Echo&lt;/a&gt; is seeking a talented Scheme/Java developer (with a strong emphasis on Scheme) for working on a sophisticated &lt;a href="http://www.nuecho.com/content/view/52/174/lang,en/"&gt;speech-recognition grammar development environment&lt;/a&gt; based on Eclipse. Candidates should be able to work (at least) in French.&lt;br /&gt;&lt;br /&gt;If you are interested, contact me (you can find my email address on the &lt;a href="http://schemeway.dyndns.org/mslug/mslug-contact"&gt;MSLUG&lt;/a&gt; website).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5013780848640293819?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5013780848640293819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5013780848640293819&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5013780848640293819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5013780848640293819'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/scheme-developer-wanted-alive.html' title='Scheme developer wanted (alive)'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1676339388543473026</id><published>2007-07-11T06:22:00.000-07:00</published><updated>2007-07-11T07:11:36.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Article in Montreal Tech Watch</title><content type='html'>&lt;a href="http://montrealtechwatch.com/"&gt;Montreal Tech Watch&lt;/a&gt; has published an &lt;a href="http://montrealtechwatch.com/2007/07/11/schemelisp-one-of-montreals-tech-expertise/"&gt;article &lt;/a&gt;I wrote about Scheme/Lisp in Montreal. This is an attempt to create more awareness about our &lt;a href="http://schemeway.dyndns.org/mslug"&gt;Montreal Scheme/Lisp User Group&lt;/a&gt; and Scheme/Lisp in general. Our user base has grown over the years, but new faces are always welcome, especially those with a startup mindset.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1676339388543473026?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1676339388543473026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1676339388543473026&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1676339388543473026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1676339388543473026'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/article-in-montreal-tech-watch.html' title='Article in Montreal Tech Watch'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6127799422282071848</id><published>2007-07-05T20:06:00.000-07:00</published><updated>2007-07-10T11:48:06.557-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='montreal'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>I'm on the map!</title><content type='html'>&lt;a href="http://montrealtechwatch.com/"&gt;Montreal Tech Watch&lt;/a&gt; has published a &lt;a href="http://montrealtechwatch.com/2007/07/05/montreal-web-mapped-to-the-stm-network/"&gt;map&lt;/a&gt; (a visual representation) of the web in Montreal, i.e. of people and projects known to MTW. Pretty cool! The map mimics the metro system here, in Montreal. I don't know on which side of the Rivières des Prairies I sit, though... (For those who don't know, Montreal is an island.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6127799422282071848?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6127799422282071848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6127799422282071848&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6127799422282071848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6127799422282071848'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/im-on-map.html' title='I&apos;m on the map!'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-9160323051308524870</id><published>2007-07-03T07:06:00.001-07:00</published><updated>2007-07-03T07:17:13.028-07:00</updated><title type='text'>Busy, busy, busy</title><content type='html'>I have been quiet lately due to an upcoming talk I will give at &lt;a href="http://speechtek.com/"&gt;SpeechTEK&lt;/a&gt; in late August, and (as usual) I have to develop most of the material at the last minute. Even the software I will showcase is nowhere near finished, and I take 3 weeks of vacation soon. Arrrghhh.......!!&lt;br /&gt;&lt;br /&gt;Also, I'm preparing a post for &lt;a href="http://montrealtechwatch.com/"&gt;Montreal Tech Watch&lt;/a&gt; about Scheme/Lisp (thanks to &lt;a href="http://heri.madmedia.ca/"&gt;heri &lt;/a&gt;for giving me this opportunity!).&lt;br /&gt;&lt;br /&gt;So stay tuned and don't despair, I will soon write the sequel to my &lt;a href="http://theschemeway.blogspot.com/2007/06/tuple-space-implementation-implementing.html"&gt;series&lt;/a&gt; on the implementation of tuple-spaces in Termite/Scheme. I have so nice things to say and a few examples to show. BTW, I translated most of the code to Erlang to make some speed comparisons, so I will write about that too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-9160323051308524870?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/9160323051308524870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=9160323051308524870&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/9160323051308524870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/9160323051308524870'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/07/busy-busy-busy.html' title='Busy, busy, busy'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-600479505428162258</id><published>2007-06-20T18:15:00.000-07:00</published><updated>2007-06-20T18:22:15.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>SourceForge.net 2007 Community Choice Award</title><content type='html'>It's time to vote for your 2007 Community Choice Award at &lt;a href="http://sourceforge.net"&gt;SourceForge&lt;/a&gt;. If you like &lt;a href="http://schemeway.sf.net/schemescript.html"&gt;SchemeScript&lt;/a&gt;, go to the &lt;a href="http://sourceforge.net/projects/schemeway"&gt;project page&lt;/a&gt; and click on the "Nominate this project" link! (You must have a sourceforge account to do so...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-600479505428162258?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/600479505428162258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=600479505428162258&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/600479505428162258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/600479505428162258'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/sourceforgenet-2007-community-choice.html' title='SourceForge.net 2007 Community Choice Award'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4169900335928400330</id><published>2007-06-13T17:54:00.000-07:00</published><updated>2007-06-13T19:04:12.045-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='tuple spaces'/><category scheme='http://www.blogger.com/atom/ns#' term='gambit-c'/><title type='text'>Tuple space implementation - Implementing the client API</title><content type='html'>In a &lt;a href="http://theschemeway.blogspot.com/2007/05/tuple-space-implementation-api.html"&gt;previous post&lt;/a&gt;, I designed the client API for an implementation of tuple spaces in &lt;a href="http://www.iro.umontreal.ca/%7Egambit"&gt;Gambit Scheme&lt;/a&gt;/&lt;a href="http://toute.ca/"&gt;Termite&lt;/a&gt;. In this post, we will see how to implement the API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Low-level API&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As described in the previous post, the client API is composed of three macros:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;tspace-put!&lt;/span&gt; (tag expr-1 expr-2 ... expr-n))&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace-read&lt;/span&gt; (tag pat-1 pat-2 ... pat-n)&lt;br /&gt;  expr-1 ... expr-n)&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace-get!&lt;/span&gt; (tag pat-1 pat-2 ... pat-n)&lt;br /&gt;  expr-1 ... expr-n)&lt;/pre&gt;&lt;br /&gt;The approach taken here is to expand calls to these macros to calls to a lower-level API that sends requests/messages to the tuple space server (which could be on a different node or even a different machine on the network) using the basic Termite procedures. This low-level API is not meant to be called directly by a client application. It's a private API.&lt;br /&gt;&lt;br /&gt;This low-level API is composed of three procedures, one for each of the macros:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;tspace:put!&lt;/span&gt; tag fields)&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace:read&lt;/span&gt; tag template)&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace:get!&lt;/span&gt; tag template)&lt;/pre&gt;&lt;br /&gt;We will see what a template can be below.&lt;br /&gt;&lt;br /&gt;Implementing this low-level API is straightforward. If we assume that the server process is registered globally under &lt;tt&gt;tuple-space&lt;/tt&gt; (with the &lt;tt&gt;register&lt;/tt&gt; procedure), the last two procedures can be implemented like this:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;define&lt;/span&gt; (tspace:read tag template)&lt;br /&gt;  (!? (resolve 'tuple-space) `(read ,tag ,template)))&lt;br /&gt;&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;define&lt;/span&gt; (tspace:get! tag template)&lt;br /&gt;  (!? (resolve 'tuple-space) `(get ,tag ,template)))&lt;/pre&gt;&lt;br /&gt;Note the use of the &lt;tt&gt;!?&lt;/tt&gt; procedure calls. They are used instead of the &lt;/tt&gt;!&lt;/tt&gt; procedure because we want to send a message to the server and block until we get a response. &lt;tt&gt;!?&lt;/tt&gt; means "send and wait for a response". &lt;br /&gt;&lt;br /&gt;The call to &lt;tt&gt;resolve&lt;/tt&gt; simply tries to get the process object bound to the globally defined name given. (We won't handle exceptions and errors right now.)&lt;br /&gt;&lt;br /&gt;The first procedure looks a little more complicated, but not that much:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;define&lt;/span&gt; (tspace:put! tag fields)&lt;br /&gt;  (! (resolve 'tuple-space) (list (self) (make-tag) `(put ,tag ,fields))))&lt;/pre&gt;&lt;br /&gt;In this procedure, we explicitly pass &lt;tt&gt;(self)&lt;/tt&gt; and a &lt;span style="font-style:italic;"&gt;tag&lt;/span&gt;, a unique identifier. This is only to make the put message have the same structure as the read and get! messages. The &lt;tt&gt;!?&lt;/tt&gt; procedure sends them automatically for us.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Implementing tspace-put!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Implementing the &lt;tt&gt;tspace-put!&lt;/tt&gt; macro is trivial. In fact, we implement it as a macro simply to be more consistent with the syntax of the &lt;tt&gt;tspace-read&lt;/tt&gt; and &lt;tt&gt;tspace-get!&lt;/tt&gt; macros. Here is the code:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;define-macro&lt;/span&gt; (tspace-put! object)&lt;br /&gt;  (match object&lt;br /&gt;    ((tag . fields)&lt;br /&gt;      (where (list? fields))&lt;br /&gt;     `(tspace:put! ,tag (list ,@fields)))&lt;br /&gt;    (else&lt;br /&gt;     (error "invalid object in tspace-put! - " object))))&lt;/pre&gt;&lt;br /&gt;(I won't use R5RS syntax-rules macros here. They don't mix well with the rest of the Gambit system.) The &lt;tt&gt;match&lt;/tt&gt; expression ensures that object is a list of at least one element.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&amp;quot;Don't care&amp;quot; variables&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In calls to the &lt;tt&gt;tspace-get!&lt;/tt&gt; and &lt;tt&gt;tspace-read&lt;/tt&gt; macros, the patterns can be variable names (symbols) or constants. A special symbol, (&lt;tt&gt;_&lt;/tt&gt;, the underscore) can also be used to indicate that the corresponding field can hold any value, and that we are not interested in that value. That's what we call a "don't care" variable.&lt;br /&gt;&lt;br /&gt;From the perspective of the low-level API, all the pattern variables are "don't care" variables. In other words, it does not make sense to send the variable names to the server, as they are only used to name some of the values in the matched tuple. This means the &lt;tt&gt;tspace-read&lt;/tt&gt; and &lt;tt&gt;tspace-get!&lt;/tt&gt; macros will first have to replace all the variable patterns with "don't care" variables.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Implementing get! and read&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Both macros differ only in the name of the low-level API procedure that must ultimately be called. We will thus abstract a little bit and defer the hard part of both macros to an auxiliary procedure (not a macro):&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;define-macro&lt;/span&gt; (tspace-read pattern . body)&lt;br /&gt;  (tspace-retrieve pattern body 'tspace:read))&lt;br /&gt;&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;define-macro&lt;/span&gt; (tspace-get! pattern . body)&lt;br /&gt;  (tspace-retrieve pattern body 'tspace:get!))&lt;/pre&gt;&lt;br /&gt;(In addition to saving us from some copy-paste, relying on an auxiliary procedure has another advantage: the procedure can be easily tested since it's not a macro.)&lt;br /&gt;&lt;br /&gt;Here is the definition of the &lt;tt&gt;tspace-retrieve&lt;/tt&gt; procedure:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;define&lt;/span&gt; (tspace-retrieve pattern body-list retriever-name)&lt;br /&gt;  (match pattern&lt;br /&gt;    ((tag . fields)&lt;br /&gt;     (where (list? fields))&lt;br /&gt;     (&lt;span style="font-weight:bold;"&gt;let&lt;/span&gt; ((variables (filter pair?&lt;br /&gt;                              (map (lambda (object index)&lt;br /&gt;                                     (if (and (symbol? object) (not (eq? '_ object)))&lt;br /&gt;                                         (cons object index)&lt;br /&gt;                                         #f))&lt;br /&gt;                                   fields&lt;br /&gt;                                   (iota (length fields)))))&lt;br /&gt;           (fields    (map (lambda (object)&lt;br /&gt;                             (if (symbol? object)&lt;br /&gt;                                 '(quote _)&lt;br /&gt;                                 object))&lt;br /&gt;                           fields))&lt;br /&gt;           (tuple-var (gensym)))&lt;br /&gt;       `(&lt;span style="font-weight:bold;"&gt;let&lt;/span&gt; ((,tuple-var (,retriever-name ,tag (list ,@fields))))&lt;br /&gt;          (&lt;span style="font-weight:bold;"&gt;let&lt;/span&gt; ,(map (lambda (var/index)&lt;br /&gt;                      `(,(car var/index) (list-ref ,tuple-var ,(cdr var/index))))&lt;br /&gt;                    variables)&lt;br /&gt;            ,@body-list))))&lt;br /&gt;    (else&lt;br /&gt;     (error "invalid tspace pattern: " pattern))))&lt;/pre&gt;&lt;br /&gt;The first &lt;tt&gt;let&lt;/tt&gt; extracts the variables from the patterns together with the corresponding index in the template, builds the template that will be send to the server, and creates a new symbol to ensure some hygiene. The body of the &lt;tt&gt;let&lt;/tt&gt; builds the resulting code.&lt;br /&gt;&lt;br /&gt;Here is an example of using this procedure. Calling&lt;br /&gt;&lt;pre&gt;(tspace-retrieve '('tag x _ 1) '((+ x 1)) 'tspace:read)&lt;/pre&gt;&lt;br /&gt;yields&lt;br /&gt;&lt;pre&gt;(let ((#:g0 (tspace:read 'tag (list '_ '_ 1))))&lt;br /&gt;  (let ((x (list-ref #:g0 0)))&lt;br /&gt;    (+ x 1)))&lt;/pre&gt;&lt;br /&gt;Note that this makes the assumption that the value returned by &lt;tt&gt;tspace:read&lt;/tt&gt; is a list (the list of the tuple fields). That's an implementation choice. We could have used vectors instead. But as long as this representation does not leak outside of the low-level API and the generated code, that's ok.&lt;br /&gt;&lt;br /&gt;That's it for today. Next time, we'll see how to implement the server. This will involve a lot of interesting design decisions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4169900335928400330?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4169900335928400330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4169900335928400330&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4169900335928400330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4169900335928400330'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/tuple-space-implementation-implementing.html' title='Tuple space implementation - Implementing the client API'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-3949686604213757410</id><published>2007-06-12T06:08:00.000-07:00</published><updated>2007-06-12T06:22:01.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sisc'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='schemescript'/><title type='text'>SISC debugging with SchemeScript</title><content type='html'>On the &lt;a href="http://sisc.sourceforge.net/"&gt;SISC&lt;/a&gt; &lt;a href="http://sourceforge.net/mailarchive/forum.php?forum_name=sisc-users"&gt;users list&lt;/a&gt;, Daniel Sadilek explains his solution to debugging SISC code with &lt;a href="http://schemeway.sourceforge.net/schemescript.html"&gt;SchemeScript&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-style: italic"&gt;I found a workaround:&lt;br /&gt;&lt;pre&gt;(&lt;b&gt;define-syntax&lt;/b&gt; debug&lt;br /&gt; (syntax-rules ()&lt;br /&gt;   ((_ var ...)&lt;br /&gt;    (&lt;b&gt;begin&lt;/b&gt;&lt;br /&gt;      (print "Debugging. Available lexical bindings: " '(var) ...)&lt;br /&gt;      (&lt;b&gt;let&lt;/b&gt; ((child-env (make-child-environment (interaction-environment))))&lt;br /&gt;        (putprop 'var child-env var) ...&lt;br /&gt;        (with-environment child-env (lambda () (repl)))&lt;br /&gt;        (print "Debugging ended."))))))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This special syntactic form can be used like this:&lt;br /&gt;&lt;pre&gt;(&lt;b&gt;define&lt;/b&gt; (f x)&lt;br /&gt; (let ((sq (* x x)))&lt;br /&gt;   (debug x sq)&lt;br /&gt;   (+ sq sq)))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Btw, I use the SchemeScript IDE and really like the editing style that is made possible with the above debug-form. You can put &lt;tt&gt;(debug some-vars)&lt;/tt&gt; inside a procedure and execute it (or some other procedure that calls it). Then, with access to the local variables, you can write your code inside the procedure -- right in place -- and evaluate by pressing &lt;tt&gt;Ctrl+Enter&lt;/tt&gt;. If finished, you exit the debug REPL.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iro.umontreal.ca/~gambit"&gt;Gambit-C&lt;/a&gt; has (IMO) a much better debugger than any other free Scheme implementation. But the editing/debugging style described above is exactly what I had in mind when developing SchemeScript and what makes it comparable to Emacs in terms of integration with the Scheme system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-3949686604213757410?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/3949686604213757410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=3949686604213757410&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3949686604213757410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/3949686604213757410'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/sisc-debugging-with-schemescript.html' title='SISC debugging with SchemeScript'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-8738223042572195433</id><published>2007-06-05T13:20:00.001-07:00</published><updated>2007-06-05T13:21:51.820-07:00</updated><title type='text'>Yahoo Pipe for Gambit/Termite</title><content type='html'>I have created a &lt;a href="http://pipes.yahoo.com"&gt;Yahoo Pipe&lt;/a&gt; for &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=4FoSy63t2xGeoiqtCB2yXQ"&gt;Gambit/Termite&lt;/a&gt; related articles. (The resulting feed is displayed at the right of this page.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-8738223042572195433?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/8738223042572195433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=8738223042572195433&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8738223042572195433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/8738223042572195433'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/yahoo-pipe-for-gambittermite.html' title='Yahoo Pipe for Gambit/Termite'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2992682625070064014</id><published>2007-06-01T18:20:00.001-07:00</published><updated>2007-06-01T19:22:38.658-07:00</updated><title type='text'>What? Another packaging system for Scheme?</title><content type='html'>Manuel Serrano has just release &lt;a href="http://www-sop.inria.fr/mimosa/fp/Bigloo/"&gt;Bigloo 3.0a&lt;/a&gt;. Its most important new feature is a new packaging system, &lt;a href="http://hop.inria.fr/hop/scmpkg"&gt;ScmPkg&lt;/a&gt;. Yes, you read correctly: &lt;span style="font-weight:bold;"&gt;a new packaging system&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;It is not related in any way to the &lt;a href="http://snow.iro.umontreal.ca"&gt;Scheme Now!&lt;/a&gt; effort, even if it shares its initial goal and philosophy: an implementation-neutral package distribution system. (Even if, in fact, Manuel was one of the early Snow designers.) Were we really in need of another one?&lt;br /&gt;&lt;br /&gt;Instead of uniting the Scheme community, these two competing efforts will help balkanize it more. That's my feeling. Who will take time to write packages for both Snow and ScmPkg? And R6RS, and Egg, and Planet, and ... &lt;br /&gt;&lt;br /&gt;But you know what? I DON'T MIND! Me, as a Scheme developer, I (usually) don't want to port my code to a dozen implementations. Even two implementations. I use Gambit, that's all. Or Kawa. It depends on the project, the target platform. But once I have chosen an implementation, I stick to it. Porting a library to different implementations has a cost. A huge cost that I'm not willing to pay.&lt;br /&gt;&lt;br /&gt;So we should stop worrying about compatibility. We should go write useful applications in our Scheme dialect of our choice. Create success stories in Scheme. (Where are they, btw, the Scheme success stories? I know of Erlang success stories, Common Lisp success stories. But Scheme ones? Do you know one?)&lt;br /&gt;&lt;br /&gt;In the long run, it's not the core language that will make a difference. It's its use in the implementation of a truly unique and innovative platform or framework for developing amazing applications. Ruby would not be as successfull as it is without Rails. Erlang has Mnesia and Yaws. Even Java would not be so popular if it weren't for the J2EE specifiation and tools like Eclipse.&lt;br /&gt;&lt;br /&gt;In my case, I bet on Gambit-C, JazzScheme, and Termite. This trio has the potential to have a strong influence on the Scheme community. It has unique and compelling features for the development of innovative products. &lt;br /&gt;&lt;br /&gt;And Snow? I see it as a repository of Gambit packages/libraries. Nothing more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2992682625070064014?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2992682625070064014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2992682625070064014&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2992682625070064014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2992682625070064014'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/what-another-packaging-system-for.html' title='What? Another packaging system for Scheme?'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-5089648373784621327</id><published>2007-06-01T18:14:00.000-07:00</published><updated>2007-06-01T18:19:39.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Parallel map with Termite</title><content type='html'>In &lt;a href="http://bc.tech.coop/blog/070601.html"&gt;Parallel Map Beer Song in Erlang&lt;/a&gt;, Bill Clementson gives an implementation of &lt;tt&gt;pmap&lt;/tt&gt; (a parallel &lt;tt&gt;map&lt;/tt&gt;) in Erlang. &lt;br /&gt;&lt;br /&gt;Here is an implementatin of &lt;tt&gt;pmap&lt;/tt&gt; in Termite Scheme, as given by Marc Feeley on the Gambit mailing list:&lt;br /&gt;&lt;pre&gt;(&lt;b&gt;define&lt;/b&gt; (pmap f lst)&lt;br /&gt;   (&lt;b&gt;let&lt;/b&gt; ((parent (self)))&lt;br /&gt;     (map (&lt;b&gt;lambda&lt;/b&gt; (pid)&lt;br /&gt;            (recv ((,pid reply) reply)))&lt;br /&gt;          (map (&lt;b&gt;lambda&lt;/b&gt; (x)&lt;br /&gt;                 (spawn (&lt;b&gt;lambda&lt;/b&gt; () (! parent (list (self) (f x))))))&lt;br /&gt;               lst))))&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-5089648373784621327?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/5089648373784621327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=5089648373784621327&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5089648373784621327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/5089648373784621327'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/06/parallel-map-with-termite.html' title='Parallel map with Termite'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6038178743463475671</id><published>2007-05-31T18:22:00.000-07:00</published><updated>2007-05-31T19:05:27.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interoperability'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Scheme/Erlang interoperability - an idea</title><content type='html'>Would it be cool to be able to send and receive messages to an Erlang node from Scheme (or vice versa)?&lt;br /&gt;&lt;br /&gt;For Java-based Scheme systems (Kawa, SISC), one could build something on top of &lt;a href="http://erlang.org/doc/doc-5.5.4/lib/jinterface-1.3/doc/html/index.html"&gt;jinterface&lt;/a&gt;. It is a high-level Java API for doing exactly that. With some macrology, it would not be too hard to come with something useful. For C based systems, there is &lt;a href="http://erlang.org/doc/doc-5.5.4/lib/erl_interface-3.5.5.3/doc/html/index.html"&gt;erl_interface&lt;/a&gt;,  though it's a much lower level API. But no real showstopper.&lt;br /&gt;&lt;br /&gt;Of course, it would not be possible to send/receive objects other than lists, tuples, atom, numbers, i.e. the basic Erlang objects, but that could be a good starting point.&lt;br /&gt;&lt;br /&gt;What do you think? Would that be useful?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6038178743463475671?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6038178743463475671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6038178743463475671&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6038178743463475671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6038178743463475671'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/schemeerlang-interoperability-idea.html' title='Scheme/Erlang interoperability - an idea'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-1354555007683123581</id><published>2007-05-30T18:23:00.001-07:00</published><updated>2007-05-30T18:32:11.041-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Portable Termite</title><content type='html'>I heard, from trusted sources, that a portable implementation of &lt;a href="http://toute.ca"&gt;Termite&lt;/a&gt; is underway. I won't give names, to protect the innocents, but trust me, we'll hear more about that this summer (or at the end of it). &lt;br /&gt;&lt;br /&gt;This implementation will also support signed message passing. This means that a system will only be able to receive messages from trusted sources. THAT is interesting.&lt;br /&gt;&lt;br /&gt;You'll be able to connect together different Scheme applications, developed using different Scheme systems. Will this be a way to re-unite the Scheme community? &lt;br /&gt;&lt;br /&gt;What do you think? Is it a better approach than providing a common packaging infrastructure? I tend to believe it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-1354555007683123581?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/1354555007683123581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=1354555007683123581&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1354555007683123581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/1354555007683123581'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/portable-termite.html' title='Portable Termite'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2793424545713392880</id><published>2007-05-29T22:22:00.000-07:00</published><updated>2007-05-29T19:22:19.769-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='termite'/><category scheme='http://www.blogger.com/atom/ns#' term='tuple spaces'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Tuple space implementation - The API</title><content type='html'>This article is the first in a series that will describe my implementation of a simple-minded tuple space in &lt;a href="http://toute.ca/"&gt;Termite&lt;/a&gt; Scheme and show how Scheme is well-suited (or not, we'll see) for this task.&lt;br /&gt;&lt;br /&gt;In this article, I will present the main concepts of a tuple space, as well as the high-level API that will be used to interact with the tuple space.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Concepts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A tuple space is an associative, shared memory. There are basically three operations on tuple spaces: put, read, and get. The put operation, as its name implies, writes a new object (a tuple) in the tuple space. The read operation tries to retrieve a tuple from the tuple space that matches a given pattern (blocking if none exists), but leaves the object in the tuple space. The get operation is like the read operation, except that it removes the tuple from the tuple space.&lt;br /&gt;&lt;br /&gt;One important point to note is that all tuples put in (or read from) the tuple space are identified by a tag. That's why the tuple space is an associative memory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;High-level API&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My approach in designing a new library is usually to start from the perspective of the user of the library. In other words, I first try to write some test code that will use the library (akin to what we do in TDD). So what would those three primitives (put, read, get) would look like in Scheme?&lt;br /&gt;&lt;br /&gt;The easiest one is &lt;tt&gt;put&lt;/tt&gt;, of course. To put a tuple in the tuple space, it will be sufficient to have procedure &lt;tt&gt;tspace-put!&lt;/tt&gt;:&lt;br /&gt;&lt;pre&gt;(tspace-put! 'tag expr-1 expr-2 ... expr-n)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the case of read and get, things are a little more complicated. First, most tuple space implementations (like Linda) allow variables to appear in the pattern. It would be nice to replicate that. In Linda (C), read would look like:&lt;br /&gt;&lt;pre&gt;rd("tag", ?var1, ?var2);&lt;/pre&gt;&lt;br /&gt;This statement reads a tuple and also defines two variables, &lt;tt&gt;var1&lt;/tt&gt; and &lt;tt&gt;var2&lt;/tt&gt;. In the subsequent expressions/statements, the variables &lt;tt&gt;var1&lt;/tt&gt; and &lt;tt&gt;var2&lt;/tt&gt; can be used. But in Scheme, even a macro cannot introduce a variable that would be accessible from subsequent expressions (unless it expands in &lt;tt&gt;set!&lt;/tt&gt; expressions mutating already defined variables).&lt;br /&gt;The Scheme way of doing things is to add extra expressions to the read/get form:&lt;br /&gt;&lt;pre&gt;(tspace-read (tag var1 var2) &lt;br /&gt;  expr-1 &lt;br /&gt;  ...&lt;br /&gt;  expr-n)&lt;/pre&gt;&lt;br /&gt;But then, the &lt;tt&gt;tspace-put!&lt;/tt&gt; seems a little odd. It would be best to write:&lt;br /&gt;&lt;pre&gt;(tspace-put! (tag expr-1 expr-2 ... expr-n))&lt;/pre&gt;&lt;br /&gt;This would be more consistent with the syntax of &lt;tt&gt;tspace-read&lt;/tt&gt; and &lt;tt&gt;tspace-get&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;Note that since &lt;tt&gt;tspace-put!&lt;/tt&gt;, &lt;tt&gt;tspace-get&lt;/tt&gt;, and &lt;tt&gt;tspace-read&lt;/tt&gt; make no assumption at all on the representation of tuples. That's a good thing. And the sign of a good API.&lt;br /&gt;&lt;br /&gt;The API is thus composed of three syntax forms:&lt;br /&gt;&lt;pre&gt;(&lt;span style="font-weight:bold;"&gt;tspace-put!&lt;/span&gt; (tag expr-1 expr-2 ... expr-n))&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace-read&lt;/span&gt; (tag pat-1 pat-2 ... pat-n)&lt;br /&gt;  expr-1 ... expr-n)&lt;br /&gt;(&lt;span style="font-weight:bold;"&gt;tspace-get&lt;/span&gt; (tag pat-1 pat-2 ... pat-n)&lt;br /&gt;  expr-1 ... expr-n)&lt;/pre&gt;&lt;br /&gt;where &lt;tt&gt;tag&lt;/tt&gt; is a symbol, and &lt;tt&gt;pat-1&lt;/tt&gt; to &lt;tt&gt;pat-n&lt;/tt&gt; are pattern elements, i.e. either a variable (symbol), or a constant (number, string, character, or quoted Scheme constant).&lt;br /&gt;&lt;br /&gt;The other functions of the API are:&lt;br /&gt;&lt;pre&gt;(tspace-connect node)&lt;br /&gt;(tspace-disconnect)&lt;/pre&gt;&lt;br /&gt;to connect to a tuple space on node &lt;i&gt;node&lt;/i&gt; and to disconnect from a tuple space.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;What do you think? How can this API be improved? &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Next steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's it for today. In the next article, I will show the implementation of the client API. This will involve some macrology and show the true power of Scheme in this respect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2793424545713392880?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2793424545713392880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2793424545713392880&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2793424545713392880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2793424545713392880'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/tuple-space-implementation-api.html' title='Tuple space implementation - The API'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-4255727631870169053</id><published>2007-05-28T04:06:00.000-07:00</published><updated>2007-05-28T04:07:01.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sisc'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><title type='text'>Erlang Style Message Passing for SISC</title><content type='html'>Ben Simon has implemented &lt;a href="http://benjisimon.blogspot.com/2007/05/cicada-erlang-style-message-passing-for.html"&gt;Erlang Style Message Passing for SISC&lt;/a&gt;. The system has a number of limitations, of course. But that's a nice starting point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-4255727631870169053?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/4255727631870169053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=4255727631870169053&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4255727631870169053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/4255727631870169053'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/erlang-style-message-passing-for-sisc.html' title='Erlang Style Message Passing for SISC'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6741594848818032402</id><published>2007-05-26T07:11:00.000-07:00</published><updated>2007-05-26T08:03:12.222-07:00</updated><title type='text'>Startup culture in Montreal</title><content type='html'>A startup culture is developing rapidly in Montreal. I've been following some startup-related blogs for a few months now, and my conclusion is that something is cooking. Here are a few highlights:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Many past and upcoming &lt;a href="http://barcamp.org/BarCampMontreal"&gt;events&lt;/a&gt;;&lt;/li&gt;&lt;li&gt;Local entrepreneurs meet regularly at the &lt;a href="http://upcoming.yahoo.com/event/189419"&gt;Montreal Tech Entrepreneurs Breakfast&lt;/a&gt;;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some well-known VC firms now have offices in Montreal (like &lt;a href="http://garage.com/"&gt;Garage&lt;/a&gt;, Guy Kawasaki's capital fund);&lt;/li&gt;&lt;li&gt;A new &lt;a href="http://www.yulstart.org/wiki/index.php?title=Main_Page"&gt;wiki&lt;/a&gt; on startups has been launched.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Combine this with the growing interest in dynamic, non-mainstream languages, as witnessed by the following facts:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The &lt;a href="http://schemeway.dyndns.org/mslug"&gt;Scheme User Group&lt;/a&gt; attracts about 20 people at each meeting, but I estimate to 35-40 the number of people who come to our meetings at least once a year;&lt;/li&gt;&lt;li&gt;At our previous meeting (on Erlang), a lot of new faces show up at the MSLUG, and some of them  mentioned they're working on new startup ideas;&lt;/li&gt;&lt;li&gt;There is a good concentration of good Scheme developers who work on great, innovative tools: &lt;a href="http://www.iro.umontreal.ca/%7Egambit"&gt;Gambit-C&lt;/a&gt;, &lt;a href="http://toute.ca"&gt;Termite&lt;/a&gt;, &lt;a href="http://jazzscheme.org"&gt;JazzScheme&lt;/a&gt;, &lt;a href="http://snow.iro.umontreal.ca"&gt;Snow&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Will Montreal become a small Silicon Valley?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6741594848818032402?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6741594848818032402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6741594848818032402&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6741594848818032402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6741594848818032402'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/startup-culture-in-montreal.html' title='Startup culture in Montreal'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-6466270466647823860</id><published>2007-05-25T07:42:00.000-07:00</published><updated>2007-05-25T19:04:51.309-07:00</updated><title type='text'>Last night meeting</title><content type='html'>Here are a few pictures from the &lt;a href="http://schemeway.dyndns.org/mslug"&gt;MSLUG&lt;/a&gt;'s last night meeting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Marc Feeley talks about &lt;a href="http://snow.iro.umontreal.ca/"&gt;Snow&lt;/a&gt;:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pZixvIM5pl0/Rlb3XRVJytI/AAAAAAAAAAM/us7W6b2QMc4/s1600-h/mslug-20070524-4.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_pZixvIM5pl0/Rlb3XRVJytI/AAAAAAAAAAM/us7W6b2QMc4/s320/mslug-20070524-4.JPG" alt="" id="BLOGGER_PHOTO_ID_5068510409813248722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Part of the audience (we were about 20 Scheme enthusiasts):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_pZixvIM5pl0/Rlb3wRVJywI/AAAAAAAAAAk/s3VhWogmvXg/s1600-h/mslug-20070524-3.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_pZixvIM5pl0/Rlb3wRVJywI/AAAAAAAAAAk/s3VhWogmvXg/s320/mslug-20070524-3.JPG" alt="" id="BLOGGER_PHOTO_ID_5068510839309978370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We finished the night at the pub:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pZixvIM5pl0/Rlb3ohVJyvI/AAAAAAAAAAc/GKM7RPsn3Ic/s1600-h/mslug-20070524-2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_pZixvIM5pl0/Rlb3ohVJyvI/AAAAAAAAAAc/GKM7RPsn3Ic/s320/mslug-20070524-2.JPG" alt="" id="BLOGGER_PHOTO_ID_5068510706165992178" border="0" /&gt;&lt;/a&gt;(I am the guy with the red shirt, at the right of the picture)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_pZixvIM5pl0/RleVkxVJyxI/AAAAAAAAAAs/Jie3OJuNJk8/s1600-h/mslug-20070524-1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_pZixvIM5pl0/RleVkxVJyxI/AAAAAAAAAAs/Jie3OJuNJk8/s320/mslug-20070524-1.JPG" alt="" id="BLOGGER_PHOTO_ID_5068684364578671378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here we see Marc Feeley, Danny Dubé (author of SILex), and Étienne Bergeron.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-6466270466647823860?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/6466270466647823860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=6466270466647823860&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6466270466647823860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/6466270466647823860'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/last-night-meeting.html' title='Last night meeting'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pZixvIM5pl0/Rlb3XRVJytI/AAAAAAAAAAM/us7W6b2QMc4/s72-c/mslug-20070524-4.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7061944.post-2913024282595287736</id><published>2007-05-23T06:36:00.001-07:00</published><updated>2007-05-23T06:36:54.550-07:00</updated><title type='text'>Scheme programmer wanted at GrammaTech</title><content type='html'>&lt;a href="http://www.grammatech.com/corporate/employment/eng-06-01.html"&gt;Here! Here!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7061944-2913024282595287736?l=theschemeway.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://theschemeway.blogspot.com/feeds/2913024282595287736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7061944&amp;postID=2913024282595287736&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2913024282595287736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7061944/posts/default/2913024282595287736'/><link rel='alternate' type='text/html' href='http://theschemeway.blogspot.com/2007/05/scheme-programmer-wanted-at-grammatech.html' title='Scheme programmer wanted at GrammaTech'/><author><name>Dominique Boucher</name><uri>http://www.blogger.com/profile/18059572110310581530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-sm7b8naKxeU/TpuLebCR2NI/AAAAAAAAAjo/iEn_m1m_eU0/s1600/a0834622166089423c3ebb7e5bbada88%253Fs%253D80'/></author><thr:total>0</thr:total></entry></feed>
