<?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 site updates</title>
		<link>http://www.zeromq.org</link>
		<description></description>
				<copyright></copyright>
		<lastBuildDate>Sun, 05 Feb 2012 02:35:54 +0000</lastBuildDate>
		
					<item>
				<guid>http://www.zeromq.org/docs:contributing</guid>
				<title>Contributing to a ØMQ project</title>
				<link>http://www.zeromq.org/docs:contributing</link>
				<description>

&lt;h2&gt;&lt;span&gt;How We Work Together&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/mato&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=11772&amp;amp;size=small&amp;amp;timestamp=1328409352&quot; alt=&quot;mato&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=11772)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/mato&quot;  &gt;mato&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 29 Sep 2010 14:15:15 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h2><span>How We Work Together</span></h2> <h3><span>Git and Github</span></h3> <p>The ØMQ Community uses the <a href="http://www.git-scm.com">git</a> version control system, and the <a href="https://github.com">GitHub</a> cloud for its repositories.</p> <p>The ØMQ Community consists of a number of projects, each with its own public git repository, or &quot;git&quot;. Each git has an owner or owners (with admin rights), contributors (with read/write rights), and users (with read access). Each project organizes its git as it wishes. A project is &quot;official&quot; when it is held under the <strong>zeromq</strong> organisation at GitHub, otherwise it is &quot;unofficial&quot;. To make your project &quot;official&quot;, discuss on the mailing list. The <strong>zeromq</strong> organisation owners group have the privileges to create new projects.</p> <p>We use github's pull request model for changes. To make a change you fork the git in question, make and test your changes, and then make a <a href="http://help.github.com/pull-requests/">pull request</a>. The benefit of a pull request is that it is trackable, like an issue. Pull requests only work from a fork back to the original project.</p> <p>You will need a free github account to work with us. We have no hard opinion on github except that we rather like it and it seems to encourage people to work together. The process is independent of github and we could switch in the future.</p> <p>At all times, remember that it's up to you, as contributor, to convince others that your work is worth including. This means: make it useful, neat, test it fully, discuss it upfront, and so on.</p> <h3><span>Getting Started</span></h3> <p><strong><a href="http://www.git-scm.com/download">Download</a> and install git</strong>. On Linux, <em>apt-get install git</em>. If you're new to git, read the <a href="http://www.git-scm.com/documentation">git docs</a>, and <a href="http://progit.org/book/">Pro git</a> by Scott Chacon.</p> <p><strong>Ensure that your copy of git is configured</strong> with your real name and the e-mail address you wish to be associated with your contributions. This is required to correctly track authorship:</p> <div class="code"> <pre> <code>$ git config --global user.name &quot;Your Name&quot; $ git config --global user.email your.name@example.com</code> </pre></div> <p><strong>Create a user profile at <a href="https://github.com">GitHub</a></strong> with your real name and the same email you used to configure your git.</p> <p><strong>Configure your Bash prompt</strong> if you are on Linux by copying <a href="https://gist.github.com/866124">this into your .bashrc</a> or .bash_profile.</p> <p><strong>Do your research</strong>. To contribute to a project, you need to know (a) the owner of that project and (b) the location of the git at github. If it's not obvious, ask on zeromq-dev.</p> <h3><span>Basic Techniques</span></h3> <p>If you're new to git, especially if you come from SVN, you work by getting full copies of the repository on your local hard disk, and then exchanging sets of changes to and from other gits. It sounds complex, and sometimes is, but it works very well for large loose groups like ours.</p> <p><strong>A git is a set of 'branches'</strong>, starting with the 'master' branch. Use 'git branch' to see what branches you have.</p> <p><strong>To get a git onto your hard disk</strong>: use the 'git clone' command (using the ØMQ <a href="http://www.zeromq.org/docs:source-git">source git</a> as example):</p> <div class="code"> <pre> <code>$ git clone git://github.com/zeromq/zeromq2.git</code> </pre></div> <p>Behind a firewall you may need to use 'http:' instead of 'git:'.</p> <p><strong>Your clone has an origin</strong>, which is a 'remote' by that name. Use 'git remote -v' to see what remotes you have.</p> <p><strong>To make your changes</strong>: use your favorite tools to edit, compile, build, test. Do not allow your editor to reformat code you're not changing, or remove whitespaces elsewhere, this will make your patches useless.</p> <p><strong>To commit your work</strong>: use 'git add (files)' and 'git commit'. Use 'git commit &#8212;amend' to add to or fix up the previous commit.</p> <p>The 'git commit' command opens an editor for you to enter a commit message. Provide a 1-line summary, followed by a blank line, followed by a description of what you changed. The commit message becomes part of the permanent history of the project if your changes are accepted, so be clear and concise. And check your sleppling.</p> <p><strong>To abandon your changes</strong>: either wipe your directory and re-clone the project git, or use the 'git reset' command. All git commands have help ('git reset &#8212;help'), and extensive explanation online.</p> <p><strong>To push a branch to a remote</strong>: 'git push &lt;branchname&gt; &lt;remotename&gt;', usually 'git push master origin'.</p> <p><strong>To pull a branch from a remote</strong>: 'git pull master origin', which fetches the master branch from the origin remote, and merges it into your local master branch.</p> <h3><span>The Pull Model</span></h3> <p>The home page for the project git has a button &quot;Fork&quot;, which will fork the project into your own profile. Click it, and you get a fork of the project git. Now clone your <em>forked git</em> to your hard disk. Now work and commit your work as explained in Basic Techniques, and push your changed branches back to your fork.</p> <p>When you're ready to send your work to the project owner, go to github.com and click the &quot;pull request&quot; button. Follow the instructions, and it should all be crystal clear.</p> <h3><span>Separate Your Changes</span></h3> <p>Separate different independent <em>logical</em> changes into separate commits (and thus separate patch submissions) when at all possible. This allows each change to be considered on it's own merits. Also, it is easier to review a batch of independent changes rather than one large patch.</p> <h3><span>Write Good Commit Messages</span></h3> <p>Commit messages become the public record of your changes, as such it's important that they be well-written. The basic format of git commit messages is:</p> <ul> <li>A single summary line. This should be short &#8212; no more than 70 characters or so, since it can be used as the e-mail subject when submitting your patch and also for generating patch file names by 'git format-patch'. If your change only touches a single file or subsystem you may wish to prefix the summary with the file or subsystem name.</li> <li>A blank line.</li> <li>A detailed description of your change. Where possible, write in the present tense, e.g. &quot;Add assertions to zmq_foo()&quot;. If your changes have not resulted from previous discussion on the mailing list you may also wish to include brief rationale on your change. Your description should be formatted as plain text with each line not exceeding 80 characters.</li> </ul> <h3><span>Give Yourself Credit</span></h3> <p>Add yourself to the CONTRIBUTORS file or other lists of contributors for the project, with your commit. The maintainers won't do this, it's your choice whether you consider your patch worth a mention, or not.</p> <p>You must make contributions under your real name, associated with your github account. Anonymous contributions may be made via proxies, ask on IRC if someone will help you.</p> <h3><span>Copyrights and Licenses</span></h3> <p>Make sure your contributions do not include code from projects with incompatible licenses. ZeroMQ uses the LGPLv3 with a static linking exception. If your code isn't compatible with this, it will sooner or later be spotted and removed. The best way to avoid any license issues is to write your own code.</p> <h2><span>Contributing to libzmq</span></h2> <p>Since January 2012 libzmq has a new contribution process adapted from other successful ZeroMQ commmunities such as PyZMQ.</p> <p>The goals of this process are to:</p> <ol> <li>To remove all barriers to new contributors to libzmq, so that we allow more people to become core contributors to libzmq.</li> <li>To allow anyone with process discipline to become a maintainer of libzmq without requiring knowledge of the codebase.</li> <li>To encourage safe experimentation and learning without risk to stable versions and existing users.</li> <li>To reduce the number of github repositories we use, without making libzmq more complex internally.</li> <li>To reduce the risk of human error or negligence in the delivery of packages to end users.</li> </ol> <h3><span>Philosophy</span></h3> <ul> <li>All contributors to libzmq are equal; we all own the code and we all have equal rights to make patches.</li> <li>The economics of any patch (its relevance, accuracy, and value) are decided by end-users, not by other contributors, nor by the maintainers.</li> <li>The maintainers may have an opinion on the quality of the patch, see below.</li> <li>Contributors experiment in their own repositories and contribute patches back to libzmq when they wish to.</li> <li>The team that manages patches back to libzmq are the &quot;maintainers&quot;. Maintainers are not developers and they have no opinion on patches; their job is to enforce process.</li> <li>Our opinion on patches is that a bad patch is better than no patch: it encourages discussion, stimulates growth of the community, and offers a beginner a way to improve.</li> <li>We also believe in getting minimal changes rapidly to real users, and encouraging organic improvement through small steps, rather than making large, dramatic, and stressful changes.</li> <li>If you want an analogy for the Maintainer role, think of Wikipedia. We enforce process, stop outright spam and abuse, but allow others to argue value.</li> <li>For a comparison with other development processes, see <a href="http://unprotocols.org/blog:19">this article</a>.</li> </ul> <h3><span>Patch Quality</span></h3> <p>Maintainers <em>may</em> reject patches or ask for improvements based on objective quality criteria. These are:</p> <ul> <li>How clearly the patch is explained and how far it is anchored on previous discussion on zeromq-dev. Patches that come from nowhere and are not lucidly explained risk being rejected.</li> <li>Whether the author of the patch is using his real name in his github account, or not.</li> </ul> <p>Any contributor with opinions on the quality of a patch is encouraged to express them via further patches.</p> <h3><span>Guidelines</span></h3> <ul> <li>Patch authors SHOULD update NEWS if their patch fixes a bug or adds functionality. All changes to NEWS should be consistent with previous style. This maintainer strongly suggests the <a href="https://github.com/zeromq/zeromq2-1/blob/master/NEWS">style from ZeroMQ/2.1</a>.</li> </ul> <ul> <li>Patch authors SHOULD NOT modify the libzmq version number. This is a maintainer decision.</li> </ul> <ul> <li>A patch MUST adhere to the <a href="http://www.zeromq.org/docs:style">ZeroMQ Coding Style Guidelines</a>.</li> </ul> <ul> <li>Patches SHOULD NOT include substantial code from other projects, for several reasons. First, it can create licensing difficulties. Second, it creates bundled dependencies that are troublesome to keep accurate over time. Third, it creates risk for ZeroMQ since foreign code lives outside our community. Exceptions are code that you can cleanly rewrite and take ownership of.</li> </ul> <h3><span>How it Works</span></h3> <ul> <li>The <em>master</em> branch of libzmq holds the latest bleeding edge version and is always assumed to build though it will always be considered &quot;unstable&quot;.</li> </ul> <ul> <li>Releases are given their own branches using major-minor names (&quot;3-1&quot;, &quot;3-2&quot;). Each release branch will progress through unstable to stable, and then legacy, with tags for each formal release.</li> </ul> <ul> <li>Anyone who wishes to make a patch to libzmq forks the repository and works on their private copy. When they are ready to contribute their patch they make a github pull request.</li> </ul> <ul> <li>All direct commits to libzmq are forbidden, no exceptions.</li> </ul> <ul> <li>The maintainers will aggressively and optimistically merge pull requests back to libzmq master, with minimal opinion on quality and relevance. The only hard requirement is that the patch can be automatically merged.</li> </ul> <ul> <li>Patches on stable releases will only be accepted for bug fixes, and require reproducible test cases. The maintainers will use these test cases to ensure that patches work.</li> </ul> <ul> <li>Experimental and raw work exists as unofficial personal forks of libzmq that maintainers (and the community) have no opinion on, do not attempt to document, or manage.</li> </ul> <ul> <li>If the maintainers do have any quality opinions on patches to master, it is that small patches are preferred over large ones. Any patch that seems oversized may be rejected on that basis alone.</li> </ul> <ul> <li>All pull requests are echoed to the zeromq-dev list and discussions of the patch will happen on the list and/or the github pull request as people like. <em>Note: this is not yet working, so please email zeromq-dev with news of your pull request.</em></li> </ul> <ul> <li>Anyone who is discontent with a patch will make their own patch to fix or reverse the previous patch. Again, maintainers have no opinion on this.</li> </ul> <h3><span>To Add a New Feature</span></h3> <p>To contribute a new feature, one forks libzmq, writes and tests a minimal implementation of the new feature and makes a pull request. All pull requests are automatically published to zeromq-dev for review and comment. The maintainers at their discretion merge the pull request onto master. From then on, it will be included in automatic builds and tested by early adopters. When a minimal implementation gets consensus approval, one improves and extends it, and documents it.</p> <h3><span>How Releases are Made</span></h3> <p>Maintainers make releases in response to the flow of changes from the community. In general these rules of thumb apply:</p> <ul> <li>A formal unstable release (off master) is the main way of getting important new functionality to users, who often will not trust git master branches. So, the maintainers will make unstable packages in order to drive speculative testing of new features by real users. The right moment to make an unstable release is when a series of edits (patches) have slowed down and started to stabilize.</li> </ul> <ul> <li>When a branch is released as unstable, the maintainers may decide to create a formal major-minor branch. They may also keep some iterations on master. If they create a branch, they will need to merge commits to master to that branch. The advantage is that other changes can be continued independently of the branch.</li> </ul> <ul> <li>A major-minor branch becomes naturally more stable as issues are solved, and maintainers will use change frequency to decide how to push such a branch through from beta to stable, and finally to legacy.</li> </ul> <h3><span>To Fix a Bug in a Stable Release</span></h3> <p>To contribute a bug fix, one forks libzmq, writes and tests the bug fix, and makes a pull request to master. The maintainers check that there is a proper test case (for fixes to stable branches) and retest the fix after merging the pull request. The maintainers then merge that fix to the various branches it affects, and the bug fix is then included in automatic builds of that branch and will go into new packages. The maintainers will treat bug fixes that cannot be tested with extreme skepticism.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/mato" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=11772&amp;size=small&amp;timestamp=1328409352" alt="mato" style="background-image:url(http://www.wikidot.com/userkarma.php?u=11772)" /></a><a href="http://www.wikidot.com/user:info/mato" >mato</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/docs:style</guid>
				<title>Coding Style Guidelines</title>
				<link>http://www.zeromq.org/docs:style</link>
				<description>

