<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">
  <channel>
    <title>Planet Erlang</title>
    <description>Planet Erlang</description>
    <link>http://babelnova.net/planet</link>
    <docs>http://backend.userland.com/rss</docs>
    <generator>RSS.NET: http://www.rssdotnet.com/</generator>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/planet_erlang" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>OneChannel: a desktop Publish/Subscribe client for instant news delivery</title>
      <description>&lt;p&gt;Today, ProcessOne launches a free, desktop Publish/Subscribe (PubSub) client. OneChannel will instantly receive new messages, minimizing the delay of distributing news updates and blog posts.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Publish/subscribe"&gt;PubSub&lt;/a&gt; protocol uses XMPP and is much faster than RSS &amp;ndash; imagine instant messaging, but instead of messages from friends, you get news and articles. And it doesn&amp;rsquo;t have to make feed requests, the new content is pushed straight to OneChannel once available. Moreover, it reduces the load on the servers. Instead of having thousands of RSS clients checking every hour for new content, they just have to wait for the data to be broadcasted to them.&lt;/p&gt;
&lt;p&gt;We prepared several channels with IT articles, World headlines and ProcessOne messages, and soon you will be able to add your own channels to the collection. Since OneChannel is released as a public beta, please give us feedback and suggestions.&lt;/p&gt;
&lt;p&gt;Note that most channels currently are coming from RSS, so the update interval is the one of the RSS polling. However, we will start pushing content directly in PubSub in the future.&lt;br /&gt;&lt;br /&gt;We have build this client because we think PubSub is underused in the XMPP community and in the real-time web in general. This will allow the community to be able to use a client as a reference and basis to accelerate PubSub adoption.&lt;br /&gt;&lt;br /&gt;For now, the client is able to render Atom or HTML payload (including embedded Flash objects like YouTube videos) only, but we plan to add new supported payload in the future.&lt;/p&gt;
&lt;p&gt;To start testing, you just need a free account on the &lt;a rel="nofollow" target="_blank" href="http://www.xmpp-sandbox.org/"&gt;XMPP Sandbox&lt;/a&gt;, and the latest &lt;a rel="nofollow" target="_blank" href="http://www.adobe.com/products/air/"&gt;Adobe AIR Framework&lt;/a&gt; installed (available for Windows, Mac and Linux).&lt;/p&gt;
&lt;p&gt;To download the PubSub client and learn more, go to &lt;a rel="nofollow" target="_blank" href="http://www.xmpp-sandbox.org/onechannel"&gt;OneChannel website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://xmpp-sandbox.org/oc0.png"&gt;&lt;img alt="OneChannel Channels view" height="100" src="http://xmpp-sandbox.org/oc0t.png" style="display:inline;"/&gt;&lt;/a&gt; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://xmpp-sandbox.org/oc1.png"&gt;&lt;img alt="OneChannel Subscriptions" height="100" src="http://xmpp-sandbox.org/oc1t.png" style="display:inline;"/&gt;&lt;/a&gt; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://xmpp-sandbox.org/oc2.png"&gt;&lt;img alt="OneChannel Subscriptions" height="100" src="http://xmpp-sandbox.org/oc2t.png" style="display:inline;"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1260281796"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1260281796" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ucoXRid8RJA:BTU7YTRWLAQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ucoXRid8RJA:BTU7YTRWLAQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=ucoXRid8RJA:BTU7YTRWLAQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/ucoXRid8RJA" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/onechannel_a_desktop_publish_subscribe_client_for_instant_news_delivery/</link>
      <author>Marek Foss</author>
      <pubDate>Tue, 08 Dec 2009 06:16:36 GMT</pubDate>
    </item>
    <item>
      <title>RabbitMQ at the Skills Matter Functional Programming Exchange</title>
      <description>&lt;p&gt;Today I was lucky enough to give a talk at the &lt;a rel="nofollow" target="_blank" href="http://skillsmatter.com/event/cloud-grid/functional-programming-exchange-2009"&gt;Skills Matter Functional Programming Exchange&lt;/a&gt;. I talked about resource management in RabbitMQ and how we&amp;#8217;re improving this in upcoming versions of RabbitMQ. All the sessions were videotaped and it would seem that a podcast will be &lt;a rel="nofollow" target="_blank" href="http://skillsmatter.com/podcast/cloud-grid/supercharged-rabbit-resource-management-at-high-speed-in-erlang"&gt;going up shortly&lt;/a&gt;. In the mean time &lt;a rel="nofollow" target="_blank" href='http://www.lshift.net/blog/wp-content/uploads/2009/12/slides.pdf'&gt;you can have a look at the slides&lt;/a&gt; if you want to.&lt;/p&gt; &lt;p&gt;The attendance was really good and the talks well received. There was a good range of talks, from some very practical and pragmatic such as my own, to slightly more theoretical talks. It was great to see Haskell, Erlang and F# being discussed outside of a purely academic setting and great to see so many companies and organisations getting really interested in functional programming and coming along to see how other people were making the most of it.&lt;/p&gt; &lt;p&gt;The &lt;a rel="nofollow" target="_blank" href="http://skillsmatter.com/podcast/cloud-grid/parkbench-panel-discussion-1118"&gt;Park Bench&lt;/a&gt; session was also good fun, with a good range of questions and experience being demonstrated by all. A good, fun atmosphere, and I&amp;#8217;m sure all enjoyed the day.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1260211050"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1260211050" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=4_Vd_pw-jRs:qCr2vf6KZUY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=4_Vd_pw-jRs:qCr2vf6KZUY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=4_Vd_pw-jRs:qCr2vf6KZUY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/4_Vd_pw-jRs" height="1" width="1"/&gt;</description>
      <link>http://www.lshift.net/blog/2009/12/07/rabbitmq-at-the-skills-matter-functional-programming-exchange</link>
      <pubDate>Mon, 07 Dec 2009 10:37:30 GMT</pubDate>
    </item>
    <item>
      <title>Garbage Collection in Erlang</title>
      <description>&lt;p&gt;The new persister that is being developed for RabbitMQ is nearing completion and is currently working its way through code review and QA. It&amp;#8217;s being pretty thoroughly tested and generally stressed to see what could go wrong. One of the issues that we&amp;#8217;ve come across in the past has to do with Erlang&amp;#8217;s garbage collector: indeed there&amp;#8217;s code in at least one area of RabbitMQ written in a specific (and non-obvious) way in order to work around issues with Erlang&amp;#8217;s garbage collection of binary data.&lt;/p&gt; &lt;p&gt;We had noticed in the release notes for Erlang R13B03, that it mentions improvements to the garbage collector, and today when testing with both R13B02 and R13B03, we noticed substantial improvements with R13B03. The new persister is able to send out to disk partial queues. Thus a queue can have a mix of messages - some just in RAM, some just on disk, and some somewhere in between. This is separate from whether or not a message is marked persistent. The proportion pushed out to disk varies smoothly with the amount of RAM left available to Erlang: the idea is to avoid flooding the disk with enormous amounts of write requests which would potentially stall the queue, and cause blockages elsewhere in RabbitMQ.&lt;/p&gt; &lt;p&gt;The test I&amp;#8217;d written used the Erlang experimental client. It had one channel, it created a queue, consumed from the queue, set QoS prefetch count to 10, and then went into a loop. In this loop, it would publish two 1KB messages, then receive 1 message, and acknowledge it. This way the queue would always grow, and memory would be fairly fragmented (the gap from the head of the queue to the tail of the queue would increase steadily as the head is moving forwards at twice the rate of the tail). With no memory limit, I saw the following (I manually killed this after the queue grew to just over 350,000 messages long (which means 700,000 publishes, and 350,000 acknowledgements)):&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.lshift.net/blog/wp-content/uploads/2009/12/ramp.png'&gt;&lt;img src="http://www.lshift.net/blog/wp-content/uploads/2009/12/ramp.png" alt="Memory usage with no memory limit set" title="Memory usage with no memory limit set" width="500" height="350" class="aligncenter size-full wp-image-462"/&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Note that for R13B03, the garbage collector is much more active, and in general memory usage is certainly more fine-grained. In this test, all the messages were always in RAM, no messages were pushed out to disk. Flat-size refers to the value returned by pushing the queue state through erts-debug:flat-size/1 which returns the amount of memory used by the data structure.&lt;/p&gt; &lt;p&gt;Next, I imposed a limit of about 200MB and did the same test. With R13B02, it got stuck after just over 260,000 messages: it was no longer able to reclaim any further space, and so flow-control kicked in and stopped the publisher, game over. With R13B03 it soldiered merrily on - I ended up manually killing it somewhere past the 1million message mark as I was getting bored. It&amp;#8217;s also very clear to see how with R13B03, it successfully kicks down to pushing all the messages out to disk (which is why the size of the state suddenly gets very small - the memory growth from there on is due to an ets table). That&amp;#8217;s certainly still possible with R13B02, and I have seen that happen, but there&amp;#8217;s much greater risk, as seen here, of it getting stuck before that happens.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://www.lshift.net/blog/wp-content/uploads/2009/12/ramp2.png'&gt;&lt;img src="http://www.lshift.net/blog/wp-content/uploads/2009/12/ramp2.png" alt="Memory usage with 200MB limit" title="Memory usage with 200MB limit" width="500" height="350" class="aligncenter size-full wp-image-463"/&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In short, the garbage collector in R13B03 seems a solid improvement. Even if you&amp;#8217;re not using the experimental new persister, I suspect you&amp;#8217;ll gain from upgrading to R13B03. And yes, that really is 1-million 1KB messages successfully sent into a queue using under 200MB of RAM.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259627043"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259627043" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=WrljdPd8cfc:tfx7XljWWCI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=WrljdPd8cfc:tfx7XljWWCI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=WrljdPd8cfc:tfx7XljWWCI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/WrljdPd8cfc" height="1" width="1"/&gt;</description>
      <link>http://www.lshift.net/blog/2009/12/01/garbage-collection-in-erlang</link>
      <category>RabbitMQ</category>
      <pubDate>Mon, 30 Nov 2009 16:24:03 GMT</pubDate>
    </item>
    <item>
      <title>Introducing rabbitmq-status plugin</title>
      <description>&lt;p&gt;RabbitMQ is a becoming decent product, but it shares some of the common problems of young software - for example, beginners have a hard time understanding what happens under the hood. Don&amp;#8217;t get me wrong, Rabbit generally works perfectly as a black-box. But at some point, when things go wrong or when Rabbit needs to be added to a monitoring infrastructure, it becomes necessary to understand more about the internals. This is when things get difficult.&lt;/p&gt; &lt;p&gt;I was wondering how we could address this issue and decided that Rabbit should serve a simple &lt;b&gt;http status page&lt;/b&gt; similar to status pages that are known from &lt;a rel="nofollow" class="reference external" target="_blank" href="http://www.apache.org/server-status"&gt;Apache&lt;/a&gt; or &lt;a rel="nofollow" class="reference external" target="_blank" href="http://demo.1wt.eu/"&gt;Haproxy&lt;/a&gt; projects.&lt;/p&gt; &lt;p&gt;&lt;span id="more-459"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;A picture is worth a thousand words, so here’s the screenshot of rabbitmq-server in action:&lt;/p&gt; &lt;p&gt;&lt;img alt="http://dev.lshift.net/majek/status-page.png" src="http://dev.lshift.net/majek/status-page.png" width="680px"/&gt;&lt;/p&gt; &lt;p&gt;The status page shows memory, file descriptors and Erlang PIDS usage. You can also see basic information about connections and queues.&lt;/p&gt; &lt;div class="section" id="installation"&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;The installation is pretty straightforward. As with &lt;a rel="nofollow" class="reference external" target="_blank" href="http://www.rabbitmq.com/admin-guide.html#installing-plugins"&gt;other RabbitMQ plugins&lt;/a&gt;, all you need to do is grab the compiled .ez binaries, put them in the correct place and then run the command: &lt;em&gt;rabbitmq-activate-plugins&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" class="reference external" target="_blank" href="http://dev.lshift.net/majek/rabbitmq-status_1.7.0.tar.gz"&gt;Precompiled binaries are here&lt;/a&gt; (compiled using Erlang 5.6.3/R12B-3). They should work with &lt;a rel="nofollow" class="reference external" target="_blank" href="http://www.rabbitmq.com/releases/rabbitmq-server/v1.7.0/"&gt;RabbitMQ 1.7.0&lt;/a&gt; and &lt;a rel="nofollow" class="reference external" target="_blank" href="http://hg.rabbitmq.com/rabbitmq-server/archive/default.tar.bz2"&gt;the latest default mercurial branch&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Step-by-step install instructions, checked on my Ubuntu Karmic box, follow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;wget http://dev.lshift.net/majek/rabbitmq-status_1.7.0.tar.gz
