<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wikidot="http://www.wikidot.com/rss-namespace">

	<channel>
		<title>ØMQ blog</title>
		<link>http://zeromq.wikidot.com</link>
		<description></description>
				<copyright></copyright>
		<lastBuildDate>Sat, 14 Mar 2026 13:19:59 +0000</lastBuildDate>
		
					<item>
				<guid>http://zeromq.wikidot.com/blog:installing-ubuntu-java</guid>
				<title>Installing ZeroMQ and Java bindings on Ubunu 10.10</title>
				<link>http://zeromq.wikidot.com/blog:installing-ubuntu-java</link>
				<description>

&lt;p&gt;&lt;em&gt;&amp;quot;For some times now, I&#039;m following the slow evolution of AMQP toward it&#039;s 1.0 release. In the trip, one traveler decided that the road was far too long, and complex, and choosed to take its independence: ZeroMQ is living its own adventure for some times now. And their choices are intersting, really focused and sharp, so I needed to see what can be done with that message system, and a bit of Scala.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 07 Feb 2011 10:21:58 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><em>&quot;For some times now, I'm following the slow evolution of AMQP toward it's 1.0 release. In the trip, one traveler decided that the road was far too long, and complex, and choosed to take its independence: ZeroMQ is living its own adventure for some times now. And their choices are intersting, really focused and sharp, so I needed to see what can be done with that message system, and a bit of Scala.&quot;</em></p> <p><a href="http://fanf42.blogspot.com/2011/02/installing-zeromq-and-java-bindings-on.html">http://fanf42.blogspot.com/2011/02/installing-zeromq-and-java-bindings-on.html</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:python-multiprocessing-with-zeromq</guid>
				<title>Python Multiprocessing With ØMQ</title>
				<link>http://zeromq.wikidot.com/blog:python-multiprocessing-with-zeromq</link>
				<description>

&lt;p&gt;&lt;em&gt;As I was going over the various python code examples at github, I became interested in the taskvent / tasksink / taskwork examples. The pattern was recognizable as one I often use for distributed processing. In the past, I typically would have implemented such a work flow using the python multiprocessing library, using it’s Queue class to communicate between processes. Recently I’ve implemented several data processing pipelines for work using the same technique, but using zeromq channels for communication, and I’ve been extremely pleased with both the performance, and the ease of use.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 03 Feb 2011 09:11:05 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><em>As I was going over the various python code examples at github, I became interested in the taskvent / tasksink / taskwork examples. The pattern was recognizable as one I often use for distributed processing. In the past, I typically would have implemented such a work flow using the python multiprocessing library, using it’s Queue class to communicate between processes. Recently I’ve implemented several data processing pipelines for work using the same technique, but using zeromq channels for communication, and I’ve been extremely pleased with both the performance, and the ease of use.</em></p> <p><a href="http://taotetek.wordpress.com/2011/02/02/python-multiprocessing-with-zeromq/">http://taotetek.wordpress.com/2011/02/02/python-multiprocessing-with-zeromq/</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:zeromq-and-quickfix</guid>
				<title>ØMQ And QuickFIX</title>
				<link>http://zeromq.wikidot.com/blog:zeromq-and-quickfix</link>
				<description>

&lt;p&gt;Niki Bowe has a nice blog showing how to integrate ØMQ with QuickFIX to distribute market data (stock quotes):&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 01 Feb 2011 21:29:40 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Niki Bowe has a nice blog showing how to integrate ØMQ with QuickFIX to distribute market data (stock quotes):</p> <p><a href="http://webcache.googleusercontent.com/search?q=cache:http://niki.code-karma.com/2011/02/zeromq-the-active-object-pattern/">ZeroMQ + The Active Object Pattern</a> (Google cache, since original article has gone.)</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:message-oriented-network-programming</guid>
				<title>Message Oriented Network Programming</title>
				<link>http://zeromq.wikidot.com/blog:message-oriented-network-programming</link>
				<description>

&lt;p&gt;A blog discussing the added value of SCTP and ØMQ from network programmers point of view:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 23 Dec 2010 09:33:40 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>A blog discussing the added value of SCTP and ØMQ from network programmers point of view:</p> <p><a href="http://jgowdy.blogspot.com/2010/09/message-oriented-network-programming.html?spref=tw">http://jgowdy.blogspot.com/2010/09/message-oriented-network-programming.html?spref=tw</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:openvms</guid>
				<title>ØMQ/2.1.0 available on OpenVMS</title>
				<link>http://zeromq.wikidot.com/blog:openvms</link>
				<description>

&lt;p&gt;Check for the details here:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 19 Dec 2010 13:03:34 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Check for the details here:</p> <p><a href="http://zeromqonopenvms.blogspot.com/2010/12/zeromq-v210-released-on-openvms-alpha.html">http://zeromqonopenvms.blogspot.com/2010/12/zeromq-v210-released-on-openvms-alpha.html</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:load-balancing-in-java</guid>
				<title>Load Balancing In Java</title>
				<link>http://zeromq.wikidot.com/blog:load-balancing-in-java</link>
				<description>

&lt;p&gt;A blog about using ØMQ to achieve load balancing between thread in Java can be found here:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 13 Dec 2010 12:46:46 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>A blog about using ØMQ to achieve load balancing between thread in Java can be found here:</p> <p><a href="http://sysgears.blog.com/2010/12/08/load-balancing-work-between-java-threads-using-zeromq/">http://sysgears.blog.com/2010/12/08/load-balancing-work-between-java-threads-using-zeromq/</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:geoip</guid>
				<title>Building a GeoIP server with ZeroMQ</title>
				<link>http://zeromq.wikidot.com/blog:geoip</link>
				<description>

&lt;p&gt;&lt;em&gt;&amp;quot;I discovered ZeroMQ while researching Mongrel2 and thought it was worth deeper investigation. At my day job, we have lots of services that don&#039;t scale well inside our front end stack, so we expose them as a service that each front end consumes. Some examples: search, memcache, geoip resolution, geo targeting, compatibility between users, etc. Basically, anything that relies on state that is expensive to duplicate on each front end becomes a service.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 10 Nov 2010 10:01:53 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><em>&quot;I discovered ZeroMQ while researching Mongrel2 and thought it was worth deeper investigation. At my day job, we have lots of services that don't scale well inside our front end stack, so we expose them as a service that each front end consumes. Some examples: search, memcache, geoip resolution, geo targeting, compatibility between users, etc. Basically, anything that relies on state that is expensive to duplicate on each front end becomes a service.&quot;</em></p> <p>Read more <a href="http://bohlander.posterous.com/building-a-geoip-server-with-zeromq">here</a>.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:gerard-blog</guid>
				<title>ØMQ blog by Gerard Toonstra</title>
				<link>http://zeromq.wikidot.com/blog:gerard-blog</link>
				<description>

&lt;p&gt;&lt;em&gt;&amp;quot;I&#039;ve downloaded 0MQ and decided to give it a spin. The first thing I did was visit the IRC channel on a saturday and there were 50 people in there. That&#039;s usually a very good sign it&#039;s quite popular. There&#039;s a good chance that 0MQ is getting some serious attention soon. It may not be the absolute topper in performance speed, but it may be best if &lt;a href=&quot;https://bit.ly/kontraktor-indojaya&quot;&gt;jasa epoxy lantai&lt;/a&gt; you&#039;re looking for flexible solutions, prototyping and esxperimentation. Having said that, if you&#039;re not running a super-duper high-performance site that needs to squeeze all the juice of your CPU&#039;s and NIC&#039;s, ZeroMQ will do just very fine for you, no problems whatsoever.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 31 Oct 2010 11:44:18 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><em>&quot;I've downloaded 0MQ and decided to give it a spin. The first thing I did was visit the IRC channel on a saturday and there were 50 people in there. That's usually a very good sign it's quite popular. There's a good chance that 0MQ is getting some serious attention soon. It may not be the absolute topper in performance speed, but it may be best if <a href="https://bit.ly/kontraktor-indojaya">jasa epoxy lantai</a> you're looking for flexible solutions, prototyping and esxperimentation. Having said that, if you're not running a super-duper high-performance site that needs to squeeze all the juice of your CPU's and NIC's, ZeroMQ will do just very fine for you, no problems whatsoever.&quot;</em></p> <p>Read more <a href="http://radialmind.blogspot.com/2010/10/zeromq.html">here</a>.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:0mq-the-game</guid>
				<title>ØMQ - The Game</title>
				<link>http://zeromq.wikidot.com/blog:0mq-the-game</link>
				<description>