&lt;h3&gt;&lt;span&gt;General rules&lt;/span&gt;&lt;/h3&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;size=small&amp;amp;timestamp=1328409352&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, 18 Mar 2009 20:43:07 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h3><span>General rules</span></h3> <ul> <li>Maximal line length is limited to 80 characters.</li> <li>If a statement has to be broken into two lines, second (and any subsequent) line should be indented by one level.</li> <li>Indentation is always done using spaces, tabs are never used.</li> <li>One level of indentation is 4 characters long.</li> <li>Each file starts with a header containing the short license text.</li> </ul> <h3><span>Comments</span></h3> <p>Both C and C++ style comments are allowed.</p> <ul> <li>C style comments (<span style="white-space: pre-wrap;">/*&#32;*/</span>) should be used for large block of comments, mostly at the beginning of the file.</li> <li>The code itself should be commented by C++ line comments (<span style="white-space: pre-wrap;">//</span>).</li> <li>Code should be broken to small pieces (couple of lines each), every piece doing one simple task.</li> <li>Each piece should be preceded by a comment explaining what is its intent.</li> <li>Each code piece should be followed by a blank line.</li> <li>C++ style line comment starts with two slashes followed by two spaces.</li> <li>The text of comment begins with a capital letter and ends by a period.</li> </ul> <div class="code"> <pre> <code>// Compute the factorial. int factorial = 1; for (int i = 2; i != 11; i++) factorial *= i; // Present the result to the user. cout &lt;&lt; &quot;Factorial of 10 is &quot; &lt;&lt; factorial &lt;&lt; &quot;.&quot; &lt;&lt; endl;</code> </pre></div> <h3><span>Identifiers</span></h3> <p>Identifiers are in lower case. If identifier consists of multiple words, the words are separated by underscores.</p> <p>Identifiers should be meaningful rather than arbitrary. The only exception are control variables of short cycles where short names like <em>i</em>, <em>it</em> etc. can be used.</p> <div class="code"> <pre> <code>int sum = 0; for (int i = 0; i != 100; i++) sum += i;</code> </pre></div> <p>The type of the variable should not be explicitly marked in the identifier. I.e. no hungarian notation.</p> <p>Function arguments should end by underscore. This way we can distinguish function arguments from member variables with the same name:</p> <div class="code"> <pre> <code>struct complex_t { complex_t (float real_, float imaginary_) : real (real_), imaginary (imaginary_) { } float real; float imaginary; };</code> </pre></div> <p>Identifier for types (structs, classes, enums, typedefs) are postfixed by &quot;_t&quot; (e.g. <em>complex_t</em>).</p> <h3><span>Code blocks</span></h3> <p>For functions, structures, classes, enums and namespaces both opening bracket and closing bracket are placed on separate lines:</p> <div class="code"> <pre> <code>void fx () { // Code goes here. }</code> </pre></div> <p>With <em>for</em>, <em>while</em>, <em>if</em> and <em>else</em> blocks opening bracket is on the same line as the control statement:</p> <div class="code"> <pre> <code>if (sum &gt; 1000) { // Code goes here. }</code> </pre></div> <p>Even if <em>for</em>, <em>while</em>, <em>if</em> or <em>else</em> block contains only a single statement, the statement should be placed on a separate line:</p> <div class="code"> <pre> <code>if (end) exit (1);</code> </pre></div> <p>If the indenting of the controlled block incidentally collides with the control statement that's broken into two lines, second line of the control statement should be indented by 6 spaces rather than 4 to prevent confusion:</p> <div class="code"> <pre> <code>if (very_long_variable_name == 10000 &amp;&amp; another_horrendous_variable_name == 1000000 &amp;&amp; ludicrously_long_variable_name == 1000000000) counter++;</code> </pre></div> <h3><span>Operators</span></h3> <p>Unary operators are not separated from the expression in any way:</p> <div class="code"> <pre> <code>counter++;</code> </pre></div> <p>Binary operators should be separated from adjacent expression by spaces:</p> <div class="code"> <pre> <code>z = x + y;</code> </pre></div> <p>Subscripts and function calls are separated from the expression by space:</p> <div class="code"> <pre> <code>fx (my_array [0]);</code> </pre></div> <p>String concatenation (PHP) should be separated by spaces:</p> <div class="code"> <pre> <code>$foo = $bar . &quot; &quot; . $bat;</code> </pre></div> <h3><span>Exceptions</span></h3> <ul> <li>Assertions say that the 0MQ developers do not expect this situation to ever happen, i.e. it is an internal error that demands a fix to the 0MQ code.</li> </ul> <ul> <li>Errors say that the 0MQ developers expect this situation to happen in applications, i.e. it is an external error that suggests a fix to the application.</li> </ul> <ul> <li>C++ exceptions are not to be used within the core codebase.</li> </ul> <h3><span>Public Interfaces</span></h3> <p>Public interfaces of components must not be called by code inside the interface.</p> <p>For example, this is not allowed:</p> <div class="code"> <pre> <code>int f(int x) { return g (x); } int fsucc(int x) { return f (x) + 1; }</code> </pre></div> <p>Reserving public interfaces for the public is necessary for maintenance of public invariants, whilst allowing encapsulated implementation manipulators to work with weaker invariants temporarily. Even the mere existence of an otherwise correct call stands in the way of simple code changes, and particularly transparent invasions such as provided by external tracing and profiling tools. We don't want to confuse public calls to functions with internal calls, and we don't want to count inner calls when profiling.</p> <p>The 0MQ system demands an invariant of socket I/O: no two threads may perform I/O at the same time. There are two ways this invariant can be maintained: by the client, or by 0MQ. In the latter case wrapping the code bodies of the function calls with a mutex lock suffices, however if one public API doing this called another there'd be an immediate deadlock.</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;size=small&amp;timestamp=1328409352" 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://www.zeromq.org/bindings:smalltalk</guid>
				<title>Smalltalk</title>
				<link>http://www.zeromq.org/bindings:smalltalk</link>
				<description>

&lt;h1&gt;&lt;span&gt;Smalltalk variant: GNU Smalltalk&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/vijaymathew&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=785524&amp;amp;size=small&amp;amp;timestamp=1328409352&quot; alt=&quot;vijaymathew&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=785524)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/vijaymathew&quot;  &gt;vijaymathew&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 22 Mar 2011 15:50:08 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Smalltalk variant: GNU Smalltalk</span></h1> <p>The GNU Smalltalk binding is in its initial stage. We have the most important core functions working.<br /> If you are planning to write a binding for some other Smalltalk, please try to co-ordinate your<br /> effort with us so that all bindings share a common high-level interface.</p> <h3><span>Github</span></h3> <p><a href="https://github.com/vijaymathew/gst_zmq">https://github.com/vijaymathew/gst_zmq</a></p> <h3><span>Contact</span></h3> <p><span class="wiki-email">moc.liamg|remehcs.eht.yajiv#moc.liamg|remehcs.eht.yajiv</span></p> <h3><span>Mailing List</span></h3> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list.</p> <h1><span>Smalltalk variant: Pharo &amp; Squeak</span></h1> <p>See <a href="http://www.squeaksource.com/ZeroMQ.html">http://www.squeaksource.com/ZeroMQ.html</a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/vijaymathew" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=785524&amp;size=small&amp;timestamp=1328409352" alt="vijaymathew" style="background-image:url(http://www.wikidot.com/userkarma.php?u=785524)" /></a><a href="http://www.wikidot.com/user:info/vijaymathew" >vijaymathew</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/area:faq</guid>
				<title>Frequently Asked Questions</title>
				<link>http://www.zeromq.org/area:faq</link>
				<description>

&lt;table style=&quot;margin:0; padding:0&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;margin:0; padding:0&quot;&gt;
&lt;div id=&quot;toc&quot;&gt;
&lt;div id=&quot;toc-action-bar&quot;&gt;&lt;a href=&quot;javascript:;&quot;  &gt;Fold&lt;/a&gt;&lt;a style=&quot;display: none&quot; href=&quot;javascript:;&quot;  &gt;Unfold&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Table of Contents&lt;/div&gt;
&lt;div id=&quot;toc-list&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;size=small&amp;amp;timestamp=1328409352&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, 28 Jul 2008 12:18:01 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <table style="margin:0; padding:0"> <tr> <td style="margin:0; padding:0"> <div id="toc"> <div id="toc-action-bar"><a href="javascript:;" >Fold</a><a style="display: none" href="javascript:;" >Unfold</a></div> <div class="title">Table of Contents</div> <div id="toc-list"> <div style="margin-left: 1em;"><a href="#toc0">General</a></div> <div style="margin-left: 1em;"><a href="#toc1">Platform and Patterns</a></div> <div style="margin-left: 1em;"><a href="#toc2">Performance</a></div> <div style="margin-left: 1em;"><a href="#toc3">Monitoring</a></div> <div style="margin-left: 1em;"><a href="#toc4">Security</a></div> <div style="margin-left: 1em;"><a href="#toc5">Building</a></div> </div> </div> </td> </tr> </table> <h1><span>General</span></h1> <p><strong>How do I start the ØMQ daemon?</strong></p> <p>There are no services or daemons to start: ØMQ is a library. Compile and link an <a href="http://zguide.zeromq.org/chapter:all">example</a> and run it. ØMQ applications speak to each other directly.</p> <p><strong>How do I use a regular BSD socket to communicate with a ØMQ socket?</strong></p> <p>ØMQ has its own wire-level protocol. In order for a regular socket to communicate with it, that regular socket would need to send messages conforming to that protocol. Additionally, please read the section in the guide detailing how <a href="http://zguide.zeromq.org/page:all#-MQ-is-Not-a-Neutral-Carrier">ØMQ is not a neutral carrier</a> for your data.</p> <p><strong>Does ØMQ support IP multicast?</strong></p> <p>Yes, ØMQ includes <a href="http://en.wikipedia.org/wiki/Pragmatic_General_Multicast">Pragmatic General Multicast</a> (<a href="http://www.rfc-editor.org/cgi-bin/rfcdoctype.pl?loc=RFC&amp;letsgo=3208&amp;type=http&amp;file_format=txt">RFC 3208</a>) support using the excellent <a href="http://code.google.com/p/openpgm/">OpenPGM</a> implementation.</p> <p><strong>Does ØMQ store messages on disk?</strong></p> <p>No. Do not even think about that. (Even when 2.1.x has a feature that looks like that)</p> <p><strong>Does ØMQ include APIs for serializing data to/from the wire representation?</strong></p> <p>No. This design decision adheres to the UNIX philosophy of &quot;do one thing and do it well&quot;. In the case of ØMQ, that one thing is moving messages, not marshalling data to/from binary representations.</p> <p>Some middleware products do provide their own serialization API. We believe that doing so leads to bloated wire-level specifications like <a href="http://www.omg.org/docs/formal/04-03-12.pdf">CORBA</a> (1055 pages). Instead, we've opted to use the simplest wire formats possible which ensure easy interoperability, efficiency and reduce the code (and bug) bloat.</p> <p>If you wish to use a serialization library, there are plenty of them out there. See for example <a href="http://code.google.com/p/protobuf/">Google Protocol Buffers</a>.</p> <p><strong>I'm trying to send data using the <em>pgm/epgm</em> transport and I get &quot;Protocol not supported&quot;. Why?</strong></p> <p>You need to have ØMQ built with the <tt>&#8212;with-pgm</tt> option for this to be enabled.</p> <p><strong>How can I integrate ØMQ sockets with normal sockets? Or with a GUI event loop?</strong></p> <p>You can use the <em>zmq_poll()</em> function to poll for events on both ØMQ and normal sockets. The <em>zmq_poll()</em> function accepts a timeout so if you need to poll and process GUI events in the same application thread you can set a timeout and periodically poll for GUI events. See the <a href="http://github.com/mato/zeromq-examples/blob/master/zmq-camera.c">zmq-camera example</a> for a demonstration.</p> <p><strong>Why can't I use standard I/O multiplexing functions such as <em>select()</em> or <em>poll()</em> on ØMQ sockets?</strong></p> <p>ØMQ socket is not a standard POSIX socket. It would be great if it was, however, POSIX doesn't provide a mechanism to simulate file descriptors in user space. To convert ØMQ sockets into POSIX file descriptors we would have either to move ØMQ to kernel-space or hack the kernel to provide the functionality needed. In both cases we would have to sacrifice portability and stick to a single operating system. Note that there's a way to retrieve a file descriptor from ØMQ socket (ZMQ_FD socket option) that you can poll on from version 2.1 onwards, however, there are some serious caveats when using it. Check the documentation carefully before using this feature.</p> <p><strong>When sending a multipart message, my receiver doesn't get any message parts until the last part is sent. Is ØMQ broken?</strong></p> <p>The ØMQ library guarantees that multipart messages are sent <strong>and</strong> received atomically. A message cannot be delivered by the library to your application until all frames have been received. Obviously, this cannot happen while the sender still has parts pending or in queue.</p> <p>There are two reasons for multipart message support in the library.</p> <p>1. This function supports a scatter/gather-style for message transmission so the application can <strong>avoid</strong> memcpy'ing the (potentially) large data to a single message. Zero copy is a huge performance win particularly for large messages.<br /> 2. Multipart support may help a protocol designer to logically separate their protocol into separate frames at the application level. This may ease parsing on the receiving end since not all languages support fast bit-twiddling for binary structures like C.</p> <p><strong>How do I use the ZMQ_SWAP socket feature to persist my data to disk?</strong></p> <p>It is not the responsibility of the library to handle data persistence. If you need to make sure no messages are ever lost, you need to write application-level code to persist your data to non-volatile memory and handle the recovery modes of your application. Also, ZMQ_SWAP is deprecated and will be removed in the 3.x series of releases since it confuses many people over proper usage.</p> <p><strong>Is it possible to receive EAGAIN or to block when sending a multi-part message?</strong></p> <p>Multipart messages are sent as an atomic unit. If one part is sent successfully, then the socket is guaranteed to not block or return EAGAIN until all parts have been sent. Of course, if you run out of memory in the meantime then the guarantee doesn't mean much, so don't try to send messages that exceed available memory.</p> <p><strong>Are you trying to tell me that ØMQ won't magically save me from out-of-memory conditions?</strong></p> <p>You are a perfect candidate for using AMQP or JMS. Please use google to find more information on libraries that support those platforms and protocols.</p> <h1><span>Platform and Patterns</span></h1> <p><strong>I want to write a program using ØMQ sockets. Which socket types should I use?</strong></p> <p>Please <a href="http://zguide.zeromq.org/page:all" target="_blank">read the guide</a>. It covers each socket pattern along with their use-cases. For further assistance, please join the mailing list or IRC and ask for help. Please do not be upset if the first question asked is, &quot;Have you read the Guide yet?&quot;</p> <p><strong>My multi-threaded program keeps crashing in weird places inside the ØMQ library. What am I doing wrong?</strong></p> <p>ØMQ sockets <strong>are not</strong> thread-safe. This is covered in some detail <a href="http://zguide.zeromq.org/page:all" target="_blank">in the Guide</a>.</p> <p>The short version is that sockets should not be shared between threads. We recommend creating a dedicated socket for each thread.</p> <p>For those situations where a dedicated socket per thread is infeasible, a socket may be shared <strong>if and only if</strong> each thread executes a full memory barrier before accessing the socket. Most languages support a Mutex or Spinlock which will execute the full memory barrier on your behalf.</p> <p>For more information, please <a href="http://zguide.zeromq.org/page:all" target="_blank">read the Guide</a>.</p> <p><strong>Why do I see different behavior when I bind a socket versus connect a socket?</strong></p> <p>ØMQ creates queues per underlying connection, e.g. if your socket is connected to 3 peer sockets there are 3 messages queues.</p> <p>With bind, you allow peers to connect to you, thus you don't know how many peers there will be in the future and you cannot create the queues in advance. Instead, queues are created as individual peers connect to the bound socket.</p> <p>With connect, ØMQ knows that there's going to be at least a single peer and thus it can create a single queue immediately.</p> <p>Consequently, when sending a message to bound socket with no peers, there's no queue to store the message to. Not so with connected socket.</p> <p><strong>I'm worried about my application heartbeats queueing up behind lower-priority data and causing a disconnect. How can I send a message with higher priority so it jumps forward in the queue?</strong></p> <p>There is no concept of message priority enforced by the library. We suggest opening a second set of sockets for the purposes of passing heartbeats. Alternately, modify your application so that it considers any incoming message as a renewal of the heartbeat from its source. This allows the application to save bandwidth and heartbeat only when there is no other traffic on the network.</p> <p><strong>I need to have multiple sockets share a single TCP connection (host + port). How can I accomplish this?</strong></p> <p>ØMQ cannot multiplex streams over a single connection. This is being investigated as a future enhancement. Join the mailing list or IRC and let yourself be heard.</p> <p><strong>I set a HWM (high water mark) for a socket but it isn't working!</strong></p> <p>That's not a question. Also, please be certain to read the man page for zmq_setsockopt() closely. Certain socket options only take effect for subsequent zmq_bind/zmq_connect calls. We recommend setting all socket options before making any calls to zmq_bind/zmq_connect; that way we don't have to remember these tiny implementation details and can focus on writing great code.</p> <p>Also, read the next question about HWM below.</p> <p><strong>How does the HWM (high water mark) work with any socket type?</strong></p> <p>It works the following way right now:</p> <p>The I/O thread reads messages from the pipe and pushes them to the network. If network is not able to accept more data (e.g. TCP backpressure is applied) it stops reading messages from the pipe and waits until the network is ready for accepting more data.</p> <p>In the application thread, messages are simply pushed to the pipe when zmq_send() is called. If the pipe is full (HWM is reached) the message is dropped.</p> <p>The problem with the above approach is that when you send a lot of messages is a quick sequence (e.g. sending small messages in a tight loop) the messages are stored in the pipe until it is full and the subsequent messages are simply dropped. The sender is not even notified about the fact that messages are disappearing.</p> <p>The main core developer is hopeful that some community members will volunteer to assist in replacing this mechanism with a rate flow control mechanism.</p> <p><strong>When running &quot;make test&quot; on OSX, how do I fix the failures?</strong></p> <p>Please refer to the <a href="http://www.zeromq.org/docs:tuning-zeromq">tuning guide</a> for platform-specific tuning. In short, OSX has some low defaults that the tests overrun so they need to be tuned.</p> <h1><span>Performance</span></h1> <p><strong>What is the optimal number of I/O threads for best performance?</strong></p> <p>The basic heuristic is to allocate 1 I/O thread in the context for every gigabit per second of data that will be sent and received (aggregated). Further, the number of I/O threads should <strong>not exceed</strong> (number_of_cpu_cores - 1).</p> <p><strong>The graph in the <a href="http://www.zeromq.org/area:results">test results</a> shows that ØMQ is slower than TCP/IP. What's the point then?</strong></p> <p>Obviously, you would expect system working on top of TCP to have <em>higher</em> latencies than TCP. Anything else would be - simply speaking - supernatural. However, throughput is a different matter. ØMQ gets you more throughput than TCP has using intelligent batching algorithms. Moreover ØMQ delivers value-add over the TCP. Asynchronicity, message queueing, routing based on business logic, multicast etc.</p> <p><strong>How come ØMQ has higher throughput than TCP although it's built on top of TCP?</strong></p> <p>Avoiding redundant networking stack traversals can improve throughput significantly. In other words, sending two messages down the networking stack in one go takes much less time then sending each of them separately.This technique is known as message batching.</p> <p><strong>When sending messages in batches you have to wait for the last one to send the whole batch. This would make the latency of the first message in the batch much worse, wouldn't it?</strong></p> <p>ØMQ batches messages in opportunistic manner. Rather than waiting for a predefined number of messages and/or predefined time interval, it sends all the messages available at the moment in one go. Imagine the network interface card is busy sending data. Once it is ready to send more data it asks ØMQ for new messages. ØMQ sends all the messages available at the moment. Does it harm the latency of the first message in the batch? No. The message won't be sent earlier anyway because the networking card was busy. On the contrary, latency of subsequent messages will be improved because sending single batch to the card is faster then sending lot of small messages. On the other hand, if network card isn't busy, the message is sent straight away without waiting for following messages. Thus it'll have the best possible latency.</p> <p><strong>ØMQ's latency is nice, but is there a way to make it even lower?</strong></p> <p>We are working on delivering ØMQ over alternative networking stacks, thus having advantage of features like kernel bypass, avoiding TCP/IP overhead, using high-performance networking hardware etc. That way we can get the latency as low as 10 microseconds.</p> <p><strong>Why am I only getting 40&#160;Mbps performance when sending messages using PGM?</strong></p> <p>PGM uses rate-limiting on the sender side. By default this limit is set to 40&#160;Mbps. You can set it using the <tt>ZMQ_RATE</tt> option to <em>zmq_setsockopt()</em>.</p> <p><strong>Does the ØMQ library disable the Nagle algorithm (TCP NODELAY)?</strong></p> <p>Yes.</p> <h1><span>Monitoring</span></h1> <p><strong>How do I determine how many messages are in queue?</strong></p> <p>This isn't possible. At any given time a message may be in the ØMQ sender queue, the sender's kernel buffer, on the wire, in the receiver's kernel buffer or in the receiver's ØMQ receiver queue. Furthermore, a ØMQ socket can bind and/or connect to many peers. Each peer may have different performance characteristics and therefore a different queue depth. Any &quot;queue depth&quot; number is almost certainly wrong, so rather than provide incorrect information the library avoids providing any view into this data.</p> <p><strong>How can I be notified that a peer has connected/disconnected from my socket?</strong></p> <p>ØMQ sockets can bind and/or connect to multiple peers simultaneously. The sockets also transparently provide asynchronous connection and reconnection facilities. At this time, none of the sockets will provide notification of peer connect/disconnect. This feature is being investigated for a future release.</p> <p><strong>How can I retrieve a list of all connected peers?</strong></p> <p>This is not supported.</p> <p><strong>How can I auto-discover services provided by a ØMQ-based application?</strong></p> <p>This type of facility is not supported by the library. Such a tool could be built on top of ØMQ.</p> <h1><span>Security</span></h1> <p><strong>Is it true that it is not safe to use ØMQ over the internet because it will crash?</strong></p> <p>Earlier versions of the ØMQ library (before 2.1) were not very resilient against &quot;fuzzing&quot; attacks. A malformed packet or garbage data could cause an old version of the library to assert and exit. Since the release of 2.1, all reported cases of assertions caused by bad data have been fixed. If your testing uncovers a problem in this area, <a href="http://www.zeromq.org/docs:issue-tracking" target="_blank">please file a bug report</a>.</p> <p><strong>What security features does ØMQ support?</strong></p> <p>None at the moment. ØMQ does not deal with security <em>by design</em> but concentrates on getting your bytes over the network as fast as possible. Solutions exist for security at the transport layer which are well understood and have had many man-years of development invested in them, such as <a href="http://en.wikipedia.org/wiki/IPsec">IPsec</a> or <a href="http://en.wikipedia.org/wiki/OpenVPN">OpenVPN</a>.</p> <p>Having said that, if you have a use case which precludes the use of transport layer security please let us know and we can discuss your needs.</p> <p><strong>I read somewhere that I have to run my application as root if I want to use PGM, is this true?</strong></p> <p>The <em>epgm:</em>// transport uses PGM encapsulated in UDP packets and does <strong>not</strong> require any special permissions.</p> <p>If you need to use the raw <em>pgm:</em>// transport then your application must be able to create raw sockets, which means either running as root or with capabilities to do so. On a modern Linux distribution with capabilities enabled you can use the following to run an application with the <tt>CAP_NET_RAW</tt> capability enabled:</p> <div class="code"> <pre> <code>$ sudo execcap 'cap_net_raw=ep' pgmsend moo</code> </pre></div> <p>For more details please see the relevant <a href="http://code.google.com/p/openpgm/wiki/OpenPgmCReferenceRunWithTheseCapabilities">OpenPGM wiki page</a>.</p> <h1><span>Building</span></h1> <p><strong>What packages do I need to build ØMQ on Ubuntu?</strong></p> <p>You need <tt>build-essential</tt> and, for pre-ØMQ/3.0 versions, <tt>uuid-dev</tt>. So <tt>sudo apt-get install build-essential uuid-dev</tt>. You can also run <tt>sudo apt-get build-dep libzmq0</tt> which installs all the build-dependencies of the libzmq0 ubuntu package.</p> <p><strong>After cloning the github repository, I can't build the library because the 'configure' script doesn't exist! What do I do?</strong></p> <p>You need autotools installed for your OS so that the configure script can be generated. Run this code to generate that script.</p> <div class="code"> <pre> <code>$ ./autogen.sh</code> </pre></div> <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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:java</guid>
				<title>Java binding</title>
				<link>http://www.zeromq.org/bindings:java</link>
				<description>

