<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Trapexit - Erlang/OTP News</title>
	<link>http://planet.trapexit.org</link>
	<language>en</language>
	<description>Planet Trapexit - Erlang/OTP News - http://planet.trapexit.org</description>

<item>
	<title>Erlang Factory News: New Speaker for the Erlang Factory SF Bay Area 2010</title>
	<guid>http://erlang-factory.com/news/rss/c28c8b04ae47de0102bc8805cf30a20a</guid>
	<link></link>
	<description>We would like to announce &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/geoffcant&quot;&gt;Geoff Cant &lt;/a&gt;as a Speaker for the Erlang Factory SF Bay Area. Geoff will give a talk on &quot;&lt;span&gt;Enet: TCP/IP in Pure(ish) Erlang&lt;/span&gt;&quot;.&lt;br /&gt;&lt;br /&gt;To see all Speakers please click &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers&quot;&gt;here&lt;/a&gt;. The programme of the conference is available &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Reminder: &lt;span&gt;The Erlang Factory in SF Bay Area is just over a week away! &lt;/span&gt;Do not miss
out on what will be the biggest gathering of Erlang expertise in the USA, &lt;a href=&quot;https://www.erlang-factory.com/conference/SFBay2010/register&quot;&gt;register&lt;/a&gt; today!&lt;br /&gt;</description>
	<pubDate>Fri, 12 Mar 2010 12:45:55 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: OneTeam XMPP client entering private alpha</title>
	<guid>http://www.process-one.net/en/blogs/article/oneteam_xmpp_client_entering_private_alpha/</guid>
	<link>http://www.process-one.net/en/blogs/article/oneteam_xmpp_client_entering_private_alpha/</link>
	<description>&lt;p&gt;Our OneTeam XMPP client for Linux, Mac OS X, and Windows is entering a private alpha period.&lt;/p&gt; &lt;p&gt;OneTeam is a multiplatform XMPP client for Linux, Mac OS X, and Windows. We have slowly worked on it during long months (and even years, it is being developed since 2006) but never had enough time and resources to release it properly.&lt;/p&gt;
&lt;p&gt;The time to launch OneTeam in the wild and interoperable internet is soon arriving. We believe we have achieved our goal to deliver some real enterprise-class user experience. As a proof, we are using it inhouse on a daily basis as a productivity tool, without any major glitch.&lt;/p&gt;
&lt;p&gt;For the record, OneTeam works as a Firefox extension, as well as a standalone application, on the three major platforms, thanks to the XUL technology. OneTeam has a nice dashboard-based interface, and handy user interactions improvements everywhere. This XMPP client supports a wide range of features, including chat and presence of course, but also Multi-User Chat (groupchat), message threading, history browsing, etc. It also features Jingle voice calls, as well as the exclusive Jingle Nodes feature demoed at FOSDEM, that works much like Skype. On the more technical side, there is the XML console, as well as a very interesting remote debugging console.&lt;/p&gt;
&lt;p&gt;So, we are now releasing OneTeam, but in alpha quality for now, to the  curious ones, and those willing to help and test. Please feel free to contact us, if you want to join the alpha testing, and report issues. Please e-mail nverite at process-one.net for a OneTeam ride.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Mar 2010 14:00:21 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Eleven Years of Erlang</title>
	<guid>http://prog21.dadgum.com/64.html</guid>
	<link>http://prog21.dadgum.com/64.html</link>
	<description>I've written about &lt;a href=&quot;http://prog21.dadgum.com/22.html&quot;&gt;how I started using Erlang&lt;/a&gt;. A good question is why, after eleven years, am I still using it?
&lt;br /&gt;&lt;br /&gt;For the record, I do use other languages. I enjoy writing Python code, and I've taught other people how to use Python. This website is statically generated by a Perl program that I had fun writing. And I dabble in various languages of the month which have cropped up. (Another website I used to maintain was generated by a script that I kept reimplementing. It started out written in Perl, but transitioned through at least REBOL, J, and Erlang before I was through.)
&lt;br /&gt;&lt;br /&gt;One of the two big reasons I've stuck with Erlang is because of its simplicity. The functional core of Erlang can and has been described in a couple of short chapters. Knowledge of four data types--numbers, atoms, lists, tuples--is enough for most programming problems. Binaries and funs can be tackled later. This simplicity is good, because the difficult part of Erlang and any mostly-functional language is in learning to write code without destructive updates. The language itself shouldn't pour complexity on top of that.
&lt;br /&gt;&lt;br /&gt;There are many possibilities for extending Erlang with new data types, with an alternative to &lt;a href=&quot;http://prog21.dadgum.com/60.html&quot;&gt;records&lt;/a&gt; being high on the list. Should strings be split off from lists into a distinct entity? What about arrays of floats, so there's no need to box each value? How about a &quot;machine integer&quot; type that's represented without tagging and that doesn't get automatically promoted to an arbitrarily sized &quot;big number&quot; when needed?
&lt;br /&gt;&lt;br /&gt;All of those additional types are optimizations. Lists work just fine as strings, but even the most naive implementation of strings as unicode arrays would take half the memory of the equivalent lists, and that's powerful enticement. When Knuth warned of premature optimization, I like to think he wasn't talking so much about obfuscating code in the process of micro-optimizing for speed, but he was pointing out that code is made faster by specializing it. The process of specialization reduces your options, and you end up with a solution that's more focused and at the same time more brittle. You don't want to do that until you really need to.
&lt;br /&gt;&lt;br /&gt;It may be an overreaction to my years of optimization-focused programming, but I like the philosophy of making the Erlang system fast without just caving in and providing C-style abilities. I &lt;em&gt;know&lt;/em&gt; how to write low-level C. And now I know how to write good high-level functional code. If I had been presented with a menu of optimization-oriented data types in Erlang, that might never have happened. I'd be writing C in the guise of Erlang.
&lt;br /&gt;&lt;br /&gt;The second reason I'm still using Erlang is because I understand it. I don't mean I know how to code in it, I mean I get it all the way down. I know more or less what transformations are applied by the compiler and the BEAM loader. I know how the BEAM virtual machine works. And unlike most languages, Erlang holds together as a full system. You could decide to ditch all existing C compilers and CPUs and start over completely, and Erlang could serve as a foundation for this new world of computing. The &lt;a href=&quot;http://www.erlang.org/euc/00/processor.ppt&quot;&gt;ECOMP project&lt;/a&gt; (warning: PowerPoint) proved that an FPGA running the Erlang VM directly gives impressive results.
&lt;br /&gt;&lt;br /&gt;Let me zoom in on one specific detail of the Erlang runtime. If you take an arbitrary piece of data in a language of the Lua or Python family, at the lowest-level it ends up wrapped inside a C struct. There's a type field, maybe a reference count, and because it's a heap allocated block of memory there's other hidden overhead that comes along with any dynamic allocation (such as the size of the block). Lua is unabashedly reliant on malloc-like heap management for just about everything.
&lt;br /&gt;&lt;br /&gt;Erlang memory handling is much more basic. There's a block of memory per process, and it grows from bottom to top until full. Most data objects aren't wrapped in structs. A tuple, for example, is one cell of data for the length followed by the number of cells in the tuple. The system identifies it as a tuple by tagging the &lt;em&gt;pointer&lt;/em&gt; to the tuple. You know the memory used for a tuple is always 1 + N, period. Were I trying to optimize data representation by hand, with the caveat that type info needs to be included, it would be tough to do significantly better.
&lt;br /&gt;&lt;br /&gt;I'm sure some people are correctly pointing out that this is how most Lisp and Scheme systems have worked since those languages were developed. There's nothing preventing an imperative language from using the same methods (and indeed this is sometimes the case).
&lt;br /&gt;&lt;br /&gt;Erlang takes this &lt;a href=&quot;http://prog21.dadgum.com/16.html&quot;&gt;further&lt;/a&gt; by having a separate block of memory for each process, so when the block gets full only that particular block needs to be garbage collected. If it's a 64K block, it's takes microseconds to collect, as compared to potentially traversing a heap containing the hundreds of megabytes of data in the full running system. Disallowing destructive updates allows some nice optimizations in the garbage collector, because pointers are guaranteed to reference older objects (this is sometimes called a &quot;unidirectional heap&quot;). Together these are much simpler than building a real-time garbage collector that can survive under the pressure of giant heaps.
&lt;br /&gt;&lt;br /&gt;Would I use Erlang for everything? Of course not. Erlang is clearly a bad match for some types of programming. It would be silly to force-fit Erlang into the iPhone, for example, with Apple promoting Objective C as the one true way. But it's the best mix of power and simplicity that I've come across.</description>
	<pubDate>Wed, 10 Mar 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Zotonic destroys WordPress and rethinks the CMS with Erlang</title>
	<guid>http://erlanginside.com/?p=149</guid>
	<link>http://erlanginside.com/zotonic-destroys-wordpress-and-rethinks-the-cms-with-erlang-149</link>
	<description>A chat with Marc Worrell, Lead Architect of Zotonic - a new Content Management System written entirely in Erlang.</description>
	<pubDate>Tue, 09 Mar 2010 18:50:24 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: It Made Sense in 1978</title>
	<guid>http://prog21.dadgum.com/63.html</guid>
	<link>http://prog21.dadgum.com/63.html</link>
	<description>Whenever I see this list of memory cell sizes, it strikes me as antiquated:
&lt;pre&gt;BYTE = 8 bits
WORD = 16 bits
LONG = 32 bits
&lt;/pre&gt;Those names were standard for both the Intel x86 and Motorola 68000 families of processors, and it's easy to see where they came from. &quot;Word&quot; isn't synonymous with a 16-bit value; it refers to the fundamental data size that a computer architecture is built to operate upon. On a 16-bit CPU like the 8086, a word is naturally 16-bits.
&lt;br /&gt;&lt;br /&gt;Now it's 2010, and it's silly to think of a 16-bit value as a basic enough unit of data to get to the designation &quot;word.&quot; &quot;Long&quot; is similarly out of place, as 32-bit microprocessors have been around for over 25 years, and yet the standard memory cell size is still labeled in a way that makes it sound abnormally large.
&lt;br /&gt;&lt;br /&gt;The PowerPC folks got this right back in the early 1990s with this nomenclature:
&lt;pre&gt;BYTE = 8 bits
HALFWORD = 16 bits
WORD = 32 bits
&lt;/pre&gt;That made sense in 1991, and it's still rational today. (64-bit is now common, but the jump isn't nearly as critical as it was the last time memory cell size doubled. The PowerPC name for &quot;64-bits&quot; is &quot;doubleword.&quot;)
&lt;br /&gt;&lt;br /&gt;Occasionally you need to reevaluate your assumptions and not just cling to something because it's always been that way.</description>
	<pubDate>Thu, 04 Mar 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Talkr.IM XMPP/Jabber server gets Apple Push notifications</title>
	<guid>http://www.process-one.net/en/blogs/article/talkr.im_xmpp_jabber_server_gets_apple_push_notifications/</guid>
	<link>http://www.process-one.net/en/blogs/article/talkr.im_xmpp_jabber_server_gets_apple_push_notifications/</link>
	<description>&lt;p&gt;The free public XMPP/Jabber server Talkr.IM gets Apple Push notifications for iPhone.&lt;/p&gt; &lt;p&gt;The ProcessOne's free, open, public XMPP/Jabber server Talkr.IM is gaining a new feature: Apple Push  notifications. This well enable users to get notified of offline messages when they arrive, as well as simulate a continued XMPP session on iPhone devices that still do not implement multitasking.&lt;/p&gt;
&lt;p&gt;For the latter feature, since the iPhone still does not accept to run applications in the background, if you want to use another application, you will have to shutdown your XMPP client and thus disconnect from Talkr.IM. With the Push feature enabled on your XMPP client (if this one supports Apple Push notifications), you can tell your contacts you are still online when you are using other applications. You will then automatically receive notifications of new messages. And when you re-open your XMPP client, you will receive these messages.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.process-one.net/en/solutions/oneteam_iphone/&quot;&gt;OneTeam for iPhone&lt;/a&gt; has the Apple Push feature enabled: you will be able to use it on you Talkr.IM account. Just use you Jabber ID, like username@talkr.im, and for a simple configuration, go to the &quot;Settings&quot; tab, then &quot;Push settings&quot;.&lt;/p&gt;
&lt;p&gt;The Talkr.IM XMPP server will stop at 10:00am CET. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;01:00am Los Angeles&lt;/li&gt;
&lt;li&gt;04:00am New York&lt;/li&gt;
&lt;li&gt;12:00 Moscow&lt;/li&gt;
&lt;li&gt;18:00 Tokyo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: the Apple Push module is installed on Talkr.IM, and working fine. You can use it on &lt;a href=&quot;http://www.process-one.net/en/solutions/oneteam_iphone/&quot;&gt;OneTeam for iPhone&lt;/a&gt;. You can run a APNS module on your own ejabberd server with &lt;a href=&quot;http://www.process-one.net/en/imstore/#impush&quot;&gt;IMpush&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 03 Mar 2010 21:00:16 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ejabberd tip: simple health check</title>
	<guid>http://www.process-one.net/en/blogs/article/ejabberd_tip_simple_health_check/</guid>
	<link>http://www.process-one.net/en/blogs/article/ejabberd_tip_simple_health_check/</link>
	<description>&lt;p&gt;An ejabberd health check mechanism might be useful in your deployments, but using the HTTP file server might be overkill...&lt;/p&gt; &lt;p&gt;Some people want to do regular health checks on ejabberd, which is always a good idea. Doing a health check over XMPP might not be the solution, here is at least two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;with a pure ad-hoc solution like a cron script, you might need an XMPP library you might not want to install on your servers&lt;/li&gt;
&lt;li&gt;monitoring systems might not talk XMPP at all...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So people first think of the internal ejabberd HTTP file server, which then they have to configure through a specific listener and the right module... possibly with logs, they would have to manage (rotate, parse, clean, etc.).&lt;/p&gt;
&lt;p&gt;Sometimes people just don't think there is already an HTTP listener on their internal BOSH Connection Manager. You would argue that BOSH uses the HTTP POST method. But the ejabberd BOSH Connection Manager replies to simple GET:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;wget &lt;a href=&quot;http://www.process-one.net/en?URL=http%3A%2F%2Fmyserver.net%2Fhttp-bind&quot;&gt;http://myserver.net/http-bind&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And ejabberd will answer:&lt;/p&gt;
&lt;h1&gt;ejabberd mod_http_bind v1.2&lt;/h1&gt;
&lt;p&gt;An implementation of &lt;a href=&quot;http://xmpp.org/extensions/xep-0206.html&quot;&gt;XMPP over BOSH  (XEP-0206)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This web page is only informative. To use HTTP-Bind  you need a Jabber/XMPP client that supports it.&lt;/p&gt;</description>
	<pubDate>Wed, 03 Mar 2010 16:30:28 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Countdown to the Erlang Factory SF Bay Area</title>
	<guid>http://erlang-factory.com/news/rss/41beb9607e3b74dec0c150e593b6c154</guid>
	<link></link>
	<description>There are&lt;span&gt; only 3 weeks left&lt;/span&gt; to the biggest Erlang gathering in the USA. We have &lt;span&gt;43 speakers&lt;/span&gt; giving &lt;span&gt;35 talks&lt;/span&gt; in &lt;span&gt;6 tracks&lt;/span&gt;! The programme of the conference can be viewed &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/programme&quot;&gt;here&lt;/a&gt;.&amp;nbsp; If you haven't registered yet, you can still do this by clicking &lt;a href=&quot;https://www.erlang-factory.com/conference/SFBay2010/register&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;'I'm attending', 'I'm speaking'&amp;nbsp; and 'See you there' &lt;/span&gt;banners are now available &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/community&quot;&gt;here&lt;/a&gt;.
You can add them to your blog, Twitter page or any website. You are also welcome to
follow &lt;a href=&quot;http://twitter.com/erlangfactory&quot;&gt;@erlangfactory&lt;/a&gt; on Twitter.&lt;br /&gt;</description>
	<pubDate>Wed, 03 Mar 2010 15:46:07 +0000</pubDate>
</item>
<item>
	<title>Tragically L33T: The Lizard Brain, the Dip, and other Godinisms</title>
	<guid>http://tragicallyleet.com/2010/03/03/the-lizard-brain-the-dip-and-other-godinisms</guid>
	<link>http://tragicallyleet.com/2010/03/03/the-lizard-brain-the-dip-and-other-godinisms</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://sethgodin.typepad.com/&quot;&gt;Seth Godin&lt;/a&gt; is a really smart guy. More importantly, he takes his ideas and does something with them.&lt;/p&gt;

&lt;p&gt;I came across Seth in &lt;a href=&quot;http://www.43folders.com/2010/01/26/godin-linchpin&quot;&gt;an interview&lt;/a&gt; he did with &lt;a href=&quot;http://43folders.com&quot;&gt;Merlin Mann&lt;/a&gt;. He talked a lot about fear and the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lizard_brain&quot;&gt;lizard brain&lt;/a&gt;: the part of our brain that is only hungry, scared, selfish and horny. Its the part of our brains that ruled in high school.&lt;/p&gt;

&lt;p&gt;It will also sabotage us if we let it.&lt;/p&gt;

&lt;p&gt;Whenever we get close to completing something big or interesting or important to us, the lizard brain senses a threat. &amp;#8220;What if we fail?&amp;#8221; &amp;#8220;Ridicule is painful!&amp;#8221; &amp;#8220;Better to go along in life quietly, then do something that might get us noticed.&amp;#8221;&lt;/p&gt;

&lt;p&gt;The lizard brain tells us to quit when success is near. Seth mentioned in his interview that he listens to his lizard brain&amp;#8230; and then does the opposite. If his lizard brain is quiet, he probably isn&amp;#8217;t doing anything important. If his lizard brain is screaming bloody murder, he knows he is on the right track.&lt;/p&gt;

&lt;p&gt;I picked up a couple of Seth&amp;#8217;s books, including Tribes, The Dip, and his new book, Linchpin. As I come across more interesting tidbits I will share them.&lt;/p&gt;</description>
	<pubDate>Wed, 03 Mar 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Dehumidifiers, Gravy, and Coding</title>
	<guid>http://prog21.dadgum.com/62.html</guid>
	<link>http://prog21.dadgum.com/62.html</link>
	<description>For a few months I did freelance humor writing. Greeting cards, cartoon captions, that sort of thing. My sole income was from the following slogan, which ended up on a button:
&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Once I've gathered enough information for the almighty Zontaar, I'm outta here!&lt;/i&gt;
&lt;br /&gt;&lt;br /&gt;Sitting down and cranking out dozens of funny lines was hard. Harder than I expected. I gave it up because it was too draining (and because I wasn't making any money, but I digress).
&lt;br /&gt;&lt;br /&gt;Periodically I decide I want to boost my creativity. I carry around a notebook and write down conversations, lists, brainstormed ideas, randomness. I recently found one of these notebooks, so I can give some actual samples of its contents. Below half a page of &quot;Luxury Housing Developments in Central Illinois Farmland&quot; (e.g., &lt;i&gt;Arctic Highlands&lt;/i&gt;), there's a long list titled &quot;Ridiculous Things.&quot; Here are a few:
&lt;br /&gt;&lt;br /&gt;salads&lt;br /&gt;
spackle&lt;br /&gt;
key fobs&lt;br /&gt;
wine tastings&lt;br /&gt;
mulch&lt;br /&gt;
hair scrunchies&lt;br /&gt;
asphalt&lt;br /&gt;
Fry Daddy&lt;sup&gt;TM&lt;/sup&gt;&lt;br /&gt;
cinder blocks&lt;br /&gt;
relish&lt;br /&gt;
Frito Pie&lt;br /&gt;
aeration shoes
&lt;br /&gt;&lt;br /&gt;Okay, okay, I'll stop. But you get the idea.
&lt;br /&gt;&lt;br /&gt;As with the humor writing, I remember this taking lots of effort, and it took real focus to keep going. Did this improve my creativity? I'd like to think so. It certainly got me thinking in new directions and about different topics. It also made me realize something fundamental: technical creativity, such as optimizing code or thinking up clever engineering solutions, is completely different from the &quot;normal&quot; creativity that goes into writing stories or taking photos.
&lt;br /&gt;&lt;br /&gt;Years ago, I followed the development of an indie game. This was back when writing 3D games for non-accelerated VGA cards was cutting edge. The author was astounding in his coding brilliance. He kept pulling out trick after trick, and he wasn't shy about posting key routines for others to use. Eventually the game was released...and promptly forgotten. It may have been a technical masterpiece, but it was &lt;b&gt;terrible&lt;/b&gt; as game, completely unplayable.
&lt;br /&gt;&lt;br /&gt;I still like a good solution to a programming problem. I still like figuring out how to rewrite a function with half the code. But technical creativity is only one form of creativity.</description>
	<pubDate>Wed, 03 Mar 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Returning a file with Nitrogen</title>
	<guid>http://www.redhoterlang.com/web/58024b56bab3e66cea6994b46deef85f</guid>
	<link>http://www.redhoterlang.com/web/plink?id=58024b56bab3e66cea6994b46deef85f</link>
	<description>&amp;lt;p&amp;gt;Let's say I want to create a file download link in my Nitrogen application. First I create a &amp;lt;em&amp;gt;src/pages/web_file.erl&amp;lt;/em&amp;gt; file, and fill it with some code:&amp;lt;/p&amp;gt;

&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;-module(web_file).
-export([main/0, title/0, body/0, event/1]).
-include...</description>
	<pubDate>Tue, 02 Mar 2010 19:41:01 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: Memory matters - even in Erlang</title>
	<guid>http://www.lshift.net/blog/?p=481</guid>
	<link>http://www.lshift.net/blog/2010/02/28/memory-matters-even-in-erlang</link>
	<description>&lt;p&gt;
Some time ago we got an interesting bug report for &lt;a href=&quot;http://www.rabbitmq.com/&quot; id=&quot;y62y&quot; title=&quot;RabbitMQ&quot;&gt;RabbitMQ&lt;/a&gt;. Surprisingly, unlike other complex bugs, this one is easy to describe:&amp;nbsp;&lt;br /&gt;
&lt;p&gt;&lt;i&gt;At some point basic.get suddenly starts being very slow - about 9 times slower!&lt;/i&gt;&lt;/p&gt;
&lt;span id=&quot;more-481&quot;&gt;&lt;/span&gt;

&lt;p&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Basic.get doesn&amp;#8217;t do anything complex - it just pops a message from a queue. This behaviour was quite unexpected. Our initial tests confirmed that we have a problem when a queue contains thousands of elements:&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;queue_length: 90001  basic_get 3333 times took: 1421.250ms
queue_length: 83335  basic_get 3333 times took: 1576.664ms
queue_length: 60004  basic_get 3333 times took: 1403.086ms
queue_length: 53338  basic_get 3333 times took: 9659.434ms [ look at that! ]
queue_length: 50005  basic_get 3333 times took: 9885.598ms
queue_length: 46672  basic_get 3333 times took: 8562.136ms&lt;/pre&gt;
&lt;p&gt;
Let me repeat that. Usually popping a message from a queue takes Xms. At some point, it slows down to 9*Xms.
&lt;/p&gt;

&lt;p&gt;It turned out that the problem is with the &lt;i&gt;&lt;a href=&quot;http://ftp.sunet.se/pub/lang/erlang/doc/man/queue.html#len-1&quot; id=&quot;d89l&quot; title=&quot;queue:length()&quot;&gt;queue:len()&lt;/a&gt;&lt;/i&gt; function, which is executed during the &lt;i&gt;basic.get&lt;/i&gt;. Actually, &lt;i&gt;queue:len()&lt;/i&gt; calls only &lt;i&gt;&lt;a href=&quot;http://www.erlang.org/doc/man/erlang.html#length-1&quot; id=&quot;somh&quot; title=&quot;erlang:length()&quot;&gt;erlang:length()&lt;/a&gt;&lt;/i&gt; builtin. At some point it switches to the &amp;#8220;slow&amp;#8221; mode.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Erlang:length()&lt;/i&gt; is a builtin that iterates through a linked list and counts it&amp;#8217;s length. It&amp;#8217;s complexity is&amp;nbsp;&lt;i&gt;O(N)&lt;/i&gt;, where N is the length of the list. This function is implemented in the VM so it&amp;#8217;s expected to be very, very fast.&lt;/p&gt;

&lt;p&gt;The problem is not with &lt;i&gt;erlang:length()&lt;/i&gt; being slow. It&amp;#8217;s about being unpredictably slow. Let&amp;#8217;s take a look at Erlang interpreter source code (&lt;a href=&quot;http://github.com/yrashk/erlang/blob/master/erts/emulator/beam/erl_bif_guard.c#L328&quot; id=&quot;ii56&quot; title=&quot;erl_bif_guard.c:erts_gc_length_1&quot;&gt;erl_bif_guard.c:erts_gc_length_1&lt;/a&gt;). Here&amp;#8217;s the main loop for &lt;i&gt;erlang:length()&lt;/i&gt;:&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;i=0
while (is_list(list)) {
    i++;
    list = CDR(list_val(list));
}&lt;/pre&gt;

&lt;p&gt;It does nothing unusual - it just iterates through &lt;a href=&quot;http://en.wikipedia.org/wiki/Cons&quot; id=&quot;ag6g&quot; title=&quot;Cons&quot;&gt;list elements&lt;/a&gt;. However, recompiling Erlang with some debugging information confirms that the problem is indeed here:&lt;/p&gt;
&lt;pre&gt;clock_gettime(CLOCK_REALTIME, &amp;amp;t0);
while (is_list(list)) {
    i++;
    list = CDR(list_val(list));
}
clock_gettime(CLOCK_REALTIME, &amp;amp;t1);
td_ms = TIMESPEC_NSEC_SUBTRACT(t1, t0) / 1000000.0;
if (i &amp;gt; 200000 || td_ms &amp;gt; 2.0) {
    fprintf(stderr, &quot;gc_length_1(%p)=%i %.3fms\n\r&quot;, reg[live], i, td_ms);
}&lt;/pre&gt;

&lt;pre&gt;gc_length_1(0x7f4dbfa7fc19)=499999 2.221ms
gc_length_1(0x7f4dbfa7fc19)=499999 2.197ms
gc_length_1(0x7f4dbfa7fc19)=499999 2.208ms
(hibernation)
gc_length_1(0x7f4db0572049)=499999 13.793ms
gc_length_1(0x7f4db0572049)=499999 12.806ms
gc_length_1(0x7f4db0572049)=499999 12.531ms&lt;/pre&gt;&lt;p&gt;
This confirms Matthias&amp;#8217; initial guess - the slowdown starts after Erlang process hibernation.
&lt;/p&gt;

&lt;p&gt;For those who aren&amp;#8217;t Erlang experts:&amp;nbsp;&lt;a href=&quot;http://www.erlang.org/doc/man/erlang.html#hibernate-3&quot; id=&quot;g:63&quot; title=&quot;Hibernation&quot;&gt;Hibernation&lt;/a&gt;&amp;nbsp;is an operation that compacts an Erlang process. It does aggressive garbage collection and reduces the memory footprint of a process to absolute minimum.&lt;/p&gt;

&lt;p&gt;The intended result of hibernation is recovering free memory from the process. However its side effect is a new memory layout of objects allocated on the heap.&lt;/p&gt;

&lt;p&gt;Ah, how could I have forgotten! The &lt;a href=&quot;http://norvig.com/21-days.html#Answers&quot; id=&quot;uk7i&quot; title=&quot;memory access is slow&quot;&gt;memory is nowadays slow&lt;/a&gt;! What happens, is that before hibernation list elements are aligned differently, more dense. Whereas after hibernation they are sparse. It&amp;#8217;s easy to test it - let&amp;#8217;s count the average distance between pointers to list elements:&lt;/p&gt;
&lt;pre&gt;gc_length_1(0x7f5c626fbc19)=499999 2.229ms avg=16.000 dev=0.023
gc_length_1(0x7f5c626fbc19)=499999 3.349ms avg=16.000 dev=0.023
gc_length_1(0x7f5c626fbc19)=499999 3.345ms avg=16.000 dev=0.023
(hibernation)
gc_length_1(0x7f5c61f7d049)=499999 13.800ms avg=136.000 dev=0.266
gc_length_1(0x7f5c61f7d049)=499999 12.726ms avg=136.000 dev=0.266
gc_length_1(0x7f5c61f7d049)=499999 12.367ms avg=136.000 dev=0.266
&lt;/pre&gt;
&lt;p&gt;
&lt;div&gt;Confirmed! Standard deviation is surprisingly small, so we can read the numbers as:&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;Before hibernation list elements are aligned exactly one after another, values are somewhere else.&lt;/li&gt;
&lt;li&gt;After hibernation list elements are interleaved with values.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;This behavior does make sense. In most cases when you traverse the list, you actually do something with the values. After hibernation, when you access list item, the value will be already loaded to the CPU cache.&lt;/p&gt;

&lt;p&gt;Knowing the mechanism, it&amp;#8217;s easy to write a &lt;a href=&quot;http://ai.pjwstk.edu.pl/~majek/dump/erlang-prefetch-length-test.erl&quot; id=&quot;cb:0&quot; title=&quot;test case that reproduces this behavior&quot;&gt;test case that reproduces the problem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The average distance between pointers in my case is constant - the standard deviation is negligible. This information has a practical implication - we can &amp;#8220;predict&amp;#8221; where the next pointer will be. Let&amp;#8217;s use that information to &amp;#8220;fix&amp;#8221; the Erlang VM by &lt;a href=&quot;http://gcc.gnu.org/projects/prefetch.html&quot; id=&quot;wv5_&quot; title=&quot;prefetching memory&quot;&gt;prefetching memory&lt;/a&gt;!&lt;/p&gt;

&lt;pre&gt;while (is_list(list)) {
    i++;
    list2 = CDR(list_val(list));
    __builtin_prefetch((char*)list2 + 128*((long)list2-(long)list));
    list = list2;
}
&lt;/pre&gt;
&lt;div&gt;Test script running on original Erlang VM:&lt;/div&gt;
&lt;pre&gt;length: 300001  avg:0.888792ms dev:0.061587ms
length: 300001  avg:0.881030ms dev:0.040961ms
length: 300001  avg:0.875158ms dev:0.019436ms
hibernate
length: 300001  avg:14.861762ms dev:0.150635ms
length: 300001  avg:14.833733ms dev:0.017405ms
length: 300001  avg:14.884861ms dev:0.220119ms
&lt;/pre&gt;
&lt;div&gt;&lt;a href=&quot;http://ai.pjwstk.edu.pl/~majek/dump/erlang-R13B04-prefetch-length.diff&quot; id=&quot;n_0l&quot; title=&quot;Patched&quot;&gt;Patched&lt;/a&gt; Erlang VM:&lt;/div&gt;
&lt;pre&gt;length: 300001  avg:0.742822ms dev:0.029322ms
length: 300001  avg:0.739149ms dev:0.012897ms
length: 300001  avg:0.739465ms dev:0.014417ms
hibernate
length: 300001  avg:7.543693ms dev:0.284355ms
length: 300001  avg:7.342802ms dev:0.330158ms
length: 300001  avg:7.265960ms dev:0.053176ms
&lt;/pre&gt;
&lt;p&gt;
The test runs only a tiny bit faster for the &amp;#8220;fast&amp;#8221; case (dense &lt;a href=&quot;http://en.wikipedia.org/wiki/Cons&quot; id=&quot;khsh&quot; title=&quot;conses&quot;&gt;conses&lt;/a&gt;) and twice as fast for the &amp;#8220;slow&amp;#8221; case (sparse conses).&lt;/p&gt;

&lt;p&gt;Should this patch be merged into mainline Erlang? Not really. I have set the prefetch multiplier value to 128 and I don&amp;#8217;t even know if it&amp;#8217;s optimal. This was only an experiment. But it was fun to see how low-level system architecture can affect high-level applications.&lt;/p&gt;
&lt;/p&gt;</description>
	<pubDate>Sun, 28 Feb 2010 21:42:43 +0000</pubDate>
</item>
<item>
	<title>Tragically L33T: Moving my Blog to Jekyll</title>
	<guid>http://tragicallyleet.com/2010/02/28/moving-my-blog-to-jekyll</guid>
	<link>http://tragicallyleet.com/2010/02/28/moving-my-blog-to-jekyll</link>
	<description>&lt;p&gt;In the past I have not blogged very often. In fact I seem to blog less often than &lt;a href=&quot;http://wordpress.org/&quot;&gt;Wordpress&lt;/a&gt; releases a security patch. This was making me nervous and, combined with the issues of writing posts offline at events like NFJS, I decided a change was in order.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt;, the static page blog generator behind &lt;a href=&quot;http://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt;. So far the workflow of managing text files in a Git repository is working well for me. Not being able to leave well enough alone I created a Rakefile to manage certain tasks like create a tagcloud for the sidebar, creating tag specific pages listing posts, and creating a draft post.&lt;/p&gt;

&lt;p&gt;Creating a draft post was pretty straightforward:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;desc&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'create a new post in draft mode'&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:new&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:require_input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Title: &amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;downcase&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gsub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/[^a-z0-9]/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;lib/post_template.markdown&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;_drafts/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.markdown&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'w+'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; 
    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gsub&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/POST_TITLE/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;git add _drafts/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.markdown&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Publishing a draft to the blog will consist of a &lt;code&gt;git mv&lt;/code&gt; of the draft file to the _posts directory with the data appended to the filename.&lt;/p&gt;

&lt;p&gt;As for comments I have switched over to Disqus, which allowed me to import my Wordpress comments and link to them on my Jekyll blog.&lt;/p&gt;</description>
	<pubDate>Sun, 28 Feb 2010 08:00:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Nurturing creativity and the passionate programmer</title>
	<guid>http://www.redhoterlang.com/web/3a5df92bd3f8988b13c91c091592faba</guid>
	<link>http://www.redhoterlang.com/web/plink?id=3a5df92bd3f8988b13c91c091592faba</link>
	<description>&amp;lt;p&amp;gt;I happened to read an article in the Harvard Business Review the other day. &amp;lt;br /&amp;gt;
The article was about how Pixar was fostering creativity among their employees. &amp;lt;br /&amp;gt;
I realized that I've been nurturing my creativity for years by spending a &amp;lt;br...</description>
	<pubDate>Sat, 27 Feb 2010 09:11:02 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: Erlang Development Cycles Presentations</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-7355340354614769648</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/02/heres-video-from-development-cycles.html</link>
	<description>Here's the video from the Development Cycles Talk given on February 17, 2010.  Lots of great ideas in here!Development Cycles Part 1


tools used can be found at http://code.google.com/p/faxienthe github erlware accountand sinan can be found with faxien by running &quot;faxien install-release sinan&quot;Also, check out http://ecb.sourceforge.net/ for the emacs IDE mode and http://cedet.sourceforge.net/ and</description>
	<pubDate>Wed, 24 Feb 2010 13:54:00 +0000</pubDate>
	<author>noreply@blogger.com (Barry Nicholson)</author>
</item>
<item>
	<title>Kevin Scaldeferri's Weblog: Alpha Male Programmers &lt;em&gt;Are&lt;/em&gt; Driving Women Out</title>
	<guid>http://kevin.scaldeferri.com/blog/2009/04/28/AlphaProgrammersAndWomen.html</guid>
	<link>http://kevin.scaldeferri.com/blog/2009/04/28/AlphaProgrammersAndWomen.html</link>
	<description>&lt;p&gt;Yesterday, DHH made an argument that &lt;a href=&quot;http://www.loudthinking.com/posts/40-alpha-male-programmers-arent-keeping-women-out&quot;&gt;alpha
  male programmers aren’t keeping women out&lt;/a&gt; of the tech field.
  I’m of the opinion that he’s wrong and that his argument is flawed,
  and in a moment I’ll explain why, but let me get a few things out of
the way so they don’t distract from the rest of my argument.&lt;/p&gt;
&lt;p&gt;First, I don’t think that “alpha males” or the “rockstar” mentality
are the only causes of under-representation of women in technology. As
far as I can tell, the causes are many, varied, generally difficult to
  deal with, and in one or two cases may even be valid reasons why we
  might ultimately accept some degree of imbalance in the
  field. Second, this is not strictly a gender issue.  Some men are
  also driven away by this behavior, although I think women are more
  likely to be; and also some “alpha males” happen to be female.
  Third, this is not a personal attack on DHH or any other individual,
although some people might read parts of it in that way.  But my goal
  here is that the range of individuals who find themselves
  uncomfortably reflected in what I say, but don’t simply reject it
  all out of hand, might view that discomfort as an opportunity for
  personal growth.  Finally, I am certainly not claiming that I am
  perfect in this regard.  I’ve made mistakes in the past; I will make
them again.  I simply hope that my friends will be kind enough to
  point out my mistakes to me, so that I can try to do better.&lt;/p&gt;
&lt;p&gt;Okay, now that that’s all out of the way...&lt;/p&gt;
&lt;p&gt;I first claim that DHH is wrong.  My proof is empirical and
  anecdotal, but fortunately for me, I’m on the side of this debate
  that gets to use those techniques.  I.e., I’m asserting existence of
a phenomenon, rather than non-existence.  I know numerous women who
  have been driven away by alpha male behavior.  In some cases, they
  simply moved to a different team, or a different company.  In other
  cases, they switched to non-programmer roles.  And some left the
  industry entirely.  I know this because they told me.  They
  described specific individuals and specific behaviors which drove
  them away.&lt;/p&gt;
&lt;p&gt;With some frequency in these debates, male programmers
  will claim that they don’t know any women who have left the field
  for this reason (or who have experienced sexism in the field, or who
  were offended by the example under discussion, or even just the
  milder claim that DHH makes, that no one has any idea what to do).
  I can explain this in only one of two ways: either they don’t know
  any women in the field to begin with or don’t talk with them beyond
  the minimal professional requirements, or women are not telling them
because they are part of the problem.  Perhaps it would be more
  effective if these women directly confronted the people causing the
  problem, but the fact of the matter is that most people, men and
  women, dislike conflict.  We’re much more comfortable griping to a
  sympathetic friend than to the cause of our unhappiness.  So
  consider me something akin to an anonymizing proxy.  Without
  revealing names or too many of the specifics, please trust me when I
say that almost every woman in the field experiences and complains
  about this.&lt;/p&gt;
&lt;p&gt;Now I also said that DHH’s argument is flawed, and I will spend the
rest of this post pointing out the various flaws I see.&lt;/p&gt;
&lt;p&gt;DHH claims alpha males cannot be a problem in programming because
  the average male programmer is “meek, tame, and introverted”
  compared to other fields.  First off, “alpha males” are by definition
not average; they are the most dominant individuals of a group.  And,
  it may even be possible that the general meekness or introversion of
programmers makes it easier for a small set of individuals to dominate
the interaction, rather than reaching a condition of detente between a
group of uniformly assertive individuals.  Second, presumably DHH does
not interact with these people from other fields in a professional
  context.  A point repeatedly stressed in this recent “pr0n star”
  controversy is that it’s not an issue of people being anti-sex or anti-porn; it’s
  about what’s appropriate in the workplace, or in a professional
  context.  Standards for behavior in a social context are different.
Third, he speaks in terms of whether these other men are more or less
  “R-rated”.  This is not the point.  Women are just as “R-rated” as
  men.  They curse.  They talk about sex (often more explicitly than
  men).  The issue is not about whether we say or do adult things,
  it’s about whether we respect each other as human beings and whether
we understand the societal norms of what is and is not appropriate in
  particular contexts.  In fact, in this regard, I’ll defend DHH.
  Saying “fuck” (in the exclamatory, non-sexual usage) in the course
  of a technical presentation is not problematic in this day and age
  within the technology community.  I think most of us swear freely in
the course of struggling with a nasty bug or production problem.  This
is a normative expression of frustration within our community, and it
  does not oppress or disrespect other members of the community.  (As
  far as I know.  It’s possible that people just aren’t telling me
  that it upsets them when I curse at my monitor.  If that’s the case,
  I hope someone will tell me.)  Finally, DHH observes that these
  other fields have a more even mix of men and women.  What he misses
  is that when the distribution is relatively equal it is generally
  easier and more comfortable for men to be men and women to be
  women.  It is perhaps counterintuitive, but environments which are
  heavily skewed call for greater sensitivity to gender or other
  cultural differences simply because it is so easy to
  unintentionally create an oppressive or exclusionary atmosphere.&lt;/p&gt;
&lt;p&gt;In the final paragraphs of his post, DHH suggests that somehow by
  respecting women we are squashing some other sort of “edge” and
  diversity in the community.  I’m a little puzzled by what he means
  by this, and I’m sort of afraid that he thinks that being a
  heterosexual male who likes to look at scantily-clad women (or who
  openly admits as much) is somehow “edgy”.  It’s not.  By
  definition, hetero males like women; and it’s well established that
  men tend to be visually oriented.  Pointing out that you fall in
  this category does not make you “diverse”, it makes you a completely
  typical representative of your gender and orientation.  No one needs
to be reminded of it.&lt;/p&gt;
&lt;p&gt;Moreover, it might be true that maximal gains are had by pushing
  the edges (although I don’t think that one should naively assume
  that analogy from physics or economics applies to social
  endeavors), but for this to be work there has to be negative
  feedback when boundaries are crossed.  If the edge-walkers want
  society to accept their behavior, they must be prepared to
  apologize, to make reparations, and to correct their course when
  they go over the line.  This is the difference between a
  trend-setter and a sociopath.&lt;/p&gt;
&lt;p&gt;There’s quite a bit more that I could say on this issue, but I fear
this may be becoming too long already, and I think it’s probably best
  to focus only on the arguments presented in this particular post at
  the moment.  To summarize things in a couple of sentences, the
  phenomenon of women being discouraged by alpha male behavior is
  real.  You merely need to talk, and listen, to women in the field to
verify this.  (But you might have to earn some trust first.)
  Comparisons with men in other fields in non-professional settings do
not have much relevance to the matter at hand.  Claims that respecting
the feelings and experiences of a minority group is damaging to the
  community overall are extraordinary and require extraordinary
  support.  Being a thought leader and being offensive are two very
  different things.&lt;/p&gt;
&lt;p&gt;It’s really quite discouraging that so much of this discussion
  still seems mired in the question of whether a problem even exists,
  or whether it is desirable and possible to address the problem.
  This lack of acceptance leads both to the explicit refusals to
  acknowledge the validity of the complaints of the offended, as well
  as the phenomena of false apologies and insincere claims that “I
  would help if only I knew how (and if it doesn’t require any actual
  change of behavior on my part)”.  Male programmers need to pull
  their heads out of the sand.  The evidence, both hard statistical
  data and anecdotal, is overwhelming.  It also is not hard to find
  advice about what can be done differently.  The hard part is moving
  from a vague desire for diversity and balance to serious,
  meaningful, sometimes painful self-examination and commitment to
  change and improvement.  It’s not easy to admit flaws in yourself,
  to acknowledge when you’ve hurt another person, or to make a true
  apology.  Change doesn’t happen overnight or simply because you say
  that you want it to.  It takes work, but it’s an important part of
  being a human being and being a member of a community.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;http://kevin.scaldeferri.com/blog/2009/04/28/AlphaProgrammersAndWomen.html#comments&quot;&gt;Comments&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:57:04 +0000</pubDate>
</item>
<item>
	<title>Kevin Scaldeferri's Weblog: Speeding up a Rails request by 150ms by changing 1 line</title>
	<guid>http://kevin.scaldeferri.com/blog/2009/05/08/RailsRackResponse.html</guid>
	<link>http://kevin.scaldeferri.com/blog/2009/05/08/RailsRackResponse.html</link>
	<description>&lt;p&gt;We’re pretty obsessed with performance at &lt;a href=&quot;http://www.gilt.com/&quot;&gt;Gilt Groupe&lt;/a&gt;.  You can get a taste
  for what we’re dealing with, and how we’re dealing with it, from our
  recent &lt;a href=&quot;http://en.oreilly.com/rails2009/public/schedule/detail/8505&quot;&gt;presentation at RailsConf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the techniques we’re using is to precompute what certain
  high-volume pages will look like at a given time in the future, and
  store the result as static HTML that we serve to the actual users at
that time.  For ease of initial development, and because there’s still
  a fair bit of business logic involved in determining &lt;em&gt;which
  version&lt;/em&gt; of a particular page to serve, this was done inside our
  normal controller actions which look for a static file to serve,
  before falling back to generating it dynamically.&lt;/p&gt;
&lt;p&gt;We’re now running on Rails 2.3 and, of course, Rails Metal is the
  new hotness in 2.3.  I spent the last couple days looking into how
  much improvement in static file serving we would see by moving it
  into the Metal layer.  Based on most of what I’ve read, I expected
  we might shave off a couple milliseconds.  This expectation turned
  out to be dramatically wrong.&lt;/p&gt;
&lt;p&gt;Metal components operate outside the realm of the usual Rails
  timing and logging components, so you don’t get any internal
  measurements of page performance.  Instead, I fired up &lt;a href=&quot;http://httpd.apache.org/docs/2.0/programs/ab.html&quot;&gt;ab&lt;/a&gt; to measure
the serving times externally.  What I found for the page I was
  benchmarking was that the Metal implementation took about 5ms.  The
  old controller action took 170ms.  But, wait... the Rails logs were
  only reporting 8ms for that action.  Something was fishy.&lt;/p&gt;
&lt;p&gt;I started inserting timers at various places in the Rails stack,
  trying to figure out where the other 160ms was going.  A little bit
  was routing logic and other miscellaneous overhead, but even setting
a timer around the very entry points into the Rails request serving
  path, I was only seeing 15ms being spent.  This was getting really
  puzzling, because at this point where a Rack response is returned to
the web server, I expected things to look identical between Metal and
  ActionController.  However, looking more closely at the response
  objects I discovered the critical difference.  The Metal response
  returns an &lt;code&gt;[String]&lt;/code&gt;, while the controller returned an
  ActionController::Response.&lt;/p&gt;
&lt;p&gt;I went into the Rails source and found the &lt;code&gt;each&lt;/code&gt; method
for ActionController::Response.  Here it is:&lt;/p&gt;
&lt;pre&gt;
   def each(&amp;amp;callback)
     if @body.respond_to?(:call)
       @writer = lambda { |x| callback.call(x) }
       @body.call(self, self)
     elsif @body.is_a?(String)
       @body.each_line(&amp;amp;callback)
     else
       @body.each(&amp;amp;callback)
     end

     @writer = callback
     @block.call(self) if @block
   end
&lt;/pre&gt;
&lt;p&gt;The critical line is the case where the body is a String.  The code
iterates over each line in the response.  Each line is written
  individually to the network socket.  In the case of the particular
  page I was looking at, that was 1300 writes.  Ouch.&lt;/p&gt;
&lt;p&gt;To confirm this was the problem, I changed that line to&lt;/p&gt;
&lt;pre&gt;
      yield @body
&lt;/pre&gt;
&lt;p&gt;With the whole body being sent in a single write, ab reported 15ms
  per request, right in line with what I measured inside Rails.&lt;/p&gt;
&lt;p&gt;1 line changed.  150ms gained.  Not too bad.&lt;/p&gt;
&lt;p&gt;This sort of performance pessimization we uncovered is particularly insidious
  because it’s completely invisible to all the usual Rails
  monitoring tools.  It doesn’t show up in your logged response time;
  you won’t see it in NewRelic or TuneUp.  The only way you’re going
  to find out about it is by running an external benchmarking tool.
  Of course, this is always a good idea, but it’s easy to forget to do
  it, because the tools that work inside the Rails ecosystem are so
  nice.  But the lesson here is, if you’re working on performance
  optimizations, make sure to always get a second opinion.&lt;/p&gt;

  &lt;p&gt;&lt;a href=&quot;http://kevin.scaldeferri.com/blog/2009/05/08/RailsRackResponse.html#comments&quot;&gt;Comments&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:57:04 +0000</pubDate>
</item>
<item>
	<title>Trapexit News Feed: Trapexit News :: Erlang Open Source crawler!</title>
	<guid>http://www.trapexit.org/forum/viewtopic.php?p=50720#50720</guid>
	<link>http://www.trapexit.org/forum/viewtopic.php?p=50720#50720</link>
	<description>Author: &lt;a href=&quot;http://www.trapexit.org/forum/profile.php?mode=viewprofile&amp;u=2&quot; target=&quot;_blank&quot;&gt;admin&lt;/a&gt;&lt;br /&gt;
Subject: Erlang Open Source crawler!&lt;br /&gt;
Posted: Thu Nov 19, 2009 4:22 pm (GMT 0)&lt;br /&gt;
Topic Replies: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;postbody&quot;&gt;Trapexit is proud to announce its own Erlang open source crawler. We crawl the web for you, gathering searchable information on all open source Erlang projects from all the major repositories. You can discuss these projects in the forum, add documentation in the trapexit wiki or rate the various contributions. To view our new project index repository, visit &lt;a href=&quot;http://projects.trapexit.org&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;http://projects.trapexit.org&lt;/a&gt;.
&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:56:53 +0000</pubDate>
</item>
<item>
	<title>Trapexit News Feed: Trapexit News :: Navigating The Erlang Source!</title>
	<guid>http://www.trapexit.org/forum/viewtopic.php?p=47819#47819</guid>
	<link>http://www.trapexit.org/forum/viewtopic.php?p=47819#47819</link>
	<description>Author: &lt;a href=&quot;http://www.trapexit.org/forum/profile.php?mode=viewprofile&amp;u=183&quot; target=&quot;_blank&quot;&gt;francesco&lt;/a&gt;&lt;br /&gt;
Subject: Navigating The Erlang Source!&lt;br /&gt;
Posted: Thu Aug 20, 2009 2:24 pm (GMT 0)&lt;br /&gt;
Topic Replies: 0&lt;br /&gt;&lt;br /&gt;
&lt;span class=&quot;postbody&quot;&gt;While trapexit user zghst was looking at the erlang source, there was quite a bit of information about it he felt was missing or hard to find. As a result, he started a wiki page to help new people like him find their way around it: &lt;a href=&quot;http://www.trapexit.org/A_Guide_To_The_Erlang_Source&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;A Guide To The Erlang Source&lt;/a&gt;. Why not give him a hand in improving it?
&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:56:53 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Early Bird Saver - only two weeks left!</title>
	<guid>http://erlang-factory.com/news/rss/bed8891c36d68c78282a3aa1bbceda03</guid>
	<link></link>
	<description>You only have two weeks left to take advantage of our &lt;span&gt;Early Bird &lt;/span&gt;special offers. &lt;a href=&quot;https://www.erlang-factory.com/conference/SFBay2010/register&quot;&gt;Sign-up&lt;/a&gt; for the &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010&quot;&gt;Erlang Factory&lt;/a&gt; &lt;span&gt;before 28th February 2010&lt;/span&gt; and &lt;span&gt;SAVE $200&lt;/span&gt; off the standard price! &lt;br /&gt;&lt;br /&gt;When registering, you can also sign up for the Erlang University courses and choose from: &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/university/ErlangExpress&quot;&gt;Erlang Express&lt;/a&gt;, &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/university/OTPExpress&quot;&gt;Erlang OTP Express&lt;/a&gt;, &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/university/QuickCheck&quot;&gt;QuickCheck for Erlang developers&lt;/a&gt; and &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/university/WebProgrammingwithErlang&quot;&gt;Web Programming with Erlang&lt;/a&gt;. The discount applies to the courses as well. &lt;br /&gt;&lt;br /&gt;&lt;span&gt;Don't miss out - &lt;a href=&quot;https://www.erlang-factory.com/conference/SFBay2010/register&quot;&gt;book&lt;/a&gt; your place today!&lt;/span&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:56:23 +0000</pubDate>
</item>
<item>
	<title>Erlang Factory News: Book your hotel room for the Erlang Factory!</title>
	<guid>http://erlang-factory.com/news/rss/c32ba4d29413abf71eb07e4bfd97917a</guid>
	<link></link>
	<description>The 2010 Erlang Factory will be held at the &lt;a href=&quot;http://www.erlang-factory.com/conference/SFBay2010/venue&quot;&gt;Hilton San Francisco Airport&lt;/a&gt;. You can now book your hotel room there for the &lt;span&gt;GREAT CONFERENCE RATE&lt;/span&gt;! For rooms with a Kingsize bed, delegates will pay only &lt;span&gt;$109.00 per night&lt;/span&gt; – room only, with &lt;span&gt;FREE PARKING&lt;/span&gt; and &lt;span&gt;FREE WI-FI &lt;/span&gt;in the rooms for delegates.&lt;br /&gt;&lt;br /&gt;To book for the special Erlang Factory rate click &lt;a href=&quot;http://www.hilton.com/en/hi/groups/personalized/SFOAPHF-EFB-20100322/index.jhtml&quot;&gt;HERE&lt;/a&gt;.&lt;br /&gt;</description>
	<pubDate>Wed, 24 Feb 2010 10:56:23 +0000</pubDate>
</item>
<item>
	<title>RiboComments/Erlang: Generating prime numbers with Erlang and Java</title>
	<guid>http://blog.ribomation.com/2009/08/06/generating-prime-numbers-with-erlang-and-java/</guid>
	<link>http://blog.ribomation.com/2009/08/06/generating-prime-numbers-with-erlang-and-java/</link>
	<description>During my work with the course-ware of a new Erlang course, I experimented with one of the programming assignments to compare the threading performance of Erlang versus Java. The assignment is one of the classical programs from teaching concurrent programming: How to generate prime numbers using a pipeline of sieve ...</description>
	<pubDate>Wed, 24 Feb 2010 10:56:23 +0000</pubDate>
</item>
<item>
	<title>RiboComments/Erlang: The critical section problem in Erlang</title>
	<guid>http://blog.ribomation.com/2009/07/31/the-critical-section-problem-in-erlang/</guid>
	<link>http://blog.ribomation.com/2009/07/31/the-critical-section-problem-in-erlang/</link>
	<description>The programming language Erlang is based on micro-threads and asynchronous message passing. There is a (naive) belief that critical section problems cannot arise in languages based solely on message passing. The justification for this stand-point is the absence of mutex synchronization primitives, which is absolutely essential in shared-data based concurrent ...</description>
	<pubDate>Wed, 24 Feb 2010 10:56:23 +0000</pubDate>
</item>
<item>
	<title>EazyErl!: Filtering lines efficiently</title>
	<guid>tag:blogger.com,1999:blog-855944390206940143.post-8276989122488926253</guid>
	<link>http://easyerl.blogspot.com/2010/02/filtering-lines-efficiently.html</link>
	<description>Whenever you are dealing with log lines or that you're program is filtering data you always have to handle 'escaping' efficiently.&lt;br /&gt;&lt;br /&gt;While developing a log module using a gen_event, I needed to escape simple quotes.&lt;br /&gt;Sometime thoses quotes were already escaped...&lt;br /&gt;&lt;br /&gt;I've found this regexp to handle gracefully the case:&lt;br /&gt;&lt;pre&gt;re:replace( Bin, &quot;(?&amp;lt;!\\\\)'&quot;, &quot;\\\\'&quot;, [ global ] ).&lt;br /&gt;&lt;/pre&gt;&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br /&gt;Not so easy to read, and because of the various backslashes, this regexp needed some tests&lt;br /&gt;before being fully usable.&lt;br /&gt;Basically this regexp only filter simple quote when they're not already escaped...&lt;br /&gt;&lt;br /&gt;Now that I've my filter for quotes and I need a filter for newline characters.&lt;br /&gt;Everytime you find some newlines in your log files, you can be sure that many tools already in your network will not treat them efficiently, worse this may break everything after ...&lt;br /&gt;&lt;br /&gt;So I came across this regexp:&lt;br /&gt;&lt;pre&gt;re:replace( Bin, &quot;[\\n\\r]+&quot;, &quot; &quot;, [ global ] ).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally having two filter functions for every line, I wanted to be able to add or remove easily any function.&lt;br /&gt;You can reference functions with this notation:&lt;br /&gt;&lt;pre&gt;fun filterquotes/1&lt;br /&gt;&lt;/pre&gt;Or a list of functions:&lt;br /&gt;&lt;pre&gt;[ fun filterquotes/1, fun filternewlines/1 ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;With this notation and the famous 'lists:foldl', I can filter a line with many functions quite nicely:&lt;br /&gt;&lt;pre&gt;% Data is the accumulator, but we don't change it :)&lt;br /&gt;        lists:foldl( fun( Fun, Data ) -&gt;&lt;br /&gt;                         Fun(Data) &lt;br /&gt;        end, Bin, [ fun filterquotes/1, fun filternewline/1 ]).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's the code:&lt;br /&gt;&lt;pre&gt;filter( Bin ) when is_atom(Bin) -&gt;&lt;br /&gt;        Bin;&lt;br /&gt;filter( Bin ) when is_integer(Bin) -&gt;&lt;br /&gt;        Bin;&lt;br /&gt;filter( Bin ) -&gt;&lt;br /&gt;        lists:foldl( fun( Fun, Data ) -&gt;&lt;br /&gt;                         Fun(Data) &lt;br /&gt;        end, Bin, [ fun filterquotes/1, fun filternewline/1 ]).&lt;br /&gt;&lt;br /&gt;filterquotes(Bin) -&gt;&lt;br /&gt;        re:replace( Bin, &quot;(?&amp;lt;!\\\\)'&quot;, &quot;\\\\'&quot;, [ global ] ).&lt;br /&gt;&lt;br /&gt;filternewline( Bin ) -&gt;&lt;br /&gt;        re:replace( Bin, &quot;[\\n\\r]+&quot;, &quot; &quot;, [ global ] ).&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/855944390206940143-8276989122488926253?l=easyerl.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 24 Feb 2010 09:00:02 +0000</pubDate>
	<author>noreply@blogger.com (rolphin)</author>
</item>
<item>
	<title>EazyErl!: Reading an openssl .priv.key file and extracting the key</title>
	<guid>tag:blogger.com,1999:blog-855944390206940143.post-5533665012407705943</guid>
	<link>http://easyerl.blogspot.com/2010/02/reading-openssl-privkey-file-and.html</link>
	<description>Extracting the private key from a .priv.key file is simple.&lt;br /&gt;The private key is encrypted using a AES-128 with your passphrase.&lt;br /&gt;&lt;br /&gt;The initial vector is also stored in the file, you can extract it directly from the first line:&lt;br /&gt;&lt;pre&gt;get_salt( &quot;Salted__&quot;, Salt:8/binary, Rest/binary&gt;&gt; ) -&gt;&lt;br /&gt;        {Salt, Rest}.&lt;br /&gt;&lt;/pre&gt;&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br /&gt;The last part is handled by some md5() of your passphrase and the initial vector:&lt;br /&gt;&lt;pre&gt;Key = crypto:md5([ Password, Salt ]),&lt;br /&gt;        IV = crypto:md5([ Key, Password, Salt ]),&lt;br /&gt;        crypto:aes_cbc_128_decrypt( Key, IV, Rest).&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now the full module:&lt;br /&gt;&lt;pre&gt;-module(priv_key).&lt;br /&gt;&lt;br /&gt;-compile(export_all).&lt;br /&gt;&lt;br /&gt;priv_key_file( File, Password ) -&gt;&lt;br /&gt;        {ok, Bin} = file:read_file(File),&lt;br /&gt;        {Salt, Rest} = get_salt(Bin),&lt;br /&gt;        Key = crypto:md5([ Password, Salt ]),&lt;br /&gt;        IV = crypto:md5([ Key, Password, Salt ]),&lt;br /&gt;        crypto:aes_cbc_128_decrypt( Key, IV, Rest).&lt;br /&gt;        &lt;br /&gt;get_salt( &quot;Salted__&quot;, Salt:8/binary, Rest/binary&gt;&gt; ) -&gt;&lt;br /&gt;        {Salt, Rest}.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/855944390206940143-5533665012407705943?l=easyerl.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 23 Feb 2010 22:23:26 +0000</pubDate>
	<author>noreply@blogger.com (rolphin)</author>
</item>
<item>
	<title>Nicolas Charpentier's blog: Code availability on git-hub</title>
	<guid>http://charpi.net/blog/?p=219</guid>
	<link>http://charpi.net/blog/2010/02/21/code-availability-on-git-hub/</link>
	<description>Bored to switch code between my private subversion repository and git-hub for my open-source projects, I decided to use exclusively git-hub for them.
My trac wiki pages are also moved to git-hub for improve the documentation of those projects.

Selenium-RC Erlang binding 
Rake tasks to build erlang code
Small mock library for erlang (Please don&amp;#8217;t use mock to test [...]</description>
	<pubDate>Sun, 21 Feb 2010 08:54:32 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Jingle Nodes on Talkr.IM</title>
	<guid>http://www.process-one.net/en/blogs/article/jingle_nodes_on_talkr.im/</guid>
	<link>http://www.process-one.net/en/blogs/article/jingle_nodes_on_talkr.im/</link>
	<description>&lt;p&gt;A Jingle Nodes relay has been installed on the &lt;a href=&quot;https://www.talkr.im/&quot;&gt;Talkr.IM&lt;/a&gt; XMPP service.&lt;/p&gt; &lt;p&gt;The &lt;a href=&quot;https://www.talkr.im/&quot;&gt;public XMPP server Talkr.IM&lt;/a&gt; has received its own &lt;a href=&quot;http://code.google.com/p/jinglenodes/&quot;&gt;Jingle Nodes&lt;/a&gt; relay on: &lt;a href=&quot;http://www.process-one.net/en2_p1adm/xmpp:jn.talkr.im&quot;&gt;xmpp:jn.talkr.im&lt;/a&gt;. You can browse the Talkr.IM services via your Service Discovery interface in your XMPP client.&lt;/p&gt;
&lt;p&gt;This new exclusive feature on Talkr.IM XMPP server enables Jingle calls by providing a public service for media relaying. Basically, this means that XMPP clients which can handle Jingle Nodes, will be able to join other Jingle Nodes enabled clients to establish voice calls even when both are hidden behind network barriers (like NAT, for the techies).&lt;/p&gt;
&lt;p&gt;One many entities of the XMPP federated network (clients, servers) will have Jingle Nodes enabled, this will be possible to establish calls, in a totally P2P manner, much like Skype, but with much more features like the control of who can use your relay. Read the &lt;a href=&quot;http://code.google.com/p/jinglenodes/&quot;&gt;Jingle Nodes website&lt;/a&gt; and the &lt;a href=&quot;http://xmpp.org/extensions/inbox/jingle-nodes.html&quot;&gt;Jingle Nodes XEP&lt;/a&gt; to know more.&lt;/p&gt;
&lt;p&gt;This Talkr.IM Jingle Nodes relay is one of the very first step to a simpler Jingle user experience worldwide.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.talkr.im/&quot;&gt;Talkr.IM website&lt;/a&gt;, and create &lt;a href=&quot;https://www.talkr.im/signup&quot;&gt;your own Talkr.IM XMPP account&lt;/a&gt; freely: &lt;a href=&quot;https://www.talkr.im/signup&quot;&gt;https://www.talkr.im/signup&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 18 Feb 2010 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: OneTeam for iPhone in version 3.2.5, with Facebook chat</title>
	<guid>http://www.process-one.net/en/blogs/article/oneteam_for_iphone_in_version_3.2.5_with_facebook_chat/</guid>
	<link>http://www.process-one.net/en/blogs/article/oneteam_for_iphone_in_version_3.2.5_with_facebook_chat/</link>
	<description>&lt;p&gt;OneTeam for iPhone has been published on the AppStore in version 3.2.5, bringing bugfixes, and Facebook chat based on XMPP.&lt;/p&gt; &lt;p&gt;The version 3.2.5 of our XMPP client OneTeam for iPhone has hit the shelves of the Apple's application store. It is recommended that you upgrade it.&lt;/p&gt;
&lt;p&gt;OneTeam 3.2.4 for iPhone had already fixed bug related to Multi-User Chats (also known as groupchats): in some cases, OneTeam used to crash on joining password-protected and members-only MUC.&lt;/p&gt;
&lt;p&gt;OneTeam 3.2.5 for iPhone now allows OneTeam users to connect to the XMPP interface to Facebook chat. You can now connect with Jabber-ID set your &quot;your_username@chat.facebook.com&quot;, and password set to your Facebook password.&lt;/p&gt;
&lt;p&gt;Be careful, Facebook's XMPP chat interface does not offer MUC services, nor is federated, which means you still cannot chat with your friends on Talkr.IM or Google's Talk/GMail, but only with Facebook friends.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;http://www.process-one.net/en/solutions/oneteam_iphone/&quot;&gt;OneTeam for iPhone&lt;/a&gt; on our website, as well as &lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292511942&amp;mt=8&quot;&gt;Apple's AppStore&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 17 Feb 2010 16:08:11 +0000</pubDate>
</item>
<item>
	<title>Chicago Erlang User Group: OTP Packaging Video 12/16/2009</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-2172718065976708205</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/02/otp-packaging-video-12162009.html</link>
	<description>Here's the video from the December 16, 2009 Erlang/OTP Packaging talk given to the Chicago Erlang Users Group by Martin Logan.Part 1


Part 2


Part 3</description>
	<pubDate>Tue, 16 Feb 2010 15:36:00 +0000</pubDate>
	<author>noreply@blogger.com (Barry Nicholson)</author>
</item>
<item>
	<title>Chicago Erlang User Group: Chicago Erlang User Group Meeting Februrary 17th</title>
	<guid>tag:blogger.com,1999:blog-2706443342944599131.post-886960597645056359</guid>
	<link>http://chicagoerlangusergroup.blogspot.com/2010/02/chicago-erlang-user-group-meeting.html</link>
	<description>The time and location:We are confirmed for Wednesday February 17th at 6:00PM. Orbitz has agreed again to let us use their office space for the meetup. We need all the names of the people that will attend so we can place them on the security list. Please email to RSVP at martinjlogan -at- gmail.The address for the talk is 500 W. Madison St, Chicago IL (the Olgilvie transportation center). Come up</description>
	<pubDate>Thu, 11 Feb 2010 12:59:00 +0000</pubDate>
	<author>noreply@blogger.com (Jordan Wilberding)</author>
</item>
<item>
	<title>Programming in the 21st Century: Optimizing for Fan Noise</title>
	<guid>http://prog21.dadgum.com/61.html</guid>
	<link>http://prog21.dadgum.com/61.html</link>
	<description>The first money I ever earned, outside of getting an allowance, was writing assembly language games for an 8-bit home computer magazine called &lt;a href=&quot;http://www.cyberroach.com/analog/&quot;&gt;ANALOG Computing&lt;/a&gt;. Those games ended up as pages of printed listings of lines like this:
&lt;pre&gt;1050 DATA 4CBC08A6A4BC7D09A20986B7B980
0995E895D4B99E099DC91C9DB51CA90095C0C8
CA10E8A20086A88E7D1D8E7E,608
&lt;/pre&gt;A typical game could be 75 to 125+ of those lines (and those &quot;three&quot; lines above count as one; it's word-wrapped for a 40-column display). On the printed page they were a wall of hex digits. And people typed them in by hand--I typed them in by hand--in what can only be described as a painstaking process. Just try reading that data to yourself and typing it into a text editor. Go ahead: 4C-BC-08-A6...
&lt;br /&gt;&lt;br /&gt;Typos were easy to make. That's the purpose of the &quot;608&quot; at the end of the line. It's a checksum verified by a separate &quot;correctness checker&quot; utility.
&lt;br /&gt;&lt;br /&gt;There was a strong incentive for the authors of these games to optimize their code. Not for speed, but to minimize the number of characters that people who bought the magazine had to type. Warning, 6502 code ahead! This:
&lt;pre&gt;   LDA #0
   TAY
&lt;/pre&gt;was two fewer printed digits than this:
&lt;pre&gt;   LDA #0
   LDY #0
&lt;/pre&gt;Across a 4K or 6K game, those savings &lt;i&gt;mattered&lt;/i&gt;. Two characters here, four characters there, maybe the total line count could be reduced by four lines, six lines, ten lines. This had nothing to do with actual code performance. Even on a sub-2MHz processor those scattered few cycles were noise. But finding your place in the current line, saying &quot;A6,&quot; then typing &quot;A&quot; and &quot;6&quot; took time. Measurable time. Time that was worth optimizing.
&lt;br /&gt;&lt;br /&gt;Most of the discussions I see about optimization are less concrete. It's always &quot;speed&quot; and &quot;memory,&quot; but in the way someone with a big house and a good job says &quot;I need more money.&quot; Optimization only matters if you're optimizing something where you can &lt;em&gt;feel&lt;/em&gt; the difference, and you can't feel even thousands of bytes or nanoseconds. Optimizing for program understandability...I'll buy that, but it's more of an internal thing. There's one concern that really does matter these days, and it's not abstract in the least: power consumption.
&lt;br /&gt;&lt;br /&gt;It's more than just battery life. If a running program means I get an hour less work done before looking for a place to plug in, that's not horrible. The experience is the same, just shorter.  But power consumption equals heat and that's what really matters to me: if the CPU load in my MacBook cranks up then it gets hot, and that causes the fan to spin up like a jet on the runway, which defeats the purpose of having a nice little notebook that I can bring places. I can't edit music tracks with a roaring fan like that, and it's not something I'd want next to me on the plane or one table over at the coffee shop. Of course it doesn't loudly whine like that most of the time, only when doing something that pushes the system hard.
&lt;br /&gt;&lt;br /&gt;What matters in 2010 is optimizing for fan noise.
&lt;br /&gt;&lt;br /&gt;If you're not buying this, take a look at Apple's &lt;a href=&quot;http://support.apple.com/kb/HT3559&quot;&gt;stats&lt;/a&gt; about power consumption and thermal output of iMacs (which, remember, are systems where the CPU and fan are right there on your desk in the same enclosure as the monitor). There's a big difference in power consumption, and corresponding heat generated, between a CPU idling and at max load. That means it's &lt;em&gt;the programs you are running&lt;/em&gt; which are directly responsible for both length of battery charge and how loudly the fan spins.
&lt;br /&gt;&lt;br /&gt;Obvious? Perhaps, but this is something that didn't occur with most popular 8-bit and 16-bit processors, because those chips never idled. They &lt;em&gt;always&lt;/em&gt; ran flat-out all the time, even if just in a busy loop waiting for interrupts to hit. With the iMacs, there's a trend toward the difference between idle and max load increasing as the clock speed of the processor increases. The worst case is the early 2009 24-inch iMac: 387.3 &lt;a href=&quot;http://en.wikipedia.org/wiki/British_thermal_unit&quot;&gt;BTU/h&lt;/a&gt; at idle, 710.3 BTU/h at max load, for a difference of 323 BTU/h. (For comparison, that difference is larger than the entire maximum thermal output of the 20-inch iMac CPU: 298.5 BTU/h.)
&lt;br /&gt;&lt;br /&gt;The utmost in processing speed, which once was the goal, now has a price associated with it. At the same time that manufacturers cite impressive benchmark numbers, there's also the implicit assumption that you don't really want to hit those numbers in the everyday use of a mobile computer. Get all those cores going all the time, including the vector floating point units, and you get rewarded with forty minutes of use on a full battery charge with the fan whooshing the whole time. And if you optimize your code purely for speed, you're getting what you asked for.
&lt;br /&gt;&lt;br /&gt;Realistically, is there anything you can do? Yes, but it means you have to break free from the mindset that all of a computer's power is there for the taking. Doubling the speed of a program by moving from one to four cores is a win if you're looking at the raw benchmark numbers, but an overall loss in terms of computation per watt. Ideas that sounded good in the days of CPU cycles being a free resource, such as anticipating a time-consuming task that the user might request and starting it in the background, are now questionable features. Ditto for persistent &lt;a href=&quot;http://www.bashflash.com/&quot;&gt;unnecessary animations&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;Nanoseconds are abstract. The sound waves generated by poorly designed applications are not.</description>
	<pubDate>Wed, 10 Feb 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: inotify for erlang</title>
	<guid>http://www.redhoterlang.com/web/10eba56758251baab8e1a657747da511</guid>
	<link>http://www.redhoterlang.com/web/plink?id=10eba56758251baab8e1a657747da511</link>
	<description>&amp;lt;p&amp;gt;inotify is a cool linux kernel service, that lets you subscribe to file system events. For example, if you are interested in reacting to changes in the file &quot;~/.emacs&quot;, and since you are not a lamer you abhor polling, you would like to be able to ...</description>
	<pubDate>Sat, 06 Feb 2010 16:44:06 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Dialyzer</title>
	<guid>http://www.redhoterlang.com/web/09275a52574173c08fb500f84dab50be</guid>
	<link>http://www.redhoterlang.com/web/plink?id=09275a52574173c08fb500f84dab50be</link>
	<description>&amp;lt;p&amp;gt;At times you sit there at the typical Erlang conferences and hear Kostis Sagonis speak of dialyzer, typer and all the funky tools. It sounds just so great. The downside is of course that all the tools require an effort on your part. You need to re...</description>
	<pubDate>Fri, 05 Feb 2010 21:59:19 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ProcessOne at FOSDEM and XMPP Summit</title>
	<guid>http://www.process-one.net/en/blogs/article/processone_at_fosdem_and_xmpp_summit/</guid>
	<link>http://www.process-one.net/en/blogs/article/processone_at_fosdem_and_xmpp_summit/</link>
	<description>&lt;p&gt;ProcessOne will be present at FOSDEM and XMPP Summit.&lt;/p&gt; &lt;p&gt;This week-end, we will be joining the XMPP community at Brussels, for the FOSDEM, as well as the XMPP-specific events: &lt;a href=&quot;http://xmpp.org/summit/summit8.shtml&quot;&gt;XMPP hackfest and XMPP Summit&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;http://fosdem.org/2010/&quot;&gt;FOSDEM&lt;/a&gt;, or Free and open source software developers' european meeting, will be held on Saturday, as well as Sunday, at ULB Campus Solbosch, with myriads of FOSS people for different countries and profiles.&lt;/li&gt;
&lt;li&gt;Before and after this event, the XMPP community will gather on Friday for the XMPP hackfest, and Monday for the XMPP Summit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The XMPP hackfest is the place where coders can code and test interop, while the XMPP Summit is more oriented towards specifications improving.&lt;/p&gt;
&lt;p&gt;ProcessOne will be there and demo three of our software products:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OneTeam, our Firefox extension, providing interesting features&lt;/li&gt;
&lt;li&gt;OneTeam for iPhone, enabling the always-on XMPP experience to a pocket near you&lt;/li&gt;
&lt;li&gt;IMGateways, our transports, especially our Twitter gateway, as well as our Google Wave gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feel free to join, as we would like to show you our software, and we would like to have your opinion on these.&lt;/p&gt;</description>
	<pubDate>Thu, 04 Feb 2010 17:19:01 +0000</pubDate>
</item>
<item>
	<title>Learn You Some Erlang: Errors and Exceptions</title>
	<guid>http://learnyousomeerlang.com/errors-and-exceptions</guid>
	<link>http://learnyousomeerlang.com/errors-and-exceptions</link>
	<description>Erlang being a language built for high reliability, it is natural for it to have exceptions. This chapter focuses on how to handle and raise exceptions in the functional subset of Erlang. I go over compile-time errors and warning, run-time errors, the difference between errors, exits and throws, the different constructs to handle these and then finally, an example of how to use throws for non-local returns.</description>
	<pubDate>Tue, 02 Feb 2010 15:30:00 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: RabbitMQ-shovel: Message Relocation Equipment</title>
	<guid>http://www.lshift.net/blog/?p=478</guid>
	<link>http://www.lshift.net/blog/2010/02/01/rabbitmq-shovel-message-relocation-equipment</link>
	<description>&lt;p&gt;In several applications, it&amp;#8217;s very useful to be able to take messages out of one RabbitMQ broker, and insert them into another. Many people on our mailing list have being asking for such a shovel, and we&amp;#8217;ve recently been able to devote some time to writing one. This takes the form of a plugin for Rabbit, and whilst it hasn&amp;#8217;t been through QA just yet, we&amp;#8217;re announcing it so people who would like to play and even suggest further features for inclusion can do so sooner rather than later.&lt;/p&gt;

&lt;p&gt;The shovel is written on top of the Erlang client. It supports both direct and network connections to nodes, SSL support, the ability to declare resources on nodes it connects to, basic round-&lt;del datetime=&quot;2010-02-01T11:10:34+00:00&quot;&gt;robin&lt;/del&gt;rabbit balancing of both source and destination nodes, and allows you to configure many parameters controlling how messages are consumed from the source, and how they&amp;#8217;re published to the destination. Multiple shovels can be specified, their statuses queried, and shovels can repeatedly reconnect to nodes in the event of failure.&lt;/p&gt;

&lt;p&gt;The plugin is available from &lt;a href=&quot;http://hg.rabbitmq.com/rabbitmq-shovel/&quot;&gt;http://hg.rabbitmq.com/rabbitmq-shovel/&lt;/a&gt;, and is released under the MPL v1.1. There is a README included which contains full documentation. This is replicated below.&lt;span id=&quot;more-478&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h1&gt;RabbitMQ-shovel&lt;/h1&gt;

&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;This is a plug-in for RabbitMQ that shovels messages from a queue on
one broker to an exchange on another broker. The two brokers may be
the same. The plug-in allows several shovels to be specified at the
same time. Each shovel may have a number of source and destination
brokers specified, and one of each is chosen whenever the shovel
attempts to make a connection: this permits simple round-rabbit load
balancing.&lt;/p&gt;

&lt;p&gt;Resources can be declared upon connection to both the source and
destination brokers, and parameters can be specified for both the
reception and publishing of messages.&lt;/p&gt;

&lt;h2&gt;Requirements&lt;/h2&gt;

&lt;p&gt;Currently, you must build the server from source, under branch
bug16653. You must also have checked out the rabbitmq-public-umbrella
hg repository, and have the rabbitmq-erlang-client built. From
scratch, the following commands should build RabbitMQ with the shovel
plug-in:&lt;/p&gt;

&lt;pre&gt;
hg clone http://hg.rabbitmq.com/rabbitmq-public-umbrella
cd rabbitmq-public-umbrella
hg clone http://hg.rabbitmq.com/rabbitmq-codegen
hg clone http://hg.rabbitmq.com/rabbitmq-erlang-client
hg clone http://hg.rabbitmq.com/rabbitmq-server
hg clone http://hg.rabbitmq.com/rabbitmq-shovel
cd rabbitmq-server
hg up -C bug16653
make -j
mkdir -p plugins
cd plugins
ln -s ../../rabbitmq-erlang-client
ln -s ../../rabbitmq-shovel
cd ../../rabbitmq-erlang-client
make
cd ../rabbitmq-shovel
make
cd ../rabbitmq-server
./scripts/rabbitmq-activate-plugins
make cleandb run
&lt;/pre&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;p&gt;The RabbitMQ configuration file specifies the shovel
configurations. This exists by default, in
&lt;code&gt;/etc/rabbitmq/rabbitmq.config&lt;/code&gt; under Linux systems,
&lt;code&gt;%RABBITMQ_BASE%\rabbitmq.config&lt;/code&gt; under Windows or somewhere else under
OS X. This file configures both RabbitMQ-server and all the plugins
installed in it. It is an Erlang-syntax file of the form:&lt;/p&gt;

&lt;pre&gt;
[{section1, [section1-config]},
 {section2, [section2-config]},
 &amp;#8230;
 {sectionN, [sectionN-config]}
].
&lt;/pre&gt;

&lt;p&gt;thus a list of tuples, where the left element of each tuple names the
applications being configured. Don&amp;#8217;t forget the last element of the
list doesn&amp;#8217;t have a trailing comma, and don&amp;#8217;t forget the full-stop is
needed after closing the list. Hence if you configure RabbitMQ-server
and the RabbitMQ-shovel, then the configuration file may have a
structure like this:&lt;/p&gt;

&lt;pre&gt;
[{rabbit,        [configuration-for-RabbitMQ-server]},
 {rabbit-shovel, [configuration-for-RabbitMQ-shovel]}
].
&lt;/pre&gt;

&lt;p&gt;A full example of the shovel configuration is:&lt;/p&gt;

&lt;pre&gt;
{rabbit_shovel,
  [{shovels,
    [{my_first_shovel,
      [{sources,      [{brokers,
                          [&quot;amqp://fred:secret@host1.domain/my_vhost&quot;,
                           &quot;amqp://john:secret@host2.domain/my_vhost&quot;
                          ]},
                       {declarations,
                          ['queue.declare',
                           {'queue.bind',
                                  [{exchange, &quot;my_exchange&quot;&gt;&gt;},
                                   {queue,    &lt;pre&gt;&gt;}]}
                          ]}]},
       {destinations, [{broker, &quot;amqp://&quot;},
                       {declarations,
                          [{'exchange.declare',
                                  [{exchange, &quot;my_exchange&quot;&gt;&gt;},
                                   {type, &quot;direct&quot;&gt;&gt;},
                                   durable]}
                          ]}]},
       {queue, &lt;pre&gt;&gt;},
       {qos, 10},
       {auto_ack, false},
       {tx_size, 0},
       {delivery_mode, keep},
       {publish_fields, [{exchange, &quot;my_exchange&quot;&gt;&gt;},
                         {routing_key, &quot;from_shovel&quot;&gt;&gt;}]},
       {reconnect, 5}
      ]}
     ]
   }]
}
&lt;/pre&gt;

&lt;p&gt;Firstly, all shovels are named. Here we have one shovel, called
&amp;#8216;my_first_shovel&amp;#8217;. We can have multiple shovels if you wish. Every
shovel must have all sub-fields specified: sources, destinations, qos,
auto_ack, delivery_mode, publish_fields, reconnect.&lt;/p&gt;

&lt;h2&gt;Sources and Destinations&lt;/h2&gt;

&lt;p&gt;Sources and destinations specify respectively where messages are
fetched from and delivered too. One of &amp;#8216;broker&amp;#8217; and &amp;#8216;brokers&amp;#8217; must be
specified, and &amp;#8216;broker&amp;#8217; is simply shorthand for when only one broker
needs specifying. Using &amp;#8216;brokers&amp;#8217; allows a list of brokers to be
specified: whenever the connection to a broker is lost, another one is
chosen at random from the list and a connection attempt is made to
that. The syntax for broker URIs is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;amqp://username:password@host:port/vhost&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If username or password are omitted, the default values of guest and
guest are used. If the vhost is omitted, the default value of / is
used. If the host is omitted, then the plugin uses the &amp;#8220;direct&amp;#8221;
connection internally rather than a network connection: this means it
connects to the RabbitMQ-server node on which it is running without
going through the network stack. This is much more efficient. If port
is omitted then the default value is used (5672 or 5671 if SSL is
used).&lt;/p&gt;

&lt;p&gt;SSL is implemented, for which additional parameters are needed:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;amqps://username:password@host:port/vhost?cacertfile=/path/to/cacert.pem&amp;amp;certfile=/path/to/certfile.pem&amp;amp;keyfile=/path/to/keyfile.pem&amp;amp;verify=verifyOption&amp;amp;fail_if_no_peer_cert=failOption&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;(note, this is a single line)&lt;/p&gt;

&lt;p&gt;All five parameters (3 paths: cacertfile, certfile and keyfile; 2
options: verify, fail_if_no_peer_cert) must be specified. See the SSL
guide at http://www.rabbitmq.com/ssl.html#configure-erlang for details
of SSL in RabbitMQ in general and specifically for the Erlang client
(on which the shovel is built).&lt;/p&gt;

&lt;p&gt;Note that SSL cannot be used with the direct connection (i.e. a host
must be specified when using SSL), and that it is preferable to use
the non-SSL direct connection when connecting to the same node that&amp;#8217;s
running the shovel.&lt;/p&gt;

&lt;h2&gt;Resource Declarations&lt;/h2&gt;

&lt;p&gt;Both sources and destinations can have an optional &amp;#8216;declarations&amp;#8217;
clause. The value of this is a list, consisting of AMQP Methods. If
default values are sufficient, then the method name alone can be
specified - e.g. &amp;#8216;queue.declare&amp;#8217;. If parameters need to be set then
the method should be given as a tuple, with the right hand side a
proplist specifying which fields need altering from their default
values. E.g:&lt;/p&gt;

&lt;pre&gt;
    {'exchange.declare',[{exchange, &quot;my_exchange&quot;&gt;&gt;},
                         {type, &quot;direct&quot;&gt;&gt;},
                         durable]},
&lt;/pre&gt;

&lt;p&gt;One very useful feature here is the Most-Recently-Declared-Queue
feature, in which RabbitMQ remembers the name of the most recently
declared queue. This means that you can declare a private queue, and
then bind it to exchanges without ever needing to know its name.&lt;/p&gt;

&lt;h2&gt;queue :: binary&lt;/h2&gt;

&lt;p&gt;This parameter specifies the name of the queue on the source brokers
to consume from. This queue must exist. Use the resource declarations
to create the queue (or ensure it exists) first. Note again that the
Most-Recently-Declared-Queue feature can be used here, thus an
anonymous queue can be used: use &amp;lt;&amp;lt;&gt;&gt; to indicate the
Most-Recently-Declared-Queue.&lt;/p&gt;

&lt;h2&gt;qos :: non-negative-integer&lt;/h2&gt;

&lt;p&gt;The shovel consumes from a queue. The QoS controls how many messages
are sent to the shovel in advance of the message the shovel is
currently processing.&lt;/p&gt;

&lt;h2&gt;auto_ack :: boolean&lt;/h2&gt;

&lt;p&gt;Setting this to &amp;#8216;true&amp;#8217; turns on the no_ack flag when subscribing to
the source queue.&lt;/p&gt;

&lt;h2&gt;tx_size :: non-negative-integer&lt;/h2&gt;

&lt;p&gt;When set to 0, transactions are not used. Other values make publishes
transactional, with a commit every N messages. In lieu of the auto-ack
option, when transactions are not used, messages are acknowledged to
the source immediately after every publish. When transactions are
used, acks are only issued to the source on receipt of the commit-ok
message from the destination. This can thus be used to guarantee that
messages are only acknowledged (and thus forgotten about by the source
broker) when they are guaranteed to have been received by the
destination broker.&lt;/p&gt;

&lt;h2&gt;delivery_mode :: &amp;#8216;keep&amp;#8217; | 0 | 2&lt;/h2&gt;

&lt;p&gt;This affects the delivery_mode field when publishing to the
destination. A value of &amp;#8216;keep&amp;#8217; means that the same delivery_mode
should be used as when the message was originally published to the
source broker. 0 and 2 override the original setting.&lt;/p&gt;

&lt;h2&gt;publish_fields&lt;/h2&gt;

&lt;p&gt;This is a list of tuples which override fields in the publish method
when publishing to the destination. This can be used to direct
messages to a particular exchange on the destination, for example, or
change the routing key. By default, the routing key of the message as
it is received by the shovel is passed through, but this can be
overridden as necessary.&lt;/p&gt;

&lt;h2&gt;reconnect :: non-negative-integer&lt;/h2&gt;

&lt;p&gt;When an error occurs, the shovel will disconnect from both the source
and destination broker immediately. This will force uncommitted
transactions at the destination to be rolled back, and delivered but
unacknowledged messages from the source to be requeued. The shovel
will then try connecting again. If this is unsuccessful, then it&amp;#8217;s not
a good idea for the shovel to very quickly and repeatedly try to
reconnect. The value specified here is the number of seconds to wait
between each connection attempt.&lt;/p&gt;

&lt;p&gt;Note that if set to 0, the shovel will never try to reconnect: it&amp;#8217;ll
stop after the first error.&lt;/p&gt;

&lt;h2&gt;Obtaining shovel statuses&lt;/h2&gt;

&lt;p&gt;From the broker Erlang prompt, call
&lt;code&gt;rabbit_shovel_status:status().&lt;/code&gt; This will return a list, with one row
for each configured shovel. Each row has three fields: the shovel
name, the shovel status, and the timestamp (a local calendar time of
&lt;code&gt;{{YYYY,MM,DD},{HH,MM,SS}}&lt;/code&gt;). There are 3 possible statuses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&amp;#8217;starting&amp;#8217;: The shovel is starting up, connecting and creating
resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;#8216;running&amp;#8217;: The shovel is up and running, shovelling messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;{&amp;#8217;terminated&amp;#8217;, Reason}: Something&amp;#8217;s gone wrong. The Reason should give
a further indication of where the fault lies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/pre&gt;&lt;/pre&gt;</description>
	<pubDate>Mon, 01 Feb 2010 12:13:52 +0000</pubDate>
</item>
<item>
	<title>Simon Willison's Weblog: Hot Code Loading in Node.js</title>
	<guid>http://simonwillison.net/2010/Jan/31/liminal/</guid>
	<link>http://simonwillison.net/2010/Jan/31/liminal/</link>
	<description>&lt;div class=&quot;blogmark segment&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://romeda.org/blog/2010/01/hot-code-loading-in-nodejs.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A LiminalExistence %28Liminal Existence%29&quot;&gt;Hot Code Loading in Node.js&lt;/a&gt;. Blaine Cook’s patch for Node.js that enables Erlang-style hot code loading, so you can switch out your application logic without restarting the server or affecting existing requests. This could make deploying new versions of Node applications trivial. I’d love to see a Node hosting service that allows you to simply upload a script file and have it execute on the Web.&lt;/p&gt;
&lt;/div&gt;</description>
	<pubDate>Sun, 31 Jan 2010 13:57:53 +0000</pubDate>
</item>
<item>
	<title>Trapexit's Erlang Blog Filter: Erlang Factory SF Bay Area 2010</title>
	<guid>http://steve.vinoski.net/blog/?p=534</guid>
	<link>http://steve.vinoski.net/blog/2010/01/30/erlang-factory-sf-bay-area-2010/</link>
	<description>&lt;p&gt;Interested in Erlang? You might consider attending &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010&quot;&gt;Erlang Factory SF Bay Area 2010&lt;/a&gt;. Below is a &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:49168:201001:fcgfnebjjkebpbdcnmpd&quot;&gt;message&lt;/a&gt; that &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/francescocesarini&quot;&gt;Francesco Cesarini&lt;/a&gt;, conference organizer and co-author of the most excellent book &lt;em&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://oreilly.com/catalog/9780596518189&quot;&gt;Erlang Programming&lt;/a&gt;&lt;/em&gt;, sent to the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://groups.google.com/group/erlang-programming&quot;&gt;erlang-questions list&lt;/a&gt; yesterday providing more information about the conference, especially pointing out that the Very Early Bird registration deadline is &lt;em&gt;&lt;strong&gt;tomorrow (Sunday January 31)&lt;/strong&gt;&lt;/em&gt;. Hope to see you there!&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Hi All,&lt;/p&gt;
&lt;p&gt;a note to say that we are almost done with the programme for the 2010 SF Bay Area Erlang Factory. This year, we are lucky to have keynote speakers such as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/joearmstrong&quot;&gt;Joe Armstrong&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/BjarneDacker&quot;&gt;Bjarne Dacker&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/kennethlundin&quot;&gt;Kenneth Lundin&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/SteveVinoski&quot;&gt;Steve Vinoski&lt;/a&gt;. They will be giving four of the 35 scheduled talks on the 25th and 26th of March in the San Francisco Bay Area. The almost complete programme is available here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://erlang-factory.com/conference/SFBay2010/programme&quot;&gt;http://erlang-factory.com/conference/SFBay2010/programme&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The conference will be preceded by three days of University courses taught by experts such as &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/SimonThompson&quot;&gt;Simon Thompson&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/JohnHughes&quot;&gt;John Hughes&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/thomasarts&quot;&gt;Thomas Arts&lt;/a&gt;, &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/janhenrynystrom&quot;&gt;Henry Nystrom&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-factory.com/conference/SFBay2010/speakers/KevinSmith&quot;&gt;Kevin Smith&lt;/a&gt;. Come and learn Erlang, OTP, QuickCheck or Web Development with Erlang. More information on the courses are here:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://erlang-factory.com/conference/SFBay2010/university&quot;&gt;http://erlang-factory.com/conference/SFBay2010/university&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This *Sunday* (January 31st) is the deadline for the very early bird deadline. Register by Sunday night and save $400 on the on-site registration price.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The conference hotel and venue is the &lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www1.hilton.com/en_US/hi/hotel/SFOAPHF-Hilton-San-Francisco-Airport-California/index.do&quot;&gt;SF Airport Hilton&lt;/a&gt;, a short BART / Caltrain ride from SF and the Valley. We have secured a very competitive price of US$109 per room and night at the conference hotel, this being one of the reasons for us choosing it. The other is the lower price of the venue, allowing us to pass on the savings to the delegates through a higher very early bird discount. We are planning an ErlLounge open to everyone who can&amp;#8217;t make the two days on the 25th, and hope we will be able to surpass last year&amp;#8217;s success. If you have thoughts or questions, you are welcome to drop me a line.&lt;/p&gt;
&lt;p&gt;Hope to see you all there!&lt;/p&gt;
&lt;p&gt;Francesco&lt;br /&gt;
&amp;#8211;&lt;br /&gt;
&lt;a rel=&quot;nofollow&quot; target=&quot;_blank&quot; href=&quot;http://www.erlang-solutions.com/&quot;&gt;http://www.erlang-solutions.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;</description>
	<pubDate>Sat, 30 Jan 2010 21:29:40 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Erlang Factory SF Bay 2010 – Francesco Cesarini on the Conference and Old-School vs New-School Erlangers</title>
	<guid>http://erlanginside.com/?p=138</guid>
	<link>http://erlanginside.com/erlang-factory-2010-san-francisco-francesco-cesarini-138</link>
	<description>The Erlang Factory&amp;#8217;s 2010 conference is March 25th and 26th in San Francisco, with the university three days before, starting the 22nd.  The conference is at the Hilton San Francisco Airport, with three tracks, each on a different theme. The number of tracks gives attendees an unusually broad set of choices for talks. When attending [...]</description>
	<pubDate>Sat, 30 Jan 2010 18:19:20 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: What to do About Erlang's Records?</title>
	<guid>http://prog21.dadgum.com/60.html</guid>
	<link>http://prog21.dadgum.com/60.html</link>
	<description>The second most common complaint about Erlang, right after confusion about commas and semicolons as separators, is about records. Gotta give those complainers some credit, because they've got taste. Statically defined records are out of place in a highly dynamic language. There have been various proposals over the years, including Richard O'Keefe's abstract syntax patterns and Joe Armstrong's structs. Getting one of those implemented needs the solid support of the Erlang system maintainers, and it's understandably difficult to commit to such a sweeping change to the language. So what are the alternatives to records that can be used right now?
&lt;br /&gt;&lt;br /&gt;To clarify, I'm really talking about smallish, purely functional &lt;a href=&quot;http://prog21.dadgum.com/53.html&quot;&gt;dictionaries&lt;/a&gt;. For large amounts of data there's already the &lt;tt&gt;gb_trees&lt;/tt&gt; module, plus several others with similar purposes.
&lt;br /&gt;&lt;br /&gt;In Python, a technique I often use is to return a small dictionary with a couple of named values in it. I could use a tuple, but a dictionary removes the need to worry about order. This is straightforward in Erlang, too:
&lt;pre&gt;fun(length) -&amp;gt; 46;
   (width)  -&amp;gt; 17;
   (color)  -&amp;gt; sea_green
end.
&lt;/pre&gt;Getting the value corresponding to a key is easy enough:
&lt;pre&gt;Result(color)
&lt;/pre&gt;This is handy, but only in certain situations. One shortcoming is that there's no way to iterate through the keys. Well, there's this idea:
&lt;pre&gt;fun(keys)   -&amp;gt; [length, width, color];
   (length) -&amp;gt; 46;
   (width)  -&amp;gt; 17;
   (color)  -&amp;gt; sea_green
end.
&lt;/pre&gt;Now there's a way to get a list of keys, but there's room for error: each key appears twice in the code. The second issue is there's no simple way to take one dictionary and create a new one with a value added or removed. This road is becoming messy to go down, so here's more data-driven representation:
&lt;pre&gt;[{length, 46}, {width, 17}, {color, sea_green}]
&lt;/pre&gt;That's just a list of key/value pairs, which is searchable via the fast, written-in-C function &lt;tt&gt;lists:keyfind&lt;/tt&gt;. New values can be appended to the head of the list, and there are other functions in the &lt;tt&gt;lists&lt;/tt&gt; module for deleting and replacing values. Iteration is also easy: it's just a list.
&lt;br /&gt;&lt;br /&gt;We still haven't bettered records in all ways. A big win for records, and this is something few purely functional data structures handle well, is the ability to create a new version where &lt;em&gt;multiple&lt;/em&gt; keys get different values. For example, start with the above list and create this:
&lt;pre&gt;[{length, 200}, {width, 1400}, {color, sea_green}]
&lt;/pre&gt;If we knew that only those three keys were allowed, fine, but that's cheating. The whole point of dictionaries is that we can put all sorts of stuff in there, and it doesn't change how the dictionary is manipulated. The general solution is to delete all the keys that should have new values, then insert the new key/value pairs at the head of the list. Or step through the list and see if the current key is one that has a new value and replace it. These are not linear algorithms, unfortunately. And you've got the same problem if you want to change multiple values in a &lt;tt&gt;gb_tree&lt;/tt&gt; at the same time.
&lt;br /&gt;&lt;br /&gt;What I've been using, and I admit that this isn't perfect, is the key/value list approach, but forcing the lists to be sorted.This allows the original list and a list of changes to be merged together in linear time. The downside is that I have to remember to keep a literal list in sorted order (or write a parse transform to do this for me).
&lt;br /&gt;&lt;br /&gt;There's &lt;em&gt;still&lt;/em&gt; one more feature of records that can't be emulated: extracting / comparing values using Erlang's standard pattern matching capabilities. It's not a terrible omission, but there's no way to dodge this one: it needs compiler and runtime system support.</description>
	<pubDate>Sat, 30 Jan 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Programming in the 21st Century: Nothing Like a Little Bit of Magic</title>
	<guid>http://prog21.dadgum.com/59.html</guid>
	<link>http://prog21.dadgum.com/59.html</link>
	<description>Like so many other people, I was enthralled by the &lt;a href=&quot;http://www.youtube.com/watch?v=UcWoytJPJbo&quot;&gt;iPad introduction&lt;/a&gt;. I haven't held or even seen an iPad in person yet, but that video hit me on a number of levels. It's a combination of brand new hardware--almost dramatically so--and uses for it that are coming from a completely different line of thinking. I realized it's been a long time since I felt that way about the introduction of a new computer.
&lt;br /&gt;&lt;br /&gt;I remember the first time I tried a black and white 128K Mac in a retail store. A mouse! Really tiny pixels! Pull-down menus! Graphics and text mixed together! And the only demo program was what made the whole experience click: &lt;a href=&quot;http://en.wikipedia.org/wiki/MacPaint&quot;&gt;MacPaint&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;I remember when the Atari 520ST was announced. Half a megabyte of memory! Staggering amounts of power for less than $1000! A Mac-like interface but in full color! Some of the demos were simple slideshows of 16-color 320x200 images, done with a program called &lt;a href=&quot;http://en.wikipedia.org/wiki/NeoChrome&quot;&gt;NeoChrome&lt;/a&gt;, but I had never seen anything like them before.
&lt;br /&gt;&lt;br /&gt;I remember when the Amiga debuted that same year. Real multitasking! Digitized sound! Stereo! Hardware for moving around big bitmaps instead of just tiny sprites! Images showing thousands of colors at once! Just the &lt;a href=&quot;http://www.youtube.com/watch?v=-ga41edXw3A&quot;&gt;bouncing ball&lt;/a&gt; demo was outside what I expected to ever see on a computer. And there was a flight-sim with filled polygon graphics. Behind the scenes it was the fancy hardware enabling it all, but it was the optimism and feeling of new possibilities that fueled the excitement.
&lt;br /&gt;&lt;br /&gt;I remember when the Macintosh II came out, with 24-bit color and impossibly high display resolutions for the time. It seemed like a supercomputer on a desk, the kind of thing that only high-end graphics researchers would have previously had access to.
&lt;br /&gt;&lt;br /&gt;PCs never hit me so unexpectedly and all at once, but there were a few years when 3D hardware started appearing where it felt like the old rules had been thrown out and imagining the future was more important than looking back on the same set of ideas.
&lt;br /&gt;&lt;br /&gt;Am I going to buy an iPad? I don't know yet. I never bought most of the systems listed above. But I am glad I've been experiencing that old optimism caused by a mix of hardware and software that suddenly invalidates many of the old, comfortable rules and opens up territory that hasn't been endlessly trod upon.</description>
	<pubDate>Fri, 29 Jan 2010 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Google Wave XMPP notification gateway</title>
	<guid>http://www.process-one.net/en/blogs/article/google_wave_xmpp_notification_gateway/</guid>
	<link>http://www.process-one.net/en/blogs/article/google_wave_xmpp_notification_gateway/</link>
	<description>&lt;p&gt;At ProcessOne, we have developed an experimental notification Google Wave XMPP gateway.&lt;/p&gt; &lt;p&gt;I wrote it because, in the current state of Wave usage, my contacts always had to write me an XMPP message or send me an email to explain that I have content available.&lt;/p&gt;
&lt;p&gt;I felt this was for me a large deterrent for using it and quite paradoxical in a real-time web world.&lt;/p&gt;
&lt;p&gt;To solve this problem and benefit from the largely used XMPP protocol for notification, I wrote a Google Wave gateway. For now, it is quite raw because it relies on GWT client protocol and lacks any mechanism from Google to do delegated authentication. However, we are going to implement a more standard client protocol and delegated authentication as Google makes those features available.&lt;/p&gt;
&lt;p&gt;Anyway, here is a small demo of how to use it to give you an idea of the user experience.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;






&lt;/p&gt;
&lt;p&gt;It is deployed on &lt;a href=&quot;https://www.talkr.im/&quot;&gt;talkr.IM&lt;/a&gt; server, so you can give it a try.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description>
	<pubDate>Thu, 28 Jan 2010 10:00:35 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Talkr.IM service update: Google Wave gateway</title>
	<guid>http://www.process-one.net/en/blogs/article/talkr.im_service_update_google_wave_gateway/</guid>
	<link>http://www.process-one.net/en/blogs/article/talkr.im_service_update_google_wave_gateway/</link>
	<description>&lt;p&gt;The Talkr.IM XMPP/Jabber service will undergo today a service update,  adding a gateway to Google Wave.&lt;/p&gt; &lt;p&gt;ProcessOne's public XMPP service Talkr.IM will receive a new feature for all  users: a Google Wave gateway. This gateways will enable Talkr.IM XMPP users to be notified of modified Waves.&lt;/p&gt;
&lt;p&gt;Our Google Wave gateway will notify the subscribed users of all the changes in a Wave, by providing an direct link to a maximized Wave window. The other windows (Navigation, Contacts, Search) will be minimized.&lt;/p&gt;
&lt;p&gt;We are planning a service interruption at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10:00 UTC&lt;/li&gt;
&lt;li&gt;11:00 Paris&lt;/li&gt;
&lt;li&gt;13:00 Moscow&lt;/li&gt;
&lt;li&gt;02:00 Los Angeles&lt;/li&gt;
&lt;li&gt;05:00 New York&lt;/li&gt;
&lt;li&gt;19:00 Tokyo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will remind our online users a few minutes before.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;em&gt;The GWave transport is online, feel free to test and play with it! Warning, this is an alpha software, you my meet bugs.&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 27 Jan 2010 10:30:37 +0000</pubDate>
</item>
<item>
	<title>Caoyuan's Blog: Progress of Migrating AIOTrade to Scala #2</title>
	<guid>http://blogtrader.net/blog/ProgressMigratingAIOTradeScala2</guid>
	<link>http://blogtrader.net/blog/ProgressMigratingAIOTradeScala2</link>
	<description>&lt;p&gt;
My next step is to push AIOTrade to another level of UE, with hotkey for symbols, indicators etc, with better UI.
&lt;/p&gt;
&lt;p&gt;
So far, my Scala adventure went almost smoothly, I'm thinking about the data exchange between client and data source, maybe the actors from &lt;a class=&quot;ext-link&quot; href=&quot;http://www.scala-lang.org/node/242&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;Scala&lt;/a&gt;, &lt;a class=&quot;ext-link&quot; href=&quot;http://liftweb.net&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;LiftWeb&lt;/a&gt; or &lt;a class=&quot;ext-link&quot; href=&quot;http://akkasource.org/&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;AKKA&lt;/a&gt; will bring some fresh atmosphere.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100125a.png&quot;&gt;&lt;img width=&quot;800px&quot; alt=&quot;AIOTrade-100125a.png&quot; title=&quot;AIOTrade-100125a.png&quot; src=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100125a.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100125b.png&quot;&gt;&lt;img width=&quot;800px&quot; alt=&quot;AIOTrade-100125b.png&quot; title=&quot;AIOTrade-100125b.png&quot; src=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100125b.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</description>
	<pubDate>Mon, 25 Jan 2010 10:17:34 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: Plugin exchange types for RabbitMQ</title>
	<guid>http://www.lshift.net/blog/?p=473</guid>
	<link>http://www.lshift.net/blog/2010/01/22/plugin-exchange-types-for-rabbitmq</link>
	<description>&lt;p&gt;An obvious extension point for an AMQP broker is the addition of new types of exchange.  An exchange type essentially represents an algorithm for dispatching messages to queues, usually based on the message&amp;#8217;s routing key, given how the queues are bound to the exchange &amp;#8212; it&amp;#8217;s a message routing algorithm.&lt;/p&gt;

&lt;p&gt;At a minimum, supporting new exchange types requires only some scaffolding to plug in to (an exchange type registry) and a hook for routing messages.  However, this wouldn&amp;#8217;t support some more interesting use cases, and in particular it didn&amp;#8217;t support our &lt;a href=&quot;http://oceanobservatories.org/spaces/download/attachments/19432960/ooi-amqp-api-20091228.pdf?version=1&quot;&gt;motivating use case&lt;/a&gt;.  Exchange types that want to keep their own state need to be initialised, and be notified about other lifecycle events.
&lt;span id=&quot;more-473&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The &lt;del datetime=&quot;2010-03-04T16:21:12+00:00&quot;&gt;branch bug22169&lt;/del&gt; default branch of RabbitMQ supports plugin exchange types, by providing a behaviour for exchange type modules to implement, and an exchange type registry to map a module to a type (i.e., what the client supplies in the type field of exchange.declare).&lt;/p&gt;

&lt;p&gt;The behaviour requires exported hooks for validating exchange declarations, creating exchanges, recovering durable exchanges, publishing to an exchange (this is where the routing comes in), maintaining bindings, and deleting an exchange.  RabbitMQ continues to maintain the database of exchanges and bindings, and calls the hooks after it&amp;#8217;s done its own bookkeeping.&lt;/p&gt;

&lt;p&gt;For simplicity, the hooks are not called atomically with the bookkeeping; so, it is possible for instance to publish to a new exchange for which the hook has not completed.  However, provided there are no asynchronous operations in the hook implementation, the hook will have completed by the time the OK message is sent to the client.  This is no more racey than AMQP itself, with consistency at the channel level where operations follow a single thread of control.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an example that simply &lt;code&gt;io:format&lt;/code&gt;s things as they happen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-module(rabbit_exchange_type_debug).
-include(&quot;rabbit.hrl&quot;).

-behaviour(rabbit_exchange_type).

-export([description/0, publish/2]).
-export([validate/1, create/1, recover/2, delete/2, add_binding/2, remove_bindings/2]).
-export([register_debug_types/0]).
-include(&amp;#8221;rabbit_exchange_type_spec.hrl&amp;#8221;).

-rabbit_boot_step({debug_exchange_types, 
                   [{description, &quot;debugging exchange types&quot;},
                    {mfa, {?MODULE, register_debug_types, []}},
                    {requires, rabbit_exchange_type_registry},
                    {enables, exchange_recovery}]}).

description() -&amp;gt;
    [{name, &amp;lt;&amp;lt;&quot;debug&quot;&amp;gt;&amp;gt;},
     {description, &amp;lt;&amp;lt;&quot;Debugging exchange&quot;&amp;gt;&amp;gt;}].

backing_module(#exchange{ type = Type }) -&amp;gt;
    %% Presume that Type is EITHER one of the standard types &amp;#8211;
    %% i.e,. that we have been registered this module as direct,
    %% topic, fanout or match &amp;#8212; or, for testing purposes, it&amp;#8217;s
    %% registered (as in the boot steps above) as debug_direct, etc.
    Type1 = case atom_to_list(Type) of
                &amp;#8220;x-debug-&amp;#8221; ++ T -&amp;gt; T; 
                              T -&amp;gt; T
            end,
    list_to_existing_atom(&amp;#8221;rabbit_exchange_type_&amp;#8221; ++ Type1).

publish(Exchange, Delivery) -&amp;gt;
    io:format(&amp;#8221;Publish ~p to ~p~n&amp;#8221;, [Delivery, Exchange]),
    Module = backing_module(Exchange),
    Module:publish(Exchange, Delivery).

validate(X) -&amp;gt;
    io:format(&amp;#8221;Validate ~p~n&amp;#8221;, [X]),
    (backing_module(X)):validate(X).

create(X) -&amp;gt;
    io:format(&amp;#8221;Create ~p~n&amp;#8221;, [X]),
    (backing_module(X)):create(X).

recover(X, Bs) -&amp;gt;
    io:format(&amp;#8221;Recover ~p with bindings ~p~n&amp;#8221;, [X, Bs]),
    (backing_module(X)):recover(X, Bs).

delete(X, Bs) -&amp;gt;
    io:format(&amp;#8221;Delete ~p with bindings ~p~n&amp;#8221;, [X, Bs]),
    (backing_module(X)):delete(X, Bs).

add_binding(X, B) -&amp;gt;
    io:format(&amp;#8221;Add binding ~p to ~p~n&amp;#8221;, [B, X]),
    (backing_module(X)):add_binding(X, B).

remove_bindings(X, Bs) -&amp;gt;
    io:format(&amp;#8221;Delete bindings ~p from ~p~n&amp;#8221;, [Bs, X]),
    (backing_module(X)):remove_bindings(X, B).

register_debug_types() -&amp;gt;
    lists:foreach(
      fun (T) -&amp;gt;
              rabbit_exchange_type_registry:register(T, ?MODULE)
      end,
      [&amp;lt;&amp;lt;&quot;x-debug-direct&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-topic&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-fanout&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-headers&quot;&amp;gt;&amp;gt;]).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bit by important bit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-behaviour(rabbit_exchange_type).
-export([description/0, publish/2]).
-export([validate/1, create/1, recover/2, delete/2, add_binding/2, remove_bindings/2]).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;rabbit_exchange_type&lt;/code&gt; specifies these exported callbacks.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-include(&quot;rabbit_exchange_type_spec.hrl&quot;).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This include has the specs for each of the exported functions, if you&amp;#8217;re using specs.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-rabbit_boot_step({debug_exchange_types, 
                   [{description, &quot;debugging exchange types&quot;},
                    {mfa, {?MODULE, register_debug_types, []}},
                    {requires, rabbit_exchange_type_registry},
                    {enables, exchange_recovery}]}).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This uses the new boot sequence mechanism to register the exchange type during boot.  The &amp;#8220;enables&amp;#8221; and &amp;#8220;requires&amp;#8221; say that the function given as mfa above must be run after the exchange type registry is available, but before any exchanges are recovered.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;publish(Exchange, Delivery) -&amp;gt;
    io:format(&quot;Publish ~p to ~p~n&quot;, [Delivery, Exchange]),
    Module = backing_module(Exchange),
    Module:publish(Exchange, Delivery).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This exchange type simply delegates to a &amp;#8220;backing&amp;#8221; exchange type.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;register_debug_types() -&amp;gt;
    lists:foreach(
      fun (T) -&amp;gt;
              rabbit_exchange_type:register(T, ?MODULE)
      end,
      [&amp;lt;&amp;lt;&quot;x-debug-direct&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-topic&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-fanout&quot;&amp;gt;&amp;gt;,
       &amp;lt;&amp;lt;&quot;x-debug-headers&quot;&amp;gt;&amp;gt;]).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;rabbit_exchange_type_registry&lt;/code&gt; maintains a registry of type to module; because of this indirection, we can register this module as many different types, then check the declared type of the exchange in our hook to see which type we&amp;#8217;re expected to be.  Note that the AMQP specification requires the &amp;#8220;x-&amp;#8221; prefix for non-standard exchange types.&lt;/p&gt;

&lt;p&gt;&lt;del datetime=&quot;2010-03-04T16:21:12+00:00&quot;&gt;This should reach default branch soon after RabbitMQ 1.7.1 is
released.&lt;/del&gt; This is in RabbitMQ&amp;#8217;s default branch, and should be in the next release (1.7.2).&lt;/p&gt;

&lt;p&gt;You can drop modules straight into &lt;code&gt;src&lt;/code&gt;, but they are better packaged
as plugins &amp;#8212; follow the drill at &lt;a href=&quot;http://www.rabbitmq.com/plugin-development.html](http://www.rabbitmq.com/plugin-development.html&quot;&gt;the plugin development
guide&lt;/a&gt;
(and note that your plugin may only need to be a library application).&lt;/p&gt;

&lt;p&gt;[EDITS: Updated sample code to keep up with name changes, and correct use of list_to_atom to list_to_existing_atom]
[Further EDITS: slight API change, now in default branch]&lt;/p&gt;</description>
	<pubDate>Fri, 22 Jan 2010 14:38:54 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Talkr.IM service update: gateways</title>
	<guid>http://www.process-one.net/en/blogs/article/talkr.im_service_update_gateways/</guid>
	<link>http://www.process-one.net/en/blogs/article/talkr.im_service_update_gateways/</link>
	<description>&lt;p&gt;The Talkr.IM XMPP/Jabber service will undergo today a service update, adding gateways to legacy IM systems.&lt;/p&gt; &lt;p&gt;ProcessOne's XMPP service Talkr.IM will receive new features for all users: IM gateways. These gateways will enable XMPP users to join legacy IM systems with their existing accounts. This will seamlessly merge the legacy IM contact lists to the main XMPP contact list (&quot;roster&quot;). Of course the main features are presence and chat, but these gateways also enable the status exchange, as well as the avatar, and much more.&lt;/p&gt;
&lt;p&gt;We had already deployed an IRC gateway, the new gateways (or &quot;transport&quot; in XMPP terms) are the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIM&lt;/li&gt;
&lt;li&gt;ICQ&lt;/li&gt;
&lt;li&gt;MSN/WLM&lt;/li&gt;
&lt;li&gt;Yahoo!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This adds IM contact points to your addressbook, and enable the inclusion of millions of legacy IM users to XMPP users.&lt;/p&gt;
&lt;p&gt;We are planning a service interruption at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;13:00 UTC&lt;/li&gt;
&lt;li&gt;14:00 Paris&lt;/li&gt;
&lt;li&gt;16:00 Moscow&lt;/li&gt;
&lt;li&gt;05:00 Los Angeles&lt;/li&gt;
&lt;li&gt;08:00 New York&lt;/li&gt;
&lt;li&gt;22:00 Tokyo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will remind our online users a few minutes before.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update: &lt;/strong&gt;&lt;em&gt;our service update is done, you can now register your legacy IM accounts and play with them.&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 22 Jan 2010 10:10:42 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: [ANN] ejabberd 2.1.2 bugfix release</title>
	<guid>http://www.process-one.net/en/blogs/article/ann_ejabberd_2.1.2_bugfix_release/</guid>
	<link>http://www.process-one.net/en/blogs/article/ann_ejabberd_2.1.2_bugfix_release/</link>
	<description>&lt;p&gt;We are pleased to announce ejabberd 2.1.2, which contains several bugfixes over last month's maintenance release.&lt;br /&gt;&lt;br /&gt;Brief summary of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix SASL PLAIN authentication message for RFC4616 compliance&lt;/li&gt;
&lt;li&gt;Fix support for old Erlang/OTP R10 and R11&lt;/li&gt;
&lt;li&gt;If server start fails due to config file problem, display some lines and stop node&lt;/li&gt;
&lt;li&gt;PubSub and PEP: several improvements and bugfixes&lt;/li&gt;
&lt;li&gt;WebAdmin: fix offline message displaying&lt;/li&gt;
&lt;li&gt;When server stops with new stop_kindly command: inform users, clients, MUC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Check the Release Notes for a more complete list of changes:&lt;br /&gt; &lt;a href=&quot;http://www.process-one.net/en?URL=http%3A%2F%2Fwww.process-one.net%2Fen%2Fejabberd%2Frelease_notes%2Frelease_note_ejabberd_2.1.2&quot;&gt;http://www.process-one.net/en/ejabberd/release_notes/release_note_ejabberd_2.1.2&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; If you upgrade from ejabberd 2.0.5 or older, read carefully the release notes of ejabberd 2.1.0 too, because there were several changes in the installation path and the configuration options.&lt;br /&gt; &lt;br /&gt; The list of solved tickets since previous version is available on ProcessOne bug tracker:&lt;br /&gt; &lt;a href=&quot;http://www.process-one.net/en?URL=http%3A%2F%2Fredir.process-one.net%2Fejabberd-2.1.2&quot;&gt;http://redir.process-one.net/ejabberd-2.1.2&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; ejabberd 2.1.2 is available as source code package and binary installers for Linux 32 bits, 64 bits, Mac OS X Intel, and Windows:&lt;br /&gt; &lt;a href=&quot;http://www.process-one.net/en?URL=http%3A%2F%2Fwww.process-one.net%2Fen%2Fejabberd%2Fdownloads&quot;&gt;http://www.process-one.net/en/ejabberd/downloads&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 18 Jan 2010 16:03:16 +0000</pubDate>
</item>
<item>
	<title>Caoyuan's Blog: Progress of Migrating AIOTrade to Scala</title>
	<guid>http://blogtrader.net/blog/ProgressMigratingAIOTradeScala</guid>
	<link>http://blogtrader.net/blog/ProgressMigratingAIOTradeScala</link>
	<description>&lt;p&gt;
Well, I've done most parts of migrating AIOTrade to Scala, not all features return yet. I gain lots of experiences of inter-op between Scala and Java, since AIOTrade has to be integrated into an existed Java framework &lt;a class=&quot;ext-link&quot; href=&quot;http://platform.netbeans.org&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;NetBeans Platform&lt;/a&gt;. And also, whole project is now managed by Maven instead of Ant, which reduces lots of pain of dependencies upon crossing sub-projects.
&lt;/p&gt;
&lt;p&gt;
This project is now hosted on &lt;del&gt;&lt;a class=&quot;ext-link&quot; href=&quot;http://kenai.com/projects/aiotrade&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;kenai.com&lt;/a&gt;&lt;/del&gt; &lt;a class=&quot;ext-link&quot; href=&quot;http://sf.net/projects/humaitrader&quot;&gt;&lt;span class=&quot;icon&quot;&gt; &lt;/span&gt;http://sf.net/projects/humaitrader&lt;/a&gt;, you can check out the code to get an overview of how to integrated &lt;strong&gt;Maven + Scala + NetBeans Modules&lt;/strong&gt;. Of course, all were done with &lt;a class=&quot;wiki&quot; href=&quot;http://blogtrader.net/wiki/NetBeans&quot;&gt;NetBeans&lt;/a&gt; Scala plugin.
&lt;/p&gt;
&lt;p&gt;
LOC of this project so far:
&lt;/p&gt;
&lt;pre class=&quot;wiki&quot;&gt;$ ./cloc.pl --read-lang-def=lang_defs.txt ~/myprjs/aiotrade.kn/opensource/
     677 text files.
     617 unique files.
     154 files ignored.
http://cloc.sourceforge.net v 1.08  T=3.0 s (167.7 files/s, 21373.7 lines/s)
-------------------------------------------------------------------------------
Language          files     blank   comment      code    scale   3rd gen. equiv
-------------------------------------------------------------------------------
Scala               353      7981     16301     27180 x   1.36 =       36964.80
Java                 43      1148       833      6946 x   1.36 =        9446.56
XML                 104       231       389      2414 x   1.90 =        4586.60
Bourne Shell          2        81        81       488 x   3.81 =        1859.28
HTML                  1         7        15        26 x   1.90 =          49.40
-------------------------------------------------------------------------------
SUM:                503      9448     17619     37054 x   1.43 =       52906.64
-------------------------------------------------------------------------------
&lt;/pre&gt;&lt;p&gt;
A screen snapshot:
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100117.png&quot;&gt;&lt;img width=&quot;800px&quot; alt=&quot;AIOTrade-100117.png&quot; title=&quot;AIOTrade-100117.png&quot; src=&quot;http://blogtrader.net/chrome/site/img/AIOTrade-100117.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</description>
	<pubDate>Sun, 17 Jan 2010 22:24:41 +0000</pubDate>
</item>
<item>
	<title>Dukes of Erl: Minor Erlang Interface Tricks</title>
	<guid>tag:blogger.com,1999:blog-6265608756663924839.post-6622961196913363729</guid>
	<link>http://dukesoferl.blogspot.com/2010/01/minor-erlang-interface-tricks.html</link>
	<description>erlrc requires that you drop a file whose name is your node name and whose contents is the node cookie into a particular directory so that the packaging system can find running Erlang VMs and ask them to do hot-code upgrades.  It's not that hard, but I figured I would put some shell scripts into the erlrc google code project demonstrating how to do this and other minor tricks that make it a little nicer to talk to an Erlang VM from the (non-Erlang) command line.&lt;br /&gt;All of these scripts are driven by a POSIX shell syntax configuration file describing an Erlang VM, which can be pretty short.  Here's one I'm using right now for my personal stuff:&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;% cat /usr/share/myerlnode/myerlnode.rc&lt;br /&gt;node_name_file='/etc/erlrc.d/nodes/erlang'&lt;br /&gt;&lt;br /&gt;run_extra_args='+A 64 -noshell -noinput -s crypto -s mnesia -eval &quot;case erlrc_boot:boot () of ok -&gt; ok; _ -&gt; init:stop () end&quot; &gt;erlang.out 2&gt;erlang.err &amp;amp;'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;node_name_file (the only required config setting) defines what the node name will be (via the basename).  This config file drives four scripts:&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/erlrc/source/browse/trunk/erlstart/bin/erlstart-run-erlang&quot;&gt;erlstart-run-erlang&lt;/a&gt;: starts an Erlang VM.  doesn't do that much, really: creates the node file for erlrc, and sets the heart command in case you want to use heart.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/erlrc/source/browse/trunk/erlstart/bin/erlstart-remsh&quot;&gt;erlstart-remsh&lt;/a&gt;: starts a remote shell on an Erlang VM.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/erlrc/source/browse/trunk/erlstart/bin/erlstart-eval&quot;&gt;erlstart-eval&lt;/a&gt;: takes the argument, evals it on an Erlang VM, and prints the result to standard out.  very useful shell script glue for maintenance scripts.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/erlrc/source/browse/trunk/erlstart/bin/erlstart-etop&quot;&gt;erlstart-etop&lt;/a&gt;: runs etop on an Erlang VM.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;If you put your config file in the default location (/etc/erlstart.rc) or export an environment variable indicating the location (ERLSTART_CONFIG_FILE) then things are pretty zero-configuration.  Doing this kind of thing at the (non-Erlang) shell gets very addictive:&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;brush:bash&quot;&gt;% erlstart-eval 'application:which_applications()'&lt;br /&gt;[{anwhereos,&quot;Rest API for time series persistence and retrieval.&quot;,&quot;0.1.0&quot;},&lt;br /&gt;{drurlyjsclientsrv,&quot;Serve the drurly jsclient from the drurly server.&quot;,&lt;br /&gt;                &quot;0.0.1&quot;},&lt;br /&gt;{drurly,&quot;Social sharing server.&quot;,&quot;2.2.0&quot;},&lt;br /&gt;{mcedemo,&quot;TinyMCE + Nitrogen demo.&quot;,&quot;1.3.0&quot;},&lt;br /&gt;{inets,&quot;INETS  CXC 138 49&quot;,&quot;5.0.12&quot;},&lt;br /&gt;{mochiweb,&quot;MochiWeb is an Erlang library for building lightweight HTTP servers.&quot;,&lt;br /&gt;       &quot;0.2009.05.26&quot;},&lt;br /&gt;{nitrogen,&quot;Nitrogen web framework for Erlang.&quot;,&quot;0.2009.05.12.3&quot;},&lt;br /&gt;{nitromce,&quot;A Nitrogen element which corresponds to a TinyMCE editor instance.&quot;,&lt;br /&gt;       &quot;4.0.1&quot;},&lt;br /&gt;{sgte,&quot;String template language for Erlang.&quot;,&quot;0.7.1&quot;},&lt;br /&gt;{signzor,&quot;Erlang library to generate signed printable encodings.&quot;,&quot;0.0.1&quot;},&lt;br /&gt;{tcerl,&quot;Erlang driver for tokyocabinet.&quot;,&quot;1.3.1h&quot;},&lt;br /&gt;{webmachine,&quot;An Erlang REST framework.&quot;,&quot;0.2009.09.24b&quot;},&lt;br /&gt;{erlrc,&quot;Extensible application management.&quot;,&quot;0.2.3&quot;},&lt;br /&gt;{mnesia,&quot;Mnesia storage API extensions.&quot;,&quot;4.4.7.6.1&quot;},&lt;br /&gt;{crypto,&quot;CRYPTO version 1&quot;,&quot;1.5.3&quot;},&lt;br /&gt;{sasl,&quot;SASL  CXC 138 11&quot;,&quot;2.1.5.4&quot;},&lt;br /&gt;{stdlib,&quot;ERTS  CXC 138 10&quot;,&quot;1.15.5&quot;},&lt;br /&gt;{kernel,&quot;ERTS  CXC 138 10&quot;,&quot;2.12.5&quot;}]&lt;/pre&gt;erlstart-run-erlang is fairly low level, so for an init script I would do something like the following: first, a little stub installed into /etc/rc.d&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;#! /bin/sh&lt;br /&gt;&lt;br /&gt;# chkconfig: 2345 20 80&lt;br /&gt;# description: Control my personal Erlang node.&lt;br /&gt;&lt;br /&gt;exec myerlnodectl &quot;$@&quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and then the actual guts installed as myerlnodectl&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;#! /bin/sh&lt;br /&gt;&lt;br /&gt;eval_with_main_node () \&lt;br /&gt;{&lt;br /&gt;  erl -name myerlnodetmp$$ \&lt;br /&gt;      -hidden \&lt;br /&gt;      -setcookie &quot;$cookie&quot; \&lt;br /&gt;      -noshell -noinput \&lt;br /&gt;      -eval &quot;MainNode = list_to_atom (\&quot;$1\&quot;), $2&quot; \&lt;br /&gt;      -s erlang halt&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;get_hostname () \&lt;br /&gt;{&lt;br /&gt;  erl -name myerlnodetmp$$ -setcookie $$ -noshell -noinput -eval '&lt;br /&gt;    [ Host ] = tl (string:tokens (atom_to_list (node ()), &quot;@&quot;)),&lt;br /&gt;    io:format (&quot;~s~n&quot;, [ Host ])&lt;br /&gt;  ' -s init stop&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;id=`basename &quot;$0&quot;`&lt;br /&gt;&lt;br /&gt;if test -d /root&lt;br /&gt;then&lt;br /&gt;  HOME=${HOME-/root}&lt;br /&gt;else if test -d /var/root&lt;br /&gt;  then&lt;br /&gt;    HOME=${HOME-/var/root}&lt;br /&gt;  fi&lt;br /&gt;fi&lt;br /&gt;export HOME&lt;br /&gt;&lt;br /&gt;ERLSTART_CONFIG_FILE=${ERLSTART_CONFIG_FILE-/usr/share/myerlnode/myerlnode.rc}&lt;br /&gt;export ERLSTART_CONFIG_FILE&lt;br /&gt;&lt;br /&gt;. &quot;$ERLSTART_CONFIG_FILE&quot;&lt;br /&gt;&lt;br /&gt;cookie=${cookie-turg}&lt;br /&gt;user=${user-erlang}&lt;br /&gt;hostname=${hostname-`get_hostname`}&lt;br /&gt;node_name=`basename &quot;$node_name_file&quot;`&lt;br /&gt;full_name=&quot;$node_name@$hostname&quot;&lt;br /&gt;shutdown_file=${shutdown_file-/var/run/myerlnode.shutting_down}&lt;br /&gt;&lt;br /&gt;ERL_CRASH_DUMP=${ERL_CRASH_DUMP-/dev/null}&lt;br /&gt;export ERL_CRASH_DUMP&lt;br /&gt;&lt;br /&gt;case ${1-&quot;status&quot;} in&lt;br /&gt;start)&lt;br /&gt;  test &quot;`id -u`&quot; -eq 0 || exec sudo $0 &quot;$@&quot;&lt;br /&gt;&lt;br /&gt;  printf &quot;Starting Erlang... &quot;&lt;br /&gt;&lt;br /&gt;  if test -f &quot;$node_name_file&quot; &amp;amp;&amp;amp;                                     \&lt;br /&gt;     test true = &quot;`erlstart-eval 'true' 2&gt;/dev/null`&quot; 2&gt;/dev/null&lt;br /&gt;    then&lt;br /&gt;      echo &quot;already started.&quot;&lt;br /&gt;      exit 0&lt;br /&gt;    fi&lt;br /&gt;&lt;br /&gt;  pid=`eval_with_main_node &quot;$full_name&quot; '&lt;br /&gt;         io:format (&quot;~p&quot;, [&lt;br /&gt;           case rpc:call (MainNode, os, getpid, []) of&lt;br /&gt;             { badrpc, _ } -&gt; undefined;&lt;br /&gt;             Pid -&gt; list_to_integer (Pid)&lt;br /&gt;           end ])'`&lt;br /&gt;&lt;br /&gt;  test &quot;$pid&quot; -gt 0 2&gt;/dev/null &amp;amp;&amp;amp; {&lt;br /&gt;    test -f &quot;$shutdown_file&quot; &amp;amp;&amp;amp; {&lt;br /&gt;      oldpid=`cat &quot;$shutdown_file&quot;`&lt;br /&gt;      test &quot;$pid&quot; -eq &quot;$oldpid&quot; &amp;amp;&amp;amp; {&lt;br /&gt;        echo &quot;shutdown in progress (pid = '$pid').&quot; 1&gt;&amp;amp;2&lt;br /&gt;        exit 1&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  rm -f &quot;$shutdown_file&quot;&lt;br /&gt;&lt;br /&gt;  # check for -s shell support&lt;br /&gt;  su -l -s /bin/sh $user -c true &gt;/dev/null 2&gt;/dev/null&lt;br /&gt;&lt;br /&gt;  if test $? = 0&lt;br /&gt;    then&lt;br /&gt;      dashs=&quot;-s /bin/sh&quot;&lt;br /&gt;    else&lt;br /&gt;      dashs=&quot;&quot;&lt;br /&gt;    fi&lt;br /&gt;&lt;br /&gt;  ${niceness+ nice -n $niceness}                                      \&lt;br /&gt;  su -l $dashs &quot;$user&quot; -c                                             \&lt;br /&gt;    &quot;env cookie=\&quot;$cookie\&quot; erlstart-run-erlang \&quot;$ERLSTART_CONFIG_FILE\&quot;&quot;&lt;br /&gt;&lt;br /&gt;  eval_with_main_node &quot;$full_name&quot;                                    \&lt;br /&gt;      &quot;Wait = fun (_, 0) -&gt;&lt;br /&gt;                    failed;&lt;br /&gt;                  (Cont, Max) -&gt;&lt;br /&gt;                    case net_adm:ping (MainNode) of&lt;br /&gt;                      pong -&gt;&lt;br /&gt;                        ok;&lt;br /&gt;                      pang -&gt;&lt;br /&gt;                        timer:sleep (100),&lt;br /&gt;                        Cont (Cont, Max - 1)&lt;br /&gt;                    end&lt;br /&gt;              end,&lt;br /&gt;       DontTellMe = 100,&lt;br /&gt;       ok = Wait (Wait, DontTellMe)&quot; || {&lt;br /&gt;    echo &quot;&quot; 1&gt;&amp;amp;2&lt;br /&gt;    echo &quot;$id: could not connect to node after 10 seconds&quot; 1&gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  eval_with_main_node &quot;$full_name&quot;                                    \&lt;br /&gt;      &quot;Wait = fun (_, 0) -&gt;&lt;br /&gt;                    failed;&lt;br /&gt;                  (Cont, Max) -&gt;&lt;br /&gt;                    case rpc:call (MainNode, init, get_status, []) of&lt;br /&gt;                      { started, _ } -&gt;&lt;br /&gt;                        ok;&lt;br /&gt;                      { starting, _ } -&gt;&lt;br /&gt;                        timer:sleep (100),&lt;br /&gt;                        Cont (Cont, Max - 1);&lt;br /&gt;                      { Status, _ } -&gt;&lt;br /&gt;                        { failed, Status }&lt;br /&gt;                    end&lt;br /&gt;              end,&lt;br /&gt;       DontTellMe = 100,&lt;br /&gt;       ok = Wait (Wait, DontTellMe)&quot; || {&lt;br /&gt;    echo &quot;&quot; 1&gt;&amp;amp;2&lt;br /&gt;    echo &quot;$id: node did not boot after 10 seconds&quot; 1&gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;echo &quot;done.&quot;&lt;br /&gt;;;&lt;br /&gt;&lt;br /&gt;stop)&lt;br /&gt;  test &quot;`id -u`&quot; -eq 0 || exec sudo $0 &quot;$@&quot;&lt;br /&gt;&lt;br /&gt;  printf &quot;Stopping Erlang... &quot;&lt;br /&gt;&lt;br /&gt;  if test ! -f &quot;$node_name_file&quot; ||                                   \&lt;br /&gt;     test true != &quot;`erlstart-eval 'true' 2&gt;/dev/null`&quot; 2&gt;/dev/null&lt;br /&gt;    then&lt;br /&gt;      echo &quot;not running.&quot;&lt;br /&gt;      exit 0&lt;br /&gt;    fi&lt;br /&gt;&lt;br /&gt;  pid=`erlstart-eval 'os:getpid ()' 2&gt;/dev/null`&lt;br /&gt;&lt;br /&gt;  test &quot;$pid&quot; -gt 0 2&gt;/dev/null &amp;amp;&amp;amp; {&lt;br /&gt;    printf '%s' $pid &gt; &quot;$shutdown_file&quot;&lt;br /&gt;    chown $user:$user &quot;$shutdown_file&quot;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  erlstart-eval 'init:stop ()' &gt;/dev/null 2&gt;/dev/null&lt;br /&gt;&lt;br /&gt;  eval_with_main_node &quot;$full_name&quot;                                    \&lt;br /&gt;      &quot;Wait = fun (_, 0) -&gt;&lt;br /&gt;                    failed;&lt;br /&gt;                  (Cont, Max) -&gt;&lt;br /&gt;                    case net_adm:ping (MainNode) of&lt;br /&gt;                      pong -&gt;&lt;br /&gt;                        timer:sleep (100),&lt;br /&gt;                        Cont (Cont, Max - 1);&lt;br /&gt;                      pang -&gt;&lt;br /&gt;                        ok&lt;br /&gt;                    end&lt;br /&gt;              end,&lt;br /&gt;       DontTellMe = 100,&lt;br /&gt;       ok = Wait (Wait, DontTellMe)&quot; || {&lt;br /&gt;    echo &quot;&quot; 1&gt;&amp;amp;2&lt;br /&gt;    echo &quot;$id: node still responsive after 100 seconds&quot; 1&gt;&amp;amp;2&lt;br /&gt;    exit 1&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  rm -f &quot;$node_name_file&quot;&lt;br /&gt;&lt;br /&gt;  echo &quot;done.&quot;&lt;br /&gt;  ;;&lt;br /&gt;&lt;br /&gt;status)&lt;br /&gt;  if test -f &quot;$node_name_file&quot; &amp;amp;&amp;amp;                                     \&lt;br /&gt;     test true = &quot;`erlstart-eval 'true' 2&gt;/dev/null`&quot; 2&gt;/dev/null&lt;br /&gt;    then&lt;br /&gt;      echo &quot;Erlang is running&quot;&lt;br /&gt;    else&lt;br /&gt;      echo &quot;Erlang is not running&quot;&lt;br /&gt;    fi&lt;br /&gt;&lt;br /&gt;  ;;&lt;br /&gt;&lt;br /&gt;*)&lt;br /&gt;  echo &quot;$id: unknown command $1&quot; 1&gt;&amp;amp;2&lt;br /&gt;  exit 1&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hopefully you found that inspirational.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6265608756663924839-6622961196913363729?l=dukesoferl.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 14 Jan 2010 12:41:28 +0000</pubDate>
	<author>noreply@blogger.com (Paul Mineiro)</author>
</item>
<item>
	<title>Ulf Wiger: QCon 2010 Concurrency Track</title>
	<guid>http://ulf.wiger.net/weblog/?p=180</guid>
	<link>http://ulf.wiger.net/weblog/2010/01/06/qcon-2010-concurrency-track/</link>
	<description>&lt;p&gt;I will be hosting the &lt;a href=&quot;http://qconlondon.com/london-2010/tracks/show_track.jsp?trackOID=333&quot;&gt;&amp;#8220;Concurrency Challenge&amp;#8221;&lt;/a&gt; track at QCon 2010. The speakers list is now ready with all titles and abstracts in place.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://qconlondon.com/london-2010/&quot;&gt;&lt;img src=&quot;http://qcon.infoq.com/images/logo_qcon.gif&quot; alt=&quot;QCon 2010 London&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am quite pleased with the mix and the dignity of the speakers. One of the things we wanted to highlight is that there is no one-size-fits-all concurrency model, and it&amp;#8217;s time for us to start being a little bit more specific about what kind of concurrency we have in mind. &lt;/p&gt;
&lt;p&gt;Each setting brings its own set of challenges, and in this track, you can expect to get a good orientation from some brilliant people, who know how to tell a story and are not afraid of offering their opinion.&lt;/p&gt;</description>
	<pubDate>Wed, 06 Jan 2010 16:01:40 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: ProcessOne, a year in review</title>
	<guid>http://www.process-one.net/en/blogs/article/processone_a_year_in_review/</guid>
	<link>http://www.process-one.net/en/blogs/article/processone_a_year_in_review/</link>
	<description>&lt;p&gt;At ProcessOne, we wanted to wish you all a very happy 2010 year. To give you a good sense of all what has been accomplished, we have written this small review of the 2009 year at ProcessOne. We hope you will enjoy the reading.&lt;/p&gt; &lt;h2&gt;Software&lt;/h2&gt;
&lt;p&gt;First, we have released &lt;a href=&quot;http://www.process-one.net/en/ejabberd/&quot;&gt;ejabberd&lt;/a&gt; 2.0.3 to 2.0.5, and we finally made it with ejabberd 2.1 (with its bugfix 2.1.1). It has received much scalability improvements, as well as a big PubSub boost. Even more changes have made it an even more rock-solid and featureful real-time server. A STUN server has been added in ejabberd, for multimedia purposes. The version 3.0 is in the works, based on the opensource exmpp library, freshly released this year also.&lt;/p&gt;
&lt;p&gt;On the desktop, &lt;a href=&quot;http://www.process-one.net/en/blogs/article/onechannel_a_desktop_publish_subscribe_client_for_instant_news_delivery/&quot;&gt;OneChannel&lt;/a&gt;, the PubSub client working on AIR, has been released, optionally using the &lt;a href=&quot;http://xmpp-sandbox.org/&quot;&gt;xmpp-sandbox.org&lt;/a&gt; preconfigured real-time feeds.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.process-one.net/en/solutions/imgateways/&quot;&gt;Our gateway packaging&lt;/a&gt; is stable, scalable and works pretty well, covering Microsoft Live Messenger, Yahoo! IM, AIM and ICQ, XMPP, and also non-IM systems, like Twitter and Wave gateway.&lt;/p&gt;
&lt;p&gt;On the mobile front, &lt;a href=&quot;http://www.process-one.net/en/solutions/oneteam_iphone/&quot;&gt;OneTeam for iPhone&lt;/a&gt;, the mobile XMPP client, has been released in versions 2.1, 3.0, 3.1, and 3.2, and we believe it is the best XMPP client out there, with room for improvements and innovations in the coming year.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.process-one.net/en/blogs/article/oneweb_demonstrates_the_power_of_xmpp_inside_the_browser/&quot;&gt;OneWeb&lt;/a&gt;, the extension for Firefox, has been released as an alpha product, &lt;a href=&quot;http://www.process-one.net/en/blogs/article/oneweb_works_on_firefox_mobile/&quot;&gt;with a Fennec port&lt;/a&gt; (Firefox mobile). It basically adds data sync and remote control between browsers, demoing the power of XMPP in the browser.&lt;/p&gt;
&lt;p&gt;Our supervision console &lt;a href=&quot;http://www.process-one.net/fr/solutions/teamleader/&quot;&gt;TeamLeader&lt;/a&gt; has had many improvements in 2009 and is now clean and efficient, being deployed on large customer projets.&lt;/p&gt;
&lt;p&gt;Our XMPP desktop client &lt;a href=&quot;http://www.process-one.net/fr/solutions/oneteam/&quot;&gt;OneTeam&lt;/a&gt; for Firefox has become a strong client and should become a major component in our offering in 2010.&lt;/p&gt;
&lt;p&gt;We also are offering a module for the APNS, or Apple Push Notifications Service, for the iPhones.&lt;/p&gt;
&lt;h2&gt;Announced&lt;/h2&gt;
&lt;p&gt;We have announced and demoed the OneTeam Media Server, our Flash server implementation, acting as a media relay and much more, for multimedia applications.&lt;/p&gt;
&lt;p&gt;The ProcessOne Wave Server is in the work, gaining features and improving fast. A demo on Tkabber has been done, showing very basic client/server interactions, like create a wavelet, join and edit it, the basics of collaborative real-time editing of a text document.&lt;/p&gt;
&lt;p&gt;Our OCS Bridge enables a real federation of ejabberd servers with the Microsoft's IM+VoIP corporate servers, while this one only painfully offers gateways to XMPP since this year.&lt;/p&gt;
&lt;h2&gt;Services&lt;/h2&gt;
&lt;p&gt;We have given birth to a number of services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We have opened the &lt;a href=&quot;http://www.process-one.net/en/labs/&quot;&gt;ProcessOne Labs&lt;/a&gt;, showing all our non-production ready, but promising products.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hosted.im/&quot;&gt;Hosted.IM&lt;/a&gt; offers for XMPP hosting services for small businesses.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.process-one.net/en/imstore/&quot;&gt;IMstore&lt;/a&gt; enables customers to buy products and services, the fast and easy way, on the web via a simple form.&lt;/li&gt;
&lt;li&gt;The APNS, or Apple Push Notifications Services, runs on our infrastructure for OneTeam for iPhone clients using our &lt;a href=&quot;http://oneteam.im/&quot;&gt;OneTeam.IM&lt;/a&gt; and &lt;a href=&quot;http://talkr.im/&quot;&gt;Talkr.IM&lt;/a&gt; services.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tweet.im/&quot;&gt;Tweet.IM&lt;/a&gt; is a XMPP to Twitter gateway, offering nice features like delivery modes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://xmpp-sandbox.org/&quot;&gt;xmpp-sandbox.org&lt;/a&gt; is the XMPP service for developers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://talkr.im/&quot;&gt;Talkr.IM&lt;/a&gt; is our XMPP service for the masses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Events, Talks &amp;amp; Articles&lt;/h2&gt;
&lt;p&gt;Here are the places where we have been, and what has been said about us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In December, we have organized the &lt;a href=&quot;http://www.process-one.net/seabeyond/&quot;&gt;Sea Beyond&lt;/a&gt; event, for real-time communications.&lt;/li&gt;
&lt;li&gt;The concept of &lt;a href=&quot;http://www.process-one.net/en/blogs/article/real-time_web_real-time_search_no_it_is_war/&quot;&gt;&quot;Web Augmented Reality&quot;&lt;/a&gt; came to birth.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;http://www.process-one.net/en/imtrends/article/strategic_guide_instant_messaging_and_security/&quot;&gt;Strategic Guide to Instant Messaging and Security&lt;/a&gt; has been published.&lt;/li&gt;
&lt;li&gt;Facebook has been caught &lt;a href=&quot;http://www.process-one.net/en/blogs/article/facebook_chat_supports_xmpp_with_ejabberd/&quot;&gt;working on XMPP with ejabberd&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;id Software's QuakeLive online game is using &lt;a href=&quot;http://www.process-one.net/en/blogs/article/idsoftware_quakelive_service_uses_xmpp/&quot;&gt;ejabberd for its ingame chat infrastructure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Micka&amp;euml;l R&amp;eacute;mond went to Mobile World Congress, Erlang Factory in San Jose and London, XMPP Summit in Brussel and Palo Alto, Erlang User Conference in Stockholm, Le Web in Paris.&lt;/li&gt;
&lt;li&gt;We have been covered by &lt;a href=&quot;http://www.process-one.net/en/blogs/article/datamonitor_coverage/&quot;&gt;Datamonitor&lt;/a&gt; and &lt;a href=&quot;http://gigaom.com/2009/11/05/facebook-xmpp-adium-chat/&quot;&gt;Giga OM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The series &quot;Scalable XMPP bots&quot; has been published, promoting the use of exmpp (&lt;a href=&quot;http://www.process-one.net/en/blogs/article/scalable_xmpp_bots_with_erlang_and_exmpp_part_i/&quot;&gt;I&lt;/a&gt;, &lt;a href=&quot;http://www.process-one.net/en/blogs/article/scalable_xmpp_bots_with_erlang_and_exmpp_part_ii/&quot;&gt;II&lt;/a&gt;, &lt;a href=&quot;http://www.process-one.net/en/blogs/article/scalable_xmpp_bots_with_erlang_and_exmpp_part_iii/&quot;&gt;III&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Roadmap 2010&lt;/h2&gt;
&lt;p&gt;In 2010, our focus will be mainly on the following points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hosted.im/&quot;&gt;Hosted.IM&lt;/a&gt; will be offering new simple and extendable services.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.process-one.net/fr/solutions/oneteam/&quot;&gt;OneTeam&lt;/a&gt; for Firefox will be released, with WAR (Web Augmented Reality), and much more innovative features.&lt;/li&gt;
&lt;li&gt;ejabberd will become more industrial, with 3.0 getting to production ready state, better TeamLeader support, good test suite coverage and more modules on the IMstore.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://talkr.im/&quot;&gt;Talkr.IM&lt;/a&gt; will offer the seamless migration from/to another XMPP service.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It has been a busy year, with many achievements, much of which we cannot talk about, or we have just forgotten. But the coming year 2010 will be even more exciting.&lt;/p&gt;</description>
	<pubDate>Mon, 04 Jan 2010 13:00:12 +0000</pubDate>
</item>
<item>
	<title>Me Dev, You Jane: Erlang Quick Tip: The user_default module</title>
	<guid>http://medevyoujane.com/blog/2010/1/3/erlang-quick-tip-the-user_default-module.html</guid>
	<link>http://medevyoujane.com/blog/2010/1/3/erlang-quick-tip-the-user_default-module.html</link>
	<description>&lt;p&gt;If you are anything like me you spend a lot of your time in the erlang shell debuging and testing your code. And some commands are used more than others but they may be a bit on the long side and you may make regular errors while typing it. One of these wonderful functions is &lt;code&gt;make:all([load]).&lt;/code&gt; that will compile using your Emakefile and then magically reload the newly compiled modules into the running shell. What I reglarly do is to type &lt;em&gt;load&lt;/em&gt; instead of &lt;em&gt;[load]&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Enter the &lt;em&gt;user_default&lt;/em&gt; module. Any function defined in the user defined &lt;em&gt;user_default&lt;/em&gt; module or in the Erlang defined &lt;em&gt;shell_default&lt;/em&gt; module will be allowed to run without typing in the module name. One of these functions that you may use often is the &lt;code&gt;c(module\_name).&lt;/code&gt; function. First start by creating a directory for your utility modules. I like having it in the &lt;em&gt;~/.ebin/&lt;/em&gt; diretory. Now add that direcory to the code path by opening or creating the file &lt;em&gt;~/.erlang&lt;/em&gt; and inserting this line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;code:add_pathz(&quot;/Users/username/.ebin&quot;).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Create your &lt;em&gt;user_default.erl&lt;/em&gt; file and but in the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-module (user_default).
-export ([sync/0]).

%% Compiles all files in Emakefile and load into current shell.
sync() -&amp;gt;
  make:all([load]).
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then compile it with &lt;code&gt;erlc user_default.erl&lt;/code&gt; and start an Erlang shell. Now inside a project you can run &lt;code&gt;sync().&lt;/code&gt; and it will recompile and load you project.&lt;/p&gt;

&lt;p&gt;For those interested I will put up my &lt;em&gt;~/.ebin&lt;/em&gt; code up at &lt;a href=&quot;http://github.com/JonGretar/erlang_user_utilities&quot;&gt;github.com/JonGretar/erlang_user_utilities&lt;/a&gt;. Please fork and make your own changes and share with the world.&lt;/p&gt;</description>
	<pubDate>Sun, 03 Jan 2010 15:09:38 +0000</pubDate>
</item>
<item>
	<title>Joe's Blog: Fun with the CouchDB _changes feed and RabbitMQ.</title>
	<guid>http://www.joeandmotorboat.com/?p=962</guid>
	<link>http://www.joeandmotorboat.com/2010/01/01/fun-with-the-couchdb-_changes-feed-and-rabbitmq/</link>
	<description>&lt;p&gt;I was recently &lt;a href=&quot;http://ozmm.org/posts/2009_open_source_top_ten.html&quot;&gt;introduced&lt;/a&gt; to &lt;a href=&quot;http://github.com/brianmario/yajl-ruby&quot;&gt;yajl-ruby&lt;/a&gt;, ruby bindings to the C based yajl json parsing/encoding libraries. After discovering that it can parse HTTP streams it seemed like it would be a perfect fit for use with &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt;. A while back I wrote &lt;a href=&quot;http://www.joeandmotorboat.com/2009/06/05/sending-couchdb-update-notifications-to-rabbitmq/&quot;&gt;some code to push update notifications&lt;/a&gt; to RabbitMQ and a commenter mentioned using the &lt;a href=&quot;http://books.couchdb.org/relax/reference/change-notifications&quot;&gt;_changes feed&lt;/a&gt; instead. Combining the _changes feed and yajl-ruby&amp;#8217;s HttpStream seemed like a good way to do it.&lt;/p&gt;
&lt;p&gt;The _changes feed is a running list of all the documents that have changed in a database listed in order by sequence number. This is similar to update notifications but gives more information such as the document IDs and is HTTP based (with multiple feed styles) rather than stdout. Additionally you can create design document filters which can be specified as a query parameter to give you only the parts of the feed you want. All in all _changes is a pretty powerful feature.&lt;/p&gt;
&lt;p&gt;Now for the fun stuff, the code. There are a few dependencies I used to do this, specifically focused on making it fast. As such I used EventMachine based libraries for &lt;a href=&quot;http://github.com/tmm1/amqp/&quot;&gt;AMQP&lt;/a&gt; and &lt;a href=&quot;http://github.com/igrigorik/em-http-request/&quot;&gt;HTTP requests&lt;/a&gt;. The first bit of code takes the _changes feed for the &amp;#8220;test&amp;#8221; database, parses the feed, uses the document ID to request that document and publish it to the queue. One key item to note is that this code &lt;strong&gt;requires the latest yajl-ruby&lt;/strong&gt; from github to run properly. Additionally, this works nicely with &lt;em&gt;feed=continuous&lt;/em&gt; so it grabs the documents as they are changed without a need for polling.&lt;/p&gt;
&lt;p&gt; Note that there is a variable for &lt;em&gt;since&lt;/em&gt;, this allows you to start from a specific sequence number so you can skip over old changes.&lt;/p&gt;
&lt;p&gt;The next bit of code works from the other side of the queue. It subscribes to the queue, parses the JSON, performs some operations on it and puts the results back into another CouchDB database called &amp;#8220;results&amp;#8221;.  &lt;/p&gt;
&lt;p&gt;What could it be used for? My first thought is some sort of parallel computation, boot up a few dozen EC2 nodes and start dumping data into CouchDB. Have all those nodes pop messages off the queue, process them and dump the results back into Couch. Legitimately one could chain these together to process the results again. The queue ends up being a simple job management system with the EC2 nodes popping new messages as they finish processing them. With a little bit of work, features and the right use case I think could be a pretty powerful system.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;http://gist.github.com/266991&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://github.com/joewilliams&quot;&gt;my other projects&lt;/a&gt; and follow me on twitter &lt;a href=&quot;http://twitter.com/williamsjoe&quot;&gt;@williamsjoe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[edit: made a slight improvement to changes_sub.rb on 20100107]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 01 Jan 2010 23:14:01 +0000</pubDate>
</item>
<item>
	<title>Anders Conbere's Journal: Atom feeds for igor... difficult</title>
	<guid>tag:anders.conbere.org,2009-12-31:1262294240.0</guid>
	<link>http://anders.conbere.org/blog/2009/12/31/atom_feeds_for_igor..._difficult</link>
	<description>&lt;p&gt;The first problem was actually reading the atom specs which I had neglected to do. Most of my previous work with atom had been in either creating elements used in various locations (Google data is all passed as Atom elements, as well as moments of injecting atom elements into xmpp streams). So I cobbled together what I thought was a decent first attempt at a Jinja template for building the atom file, published it and redirected my browser there... only to see nothing.
&lt;/p&gt;
&lt;p&gt;The XML was being generated, but not parsed.
&lt;/p&gt;
&lt;p&gt;The problems left were:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     writing out dates in RFC:3339 format
 &lt;/li&gt;

 &lt;li&gt;
     building correct id's for elements
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;for RFC 3339 I found a &lt;a href=&quot;http://henry.precheur.org/projects/rfc3339.html&quot;&gt;nice python library&lt;/a&gt; in the public domain for producing the correct format from a datetime object. To you &lt;a href=&quot;http://henry.precheur.org/&quot;&gt;Henry Precheur&lt;/a&gt; I am quite grateful.
&lt;/p&gt;
&lt;p&gt;Generating correct id's was a little more tricky. First I tried generating uuid's but upon reading Mark Pilgrims post on &lt;a href=&quot;http://diveintomark.org/archives/2004/05/28/howto-atom-id&quot;&gt;atom element id's&lt;/a&gt; I ended up writing a small function to generate tag: urns based on the time when a post was published (I'm not sure this is a /good/ solution given that I'm working with version control systems and you might legitimately have many articles published at the same time).
&lt;/p&gt;
&lt;p&gt;In the end I'm fairly content with the result, it required a morning's effort, more time than I had wanted to devote to atom publishing, but still successful.
&lt;/p&gt;</description>
	<pubDate>Thu, 31 Dec 2009 21:17:20 +0000</pubDate>
</item>
<item>
	<title>Erlang Inside: Mustache – GitHub’s framework agnostic templating ported to Erlang</title>
	<guid>http://erlanginside.com/?p=135</guid>
	<link>http://erlanginside.com/mustache-githubs-framework-agnostic-templating-ported-to-erlang-135</link>
	<description>Mustache is an Erlang port of the Ruby framework of the same name, originally written by Chris Wanstrath, one of the founders of GitHub. A powerful feature of this type of framework is the ability to write a &amp;#8216;template&amp;#8217; that you could use in a Rails application and then reuse in an Erlang application with [...]</description>
	<pubDate>Wed, 30 Dec 2009 14:00:29 +0000</pubDate>
</item>
<item>
	<title>Process-one Blogs: Merry Christmas and Happy New Year !</title>
	<guid>http://www.process-one.net/en/blogs/article/merry_christmas_and_happy_new_year/</guid>
	<link>http://www.process-one.net/en/blogs/article/merry_christmas_and_happy_new_year/</link>
	<description>&lt;p&gt;Year 2009 has been for us full of opportunities and allowed us to launch new promising software, like OneChannel the first XMPP publish and subscribe client, and to demonstrate our ability to innovate.&lt;/p&gt; &lt;p&gt;We still have lots of new features, software and improvements in the work: Oneteam Media Server, ProcessOne Wave server, new XMPP client, new online service portfolio, and many other surprises.&lt;/p&gt;
&lt;p&gt;Year 2010 is going to be a great year for ProcessOne.&lt;/p&gt;
&lt;p&gt;Thank you all for your ongoing support. Let's build the realtime web together !&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img alt=&quot;image&quot; height=&quot;640&quot; src=&quot;http://www.process-one.net/images/uploads/p1card2009.jpg&quot; width=&quot;480&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 25 Dec 2009 09:30:01 +0000</pubDate>
</item>
<item>
	<title>Dukes of Erl: erlrc and rpm</title>
	<guid>tag:blogger.com,1999:blog-6265608756663924839.post-3617401259151213935</guid>
	<link>http://dukesoferl.blogspot.com/2009/12/erlrc-and-rpm.html</link>
	<description>Two of the Dukes now work at &lt;a href=&quot;http://www.openx.org/&quot;&gt;OpenX&lt;/a&gt;, which is starting to dip its toe into the Erlang waters.  They use &lt;a href=&quot;http://www.centos.org/&quot;&gt;CentOS &lt;/a&gt;so they agreed to fund porting &lt;a href=&quot;http://code.google.com/p/fwtemplates/&quot;&gt;framewerk&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/erlrc/&quot;&gt;erlrc&lt;/a&gt; to rpm; previously I'd only used them with deb.&lt;br /&gt;&lt;br /&gt;A bit of background: erlrc is a set of Erlang modules and shell scripts that are designed to be integrated into packaging hooks so that installation, upgrade, or removal of a package causes corresponding hot-code activity to happen inside registered Erlang VMs on the box.  Since erlrc was designed to easily integrate with multiple package managers, getting it to work with rpm was mostly about me understanding rpm's package hooks model.  The result is an experience like this,&lt;br /&gt;&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;% sudo yum -q -y install lyet&lt;br /&gt;erlrc-start: Starting 'lyet': (erlang) started&lt;br /&gt;% sudo yum -q -y remove lyet&lt;br /&gt;erlrc-stop: Stopping 'lyet': (erlang) unloaded&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;i.e., installing an rpm causes a running Erlang VM on the box to hot-code load the new modules and start the associated application, and removing the rpm causes the associated application to be stopped and the corresponding modules to be hot-code unloaded.&lt;br /&gt;&lt;br /&gt;If you use &lt;a href=&quot;http://code.google.com/p/fwtemplates/wiki/FwTemplateErlangWalkthrough&quot;&gt;fw-template-erlang&lt;/a&gt; than the appropriate packaging hooks are added for you automatically, both for deb and now rpm.  However even manual creation of rpm spec files is pretty easy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;erlrc-stop is called in %preun if the installation count indicates removal&lt;/li&gt;&lt;li&gt;erlrc-upgrade is called in %preun if the installation count indicates upgrade&lt;/li&gt;&lt;li&gt;erlrc-start is called in %posttrans&lt;/li&gt;&lt;/ul&gt;Also, the erlrc shell scripts want to know the previously installed version, so I call &lt;span&gt;rpm -q&lt;/span&gt; in a %pretrans hook and save the result.  Longer term, erlrc should probably ask the Erlang VM it is talking to what version is running to eliminate the need for this argument (I was a bit surprised that rpm doesn't provide this argument to the package hook like debian does; it seems very useful for creating version-specific upgrade fixes).&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/6265608756663924839-3617401259151213935?l=dukesoferl.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 23 Dec 2009 15:12:51 +0000</pubDate>
	<author>noreply@blogger.com (Paul Mineiro)</author>
</item>
<item>
	<title>Process-one Blogs: [ANN] exmpp 0.9.2 new release</title>
	<guid>http://www.process-one.net/en/blogs/article/ann_exmpp_0.9.2_new_release/</guid>
	<link>http://www.process-one.net/en/blogs/article/ann_exmpp_0.9.2_new_release/</link>
	<description>&lt;p&gt;We are pleased to announce a new release of exmpp.&lt;br /&gt;&lt;br /&gt;exmpp is a XMPP library written in Erlang and released under the Erlang Public License. It helps the development of XMPP entities by providing functions to build and interpret XML stanzas. Once compiled, check the generated HTML documentation.&lt;/p&gt; &lt;p&gt;List of main changes since the previous release six months ago:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding support for stream error stanzas in exmpp_session when logged in&lt;/li&gt;
&lt;li&gt;Autodetect compilation parameters for Mac OS X Snow Leopard&lt;/li&gt;
&lt;li&gt;Component support for exmpp, and some fixes&lt;/li&gt;
&lt;li&gt;Fix segmentation fault with exmpp and expat&lt;/li&gt;
&lt;li&gt;New functions exmpp_client_pubsub:discover_nodes/1 and 2&lt;/li&gt;
&lt;li&gt;Stringprep Bidi checking doesn't reject strings with RandALCat and LCat characters&lt;/li&gt;
&lt;li&gt;queryns was not defined for IQ packets in received_packet record&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;The API of exmpp 0.9.2 is considered to be stable, so there aren't any&lt;br /&gt;major changes expected in the API before reaching 1.0.0.&lt;br /&gt;&lt;br /&gt;exmpp home page:&lt;br /&gt;&lt;a href=&quot;http://support.process-one.net/doc/display/EXMPP/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://exmpp.org/&quot;&gt;http://exmpp.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download exmpp 0.9.2 source code package from:&lt;br /&gt;&lt;a href=&quot;http://download.process-one.net/exmpp/&quot;&gt;http://download.process-one.net/exmpp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also check the ProcessOne Labs page:&lt;br /&gt;&lt;a href=&quot;http://www.process-one.net/en/labs/&quot;&gt;http://www.process-one.net/en/labs/&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 23 Dec 2009 14:56:24 +0000</pubDate>
</item>
<item>
	<title>LShift on Erlang: Merry Christmas: Toke — Tokyo Cabinet driver for Erlang</title>
	<guid>http://www.lshift.net/blog/?p=468</guid>
	<link>http://www.lshift.net/blog/2009/12/21/merry-christmas-toke-tokyo-cabinet-driver-for-erlang</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://1978th.net/tokyocabinet/&quot;&gt;Tokyo Cabinet&lt;/a&gt; is a rather excellent key-value store, with the ability to write to disk in a sane way (i.e. not just repeatedly dumping the same data over and over again), operate in bounded memory, and go &lt;em&gt;really&lt;/em&gt; fast. I like it a lot, and there&amp;#8217;s a likelihood that there&amp;#8217;ll be a RabbitMQ plugin fairly soon that&amp;#8217;ll use Tokyo Cabinet to improve the new persister yet further. &lt;a href=&quot;http://hg.opensource.lshift.net/toke/&quot;&gt;Toke&lt;/a&gt; is an Erlang linked-in driver that allows you to use Tokyo Cabinet from Erlang.&lt;span id=&quot;more-468&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;There is already a Tokyo Cabinet driver for Erlang, &lt;a href=&quot;http://code.google.com/p/tcerl/&quot;&gt;tcerl&lt;/a&gt;, however, I couldn&amp;#8217;t make it work: even after fixing the C so that it compiles (I hit &lt;a href=&quot;http://code.google.com/p/tcerl/issues/detail?id=5&quot;&gt;this bug&lt;/a&gt;), I still couldn&amp;#8217;t make it work. Inspecting the code, I get the feeling it&amp;#8217;s bit-rotted - the Tokyo Cabinet API has moved on, and tcerl hasn&amp;#8217;t kept up.&lt;/p&gt;

&lt;p&gt;The other issue with tcerl is that it&amp;#8217;s not a &lt;em&gt;linked-in driver&lt;/em&gt;. Erlang allows two different types of drivers: the first are external C programs &amp;#8212; these have a &lt;code&gt;main()&lt;/code&gt; and run in their own process. Communication is done by stdin/stdout. These are a bit safer because if they crash they don&amp;#8217;t take out the Erlang VM, but they&amp;#8217;re never going to be blazingly fast. Toke, on the other hand, is a fully linked-in driver. It dynamically links with the Erlang VM, exists in the same address space and goes as fast as it possibly can (using the Erlang driver callbacks which avoid all copying of data passed from the Erlang). My tests show it&amp;#8217;s about three times slower driving Tokyo Cabinet from Erlang via Toke, than driving it natively through C (which is quite good: some googling suggests both the Ruby and Python bindings to Tokyo Cabinet are rather slower). Toke is also about twice as slow as the Erlang &lt;a href=&quot;http://erlang.org/doc/man/ets.html&quot;&gt;ets&lt;/a&gt; module, which is in-memory only.&lt;/p&gt;

&lt;p&gt;Toke only implements the Tokyo Cabinet hash table (tchdb*) functions, and doesn&amp;#8217;t even support all of those: I only wrapped exactly what I needed. You&amp;#8217;ll want to read the &lt;a href=&quot;http://1978th.net/tokyocabinet/spex-en.html#tchdbapi&quot;&gt;documentation&lt;/a&gt; for Tokyo Cabinet for these. The functions implemented are as follows (refer to the Tokyo Cabinet documentation to explain these further):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toke_drv:new/1 &amp;#8212; Set up the driver with a new TCHDB object.&lt;/li&gt;
&lt;li&gt;toke_drv:delete/1 &amp;#8212; Destroy the driver&amp;#8217;s TCHDB object.&lt;/li&gt;
&lt;li&gt;toke_drv:tune/5 &amp;#8212; Tune the driver&amp;#8217;s TCHDB Object.&lt;/li&gt;
&lt;li&gt;toke_drv:set_cache/2 &amp;#8212; Set the number of records to cache.&lt;/li&gt;
&lt;li&gt;toke_drv:set_xm_size/2 &amp;#8212; Set the extra amount of memory mapped in.&lt;/li&gt;
&lt;li&gt;toke_drv:set_df_unit/2 &amp;#8212; Set the steps between auto defrag.&lt;/li&gt;
&lt;li&gt;toke_drv:open/3 &amp;#8212; Open a db.&lt;/li&gt;
&lt;li&gt;toke_drv:close/1 &amp;#8212; Close an open db.&lt;/li&gt;
&lt;li&gt;toke_drv:insert/3 &amp;#8212; Insert. If the key already exists, value is updated.&lt;/li&gt;
&lt;li&gt;toke_drv:insert_new/3 &amp;#8212; Insert new. If the key already exists, the old value is silently kept.&lt;/li&gt;
&lt;li&gt;toke_drv:insert_concat/3 &amp;#8212; Concatenate the supplied value with an existing value for this key.&lt;/li&gt;
&lt;li&gt;toke_drv:insert_async/3 &amp;#8212; Asynchronously insert. If the key already exists, value is updated.&lt;/li&gt;
&lt;li&gt;toke_drv:delete/2 &amp;#8212; Delete a key from the db.&lt;/li&gt;
&lt;li&gt;toke_drv:get/2 &amp;#8212;  Fetch a key from the db. Returns &amp;#8216;not_found&amp;#8217; on occasion.&lt;/li&gt;
&lt;li&gt;toke_drv:fold/3 &amp;#8212; Fold over every value in the db. This internally uses the iteration functions. It&amp;#8217;s just wrapped up as a fold to make it appear more functional.&lt;/li&gt;
&lt;li&gt;toke_drv:stop/1 &amp;#8212; Stop the driver and close the port.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should be able to use Mercurial to clone it:&lt;/p&gt;

&lt;pre&gt;# hg clone http://hg.opensource.lshift.net/toke/&lt;/pre&gt;
Make sure you have Tokyo Cabinet installed (ideally from source. If you&amp;#8217;re using a package, make sure you have the development headers available. If you do compile from source, make sure you &lt;code&gt;ldconfig&lt;/code&gt; to make your system pick up the new library once it&amp;#8217;s installed.). Then it should just be a case of &lt;code&gt;make&lt;/code&gt;. There&amp;#8217;s also a &lt;code&gt;make run&lt;/code&gt; target that starts up an Erlang shell with the paths set up correctly for testing Toke:

&lt;pre&gt;toke# make run
erl -pa ebin +K true +A30
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:30] [hipe] [kernel-poll:true]

Eshell V5.7.4  (abort with ^G)
1&gt; toke_test:test().
passed
2&gt;
&lt;/pre&gt;

&lt;p&gt;Toke is licensed under the MPL. As ever, feedback is very welcome, as are patches!&lt;/p&gt;</description>
	<pubDate>Mon, 21 Dec 2009 17:01:01 +0000</pubDate>
</item>
<item>
	<title>RedHotErlang: Websockets and Yaws</title>
	<guid>http://www.redhoterlang.com/web/de26edeba45fcb3453b604ed7f4b1127</guid>
	<link>http://www.redhoterlang.com/web/plink?id=de26edeba45fcb3453b604ed7f4b1127</link>
	<description>&amp;lt;p&amp;gt;For years I've wanted to start tech blogging, however not having my own RSS/blogging software always put me off. After all, what lame webserver hacker am I, blogging on someone elses RSS software. Now, &amp;lt;br /&amp;gt;
finally my friend Tobbe Tornquist did ...</description>
	<pubDate>Fri, 18 Dec 2009 22:17:31 +0000</pubDate>
</item>

</channel>
</rss>