&lt;p&gt;So, this morning zeromq-dev had another report of ØMQ asserting when passed an invalid message. One thing we can all agree on, ØMQ should not crash when passed invalid data on the wire. But how to hammer the code heavily enough to let us state, &amp;quot;it&#039;s robust&amp;quot;?&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 13 Oct 2010 10:47:49 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>So, this morning zeromq-dev had another report of ØMQ asserting when passed an invalid message. One thing we can all agree on, ØMQ should not crash when passed invalid data on the wire. But how to hammer the code heavily enough to let us state, &quot;it's robust&quot;?</p> <p>Early next year we're going to organize our first international meetup, a conference, for the ØMQ community. It'll be in some nice European city, probably <span style="text-decoration: line-through;">Prague</span> Budapest. I'll have details later.</p> <p>But this gives me an idea for making ØMQ totally robust, having some fun in the meantime. Here are the rules:</p> <ul> <li>The goal is to crash a ØMQ/2.1 node by sending it invalid data of some kind via TCP.</li> <li>Any TCP data is valid (e.g. TELNET), not just ØMQ messages.</li> <li>First person to provide a test case that provokes a specific crash wins 1 point.</li> <li>First person to provide an accepted patch for a reported crash wins 3 points.</li> <li>The referees may allocate bonus points for particularly impressive contributions.</li> <li>Crash reports must be logged in the ØMQ issue tracker.</li> <li>Patches must be <a href="http://www.zeromq.org/docs:contributing">correctly submitted</a> to the zeromq-dev mailing list and be for ØMQ/2.1 master.</li> <li>The competition is open to everyone, without exception, except Pieter Hintjens and Martin Sustrik, who are the referees.</li> <li>Collect and report your own points, as you go along. No-one else will count for you.</li> <li>The referees are the sole arbiter and ultimate authorities of what constitutes a valid point.</li> <li>Person with the most points wins.</li> </ul> <p>Winner gets a speaker slot at the ØMQ conference, and travel to the conference and hotel paid by iMatix. Doesn't matter if you're in Aukland or Atlanta, we'll take care of it.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:clojure2</guid>
				<title>ZeroMQ and Clojure, a brief introduction</title>
				<link>http://zeromq.wikidot.com/blog:clojure2</link>
				<description>

&lt;p&gt;Nice blog on using 0MQ from Clojure by Antonio Garrote:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 09 Sep 2010 07:45:29 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Nice blog on using 0MQ from Clojure by Antonio Garrote:</p> <p><a href="http://antoniogarrote.wordpress.com/2010/09/08/zeromq-and-clojure-a-brief-introduction/">http://antoniogarrote.wordpress.com/2010/09/08/zeromq-and-clojure-a-brief-introduction/</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:modern</guid>
				<title>ZeroMQ: Modern &amp; Fast Networking Stack</title>
				<link>http://zeromq.wikidot.com/blog:modern</link>
				<description>

&lt;p&gt;Nice article about ØMQ by Ilya Grigorik:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 03 Sep 2010 18:07:06 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Nice article about ØMQ by Ilya Grigorik:</p> <p><a href="http://www.igvita.com/2010/09/03/zeromq-modern-fast-networking-stack/">http://www.igvita.com/2010/09/03/zeromq-modern-fast-networking-stack/</a></p> <p>Worth reading!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:september-meetups</guid>
				<title>September Meetups</title>
				<link>http://zeromq.wikidot.com/blog:september-meetups</link>
				<description>

&lt;p&gt;We&#039;re organizing two ∅MQ meetups in September&amp;#8230;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 02 Sep 2010 13:30:33 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>We're organizing two ∅MQ meetups in September&#8230;</p> <h2><span>London &#8212; September 7th, 2010</span></h2> <p><strong>Where:</strong> Theodore Bullfrog<br /> <strong>Time:</strong> 6.30PM<br /> <strong>Organizer:</strong> Martin Sustrik</p> <p><a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=theodore+bullfrog&amp;sll=51.516293,-0.129493&amp;sspn=0.007317,0.022724&amp;ie=UTF8&amp;hq=theodore+bullfrog&amp;hnear=&amp;ll=51.508843,-0.123961&amp;spn=0.003659,0.011362&amp;z=17&amp;iwloc=A">View the map</a></p> <h2><span>Chicago &#8212; September 19th, 2010</span></h2> <p><strong>Where:</strong> to be announced<br /> <strong>Time:</strong> 6.00PM<br /> <strong>Organizer:</strong> Pieter Hintjens</p> <p>Want to organize your own ∅MQ meetup? Discuss it on zeromq-dev!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:multithreading-magic</guid>
				<title>Multithreading Magic</title>
				<link>http://zeromq.wikidot.com/blog:multithreading-magic</link>
				<description>