&lt;h1&gt;&lt;span&gt;Source Code&lt;/span&gt;&lt;/h1&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;size=small&amp;amp;timestamp=1328409353&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, 27 Jan 2010 15:19:35 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Source Code</span></h1> <p>The Java binding requires a recent release of 0MQ, which you can download from <a href="http://www.zeromq.org/area:download">the download area</a>, or the latest development version, which you can download and build from the <a href="https://github.com/zeromq/libzmq">the github repository</a>.</p> <h1><span>Build and installation</span></h1> <h3><span>UNIX-like platforms</span></h3> <p>Get the <a href="http://github.com/zeromq/jzmq">jzmq source code</a> by cloning the jzmq git or using github's download function, then do the following:</p> <div class="code"> <pre> <code>$ autogen.sh $ configure $ make $ make install</code> </pre></div> <p>On Linux you must run the <em>ldconfig</em> command as root after running <em>make install</em> to ensure that the system library cache is updated.</p> <p>Make sure that you have set the Java <em>classpath</em> to the directory where ØMQ classes reside.</p> <p>Finally, for Java to find the <em>libzmq</em> and <em>libjzmq</em> shared libraries you must ensure that <em>java.library.path</em> is set to the directory where these are installed (normally <em>/usr/local/lib</em> on UNIX-like systems).</p> <p>Example command line for running a Java test program on Linux:</p> <div class="code"> <pre> <code>$ java -Djava.library.path=/usr/local/lib -classpath /home/user/zeromq/libjzmq/:./local_lat tcp://127.0.0.1:5555 1 100</code> </pre></div> <h3><span>Fedora</span></h3> <p>Specific Fedora instructions from Steven McCoy on the mailing list:</p> <p>Required packages:</p> <div class="code"> <pre> <code> autoconf automake libtool gcc gcc-g++ make libuuid-dev git java-1.6.0-openjdk-devel</code> </pre></div> <p>1) Download and unpack ZeroMQ 2.1.10.</p> <p>$ wget <a href="http://download.zeromq.org/zeromq-2.1.10.tar.gz">http://download.zeromq.org/zeromq-2.1.10.tar.gz</a><br /> $ tar zxf zeromq-2.1.10.tar.gz</p> <p>2) Build</p> <div class="code"> <pre> <code>$ cd zeromq-2.1.10 $ ./configure --with-pgm $ make $ sudo make install</code> </pre></div> <p>Now libzmq.so should reside in /usr/local/lib</p> <p>3) Clone JZMQ from GitHub.</p> <div class="code"> <pre> <code>$ git clone https://github.com/zeromq/jzmq.git</code> </pre></div> <p>4) Build</p> <div class="code"> <pre> <code>$ cd jzmq $ ./autogen.sh $ ./configure $ make $ sudo make install</code> </pre></div> <p>5) Setup environment</p> <div class="code"> <pre> <code>$ sudo bash</code> </pre></div> <p>optional step #1 (not required on Debian platforms)</p> <div class="code"> <pre> <code> # echo /usr/local/lib &gt; /etc/ld.so.conf.d/local.conf # ldconfig</code> </pre></div> <p>optional step #2</p> <div class="code"> <pre> <code> # echo CLASSPATH=/usr/local/share/java/zmq.jar:. &gt;&gt; /etc/environment Incredibly limiting as you will still need to override to include any other directory or JAR file.</code> </pre></div> <p>optional step #3</p> <div class="code"> <pre> <code> # echo export LD_LIBRARY_PATH=/usr/local/lib &gt; /etc/profile.d/ldlibrarypath.sh This is pretty much a workaround to a JRE defect: http://lists.fedoraproject.org/pipermail/java-devel/2011-March/004153.html</code> </pre></div> <div class="code"> <pre> <code># exit</code> </pre></div> <p>Then log out and log back in again.</p> <p>6) Verify new environment</p> <div class="code"> <pre> <code>$ echo $CLASSPATH /usr/local/share/java/zmq.jar:. $ echo $LD_LIBRARY_PATH /usr/local/lib</code> </pre></div> <p>7) Test with Java ØMQ performance examples</p> <div class="code"> <pre> <code>$ cd jzmq/perf $ java local_lat tcp://127.0.0.1:5000 1 100</code> </pre></div> <p>This will fail if zmq.jar cannot be found in the class path.<br /> This will fail if libjzmq.so or libzmq.so cannot be found in java.library.path or LD_LIBRARY_PATH.</p> <p>If you skip optional step #1 you will need to specify the library path:</p> <div class="code"> <pre> <code>$ LD_LIBRARY_PATH=/usr/local/lib java local_lat tcp://127.0.0.1:5000 1 100</code> </pre></div> <p>If you skip optional step #2 you will need to specify the class path:</p> <div class="code"> <pre> <code>$ java -cp /usr/local/share/java/zmq.jar:. local_lat tcp://127.0.0.1:5000 1 100</code> </pre></div> <p>Note that setting -Djava.library.path is insufficient for libjzmq.so to find libzmq.so but it is sufficient if you take optional step #1 and skip optional step #3, i.e. LD_LIBRARY_PATH is not overridden but ld.so.conf is updated.</p> <div class="code"> <pre> <code>$ java -Djava.library.path=/usr/local/lib local_lat tcp://127.0.0.1:5000 1 100</code> </pre></div> <h3><span>Windows</span></h3> <p>Get the source code, then use MSVC (2008 or later) to open the solution file <tt>builds\msvc\msvc.sln</tt> and build the projects.</p> <p>Ensure that the javac binary is in the Path variable.</p> <p>Note that ØMQ and JDK header file has to be on &quot;include path&quot; (<em>Tools|Options|Projects and Solutions|VC++ Directories|Include files</em>) and ØMQ libraries have to be on &quot;library path&quot; (<em>Tools|Options|Projects and Solutions|VC++ Directories|Library files</em>):</p> <div class="code"> <pre> <code>Include files: &lt;jdk&gt;\include\win32 &lt;jdk&gt;\include &lt;zeromq&gt;\include Library files: &lt;zeromq&gt;\lib</code> </pre></div> <p>To run it, firstly check whether <em>libzmq.dll</em> is on the system PATH. Secondly, make sure that you add zmq.jar and the jzmq perf directory to the Java <em>classpath</em>. Thirdly, for Java to find the <em>jzmq.dll</em> shared library you must ensure that <em>java.library.path</em> is set to the directory where it is installed.</p> <p>Example command to run Java test program on Windows:</p> <div class="code"> <pre> <code>C:\zmq\java\perf&gt; set PATH=%PATH%;C:\zmq\lib C:\zmq\java\perf&gt; java -Djava.library.path=C:\zmq\java\lib -classpath C:\zmq\java\lib\zmq.jar;. local_lat tcp://127.0.0.1:5555 1 100</code> </pre></div> <h3><span>Windows 64bit Build Instructions</span></h3> <p>Alternative Windows instructions from Steven McCoy on the mailing list:</p> <p>1) Build ZeroMQ or install a prepared package. I built with <a href="http://www.microsoft.com/download/en/details.aspx?id=8279">SDK 7.1</a> but I also have MSVC 2010 Express and Pro installed.</p> <p>2) Clone JZMQ from GitHub, might be easier with <a href="http://cygwin.com/install.html">Cygwin</a>.</p> <div class="code"> <pre> <code>$ git clone https://github.com/zeromq/jzmq.git</code> </pre></div> <p>3) Insert attached <a href="http://zeromq.wdfiles.com/local--files/bindings%3Ajava/CMakeLists.txt">CMakeLists.txt</a>, you probably want to install <a href="http://www.cmake.org/cmake/resources/software.html">CMake for Windows</a> too.</p> <p>4) With a suitable <a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-download-346242.html">JDK</a> installed prepare the build:</p> <div class="code"> <pre> <code>c:\zeromq\jzmq\jzmq&gt; mkdir build64 c:\zeromq\jzmq\jzmq&gt; cd build64 c:\zeromq\jzmq\jzmq&gt; cmake .. -G &quot;NMake Makefiles&quot; -- The C compiler identification is MSVC -- The CXX compiler identification is MSVC -- Check for CL compiler version -- Check for CL compiler version - 1600 -- Check if this is a free VC compiler -- Check if this is a free VC compiler - no -- Check for working C compiler: c:/Program Files (x86)/Microsoft Visual Studio10.0/VC/bin/amd64/cl.exe -- Check for working C compiler: c:/Program Files (x86)/Microsoft Visual Studio10.0/VC/bin/amd64/cl.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: c:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin/amd64/cl.exe -- Check for working CXX compiler: c:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin/amd64/cl.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Java version 1.6.0.27 configured successfully! -- Found Java: C:/Program Files/Java/jdk1.6.0_27/bin/java.exe (found version &quot;1.6.0.27&quot;) -- Found JNI: C:/Program Files/Java/jdk1.6.0_27/lib/jawt.lib -- Configuring done -- Generating done -- Build files have been written to: C:/zeromq/jzmq/jzmq/build64 c:\zeromq\jzmq\jzmq&gt; cmake-gui .</code> </pre></div> <p>Change &quot;Debug&quot; to &quot;Release&quot;, hit &quot;Configure&quot; and &quot;Generate&quot;.</p> <p>Java version 1.6.0.27 configured successfully!</p> <p>Configuring done</p> <p>Generating done</p> <p>5) With <a href="http://nsis.sourceforge.net/Download">NSIS</a> installed you can jump to build the package or just build the libraries.</p> <div class="code"> <pre> <code>c:\zeromq\jzmq\jzmq&gt; nmake package or c:\zeromq\jzmq\jzmq&gt; nmake</code> </pre></div> <p>Then output similar to as follows:</p> <div class="code"> <pre> <code>Microsoft (R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. [ 11%] Generating config.hpp [ 22%] Generating org/zeromq/ZMQ.class, org/zeromq/ZMQ$$Context.class, org/zeromq/ZMQ$$Socket.class, org/zeromq/ZMQ$$Poller.class, org/zeromq/ZMQ$$Error.class, org/zeromq/ZMQException.class, org/zeromq/ZMQQueue.class, org/zeromq/ZMQForwarder.class, org/zeromq/ZMQStreamer.class, org/zeromq/EmbeddedLibraryTools.class, org/zeromq/App.class [ 33%] Generating org_zeromq_ZMQ.h, org_zeromq_ZMQ_Error.h, org_zeromq_ZMQ_Context.h, org_zeromq_ZMQ_Socket.h, org_zeromq_ZMQ_Poller.h [ 44%] Generating lib/zmq.jar Scanning dependencies of target jzmq [ 44%] Generating org/zeromq/ZMQ.class, org/zeromq/ZMQ$$Context.class, org/zeromq/ZMQ$$Socket.class, org/zeromq/ZMQ$$Poller.class, org/zeromq/ZMQ$$Error.class, org/zeromq/ZMQException.class, org/zeromq/ZMQQueue.class, org/zeromq/ZMQForwarder.class, org/zeromq/ZMQStreamer.class, org/zeromq/EmbeddedLibraryTools.class, org/zeromq/App.class [ 44%] Generating org_zeromq_ZMQ.h, org_zeromq_ZMQ_Error.h, org_zeromq_ZMQ_Context.h, org_zeromq_ZMQ_Socket.h, org_zeromq_ZMQ_Poller.h [ 55%] Building CXX object CMakeFiles/jzmq.dir/src/Context.cpp.obj Context.cpp [ 66%] Building CXX object CMakeFiles/jzmq.dir/src/Poller.cpp.obj Poller.cpp [ 77%] Building CXX object CMakeFiles/jzmq.dir/src/Socket.cpp.obj Socket.cpp C:\zeromq\jzmq\jzmq\src\Socket.cpp(176) : warning C4267: 'argument' : conversion from 'size_t' to 'jsize', possible loss of data C:\zeromq\jzmq\jzmq\src\Socket.cpp(182) : warning C4267: 'argument' : conversion from 'size_t' to 'jsize', possible loss of data C:\zeromq\jzmq\jzmq\src\Socket.cpp(476) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data C:\zeromq\jzmq\jzmq\src\Socket.cpp(500) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data [ 88%] Building CXX object CMakeFiles/jzmq.dir/src/util.cpp.obj util.cpp [100%] Building CXX object CMakeFiles/jzmq.dir/src/ZMQ.cpp.obj ZMQ.cpp Linking CXX shared library lib\jzmq.dll Creating library lib\jzmq.lib and object lib\jzmq.exp [100%] Built target jzmq Run CPack packaging tool... CPack: Create package using NSIS CPack: Install projects CPack: - Run preinstall target for: JZMQ CPack: - Install project: JZMQ CPack: Create package CPack: - package: C:/zeromq/jzmq/jzmq/build64/JZMQ-2.1.10-win64.exe generated.</code> </pre></div> <p>Then to test copy all the libraries into the perf directory from the jzmq package and build some examples.</p> <div class="code"> <pre> <code>C:\zeromq\jzmq\jzmq\perf&gt;&quot;\Program Files\Java\jdk1.6.0_27&quot;\bin\javac -cp zmq.jar;. local_lat.java C:\zeromq\jzmq\jzmq\perf&gt;&quot;\Program Files\Java\jdk1.6.0_27&quot;\bin\javac -cp zmq.jar;. remote_lat.java</code> </pre></div> <p>Then test:</p> <div class="code"> <pre> <code>C:\zeromq\jzmq\jzmq\perf&gt;&quot;\Program Files\Java\jdk1.6.0_27\bin&quot;\java -Xcheck:jni -verbose:jni,class -classpath .;zmq.jar local_lat tcp://127.0.0.1:5000 1 100 C:\zeromq\jzmq\jzmq\perf&gt;&quot;\Program Files\Java\jdk1.6.0_27&quot;\bin\java -classpath .;zmq.jar remote_lat tcp://127.0.0.1:5000 1 100 message size: 1 [B] roundtrip count: 100 mean latency: 85.0 [us]</code> </pre></div> <p>The perf directory looks like this:</p> <div class="code"> <pre> <code>10/26/2011 01:18 PM &lt;DIR&gt; . 10/26/2011 01:18 PM &lt;DIR&gt; .. 10/26/2011 01:09 PM 16,384 jzmq.dll 10/03/2011 12:47 PM 445,952 libzmq.dll 10/26/2011 12:53 PM 1,492 local_lat.class 10/05/2011 05:07 PM 1,723 local_lat.java 10/05/2011 05:07 PM 68 local_lat.sh 10/05/2011 05:07 PM 2,278 local_thr.java 10/05/2011 05:07 PM 68 local_thr.sh 10/05/2011 05:07 PM 512 Makefile.am 10/05/2011 05:07 PM 9,988 Makefile.in 10/26/2011 01:18 PM 1,853 remote_lat.class 10/05/2011 05:07 PM 2,049 remote_lat.java 10/05/2011 05:07 PM 69 remote_lat.sh 10/05/2011 05:07 PM 1,722 remote_thr.java 10/05/2011 05:07 PM 69 remote_thr.sh 10/26/2011 01:09 PM 15,350 zmq.jar 15 File(s) 499,577 bytes</code> </pre></div> <p>Example packages to download:</p> <p><a href="http://miru.hk/archive/ZeroMQ-2.1.10-win64.exe">ZeroMQ Win64</a><br /> <a href="http://miru.hk/archive/JZMQ-2.1.10-win64.exe">JZQMQ Win64</a></p> <h1><span>Bug Reporting</span></h1> <p><a href="http://github.com/zeromq/jzmq/issues">http://github.com/zeromq/jzmq/issues</a></p> <h1><span>Mailing list</span></h1> <p><span class="wiki-email">gro.qmorez.stsil|ved-qmorez#gro.qmorez.stsil|ved-qmorez</span></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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:haskell</guid>
				<title>Haskell Binding</title>
				<link>http://www.zeromq.org/bindings:haskell</link>
				<description>

