<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <channel>
    <title>Planet Erlang</title>
    <link>http://www.planeterlang.org/en/planet/planet</link>
    <description></description>
    <dc:language>en</dc:language>
    <dc:creator>Planet Erlang</dc:creator>
    <dc:rights>Copyright 2013</dc:rights>
    <dc:date>2013-05-23T19:00:33+00:00</dc:date>
    <admin:generatorAgent rdf:resource="http://www.expressionengine.com/" />
    

    <item>
      <title>MongooseIM 1.2. has been released</title>
      <link>http://www.planeterlang.org/en/planet/article/MongooseIM_1.2._has_been_released/</link>
      <guid>http://www.planeterlang.org/en/planet/article/MongooseIM_1.2._has_been_released/</guid>
      <author></author>
      <description><![CDATA[<p>MongooseIM 1.2. is a new version of MongooseIM 1.1. - a robust, reliable XMPP server capable of running on big clusters. It is now available to be downloaded.
</p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-05-23T19:00:33+00:00</dc:date>
    </item>

    <item>
      <title>Golang and C++ Developer at Triggit (Full&#45;time)</title>
      <link>http://www.planeterlang.org/en/planet/article/Golang_and_C_Developer_at_Triggit_Full-time/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Golang_and_C_Developer_at_Triggit_Full-time/</guid>
      <author></author>
      <description><![CDATA[<p>What you&#039;ll do all day: </p>

<ul>
<li>Help grow the Triggit ad serving
platform which currently handles
hundreds of thousands of requests per
seconds. Almost all requests require
complex decision making with large
sets of sparse data and must be
returned within tens of milliseconds</li>
<li>Work on our next generation
infrastructure components in Golang</li>
<li>Knowledge of a modern scripting
language like Python or Ruby</li>
<li>Work with infrastructure components
(ZeroMQ, Postgres, Cassandra)</li>
<li>Contribute business logic to big data
projects</li>
<li>Work with a dynamic team on a variety
of projects and new product features</li>
</ul>

<p>Requirements:</p>

<ul>
<li>Experience programming in Golang either for fun or through producing production code. </li>
<li>Must be open to learning new<br />
programming languages (polyglot<br />
programmer or desire to become one)</li>
<li>3-5 professional work experience</li>
<li>Elegant programming style and ability
to be an individual contributor</li>
<li>Very solid understanding of RDBMS (we
use Postgres), SQL, and database
normalization.</li>
<li>Strong Unix fundamentals and thorough
understanding of HTTP and all its
intricacies.</li>
<li>A detail-oriented approach to
development and an interest in
developing new skills</li>
<li>Able to work in our San Francisco HQ</li>
</ul>

<p>Either apply here or feel free to email Joanne(at)triggit.com with your resume and any past projects/open source stuff that you feel is a good representation of your work.</p>
<p>Get information on <a href="http://functionaljobs.com/jobs/147-golang-and-c-developer-at-triggit">how to apply</a> for this position.</p> 
]]>
</description>
      <dc:subject>Jobs</dc:subject>
      <dc:date>2013-05-21T04:31:27+00:00</dc:date>
    </item>

    <item>
      <title>Robert Virding teaches OTP Express Course on  10&#45;13 June 2013</title>
      <link>http://www.planeterlang.org/en/planet/article/Robert_Virding_teaches_OTP_Express_Course_on_10-13_June_2013/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Robert_Virding_teaches_OTP_Express_Course_on_10-13_June_2013/</guid>
      <author></author>
      <description><![CDATA[<p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">As a co-inventor of Erlang, Robert Virding is probably one of the best persons in the world to teach you all you need to know about Behaviours. It&#8217;s a bit like getting piano lessons from Bach.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">So we&#8217;re extremly thrilled to announce that this year Robert Virding will be teaching this year&#8217;s OTP Express course starting on 10 June. What will you learn?</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&bull; Use existing Design Patterns supported by Erlang and OTP.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&bull; Apply Generic Behaviours, Finite State Machines and Event handler Patterns.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&bull; Use the Supervisor and Application Behaviours Patterns.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&bull; Write your own Design Patterns.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">&bull; Structure large Erlang based systems.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">Hurry up and register here</div>
<p>As a co-inventor of Erlang, <a href="/conference/ErlangUserConference2013/speakers/RobertVirding">Robert Virding</a> is probably one of the best persons in the world to teach you all you need to know about Behaviours. It&#8217;s a bit like getting piano lessons from Bach.</p>
<p>So we&#8217;re extremly thrilled to announce that this year Robert Virding will be teaching this year&#8217;s <a href="/conference/ErlangUserConference2013/university/OTPExpress">OTP Express</a> course starting on 10 June. What will you learn?</p>
<p>&bull; Use existing Design Patterns supported by Erlang and OTP.</p>
<p>&bull; Apply Generic Behaviours, Finite State Machines and Event handler Patterns.</p>
<p>&bull; Use the Supervisor and Application Behaviours Patterns.</p>
<p>&bull; Write your own Design Patterns.</p>
<p>&bull; Structure large Erlang based systems.</p>
<p>To register for the course, go <a href="/conference/ErlangUserConference2013/register">here</a></p>
</p>
<p><span style="color: #1c1812; font-family: Tahoma; font-size: 12px;"><span style="color: #1c1812; font-family: Tahoma; font-size: 12px;"><br /></span></span></p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-05-20T13:32:02+00:00</dc:date>
    </item>

    <item>
      <title>Stumbling Into the Cold Expanse of Real Programming</title>
      <link>http://www.planeterlang.org/en/planet/article/Stumbling_Into_the_Cold_Expanse_of_Real_Programming/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Stumbling_Into_the_Cold_Expanse_of_Real_Programming/</guid>
      <author>James Hague</author>
      <description><![CDATA[<p>This is going to look like I&#8217;m wallowing in <a href="http://prog21.dadgum.com/102.html">nostalgia</a>, but that&#8217;s not my intent. Or maybe it is. I started writing this without a final destination in mind. It begins with a question:<br />
<br></br><br></br>How did fast action games exist at all on 8-bit systems?<br />
<br></br><br></br>Those were the days of processors living below the 2 MHz threshold, with each instruction run to completion before even considering the next. No floating point math. Barely any integer math, come to think of it: no multiplication or division and sums of more than 255 required two additions.<br />
<br></br><br></br>But that kind of lively statistic slinging doesn&#8217;t tell the whole story or else there wouldn&#8217;t have been so many animated games running&#8212;usually at sixty frames-per-second&#8212;on what appears to be incapable hardware. I can&#8217;t speak to all the systems that were available, but I can talk about the Atari 800 I learned to program on.<br />
<br></br><br></br>Most games didn&#8217;t use memory-intensive bitmaps, but a gridded character mode. The graphics processor converted each byte to a character glyph as the display was scanned out. By default these glyphs looked like ASCII characters, but you could change them to whatever you wanted, so the display could be mazes or platforms or a landscape, and with multiple colors per character, too. Modify one of the character definitions and all the references to it would be drawn differently next frame, no CPU work involved.<br />
<br></br><br></br>Each row of characters could be pixel-shifted horizontally or vertically via two memory-mapped hardware registers, so you could smoothly scroll through levels without moving any data.<br />
<br></br><br></br>Sprites, which were admittedly only a single color each, were merged with the tiled background as the video chip scanned out the frame. Nothing was ever drawn to a buffer, so nothing needed to be erased. The compositing happened as the image was sent to the monitor. A sprite could be moved by poking values in position registers.<br />
<br></br><br></br>The on-the-fly compositing also checked for overlap between sprites and background pixels, setting bits to indicate collisions. There was no need for even simple rectangle intersection tests in code, given pixel-perfect collision detection at the video processing level.<br />
<br></br><br></br>What I never realized when working with all of these wonderful capabilities, was that to a large extent I was merely scripting the hardware. The one sound and two video processors were doing the heavy lifting: flashing colors, drawing characters, positioning sprites, and reporting collisions. It was more than visuals and audio; I didn&#8217;t even think about where random numbers came from. Well, that&#8217;s not true: I know they came from reading memory location 53770 (it was a pseudo-random number generator that updated every cycle).<br />
<br></br><br></br>When I moved to newer systems I found I wasn&#8217;t nearly the hotshot game coder I thought I was. I had taken for granted all the work that the dedicated hardware handled, allowing me to experiment with game design ideas.<br />
<br></br><br></br>On a pre-Windows PC of the early 1990s, I had to write my own sprite-drawing routines. Real ones, involving actual drawing and erasing. Clipping at the screen edges? There&#8217;s something I never thought about. The Atari hardware silently took care of that. But before I could draw anything, I had to figure out what data format to use and how to preprocess source images into that format. I couldn&#8217;t start a tone playing with two register settings; I had to write arcane sound mixing routines.<br />
<br></br><br></br>I had wandered out of the comfortable realm where I could design games in my head and make them play out on a TV at my parents&#8217; house and stumbled into the cold expanse of real programming.<br />
<br></br><br></br>(If you liked this, you might enjoy <a href="http://prog21.dadgum.com/45.html">A Personal History of Compilation Speed</a>.)
</p> 
]]>
</description>
      <dc:subject>Blogs, Programming in the 21st Century</dc:subject>
      <dc:date>2013-05-19T08:00:00+00:00</dc:date>
    </item>

    <item>
      <title>Erlang User of the Year 2013: Nominate your favourite until 17 May!</title>
      <link>http://www.planeterlang.org/en/planet/article/Erlang_User_of_the_Year_2013_Nominate_your_favourite_until_17_May/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Erlang_User_of_the_Year_2013_Nominate_your_favourite_until_17_May/</guid>
      <author></author>
      <description><![CDATA[<p><span style="font-size: small;">As every year, at EUC 2013 the Erlang community will reward one Erlang user whose contribution to the development of the Erlang language has been outstanding. You are invited to submit your proposed names with a short motivation until 17 May&nbsp;<a href="https://docs.google.com/forms/d/1vc9PhhNDMxGXUKLtL6OeHbPndajG35EBF27mNpbzHVA/viewform"><strong>here</strong></a>.<br style="font-family: monospace; font-size: medium;" /><br style="font-family: monospace; font-size: medium;" />Nominations will be analised by a panel headed by Bjarne D&auml;cker and composed of five&nbsp;members: Joe Armstrong, Robert Virding, Kenneth Lundin - head of the Ericsson Erlang/OTP team, Dave Smith - winner of the 2011 award &nbsp;and Fred Hebert - winner of the 2012 award.&nbsp;</span></p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-05-14T13:00:39+00:00</dc:date>
    </item>

    <item>
      <title>Test Engineer at Klarna (Full&#45;time)</title>
      <link>http://www.planeterlang.org/en/planet/article/Test_Engineer_at_Klarna_Full-time/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Test_Engineer_at_Klarna_Full-time/</guid>
      <author></author>
      <description><![CDATA[<p><strong>For us QA</strong> should be part of the entire development process, from concept to execution. We believe in agile methodologies and believe that to be able to build largescale, world class systems we need to focus on the users, their needs and how we can make sure that we deliver what they want. Now we are looking for Test Engineers that share our view on how to do QA in product development. As a Test Engineer, you will be part of creating a world class agile software development organisation where QA is at the center. We are not there today, but that is of course just another challenge.</p>

<p><strong>As a Test Engineer</strong> you are part of an agile development team that consists of around 5-8 members. You work closely to the developers and will develop the ways you work with testing within your team. The developers do unit tests and you will mostly focus on white-box testing but also some black-box testing. The test Engineer also creates tools and test frameworks when needed to be used inside the team.</p>

<p><strong>We believe</strong> that you should automate what can be automated. This means that your mission is to implement test cases, automate tests and make sure we deliver in accordance to our high demands. Since we are forming our future test organisation it is a great opportunity to help setting up and develop our ways of testing. Make your ideas be part of our overall plan. </p>

<p><strong>Requirements:</strong></p>

<ul>
<li>Degree in Computer science or similar degree with focus on programming</li>
<li>3+ Years of experience in testing in medium- or largescale software development</li>
<li>Experience of agile software development (TDD / Scrum / Kanban)</li>
<li>Broad skills in programming (preferably functional programming such as Erlang, Lisp, Scala, Scheme, F#, Haskell etc)</li>
<li>Great skills in automation and scripting (Perl, Bash, Python etc)</li>
<li>Broad experience in white-box testing frameworks such as xUnit</li>
</ul>

<p><strong>Preferred skills:</strong></p>

<ul>
<li>ISTQB-certificate (or ISEB, CSTE)</li>
<li>Experience of BDD, Behaviour-driven Development, or ATDD, Acceptance Test Driven Development</li>
<li>Experience in different higher level testing frameworks (Selenium, Cucumber etc)</li>
</ul>

<p><strong>We offer you</strong> an international working environment filled with smart and ambitious colleagues. As an employee at one of Sweden&rsquo;s fastest growing companies, you will play an important role in taking Klarna to the next level. You won&rsquo;t work for Klarna, you&rsquo;ll work with Klarna.‬</p>

<p><strong>For questions</strong> please contact Philip Andr&eacute;n at <span class="spam-protect"><span class="user">philip [dot] andren</span> [at] <span class="host">klarna [dot] com</span></span> or +46 (0) 76-526 00 70. We recommend you to apply as soon as possible, selection and interviews are held continuously.&nbsp; </p>

<p><strong>Location</strong>
Stockholm, Sweden</p>
<p>Get information on <a href="http://functionaljobs.com/jobs/146-test-engineer-at-klarna">how to apply</a> for this position.</p> 
]]>
</description>
      <dc:subject>Jobs</dc:subject>
      <dc:date>2013-05-14T10:10:39+00:00</dc:date>
    </item>

    <item>
      <title>Senior Developer &#45; Erlang at Klarna (Full&#45;time)</title>
      <link>http://www.planeterlang.org/en/planet/article/Senior_Developer_-_Erlang_at_Klarna_Full-time2/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Senior_Developer_-_Erlang_at_Klarna_Full-time2/</guid>
      <author></author>
      <description><![CDATA[<p><strong>Klarna is</strong> one of the biggest Erlang shops in the world. Not many businesses use Erlang in the scale that we do and over the years we have become really good at pushing this programming language to new levels. In our Engineering division we have around 100 Erlang developers whose combined knowledge stretches from the foundation of the Erlang Run-time System to high level architecture. By combining Erlang, RIAK, RabbitMQ we are building a multi-node, no-master system that can handle our exponential growth.</p>

<p><strong>Your job</strong> as a senior developer is to take part in the entire development process, from gathering requirements to delivery. The challenge is to provide solutions that scale. The team members have a high technical level and are expected to work independently within the team to solve complex problems, from analyzing the problem to designing, planning and implementing the solutions. </p>

<p><strong>We strive</strong> to always select an appropriate tool for solving the particular problem at hand. In order to achieve this we aim to have a diverse palette of skills in every team. Thus, it is not vital that you have previous experience with the specific tools that we are already using, because in our eyes, a great developer will always be a great developer.</p>

<p><strong>Required Qualifications</strong></p>

<ul>
<li>10 years of development experience with a proven track record of high quality software development </li>
<li>MSc in Computer Science or equivalent</li>
<li>Experience from agile methodologies (Scrum, Kanban etc) </li>
<li>Knowledge in many different domains and programming
paradigms </li>
<li>Deep understanding of algorithms, data structures and complexity up to and beyond programming language implementation and semantics </li>
<li>Value and know the power of testing and TDD</li>
</ul>

<p><strong>You&#8230;</strong></p>

<ul>
<li>value learning and solving problems together with your team mates.</li>
<li>know the power of automation and avoid repeated manual work.</li>
<li>know the value of and practice reviews relentlessly.</li>
<li>write code only when necessary.</li>
<li>have a rubber duck.</li>
</ul>

<p><strong>If you have</strong> any question please email or call Philip Andr&eacute;n at: <span class="spam-protect"><span class="user">philip [dot] andren</span> [at] <span class="host">klarna [dot] com</span></span> or +46 765 26 00 70. </p>

<p><strong>Location</strong>
Stockholm, Sweden</p>
<p>Get information on <a href="http://functionaljobs.com/jobs/145-senior-developer-erlang-at-klarna">how to apply</a> for this position.</p> 
]]>
</description>
      <dc:subject>Jobs</dc:subject>
      <dc:date>2013-05-13T18:10:41+00:00</dc:date>
    </item>

    <item>
      <title>A Short Quiz About Language Design</title>
      <link>http://www.planeterlang.org/en/planet/article/A_Short_Quiz_About_Language_Design/</link>
      <guid>http://www.planeterlang.org/en/planet/article/A_Short_Quiz_About_Language_Design/</guid>
      <author>James Hague</author>
      <description><![CDATA[<p>Suppose you&#8217;re designing a programming language. What syntax would you use for a string constant? This isn&#8217;t a trick; it&#8217;s as simple as that. If you want to print <code>Hello World</code> then how do you specify a basic string like that in your language?<br />
<br></br><br></br>I&#8217;ll give you a moment to think about it.<br />
<br></br><br></br>The obvious solution is to use quotes: <code>&#8220;Hello World&#8221;</code>. After all, that&#8217;s how it works in English, so it&#8217;s easy to explain to new students of your language. But then someone is going to ask &#8220;What if I want to put a quotation mark <i>inside</i> a string? That&#8217;s a legitimate question, because it&#8217;s easy to imagine displaying a string like:
</p><pre>"April 2013" could not be found.
</pre><p>There are a couple of options to fix this. Some form of escape character is one, so an embedded quote is preceded by, say, a backslash. That works, but now you&#8217;ve got to explain a second concept in order to explain strings. Another option is to allow both single and double quotes. If your string contains single quotes, enclose it in double quotes, and vice-versa. A hand goes up, and someone asks about how to enter this string:
</p><pre>"April 2013" can't be found.
</pre><p>Ugh. Now you have two kinds of string delimiters, and you still need escapes. You need to explain these special cases up front, because they&#8217;re so easy to hit.<br />
<br></br><br></br>What if instead falling back on the unwritten rule of using single and double quotes, strings were demarcated by something less traditional? Something that&#8217;s not common in Latin-derived languages? I&#8217;ll suggest a vertical bar:
</p><pre>|"April 2013" can't be found.|
</pre><p>That may be uncomfortable at first glance, but give it a moment. Sure, a vertical bar will end up in a string at some point&#8212;regular expressions with alternation come to mind&#8212;but the exceptional cases are no longer blatant and nagging, and you could get through a beginning class without even mentioning them.<br />
<br></br><br></br>(If you liked this, you might enjoy <a href="http://prog21.dadgum.com/73.html">Explaining Functional Programming to Eight-Year-Olds</a>.)
</p> 
]]>
</description>
      <dc:subject>Blogs, Programming in the 21st Century</dc:subject>
      <dc:date>2013-05-11T08:00:00+00:00</dc:date>
    </item>

    <item>
      <title>Implementation of &#8220;Don&#8217;t Lose Your ets Tables&#8221;</title>
      <link>http://www.planeterlang.org/en/planet/article/Implementation_of_Dont_Lose_Your_ets_Tables/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Implementation_of_Dont_Lose_Your_ets_Tables/</guid>
      <author>steve</author>
      <description><![CDATA[<p>A couple years ago I wrote about <a rel="nofollow">how to avoid losing your <code>ets</code> tables</a> if the Erlang processes that own those tables crash. The original post resulted from accidentally losing an <a rel="nofollow" target="_blank" href="http://www.erlang.org/doc/man/ets.html"><code>ets</code> table</a> full of video subscriber data during a debug session on a live customer production site. Oops.</p>
<p>If you&#8217;re looking for some code that implements what that post describes, look no further than <a rel="nofollow" target="_blank" href="https://github.com/DeadZen">DeadZen</a>&#8216;s <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive"><code>etsgive</code></a> repository. DeadZen is a very experienced Erlang developer, so it&#8217;s no surprise that his example code is straightforward and clean.</p>
<p>Just as described in my post, DeadZen&#8217;s <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_sup.erl">supervisor code</a> starts two workers, one that manages the table and one that uses it. The <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl">table manager</a> process takes the following steps:</p>
<ol>
<li><a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L53">traps exits</a></li>
<li><a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L87">links to the table user worker process</a> (the supervisor starts the table user worker first)</li>
<li><a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L88">creates the <code>ets</code> table</a></li>
<li><a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L90">sets itself as the table heir process</a></li>
<li><a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L91">gives ownership of the table away to the table user worker process</a></li>
</ol>
<p>The <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_srv.erl">table user worker process</a> first <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_srv.erl#L115">handles the transfer message</a> resulting from the manager giving it ownership of the table. Once it becomes the owner, it can handle a call to <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_srv.erl#L93">increment a counter in the table</a> and a <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_srv.erl#L98">call to check the table contents</a>. It can also <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_srv.erl#L90">handle a call to die</a>, which you would issue interactively from an Erlang shell to exercise the code. This causes the worker process to die, which means the table manager regains ownership of the table because it&#8217;s the table&#8217;s heir. The table manager then <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L118">waits for the supervisor to start a a new table user worker process</a>, and once it&#8217;s up and running, the <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L114">manager links to it</a> and then <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive/blob/master/src/etsgive_mgr.erl#L115">transfers table ownership to it</a>.</p>
<p>This written description might be difficult to work through, but fear not, <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive#example-session">DeadZen also supplies an example Erlang shell session showing how it all works</a>. Clone his <a rel="nofollow" target="_blank" href="https://github.com/DeadZen/etsgive">repository</a> and try it out for yourself!</p> 
]]>
</description>
      <dc:subject>Blogs, Steve Vinoski</dc:subject>
      <dc:date>2013-05-09T05:00:44+00:00</dc:date>
    </item>

    <item>
      <title>Dynamo Sure Works Hard</title>
      <link>http://www.planeterlang.org/en/planet/article/Dynamo_Sure_Works_Hard/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Dynamo_Sure_Works_Hard/</guid>
      <author>Damien Katz</author>
      <description><![CDATA[<p>We tend to think of working hard as a good thing. We value a strong work ethic and determination is the face of adversity. But if you are working harder than you should to get the same results, then it&#8217;s not a virtue, it&#8217;s a waste of time and energy. If it&#8217;s your business systems that are working harder than they should, it&#8217;s a waste of your IT budget.</p>

<p>Dynamo based systems work too hard. SimpleDB/DynamoDB, Riak, Cassandra and Voldemort are all based, at least in part, on the design first described publicly in the <a href="http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf">Amazon Dynamo Paper</a>. It has some very interesting concepts, but ultimately fails to provide a good balance of reliability, performance and cost. It&#8217;s pretty neat in that each transaction allows you dial in the levels of redundancy and consistency to trade off performance and efficiency. It can be pretty fast and efficient if you don&#8217;t need any consistency, but ultimately the more consistency you want the more have to pay for it via a lot of extra work.</p>

<p><b>Network Partitions are Rare, Server Failures are Not</b></p>

<blockquote><div><p>... it is well known that when dealing with the possibility of network failures, strong consistency and high data availability cannot be achieved simultaneously. As such systems and applications need to be aware which properties can be achieved under which conditions.
</p><p>
For systems prone to server and network failures, availability can be increased by using optimistic replication techniques, where changes are allowed to propagate to replicas in the background, and concurrent, disconnected work is tolerated. The challenge with this approach is that it can lead to conflicting changes which must be detected and resolved. This process of conflict resolution introduces two problems: when to resolve them and who resolves them. Dynamo is designed to be an eventually consistent data store; that is all  updates reach all replicas eventually.
<p>
- Amazon Dynamo Paper </div></blockquote>

<p>The Dynamo system is a design that treats the probability of a network switch failure as having the same probability of machine failure, and pays the cost with every single read. This is madness. Expensive madness.</p>

<p>Within a datacenter, the Mean Time To Failure (MTTF) for a network switch is one to two orders of magnitude higher than servers, depending on the quality of the switch. This is according to data from Google about datacenter server failures, and the publish numbers of the MTBF of Cisco switches (There is a subtle difference between MTBF and MTTF, but for our purposes we can treat them the same)</p>

<p>It is claimed that when W + R > N you can get consistency. But it&#8217;s not true, because without distributed ACID transactions, it&#8217;s never possible to achieve W > 1 atomically.</p>

<p>Consider W=3, R=1 and N=3. If a network failure or more likely a client/app tier failure (hardware, OS or process crash) happens during the writing of data, it&#8217;s possible for only replica A to receive the write, with a lag until the cluster notices and syncs up. Then another client with R = 1 can do two consecutive reads, getting newer data first from a node A, and older data next from node B for the same key. But you don&#8217;t even need a failure or crash, once the first write occurs there is always a lag for the next server(s) to receive the write. It&#8217;s possible for a fast client to do the same read 2 times again, getting a newer version from one server, then an older version from another.</p>

<p>What is true is that if R > N / 2, then you get consistency where it&#8217;s not possible to read in a newer value, then a subsequent read get&#8217;s an older value.</p>

<p>For the vast majority of applications, it&#8217;s okay for a failure leading to temporary unavailability. Amazon believes it&#8217;s shopping cart is so important to capture writes it&#8217;s worth the cost of quorum reads, or inconsistency. Perhaps. But the problems and costs multiply. If you are doing extra reads to achieve high consistency, then you are putting extra load on each machine, requiring extra server hardware and extra networking infrastructure to provide the same baseline performance. All of this can increase the frequency of a component failure and increases operational costs (hardware, power, rack space and the personnel to maintain it all).</p>

<p><b>A Better Way?</b></p>

<p>What if a document had 1 master and N replicas to write to, but only a single master to read from? Clients know based on the document key and topology map which machine serves as the master. That would make the reads far cheaper and faster. All reads and writes for a document go to the same master, with writes replicated to replicas (which also serve as masters for other documents, each machine is both a master and replica).</p>

<p>But, you might ask, how do I achieve strong consistency if the master goes down or becomes unresponsive?</p>

<p>If when that happens, the cluster also notices the machine is unresponsive or too slow and removes it out of the cluster and fails over to a new master. Then the client tries again and has a successful read.</p>

<p>But, you might ask, what if the client asks the wrong server for a read?</p>

<p>If all machines in the cluster know their role and only one machine in the cluster can be a document master at any time, and the cluster manager (a regular server node elected by Paxos consensus) makes sure to remove the old master, and then assign the new master, and then tell the client about the new topology. Then the client updates it&#8217;s topology map, and retries at the new master.</p>

<p>But, you might ask, what if the topology has changed again, and the client again asks to read from the wrong server?</p>

<p>Then this wrong server will let the client know. The client will reload the topology maps, and re-request from the right server. If the right master server isn&#8217;t really right any more because of another topology change, it will reload and retry again. It will do this as many times as necessary, but typically it happens only once.</p>

<p>But, you might ask, what if there is a network partition, and the client is on the wrong (minor) side of the partition, and reads from a master server that doesn&#8217;t know it&#8217;s not a master server anymore?</p>

<p>Then it gets a stale read. But only for a little while, until the server itself realizes it&#8217;s no longer in heartbeat contact with the majority of the cluster. And partitions like this are the among the rarest form a cluster failure. It will require a network failure, and for the client to be on the wrong side of the partition.</p>

<p>But, you might ask, what if there is a network partition, and the client is on the wrong (smaller) side of the partition, and WRITES to a server that doesn&#8217;t know it&#8217;s not a master server anymore?</p>

<p>Then the write is lost. But if the client wanted true multi-node durability, then the write wouldn&#8217;t have succeeded (the client would timeout waiting for replicas(s) to receive the update) and the client wouldn&#8217;t unknowingly lose data.</p>

<p>What I&#8217;m describing is the <a href="http://couchbase.com">Couchbase</a> clustering system.</p>

<p><b>Let&#8217;s Run Some Numbers</b></p>

<p>Given the MTTF of a server, how much hardware and how quickly must the cluster failover to a new master and still meet our SLAs requirements vs a Dynamo based system?</p>

<p>Let&#8217;s start with some assumptions:</p>

<p>We want to achieve 4000 transactions/sec with 3 node replication factor. Our load mix is 75% reads/25% writes.</p>

<p>We want to have some consistency, so that we don&#8217;t read newer values, then older values, so for Dynamo:<br />
 <br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>R = 2, W = 2, N = 3</code><br />
 <br />
But for Couchbase:<br />
 <br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>R = 1, W = 1, N = 3</code></p>

<p>This means for a Dynamo style cluster, the load will be:<br />
Read transactions/sec: 9000 reads (reads spread over 3 nodes)<br />
Write transactions/sec: 3000 writes (writes spread over 3 nodes)</p>

<p>This means for a Couchbase style cluster, the load will be:<br />
Read transactions/sec: 3000 reads (each document read only on 1 master node, but all document masters evenly spread across 3 nodes)<br />
Write transaction/sec: 3000 writes (writes spread over 3 nodes)</p>

<p>Let&#8217;s assume both systems are equally as reliable at the machine level. Google&#8217;s research indicates in their datacenter each server has a MTTF of 3141 hrs or 2.7 failures per year. Google also reports a rack failure (usually power supply) of 10.2 years, roughly 30x a reliable as a server, so we&#8217;ll ignore that to make the analysis simpler. (This is from Googles paper studying server failures <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/36737.pdf">here</a>)</p>

<p>The MTBF of Cisco network switch is published at 54,229 hrs on the low end, to 1,023,027 hrs on the high end. For our purposes, we&#8217;ll ignore switch failures, since the failures affects availability and consistency of both system about the same, and it&#8217;s 1 to 2 orders of magnitude rarer than a server failure. (This is from a Cisco product spreadsheet <a href="https://supportforums.cisco.com/servlet/JiveServlet/downloadBody/10498-102-2-23736/SBBU Switch features HW_com.xls">here</a>)</p>

<p>Assume we want to meet a latency SLA 99.9% of the time (the actual latency SLA threshold number doesn&#8217;t matter here).</p>

<p>On Dynamo, that means each node can fail SLA the 1.837% of the time. Because it queries 3 nodes, but only uses the values from the first 2 nodes and the chances of SLA failure are the same across nodes, the formula is different (only two must meet the SLA):</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;<code>0.0001 = (3 − 2 * P) * P ^ 2</code></p>

<p>or:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;<code>P = 0.001837</code></p>

<p>On Couchbase, if a master node fails, it must recognize it and fail it out. Given Google&#8217;s MTTF failure above and it can fail out a node in 30 secs, and let&#8217;s say it will take 4.5 minutes for it warm up the RAM cache, given 2.7 failures/year with 5 minutes of downtime for each before a failover completes, then queries will fail 0.00095% of time due to node failure.</p>

<p>For Couchbase meet the same SLA:</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;<code>0.0001 = P(SlaFail) + P(NodeFail) - (P(SlaFail) * P(NodeFail))</code></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;<code>0.0001 = P(SlaFail) + 0.0000095 - (P(SlaFail) * 0.0000095)</code></p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;<code>0.0001 ~= 0.00009 + 0.0000095 - (0.00009 * 0.0000095)</code></p>

<p>Note: Some things I&#8217;m omitting from the analysis are when a Dynamo node fails the lower latency requirement from meeting the SLA for 2 nodes vs. 3 (it would drop from 1.837% to ~0.05%), and also the increased work on the remaining servers when a Couchbase server fails. Both are only temporary and go away when a new server is added back and initialized in the cluster, and shouldn&#8217;t change the numbers significantly. Also there is the time to add in a new node and rebalance load on it. At Couchbase we work very hard to make that as fast and efficient as possible. I&#8217;ll assume Dynamo systems do the same, that the cost is the same and omit it, though I think we are the leaders in rebalance performance.</p>

<p>With this analysis, a Couchbase node can only fail it&#8217;s SLA 0.9% of the requests, and a Dynamo node can fail it 1.837%. Sounds good for Dynamo, but it must do for 2X the throughput per node on 3x the data, and with 2x the total network traffic. And for very low latency response times (our customers often want sub-millisecond latency) typically meeting the SLA means a DBMS must a large amount of relevant data and metadata in RAM, because there is a huge cost for random disk fetches on latency. With disk fetches 2 orders of magnitude slower on SSDs (100x), and 4 orders of magnitude slower on HDDs (10000x) the disk accesses pile up faster without much more RAM, so do the latencies.</p>

<p>So each Dynamo node can fail it&#8217;s SLA at a higher rate is very small win when it will still need to keep nearly 3X the working set ready in memory because each node will be serving 3x the data at all times for read requests (it can fail it&#8217;s SLA slightly more often, so it&#8217;s actually about 2.97x the necessary RAM), and will use 2x the network capacity.</p>

<p>Damn Dynamo, you sure do work hard!</p>

<p>Now Couchbase isn&#8217;t perfect either, far from it. Follow me on twitter <a href="http://twitter.com/damienkatz">@damienkatz</a>. I&#8217;ll be posting more about the Couchbase shortcomings and capabilities, and technical roadmap soon.</p> 
]]>
</description>
      <dc:subject>Blogs, Damien Katz</dc:subject>
      <dc:date>2013-05-03T19:06:48+00:00</dc:date>
    </item>

    <item>
      <title>&amp;quot;OpenFlow &#45; Bringing new levels of network control&amp;quot; webinar by Stu Bailey and Steve Robert</title>
      <link>http://www.planeterlang.org/en/planet/article/OpenFlow_-_Bringing_new_levels_of_network_control_webinar_by_Stu_Bailey_and/</link>
      <guid>http://www.planeterlang.org/en/planet/article/OpenFlow_-_Bringing_new_levels_of_network_control_webinar_by_Stu_Bailey_and/</guid>
      <author></author>
      <description><![CDATA[<p>Erlang Solutions invites you to join Stuart Bailey - CTO and Founder of Infoblox and Steve Roberts from Erlang Solutions for an insightful discussion about how you can solve your networking challenges using OpenFlow.
</p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-05-02T11:00:33+00:00</dc:date>
    </item>

    <item>
      <title>Senior Erlang Developer at SumUp Limited (Full&#45;time)</title>
      <link>http://www.planeterlang.org/en/planet/article/Senior_Erlang_Developer_at_SumUp_Limited_Full-time/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Senior_Erlang_Developer_at_SumUp_Limited_Full-time/</guid>
      <author></author>
      <description><![CDATA[<p><strong>About the Company</strong></p>

<p>Headquartered in Dublin and Berlin, SumUp is a dynamic and innovative start-up company developing cutting-edge mobile payment solutions. With a global workforce of over 130 young, energetic and dedicated staff, our product is set to revolutionalise the world of payment services. </p>

<p>The company offers an application and card reader that can turn any tablet or smart phone into a credit card terminal, which gives small merchants the ability to accept card payments as well as replace their expensive cash registers. SumUp enjoys impressive global reach that is ever expanding. We are currently operating in Ireland, UK, Germany, Austria, Italy, Spain, the Netherlands, France, Belgium and Portugal. </p>

<p>We are looking for vibrant, practical and resourceful future employees to join our great company.</p>

<p><strong>The Role</strong></p>

<ul>
<li>Develop quality solutions and features for the SumUp product in a timely manner.</li>
<li>Support SumUp production services and components.</li>
<li>Collaborate with team members in highly agile scrum teams to design, develop, test and deploy software projects.</li>
<li>Work to troubleshoot, analyse and code fixes for reported software issues.</li>
<li>Plan and size coding, testing and deployment tasks.</li>
<li>Bring an open-minded opinion about technology and processes to all technological discussions within the team; and be flexible in all team dealings.</li>
<li>Communicate and collaborate with colleagues outside of the Software Department to deliver value for Sumup.</li>
<li>Focus at all times on delivering the best user experience possible to SumUp customers and internal users.</li>
<li>Represent SumUp in a professional manner at external software community meetups.</li>
</ul>

<p><strong>IT Skill Set Required</strong></p>

<p><em>Essential</em></p>

<ul>
<li>5+ years programming experience in a product development environment.</li>
<li>Practical Erlang development experience &amp; good working knowledge Erlang-based libraries.</li>
<li>Experience in developing fault-tolerant distributed systems.</li>
<li>Experience with scaling systems to large numbers of concurrent users.</li>
<li>Flexibility and open-mindedness in using tools, technologies and new ideas.</li>
<li>Strong communication skills; capable of working closely and smoothly with team members to deliver business goals. Team cooperation is essential.</li>
<li>Commonsense and pragmatism in developing new features with a strong focus on delivering business value.</li>
</ul>

<p><em>Desirable</em></p>

<ul>
<li>Knowledge of other programming languages (Ruby Python, Objective-C, C++, etc.) a plus.</li>
<li>Familiarity with the mobile payments industry is desirable. Knowledge of EMV2 and PCI standards is a MAJOR plus.</li>
<li>A good working knowledge of SQL - it doesn&rsquo;t matter what flavour.</li>
<li>Some experience with NoSQL-type systems (Riak, MongoDB, &hellip;)</li>
<li>A good working knowledge of Linux/Unix (we use OS X for development)</li>
<li>A broad knowledge and interest in other technologies (e.g. JSON, Web servers, networking, etc.)</li>
<li>Experience in working in a team of developers in a flexible, agile environment.</li>
<li>An interest in open-source technologies &ndash; willingness to collaborate in team hackathons.</li>
<li>Experience in working in a startup environment would be an advantage.</li>
</ul>

<p><strong>General Skills profile</strong></p>

<ul>
<li>Excellent communication skills: ability to communicate clearly and concisely, both verbally and in writing.</li>
<li>Team working/interaction with others: strong team player and ability to interact with colleagues at all levels.</li>
<li>Accuracy: methodical and detail conscious with high standards of accuracy.</li>
<li>Strong analysis and problem solving ability: gather information and probe for facts. Weigh up options and produce practical and workable solutions within the overall defined architecture solution.</li>
<li>Planning and organisation: strong time management and organisational skills, ability to prioritise own tasks.</li>
<li>Good time management and ability to work to tight deadlines.</li>
<li>Target Driven to remain focused on goals even when under pressure and maintain effective work despite challenges.</li>
<li>Flexibility and openness to change: ability to react and adapt to changing priorities.</li>
<li>Enthusiastic, dedicated and willing to learn.</li>
<li>Conscientious with a &ldquo;can do&rdquo; attitude and proactive work ethic.</li>
</ul>
<p>Get information on <a href="http://functionaljobs.com/jobs/138-senior-erlang-developer-at-sumup-limited">how to apply</a> for this position.</p> 
]]>
</description>
      <dc:subject>Jobs</dc:subject>
      <dc:date>2013-05-01T16:01:15+00:00</dc:date>
    </item>

    <item>
      <title>The Erlang User Conference 2013: Building Massively Scalable Fault&#45;tolerant Systems</title>
      <link>http://www.planeterlang.org/en/planet/article/The_Erlang_User_Conference_2013_Building_Massively_Scalable_Fault-tolerant_/</link>
      <guid>http://www.planeterlang.org/en/planet/article/The_Erlang_User_Conference_2013_Building_Massively_Scalable_Fault-tolerant_/</guid>
      <author></author>
      <description><![CDATA[<p>Between the 13th and the 14th of June, the Erlang User Conference in Stockholm will be the best place in Europe to discuss computing hot-topics such as Multi-core, Big Data, Cloud, Embedded, NoSQL and the future of the Web.
</p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-04-30T11:00:08+00:00</dc:date>
    </item>

    <item>
      <title>Erlang Engineer working w/ billions of daily, real&#45;time auctions at AdRoll (Full&#45;time)</title>
      <link>http://www.planeterlang.org/en/planet/article/Erlang_Engineer_working_w_billions_of_daily_real-time_auctions_at_AdRoll_Fu/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Erlang_Engineer_working_w_billions_of_daily_real-time_auctions_at_AdRoll_Fu/</guid>
      <author></author>
      <description><![CDATA[<p>About Us:</p>

<p>AdRoll is an already profitable startup based in SOMA. We&rsquo;re backed by some of the savviest investors in the space, including Peter Thiel, Accel Partners, and Foundation Capital.</p>

<p>We were just named the #1 fastest growing in CA by Inc.</p>

<p>Team up with a colorful, but tight-knit engineering squad of a dozen. Code alongside our group which includes the youngest engineer ever at Microsoft (our CEO), a former World Champion of Street Fighter, the president of Python Italy, and more!</p>

<p>We run the retargeting platform with the largest customer base and swim in the complex, yet exciting new world of real-time advertising.</p>

<p>Our technology is continually pushing the boundaries. We run a global infrastructure that handles millions of requests, participates in billions of real-time auctions, crunches big data in real-time while serving thousands of happy advertisers.</p>

<p>About You:</p>

<p>Do you dream of writing code that will be seen by nearly everyone you know? Do you yearn to build a 100% cloud-deployed infrastructure that deftly scales to billions of daily requests and is capable of self-healing when trouble strikes? Join us in making this vision a reality.</p>

<p>For this key position, you must write solid code, understand complex systems, competently evaluate scalability trade-offs (eg, disk vs cpu vs memory), and quickly troubleshoot issues. You learn fast and are excited to dig into the latest technologies. Our stack includes Python, Erlang, RabbitMQ, PostgreSQL, HBase, Hadoop, Redis and our own open-sourced solutions.</p>

<p>More than anything, you do your best work when you have lots of freedom and can take ownership of your projects from concept to finish.</p>
<p>Get information on <a href="http://functionaljobs.com/jobs/135-erlang-engineer-working-w-billions-of-daily-real-time-auctions-at-adroll">how to apply</a> for this position.</p> 
]]>
</description>
      <dc:subject>Jobs</dc:subject>
      <dc:date>2013-04-27T00:31:21+00:00</dc:date>
    </item>

    <item>
      <title>Remembering a Failed Revolution</title>
      <link>http://www.planeterlang.org/en/planet/article/Remembering_a_Failed_Revolution/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Remembering_a_Failed_Revolution/</guid>
      <author>James Hague</author>
      <description><![CDATA[<p>Twenty-three years ago, a book by Edward Cohen called <a href="http://www.amazon.com/Programming-1990s-Introduction-Calculation-Monographs/dp/0387973826">Programming in the 1990s: An Introduction to the Calculation of Programs</a> was published. It was a glimpse into the sparkling software development world of the future, a time when ad hoc coding would be supplanted by Dijkstra-inspired manipulation of proofs. Heck, no need to even run the resulting programs, because they&#8217;re right by design.<br />
<br></br><br></br>Clearly Mr. Cohen&#8217;s vision did not come to pass, but I co-opted the title for this blog.<br />
<br></br><br></br>That book is a difficult read. It starts out as bright-eyed and enthusiastic as you could expect a computer science text to be, then rapidly turns into chapter-long slogs to prove the equivalent of a simple linear search correct. It wasn&#8217;t the difficulty that made the program derivation approach unworkable. Reading and writing music looks extraordinarily complex and clunky to the uninitiated, but that&#8217;s not stopping vast numbers of people from doing so. The problem is that for almost any non-trivial program, it&#8217;s not clear what &#8220;correct&#8221; means.<br />
<br></br><br></br>Here&#8217;s a simple bit of code to write: display a sorted list of the filenames in a folder. That should take a couple of minutes, including googling around for how to get the contents of a directory.<br />
<br></br><br></br>Except that on some systems you&#8217;re getting weird filenames like &#8220;.&#8221; and &#8220;..&#8221; that you don&#8217;t want to display.<br />
<br></br><br></br>Except that there are also hidden files, either based on an attribute or a naming convention, and you should ignore those too.<br />
<br></br><br></br>Except that you need the sort to be case insensitive or else the results won&#8217;t make sense to most users.<br />
<br></br><br></br>Except that some people are using spaces between words and some are using underscores, so they should be treated the same when sorting.<br />
<br></br><br></br>Except that a naive sort is going to put &#8220;File 10&#8221; before &#8220;File 9&#8221;, and while that&#8217;s logical in the cold innards of the CPU, it&#8217;s no excuse to present the data that way.<br />
<br></br><br></br>And this is a well-understood, weird old relic of a problem that&#8217;s <i>nothing</i> compared to all the special cases and exceptions needed to implement a solid user experience in a modern app. Making beautiful code ugly&#8212;and maybe impossible to prove correct&#8212;by making things easier for the user is a good thing.<br />
<br></br><br></br>(If you liked this, you might enjoy <a href="http://prog21.dadgum.com/87.html">Write Code Like You Just Learned How to Program</a>.)
</p> 
]]>
</description>
      <dc:subject>Blogs, Programming in the 21st Century</dc:subject>
      <dc:date>2013-04-21T08:00:00+00:00</dc:date>
    </item>

    <item>
      <title>Erlang&#45; powered WhatsApp exceeds 200 million monthly users</title>
      <link>http://www.planeterlang.org/en/planet/article/Erlang-_powered_WhatsApp_exceeds_200_million_monthly_users/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Erlang-_powered_WhatsApp_exceeds_200_million_monthly_users/</guid>
      <author></author>
      <description><![CDATA[<p>Erlang- powered mobile messaging service WhatsApp topped Twitter’s 200 million monthly users. The declaration was made at AllThingsD&#8217;s mobile conference in New York on the 16th of April.
</p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-04-17T14:01:38+00:00</dc:date>
    </item>

    <item>
      <title>Erlang Solutions opens new office in Budapest</title>
      <link>http://www.planeterlang.org/en/planet/article/Erlang_Solutions_opens_new_office_in_Budapest_/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Erlang_Solutions_opens_new_office_in_Budapest_/</guid>
      <author></author>
      <description><![CDATA[<p>We are pleased to announce the launch of a new office in Hungary in April 2013. This will help us respond to the ever-increasing use and adoption of the Erlang programming language.
</p> 
]]>
</description>
      <dc:subject>Companies, Erlang Solutions</dc:subject>
      <dc:date>2013-04-17T12:31:38+00:00</dc:date>
    </item>

    <item>
      <title>Deal of the Day – Half off Erlang and OTP in Action</title>
      <link>http://www.planeterlang.org/en/planet/article/Deal_of_the_Day_Half_off_Erlang_and_OTP_in_Action/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Deal_of_the_Day_Half_off_Erlang_and_OTP_in_Action/</guid>
      <author>Eric B Merritt</author>
      <description><![CDATA[<p>A
</p> 
]]>
</description>
      <dc:subject>Blogs, Erlware</dc:subject>
      <dc:date>2013-04-16T06:47:53+00:00</dc:date>
    </item>

    <item>
      <title>Exploring the Lower Depths of Terseness</title>
      <link>http://www.planeterlang.org/en/planet/article/Exploring_the_Lower_Depths_of_Terseness/</link>
      <guid>http://www.planeterlang.org/en/planet/article/Exploring_the_Lower_Depths_of_Terseness/</guid>
      <author>James Hague</author>
      <description><![CDATA[<p>There&#8217;s a 100+ year old system for recording everything that happens in a baseball game. It uses sheet of paper with a small box for each batter. Whether that batter gets to base or is out&#8212;and why&#8212;gets coded into that box. It&#8217;s a scorekeeping method that&#8217;s still in use at the professional and amateur level, and at major league games you can buy a program which includes a scorecard.<br />
<br></br><br></br>What&#8217;s surprising is how cryptic the commonly used system is. For starters, each position is identified by a number. The pitcher is 1. The center fielder 8. If the ball is hit to the shortstop who throws it to the first baseman, the sequence is 6-3. See, there isn&#8217;t even the obvious mnemonic of the first, second, and third basemen being numbered 1 through 3 (they&#8217;re 3, 4, and 5).<br />
<br></br><br></br>In programming, no one would stand for this. It breaks the rule of not having magic numbers. I expect the center fielder would be represented by something like:
</p><pre>visitingTeam.outfield.center
</pre><p>The difference, though, is that programming isn&#8217;t done in real-time like scorekeeping. After the initial learning curve, 8 is much more concise, and the terseness is a virtue when recording plays with the ball moving between multiple players. Are we too quick to dismiss extremely terse syntax and justify long-winded notations because they&#8217;re easier for the uninitiated to read?<br />
<br></br><br></br>Suppose you have a file where each line starts with a number in parentheses, like &#8220;(124)&#8221;, and you want to replace that number with an asterisk. In the vim editor the keystrokes for this are &#8220;<code>^cib*</code>&#8221; followed by the escape key. &#8220;^&#8221; moves to the start of the line. The &#8220;c&#8221; means you&#8217;re going to change something, but what? The following &#8220;ib&#8221; means &#8220;inner block&#8221; or roughly &#8220;whatever is inside parentheses.&#8221; The asterisk fills in the new character.<br />
<br></br><br></br>Once you get over the dense notation, you may notice a significant win: this manipulation of text in vim can be described and shared with others using only five characters. There&#8217;s no &#8220;now press control+home&#8221; narrative.<br />
<br></br><br></br>The ultimate in terse programming languages is J. The boring old &#8220;*&#8221; symbol not only multiplies two numbers, but it pairwise multiplies two lists together (as if a map operation were built in) and also multiplies a scalar value with each element of a list, depending on the types of its operands. <br />
<br></br><br></br>That&#8217;s what happens with two operands anyway. Each verb (the J terminology for &#8220;operator&#8221;), also works in a unary fashion, much like the minus sign in C represents both subtraction and negation. When applied to a lone value &#8220;*&#8221; is the sign function, returning either -1, 0, or 1 if the operand is negative, zero, or positive.<br />
<br></br><br></br>So now each single-character verb has two meanings, but it goes further than that. To increase the number of symbolic verbs, each can have either a period or a colon as a second character, and then each of these have both one and two operand versions. &#8220;*:&#8221; squares a single parameter or returns the nand (&#8220;not and&#8221;) of two parameters. Then there&#8217;s the two operand version of &#8220;*.&#8221; which computes the least common multiple, and I&#8217;ll give it up now before everyone stops reading.<br />
<br></br><br></br>Here&#8217;s the reason for this madness: it allows a wide range of built-in verbs that never conflict with user-defined, alphanumeric identifiers. Without referencing a single library you&#8217;ve got access to prime number generation (&#8220;p:&#8221;), factorial (&#8221;!&#8221;), random numbers (&#8221;?&#8221;), and matrix inverse (&#8221;%.&#8221;).<br />
<br></br><br></br>Am I recommending that you switch to vim for text editing and J for coding? No. But when you see an expert working with those tools, getting results with fewer keystrokes than it would take to import a Python module, let alone the equivalent scripting, then&#8230;well, there&#8217;s something to the terseness that&#8217;s worth remembering. It&#8217;s too impressive to ignore simply because it doesn&#8217;t line up with the prevailing aesthetic for what constitutes readable code.<br />
<br></br><br></br>(If you liked this, you might enjoy <a href="http://prog21.dadgum.com/114.html">Papers from the Lost Culture of Array Languages</a>.)
</p> 
]]>
</description>
      <dc:subject>Blogs, Programming in the 21st Century</dc:subject>
      <dc:date>2013-04-08T08:00:00+00:00</dc:date>
    </item>

    <item>
      <title>ejabberd 2.1.12 and 13.03&#45;beta1</title>
      <link>http://www.planeterlang.org/en/planet/article/ejabberd_2.1.12_and_13.03-beta1/</link>
      <guid>http://www.planeterlang.org/en/planet/article/ejabberd_2.1.12_and_13.03-beta1/</guid>
      <author>badlop</author>
      <description><![CDATA[<p>A few weeks ago, the stable ejabberd 2.1.12 was released, with some bugfixes and minor improvements. The source code package is available in the <a href="http://www.process-one.net/en/ejabberd/archive/">ejabberd download archive</a>.</p>
<p><a href="http://www.ejabberd.im/ejabberd-2.1.12--13.03-beta1" target="_blank">read more</a></p> 
]]>
</description>
      <dc:subject>Software, ejabberd Community Site</dc:subject>
      <dc:date>2013-04-03T11:42:17+00:00</dc:date>
    </item>

	
    </channel>
</rss>