&lt;h2&gt;&lt;span&gt;Abstract&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;In this article Pieter Hintjens and Martin Sustrik examine the difficulties of building concurrent (multithreaded) applications and what this means for enterprise computing. The authors argue that a lack of good tools for software designers means that neither chip vendors nor large businesses will be able to fully benefit from more than 16 cores per CPU, let alone 64 or more. They then examine an ideal solution, and explain how the ØMQ framework for concurrent software design is becoming this ideal solution. Finally they explain ØMQ&#039;s origins, and the team behind it.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Going multi-core&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Until a few years ago, concurrent programming was synonymous with high-performance computing (HPC) and multithreading was what a word processor did to re-paginate a document while also letting you edit it. Multi-core CPUs were expensive and rare, and limited to higher-end servers. We achieved speed by getting more and more clock cycles out of single cores, which ran hotter and hotter.&lt;/p&gt;
&lt;p&gt;Today, multi-core CPUs have become commodity items. While clock speeds are stable at around 2-3GHz, the number of cores per chip is doubling every 18-24 months. Moore&#039;s Law still applies. The spread of multi-core CPUs out from the data centre will continue so that netbooks and portable devices come with 2 or 4 cores and top-end server CPUs come with 64 cores. And this growth will continue, indefinitely.&lt;/p&gt;
&lt;p&gt;Several factors drive this evolution. First, the need for CPU producers to compete. Whether or not we can use the power, we prefer to buy more capacity. Second, hitting the clock cycles ceiling, CPU designers have found multi-core to be the next way of scaling their architectures and offering more competitive products. Third, at the low end, the spread of multitasking operating systems like Android mean that those additional cores can immediately translate into performance. And lastly, at the high end, the high cost of a data centre slot for a blade computer (estimated by one investment bank at $50,000 per year) pushes users to demand more cores per blade.&lt;/p&gt;
&lt;p&gt;It has been clear for some years that the future is massively multi-core, but the software industry is lagging behind. At the &amp;quot;High Performance on Wall Street 2008&amp;quot; event, speaker after speaker said the same thing: our software tools are not keeping up with hardware evolution.&lt;/p&gt;
&lt;p&gt;The most widely used languages, C and C++, do not offer any support for concurrency. Programmers roll their own by using threading APIs. Languages that do support concurrency, such as Java, Python, .NET, and Ruby, do it in a brute-force manner. Depending on the implementation - there are over a dozen Ruby interpreters, for example - they may offer &amp;quot;green threading&amp;quot; or true multithreading. Neither approach scales, due to reliance on locks. It is left to exotic languages like Erlang to do it right. We&#039;ll see what this means in more detail later.&lt;/p&gt;
&lt;p&gt;I could end this article by telling everyone to just switch to Erlang but that&#039;s not a realistic answer. Like many clever tools, it works only for very clever developers. But most developers - including those who more and more need to produce multithreaded applications - are just average.&lt;/p&gt;
&lt;p&gt;So let&#039;s look at what the traditional approach gets wrong, what Erlang gets right, and how we can apply these lessons to all programming languages. Concurrency for average developers, thus.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;The Painful State of the Art&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/cc817398.aspx&quot;&gt;technical article&lt;/a&gt; from Microsoft titled &amp;quot;Solving 11 Likely Problems In Your Multithreaded Code&amp;quot; demonstrates how painful the state of the art is. The article covers .Net programming but these same problems affect all developers building multithreaded applications in conventional languages.&lt;/p&gt;
&lt;p&gt;The article says, &amp;quot;correctly engineered concurrent code must live by an extra set of rules when compared to its sequential counterpart.&amp;quot; This is putting it mildly. The developer enters a minefield of processor code reordering, data atomicity, and worse. Let&#039;s look at what those &amp;quot;extra rules&amp;quot; are. Note the rafts of new terminology the poor developer has to learn.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Forgotten synchronization&amp;quot;. When multiple threads access shared data, they step on each others&#039; work. This causes &amp;quot;race conditions&amp;quot;: bizarre loops, freezes, and data corruption bugs. These effects are timing and load dependent, so non-deterministic and hard to reproduce and debug. The developer must use locks and semaphores, place code into critical sections, and so on, so that shared data is safely read or written by only one thread at a time.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Incorrect granularity&amp;quot;. Having put all the dangerous code into critical sections, the developer can still get it wrong, easily. Those critical sections can be too large and they cause other threads to run too slowly. Or they can be too small, and fail to protect the shared data properly.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Read and write tearing&amp;quot;. Reading and writing a 32-bit or 64-bit value may often be atomic. But not always! The developer could put locks or critical sections around everything. But then the application will be slow. So to write efficient code, he must learn the system&#039;s memory model, and how the compiler uses it.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Lock-free reordering&amp;quot;. Our multithreaded developer is getting more skilled and confident and finds ways to reduce the number of locks in his code. This is called &amp;quot;lock-free&amp;quot; or &amp;quot;low-lock&amp;quot; code. But behind his back, the compiler and the CPU are free to reorder code to make things run faster. That means that instructions do not necessarily happen in a consistent order. Working code may randomly break. The solution is to add &amp;quot;memory barriers&amp;quot; and to learn a lot more about how the processor manages its memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Lock convoys&amp;quot;. Too many threads may ask for a lock on the same data and the entire application grinds to a halt. Using locks is, we discover as we painfully place thousands of them into our code, inherently unscalable. Just when we need things to work properly, they do not. There&#039;s no real solution to this except to try to reduce lock times and re-organize the code to reduce &amp;quot;hot locks&amp;quot; (i.e. real conflicts over shared data).&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Two-step dance&amp;quot;. In which threads bounce between waking and waiting, not doing any work. This just happens in some cases, due to signalling models, and luckily for our developer, has no workarounds. When the application runs too slowly, he can tell his boss, &amp;quot;I think it&#039;s doing an N-step dance,&amp;quot; and shrug.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Priority inversion&amp;quot;. In which tweaking a thread&#039;s priority can cause a lower-priority threads to block a higher-priority thread. As the Microsoft article says, &amp;quot;the moral of this story is to simply avoid changing thread priorities wherever possible.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This list does not cover the hidden costs of locking: context switches and cache invalidation that ruin performance.&lt;/p&gt;
&lt;p&gt;Learning Erlang suddenly seems like a good idea.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Cost of the Traditional Approach&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Apart from the difficulty of finding developers who can learn and properly use this arcane knowledge, the state of the art is expensive in other ways.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is significantly more expensive to write and maintain such code correctly. We estimate from our own experience that it costs at least as 10 times and perhaps up to 100 times more than single-threaded code. And this while the cost of coding is falling elsewhere, thanks to cheaper and better tools and frameworks.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The approach does not scale beyond a few threads. Multithreaded applications mostly use two threads, sometimes three or four. This means we can&#039;t expect to fully exploit CPUs with 16 and more cores. So while we can get concurrency (for that word processor), we do not get scalability.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Even if the code is multithreaded, it does not really benefit from multiple cores. Individual threads are often blocking each other. And developers do not realize that their fancy multithreaded application is essentially reduced to single threadedness. Tools like Intel&#039;s ThreadChecker help diagnose this but there is no practical solution except to start designing the application again.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Even in the best cases, where applications are designed to avoid extensive locking, they do not scale above 10 cores. Locking, even when sparse and well-designed, does not scale. The more threads and CPU cores are involved, the less efficient it becomes. The law of diminishing returns hits particularly hard here.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;To scale further, our developer must switch to 100% lock-free algorithms for data sharing. He is now into the realm of black magic. He exploits hardware instructions like compare-and-swap (CAS) to flip between instances of a data structure without locks. The code is now another order of magnitude more difficult and the skill set even more rare. Lose one developer, and the entire application can die.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this adds up to a mountain of cost. Yes, we can put lovely multi-core boxes into our data centres. But when we ask our development teams to build code to use those, and they start to follow industry practice, the results are horrendous.&lt;/p&gt;
&lt;p&gt;For CPU producers, this cost creates a hard ceiling, where buyers will decide to stop buying newer CPUs because they cannot unlock the power of those extra cores.&lt;/p&gt;
&lt;p&gt;Let&#039;s see how an ideal solution would work, and whether we can apply that to the real world of Java, C, C++, and .NET.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Towards an Ideal Solution&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Of all the approaches taken to multithreading, only one is known to work properly. That means, it scales to any number of cores, avoids all locks, costs little more than conventional single-threaded programming, is easy to learn, and does not crash in strange ways. At least no more strangely than a normal single-threaded program.&lt;/p&gt;
&lt;p&gt;Ulf Wiger &lt;a href=&quot;http://ulf.wiger.net/weblog/2008/02/06/what-is-erlang-style-concurrency/&quot;&gt;summarizes the key to Erlang&#039;s concurrency&lt;/a&gt; thus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Fast process creation/destruction&lt;/li&gt;
&lt;li&gt;Ability to support &amp;#187; 10&amp;#160;000 concurrent processes with largely unchanged characteristics.&lt;/li&gt;
&lt;li&gt;Fast asynchronous message passing.&lt;/li&gt;
&lt;li&gt;Copying message-passing semantics (share-nothing concurrency).&lt;/li&gt;
&lt;li&gt;Process monitoring.&lt;/li&gt;
&lt;li&gt;Selective message reception.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key is to pass information as messages rather than shared state. To build an ideal solution is fairly delicate but it&#039;s more a matter of perspective than anything else. We need the ability to deliver messages to queues, each queue feeding one process. And we need to do this without locks. And we need to do this locally, between cores, or remotely, between boxes. And we need to make this work for any programming language. Erlang is great in theory but in practice, we need something that works for Java, C, C++, .Net, even Cobol. And which connects them all together.&lt;/p&gt;
&lt;p&gt;If done right, we eliminate the problems of the traditional approach and gain some extra advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our code is thread-naive. All data is private. Without exception, all of the &amp;quot;likely problems of multithreading code&amp;quot; disappear: no critical sections, no locks, no semaphores, no race conditions. No lock convoys, 3am nightmares about optimal granularity, no two-step dances.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Although it takes care to break an application into tasks that each run as one thread, it becomes trivial to scale an application. Just create more instances of a thread. You can run any number of instances, with no synchronization (thus no scaling) issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The application never blocks. Every thread runs asynchronously and independently. A thread has no timing dependencies on other threads. When you send a message to a working thread, the thread&#039;s queue holds the message until the thread is ready for more work.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Since the application overall has no lock states, threads run at full native speed, making full use of CPU caches, instruction reordering, compiler optimization, and so on. 100% of CPU effort goes to real work, no matter how many threads are active.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;This functionality is packaged in a reusable and portable way so that programmers in any language, on any platform, can benefit from it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If we can do this, what do we get? The answer is nothing less than: perfect scaling to any number of cores, across any number of boxes. Further, no extra cost over normal single-threaded code. This seems too good to be true.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;The ØMQ (ZeroMQ) Framework&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.zeromq.org&quot;&gt;ØMQ&lt;/a&gt; started life in 2007 as an iMatix project to build a low-latency version of our OpenAMQ messaging product, with Cisco and Intel as partners. From the start, ØMQ was focussed on getting the best possible performance out of hardware. It was clear from the start that doing multithreading &amp;quot;right&amp;quot; was the key to this.&lt;/p&gt;
&lt;p&gt;We wrote then in a technical white paper that:&lt;/p&gt;
&lt;p&gt;&amp;quot;Single threaded processing is dramatically faster when compared to multi-threaded processing, because it involves no context switching and synchronisation/locking. To take advantage of multi-core boxes, we should run one single-threaded instance of an AMQP implementation on each processor core. Individual instances are tightly bound to the particular core, thus running with almost no context switches.&amp;quot;&lt;/p&gt;
&lt;p&gt;ØMQ is special, and popular, for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&#039;s fully open source and is supported by a large active community. There are over 50 named contributors to the code, the bulk of them from outside iMatix.&lt;/li&gt;
&lt;li&gt;It has developed an ultra-simple API based on BSD sockets. This API is familiar, easy to learn, and conceptually identical no matter what the language.&lt;/li&gt;
&lt;li&gt;It implements real messaging patterns like topic pub-sub, workload distribution, and request-response. This means ØMQ can solve real-life use cases for connecting applications.&lt;/li&gt;
&lt;li&gt;It seems to work with every conceivable programming language, operating system, and hardware. This means ØMQ connects entire applications as well as the pieces of applications.&lt;/li&gt;
&lt;li&gt;It provides a single consistent model for all language APIs. This means that investment in learning ØMQ is rapidly portable to other projects.&lt;/li&gt;
&lt;li&gt;It is licensed as LGPL code. This makes it usable, with no licensing issues, in closed-source as well as free and open source applications. And those who improve ØMQ automatically become contributors, as they publish their work.&lt;/li&gt;
&lt;li&gt;It is designed as a library that we link with our applications. This means there no brokers to start and manage, and fewer moving pieces means less to break and go wrong.&lt;/li&gt;
&lt;li&gt;It is above all simple to learn and use. The learning curve for ØMQ is roughly one hour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it has odd uses thanks to its tiny CPU footprint. As &lt;a href=&quot;http://www.zeromq.org/story:1&quot;&gt;Erich Heine writes&lt;/a&gt;, &amp;quot;the [ØMQ] perf tests are the only way we have found yet which reliably fills a network pipe without also making cpu usage go to 100%&amp;quot;.&lt;/p&gt;
&lt;p&gt;Most ØMQ users come for the messaging and stay for the easy multithreading. No matter whether their language has multithreading support or not, they get perfect scaling to any number of cores, or boxes. Even in Cobol.&lt;/p&gt;
&lt;p&gt;One goal for ØMQ is to get these &amp;quot;sockets on steroids&amp;quot; integrated into the Linux kernel itself. This would mean that ØMQ disappears as a separate technology. The developer sets a socket option and the socket becomes a message publisher or consumer, and the code becomes multithreaded, with no additional work.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Summary and Conclusion&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Inevitably, CPUs big and small are moving toward multi-core architectures. But traditional software engineering has no tools to deal with this. The state of the art is expensive, fragile, and limited to a dozen cores at most. Specialized languages such as Erlang do multithreading &amp;quot;right&amp;quot;, but remain out of reach of the worlds mainstream programmers. As a consequence, the potential of massively-multi-core systems remains untapped, and CPU producers find a software market that cannot use their latest products.&lt;/p&gt;
&lt;p&gt;Hope comes in the shape of iMatix Corporation&#039;s ØMQ. From its origins as a messaging system, this small and modest library provides the power of a language like Erlang, but in a form that any developer can use. ØMQ looks like BSD sockets, it&#039;s trivial to learn, and yet lets developers create applications that scale perfectly to tens of thousands of processes.&lt;/p&gt;
&lt;p&gt;Unlike traditional multithreading, which uses locks to share data, ØMQ passes messages between threads. Internally, it uses black magic &amp;quot;lock-free&amp;quot; algorithms, but these are hidden from the developer. The result is that ØMQ application code looks just like ordinary single-threaded code, except that it processes messages.&lt;/p&gt;
&lt;p&gt;The ØMQ project was, from birth, built around an open source community of expert engineers from iMatix, Cisco, Intel, Novell, and other firms. The project has always focussed on benchmarking, transparent tests, and user-driven growth. Today the community develops the bulk of the code outside the ØMQ &amp;quot;core&amp;quot;, including language bindings for everything from Ada to OpenCOBOL, including, of course, Java, C++, .Net, Python, etc.&lt;/p&gt;
&lt;p&gt;For developers who want a simple messaging bus, ØMQ uses familiar APIs and takes literally less than an hour to install, learn and use.&lt;/p&gt;
&lt;p&gt;For architects who need low-latency messaging for market data distribution or high-performance computing, ØMQ is an obvious candidate. It is free to use, easy to learn, and is extremely fast (measured on Infiniband at 13.4 usec end-to-end latencies and over 8M messages a second).&lt;/p&gt;
&lt;p&gt;For architects who need scalability to multiple cores, ØMQ provides all that they need, no matter what their target languages and operating systems. As a plus, they can stretch the resulting applications across more boxes when they need to.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;About iMatix Corporation&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;At &lt;a href=&quot;http://www.imatix.com&quot;&gt;iMatix&lt;/a&gt; we&#039;ve done message-oriented multithreading since 1991, when we used this approach to build fast and scalable front-ends for OpenVMS. In 1996 we used a similar approach to build a fast lightweight web server (Xitami). The Xitami framework was single core, using &amp;quot;green threading&amp;quot; rather than real OS threads. We used this framework for many server-side applications.&lt;/p&gt;
&lt;p&gt;From 2004 we worked with JPMorganChase to design AMQP, and its first implementation, OpenAMQ. JPMorgan migrated their largest trading application to OpenAMQ in 2006. Today OpenAMQ runs the Dow Jones Industrial Average and is widely used in less well-known places.&lt;/p&gt;
&lt;p&gt;In 2009, iMatix released ØMQ/2.0 with its simpler socket-style API, and in 2010 announced that it would cease support for AMQP in its products, citing irremediable failures in the AMQP development process.&lt;/p&gt;
&lt;p&gt;iMatix CEO Pieter Hintjens was the main designer of AMQP/0.8 and the editor of the de-facto standard AMQP/0.9.1. Martin Sustrik, architect and maintainer of ØMQ, worked for three years in the iMatix OpenAMQ team, and was project leader for the AMQP working group.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jendela360.com&quot;&gt;sewa apartemen jakarta&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://inproperti.com&quot;&gt;Informasi Properti Indonesia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rajaepoxy.com&quot;&gt;Jasa Epoxy Lantai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://epoxymurah.com&quot;&gt;Cat Epoxy Lantai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 01 Sep 2010 16:05:08 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h2><span>Abstract</span></h2> <p>In this article Pieter Hintjens and Martin Sustrik examine the difficulties of building concurrent (multithreaded) applications and what this means for enterprise computing. The authors argue that a lack of good tools for software designers means that neither chip vendors nor large businesses will be able to fully benefit from more than 16 cores per CPU, let alone 64 or more. They then examine an ideal solution, and explain how the ØMQ framework for concurrent software design is becoming this ideal solution. Finally they explain ØMQ's origins, and the team behind it.</p> <h2><span>Going multi-core</span></h2> <p>Until a few years ago, concurrent programming was synonymous with high-performance computing (HPC) and multithreading was what a word processor did to re-paginate a document while also letting you edit it. Multi-core CPUs were expensive and rare, and limited to higher-end servers. We achieved speed by getting more and more clock cycles out of single cores, which ran hotter and hotter.</p> <p>Today, multi-core CPUs have become commodity items. While clock speeds are stable at around 2-3GHz, the number of cores per chip is doubling every 18-24 months. Moore's Law still applies. The spread of multi-core CPUs out from the data centre will continue so that netbooks and portable devices come with 2 or 4 cores and top-end server CPUs come with 64 cores. And this growth will continue, indefinitely.</p> <p>Several factors drive this evolution. First, the need for CPU producers to compete. Whether or not we can use the power, we prefer to buy more capacity. Second, hitting the clock cycles ceiling, CPU designers have found multi-core to be the next way of scaling their architectures and offering more competitive products. Third, at the low end, the spread of multitasking operating systems like Android mean that those additional cores can immediately translate into performance. And lastly, at the high end, the high cost of a data centre slot for a blade computer (estimated by one investment bank at $50,000 per year) pushes users to demand more cores per blade.</p> <p>It has been clear for some years that the future is massively multi-core, but the software industry is lagging behind. At the &quot;High Performance on Wall Street 2008&quot; event, speaker after speaker said the same thing: our software tools are not keeping up with hardware evolution.</p> <p>The most widely used languages, C and C++, do not offer any support for concurrency. Programmers roll their own by using threading APIs. Languages that do support concurrency, such as Java, Python, .NET, and Ruby, do it in a brute-force manner. Depending on the implementation - there are over a dozen Ruby interpreters, for example - they may offer &quot;green threading&quot; or true multithreading. Neither approach scales, due to reliance on locks. It is left to exotic languages like Erlang to do it right. We'll see what this means in more detail later.</p> <p>I could end this article by telling everyone to just switch to Erlang but that's not a realistic answer. Like many clever tools, it works only for very clever developers. But most developers - including those who more and more need to produce multithreaded applications - are just average.</p> <p>So let's look at what the traditional approach gets wrong, what Erlang gets right, and how we can apply these lessons to all programming languages. Concurrency for average developers, thus.</p> <h2><span>The Painful State of the Art</span></h2> <p>A <a href="http://msdn.microsoft.com/en-us/magazine/cc817398.aspx">technical article</a> from Microsoft titled &quot;Solving 11 Likely Problems In Your Multithreaded Code&quot; demonstrates how painful the state of the art is. The article covers .Net programming but these same problems affect all developers building multithreaded applications in conventional languages.</p> <p>The article says, &quot;correctly engineered concurrent code must live by an extra set of rules when compared to its sequential counterpart.&quot; This is putting it mildly. The developer enters a minefield of processor code reordering, data atomicity, and worse. Let's look at what those &quot;extra rules&quot; are. Note the rafts of new terminology the poor developer has to learn.</p> <ul> <li>&quot;Forgotten synchronization&quot;. When multiple threads access shared data, they step on each others' work. This causes &quot;race conditions&quot;: bizarre loops, freezes, and data corruption bugs. These effects are timing and load dependent, so non-deterministic and hard to reproduce and debug. The developer must use locks and semaphores, place code into critical sections, and so on, so that shared data is safely read or written by only one thread at a time.</li> </ul> <ul> <li>&quot;Incorrect granularity&quot;. Having put all the dangerous code into critical sections, the developer can still get it wrong, easily. Those critical sections can be too large and they cause other threads to run too slowly. Or they can be too small, and fail to protect the shared data properly.</li> </ul> <ul> <li>&quot;Read and write tearing&quot;. Reading and writing a 32-bit or 64-bit value may often be atomic. But not always! The developer could put locks or critical sections around everything. But then the application will be slow. So to write efficient code, he must learn the system's memory model, and how the compiler uses it.</li> </ul> <ul> <li>&quot;Lock-free reordering&quot;. Our multithreaded developer is getting more skilled and confident and finds ways to reduce the number of locks in his code. This is called &quot;lock-free&quot; or &quot;low-lock&quot; code. But behind his back, the compiler and the CPU are free to reorder code to make things run faster. That means that instructions do not necessarily happen in a consistent order. Working code may randomly break. The solution is to add &quot;memory barriers&quot; and to learn a lot more about how the processor manages its memory.</li> </ul> <ul> <li>&quot;Lock convoys&quot;. Too many threads may ask for a lock on the same data and the entire application grinds to a halt. Using locks is, we discover as we painfully place thousands of them into our code, inherently unscalable. Just when we need things to work properly, they do not. There's no real solution to this except to try to reduce lock times and re-organize the code to reduce &quot;hot locks&quot; (i.e. real conflicts over shared data).</li> </ul> <ul> <li>&quot;Two-step dance&quot;. In which threads bounce between waking and waiting, not doing any work. This just happens in some cases, due to signalling models, and luckily for our developer, has no workarounds. When the application runs too slowly, he can tell his boss, &quot;I think it's doing an N-step dance,&quot; and shrug.</li> </ul> <ul> <li>&quot;Priority inversion&quot;. In which tweaking a thread's priority can cause a lower-priority threads to block a higher-priority thread. As the Microsoft article says, &quot;the moral of this story is to simply avoid changing thread priorities wherever possible.&quot;</li> </ul> <p>This list does not cover the hidden costs of locking: context switches and cache invalidation that ruin performance.</p> <p>Learning Erlang suddenly seems like a good idea.</p> <h2><span>Cost of the Traditional Approach</span></h2> <p>Apart from the difficulty of finding developers who can learn and properly use this arcane knowledge, the state of the art is expensive in other ways.</p> <ul> <li>It is significantly more expensive to write and maintain such code correctly. We estimate from our own experience that it costs at least as 10 times and perhaps up to 100 times more than single-threaded code. And this while the cost of coding is falling elsewhere, thanks to cheaper and better tools and frameworks.</li> </ul> <ul> <li>The approach does not scale beyond a few threads. Multithreaded applications mostly use two threads, sometimes three or four. This means we can't expect to fully exploit CPUs with 16 and more cores. So while we can get concurrency (for that word processor), we do not get scalability.</li> </ul> <ul> <li>Even if the code is multithreaded, it does not really benefit from multiple cores. Individual threads are often blocking each other. And developers do not realize that their fancy multithreaded application is essentially reduced to single threadedness. Tools like Intel's ThreadChecker help diagnose this but there is no practical solution except to start designing the application again.</li> </ul> <ul> <li>Even in the best cases, where applications are designed to avoid extensive locking, they do not scale above 10 cores. Locking, even when sparse and well-designed, does not scale. The more threads and CPU cores are involved, the less efficient it becomes. The law of diminishing returns hits particularly hard here.</li> </ul> <ul> <li>To scale further, our developer must switch to 100% lock-free algorithms for data sharing. He is now into the realm of black magic. He exploits hardware instructions like compare-and-swap (CAS) to flip between instances of a data structure without locks. The code is now another order of magnitude more difficult and the skill set even more rare. Lose one developer, and the entire application can die.</li> </ul> <p>All of this adds up to a mountain of cost. Yes, we can put lovely multi-core boxes into our data centres. But when we ask our development teams to build code to use those, and they start to follow industry practice, the results are horrendous.</p> <p>For CPU producers, this cost creates a hard ceiling, where buyers will decide to stop buying newer CPUs because they cannot unlock the power of those extra cores.</p> <p>Let's see how an ideal solution would work, and whether we can apply that to the real world of Java, C, C++, and .NET.</p> <h2><span>Towards an Ideal Solution</span></h2> <p>Of all the approaches taken to multithreading, only one is known to work properly. That means, it scales to any number of cores, avoids all locks, costs little more than conventional single-threaded programming, is easy to learn, and does not crash in strange ways. At least no more strangely than a normal single-threaded program.</p> <p>Ulf Wiger <a href="http://ulf.wiger.net/weblog/2008/02/06/what-is-erlang-style-concurrency/">summarizes the key to Erlang's concurrency</a> thus:</p> <ul> <li>&quot;Fast process creation/destruction</li> <li>Ability to support &#187; 10&#160;000 concurrent processes with largely unchanged characteristics.</li> <li>Fast asynchronous message passing.</li> <li>Copying message-passing semantics (share-nothing concurrency).</li> <li>Process monitoring.</li> <li>Selective message reception.&quot;</li> </ul> <p>The key is to pass information as messages rather than shared state. To build an ideal solution is fairly delicate but it's more a matter of perspective than anything else. We need the ability to deliver messages to queues, each queue feeding one process. And we need to do this without locks. And we need to do this locally, between cores, or remotely, between boxes. And we need to make this work for any programming language. Erlang is great in theory but in practice, we need something that works for Java, C, C++, .Net, even Cobol. And which connects them all together.</p> <p>If done right, we eliminate the problems of the traditional approach and gain some extra advantages:</p> <ul> <li>Our code is thread-naive. All data is private. Without exception, all of the &quot;likely problems of multithreading code&quot; disappear: no critical sections, no locks, no semaphores, no race conditions. No lock convoys, 3am nightmares about optimal granularity, no two-step dances.</li> </ul> <ul> <li>Although it takes care to break an application into tasks that each run as one thread, it becomes trivial to scale an application. Just create more instances of a thread. You can run any number of instances, with no synchronization (thus no scaling) issues.</li> </ul> <ul> <li>The application never blocks. Every thread runs asynchronously and independently. A thread has no timing dependencies on other threads. When you send a message to a working thread, the thread's queue holds the message until the thread is ready for more work.</li> </ul> <ul> <li>Since the application overall has no lock states, threads run at full native speed, making full use of CPU caches, instruction reordering, compiler optimization, and so on. 100% of CPU effort goes to real work, no matter how many threads are active.</li> </ul> <ul> <li>This functionality is packaged in a reusable and portable way so that programmers in any language, on any platform, can benefit from it.</li> </ul> <p>If we can do this, what do we get? The answer is nothing less than: perfect scaling to any number of cores, across any number of boxes. Further, no extra cost over normal single-threaded code. This seems too good to be true.</p> <h2><span>The ØMQ (ZeroMQ) Framework</span></h2> <p><a href="http://www.zeromq.org">ØMQ</a> started life in 2007 as an iMatix project to build a low-latency version of our OpenAMQ messaging product, with Cisco and Intel as partners. From the start, ØMQ was focussed on getting the best possible performance out of hardware. It was clear from the start that doing multithreading &quot;right&quot; was the key to this.</p> <p>We wrote then in a technical white paper that:</p> <p>&quot;Single threaded processing is dramatically faster when compared to multi-threaded processing, because it involves no context switching and synchronisation/locking. To take advantage of multi-core boxes, we should run one single-threaded instance of an AMQP implementation on each processor core. Individual instances are tightly bound to the particular core, thus running with almost no context switches.&quot;</p> <p>ØMQ is special, and popular, for several reasons:</p> <ul> <li>It's fully open source and is supported by a large active community. There are over 50 named contributors to the code, the bulk of them from outside iMatix.</li> <li>It has developed an ultra-simple API based on BSD sockets. This API is familiar, easy to learn, and conceptually identical no matter what the language.</li> <li>It implements real messaging patterns like topic pub-sub, workload distribution, and request-response. This means ØMQ can solve real-life use cases for connecting applications.</li> <li>It seems to work with every conceivable programming language, operating system, and hardware. This means ØMQ connects entire applications as well as the pieces of applications.</li> <li>It provides a single consistent model for all language APIs. This means that investment in learning ØMQ is rapidly portable to other projects.</li> <li>It is licensed as LGPL code. This makes it usable, with no licensing issues, in closed-source as well as free and open source applications. And those who improve ØMQ automatically become contributors, as they publish their work.</li> <li>It is designed as a library that we link with our applications. This means there no brokers to start and manage, and fewer moving pieces means less to break and go wrong.</li> <li>It is above all simple to learn and use. The learning curve for ØMQ is roughly one hour.</li> </ul> <p>And it has odd uses thanks to its tiny CPU footprint. As <a href="http://www.zeromq.org/story:1">Erich Heine writes</a>, &quot;the [ØMQ] perf tests are the only way we have found yet which reliably fills a network pipe without also making cpu usage go to 100%&quot;.</p> <p>Most ØMQ users come for the messaging and stay for the easy multithreading. No matter whether their language has multithreading support or not, they get perfect scaling to any number of cores, or boxes. Even in Cobol.</p> <p>One goal for ØMQ is to get these &quot;sockets on steroids&quot; integrated into the Linux kernel itself. This would mean that ØMQ disappears as a separate technology. The developer sets a socket option and the socket becomes a message publisher or consumer, and the code becomes multithreaded, with no additional work.</p> <h2><span>Summary and Conclusion</span></h2> <p>Inevitably, CPUs big and small are moving toward multi-core architectures. But traditional software engineering has no tools to deal with this. The state of the art is expensive, fragile, and limited to a dozen cores at most. Specialized languages such as Erlang do multithreading &quot;right&quot;, but remain out of reach of the worlds mainstream programmers. As a consequence, the potential of massively-multi-core systems remains untapped, and CPU producers find a software market that cannot use their latest products.</p> <p>Hope comes in the shape of iMatix Corporation's ØMQ. From its origins as a messaging system, this small and modest library provides the power of a language like Erlang, but in a form that any developer can use. ØMQ looks like BSD sockets, it's trivial to learn, and yet lets developers create applications that scale perfectly to tens of thousands of processes.</p> <p>Unlike traditional multithreading, which uses locks to share data, ØMQ passes messages between threads. Internally, it uses black magic &quot;lock-free&quot; algorithms, but these are hidden from the developer. The result is that ØMQ application code looks just like ordinary single-threaded code, except that it processes messages.</p> <p>The ØMQ project was, from birth, built around an open source community of expert engineers from iMatix, Cisco, Intel, Novell, and other firms. The project has always focussed on benchmarking, transparent tests, and user-driven growth. Today the community develops the bulk of the code outside the ØMQ &quot;core&quot;, including language bindings for everything from Ada to OpenCOBOL, including, of course, Java, C++, .Net, Python, etc.</p> <p>For developers who want a simple messaging bus, ØMQ uses familiar APIs and takes literally less than an hour to install, learn and use.</p> <p>For architects who need low-latency messaging for market data distribution or high-performance computing, ØMQ is an obvious candidate. It is free to use, easy to learn, and is extremely fast (measured on Infiniband at 13.4 usec end-to-end latencies and over 8M messages a second).</p> <p>For architects who need scalability to multiple cores, ØMQ provides all that they need, no matter what their target languages and operating systems. As a plus, they can stretch the resulting applications across more boxes when they need to.</p> <h2><span>About iMatix Corporation</span></h2> <p>At <a href="http://www.imatix.com">iMatix</a> we've done message-oriented multithreading since 1991, when we used this approach to build fast and scalable front-ends for OpenVMS. In 1996 we used a similar approach to build a fast lightweight web server (Xitami). The Xitami framework was single core, using &quot;green threading&quot; rather than real OS threads. We used this framework for many server-side applications.</p> <p>From 2004 we worked with JPMorganChase to design AMQP, and its first implementation, OpenAMQ. JPMorgan migrated their largest trading application to OpenAMQ in 2006. Today OpenAMQ runs the Dow Jones Industrial Average and is widely used in less well-known places.</p> <p>In 2009, iMatix released ØMQ/2.0 with its simpler socket-style API, and in 2010 announced that it would cease support for AMQP in its products, citing irremediable failures in the AMQP development process.</p> <p>iMatix CEO Pieter Hintjens was the main designer of AMQP/0.8 and the editor of the de-facto standard AMQP/0.9.1. Martin Sustrik, architect and maintainer of ØMQ, worked for three years in the iMatix OpenAMQ team, and was project leader for the AMQP working group.</p> <p><a href="https://jendela360.com">sewa apartemen jakarta</a></p> <p><a href="https://inproperti.com">Informasi Properti Indonesia</a></p> <p><a href="http://rajaepoxy.com">Jasa Epoxy Lantai</a></p> <p><a href="http://epoxymurah.com">Cat Epoxy Lantai</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:not-to-be-confused</guid>
				<title>Not To Be Confused</title>
				<link>http://zeromq.wikidot.com/blog:not-to-be-confused</link>
				<description>