&lt;h1&gt;&lt;span&gt;Package&lt;/span&gt;&lt;/h1&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;size=small&amp;amp;timestamp=1328409353&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, 27 Jan 2010 08:15:12 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Package</span></h1> <p><a href="http://hackage.haskell.org/package/zeromq-haskell">http://hackage.haskell.org/package/zeromq-haskell</a> (ØMQ/2.1.x)<br /> <a href="http://hackage.haskell.org/package/zeromq3-haskell">http://hackage.haskell.org/package/zeromq3-haskell</a> (ØMQ/3.1.x)</p> <h1><span>Source Code</span></h1> <p><a href="http://github.com/twittner/zeromq-haskell">http://github.com/twittner/zeromq-haskell</a></p> <h1><span>Installation</span></h1> <p>Note: This package depends on GHC-7.0 or higher and ØMQ (2.1.x or 3.1.x depending on the package used).</p> <h2><span>Automatic download</span></h2> <div class="code"> <pre> <code>$ cabal update $ cabal install zeromq-haskell # (ØMQ/2.1.x) $ cabal install zeromq3-haskell # (ØMQ/3.1.x)</code> </pre></div> <p>You might want to use <em><span style="white-space: pre-wrap;">--enable-documentation</span></em> for cabal install to have the API-Documentation generated.</p> <h2><span>Manual download</span></h2> <p>Download the package and unpack it into a temporary directory. Change into it and perform the following steps:</p> <div class="code"> <pre> <code>$ cabal install</code> </pre></div> <p>Note: If you have installed ØMQ into a non-standard location you may see an error message in the configure step, like:</p> <div class="code"> <pre> <code>Setup.hs: Missing dependency on a foreign library: * Missing header file: zmq.h * Missing C library: zmq This problem can usually be solved by installing the system package that provides this library (you may need the &quot;-dev&quot; version). If the library is already installed but in a non-standard location then you can use the flags --extra-include-dirs= and --extra-lib-dirs= to specify where it is.</code> </pre></div> <p>Just follow the instructions and the installation should finish without errors.</p> <h1><span>Documentation</span></h1> <p>Documentation is available online at:</p> <p><a href="http://hackage.haskell.org/packages/archive/zeromq-haskell/latest/doc/html/System-ZMQ.html">http://hackage.haskell.org/packages/archive/zeromq-haskell/latest/doc/html/System-ZMQ.html</a> (ØMQ/2.1.x)<br /> <a href="http://twittner.github.com/zeromq-haskell/">http://twittner.github.com/zeromq-haskell/</a> (ØMQ/3.1.x)</p> <p>Additionally, if you did use <em><span style="white-space: pre-wrap;">--enable-documentation</span></em> with cabal install you find the API documentation on your local system as well.</p> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/twittner/zeromq-haskell/issues">http://github.com/twittner/zeromq-haskell/issues</a></p> <p>or write an e-mail to:</p> <p><span class="wiki-email">moc.liamg|renttiw.flarot#moc.liamg|renttiw.flarot</span></p> <h1><span>Mailing List</span></h1> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/docs:labs:process-manager</guid>
				<title>Process Manager</title>
				<link>http://www.zeromq.org/docs:labs:process-manager</link>
				<description>

&lt;h1&gt;&lt;span&gt;Plan&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/yttrill&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=1288354&amp;amp;size=small&amp;amp;timestamp=1328409353&quot; alt=&quot;Yttrill&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=1288354)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/yttrill&quot;  &gt;Yttrill&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 29 Jan 2012 05:22:03 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Plan</span></h1> <h2><span>Phase 1</span></h2> <p>Initial Requirement: to be able to run and test the 0MQ Guide examples automatically, i.e. without any user intervention. The minimum requirement for this is a timeout on the process.</p> <p>The next feature needed is to kill servers when the client examples complete, since the server isn't needed any more. This requires some conditional kill operations. Diagnostics will just go to standard output, so they can be redirected and examined after a test run is complete.</p> <p>Next: we want to log the status of the examples, to ensure the programs didn't crash or terminate prematurely or in error. We'll need some kind of logging mechanism.</p> <p>Next: we want to gather the outputs and compare with what is expected to check for correctness.</p> <h2><span>Phase 2</span></h2> <p>Here we'll generalise the overall capabilities to provide better monitoring and control, possibly including a way to view the network status on a web browser.</p> <h2><span>Phase 3</span></h2> <p>This phase will extend the capabilities to remote process management. We'll use ssh (secure shell) to start daemons on target machines, and 0MQ to communicate with them. This will allow management of a network remotely without using ssh once the daemons are started.</p> <h2><span>Phase 4</span></h2> <p>Add security and encryption to the network management.</p> <h1><span>Status</span></h1> <p>At present I have a simple process manager which launches a process together with a monitoring thread. The thread polls the process status to see if it is running.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/yttrill" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=1288354&amp;size=small&amp;timestamp=1328409353" alt="Yttrill" style="background-image:url(http://www.wikidot.com/userkarma.php?u=1288354)" /></a><a href="http://www.wikidot.com/user:info/yttrill" >Yttrill</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/docs:labs</guid>
				<title>ØMQ Labs</title>
				<link>http://www.zeromq.org/docs:labs</link>
				<description>