tar xvzf rabbitmq-status_1.7.0.tar.gz
sudo mkdir /usr/lib/rabbitmq/lib/rabbitmq_server-1.7.0/plugins
sudo mv rabbitmq-mochiweb.ez mochiweb.ez rabbit_status.ez &lt;span style="color:#7f007f;"&gt;&amp;#92;&lt;/span&gt; /usr/lib/rabbitmq/lib/rabbitmq_server-1.7.0/plugins
sudo rabbitmq-activate-plugins
sudo /etc/init.d/rabbitmq-server restart
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt; &lt;div class="section" id="usage"&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;Once you&amp;#8217;re done with that, you should be able to access the local webserver under port 55672. You need to supply valid RabbitMQ username/password. The default URL should work in most cases: &lt;a rel="nofollow" class="reference external" target="_blank" href="http://guest:guest&amp;#64;127.0.0.1:55672/"&gt;http://guest:guest&amp;#64;127.0.0.1:55672/&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;You can also get raw data in JSON format:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;$ curl http://guest:guest@127.0.0.1:55672/json
{&lt;span style="color:#7f007f;"&gt;'bound_to'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'0.0.0.0:5672 '&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'datetime'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'Sun, 29 Nov 2009 19:40:22 GMT'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'fd_total'&lt;/span&gt;: 1024, &lt;span style="color:#7f007f;"&gt;'fd_used'&lt;/span&gt;: 31, &lt;span style="color:#7f007f;"&gt;'mem_binary'&lt;/span&gt;: 4317158, &lt;span style="color:#7f007f;"&gt;'mem_ets'&lt;/span&gt;: 1348072, &lt;span style="color:#7f007f;"&gt;'mem_total'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'unknown'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'mem_used'&lt;/span&gt;: 19856037, &lt;span style="color:#7f007f;"&gt;'pid'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'24561'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'proc_total'&lt;/span&gt;: 32768, &lt;span style="color:#7f007f;"&gt;'proc_used'&lt;/span&gt;: 118, &lt;span style="color:#7f007f;"&gt;'connections'&lt;/span&gt;: [{&lt;span style="color:#7f007f;"&gt;'address'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'127.0.0.1'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'channels'&lt;/span&gt;: 1, &lt;span style="color:#7f007f;"&gt;'frame_max'&lt;/span&gt;: 131072, &lt;span style="color:#7f007f;"&gt;'peer_address'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'127.0.0.1'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'peer_port'&lt;/span&gt;: 53700, &lt;span style="color:#7f007f;"&gt;'pid'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'&amp;lt;0.1052.0&amp;gt;'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'port'&lt;/span&gt;: 5672, &lt;span style="color:#7f007f;"&gt;'recv_cnt'&lt;/span&gt;: 3271, &lt;span style="color:#7f007f;"&gt;'recv_oct'&lt;/span&gt;: 819137, &lt;span style="color:#7f007f;"&gt;'send_cnt'&lt;/span&gt;: 45, &lt;span style="color:#7f007f;"&gt;'send_oct'&lt;/span&gt;: 60139, &lt;span style="color:#7f007f;"&gt;'send_pend'&lt;/span&gt;: 0, &lt;span style="color:#7f007f;"&gt;'state'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'running'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'timeout'&lt;/span&gt;: 0, &lt;span style="color:#7f007f;"&gt;'user'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'guest'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'vhost'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'/'&lt;/span&gt;}, ...], &lt;span style="color:#7f007f;"&gt;'queues'&lt;/span&gt;: [{&lt;span style="color:#7f007f;"&gt;'acks_uncommitted'&lt;/span&gt;: 0, &lt;span style="color:#7f007f;"&gt;'arguments'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'[]'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'auto_delete'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'false'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'consumers'&lt;/span&gt;: 1, &lt;span style="color:#7f007f;"&gt;'durable'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'true'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'memory'&lt;/span&gt;: 371896, &lt;span style="color:#7f007f;"&gt;'messages'&lt;/span&gt;: 501, &lt;span style="color:#7f007f;"&gt;'messages_ready'&lt;/span&gt;: 500, &lt;span style="color:#7f007f;"&gt;'messages_unacknowledged'&lt;/span&gt;: 1, &lt;span style="color:#7f007f;"&gt;'messages_uncommitted'&lt;/span&gt;: 0, &lt;span style="color:#7f007f;"&gt;'name'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'b'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'pid'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'&amp;lt;0.1069.0&amp;gt;'&lt;/span&gt;, &lt;span style="color:#7f007f;"&gt;'transactions'&lt;/span&gt;: 0, &lt;span style="color:#7f007f;"&gt;'vhost'&lt;/span&gt;: &lt;span style="color:#7f007f;"&gt;'/'&lt;/span&gt;}, &amp;#8230;]} &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The plugin is beta quality and is tested only on Linux.
Leave us a feedback if you found it useful or if you have any comments.&lt;/p&gt;
&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259603870"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259603870" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=1E1sXEhLSvY:m2Zd28klKFU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=1E1sXEhLSvY:m2Zd28klKFU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=1E1sXEhLSvY:m2Zd28klKFU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/1E1sXEhLSvY" height="1" width="1"/&gt;</description>
      <link>http://www.lshift.net/blog/2009/11/30/introducing-rabbitmq-status-plugin</link>
      <category>Technology</category>
      <pubDate>Mon, 30 Nov 2009 09:57:50 GMT</pubDate>
    </item>
    <item>
      <title>New teeterl; 4x faster</title>
      <description>&lt;div style="text-align:justify;"&gt;Three months ago I decided to give teeterl a once over. The goal was to make it faster, order of magnitude faster. Today, the new teeterl version has become mature enough to run estone_SUITE and produce meaningful performance measurement printout. The result: it is almost 4 times faster than earlier teeterl. Not 10x, but definitely on the right track. BEAM is still a distant performance star boasting more than 2 times more estones.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;The new version of teeterl has a goodish bit under the hood. The most noticeable are the new partial, generation-aware garbage collector and the fact that teeterl VM is now register-based.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;The new teeterl can not do much more than run a few test suites now. Nevertheless I will release the source of github as soon I figure out how to push it into existing 'teeterl' repo without destroying the previous version.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&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/1008786629149528709-5756571995550436060?l=taooferlang.blogspot.com' alt=''/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259478480"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259478480" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=Ie78bck5PJk:GnKjq8z658I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=Ie78bck5PJk:GnKjq8z658I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=Ie78bck5PJk:GnKjq8z658I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/Ie78bck5PJk" height="1" width="1"/&gt;</description>
      <link>http://taooferlang.blogspot.com/2009/11/new-teeterl-4x-faster.html</link>
      <author>Max Kharchenko</author>
      <pubDate>Sat, 28 Nov 2009 23:08:00 GMT</pubDate>
    </item>
    <item>
      <title>stdin/stdout in Erlang</title>
      <description>&lt;div style="text-align:justify;"&gt;Erlang blogs and message boards are littered with messages expressing dissatisfaction with Erlang syntax, the language's handling of strings, verbosity of records etc. Members of the discontented crowd usually stop short when specifics are requested. I will try to make my small rant about Erlang as specific as possible.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;My grudge is about stdin/stdout. Why would modern software need these? Existence of stdin/stdout assumes that Erlang is started from a text-based shell. These days it usually not the case. Why io:format() pretty-printing is crafted to output text on a screen of 80 columns? Erlang is all about non-blocking input/output and then there is io:get_line() getting text from nowhere. I am aware of Elang's telecom heritage and RS-232 interface. But this kind of thing definitely slows the adoption of Erlang in today's world of World-Wide Web.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;The new version of teeterl does not have io module as it does not have stdin/stdout concept. On the other hand the new teeterl has had an embedded web server with comet functionality from day one. All input/output in the new teeterl is done through a socket and HTTP. Instead of io:format() there is format:to_json() call and all actual formatting including pretty-printing is done on the client side with jQuery/Javascript. Well, a printout still may appear on stderr but only as an epitaph on the tomb of init process.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&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/1008786629149528709-7074853404013842309?l=taooferlang.blogspot.com' alt=''/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259478360"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259478360" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=trjbU5lwHUw:HBMe6b5-4EI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=trjbU5lwHUw:HBMe6b5-4EI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=trjbU5lwHUw:HBMe6b5-4EI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/trjbU5lwHUw" height="1" width="1"/&gt;</description>
      <link>http://taooferlang.blogspot.com/2009/11/stdinstdout-in-erlang.html</link>
      <author>Max Kharchenko</author>
      <pubDate>Sat, 28 Nov 2009 23:06:00 GMT</pubDate>
    </item>
    <item>
      <title>Laying out VM vitals</title>
      <description>&lt;div style="text-align:justify;"&gt;The teeterl's &lt;a rel="nofollow" target="_blank" href="http://taooferlang.blogspot.com/2009/04/teeterls-performance-more-than-modest.html"&gt;poor performance&lt;/a&gt; felt like a cold shower to me. And at the opportune moment I decided to have a closer look at why it is so bad. By then I had a scaffold implementation of a register-based teeterl VM. The new version was already churning out primes numbers in spadefuls without a hitch. But I decided to take two steps back and measure if the decisions I made were of any merit. It happened many of them did more harm than good.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;For about a week I was rewriting my shiny new VM into a new application, cleverly named &lt;span style="font-style:italic;"&gt;teepad&lt;/span&gt;, that was doing nothing but creating random stack frames, touching various memory locations, allocating chunks of memory from the heap, a dispatching random instructions from a dozens of garbage modules. It weighs heavily on a fellow's mind to write a simulation software of the sort. When someone laboriously develop a sizable do-nothing system for a long time, thoughts start to creep in. I am lucky it did not take too long. Now I have speed readings of the garbage mincer and can make a few observations.&lt;/div&gt;&lt;div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;Do not reenter VM's main function&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align:justify;"&gt;As everybody knows the main function of a VM is where the huge switch statement is. I was toying with the idea of reentering the routine on every Erlang function call. Thus register values will be instantaneously back to existence after return. Well, Erlang process should yield from time to time, and I added a separate stack which was filled in when the process was yielding. Boy, it is probably the worst stack management scheme out there. &lt;i&gt;teepad&lt;/i&gt; was able to dispatch 2.5 times more commands if such nastiness is avoided.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;Keep the number of opcodes moderate&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align:justify;"&gt;With &lt;i&gt;teepad &lt;/i&gt;it was possible to boost the number of different opcodes to a sizable number increasing the number of cases in the master switch statement accordingly. I thought it would be neat to have an opcode for, say, 'move r1, r2' and another opcode for 'move r2, r3'. I was quite wrong again. &lt;i&gt;teepad &lt;/i&gt;experiments showed that twice as many opcodes means 15% less throughput, 5 times - shaves 25% from performance.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;Packing/unpacking of arguments does not matter&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align:justify;"&gt;These days of multi-layered caches you may do any number of bitwise operations on a value already retrieved from memory. Take highest 6 bits, mask out 3 lower bits, add 7 to the result, do it on every dispatch and you won't tax your performance noticeably. Bitwise operations help to reduce the memory footprint of a VM and thus stimulate a better cache behavior that more than offset the additional CPU cycles burn of bit fiddling.&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;More details for someone who care&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. Instruction set generated from the types below:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="text-align:left;"&gt;Type&lt;/th&gt;&lt;th&gt;Prob&lt;/th&gt;&lt;th&gt;#variants&lt;/th&gt;&lt;th&gt;#args&lt;/th&gt;&lt;th style="text-align:left;"&gt;Options&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;test&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.2&lt;/td&gt;&lt;td style="text-align:right;"&gt;10&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-3&lt;/td&gt;&lt;td&gt;[branches]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;enter&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.05&lt;/td&gt;&lt;td style="text-align:right;"&gt;1&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-1&lt;/td&gt;&lt;td&gt;[reduce,jumps]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;enterf&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.01&lt;/td&gt;&lt;td style="text-align:right;"&gt;2&lt;/td&gt;&lt;td style="text-align:center;"&gt;3-4&lt;/td&gt;&lt;td&gt;[reduce,jumps,intermodule]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;call&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.02&lt;/td&gt;&lt;td style="text-align:right;"&gt;1&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-1&lt;/td&gt;&lt;td&gt;[reduce,calls]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;callf&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.01&lt;/td&gt;&lt;td style="text-align:right;"&gt;2&lt;/td&gt;&lt;td style="text-align:center;"&gt;3-4&lt;/td&gt;&lt;td&gt;[reduce,calls,intermodule]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;bif&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.01&lt;/td&gt;&lt;td style="text-align:right;"&gt;8&lt;/td&gt;&lt;td style="text-align:center;"&gt;2-3&lt;/td&gt;&lt;td&gt;[reduce,heap]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;move&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.3&lt;/td&gt;&lt;td style="text-align:right;"&gt;10&lt;/td&gt;&lt;td style="text-align:center;"&gt;0-2&lt;/td&gt;&lt;td&gt;[]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;make&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.1&lt;/td&gt;&lt;td style="text-align:right;"&gt;10&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-3&lt;/td&gt;&lt;td&gt;[heap]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;select&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.1&lt;/td&gt;&lt;td style="text-align:right;"&gt;5&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-3&lt;/td&gt;&lt;td&gt;[heap]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;compute&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.1&lt;/td&gt;&lt;td style="text-align:right;"&gt;20&lt;/td&gt;&lt;td style="text-align:center;"&gt;2-3&lt;/td&gt;&lt;td&gt;[]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;apply&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.01&lt;/td&gt;&lt;td style="text-align:right;"&gt;2&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-2&lt;/td&gt;&lt;td&gt;[reduce,jumps]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;'receive'&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.001&lt;/td&gt;&lt;td style="text-align:right;"&gt;1&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-1&lt;/td&gt;&lt;td&gt;[yields,messages]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;error&lt;/td&gt;&lt;td style="text-align:right;"&gt;0.0001&lt;/td&gt;&lt;td style="text-align:right;"&gt;1&lt;/td&gt;&lt;td style="text-align:center;"&gt;1-1&lt;/td&gt;&lt;td&gt;[exits]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align:justify;"&gt;Implementation of each opcode is randomly generated using Options column, e.g. 'receive' instruction has 1 variant and appears once per each 1000 instructions. Its implementation may include unpacking its arguments, touching the mailbox memory and faking a context switch.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align:justify;"&gt;2. Modules are generated from instruction set using probabilities of commands of given type&lt;/div&gt;&lt;div&gt;&lt;br /&gt;# of modules is 10.&lt;br /&gt;Module size ranges between 1000 and 100000.&lt;br /&gt;Reductions before yield is, obviously, 1000.&lt;br /&gt;Instruction arguments are packed (4 arguments into 1 word).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align:justify;"&gt;3. Generated program is compiled, run for 5sec and the number of instructions dispatched is reported.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:justify;"&gt;The source code of &lt;i&gt;teepad&lt;/i&gt; and raw measurement data are gladly provided upon an e-mail inquiry.&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/1008786629149528709-5963679674699885637?l=taooferlang.blogspot.com' alt=''/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259477640"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259477640" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=pFcsPZmhBbk:xvEg7fBufF8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=pFcsPZmhBbk:xvEg7fBufF8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=pFcsPZmhBbk:xvEg7fBufF8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/pFcsPZmhBbk" height="1" width="1"/&gt;</description>
      <link>http://taooferlang.blogspot.com/2009/11/laying-out-vm-vitals.html</link>
      <author>Max Kharchenko</author>
      <pubDate>Sat, 28 Nov 2009 22:54:00 GMT</pubDate>
    </item>
    <item>
      <title>Python web app as an egg with Paste, Fabric and Spawning</title>
      <description>&lt;p&gt;
One of the major success of PHP is how easily you can deploy PHP applications. Thanks mod_php for that. Python or Ruby requires quite more work even though it’s not that painful if your using something like &lt;a rel="nofollow" target="_blank" href="http://www.modrails.com/" hreflang="en"&gt;Passenger with Ruby&lt;/a&gt;. I’m still looking for a way that I find brilliant. So I played with &lt;a rel="nofollow" target="_blank" href="http://pythonpaste.org/" hreflang="en"&gt;Paste&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://pypi.python.org/pypi/Spawning" hreflang="en"&gt;Spawning&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://peak.telecommunity.com/DevCenter/setuptools" hreflang="en"&gt;setuptools&lt;/a&gt; to build a very minimalist &lt;a rel="nofollow" target="_blank" href="http://yoan.dosimple.ch/blog/2009/01/31/" hreflang="en" title="Playing with Middlewares"&gt;WSGI application&lt;/a&gt; you deploy without any pain using &lt;a rel="nofollow" target="_blank" href="http://fabfile.org" hreflang="en"&gt;Fabric&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Before we start, you can find the code bellow on &lt;a rel="nofollow" target="_blank" href="http://gist.github.com/235338" hreflang="en"&gt;GitHub&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
First the &lt;code&gt;setup.py&lt;/code&gt; file that describe our application:
&lt;/p&gt;&lt;pre&gt;from setuptools import setup, find_packages setup(name="app", version="0.1", description="example application", long_description="", keywords="", author="Yoan Blanc", author_email="yoan.at.dosimple.ch", url="http://yoan.dosimple.ch/blog/", license=’All rights reserved’, packages=find_packages(), zip_safe=False, install_requires=[], entry_points={"paste.app_factory": ["main=app:make_app"]}, )&lt;/pre&gt;&lt;p&gt;
It’s all standard except the entry point called &lt;code&gt;paste.app_factory&lt;/code&gt; that will be used by Paste to create the WSGI application. For the Djangoist here, Paster acts like your &lt;code&gt;manage.py&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;
Make the &lt;a rel="nofollow" target="_blank" href="http://wsgi.org" hreflang="en"&gt;WSGI&lt;/a&gt; application itself, into &lt;code&gt;app/__init__.py&lt;/code&gt;:
&lt;/p&gt;&lt;pre&gt;def application(environ, start_response): start_response("200 OK", [("Content-Type", "text/html")]) return ["&amp;lt;h1&amp;gt;Hello World!&amp;lt;/h1&amp;gt;"]&lt;/pre&gt;&lt;p&gt;
And the factory (called &lt;code&gt;make_app&lt;/code&gt; inside &lt;code&gt;setup.py&lt;/code&gt;) is required as well in the same file.
&lt;/p&gt;&lt;pre&gt;def make_app(global_conf, **app_conf): return application&lt;/pre&gt;&lt;p&gt;
Now, you might be wondering how this make_app is called. Paste works with &lt;em&gt;ini&lt;/em&gt; files that decribe your configuration, from the app your using to the database, the server, logs, and so on. It’s very handy to replicate the same kind of environment you find when working with Ruby on Rails by having different ini files for each.
&lt;/p&gt;&lt;p&gt;
So there is the &lt;code&gt;app.ini&lt;/code&gt;:
&lt;/p&gt;&lt;pre&gt;[app:main]
use = egg:app [server:main]
use = egg:Spawning
host = 127.0.0.1
port = 8000
num_processes = 1
threadpool_workers = 1&lt;/pre&gt;&lt;p&gt;
The first section describes the application to use. It’s the egg that setuptools will create and install. That’s right, your application is exactily like any other python package. It means dependencies resolution, updates,… And the second part describe which server paster will have to use to run it. Spawning is a very efficient server that handles graceful code reloading. Pure happiness.
&lt;/p&gt;&lt;p&gt;
Before you can run it using :
&lt;/p&gt;&lt;pre&gt;$ paster serve app.ini&lt;/pre&gt;&lt;p&gt;
You’ll have to install it.
&lt;/p&gt;&lt;pre&gt;# python setup.py develop&lt;/pre&gt;&lt;p&gt;
&lt;code&gt;develop&lt;/code&gt; means it symlinks the package to your directory and you won’t have to reinstall it later to take into account the changes made.
&lt;/p&gt;&lt;p&gt;
It should run just perfectly. Now let’s worry about deploying it somewhere else. Local web applications are nice but sharing them is cool too.
&lt;/p&gt;&lt;p&gt;
This is the &lt;code&gt;fabfile.py&lt;/code&gt;, Fabric is more or less like &lt;a rel="nofollow" target="_blank" href="http://www.capify.org/" hreflang="en"&gt;Capistrano&lt;/a&gt; (Ruby):
&lt;/p&gt;&lt;pre&gt;from __future__ import with_statement
from fabric.api import env, run, put, local, cd env.hosts = ["localhost"]
env.path = "~/www/app" def build_egg(): local("python setup.py bdist_egg") def cleanup(): local("rm -rf build") local("rm -rf dist") def start(): with cd(env.path): run("PYTHONPATH=app.egg paster serve app.ini" "--daemon --pid-file=app.pid") def stop(): with cd(env.path): run("paster serve --stop-daemon " "--pid-file=app.pid") def deploy(): build_egg() put("app.ini", env.path) put("dist/*.egg", env.path+"/app.egg") cleanup()&lt;/pre&gt;&lt;p&gt;
A pythonic Makefile, more or less that has special power to deal with deployment. This how you can use it.
&lt;/p&gt;&lt;pre&gt;$ fab deploy
$ fab start&lt;/pre&gt;&lt;p&gt;
It created a .egg, uploaded it to the destination and started the Spawning server using Paster. It will run on the port &lt;code&gt;8080&lt;/code&gt;, to see it on the port 80 I’d use something like &lt;a rel="nofollow" target="_blank" href="http://nginx.net/" hreflang="en"&gt;Nginx&lt;/a&gt; as a proxy. But it’s a different story (and very simple by the way).
&lt;/p&gt;&lt;p&gt;
After you made some changes simple run:
&lt;/p&gt;&lt;pre&gt;$ fab deploy&lt;/pre&gt;&lt;p&gt;
to see them live.
&lt;/p&gt;&lt;pre&gt;$ fab stop&lt;/pre&gt;&lt;p&gt;
Will stop the server.
&lt;/p&gt;&lt;p&gt;
How awesome is that?
&lt;/p&gt;&lt;p&gt;
There is a lot more that can be done regarding how you’re playing with the eggs. Using &lt;a rel="nofollow" target="_blank" href="http://pypi.python.org/pypi/virtualenv" hreflang="en"&gt;virtualenv&lt;/a&gt; to keep multiple, sane environments and maybe your own cheeseshop where all your eggs can live (see &lt;a rel="nofollow" target="_blank" href="http://github.com/ask/chishop" hreflang="en"&gt;Ask’s Chishop&lt;/a&gt;)
&lt;/p&gt;&lt;p&gt;
I’m very fresh on that field but am very happy seeing that such good tools exist. Please share your experience, I’m looking forward knowing what kind of process is used in the real word out there to.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;
La force de PHP est et a été sa facilité de déploiement, on dépose un fichier et c’est parti mon kiki. Merci Apache + mod_php. Scénario pas toujours aussi simple dans les autres environnements d’applications web (si je mets de côté tout ce qui est CGI bien évidemment). Pour avoir bossé dans un environnement Ruby on Rails ces six derniers mois, un serveur fonctionnant sous Passenger est assez simple par rapport à ça. Recherchant toujours comment mettre ceci en place dans le monde Python, voici une approche assez minimaliste (certainement trop) pour déployer une application WSGI sous forme de paquet Python via Paster, Spawning et Fabric.
&lt;/p&gt;&lt;p&gt;
Ne voulant polluer cet espace-là, merci de regarder les exemples de code dans la zone anglophone. Ils sont également disponible sur &lt;a rel="nofollow" target="_blank" href="http://gist.github.com/235338" hreflang="en"&gt;GitHub&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Si Ruby a les gems, Python a les eggs (bien que certains Python soient ovovivipares) centralisés sur PyPI. Les avantages que je vois à créer un paquet pour son application est tout ce qui vient avec setuptools (et ses alternatives), c’est-à-dire : gestion des dépendances, exclusion des tests (et de leurs dépendances), versions, et certainement séparation en de multiple paquets.
&lt;/p&gt;&lt;p&gt;
Une fois le fichier setup.py créé, il va s’agir d’écrire un application web Python, ici WSGI mais il y a pas que ça et ça devrait couvrir 98% des besoins.
&lt;/p&gt;&lt;p&gt;
Ian Bicking a mis au point un système d’outils plus ou moins lié à WSGI nommé Paste qui permet de configurer et lancer une application web via des fichier de configuration INI (quand on est cool on fait du YAML parait-il). Paste requiert qu’on lui fournisse une méthode retournant une application WSGI, cette méthode dite fabrique, reçoit tous les éléments de configuration du fichier .ini. Chose très pratique afin d’avoir divers environnements tel que Ruby on Rails le pratique, comme : développement, test, production. Libre à chacun de faire comme il l’entend.
&lt;/p&gt;&lt;p&gt;
Le fichier .ini en question définit le paquet Python de nombre application et le serveur web à utiliser, ici Spawning qui a la force de se recharger automatiquement en cas de modification de fichiers détectée.
&lt;/p&gt;&lt;p&gt;
Travaillant avec un paquet, il est nécessaire de l’installer avant de pouvoir s’en servir. L’installation avec develop crée un lien symbolique où les modifications seront prises en compte sans devoir réinstaller.
&lt;/p&gt;&lt;p&gt;
Vous devriez pouvoir visualer ce hello world sur le port 8080 de votre machine.
&lt;/p&gt;&lt;p&gt;
Dernière étape, la plus intéressante peut-être, déployer votre application sur une machine distante, même si distante signifie localhost c’est pour l’exercice.
&lt;/p&gt;&lt;p&gt;
Si Ruby a Capistrano (et d’autres), Python lui a Fabric qui peut être vu comme un makefile pythonique avec des super pouvoirs lié à SSH.
&lt;/p&gt;&lt;p&gt;
Le fichier donné ici permet de créer le fichier .egg, de l’envoyer sur l’autre machine (votre serveur) via &lt;code&gt;deploy&lt;/code&gt;, puis de le démarrer avec &lt;code&gt;start&lt;/code&gt;. Tous les autres &lt;code&gt;deploy&lt;/code&gt;’s ne demanderont pas de redémarrage puisque Spawning s’occupe de ça directement. Une fois que vous en avez terminé, un simple stop l’arrêtera. Je trouve judicieux de lancer les applications en tant que simple utilisateur sur un port comme 8080. Il est quand même de bon ton d’avoir un véritable serveur web tel que Apache, &lt;a rel="nofollow" target="_blank" href="http://www.lighttpd.net/" hreflang="en"&gt;Lighty&lt;/a&gt; ou Nginx servant de proxy vers votre application et s’occupant de tous les fichiers statiques par la même.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;In fine&lt;/em&gt;, la solution de l’egg exécuté tel quel est un peu brutale. Je vous invite à vous pencher vers virtualenv et &lt;a rel="nofollow" target="_blank" href="http://github.com/ask/chishop" hreflang="en"&gt;Chishop&lt;/a&gt;. Et recherchant toujours une bonne manière de combiner tout ceci, vos solutions m’intéressent.
&lt;/p&gt;&lt;p&gt;
Bien du plaisir!
&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259410980"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259410980" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=92atqzRxKwQ:Wi1CEnufZUs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=92atqzRxKwQ:Wi1CEnufZUs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=92atqzRxKwQ:Wi1CEnufZUs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/92atqzRxKwQ" height="1" width="1"/&gt;</description>
      <link>http://yoan.dosimple.ch/blog/2009/11/28</link>
      <category>Fabric Paster Python Spawning WSGI</category>
      <pubDate>Sat, 28 Nov 2009 04:23:00 GMT</pubDate>
    </item>
    <item>
      <title>OneWeb demonstrates the power of XMPP inside the browser</title>
      <description>&lt;p&gt;We have just released an experimental extension for Firefox that adds XMPP interactions to the Mozilla browser.&lt;/p&gt; &lt;p&gt;OneWeb Firefox extension is a good exemple of Firefox &lt;a rel="nofollow" target="_blank" href="http://hacks.mozilla.org/"&gt;&lt;em&gt;hackability&lt;/em&gt;&lt;/a&gt; and shows how XMPP integration in the browser can bring value for real-time web interactions.&lt;/p&gt;
&lt;p&gt;XMPP stands for eXtensible Messaging and Presence Protocol. The protocol is mostly known as an Instant Messaging protocol, but it has actually been designed as a generic messaging protocol that can do much more that chat. OneWeb Firefox extension demonstrates a small part of what you can do when you integrate XMPP by design into the browser behaviour.&lt;/p&gt;
&lt;p&gt;Note that this is an early alpha version developed in a few days to demonstrate our purpose. There is still room for many improvements and contributions are of course welcome.&lt;/p&gt;
&lt;h1&gt;Description&lt;/h1&gt;
&lt;p&gt;OneWeb alpha version is able to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It gives an interface to &lt;strong&gt;interact&lt;/strong&gt; remotely with your opened Firefox browser. You can interact with opened Firefox from another browser running OneWeb or from an XMPP instant messaging client (supporting adhoc commands). You can thus control your Firefox browser from your desktop or even from a mobile device.&lt;/li&gt;
&lt;li&gt;It gives a way to &lt;strong&gt;share&lt;/strong&gt; and &lt;strong&gt;broadcast&lt;/strong&gt; your favorite pages with your contact on your XMPP account. Simply click "Share page" in contextual menu and a shared bookmark will be created, distributed to your contact and notified by their OneWeb plugin.&lt;/li&gt;
&lt;li&gt;It can &lt;strong&gt;synchronize&lt;/strong&gt; your bookmarks with your other Firefox browsers. This feature is experimental. Backup your bookmark before installing OneWeb on your Firefox.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Video&lt;/h1&gt;
&lt;p align="center"&gt;
 
 
 
 
 
&lt;/p&gt;
&lt;h1&gt;Download&lt;/h1&gt;
&lt;p&gt;The module can be &lt;a rel="nofollow" target="_blank" href="http://process-one.net/downloads/labs/oneweb/oneweb-1.0.71.xpi"&gt;downloaded from ProcessOne Labs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Code source is &lt;a rel="nofollow" target="_blank" href="http://process-one.net/downloads/labs/oneweb/oneweb-1.0.71.tar.gz"&gt;available on ProcessOne Labs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You need an XMPP account to test this software but you can get a development XMPP account for free on our &lt;a rel="nofollow" target="_blank" href="http://www.xmpp-sandbox.org"&gt;XMPP Sandbox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: We recommand you to use the XMPP Sandbox for ease of use. Your XMPP server needs supports for Pubsub and PEP which is not a common feature.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259244029"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1259244029" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=_A46u9TUQAs:aT-nWtSnMtI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=_A46u9TUQAs:aT-nWtSnMtI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=_A46u9TUQAs:aT-nWtSnMtI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/_A46u9TUQAs" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/oneweb_demonstrates_the_power_of_xmpp_inside_the_browser/</link>
      <author>Mickaël Rémond</author>
      <pubDate>Thu, 26 Nov 2009 06:00:29 GMT</pubDate>
    </item>
    <item>
      <title>The Tutorials are available form the successful Property-based Testing Tutorial Workshop 2009</title>
      <description>After the successful &lt;a rel="nofollow" target="_blank" href="http://www.erlang-factory.com/conference/testingtutorialworkshop"&gt;Property-based Testing Tutorial Workshop 2009 in Stockholm&lt;/a&gt; all the ProTest related &lt;span style="font-weight:bold;"&gt;tutorials - &lt;/span&gt;including &lt;span style="font-weight:bold;"&gt;Exago&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;Inviso/Onviso&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;McErlang&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;PULSE&lt;/span&gt;, &lt;span style="font-weight:bold;"&gt;QuickCheck&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;Wrangler - &lt;/span&gt;&lt;span style="font-weight:bold;"&gt;are now available online! &lt;/span&gt;You can find them&lt;span style="font-weight:bold;"&gt; &lt;/span&gt;on the &lt;a rel="nofollow"&gt;Tutorials page.&amp;nbsp;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258934400"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258934400" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=JqOZzrWHiAQ:ofZewFYqJ7E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=JqOZzrWHiAQ:ofZewFYqJ7E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=JqOZzrWHiAQ:ofZewFYqJ7E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/JqOZzrWHiAQ" height="1" width="1"/&gt;</description>
      <link>http://www.protest-project.eu/news.html#105</link>
      <category>News</category>
      <pubDate>Sun, 22 Nov 2009 16:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Take ProTest Tools Survey and win Erlang Programming book!</title>
      <description>&lt;title&gt;&lt;/title&gt;&lt;style type="text/css"&gt;&lt;!-- _filtered {margin:2cm;}P {margin-bottom:0.21cm;}H3 {margin-bottom:0.21cm;}H3.cjk {font-family:"Arial", sans-serif;}H3.ctl {font-family:"Arial", sans-serif;}A:link {}--&gt;  &lt;/style&gt;&lt;p class="western" style="margin-bottom:0cm;"&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT217"&gt; &lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT218"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT219"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT220"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT221"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT222"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT223"&gt;&lt;/a&gt;&lt;a rel="nofollow" name="OBJ_PREFIX_DWT224"&gt;&lt;/a&gt;
I&lt;span style=""&gt;t's been two years since &lt;/span&gt;&lt;font color="#000080"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a rel="nofollow"&gt;ProTest&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/font&gt;
&lt;span style=""&gt;- an EU funded research project on
property based testing and test driven development - was established.
We would like to sum it up and therefore we need &lt;/span&gt;&lt;b&gt;YOUR&lt;/b&gt;&lt;span style=""&gt;
feedback!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom:0cm;"&gt;&lt;span style=""&gt;Have you heard about Exago, McErlang, Onviso, PULSE,
QuickCheck or Wrangler? &amp;nbsp;Are you using any of these tools?&amp;nbsp;&lt;br&gt;By
answering these and other questions, you will help influence the
research and dissemination strategies for the next two years. Filling
the survey in should not take longer than 15 minutes. Its results
will be presented at Erlang conferences and workshops and made public
on the &lt;/span&gt;&lt;font color="#000080"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a rel="nofollow"&gt;ProTest
website&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style=""&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom:0cm;"&gt;&lt;span style=""&gt;What's more, all participants are entered into a FREE PRIZE DRAW to
win one each of three '&lt;/span&gt;&lt;font color="#000080"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a rel="nofollow" target="_blank" href="http://oreilly.com/catalog/9780596518189"&gt;Erlang
Programming&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style=""&gt;'
books by Francesco Cesarini and Simon Thompson. So please, by Monday
&lt;/span&gt;&lt;b&gt;14th December&lt;/b&gt;&lt;span style=""&gt; take
our survey!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom:0cm;"&gt;&lt;span style=""&gt;It is available &lt;/span&gt;&lt;font color="#000080"&gt;&lt;span lang="zxx"&gt;&lt;u&gt;&lt;a rel="nofollow" target="_blank" href="http://surveys.erlang-consulting.com/index.php?sid=87283&amp;amp;lang=en"&gt;here&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/font&gt;
&lt;span style=""&gt;in the traditional web-based form,
you can also take it via IM - &amp;nbsp;just add:
survey@bot.surveys.erlang-consulting.com to your Jabber buddies and
enter "&lt;/span&gt;&lt;b&gt;start&lt;/b&gt;&lt;span style=""&gt;".
If you have any queries, do not hesitate to contact Aniko on
aniko@erlang-consulting.com.&lt;/span&gt;&lt;/p&gt;
&lt;p class="western" style="margin-bottom:0cm;"&gt;&lt;b&gt;We appreciate your time and
willingness to help us!&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258934400"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258934400" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=pRoI2Id8lP4:O2jduizNX3k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=pRoI2Id8lP4:O2jduizNX3k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=pRoI2Id8lP4:O2jduizNX3k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/pRoI2Id8lP4" height="1" width="1"/&gt;</description>
      <link>http://www.protest-project.eu/news.html#106</link>
      <category>News</category>
      <pubDate>Sun, 22 Nov 2009 16:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Loving Clojure</title>
      <description>&lt;div class='snap_preview'&gt;&lt;br /&gt;&lt;p&gt;I seem to be liking Clojure &amp;#8230;&lt;/p&gt;
&lt;p&gt;Let me backup a bit, in the last couple of weeks I have been debating between picking up Scala or Clojure (don&amp;#8217;t get me wrong Ruby is still my favorite).&lt;/p&gt;
&lt;p&gt;I always wanted to pick up a functional programming language so I dabbled a bit with Erlang and Haskell, liked Haskell a lot but without much practice it kind of died (sad times) and Scala seems too much like Java, yeah I know it seems to have a bigger crowd than Clojure and there are a lot of big names behind it.&lt;/p&gt;
&lt;p&gt;Maybe that&amp;#8217;s exactly why I choose Clojure (since its the underdog), or cause it is different enough from Java or simply cause it has a better syntax and seems more elegant (apparently Clojure has better integration with Java, don&amp;#8217;t quote me on it), anyways I decided to learn Clojure.&lt;/p&gt;
&lt;p&gt;Peepcode has a nice &lt;a rel="nofollow" target="_blank" href="http://peepcode.com/products/functional-programming-with-clojure"&gt;screen-cast&lt;/a&gt; to get you started off on Clojure. If you are on the Mac there is a nice &lt;a rel="nofollow" target="_blank" href="http://github.com/nullstyle/clojure-tmbundle"&gt;bundle&lt;/a&gt; for TextMate and anywhere else Netbeans with the &lt;a rel="nofollow" target="_blank" href="http://enclojure.org/"&gt;enclojure&lt;/a&gt; plugin seems to be the best.&lt;/p&gt;
&lt;p&gt;On a side note it seems more and more that Netbeans has the latest and greatest plugins for everything, then comes IntelliJ and finally eclipse, what&amp;#8217;s going on with eclipse ? has it reached its peak and now it will start dropping off ? but on the flip side there seems to be more and more apps built on top of the Eclipse RCP like Xmind, so is Eclipse no longer going to be the leader of the IDE and just become a platform for building RCPs. This of course depends on what Oracle is going to do with NetBeans, I really hope they give the same amount of love to NetBeans as Sun did.&lt;/p&gt;
&lt;p&gt;Ok getting back to Clojure, don&amp;#8217;t get your panties in a bunch when you see all those parenthesis, it is just the layout that is shocking, indent it well and it is no more than what you are used to.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an example&lt;br /&gt;
(defn fac&lt;br /&gt;
"Returns the factorial of n, which must be a positive integer."&lt;br /&gt;
[n]&lt;br /&gt;
(if (= n 1)&lt;br /&gt;
1&lt;br /&gt;
(* n (fac (- n 1)))&lt;br /&gt;
)&lt;br /&gt;
Is same as&lt;br /&gt;
(defn fac [n] (if (= n 1) 1 (* n (fac (- n 1)))))&lt;br /&gt;
But the first one is a lot more easier on the eyes (even brain?) than the second one. Most examples that you see look like the second one and it frightens people, don&amp;#8217;t let that stop you take my word and go for it.&lt;/p&gt;
&lt;p&gt;Clojure seems to be very easy to pick up, things seem very intuitive, like the other day I was wondering, how to return a default value from a map if the key is not found and there is was right there in the api.&lt;br /&gt;
(map key default-value)&lt;br /&gt;
So simple! I was easily able to extend the examples that came with the peepcode screencast. Anyways I have started on this path, let&amp;#8217;s see where it goes.&lt;/p&gt;
&lt;p&gt;Update 2009/12/03&lt;/p&gt;
&lt;p&gt;- Looked at the Clojure source code, looks squeaky clean, I applied to become a member so that I can expand on the test coverage, hopefully they will accept me.&lt;/p&gt;
&lt;p&gt;-It is &lt;em&gt;(load-file &amp;#8220;hello.clj&amp;#8221;)&lt;/em&gt; and not &lt;em&gt;load-file &amp;#8220;hello.clj&amp;#8221;&lt;/em&gt; , I keep forgetting that and after a few mins I realize it.&lt;/p&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gocomments/devender.wordpress.com/281/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/devender.wordpress.com/281/"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godelicious/devender.wordpress.com/281/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/devender.wordpress.com/281/"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/gostumble/devender.wordpress.com/281/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/devender.wordpress.com/281/"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/godigg/devender.wordpress.com/281/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/devender.wordpress.com/281/"/&gt;&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://feeds.wordpress.com/1.0/goreddit/devender.wordpress.com/281/"&gt;&lt;img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/devender.wordpress.com/281/"/&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=devender.wordpress.com&amp;blog=609686&amp;post=281&amp;subd=devender&amp;ref=&amp;feed=1"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258596135"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258596135" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=_XqPBykhhNc:cjZQmuRJgPs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=_XqPBykhhNc:cjZQmuRJgPs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=_XqPBykhhNc:cjZQmuRJgPs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/_XqPBykhhNc" height="1" width="1"/&gt;</description>
      <link>http://devender.wordpress.com/2009/11/18/loving-clojure/</link>
      <pubDate>Wed, 18 Nov 2009 18:02:15 GMT</pubDate>
    </item>
    <item>
      <title>XMPP Sandbox: a development server for the XMPP community</title>
      <description>&lt;p&gt;ProcessOne now provides an online XMPP server dedicated to developers of XMPP solutions on &lt;a rel="nofollow" target="_blank" href="http://www.xmpp-sandbox.org/"&gt;XMPP Sandbox&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We realized that many of the developers building a solution start by creating an account on a public server, used for production. This is not a good practice, because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;During the learning process, developer can try connecting buggy clients. It is not very friendly to test buggy client on a real life, production server. I have seen very ugly traffic on production servers and this is something that should be avoided.&lt;/li&gt;
&lt;li&gt;Production servers have limitations in term of resource usage. During development and experimentation, this is nice to be able to try innovative approach without hitting those limitation too soon.&lt;/li&gt;
&lt;li&gt;Developers want to test the best and newest features of XMPP. Our XMPP Sandbox will feature the best and latest technologies.&lt;/li&gt;
&lt;li&gt;We want to provide a showcase for some of our extra components (like our &lt;a rel="nofollow"&gt;gateways&lt;/a&gt; for example). They are deployed on XMPP Sandbox and developers can directly assess themselves how good they are. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the &lt;a rel="nofollow" target="_blank" href="http://www.xmpp-sandbox.org/"&gt;XMPP Sandbox&lt;/a&gt; is now open as a beta service. Start playing with it, developers! Give us your feedback as many improvements are planned in the coming months!&lt;/p&gt;
&lt;p&gt;For feedback and discussions, the &lt;a rel="nofollow"&gt;XMPP Sandbox forum&lt;/a&gt; is open. You can also follow &lt;a rel="nofollow" target="_blank" href="http://twitter.com/xmppsandbox"&gt;xmppsandbox on Twitter&lt;/a&gt; to share your feedback and feature request and get notified of changes.&lt;/p&gt;
&lt;p&gt;For developers that can be in Paris on the 17th of december 2009, you can also join the "real life" developer sandbox during the &lt;a rel="nofollow"&gt;SeaBeyond&lt;/a&gt; event.&lt;/p&gt;
&lt;p&gt;Welcome in the sandbox and build amazing things!&lt;/p&gt;
&lt;p align="center"&gt;&lt;img alt="image" height="343" style="border:0;" width="512"/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258459210"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258459210" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=FxHSorbvwFY:GSGWQN9SuVg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=FxHSorbvwFY:GSGWQN9SuVg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=FxHSorbvwFY:GSGWQN9SuVg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/FxHSorbvwFY" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/xmpp_sandbox_a_development_server_xmpp_community/</link>
      <author>Mickaël Rémond</author>
      <pubDate>Tue, 17 Nov 2009 04:00:10 GMT</pubDate>
    </item>
    <item>
      <title>Happy 7th birthday, ejabberd!</title>
      <description>&lt;p&gt;Yes, ejabberd is already 7 years old.&lt;/p&gt; &lt;p&gt;Let's celebrate with a timeline of ejabberd, &lt;a rel="nofollow" target="_blank" href="http://www.erlang.org/"&gt;Erlang/OTP&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://xmpp.org/"&gt;XMPP/Jabber protocol&lt;/a&gt;, and &lt;a rel="nofollow" target="_blank" href="http://tkabber.jabber.ru"&gt;Tkabber&lt;/a&gt;:
&lt;center&gt;&lt;img/&gt;&lt;/center&gt;
&lt;/p&gt; &lt;p&gt;If you find any mistake, please comment. I built the graph using &lt;a rel="nofollow" target="_blank" href="http://www.mediawiki.org/wiki/Extension:EasyTimeline"&gt;EasyTimeLine.pl&lt;/a&gt;, if you want the datafile, please comment.&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.ejabberd.im/birthday-7"&gt;read more&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258403556"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258403556" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=XolBFXE5N1U:FiCziFHX5tc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=XolBFXE5N1U:FiCziFHX5tc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=XolBFXE5N1U:FiCziFHX5tc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/XolBFXE5N1U" height="1" width="1"/&gt;</description>
      <link>http://www.ejabberd.im/birthday-7</link>
      <pubDate>Mon, 16 Nov 2009 12:32:36 GMT</pubDate>
    </item>
    <item>
      <title>EUC 2009</title>
      <description>&lt;a rel="nofollow" target="_blank" href="http://pics.livejournal.com/lukego/pic/0002yax8/"&gt;&lt;img src="http://pics.livejournal.com/lukego/pic/0002yax8" width="156" height="135" border="0" align="right"/&gt;&lt;/a&gt;
The &lt;a rel="nofollow" target="_blank" href="http://www.erlang-factory.com/conference/ErlangUserConference2009"&gt;Erlang User Conference&lt;/a&gt; in Stockholm was a lot of fun! Thank you
everybody at Erlang Training and Consulting for the excellent organisation.
&lt;p&gt;
My favourite talk of the day was Patrik Nyblom on the development of SMP support in the BEAM
virtual machine. He was entertaining andalso inspiring: that is some
really hot technology that our programs are sitting on. I'm reminded
of Klacke's talk in London last year: Erlang programmers
&lt;i&gt;do&lt;/i&gt; have a more powerful tool than everybody else and &lt;i&gt;now&lt;/i&gt;
is the time to make the most of it.
&lt;p&gt;
Kostis Sagonas's presentation of the latest Dialyzer developments was
great too. I'm one of those opinionated bastards who doesn't care much
about standardized programming styles and this tends to put me at odds
with people writing linting tools. This time I had no room to
complain: the tool is entirely optional, the motivating examples of
bugs it can find were very easy to relate to, and it's been developed
and maintained as a production tool for many years now. Great
marketing!
&lt;p&gt;
Some of the other talks really lacked motivating examples for me. I'm
sure it's fun to write cloud-hosted databases and map-reduce
frameworks, but what problem does it solve for me? The SQL people have
long since fallen into the trap of "if all you have is a hammer,
everything looks like a nail." NoSQL might be the same.
&lt;p&gt;
I dined a bit too well with friends on the nights leading up to the conference and so I missed the first talks about Nitrogen and advanced parse-transform hackery, which is a pity because I heard they were some of the best.
&lt;p&gt;
The whole week in Stockholm has been a really great time. I'm writing
this on my short flight back to Switzerland at the moment and feeling
very glad to live in the neighbourhood again. Now back to Erlang hacking..&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258371111"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258371111" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=I5QjmIt1L0Y:TsHGTBIelW4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=I5QjmIt1L0Y:TsHGTBIelW4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=I5QjmIt1L0Y:TsHGTBIelW4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/I5QjmIt1L0Y" height="1" width="1"/&gt;</description>
      <link>http://lukego.livejournal.com/26836.html</link>
      <category>erlang</category>
      <pubDate>Mon, 16 Nov 2009 03:31:51 GMT</pubDate>
    </item>
    <item>
      <title>Go borrows key concepts from Erlang</title>
      <description>&lt;p&gt;The Go language, getting a lot of attention because it was recently &lt;a rel="nofollow" target="_blank" href="http://golang.org/"&gt;open sourced&lt;/a&gt; by Google, seems to be a sort of programmers&amp;#8217; Rorschach test in that everyone calls it a replacement for C++/Python/Erlang/Your Language Here&amp;#8230; My sense is it wouldn&amp;#8217;t be getting that much attention if it were released apart from Google. But thinking about Go for the past few days made me realize that the most important part about Go is actually its &amp;#8220;Erlang-ness&amp;#8221;. Everything else it provides is nice if you&amp;#8217;re a C++ developer doing systems programming already, but not critical. But the goroutine/channel piece is the part that actually differentiates the language as something worth investigating that you can&amp;#8217;t easily work around with the existing toolset.&lt;/p&gt;
&lt;p&gt;Would it replace Erlang for many applications? Probably not, because though the coroutines will be powerful in certain systems, Go is not a platform like Erlang, with all the benefits of hot swappable code, supervisor processes,hibernating processes, etc&amp;#8230; To a non-developer I would describe Go as containing some of the building blocks that make Erlang a great language and platform, but ultimately Go is targeting lower-level systems development. That type of coding wouldn&amp;#8217;t be a good fit for Erlang anyway.&lt;/p&gt;
&lt;p&gt;So where would they overlap? Probably most likely the two languages would be in applications that are not too OS-level but not too application-centric where OTP or hot-swapping code, multi-machine communication, etc would be requirements. The most obvious example would be web infrastructure. Would Go be a good fit for writing a web server vs Yaws or Mochiweb? Probably. Would I want to use Go to write my own cross-node communication that i get for free with Erlang? Probably not.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;m realizing that Go provides a service to the Erlang community in that it validates the fundamentals of the Erlang platform. &lt;a rel="nofollow" target="_blank" href="http://golang.org/doc/go_lang_faq.html"&gt;Goroutines&lt;/a&gt; are equivalent to Erlang processes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3 id="goroutines"&gt;Why goroutines instead of threads?&lt;/h3&gt;
&lt;p&gt;Goroutines are part of making concurrency easy to use. The idea, which has been around for a while, is to multiplex independently executing functions—coroutines, really—onto a set of threads. When a coroutine blocks, such as by calling a blocking system call, the run-time automatically moves other coroutines on the same operating system thread to a different, runnable thread so they won&amp;#8217;t be blocked. The programmer sees none of this, which is the point. The result, which we call goroutines, can be very cheap: unless they spend a lot of time in long-running system calls, they cost little more than the memory for the stack.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And Channels to Erlang messages: ( see slide 28 from &lt;a rel="nofollow" target="_blank" href="http://golang.org/doc/go_talk-20091030.pdf"&gt;this deck&lt;/a&gt;)&amp;#8230; very cool stuff and further evidence of the slow but inexorable march toward mainstream multi-core programming.&lt;/p&gt;
&lt;p&gt;&lt;img class="alignleft size-full wp-image-124" title="Channels" src="http://erlanginside.com/wp-content/uploads/2009/11/Picture-16.png" alt="Channels" width="610" height="447"/&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258335241"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258335241" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=0ExXDrVlC7Y:DsryAZfneQA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=0ExXDrVlC7Y:DsryAZfneQA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=0ExXDrVlC7Y:DsryAZfneQA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/0ExXDrVlC7Y" height="1" width="1"/&gt;</description>
      <link>http://erlanginside.com/go-borrows-from-erlang-123</link>
      <category>languages</category>
      <pubDate>Sun, 15 Nov 2009 17:34:01 GMT</pubDate>
    </item>
    <item>
      <title>Comparing Erlang, Go, Java, and C</title>
      <description>&lt;p&gt;Tim over at &lt;a rel="nofollow" target="_blank" href="http://timyang.net"&gt;timyang.net&lt;/a&gt; has an interesting &amp;#8216;hello world&amp;#8217; &lt;a rel="nofollow" target="_blank" href="http://timyang.net/programming/c-erlang-java-performance/"&gt;web server test&lt;/a&gt; between Erlang, Go, Java, and C. The C code is an nginx plugin, Java uses the MINA framework; Erlang and Go are small standalone apps. Java &amp;#8216;won&amp;#8217;, with Erlang in second place. Interesting article and the first I&amp;#8217;ve seen comparing Go and Erlang performance.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258332075"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258332075" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=NtgenqEAWfA:1oSE_thxu8k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=NtgenqEAWfA:1oSE_thxu8k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=NtgenqEAWfA:1oSE_thxu8k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/NtgenqEAWfA" height="1" width="1"/&gt;</description>
      <link>http://erlanginside.com/comparing-erlang-go-java-and-c-121</link>
      <pubDate>Sun, 15 Nov 2009 16:41:15 GMT</pubDate>
    </item>
    <item>
      <title>ejabberd 2.1.0 finally released</title>
      <description>&lt;p&gt;ejabberd 2.1.0 is finally released, and it comes with an enormous list of 314 new features, improvements and bugfixes. It has been 21 months since the last major ejabberd release 2.0.0, and 8 months since 2.0.5.&lt;br /&gt;&lt;br /&gt;Very brief list of additions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erlang/OTP R13 support&lt;/li&gt;
&lt;li&gt;HTTP-Bind (BOSH) optimization and clean-up&lt;/li&gt;
&lt;li&gt;LDAPS support&lt;/li&gt;
&lt;li&gt;MUC rooms can require a CAPTCHA to join the room&lt;/li&gt;
&lt;li&gt;PubSub: major improvements. Update to XEP version 1.12&lt;/li&gt;
&lt;li&gt;PEP and Caps: many improvements&lt;/li&gt;
&lt;li&gt;Run commands with ejabberdctl or other frontends (XML-RPC, HTTP)&lt;/li&gt;
&lt;li&gt;STUN server&lt;/li&gt;
&lt;li&gt;XEPs like: XMPP Ping, Roster Versioning, Import/Export Format&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;Check the Release Notes for a more complete list of changes:&lt;br /&gt;&lt;a rel="nofollow"&gt;http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you upgrade from a previous ejabberd version, read carefully the release notes, because there were several changes in the installation path and the configuration options.&lt;br /&gt;&lt;br /&gt;The list of solved tickets since 2.0.0 is available on ProcessOne bug tracker:&lt;br /&gt;&lt;a rel="nofollow" target="_blank" href="http://redir.process-one.net/ejabberd-2.1.0"&gt;http://redir.process-one.net/ejabberd-2.1.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ejabberd 2.1.0 is available as source code package and binary installers for Linux 32 bits, 64 bits, Mac OS X Intel, and Windows:&lt;br /&gt;&lt;a rel="nofollow"&gt;http://www.process-one.net/en/ejabberd/downloads&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3&gt;Acknowledgments:&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;A big thank you to everyone who helped in the ejabberd project during the last months. This list is extracted from ejabberd's commit log between version 2.0.0 and 2.1.0:&lt;br /&gt;&lt;br /&gt;Alexander Tsvyashchenko, Alexey Shchepin, Anastasia Gornostaeva, Andreas Ntaflos, Andreas van Cranenburgh, Andrzej Smyk, Andy Harb, Andy Skelton, Anton Podavalov, Apag0r, Attila Vangel, Badlop, Brian Cully, Carlos E. Lopez, Chris Newcombe, Christoph Anton Mitterer, Christophe Romain, Christopher Dupont, Clochix, Dariusz Markowicz, Dominges, Doruk Fisek, Eric Cestari, Etan Reisner, Evgeniy Khramtsov, Fabrice Colliot, Felix Geyer, Gabriele Stilli, Geoff Cant, George Hazan, Glenn Sieb, Graham Whitted, Gustaf Alstr&amp;ouml;mer, Igor Goryachev, Jack Moffitt, Jacob Vorreuter, James Iakovos Mandelis, Jan Kusanagi, Janusz Dziemidowicz, Jeffrey Rogiers, Jon Bendtsen, Jonathan Auer, Jonathan Schleifer, Juan Pablo Carlino, Justin Boffemmyer, Justin Kirby, J&amp;eacute;r&amp;ocirc;me Sautret, Kevin Crosbie, Konstantin Khomoutov, Luca Brivio, Luk&amp;aacute;š Pol&amp;iacute;vka, Magnus Henoch, Marcin Owsiany, Marek Bečka, Martin Langhoff, Massimiliano Mirra, Mats Cronqvist, Matthew Reilly, Maxim Ryazanov, Michal Schmidt, Micka&amp;euml;l R&amp;eacute;mond, Myers Carpenter, Neustradamus, Nicolas V&amp;eacute;rit&amp;eacute;, Nikolaus Polak, Oleg Palij, Ot&amp;aacute;vio Fernandes, Pablo Polvorin, Pablo Saratxaga, Paul Guyot, Pedro Melo, Philipp Hancke, Ruslan Rakhmanin, Sergei Golovan, Shelley Shyan, Smart2128, Spike, Stefan Strigler, Stephan Maka, Stian B. Barmen, Thomas, Thomas Baden, Thore Alstromer, Tsukasa Hamano, Vincent Barat, Viq, Zbyszek Ż&amp;oacute;łkiewski, and Zhan Caibao.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258122982"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258122982" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=rSN-hP4fqqE:4g401mCf7c4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=rSN-hP4fqqE:4g401mCf7c4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=rSN-hP4fqqE:4g401mCf7c4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/rSN-hP4fqqE" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/ejabberd_2.1.0_finally_released/</link>
      <author>Jérôme Sautret</author>
      <pubDate>Fri, 13 Nov 2009 06:36:22 GMT</pubDate>
    </item>
    <item>
      <title>ejabberd 2.1.0 - HTTP-Bind, LDAPS, PubSub 1.12, STUN, Ping, Roster Versioning</title>
      <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.process-one.net/en/blogs/article/ejabberd_2.1.0_finally_released/"&gt;ejabberd 2.1.0 is finally released&lt;/a&gt;! And it comes with an enormous list
of &lt;a rel="nofollow" target="_blank" href="http://redir.process-one.net/ejabberd-2.1.0"&gt;314 new features, improvements and bugfixes&lt;/a&gt;.
It has been 21 months since the last major ejabberd release &lt;a rel="nofollow"&gt;2.0.0&lt;/a&gt;,
and 8 months since &lt;a rel="nofollow"&gt;2.0.5&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Very brief list of additions:
&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.erlang.org/"&gt;Erlang/OTP&lt;/a&gt; R13 support
&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0124.html"&gt;HTTP-Bind (BOSH)&lt;/a&gt; optimization and clean-up
&lt;/li&gt;&lt;li&gt;LDAPS support
&lt;/li&gt;&lt;li&gt;MUC rooms can require a CAPTCHA to join the room
&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0060.html"&gt;PubSub&lt;/a&gt;: major improvements. Update to XEP version 1.12
&lt;/li&gt;&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0163.html"&gt;PEP&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0115.html"&gt;Caps&lt;/a&gt;: many improvements
&lt;/li&gt;&lt;li&gt;Run commands with ejabberdctl or other frontends (XML-RPC, HTTP)
&lt;/li&gt;&lt;li&gt;STUN server
&lt;/li&gt;&lt;li&gt;XEPs like: &lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0199.html"&gt;XMPP Ping&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0237.html"&gt;Roster Versioning&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://xmpp.org/extensions/xep-0227.html"&gt;Import/Export Format&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.ejabberd.im/ejabberd-2.1.0"&gt;read more&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258113760"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258113760" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=vYU9DE-c9zo:K8Z08a6hRYQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=vYU9DE-c9zo:K8Z08a6hRYQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=vYU9DE-c9zo:K8Z08a6hRYQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/vYU9DE-c9zo" height="1" width="1"/&gt;</description>
      <link>http://www.ejabberd.im/ejabberd-2.1.0</link>
      <pubDate>Fri, 13 Nov 2009 04:02:40 GMT</pubDate>
    </item>
    <item>
      <title>Facebook chat team gets Erlang User of the Year award</title>
      <description>&lt;p&gt;Chris Piro and Eugene Letuchy get Erlang User of the Year 2009 award at Erlang User Conference in Stockholm at a testimonial to the value of their achievement for the Erlang community.&lt;/p&gt; &lt;p&gt;We have mentioned the Facebook chat system by &lt;a rel="nofollow"&gt;revealing their use of ejabberd&lt;/a&gt; as an XMPP interface.&lt;/p&gt;
&lt;p&gt;Alexey Shchepin and me from ProcessOne had already been elected "erlang user of the year", respectively in 2006 and 2004.&lt;/p&gt;
&lt;p&gt;Congratulations to Chris Piro and Eugene Letuchy!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258045597"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1258045597" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=TFJYopGPeZM:KbuwM8OprGs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=TFJYopGPeZM:KbuwM8OprGs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=TFJYopGPeZM:KbuwM8OprGs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/TFJYopGPeZM" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/facebook_chat_team_gets_erlang_user_of_the_year_award/</link>
      <author>Mickaël Rémond</author>
      <pubDate>Thu, 12 Nov 2009 09:06:37 GMT</pubDate>
    </item>
    <item>
      <title>Go or Unladen Swallow?</title>
      <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://golang.org/"&gt;Go&lt;/a&gt; is a new programming language to come out of google and &lt;a rel="nofollow" target="_blank" href="http://groups.google.com/group/unladen-swallow/browse_thread/thread/4edbc406f544643e"&gt;this thread&lt;/a&gt; on Google discouraging python internally for new projects seems more than just coincidence. &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language with the efficiency and safety of a statically typed, compiled language.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;By combining dynamic features, safety, garbage collection and efficiency in a single language and environment, Go claims to remove the reasons why programmers end up building systems using multiple languages. A brief look at Go shows strong C origins with nice support for "goroutines" - essential sequential processes communicating using channels. I don't quite get the "safety" claim of the language since you can take the address of an uninitialized variable in Go. It could qualify as a "C with concurrency" language I think.&lt;/p&gt;
&lt;p&gt;Go already has a great set of packages that should make it immediately usable as a pragmatic language. (The terse package names are very reminiscent of Erlang's package structure.) It even has a package for interfacing with Google Native Client (NaCl) for audio/video access.&lt;/p&gt;
&lt;p&gt;(minor edits)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257897337"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257897337" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ijF1UiBsnuo:nIXx_D4gyZU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ijF1UiBsnuo:nIXx_D4gyZU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=ijF1UiBsnuo:nIXx_D4gyZU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/ijF1UiBsnuo" height="1" width="1"/&gt;</description>
      <link>http://lambda-the-ultimate.org/node/3676</link>
      <pubDate>Tue, 10 Nov 2009 15:55:37 GMT</pubDate>
    </item>
    <item>
      <title>Øredev 2009</title>
      <description>&lt;p&gt;I made a quick stop at &lt;a rel="nofollow" target="_blank" href="http://www.oredev.org/"&gt;Øredev in Malmö&lt;/a&gt; on Friday Nov 6.&lt;br /&gt;
It seemed like it would have been a fun place to spend the week, but alas I was too busy to do more than just come in, give my talk, and go home again (getting up 4am London time to make it in time&amp;#8230;) I did manage to catch Stuart Halloway&amp;#8217;s talk on Clojure and had some good discussions.&lt;/p&gt;
&lt;p&gt;Here is a &lt;a rel="nofollow" target="_blank" href="http://ulf.wiger.net/weblog/wp-content/uploads/2009/11/MsgPassingConcurrencyOredev.pdf"&gt;copy of my slides&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257604991"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257604991" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=-UX9T6h2i0c:5NW4sqk73Ng:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=-UX9T6h2i0c:5NW4sqk73Ng:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=-UX9T6h2i0c:5NW4sqk73Ng:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/-UX9T6h2i0c" height="1" width="1"/&gt;</description>
      <link>http://ulf.wiger.net/weblog/2009/11/07/øredev-2009/</link>
      <category>Erlang</category>
      <pubDate>Sat, 07 Nov 2009 06:43:11 GMT</pubDate>
    </item>
    <item>
      <title>John Hughes on Erlang and Haskell</title>
      <description>&lt;p&gt;John Hughes talks about his experience with Erlang vs. Haskell in &lt;a rel="nofollow" target="_blank" href="http://www.infoq.com/interviews/Erlang-Haskell-John-Hughes"&gt;an InfoQ Interview&lt;/a&gt;. While the discussions about strict vs lazy, pure vs side effecting, and dynamic vs static typing are interesting he raises a good question for the LtU crowd at the end:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I think functional programming is a very interesting concept for the future and for the present indeed. One of the things I do wonder about though, is when I got interested in the field, the mainstream was probably Fortran and COBOL and even C was fairly new at that time. The functional programming pioneers spoke of an order of magnitude improvement in productivity and I think functional programming has delivered that. &lt;/p&gt;
&lt;p&gt;If you compare Haskell programs to C code or even C++ often, they are about an order of magnitude smaller and simpler. The same is for Erlang, those results are being validated in the industry. Where is the next order of magnitude coming from? I wish I had an answer to that question because it's hard to see almost. When you look at a beautiful Haskell program, how could this be 10 times shorter? But I think we need to be asking ourselves that kind of question. If I had a good idea there, I would spend the rest of my career working on it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, LtU, where is the next order of magnitude coming from?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257524982"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257524982" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=prf71-iQHAc:OcGnvj7goLI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=prf71-iQHAc:OcGnvj7goLI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=prf71-iQHAc:OcGnvj7goLI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/prf71-iQHAc" height="1" width="1"/&gt;</description>
      <link>http://lambda-the-ultimate.org/node/3673</link>
      <pubDate>Fri, 06 Nov 2009 08:29:42 GMT</pubDate>
    </item>
    <item>
      <title>Strategic Guide: Instant Messaging and Security</title>
      <description>&lt;p&gt;ProcessOne releases its Strategic Guide on Instant Messaging Security. It focuses on the impact of Instant Messaging on businesses, explore possible security risks of Instant Messaging usage and give advices on how to mitigate them.&lt;/p&gt; &lt;p&gt;Businesses recognise that instant messaging can help to improve employee productivity, but are often reluctant to sanction its use due to concerns about security. This Strategic Guide examines the real risks associated with instant messaging in corporate environments and explains how to mitigate them.&lt;/p&gt;
&lt;p&gt;Download the document:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English version:&amp;nbsp;&lt;a rel="nofollow"&gt;Strategic Guide: Instant Messaging and Security&lt;/a&gt; (PDF).&lt;/li&gt;
&lt;li&gt;French version: &lt;a rel="nofollow"&gt;Guide Strat&amp;eacute;gique:&amp;nbsp;Messagerie instantan&amp;eacute;e &amp;amp; S&amp;eacute;curit&amp;eacute;&lt;/a&gt;&amp;nbsp;(PDF).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257504404"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257504404" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=btWral581Cg:sOlzgg9ujFc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=btWral581Cg:sOlzgg9ujFc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=btWral581Cg:sOlzgg9ujFc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/btWral581Cg" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/imtrends/article/strategic_guide_instant_messaging_and_security/</link>
      <author>Mickaël Rémond</author>
      <pubDate>Fri, 06 Nov 2009 02:46:44 GMT</pubDate>
    </item>
    <item>
      <title>Facebook chat supports XMPP, with ejabberd</title>
      <description>&lt;p&gt;Facebook is preparing the launch of their XMPP connection interface. It means that users will be able to use Facebook with any type of XMPP clients, ranging from desktop to mobile clients.&lt;/p&gt; &lt;p&gt;This is a huge news for XMPP because it consolidates the protocol as the de facto open standard for Instant Messaging and Presence. Facebook adds about 300 million potential users that can now use XMPP for chatting. This adds to large Google Talk figures and the many other large deployments around the world, like Yandex and Live Journal. XMPP could become the most largely used instant messaging protocol in the coming months!&lt;/p&gt;
&lt;p&gt;Facebook announced on their developer blog they had the intention to support the XMPP protocol in May 2008: &lt;a rel="nofollow" target="_blank" href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=110"&gt;Using Facebook Chat via Jabber&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It now seems the launch is close as the XMPP software stack has been deployed on chat.facebook.com, as our bot at IMtrends have found out: &lt;a rel="nofollow" target="_blank" href="http://www.imtrends.com/do/search_domain_simple?domain=chat.facebook.com&amp;amp;x=19&amp;amp;y=12"&gt;chat.facebook.com on IMtrends&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are proud that this XMPP support is built on a customized &lt;a rel="nofollow"&gt;ejabberd&lt;/a&gt; XMPP server as announced several times by Facebook development team, including one of their latest conferences in Edinburgh in September 2009: &lt;a rel="nofollow" target="_blank" href="http://cufp.galois.com/2009/slides/PiroLetuchy.pdf"&gt;Functional Programming at Facebook by Chris Piro and Eugene Letuchy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The missing piece is currently what login and password to use to connect, but I am sure it will be announced by Facebook in due time.&lt;/p&gt;
&lt;p&gt;Good job Facebook team!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257419178"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257419178" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=EwF7hWWpAv4:KF9OHdFiJ6k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=EwF7hWWpAv4:KF9OHdFiJ6k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=EwF7hWWpAv4:KF9OHdFiJ6k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/EwF7hWWpAv4" height="1" width="1"/&gt;</description>
      <link>http://www.process-one.net/en/blogs/article/facebook_chat_supports_xmpp_with_ejabberd/</link>
      <author>Mickaël Rémond</author>
      <pubDate>Thu, 05 Nov 2009 03:06:18 GMT</pubDate>
    </item>
    <item>
      <title>Tsung - Load Testing Tool in Erlang</title>
      <description>You've must have heard of Tsung - a load testing tool. Well i've got the opportunity to learn and use it in my current employment and its really versatile in conducting load tests for web-based applications. It has many features that i've come to appreciate after spending a couple of years with Mercury Interactive (its defunct now after being bought over by HP in 2006); admittedly Mercury's solutions were more versatile than what Tsung can offer but considering that web is the common platform where many applications are being hosted on; i think its a safe bet :)&lt;br /&gt;&lt;br /&gt;So, IMO i think&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tsung is good for conducting load testing scenarios and executing them in a local / distributed manner&lt;/li&gt;&lt;li&gt;Load Testing can be relatively light weight (Erlang processes are hitting the target app) and hence the cost of using relatively heavy weight machines is likely to reduce since there is lesser need to use those machines since more concurrent users can be simulated on 1 machine in Tsung. (I'll see whether this assumption is correct)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Good starting points (URLs of interest):&lt;/p&gt; &lt;ol&gt;&lt;li&gt;&lt;span class="nobr"&gt;&lt;a rel="nofollow" target="_blank" href="http://tsung.erlang-projects.org/"&gt;http://tsung.erlang-projects.org/&lt;sup&gt;&lt;img class="rendericon" src="https://jira.lindenlab.com/jira/images/icons/linkext7.gif" alt="" width="7" align="absmiddle" border="0" height="7"/&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="nobr"&gt;&lt;a rel="nofollow" target="_blank" href="http://www.erlang.org/"&gt;http://www.erlang.org&lt;sup&gt;&lt;img class="rendericon" src="https://jira.lindenlab.com/jira/images/icons/linkext7.gif" alt="" width="7" align="absmiddle" border="0" height="7"/&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;A load testing tool would be useless if it didn't know how to capture server response data (e.g. checking whether an expected string is returned) and reuse it (e.g. session ids returned from servers which you can use subsequently in a HTTP POST/GET in an URL-rewrite type of string) subsequently, generate dynamic data, read data from an external file (commonly used in storing &amp;lt;&lt;em&gt;username&lt;/em&gt;, &lt;em&gt;password&lt;/em&gt;&amp;gt; pairs) &lt;p&gt;So my example would illustrate the logging in to a website (e.g. &lt;span class="nobr"&gt;&lt;a rel="nofollow" target="_blank" href="http://projecteuler.net/"&gt;http://projecteuler.net&lt;sup&gt;&lt;img class="rendericon" src="https://jira.lindenlab.com/jira/images/icons/linkext7.gif" alt="" width="7" align="absmiddle" border="0" height="7"/&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;) and logging out from it - simple enough to illustrate my point.&lt;br /&gt;Next what i did was to record the series of events that mimick my user logging and logging out of the website and this is captured in the tsung_recorder_timestamp.xml&lt;br /&gt;and i used that XML file and included some other stuff so that it looks like what i have for you below (this is a basic load test scenario)&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;tsung loglevel="info" dumptraffic="false" version="1.0"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;clients&amp;gt;&lt;br /&gt; &amp;lt;client host="localhost" use_controller_vm="true"/&amp;gt;&lt;br /&gt;&amp;lt;/clients&amp;gt;&lt;br /&gt;&amp;lt;servers&amp;gt;&lt;br /&gt; &amp;lt;server host="78.110.165.8" port="80" type="tcp"&amp;gt;&amp;lt;/server&amp;gt;&lt;br /&gt;&amp;lt;/servers&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;load&amp;gt;&lt;br /&gt; &amp;lt;arrivalphase phase="1" duration="2" unit="minute"&amp;gt;&lt;br /&gt; &amp;lt;users interarrival="1" unit="minute"&amp;gt;&amp;lt;/users&amp;gt;&lt;br /&gt; &amp;lt;/arrivalphase&amp;gt;&lt;br /&gt; &amp;lt;user session="rec20091102-01:30" start_time="0" unit="second"&amp;gt;&amp;lt;/user&amp;gt;&lt;br /&gt;&amp;lt;/load&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;options&amp;gt;&lt;br /&gt; &amp;lt;option name="file_server" value="/tmp/userlist.csv"&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;/options&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;sessions&amp;gt;&lt;br /&gt;&amp;lt;session name='rec20091102-01:30' probability='100' type='ts_http'&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='http://projecteuler.net/' version='1.1' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/style_main.css' version='1.1' if_modified_since='Sat, 29 Nov 2008 20:04:00 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/logo.jpg' version='1.1' if_modified_since='Thu, 28 Dec 2006 14:12:43 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/icon_register.png' version='1.1' if_modified_since='Fri, 31 Dec 2004 12:48:16 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/icon_about.png' version='1.1' if_modified_since='Fri, 31 Dec 2004 12:48:28 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/icon_problems.png' version='1.1' if_modified_since='Fri, 31 Dec 2004 12:48:26 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/icon_login.png' version='1.1' if_modified_since='Fri, 31 Dec 2004 12:48:32 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='http://projecteuler.net/images/corner_tr.gif' version='1.1' if_modified_since='Thu, 10 Apr 2008 19:35:02 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/corner_tl.gif' version='1.1' if_modified_since='Thu, 10 Apr 2008 19:34:41 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/corner_br.gif' version='1.1' if_modified_since='Thu, 10 Apr 2008 19:35:10 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/corner_bl.gif' version='1.1' if_modified_since='Thu, 10 Apr 2008 19:34:55 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/euler_main.jpg' version='1.1' if_modified_since='Mon, 21 Jan 2002 19:18:20 GMT' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;thinktime random='true' value='2'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='http://projecteuler.net/index.php?section=login' version='1.1' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;thinktime random='true' value='6'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;request subst="true"&amp;gt;&lt;br /&gt;&amp;lt;match do="continue" when="match"&amp;gt;Logged in as %%readcsv:getUsername%%&amp;lt;/match&amp;gt;&lt;br /&gt;&amp;lt;http url='/index.php' version='1.1' contents='%%readcsv:getUserString%%' content_type='application/x-www-form-urlencoded' method='POST'&amp;gt;&amp;lt;/http&amp;gt;&lt;br /&gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;thinktime random='true' value='4'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='/images/icon_tick.png' version='1.1' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;thinktime random='true' value='4'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;thinktime random='true' value='3'/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;request&amp;gt;&amp;lt;http url='http://projecteuler.net/index.php?section=logout' version='1.1' method='GET'&amp;gt;&amp;lt;/http&amp;gt;&amp;lt;/request&amp;gt;&lt;br /&gt;&amp;lt;/session&amp;gt;&lt;br /&gt;&amp;lt;/sessions&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tsung&amp;gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hence, the main thing you should note is the use of dynamic substitution (e.g. %%readcsv:getUsername%%) where i wrote a simple erlang program to read my username and password from a file (see the XML tag &lt;em&gt;option&lt;/em&gt; above) and replacing each simulated user with a valid user id and password. &lt;/p&gt; &lt;p&gt;Next, i checked that the server response contains a string &lt;em&gt;Logged in as XXX&lt;/em&gt; where XXX would be dynamically generated by the function (Check out the erlang code for the function, simple stuff).&lt;/p&gt; &lt;p&gt;The erlang program is shown below. &lt;/p&gt; &lt;div class="code panel" style="border-width:1px;"&gt;&lt;div class="codeContent panelContent"&gt; &lt;pre class="code-none"&gt; 1 -module(readcsv).&lt;br /&gt; 2 -export([getUserString/1, getUsername/1]).&lt;br /&gt; 3&lt;br /&gt; 4 getUserString({Pid, DynVar}) -&amp;gt;&lt;br /&gt; 5 {ok, Line} = ts_file_server:get_next_line(),&lt;br /&gt; 6 [Uid,Pwd] = string:tokens(Line, ","),&lt;br /&gt; 7 "username=" ++ Uid ++ "&amp;amp;password=" ++ Pwd ++ "&amp;amp;login=Login".&lt;br /&gt; 8&lt;br /&gt; 9 getUsername({Pid, DynVar}) -&amp;gt;&lt;br /&gt;10 {ok, Line} = ts_file_server:get_next_line(),&lt;br /&gt;11 [Uid,_] = string:tokens(Line, ","),&lt;br /&gt;12 Uid.&lt;/pre&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;The above erlang code must be compiled via &lt;em&gt;erlc&lt;/em&gt; and you place the &lt;em&gt;.beam&lt;/em&gt; file into the directory via a command like this &lt;pre&gt;sudo mv readcsv.beam /usr/local/lib/erlang/lib/tsung-1.3.1/ebin/&lt;/pre&gt;&lt;br /&gt;Now, running the load test should be alright.&lt;/p&gt; &lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; In this load test, i defined a duration of 2 minutes with 2 users since load testing using 800 gazillion users is considered a chargeable offense so DON'T DO IT. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3408400997537705779-7912841482920223347?l=erlangraymondtay.blogspot.com' alt=''/&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257120300"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1257120300" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=WhrmJVIyx2s:hgTm8RlN-Jo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=WhrmJVIyx2s:hgTm8RlN-Jo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=WhrmJVIyx2s:hgTm8RlN-Jo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/WhrmJVIyx2s" height="1" width="1"/&gt;</description>
      <link>http://erlangraymondtay.blogspot.com/2009/11/tsung-load-testing-tool-in-erlang.html</link>
      <author>Raymond Tay</author>
      <pubDate>Sun, 01 Nov 2009 16:05:00 GMT</pubDate>
    </item>
    <item>
      <title>Adaptive layout for the mobile web</title>
      <description>&lt;p&gt;
One web, is still in the air and we, as web developers, are still hoping that it will be the case. Nowadays, phones are getting better and better and the need of doing a specific version of any website if, as I see it, fading away. When someone tells you: &lt;em&gt;“Hey, I need an iPhone/Android/Pre/Maemo app (or maybe an Opera/Vodafone widget) for my website!”&lt;/em&gt; I would try to show her/him that, at a very small cost, a well done website can be adapted to those devices.
&lt;/p&gt;&lt;p&gt;
If the iPhone marketshare is quite big, other platforms are emerging. The cool side is that they are built on Webkit as well, like: Android or Palm Pre. Less powerful phones might run Opera mini which has also a very good support of web standards. I’ll try to show simple things you can do to give your website a better experience everywhere without building multiple versions of it.
&lt;/p&gt;&lt;p&gt;
The biggest problem, the width. On the desktop side, it’s commonly assumed that 1024x768 is the standard. This is why the ~960px width layout is so common (take Yahoo!, Facebook, LinkedIn, …). My opinion is that netbooks will gain some marketshare too and it also weight the fact that one size fits all will be outdated in the next years.
&lt;/p&gt;&lt;p&gt;
Devices might use HVGA 480x320 (iPhone, Pre, HTC Dream) or QVGA 320x240 or maybe bigger or smaller. The iPhone comes with a feature to control the viewport, which might be supported by the others (like &lt;a rel="nofollow" target="_blank" href="http://dev.opera.com/articles/view/opera-mobile-9-5-the-developer-angle/" hreflang="en"&gt;Opera&lt;/a&gt;) or not.
&lt;/p&gt;&lt;pre&gt;&amp;lt;meta name=viewport content="width=320; user-scalable=1;"&amp;gt;&lt;/pre&gt;&lt;p&gt;
Like &lt;a rel="nofollow" target="_blank" href="http://www.slideshare.net/glazou/paris-web2009-one-web" hreflang="en"&gt;Daniel Glazman said during Paris Web 2009&lt;/a&gt;, please don’t prevent the user to scale in/out. This is totally non-standard and there is a standard way of doing that. It’s called media-queries.
&lt;/p&gt;&lt;pre&gt;&amp;lt;link href="small.css" media="handheld, only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css"&amp;gt;&lt;/pre&gt;&lt;p&gt;
This stylesheet gonna be applied on handheld devices and others with a very narrow screen (smaller than 480px in this case) and it enables to do cool things like :
&lt;/p&gt;&lt;ul&gt; &lt;li&gt;going with a liquid layout instead of a fixed or elastic one;&lt;/li&gt; &lt;li&gt;linearizing multiple-columns layout (&lt;code&gt;float:none&lt;/code&gt;);&lt;/li&gt; &lt;li&gt;hiding unnecessary stuffs (like you already do in your print stylesheet of course);&lt;/li&gt; &lt;li&gt;resizing big picture (&lt;code&gt;max-width: 100%&lt;/code&gt;);&lt;/li&gt; &lt;li&gt;making small things bigger, so you can click them more easily (like tiny icons);&lt;/li&gt; &lt;li&gt;taking into account that there is no &lt;code&gt;:hover&lt;/code&gt; state on a touch screen;&lt;/li&gt; &lt;li&gt;and many more…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
Such small screen cannot take advantages of the two dimensions, like a usual monitor does, so a linear (in the Y-axis of course) layout is preferred.
&lt;/p&gt;&lt;p&gt;
They are of course many, more issues that can be addressed like the iPhone file-size cache limitation, bandwidth reduction, HTTP calls,… I wouldn’t focus on those until you get an audience worth doing so. If it’s not your target of course.
&lt;/p&gt;&lt;p&gt;
I won’t throw the baby with the bathwater and native applications are good if you need to do specific things with the device itself or require specific performances. Phones offer, or will offer, access to the address book, the camera, the geo-localization,… Most of those require specific actions which aren’t completely specified/implemented yet, like &lt;a rel="nofollow" target="_blank" href="http://bondi.omtp.org/" hreflang="en"&gt;OMTP Bondi&lt;/a&gt; or &lt;a rel="nofollow" target="_blank" href="http://dev.w3.org/geo/api/spec-source.html" hreflang="en"&gt;W3C&lt;/a&gt; itself. &lt;/p&gt;&lt;p&gt;
The best platform to test that is OSX, simply because the iPhone SDK won’t work elsewhere. Testing with the Android emulator or Opera Mini can be done on any platform. Mozilla promised to release soon a version of Fennec targeting the Maemo platform which is already using &lt;a rel="nofollow" target="_blank" href="http://maemo.nokia.com/features/maemo-browser/" hreflang="en"&gt;Gecko&lt;/a&gt;. By the way, the &lt;a rel="nofollow" target="_blank" href="http://maemo.nokia.com/#device-intro" hreflang="en"&gt;N900&lt;/a&gt; looks awesome! To develop it, simply activate that stylesheet for everyone, so no media-queries.
&lt;/p&gt;&lt;p&gt;
It very easy to start adapting a website to smaller devices and may even force you to have a better grid structure. Maybe not yet a business advantage, but sooner or later it will.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;
Un seul web (&lt;em&gt;“One Web”&lt;/em&gt;) a été usé et re-usé lors du dernier Paris Web. C’est une idée ou un espoir qui plane depuis toujours il me semble. Avec la démocratisation des appareils nomades permettant de consulter le véritable web (ni WAP, ni i-mode). Le réflexe actuel me semble être : &lt;em&gt;« il faut que je fasse réaliser une application iPhone/Android/Pre (ou un widget Opera/Vodafone) pour mon site »&lt;/em&gt;. Dans ce cas, je présenterais ce qu’il est possible de faire avec l’existant, et ce qui nécessiterait une application native.
&lt;/p&gt;&lt;p&gt;
Si le monde du mobile est une jungle encore plus dense que ce qu’on expérimente avec les navigateurs usuels. Les acteurs principaux se divisent entre Webkit (iPhone, Android, Palm Pre, …) et Opera (avec Opera mini). Des moteurs de rendu connus (entre autres) pour leur support de qualité des standards. Des outils existent pour éviter de produire plusieurs versions d’un même site.
&lt;/p&gt;&lt;p&gt;
Le pas premier à franchir est qu’il est assumé aujourd’hui que 1024x768 est le minimum syndical. Pour preuve le nombre de sites reposant sur cette largeur là, de manière fixée. L’arrivée des netbooks va, j’espère tendre vers un parc informatique encore plus hétérogène et une fin progression de la taille unique.
&lt;/p&gt;&lt;p&gt;
Pour revenir à nos moutons, nombre d’appareils ont un écran dit HVGA (demi-VGA, 320x480) ou QVGA (quart-VGA, 320x240). C’est pourquoi vous verrez souvent la ligne suivante :
&lt;/p&gt;&lt;pre&gt;&amp;lt;meta name=viewport content="width=320; user-scalable=1;"&amp;gt;
&lt;/pre&gt;&lt;p&gt;
Un élément propriétaire à l’iPhone, qui force la largeur à 320px et dans ce cas autorise le zoom utilisateur. Comme l’a souligné Daniel Glazman lors de &lt;a rel="nofollow" target="_blank" href="http://www.slideshare.net/glazou/paris-web2009-one-web" hreflang="en"&gt;sa présentation (ou devrais-je dire show)&lt;/a&gt; en novembre dernier, désactiver cette fonctionnalité est un non-sens. D’autres navigateurs peuvent supporter cet attribut là, je pense notamment à &lt;a rel="nofollow" target="_blank" href="http://dev.opera.com/articles/view/opera-mobile-9-5-the-developer-angle/" hreflang="en"&gt;Opera&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Mais, la boîte-à-outils du W3C n’est pas en reste, avec les media-queries qui permettent de cibler un navigateur selon des spécification techniques :
&lt;/p&gt;&lt;pre&gt;&amp;lt;link href="small.css" media="handheld, only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css"&amp;gt;&lt;/pre&gt;&lt;p&gt;
Comme dans ce cas, la largeur maximale en pixels de l’appareil. Donc si l’appareil est plus petit que 480px de large, la feuille de style est appliquée. Feuille qui permet de faire tout un tas de choses intéressantes :
&lt;/p&gt;&lt;ul&gt; &lt;li&gt;passer à une mise en forme fluide, et non plus fixée ou élastique ;&lt;/li&gt; &lt;li&gt;linéariser des colonnes ;&lt;/li&gt; &lt;li&gt;masquer ce qui sert de décoration&lt;/li&gt; &lt;li&gt;limiter la taille maximale des images, par exemple ;&lt;/li&gt; &lt;li&gt;agrandir certains éléments pour pouvoir les sélectionner avec de gros doigts (sur un petit écran) ;&lt;/li&gt; &lt;li&gt;prendre en compte qu’il n’y a pas d’effet de survol sur un écran tactile ;&lt;/li&gt; &lt;li&gt;et tout un tas d’autres…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
Il y a plusieurs autres points à prendre en considération si l’audience se servant d’appareil nomade est assez importante. Une version adaptée, ne saura certainement pas contenter tous les usagers. C’est à mes yeux un investissement faible et qui amène forcément un plus qualitatif, passer de deux dimensions à une seule implique que la logique de base soit bonne.
&lt;/p&gt;&lt;p&gt;
Pour ne pas jeter le bébé avec l’eau du bain, il y a un intérêt à l’option application native, pour ne serait-ce qu’au niveau des performances. Plus spécialement dès qu’il s’agit d’intéragir avec l’appareil lui-même, comme consulter le carnet d’adresse, l’appareil photo ou le GPS. Des solutions au sein du navigateur arrivent tant via le &lt;a rel="nofollow" target="_blank" href="http://dev.w3.org/geo/api/spec-source.html" hreflang="en"&gt;W3C&lt;/a&gt; qu’&lt;a rel="nofollow" target="_blank" href="http://bondi.omtp.org/" hreflang="en"&gt;OMTP Bondi&lt;/a&gt; pour citer ceux que je connaisse.
&lt;/p&gt;&lt;p&gt;
En matière de test, tout est testable depuis partout, sauf pour l’iPhone où le SDK nécessite le système d’exploitation OS X. L’émulateur Android offre différentes géométries d’écran, ce qui est intéressant. Opera mini est disponible en ligne. Pour parler un peu de Mozilla, Fennec devrait arriver pour le N900 (Maemo utilisant déjà Gecko) d’ici peu. Sinon, en activant la feuille de style comme une autre permet de faire un premier test également. Il y a de quoi s’amuser à améliorer l’expérience utilisateur de nos sites sur ces appareils là. C’est vraiment ludique à faire, même en tant que non-possesseur de ce type d’appareils là.
&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256989020"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256989020" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=675jiYiSOuI:-3ynxVQaNeI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=675jiYiSOuI:-3ynxVQaNeI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=675jiYiSOuI:-3ynxVQaNeI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/675jiYiSOuI" height="1" width="1"/&gt;</description>
      <link>http://yoan.dosimple.ch/blog/2009/10/31</link>
      <category>CSS iPhone Mobile Opera Webkit</category>
      <pubDate>Sat, 31 Oct 2009 04:37:00 GMT</pubDate>
    </item>
    <item>
      <title>Learn You Some Recursion</title>
      <description>I've added a new chapter to Learn You Some Erlang. This one's about recursion and tail recursion and explains how to work in a language without looping constructs of any kind. We visit common operations such as calculating factorials (yeah, every functional programming tutorials does that), finding the length of a list, reversing, slicing and zipping lists. I also added an example in, which is about building quicksort in 2-3 different manners and another one about recursively reading and building binary trees in order to construct a small address book. As for additional changes, I've completely rewritten my Erlang plugin for SyntaxHighlighter making the code much easier to read (hopefully). I should also add that I feel a bit sorry for not updating the site faster this time, providing a single chapter when I usually get 3 out in the same time period. I've been busy with work projects and did not have enough energy to do as much stuff. I also feel recursion is a touchy subject to teach; it needs to be done right, be very simple without being too patronizing or plainly boring, etc. So I've taken more time to make it as good as possible.&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256956200"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256956200" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=jyv9bDzmvmw:BmBF5qvIeLA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=jyv9bDzmvmw:BmBF5qvIeLA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=jyv9bDzmvmw:BmBF5qvIeLA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/jyv9bDzmvmw" height="1" width="1"/&gt;</description>
      <link>http://learnyousomeerlang.com/recursion</link>
      <pubDate>Fri, 30 Oct 2009 19:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Web site downtime since Friday 30 October 6.00 UTC</title>
      <description>&lt;p&gt;This web site will be unavailable during the morning of Friday 30 October, since 6.00 UTC (9.00 Moscow Time). It is expected that the migration will take at least 6 hours, so be patient ;)&lt;/p&gt;
&lt;p&gt;Other services affected will be the mailing list, the chatroom and Bugzilla.&lt;/p&gt;
&lt;p&gt;The reason is that the hosting of this website and many other ones, &lt;a rel="nofollow" target="_blank" href="http://www.jabber.ru/"&gt;Jabber.Ru&lt;/a&gt;, will migrate to a new machine.&lt;/p&gt;
&lt;p&gt;See you at the come back!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.pheedo.com/click.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256830928"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=567761465a4b419cb1448c549ab65896&amp;u=planeterlang1256830928" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=tSnM7Sway2E:GUsYf71FZbg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=tSnM7Sway2E:GUsYf71FZbg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=tSnM7Sway2E:GUsYf71FZbg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/tSnM7Sway2E" height="1" width="1"/&gt;</description>
      <link>http://www.ejabberd.im/node/3726</link>
      <pubDate>Thu, 29 Oct 2009 08:42:08 GMT</pubDate>
    </item>
    <item>
      <title>Python quirks</title>
      <description>I&amp;#8217;ve been using Python for a while. Recently I have noted some
nuances, wonders and counter-intuitive things I ran into. The list grew
surprisingly fast. Disclaimer: Most of the problems that I list here can be understood and explained. It’s just my opinion that something is odd, so forgive me if I raise something that, in your opinion, [...]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ubMJuqjr-zA:8WUlpVatG94:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/planet_erlang?a=ubMJuqjr-zA:8WUlpVatG94:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/planet_erlang?i=ubMJuqjr-zA:8WUlpVatG94:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/planet_erlang/~4/ubMJuqjr-zA" height="1" width="1"/&gt;</description>
      <link>http://www.lshift.net/blog/2009/10/29/python-quirks</link>
      <category>Technology</category>
      <pubDate>Thu, 29 Oct 2009 07:53:00 GMT</pubDate>
    </item>
  </channel>
</rss>