&lt;p&gt;The other day, I got this email:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 01 Sep 2010 11:25:49 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>The other day, I got this email:</p> <div style="border:solid grey 1px"> <p>From (<span style="white-space: pre-wrap;">***REDACTED***</span>)<br /> to <span class="wiki-email">moc.xitami|hp#moc.xitami|hp</span><br /> date (<span style="white-space: pre-wrap;">***REDACTED***</span>)<br /> subject (<span style="white-space: pre-wrap;">***REDACTED***</span>)</p> <p>Dear iMatrix,</p> <p>Recently I was sent a link to one of the blogs on your website, an article, which I found quite interesting.</p> <p>However, to my dismay, I also realized that iMatrix had fallen into the trap of not doing their PR homework when choosing your company nomenclature.</p> <p>In particular I am referring to the use of the unique Danish vowel 'Ø' as part of the abbreviation for your 0MQ messaging/parallelism library. To wit, the letter Ø is not just an extra element in the ASCII table that doubles for 0 (zero).</p> <p>The Danish language has no less than three vowels, which are unique to it. They are Æ ('ae'), Ø ('oe') and Å ('aa'). The form of writing them with two letters is just a convenience for the benefit of non-Danes. The actual pronunciation is nothing like those vowels concatenated, that is why Danish has unique letters for those sounds.</p> <p>Notice that these three letters are grouped in the extended ASCII table along with similar unique letters from other languages. Ie. 'Ö' is a very similar sounding letter, which is found in Swedish and German, among other languages.</p> <p>Worse still, then these letters are extremely common in Danish, and your abbreviation ØMQ doesn't read anything like 'Zero somethingorother' in this language.</p> <p>Here are some examples of Danish words using the letter Ø:</p> <p>Ø : (Yes, the letter alone) Island.<br /> Fanø : Name of a Danish Island. There are many more like this, as Denmark has hundreds of islands of varying sizes.<br /> Sø : Lake.<br /> Sønder : Southern.<br /> Søndersø : Location name, 'The southern lake'.<br /> Strøm : Flow or current, both of bodies of water and electricity.<br /> Grøn : Green.<br /> Sønderstrømfjord : Location name on Grønland (aka. Greenland to non-natives).<br /> Sød : Sweet.<br /> Dør : Door.<br /> Øre : Ear.<br /> Øje : Eye.<br /> Køn : Pretty.<br /> Kød : Meat.<br /> Føre : To lead.<br /> Køre : To drive.<br /> Før : Before.<br /> Købe : To buy.<br /> København : Name of our capital, often translated into English as Copenhagen. 'Havn' means harbour, so København can be roughly translated as 'The trading harbour', which it is.<br /> Grøft: Ditch (long depression in the soil for rainwater.)<br /> Høj : Hill.<br /> Grøfthøjparken : Name of the street, where I live. Means 'The park with the hill and the ditch'.<br /> Rød : Red.<br /> Fløde : Cream.<br /> Grød : Porridge.<br /> Rødgrød med fløde : Name of an old fashioned dessert, the name of which is completely impossible to pronounce correctly by anyone but native Danes. English and most other languages simply doesn't have the 'Ø' sound. This sentence is often used by Danish children to tease non-natives by trying to get them to say it. It is a red porridge (more like jello, actually) made from strawberries and served with chilled cream.</p> <p>In other word: Ø is not a funny looking zero. It was included in the extended ASCII table because it is vital to writing Danish on a keyboard. I realize that historically the American IBM engineers used a shorthand with the slash over the zero to distinguish it from the letter 'O'. But the ASCII code for their slashed zero was the ASCII zero, not the Danish letter. They basically changed the optical image of zero for the convenience of humans and did not introducing a new character for the purpose.</p> <p>So you guys are basically looking really strange to us over here. Do note that using ØMQ instead of 0MQ also ruins your ratings in the search engines. Only Danish keyboards will have the letter Ø directly available for typing, and we do not think of Ø when we hear the English word zero. So basically no-one, anywhere on the planet, will know how to correctly search for the name of your product.</p> <p>Kind regards</p> <p>(<span style="white-space: pre-wrap;">***REDACTED***</span>)</p> </div> <p>The Danes, it seems, take their alphabet very seriøusly. The last thing we want is to annoy anyone, especially someone whose ancestors used to raid northern Scotland for grød and haggis. But the writer of this email, Mr (<span style="white-space: pre-wrap;">***REDACTED***</span>), from (<span style="white-space: pre-wrap;">***REDACTED***</span>) (if that is even his real name), shocks us with his lack of knowledge, not to mention his 'accidental' mispelling of iMatix. Ø and ∅ are two totally different letters. They don't even look remotely similar!</p> <p>It's true that all of us have sometimes written ØMQ instead of ∅MQ by accident (the letters are like right next to each other), but I'm going to set the record straight. For all Danes, ∅MQ is pronounced &quot;The-letter-not-to-be-confused-with-Ø-em-queue&quot;, or if you are a mathematician, &quot;empty-set-times-M-times-Q&quot;. The rest of us can continue to say &quot;zero-em-queue&quot;.</p> <p>For the collectors of software trivia, ∅MQ is possibly the very first product ever to use a Unicode name. Where ∅MQ goes, Gøøgle cannot follow!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:clojure</guid>
				<title>ØMQ for Clojure</title>
				<link>http://zeromq.wikidot.com/blog:clojure</link>
				<description>

