<?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-3729811</id><updated>2012-02-16T04:14:58.381-08:00</updated><category term='ruby'/><category term='flash'/><category term='postgresql'/><category term='DNS'/><category term='javascript'/><category term='s3'/><category term='erlang'/><category term='s3fs'/><category term='offline'/><category term='helma'/><category term='lua'/><category term='erlang_exchange'/><category term='erlyjs'/><category term='mashups'/><category term='firefox'/><category term='webserver'/><category term='iphone'/><category term='erlydtl'/><category term='git'/><category term='python'/><category term='mochiweb'/><category term='rails'/><category term='video'/><category term='EC2'/><category term='prism'/><category term='facebook'/><category term='internet platform'/><category term='emacs'/><category term='CSS'/><category term='cloud computing'/><category term='java'/><category term='internet explorer'/><category term='ajax'/><category term='security'/><category term='rtmp'/><category term='tutorial'/><category term='graphics'/><category term='streaming'/><category term='textmate'/><category term='django'/><category term='Google App Engine'/><category term='open social'/><category term='preview'/><category term='comet'/><category term='editor'/><category term='gears'/><category term='VoIP'/><category term='dojo'/><category term='utility computing'/><category term='appengine'/><category term='mac'/><category term='codemirror'/><category term='HTML'/><category term='bespin'/><category term='cairo'/><category term='parser'/><category term='rhino'/><category term='mercurial'/><category term='prototype'/><category term='webGL'/><title type='text'>Pushed wrong button, rebooted the Internet ...</title><subtitle type='html'>by Roberto Saccon</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default?start-index=101&amp;max-results=100'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>138</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3729811.post-2856615109311235432</id><published>2009-10-17T16:59:00.000-07:00</published><updated>2009-10-17T17:24:04.773-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webGL'/><title type='text'>Getting started with WebGL 3D magic</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6nF5cKrqCDc/StpeaarXTQI/AAAAAAAAA6Y/LnXYBOvGQ0U/s1600-h/Screen+shot+2009-10-18+at+2.14.26+AM.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 315px; height: 320px;" src="http://1.bp.blogspot.com/_6nF5cKrqCDc/StpeaarXTQI/AAAAAAAAA6Y/LnXYBOvGQ0U/s320/Screen+shot+2009-10-18+at+2.14.26+AM.png" alt="" id="BLOGGER_PHOTO_ID_5393727311660403970" border="0" /&gt;&lt;/a&gt;Firefox trunk build and webkit nightly builds both support WebGL, the upcoming Standard for hardware accelerated web browser 3D graphics. So I wanted to get my feet wet with this new technology and after short analysis, I did the following steps as possibly fastest solution to get a working demo (in my case on a mac):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;updated my nightly build of webkit&lt;/li&gt;&lt;li&gt;in a terminal, issued the following command:&lt;div&gt;&lt;code&gt;defaults write com.apple.Safari WebKitWebGLEnabled -bool YES&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;opened &lt;a href="http://www.peternitsch.net/demo/webgl/index.html"&gt;one&lt;/a&gt; of the currently popular demos / showcases.&lt;/li&gt;&lt;/ul&gt;and then you get a smooth rotating object, all coded in Javascript !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2856615109311235432?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2856615109311235432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2856615109311235432' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2856615109311235432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2856615109311235432'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/10/gettting-started-with-webgl-3d-magic.html' title='Getting started with WebGL 3D magic'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6nF5cKrqCDc/StpeaarXTQI/AAAAAAAAA6Y/LnXYBOvGQ0U/s72-c/Screen+shot+2009-10-18+at+2.14.26+AM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1365207152529715000</id><published>2009-10-02T01:38:00.000-07:00</published><updated>2009-10-02T01:55:21.692-07:00</updated><title type='text'>Back on business</title><content type='html'>After some longer absence from the blogosphere and open source communities in general due to some personal disruptions, I am back, this time with focus on serverside Javascript, webkit-specific client-side stuff (for iPhone web apps, of course) and more. Right now I have just learned that super slick &lt;a href="http://cappuccino.org/"&gt;Cappuccino&lt;/a&gt; web framework is starting its Atlas-Web-IDE beta program &lt;a href="http://groups.google.com/group/objectivej/browse_thread/thread/a23c49dca4040f35"&gt;on November 15&lt;/a&gt;. Exciting times ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1365207152529715000?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1365207152529715000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1365207152529715000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1365207152529715000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1365207152529715000'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/10/back-on-business.html' title='Back on business'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2615498372021190929</id><published>2009-04-15T16:06:00.000-07:00</published><updated>2009-04-15T19:42:33.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Develop native iPhone apps in Javascript</title><content type='html'>With &lt;a href="http://www.phonegap.com/"&gt;phonegap&lt;/a&gt; you can today write iPhone webapps  which run on an embedded browser and with a bit of clever CSS styling and JS trickery you can makes those apps smell and feel like native apps. Why not just writing normal browser based web apps for the iPhone ? Well, first you can't sell web apps on the app store and second, phonegap exposes many additional APIs to Javascript based apps. &lt;div&gt;Soon there will be a new flavor of JS / phonegap iPhone apps: &lt;a href="http://blog.nachbaur.com/2009/04/more-changes-coming-to-iphone-branch-of.html"&gt;Mike Nachbaur is working on a phonagap&lt;/a&gt; &lt;a href="http://github.com/NachoMan/phonegap/tree/master"&gt;branch&lt;/a&gt;, which allows (or hopefully soon will allow, I haven't tested yet) to create in JS native Cocoa UI widgets such as tabbars and toolbars. Apple often just follows with Apple-branded versions of what smart developers do ahead of time, so if this will happen in this case as well, I would expect many of the iPhone developers to switch from Objective-C to JS.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2615498372021190929?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2615498372021190929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2615498372021190929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2615498372021190929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2615498372021190929'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/develop-native-iphone-apps-in.html' title='Develop native iPhone apps in Javascript'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7906634510045416240</id><published>2009-04-14T08:55:00.000-07:00</published><updated>2009-04-14T09:04:03.401-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><category scheme='http://www.blogger.com/atom/ns#' term='codemirror'/><title type='text'>CodeMirror browser editor got a  Lua parser</title><content type='html'>&lt;a href="http://marijn.haverbeke.nl/codemirror/contrib/lua/index.html"&gt;Try it out&lt;/a&gt;. Unfortunately  it might take a little while until it will find its way into &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt;, because right now, CodeMirror based syntax highlighting in bespin tip is disabled due to some one restructuring of the canvas paint function.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7906634510045416240?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7906634510045416240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7906634510045416240' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7906634510045416240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7906634510045416240'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/codemirror-browser-editor-got-lua.html' title='CodeMirror browser editor got a  Lua parser'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8467582485976924427</id><published>2009-04-11T06:45:00.000-07:00</published><updated>2009-04-12T14:33:52.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='helma'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Helma NG serverside Javascript framework on appengine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6nF5cKrqCDc/SeCo-svJP6I/AAAAAAAAA4c/0JCT7frHZnk/s1600-h/helma-glossy-100px.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 100px; height: 60px;" src="http://2.bp.blogspot.com/_6nF5cKrqCDc/SeCo-svJP6I/AAAAAAAAA4c/0JCT7frHZnk/s400/helma-glossy-100px.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5323440554666180514" /&gt;&lt;/a&gt;&lt;a href="http://dev.helma.org/"&gt;Helma&lt;/a&gt; is one of the few Javascript server-side web frameworks, and it's &lt;a href="http://dev.helma.org/ng/"&gt;next generation version&lt;/a&gt; runs right out-of-the-box on Google appengine. I followed the &lt;a href="http://dev.helma.org/ng/Running+Rhino+and+Helma+NG+on+Google+App+Engine/"&gt;tutorial&lt;/a&gt; and easily got my own Helma NG &lt;a href="http://siteomat.appspot.com/"&gt;demo&lt;/a&gt; running on appengine. Because Helma NG is a complete rewrite of standard Helma (which doesn't run on appengine), it is very simple, no persistence yet, mostly just request wrapping and routing and a simple template engine (no template inheritance and other fancy feature you find e.g. in django). If this is all one needs then Helma NG on appengine is now probably the easiest way to run javascript at client and server side. So let's hope that those who need a bit more, will contribute to Helma NG development to make it competitive with PHP, django  and RubyOnRails, or come up with a new framework (&lt;a href="http://steve-yegge.blogspot.com/2007/06/rhino-on-rails.html"&gt;RhinoOnRails&lt;/a&gt; ???).&lt;div&gt;And for those who need less than Helma NG, &lt;a href="http://www.nanaze.com/2009/04/javascript-on-rhino-on-java-on-app.html"&gt;this article&lt;/a&gt; might be helpful.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt;: I was wrong about template inheritance, Helma NG does support it, via the "extends" tag. And the development branch has now also appengine persistence support (&lt;a href="http://helma-storage.appspot.com/"&gt;demo&lt;/a&gt;).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8467582485976924427?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8467582485976924427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8467582485976924427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8467582485976924427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8467582485976924427'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/helma-ng-serverside-javascript.html' title='Helma NG serverside Javascript framework on appengine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6nF5cKrqCDc/SeCo-svJP6I/AAAAAAAAA4c/0JCT7frHZnk/s72-c/helma-glossy-100px.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5208181461128619528</id><published>2009-04-08T06:46:00.000-07:00</published><updated>2009-04-08T11:55:53.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Javascript on appengine</title><content type='html'>Was offline yesterday, therefore missed to be among the first 10K to try it out, but a bit of web research revealed that it should work right out of the box:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine"&gt;Dynamic languages on appengine - summary&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://unclescript.blogspot.com/2009/04/rhino-javascript-working-on-app-engine.html"&gt;Rhino Javascript on appengine - first working example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://olabini.com/blog/2009/04/dynamic-languages-on-google-app-engine-an-overview/"&gt;JRuby&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Update&lt;/b&gt;: already got my invitation, now just need time to experiment with it !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5208181461128619528?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5208181461128619528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5208181461128619528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5208181461128619528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5208181461128619528'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/javascript-on-appengine.html' title='Javascript on appengine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1782195521020057789</id><published>2009-04-05T17:49:00.001-07:00</published><updated>2009-04-11T08:48:22.257-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><title type='text'>Experimenting with lexical auto-indentation for bespin</title><content type='html'>While the basic features of the codemirror syntaxengine now are part of bespin (and that is just syntax highlighting), I started today to experiment to add an advanced feature: Auto indenting of current line or a selection based on lexical analysis. The user just has to press CTRL + TAB (but could be any other key binding of course). The information about what codemirror thinks is the correct indentation is already internally stored for each line of the source document, all I had to do was to add some code which inserts or deletes some whitespace at the begin of those lines the user marked for auto-indentation. That is at least what I thought. Unfortunately it doesn't work yet reliable (and that is my fault, because the original codemirror editor does perfectly auto-indent) and also is not yet integrated into bespins undo/redo system, so it needs another iteration, before I can submit a patch, but if anybody wants to help working on it, &lt;a href="http://bitbucket.org/rsaccon/bespin-playground/changeset/05cd558177a9/"&gt;take a look&lt;/a&gt; at the auto-indent code I added.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1782195521020057789?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1782195521020057789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1782195521020057789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1782195521020057789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1782195521020057789'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/experimenting-with-lexical-auto.html' title='Experimenting with lexical auto-indentation for bespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1746529890682687058</id><published>2009-04-02T01:45:00.000-07:00</published><updated>2009-04-02T02:06:12.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='codemirror'/><title type='text'>Adding python syntax highlighting to bespin</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/SdR8iHs5dxI/AAAAAAAAA4U/xgiS8XegRkU/s1600-h/Picture+1.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 361px; height: 400px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/SdR8iHs5dxI/AAAAAAAAA4U/xgiS8XegRkU/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5320013985456158482" /&gt;&lt;/a&gt;Support for Python got recently added to &lt;a href="http://marijn.haverbeke.nl/codemirror"&gt;Codemirror&lt;/a&gt;, thanks to Timothy Farrell. So I grabbed those sources and ported them to &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt;. &lt;div&gt;It doesn't work yet perfect in every case one can think of, but it does highlight Python. &lt;/div&gt;&lt;div&gt;The current features are (summarized from &lt;a href="http://marijn.haverbeke.nl/codemirror/contrib/python/index.html"&gt;original demo page&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Token-based syntax highlighting - currently very little lexical analysis happens. Few lexical errors will be detected.&lt;/li&gt;&lt;li&gt;Use the normal indentation mode to enforce regular indentation, otherwise the "shift" indentation mode will give you more flexibility (not used yet in bespin).&lt;/li&gt;&lt;li&gt;Parser Options: Python version, error display&lt;/li&gt;&lt;/ul&gt;The patch with python support is now applied at my &lt;a href="http://bitbucket.org/rsaccon/bespin-playground/changesets/"&gt;repo&lt;/a&gt; at bitbucket.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1746529890682687058?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1746529890682687058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1746529890682687058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1746529890682687058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1746529890682687058'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/04/adding-python-syntax-highlighting-to.html' title='Adding python syntax highlighting to bespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/SdR8iHs5dxI/AAAAAAAAA4U/xgiS8XegRkU/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8798477331977824513</id><published>2009-03-31T12:14:00.000-07:00</published><updated>2009-03-31T21:19:21.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><title type='text'>Javascript based parser generator system</title><content type='html'>I hope this is real (because April 1 is approaching, see my previous post): The first ever &lt;a href="http://jscc.jmksf.com/"&gt;LALR(1) parser generator system written in and for Javascript&lt;/a&gt;. Would be interesting to add this to &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt;, declarative grammars (as used in flex/yacc) are relatively easy to define, compared to codemirror which I used for the new, alternative bespin syntax engine and which is an interruptible-resumable continuation-passing style parser and needs to be written programatically for each language. &lt;div&gt;Similar to the narcissus parser implemented by &lt;a href="http://joose-js.blogspot.com/"&gt;Malte&lt;/a&gt;, such LALR(1) based parsers could be used for generating outline views and syntax checks running in a background worker thread. What it can't be used for is syntax highlighting, because LALR(1) based parsers need to reparse the whole file for every change to a document and that makes them too slow for syntax highlighting in realtime.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8798477331977824513?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8798477331977824513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8798477331977824513' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8798477331977824513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8798477331977824513'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/javascript-based-parser-generator.html' title='Javascript based parser generator system'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2469363357557724814</id><published>2009-03-31T11:54:00.000-07:00</published><updated>2009-03-31T12:07:04.146-07:00</updated><title type='text'>Internet Explorer Eightpril.1 with Webkit/Gecko rendering option !</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/SdJnynPBOyI/AAAAAAAAA4M/cz6qJX6AK0Q/s1600-h/rendering.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 132px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/SdJnynPBOyI/AAAAAAAAA4M/cz6qJX6AK0Q/s400/rendering.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5319428229101075234" /&gt;&lt;/a&gt;I guess this is an April 1 joke leaked out too early and with perfectly photoshopped screenshots. If it is not a hoax, then,  according to &lt;a href="http://www.smashingmagazine.com/2009/03/31/breaking-internet-explorer-81-eagle-eyes-leaked/"&gt;this article&lt;/a&gt;, the new Internet Explorer 8.1 will also allow to use Firefox extensions ! Ha ha !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2469363357557724814?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2469363357557724814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2469363357557724814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2469363357557724814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2469363357557724814'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/internet-explorer-eightpril1-with.html' title='Internet Explorer Eightpril.1 with Webkit/Gecko rendering option !'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/SdJnynPBOyI/AAAAAAAAA4M/cz6qJX6AK0Q/s72-c/rendering.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5780323953998141947</id><published>2009-03-29T00:03:00.000-07:00</published><updated>2009-03-29T02:12:37.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='preview'/><title type='text'>iBespin</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/Sc8djbVlFpI/AAAAAAAAA4E/PWHtq90ohz8/s1600-h/Picture+1.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 376px; height: 400px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/Sc8djbVlFpI/AAAAAAAAA4E/PWHtq90ohz8/s400/Picture+1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5318502179418740370" /&gt;&lt;/a&gt;Now that my &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt; syntax engine is more or less working and got added to the main repo, I experimented &lt;a href="http://www.rsaccon.com/2009/02/bespin-experimenting-with-embedded.html"&gt;again&lt;/a&gt; with inline previews, but this time I think the result is a bit more in line with what one actually needs:&lt;div&gt;I added a preview setting. Using previews is the same as always, either click on the icon, or type the command: &lt;code&gt;&lt;b&gt;preview&lt;/b&gt;.&lt;/code&gt;&lt;/div&gt;&lt;div&gt;Below are the new settings:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;code&gt;set preview window&lt;/code&gt;&lt;/b&gt; - default, an external window, as we have now.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;code&gt;set preview inline&lt;/code&gt;&lt;/b&gt; - instead of editor canvas we have an iframe containing the preview&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;code&gt;set preview iphone&lt;/code&gt;&lt;/b&gt; - a non-modal popup containing an iframe with dimensions of the iPhone screen. Of course you should use Safari for this.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;With ESC key the previews get closed / toggled off.&lt;/div&gt;&lt;div&gt;Now this just needs to be cleaned up a bit and turned into a patch or pushed to &lt;a href="http://bitbucket.org/rsaccon/bespin-playground"&gt;my repo&lt;/a&gt; at bitbucket.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update&lt;/b&gt;: &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480749"&gt;Bugzilla ticket&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5780323953998141947?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5780323953998141947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5780323953998141947' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5780323953998141947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5780323953998141947'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/ibespin.html' title='iBespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/Sc8djbVlFpI/AAAAAAAAA4E/PWHtq90ohz8/s72-c/Picture+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8645700922190565466</id><published>2009-03-26T12:41:00.000-07:00</published><updated>2009-03-27T02:28:26.779-07:00</updated><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='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><title type='text'>Java on AppEngine (or serverside JavaScript  for the masses) !!!</title><content type='html'>But let's wait first for confirmation of the &lt;a href="http://www.techcrunch.com/2009/03/26/get-ready-for-java-on-appengine/"&gt;rumor&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Following the first comment on this post ("Java != JavaScript"), it might look like I am confusing things, so let me clarify for those who can't remote read my mind (hopefully most) and are not familiar with &lt;a href="https://developer.mozilla.org/En/Rhino"&gt;Rhino&lt;/a&gt;, which is a JavaScript implementation written in Java, and allows serverside scripts to be written in JavaScript. And maybe just coincidentally, a few days ago a new release of Rhino has been pushed out. And for those who don't know, Norris Boyd, the main developer of Rhino is a Google engineer. So for me at least it makes sense to assume, JavaScript is part of Google's  Java App Engine plans. But let's not forget, this is all based on speculation, and the only difference between now and &lt;a href="http://www.controlenter.in/2008/10/google-developer-day-bangalore-google-app-engine-to-support-java-android-sdk-release-on-oct-22/"&gt;the very same rumors&lt;/a&gt; "leaked out" by a Google engineer a few months ago, is that &lt;a href="http://www.techcrunch.com/"&gt;Michael Arrington&lt;/a&gt; has a lot of readers.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8645700922190565466?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8645700922190565466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8645700922190565466' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8645700922190565466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8645700922190565466'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/java-on-appengine-or-serverside.html' title='Java on AppEngine (or serverside JavaScript  for the masses) !!!'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7777196235763710354</id><published>2009-03-23T00:37:00.000-07:00</published><updated>2009-03-23T06:58:50.169-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><title type='text'>Cross-browser offlining</title><content type='html'>I just tried to find out what needs to be done to make a web application (let's take &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt; as example) work offline. Unfortunately a google search for &lt;a href="http://www.google.com/search?q=cross+browser+offlining"&gt;cross browser offlining&lt;/a&gt; did not point to any magic solution. So let's start with what I knew already about this:&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;offlining the static resources is the easy part and modern browsers and google gears provide all kind of support for that.&lt;/li&gt;&lt;li&gt;offlining the dynamic requests is extremely difficult. The server logic needs to be modeled on clientside and the risk of getting data inconsistencies is big. So let's leave that part for another day. &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Unfortunately all the popular browsers (I tested with the newest betas) and google gears provide different ways of how to handle the offlining of static resources:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Firefox 3.1beta&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Supports the HTML 5 offline API and has a menu option to simulate the offline mode. The static resources need to be listed in a manifest file:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CACHE MANIFEST&lt;br /&gt;&lt;br /&gt;/index.html&lt;br /&gt;/default.css&lt;br /&gt;/images/logo.png&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and that manifest file name becomes an attribute of  the &lt;code&gt;html&lt;/code&gt; tag of the app start page:&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="text text_html text_html_basic"&gt;&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;html&lt;/span&gt; &lt;span class="entity entity_other entity_other_attribute-name entity_other_attribute-name_html"&gt;manifest&lt;/span&gt;=&lt;span class="string string_quoted string_quoted_double string_quoted_double_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_html"&gt;"&lt;/span&gt;/tests/th/cache-manifest&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_html"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;head&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html"&gt;&amp;lt;&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html"&gt;title&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;test&lt;span class="meta meta_tag meta_tag_inline meta_tag_inline_any meta_tag_inline_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_begin punctuation_definition_tag_begin_html"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_inline entity_name_tag_inline_any entity_name_tag_inline_any_html"&gt;title&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_end punctuation_definition_tag_end_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;head&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;body&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;test&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;body&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_tag meta_tag_structure meta_tag_structure_any meta_tag_structure_any_html"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="entity entity_name entity_name_tag entity_name_tag_structure entity_name_tag_structure_any entity_name_tag_structure_any_html"&gt;html&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_tag punctuation_definition_tag_html"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-weight:bold;"&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Safari 4beta&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also supports the HTML 5 offline API, therefore everything the same as with Firefox, except there is no easy way to simulate the offline mode. Just turning off the internet connection does not help if you use a server on localhost for development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Google gears&lt;/span&gt; for all the other browsers&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Now it's getting a bit more complicated. First you need to find out whether gears is installed, and if yes, load the cache manifest file, which unfortunately has a different format (JSON) than the  HTML 5 version:&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="text text_plain"&gt;&lt;span class="meta meta_paragraph meta_paragraph_text"&gt;// cache-manifest.gears&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;"betaManifestVersion": 1,&lt;br /&gt;"version": "site_version_string",&lt;br /&gt;"entries": [&lt;br /&gt;&lt;/span&gt;    &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;{ "url": "/index.html" },&lt;br /&gt;{ "url": "/default.css" },&lt;br /&gt;{ "url": "/images/logo.png" }&lt;br /&gt;&lt;/span&gt;  &lt;span class="meta meta_paragraph meta_paragraph_text"&gt;]&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt; And the loading of the manifest has to be done in Javascript:&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_js"&gt;&lt;span class="keyword keyword_control keyword_control_js"&gt;if&lt;/span&gt; &lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;(&lt;/span&gt;google &lt;span class="keyword keyword_operator keyword_operator_js"&gt;&amp;amp;&amp;amp;&lt;/span&gt; google&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;gears&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;)&lt;/span&gt; &lt;span class="meta meta_brace meta_brace_curly meta_brace_curly_js"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="storage storage_type storage_type_js"&gt;var&lt;/span&gt; localServer &lt;span class="keyword keyword_operator keyword_operator_js"&gt;=&lt;/span&gt; google&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;gears&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;factory&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;create&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_js"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js"&gt;'&lt;/span&gt;beta.localserver&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;)&lt;/span&gt;&lt;span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="storage storage_type storage_type_js"&gt;var&lt;/span&gt; store &lt;span class="keyword keyword_operator keyword_operator_js"&gt;=&lt;/span&gt; localServer&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;createManagedStore&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_js"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js"&gt;'&lt;/span&gt;test-dev&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;)&lt;/span&gt;&lt;span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js"&gt;;&lt;/span&gt;&lt;br /&gt;store&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;manifestUrl &lt;span class="keyword keyword_operator keyword_operator_js"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_js"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_js"&gt;'&lt;/span&gt;/cache-manifest.gears&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_js"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js"&gt;;&lt;/span&gt;&lt;br /&gt;store&lt;span class="meta meta_delimiter meta_delimiter_method meta_delimiter_method_period meta_delimiter_method_period_js"&gt;.&lt;/span&gt;checkForUpdate&lt;span class="meta meta_brace meta_brace_round meta_brace_round_js"&gt;()&lt;/span&gt;&lt;span class="punctuation punctuation_terminator punctuation_terminator_statement punctuation_terminator_statement_js"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="meta meta_brace meta_brace_curly meta_brace_curly_js"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;Because the HTML 5 / gears manifest files have a different format and easily grow beyond manually manageable size, a tool (or a custom build step) is necessary to create and update the cache manifest file for complex apps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7777196235763710354?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7777196235763710354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7777196235763710354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7777196235763710354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7777196235763710354'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/cross-browser-offlining.html' title='Cross-browser offlining'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3637893033525903346</id><published>2009-03-21T00:04:00.000-07:00</published><updated>2009-03-21T16:36:58.930-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='codemirror'/><title type='text'>Finally ported CodeMirror syntax engine to bespin</title><content type='html'>I have &lt;a href="http://www.rsaccon.com/2009/03/porting-codemirror-syntax-parser-to.html"&gt;written&lt;/a&gt; &lt;a href="http://www.rsaccon.com/2009/03/more-on-new-syntax-engine-for-bespin.html"&gt;before&lt;/a&gt; about my attempt to port the &lt;a href="http://marijn.haverbeke.nl/codemirror/"&gt;CodeMirror&lt;/a&gt; syntax highlight engine to  &lt;a href="https://bespin.mozilla.com/"&gt;bespin&lt;/a&gt;. I got it mostly working now (for Javascript, HTML, CSS, PHP and even all these languags mixed together as in PHP) and have submitted an &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=484527"&gt;initial patch&lt;/a&gt; for review.&lt;br /&gt;&lt;br /&gt;The port required quite a few structural changes of the code because, on bespin the syntax engine is running in a background thread if webworkers are available (FF 3.1beta, Safari 4beta, Webkit nightly) or &lt;a href="http://gears.google.com/"&gt;gears&lt;/a&gt; is installed, otherwise it is still running asynchronous, triggered by a Javascript setTimeout() with value 0. This all has only been possible thanks to the &lt;a href="http://joose-js.blogspot.com/2009/03/offloading-arbitrary-js-objects-to.html"&gt;groundbreaking work of Malte Ubl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So if you wanna try that  patch out today, you need of course a local installation of bespin, then apply the patch and use the command-line to enable / disable the syntax engine:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;set syntax2 on / set syntax2 off&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And don't expect it to be not even near as fast as the default engine. It is just an initial port, caching and other tricks to make it fast are not enabled or implemented yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3637893033525903346?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3637893033525903346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3637893033525903346' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3637893033525903346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3637893033525903346'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/finally-ported-codemirror-syntax-engine.html' title='Finally ported CodeMirror syntax engine to bespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5174446634951011727</id><published>2009-03-15T15:58:00.000-07:00</published><updated>2009-03-29T11:20:37.329-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><title type='text'>Bespin, Mercurial and keeping your patch up-todate</title><content type='html'>While hacking on &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt; I experimented some of the possible ways to keep a patch in sync with tip (this is how they call "trunk" in hg land).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Just cloning the repo for  developing the patch&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;this is the easiest, and seems quite popular. Unfortunately you are switching physical directories when you switch between clones, and in the case of bespin, where running server-instances are tied to a physical directory, it requires either a smart approach for running the instances in parallel or easily shutting down one and starting up he other. And if you are working on different unrelated patches, it can get quite messy to do manual merges when tip changes. To sum up, easy to get started with, but lots of disadvantages.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using branches&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Branches are easy to create and easy to switch between them and they have one big advantage compared to cloning: You stay on the same physical directory if you switch branches. However, the pain of manual merges when tip changes seemed to me even worse than with cloning.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Using &lt;a href="http://www.selenic.com/mercurial/wiki/index.cgi/MqExtension"&gt;queues extension&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;this is currently my preferred way. With queues extension you have always a clean tip, can develop patches, apply them, remove them, apply /remove patch-sets and easily change the order of the patches in the set. Updating tip is as easy as:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hg qrefresh    # update current patch with local changes&lt;br /&gt;hg qpop -a      # remove all patches&lt;br /&gt;hg pull&lt;br /&gt;hg update&lt;br /&gt;hg qpush -a    # apply all patches&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;What I haven't figured out yet is how to use bundles with queues extensions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br /&gt;By enabling rebase extension, rebasing with tip got even easier. The lines above got reduced now to:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hg qrefresh    # update current patch with local changes&lt;br /&gt;hg pull --rebase&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Update II:&lt;/b&gt;&lt;br /&gt;Lately I just push my local repo with applied MQ patches to my personal public repo at bitbucket, with the purpose of facilitating the pull of my patches.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5174446634951011727?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5174446634951011727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5174446634951011727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5174446634951011727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5174446634951011727'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/bespin-mercurial-and-keeping-your-patch.html' title='Bespin, Mercurial and keeping your patch up-todate'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8031225820770201586</id><published>2009-03-08T09:24:00.000-07:00</published><updated>2009-03-08T14:41:35.795-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='codemirror'/><title type='text'>More on the new syntax engine for bespin</title><content type='html'>And so here continues my journey in porting the CodeMirror parser / tokenizer to the bespin syntax engine. While at my &lt;a href="http://www.rsaccon.com/2009/03/porting-codemirror-syntax-parser-to.html"&gt;first iteration&lt;/a&gt; I basically just merged the codebase and managed some initial nicely-colorized rendering, I bypassed the mechanism which actually makes CodeMirror parser / tokenizer an interesting choice for bespin: the interruptable / resumable parsing. Now this is halfway working so let me explain it in detail:&lt;br /&gt;The default bespin syntax highlighter works on a per line base and is extremely fast (magnitudes faster than any approach involving real parsing) and its performance is independent from the document size. But if we wanna have real syntax analysis in real-time, there is a price to pay for it and this price is a slower syntax engine. But with some real computer science (many dissertations have been written about parsers) and a lot of tricks, the user hopefully won't  perceive any loss in responsiveness.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110%;" &gt;The streaming tokenizer / parser approach&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While most parsers need to read the full document to parse it then all at once, CodeMirror is more like a streaming pipeline engine: it can start at any line in the document, after processing that line, the engine spits out immediately the tokens containing the syntax coloring information and in the near future callbacks for indentation and maybe even code-completion. So how does this engine work ? The main trick is that the parser stores its state at each line, so it can resume its operation at any line. Of course with all the details, it is a bit more complicated:&lt;br /&gt;&lt;br /&gt;First we have our document, bespin internally represents it as an array of lines of text. Then there is a StringStream wrapper, which allows us to treat the document like a stream. Then there is a stream traverser which goes forward through the stream, passing the stream content to the tokenizer, which splits the stream into tokens and the last element in the pipeline, the parser does the main job of further analyzing those tokens. For every line the parser attaches a copy of itself (or better: its internal state) to he line. So once the document is initially parsed up to a certain line Y and the the user changes something at a previous line X, the engine retrieves the stream starting at line X, grabs the parser which has been attached to line X and continues its job there.&lt;br /&gt;&lt;br /&gt;Of course there are a lot of things which can go wrong.  For example the engine loosing sync between the stream representing the actual text lines, the document itself and  the stored parsers. If this happens the document needs to be fully reparsed, which is a performance disaster. And this happens right now, because a few parts are not implemented yet, but I am working on it.&lt;br /&gt;&lt;br /&gt;I am very excited about integrating the engine with Malte Ubi's work: &lt;a href="http://joose-js.blogspot.com/2009/03/offloading-arbitrary-js-objects-to.html"&gt;offloading the engine to webworkers / gears for async background syntax analysis&lt;/a&gt; and merging it with the upcoming thunderhead editor component, which is optimized for calling the syntax engine only when really necessary. Right now I am messing with caching (otherwise the parser would block the UI, arrghh !!!), I try to detect whether calling the syntax engine is necessary, if not I provide cached results if available.&lt;br /&gt;&lt;br /&gt;So the next week will be very interesting, to see how these things rapidly evolve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8031225820770201586?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8031225820770201586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8031225820770201586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8031225820770201586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8031225820770201586'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/more-on-new-syntax-engine-for-bespin.html' title='More on the new syntax engine for bespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2276651370738186602</id><published>2009-03-04T09:09:00.000-08:00</published><updated>2009-03-05T05:58:42.702-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='parser'/><category scheme='http://www.blogger.com/atom/ns#' term='codemirror'/><title type='text'>Porting CodeMirror syntax parser to Bespin</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6nF5cKrqCDc/Sa62oGqkJ5I/AAAAAAAAA38/5yU_REYrplk/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 370px;" src="http://1.bp.blogspot.com/_6nF5cKrqCDc/Sa62oGqkJ5I/AAAAAAAAA38/5yU_REYrplk/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5309381810816558994" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/Sa62eux1jkI/AAAAAAAAA30/5zQiktzrjvY/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 371px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/Sa62eux1jkI/AAAAAAAAA30/5zQiktzrjvY/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5309381649785785922" border="0" /&gt;&lt;/a&gt;The first screenshot (or the second, if the images are in a row) shows the current bespin syntax highlighting engine. It applies on a per-line base regular expressions to highlight the different parts. This approach is very fast, and new language color definitions can easily be added, but the engine is not aware of the internal structure of the code the user is typing in, and therefore such an engine cannot be extended to show in realtime syntax errors and provide intelligent code indentation and completion. The engine splits code into the following elements for colorizing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;comments&lt;/li&gt;&lt;li&gt; C-style comments&lt;/li&gt;&lt;li&gt;keywords&lt;/li&gt;&lt;li&gt;strings&lt;/li&gt;&lt;li&gt;punctuation&lt;/li&gt;&lt;/ul&gt;The second screenshot shows an early stage of a new approach I am working on, a syntax engine which uses a real tokenizer and parser (borrowed from the &lt;a href="http://marijn.haverbeke.nl/codemirror/"&gt;CodeMirror&lt;/a&gt; project), fully aware of the structure of the code. So far the initial coloring is fine, but to get it work continuously and smooth and with large files, there are a lot of problems and a lot of work to solve them ahead.&lt;br /&gt;&lt;br /&gt;The second screenshot  (or first, if the images are in a row) also shows that a few more Javascript code elements got identified and colored:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;atoms&lt;/li&gt;&lt;li&gt;variables&lt;/li&gt;&lt;li&gt;variable definitions&lt;/li&gt;&lt;li&gt;local variables&lt;/li&gt;&lt;li&gt;properties &lt;/li&gt;&lt;li&gt;operators&lt;/li&gt;&lt;/ul&gt;I have chosen Javascript as the first language to port to this new syntax engine, because it is the most important one for me and maybe for web apps in general. But JS is a dynamic language and syntax analys is tricky. The good thing about CodeMirror is that beside of JS there exist already tokenizers / parsers for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CSS&lt;/li&gt;&lt;li&gt;HTML mixed (with JS, CSS)&lt;/li&gt;&lt;li&gt;PHP mixed (with JS, CSS, HTML)&lt;/li&gt;&lt;li&gt;Django mixin (my proof-of-concept, never got officially released)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This new syntax engine, if I ever get it working in an acceptable way, is not supposed to replace the existing one. If desired and enabled, it will try to provide a better user experience, but will use the original syntax engine as fail back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2276651370738186602?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2276651370738186602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2276651370738186602' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2276651370738186602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2276651370738186602'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/03/porting-codemirror-syntax-parser-to.html' title='Porting CodeMirror syntax parser to Bespin'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6nF5cKrqCDc/Sa62oGqkJ5I/AAAAAAAAA38/5yU_REYrplk/s72-c/Picture+2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7141129040684489616</id><published>2009-02-28T12:29:00.000-08:00</published><updated>2009-03-01T14:48:22.719-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Bespin -  experimenting with embedded preview</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6nF5cKrqCDc/Samfc1YWZ4I/AAAAAAAAA3k/_T9ZdbSM3fE/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_6nF5cKrqCDc/Samfc1YWZ4I/AAAAAAAAA3k/_T9ZdbSM3fE/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5307948953547204482" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6nF5cKrqCDc/SamfSOEJmmI/AAAAAAAAA3c/ZmQpKqTXDAY/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_6nF5cKrqCDc/SamfSOEJmmI/AAAAAAAAA3c/ZmQpKqTXDAY/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5307948771194804834" border="0" /&gt;&lt;/a&gt;While a browser based text editor or web development environment has many disadvantages compared to the desktop variant, there a also some great possibilities which haven't been explored yet with &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt;. Possibilities such as having direct browser DOM access for previewing and possibly manipulating content and that is not limited to text.  Images (img tags and  background images) can also be edited live (with a bit of canvas magic, as e.g. in &lt;a href="http://www.pixastic.com"&gt;pixastic&lt;/a&gt;) and server round trips are only required to store the edited images. Traditional editors can only dream of this and adding this possibilities  to monster IDEs makes them even more complex.&lt;br /&gt;So here is my proposal (including &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480749"&gt;fully functional early stage prototype&lt;/a&gt;) for a live preview, see the screenshots above,  just clicking on the eye icon at the toolbar and at the place of the editor canvas with the HML source code, a preview panel gets blended in.  Unfortunately there are a few issues. Lets take a look at the style definition of  the example. It has defined properties for the "body". But we don't want to change the bespin body properties. So what I am doing to prevent a visual and usability disaster is parsing (not really in the lexical sense) the HTML template, extracting styles and injecting them as filtered CSS rules into the page when rendering the preview and removing the rules  when switching off the preview.&lt;br /&gt;&lt;br /&gt;So far this is only for HTML templates. But my idea is to have a pluggable template parser system so we can expand PHP, django or other templates. While this is not easy, I have done it before (&lt;a href="http://erlydtl.googlecode.com/"&gt;ErlyDTL&lt;/a&gt;, the Django template language for Erlang) and I have used a javascript template system before: &lt;a href="http://dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl"&gt;dojox.dtl&lt;/a&gt; - dojo django rendering. So why not use dojox.dtl for bespin template rendering ? Well, first it is specific for django, second it is text and node based (for performance reasons). That is good for an app where template parts get swapped frequently, but just for preview we don't need a node based template system, at least not for now because it adds a lot of complexity.&lt;br /&gt;&lt;br /&gt;And one more thing to consider are the edge cases in which this approach won't work. Hopefully with enough trickery the embedded preview will work good enough in most cases. The bespin toolbar and commando line will anyway prevent a full-browser preview, unless they are blended out as well, which is currently not implemented and I am not even sure whether it would be a good idea to do so.&lt;br /&gt;&lt;br /&gt;If you wanna contribute to the technical discussion, please user the &lt;a href="http://groups.google.com/group/bespin-core/t/59547b44e3ab8234"&gt;google bespin core group&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7141129040684489616?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7141129040684489616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7141129040684489616' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7141129040684489616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7141129040684489616'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/02/bespin-experimenting-with-embedded.html' title='Bespin -  experimenting with embedded preview'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6nF5cKrqCDc/Samfc1YWZ4I/AAAAAAAAA3k/_T9ZdbSM3fE/s72-c/Picture+2.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8100421368451277939</id><published>2009-02-25T08:03:00.000-08:00</published><updated>2009-02-26T11:15:54.101-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><title type='text'>Does now web development start to move into the browser ?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6nF5cKrqCDc/SaV3EbX5F8I/AAAAAAAAA3U/hZ64R8k3lco/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 231px;" src="http://2.bp.blogspot.com/_6nF5cKrqCDc/SaV3EbX5F8I/AAAAAAAAA3U/hZ64R8k3lco/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5306778653877147586" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6nF5cKrqCDc/SaV25a7ZLzI/AAAAAAAAA3M/kmIy44P9t7w/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 215px;" src="http://2.bp.blogspot.com/_6nF5cKrqCDc/SaV25a7ZLzI/AAAAAAAAA3M/kmIy44P9t7w/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5306778464779054898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/SaV2rP4MKgI/AAAAAAAAA3E/78kGCzBbJUo/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/SaV2rP4MKgI/AAAAAAAAA3E/78kGCzBbJUo/s320/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5306778221294660098" border="0" /&gt;&lt;/a&gt;The browser has always been the most common tool to consume content from the internet.  It also has served to create simple text based content (CMS). But now the tools start to appear for creating more complex content like web applications direclty in the browser. Let me list what I have tried out (or just heard of) recently.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt; the super-cool and wicked-fast browser code editor (which since today contains a few lines of code I have contributed)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://280atlas.com/"&gt;280atlas&lt;/a&gt;, just been announced yesterday, an amazingly awesome looking visual builder for &lt;a href="ttp://cappuccino.org/"&gt;cappccino&lt;/a&gt;  web apps, not available yet, except of the screencast.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wavemaker.com/"&gt;Wavemaker&lt;/a&gt;, they have been around for a while, very enterprisy, it did not work for my out of the box when I tried a few months ago (isn't the first impression what counts most ?).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amyeditor.com/"&gt;AmyEditor&lt;/a&gt;. Looks like an online version of TextMate. That is good, because TextMate looks and feels  great and people just love TextMate, but is bad because I believe the browser is not the right place for embedding a desktop app alike. And when resizing the browser, that app did not resize, so that was the early ending of my exploration of that otherwise probably great app.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.coghead.com/"&gt;Coghead&lt;/a&gt;. Was a cloudbased visual app builder.  They failed, are on the deadpool now. At least they could sell some of their IP to SAP. AFAIK, Coghead was not open source, halfway flash based and had a lot of proprietary things, even a proprietary programming language. Maybe that is not the way to go, unless you have more salesmen than developers in the team.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Beside of bespin these web apps all seem to look like desktop apps. I am not sure whether this is what developers will feel most comfortable with. Look at gmail, greader and other highly successful web apps. They don't look like and feel like desktop apps.&lt;br /&gt;&lt;br /&gt;There are also cool graphics apps from &lt;a href="http://www.aviary.com/"&gt;aviary&lt;/a&gt;, for creating artwork. They are flash based and take more time to load than &lt;a href="http://www.pixelmator.com/"&gt;Pixelmator&lt;/a&gt; on my laptop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8100421368451277939?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8100421368451277939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8100421368451277939' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8100421368451277939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8100421368451277939'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/02/does-now-web-development-start-to-move.html' title='Does now web development start to move into the browser ?'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6nF5cKrqCDc/SaV3EbX5F8I/AAAAAAAAA3U/hZ64R8k3lco/s72-c/Picture+1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1239709485476842275</id><published>2009-02-24T12:03:00.000-08:00</published><updated>2009-02-24T12:18:20.898-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>bespin now dojo-powered</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6nF5cKrqCDc/SaRUi4FtoaI/AAAAAAAAA28/9ZOW8pFhn-w/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 258px;" src="http://3.bp.blogspot.com/_6nF5cKrqCDc/SaRUi4FtoaI/AAAAAAAAA28/9ZOW8pFhn-w/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5306459219097919906" border="0" /&gt;&lt;/a&gt;well, at least on my laptop, but I submitted a &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480009"&gt;patch&lt;/a&gt;, so if the Mozilla guys like it, I hope it goes into trunk. The screenshot shows bespin running on the brand new Safari 4 beta.&lt;br /&gt;&lt;br /&gt;There are still things to do related to the port, for example eliminating global variables outside of dojo and bespin namespace, dojo build profile and fixing the zillons of bugs I probably have introduced (but at least one I fixed, mousewheel works on Firefox as well)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1239709485476842275?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1239709485476842275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1239709485476842275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1239709485476842275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1239709485476842275'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/02/bespin-now-dojo-powered.html' title='bespin now dojo-powered'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6nF5cKrqCDc/SaRUi4FtoaI/AAAAAAAAA28/9ZOW8pFhn-w/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1043982349208395035</id><published>2009-02-22T18:29:00.000-08:00</published><updated>2009-02-23T01:35:10.985-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Porting bespin to dojo - 90 percent done</title><content type='html'>No I try to break the number one rule in software development: the last 10 percent take 90% of the total time. The dashboard works, except the command line sometimes having hiccups. The editor lets me type in text, but anything else breaks. I also replaced all third party libraries (in the external folder) with dojo equivalents. Here my experience in regard to prototype:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's an absolutely fantastic framework if you wanna simple things get done quickly and you don't care about JS design philosophies (name spaces, native object extension).&lt;/li&gt;&lt;li&gt;There are a lot of utility functions for string, array and enumerable manipulation, but some of these functions are "opinionated" as all the great things from the 37systems guys. In dojo you end up cooking together your own one-line solutions for the simple stuff. It is additional work, but results in a customized and optimized solution. &lt;/li&gt;&lt;li&gt;The huge amount of string utilities suggests that prototype is targeted to developers who prefer not to deal too much with regular expressions. &lt;/li&gt;&lt;/ul&gt;So what else is missing once the bug fixing is done:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Name space cleanup: I used a all-lowercase namespace (e.g.: "bespin.editor"), because that is how dojo name space and file hierarchy looks like. I regret that, because it violates the bespin coding guideline and worst of all, requires a lot of slave work to update the documentation, so I will refactor to a name space mostly identical to the current one from bespin trunk (e.g.: "Bespin.Editor")&lt;/li&gt;&lt;li&gt;There are still some global variables (in the startup scripts), but before I even suggest how to change that I need some feedback from the bespin architects.&lt;/li&gt;&lt;li&gt;Testing (I introduced lots of bugs ...)&lt;/li&gt;&lt;li&gt;Build script to create minimized JS/CSS for production, maybe as paver task.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: I found a &lt;a href="http://spreadsheets.google.com/pub?key=prliQ9vLaGhxm2wn-81MUBA"&gt;cheat sheet&lt;/a&gt; for conversion between dojo &lt;-&gt;prototype&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1043982349208395035?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1043982349208395035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1043982349208395035' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1043982349208395035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1043982349208395035'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/02/porting-dojo-to-bespin-90-percent-done.html' title='Porting bespin to dojo - 90 percent done'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-9084892411475629729</id><published>2009-02-19T19:57:00.001-08:00</published><updated>2009-02-20T12:19:18.201-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='bespin'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Exploring bespin - and porting it to dojo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/SZ4qRER_2-I/AAAAAAAAA2o/dQNO7O6N9sQ/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 282px;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/SZ4qRER_2-I/AAAAAAAAA2o/dQNO7O6N9sQ/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5304723883784395746" border="0" /&gt;&lt;/a&gt;After some months absent from blogging and open source software involvement, the launch of &lt;a href="http://bespin.mozilla.com/"&gt;bespin&lt;/a&gt; motivated me to get back to fun-hacking and blogging. Bespin is a browser based code editor which feels and smells like a real editor (vim, emacs, textmate), and not like a form on a webpage as all of the other browser based code editors (including an experimental one I hacked together myself). Internally bespin uses canvas and therefore currently only runs well on Firefox or webkit nightly. As JS lib &lt;a href="http://www.prototypejs.org/"&gt;Protoptype&lt;/a&gt; was choosen, but that &lt;a href="https://wiki.mozilla.org/Labs/Bespin/FAQ#Why_did_you_choose_Prototype.3F"&gt;might change&lt;/a&gt; in favor of &lt;a href="http://www.dojotoolkit.org"&gt;dojo&lt;/a&gt;. So I thought I will give it a try, to port bespin to dojo and learn about the internals of bespin. And  it might serve as suggestion in case bespin officially gets ported to dojo.&lt;br /&gt;&lt;br /&gt;So where we are so far ? The screenshot at right shows that dashboard canvas rendering halfway works already, but with scaling dimensions something went wrong. Prototype makes the simple things very simple, dojo doesn't care much about the simple things, so I had to hand code a few things which had ready-to-use counterparts in prototype. But the really ugly thing about Prototype based javascript development is the global name space pollution and the extension of native objects, that is so much better handled with dojo and its class system. Of course nobody cares about those details once an app is up and running. Will finish the port and submit it to bespin bugzilla, but it might take a few days to iron out the bugs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-9084892411475629729?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/9084892411475629729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=9084892411475629729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/9084892411475629729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/9084892411475629729'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2009/02/exploring-bespin-and-porting-it-to-dojo.html' title='Exploring bespin - and porting it to dojo'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/SZ4qRER_2-I/AAAAAAAAA2o/dQNO7O6N9sQ/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4321731637662236243</id><published>2008-09-21T13:10:00.000-07:00</published><updated>2008-09-21T13:20:49.847-07:00</updated><title type='text'>Javascript performance optimization with jeene</title><content type='html'>&lt;a href="http://blog.higher-order.net/"&gt;Karl Krukov&lt;/a&gt; is working on &lt;a href="http://code.google.com/p/jeene/"&gt;Jeene&lt;/a&gt;, a Javascript library for partial evaluation, based on Douglas Crockford’s Pratt JS parser. Karl has just published some &lt;a href="http://blog.higher-order.net/2008/09/21/jeene-update-performance-features-and-backlog/"&gt;benchmarks&lt;/a&gt; (across all common browsers), where Jeene brings performance optimization of approximately 50%.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-4321731637662236243?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4321731637662236243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4321731637662236243' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4321731637662236243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4321731637662236243'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/09/javascript-performance-optimization.html' title='Javascript performance optimization with jeene'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2299839984042702937</id><published>2008-09-02T13:28:00.000-07:00</published><updated>2008-09-02T13:30:34.478-07:00</updated><title type='text'>I want chrome !</title><content type='html'>But there is no date yet &lt;a href="http://googlemac.blogspot.com/2008/09/platforms-and-priorities.html"&gt;when it becomes available&lt;/a&gt; for Mac.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2299839984042702937?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2299839984042702937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2299839984042702937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2299839984042702937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2299839984042702937'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/09/i-want-chrome.html' title='I want chrome !'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6632181450685946960</id><published>2008-08-07T10:51:00.000-07:00</published><updated>2008-08-07T10:59:59.330-07:00</updated><title type='text'>Online publishing with Issuu.com</title><content type='html'>&lt;a href="http://www.issuu.com"&gt;Issuu&lt;/a&gt; has an interesting solution for online publishing of print magazines and other publications. It is partially in flash, I usually don't like Flash, but their Flash stuff is really well done. And they take interesting approaches for the surrounding stuff of a web app as well, take a look at their documentation: &lt;a href="http://platform.issuu.com"&gt;http://platform.issuu.com&lt;/a&gt;, it's all google groups pages !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6632181450685946960?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6632181450685946960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6632181450685946960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6632181450685946960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6632181450685946960'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/08/online-publishing-with-issuucom.html' title='Online publishing with Issuu.com'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4513568622836783444</id><published>2008-07-22T21:56:00.000-07:00</published><updated>2008-07-22T22:11:37.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><title type='text'>Perl on Google App Engine</title><content type='html'>Brad Fitzpatrick, the guy who added memchached to the Google App Engine, is starting a new project at Google: &lt;a href="http://brad.livejournal.com/2388824.html"&gt;adding Perl support to the App Engine&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-4513568622836783444?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4513568622836783444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4513568622836783444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4513568622836783444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4513568622836783444'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/07/perl-on-google-app-engine.html' title='Perl on Google App Engine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5012858421140470441</id><published>2008-07-21T12:28:00.000-07:00</published><updated>2008-07-21T12:58:29.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>10gen: Cloud hosting platform offering serverside Javascript</title><content type='html'>There was some speculation that Google will offer it once they open up the App Engine Platform to more languages, there were some small-scale attempts with serverside Javascript (including the mine, with http://erlyjs.googlecode.com, which is currently receiving very little attention from my side) but now &lt;a href="http://www.10gen.com"&gt;10gen&lt;/a&gt; (with well known Java hacker and director of the Apache Software Foundation Geir Magnusson as CoFounder) plans to offer cloud-based hosting solution  with any language running on the Java VM (at least that is what I am reading between the lines of their press release) and the funny thing is they don't start with Java itself, no they offer as first Language Javascript.  The guys at 10gen also seem to like &lt;a href="http://www.djangoproject.com"&gt;django&lt;/a&gt;, a quick look at one of the &lt;a href="http://www.10gen.com/wiki/DevTutorial2"&gt;tutorials&lt;/a&gt; reveals they are providing a thing called &lt;a href="http://www.10gen.com/wiki/Djang10"&gt;djang10&lt;/a&gt;, django inspired framework for creating web applications purely in Javascript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5012858421140470441?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5012858421140470441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5012858421140470441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5012858421140470441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5012858421140470441'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/07/10gen-cloud-hosting-platform-offering.html' title='10gen: Cloud hosting platform offering serverside Javascript'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5037189212731578855</id><published>2008-06-28T05:48:00.000-07:00</published><updated>2008-06-30T01:53:58.038-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang_exchange'/><title type='text'>Erlang Exchange 2008</title><content type='html'>The last two days I have spent at the Erlang Exchange Conference. It was great to met other Erlang hackers in person I just knew from their blog, emails or mailing list. Below the slides from my talk:&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=ddqg9x35_97fnjs9jgh' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5037189212731578855?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5037189212731578855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5037189212731578855' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5037189212731578855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5037189212731578855'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/06/erlang-exchange-2008.html' title='Erlang Exchange 2008'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8789859386655022416</id><published>2008-06-14T10:02:00.000-07:00</published><updated>2008-06-14T13:41:35.292-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Javascript syntax highligting for Firebug</title><content type='html'>The syntax highligting capabilities of &lt;a href="http://marijn.haverbeke.nl/codemirror/"&gt;CodeMirror&lt;/a&gt;, my favorite Javascript based code editor (for Web IDE-type applications) found their way into &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;, currently available as &lt;a href="http://xrefresh.com/rainbow"&gt;additional extension&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8789859386655022416?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8789859386655022416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8789859386655022416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8789859386655022416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8789859386655022416'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/06/javascript-syntax-highligting-for.html' title='Javascript syntax highligting for Firebug'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8715084766226292593</id><published>2008-06-06T10:06:00.000-07:00</published><updated>2008-06-06T12:11:28.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='comet'/><title type='text'>Google App Engine limitations and workarounds</title><content type='html'>One of the current limitations of the &lt;a href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt; is the lack of scheduled background processes. But early adapters are creative to circumnavigate this and other limitations.  The most  simple solution to this problem has &lt;a href="http://stage.vambenepe.com/archives/209"&gt;William Vambenepe&lt;/a&gt;: he uses Google Reader to subscribe to a dummy RSS feed on his App Engine hosted test app, that results in some kind of regular polling with an interval of about 30 minutes. Of course this can't be used for any serious stuff, and the eight  seconds maximum lifespan of a request also  is not  helping much to improve the situation.  William concludes:&lt;br /&gt;&lt;blockquote&gt;In the meantime, this was a fun exploration of the GAE environment. It makes it clear to me that this environment is still a toy. But a very interesting and promising one.&lt;/blockquote&gt;A more sophisticated but also much more complicated solution to the same problem has Peter Dolan: &lt;a href="http://code.google.com/p/httpmr/"&gt;HTTPMR&lt;/a&gt;, a Map Reduce implementation in Python for running on HTTP based web clusters such as Google App Engine.&lt;br /&gt;&lt;br /&gt;I am experimenting myself with a completely rewritten, not yet released version of &lt;a href="http://erlycomet.googlecode.com/"&gt;ErlyComet&lt;/a&gt;, for adding a RESTful, highly scalable Comet layer with transactional cache in front of Google App Engine (or any other service which provides easy,  cheap, reliable and scalable solution for persistence and shortlived HTTP requests)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8715084766226292593?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8715084766226292593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8715084766226292593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8715084766226292593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8715084766226292593'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/06/google-app-engine-limitations-and.html' title='Google App Engine limitations and workarounds'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3544563282243548671</id><published>2008-06-01T19:25:00.000-07:00</published><updated>2008-06-01T19:41:47.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Malicious Flash fullscreen mode</title><content type='html'>Go &lt;a href="http://www.bunnyhero.org/2008/05/10/scaring-people-with-fullscreen/"&gt;there&lt;/a&gt; an try it yourself. It doesn't do any real harm, but it can scare people, especially those not really familiar with the latest capabilities of the flash player, such as full screen mode. While this example is just fun  and actually the first example of this kind I have seen, I guess the same principles could also be used for real malicious stuff (e.g.: a new kind of phishing).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3544563282243548671?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3544563282243548671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3544563282243548671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3544563282243548671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3544563282243548671'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/06/malicious-flash-fullscreen-mode.html' title='Malicious Flash fullscreen mode'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5721620365634283981</id><published>2008-05-29T11:19:00.000-07:00</published><updated>2008-05-29T15:16:45.705-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet explorer'/><title type='text'>IETester - makes web page testing on IE less painful</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6nF5cKrqCDc/SD72pgRMRMI/AAAAAAAAAyE/C3fTAF_yjoU/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_6nF5cKrqCDc/SD72pgRMRMI/AAAAAAAAAyE/C3fTAF_yjoU/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5205869412183983298" border="0" /&gt;&lt;/a&gt;Previously I was switching between several virtually installed Windows XP instances on &lt;a href="http://www.parallels.com/"&gt;Parallels&lt;/a&gt; (for Mac OS X), just for testing  a web page on different versions of Internet Explorer. Now I have installed &lt;a href="http://www.my-debugbar.com/wiki/IETester/HomePage"&gt;IETester&lt;/a&gt;, a free Windows tool, which allows to run simultaneously (and switch  between) the following IE versions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IE 5.5&lt;/li&gt;&lt;li&gt;IE 6&lt;br /&gt;&lt;/li&gt;&lt;li&gt;IE 7&lt;/li&gt;&lt;li&gt;IE 8 beta 1&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/3729811-5721620365634283981?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5721620365634283981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5721620365634283981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5721620365634283981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5721620365634283981'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/ietester-makes-web-page-testing-on-ie.html' title='IETester - makes web page testing on IE less painful'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6nF5cKrqCDc/SD72pgRMRMI/AAAAAAAAAyE/C3fTAF_yjoU/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-213508279296531618</id><published>2008-05-26T23:25:00.000-07:00</published><updated>2008-05-27T06:57:29.614-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Notapad - the start of a dojo based WebIDE</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6nF5cKrqCDc/SDuxNARMRLI/AAAAAAAAAx8/fsU7Vi2vlr4/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_6nF5cKrqCDc/SDuxNARMRLI/AAAAAAAAAx8/fsU7Vi2vlr4/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5204948631325263026" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.nicolarizzo.com/"&gt;Niccola Rizzo&lt;/a&gt; has been working for a couple of months now on the &lt;a href="http://code.google.com/p/codetextarea/"&gt;CodeTextArea&lt;/a&gt; dojo widget for in-browser Javascript code editing and he has just launched a public demo and test site named &lt;a href="http://notapad.org/"&gt;notaPad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The editor provides Javascript syntax highlighting and additional functionalities with the following key bindings:&lt;br /&gt;&lt;br /&gt;CTRL + space - autocomplete&lt;br /&gt;CTRL + l - GOTO LINE&lt;br /&gt;CTRL + b - GOTO MATCHING BRACKET&lt;br /&gt;CTRL + c - COPY&lt;br /&gt;CTRL + x - CUT&lt;br /&gt;CTRL + v - PASTE&lt;br /&gt;right click on the row numbers - BOOKMARKS&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-213508279296531618?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/213508279296531618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=213508279296531618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/213508279296531618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/213508279296531618'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/notapad-start-of-dojo-based-webide.html' title='Notapad - the start of a dojo based WebIDE'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6nF5cKrqCDc/SDuxNARMRLI/AAAAAAAAAx8/fsU7Vi2vlr4/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2495235679507358636</id><published>2008-05-25T21:40:00.000-07:00</published><updated>2008-05-26T14:25:04.884-07:00</updated><title type='text'>blogger.com not updating homepages</title><content type='html'>Shame on you, Google ! The last few posts of this blog did only update my blog homepage after about 24 hours. I guess updating the homepage is not part of the transaction when a new post gets stored somewhere on BigTable. So if you wanna see the actual homepage of this blog instead of an out-of-date cached version, type in:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;http://rsaccon.com/index.html&lt;/span&gt; (instead of http://rsaccon.com)&lt;br /&gt;&lt;br /&gt;Anyway, real men build their own blog engine, instead of complaining. Right now new blog engines are popping up like mushrooms, as result of some 60000 developers messing around with Google App Engine. Unfortunately those real men are facing real problems when trying to completely import old blogs into their custom blog engine, at least that is what happened to me when I tried some years ago with a custom Rails blog engine. So for now let's hope the blogger.com issues are just temporary ...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: It's getting worse. Right after posting, http://rsaccon.com/index.html also continued to serve the outdated cached version.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update II&lt;/span&gt;: A couple of hours later, at least the .../index.html home page got updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2495235679507358636?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2495235679507358636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2495235679507358636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2495235679507358636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2495235679507358636'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/bloggercom-not-updating-homepages.html' title='blogger.com not updating homepages'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8133193519919898247</id><published>2008-05-24T13:39:00.001-07:00</published><updated>2008-05-25T18:47:50.776-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>js2-mode - the second most important Javascript tool</title><content type='html'>I have been using &lt;a href="http://code.google.com/p/js2-mode/"&gt;js2-mode&lt;/a&gt; (an Emacs Javascript mode) for a &lt;a href="http://www.rsaccon.com/2008/03/emacs-on-ajax-with-steve-yegges-new-js2.html"&gt;couple of weeks&lt;/a&gt; now. I started using it out of curiosity, at the time I gave up on &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; as all-purpose editor and turned back to Emacs, mainly because Emacs has so much better Erlang support. Now I consider js2-mode as the second most important Javascript tool (nothing can beat &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; of course, and Firebug 1.2B1 on Firefox 3RC1 really  rocks !).  It fits perfectly into my work flow, you don't have to learn anything specifically to use it, it shows on-the-fly any syntax errors, global variables (which usually are unintentional), does a great job of line indenting, but because line indenting is often a question of personal style, js2-mode offers several possibilities you can cycle through via TAB. And in case you don't like how js2-mode works out-of-the-box, there are tons of customization options.&lt;br /&gt;&lt;br /&gt;The only thing I am missing: I would like to use js2-mode as well  as minor mode in HTML, but that doesn't seem to work yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: After writing this post, I just discovered another &lt;a href="http://www.toolness.com/wp/?p=40"&gt;recent article&lt;/a&gt; about js2-mode with focus on syntax highlighting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8133193519919898247?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8133193519919898247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8133193519919898247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8133193519919898247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8133193519919898247'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/js2-mode-second-most-important.html' title='js2-mode - the second most important Javascript tool'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5494438681968588568</id><published>2008-05-23T15:03:00.000-07:00</published><updated>2008-05-24T09:05:17.352-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Dojo Widget for in-browser  editor CodeMirror</title><content type='html'>&lt;a href="http://marijn.haverbeke.nl/codemirror/"&gt;CodeMirror&lt;/a&gt;, a very impressive in-browser code editor for &lt;a href="http://marijn.haverbeke.nl/codemirror/jstest.html"&gt;Javascript&lt;/a&gt;, &lt;a href="http://marijn.haverbeke.nl/codemirror/htmltest.html"&gt;XML/HTML&lt;/a&gt; or &lt;a href="http://marijn.haverbeke.nl/codemirror/csstest.html"&gt;CSS&lt;/a&gt; (or any language, you just have to plug in a your own parser)  made some nice progress in the last months. CodeMirror has no dependency on other frameworks or libraries. If you want to use it in a dojo environment as a dojo compatible widget, here I am gonna share here a little tutorial how to write such a thing:&lt;br /&gt;&lt;br /&gt;First download CodeMirror and transform CodeMirror.js (the main file which loads the other files into an iframe), into something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;dojo.provide(&lt;span class="string"&gt;"mystuff.widget.CodeMirror"&lt;/span&gt;);&lt;br /&gt;dojo.require(&lt;span class="string"&gt;"dijit._Widget"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dojo.declare(&lt;span class="string"&gt;"&lt;/span&gt;&lt;span&gt;&lt;span class="string"&gt;mystuff&lt;/span&gt;&lt;/span&gt;&lt;span class="string"&gt;.widget.CodeMirror"&lt;/span&gt;, dijit._Widget, {&lt;br /&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;initialized&lt;/span&gt;: &lt;span class="constant"&gt;false&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;// currently supported: 'xml' (HTML), 'js' or 'css'&lt;/span&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;type&lt;/span&gt;: &lt;span class="string"&gt;'xml'&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;options&lt;/span&gt;: {&lt;br /&gt;&lt;span class="variable-name"&gt;stylesheet&lt;/span&gt;: &lt;span class="string"&gt;""&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;path&lt;/span&gt;: &lt;span class="string"&gt;"/static/codemirror/js/"&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;parserfiles&lt;/span&gt;: [],&lt;br /&gt;&lt;span class="variable-name"&gt;basefiles&lt;/span&gt;: [&lt;span class="string"&gt;"codemirror_iframe.js"&lt;/span&gt;],&lt;br /&gt;&lt;span class="variable-name"&gt;linesPerPass&lt;/span&gt;: 15,&lt;br /&gt;&lt;span class="variable-name"&gt;passDelay&lt;/span&gt;: 200,&lt;br /&gt;&lt;span class="variable-name"&gt;continuousScanning&lt;/span&gt;: &lt;span class="constant"&gt;false&lt;/span&gt;,&lt;br /&gt;&lt;span class="function-name"&gt;saveFunction&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;console.log(&lt;span class="string"&gt;'save'&lt;/span&gt;);&lt;br /&gt;},&lt;br /&gt;&lt;span class="variable-name"&gt;content&lt;/span&gt;: &lt;span class="string"&gt;" "&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;undoDepth&lt;/span&gt;: 20,&lt;br /&gt;&lt;span class="variable-name"&gt;undoDelay&lt;/span&gt;: 800,&lt;br /&gt;&lt;span class="variable-name"&gt;disableSpellcheck&lt;/span&gt;: &lt;span class="constant"&gt;true&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;textWrapping&lt;/span&gt;: &lt;span class="constant"&gt;true&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;readOnly&lt;/span&gt;: &lt;span class="constant"&gt;false&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;width&lt;/span&gt;: &lt;span class="string"&gt;"100%"&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;height&lt;/span&gt;: &lt;span class="string"&gt;"100%"&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;parserConfig&lt;/span&gt;: &lt;span class="constant"&gt;null&lt;/span&gt;&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;postMixInProperties&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.options.stylesheet = &lt;span class="string"&gt;"/static/codemirror/css/"&lt;/span&gt; + &lt;span class="builtin"&gt;this&lt;/span&gt;.type + &lt;span class="string"&gt;"colors.css"&lt;/span&gt;;&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.options.parserfiles = [&lt;span class="string"&gt;"parse"&lt;/span&gt; + &lt;span class="builtin"&gt;this&lt;/span&gt;.type + &lt;span class="string"&gt;".js"&lt;/span&gt;];&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;postCreate&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.inherited(arguments);&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;startup&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; (dijit._isElementShown(&lt;span class="builtin"&gt;this&lt;/span&gt;.domNode.parentNode))&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.initialize();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;initialize&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="builtin"&gt;this&lt;/span&gt;.initialized)&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt; = document.createElement(&lt;span class="string"&gt;"IFRAME"&lt;/span&gt;);&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt;.style.border = &lt;span class="string"&gt;"0"&lt;/span&gt;;&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt;.style.width = &lt;span class="builtin"&gt;this&lt;/span&gt;.options.width;&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt;.style.height = &lt;span class="builtin"&gt;this&lt;/span&gt;.options.height;&lt;br /&gt;&lt;span class="comment"&gt;// display: block occasionally suppresses some Firefox bugs, so we&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;// always add it, redundant as it sounds.&lt;/span&gt;&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt;.style.display = &lt;span class="string"&gt;"block"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.domNode.appendChild(frame);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;// Link back to this object, so that the editor can fetch options&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;// and add a reference to itself.&lt;/span&gt;&lt;br /&gt;&lt;span class="js2-external-variable"&gt;frame&lt;/span&gt;.CodeMirror = &lt;span class="builtin"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.win = frame.contentWindow;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;_this&lt;/span&gt; = &lt;span class="builtin"&gt;this&lt;/span&gt;;&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;html&lt;/span&gt; = [&lt;span class="string"&gt;"&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;link rel=\"stylesheet\" type=\"text/css\" href=\""&lt;/span&gt; + &lt;span class="builtin"&gt;this&lt;/span&gt;.options.stylesheet + &lt;span class="string"&gt;"\"/&amp;gt;"&lt;/span&gt;];&lt;br /&gt;dojo.forEach(&lt;span class="builtin"&gt;this&lt;/span&gt;.options.basefiles.concat(&lt;span class="builtin"&gt;this&lt;/span&gt;.options.parserfiles), &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;file&lt;/span&gt;) {&lt;br /&gt;html.push(&lt;span class="string"&gt;"&amp;lt;script type=\"text/javascript\" src=\""&lt;/span&gt; + _this.options.path + file + &lt;span class="string"&gt;"\"&amp;gt;&amp;lt;/script&amp;gt;"&lt;/span&gt;);&lt;br /&gt;});&lt;br /&gt;html.push(&lt;span class="string"&gt;"&amp;lt;/head&amp;gt;&amp;lt;body style=\"border-width: 0;\" class=\"editbox\" spellcheck=\""&lt;/span&gt; +&lt;br /&gt;    (&lt;span class="builtin"&gt;this&lt;/span&gt;.options.disableSpellcheck ? &lt;span class="string"&gt;"false"&lt;/span&gt; : &lt;span class="string"&gt;"true"&lt;/span&gt;) + &lt;span class="string"&gt;"\"&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;doc&lt;/span&gt; = &lt;span class="builtin"&gt;this&lt;/span&gt;.win.document;&lt;br /&gt;doc.open();&lt;br /&gt;doc.write(html.join(&lt;span class="string"&gt;""&lt;/span&gt;));&lt;br /&gt;doc.close();&lt;br /&gt;&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.initialized = &lt;span class="constant"&gt;true&lt;/span&gt;;&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;getCode&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="builtin"&gt;this&lt;/span&gt;.editor.getCode();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;setCode&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;code&lt;/span&gt;) {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.importCode(code);&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;focus&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.win.focus();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;jumpToChar&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;start&lt;/span&gt;, &lt;span class="js2-function-param"&gt;end&lt;/span&gt;) {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.jumpToChar(start, end);&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.focus();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;jumpToLine&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;line&lt;/span&gt;) {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.jumpToLine(line);&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.focus();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;currentLine&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="builtin"&gt;this&lt;/span&gt;.editor.currentLine();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;selection&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="builtin"&gt;this&lt;/span&gt;.editor.selectedText();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;reindent&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;() {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.reindent();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;replaceSelection&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;text&lt;/span&gt;, &lt;span class="js2-function-param"&gt;focus&lt;/span&gt;) {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.replaceSelection(text);&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; (focus) &lt;span class="builtin"&gt;this&lt;/span&gt;.focus();&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;replaceChars&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;text&lt;/span&gt;, &lt;span class="js2-function-param"&gt;start&lt;/span&gt;, &lt;span class="js2-function-param"&gt;end&lt;/span&gt;) {&lt;br /&gt;&lt;span class="builtin"&gt;this&lt;/span&gt;.editor.replaceChars(text, start, end);&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;getSearchCursor&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;string&lt;/span&gt;, &lt;span class="js2-function-param"&gt;fromCursor&lt;/span&gt;) {&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="builtin"&gt;this&lt;/span&gt;.editor.getSearchCursor(string, fromCursor);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Then your should concatenate and minifiy (I use &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;YUI compressor&lt;/a&gt;) all the JS files:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;util.js, stringstream.js, select.js, undo.js, editor.js&lt;/code&gt;  =&gt; &lt;code&gt;codemirror_iframe.js&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Also minify the parsers: &lt;code&gt;parsejavascript.js, tokenizejavascript.js, parsecss.js, parsexml.js&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;At this point you can embed the widget into a test page:&lt;br /&gt;&lt;pre&gt;&amp;lt;&lt;span class="function-name"&gt;div&lt;/span&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;id&lt;/span&gt;=&lt;span class="string"&gt;"html_editor"&lt;/span&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;dojoType&lt;/span&gt;=&lt;span class="string"&gt;"mystuff.widget.CodeMirror"&lt;/span&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;type&lt;/span&gt;=&lt;span class="string"&gt;"xml"&lt;/span&gt;&lt;br /&gt;&lt;span class="variable-name"&gt;style&lt;/span&gt;=&lt;span class="string"&gt;"height:100%;"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;span class="function-name"&gt;div&lt;/span&gt;&amp;gt;&lt;/pre&gt;Now comes the tricky part: the editor does not initialize automatically at page load, because with dojo, chances are very high, you are gonna use this widget inside a container, where the editor is hidden at page load, and  that would cause trouble with some browsers. So you need to subscribe to an event which triggers the visibility of the editor, so it can be lazy-initialized at first time it becomes visible. For example to use CodeMirror inside a tab container with a tab with id &lt;span style="font-family:courier new;"&gt;'html_editor_tab' &lt;/span&gt;I do something like this:&lt;br /&gt;&lt;pre&gt;dojo.declare(&lt;span class="string"&gt;"MyApp"&lt;/span&gt;, &lt;span class="constant"&gt;null&lt;/span&gt;, {&lt;br /&gt;&lt;span class="function-name"&gt;main_tab_selected&lt;/span&gt;: &lt;span class="keyword"&gt;function&lt;/span&gt;(&lt;span class="js2-function-param"&gt;page&lt;/span&gt;) {&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; (page.id == &lt;span class="string"&gt;'html_editor_tab'&lt;/span&gt;){&lt;br /&gt;dijit.byId(&lt;span class="string"&gt;'html_editor'&lt;/span&gt;).initialize();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; myAppInstance = &lt;span class="keyword"&gt;new&lt;/span&gt; MyApp();&lt;br /&gt;&lt;br /&gt;dojo.subscribe(&lt;span class="string"&gt;"main_tabs-selectChild"&lt;/span&gt;, myAppInstance, &lt;span class="string"&gt;"main_tab_selected"&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: Uhh, where was my brain when I wrote this article, I accidentally "misspelled" CodeMirror with CodePress at several places, including the title, it's corrected now ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5494438681968588568?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5494438681968588568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5494438681968588568' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5494438681968588568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5494438681968588568'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/dojo-widget-for-in-browser-editor.html' title='Dojo Widget for in-browser  editor CodeMirror'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1003767045144330062</id><published>2008-05-23T11:01:00.000-07:00</published><updated>2008-05-23T11:24:55.613-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>New Erlang web framework by Torbjorn Tornkvist</title><content type='html'>Tobbe just &lt;a href="http://groups.google.com/group/erlware-dev/browse_thread/thread/da63b068eb662b8b"&gt;announced&lt;/a&gt; the very first release of a new, very simple Erlang based web framework &lt;a href="http://erlware.org/lib/5.6.2/derail-0.1.1/"&gt;fully integrated into erlware&lt;/a&gt;. It has support for &lt;a href="http://code.google.com/p/sgte/"&gt;sgte&lt;/a&gt; templates. Tobbe also has a collection of other highly interesting web related projects in his &lt;a href="http://www.tornkvist.org/gitweb/"&gt;git repositry&lt;/a&gt;, including &lt;a href="http://cometdaily.com/2008/03/10/domerl-a-new-comet-lib-for-erlang"&gt;domerl&lt;/a&gt;, a simple, &lt;a href="http://yaws.hyber.org/"&gt;yaws&lt;/a&gt; and &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; based Comet lib.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1003767045144330062?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1003767045144330062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1003767045144330062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1003767045144330062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1003767045144330062'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/new-erlang-web-framework-by-torbjorn.html' title='New Erlang web framework by Torbjorn Tornkvist'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6143162776029321920</id><published>2008-05-23T09:18:00.000-07:00</published><updated>2008-05-23T09:37:46.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Hard to find technical docs about dojo internals</title><content type='html'>Of course an open source framework has no real untold secrets, but digging into the source code can be time consuming and and without in-deep documentation it's difficult to extract the authors thoughts behind it, so I was pleasantly surprised when I stumbled upon this links about &lt;a href="http://dojotoolkit.org/"&gt;dojo&lt;/a&gt; &lt;span style="font-weight: bold;"&gt;internals&lt;/span&gt; (which currently can't be found, or at least not by me, at &lt;a href="http://dojotoolkit.org/docs"&gt;dojo documentation&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://docs.google.com/View?docid=d764479_11fcs7s397"&gt;dojo.dnd 1.1 technical documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/View?docid=d764479_9hgdng4g8"&gt;dojox.gfx 1.1 documentation&lt;/a&gt;&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/3729811-6143162776029321920?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6143162776029321920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6143162776029321920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6143162776029321920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6143162776029321920'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/hard-to-find-technical-docs-about-dojo.html' title='Hard to find technical docs about dojo internals'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-149275207113412727</id><published>2008-05-14T23:19:00.000-07:00</published><updated>2008-05-14T23:55:50.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Next flashplayer ships with speex audio codec</title><content type='html'>See the &lt;a href="http://http//labs.adobe.com/technologies/flashplayer10/releasenotes.html#features"&gt;release notes&lt;/a&gt;. Speex is one of the best codecs for VoIP, and it is patent-free and open source. Related to this is also a new UDP-based network protocol called RTMFP for  faster realtime media and P2P-capable,  which  will be part  of flashplayer 10, now let's hope Adobe will  release this protocol  as part of their &lt;a href="http://www.adobe.com/openscreenproject/"&gt;open specification&lt;/a&gt; initiative, but I guess  they will try to keep RTMFP proprietary (at least until it gets reverse engineered), so they can sell their overpriced Media streaming servers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-149275207113412727?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/149275207113412727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=149275207113412727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/149275207113412727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/149275207113412727'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/next-flashplayer-ships-with-speex-audio.html' title='Next flashplayer ships with speex audio codec'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-771067926408887629</id><published>2008-05-14T15:31:00.000-07:00</published><updated>2008-05-14T15:50:17.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Google JS library released</title><content type='html'>As part of &lt;a href="http://code.google.com/doctype/"&gt;Google's effort to better document the open web&lt;/a&gt;, they released today some of their &lt;a href="http://doctype.googlecode.com/svn/trunk/goog/"&gt;Javascript libraries&lt;/a&gt;. I browsed a bit through the code, it is well documented and one thing grabbed my attention: the code structure looks similar to &lt;a href="http://dojotoolkit.org/"&gt;dojo&lt;/a&gt;, e.g. below a snippet from their &lt;a href="http://doctype.googlecode.com/svn/trunk/goog/dom/dom.js"&gt;DOM lib&lt;/a&gt; with ''provide" and "require" statements:&lt;br /&gt;&lt;pre class="code"&gt;goog.provide('goog.dom');&lt;br /&gt;goog.provide('goog.dom.DomHelper');&lt;br /&gt;goog.provide('goog.dom.NodeType');&lt;br /&gt;&lt;br /&gt;goog.require('goog.array');&lt;br /&gt;goog.require('goog.math.Coordinate');&lt;br /&gt;goog.require('goog.math.Size');&lt;br /&gt;goog.require('goog.object');&lt;br /&gt;goog.require('goog.string');&lt;br /&gt;goog.require('goog.userAgent');&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-771067926408887629?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/771067926408887629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=771067926408887629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/771067926408887629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/771067926408887629'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/google-js-library-released.html' title='Google JS library released'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2982507973429199808</id><published>2008-05-14T12:31:00.000-07:00</published><updated>2008-05-14T12:50:56.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>XHTML or HTML</title><content type='html'>I never really understood why people were using XHTML and I usually tried to clarify by pointing to  articles by respected Web experts (e.g.: &lt;a href="http://hixie.ch/advocacy/xhtml"&gt;Ian Hickson&lt;/a&gt;, &lt;a href="http://codinginparadise.org/weblog/2005/08/xhtml-considered-harmful.html"&gt;Brad Neuberg&lt;/a&gt;).&lt;br /&gt;Today I read &lt;a href="http://www.debuggable.com/posts/xhtml-is-a-joke:4819bf98-4978-4027-896e-2ea44834cda3"&gt;this&lt;/a&gt; and collected some more links about use and misuse of XHTML:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.webdevout.net/articles/beware-of-xhtml"&gt;Beware of XHTML&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://webkit.org/blog/68/understanding-html-xml-and-xhtml/" rel="bookmark" title="Permanent Link: Understanding HTML, XML and XHTML"&gt;Understanding HTML, XML and XHTML&lt;/a&gt;&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/3729811-2982507973429199808?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2982507973429199808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2982507973429199808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2982507973429199808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2982507973429199808'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/xhtml-or-html.html' title='XHTML or HTML'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2407483676543432986</id><published>2008-05-01T00:34:00.000-07:00</published><updated>2008-05-01T01:04:08.956-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Adobe "opening" a few more bits of Flash</title><content type='html'>Their new initiative is called &lt;a href="http://www.adobe.com/openscreenproject/"&gt;Open Screen Project&lt;/a&gt; and is dedicated to drive consistent rich Internet experiences across devices. It is not about open sourcing the flash player, just about opening some specifications, such as  FlashCast protocol and the AMF protocol. But AMF for example has been reverse engineered long time ago, in 2003 when I contributed to &lt;a href="http://sourceforge.net/projects/openamf/"&gt;JavaAMF&lt;/a&gt;, this  protocol has already been implemented in numerous other languages.&lt;br /&gt;&lt;br /&gt;What I would like to see is RTMP (the Flash Video transport protocol) as open specification, so let's hope they consider this at their  next round of "opening".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2407483676543432986?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2407483676543432986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2407483676543432986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2407483676543432986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2407483676543432986'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/05/adobe-opening-few-more-bits-of-flash.html' title='Adobe &quot;opening&quot; a few more bits of Flash'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8565451954740492558</id><published>2008-04-30T04:25:00.000-07:00</published><updated>2008-04-30T08:07:57.258-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Firefox extensions for JS disabling and Python integration</title><content type='html'>My collection of Firefox extensions is mostly just the usual stuff you need for web development, such as &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;, &lt;a href="http://www.kevinfreitas.net/extensions/measureit/"&gt;MeasureIt&lt;/a&gt;, &lt;a href="http://www.iosart.com/firefox/colorzilla/"&gt;ColorZilla&lt;/a&gt;, &lt;a href="http://www.rjonna.com/ext/s3fox.php"&gt;S3Fox&lt;/a&gt;, &lt;a href="http://www.sephiroth.it/weblog/archives/2008/04/flash_switcher_for_windows_osx_and_li.php"&gt;FlashSwitcher&lt;/a&gt; and a few more. After Firebug,  for long time I didn't spot anything comparable spectacular. But recently I discovered some interesting extensions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1237"&gt;QuickJava&lt;/a&gt;: Finally an extension which makes it dead simple to disable/re-enable Javascript (I use that often to see how Ajax enriched webpages look like without Javascript). Just one click on a status bar button to enable/disable and reloading the page. Here there is even room for improvement: I would like to have enabling/disabling  optionally coupled with reloading. Anyway, other extensions which provide the same functionality require a lot more GUI interaction.&lt;/li&gt;&lt;li&gt;&lt;a href="http://pyxpcomext.mozdev.org/"&gt;Pyxpcomext&lt;/a&gt;: Python bindings (&lt;a href="http://developer.mozilla.org/en/docs/PyXPCOM"&gt;PyXPCOM&lt;/a&gt;). This extension doesn't provide any direct end user functionality, but makes it possible to write extensions in Python instead of Javascript. Just for fun I installed the &lt;a href="http://pyxpcomext.mozdev.org/samples.html#pyshell"&gt;Python Shell&lt;/a&gt;. I can think of many potential use cases, e.g. integration with the Python based &lt;a href="http://code.google.com/appengine/"&gt;App Engine&lt;/a&gt; SDK, so that web designers not comfortable with command line interfaces could easily interact with the local App Engine test webserver via such an extension, when testing their templates and stylesheets.&lt;br /&gt;&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/3729811-8565451954740492558?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8565451954740492558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8565451954740492558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8565451954740492558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8565451954740492558'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/firefox-extensions-for-js-disabling-and.html' title='Firefox extensions for JS disabling and Python integration'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7994656310753990125</id><published>2008-04-25T22:59:00.000-07:00</published><updated>2008-06-05T20:04:41.082-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><title type='text'>The missing feature of the Web: a DNS REST API</title><content type='html'>I have been waiting for years, that a quality DNS provider will a offer a REST API for setting DNS Records, but there is still no such a thing on the market. There is a SOAP based offering from &lt;a href="http://www.nettica.com/Support/Developers.aspx#Bulk"&gt;Nettica&lt;/a&gt; (unfortunately I have an SOAP allergy). And there are the REST APIs some service providers are exposing for updating dynamic IPs.&lt;br /&gt;&lt;a href="http://www.dnsmadeeasy.com/"&gt;DNS Made Easy&lt;/a&gt;, one of my preferred DNS providers, told me about a year ago they were working on such an API. I am still waiting. Anyway, if anybody is aware of such a service, please let me know.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Found a possible solution (but I haven't actually tested their service yet): &lt;a href="http://slicehost.com/"&gt;Slicehost&lt;/a&gt;, a similar service as Amazon EC2, they seem to have an &lt;a href="http://articles.slicehost.com/2008/5/13/slicemanager-api-documentation"&gt;API&lt;/a&gt; which allows to manipulate DNS records. But your domain has to be hosted on slicehost.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update II&lt;/span&gt;: &lt;a href="http://www.worldwidedns.net"&gt;WorldwideDNS&lt;/a&gt; is another option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7994656310753990125?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7994656310753990125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7994656310753990125' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7994656310753990125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7994656310753990125'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/missing-feature-of-web-dns-rest-api.html' title='The missing feature of the Web: a DNS REST API'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-659051239021263089</id><published>2008-04-24T19:26:00.000-07:00</published><updated>2008-04-24T20:03:23.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>It's getting cloudy - Yahoo Application Platform</title><content type='html'>Just read &lt;a href="http://www.techcrunch.com/2008/04/24/the-new-yahoo-sticky-viral-and-most-of-all-friendly/"&gt;this&lt;/a&gt; on TechCrunch:&lt;br /&gt;&lt;blockquote&gt;... &lt;strong&gt;Yahoo Application Platform&lt;/strong&gt; (YAP) - which will be a direct competitor to &lt;a target="_blank" href="http://www.techcrunch.com/2008/04/07/google-jumps-head-first-into-web-services-with-google-app-engine/"&gt;Google App Engine&lt;/a&gt;. Users can host their independent applications on Yahoo’s bandwidth, storage, database and CPU resources. At first they’ll support SecurePHP applications only, but they’ll expand to additional languages over time. The model will be very similar to Google’s - free usage up to a point, metered after that. They’ll also offer various developer tools as well.&lt;/blockquote&gt;With Yahoo offering cloud based PHP app hosting, I hope Google will focus on soon adding the already announced &lt;a href="http://googleappengine.blogspot.com/2008/04/were-up-and-running.html"&gt;really useful features&lt;/a&gt; to App Engine,  and not waste engineering efforts for supporting PHP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-659051239021263089?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/659051239021263089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=659051239021263089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/659051239021263089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/659051239021263089'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/its-getting-cloudy-yahoo-application.html' title='It&apos;s getting cloudy - Yahoo Application Platform'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6656114805716323871</id><published>2008-04-22T20:51:00.000-07:00</published><updated>2008-04-22T21:38:12.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><title type='text'>Cryptography API for Google Gears</title><content type='html'>&lt;a href="http://gears.google.com/"&gt;Gears&lt;/a&gt; will provide &lt;a href="http://code.google.com/soc/2008/dojo/appinfo.html?csaid=57C1EC92D7ADC59E"&gt;native cryptography&lt;/a&gt; to web applications, at least this is what &lt;a href="http://code.google.com/soc/2008/"&gt;Google Summer of Code&lt;/a&gt; student Mike Ter Louw is planning to implement in the coming months. While it is possible to implement browser side cryptography in Javascript (e.g.: &lt;a href="http://api.dojotoolkit.org/jsdoc/dojox/HEAD/dojox.encoding"&gt;dojox.encoding&lt;/a&gt;), only few Ajax applications use this functionality, because it is slow and for communication purposes it only adds a very thin layer of security (requiring lots of &lt;a href="http://pajhome.org.uk/crypt/md5/auth.html"&gt;tricks&lt;/a&gt;) , compared to HTTPS.&lt;br /&gt;But HTTPS is a bit of a problem in todays clouding computing platforms, because it requires static IPs tied to a domain name for a valid certificate. So gears maybe will become a preferred option to increase poor man's web application security.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6656114805716323871?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6656114805716323871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6656114805716323871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6656114805716323871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6656114805716323871'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/cryptography-api-for-google-gears.html' title='Cryptography API for Google Gears'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3226845216899518178</id><published>2008-04-19T09:49:00.000-07:00</published><updated>2008-04-19T10:45:07.033-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Flash done right and on Google App Engine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/SAoqhL-nulI/AAAAAAAAAwQ/rPSA9zEHY-w/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/SAoqhL-nulI/AAAAAAAAAwQ/rPSA9zEHY-w/s320/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5191008270137408082" border="0" /&gt;&lt;/a&gt;Often I criticize the usage of Flash for content centric pages, because often Flash is implemented in a way it causes a disastrous user experience (from arbitrarily resizing browser to sound which you can't turn off and fonts which you can't resize, just to mention the worst mistakes). Now I came across a new project, which advocates to do Flash the right way:  &lt;a href="http://gaeswf.appspot.com/"&gt;gaeswf&lt;/a&gt; by &lt;a href="http://aralbalkan.com/"&gt;Aral Balkan&lt;/a&gt;, a client and server side open source framework, based on a collection of best practices for using Flash on &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, in a way that Flash does NOT suck. The proof-of concept (&lt;a href="http://gaeswf.appspot.com/examples/initial/"&gt;live demo&lt;/a&gt;) implements techniques such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Embedding Flash with &lt;a href="http://code.google.com/p/swfobject/"&gt;SwfObject&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Deep linking (based on &lt;a href="http://www.asual.com/swfaddress/"&gt;SwfAddress&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Flash content that obeys browser text-size changes&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/3729811-3226845216899518178?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3226845216899518178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3226845216899518178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3226845216899518178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3226845216899518178'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/flash-done-right-and-on-google-app.html' title='Flash done right and on Google App Engine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/SAoqhL-nulI/AAAAAAAAAwQ/rPSA9zEHY-w/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4072596650818277034</id><published>2008-04-15T07:34:00.000-07:00</published><updated>2008-04-24T20:04:03.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Google App Engine Team fixing issues quickly</title><content type='html'>Toying around a bit today on &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, I found a &lt;a href="http://http//code.google.com/p/google-app-engine-django/issues/detail?id=12"&gt;minor issue&lt;/a&gt; (not security related, very easy to work around and only affecting Mac users) in an add-on for the actual SDK. Only 32 minutes after I reported the issue they had fixed it  !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-4072596650818277034?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4072596650818277034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4072596650818277034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4072596650818277034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4072596650818277034'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/google-app-engine-team-fixing-issues.html' title='Google App Engine Team fixing issues quickly'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7612783270205077057</id><published>2008-04-13T21:50:00.000-07:00</published><updated>2008-04-24T20:06:33.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utility computing'/><category scheme='http://www.blogger.com/atom/ns#' term='EC2'/><title type='text'>Amazon announced persistent storage for EC2</title><content type='html'>If &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; does not provide enough flexibility for you, then there is some good news from Amazon: one of the missing pieces, persistent storage for EC2, has just been &lt;a href="http://aws.typepad.com/aws/2008/04/block-to-the-fu.html"&gt;announced&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7612783270205077057?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7612783270205077057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7612783270205077057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7612783270205077057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7612783270205077057'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/amazon-announced-persistent-storage-for.html' title='Amazon announced persistent storage for EC2'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6883267684322407074</id><published>2008-04-13T14:39:00.000-07:00</published><updated>2008-04-15T09:04:40.296-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Exploring some lesser known Ajax GUI toolkits</title><content type='html'>I have only been exposed so far to &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; and &lt;a href="http://extjs.com/"&gt;ExtJS&lt;/a&gt;, and I believe both are bleeding edge technology, provide a great user experience and are widely accepted. But there are about 50  more  Ajax GUI toolkits out there.  And some of them occasionally appear on my Google Ads, so out of curiosity I took a quick look at some  randomly chosen ones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.smartclient.com/"&gt;SmartClient Ajax GUI System&lt;/a&gt;: Lots of widgets, but they are all table based and look desktop-like, that makes it a very Web 1.0 experience.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.icefaces.org/"&gt;Icefaces&lt;/a&gt;: An Ajax GUI toolkit for integration into J2EE systems. Also lots of widgtes, looks a bit less desktop-like, but here as well I see tables (e.g. their tab container) where I think pure DIVs and a bit more CSS provide a better user experience (smother loading). I am not a J2EE guy (anymore), so I did not look closer at this product.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nitobi.com/"&gt;Nitobi&lt;/a&gt;: Their website looks nice and well organized, so I head high expectations. But I switch randomly between browsers and at the time I tried the Nitobi demos, I was using Safari 3,1. Unfortunately I could not load the demo (then I tried on Firefox and there everything worked fine and looked good). But then came the ugly part: They provide a free trial version with a 30 day evaluation period and beyond that you are expected to buy a license, prices start at $ 429 US and go up to                                    $ 3699 for the enterprise version !!!&lt;/li&gt;&lt;li&gt;&lt;a href="ttp://www.telerik.com/products/aspnet/overview.aspx"&gt;Telerik RadControls for ASP.NET&lt;/a&gt;: Even more expensive: prices start at $ 799 US. And you have to register on their site just to download the trial version. At least I could load the online demo,  even on Safari.  And  it  looks good, very good, nearly as good as ExtJS.   &lt;/li&gt;&lt;/ul&gt;Lesson learned: there is a reason these Ajax GUI toolkits are lesser known !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6883267684322407074?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6883267684322407074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6883267684322407074' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6883267684322407074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6883267684322407074'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/exploring-some-lesser-known-ajax-gui.html' title='Exploring some lesser known Ajax GUI toolkits'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7592176490490881932</id><published>2008-04-13T10:41:00.000-07:00</published><updated>2008-04-24T20:05:03.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Scaling down - the least talked about feature of GAE</title><content type='html'>It launched less than a week ago and now all over the blogosphere people are discussing the &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; (GAE).  Most talk is  about scaling up, about potential lock-ins,  even if the SDK is based on open source software. Only one thing where developers seem generally to agree: with Python, Google has made a good choice (maybe those not knowing Python yet but desperately looking forward to learn it, don't know that Python dictates line indention, actually the only thing I had difficulty to get used to). That is interesting by itself, because developers usually are highly opinionated in regard to programming languages. Or is it just the early adapter mentality which is more flexible ? Anyway - in this article I want to talk about something I haven't found mentioned yet at 100 other places:&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;scaling down&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I see a growing number of businesses reducing or eliminating their IT department by using &lt;a href="http://www.google.com/a/"&gt;Google Apps&lt;/a&gt; (gmail &amp;amp; Co. on custom domain) for e-mail and other standard tasks covered by the Google Apps suite.  Custom built applications for streamlining their non-standard, probably also simple but business specific work-flow has been beyond the budget of small organizations. So they used the available standard tools, which are often more complex than necessary for those tasks. But now the creation and especially the maintenance of custom built web applications is getting cheaper with GAE, because problems like authentication, deployment, high availability and even data redundancy (as  probably-good-enough backup-strategy) are solved already and the cost for hosting gets completely eliminated (scaling down means just few concurrent users per application, little resource usage and the app will probably stay within the quotas for free usage of GAE). So the saved money from traditional in-house or outsourced IT administration, spent on development of custom applications will allow organization to  improve their efficiency. And  Google of course still will make good money with this scenario, because some companies will choose &lt;a href="http://www.google.com/a/help/intl/en/admins/editions.html"&gt;Google Apps Premier Edition&lt;/a&gt; over free/limited edition and will pay Google 50 $ per user account / per year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7592176490490881932?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7592176490490881932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7592176490490881932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7592176490490881932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7592176490490881932'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/scaling-down-least-talked-about-feature.html' title='Scaling down - the least talked about feature of GAE'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-802861057143460615</id><published>2008-04-10T18:10:00.000-07:00</published><updated>2008-04-24T20:05:21.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Google App Engine - Niall Kennedy's summary</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/accounts/ah/appengine.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://www.google.com/accounts/ah/appengine.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.niallkennedy.com/blog/2008/04/google-app-engine.html"&gt;Great summary&lt;/a&gt; about  the &lt;a href="http://code.google.com/appengine/"&gt;Google App engine&lt;/a&gt;, by  &lt;a href="http://www.niallkennedy.com/about/"&gt;Niall Kennedy&lt;/a&gt;. He even provides some insights about the people behind it, and according to his first hand knowledge, this is just the beginning of what Google is rolling out:&lt;br /&gt;&lt;blockquote&gt;I met with the App Engine's team leads on Monday morning for an in-depth overview of the product, its features, and its limitations. Google has been working on the Google App Engine since &lt;em&gt;at least&lt;/em&gt; March 2006 and has only just begun revealing some of its features.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-802861057143460615?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/802861057143460615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=802861057143460615' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/802861057143460615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/802861057143460615'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/google-app-engine-niall-kennedys.html' title='Google App Engine - Niall Kennedy&apos;s summary'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3295993534302246100</id><published>2008-04-09T08:58:00.000-07:00</published><updated>2008-04-09T09:22:31.587-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><title type='text'>Erlang R12B-2 released - with native PNG drawing</title><content type='html'>It's a bugfix release and I had no big expectations when scanning through the &lt;a href="http://erlang.org/download/otp_src_R12B-2.readme"&gt;release notes&lt;/a&gt;, but then I spotted this:&lt;blockquote&gt;&lt;pre&gt;--- percept-0.7 ------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;OTP-7162  Percept no longer depends on external c-libraries. The&lt;br /&gt;    graphical rendering is now done via erlang code.&lt;/pre&gt;&lt;/blockquote&gt;Thats huge, if you are interested in generating PNG images and don't wanna have dependencies on  c-libraries (as you would have using my &lt;a href="http://cairographics.org/"&gt;cairo&lt;/a&gt; wrapper &lt;a href="http://erlycairo.googlecode.com/"&gt;erlycairo&lt;/a&gt;). &lt;a href="http://www.erlang.org/doc/apps/percept/part_frame.html"&gt;Egd&lt;/a&gt; won't win any speed competition and has a limited feature set, but runs out of the box on any Erlang supported platform !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3295993534302246100?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3295993534302246100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3295993534302246100' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3295993534302246100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3295993534302246100'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/erlang-r12b-2-released-with-native-png.html' title='Erlang R12B-2 released - with native PNG drawing'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-120455243037897034</id><published>2008-04-08T19:53:00.000-07:00</published><updated>2008-04-09T09:24:27.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><title type='text'>Google App Engine - Quotes and thougts</title><content type='html'>From the many blog posts about the&lt;a href="http://code.google.com/appengine/"&gt; Google App Engine&lt;/a&gt;, my favorite quote comes from &lt;a href="http://www.scripting.com/stories/2008/04/08/earlyNotesOnGoogleapps.html"&gt;Dave Winer&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Now, what Google announced is &lt;i&gt;really exciting!&lt;/i&gt; I'm not kidding. It's even better than I hoped. Yes, it's only Python, but IBM's PC-DOS was only BASIC and Pascal when it first came out, and it didn't matter. Yeah, I preferred C, but I coded in Pascal because that's what you had to do to get an app running. What you're going to see here that you've never seen before is &lt;i&gt;shrinkwrap net apps that scale that can be deployed by civillians.&lt;/i&gt; That's a mouthful, but that's what's coming. Why? Because here is a standardized platform that can be stamped out in the billions of units. Maybe Google can't do it, but the perception is that they can. Who is willing to stand up and say Google hasn't nailed scaling? What PCs did in the 80s, Google is doing now. PCs took the black magic out of owning a computer. Now Google is taking the black magic out of operating a scalable web app. Python is the new BASIC.&lt;/blockquote&gt;There were also lots of negative thoughts, e.g. &lt;a href="http://startupalpha.com/chatter/2008/04/08/how-google-app-engine-kills-startups-tricks-consumers/"&gt;Donna Bogatin&lt;/a&gt;:&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;Google’s latest attempt at Internet shock and awe replays the by now traditional Google routine of “giving away” Web services under the guise of disinterested benevolence while the Web cheers the supposed Googley revolutionary Internet disruption and forecasts doom for existing players, such as Amazon, for this example.&lt;br /&gt;In typical Google fashion, though, “free” comes at a very high price. In fact, the Google App Engine product unveiled by the high-flying corporation is in contention for the scariest Google move to date.&lt;br /&gt;Not only do startups using Google App Engine unwittingly put control of their businesses in the sole discretionary hands of Eric Schmidt and company, unwitting consumer users of Google App Engine hosted services automatically “share” all of their personal, proprietary data with Google, whether they really want to or not.&lt;/blockquote&gt;Generally people are comparing the App Engine with &lt;a href="http://aws.amazon.com/"&gt;Amazon's AWS offerings&lt;/a&gt; and either seem to be interested in the one or the other. I think these two services can be combined for easy creating scalable web applications which go beyond what you can do with a limited amount of time and money, compared to the scenario where you would use just one of the services. Let me elaborate: For the simple, stateless stuff, for static and dynamic HTML pages and for persisting data, Google App Engine is perfect. For advanced stuff like Comet HTTP push, video streaming or batch processing, Amazon EC2 instances could be used on demand just for that.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-120455243037897034?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/120455243037897034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=120455243037897034' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/120455243037897034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/120455243037897034'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/google-app-engine-quotes-and-thougts.html' title='Google App Engine - Quotes and thougts'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3580028463936123875</id><published>2008-04-08T07:03:00.000-07:00</published><updated>2008-05-26T10:29:18.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='utility computing'/><title type='text'>Trying out Google App Engine</title><content type='html'>Yesterday night Google launched &lt;a href="http://code.google.com/appengine/"&gt;App Engine&lt;/a&gt;, a highly scalable web application platform, which  has the potential to become a game changer.  I was lucky to grab a developer account, which is currently tied to several limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;only 10000 developer accounts available&lt;/li&gt;&lt;li&gt;applications have to be coded in Python&lt;/li&gt;&lt;li&gt;only three applications per developer&lt;/li&gt;&lt;li&gt;bandwidth, storage and CPU usage limitations&lt;/li&gt;&lt;li&gt;no road map, no info about future pricing model&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;On the other hand, it's &lt;span style="font-weight: bold;"&gt;free for now, &lt;/span&gt; you can use the &lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; open source web framework and template language, you can locally develop and test your app with the cross platform Google App Engine SDK (download size only 2.3 MB - on Mac OS X), you get a powerful administration interface at your Google account and most important, it is &lt;span style="font-weight: bold;"&gt;extremely easy to get started with&lt;/span&gt;, in no time you have a schema-less, database driven helloworld web application deployed on Google's server farm.&lt;br /&gt;&lt;br /&gt;&lt;div class="textads"&gt;The internet users may start their own &lt;a href="http://www.envisionwebhosting.com/business.php"&gt;home business&lt;/a&gt; by having business deals with the global entrepreneurs. The different brands of &lt;a href="http://www.envisionwebhosting.com/computers.php"&gt;computers&lt;/a&gt; have been manufacturing the latest and stylish models of different sizes and shapes for the computing clients. The main features of hosting plans of &lt;a href="http://www.envisionwebhosting.com/reviews/godaddy-hosting.htm"&gt;godaddy&lt;/a&gt; are reputable among the potential customers. You may get hosting services of high quality in affordable rates by joining &lt;a href="http://www.envisionwebhosting.com/reviews/powweb-hosting.htm"&gt;powweb&lt;/a&gt;, reliable web host.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3580028463936123875?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3580028463936123875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3580028463936123875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3580028463936123875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3580028463936123875'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/trying-out-googles-app-engine.html' title='Trying out Google App Engine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6162580906038987827</id><published>2008-04-06T07:05:00.000-07:00</published><updated>2008-05-26T10:34:16.048-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Skype and PostgreSQL database</title><content type='html'>&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt; is my favorite open source relational database. Some time ago I wrote some experimental code (currently unmaintained) for integrating it with &lt;a href="http://erlyweb.org/"&gt;erlyweb&lt;/a&gt;. The guys at &lt;a href="http://skype.com/"&gt;Skype&lt;/a&gt; seem to like PostgreSQL as well. In regard to the current &lt;a href="http://www.techcrunch.com/2008/04/01/googleskype-acquisition-or-partnership-imminent/"&gt;Google Skype takeover rumors&lt;/a&gt; (or was it just a 1st of April joke which went out of control ?) and to this article: &lt;a href="http://highscalability.com/skype-plans-postgresql-scale-1-billion-users"&gt;Skype Plans for PostgreSQL to Scale to 1 Billion Users&lt;/a&gt;, I took a look at the Skype open source projects and found a &lt;a href="https://developer.skype.com/SkypeGarage/DbProjects"&gt;few interesting ones related to PostgreSQL&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://developer.skype.com/SkypeGarage/DbProjects/PlProxy"&gt;PL/Proxy&lt;/a&gt;: Horizontal data partitioning, based on a hashed database field (for distributing large amount of data among several physical servers).&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.skype.com/SkypeGarage/DbProjects/SkyTools"&gt;SkyTools&lt;/a&gt;: DB cluster management software for replication, message queues, fail over and Python integration.&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer"&gt;PgBouncer&lt;/a&gt;: connection pooling.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="textads"&gt;The most advanced features of &lt;a href="http://www.iseeq.com/c/backups.htm"&gt;backup software&lt;/a&gt; are very assistive for exclusive disaster recovery of data. The &lt;a href="http://www.iseeq.com/c/web-design.htm"&gt;web site design&lt;/a&gt; services are also the main part of some hosting plans of the service providers. The benefits of &lt;a href="http://www.iseeq.com/c/marketing.htm"&gt;affiliate marketing&lt;/a&gt; have been attracting a number of investors and entrepreneurs of this global business community rapidly. The &lt;a href="http://www.iseeq.com/c/webmaster.htm"&gt;webmaster&lt;/a&gt; is responsible for administering all web applications expertly.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6162580906038987827?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6162580906038987827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6162580906038987827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6162580906038987827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6162580906038987827'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/skype-and-postgresql-database.html' title='Skype and PostgreSQL database'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5098631962164116904</id><published>2008-04-02T20:55:00.000-07:00</published><updated>2008-04-02T21:47:12.954-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Easy git on Emacs with emacs-git</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6nF5cKrqCDc/R_RhGZVTsiI/AAAAAAAAAvY/KGIsg3U6S68/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_6nF5cKrqCDc/R_RhGZVTsiI/AAAAAAAAAvY/KGIsg3U6S68/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5184875833517650466" border="0" /&gt;&lt;/a&gt;I have been using &lt;a href="http://tsgates.cafe24.com/git/git-emacs.html"&gt;emacs-git&lt;/a&gt; for the last few days and and it proved incredible useful. It let's you do interactively most of the basic git operations such as creating, cloning or importing a repository, it inidcates graphically the git status of the current file with a colored LED-like icon at the Emacs bottom status line and it also facilitates adding / removing files to the repo, ignoring files, tagging, merging and conflict resolution.&lt;br /&gt;Emacs-git works only on Emacs (and not on X Emacs) and requires a very recent version of Emacs (I am using it on a nightly build of &lt;a href="http://aquamacs.org/"&gt;aquamacs&lt;/a&gt;, which is based on Emacs from CVS).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5098631962164116904?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5098631962164116904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5098631962164116904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5098631962164116904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5098631962164116904'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/04/easy-git-on-emacs-with-emacs-git.html' title='Easy git on Emacs with emacs-git'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6nF5cKrqCDc/R_RhGZVTsiI/AAAAAAAAAvY/KGIsg3U6S68/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1920156128192659992</id><published>2008-03-31T05:57:00.000-07:00</published><updated>2008-03-31T20:11:00.037-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs on Ajax with Steve Yegge's new js2-mode</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/R_DkRpVTshI/AAAAAAAAAvQ/RpgCKD-Z6C0/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/R_DkRpVTshI/AAAAAAAAAvQ/RpgCKD-Z6C0/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5183894162907574802" border="0" /&gt;&lt;/a&gt;&lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge&lt;/a&gt; just released a new &lt;a href="http://code.google.com/p/js2-mode"&gt;Javascript Emacs mode&lt;/a&gt;. I installed it and played around a bit and syntax highlighting and indention seemed to work perfectly. The feature list is impressive (copy-pasted from project page):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it offers the usual features from other Emacs modes &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it supports the JavaScript language up through version 1.7 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it has a real recursive-descent parser &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it highlights syntax errors and underlines warnings &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it supports collapsing function-body and block-comment definitions &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it has some preliminary support for IMenu (to be improved soon) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it knows about jsdoc and highlights tags in jsdoc comments &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a id="Introduction"&gt;it has a set of typing helpers to make editing easier &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The best news comes now: according to his blog, this is just the beginning:&lt;br /&gt;&lt;blockquote&gt;This is part of a larger project, in progress, &lt;span style="font-weight: bold;"&gt;to permit writing Emacs extensions in JavaScript instead of Emacs-Lisp&lt;/span&gt;. Lest ye judge: hey, some people swing that way. The larger project is well underway, but probably won't be out until late summer or early fall.&lt;br /&gt;&lt;br /&gt;My new editing mode is called js2-mode, because eventually I plan to support JavaScript 2, also known as ECMAScript Edition 4. Currently, however, it only supports up through JavaScript 1.7, so the name is something of a misnomer for now.&lt;/blockquote&gt;Plenty of reason to switch back to Emacs for those like me who thought that &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; was the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1920156128192659992?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1920156128192659992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1920156128192659992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1920156128192659992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1920156128192659992'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/emacs-on-ajax-with-steve-yegges-new-js2.html' title='Emacs on Ajax with Steve Yegge&apos;s new js2-mode'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/R_DkRpVTshI/AAAAAAAAAvQ/RpgCKD-Z6C0/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7524596418614640598</id><published>2008-03-31T00:56:00.000-07:00</published><updated>2008-03-31T03:12:57.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>The Power of Javascript - by Glenn Vanderburg</title><content type='html'>Wanna listen to an in-depth introduction to Javascript, not just the technical but also the historical  side ? Then &lt;a href="http://www.infoq.com/presentations/vanderburg-power-of-javascript"&gt;this talk by Glenn Vanderburg&lt;/a&gt; recorded at JAOO 2007 is the right choice (&lt;a href="http://flv.thruhere.net/presentations/ThePowerOfJavascript.flv"&gt;direct link&lt;/a&gt; to the media -  flash .flv video).&lt;br /&gt;&lt;br /&gt;The talk mentions Douglas Crockford's famous article: &lt;a href="http://javascript.crockford.com/javascript.html"&gt;The World's Most Misunderstood Programming Language&lt;/a&gt; from 2001.  Just for  completeness, here is  Crockford's recent follow-up article: &lt;a href="http://javascript.crockford.com/popular.html"&gt;The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7524596418614640598?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7524596418614640598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7524596418614640598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7524596418614640598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7524596418614640598'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/power-of-javascript-by-glenn-vanderburg.html' title='The Power of Javascript - by Glenn Vanderburg'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3176690417467792316</id><published>2008-03-29T06:26:00.000-07:00</published><updated>2008-03-29T06:49:50.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>What sucks most about the Mac</title><content type='html'>.. are those nearly weekly software updates which require a reboot. I didn't buy a Mac because I was influenced by those all-day-long digging mac fanboys, I bought it because I wanted to run some graphics and video editing software which is not available for Ubuntu Linux (my previous desktop system, from windows I stay away as far as possible) and for paying about twice the price compared to a similar Dell or noname hardware configuration capable of running Linux, I really expected a better user experience in  every possible aspect, as promised in their glorified advertisement. But the requirement to reboot the machine for those nearly weekly minor updates really puts the Mac back into the stone age of computing !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3176690417467792316?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3176690417467792316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3176690417467792316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3176690417467792316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3176690417467792316'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/what-sucks-most-about-mac.html' title='What sucks most about the Mac'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7140710588281169625</id><published>2008-03-28T08:48:00.000-07:00</published><updated>2008-03-28T09:16:33.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Doloto - Javascript Rewriting paper by Microsoft</title><content type='html'>I just read the &lt;a href="ftp://ftp.research.microsoft.com/pub/tr/TR-2007-159.pdf"&gt;reseach paper&lt;/a&gt; (pdf) about Doloto a Microsoft project for speeding up Web 2.0 applications by serverside Javascript static code analysis, AST transformations and code splitting. They claim that with this technique the loading time of monolithic (all Javascript loaded at once) Ajax applications can be significantly reduced. In my opinion, a better approach is to build right away non-monolithic apps (Javascript libraries like &lt;a href="http://dojotoolkit.org/"&gt;dojo&lt;/a&gt; provide support for that).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7140710588281169625?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7140710588281169625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7140710588281169625' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7140710588281169625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7140710588281169625'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/doloto-javascript-rewriting-paper-by.html' title='Doloto - Javascript Rewriting paper by Microsoft'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6287763795204135283</id><published>2008-03-26T21:10:00.000-07:00</published><updated>2008-03-27T01:31:22.512-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webserver'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Crary - A new Erlang lightweight web server</title><content type='html'>Beside of featherlight &lt;a href="http://www.trapexit.org/A_fast_web_server_demonstrating_some_undocumented_Erlang_features"&gt;iserve&lt;/a&gt; and battle proved &lt;a href="http://mochiweb.com/"&gt;mochiweb&lt;/a&gt;  (at &lt;a href="http://mochimedia.com/"&gt;MochiMedia&lt;/a&gt;), there is now an additional choice for lightweight Erlang HTTP servers: &lt;a href="http://erlware.org/lib/5.5.5/crary-0.1.1/"&gt;Crary&lt;/a&gt;, which shares similar design goals but provides a different interface. According to its author &lt;a href="http://srparish.net/"&gt;Scott Parish&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Crary, a HTTP server for the REST of us.&lt;br /&gt;&lt;br /&gt;The intention is that its small enough and flexible enough to be used for most any HTTP server need. While it isn't a stand-alone system, nor does it have its own web-framework, these things can easily be built on top of crary. Crary should be easily embedded into the release of a larger application to provide a web interface or to create a web service interface.&lt;/blockquote&gt;Below a tiny little snippet illustrating how to write a hello world program with crary:&lt;br /&gt;&lt;pre&gt;&lt;span class="function-name"&gt;start&lt;/span&gt;() -&amp;gt;&lt;br /&gt;crary:start(8080, {?&lt;span class="constant"&gt;MODULE&lt;/span&gt;, handler, []}).&lt;br /&gt;&lt;br /&gt;&lt;span class="function-name"&gt;handler&lt;/span&gt;(#&lt;span class="type"&gt;crary_req&lt;/span&gt;{method = &lt;span class="string"&gt;"GET"&lt;/span&gt;, uri = #&lt;span class="type"&gt;uri&lt;/span&gt;{path = &lt;span class="string"&gt;"/favicon.ico"&lt;/span&gt;}} = &lt;span class="variable-name"&gt;Req&lt;/span&gt;) -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;br /&gt;crary_dir_listing:write_file(&lt;span class="variable-name"&gt;Req&lt;/span&gt;, filename:join([my_doc_root(), &lt;span class="string"&gt;"favicon.ico"&lt;/span&gt;]));                                                                 &lt;br /&gt;&lt;span class="function-name"&gt;handler&lt;/span&gt;(#&lt;span class="type"&gt;crary_req&lt;/span&gt;{method = &lt;span class="string"&gt;"GET"&lt;/span&gt;, uri = #&lt;span class="type"&gt;uri&lt;/span&gt;{path = &lt;span class="string"&gt;"/test"&lt;/span&gt;}} = &lt;span class="variable-name"&gt;Req&lt;/span&gt;) -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;br /&gt;crary:r(&lt;span class="variable-name"&gt;Req&lt;/span&gt;, ok, [{&lt;span class="string"&gt;"content-type"&lt;/span&gt;, &lt;span class="string"&gt;"text/html"&lt;/span&gt;}], &amp;lt;&amp;lt;&lt;span class="string"&gt;"hello world"&lt;/span&gt;&amp;gt;);&lt;br /&gt;&lt;span class="function-name"&gt;handler&lt;/span&gt;(#&lt;span class="type"&gt;crary_req&lt;/span&gt;{method = &lt;span class="string"&gt;"GET"&lt;/span&gt;} = &lt;span class="variable-name"&gt;Req&lt;/span&gt;) -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;br /&gt;crary:not_found(&lt;span class="variable-name"&gt;Req&lt;/span&gt;);&lt;br /&gt;&lt;span class="function-name"&gt;handler&lt;/span&gt;(&lt;span class="variable-name"&gt;Req&lt;/span&gt;) -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;br /&gt;crary:not_implemented(&lt;span class="variable-name"&gt;Req&lt;/span&gt;).&lt;/pre&gt;To get your copy of crary just clone it from its &lt;a href="http://git.erlware.org/crary.git/"&gt;git repository&lt;/a&gt;, or install it via &lt;a href="http://erlware.org/"&gt;erlware&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6287763795204135283?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6287763795204135283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6287763795204135283' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6287763795204135283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6287763795204135283'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/crary-new-erlang-lightwight-web-server.html' title='Crary - A new Erlang lightweight web server'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3806558601814282697</id><published>2008-03-25T11:08:00.000-07:00</published><updated>2008-03-28T08:37:08.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>New YouTube player - Nice, but still not ready for HD screencasts</title><content type='html'>&lt;a href="http://deconcept.com/"&gt;Geoff Stern&lt;/a&gt;, the Google guy who recently rewrote the YouTube player, just posted an &lt;a style="font-weight: bold;" href="http://blog.deconcept.com/ytmapmashup/"&gt;interesting demo&lt;/a&gt;, mashing up the video player with the Google maps API, demonstrating the new player's &lt;a href="http://code.google.com/apis/youtube/js_api_reference.html"&gt;Javascript integration&lt;/a&gt; capabilities.&lt;br /&gt;&lt;br /&gt;Other examples out there:&lt;a href="http://blogoscoped.com/youtube-api/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogoscoped.com/youtube-api/"&gt;Chromeless player with Javascript user interface&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.yvoschaap.com/youtube/"&gt;Chromeless drag &amp;amp;  drop player&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;This brings new possibilities for  screencasts (or video presentations / podcasts), for syncing the audio/video with text caption or any HTML content along the audio/video timeline. Now I am just waiting for YouTube &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; destroying anymore the HD quality of uploaded quicktime videos when they convert it to flash (requiring cumbersome hacks like &lt;a href="http://www.rsaccon.com/2007/12/how-to-put-hd-video-on-web-with-latest.html"&gt;this&lt;/a&gt; for online HD flash video), so that YouTube can eventually be used for high quality screencasts and video enabled online presentations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: more chromeless players:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.intoajax.com/ext/youtube/index.html"&gt;ExtJS-styled&lt;/a&gt;&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/3729811-3806558601814282697?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3806558601814282697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3806558601814282697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3806558601814282697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3806558601814282697'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/new-youtube-player-nice-but-still-not.html' title='New YouTube player - Nice, but still not ready for HD screencasts'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6779533598008222911</id><published>2008-03-23T00:51:00.000-07:00</published><updated>2008-03-23T04:34:57.612-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang processes benchmarked against threads of other languages</title><content type='html'>We all know that the result of benchmarks are only significant for that specific piece of code which is getting tested, and usually the benchmark authors favorite products are tuned to outperform its competitors. Nevertheless, below a summary of a &lt;a href="http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=threadring&amp;amp;lang=all"&gt;benchmark&lt;/a&gt; recently &lt;a href="http://reddit.com/r/programming/info/6d28l/comments/"&gt;discussed on reddit&lt;/a&gt;. The benchmark itself is just a few lines of source code (at least in Erlang), spawning a bunch of processes and doing some simple message passing between those processes. Thread implementations in other languages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;C&lt;/span&gt; (pthread - GNU gcc): 8.5 times slower&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Python:&lt;/span&gt; 15 x slower, 1.4 x more memory  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt;: 20 x slower, 5.8 x more memory&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ruby&lt;/span&gt;: 282 x slower, 3.4 x more memory&lt;/li&gt;&lt;/ul&gt;More numbers, details and the benchmark source code in all the different languages at the &lt;a href="http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=threadring&amp;amp;lang=all"&gt;language shootout site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6779533598008222911?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6779533598008222911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6779533598008222911' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6779533598008222911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6779533598008222911'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/erlang-processes-benchmarked-against.html' title='Erlang processes benchmarked against threads of other languages'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2941374281641879523</id><published>2008-03-17T00:11:00.000-07:00</published><updated>2008-03-17T03:02:08.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><title type='text'>The gBrowser is coming - disguised as Google Gears</title><content type='html'>At least this is the impression I get when I take a look at the &lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt; developer documentation , especially the wiki pages with label &lt;a href="http://code.google.com/p/google-gears/w/list?q=label:DesignDoc"&gt;DesignDoc&lt;/a&gt; and the discussions in the &lt;a href="http://groups.google.com/group/google-gears-eng"&gt;contributor mailing list&lt;/a&gt;.  Here  a few examples to  illustrate what I am talking about and what will hopefully soon come to &lt;span style="font-weight: bold;"&gt;any&lt;/span&gt; browser near you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-gears/wiki/AudioAPI"&gt;AudioAPI&lt;/a&gt;: Playback, Recording, Mixing and Editing of WAV, OGG and MP3 audio.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/google-gears/wiki/LocationAPI"&gt;LocationAPI&lt;/a&gt;: Provides geolocation.&lt;/li&gt;&lt;li&gt;ImageManipulationAPI: mentioned in the &lt;a href="http://code.google.com/p/google-gears/wiki/BlobAPI"&gt;BlobApi&lt;/a&gt; description.&lt;/li&gt;&lt;li&gt;OpenGL vector drawing: discussed in &lt;a href="http://groups.google.com/group/google-gears-eng/browse_thread/thread/3ced0030734cd376/165a77277a3435e9?lnk=gst&amp;amp;q=eugene#165a77277a3435e9"&gt;this thread&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;Upgrading existing browsers with Javascript APIs providing HTML5-compliant functionality is much better for a healthy, accessible, easy indexable and open standards oriented near future of the web, than relying on proprietary plugins such as the flashplayer for specific functions which can' t be provided by HTML/CSS/Javascript of todays browsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2941374281641879523?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2941374281641879523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2941374281641879523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2941374281641879523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2941374281641879523'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/gbrowser-is-coming-disguised-as-google.html' title='The gBrowser is coming - disguised as Google Gears'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2098485499160151290</id><published>2008-03-12T09:00:00.000-07:00</published><updated>2008-03-12T11:08:37.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Podcast: Joe Armstrong on Erlang</title><content type='html'>I am currently listening to this &lt;a href="http://www.se-radio.net/podcast/2008-03/episode-89-joe-armstrong-erlang"&gt;Podcast&lt;/a&gt; by Joe Armstrong,  creator of Erlang. It's a great overview and has lots of historic and other background information.&lt;br /&gt;In case you are new to Erlang, and need something more entertaining and haven't seen yet the classic, "Monty Python" &lt;a href="http://video.google.com/videoplay?docid=-5830318882717959520"&gt;Erlang video&lt;/a&gt;, you must see it !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2098485499160151290?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2098485499160151290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2098485499160151290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2098485499160151290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2098485499160151290'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/podcast-joe-armstrong-on-erlang.html' title='Podcast: Joe Armstrong on Erlang'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8707260332941774858</id><published>2008-03-08T12:29:00.000-08:00</published><updated>2008-03-27T06:30:32.795-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='erlydtl'/><title type='text'>ErlyDTL now has date and time formating</title><content type='html'>&lt;a href="http://erlydtl.googlecode.com/"&gt;ErlyDTL&lt;/a&gt;, the Erlang version of the &lt;a href="http://www.djangoproject.com/documentation/templates/"&gt;Django Template Language&lt;/a&gt; is progressing nicely. Most of the common tags and filters are implemented. Recently Colm Dougan joined the development team and added date and time formating.&lt;br /&gt;&lt;br /&gt;Let's take a look at some examples with fictive dates:&lt;br /&gt;&lt;br /&gt;Template: &lt;span style="font-family:courier new;"&gt;{% var1|date "r" %}&lt;/span&gt;&lt;br /&gt;Rendered Output: Thu, 21 Dec 2000 16:01:07 +0200&lt;br /&gt;&lt;br /&gt;Template: &lt;span style="font-family:courier new;"&gt;{% var2|date "jS F Y H:i" %}&lt;/span&gt;&lt;br /&gt;Rendered Output: 27th February 2008 01:24&lt;br /&gt;&lt;br /&gt;Template: It is the &lt;span style="font-family:courier new;"&gt;{% var3|date "jS o\f F Y" %}&lt;/span&gt;&lt;br /&gt;Rendered Output: It is the 4th of September 2007&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8707260332941774858?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8707260332941774858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8707260332941774858' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8707260332941774858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8707260332941774858'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/erlydtl-now-has-date-and-time-formating.html' title='ErlyDTL now has date and time formating'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-73788209563794050</id><published>2008-03-07T16:09:00.000-08:00</published><updated>2008-03-09T21:59:24.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='erlyjs'/><title type='text'>Diving into Core Erlang</title><content type='html'>Inspired by Robert Virding's &lt;a href="http://groups.google.com/group/erlang-questions/browse_thread/thread/adfe375287d4bef4/4a9127e701f5e2db#4a9127e701f5e2db"&gt;LFE&lt;/a&gt; - Lisp flavored Erlang, I recently started to evaluate &lt;a href="http://www.it.uu.se/research/group/hipe/cerl"&gt;Core Erlang&lt;/a&gt; as base for &lt;a href="http://code.google.com/p/erlyjs/"&gt;ErlyJS&lt;/a&gt;, the Erlang Javascript compiler I am working on. The current approach is based on Erlang Abstract Syntax trees. Erlang Core is more low level and looks more like a LISP dialect than Erlang. Following a short summary about Core Erlang's design goals (copy pasted from the &lt;a href="http://www.it.uu.se/research/group/hipe/cerl/doc/core_erlang-1.0.3.pdf"&gt;spec&lt;/a&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Core Erlang should be as regular as possible, to facilitate the development of code-walking tools.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Core Erlang should have a clear and simple semantics. &lt;/li&gt;&lt;li&gt;Core Erlang should be straight-forward to translate to every intermediate code used in any Erlang implementation; similarly, it should be straightforward to translate from Erlang programs to equivalent Core Erlang programs. &lt;/li&gt;&lt;li&gt;There should exist a well deﬁned textual representation of Core Erlang, with a simple and preferably unambiguous grammar, making it easy to construct tools for printing and reading programs. This representation should be possible to use for communication between tools using diﬀerent internal representations of Core Erlang.&lt;/li&gt;&lt;li&gt;The textual representation should be easy for humans to read and edit, in case the developer wants to check what the Erlang source looks like in Core Erlang form, inspect – or modify – the results of code transformations, or maybe write some Core Erlang code by hand.&lt;/li&gt;&lt;/ul&gt;You wanna see how Core Erlang looks like ? Take any Erlang source code and compile it as binary and with the &lt;span style="font-family: courier new;"&gt;to_core&lt;/span&gt; compiling option and with &lt;span style="font-family: courier new;"&gt;core_pp:format/1&lt;/span&gt; you can pretty-print the output. Core Erlang is an intermediate step between Erlang AST representation and VM internal representation. So far I see the following advantages by using Core Erlang for ErlyJS:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It is less tied to Erlang the language and therefore just a more natural choice.&lt;/li&gt;&lt;li&gt;There exist `let` expressions which seem to provide a cleaner way to handle Javascript variable reassignments (you can't directly reassign variables in Erlang).&lt;/li&gt;&lt;li&gt;And last and least, &lt;a href="http://www.ecmascript.org/download.php"&gt;Ecmascript 4 Reference implementation&lt;/a&gt; is written in &lt;a href="http://en.wikipedia.org/wiki/Standard_ML"&gt;Standard ML&lt;/a&gt;, which is more similar to Core Erlang than to normal Erlang. Maybe this point will have relevance one day in the future.&lt;/li&gt;&lt;/ul&gt;Unless I will discover a show stopper, there will be soon a complete rewrite of ErlyJS  to Erlang Core (but I am using git now and only pushing to googlecode SVN major changes in bulk).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-73788209563794050?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/73788209563794050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=73788209563794050' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/73788209563794050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/73788209563794050'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/diving-into-core-erlang.html' title='Diving into Core Erlang'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5453795215387431519</id><published>2008-03-06T18:28:00.000-08:00</published><updated>2008-05-26T10:34:00.119-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang and Fuse</title><content type='html'>The &lt;a href="http://dukesoferl.blogspot.com/"&gt;Dukes of Erl&lt;/a&gt; guys have created an Erlang implementation of &lt;a href="http://fuse.sourceforge.net/"&gt;FUSE&lt;/a&gt; called &lt;a href="http://code.google.com/p/fuserl/"&gt;fuserl&lt;/a&gt;. From reading their blog, it seems they need it for interacting with &lt;a href="http://oss.oetiker.ch/rrdtool/"&gt;RRDtool&lt;/a&gt;, a open source software for realtime data logging and the ultimate goal for fuserl is a distributed filesystem based on mnesia: &lt;a href="http://code.google.com/p/walkenfs"&gt;walkenfs&lt;/a&gt; (the idea is not new, &lt;a href="http://www.blogger.com/ulf.wiger.net/weblog"&gt;Ulf Wiger&lt;/a&gt; has something similar as part of &lt;a href="http://erlhive.sourceforge.net/"&gt;erlhive&lt;/a&gt;).  Now I just read about another possible use case for fuserl: &lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;&lt;a href="http://21ccw.blogspot.com/"&gt;Benjamin Nortier&lt;/a&gt; is blogging about &lt;a href="http://21ccw.blogspot.com/2008/03/apache-erlang-for-dynamic-web-content.html"&gt;Apache + Erlang for dynamic web content&lt;/a&gt;: Using Apache (I would use Lighty or nginx instead) to serve static files (static at least from the point of view of the webserver), but they are dynamically created by a distributed Erlang system and fuserl. Benjamin did recently some &lt;a href="http://21ccw.blogspot.com/search/label/Mnesia"&gt;extensive benchmarking&lt;/a&gt; comparing LAMP with LYME (&lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;inux + &lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt;AWS + &lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;nesia + &lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;rlang) and now I hope he will do performance measurements on fuserl based systems as well !&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="post-author vcard"&gt;&lt;span class="fn"&gt;I am trying to get a clue whether fuserl would bring any benefit in combining it with &lt;a href="http://http//git.or.cz/"&gt;git&lt;/a&gt;. The scenario would be distributed Erlang nodes running a collaborative editing app, everything in Erlang except of git (but git plays a central role for document storage) and lots of git repos.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="textads"&gt;The advanced strategies of &lt;a href="http://www.1-hit.com"&gt;internet marketing&lt;/a&gt; are employed by the different internet marketers to promote E-businesses. The &lt;a href="http://www.1-hit.com/website-design.htm"&gt;web site design&lt;/a&gt; and web development programs are organized by the different IT companies. The &lt;a href="http://www.1-hit.com/all-in-one/php/mrwhois.php"&gt;cheapest domain name&lt;/a&gt; registration services are very useful for the medium kind of entrepreneurs who can’t afford expensive rates. The &lt;a href="http://www.1-hit.com/web-hosting.htm"&gt;cheap hosting&lt;/a&gt; services of various web hosts are available to facilitate the individuals who run small businesses.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5453795215387431519?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5453795215387431519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5453795215387431519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5453795215387431519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5453795215387431519'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/erlang-and-fuse.html' title='Erlang and Fuse'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4874244256221991852</id><published>2008-03-01T20:50:00.000-08:00</published><updated>2008-03-01T20:57:00.912-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>When to use Ruby and when not</title><content type='html'>Just read this &lt;a href="http://www.cio.com/article/191000/You_Used_Ruby_to_Write_WHAT_/1"&gt;interesting article&lt;/a&gt; by &lt;a href="http://zedshaw.com"&gt;Zed Shaw&lt;/a&gt; about Ruby, Ruby in the enterprise, Ruby on virtual machines and more ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-4874244256221991852?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4874244256221991852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4874244256221991852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4874244256221991852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4874244256221991852'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/03/when-to-use-ruby-and-when-not.html' title='When to use Ruby and when not'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8118100768259139805</id><published>2008-02-23T11:33:00.000-08:00</published><updated>2008-02-24T06:03:56.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='erlyjs'/><title type='text'>ErlyJS - translating Javascript to Erlang</title><content type='html'>I have lately invested many hours of coding in &lt;a href="http://erlyjs.googlecode.com/"&gt;ErlyJS&lt;/a&gt;, my open source attempt of writing a Javascript compiler for the Erlang virtual machine and crossed today the barrier of 100, for the number of commits and also for the number of test cases. There is still a long way to go, because nobody (including myself) will actually use the compiler in a real project, unless it is 100% Javascript compliant. But at least, most of the basic stuff is now halfway implemented:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Literals&lt;/li&gt;&lt;li&gt;Global / local variable handling&lt;/li&gt;&lt;li&gt;Operators (except of dot operator, for objects)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Functions&lt;/li&gt;&lt;li&gt;Built-in global functions &lt;/li&gt;&lt;/ul&gt;The next big task will be object handling (and implementing the built-in objects and their functions)&lt;br /&gt;&lt;br /&gt;I am not targeting the Erlang VM directly (beside of the Erlang compiler source code, there doesen't exist any formal specification or at least documentation about the Erlang VM internals  in general and specifically the VM opcodes). What I do is transforming the Javascript source code AST to an Erlang AST. This involves a lot of trickery, because Erlang doesn't allow variable re-assignments (this is good and also necessary in the context of Erlang concurrency), but most Javascript code is just a bunch of variable re-assignments, so I have to model it somehow and I have choosen to model it differently for global Javascript variables (Erlang process dictionary) and local variables (normal Erlang variables).  One interesting thing about having an Erlang AST of Javascript source code is the possibility of pretty-printing Erlang source code. Let's take a look at a  Javascript example from the test cases:&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; &lt;span class="function-name"&gt;test&lt;/span&gt;() {&lt;br /&gt;&lt;span class="keyword"&gt;var&lt;/span&gt; &lt;span class="variable-name"&gt;a&lt;/span&gt;=0, b=&lt;span class="string"&gt;"Bananas"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;switch&lt;/span&gt; (b) {&lt;br /&gt;&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="string"&gt;"Oranges"&lt;/span&gt;:&lt;br /&gt;a = 1;&lt;br /&gt;&lt;span class="keyword"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="string"&gt;"Apples"&lt;/span&gt;:&lt;br /&gt;a = 2;&lt;br /&gt;&lt;span class="keyword"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="string"&gt;"Papayas"&lt;/span&gt;:&lt;br /&gt;&lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="string"&gt;"Bananas"&lt;/span&gt;:&lt;br /&gt;a = 2.5;&lt;br /&gt;a = 3;&lt;br /&gt;&lt;span class="keyword"&gt;break&lt;/span&gt;;&lt;br /&gt;default:&lt;br /&gt;a = 4;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;return&lt;/span&gt; a;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If I pretty print the AST (just before compiling it, and this is even done automatically at verbose ErlyJS compiling settings) I get the following Erlang source code:&lt;br /&gt;&lt;pre&gt;&lt;span class="function-name"&gt;js_test&lt;/span&gt;() -&amp;gt;&lt;br /&gt;&lt;span class="variable-name"&gt;V78&lt;/span&gt; = 0,&lt;br /&gt;&lt;span class="variable-name"&gt;V80&lt;/span&gt; = &lt;span class="string"&gt;"Bananas"&lt;/span&gt;,&lt;br /&gt;{&lt;span class="variable-name"&gt;V152&lt;/span&gt;} = &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="variable-name"&gt;V80&lt;/span&gt; &lt;span class="keyword"&gt;of&lt;/span&gt;&lt;br /&gt;         &lt;span class="string"&gt;"Oranges"&lt;/span&gt; -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;span class="variable-name"&gt;V170&lt;/span&gt; = 1, {&lt;span class="variable-name"&gt;V170&lt;/span&gt;};&lt;br /&gt;         &lt;span class="string"&gt;"Apples"&lt;/span&gt; -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;span class="variable-name"&gt;V88&lt;/span&gt; = 2, {&lt;span class="variable-name"&gt;V88&lt;/span&gt;};&lt;br /&gt;         &lt;span class="variable-name"&gt;X&lt;/span&gt; &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="variable-name"&gt;X&lt;/span&gt; == &lt;span class="string"&gt;"Papayas"&lt;/span&gt;; &lt;span class="variable-name"&gt;X&lt;/span&gt; == &lt;span class="string"&gt;"Bananas"&lt;/span&gt; -&amp;gt;&lt;br /&gt;             &lt;span class="variable-name"&gt;V270&lt;/span&gt; = 2.5, &lt;span class="variable-name"&gt;V288&lt;/span&gt; = 3, {&lt;span class="variable-name"&gt;V288&lt;/span&gt;};&lt;br /&gt;         &lt;span class="variable-name"&gt;_&lt;/span&gt; -&amp;gt;&lt;span class="function-name"&gt; &lt;/span&gt;&lt;span class="variable-name"&gt;V32&lt;/span&gt; = 4, {&lt;span class="variable-name"&gt;V32&lt;/span&gt;}&lt;br /&gt;       &lt;span class="keyword"&gt;end&lt;/span&gt;,&lt;br /&gt;&lt;span class="variable-name"&gt;V152&lt;/span&gt;.&lt;br /&gt;&lt;/pre&gt;This kind of source code translation is extremely useful while developing and debugging the ErlyJS compiler and analyzing test cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8118100768259139805?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8118100768259139805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8118100768259139805' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8118100768259139805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8118100768259139805'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/erlyjs-translating-javascript-to-erlang.html' title='ErlyJS - translating Javascript to Erlang'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2316735969080154050</id><published>2008-02-22T18:24:00.000-08:00</published><updated>2008-02-22T19:44:21.713-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Dojo theming tutorial and more at dojocampus</title><content type='html'>Ever wanted to know how to create flexible-size background images  for rounded corners or other CSS effects specifically for custom-theming &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; widgets ? Unless you have already intimate knowledge of the &lt;a href="http://www.alistapart.com/articles/slidingdoors/"&gt;Sliding Doors technique&lt;/a&gt; and &lt;a href="http://www.alistapart.com/articles/sprites"&gt;CSS sprites&lt;/a&gt;, you should checkout the "&lt;a href="http://dojocampus.org/content/?p=27"&gt;Rounded tabs&lt;/a&gt;" tutorial on the recently started &lt;a href="http://dojocampus.org/"&gt;DojoCampus&lt;/a&gt; site. There is also other great stuff there such as a &lt;a href="http://dojocampus.org/content/?p=36"&gt;video about the dojo grid&lt;/a&gt; and &lt;a href="http://dojocampus.org/content/?p=41"&gt;Firebug tips.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2316735969080154050?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2316735969080154050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2316735969080154050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2316735969080154050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2316735969080154050'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/dojo-theming-tutorial-and-more-at.html' title='Dojo theming tutorial and more at dojocampus'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7953920526628441053</id><published>2008-02-19T15:17:00.000-08:00</published><updated>2008-02-19T20:24:54.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>Discontinuing ErlyMate</title><content type='html'>My attempt of &lt;a href="http://erlymate.googlecode.com/"&gt;better integrating Erlang with TextMate&lt;/a&gt; has been an interesting trip into foreign territory (Objective C and Desktop applications), but I never considered it as a serious project, it was more a kind of overreaction  to my inability of mastering all Emacs key bindings even at sleep. And I also don't like to put lots of time into an open source project to erlangify a proprietary, Mac-only software from a &lt;a href="http://macromates.com/"&gt;one-man-company&lt;/a&gt;. Anyway, if this  are non-issues for anybody who wants to resurrect the project, I will be available to answer initial questions. Ok, this was probably my last post about ErlyMate here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7953920526628441053?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7953920526628441053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7953920526628441053' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7953920526628441053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7953920526628441053'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/discontinuing-erlymate.html' title='Discontinuing ErlyMate'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4773934787477826675</id><published>2008-02-19T15:11:00.000-08:00</published><updated>2008-02-19T15:17:36.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang – The CEO’s View - by Gordon Guthrie</title><content type='html'>An &lt;a href="http://oreillygmt.typepad.com/scenius/2008/02/erlang-the-ceos.html"&gt;interesting article&lt;/a&gt; about Erlang from the business point of view, by Gordon Guthrie the CEO/CTO of &lt;a href="http://hypernumbers.com/"&gt;hypernumbers.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-4773934787477826675?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4773934787477826675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4773934787477826675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4773934787477826675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4773934787477826675'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/erlang-ceos-view-by-gordon-guthrie.html' title='Erlang – The CEO’s View - by Gordon Guthrie'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7718164397856838268</id><published>2008-02-16T07:34:00.000-08:00</published><updated>2008-02-16T08:00:02.249-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Interfacing Erlang with C - explained by Joel Reymont</title><content type='html'>&lt;a href="http://www.wagerlabs.com/blog/2008/02/erlang-ffi---in.html"&gt;Great tutorial&lt;/a&gt; on how speeding up Erlang with linkedin C code. But hopefully you won't have to do it because it makes your software hard to maintain and the C part might crash your program. But if you have to interface with C, then first check whether a C-node (as for example done in &lt;a href="http://erlycairo.googlecode.com/"&gt;ErlyCairo&lt;/a&gt;) has enough performance, a C-node uses it's own memory  space and doesn't crash your Erlang program, in case things go wrong. But if your C code is very robust, and you really need the performance, Joel's tutorial is a great introduction to that topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7718164397856838268?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7718164397856838268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7718164397856838268' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7718164397856838268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7718164397856838268'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/interacting-erlang-with-c-explained-by.html' title='Interfacing Erlang with C - explained by Joel Reymont'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8426319536724481003</id><published>2008-02-14T03:28:00.000-08:00</published><updated>2008-03-08T13:12:41.970-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='erlydtl'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>Django Template Language - the dojo implementation</title><content type='html'>Beside of Erlang based &lt;a href="http://erlydtl.googlecode.com/"&gt;ErlyDTL&lt;/a&gt; (by Evan Miller and myself) there exists (at least) one other non-Python project which implements the &lt;a href="http://www.djangoproject.com/documentation/templates/"&gt;Django Template Language&lt;/a&gt;: the &lt;a href="http://dojotoolkit.org/"&gt;dojo&lt;/a&gt; Javascript version: dojox DTL (&lt;a href="http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl"&gt;documentation&lt;/a&gt;) for creating dynamically and template-based HTML layouts inside the Web browser (opposed to traditional approaches of creating HTML layouts at server-side). Today dojox DTL reached feature completeness, implementing all original Django tags and filters, at least that is what I guess from reading the SVN changes for the README:&lt;br /&gt;&lt;pre&gt;--- This aims to be a 1:1 match with the Django Template Language as outlined in&lt;br /&gt;+++ This is a 1:1 match with the Django Template Language as outlined in&lt;/pre&gt;While dojox DTL is a very interesting concept and brings new possibilities to separate client-side logic and presentation, I haven't seen yet a killer example. Maybe I just haven't looked far enough. But one thing is sure: if you use a template language at server side and at Javascript client side, and it  can be the same  template language, that's a huge benefit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8426319536724481003?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8426319536724481003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8426319536724481003' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8426319536724481003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8426319536724481003'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/django-template-language-dojo.html' title='Django Template Language - the dojo implementation'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2153217457902801282</id><published>2008-02-06T16:05:00.000-08:00</published><updated>2008-02-13T15:44:49.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang Style Concurrency - explained by Ulf Wiger</title><content type='html'>&lt;a href="http://ulf.wiger.net/weblog/?p=10"&gt;That&lt;/a&gt; is probably all you ever wanted to know about Erlang style concurrency, put  into a great summary by Ulf Wiger, who has been using Erlang since 1992.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2153217457902801282?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2153217457902801282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2153217457902801282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2153217457902801282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2153217457902801282'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/erlang-style-concurrency-explained-by.html' title='Erlang Style Concurrency - explained by Ulf Wiger'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8512508038427320494</id><published>2008-02-01T09:05:00.000-08:00</published><updated>2008-02-04T00:46:15.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo'/><title type='text'>New book "Mastering Dojo" - beta PDF now available</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pragprog.com/images/covers/190x228/betas/rgdojo.jpg?1201636964"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 190px;" src="http://www.pragprog.com/images/covers/190x228/betas/rgdojo.jpg?1201636964" alt="" border="0" /&gt;&lt;/a&gt;For those who prefer to learn new Javascript stuff by reading a real book, &lt;a href="http://www.pragprog.com/titles/rgdojo"&gt;Mastering Dojo&lt;/a&gt;  (500 pages) has been announced today. It will be relesed in June, but the beta PDF is already available. &lt;a href="http://alex.dojotoolkit.org/"&gt;Alex Russell&lt;/a&gt;, one of the initial developers of dojo, is a co-author of that book.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: I ordered the PDF version, right after writing this post, but haven't received the e-mail with the download-link yet, so all what is really available right now, are the two example chapters at the publisher's site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8512508038427320494?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8512508038427320494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8512508038427320494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8512508038427320494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8512508038427320494'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/02/new-book-mastering-dojo-beta-pdf-now.html' title='New book &quot;Mastering Dojo&quot; - beta PDF now available'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2894978318606446376</id><published>2008-01-29T14:06:00.000-08:00</published><updated>2008-01-29T20:00:44.332-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>More on serverside Javascript - Rhino on Rails</title><content type='html'>&lt;a href="http://almaer.com/"&gt;Dion Almaer&lt;/a&gt; has recently &lt;a href="http://almaer.com/blog/my-interview-with-steve-yegge-on-rhino-on-rails"&gt;interviewed&lt;/a&gt; &lt;a href="http://steve-yegge.blogspot.com/"&gt;Steve Yegge&lt;/a&gt; about his project of porting Rails to Javascript, you can listen to it right here:&lt;br /&gt;&lt;br /&gt;&lt;object height="373" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1QD9XQm_Jd4&amp;amp;rel=1&amp;amp;border=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/1QD9XQm_Jd4&amp;amp;rel=1&amp;amp;border=1" type="application/x-shockwave-flash" wmode="transparent" height="373" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2894978318606446376?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2894978318606446376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2894978318606446376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2894978318606446376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2894978318606446376'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/more-on-serverside-javascript-rhino-on.html' title='More on serverside Javascript - Rhino on Rails'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-1557051813421367678</id><published>2008-01-22T15:55:00.000-08:00</published><updated>2008-01-22T16:44:06.771-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Serverside Javascript with Jaxer</title><content type='html'>Today &lt;a href="http://aptana.com/"&gt;Aptana&lt;/a&gt; (mostly known for their eclipse based Ajax IDE) launched &lt;a href="http://aptana.com/jaxer/"&gt;Jaxer&lt;/a&gt;, an open source based Ajax server for using Javascript as server side scripting language. It is built on top of the Apache Web server and and the Spidermonkey Javascript engine and has an API which covers most developers needs: File and database access,  logging,  email and  all  kind of  other utility functions.&lt;br /&gt;&lt;br /&gt;So what are Jaxers major selling points ?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Write entire applications or presentation layers in Ajax.&lt;/li&gt;&lt;li&gt;Share code between browser and server.&lt;/li&gt;&lt;li&gt;Database and file access from JavaScript.&lt;/li&gt;&lt;li&gt;Integration with Aptana Studio (their Ajax IDE).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The most important question for me of course is how it compares to &lt;a href="http://erlyjs.googlecode.com/"&gt;erlyjs&lt;/a&gt;, my Javascript-to-Erlang compiler project with main purpose of running Javascript at the serverside for Ajax web applications. Obviously Jaxer is available today and now and erlyjs is work-in-progress far from being ready to use yet. Both share the same vision and both use Spidermonkey. But while on Jaxr the Javascripts really run within the Spidermonkey engine, erlyjs uses Spidermonkey only for parsing the Javascript, then compiles the parsed Javascript to Erlang beam files, for running on the Erlang virtual machine. I believe my approach gives significant performance and scalability advantages (and integrates better with the rest, in those rare cases where the rest is written in Erlang as well ...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-1557051813421367678?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/1557051813421367678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=1557051813421367678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1557051813421367678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/1557051813421367678'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/serverside-javascript-with-jaxer.html' title='Serverside Javascript with Jaxer'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5533696132052035980</id><published>2008-01-17T09:11:00.000-08:00</published><updated>2008-01-17T09:23:45.188-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Hypernumbers whitepapepr: comparing Erlang and LAMP web stacks</title><content type='html'>&lt;i&gt;&lt;a href="http://hypernumbers.com/Hypernumbers%20White%20Paper.pdf"&gt;Using Erlang In A Web Start-Up&lt;/a&gt; &lt;/i&gt;&lt;span style="font-style: italic;"&gt;is a &lt;/span&gt; whitepaper (PDF) by &lt;a href="http://hypernumbers.com/about/"&gt;Gordon Guthrie&lt;/a&gt;, pointing to advantages from the business point of view when choosing Erlang.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5533696132052035980?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5533696132052035980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5533696132052035980' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5533696132052035980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5533696132052035980'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/hypernumbers-whitepapepr-comparing.html' title='Hypernumbers whitepapepr: comparing Erlang and LAMP web stacks'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3857247563350052585</id><published>2008-01-15T22:40:00.000-08:00</published><updated>2008-05-26T10:33:48.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='erlydtl'/><title type='text'>ErlyDTL - the Django template language in Erlang</title><content type='html'>I have been working on a new template language called ErlyDTL. Let's compare it first with the other, established players in the Erlang open source template languages field:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://yarivsblog.com/articles/2006/10/17/introducting-erltl-a-simple-erlang-template-language/"&gt;ErlTL&lt;/a&gt; by Yariv Sadan. ErlTL is used in &lt;a href="http://erlyweb.org/"&gt;ErlyWeb&lt;/a&gt; and therefore probably the most popular Erlang template language. It exposes the full Erlang language to the template author, that is good, if the template author is an experienced Erlang developer, but bad, if the template author does not know Erlang. ErlTL compiles templates to beam files.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/sgte/"&gt;sgte&lt;/a&gt; by Filippo Pacini. An Erlang implementation of &lt;a href="http://www.stringtemplate.org/"&gt;StringTemplate&lt;/a&gt;. Enforces separation between model and view. Templates get evaluated at runtime. Used at &lt;a href="http://www.erlware.org/"&gt;erlware&lt;/a&gt; (if you install the erlware launcher, sgte is one of the core packages used internally for the various erlware templates)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/erlydtl/"&gt;ErlyDTL&lt;/a&gt; by Evan Miller and myself: based on the &lt;a href="http://www.djangoproject.com/documentation/templates/"&gt;Django template language&lt;/a&gt;. It does not expose Erlang to the template author, it compiles templates to beam files, pre-renders as much as possible at compilation time and supports a lot of features such as template inheritance, presetting variables at compilation time, automatic HTML escaping and lots of Django tags and filters. But it is not feature complete yet, just the more important tags and about half of the django filters are currently implemented.&lt;/li&gt;&lt;/ul&gt;If you wanna learn more about ErlyDTL, check out the code or take a look at the examples,  there are a bunch of ErlyDTL  &lt;a href="http://erlydtl.googlecode.com/svn/trunk/demo/templates/"&gt;demo and test templates&lt;/a&gt; at he googlecode project and also the resulting, &lt;a href="http://erlydtl.googlecode.com/svn/trunk/demo/out/"&gt;rendered output files&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: There are more Erlang template engines out there: &lt;a href="http://hyperstruct.net/projects/seethrough"&gt;seethrough&lt;/a&gt; which is specifically for XML/XHTML and internally uses xmerl to do its magic. It is rather simple compared to the others, but depending on the use case that can be an advantage.&lt;br /&gt;&lt;br /&gt;&lt;div class="textads"&gt;The search engine optimizers are very much expert to manage &lt;a href="http://www.iseeq.co.uk/"&gt;ppc&lt;/a&gt; productivity in an efficient manner. The main function of &lt;a href="http://www.iseeq.co.uk/c/web-hosting.htm"&gt;web hosting&lt;/a&gt; service provider is to help the individualistic web sites to have direct accessibility to worldwide immediately. The &lt;a href="http://www.iseeq.co.uk/c/web-design.htm"&gt;website design&lt;/a&gt; templates are designed by the professional web designers which can be downloaded from different web directories free of charges. The internet service providers offer their latest services of &lt;a href="http://www.iseeq.co.uk/c/isp.htm"&gt;dsl&lt;/a&gt; which are reliable and affordable for internet users.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3857247563350052585?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3857247563350052585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3857247563350052585' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3857247563350052585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3857247563350052585'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/erlydtl-django-template-language-in.html' title='ErlyDTL - the Django template language in Erlang'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-4958897468293596252</id><published>2008-01-13T23:11:00.000-08:00</published><updated>2008-01-14T14:22:34.632-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>CodeMirror - an AST aware in-browser code editor</title><content type='html'>I have been following for a while now the development of Javascript based code editors and web IDEs (see &lt;a href="http://www.rsaccon.com/2007/08/i-was-looking-around-for-code-editor.html"&gt;here&lt;/a&gt; and &lt;a href="http://www.rsaccon.com/2007/11/amazing-browser-based-javascript-ide.html"&gt;here&lt;/a&gt;), I even started to build one myself, because I thought there is no such AST aware editor out there, at least until I discovered &lt;a href="http://marijn.haverbeke.nl/codemirror"&gt;codemirror&lt;/a&gt;, which comes with support for Javascript and HTML, and with support I mean it has a real parser (and a CSS file for syntax highlighting)  for those languages. &lt;a href="http://marijn.haverbeke.nl/"&gt;Marijn Haverbeke&lt;/a&gt;, the author of this masterpiece of functional Javascript programming has released today a new version, which makes it easy to integrate it with a different Javascript libraries (codemirror itself uses &lt;a href="http://www.mochikit.com/"&gt;MochiKit&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Codemirror has the following features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;syntax highlighting &lt;/li&gt;&lt;li&gt;automatic code indentation of current line on pressing TAB or RETURN&lt;/li&gt;&lt;li&gt;if some code it selected, automatic indentation of current selection on pressing TAB &lt;/li&gt;&lt;li&gt;works with all common modern browsers&lt;/li&gt;&lt;li&gt;highly configurable: additional languages, performance settings, etc.&lt;br /&gt;&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/3729811-4958897468293596252?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/4958897468293596252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=4958897468293596252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4958897468293596252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/4958897468293596252'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/codemirror-ast-aware-in-browser-code.html' title='CodeMirror - an AST aware in-browser code editor'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2478835654489300355</id><published>2008-01-06T11:49:00.000-08:00</published><updated>2008-01-06T18:13:02.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Zed Shaw on Rails (Ghetto)</title><content type='html'>The new year started with an explosion in the Rails community: Zed Shaw's &lt;a href="http://www.zedshaw.com/rants/rails_is_a_ghetto.html"&gt;Rails rant&lt;/a&gt;, where  he points to some well known Ruby/Rails-people, explains why they are "assholes" and brings up some "general thoughts" such as:&lt;br /&gt;&lt;blockquote&gt;This is exactly what makes Rails a ghetto. A bunch of half-trained former PHP morons who never bother to sit down and really learn the computer science they were too good to study in college.&lt;/blockquote&gt;Zed is the author of &lt;a href="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt;, that made him well known and highly respected within the Rails community. But now I see people from the whole software industry blogging about him and his famous rant. Zed got mentioned  on &lt;a href="http://www.techcrunch.com/2008/01/01/zed-shaw-puts-the-smack-down-on-the-rails-community/"&gt;techcrunch&lt;/a&gt; and today I saw even a post from &lt;a href="http://www.jroller.com/rickard/"&gt;Rickard Oeberg&lt;/a&gt; about  Ted's rant. A few years ago, Rickard was blogging in a very similar style, highly informative but also entertaining about the nasty things around the  &lt;a href="http://jboss.org/"&gt;JBoss&lt;/a&gt; community  (Rickard was the most important initial developer of the JBoss application server).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2478835654489300355?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2478835654489300355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2478835654489300355' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2478835654489300355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2478835654489300355'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2008/01/zed-shaw-on-rails-ghetto.html' title='Zed Shaw on Rails (Ghetto)'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7596623053304973736</id><published>2007-12-28T08:56:00.000-08:00</published><updated>2007-12-28T09:32:56.045-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Erlang on Javascript</title><content type='html'>While I am working on a &lt;a href="http://erlyjs.googlecode.com/"&gt;Javascript to Erlang compiler&lt;/a&gt; for running Javascript code on the Erlang virtual machine, others do the opposite: &lt;a href="http://beatniksoftware.com/blog/"&gt;Alex Graveley&lt;/a&gt; has written &lt;a href="http://www.beatniksoftware.com/erjs/index.html"&gt;Er.js&lt;/a&gt;, a Javascript library for using Erlang-style concurrency with JavaScript, even with an Erlang like syntax !&lt;br /&gt;&lt;br /&gt;Javascript  does not support natively any kind of threads, therefore  a lot of tricks (like using the asynchronous timer callback) went into this and &lt;a href="http://www.bluishcoder.co.nz/2006/06/lightweight-threads-with-narrative.html"&gt;other&lt;/a&gt; &lt;a href="http://neilmix.com/narrativejs/doc/index.html"&gt;narrative Javascript based&lt;/a&gt;  threading  libraries to make it look and feel like real multithreading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7596623053304973736?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7596623053304973736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7596623053304973736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7596623053304973736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7596623053304973736'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/erlang-on-javascript.html' title='Erlang on Javascript'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2781581562890228114</id><published>2007-12-26T06:07:00.000-08:00</published><updated>2007-12-26T06:21:58.113-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Gmail insecurity - check your filters - you may have been hacked</title><content type='html'>&lt;a href="http://www.davidairey.co.uk"&gt;David Dairey&lt;/a&gt;'s .com domain name got stolen by an online criminal, exploiting a gmail security vulnerability (now fixed). The scary thing about this is that the exploit added a filter to gmail, so even after Google fixed the security whole, any malicious inserted filter continues to do its evil actions.  &lt;a href="http://www.davidairey.co.uk/google-gmail-security-hijack/"&gt;Read the entire story&lt;/a&gt; and check your filters !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2781581562890228114?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2781581562890228114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2781581562890228114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2781581562890228114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2781581562890228114'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/gmail-insecurity-check-your-filters-you.html' title='Gmail insecurity - check your filters - you may have been hacked'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8554863718452048446</id><published>2007-12-15T20:34:00.000-08:00</published><updated>2007-12-15T23:50:15.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>How to put HD video on the web with latest flashplayer</title><content type='html'>First I want to make it clear that I am all for open web standards and requiring the latest flashplayer for showing some video on your site always degrades the user experience, no matter how much effort you put into avoiding that. So if you wanna depend on latest flashplayer, there must be a strong reason for it. Flashplayer 9.0.125 (released about a week ago) offering high quality codecs (h264/HE-AAC) might be such as strong reason, the audio/video quality is excellent and filesize of the videofiles is relatively small. Here the required steps to produce such a video and how to put it on a webpage without degrading the user experience too much.&lt;br /&gt;&lt;br /&gt;Let's assume you already have your original video file in high quality and large file size, either form a HD video camera, a screen recording application or most probably as a result of post processing with a video editing software.&lt;br /&gt;&lt;br /&gt;First you must transcode your media to h264 video / HE-AAC audio and put it in a mp4 fileformat. I assume there exists some software from Adobe which does that for you, but I am  not familiar with their current commercial offerings. In my case I put together an &lt;a href="http://massanti.com/2007/09/28/encoding-h264-video-aac-plus-audio-for-flash/"&gt;open source toolchain&lt;/a&gt; to perform the transcoding.&lt;br /&gt;&lt;br /&gt;Now you have the video as a *.mp4  file. Next you need to prepare your website to embed the video with &lt;a href="http://www.jeroenwijering.com/?item=JW_Media_Player"&gt;a flash videoplayer&lt;/a&gt; (there are others which work equally well, just the code below probably neds to be slightly modified). The tricky part is that you require the latest flashplayer, so I suggest embedding via Javascript and with &lt;a href="http://code.google.com/p/swfobject/"&gt;SwfObject&lt;/a&gt;, that allows to upgrade to the latest flashplayer via Adobe &lt;a href="http://kb.adobe.com/selfservice/viewContent.do?externalId=6a253b75&amp;amp;sliceId=2"&gt;ExpressInstall&lt;/a&gt;, if Javascript is enabled. And what if Javascript is not enabled or not available at all ? There is a solution for that: "Extended" markup, which results in either the video or an alternative content (bur no easy upgrade via flashplayer ExpressInstall). Here the embedding steps in detail:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Load swfobject.js (Javascript library):&lt;/span&gt;&lt;pre&gt;&amp;lt;script type="text/javascript" src="{{ path }}/swfobject.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;Register the video (via Javascript):&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; swfobject.registerObject("{{ video-DOM-ID }}", "9.0.115", "{{ path&lt;br /&gt;}}/expressInstall.swf");&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;Extended HTML markup for embedding video:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;object id="{{ video-DOM-ID }}"&lt;br /&gt;classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="800"&lt;br /&gt;height="620"&amp;gt;&lt;br /&gt; &amp;lt;param name="movie" value="{{ path }}/mediaplayer.swf"&amp;gt;&lt;br /&gt; &amp;lt;param name="allowfullscreen" value="true"&amp;gt;&lt;br /&gt; &amp;lt;param name="menu" value="false"&amp;gt;&lt;br /&gt; &amp;lt;param name="flashvars" value="file={{ path_to_video }}&amp;amp;image={{&lt;br /&gt;path_to_preview_image}}"&amp;gt;&lt;br /&gt; &amp;lt;!--[if !IE]&amp;gt;--&amp;gt;&lt;br /&gt; &amp;lt;object type="application/x-shockwave-flash" data="{{ path&lt;br /&gt;}}/mediaplayer.swf" width="800" height="620"&amp;gt;&lt;br /&gt; &amp;lt;param name="allowfullscreen" value="true"&amp;gt;&lt;br /&gt; &amp;lt;param name="menu" value="false"&amp;gt;&lt;br /&gt; &amp;lt;param name="flashvars" value="file={{ path_to_video }}&amp;amp;image={{&lt;br /&gt;path_to_preview_image}}"&amp;gt;&lt;br /&gt; &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt; &amp;lt;h2&amp;gt;To view the video:&amp;lt;/h2&amp;gt;&lt;br /&gt; &amp;lt;p&amp;gt;&lt;br /&gt;   &amp;lt;a href="http://www.adobe.com/go/getflashplayer"&amp;gt;&lt;br /&gt;           &amp;lt;img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"&lt;br /&gt;alt="Get Adobe Flash player"&amp;gt;&lt;br /&gt;         &amp;lt;/a&amp;gt;&lt;br /&gt; &amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;!--[if !IE]&amp;gt;--&amp;gt;&lt;br /&gt; &amp;lt;/object&amp;gt;&lt;br /&gt; &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Remarks:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;all &lt;span style="font-family:courier new;"&gt;{{ path }} &lt;/span&gt;variables need to be replaced with the actual path or URL where you have your static content.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;{{ path_to_video }}&lt;/span&gt; : the path or URL of the actual video file&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;{{ path_to_preview_image }}&lt;/span&gt; : path or URL of a preview image&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.rsaccon.com/2007/12/erlang-textmate-integration.html"&gt;as explained above, and inside this blog&lt;/a&gt; (requires editing the blogger template, if you wanna try that out yourself)&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/3729811-8554863718452048446?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8554863718452048446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8554863718452048446' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8554863718452048446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8554863718452048446'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/how-to-put-hd-video-on-web-with-latest.html' title='How to put HD video on the web with latest flashplayer'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-2783391393031651741</id><published>2007-12-14T09:00:00.000-08:00</published><updated>2008-05-26T10:33:18.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comet'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>ErlyComet article and screencast</title><content type='html'>Today my article "&lt;a href="http://cometdaily.com/2007/12/14/getting-started-with-comet-on-erlang/"&gt;Getting started with Comet on Erlang&lt;/a&gt;" got published at &lt;a href="http://cometdaily.com/"&gt;CometDaily&lt;/a&gt;, there is also a screencast there (scroll down there, to the ErlyComet section) if you prefer to watch and listen ...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; Some users could not load the screencast / did not like to get asked for upgrading the flashplayer. I halfway expected this. It's not that I haven't put in efforts to avoid that kind of bad user experience, but my efforts apparently failed. Let me explain in detail: the video is encoded in h264/HE-AAC and that only works   on flashplayer 9.0.125. If the flashplayer is not the very latest one, a dialog should inform the user (and provide direct link) to upgrade the flashplayer, if he wishes to watch the video. Uploading the original QuicktTime screencast to youtube or google video results in bad, mostly unreadable text quality, similar to all those RubyOnRails screencasts which have been originally recorded in QuickTime.&lt;br /&gt;Nevertheless, here is the &lt;a href="http://video.google.com/videoplay?docid=5341158856097951352&amp;amp;hl=en"&gt;&lt;span style="font-weight: bold;"&gt;google video version (bad quality)&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="textads"&gt;The &lt;a href="http://www.businesshostingprovider.com/"&gt;web hosting&lt;/a&gt; services of different hosting companies include the most additional features of domain registration free of charge. The &lt;a href="http://www.businesshostingprovider.com/web-design.htm"&gt;web site design&lt;/a&gt; of varied websites is developed by the professional web designers who have artistic touch of Excellency. If you want to have direct and fast internet access, you should subscribe reliable &lt;a href="http://www.businesshostingprovider.com/broadband.htm"&gt;broadband&lt;/a&gt; service providers. The &lt;a href="http://www.businesshostingprovider.com/web-development.htm"&gt;website development&lt;/a&gt; services are offered by the different IT companies to boost up the significance of web site into the main search engine.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-2783391393031651741?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/2783391393031651741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=2783391393031651741' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2783391393031651741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/2783391393031651741'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/erlycomet-article-and-sceencast.html' title='ErlyComet article and screencast'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-867981142846502183</id><published>2007-12-13T22:35:00.000-08:00</published><updated>2007-12-14T08:20:50.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>Erlang TextMate integration - Documentation lookup</title><content type='html'>I have made some progress with &lt;a href="http://erlymate.googlecode.com"&gt;&lt;span style="font-weight: bold;"&gt;ErlyMate&lt;/span&gt;&lt;/a&gt;, my pet project for adding first class Erlang support  to TextMate. Based on a new architecture with an Erlang background server (starts and stops together with TextMate, wrote a Cocoa  plugin for that) I implemented a very first and highly experimental approach of edoc lookup. More technical details can be found at the &lt;a href="http://erlymate.googlecode.com"&gt;googlecode project page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And here a screencast to show you how it looks and feels like (requires latest flashplayer, and asks you to upgrade to it, if you don't have it, because video is h264/HE-AAC encoded):&lt;script type="text/javascript"&gt;swfobject.registerObject("erlymate-1", "9.0.115", "http://rsaccon.googlepages.com/expressInstall.swf");&lt;/script&gt;&lt;object id="erlymate-1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="800" height="620"&gt;&lt;param name="movie" value="http://rsaccon.googlepages.com/mediaplayer.swf"/&gt;&lt;param name="allowfullscreen" value="true"/&gt;&lt;param name="menu" value="false"/&gt;&lt;param name="flashvars" value="file=http://rsaccon.googlepages.com/erlymate-1.mp4&amp;image=http://rsaccon.googlepages.com/erlymate-1.jpg" /&gt;&lt;br /&gt; &lt;!--[if !IE]&gt;--&gt;&lt;br /&gt; &lt;object type="application/x-shockwave-flash" data="http://rsaccon.googlepages.com/mediaplayer.swf" width="800" height="620"&gt;&lt;param name="allowfullscreen" value="true"/&gt;&lt;param name="menu" value="false"/&gt;&lt;param name="flashvars" value="file=http://rsaccon.googlepages.com/erlymate-1.mp4&amp;image=http://rsaccon.googlepages.com/erlymate-1.jpg"/&gt;&lt;br /&gt; &lt;!--&lt;![endif]--&gt;&lt;br /&gt; &lt;h2&gt;To view the ErlyMate screencast:&lt;/h2&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;   &lt;a href="http://www.adobe.com/go/getflashplayer"&gt;&lt;br /&gt;    &lt;img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player"/&gt;&lt;br /&gt;  &lt;/a&gt;&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;!--[if !IE]&gt;--&gt;&lt;br /&gt; &lt;/object&gt;&lt;br /&gt; &lt;!--&lt;![endif]--&gt;&lt;br /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-867981142846502183?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/867981142846502183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=867981142846502183' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/867981142846502183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/867981142846502183'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/erlang-textmate-integration.html' title='Erlang TextMate integration - Documentation lookup'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-3555337835206924117</id><published>2007-12-10T12:26:00.000-08:00</published><updated>2007-12-10T14:37:52.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Rubinius - the next  generation Ruby virtual machine</title><content type='html'>The guys at &lt;a href="http://www.engineyard.com/"&gt;Engine Yard&lt;/a&gt;, a RubyOnRails application hosting company are serious about solving the Ruby performance issues (Ruby is interpreted) and they are developing a virtual machine. Straight from the &lt;a href="http://rubini.us/"&gt;Rubinius&lt;/a&gt; homepage:&lt;br /&gt;&lt;blockquote&gt;Rubinius draws on the best virtual machine research and technology of the past 30 years and incorporates the newest research in dynamic language implementations. Rubinius implements the core libraries in Ruby, providing a system that is much more accessible, easier to develop and to extend. &lt;/blockquote&gt;And what's  in the bag for an Ex-Ruby-developer (Ruby it is a great language, but since I am comfortable with Erlang, I don't have any use for Ruby anymore ...) ? Well, &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;, my preferred editor has a lot of its functionality implemented as Ruby scripts, and if they run faster with Rubinius, that's fine for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-3555337835206924117?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/3555337835206924117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=3555337835206924117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3555337835206924117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/3555337835206924117'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/rubinius-next-generation-ruby-virtual.html' title='Rubinius - the next  generation Ruby virtual machine'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-923390599530412086</id><published>2007-12-09T23:15:00.000-08:00</published><updated>2007-12-10T12:53:15.285-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Benchmark - ErlyWeb vs. RubyOnRails</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://erlyweb.org/erlyweb-logo.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 60px;" src="http://erlyweb.org/erlyweb-logo.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://yarivsblog.com/"&gt;Yariv Sadan&lt;/a&gt;, the author of &lt;a href="http://erlyweb.org/"&gt;ErlyWeb&lt;/a&gt;, has &lt;a href="http://yarivsblog.com/articles/2007/12/09/erlyweb-vs-ruby-on-rails-ec2-performance-showdown"&gt;benchmarked&lt;/a&gt; his Erlang MVC web framework against RubyOnRails 2.0 and according to his results, ErlyWeb is outperforming RubyOnRails by factor 47. &lt;span style="font-weight: bold;"&gt;[Corrected: it's 6 now, see Update]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If Ruby is on Rails, than ErlyWeb is on rocket engines !&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: This number is far too good to be true ! In fact, Yariv had Mongrel running in non-production mode, in his corrected version the ErlyWeb outperforming factor went down to 6.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-923390599530412086?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/923390599530412086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=923390599530412086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/923390599530412086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/923390599530412086'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/benchmark-erlyweb-vs-rubyonrails.html' title='Benchmark - ErlyWeb vs. RubyOnRails'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7049065917210040917</id><published>2007-12-06T09:45:00.000-08:00</published><updated>2007-12-06T18:20:24.170-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Erlang R12B-0 on Leopard</title><content type='html'>Yesterday &lt;a href="http://erlang.org/download.html"&gt;Erlang R12B-0&lt;/a&gt; was released. Compilation on Leopard (with XCode development tools installed) was straight forward, except for one Erlang application: the new profiling tool &lt;a href="http://erlang.org/doc/apps/percept/part_frame.html"&gt;percept&lt;/a&gt;, which got disabled because of missing &lt;span style="font-family:courier new;"&gt;libgd&lt;/span&gt; library at the &lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt; step.&lt;br /&gt;&lt;br /&gt;So I installed it via macports:&lt;br /&gt;&lt;pre&gt;sudo port install gd2&lt;br /&gt;&lt;/pre&gt;unfortunately &lt;span style="font-family:courier new;"&gt;./configure &lt;/span&gt;continued to complain. Finally today a solution for how to run &lt;span style="font-family:courier new;"&gt;./configure&lt;/span&gt; was posted on the Erlang mailing list:&lt;br /&gt;&lt;pre&gt;./configure --with-gd=/opt/local&lt;br /&gt;&lt;/pre&gt;and everything went without further problems ...&lt;br /&gt;&lt;br /&gt;There a lots of new features and improvements, and I look forward to explore them one by one in the next weeks and months. Just the troublemaker &lt;span style="font-weight: bold;"&gt;percept&lt;/span&gt; I had to inspect immediately.  It seems to be a powerful  tool for performance analysis and it ships with a module called &lt;span style="font-weight: bold;"&gt;edg&lt;/span&gt; which wraps libgd and serves for creating 2D vector graphics (to visualize the percept profiling results), similar to my own &lt;a href="http://erlycairo.googlecode.com/"&gt;erlycairo&lt;/a&gt;, but it produces*.gif files (erlycairo only outputs *.png files).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-7049065917210040917?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7049065917210040917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7049065917210040917' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7049065917210040917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7049065917210040917'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/12/erlang-r12b-0-on-leopard.html' title='Erlang R12B-0 on Leopard'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5971169987461866592</id><published>2007-11-30T11:00:00.000-08:00</published><updated>2007-11-30T23:53:08.997-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='cairo'/><title type='text'>Updated ErlyCairo</title><content type='html'>Did some housekeeping on &lt;a href="http://code.google.com/u/rsaccon/"&gt;my growing inventory&lt;/a&gt; of Erlang open source projects targeted to web development. I completely rewrote the Erlang part of &lt;a href="http://code.google.com/p/erlycairo/"&gt;ErlyCairo&lt;/a&gt;, the Erlang bindings for the Cairo 2D graphics library. Previously it had a hard coded node name for the C-node, now it is based on a much more flexible gen-server approach.&lt;br /&gt;&lt;br /&gt;Below see how to use this software to create a simple, purple, 100px * 100px PNG image:&lt;br /&gt;&lt;pre&gt;start() -&gt; &lt;br /&gt; erlycairo:start_link().&lt;br /&gt;&lt;br /&gt;%% if you run multiple C-Nodes, to avoid nodename conflicts &lt;br /&gt;start(CNodeNumber) -&gt; &lt;br /&gt;  erlycairo:start_link(CNodeNumber).&lt;br /&gt;    &lt;br /&gt;stop() -&gt; &lt;br /&gt;  erlycairo:stop().        &lt;br /&gt;&lt;br /&gt;create_images()-&gt;&lt;br /&gt;  rect("rect.png", 100, 100, {1.0, 0.2, 0.7, 1.0}).&lt;br /&gt;&lt;br /&gt;rect(File, Width, Height, {Red, Green, Blue, Alpha}) -&gt;&lt;br /&gt;  case erlycairo:new_image_blank(Width, Height) of&lt;br /&gt;      ok -&gt;&lt;br /&gt;          erlycairo:set_source_rgba(Red, Green, Blue, Alpha),&lt;br /&gt;          erlycairo:rectangle(0, 0, Width, Height),&lt;br /&gt;          erlycairo:fill(),&lt;br /&gt;          erlycairo:write_to_png(File),&lt;br /&gt;          erlycairo:close_image(),&lt;br /&gt;          ok;&lt;br /&gt;      {error, Reason} -&gt;&lt;br /&gt;          exit(Reason)&lt;br /&gt;  end.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5971169987461866592?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5971169987461866592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5971169987461866592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5971169987461866592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5971169987461866592'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/updated-erlycairo.html' title='Updated ErlyCairo'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-7753941686610124471</id><published>2007-11-28T20:27:00.000-08:00</published><updated>2007-11-29T04:34:17.831-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><category scheme='http://www.blogger.com/atom/ns#' term='EC2'/><title type='text'>Amazon EC2 / S3 Network Performance</title><content type='html'>Thorsten von Eicken (CTO at &lt;a href="http://rightscale.com/"&gt;RightScale&lt;/a&gt;) did some &lt;a href="http://info.rightscale.com/2007/11/29/network-performance-in-ec2-and-s3"&gt;bandwidth measurements&lt;/a&gt;, here an overview of his analysis:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EC2 &lt;-&gt; EC2&lt;/span&gt; (large instances):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;one connection: totally 75 MB/s &lt;/li&gt;&lt;li&gt;three connections: totally 96 MB/s&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;S3 &lt;- EC2&lt;/span&gt; (large instance, HTTPS, download):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;one connection: totally 12.6 MB/s &lt;/li&gt;&lt;li&gt;eight connections: totally 49.8 MB/s&lt;/li&gt;&lt;/ul&gt; the results for non-SSL (HTTP) are about the same.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;S3 -&gt; EC2&lt;/span&gt; (large instance, HTTPS, upload):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;one connection: totally 6.9 MB/s &lt;/li&gt;&lt;li&gt;twelve connections: totally 53.8 MB/s&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/3729811-7753941686610124471?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/7753941686610124471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=7753941686610124471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7753941686610124471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/7753941686610124471'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/amazon-ec2-s3-network-performance.html' title='Amazon EC2 / S3 Network Performance'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-777108038520016169</id><published>2007-11-27T17:32:00.000-08:00</published><updated>2007-11-27T18:04:59.940-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>TextMate is the most popular Rails development environment</title><content type='html'>So I am hopefully on the right track &lt;a href="http://www.rsaccon.com/2007/11/faster-interaction-between-erlang-and.html"&gt;with&lt;/a&gt; &lt;a href="http://www.rsaccon.com/2007/11/easy-erlang-compiling-with-textmate.html"&gt;my&lt;/a&gt; &lt;a href="http://www.rsaccon.com/2007/11/first-step-in-adapting-textmate-for.html"&gt;attempt&lt;/a&gt; to improve Erlang support for TextMate !&lt;br /&gt;&lt;a href="http://www.tbray.org/"&gt;Tim Bray&lt;/a&gt; asked 1000 Ruby / RubyOnRails about their preferred development environment, below just the most popular ones, for the complete table go to &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/11/26/Ruby-Tool-Survey"&gt;Tim Bray's Ruby survey&lt;/a&gt;.&lt;br /&gt;&lt;table class="sortable" cellpadding="5"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td class="empty"&gt;&lt;br /&gt;&lt;/td&gt;&lt;th class=""&gt;All&lt;/th&gt;&lt;th class=""&gt;%&lt;/th&gt;&lt;th class=""&gt;Ruby&lt;/th&gt;&lt;th class=""&gt;%&lt;/th&gt;&lt;th class="sorttable_sorted_reverse"&gt;Rails&lt;span id="sorttable_sortrevind"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/th&gt;&lt;th class=""&gt;%&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;                                                &lt;tr align="right"&gt;&lt;th&gt;TextMate&lt;/th&gt;&lt;td&gt;478&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;30.35&lt;/td&gt;&lt;td&gt;216&lt;/td&gt;&lt;td&gt;24.24&lt;/td&gt;&lt;td&gt;262&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;38.30&lt;/td&gt;&lt;/tr&gt;&lt;tr align="right"&gt;&lt;th&gt;Vi family&lt;/th&gt;&lt;td&gt;345&lt;/td&gt;&lt;td&gt;21.90&lt;/td&gt;&lt;td&gt;217&lt;/td&gt;&lt;td&gt;24.35&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;18.71&lt;/td&gt;&lt;/tr&gt;&lt;tr align="right"&gt;&lt;th&gt;NetBeans&lt;/th&gt;&lt;td&gt;184&lt;/td&gt;&lt;td&gt;11.68&lt;/td&gt;&lt;td&gt;93&lt;/td&gt;&lt;td&gt;10.44&lt;/td&gt;&lt;td&gt;91&lt;/td&gt;&lt;td&gt;13.30&lt;/td&gt;&lt;/tr&gt;&lt;tr align="right"&gt;&lt;th&gt;Eclipse&lt;/th&gt;&lt;td&gt;175&lt;/td&gt;&lt;td&gt;11.11&lt;/td&gt;&lt;td&gt;101&lt;/td&gt;&lt;td&gt;11.34&lt;/td&gt;&lt;td&gt;74&lt;/td&gt;&lt;td&gt;10.82&lt;/td&gt;&lt;/tr&gt;&lt;tr align="right"&gt;&lt;th&gt;Emacs family&lt;/th&gt;&lt;td&gt;198&lt;/td&gt;&lt;td&gt;12.57&lt;/td&gt;&lt;td&gt;132&lt;/td&gt;&lt;td&gt;14.81&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;9.65&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-777108038520016169?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/777108038520016169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=777108038520016169' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/777108038520016169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/777108038520016169'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/textmate-is-most-popular-rails.html' title='TextMate is the most popular Rails development environment'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6531489025815173946</id><published>2007-11-27T16:08:00.000-08:00</published><updated>2007-11-27T17:01:22.130-08:00</updated><title type='text'>Disaster recovery nightmare with mozy.com</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6nF5cKrqCDc/R0yx81B2SMI/AAAAAAAAAto/KBy3GA5t-YY/s1600-h/Picture+1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_6nF5cKrqCDc/R0yx81B2SMI/AAAAAAAAAto/KBy3GA5t-YY/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5137676933507991746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6nF5cKrqCDc/R0yx9FB2SNI/AAAAAAAAAtw/Lw-Py7qpRQY/s1600-h/Picture+2.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_6nF5cKrqCDc/R0yx9FB2SNI/AAAAAAAAAtw/Lw-Py7qpRQY/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5137676937802959058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Shit happens and usually when you don't expect it, in my case I lost some personal data on my mac (iTunes and iPhoto library). I had signed up with &lt;a href="http://mozy.com/"&gt;Mozy&lt;/a&gt; for automatically backing up my data and easily restoring it, so I thought it just needs a few mouse clicks and everything is fine again. Unfortunately that was not the case. The pictures above show how both restore methods they offer (online restore and download-file-and-restore) failed (even after multiple retries).&lt;br /&gt;&lt;br /&gt;Mozy support staff seems to responsive and friendly, but that's all. The copy-pasted text below is from an email they sent me 21 hours ago:&lt;br /&gt;&lt;blockquote&gt;I will continue to do more research on this, and tomorrow our mac specialist will be in the building and from there we can work on a more permanent solution.&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Lessons learned:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't trust your data to a fast growing startup company. In my case it was &lt;a href="http://mozy.com/"&gt;Mozy&lt;/a&gt;. But I believe this can happen with any other of these over-hyped cheap-service companies.&lt;/li&gt;&lt;li&gt;Don't test the backup service by just restoring a simple file. Take the time to do a test restore of  your real valuable data at its full size.&lt;/li&gt;&lt;li&gt;Choose at least two totally independent backup solutions.&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/3729811-6531489025815173946?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6531489025815173946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6531489025815173946' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6531489025815173946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6531489025815173946'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/disaster-recovery-nightmare-with.html' title='Disaster recovery nightmare with mozy.com'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6nF5cKrqCDc/R0yx81B2SMI/AAAAAAAAAto/KBy3GA5t-YY/s72-c/Picture+1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8021312919211948608</id><published>2007-11-26T06:22:00.000-08:00</published><updated>2007-11-26T07:17:51.286-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>Faster interaction between Erlang and TextMate</title><content type='html'>My &lt;a href="http://www.rsaccon.com/2007/11/easy-erlang-compiling-with-textmate.html"&gt;first attempt&lt;/a&gt; of combining TextMate key bindings to Erlang scripts was fully based on &lt;a href="http://www.erlang.org/doc/man/escript.html"&gt;escripts&lt;/a&gt;. Unfortunatley starting an escript costs some time (because of the startup of an Erlang VM), on my mac it is about 0.15 seconds. Not much,  but enough to be perceived as short delay by the user. So I was looking for a faster way of interaction and Erlang core developer Bengt Kleberg pointed me to &lt;a href="http://catseye.tc/projects/erlaunch/"&gt;erlaunch&lt;/a&gt;, a kind of erlang scripting environment where the VM runs in the background and dosent need to be restarted for each script. So I guess something along that lines is the way to go for TextMate Erlang integration, probably a TextMate plugin written in C which takes care of the Erlang background VM during TextMate uptime. Need to learn now how to write a TextMate plugin ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8021312919211948608?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8021312919211948608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8021312919211948608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8021312919211948608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8021312919211948608'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/faster-interaction-between-erlang-and.html' title='Faster interaction between Erlang and TextMate'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-5549252160121750903</id><published>2007-11-24T18:28:00.000-08:00</published><updated>2007-11-28T21:25:01.393-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><title type='text'>s3fox - a great Amazon S3 explorer and backup tool</title><content type='html'>I recently had to do some disaster recovery on my mac and made the painful experience that &lt;a href="http://mozy.com/"&gt;mozy&lt;/a&gt;  sucks in every way one can imagine. After several failed attempts I managed to restore most of my stuff. Ok, mozy mac version is still in beta, and it is dirty cheap but it is also completly useless for the less experienced user, because it was not straight forward for me to restore large sets of files and it is useless for the more technical user, because it gives you little control of what it is doing and you can't even backup hidden files (e.g. a git repository) and when I asked them about that, I just received a non-answer from somebody who did not understand what I asked. This is my personal experience. I am sure there are plenty of happy mozy users out there.&lt;br /&gt;So  I had to reevaluate my options for personal backups. Because I was already a heavy user of &lt;a href="http://www.blogger.com/aws.amazon.com/s3"&gt;Amazon S3&lt;/a&gt; in relation with various web projects, I tried out some of the common S3 desktop tools:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jungledisk.com/"&gt;JungleDisk&lt;/a&gt; (commercial, cheap) - sucks because what you store with JungleDisk you can only retrieve with JungleDisk (with additional effort you can do anything of course).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://people.no-distance.net/ol/software/s3/"&gt;S3 Browser&lt;/a&gt; (free) -  sucks because there is only a mac version and it has very limited functionality.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bucketexplorer.com/"&gt;BucketExplorer&lt;/a&gt; (commercial, free while in beta) - sucks because it is written in Java and therefore looks ugly and just feels strange on the mac.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It's a crowded market and there are a lot of other S3 explorer and backup tools out there. I actually had been using one heavily and with great success when it came out: &lt;a style="font-weight: bold;" href="https://addons.mozilla.org/en-US/firefox/addon/3247"&gt;s3fox&lt;/a&gt;. It's a slick Firefox extension and  it was the only one which exactly worked the way I actually expected it to work. But there was one problem:  after initial release, the author  did  not maintain it, and Firefox evolved, the S3 protocol itself evolved and when I switched to a mac half a year ago, I couldn't use it anymore (I don't remember for what particular reason).  Now I checked again and - nice surprise - there is a &lt;span style="font-weight: bold;"&gt;new version (0.4),&lt;/span&gt; which solved all the problems and even got drag &amp;amp; drop and some functionality for synchronizing local and remote folders. Easy to install, easy to use, free. I didn't have to  look any further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-5549252160121750903?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/5549252160121750903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=5549252160121750903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5549252160121750903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/5549252160121750903'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/s3fox-great-amazon-s3-explorer-and.html' title='s3fox - a great Amazon S3 explorer and backup tool'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-8597508235977846763</id><published>2007-11-20T17:17:00.000-08:00</published><updated>2007-11-23T07:02:46.290-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='mochiweb'/><title type='text'>MochiWeb got a HTML parser</title><content type='html'>Since &lt;a href="http://mochiweb.googlecode.com/"&gt;MochiWeb&lt;/a&gt; went open source I have been working with Tait Larson  on a &lt;a href="http://erlycomet.googlecode.com/"&gt;Comet server&lt;/a&gt; (HTTP push) built on top of MochiWeb. We are not there yet, but it has been a very pleasant experience so far, especially considering an earlier (failed)  attempt of mine to build such a thing on top of &lt;a href="http://yaws.hyber.org/"&gt;yaws&lt;/a&gt;, where I had to patch yaws and deal with all kind of annoyances (don't get me wrong, yaws is great for 99% of all possible use cases, just HTTP Push belongs to the other 1%).&lt;br /&gt;&lt;br /&gt;So today I was just doing some online housekeeping and I noticed that MochiWeb got a &lt;a style="font-weight: bold;" href="http://mochiweb.googlecode.com/svn/trunk/src/mochiweb_html.erl"&gt;HTML parser&lt;/a&gt;. Thats great ! So far,  it has been asked many times on the Erlang mailing list how to parse HTML. And sooner or later somebody points to the yaws HTML parser, which works reasonably well. One time it was me asking that question and when I got the answer, I started to play with that yaws HTML parser and some simple XHTML (if I remember properly) examples and everything looked fine. But things turned nasty when I tested the yaws parser with real world HTML.&lt;br /&gt;&lt;br /&gt;Now I hope people are starting testing and crashing (&lt;a href="http://groups.google.com/group/mochiweb/browse_thread/thread/2503c748da91dd8"&gt;I just did&lt;/a&gt;) the MochiWeb parser with real world HTML and provide feedback to the developers so they can further improve it !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-8597508235977846763?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/8597508235977846763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=8597508235977846763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8597508235977846763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/8597508235977846763'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/mochiweb-got-html-parser.html' title='MochiWeb got a HTML parser'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3729811.post-6786408742557025841</id><published>2007-11-20T08:50:00.000-08:00</published><updated>2007-11-20T10:50:13.821-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Rounded corners with canvas tag graphics</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6nF5cKrqCDc/R0Mq61B2SLI/AAAAAAAAAtI/eWfEv3OZgYk/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_6nF5cKrqCDc/R0Mq61B2SLI/AAAAAAAAAtI/eWfEv3OZgYk/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5134995190288107698" border="0" /&gt;&lt;/a&gt;There exist many different approaches for creating  rounded corners on HTML pages, and  each of these approach  has  its problems.  Javascript based solutions consume too much CPU cycles (and even more if doing anti aliasing), background-image based solutions are complicated (and even more, if done properly, e.g. &lt;a href="http://www.schillmania.com/content/entries/2006/04/more-rounded-corners/"&gt;sliding-doors based)&lt;/a&gt; and involve additional HTTP requests and solutions based on a bunch of DIVs (with border and varying margin to emulate the corner radius) turn any page into a horrible tag soup. The slickest solution, with the cleanest HTML and Javascript code I have seen so far is &lt;a href="http://greghoustondesign.com/"&gt;Greg Houston's&lt;/a&gt; &lt;a href="http://greghoustondesign.com/demos/mocha/"&gt;&lt;span style="font-weight: bold;"&gt;mocha&lt;/span&gt;&lt;/a&gt;. It uses the canvas HTML tag, which is supported by Firefox, Safari and Opera 9. The ugly part of this solution is the &lt;a href="http://excanvas.sourceforge.net/"&gt;heavy work-around&lt;/a&gt; required for Internet Explorer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3729811-6786408742557025841?l=rsaccon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rsaccon.blogspot.com/feeds/6786408742557025841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3729811&amp;postID=6786408742557025841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6786408742557025841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3729811/posts/default/6786408742557025841'/><link rel='alternate' type='text/html' href='http://rsaccon.blogspot.com/2007/11/rounded-corners-with-canvas-tag.html' title='Rounded corners with canvas tag graphics'/><author><name>Roberto Saccon</name><uri>http://www.blogger.com/profile/17372747301844271000</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_6nF5cKrqCDc/SnNzbyU6RcI/AAAAAAAAA5g/ZaB0jiLKwe4/S220/rsaccon-240x320.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6nF5cKrqCDc/R0Mq61B2SLI/AAAAAAAAAtI/eWfEv3OZgYk/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