&lt;p&gt;There are many people working on interesting things around ØMQ. Here we collect ideas, works in progress, and projects by the ØMQ community. Feel free to add topics that interest you or that you&#039;re working on, using ØMQ. Stick to the format of other entries, and add your entry at the top. Thanks to Matt Weinstein for the sketch.&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;size=small&amp;amp;timestamp=1328409353&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 18:48:47 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>There are many people working on interesting things around ØMQ. Here we collect ideas, works in progress, and projects by the ØMQ community. Feel free to add topics that interest you or that you're working on, using ØMQ. Stick to the format of other entries, and add your entry at the top. Thanks to Matt Weinstein for the sketch.</p> <h2><span>Process Manager</span></h2> <p><strong>In Development, by John Skaller | 2012</strong></p> <p>Tools to launch and manage processes, driven by the need to actually test the 0MQ Guide examples to ensure that they compile and run as expected automatically, so the testing can be included in a background script.</p> <p>Discussion <a href="http://www.zeromq.org/docs:labs:process-manager">Process Manager</a></p> <h2><span>Cocaine Distributed Application Server</span></h2> <p><strong>In Development, by <a href="https://github.com/kobolog">Andrey Sibiryov</a> and <a href="https://github.com/tinybit">Rim Zaidullin</a> | 2011</strong></p> <p><a href="https://github.com/kobolog/cocaine">Cocaine</a> is a fast and lightweight multi-language (you can easily write your own language binding) event-driven (also, you can easily write your own event drivers) task-based distributed application server built on top of ZeroMQ transport and MessagePack serialization library. Yeah, it is cool.</p> <h2><span>ZmqMessage C++ library</span></h2> <p><strong>Ready to test, by <a href="http://www.phorm.com">Phorm, Inc.</a> | 2011</strong></p> <p>If your sense of beauty is not happy with code like</p> <div class="code"> <pre> <code>zmq::message_t reply1(hello.size()); memcpy(static_cast&lt;char*&gt;(reply1.data()), hello.data(), hello.size()); zmq::message_t reply2(world.size()); memcpy(static_cast&lt;char*&gt;(reply2.data()), world.data(), world.size()); s.send(reply1,ZMQ_SNDMORE); s.send(reply2);</code> </pre></div> <br /> and prefers something like <div class="code"> <pre> <code>reply &lt;&lt; hello &lt;&lt; world &lt;&lt; ZmqMessage::Flush;</code> </pre></div> <br /> <a href="http://zmqmessage.org/">ZmqMessage C++ Library</a> is what you need. <div class="image-container floatright"><a href="http://www.zeromq.org/local--files/docs:labs/Sketch%202010-07-31%2019_12_43.png"><img src="http://www.zeromq.org/local--resized-images/docs:labs/Sketch%202010-07-31%2019_12_43.png/small.jpg" alt="Sketch%202010-07-31%2019_12_43.png" class="image" /></a></div> <h2><span>gevent-zeromq - ZeroMQ compatibility library for gevent (Python)</span></h2> <p><strong>Ready to test, by <a href="http://github.com/traviscline">Travis Cline</a> | 29 July 2011</strong></p> <p>Combine fast, cheap green threads in Python via gevent and ZeroMQ's power <a href="https://github.com/traviscline/gevent-zeromq">gevent-zeromq</a>.</p> <h2><span>Rsyslog ZeroMQ Input / Output Plugins</span></h2> <p><strong>Ready to test, by <a href="http://github.com/aggregateknowledge">Aggregate Knowledge</a> | 26 May 2011</strong></p> <p>Aggregate Knowledge has released <a href="https://github.com/aggregateknowledge">ZeroMQ Rsyslog Plugins</a> open source. These plugins allow rsyslog to receive and send data over zmq push / pull sockets (pub/sub coming soon).</p> <h2><span>Objective C ZMQ Socket Helper (wrapper over czmq zmsg class)</span></h2> <p><strong>Ready to test, by <a href="http://github.com/mzaccari">Michael Zaccari</a> | 17 May 2011</strong></p> <p>I wrote <a href="http://github.com/mzaccari/zmqsh">this simple Objective C wrapper</a> to help manage sockets within an Objective C class. This uses the <a href="http://czmq.zeromq.org/manual:zmsg">zmsg class</a> provided by iMatix. I hope this helps anyone who is looking for examples of using ZeroMQ with Objective C.</p> <h2><span>Salt (Python)</span></h2> <p><strong>Ready to test, by <a href="https://github.com/thatch45">Thomas S Hatch</a> | 29 April 2011</strong></p> <p><a href="https://github.com/thatch45/salt/wiki/What-is-salt%3F">Salt</a> is a distributed remote execution system used to execute commands and query data. Salt is meant to solve the problem of managing large sets of servers. It was developed in order to bring the best solutions found in the world of remote execution together and make them better, faster and more malleable. Salt is a great example of secure pub-sub over ZeroMQ, and scales to hundreds or thousands of servers.</p> <h2><span>EM-ZeroMQ (Ruby)</span></h2> <p><strong>Ready to test, by <a href="https://github.com/andrewvc/">Andrew Cholakian</a> | 5 Feb 2011</strong></p> <p><a href="https://github.com/andrewvc/em-zeromq">EM-ZeroMQ</a> Is a low-level interface to ZeroMQ sockets that hooks into the reactor loop of Ruby's EventMachine library. This requires 2.1.x+ versions of ZeroMQ, as it requires ZMQ_FD support to hook into EventMachine's select/epoll loop.</p> <h2><span>Evented interface to ZeroMQ sockets (Lua)</span></h2> <p><strong>Ready to test, by <a href="https://github.com/Neopallium/lua-handlers">Robert G. Jakabosky</a> | 24 Dec 2010</strong></p> <p><a href="https://github.com/Neopallium/lua-handlers">lua-handlers</a> is a lua wrapper of lua-zmq &amp; lua-ev that provides an evented interface to ZeroMQ sockets. It allows you to send &amp; recv messages on many ZeroMQ, TCP &amp; UDP sockets at the same time.</p> <h2><span>Zeromqt (Qt)</span></h2> <p><strong>Pre-alpha, by Steve Atkins</strong></p> <p><a href="http://labs.wordtothewise.com/zeromqt/">Zeromqt</a> integrates ZeroMQ (version 2.1.0 and later) into the Qt event loop, mapping ZeroMQ message events onto Qt signals. It also provides an API that is more &quot;Qt-like&quot; than the native ZeroMQ C or C++ APIs, allowing messages to be handled as QByteArrays and providing classes that are similar in style to QAbstractSocket.</p> <h2><span>nzmqt (Qt) - A lightweight C++ Qt binding for ZeroMQ</span></h2> <p><strong>Ready to test, by Johann Duscher</strong></p> <p><a href="https://github.com/jonnydee/nzmqt">nzmqt</a> is a re-implementation of <a href="http://labs.wordtothewise.com/zeromqt/">Zeromqt</a> which integrates ZeroMQ into Qt's event loop. However, nzmqt builds upon ZeroMQ's official C++ binding, cleanly places code into a separate namespace, adds multi-part message support, and not only works with PUB-SUB protocol, but also with REQ-REP and PUSH-PULL protocol. Included samples show those protocols in action, together with exception handling in Qt. Furthermore, the source code is officially released under the corporate-friendly BSD license.</p> <h2><span>Soaplib (Python)</span></h2> <p><strong>In progress, by <a href="http://github.com/plq">Burak Arslan</a> | 16 Oct 2010</strong></p> <p><a href="http://github.com/arskom/soaplib">Soaplib</a> is a <a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/">SOAP</a> processing library for Python. Previously a SOAP server library that exclusively used HTTP as transport, the upcoming 2.0 release will transform Soaplib to a general, transport-agnostic SOAP processing library. Preliminary support for a ZeroMQ transport that uses REQ/REP sockets was recently incorporated to the master branch.</p> <h2><span>C++ wrapper of zmq::poll</span></h2> <p><strong>Ready to test, by <a href="http://github.com/radub-mtl">Radu Braniste</a> | 25 Aug 2010</strong></p> <p>Why <a href="http://github.com/radub-mtl/zmq--poll-wrapper">another wrapper?</a> The usual idiom used when writing zmq::poll based code is based on a block of if_conditions, testing for the occurrence of one event or the other. This might be error prone and hard to maintain in the long run. And this is where the wrapper comes handy: it separates poll functionality from actions and state (4 different ways to do it) and provides the boiler plate of zmq::poll functionality. Hope you'll find it useful!</p> <h2><span>Electricity Monitoring</span></h2> <p><strong>In progress, by <a href="http://rwscott.co.uk/2010/06/14/currentcost-envi-cc128-part-1/">Bob Scott</a> | 23 Aug 2010</strong></p> <p>I am using ZeroMQ for message passing between small components running on a PlugComputer for 24/7 electricity monitoring. I use the pub-sub pattern for publishing data from the logger and request-reply for a charting client and data server. I chose ZeroMQ for <a href="http://rwscott.co.uk/2010/06/14/currentcost-envi-cc128-part-1/">this application</a> because of its ease of use, brokerless design, flexibilty of messaging patterns and transport and large number of language bindings.</p> <h2><span>zdevices devices project</span></h2> <p><strong>Ready to test, by <a href="http://github.com/imatix">iMatix Corporation</a> | 22 August 2010</strong></p> <p><a href="http://github.com/imatix/zdevices">zdevices</a> is the ZeroMQ devices collection, a repository of device packages written by and for ZeroMQ users. All code is GPLv3 licensed. Includes zdevice/1.0 that starts a built-in device from the command line.</p> <h2><span>zfl library for C</span></h2> <p><strong>In progress, by <a href="http://github.com/imatix">iMatix Corporation</a> | 22 August 2010</strong></p> <p><a href="http://github.com/zeromq/zfl">zfl</a> is the ZeroMQ Function Library, a library for writing 0MQ devices and applications in C. All code is LGPLv3 licensed. Includes JSON parsing for devices.</p> <h2><span>dripdrop</span></h2> <p><strong>In progress, by <a href="http://github.com/andrewvc">Andrew Cholakian</a> | 16 August 2010</strong></p> <p><a href="http://github.com/andrewvc/dripdrop">DripDrop</a> is a Ruby / Javascript framework for building apps quickly using a reactor pattern. ZeroMQ is baked in at the core. It provides a common serialization format (based on BERT or JSON), and lets you seamlessly bridge HTTP, WebSockets, and ZeroMQ using a terse and readable syntax. Essentially, DripDrop exposes a common interface across a large number of protocols, letting you focus on your service, not the implementation details.</p> <h2><span>JeffMQ</span></h2> <p><strong>In progress, by <a href="http://github.com/jeffplaisance">Jeff Plaisance</a> | 16 August 2010</strong></p> <p><a href="http://github.com/jeffplaisance/jeffmq">JeffMQ</a> is a peer to peer message queue framework. It is built on top of ZeroMQ and uses a queue binding system similar to AMQP. There are no special nodes or single points of failure. Queues can only be accessed from the node they are created on. There is no replication, if the node dies the messages are gone.</p> <h2><span>0MQ plugin for RabbitMQ</span></h2> <p><strong>In progress, by <a href="http://github.com/squaremo">Michael Bridgen</a> | 16 August 2010</strong></p> <p>The purpose of <a href="http://github.com/rabbitmq/rmq-0mq">this plugin</a> is to provision ZeroMQ sockets that relay messages into RabbitMQ. Each ZeroMQ socket type is given an idiomatic encoding in the AMQP broker model, which means AMQP clients can interoperate.</p> <h2><span>ProDataLab</span></h2> <p><strong>In progress, by <a href="http://prodatalab.wikidot.com/">ProDataLab</a> | 12 August 2010</strong></p> <p><a href="http://prodatalab.wikidot.com/">ProDataLab</a> is an <a href="http://en.wikipedia.org/wiki/Flow-based_programming">FBP</a> environment that takes advantage of every possible efficiency in processing data via streams. The intention is to build an extremely flexible, parallel, infinitely scalable, distributed application services system for every type and size of data set — processing, analyzing, learning, plotting and reporting, etc. Fast, efficient <a href="http://www.zeromq.org">ZeroMQ</a> messaging will be used as the core of ProDataLab's communication fabric. ProDataLab will eat extremely large data sets for breakfast.</p> <h2><span>ZMQMachine (Ruby)</span></h2> <p><strong>Feature complete, by <a href="http://github.com/chuckremes/zmqmachine">Chuck Remes</a> | 4 August 2010</strong></p> <p><a href="http://github.com/chuckremes/zmqmachine">ZMQMachine</a> is a Ruby library implementing the well-known reactor pattern using 0mq sockets. The API is heavily influenced by the popular Ruby Eventmachine library. All socket I/O activity is non-blocking. Program logic is implemented via asynchronous callbacks and/or handler classes that conform to a specific API. Documentation is limited, but familiarity with Eventmachine will resolve most questions.</p> <h2><span>TCP thin streams</span></h2> <p><strong>Idea, by <a href="http://permalink.gmane.org/gmane.network.zeromq.devel/2916">by Steven McCoy</a> | 2 August 2010</strong></p> <p>A wide range of Internet-based services that use reliable transport protocols display what we call thin-stream properties. This means that the application sends data with such a low rate that the retransmission mechanisms of the transport protocol are not fully effective. In time-dependent scenarios (like online games, control systems or some sensor networks) where the user experience depends on the data delivery latency, packet loss can be devastating for the service quality. Extreme latencies are caused by TCP's dependency on the arrival of new data from the application to trigger retransmissions effectively through fast retransmit instead of waiting for long timeouts. &#8212; <a href="http://lwn.net/Articles/308919/">LWN.net</a></p> <h2><span>Parallel sort</span></h2> <p><strong>In-progress, by <a href="http://permalink.gmane.org/gmane.network.zeromq.devel/2890">Oliver Smith</a> | 2 August 2010</strong></p> <p>So, I decided to try and figure out how to implement a parallel sort with ZeroMQ message passing.</p> <h2><span>Throw-nothing API (C++)</span></h2> <p><strong>Ready-to-test, by <a href="http://permalink.gmane.org/gmane.network.zeromq.devel/2870">Matt Weinstein</a> | 1 August 2010</strong></p> <p>I've derived a &quot;throw nothing&quot; version of zmq.hpp. The functions are in namespace zmq::nothrow:: I've posted it up to github at: <a href="http://github.com/mjw9100/zmq_nothrow">git://github.com/mjw9100/zmq_nothrow.git</a>. Comments welcome. Best, Matt</p> <h2><span>Reactor pattern (C++)</span></h2> <p><strong>Ready to test, by <a href="http://permalink.gmane.org/gmane.network.zeromq.devel/2863">Matt Weinstein</a> | 30 July 2010</strong></p> <p>Folks, I've submitted a reactor pattern for ØMQ to github at <a href="http://github.com/mjw9100/zmq_reactor">git://github.com/mjw9100/zmq_reactor.git</a>. This pattern allow complex arrangements of sockets to be polled in arbitrary ways. The essential way to use this: 1- Create a bunch of zmq_reactors, 2- Link them in the right order into list, 3- Tell zmq_reactor_poll to poll them.</p> <h2><span>Async::Worker (C++)</span></h2> <p><strong>Ready to test, by <a href="http://www.kfs.org/async/">Oliver Smith</a> | 22 July 2010</strong></p> <p>What I was looking for was a convenient C++ way of creating work-splitting tasks and work-delegating tasks. Having cut my teeth on ZeroMQ I immediately to making a worker pool system. The result is Async::Worker. It combines concepts from OpenMP and Intel's TBB. On a virtual quad-core machine building with -O0 I see a 35-40% reduction in processing time.</p> <h2><span>The Mongrel2 Web Server</span></h2> <p><strong>Ready to test, by <a href="http://mongrel2.org/index">Zed Shaw</a> | 22 July 2010</strong></p> <p><a href="http://mongrel2.org/index">Mongrel2</a> is the complete redesign of the Mongrel web server to be an application, language, and network architecture agnostic web server. It's written by the original author of Mongrel, and uses the Mongrel HTTP parser, but everything else is new. The goal is to create a web server specifically designed for web applications over serving files.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/docs:distributions</guid>
				<title>ØMQ Distributions</title>
				<link>http://www.zeromq.org/docs:distributions</link>
				<description>

&lt;h2&gt;&lt;span&gt;Stable release patch policy&lt;/span&gt;&lt;/h2&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;size=small&amp;amp;timestamp=1328409353&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, 23 Feb 2011 13:19:24 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h2><span>Stable release patch policy</span></h2> <p>To lower the risk of insufficiently tested code breaking ØMQ stable releases (which has happened a couple of times recently), we recommend (and use ourselves) this policy for moving patches into a stable release:</p> <ul> <li>Every patch MUST be identified by a clean issue (i.e. one that covers precisely that problem).</li> <li>The patch MUST be have a clear test case that reproduces the problem.</li> <li>This test case MUST be written in C and be stored in the <a href="https://github.com/zeromq/issues">issues repository</a>.</li> <li>The issue SHOULD have an external <em>reporter</em>, i.e. a ØMQ user who can confirm an eventual fix.</li> </ul> <h2><span>Pulling patches from libzmq</span></h2> <p>When the libzmq repository is defined as a remote, you can pull specific commits from it:</p> <div class="code"> <pre> <code>git fetch --no-tags libzmq git cherry-pick -n 43e885 (review changes) git commit -c 43e885</code> </pre></div> <p>On official distributions we use the issue tracker to log libzmq commits that we wish to apply to the distribution. This means we can review, discuss, and track these changes.</p> <h2><span>Making a Distribution Release</span></h2> <p>By &quot;release&quot; we mean a set of downloadable packages. If there were any changes to the ØMQ ABI (as defined by <a href="http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html">http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html</a>) then the ABI version must be updated as the last thing before a public release. The ABI version is set in configure.in (search for LTVER).</p> <p>To make a new distribution release:</p> <ol> <li>Run the selftests: 'make check'.</li> <li>Update NEWS based on the git log, and commit that.</li> <li>Create a tag with the appropriate version number: <strong>git tag v3.1.9 -m &quot;This is release 3.1.9&quot;</strong></li> <li>Push the tag to github: <strong>git push &#8212;tags origin</strong></li> <li>Run ./autogen.sh and ./configure, and <strong>make dist</strong> to get .zip and .tar.gz packages.</li> <li>If the release is not considered mature enough for production use (i.e. stable), add <em>-alpha</em>, <em>-beta</em>, or <em>-rc</em> before the file extension.</li> </ol> <p>If you are making an official release, then also:</p> <ol> <li>Upload the .tar.gz and .zip files to the downloads.zeromq.org site (you need access for this).</li> <li>Recreate the SHA1 and MD5 hashes for these new files.</li> <li>Add the new version to the reference manual at <a href="http://api.zeromq.org">http://api.zeromq.org</a>, and rebuild that site.</li> <li>Update the download page at <a href="http://www.zeromq.org/intro:get-the-software">http://www.zeromq.org/intro:get-the-software</a></li> <li>Email the release announcement to zeromq-dev and (separately) to zeromq-announce, so that Reply-To works properly.</li> <li>Announce the release on Freshmeat, Twitter, and the #zeromq IRC channel.</li> </ol> <p>Precautions: don't make an official release immediately after applying changes. Allow at least one day for the automated builds to test on all platforms. If the changes are not 100% safe, ask for review of the repository master on email or IRC.</p> <h2><span>Setting a new version number</span></h2> <p>Set the new version number <em>immediately after</em> a release, so that the release repository always holds the next in progress version. The version number is located in {{include/zmq.h}:</p> <div class="code"> <pre> <code>#define ZMQ_VERSION_MAJOR 2 #define ZMQ_VERSION_MINOR 1 #define ZMQ_VERSION_PATCH 2</code> </pre></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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/docs:policies</guid>
				<title>ØMQ Release Policies</title>
				<link>http://www.zeromq.org/docs:policies</link>
				<description>