&lt;p&gt;Jeff Tucker blogs about setting up ØMQ for Clojure:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 27 Aug 2010 05:39:42 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Jeff Tucker blogs about setting up ØMQ for Clojure:</p> <p><a href="http://blog.trydionel.com/2010/08/25/setting-up-0mq-for-clojure-on-osx/">http://blog.trydionel.com/2010/08/25/setting-up-0mq-for-clojure-on-osx/</a></p> <p>Subsequent blog explores Clojure/Ruby interop via ØMQ:</p> <p><a href="http://blog.trydionel.com/2010/08/26/using-0mq-for-clojure-and-ruby-interop/">http://blog.trydionel.com/2010/08/26/using-0mq-for-clojure-and-ruby-interop/</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:braindump</guid>
				<title>ZeroMQ: What You Need to Know Braindump</title>
				<link>http://zeromq.wikidot.com/blog:braindump</link>
				<description>

&lt;p&gt;Andrew Cholakian writes, &lt;a href=&quot;http://blog.andrewvc.com/zeromq-what-you-need-to-know-braindump&quot;&gt;on his blog&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 17 Aug 2010 07:20:43 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Andrew Cholakian writes, <a href="http://blog.andrewvc.com/zeromq-what-you-need-to-know-braindump">on his blog</a>:</p> <blockquote> <p>The more time I spend with ZeroMQ, the less I can think of a reason I'd ever have to open up a raw TCP or UDP socket, except in extraordinary circumstances, again. I think of ZMQ as common IPC and network communication patterns abstracted into messages and sockets that don't require a broker infrastructure. The whole message queue aspect of it is great, but ZMQ is really designed for a whole range of situations you'd never use AMQP for, and IMHO, that's the truly interesting thing about it. You don't really run ZMQ brokers (mostly), you communicate socket to socket using queue semantics.</p> </blockquote> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:rfc-0mq-contributions</guid>
				<title>RFC: ØMQ Contributions, Copyrights and Control</title>
				<link>http://zeromq.wikidot.com/blog:rfc-0mq-contributions</link>
				<description>