&lt;p&gt;This page captures policies that act as contracts between ØMQ developers and users.&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;size=small&amp;amp;timestamp=1328409353&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, 04 Aug 2010 19:23:06 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>This page captures policies that act as contracts between ØMQ developers and users.</p> <h2><span>Goals</span></h2> <p>The goals of these policies are to provide assurances about the nature of changes users can expect. We hope to deliver increasingly stable and reliable versions of a product, while also developing increasingly interesting functionality in parallel.</p> <h2><span>Versioning</span></h2> <ul> <li>The product version consists of Major.Minor.Update, e.g. 2.0.7.</li> <li>The <a href="http://rfc.zeromq.org/spec:13">wire level protocol</a> (ZMTP) has its own version numbers.</li> <li>The ABI has its own version numbers.</li> <li>You can apply new update to your production environment safely. Updates don't change API, ABI, command lines, wire protocol or semantics. They contain only bugfixes. If a bugfix involves change in API, ABI, command line, wire protocol or semantics, it won't be part of an update.</li> <li>New minor version allows for new functionality (i.e. new APIs), slight changes to the semantics etc. The contract for minor version will be made more precise as we go on. In overall, new minor version should at least compile with your old applications. It may even run, however, you should read the NEWS file so you are sure that changes made won't affect your application behaviour in subtle ways.</li> <li>New major version means no contract. Anything can change. Major versions are meant for delivering backwards incompatible changes. You will have to tweak your applications to work with new major version.</li> </ul> <h2><span>Current Releases</span></h2> <p>We maintain four branches of ZeroMQ at present:</p> <ul> <li>2.0.x is the deprecated 2.x release, which receives <em>user-contributed</em> bug fixes only.</li> <li>2.1.x is the stable 2.x release, which receives downstreamed bug fixes only.</li> <li>2.2.x is the 2.x ongoing release, which receives downstreamed bug fixes, new functionality, and additional layers, e.g. czmq. This is mainly a placeholder for continuing 2.x maintenance after 2.1 is frozen. One goal with 2.2.x is to expand the ZeroMQ distribution package to include essential core language bindings.</li> <li>3.1.0 is the new 3.x unstable release.</li> </ul> <p>2.x and 3.1 implements the same wire level protocol, <a href="http://rfc.zeromq.org/spec:13">ZMTP/1.0</a>. 3.0 (deprecated) uses an incompatible version of ZMTP.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:felix</guid>
				<title>Felix</title>
				<link>http://www.zeromq.org/bindings:felix</link>
				<description>

&lt;h1&gt;&lt;span&gt;Installation&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/yttrill&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=1288354&amp;amp;size=small&amp;amp;timestamp=1328409353&quot; alt=&quot;Yttrill&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=1288354)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/yttrill&quot;  &gt;Yttrill&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 19 Jan 2012 12:25:11 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Installation</span></h1> <p>0MQ support is built-in to the Felix standard library.<br /> You do not need to download or install any bindings.<br /> You may view the binding code here:</p> <p><a href="http://felix-lang.org/lib/std/io/zmq.flx">http://felix-lang.org/lib/std/io/zmq.flx</a></p> <p>Only version 3.1 or higher is supported.</p> <p>Currently you need to install libzmq yourself,<br /> the Felix build process does not build it.</p> <p>The resource location record for this library can be viewed here:</p> <p><a href="http://felix-lang.org/$/usr/local/lib/felix/felix-latest/config/zmq.fpc">http://felix-lang.org/$/usr/local/lib/felix/felix-latest/config/zmq.fpc</a></p> <p>and looks like this on a typical unix like box:</p> <p>Name: ZeroMQ<br /> Description: Message Passing Library<br /> provides_dlib: -lzmq<br /> provides_slib: -lzmq<br /> includes: '&quot;zmq.h&quot;'</p> <p>You will need to provide a modified version of this file if the<br /> indicated compiler and linker switches will not locate your 0MQ<br /> resources.</p> <h1><span>Overview</span></h1> <p>The Felix binding provides two levels of support for 0MQ.</p> <h2><span>Raw C</span></h2> <p>This is an almost direct lift of the C functional interface, except that it has been made type safe.</p> <h2><span>Felicitous</span></h2> <p>This interface is a bit higher level than the raw C one,<br /> with shorter names, adds some support for using<br /> Felix (C++) strings as data, and is remodelled a bit<br /> to use higher order functions to simulate an OO feel.</p> <p>&#8212;</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/yttrill" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=1288354&amp;size=small&amp;timestamp=1328409353" alt="Yttrill" style="background-image:url(http://www.wikidot.com/userkarma.php?u=1288354)" /></a><a href="http://www.wikidot.com/user:info/yttrill" >Yttrill</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/bindings:ada</guid>
				<title>Ada Binding</title>
				<link>http://www.zeromq.org/bindings:ada</link>
				<description>

&lt;h1&gt;&lt;span&gt;Source Code&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com/persan/zeromq-Ada&quot;&gt;http://github.com/persan/zeromq-Ada&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;Development environment&lt;/span&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;span&gt;Linux&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A modern gcc/gnat such as &lt;a href=&quot;http://libre.adacore.com&quot;&gt;http://libre.adacore.com&lt;/a&gt; installed.&lt;br /&gt;
Or GCC 4.5 or better with Ada.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;A modern gcc such as &lt;a href=&quot;http://libre.adacore.com&quot;&gt;http://libre.adacore.com&lt;/a&gt; installed.&lt;br /&gt;
A set of posix build tools such as cygwin, with cygwin do not install gcc or have GNAT before it in the PATH.&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;Build and installation&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;You will first need to install the latest ØMQ from the development trunk here:&lt;br /&gt;
&lt;a href=&quot;http://github.com/sustrik/zeromq2&quot;&gt;http://github.com/sustrik/zeromq2&lt;/a&gt;&lt;br /&gt;
Then download the zeromq-Ada source and cd to its top-level directory:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;$ cd zeromq-Ada&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compile the stuff&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;$make&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally install the package by running:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;$ make install&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You may have to run this last command with &lt;tt&gt;sudo&lt;/tt&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Exact the same but you need ether cygwin or mingw as build environment&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;Sample code&lt;/span&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;span&gt;A simple client/server application&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;This example implements a simple &amp;quot;SQL server&amp;quot; following the client/server model. The server listens to &lt;em&gt;requests&lt;/em&gt; using unicast TCP. Each request is a simple string. Upon receiving a request the server will send back a canned &lt;em&gt;response&lt;/em&gt; of &lt;tt&gt;OK&lt;/tt&gt;, also as a string. All the samples are part of the package.&lt;/p&gt;
&lt;p&gt;The server application, using Ada bindings:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;with ZMQ.Sockets;
with ZMQ.Contexts;
with ZMQ.Messages;
with Ada.Text_IO; use Ada.Text_IO;

procedure ZMQ.examples.Server is
   ctx   : ZMQ.Contexts.Context;
   s     : ZMQ.Sockets.Socket;
   resultset_string : constant String := &amp;quot;OK&amp;quot;;
begin
   --  Initialise 0MQ context, requesting a single application thread
   --  and a single I/O thread
   ctx.Initialize (1);

   --   Create a ZMQ_REP socket to receive requests and send replies
   s.Initialize (ctx, Sockets.REP);

   --   Bind to the TCP transport and port 5555 on the &#039;lo&#039; interface
   s.Bind (&amp;quot;tcp://lo:5555&amp;quot;);

   loop
      declare
         query : ZMQ.Messages.Message;
      begin
         query.Initialize;
         --  Receive a message, blocks until one is available
         s.recv (query, 0);
         --  Process the query
         Put_Line (query.getData);
         declare
            --  Allocate a response message and fill in an example response
            resultset : ZMQ.Messages.Message;
         begin
            resultset.Initialize (query.getData &amp;amp; &amp;quot;-&amp;gt;&amp;quot; &amp;amp; resultset_string);
            --   Send back our canned response
            s.Send (resultset);
            resultset.Finalize;
         end;
         query.Finalize;
      end;

   end loop;
end ZMQ.Examples.Server;&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The client application, using Ada bindings:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;with ZMQ.Sockets;
with ZMQ.Contexts;
with ZMQ.Messages;
with Ada.Text_IO; use Ada.Text_IO;

procedure ZMQ.examples.Client is
   ctx              : ZMQ.Contexts.Context;
   s                : ZMQ.Sockets.Socket;
begin
   --  Initialise 0MQ context, requesting a single application thread
   --  and a single I/O thread
   ctx.Initialize (1);

   --   Create a ZMQ_REP socket to receive requests and send replies
   s.Initialize (ctx, Sockets.REQ);

   --   Bind to the TCP transport and port 5555 on the &#039;lo&#039; interface
   s.Connect (&amp;quot;tcp://localhost:5555&amp;quot;);
   for i in  1 .. 10 loop
      declare
         query_string : constant String := &amp;quot;SELECT * FROM mytable&amp;quot;;
         query        : ZMQ.Messages.Message;
      begin
         query.Initialize (query_string &amp;amp; &amp;quot;(&amp;quot; &amp;amp; i&#039;Img &amp;amp; &amp;quot;);&amp;quot;);
         s.Send (query);
         query.Finalize;
      end;

      declare
         resultset        : ZMQ.Messages.Message;
      begin
         resultset.Initialize;
         s.recv (resultset);
         Put_Line (&#039;&amp;quot;&#039; &amp;amp; resultset.getData &amp;amp; &#039;&amp;quot;&#039;);
         resultset.Finalize;
      end;
   end loop;
end ZMQ.Examples.Client;&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally the multi-threaded server&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;with ZMQ.Sockets;
with ZMQ.Contexts;
with ZMQ.devices;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure ZMQ.examples.Multi_Thread_Server is

   task type server_task (ctx : not null access ZMQ.Contexts.Context;
                          id  : Integer) is
   end server_task;

   task body server_task is
      msg : Ada.Strings.Unbounded.Unbounded_String;
      s   : ZMQ.Sockets.Socket;
   begin
      s.Initialize (ctx.all, Sockets.REP);
      s.Connect (&amp;quot;inproc://workers&amp;quot;);
      loop
         msg := s.recv;
         Append (msg, &amp;quot;&amp;lt;Served by thread:&amp;quot; &amp;amp; id&#039;Img &amp;amp; &amp;quot;&amp;gt;&amp;quot;);
         s.Send (msg);
      end loop;
   end server_task;

   ctx              : aliased ZMQ.Contexts.Context;

   Number_Of_Servers : constant := 10;
   servers          : array (1 .. Number_Of_Servers) of access server_task;

   workers          : ZMQ.Sockets.Socket;
   clients          : ZMQ.Sockets.Socket;

   dev              : ZMQ.devices.device;

begin
   --  Initialise 0MQ context, requesting a single application thread
   --  and a single I/O thread
   ctx.Initialize (servers&#039;Length + 1);

   --   Create a ZMQ_REP socket to receive requests and send replies
   workers.Initialize (ctx, Sockets.XREQ);
   workers.Bind (&amp;quot;inproc://workers&amp;quot;);

   --   Bind to the TCP transport and port 5555 on the &#039;lo&#039; interface
   clients.Initialize (ctx, Sockets.XREP);
   clients.Bind (&amp;quot;tcp://lo:5555&amp;quot;);

   for i in servers&#039;Range loop
      servers (i) := new server_task (ctx&#039;Access, i);
   end loop;

   dev.initialize (devices.Queue, clients, workers);

end ZMQ.Examples.Multi_Thread_Server;&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
To build this example, ensure that you have the ØMQ adabindings installed and run the following:
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;gprbuild -p -P zmq-examples&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can then run &lt;tt&gt;bin/server&lt;/tt&gt; and &lt;tt&gt;bin/client&lt;/tt&gt;.&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;Documentation&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;a href=&quot;http://github.com/persan/zeromq-Ada/tree/master/README&quot;&gt;README&lt;/a&gt; file of the source code is the best documentation for now.&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;Test Suite&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;zeromq-Ada has an integrated test suite, to be completed!&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
&lt;code&gt;$ make test&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;&lt;span&gt;Bug Reporting&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;If you encounter problems please fill a bug report at:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com/persan/zeromq-Ada/issues&quot;&gt;http://github.com/persan/zeromq-Ada/issues&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Discussions about this language binding take place on the general &lt;a href=&quot;http://lists.zeromq.org/mailman/listinfo/zeromq-dev&quot;&gt;zeromq-dev&lt;/a&gt; list.&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;size=small&amp;amp;timestamp=1328409353&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, 31 Mar 2010 06:22:11 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Source Code</span></h1> <p><a href="http://github.com/persan/zeromq-Ada">http://github.com/persan/zeromq-Ada</a></p> <h1><span>Development environment</span></h1> <h2><span>Linux</span></h2> <p>A modern gcc/gnat such as <a href="http://libre.adacore.com">http://libre.adacore.com</a> installed.<br /> Or GCC 4.5 or better with Ada.</p> <h2><span>Windows</span></h2> <p>A modern gcc such as <a href="http://libre.adacore.com">http://libre.adacore.com</a> installed.<br /> A set of posix build tools such as cygwin, with cygwin do not install gcc or have GNAT before it in the PATH.</p> <h1><span>Build and installation</span></h1> <p>You will first need to install the latest ØMQ from the development trunk here:<br /> <a href="http://github.com/sustrik/zeromq2">http://github.com/sustrik/zeromq2</a><br /> Then download the zeromq-Ada source and cd to its top-level directory:</p> <div class="code"> <pre> <code>$ cd zeromq-Ada</code> </pre></div> <p>Compile the stuff</p> <div class="code"> <pre> <code>$make</code> </pre></div> <p>Finally install the package by running:</p> <div class="code"> <pre> <code>$ make install</code> </pre></div> <p>You may have to run this last command with <tt>sudo</tt>.</p> <h2><span>Windows</span></h2> <p>Exact the same but you need ether cygwin or mingw as build environment</p> <h1><span>Sample code</span></h1> <h2><span>A simple client/server application</span></h2> <p>This example implements a simple &quot;SQL server&quot; following the client/server model. The server listens to <em>requests</em> using unicast TCP. Each request is a simple string. Upon receiving a request the server will send back a canned <em>response</em> of <tt>OK</tt>, also as a string. All the samples are part of the package.</p> <p>The server application, using Ada bindings:</p> <div class="code"> <pre> <code>with ZMQ.Sockets; with ZMQ.Contexts; with ZMQ.Messages; with Ada.Text_IO; use Ada.Text_IO; procedure ZMQ.examples.Server is ctx : ZMQ.Contexts.Context; s : ZMQ.Sockets.Socket; resultset_string : constant String := &quot;OK&quot;; begin -- Initialise 0MQ context, requesting a single application thread -- and a single I/O thread ctx.Initialize (1); -- Create a ZMQ_REP socket to receive requests and send replies s.Initialize (ctx, Sockets.REP); -- Bind to the TCP transport and port 5555 on the 'lo' interface s.Bind (&quot;tcp://lo:5555&quot;); loop declare query : ZMQ.Messages.Message; begin query.Initialize; -- Receive a message, blocks until one is available s.recv (query, 0); -- Process the query Put_Line (query.getData); declare -- Allocate a response message and fill in an example response resultset : ZMQ.Messages.Message; begin resultset.Initialize (query.getData &amp; &quot;-&gt;&quot; &amp; resultset_string); -- Send back our canned response s.Send (resultset); resultset.Finalize; end; query.Finalize; end; end loop; end ZMQ.Examples.Server;</code> </pre></div> <p>The client application, using Ada bindings:</p> <div class="code"> <pre> <code>with ZMQ.Sockets; with ZMQ.Contexts; with ZMQ.Messages; with Ada.Text_IO; use Ada.Text_IO; procedure ZMQ.examples.Client is ctx : ZMQ.Contexts.Context; s : ZMQ.Sockets.Socket; begin -- Initialise 0MQ context, requesting a single application thread -- and a single I/O thread ctx.Initialize (1); -- Create a ZMQ_REP socket to receive requests and send replies s.Initialize (ctx, Sockets.REQ); -- Bind to the TCP transport and port 5555 on the 'lo' interface s.Connect (&quot;tcp://localhost:5555&quot;); for i in 1 .. 10 loop declare query_string : constant String := &quot;SELECT * FROM mytable&quot;; query : ZMQ.Messages.Message; begin query.Initialize (query_string &amp; &quot;(&quot; &amp; i'Img &amp; &quot;);&quot;); s.Send (query); query.Finalize; end; declare resultset : ZMQ.Messages.Message; begin resultset.Initialize; s.recv (resultset); Put_Line ('&quot;' &amp; resultset.getData &amp; '&quot;'); resultset.Finalize; end; end loop; end ZMQ.Examples.Client;</code> </pre></div> <p>Finally the multi-threaded server</p> <div class="code"> <pre> <code>with ZMQ.Sockets; with ZMQ.Contexts; with ZMQ.devices; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; procedure ZMQ.examples.Multi_Thread_Server is task type server_task (ctx : not null access ZMQ.Contexts.Context; id : Integer) is end server_task; task body server_task is msg : Ada.Strings.Unbounded.Unbounded_String; s : ZMQ.Sockets.Socket; begin s.Initialize (ctx.all, Sockets.REP); s.Connect (&quot;inproc://workers&quot;); loop msg := s.recv; Append (msg, &quot;&lt;Served by thread:&quot; &amp; id'Img &amp; &quot;&gt;&quot;); s.Send (msg); end loop; end server_task; ctx : aliased ZMQ.Contexts.Context; Number_Of_Servers : constant := 10; servers : array (1 .. Number_Of_Servers) of access server_task; workers : ZMQ.Sockets.Socket; clients : ZMQ.Sockets.Socket; dev : ZMQ.devices.device; begin -- Initialise 0MQ context, requesting a single application thread -- and a single I/O thread ctx.Initialize (servers'Length + 1); -- Create a ZMQ_REP socket to receive requests and send replies workers.Initialize (ctx, Sockets.XREQ); workers.Bind (&quot;inproc://workers&quot;); -- Bind to the TCP transport and port 5555 on the 'lo' interface clients.Initialize (ctx, Sockets.XREP); clients.Bind (&quot;tcp://lo:5555&quot;); for i in servers'Range loop servers (i) := new server_task (ctx'Access, i); end loop; dev.initialize (devices.Queue, clients, workers); end ZMQ.Examples.Multi_Thread_Server;</code> </pre></div> <br /> To build this example, ensure that you have the ØMQ adabindings installed and run the following: <div class="code"> <pre> <code>gprbuild -p -P zmq-examples</code> </pre></div> <p>You can then run <tt>bin/server</tt> and <tt>bin/client</tt>.</p> <h1><span>Documentation</span></h1> <p>The <a href="http://github.com/persan/zeromq-Ada/tree/master/README">README</a> file of the source code is the best documentation for now.</p> <h1><span>Test Suite</span></h1> <p>zeromq-Ada has an integrated test suite, to be completed!</p> <div class="code"> <pre> <code>$ make test</code> </pre></div> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/persan/zeromq-Ada/issues">http://github.com/persan/zeromq-Ada/issues</a></p> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:python</guid>
				<title>Python binding</title>
				<link>http://www.zeromq.org/bindings:python</link>
				<description>

&lt;h1&gt;&lt;span&gt;ØMQ Compatibility&lt;/span&gt;&lt;/h1&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;size=small&amp;amp;timestamp=1328409353&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, 27 Jan 2010 14:11:13 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>ØMQ Compatibility</span></h1> <p>pyzmq aims to support multiple versions of libzmq. pyzmq-2.1.9 supports<br /> libzmq &gt;= 2.1.4, and as of release 2.1.7, has experimental support for libzmq's 3.0 API.<br /> 2.1.9's 3.0 support has been updated to include changes in the 4.0 dev branch.</p> <h1><span>Binary installers</span></h1> <p>PyZMQ has binary installers that include current libzmq for Windows and OSX.<br /> Python eggs (as found by <tt>easy_install</tt>) on <a href="http://pypi.python.org/pypi/pyzmq/2.1.11">pypi</a>,<br /> and MSI installers for Windows <a href="https://github.com/zeromq/pyzmq/downloads">on GitHub</a>.</p> <h1><span>easy_install</span></h1> <p>In many cases, pyzmq can be installed with:</p> <div class="code"> <pre> <code>easy_install pyzmq</code> </pre></div> <p>You may need to install the <em>python-dev</em> package first. If we don't have an egg for your system (e.g. Linux), then easy_install will be building from source, and you will need to install libzmq, but <tt>easy_install pyzmq</tt> or <tt>pip install pyzmq</tt> will still work as long as libzmq was installed to a default location, such as <tt>/usr/local</tt>.</p> <p>If you see a message like <tt>error while loading shared libraries: libzmq.so.1</tt>, then try rebuilding the dynamic linking cache with <tt>sudo ldconfig</tt> prior to building pyzmq.</p> <p>If you are still using zeromq 2.0.10, you can install download pyzmq-2.0.10.1 from GitHub or install with:</p> <div class="code"> <pre> <code>easy_install &quot;pyzmq==2.0.10.1&quot;</code> </pre></div> <h1><span>Source Code</span></h1> <p>The current stable pyzmq release can be downloaded from GitHub:<br /> <a href="https://github.com/zeromq/pyzmq/downloads/pyzmq-2.1.11.tar.gz">pyzmq-2.1.11.tar.gz</a><br /> <a href="https://github.com/zeromq/pyzmq/downloads/pyzmq-2.1.11.zip">pyzmq-2.1.11.zip</a></p> <p>The git repository is at: <a href="http://github.com/zeromq/pyzmq">http://github.com/zeromq/pyzmq</a>. You can download the current PyZMQ development version as a zip or tar package, or clone the git repository:</p> <div class="code"> <pre> <code>git clone git://github.com/zeromq/pyzmq.git</code> </pre></div> <p>If you get the source via <tt>git clone</tt>, or edit any of the pyzmq cython files (*.pyx), then you will need Cython to generate the C extensions, which can be installed with:</p> <div class="code"> <pre> <code>easy_install cython</code> </pre></div> <p>If you download a zipfile or tarball, Cython is not a build dependency.</p> <h1><span>Build and installation</span></h1> <p>You need to install ØMQ first. Please use the <a href="http://www.zeromq.org/area:download">current stable package</a>.</p> <p>Then download the PyZMQ source and cd to its top-level directory:</p> <div class="code"> <pre> <code>$ cd pyzmq</code> </pre></div> <h2><span>building pyzmq</span></h2> <p>If you are using the current pyzmq (2.1.4, or later), we have a new configuration command that should simplify building pyzmq.</p> <p>If pyzmq can't find libzmq (e.g. if it's not installed to <tt>/usr/local</tt>), you can tell pyzmq where zeromq has been installed, with:</p> <div class="code"> <pre> <code>$ python setup.py configure --zmq=/path/to/zmq/prefix</code> </pre></div> <p>This will be a directory containing <tt>include</tt> and <tt>lib</tt>, which contain the zmq headers and libraries respectively. If you configured zeromq with the <tt>&#8212;prefix</tt> command, this will be the same location. On Linux/OSX systems, it will likely be something like <tt>$HOME/usr/local</tt> or <tt>/usr/local/libzmq-dev</tt>. If zeromq was installed to the default location of <tt>/usr/local</tt> this step should be unnecessary.</p> <h3><span>Windows</span></h3> <p>On Windows, this prefix is likely to be the zeromq source directory. If you downloaded pyzmq and libzmq into the same directory, then you would run:</p> <div class="code"> <pre> <code>$ python setup.py configure --zmq=../libzmq</code> </pre></div> <p>As of pyzmq-2.1.4, you no longer need to edit your <tt>PATH</tt> or move libzmq.dll around manually.</p> <h2><span>Building PyZMQ &lt; 2.1.4</span></h2> <p>For PyZMQ &lt; 2.1.4, there is not a configure command, so you must copy setup.cfg.template to setup.cfg and edit that new file to specify the <tt>library_dir</tt> and <tt>include_dirs</tt> variables to point to your ØMQ installation:</p> <div class="code"> <pre> <code>[build_ext] # Edit these to point to your installed zeromq library and header dirs. library_dirs = /usr/local/libzmq-dev/lib include_dirs = /usr/local/libzmq-dev/include</code> </pre></div> <p>If you did a standard make, ØMQ will be in /usr/local/lib and /usr/local/include and a setup.cfg might not be necessary.</p> <p>Finally install the package by running:</p> <div class="code"> <pre> <code>$ python setup.py install</code> </pre></div> <p>You may have to run this last command with <tt>sudo</tt>, depending on your install path.</p> <p>Under Linux, you will need the python-dev package installed.</p> <h2><span>Windows</span></h2> <p>Building pzymq on Windows requires either MinGW or MSVC 2008. The steps are mostly the same as for POSIX platforms, however, for pyzmq older than 2.1.4, you will need to copy the ØMQ library <tt>libzmq.dll</tt> to <tt>pyzmq\zmq</tt> before building. Please contact us if you have difficulties building or using PyZMQ on Windows. <a href="http://www.zeromq.org/docs:windows-installations">Here is</a> a step-by-step guide.</p> <h1><span>Documentation</span></h1> <p>The <a href="https://github.com/zeromq/pyzmq/blob/master/README.rst">README</a> file of the source code has a quick summary of information.</p> <p>We also have <a href="http://sphinx.pocoo.org/">Sphinx</a> generated documentation hosted on GitHub:</p> <div class="code"> <pre> <code>http://zeromq.github.com/pyzmq/</code> </pre></div> <p>The Sphinx docs contain autogenerated coverage of the API as presented in Python, as well as descriptions of where PyZMQ may differ from other ØMQ bindings.</p> <h1><span>Test Suite</span></h1> <p>PyZMQ has an integrated test suite. To run the test suite simple do:</p> <div class="code"> <pre> <code>$ python setup.py test</code> </pre></div> <p>This requires that you have built the extensions in place, i.e. with:</p> <div class="code"> <pre> <code>$ python setup.py build_ext --inplace</code> </pre></div> <p>otherwise you will see an ImportError when compiled extensions (such as initthreads) are imported.</p> <p>You can also run the test suite with nose, trial, or py.test after installing, which do not require the build to be inplace:</p> <div class="code"> <pre> <code>$ nosetests -vvs zmq.tests</code> </pre></div> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/zeromq/pyzmq/issues">http://github.com/zeromq/pyzmq/issues</a></p> <p>or write an e-mail to:</p> <p>ellisonbg AT gmail DOT com<br /> and<br /> benjaminrk AT gmail DOT com</p> <h1><span>Mailing List</span></h1> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:php</guid>
				<title>PHP binding</title>
				<link>http://www.zeromq.org/bindings:php</link>
				<description>

&lt;h1&gt;&lt;span&gt;Source Code&lt;/span&gt;&lt;/h1&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;size=small&amp;amp;timestamp=1328409353&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, 01 Apr 2010 18:15:09 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Source Code</span></h1> <p><a href="http://github.com/mkoppanen/php-zmq">http://github.com/mkoppanen/php-zmq</a></p> <h1><span>Build and installation</span></h1> <p>You will first need to install the ØMQ (2.1.x or higher recommended)</p> <p><a href="http://www.zeromq.org/intro:get-the-software">http://www.zeromq.org/intro:get-the-software</a></p> <p>Then obtain the php bindings for 0MQ - these work with PHP 5.2.x and above.</p> <h1><span>Building via PEAR</span></h1> <p>The extension can be built via PECL, using the zero.mq pear channel</p> <div class="code"> <pre> <code>pear channel-discover pear.zero.mq pecl install zero.mq/zmq-beta</code> </pre></div> <p>You may have to add the extension to your php.ini with this line:</p> <div class="code"> <pre> <code>extension=zmq.so</code> </pre></div> <h1><span>Building from Github</span></h1> <div class="code"> <pre> <code>git clone git://github.com/mkoppanen/php-zmq.git</code> </pre></div> <p>and cd to the directory:</p> <div class="code"> <pre> <code>$ cd php-zmq</code> </pre></div> <p>Next, run phpize to generate configure script and run the configure command:</p> <div class="code"> <pre> <code>phpize &amp;&amp; ./configure</code> </pre></div> <br /> Tip: If you are using php installed from your distribution's package manager the 'phpize' command is usually in php-dev or php-devel package <p>Finally install the package by running:</p> <div class="code"> <pre> <code>$ make &amp;&amp; make install</code> </pre></div> <p>You may have to run this last commands with <tt>sudo</tt>.</p> <p>Finally add the following line to your php.ini:</p> <div class="code"> <pre> <code>extension=zmq.so</code> </pre></div> <h2><span>Windows</span></h2> <p><a href="http://snapshot.zero.mq/">http://snapshot.zero.mq/</a></p> <h2><span>FreeBSD</span></h2> <p>In FreeBSD PHP must be configured with &quot;Link thread lib (for threaded extensions)&quot; option. Without this option the PHP binding will hang when creating new contexts or sockets.</p> <h1><span>Documentation</span></h1> <p>PHPdoc documentation: <a href="http://php.zero.mq">http://php.zero.mq</a><br /> General documentation: <a href="http://wiki.github.com/mkoppanen/php-zmq/">http://wiki.github.com/mkoppanen/php-zmq/</a></p> <h1><span>Test Suite</span></h1> <p>The test suite can be run using:</p> <div class="code"> <pre> <code>$ make test</code> </pre></div> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/mkoppanen/php-zmq/issues">http://github.com/mkoppanen/php-zmq/issues</a></p> <p>or write an e-mail to:</p> <p>mkoppanen (at) php dot net</p> <h1><span>Mailing List</span></h1> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list.</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;size=small&amp;timestamp=1328409353" 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://www.zeromq.org/bindings:perl</guid>
				<title>Perl Binding</title>
				<link>http://www.zeromq.org/bindings:perl</link>
				<description>

&lt;h1&gt;&lt;span&gt;Source Code&lt;/span&gt;&lt;/h1&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;size=small&amp;amp;timestamp=1328409353&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, 13 Jun 2010 10:37:23 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Source Code</span></h1> <p>Development happens at:</p> <p><a href="http://github.com/lestrrat/ZeroMQ-Perl">http://github.com/lestrrat/ZeroMQ-Perl</a></p> <p>The most recent release can always be found at:</p> <p><a href="http://search.cpan.org/dist/ZeroMQ">http://search.cpan.org/dist/ZeroMQ</a></p> <h1><span>Build and installation</span></h1> <p>You need to install the 0MQ library and the perl headers (usually the <em>perl-dev</em> package on linux) before you attempt installing the Perl bindings. Once that is done, you can install the <em>ZeroMQ</em> Perl module like any other Perl module from CPAN (possibly as root user):</p> <div class="code"> <pre> <code>$ cpan ZeroMQ</code> </pre></div> <p>This will automatically install all Perl module dependencies. You may choose to install the dependencies manually and download the release tarball from the above URL. If so, you can extract it and then simply do the following to compile, test and install the Perl bindings:</p> <div class="code"> <pre> <code>$ perl Build.PL $ ./Build test $ sudo ./Build install</code> </pre></div> <h1><span>Documentation</span></h1> <p>A fairly complete documentation can be found at</p> <p><a href="http://search.cpan.org/perldoc?ZeroMQ">http://search.cpan.org/perldoc?ZeroMQ</a></p> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/lestrrat/ZeroMQ-Perl/issues">http://github.com/lestrrat/ZeroMQ-Perl/issues</a></p> <h1><span>Mailing List</span></h1> <p>Discussions about this language binding take place on the general <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev">zeromq-dev</a> list. Please CC the maintainer (cf. the documentation for the contact address) in any discussion.</p> <h1><span>Also available</span></h1> <p>Bindings with less code, more parity with the C API, support for AnyEvent, and experimental zero-copy support are available from:</p> <p><a href="https://github.com/jrockway/zeromq-raw/">https://github.com/jrockway/zeromq-raw/</a></p> <p><a href="https://github.com/jrockway/anyevent-zeromq/">https://github.com/jrockway/anyevent-zeromq/</a></p> <p>Master is considered stable and is used in production. The zero-copy branch is experimental and probably won't get you much because Perl loves copying anyway :)</p> <p>The AnyEvent bindings come with a raw AnyEvent::ZeroMQ::Handle module, and comes with an OO wrapper for each message type in ZeroMQ, allowing you to use higher-level idioms in your code.</p> <p>Also note that while the bindings on CPAN come with a module called ZeroMQ::Raw, the AnyEvent support in AnyEvent::ZeroMQ does not work with that one, you need the version from jrockway's github.</p> <p>Please report any bugs to the ZeroMQ mailing list or on the github page. The binding has been tested with and without ithreads and multiplicity, and with Perls 5.10-5.14.</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;size=small&amp;timestamp=1328409354" 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://www.zeromq.org/bindings:twisted</guid>
				<title>Twisted (Python) Bindings</title>
				<link>http://www.zeromq.org/bindings:twisted</link>
				<description>

&lt;p&gt;txZMQ uses ØMQ APIs to get file descriptor that is used to signal pending actions from ØMQ library IO thread running in separate thread. txZMQ should be usable with any Twisted reactor.&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/smira&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=864584&amp;amp;size=small&amp;amp;timestamp=1328409354&quot; alt=&quot;smira&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=864584)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/smira&quot;  &gt;smira&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 29 Apr 2011 13:22:51 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>txZMQ uses ØMQ APIs to get file descriptor that is used to signal pending actions from ØMQ library IO thread running in separate thread. txZMQ should be usable with any Twisted reactor.</p> <h1><span>Source Code</span></h1> <p>The current stable txZMQ release can be downloaded from PyPi: [<a href="http://pypi.python.org/pypi/txZMQ/">http://pypi.python.org/pypi/txZMQ/</a>]</p> <p>It can also be installed with:</p> <div class="code"> <pre> <code>easy_install txZMQ</code> </pre></div> <p>Requrements are:</p> <ul> <li>pyzmq</li> <li>Twisted</li> </ul> <p>The git repository is at: <a href="https://github.com/smira/txZMQ">https://github.com/smira/txZMQ</a>.</p> <div class="code"> <pre> <code>git clone git://github.com/smira/txZMQ.git make env make</code> </pre></div> <h1><span>Test Suite</span></h1> <p>txZMQ has an integrated test suite. To run the test suite simple do:</p> <div class="code"> <pre> <code>$ trial txZMQ</code> </pre></div> <h1><span>Bug Reporting</span></h1> <p>If you encounter problems please fill a bug report at:</p> <p><a href="http://github.com/smira/txZMQ/issues">http://github.com/smira/txZMQ/issues</a></p> <p>or write an e-mail to:</p> <p>me AT smira DOT ru</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/smira" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=864584&amp;size=small&amp;timestamp=1328409354" alt="smira" style="background-image:url(http://www.wikidot.com/userkarma.php?u=864584)" /></a><a href="http://www.wikidot.com/user:info/smira" >smira</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/whitepapers:routing</guid>
				<title>Routing (early experience)</title>
				<link>http://www.zeromq.org/whitepapers:routing</link>
				<description>

&lt;p&gt;&lt;span style=&quot;font-size:x-large;&quot;&gt;&lt;strong&gt;HISTORICAL WHITEPAPER&lt;/strong&gt;&lt;/span&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;size=small&amp;amp;timestamp=1328409354&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, 16 Apr 2009 19:48:00 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><span style="font-size:x-large;"><strong>HISTORICAL WHITEPAPER</strong></span></p> <h1><span>Introduction</span></h1> <p>Message routing is a feature that allows for sending individual messages to different destinations based on the content of the message (also called <em>content-based routing</em>).</p> <p>This article explores different aspects of the routing. It proposes algorithm to use for generic routing, i.e. message passing in a generic directed acyclic graph-like network.</p> <h1><span>Scope of the problem</span></h1> <p>Message routing makes sense in data-distribution messaging style. Routing in context of load-balancing messaging style has unclear semantic and little or no real-world applications.</p> <p>In a point-to-point messaging style, routing can be useful is some scenarios. With 1:1 communication, routing boils down to the simple message filtering. More research should be done on routing in the context of point-to-point messaging style.</p> <h1><span>Layering</span></h1> <p>One of the problems with routing is that it requires inter-layer interactions. Think of a ØMQ (<em>zmq.tcp</em>) wire-level protocol where each message consist of length and message payload. Message payload is filled in by the application on the top of ØMQ - the application uses it's own wire-level protocol to format the message. Following picture shows how appication protocol is encapsulated in <em>zmq.tcp</em> protocol:</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing10.png" alt="routing10.png" class="image" /></div> <p>As can be seen, application have decided to compose the message from a string (&quot;A&quot; in this case) and some other data that are irrelevant for the routing.</p> <p>Now, we would like ØMQ to send the message to different destinations depending on the string incorporated to the message payload by the sending application. However, ØMQ has no idea of how the application protocol looks like.</p> <p>The situation is similar to traffic shaping. Traffic shaping is done mostly on layer 2 or 3 of the OSI stack while the criteria to route on (like TCP port) are defined on layers above it.</p> <p>The solution used by say IOS or Linux &quot;tc&quot; utility is to make shaping algorithms completely generic, so that they can be used whatever the higher level protocol looks like. Thus, what you say is: &quot;Apply this traffic shaping strategy to every packet that contains value 45 in the 32-bit value located on position 12 of the packet.&quot;</p> <p>It would be nice if ØMQ can this level of generality - user can define/implement almost any routing mechanism needed. However, most common routing scenarios should be provided out of the box so that users don't have to mess with the routing details.</p> <p>The current design doesn't include a mechanism to ensure that sender and receiver are using the same application protocol. Such mechanism is subject to further research.</p> <h1><span>Algorithm</span></h1> <p>Subscriptions are issued by terminal message consumers. However, routing should be moved as far upstream as possible to eliminate excessive network traffic and CPU consumption. To achieve it subscriptions are passed upstream. Following algorithm applies:</p> <ul> <li>In <em>mux</em> (object aggregating several feeds) subscription should be passed to each attached upstream element.</li> <li>In <em>demux</em> (object distributing messages to several destinations) subscription should be both kept locally (associated with the particular downstream element) and forwarded upstream. <em>demux</em> object does the actual message matching and passes message only to the downstream elements that have subscribed for it.</li> <li>Network protocol engines pass subscriptions upstream if technically possible.</li> <li>For performance reasons it's necessary to avoid redundant routing. Following rule applies: If all the subscriptions are passed upstream and there's exactly one element downstream (and there never was more then one element downstream), routing can be skipped.</li> </ul> <h1><span>Examples</span></h1> <h2><span>Simple in-process messaging (1-to-1)</span></h2> <p>Messages are passed from one thread to another, subscriptions are passed in the opposite direction.</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing1.png" alt="routing1.png" class="image" /></div> <h2><span>1-to-many in-process messaging</span></h2> <p>Subscriptions are passed upstream. Demux component stores the subscriptions on per-downstream-element basis. When message is to be sent, message matching is performed and the message is passed to the matching downstream elements.</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing3.png" alt="routing3.png" class="image" /></div> <h2><span>Many-to-1 in-process messaging</span></h2> <p>Subscriptions are passed to <em>each</em> upstream element. This way client can be agnostic about number of upstream elements. Also, it's important to send <em>all</em> subscriptions to a newly attached upstream element. Thus, <em>mux</em> has to store all the subscriptions.</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing2.png" alt="routing2.png" class="image" /></div> <h2><span>Over-the-network messaging</span></h2> <p>The basic principle is to pass the subscription upstream via the network connection. Note that this is not possible in some cases. Say PGM reliable multicast is uni-directional, there's no way to pass subscriptions upstream.</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing4.png" alt="routing4.png" class="image" /></div> <p>Following diagram shows the simplest possible scenario for over-the-network communication. Note that subscription is passed all the way upstream, thus unneeded messages are filtered out immediately in sender's API thread.</p> <p>Additionally, <em>demux</em> object on the receiver side can skip routing as all the subscriptions are passed upstream and there's only one element downstream:</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing5.png" alt="routing5.png" class="image" /></div> <p>Following scenario shows the situation where the routing on receiver side cannot be skipped. There are two user threads receiving messages, each of them has different subscription (&quot;A&quot; vs. &quot;B&quot;). Both subscriptions are passed upstream over the network, meaning that both &quot;A&quot; and &quot;B&quot; messages are delivered to the receiver application. Receiver application still has to route the messages to one of the two client threads:</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing6.png" alt="routing6.png" class="image" /></div> <p>Here's the other situation where routing in receiver cannot be skipped. The network protocol in this case is PGM multicast. It's uni-directional thus the subscriptions cannot be passed upstream. Consequently, all the messages are multicast over the network. Receiver application has to receive all of them and filter out those matching the subscriptions.</p> <div class="image-container aligncenter"><img src="http://www.zeromq.org/local--files/whitepapers:routing/routing7.png" alt="routing7.png" class="image" /></div> <h2><span>Complex messaging topologies</span></h2> <p>Simple scenarios described above can be combined into complex networks of messaging elements. It's essential for the network to be acyclic so that the messages and subscriptions are not passed on in infinite cycles. Strategy to prevent infinite loops is a subject for further research.</p> <h1><span>Efficient message matching</span></h1> <p>Efficient algorithms for message matching are described <a href="http://www.zeromq.org/whitepapers:message-matching">here</a>.</p> <h1><span>Concusion</span></h1> <p>This is the early experience with message routing in ØMQ context. The design is work in progress and subject to change.</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;size=small&amp;timestamp=1328409354" 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://www.zeromq.org/bindings:bash</guid>
				<title>Bash Binding</title>
				<link>http://www.zeromq.org/bindings:bash</link>
				<description>

&lt;p&gt;By Daniel Lundin:&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;size=small&amp;amp;timestamp=1328409354&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>Sun, 29 May 2011 15:08:13 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>By Daniel Lundin:</p> <div class="code"> <pre> <code>zmq_push () { m=$(cat) &amp;&amp; echo \ -e $(printf '\\x01\\x00\\x%02x\\x00%s' \ $((1 + ${#m})) &quot;$m&quot;) | nc -q1 $@; }</code> </pre></div> <p><em>Note: this actually works. It acts as a PUSH or DEALER socket, sending one message to a PULL or ROUTER or DEALER socket. It implements the <a href="http://rfc.zeromq.org/spec:13">0MQ wire level protocol</a>.</em></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;size=small&amp;timestamp=1328409354" 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://www.zeromq.org/bindings:haxe</guid>
				<title>Haxe Binding</title>
				<link>http://www.zeromq.org/bindings:haxe</link>
				<description>

&lt;p&gt;The hxzmq project provides a 0MQ language binding for the cross-target &lt;a href=&quot;http://haxe.org&quot;&gt;haXe programming language&lt;/a&gt;. It provides a hxzmq.ndll shared library plus haXe wrapper API classes for the cpp and nekovm targets. PHP is also supported by wrapping the php-zmq library behind the same haXe wrapper API classes.&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/rj-smith&quot;  &gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/avatar.php?userid=859397&amp;amp;size=small&amp;amp;timestamp=1328409354&quot; alt=&quot;rj_smith&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=859397)&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/rj-smith&quot;  &gt;rj_smith&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 24 May 2011 13:28:17 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>The hxzmq project provides a 0MQ language binding for the cross-target <a href="http://haxe.org">haXe programming language</a>. It provides a hxzmq.ndll shared library plus haXe wrapper API classes for the cpp and nekovm targets. PHP is also supported by wrapping the php-zmq library behind the same haXe wrapper API classes.</p> <h1><span>Source Code</span></h1> <p>The code resides in the <a href="http://github.com/rjsmith/hxzmq">hxzmq github repository</a>. To get the latest development version's source code, clone the repository:</p> <div class="code"> <pre> <code> git clone git://github.com/rjsmith/hxzmq.git</code> </pre></div> <p>Alternatively, a package is maintained in the <a href="http://lib.haxe.org">http://lib.haxe.org</a> list that can be added to any haXe installation using:</p> <div class="code"> <pre> <code> haxelib install hxzmq</code> </pre></div> <p>Note that you must also have the hxcpp project installed in order to compile the hxzmq.ndll for your own platform from the source code (installing hxzmq via haxelib as above will automatically install hxcpp if you don't have it):</p> <div class="code"> <pre> <code> haxelib install hxcpp</code> </pre></div> <h1><span>Documentation</span></h1> <p>Full build and usage instructions for Windows, Linux and MacOSX platforms are documented in the README and INSTALL files in the distro.</p> <h1><span>Bug Reporting</span></h1> <p><a href="http://github.com/rjsmith/hxzmq/issues">http://github.com/rjsmith/hxzmq/issues</a></p> <h1><span>Contact</span></h1> <p>rsmith ( at ) rsbatechnology (dot) co (dot) uk</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/rj-smith" ><img class="small" src="http://www.wikidot.com/avatar.php?userid=859397&amp;size=small&amp;timestamp=1328409354" alt="rj_smith" style="background-image:url(http://www.wikidot.com/userkarma.php?u=859397)" /></a><a href="http://www.wikidot.com/user:info/rj-smith" >rj_smith</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://www.zeromq.org/bindings:ocaml</guid>
				<title>Objective Caml binding</title>
				<link>http://www.zeromq.org/bindings:ocaml</link>
				<description>

&lt;p&gt;There are two Objective Caml bindings you can choose from:&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;size=small&amp;amp;timestamp=1328409354&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, 04 Apr 2011 05:27:48 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>There are two Objective Caml bindings you can choose from:</p> <p><a href="https://github.com/pdhborges/ocaml-zmq">https://github.com/pdhborges/ocaml-zmq</a></p> <p><a href="https://github.com/bashi-bazouk/Caravan">https://github.com/bashi-bazouk/Caravan</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;size=small&amp;timestamp=1328409354" 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>