&lt;p&gt;We started ØMQ almost three years ago with the goal of building an open source low-latency fabric. At the time we chose a policy of centralized copyrights. We asked contributors to sign over their copyrights via a CLA. Later we switched to accepting contributions under the MIT/X11 license, which allows sublicensing.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 03 Aug 2010 10:46:26 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>We started ØMQ almost three years ago with the goal of building an open source low-latency fabric. At the time we chose a policy of centralized copyrights. We asked contributors to sign over their copyrights via a CLA. Later we switched to accepting contributions under the MIT/X11 license, which allows sublicensing.</p> <p>Today, I want to change that policy. ØMQ is a great product for several reasons but to me, the work of volunteers is key. And today's policy is unfair to those contributing to ØMQ. Which means that over time, it's bad for ØMQ. We want ØMQ to become a standard part of every programmer's toolbox, a standard component on every connected box. That won't happen so long as the source code insists on being the property of one business.</p> <p>We as a community are building an open ecosystem for scalable distributed services. We share the belief that such an ecosystem is worth orders of magnitude more than the sum of what any of us can make alone. We therefore work together, as peers, profiting from the new solutions that the ecosystem makes possible, rather than exploiting and ultimately draining the ecosystem itself.</p> <p>So here's my plan. We like the LGPL and will stick to that. All source code will use the standard text:</p> <blockquote> <p>ØMQ is free software; you can redistribute it and/or modify it under the terms of the Lesser GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.</p> </blockquote> <p>Which lets us upgrade to future versions of the LGPL when they emerge in 10 or 20 years' time. And the copyright statement on existing and derived source files will say:</p> <blockquote> <p>Copyright (c) 2007-2010 iMatix Corporation and contributors</p> </blockquote> <p>Which seems accurate and fair, while new source files may use whatever copyright statement is suitable. For contributors, things now become really simple: <em>publish your new work under the LGPL, publish derived works under LGPL, publish patches under LGPL</em>. It allows free remixability in directions under a single mutual contract, the LGPL.</p> <p>By creating shared ownership of the full work, we also safeguard against any future relicense switch that could hurt our users. It's appropriate that a distributed decentralized technology with no single point of failure have a distributed, decentralized ownership with no single point of failure.</p> <p>Finally, write access to the git repository. Unclear copyright provenance has been the main reason to keep this limited and to not expand the git repository to include satellite projects. But if all contributors own their work, anyone with credentials can become a committer and the git repository can grow.</p> <p>We do need strict quality control on commits to the git repository. So I'd like to expand the current set of committers. You might be looking after some specific parts of the git, or helping with overall organization. The set of committers would be self-selected from known and trusted ØMQ contributors.</p> <p>The committers will also have authority on releases, API changes, and the other contracts that bind us together as a community. There is no reason for iMatix to have a point of view on this except as one voice within a group of peers.</p> <p>With these changes, which we'll introduce carefully once we've all discussed this, I hope that ØMQ will continue to grow healthily, and fairly to all of us who love this product and want to see it in widespread use.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:new-0mq-labs</guid>
				<title>New -  ØMQ Labs!</title>
				<link>http://zeromq.wikidot.com/blog:new-0mq-labs</link>
				<description>

&lt;p&gt;The sign of a healthy open source project is an active community, and the ZeroMQ community is one of the most creative and active around. We&#039;re still small, only a few hundred people on the zeromq-dev list, but there is something magical about this software. As we unpack, build, and start to use it, it opens doors that we never even knew existed. The impossible becomes feasible, then obvious. Pure scalability is an exciting catalyst and even the most jaded developer, watching &lt;a href=&quot;http://www.zeromq.org/blog:video-introduction&quot;&gt;Oliver Smith&#039;s video intro&lt;/a&gt;, starts to wonder, &amp;quot;&lt;em&gt;what could I make with this&amp;#8230;?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 02 Aug 2010 19:54:14 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>The sign of a healthy open source project is an active community, and the ZeroMQ community is one of the most creative and active around. We're still small, only a few hundred people on the zeromq-dev list, but there is something magical about this software. As we unpack, build, and start to use it, it opens doors that we never even knew existed. The impossible becomes feasible, then obvious. Pure scalability is an exciting catalyst and even the most jaded developer, watching <a href="http://www.zeromq.org/blog:video-introduction">Oliver Smith's video intro</a>, starts to wonder, &quot;<em>what could I make with this&#8230;?</em></p> <p>We've started to document open source projects that use ZeroMQ. But most projects start as ideas or prototypes, and so we're collecting ideas and works in progress from the mailing list, so that people exploring ZeroMQ can see what others are working on.</p> <p>This is <a href="http://zeromq.wikidot.com/docs:labs">ØMQ Labs</a>. It's nothing complex, just a list of stuff that people are thinking about, or working on. There are projects like Matt Weinstein's Reactor Pattern, and Oliver Smith's research into parallel sorts running over ZeroMQ. Feel free to add your ideas and projects.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:video-introduction</guid>
				<title>Video Introduction to ØMQ</title>
				<link>http://zeromq.wikidot.com/blog:video-introduction</link>
				<description>

&lt;p&gt;Oliver Smith has produced this lovely video explaining ØMQ and showing off its main features, live:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=99&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;pieterh&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=99)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/pieterh&quot;  &gt;pieterh&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 26 Jul 2010 14:02:44 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Oliver Smith has produced this lovely video explaining ØMQ and showing off its main features, live:</p> <div style="text-align: center;"> <div class="error-block">Sorry, no match for the embedded content.</div> </div> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=99&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://zeromq.wikidot.com/blog:cpan</guid>
				<title>ØMQ available at CPAN</title>
				<link>http://zeromq.wikidot.com/blog:cpan</link>
				<description>

&lt;p&gt;Thanks to Steffen Müller Perl binding for ØMQ released on CPAN:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=939&amp;amp;amp;size=small&amp;amp;amp;timestamp=1773494399&quot; alt=&quot;martin_sustrik&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=939)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/martin-sustrik&quot;  &gt;martin_sustrik&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 13 Jul 2010 20:19:58 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Thanks to Steffen Müller Perl binding for ØMQ released on CPAN:</p> <p><a href="http://search.cpan.org/dist/ZeroMQ/">http://search.cpan.org/dist/ZeroMQ/</a></p> <p>Enjoy!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/martin-sustrik" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=939&amp;amp;size=small&amp;amp;timestamp=1773494399" alt="martin_sustrik" style="background-image:url(http://www.wikidot.com/userkarma.php?u=939)" /></a><a href="http://www.wikidot.com/user:info/martin-sustrik" >martin_sustrik</a></span></p> 
				 	]]>
				</content:encoded>							</item>
				</channel>
</rss>